version: 0.1.5
kind: app
app:
  description: 車両・機器の基本情報から素早く残存価値の概算と査定根拠を生成するリース向け簡易査定ワークフロー。ユーザーは1つのテキストフィールドに情報をまとめて入力してください。
  icon: 🚗
  icon_background: '#E6F7FF'
  mode: workflow
  name: リース残存価値簡易査定
  use_icon_as_answer_icon: false
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: 120
      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: vehicle_type
          type: string
          description: '車両または機器の種別（例: 自動車、トラック、フォークリフト等）'
          required: true
        - name: make
          type: string
          description: メーカー
          required: false
        - name: model
          type: string
          description: 型式
          required: false
        - name: year
          type: number
          description: 製造年（西暦）
          required: true
        - name: mileage
          type: number
          description: 走行距離（km）
          required: false
        - name: usage_hours
          type: number
          description: 使用時間（時間）※機器の場合
          required: false
        - name: condition
          type: string
          description: 状態（良/普通/悪 など）
          required: true
        - name: lease_term_months
          type: number
          description: リース期間（ヶ月）
          required: true
        - name: original_price
          type: number
          description: 購入時価格（通貨単位）
          required: true
        reasoning_mode: prompt
        instruction: '以下の自由記述テキストから上記パラメータを抽出してください。見つからない項目は空欄にしてください。数値は可能な限り数値型で返してください（例:
          走行距離は km の数値）。日本語入力を想定しています。

          '
      height: 140
      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    yearly_rate = 0.15\
          \  # 年間標準減価率（初期値）\n    try:\n        year = int(inputs.get(\"year\", 0))\n\
          \    except Exception:\n        year = 0\n    try:\n        mileage = float(inputs.get(\"\
          mileage\", 0))\n    except Exception:\n        mileage = 0.0\n    try:\n\
          \        usage_hours = float(inputs.get(\"usage_hours\", 0))\n    except\
          \ Exception:\n        usage_hours = 0.0\n    condition = inputs.get(\"condition\"\
          , \"\")\n    try:\n        original_price = float(inputs.get(\"original_price\"\
          , 0))\n    except Exception:\n        original_price = 0.0\n    try:\n \
          \       lease_term = int(inputs.get(\"lease_term_months\", 0))\n    except\
          \ Exception:\n        lease_term = 0\n    # 年数計算\n    from datetime import\
          \ datetime\n    current_year = datetime.now().year\n    age = 0\n    if\
          \ year > 0:\n        age = current_year - year\n        if age < 0:\n  \
          \          age = 0\n    # 基本減価率（年次複利）\n    depreciation = 1.0\n    for i\
          \ in range(age):\n        depreciation = depreciation * (1 - yearly_rate)\n\
          \    # 走行距離/使用時間による補正\n    if mileage and mileage > 200000:\n        mileage_factor\
          \ = 0.7\n    elif mileage and mileage > 100000:\n        mileage_factor\
          \ = 0.85\n    else:\n        mileage_factor = 0.95\n    if usage_hours and\
          \ usage_hours > 20000:\n        usage_factor = 0.8\n    else:\n        usage_factor\
          \ = 1.0\n    # 状態補正（簡易判定）\n    cond_lower = condition.lower()\n    if \"\
          良\" in cond_lower or \"good\" in cond_lower:\n        cond_factor = 1.0\n\
          \    elif \"普通\" in cond_lower or \"fair\" in cond_lower:\n        cond_factor\
          \ = 0.9\n    else:\n        cond_factor = 0.75\n    # 概算残存価値\n    estimated_value\
          \ = original_price * depreciation * mileage_factor * usage_factor * cond_factor\n\
          \    if estimated_value < 0:\n        estimated_value = 0.0\n    # 計算詳細を文字列で返す\n\
          \    calc_details = \"製造年: \" + str(year) + \", 使用年数: \" + str(age) + \"\
          , 減価係数: \" + str(round(depreciation, 4)) + \", 走行係数: \" + str(mileage_factor)\
          \ + \", 使用時間係数: \" + str(usage_factor) + \", 状態係数: \" + str(cond_factor)\n\
          \    return dict(estimated_value=round(estimated_value, 2), calc_details=calc_details)\n"
        variables:
        - value_selector:
          - extractor1
          - year
          variable: year
        - value_selector:
          - extractor1
          - mileage
          variable: mileage
        - value_selector:
          - extractor1
          - usage_hours
          variable: usage_hours
        - value_selector:
          - extractor1
          - condition
          variable: condition
        - value_selector:
          - extractor1
          - original_price
          variable: original_price
        - value_selector:
          - extractor1
          - lease_term_months
          variable: lease_term_months
        outputs:
          estimated_value:
            type: number
            children: null
          calc_details:
            type: string
            children: null
      height: 220
      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
        retry_config:
          retry_enabled: true
          retry_count: 2
          retry_interval: 200
        prompt_template:
        - role: system
          text: 'あなたはリース会社の査定担当者です。以下の情報を基に、残存価値の概算（通貨単位）と査定根拠を簡潔に示す見積レポートを作成してください。出力は日本語で、次を必ず含めてください：

            - 概算残存価値（数値、通貨記号付き）

            - 算出方法の要約（主要な調整要因と数値）

            - 主な懸念点・リスク（短文箇条書き）

            - 推奨アクション（追加確認や検査）

            出力は「概算残存価値: ￥...」で始め、最後に「査定根拠（詳細）」として計算詳細を記載してください。専門用語は簡潔に説明してください。

            '
        - role: user
          text: 'ユーザー入力（要約）:

            {{#start.query#}}


            抽出データ:

            車両/機器種別: {{#extractor1.vehicle_type#}}

            メーカー: {{#extractor1.make#}}

            型式: {{#extractor1.model#}}

            製造年: {{#extractor1.year#}}

            走行距離(km): {{#extractor1.mileage#}}

            使用時間(時間): {{#extractor1.usage_hours#}}

            状態: {{#extractor1.condition#}}

            リース期間(月): {{#extractor1.lease_term_months#}}

            購入時価格: {{#extractor1.original_price#}}


            算出結果:

            概算残存価値(数値): {{#code1.estimated_value#}}

            計算詳細: {{#code1.calc_details#}}


            上記を基に短く分かりやすい査定レポートを作成してください。数値は可能な限り丸めて記載し、重要な前提や不確実性があれば明示してください。

            '
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 220
      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
