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: age
          type: number
          description: 年齢（歳）
          required: true
        - name: sex
          type: string
          description: 性別
          required: true
        - name: policy_type
          type: string
          description: '保険種類（例: 終身、定期、年金、医療、障害など）'
          required: true
        - name: coverage_amount
          type: number
          description: 保険金額（円）
          required: true
        - name: premium
          type: number
          description: 保険料（円、任意）
          required: false
        - name: contract_duration_years
          type: number
          description: 契約期間（年）
          required: true
        - name: waiting_period_months
          type: number
          description: 待機期間（月、任意）
          required: false
        reasoning_mode: prompt
        instruction: 以下のテキストから年齢、性別、保険種類、保険金額（円）、保険料（円、任意）、契約年数（年）、待機期間（月、任意）を抽出してください。値が不明な場合は数値は0、文字列は空にしてください。
      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    def _to_float(k):\n\
          \        try:\n            v = inputs.get(k, 0)\n            if v is None:\n\
          \                return 0.0\n            if isinstance(v, str):\n      \
          \          s = v.replace(\",\", \"\").strip()\n                if s == \"\
          \":\n                    return 0.0\n                return float(s)\n \
          \           return float(v)\n        except Exception:\n            try:\n\
          \                return float(str(inputs.get(k, 0)).replace(\",\", \"\"\
          ).strip())\n            except Exception:\n                return 0.0\n\
          \    def _to_str(k):\n        v = inputs.get(k)\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    # 入力取得\n \
          \   age = int(_to_float(\"age\"))\n    sex = _to_str(\"sex\")\n    policy_type\
          \ = _to_str(\"policy_type\")\n    coverage = _to_float(\"coverage_amount\"\
          )\n    premium = _to_float(\"premium\")\n    duration_years = _to_float(\"\
          contract_duration_years\")\n    if duration_years <= 0:\n        duration_years\
          \ = 1.0\n    waiting = int(_to_float(\"waiting_period_months\"))\n    #\
          \ 単純な給付想定ロジック\n    monthly_estimate = 0.0\n    # キーワードに基づく簡易判定（年金・月次系は月額算出）\n\
          \    if \"年金\" in policy_type or \"障害\" in policy_type or \"所得\" in policy_type\
          \ or \"月\" in policy_type or \"定期\" in policy_type:\n        monthly_estimate\
          \ = coverage / (duration_years * 12)\n    else:\n        monthly_estimate\
          \ = 0.0\n    # テキスト出力作成（段階的説明）\n    lines = []\n    lines.append(\"1. 入力情報\"\
          )\n    lines.append(\" 年齢: \" + str(age))\n    lines.append(\" 性別: \" +\
          \ sex)\n    lines.append(\" 保険種類: \" + policy_type)\n    lines.append(\"\
          \ 保険金額: \" + str(int(coverage)) + \" 円\")\n    lines.append(\" 保険料（参考）:\
          \ \" + str(int(premium)) + \" 円\")\n    lines.append(\" 契約年数: \" + str(duration_years)\
          \ + \" 年\")\n    lines.append(\" 待機期間: \" + str(waiting) + \" 月\")\n   \
          \ lines.append(\"\")\n    lines.append(\"2. 給付の想定フロー（概算）\")\n    if monthly_estimate\
          \ > 0:\n        lines.append(\" - 想定給付タイプ: 月次給付（推定）\")\n        lines.append(\"\
          \ - 月額想定給付: \" + str(round(monthly_estimate, 2)) + \" 円（概算）\")\n       \
          \ total = int(round(monthly_estimate * duration_years * 12, 0))\n      \
          \  lines.append(\" - 契約期間内の総給付（概算）: \" + str(total) + \" 円\")\n    else:\n\
          \        lines.append(\" - 想定給付タイプ: 一時金（推定）\")\n        lines.append(\"\
          \ - 一時金想定額: \" + str(int(round(coverage, 0))) + \" 円\")\n    lines.append(\"\
          \")\n    lines.append(\"3. 想定支払例（概算）\")\n    if monthly_estimate > 0:\n\
          \        first_year = int(round(monthly_estimate * 12, 0))\n        lines.append(\"\
          \ - 例: 月額 \" + str(round(monthly_estimate, 2)) + \" 円 × 12 = \" + str(first_year)\
          \ + \" 円（初年度の概算）\")\n    else:\n        lines.append(\" - 例: 事故発生時に一時金として\
          \ \" + str(int(round(coverage, 0))) + \" 円が支払われる想定（給付要件により変動）\")\n    lines.append(\"\
          \")\n    lines.append(\"注意: これは概算結果です。実際の給付は契約書の条項、免責期間、給付要件、審査結果により変動します。詳細は契約約款と担当者へ確認してください。\"\
          )\n    result_text = \"\\n\".join(lines)\n    return dict(result=result_text)\n"
        variables:
        - value_selector:
          - extractor1
          - age
          variable: age
        - value_selector:
          - extractor1
          - sex
          variable: sex
        - value_selector:
          - extractor1
          - policy_type
          variable: policy_type
        - value_selector:
          - extractor1
          - coverage_amount
          variable: coverage_amount
        - value_selector:
          - extractor1
          - premium
          variable: premium
        - value_selector:
          - extractor1
          - contract_duration_years
          variable: contract_duration_years
        - value_selector:
          - extractor1
          - waiting_period_months
          variable: waiting_period_months
        outputs:
          result:
            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.6
        prompt_template:
        - role: system
          text: 'あなたは保険給付シミュレーションの専門家です。出力は段階的に、番号付きのステップでわかりやすく説明してください。以下の要点を必ず含めてください:
            1) 入力情報の確認、2) 給付フローの段階的説明（例えば待機期間、給付開始、支払形式）、3) 想定支払例（計算過程を簡潔に示す）、4) 注意事項（契約条項・免責・審査の影響）。言葉は平易にし、専門用語は簡潔に補足してください。'
        - role: user
          text: 'ユーザー入力: {{#start.query#}}


            計算（概算）結果:

            {{#code1.result#}}'
        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
