app:
  description: 2つの見積書の価格・条件・納期の差分を自動抽出し、一覧化するワークフローです。ユーザーは2つの見積書の本文を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: llm
      id: start-to-llm1
      source: start
      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: 見積差分抽出 (AI)
        type: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.2
        prompt_template:
        - role: system
          text: "あなたは商社の見積比較エキスパートです。ユーザーが1つのテキスト入力内に「見積書A」と「見積書B」の両方を貼り付けて提供します。あなたの役割は、両見積書の差分を体系的に抽出し、機械的に処理しやすい構造（JSON）で返すことです。\n\
            抽出対象（必須でチェックする項目）: - 品目別価格（商品名または品番ごと）: 見積Aの単価・小計、見積Bの単価・小計、差額（B - A）\
            \ - 総合計金額（税・送料を含む場合は内訳を含む） - 数量の差異 - 支払条件（支払期日、支払方法、分割など） - 納期・リードタイム（納期日、出荷予定）\
            \ - 取引条件・インコターム（例: FOB, CIF 等） - 見積有効期限 - オプション項目や削除/追加された項目 - その他契約条件（保証、アフターサービス等）\n\
            出力仕様（最優先）: 1) 出力は必ずJSONオブジェクトのみを返してください。余分な説明文や日本語の前置きは付けないでください。 2) JSONのフォーマットは以下のフィールドを必ず含めること:\n\
            \   - price_differences: array of objects. 各オブジェクトは {item, estimate_a_price,\
            \ estimate_b_price, estimate_a_subtotal, estimate_b_subtotal, quantity_a,\
            \ quantity_b, difference}.\n   - total_differences: object with {estimate_a_total,\
            \ estimate_b_total, difference}.\n   - term_differences: array of objects\
            \ describing支払条件やインコタームなどの差分 {field, estimate_a, estimate_b, note}.\n\
            \   - delivery_differences: array of objects {field, estimate_a, estimate_b,\
            \ note}（納期やリードタイム）。\n   - added_items: array of item names present only\
            \ in B.\n   - removed_items: array of item names present only in A.\n\
            \   - summary: string（日本語で差分の簡潔な要約、2-3文）。\n   - missing_information: array\
            \ of strings（比較に必要だが入力に存在しない情報）。\n3) 金額は可能な限り数字のみ（例: 123456）で返し、必要に応じてnote内で通貨単位（例:\
            \ JPY）を明記してください。 4) 商品名や品番の一致が曖昧な場合は、可能な限り最良のマッチングを行い、その判断基準を各該当オブジェクトのnoteに短く記載してください。\
            \ 5) 不足情報がある場合は missing_information に箇条書きで列挙し、補足があれば summary の最後に短く記載してください。\
            \ 6) 出力は日本語で行ってください（summary と note のテキスト部分は日本語）。 7) ユーザー入力の形式は自由テキストのため、あなたは明確なパターン（「見積書A:」「見積書B:」など）や文脈から両見積書を識別し、処理してください。"
        - role: user
          text: '{{#start.query#}}'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 380
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - llm1
          - text
          variable: result
      height: 90
      id: end
      position:
        x: 680
        y: 282
      type: custom
      width: 244
  hash: null
