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-extract1
      source: start
      target: extract1
    - data:
        sourceType: parameter-extractor
        targetType: code
      id: extract1-to-code1
      source: extract1
      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: parameter-extractor
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.2
        query:
        - start
        - query
        parameters:
        - name: venue
          type: string
          description: 会場名・屋内外情報（屋内/屋外など）
          required: true
        - name: date
          type: string
          description: 公演日（任意の形式）
          required: true
        - name: expected_attendance
          type: number
          description: 想定来場者数（概数）
          required: false
        - name: weather_forecast
          type: string
          description: '天気予報や懸念（例: 雨予報、台風の可能性 等）'
          required: false
        - name: performer_status
          type: string
          description: 出演者の確度（confirmed / possible cancellation / cancelled など）
          required: true
        - name: other_factors
          type: string
          description: その他の要因（交通規制、機材リスク、治安、許認可 等）
          required: false
        reasoning_mode: prompt
        instruction: 以下の自由記述から、上記パラメータを可能な限り抽出してください。該当項目がない場合は空欄を返してください。
      height: 90
      id: extract1
      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    venue = str(inputs.get(\"\
          venue\", \"\"))\n    date = str(inputs.get(\"date\", \"\"))\n    weather\
          \ = str(inputs.get(\"weather_forecast\", \"\")).lower()\n    performer =\
          \ str(inputs.get(\"performer_status\", \"\")).lower()\n    other = str(inputs.get(\"\
          other_factors\", \"\")).lower()\n    # 参照: expected_attendance は数値または空\n\
          \    try:\n        attendance = float(inputs.get(\"expected_attendance\"\
          ) or 0)\n    except Exception:\n        attendance = 0.0\n    # ベーシックなスコアリング（0-100）\n\
          \    score = 0.0\n    factors = []\n    # 規模による影響\n    if attendance > 5000:\n\
          \        score = score + 30.0\n        factors.append(\"大規模動員による混雑リスク\"\
          )\n    elif attendance > 1000:\n        score = score + 15.0\n        factors.append(\"\
          中規模の動員による運営負荷\")\n    elif attendance > 200:\n        score = score + 5.0\n\
          \        factors.append(\"一定の来場者数による一般的なリスク\")\n    # 天候リスク判定（キーワードベース）\n\
          \    weather_keywords_high = [\"typhoon\", \"台風\", \"storm\", \"暴風\", \"\
          大雨\", \"heavy rain\", \"豪雨\", \"severe\"]\n    weather_keywords_medium =\
          \ [\"rain\", \"雨\", \"snow\", \"雪\", \"wind\", \"強風\"]\n    for k in weather_keywords_high:\n\
          \        if k in weather:\n            score = score + 35.0\n          \
          \  factors.append(\"悪天候（深刻）: \" + k)\n            break\n    else:\n   \
          \     for k in weather_keywords_medium:\n            if k in weather:\n\
          \                score = score + 15.0\n                factors.append(\"\
          悪天候（注意）: \" + k)\n                break\n    # 出演者リスク\n    if \"cancel\"\
          \ in performer or \"中止\" in performer or \"キャンセル\" in performer or \"cancelled\"\
          \ in performer:\n        score = score + 40.0\n        factors.append(\"\
          出演キャンセルの可能性/発生\")\n    elif \"possible\" in performer or \"可能性\" in performer\
          \ or \"調整\" in performer or \"未確定\" in performer:\n        score = score\
          \ + 20.0\n        factors.append(\"出演未確定・キャンセルの可能性あり\")\n    elif \"confirmed\"\
          \ in performer or \"確定\" in performer or \"出演確定\" in performer:\n      \
          \  score = score - 5.0\n        factors.append(\"出演者は概ね確定\")\n    # その他要因チェック\n\
          \    if \"交通\" in other or \"アクセス\" in other or \"road\" in other:\n   \
          \     score = score + 10.0\n        factors.append(\"交通アクセスの懸念\")\n    if\
          \ \"機材\" in other or \"technical\" in other or \"音響\" in other:\n      \
          \  score = score + 10.0\n        factors.append(\"機材・技術的リスク\")\n    if \"\
          治安\" in other or \"security\" in other:\n        score = score + 10.0\n\
          \        factors.append(\"治安・安全対策の懸念\")\n    # スコアの上限下限調整\n    if score\
          \ < 0:\n        score = 0.0\n    if score > 100:\n        score = 100.0\n\
          \    # 要約作成\n    if len(factors) == 0:\n        summary = \"顕著なリスク要因は自動抽出されませんでした。\"\
          \n    else:\n        summary = \"、\".join(factors)\n    # 戦略的な短文説明\n   \
          \ explanation = \"会場: \" + venue + \". 日付: \" + date + \". 主な要因: \" + summary\n\
          \    # 戻り値は dict() を使用\n    return dict(score=int(round(score)), summary=summary,\
          \ explanation=explanation)\n"
        variables:
        - value_selector:
          - extract1
          - venue
          variable: venue
        - value_selector:
          - extract1
          - date
          variable: date
        - value_selector:
          - extract1
          - expected_attendance
          variable: expected_attendance
        - value_selector:
          - extract1
          - weather_forecast
          variable: weather_forecast
        - value_selector:
          - extract1
          - performer_status
          variable: performer_status
        - value_selector:
          - extract1
          - other_factors
          variable: other_factors
        outputs:
          score:
            type: number
            children: null
          summary:
            type: string
            children: null
          explanation:
            type: string
            children: null
      height: 90
      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
        prompt_template:
        - role: system
          text: 'あなたはイベント運営の観点で公演リスク評価レポートを短く明確に作成する専門家です。出力は日本語で、以下の形式を守ってください。

            1) リスク判定（Low/Medium/High とスコア）

            2) 主なリスク要因（箇条書き、最大3項目）

            3) 具体的な対策（簡潔に、最大3項目）

            文章は全体で200語以内にまとめてください。'
        - role: user
          text: 'ユーザー入力:

            {{#start.query#}}


            抽出結果（要約）:

            {{#extract1.venue#}} / {{#extract1.date#}} / 想定来場者数: {{#extract1.expected_attendance#}}

            天候: {{#extract1.weather_forecast#}}

            出演ステータス: {{#extract1.performer_status#}}

            その他: {{#extract1.other_factors#}}


            計算されたリスクスコア: {{#code1.score#}}

            自動抽出された主な要因: {{#code1.summary#}}

            説明: {{#code1.explanation#}}


            この情報を基に上記フォーマットで短い報告書を作成してください。'
        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
