app:
  description: 自社と複数のベンチマーク企業の財務指標を入力として、比較表、ポジショニング、要注目指標、提案を生成するワークフロー
  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
        query:
        - start
        - query
        parameters:
        - name: company_list
          type: string
          description: 会社リスト（カンマまたは改行区切り）。最初の会社を自社とすること。
          required: true
        - name: metrics_list
          type: string
          description: '抽出対象の財務指標（カンマまたは改行区切り）。例: 売上高, 営業利益, 営業利益率, ROE, 有利子負債'
          required: true
        - name: period
          type: string
          description: 対象期間（任意）
          required: false
        - name: notes
          type: string
          description: 補足メモ（任意）
          required: false
        reasoning_mode: prompt
        instruction: 以下のフリーテキストから、会社リスト（カンマまたは改行で分割）、比較すべき財務指標、対象期間、補足メモを抽出してください。会社リストの先頭を自社と扱ってください。
      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    companies_raw = inputs.get(\"\
          company_list\", \"\") or \"\"\n    metrics_raw = inputs.get(\"metrics_list\"\
          , \"\") or \"\"\n    period = inputs.get(\"period\", \"\") or \"\"\n   \
          \ notes = inputs.get(\"notes\", \"\") or \"\"\n    # 改行またはカンマで分割してリスト化\n\
          \    def split_lines_or_commas(s: str):\n        s2 = s.replace(\"\\r\"\
          , \"\\n\")\n        parts = []\n        for line in s2.split(\"\\n\"):\n\
          \            line = line.strip()\n            if not line:\n           \
          \     continue\n            # もし行内にカンマがありかつ行が1つしかない場合はカンマで分割\n         \
          \   if \",\" in line and len(s2.split(\"\\n\")) == 1:\n                for\
          \ p in line.split(\",\"):\n                    p2 = p.strip()\n        \
          \            if p2:\n                        parts.append(p2)\n        \
          \    else:\n                parts.append(line)\n        return parts\n \
          \   companies = split_lines_or_commas(companies_raw)\n    metrics = split_lines_or_commas(metrics_raw)\n\
          \    # 結果をJSON文字列として返す（後続LLMで参照しやすくする）\n    import json\n    result = dict(companies=companies,\
          \ metrics=metrics, period=period, notes=notes)\n    return dict(output=json.dumps(result,\
          \ ensure_ascii=False))\n"
        variables:
        - value_selector:
          - extractor1
          - company_list
          variable: company_list
        - value_selector:
          - extractor1
          - metrics_list
          variable: metrics_list
        - value_selector:
          - extractor1
          - period
          variable: period
        - value_selector:
          - extractor1
          - notes
          variable: notes
        outputs:
          output:
            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.55
        prompt_template:
        - role: system
          text: 'あなたは経営企画向けの分析アシスタントです。入力された自社と複数のベンチマーク企業の財務指標を比較して、以下を出力してください。1)
            比較表（CSV形式、ヘッダ行を含む。1列目は指標名、以降の列は各社の値） 2) 自社のポジショニング要約（箇条書き、3-5点） 3) 要注目指標と短い理由（箇条書き、上位3つ程度）
            4) 推奨アクション（短い箇条書き）。 出力はJSONで次のキーを含めてください: table_csv (文字列), positioning
            (配列の文字列), key_metrics (配列の文字列), recommendations (配列の文字列)。数値の欠損がある場合は空欄で埋めてください。


            ---


            【最終出力フォーマット (この指示が最優先)】

            最終出力は **読みやすい日本語の Markdown** で返してください。JSON

            配列・オブジェクトをそのまま出力してはいけません。

            - 見出し (## / ###) でセクションを区切る

            - リスト (- / 1.) や表 (| ... |) で構造化

            - 各項目の意図や根拠が分かるよう短い説明文を添える

            - 営業デモで顧客に直接見せられる体裁にする


            (構造化されたデータ項目を内部で扱うのは構いませんが、出力時に Markdown

            に変換してください。)'
        - role: user
          text: '元の入力テキスト:

            {{#start.query#}}


            構造化入力(JSON):

            {{#code1.output#}}


            注意: 会社リストの最初の会社を自社と見なしてください。財務データが未提供の場合は、表の該当セルを空欄にしてください。出力は厳密に有効なJSONのみを返してください。'
        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
      id: end
      position:
        x: 1280
        y: 282
      type: custom
      height: 90
      width: 244
  hash: null
