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: if-else
      id: extractor1-to-ifelse1
      source: extractor1
      target: ifelse1
    - data:
        sourceType: if-else
        targetType: llm
      id: ifelse1-true-to-llm_escalation
      source: ifelse1
      sourceHandle: 'true'
      target: llm_escalation
    - data:
        sourceType: if-else
        targetType: llm
      id: ifelse1-false-to-llm_standard
      source: ifelse1
      sourceHandle: 'false'
      target: llm_standard
    - data:
        sourceType: llm
        targetType: code
      id: llm_standard-to-code1
      source: llm_standard
      target: code1
    - data:
        sourceType: llm
        targetType: code
      id: llm_escalation-to-code1
      source: llm_escalation
      target: code1
    - data:
        sourceType: code
        targetType: end
      id: code1-to-end
      source: code1
      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
          completion_params:
            temperature: 0.2
        query:
        - start
        - query
        parameters:
        - name: incident_type
          type: string
          description: 'インシデントの種類（例: 立入/巡回遅延/誤対応/無断侵入/設備不備など）'
          required: true
        - name: location
          type: string
          description: 発生場所（施設名・エリア）
          required: false
        - name: reported_time
          type: string
          description: 発生または報告時刻
          required: false
        - name: severity
          type: string
          description: 重大度（low / medium / high のいずれかで記述）
          required: true
        - name: customer_contact
          type: string
          description: 顧客の連絡先（存在する場合）
          required: false
        - name: desired_resolution
          type: string
          description: 顧客が希望する解決方法（返金、再発防止、謝罪、調査結果の報告 等）
          required: false
        reasoning_mode: prompt
        instruction: 以下の顧客メッセージから上記の項目を抽出してください。抽出できない項目は空欄にしてください。重大度は low/medium/high
          のいずれかで返してください。
      height: 90
      id: extractor1
      position:
        x: 380
        y: 282
      type: custom
      width: 244
    - data:
        title: 条件分岐（重大度判定）
        type: if-else
        conditions:
        - comparison_operator: is
          id: cond1
          value: high
          variable_selector:
          - extractor1
          - severity
        logical_operator: and
      height: 90
      id: ifelse1
      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: あなたは警備会社のカスタマーサポート担当です。顧客への謝罪文、即時対応手順、詳細な対応手順、フォローアップ案を作成してください。日本語で丁寧に書き、箇条書きでわかりやすく示してください。エスカレーションは不要な場合は明記しないでください。
        - role: user
          text: '顧客の苦情:

            {{#start.query#}}


            抽出情報:

            - インシデント: {{#extractor1.incident_type#}}

            - 場所: {{#extractor1.location#}}

            - 発生時刻: {{#extractor1.reported_time#}}

            - 重大度: {{#extractor1.severity#}}

            - 顧客の希望: {{#extractor1.desired_resolution#}}

            - 顧客連絡先: {{#extractor1.customer_contact#}}


            上記を踏まえて、以下を作成してください:

            1) 公式な謝罪文（法人向け・丁寧な文面）

            2) 直ちに行うべき即時対応（箇条書き）

            3) 再発防止を含む詳細な対応手順（担当、期限、報告方法）

            4) フォローアップ案（顧客への報告タイミングと形式）


            プレーンテキストで出力してください。'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm_standard
      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.25
        prompt_template:
        - role: system
          text: あなたは警備会社のインシデントレスポンス担当です。重大（high）な事案に対して、顧客への謝罪文に加え、即時のエスカレーション手順（誰にどのタイムラインで連絡するか、深刻度評価、暫定対応、関係部署への指示、上長連絡の文章例）を明確に書いてください。具体的かつ実行可能な手順を提示してください。
        - role: user
          text: '顧客の苦情:

            {{#start.query#}}


            抽出情報:

            - インシデント: {{#extractor1.incident_type#}}

            - 場所: {{#extractor1.location#}}

            - 発生時刻: {{#extractor1.reported_time#}}

            - 重大度: {{#extractor1.severity#}}

            - 顧客の希望: {{#extractor1.desired_resolution#}}

            - 顧客連絡先: {{#extractor1.customer_contact#}}


            上記を踏まえて、以下を作成してください:

            1) 公式な謝罪文（危機管理意識を示す文面）

            2) 即時の一次対応（現場の安全確保、証拠保全、顧客への暫定連絡）

            3) エスカレーション手順（連絡先の役職/部署、電話/メールのテンプレ、対応期限、上長・経営層への報告フォーマット）

            4) 顧客向けの今後の対応予定（タイムラインと責任者）


            プレーンテキストで具体的に出力してください。'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm_escalation
      position:
        x: 1280
        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    response = inputs.get(\"response\"\
          , \"\")\n    escalation_response = inputs.get(\"escalation_response\", \"\
          \")\n    # 優先: エスカレーション用テキストが存在すればそれを採用、なければ通常対応テキストを採用\n    chosen = escalation_response\
          \ if escalation_response and str(escalation_response).strip() != \"\" else\
          \ response\n    if chosen is None:\n        chosen = \"\"\n    return dict(output=str(chosen))\n"
        variables:
        - value_selector:
          - llm_standard
          - text
          variable: response
        - value_selector:
          - llm_escalation
          - text
          variable: escalation_response
        outputs:
          output:
            type: string
            children: null
      height: 90
      id: code1
      position:
        x: 1580
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - code1
          - output
          variable: result
      height: 90
      id: end
      position:
        x: 1880
        y: 282
      type: custom
      width: 244
  hash: null
