app:
  description: 地名からWeb情報を統合し、SEO対応の多言語旅行記事を自動生成するワークフロー
  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: code
        targetType: llm
      id: code1-to-llm1
      source: code1
      target: llm1
    - data:
        sourceType: llm
        targetType: code
      id: llm1-to-code2
      source: llm1
      target: code2
    - data:
        sourceType: code
        targetType: end
      id: code2-to-end
      source: code2
      target: end
    - id: start-to-code1
      source: start
      target: code1
      data:
        sourceType: start
        targetType: code
    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    # 入力の結合と前処理\n    sources = inputs.get(\"\
          sources\")\n    web = inputs.get(\"web\")\n    if sources is None:\n   \
          \     sources = \"\"\n    if web is None:\n        web = \"\"\n    merged\
          \ = str(sources) + \"\\n\\n\" + str(web)\n    # 簡単なノイズ除去（例: 連続改行を1つに）\n\
          \    merged = merged.replace(\"\\n\\n\\n\", \"\\n\\n\")\n    return dict(output=merged)\n"
        variables:
        - value_selector:
          - kr1
          - result
          variable: sources
        - value_selector:
          - http1
          - body
          variable: web
        outputs:
          output:
            type: string
            children: null
      height: 90
      id: code1
      position:
        x: 980
        y: 282
      type: custom
      width: 244
    - data:
        title: 多言語SEO記事生成
        type: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.7
        prompt_template:
        - role: system
          text: "あなたは旅行記事ライティングの専門家です。ユーザーが指定した地名に関するWeb情報を統合し、 検索エンジン最適化（SEO）を意識した多言語の旅行記事を生成してください。\
            \ 出力は必ず有効なJSONとして返してください。出力フォーマットは以下の構造に従ってください。 {\n  \"languages\": {\n\
            \    \"ja\": {\n      \"title\": \"記事タイトル（日本語）\",\n      \"slug\": \"\
            URLフレンドリーなスラッグ（日本語または英語）\",\n      \"meta_title\": \"SEO用のタイトル（最大60文字程度）\"\
            ,\n      \"meta_description\": \"SEO用の説明（最大155文字程度）\",\n      \"keywords\"\
            : \"カンマ区切りのキーワード\",\n      \"content_html\": \"記事の本文（HTML形式、セクション見出しを含む）\"\
            \n    },\n    \"en\": { ... },\n    \"zh\": { ... },\n    \"es\": { ...\
            \ }\n  },\n  \"recommendations\": {\n    \"internal_links\": [\"/example-page-1\"\
            , \"/example-page-2\"],\n    \"focus_keywords\": [\"主要キーワード1\", \"主要キーワード2\"\
            ]\n  }\n} JSON以外のテキストは含めないでください。\n\n---\n\n【最終出力フォーマット (この指示が最優先)】\n最終出力は\
            \ **読みやすい日本語の Markdown** で返してください。JSON\n配列・オブジェクトをそのまま出力してはいけません。\n- 見出し\
            \ (## / ###) でセクションを区切る\n- リスト (- / 1.) や表 (| ... |) で構造化\n- 各項目の意図や根拠が分かるよう短い説明文を添える\n\
            - 営業デモで顧客に直接見せられる体裁にする"
        - role: user
          text: '地名: {{#start.query#}}

            統合情報（検索結果・Web要約）: {{#code1.output#}}

            指示: - 日本語と英語、中国語（簡体字）、スペイン語での記事を生成してください。 - 各言語ごとにSEOメタ（meta_title, meta_description,
            keywords）とHTML形式の本文(content_html)を作成してください。 - 見出し（h2, h3）で構成し、観光ポイント、アクセス、ベストシーズン、ローカルの注意点、サンプル1日観光プランを含めてください。
            - 文章は読みやすく、SEOを意識して自然なキーワードを散りばめてください。 - 記事本文は最低800語（日本語換算）相当を目安にしてください（各言語で適宜）。
            - 最終的なJSONを1つだけ返してください。'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 1280
        y: 282
      type: custom
      width: 244
    - data:
        title: 最終出力 (pass-through)
        type: code
        code_language: python3
        code: "def main(**kwargs) -> dict:\n    candidates = ['llm_text_0']\n    text\
          \ = ''\n    for name in candidates:\n        v = kwargs.get(name)\n    \
          \    if v:\n            text = str(v)\n            break\n    return {\n\
          \        'final': text,\n    }\n"
        variables:
        - value_selector:
          - llm1
          - text
          variable: llm_text_0
        outputs:
          final:
            type: string
            children: null
      height: 90
      id: code2
      position:
        x: 1580
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - code2
          - final
          variable: result
      id: end
      position:
        x: 1880
        y: 282
      type: custom
      width: 244
  hash: null
