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: knowledge-retrieval
      id: start-to-kr1
      source: start
      target: kr1
    - data:
        sourceType: knowledge-retrieval
        targetType: code
      id: kr1-to-code1
      source: kr1
      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: knowledge-retrieval
        dataset_ids:
        - __KR_0__
        retrieval_mode: single
        query_variable_selector:
        - start
        - query
        single_retrieval_config:
          model:
            provider: openai
            name: gpt-5-mini
            mode: chat
            completion_params:
              temperature: 0.7
          score_threshold_enabled: false
          top_k: 5
      height: 90
      id: kr1
      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\
          \    raw = str(inputs.get(\"data\", \"\"))\n    import re\n    # 納期・不良のパーセントを抽出\
          \ (例: 95%)\n    percents = re.findall(r\"(\\d{1,3})\\s*%\", raw)\n    delivery_rate\
          \ = \"\"\n    defect_rate = \"\"\n    if percents:\n        # 最初の数値を納期遵守率の候補として扱い、二つ目があれば不良率候補にする\n\
          \        delivery_rate = percents[0] + \"%\"\n        if len(percents) >=\
          \ 2:\n            defect_rate = percents[1] + \"%\"\n    # 価格らしき数字 (カンマ区切り含む)\
          \ を抽出\n    price_matches = re.findall(r\"¥?\\s*([0-9]{1,3}(?:[,0-9]{3})*)(?:円|¥|JPY)?\"\
          , raw)\n    def parse_num(s):\n        try:\n            return float(s.replace(\"\
          ,\", \"\"))\n        except:\n            return None\n    price_vals =\
          \ []\n    for p in price_matches:\n        v = parse_num(p)\n        if\
          \ v is not None:\n            price_vals.append(v)\n    price_trend = \"\
          不明\"\n    if len(price_vals) >= 2:\n        if price_vals[-1] > price_vals[0]:\n\
          \            price_trend = \"上昇\"\n        elif price_vals[-1] < price_vals[0]:\n\
          \            price_trend = \"下降\"\n        else:\n            price_trend\
          \ = \"横ばい\"\n    # 簡易スコア付与ルール（例示）\n    score = None\n    try:\n        if\
          \ delivery_rate:\n            d = float(delivery_rate.replace(\"%\", \"\"\
          ))\n        else:\n            d = None\n        if defect_rate:\n     \
          \       f = float(defect_rate.replace(\"%\", \"\"))\n        else:\n   \
          \         f = None\n        if d is not None and f is not None:\n      \
          \      # 高納期遵守かつ低不良で高評価\n            score_val = 70\n            if d >=\
          \ 95:\n                score_val += 20\n            elif d >= 90:\n    \
          \            score_val += 10\n            if f <= 1:\n                score_val\
          \ += 10\n            elif f <= 3:\n                score_val += 5\n    \
          \        score = max(0, min(100, score_val))\n    except:\n        score\
          \ = None\n    # 出力文字列を構成\n    parts = []\n    parts.append(\"納期遵守率: \" +\
          \ (delivery_rate if delivery_rate else \"不明\"))\n    parts.append(\"不良率:\
          \ \" + (defect_rate if defect_rate else \"不明\"))\n    parts.append(\"価格推移:\
          \ \" + price_trend)\n    parts.append(\"推定スコア: \" + (str(int(score)) if\
          \ score is not None else \"算出不可\"))\n    summary = \" | \".join(parts)\n\
          \    return dict(output=summary)\n"
        variables:
        - value_selector:
          - kr1
          - result
          variable: data
        outputs:
          output:
            type: string
            children: null
      height: 90
      id: code1
      position:
        x: 680
        y: 282
      type: custom
      width: 244
    - data:
        title: 仕入先評価生成（LLM）
        type: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.7
        prompt_template:
        - role: system
          text: 'あなたは仕入先評価のエキスパートです。以下の指示に従って、入力された要件と集計結果・関連ナレッジをもとに、仕入先ごとの評価レポートを日本語で作成してください。

            出力に必須で含める項目: 1) 要約（1-2段落）: 仕入先の全体的なパフォーマンスの短い要約 2) 指標（箇条書き）: 納期遵守率・不良率・価格推移（数値があれば数値で、なければ「不明」と明記）
            3) 総合評価スコア（0-100）と評価の根拠 4) 強み・弱み（箇条書き） 5) 改善提案（優先順位をつけて具体的に） 6) 不足情報（評価を改善するために必要な追加データ）
            フォーマット要件: - 日本語で出力すること - 見出し（##）や箇条書きを用いて読みやすく整形すること - 数値は可能な限り明確に示すこと（例:
            納期遵守率: 92%） - 推定や仮定を置いた場合は必ずその旨を明記すること


            重要: 回答の各手順・セクションにナレッジ検索結果を使用した場合は [参考: 文書名] タグを付けること。回答の末尾に「参考資料:」セクションを付けて参照した全文書名を一覧すること。省略不可。'
        - role: user
          text: "ユーザー入力: {{#start.query#}}\nコードで抽出した簡易集計: {{#code1.output#}}\nナレッジ検索の該当文書（参考）:\
            \ {{#kr1.result#}}\n上記を参照して、仕入先の評価レポートを作成してください。\n\n【参考資料の明示ルール】\n回答の各セクション・箇条書きで、ナレッジ検索結果の情報を使った箇所には\
            \ [参考: 文書名] タグを付けてください。\n回答の末尾に「参考資料:」セクションを設け、参照した全文書名を一覧してください。\n出力例:\n\
            \  1. VPNクライアントを再起動してください [参考: VPN接続トラブルシューティング.txt]\n  ...\n  参考資料:\n\
            \  - VPN接続トラブルシューティング.txt\n  - パスワードリセット手順.txt"
        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
