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: llm
      id: extractor1-to-llm1
      source: extractor1
      target: llm1
    - data:
        sourceType: llm
        targetType: if-else
      id: llm1-to-ifelse1
      source: llm1
      target: ifelse1
    - data:
        sourceType: if-else
        targetType: llm
      id: ifelse1-true-to-llm2
      source: ifelse1
      sourceHandle: 'true'
      target: llm2
    - data:
        sourceType: if-else
        targetType: template-transform
      id: ifelse1-false-to-template1
      source: ifelse1
      sourceHandle: 'false'
      target: template1
    - data:
        sourceType: llm
        targetType: template-transform
      id: llm2-to-template1
      source: llm2
      target: template1
    - data:
        sourceType: template-transform
        targetType: end
      id: template1-to-end
      source: template1
      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: customer_name
          type: string
          description: 問い合わせの顧客名（会社名または個人名。不明な場合は「不明」とする）
          required: false
        - name: issue_summary
          type: string
          description: 問い合わせ内容の問題概要を1文程度で要約したもの
          required: true
        - name: urgency_keyword
          type: string
          description: 'ユーザー文中の緊急度を示すキーワード（例: 今すぐ, 至急, 今日中, 障害, システム停止 など。複数ある場合はカンマ区切り。不明なら空文字）'
          required: false
        reasoning_mode: prompt
        instruction: 以下の問い合わせテキストから顧客名・問題概要・緊急度キーワードを抽出してください。顧客名が明示されていない場合は customer_name
          を「不明」としてください。緊急度キーワードは、ユーザーが急いでいる、サービス停止しているなど、緊急性を示す単語やフレーズのみをカンマ区切りで抽出し、なければ空文字にしてください。
      height: 90
      id: extractor1
      position:
        x: 380
        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: "あなたは日本語の問い合わせチケットを分類する専門のオペレーターです。\n\n目的:\n- 問い合わせを以下の3軸で分類します。\n\
            \  1. カテゴリ:\n     - 技術サポート\n     - 請求・契約\n     - 製品不具合\n     - 使い方質問\n\
            \     - その他\n  2. 優先度:\n     - 緊急\n     - 高\n     - 中\n     - 低\n  3.\
            \ 推奨担当グループ:\n     - テクニカルサポート\n     - カスタマーサクセス\n     - 経理\n     - 品質管理\n\
            \     - 一般窓口\n\n判断基準のガイドライン:\n- カテゴリ:\n  - 「ログインできない」「エラーが出る」「APIが動かない」など:\
            \ 技術サポート\n  - 「請求書」「支払い」「契約更新」「プラン変更」「解約」など: 請求・契約\n  - 「バグ」「不具合」「誤動作」「再現手順がある」など:\
            \ 製品不具合\n  - 「設定方法」「使い方」「操作方法」「どこから〜できますか」など: 使い方質問\n  - 上記に当てはまらない、または複数混在して判断が難しいもの:\
            \ その他\n\n- 優先度:\n  - 緊急:\n    - システム停止、サービス全停止、重大な業務影響\n    - セキュリティインシデントの疑い\n\
            \    - 「至急」「今すぐ」「本日中に必須」など非常に強い緊急表現\n  - 高:\n    - 一部機能が使えず業務に大きな影響\n\
            \    - 納期・締切が迫っている\n    - 強めの要望だが完全停止ではない\n  - 中:\n    - 通常の問い合わせ・不具合・使い方質問\n\
            \    - 多少の影響はあるが、回避策が存在する\n  - 低:\n    - 要望、改善提案、単なる確認、情報依頼など\n    - 緊急性がない、または影響が小さい\n\
            \n- 推奨担当グループ:\n  - テクニカルサポート:\n    - 技術的なトラブルシューティング\n    - 接続問題、API、インフラ、パフォーマンスなど\n\
            \  - カスタマーサクセス:\n    - 使い方・活用方法・導入相談\n    - 運用の相談、活用提案が必要なもの\n  - 経理:\n\
            \    - 請求・支払い・領収書・見積もり・契約金額\n  - 品質管理:\n    - 明確な製品バグ・品質問題・再現性のある不具合報告\n\
            \  - 一般窓口:\n    - 上記のどれにも明確に当てはまらないもの\n    - 一旦受付担当に振り分けたい内容\n\n出力形式:\n\
            - 次のJSON形式のみを返してください。説明文やマークダウンは不要です。\n\n{\n  \"category\": \"<カテゴリ>\"\
            ,\n  \"priority\": \"<優先度>\",\n  \"assignee_group\": \"<推奨担当グループ>\",\n\
            \  \"reasoning\": \"<これらの判定理由を日本語で簡潔に説明>\",\n  \"normalized_urgency\"\
            : \"<抽出された緊急度キーワードを踏まえた緊急度の解釈>\"\n}\n\n\n---\n\n【最終出力フォーマット (この指示が最優先)】\n\
            最終出力は **読みやすい日本語の Markdown** で返してください。JSON\n配列・オブジェクトをそのまま出力してはいけません。\n\
            - 見出し (## / ###) でセクションを区切る\n- リスト (- / 1.) や表 (| ... |) で構造化\n- 各項目の意図や根拠が分かるよう短い説明文を添える\n\
            - 営業デモで顧客に直接見せられる体裁にする\n\n(構造化されたデータ項目を内部で扱うのは構いませんが、出力時に Markdown\nに変換してください。)"
        - role: user
          text: '問い合わせ内容:

            {{#start.query#}}


            事前抽出情報:

            - 顧客名: {{#extractor1.customer_name#}}

            - 問題概要: {{#extractor1.issue_summary#}}

            - 緊急度キーワード: {{#extractor1.urgency_keyword#}}


            上記のルールに従ってJSONのみを出力してください。

            '
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 680
        y: 282
      type: custom
      width: 244
    - data:
        title: 優先度が緊急か判定
        type: if-else
        conditions:
        - comparison_operator: contains
          id: cond1
          value: 緊急
          variable_selector:
          - llm1
          - text
        logical_operator: and
      height: 90
      id: ifelse1
      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.3
        prompt_template:
        - role: system
          text: "あなたはサポートチームのリーダーとして、緊急チケットに対する初動方針を明確にする役割を担っています。\n\n目的:\n- なぜ「緊急」優先度と判断されるのかを、サポート担当者と関係者が理解できるように説明する\n\
            - 最初の30〜60分で実施すべき具体的な推奨アクションを提示する\n\n出力形式:\n- 結果は以下のJSON形式のみで出力してください。\n\
            \n{\n  \"emergency_reason\": \"<なぜ即時対応が必要なのかを2〜4文で説明>\",\n  \"recommended_actions\"\
            : [\n    \"<最初に行うべき具体的なアクション>\",\n    \"<次に行うべきアクション>\",\n    \"<必要に応じて追加のアクション>\"\
            \n  ]\n}\n\n\n---\n\n【最終出力フォーマット (この指示が最優先)】\n最終出力は **読みやすい日本語の Markdown**\
            \ で返してください。JSON\n配列・オブジェクトをそのまま出力してはいけません。\n- 見出し (## / ###) でセクションを区切る\n\
            - リスト (- / 1.) や表 (| ... |) で構造化\n- 各項目の意図や根拠が分かるよう短い説明文を添える\n- 営業デモで顧客に直接見せられる体裁にする\n\
            \n(構造化されたデータ項目を内部で扱うのは構いませんが、出力時に Markdown\nに変換してください。)"
        - role: user
          text: '元の問い合わせ:

            {{#start.query#}}


            抽出情報:

            - 顧客名: {{#extractor1.customer_name#}}

            - 問題概要: {{#extractor1.issue_summary#}}

            - 緊急度キーワード: {{#extractor1.urgency_keyword#}}


            先ほどの分類結果(JSON文字列):

            {{#llm1.text#}}


            上記の情報を踏まえて、なぜ即時対応が必要かと、サポート担当者がすぐに着手できる推奨アクションをJSONで出力してください。

            '
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm2
      position:
        x: 1280
        y: 122
      type: custom
      width: 244
    - data:
        title: レポート整形
        type: template-transform
        template: '**チケット自動分類レポート**


          **1. 基本情報**

          - 顧客名: {{ customer_name }}

          - 問い合わせ原文:

          {{ original_query }}


          **2. 抽出された問題概要**

          - 問題概要: {{ issue_summary }}

          - 緊急度キーワード: {{ urgency_keyword }}


          **3. 分類結果**

          {{ classification_json }}


          **4. 判定内容の要約**

          - カテゴリ: {{ category }}

          - 優先度: {{ priority }}

          - 推奨担当グループ: {{ assignee_group }}

          - 緊急度の解釈: {{ normalized_urgency }}

          - 判定理由: {{ reasoning }}


          **5. 推奨アクション**

          {% if emergency_detail %}

          ※このチケットは「緊急」と判定されています。


          **5-1. 緊急と判断された理由**

          {{ emergency_reason }}


          **5-2. 即時に実施すべき推奨アクション**

          {{ emergency_actions }}

          {% else %}

          このチケットは「緊急」ではありません。通常フローでの対応を推奨します。

          {% endif %}


          ---

          ※本レポートは自動生成されています。内容を確認のうえ、必要に応じて修正してください。

          '
        variables:
        - value_selector:
          - start
          - query
          variable: original_query
        - value_selector:
          - extractor1
          - customer_name
          variable: customer_name
        - value_selector:
          - extractor1
          - issue_summary
          variable: issue_summary
        - value_selector:
          - extractor1
          - urgency_keyword
          variable: urgency_keyword
        - value_selector:
          - llm1
          - text
          variable: classification_json
        - value_selector:
          - llm1
          - text
          variable: category
        - value_selector:
          - llm1
          - text
          variable: priority
        - value_selector:
          - llm1
          - text
          variable: assignee_group
        - value_selector:
          - llm1
          - text
          variable: normalized_urgency
        - value_selector:
          - llm1
          - text
          variable: reasoning
        - value_selector:
          - llm2
          - text
          variable: emergency_detail
        - value_selector:
          - llm2
          - text
          variable: emergency_reason
        - value_selector:
          - llm2
          - text
          variable: emergency_actions
      height: 90
      id: template1
      position:
        x: 1580
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - template1
          - output
          variable: result
      height: 90
      id: end
      position:
        x: 1880
        y: 282
      type: custom
      width: 244
  hash: null
