app:
  description: 顧客が記入した告知書をOCRで構造化し、社内引受査定ルールと突合して要確認項目をハイライトします。OCR API呼び出し→テキスト抽出→構造化抽出→引受ルール照合→レビュー用レポートを出力します。
  icon: 🧾
  icon_background: '#FFEAD5'
  mode: workflow
  name: 生命保険 告知書OCR引受査定アシスタント
  use_icon_as_answer_icon: false
kind: app
version: 0.1.5
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      image:
        enabled: false
    opening_statement: 告知書の画像URLまたはOCR済みテキストを入力してください。
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
  graph:
    edges:
    - data:
        sourceType: code
        targetType: parameter-extractor
      id: code1-to-extractor1
      source: code1
      target: extractor1
    - data:
        sourceType: parameter-extractor
        targetType: llm
      id: extractor1-to-llm1
      source: extractor1
      target: llm1
    - data:
        sourceType: llm
        targetType: end
      id: llm1-to-end
      source: llm1
      target: end
    - id: start-to-code1
      source: start
      target: code1
      data: {}
    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: OCR結果整形
        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    # 入力は OCR API のレスポンス (dict) または生テキスト\
          \ (str) を想定\n    raw = inputs.get(\"input\")\n    text = \"\"\n    try:\n\
          \        if isinstance(raw, dict):\n            # よくあるフィールド名を順に確認して抽出\n\
          \            text = raw.get(\"text\") or raw.get(\"ocr_text\") or raw.get(\"\
          result\") or str(raw)\n        else:\n            text = str(raw)\n    except\
          \ Exception:\n        text = str(raw)\n    # 出力は文字列として返す（後続のパラメータ抽出で参照）\n\
          \    return dict(ocr_text=text)\n"
        variables:
        - value_selector:
          - http1
          - body
          variable: input
        outputs:
          ocr_text:
            type: string
            children: null
      height: 90
      id: code1
      position:
        x: 680
        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:
        - code1
        - ocr_text
        parameters:
        - name: pre_existing_conditions
          type: string
          description: 既往歴（疾病名・発症年・治療中か等）
          required: true
        - name: medications
          type: string
          description: 常用薬・投薬中の薬と投薬理由
          required: false
        - name: symptoms_current
          type: string
          description: 現在の自覚症状（有無・内容）
          required: false
        - name: occupation
          type: string
          description: 職業と業務内容（危険業務の有無）
          required: true
        - name: smoking_status
          type: string
          description: 喫煙状況（現在/過去/未）
          required: false
        - name: alcohol_use
          type: string
          description: 飲酒習慣（頻度・量）
          required: false
        - name: family_history
          type: string
          description: 家族歴（主要疾病）
          required: false
        - name: additional_notes
          type: string
          description: その他備考欄の自由記述
          required: false
        reasoning_mode: prompt
        instruction: 以下のOCRテキストから、上記パラメータを抽出してください。存在しない項目は空文字で返してください。日付や年齢、薬剤名等が分かる場合は可能な限り原文のまま抽出してください。
      height: 90
      id: extractor1
      position:
        x: 980
        y: 282
      type: custom
      width: 244
    - data:
        title: 引受ルール照合・要確認抽出
        type: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.2
        prompt_template:
        - role: system
          text: 'あなたは生命保険の引受査定の実務担当者です。顧客の告知内容（既往歴・服薬・職業・喫煙・飲酒等）を読み、社内引受ルールに照らして『要確認』『要審査』『保留』といった注意点を判定・ハイライトしてください。出力は日本語で、指定の最終フォーマットに従ってください。


            【出力形式（日本語 Markdown）】


            ## 概要（1-2行）

            - 告知の要点と全体判定（例: 要確認 2点、要審査 1件）


            ## 要確認項目（箇条書き）

            - 各項目ごとに: 該当フィールド名、抜き出された値、判定理由（社内ルールに基づく判定の根拠）、推奨対応（例: 診療情報提供書の取得、追加問診、引受担当へエスカレーション）


            ## 証拠（原文抜粋）

            - OCR / 告知書の原文抜粋を示す（該当箇所）


            ## 最終推奨対応

            - 優先度順のアクションリスト


            注意: 出力はMarkdown本文のみとし、JSONレスポンスや配列では返さないこと。専門用語や該当条項名を簡潔に示すこと。'
        - role: user
          text: 'ユーザー入力（原文や画像URL）:

            {{#start.query#}}


            OCR抽出テキスト:

            {{#code1.ocr_text#}}


            構造化抽出結果:

            既往歴: {{#extractor1.pre_existing_conditions#}}

            服薬: {{#extractor1.medications#}}

            現在の症状: {{#extractor1.symptoms_current#}}

            職業: {{#extractor1.occupation#}}

            喫煙: {{#extractor1.smoking_status#}}

            飲酒: {{#extractor1.alcohol_use#}}

            家族歴: {{#extractor1.family_history#}}

            備考: {{#extractor1.additional_notes#}}


            上記を参照して、社内の一般的な引受基準（重大疾患の既往、最近の入院/手術、常用薬が重大疾病治療薬に該当、危険業務、高頻度喫煙等）を想定しつつ、要確認項目を抽出してください。'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 1280
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - llm1
          - text
          variable: result
      height: 90
      id: end
      position:
        x: 1580
        y: 282
      type: custom
      width: 244
  hash: null
