app:
  description: 楽曲・素材の版権満了や更新時期を検出し、社内通知用の文案（件名・本文・宛先例・備考）を自動生成するワークフロー。ユーザーは1つのテキスト入力に情報をまとめて入力します。
  icon: 🎵
  icon_background: '#FFEAD5'
  mode: workflow
  name: 版権期限通知文案生成（エンタメ）
  use_icon_as_answer_icon: false
kind: app
version: 0.6.0
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      image:
        enabled: false
    opening_statement: ''
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
  graph:
    edges:
    - data:
        sourceType: start
        targetType: parameter-extractor
      id: start-to-extractor1
      source: start
      target: extractor1
    - data:
        sourceType: parameter-extractor
        targetType: code
      id: extractor1-to-code1
      source: extractor1
      target: code1
    - data:
        sourceType: code
        targetType: llm
      id: code1-to-llm1
      source: code1
      target: llm1
    - data:
        sourceType: llm
        targetType: end
      id: llm1-to-end
      source: llm1
      target: end
    nodes:
    - data:
        title: 開始
        type: start
        variables:
        - label: query
          max_length: 2048
          options: []
          required: true
          type: paragraph
          variable: query
      height: 90
      id: start
      position:
        x: 80
        y: 282
      type: custom
      width: 244
    - data:
        title: 情報抽出（楽曲・素材）
        type: parameter-extractor
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.2
        query:
        - start
        - query
        parameters:
        - name: song_title
          type: string
          description: 楽曲・素材のタイトル
          required: true
        - name: rights_end_date
          type: string
          description: 版権満了日（できればYYYY-MM-DD形式）
          required: true
        - name: rights_holder
          type: string
          description: 権利者（レーベル、出版社等）
          required: true
        - name: material_type
          type: string
          description: 素材種別（楽曲、音源、映像素材 等）
          required: false
        - name: contract_reference
          type: string
          description: 契約番号や内部参照（あれば）
          required: false
        - name: action_needed
          type: string
          description: 推奨対応（renew / review / no_action など）
          required: true
        - name: urgency
          type: string
          description: 緊急度（high / medium / low 等、任意）
          required: false
        reasoning_mode: prompt
        instruction: 以下のテキストから楽曲・素材の版権関連情報を抽出してください。日付は可能な限りYYYY-MM-DD形式で出力してください。
      height: 90
      id: extractor1
      position:
        x: 380
        y: 282
      type: custom
      width: 244
    - data:
        title: 期限計算
        type: code
        code_language: python3
        code: "def _safe_str(v):\n    \"\"\"Convert any value to string safely.\"\"\
          \"\n    if v is None:\n        return \"\"\n    if isinstance(v, list):\n\
          \        return \"\\n\".join(str(i) for i in v)\n    return str(v)\n\ndef\
          \ _safe_list(v):\n    \"\"\"Ensure value is a list.\"\"\"\n    if v is None:\n\
          \        return []\n    if isinstance(v, str):\n        return [v]\n   \
          \ if isinstance(v, list):\n        return v\n    return [v]\n\ndef main(**kwargs)\
          \ -> dict:\n    inputs = kwargs\n    # 日付解析と期限判定を行う\n    from datetime import\
          \ datetime, date, timedelta\n    rights_end_str = _safe_str(inputs.get(\"\
          rights_end_date\", \"\")).strip()\n    parsed_date = None\n    date_formats\
          \ = [\"%Y-%m-%d\", \"%Y/%m/%d\", \"%Y.%m.%d\"]\n    for fmt in date_formats:\n\
          \        try:\n            parsed_date = datetime.strptime(rights_end_str,\
          \ fmt).date()\n            break\n        except Exception:\n          \
          \  parsed_date = None\n    today = date.today()\n    if parsed_date is None:\n\
          \        analysis = \"日付解析失敗: '{}' を認識できませんでした。\".format(rights_end_str)\n\
          \        days_left = None\n        status = \"unknown\"\n    else:\n   \
          \     delta = parsed_date - today\n        days_left = delta.days\n    \
          \    if days_left < 0:\n            status = \"expired\"\n        elif days_left\
          \ <= 30:\n            status = \"expiring_soon\"\n        else:\n      \
          \      status = \"active\"\n        analysis = \"権利終了日: \" + str(parsed_date)\
          \ + \"; 今日との差(d): \" + str(days_left) + \"; 状態: \" + status\n    return\
          \ dict(analysis=analysis, days_left=days_left, status=status)\n"
        variables:
        - value_selector:
          - extractor1
          - rights_end_date
          variable: rights_end_date
        - value_selector:
          - extractor1
          - song_title
          variable: song_title
        - value_selector:
          - extractor1
          - rights_holder
          variable: rights_holder
        - value_selector:
          - extractor1
          - action_needed
          variable: action_needed
        - value_selector:
          - extractor1
          - contract_reference
          variable: contract_reference
        outputs:
          analysis:
            type: string
            children: null
          days_left:
            type: number
            children: null
          status:
            type: string
            children: null
      height: 90
      id: code1
      position:
        x: 680
        y: 282
      type: custom
      width: 244
    - data:
        title: 通知文案生成
        type: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.65
        prompt_template:
        - role: system
          text: 'あなたは社内向けの通知メール文案作成に長けたアシスタントです。出力はJSON形式で次のキーを含めてください: subject (件名),
            body (本文: 署名含む完全なメール本文), recipients (宛先例の配列), notes (備考・管理用メモ)。本文は受け取り手が速やかに対応できるよう、期限と推奨アクションを明確に示してください。トーンは社内フォーマルで、必要に応じて差し迫った語調を用いてください。'
        - role: user
          text: 'ユーザー入力: {{#start.query#}}


            抽出結果:

            - タイトル: {{#extractor1.song_title#}}

            - 素材種別: {{#extractor1.material_type#}}

            - 権利者: {{#extractor1.rights_holder#}}

            - 版権終了日: {{#extractor1.rights_end_date#}}

            - 契約参照: {{#extractor1.contract_reference#}}

            - 推奨対応: {{#extractor1.action_needed#}}

            - 緊急度: {{#extractor1.urgency#}}


            自動判定:

            {{#code1.analysis#}}


            上記情報をもとに、社内用の通知メール文案を生成してください。もし期限が既に過ぎている場合は最優先の対応指示を明記し、30日以内に満了する場合はリマインドとして具体的な期限と担当者向けアクションを明示してください。出力は必ずJSONで、systemで指定したキーを含めてください。'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 980
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - llm1
          - text
          variable: result
      height: 90
      id: end
      position:
        x: 1280
        y: 282
      type: custom
      width: 244
  hash: null
