app:
  description: 地名入力からWeb検索結果を活用して旅行記事を自動生成するシンプルなワークフロー（Web検索ノードはシステム側で自動挿入）
  icon: 🤖
  icon_background: '#FFEAD5'
  mode: workflow
  name: 旅行記事自動生成（地名入力）
  use_icon_as_answer_icon: false
kind: app
version: 0.1.5
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: http-request
      id: start-to-web_search
      source: start
      target: web_search
    - data:
        sourceType: llm
        targetType: end
      id: llm1-to-end
      source: llm1
      target: end
    - id: web_search-to-llm1
      source: web_search
      target: llm1
      data:
        sourceType: http-request
        targetType: llm
    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: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.7
        prompt_template:
        - role: system
          text: "あなたはプロのトラベルライター兼Webメディア編集者です。\nユーザーが入力した「地名」について、Web検索で自動的に取得される情報（観光スポット、歴史、アクセス、宿泊・飲食店、イベント、写真情報など）を活用し、\n\
            指定のテンプレートに沿ったオリジナルの旅行記事を日本語で執筆してください。\n\n【重要な前提】\n- Web検索ノードにより最新のオンライン情報が自動で提供されます。\n\
            - 取得情報は「参考資料」として扱い、丸写しせず、必ずあなたの言葉で要約・再構成してください。\n- 出典サイトのコンテンツをそのままコピーペーストすることは著作権上NGです。\n\
            - 情報があいまい／矛盾している場合は、もっとも信頼性が高そうな公的機関・公式サイトを優先し、それでも不明な点は推測せず「不明」「最新情報は公式サイトで確認が必要」などと記載します。\n\
            \n【記事の全体方針】\n- 想定読者：一般的な日本人旅行者（個人旅行・家族旅行・友人グループ）\n- 文章トーン：信頼できる旅行メディア風。丁寧で親しみやすく、宣伝色は控えめ。\n\
            - 文字数目安：2,000〜3,000文字程度（状況により前後してもよい）\n- SEOを意識して、タイトル・見出し・本文に主要キーワード（地名、観光、旅行、モデルコース\
            \ など）を自然に含める\n\n【必ず含めるセクション構成（Markdownで出力）】\n1. 記事タイトル（H1）\n   - 読者が行きたくなる魅力的なタイトル\n\
            \   - 主要キーワード（地名＋旅行／観光）を自然に含める\n\n2. リード文（導入）\n   - 3〜6文程度で、その土地の雰囲気・魅力・どんな人におすすめかを要約\n\
            \n3. 基本情報・概要（H2）\n   - 地名の位置（国・地域・最寄りの大都市など）\n   - 特徴的なキーワード（例：温泉地、城下町、ビーチリゾート、IT都市\
            \ など）\n   - 気候・ベストシーズン（可能な範囲で）\n\n4. 歴史と背景（H2）\n   - その土地の歴史的な成り立ちや文化的背景\n\
            \   - 代表的なエピソードや歴史人物など\n\n5. 観光スポット紹介（H2）\n   - 代表的なスポットを3〜7か所程度ピックアップ\n\
            \   - 各スポットについて以下を簡潔に記載\n     - 見どころ・特徴\n     - 所要時間の目安\n     - 家族向き・カップル向き・一人旅向きなどのコメントがあれば\n\
            \n6. モデル日程プラン（H2）\n   - 1日プラン、または1泊2日／2泊3日などを1〜2パターン提案\n   - 時系列で「朝〜夜」まで、訪問順と簡単な移動イメージを記載\n\
            \n7. アクセス情報（H2）\n   - 主要な都市（例：東京・大阪など）からのアクセス手段を整理\n     - 電車／飛行機／バス／車など\n\
            \     - 所要時間の目安\n   - 空港や主要駅から中心地までのアクセスイメージ\n\n8. 宿泊・飲食スポット（H2）\n   -\
            \ 宿泊エリアの特徴（駅近・温泉街・繁華街など）\n   - 代表的な宿泊タイプ（旅館・ホテル・ゲストハウスなど）\n   - 名物グルメやご当地料理、代表的な飲食エリア\n\
            \n9. イベント・フェスティバル（H2）\n   - 年間を通して行われる主なイベントや祭り\n   - 時期の目安と簡単な内容\n  \
            \ - 不明な場合は「代表的なイベント情報は要確認」として記載\n\n10. 写真スポット＆おすすめ撮影ポイント（H2）\n    - 絶景・ランドマーク・夜景など撮影におすすめの場所を2〜5か所\n\
            \    - 「どの時間帯・どの季節が良いか」を可能ならコメント\n    - 画像取得やキャプション付与を想定し、写真のテーマになるような短いキャプション案も箇条書きで出す\n\
            \n11. 多言語対応のポイント（H2）\n    - 訪日観光客向けに英語・中国語などで案内すべきキーワードの例を数個提示\n    -\
            \ 言語ごとに「翻訳時に注意したいニュアンス」があればコメント\n    - 実際の翻訳文そのものではなく、「翻訳するときのガイドライン」としてまとめる\n\
            \n12. SEO最適化の観点（H2）\n    - 検索されやすそうな関連キーワード候補を10〜20個程度リストアップ\n    - 記事中で自然に使うべきフレーズ例\n\
            \    - メタディスクリプション案（80〜120文字程度）を1つ提示\n\n13. 実装・運用上の留意点（H2）\n    - 著作権と出典表示\n\
            \      - Web検索で取得したテキスト・画像は丸写ししないこと\n      - 公式サイト・公的機関・観光協会などへのリンクを出典として明記すること\n\
            \    - 検索API利用制限\n      - APIのレート制限・利用規約を守ること\n      - キャッシュを活用して同一クエリの過剰な再検索を避けること\n\
            \    - コンテンツの信頼性検証\n      - 情報源が複数ある場合は相互にチェックすること\n      - 口コミサイトは参考情報として扱い、公式情報を優先すること\n\
            \    - キャッシュと更新頻度\n      - 価格・営業時間・イベント日程など変動しやすい情報は、キャッシュの有効期限を短めにすること\n\
            \      - 大きなイベントや新施設オープン時には、手動での更新チェックをすること\n    - 公開・共有\n      - 記事詳細ページには出典リンク一覧を設けること\n\
            \      - SNS共有時のタイトル・サマリーが魅力的かつ誤解を生まないようにすること\n\n14. まとめ（H2）\n    - 記事全体の要点を3〜5つに整理\n\
            \    - 初めて訪れる人への一言アドバイス\n\n【出力フォーマット要件】\n- Markdownで出力すること（#, ##, ###,\
            \ 箇条書きなどを適切に使用）\n- 表現はすべてオリジナル文章とし、検索結果の文をそのままコピーしない\n- 数値や固有名詞は可能な範囲で正確にしつつ、誤差があり得るものは断定しすぎない\n\
            - 実際のURLや出典サイト名がWeb検索で分かる場合は、「参考・出典」の小見出しの下に箇条書きで列挙する（ただし本文は要約・自分の言葉）\n\
            \n\n---\n\n【最終出力フォーマット (この指示が最優先)】\n最終出力は **読みやすい日本語の Markdown** で返してください。JSON\n\
            配列・オブジェクトをそのまま出力してはいけません。\n- 見出し (## / ###) でセクションを区切る\n- リスト (- / 1.)\
            \ や表 (| ... |) で構造化\n- 各項目の意図や根拠が分かるよう短い説明文を添える\n- 営業デモで顧客に直接見せられる体裁にする\n\
            \n(構造化されたデータ項目を内部で扱うのは構いませんが、出力時に Markdown\nに変換してください。)"
        - role: user
          text: 'ユーザー入力の内容:

            {{#start.query#}}


            上記は、旅行記事を作成したい「地名」や追加の要望（例：日程、同行者、予算、言語、SNS用要約など）を含む自由入力テキストです。

            この入力を解釈し、Web検索で得られる最新情報も踏まえて、前述のテンプレート構成に沿った旅行記事を作成してください。


            もし地名の特定が難しい場合は、もっとも自然に解釈できる候補を一つ選び、その前提で記事を書いてください。



            【Web検索結果】以下はユーザーの入力に基づきWeb検索（Tavily API）で取得した最新情報です。

            この情報を優先的に活用し、具体的な施設名・URL・最新データを記事に盛り込んでください。

            検索結果:

            {{#web_search.body#}}'
        vision:
          enabled: false
        memory: null
        context:
          enabled: true
      height: 90
      id: llm1
      position:
        x: 380
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - llm1
          - text
          variable: result
      height: 90
      id: end
      position:
        x: 680
        y: 282
      type: custom
      width: 244
    - id: web_search
      type: custom
      width: 244
      height: 90
      position:
        x: 80
        y: 162
      data:
        title: Web検索（Tavily）
        type: http-request
        method: post
        url: https://api.tavily.com/search
        headers: 'Content-Type: application/json'
        params: ''
        body:
          type: raw-text
          data: '{"api_key": "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", "query":
            "{{#start.query#}}", "max_results": 3, "include_answer": true}'
        timeout:
          max_connect_timeout: 10
          max_read_timeout: 30
          max_write_timeout: 30
        authorization:
          type: no-auth
  hash: null
