app:
  description: チーム単位の月次指標（勤怠・有給取得率・1on1実施率・離職率・エンゲージメント等）を元に、チームヘルス評価コメント・要注意事項・推奨アクションを生成するワークフロー。マネージャーと人事のレビューを自動化。
  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: 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: 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: team_name
          type: string
          description: チーム名
          required: true
        - name: month
          type: string
          description: '対象月（例: 2026-04）'
          required: true
        - name: attendance_rate
          type: number
          description: 勤怠率（%）
          required: true
        - name: paid_leave_rate
          type: number
          description: 有給取得率（%）
          required: true
        - name: oneonone_rate
          type: number
          description: 1on1実施率（%）
          required: true
        - name: turnover_rate
          type: number
          description: 離職率（%）
          required: true
        - name: engagement_score
          type: number
          description: エンゲージメントスコア（0-100）
          required: true
        - name: additional_notes
          type: string
          description: 任意の補足メモ
          required: false
        reasoning_mode: prompt
        instruction: ユーザーの入力テキストから上記パラメータを抽出してください。数値は数値型で出力してください。追加情報がなければ空文字を返してください。
      height: 90
      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    def to_num(v):\n        try:\n    \
          \        return float(v)\n        except Exception:\n            try:\n\
          \                s = str(v)\n                s2 = s.replace(\"%\", \"\"\
          ).strip()\n                return float(s2)\n            except Exception:\n\
          \                return 0.0\n    attendance = to_num(inputs.get(\"attendance_rate\"\
          ))\n    paid_leave = to_num(inputs.get(\"paid_leave_rate\"))\n    oneonone\
          \ = to_num(inputs.get(\"oneonone_rate\"))\n    turnover = to_num(inputs.get(\"\
          turnover_rate\"))\n    engagement = to_num(inputs.get(\"engagement_score\"\
          ))\n    issues = []\n    # シンプルな閾値判定（必要に応じて調整）\n    if attendance < 90.0:\n\
          \        issues.append(\"勤怠率が低い（<90%）\")\n    if paid_leave > 30.0:\n  \
          \      issues.append(\"有給取得率が高い（>30%） ※業務影響を確認\")\n    if oneonone < 60.0:\n\
          \        issues.append(\"1on1実施率が低い（<60%）\")\n    if turnover > 5.0:\n \
          \       issues.append(\"離職率が高い（>5%）\")\n    if engagement < 60.0:\n    \
          \    issues.append(\"エンゲージメントが低い（<60）\")\n    if len(issues) == 0:\n   \
          \     issues_text = \"懸念なし\"\n    else:\n        issues_text = \", \".join(issues)\n\
          \    summary = \"チーム: \" + str(inputs.get(\"team_name\")) + \" | 月: \" +\
          \ str(inputs.get(\"month\")) + \" | 指標: 勤怠=\" + str(attendance) + \"%, 有給=\"\
          \ + str(paid_leave) + \"%, 1on1=\" + str(oneonone) + \"%, 離職率=\" + str(turnover)\
          \ + \"%, エンゲージメント=\" + str(engagement)\n    return dict(summary=summary,\
          \ flags=issues_text)\n"
        variables:
        - value_selector:
          - extractor1
          - team_name
          variable: team_name
        - value_selector:
          - extractor1
          - month
          variable: month
        - value_selector:
          - extractor1
          - attendance_rate
          variable: attendance_rate
        - value_selector:
          - extractor1
          - paid_leave_rate
          variable: paid_leave_rate
        - value_selector:
          - extractor1
          - oneonone_rate
          variable: oneonone_rate
        - value_selector:
          - extractor1
          - turnover_rate
          variable: turnover_rate
        - value_selector:
          - extractor1
          - engagement_score
          variable: engagement_score
        - value_selector:
          - extractor1
          - additional_notes
          variable: additional_notes
        outputs:
          summary:
            type: string
            children: null
          flags:
            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: 'あなたは人事のエキスパートです。与えられたチームの月次指標をもとに、以下の3つを日本語で出力してください。

            1) チームヘルス評価コメント（要約的で、マネージャーと人事がレビューで使えるトーン）

            2) 要注意事項（具体的に何を観察すべきか）

            3) 推奨アクション（短期と中長期の実行可能な施策）

            出力は読みやすい日本語で、見出しと箇条書きを使ってください。必要であれば優先度を付けてください。前処理で算出された要点を必ず考慮してください。


            ---


            【最終出力フォーマット (この指示が最優先)】

            最終出力は **読みやすい日本語の Markdown** で返してください。JSON

            配列・オブジェクトをそのまま出力してはいけません。

            - 見出し (## / ###) でセクションを区切る

            - リスト (- / 1.) や表 (| ... |) で構造化

            - 各項目の意図や根拠が分かるよう短い説明文を添える

            - 営業デモで顧客に直接見せられる体裁にする


            (構造化されたデータ項目を内部で扱うのは構いませんが、出力時に Markdown

            に変換してください。)'
        - role: user
          text: 'ユーザー入力:

            {{#start.query#}}


            前処理サマリ:

            {{#code1.summary#}}


            検出された懸念:

            {{#code1.flags#}}


            上記を参考に、チームヘルス評価コメント・要注意事項・推奨アクションを作成してください。出力は日本語で簡潔にまとめてください。'
        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
