app:
  description: 食品製造の現場向けに、短時間の研修要約と理解度確認用の小テスト（問題と解答・解説）を自動生成するワークフロー。現場学習用の要点、学習目標、推奨時間、問題（選択式および記述式）を含むJSONを出力します。
  icon: 🎓
  icon_background: '#FFF3C4'
  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: code
      id: start-to-code1
      source: start
      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: 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    import re\n    raw = inputs.get(\"\
          query\", \"\")\n    text = str(raw).strip()\n    # 改行と空白を正規化\n    text =\
          \ re.sub(r\"\\r\\n?\", \"\\n\", text)\n    text = re.sub(r\"\\n{3,}\", \"\
          \\n\\n\", text)\n    text = re.sub(r\"[ \\t]+\", \" \", text)\n    # 行頭・行末の空白を削除し、空行は除去\n\
          \    lines = [line.strip() for line in text.splitlines() if line.strip()]\n\
          \    processed = \"\\n\".join(lines)\n    # 長すぎる場合は先頭1万文字に切り詰め\n    if len(processed)\
          \ > 10000:\n        processed = processed[:10000]\n    return dict(processed_text=processed)\n"
        variables:
        - value_selector:
          - start
          - query
          variable: query
        outputs:
          processed_text:
            type: string
            children: null
      height: 90
      id: code1
      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.6
        prompt_template:
        - role: system
          text: "あなたは食品製造現場向けの教育コンテンツ作成AIです。与えられた原稿・資料や指示をもとに、短時間（目安：15〜30分）の現場研修向けに「要点の短い要約」と「理解度確認用の小テスト」を自動生成してください。\n\
            出力ルール（厳守）: 1) 出力は必ずJSONのみとし、余計な説明文や追加のテキストを出力しないこと。JSONは厳格にパース可能であること。\
            \ 2) JSON構造は以下のキーを必ず含めること:\n   - summary: 研修用の短い要約（文字列、箇条書き風に改行で最大5行）\n\
            \   - learning_objectives: 学習目標の配列（最大5件）\n   - estimated_time_minutes:\
            \ 推定所要時間（整数、分）\n   - recommended_materials: 推奨教材や準備物の配列（任意）\n   - quiz:\
            \ 問題の配列。各問題はオブジェクトで次のフィールドを含む:\n       * id: 一意の問題ID（例: Q1）\n       *\
            \ type: \"mcq\" または \"short\"（選択式または記述式）\n       * question: 問題文（文字列）\n\
            \       * options: 選択肢配列（type が \"mcq\" の場合、必須）\n       * answer: 正解（選択肢の場合は正しい選択肢をそのまま、記述式は模範解答の短い文）\n\
            \       * explanation: 解説（短く、2〜3行程度）\n   - difficulty: 難易度（\"easy\", \"\
            medium\", \"hard\" のいずれか）\n\n3) 出力されるquizは合計5問とする。構成は「選択式(mcq)を3問、記述式(short)を2問」とする。選択肢は各問につき3〜4つ用意すること。\
            \ 4) 問題は現場で短時間に確認できる内容に限定し、実務に直結する要点を問う設問を優先すること。 5) JSON内の文字列は日本語で出力すること。\
            \ 6) 不明点や情報が不足する場合でも、与えられた入力に基づいて現場で妥当と思われる前提を明記せずに推測して出力する（ただし推測は最小限に）。"
        - role: user
          text: '以下は入力テキストです。研修対象・目的・現場条件・重点箇所・参考資料等が含まれます。これをもとに上記フォーマットのJSONを返してください。

            入力: {{#code1.processed_text#}}'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 680
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - llm1
          - text
          variable: result
      id: end
      position:
        x: 980
        y: 282
      type: custom
      height: 90
      width: 244
  hash: null
