mcpField
F
felo-superAgent

felo-superAgent

github.com/felo-incエージェントワークフロー25098 回インストール14 週間前に更新
リポジトリ

felo-superAgent について

felo-superAgent は、Felo SuperAgent との複数ターンの会話を行うスキルです。LiveDoc とスレッド ID で会話を継続し、依頼内容に応じて専用スキルを選択します。

主な機能

  1. 01LiveDoc 上で会話を継続
  2. 02追質問にスレッド ID を再利用
  3. 03意図に応じたスキル選択
  4. 04ブランドスタイルの選択
  5. 05JSON モードで回答を取得

活用シーン

  1. 01同じキャンバスで継続的に質問
  2. 02ロゴやEC商品画像の生成
  3. 03文書や PPT を含む回答の取得

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/felo-inc/felo-skills --skill felo-superagent

インストール後、Claude Code で/felo-superagentを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

clawhub.json
LICENSE
README.md
scripts/
run_style_library.mjs
run_superagent.mjs

詳細

Felo SuperAgent スキル

制約(最初に必ずお読みください)

これらのルールは必須です。いずれかに違反すると、動作が正しくなくなります。

  1. 必ず --json フラグを使用してください。 スクリプトは必ず JSON モード(--json)で実行してください。Claude Code の Bash ツールでは、標準出力は常にキャプチャされ、ユーザーに直接ストリーミングされることはありません。JSON モードでは構造化された応答として回答全体が返され、それを Claude がテキストとして出力できます。状態 ID は、JSON 応答のフィールド thread_short_id と live_doc_short_id から抽出します。

  2. 回答は必ずテキストとしてそのまま出力してください。 スクリプトの実行後、JSON 出力から data.answer を読み取り、回答テキストとして一字一句そのまま出力してください。要約、言い換え、補足説明の追加はしないでください。ユーザーに内容全体が表示されるよう、完全にそのまま出力してください。その後、data.image_urls が空でない場合は、直後に画像リンクを追加してください。画像ごとに 1 行で、次の形式にします:title。

  3. 会話を作成する場合、--live-doc-id は必須です。 --live-doc-id を指定せずに run_superagent.mjs を実行してはいけません。まだ ID がない場合は、先に取得してください(下記のステップ 2 を参照)。

  4. あらゆる取得元の live_doc_id を再利用してください。 このセッションの過去の操作で live_doc_id をすでに取得している場合は、以前の SuperAgent 呼び出し、felo-livedoc スキルの操作、ユーザーから提供された入力、その他のスキルのいずれで取得したかを問わず、その ID をそのまま使用してください。LiveDoc の一覧を再取得してはいけません。どの取得元からも live_doc_id を入手できない場合に限り、一覧を取得してください。(注:live_doc_id は API フィールド live_doc_short_id および [state] 出力キー live_doc_short_id に対応します。)

  5. 1 セッションにつき LiveDoc は 1 つです。 セッション内のすべての会話で、同じ --live-doc-id を使用してください。ユーザーが明示的に「新しいキャンバスを開く」「新しい LiveDoc を開始する」「新しいワークスペースを作成する」と依頼しない限り、新しい LiveDoc を作成してはいけません。

  6. デフォルトの動作は、新しい会話ではなくフォローアップです。 最初の質問の後、ユーザーからのメッセージはすべてフォローアップです。前回の応答から --thread-id を渡してください。--thread-id を省略して(同じ LiveDoc 上で新しいスレッドを開始して)よいのは、次の場合に限ります。

    • ユーザーが明示的に「新しいトピック」「話題を変える」「最初からやり直す」と言った場合
    • ユーザーの意図に特定の --skill-id が必要(例:ツイートの作成、ロゴデザイン、商品画像の作成)で、現在のスレッドがそのスキルで作成されていない場合。--skill-id は新しい会話でのみ有効なためです。
  7. 状態は必ず保存してください。 呼び出しのたびに、stderr の [state] 行から thread_short_id と live_doc_id(live_doc_short_id として出力されます)を抽出してください。次の呼び出しでは、これらの ID を使用してください。これらの ID を失うと、会話の継続性が損なわれます。

  8. スキル ID の選択(新しい会話のみ)。 新しい会話を作成するとき(--thread-id がない場合)は、ユーザーの意図を分析し、対応しているスキル ID に該当するか判断してください。

    利用可能なスキル ID:

    • twitter-writer — ツイート/X 投稿の作成、下書き、投稿用
    • logo-and-branding — ロゴ、ブランドデザイン、ビジュアルアイデンティティの作成用
    • ecommerce-product-image — E コマース向けの商品画像の生成用

    選択ロジック:

    • ユーザーが特定のスキル ID を明示的に指定した場合は、指定された値を使用します
    • ユーザーの意図が上記のいずれかに明確に該当する場合は、その値を --skill-id に指定します
    • いずれにも該当しない場合は、--skill-id を指定しません(一般的な会話モード)
    • --skill-id が有効なのは、新しい会話を作成する場合のみです。フォローアップモード(--thread-id がある場合)では無視されます。
  9. スキルを使った新しい会話でのブランドスタイル選択。 スキル ID(twitter-writer、logo-and-branding、ecommerce-product-image)を使って新しい会話を開始する場合は、run_superagent.mjs を呼び出す前に、必ずスタイルライブラリを取得し、ユーザーにスタイルを選んでもらってください。選択したスタイルは --ext '{"brand_style_requirement":"<style_string>"}' で渡します。詳しい手順については、ステップ 4.5 を参照してください。

    • スタイル文字列は、各エントリーについて run_style_library.mjs が出力するテキストブロックそのものです。フィールドはカテゴリーによって異なります。
      • TWITTER:Style name + Style labels(言語対応)+ Style DNA + Cover file ID(null の場合は省略)
      • IMAGE:存在する項目に応じて、Style name + Style labels + Style DNA または Cover file ID
    • スキルに合ったカテゴリーを使用してください。twitter-writer には TWITTER、logo-and-branding と ecommerce-product-image には IMAGE を使用します。
    • ラベルをユーザーの言語で取得できるよう、必ず run_style_library.mjs に --accept-language を渡してください。
    • ユーザーがすでにスタイルを指定している場合(名前の指定、またはスタイルブロックの貼り付け)、取得を省略し、ユーザーが選んだスタイルをそのまま使用してください。
    • スタイルライブラリからエントリーが返されない場合は、--ext を付けずに進めてください。
    • --ext は新しい会話でのみ有効です。フォローアップモード(--thread-id)では決して渡さないでください。
  10. **安易に新しい LiveDoc を作成しないでください。**既存のものを再利用してください。ユーザーが新しいキャンバス/ワークスペースを明示的にリクエストした場合のみ、新規作成できます。

使用する場面

ユーザーが次のことを希望する場合に、このスキルを起動します。

  • **SuperAgent との会話:**リアルタイムのストリーミング出力を伴う、Felo SuperAgent との AI 会話
  • **継続的な会話:**永続的な LiveDoc キャンバスで行う複数ターンの質疑応答
  • **ロゴとブランディング:**ロゴやブランドデザインの作成(logo-and-branding スキルを自動選択)
  • **E コマース画像:**商品画像の生成(ecommerce-product-image スキルを自動選択)
  • **ツールを活用した回答:**画像生成、ドキュメント作成、PPT 生成、Twitter/X 検索などを含む可能性のある回答
  • **ストリーミング応答:**Server-Sent Events(SSE)を使用したリアルタイムの回答生成

起動キーワード:

  • 英語:superagent、super agent、stream chat、streaming conversation、livedoc conversation、continuous chat、follow-up question、create a logo、brand design、product image、e-commerce image
  • 簡体字中国語(ピンイン):chao ji zhu shou、liu shi dui hua、lian xu dui hua、zhui wen、she ji logo、pin pai she ji、dian shang tu pian
  • 繁体字中国語(ピンイン):chao ji zhu shou、liu shi dui hua、lian xu dui hua、zhui wen、she ji logo、pin pai she ji、dian shang tu pian
  • 日本語(ローマ字):suupaa eejento、sutoriimingu kaiwa、keizoku kaiwa、rogo sakusei、shouhin gazou

明示的なコマンド:/felo-superAgent、「use felo superagent」、「felo superagent」

次の場合は使用しないでください:

  • あらゆる種類のツイート/X 投稿の作成(代わりに felo-twitter-writer を使用)
  • 単発の簡単な質疑応答やリアルタイム情報の検索(felo-search を優先)
  • Web ページの内容取得のみ(felo-web-fetch を使用)
  • PPT/スライドの生成のみ(felo-slides を使用)
  • LiveDoc ナレッジベースの管理のみ(felo-livedoc を使用)
  • Twitter/X の検索のみ(felo-x-search を使用)

セットアップ

1. API キーを取得する
  1. felo.ai にアクセスして、ログイン(または登録)します
  2. 右上のアバターをクリックし、[Settings]を選択します
  3. [API Keys]タブに移動します
  4. [Create New Key]をクリックして、新しい API Key を生成します
  5. API Key をコピーし、安全な場所に保存します
2. API キーを設定する

スクリプト(run_superagent.mjs、run_style_library.mjs)は、API キーを FELO_API_KEY 環境変数からのみ読み込みます。felo config set CLI コマンドは ~/.felo/config.json に書き込みますが、これらのスクリプトはそこを読み込みません。環境変数のみがサポートされる方法です。

Linux/macOS:

export FELO_API_KEY="your-api-key-here"

永続的に設定するには、シェルのプロファイル(~/.bashrc または ~/.zshrc)に追加します。

echo 'export FELO_API_KEY="your-api-key-here"' >> ~/.zshrc
source ~/.zshrc

Windows(PowerShell):

$env:FELO_API_KEY="your-api-key-here"

Windows(CMD):

set FELO_API_KEY=your-api-key-here
3. 依存関係:felo-livedoc

このスキルは、LiveDoc の取得と作成に felo-livedoc スキルを使用します。felo-livedoc/scripts/run_livedoc.mjs が felo-superAgent/ と同じ階層にあることを確認してください。

実行方法

このスキルが起動されたら、以下の手順を順番どおりに厳密に実行してください。すべてのコマンドは Bash ツールを使用して実行します。

Step 1:API キーを確認する
if [ -z "$FELO_API_KEY" ]; then
  echo "ERROR: FELO_API_KEY not set"
  exit 1
fi

設定されていない場合は処理を停止し、上記のセットアップ手順をユーザーに提示してください。

ステップ 2:live_doc_id を取得する

このステップでは、会話を作成する前に、有効な --live-doc-id を必ず用意します。(注:live_doc_id は API フィールド live_doc_short_id に対応します。)

2a. このセッション内の何らかのソースから、すでに live_doc_id を取得している場合: ステップ 3 に進みます。同じ ID を再利用します。ソースには、以前の SuperAgent 呼び出しの [state] 出力(live_doc_short_id フィールド)、felo-livedoc スキルの操作(作成、一覧表示など)、ユーザーから提供された入力、または LiveDoc ID を返したその他のスキルが含まれます。

2b. どのソースからも live_doc_id を取得できていない場合 — LiveDoc の一覧を取得します:

node felo-livedoc/scripts/run_livedoc.mjs list --json

JSON 出力を解析します。レスポンスには data.items が含まれます。これは、更新日時の降順で並んだ LiveDoc オブジェクトの配列です。最初に is_shared === false となる項目を見つけ、その short_id を live_doc_id として使用します。is_shared === true の項目は絶対に選ばないでください — 共有 LiveDoc は他のプロジェクトに属しており、502 エラーが発生します。

レスポンスの例:

{
  "status": "ok",
  "data": {
    "total": 3,
    "items": [
      { "short_id": "abc123", "name": "Shared Project", "is_shared": true, "modified_at": "..." },
      { "short_id": "QPetunwpGnkKuZHStP7gwt", "name": "My Workspace", "is_shared": false, "modified_at": "..." },
      ...
    ]
  }
}

使用方法:live_doc_id = data.items.find(i => !i.is_shared)?.short_id

2c. is_shared === false の項目が存在しない場合(または一覧が空の場合)— 新規作成します:

node felo-livedoc/scripts/run_livedoc.mjs create --name "SuperAgent Workspace" --json

JSON 出力を解析し、data.short_id を live_doc_id として取り出します。

レスポンスの例:

{
  "status": "ok",
  "data": {
    "short_id": "NewDocId123abc",
    "name": "SuperAgent Workspace",
    ...
  }
}

2d. ユーザーが新しいキャンバス/ワークスペースを明示的に要求した場合:

新しい LiveDoc を作成し(2c と同じ)、以降のすべての呼び出しで新しい ID を使用します。古い live_doc_id は破棄します。

ステップ 3:会話モードを決定する

これが新しい会話かフォローアップかを判断します:

条件モード渡す値
セッションで最初の質問(まだ thread_short_id がない)新しい会話--live-doc-id のみ
ユーザーがフォローアップを依頼/トピックを継続する(デフォルト)フォローアップ--thread-id と --live-doc-id
ユーザーが「新しいトピック」/「話題を変える」と明示する新しい会話--live-doc-id のみ(同じ LiveDoc)
ユーザーの意図に、現在のスレッドと一致しない --skill-id が必要新しい会話--live-doc-id + --skill-id(同じ LiveDoc)
ユーザーが「新しいキャンバス」/「新しい LiveDoc」と明示する新しい会話ステップ 2d で取得した新しい --live-doc-id

重要: 最初のメッセージ以降、ユーザーからのメッセージは常にフォローアップとして扱います。ユーザーが明示的に要求した場合にのみ、新しい会話として扱います。

ステップ 4:スキル ID を決定する(新しい会話のみ)

新しい会話(--thread-id がない場合)であれば、ユーザーの意図を分析します:

利用可能なスキル ID:

  • twitter-writer — ツイート/X の投稿の作成、下書き、投稿用
  • logo-and-branding — ロゴ、ブランドデザイン、ビジュアルアイデンティティの作成用
  • ecommerce-product-image — E コマース向けの商品画像の生成用

決定方法:

  1. ユーザーがスキル ID を明示的に指定した場合は、その値を使用します
  2. それ以外の場合は、ユーザーのリクエストを分析し、上記のいずれかに該当するか判断します
  3. どれにも該当しない場合は、--skill-id を渡さないでください

フォローアップ(--thread-id が設定されている場合)であれば、このステップは完全にスキップします。フォローアップモードでは --skill-id は無視されます。

ステップ 4.5:ブランドスタイルの取得と選択(新しいスキルの会話のみ)

このステップを実行するタイミング: 新しい会話で、かつステップ 4 でスキル ID(twitter-writer、logo-and-branding、または ecommerce-product-image)が決定された場合にのみ実行します。フォローアップの会話、または一般的な会話(スキルなし)では、このステップを完全にスキップしてください。

カテゴリの対応関係:

スキル IDスタイルカテゴリ
twitter-writerTWITTER
logo-and-brandingIMAGE
ecommerce-product-imageIMAGE

4.5a. ユーザーがすでにスタイルを指定している場合(名前で指定、またはスタイルブロックを貼り付けている場合)は、それを直接使用し、4.5d に進んでください。

4.5b. スタイルリストを取得します(名前のみ):

重要:Style DNA の内容は非常に大きいため、Bash ツールの出力が途中で切り捨てられないよう、必ず --json を使用し、Node.js で名前/ラベルのみを抽出してください。リスト取得のために run_style_library.mjs を --json なしで呼び出さないでください。

# For twitter-writer
node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const list=j.list||[];
const user=list.filter(s=>!s.recommended);
const rec=list.filter(s=>s.recommended);
if(user.length){console.log('[Your styles]');user.forEach((s,i)=>{const labels=(s.content?.labels?.en||[]).join(', ');console.log((i+1)+'. '+s.name+(labels?' — '+labels:''));});}
if(rec.length){console.log('[Recommended styles]');rec.forEach((s,i)=>{const labels=(s.content?.labels?.en||[]).join(', ');console.log((user.length+i+1)+'. '+s.name+(labels?' — '+labels:''));});}
if(!list.length)console.log('(No styles found)');
"

# For logo-and-branding or ecommerce-product-image
node felo-superAgent/scripts/run_style_library.mjs --category IMAGE --accept-language en --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const list=j.list||[];
if(list.length){list.forEach((s,i)=>{const labels=(s.content?.labels?.en||s.content?.tags?.en||[]).join(', ');console.log((i+1)+'. '+s.name+(labels?' — '+labels:''));});}
else console.log('(No styles found)');
"

en をユーザーの言語に対応する --accept-language の値(zh、ja、ko、en)に置き換えてください。また、Node.js スクリプト内の .labels?.en も該当する値に合わせて更新してください(例:中国語の場合は .labels?.zh)。

4.5c. スタイルをユーザーに提示し、選択を依頼します:

完全なリストをプレーンテキストで出力してください。取得したすべてのスタイルに連番を付けます。AskUserQuestion ツールは絶対に使用しないでください(選択肢が 4 つに制限され、スタイルが黙って省略されます)。ユーザーに代わってスタイルを事前選択したり、絞り込んだりしないでください。最後に必ず「指定なし」の選択肢を追加してください。先に進む前に、ユーザーからのプレーンテキストでの返信を待ってください。

出力例:

Here are the available writing styles — choosing one will make the output more accurate:

[Your styles]
1. My Bold Voice — bold, provocative

[Recommended styles]
2. darioamodei — Thoughtful long-form essays
3. Casual & Witty — humor, relatable
...(ALL styles listed, none omitted)

0. No preference — use default style

ユーザーが「指定なし」(0)を選択した場合、またはリストが空の場合は、--ext を指定せずにステップ 5 に進んでください。

4.5d. --ext の値を作成します:

選択されたスタイルのテキストブロック全体(スクリプトが出力した内容と完全に同じもの)を取得し、brand_style_requirement の値として使用してください。ブロックに複数の行が含まれる場合は、改行を \n に、フィールド値内の二重引用符を \" にして、1 つの JSON 文字列にシリアライズしてください。

スタイルブロックの出力例:

Style name: darioamodei
Style labels: Thoughtful long-form essays
Style DNA: # Dario Amodei (@DarioAmodei) Tweet Writing Style DNA\n\n## Style Overview\nDario writes like a serious intellectual...

--ext としてシリアライズした例:

--ext '{"brand_style_requirement":"Style name: darioamodei\nStyle labels: Thoughtful long-form essays\nStyle DNA: # Dario Amodei (@DarioAmodei) Tweet Writing Style DNA\n\n## Style Overview\nDario writes like a serious intellectual..."}'

重要: brand_style_requirement の値は完全かつ一字一句そのまま渡してください。Style DNA を省略してはいけません。スタイルの内容が一部欠けると、出力品質が低下します。

ステップ 5:スクリプトを実行する

コマンドを組み立てて実行します。必ず --json を使用してください。Claude Code の Bash ツールでは、標準出力はユーザーにストリーミングされず、キャプチャされます。JSON モードでは、完全な回答が構造化されたレスポンスとして返されます。

重要: SSE ストリームには長い時間がかかる場合があります(特に画像生成や調査レポートなど)。スクリプトを実行する際は、途中で終了しないよう、Bash ツールのタイムアウトを 600000ms(10 分)以上に設定する必要があります。

--accept-language の選択: デフォルトは en です。ユーザーの言語に合わせてください。ユーザーが中国語で書いている場合は zh、日本語なら ja、韓国語なら ko などを使用します。

--query の作成: ユーザーの入力をそのまま渡すだけにしてはいけません。SuperAgent がより完全かつ効果的に処理できるよう、クエリを補足して整えてください。

  • コンテキストを追加する: 会話に以前の文脈(例:ユーザーが以前に話したトピック)があれば、関連する詳細を取り入れて、SuperAgent が全体像を理解できるようにします。
  • 曖昧なリクエストを明確にする: ユーザーが「続けて」「先に進んで」のような短い指示をした場合は、何を続けるのかが伝わるように具体化します(例:「上記の量子コンピューティングに関する分析を続け、実用例について詳しく説明してください」)。
  • 不足している詳細を補う: ユーザーのリクエストが、以前に言及した情報(例:ブランド名、製品の種類、好みのスタイル)を前提としている場合は、その情報をクエリに含めます。
  • ユーザーの意図を維持する: ユーザーの根本的な意図を変えてはいけません。コンテキストと明確さのみを加え、意見を差し込んだり、話題を別方向に誘導したりしないでください。
  • 簡潔にする: クエリの上限は 2000 文字です。補足しつつ、要点に絞り、不要な冗長さは避けてください。

例:

  • ユーザーが「続けて」と言った場合 → --query "Please continue the analysis above on quantum computing, expanding on real-world applications"
  • ユーザーが「もう 1 つ」と言った場合 → --query "Please generate another product image in a similar style, white background"
  • ユーザーが「修正して」と言った場合 → --query "Please revise the tweet generated above, make the tone more casual and add some emojis"

新しい会話(最初の質問、スキルなし):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "USER_QUERY_HERE" \
  --live-doc-id "LIVE_DOC_ID" \
  --accept-language en \
  --json

スキル ID がある新しい会話、スタイル未選択:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "Write a tweet about the latest AI trends" \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --accept-language en \
  --json

スキル ID とブランドスタイルがある新しい会話(ステップ 4.5 より):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "Write a tweet about the latest AI trends" \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --ext '{"brand_style_requirement":"Style name: darioamodei\nStyle labels: Thoughtful long-form essays\nStyle DNA: # Dario Amodei (@DarioAmodei) Tweet Writing Style DNA\n\n## Style Overview\nDario writes like a serious intellectual...(full content)"}' \
  --accept-language en \
  --json

フォローアップの質問(2 回目以降のデフォルト):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "USER_FOLLOW_UP_QUERY" \
  --thread-id "THREAD_SHORT_ID_FROM_PREVIOUS" \
  --live-doc-id "LIVE_DOC_ID" \
  --json
ステップ 6:状態を抽出して回答を出力する

スクリプトの実行後、JSON 出力を解析します。

{
  "status": "ok",
  "data": {
    "answer": "...",
    "thread_short_id": "CmYpuGwBgCnrUdDx5ZtmxA",
    "live_doc_short_id": "QPetunwpGnkKuZHStP7gwt",
    "live_doc_url": "https://felo.ai/livedoc/QPetunwpGnkKuZHStP7gwt",
    "image_urls": [
      {
        "url": "https://...",
        "title": "Image title",
        "file_id": "b9e5be11-7686-4aa8-ae6c-9876511a7b5c"
      }
    ]
  }
}
  1. data.answer をそのまま出力する: 回答テキストとして data.answer を出力します。ユーザーに完全な内容が表示されるよう、変更せずにそのまま表示してください。

  2. data.thread_short_id と data.live_doc_short_id を抽出して保存する: 次回の呼び出しで必ずこれらを使用してください。

  3. 必要に応じて data.live_doc_url を表示する: ユーザーがブラウザーで LiveDoc キャンバスを表示できるようにします。

  4. 画像の結果(data.image_urls): この配列が空でない場合は、data.answer の直後に画像リンクを追加します。画像ごとに 1 行で、次の形式にします。

    [title](url)
    

    出力例:

    [Giant panda eating bamboo](https://...)
    [Giant panda dancing](https://...)
    [Blue whale leaping out of the water](https://...)
    

    各画像には、url(有効期限付きの署名付き S3 URL)、title、file_id(安定したファイル識別子)があります。同じ画像が tools_result_stream と tools_result のイベントの両方に異なる署名付き URL で含まれる場合がありますが、重複は file_id によって自動的に除外されます。フォローアップのクエリで以前に生成した画像を参照する場合は、file_id を --query に含めて、SuperAgent がファイルを見つけられるようにしてください(例:"Please generate a variation of file_id=b9e5be11-...")。

ユーザーから求められない限り、thread_short_id または live_doc_short_id を表示しないでください。

ワークフロー全体の例

例 A:複数ターンの会話(最も一般的)
User: "What is quantum computing?"

ステップ 2b: LiveDoc のリストを取得 → live_doc_id = "QPetunwpGnkKuZHStP7gwt" を取得 ステップ 3: 最初の質問 → 新しい会話 ステップ 4: 特別なスキルなし → --skill-id は指定しません ステップ 5:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "What is quantum computing?" \
  --live-doc-id "QPetunwpGnkKuZHStP7gwt" \
  --accept-language en \
  --json

ステップ 6: JSON 出力を解析します。data.answer をそのまま回答として出力します。data から thread_short_id = "CmYpuGwBgCnrUdDx5ZtmxA" と live_doc_id = "QPetunwpGnkKuZHStP7gwt" を保存します。

User: "What are its practical applications?"

ステップ 2a: すでに live_doc_id がある → スキップ ステップ 3: 続きの会話(デフォルト)→ 保存済みの thread_short_id を使用 ステップ 5:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "What are its practical applications?" \
  --thread-id "CmYpuGwBgCnrUdDx5ZtmxA" \
  --live-doc-id "QPetunwpGnkKuZHStP7gwt" \
  --json

ステップ 6: JSON 出力を解析します。data.answer をそのまま出力します。data から更新された thread_short_id を保存し(同じ場合もあります)、live_doc_id はそのまま保持します。

User: "Tell me more about quantum error correction"

ステップ 3: まだ続きの会話(同じトピック)→ 保存済みの thread_short_id を使用 ステップ 5: 上記と同じパターンで新しいクエリを指定

例 B:スタイルを選択してツイートを作成
User: "Help me write a tweet about AI trends"

ステップ 2a: すでに live_doc_id がある → 再利用 ステップ 3: 新しい会話 ステップ 4: ユーザーの意図が「ツイートを書く」に該当 → --skill-id twitter-writer ステップ 4.5: TWITTER のスタイルを取得(ユーザーの言語に合わせた --accept-language を指定):

node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en

出力:

Style name: My Bold Voice
Style labels: bold, provocative
Style DNA: # My Bold Voice Style DNA
...(full content)

Style name: darioamodei
Style labels: Thoughtful long-form essays
Style DNA: # Dario Amodei (@DarioAmodei) Tweet Writing Style DNA
...(full content)

ユーザーに提示:「どの文体で書きますか? 1. My Bold Voice(あなたの文体) 2. darioamodei(おすすめ) 3. 特に希望なし」

ユーザーの選択:「1. My Bold Voice」

ステップ 5:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "Help me write a tweet about AI trends" \
  --live-doc-id "QPetunwpGnkKuZHStP7gwt" \
  --skill-id twitter-writer \
  --ext '{"brand_style_requirement":"Style name: My Bold Voice\nStyle labels: bold, provocative\nStyle DNA: # My Bold Voice Style DNA\n...(full content)"}' \
  --accept-language en \
  --json

ステップ 6: JSON 出力を解析します。data.answer をそのまま出力します。data から新しい thread_short_id を保存し、同じ live_doc_id を保持します。

User: "Make it more casual and add some emojis"

ステップ 3: 続きの会話 → 保存済みの thread_short_id を使用(再度 --ext を指定しないでください) ステップ 5:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "Make it more casual and add some emojis" \
  --thread-id "NEW_THREAD_FROM_TWEET" \
  --live-doc-id "QPetunwpGnkKuZHStP7gwt" \
  --json
例 C:スタイルを選択してロゴをデザイン
User: "Design a logo for my coffee shop called Bean & Brew"

ステップ 4: 「ロゴをデザインする」を検出 → --skill-id logo-and-branding ステップ 4.5: IMAGE のスタイルを取得:

node felo-superAgent/scripts/run_style_library.mjs --category IMAGE --accept-language en

出力例:

Style name: Minimalist Modern
Style labels: clean, monochrome
Style DNA: ...(full content)
Cover file ID: file_333

スタイルをユーザーに提示し、選択を待ちます。ユーザーが「Minimalist Modern」を選んだとします。

ステップ 5:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "Design a logo for my coffee shop called Bean & Brew" \
  --live-doc-id "QPetunwpGnkKuZHStP7gwt" \
  --skill-id logo-and-branding \
  --ext '{"brand_style_requirement":"Style name: Minimalist Modern\nStyle labels: clean, monochrome\nStyle DNA: ...(full content)\nCover file ID: file_333"}' \
  --accept-language en \
  --json
例 D:スタイルを選択して EC 商品画像を作成
User: "Generate a product image for a wireless headphone on white background"

ステップ 4: 「商品画像」を検出 → --skill-id ecommerce-product-image ステップ 4.5: IMAGE のスタイルを取得:

node felo-superAgent/scripts/run_style_library.mjs --category IMAGE --accept-language en

スタイルをユーザーに提示します。ユーザーが「特に希望なし」を選んだとします。

ステップ 5:(ユーザーが特に希望なしを選択したため、--ext は指定しません)

node felo-superAgent/scripts/run_superagent.mjs \
  --query "Generate a product image for a wireless headphone on white background" \
  --live-doc-id "QPetunwpGnkKuZHStP7gwt" \
  --skill-id ecommerce-product-image \
  --accept-language en \
  --json
例 E:ユーザーが新しいキャンバスをリクエスト
User: "Open a new canvas for a different project"

ステップ 2d: 新しい LiveDoc を作成:

node felo-livedoc/scripts/run_livedoc.mjs create --name "New Project" --json

新しい live_doc_id を抽出します。古いものは破棄します。それ以降のすべての呼び出しでは新しい ID を使用します。

例 F:ユーザーがスタイルを直接指定
User: "Write a tweet about AI trends using the 'darioamodei' style"

ステップ 4: --skill-id twitter-writer ステップ 4.5a: ユーザーがすでにスタイルを指定している → 完全なブロックを取得するため、リストを取得します:

node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en

Style name: darioamodei のエントリーを見つけ、完全なブロックをそのまま抽出します。ユーザーに再度尋ねる必要はありません。

ステップ 5:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "Write a tweet about AI trends" \
  --live-doc-id "QPetunwpGnkKuZHStP7gwt" \
  --skill-id twitter-writer \
  --ext '{"brand_style_requirement":"Style name: darioamodei\nStyle labels: Thoughtful long-form essays\nStyle DNA: # Dario Amodei (@DarioAmodei) Tweet Writing Style DNA\n\n## Style Overview\nDario writes like a serious intellectual...(full content, do NOT truncate)"}' \
  --accept-language en \
  --json

利用可能なスクリプトオプション

主要パラメーター:

  • --query <text>(必須)— ユーザーの質問。1~2000 文字
  • --live-doc-id <id>(新しい会話では必須)— 関連付ける LiveDoc ID(live_doc_id)
  • --thread-id <id> — 以前の応答から取得したスレッド ID。続きの会話に使用

スキルパラメーター(新しい会話のみ。続きの会話では無視されます):

  • --skill-id <id> — スキル ID(利用可能なスキル ID については制約 #9 を参照)
  • --selected-resource-ids <ids> — 含めるリソース ID をカンマ区切りで指定
  • --ext <json> — JSON オブジェクトとして指定する追加パラメーター。スキルベースの会話では、ブランドスタイルを次のように指定します: --ext '{"brand_style_requirement":"Style name: <name>\nStyle labels: <labels>\nStyle DNA: <full styleDna text>\nCover file ID: <id>"}' 存在するフィールドはカテゴリの種類によって異なります。値が null の場合、Cover file ID は省略されます。Style DNA は切り詰めないでください。

出力制御:

  • --json / -j — 完全なメタデータを含む JSON 形式で出力します(Claude Code では必ず使用してください。標準出力はユーザーにストリーミングされず、Bash ツールによって取得されます)
  • --verbose / -v — ストリーム接続の詳細を標準エラー出力に記録します(デバッグ専用。通常の使用では不要です)
  • --accept-language <lang> — 言語の優先設定(例:en、ja、ko)

API ワークフロー(リファレンス)

スクリプトは次のワークフローを自動的に処理します。

  1. 会話の作成:

    • 新規:POST /v2/conversations(body に live_doc_short_id が必要です)
    • 続き:POST /v2/conversations/{threadId}/follow_up
    • 返される値:stream_key、thread_short_id、live_doc_short_id
  2. SSE ストリームの取得:

    • GET /v2/conversations/stream/{stream_key}
    • 再開用のオフセットパラメーターをサポート:?offset={lastOffset}
    • 接続が切断された場合、自動的に再接続します(2 秒の遅延)
  3. イベントの解析:

    • message — 直接のテキストコンテンツ
    • stream — 種類の情報を含むラップされたコンテンツ
    • heartbeat — 接続維持のシグナル
    • done / completed / complete — ストリームの完了
    • error — エラーイベント(終端ではなく、読み取りを続行)
  4. ツールの結果の抽出:

    • 画像生成(generate_images)
    • リサーチレポート(generate_discovery)
    • ドキュメント生成(generate_document)
    • PPT 生成(generate_ppt)
    • HTML 生成(generate_html)
    • Twitter/X 検索(search_x)

ベース URL:https://openapi.felo.ai(必要に応じて FELO_API_BASE で上書きできます)。

ツールのサポート

SuperAgent は会話中にツールを呼び出す場合があります。スクリプトは次の情報を自動的に抽出して表示します。

画像生成:

  • ツール:generate_images
  • 出力:画像の URL とタイトル

リサーチとディスカバリー:

  • ツール:generate_discovery
  • 出力:リサーチレポートのタイトルとステータス

ドキュメント生成:

  • ツール:generate_document
  • 出力:ドキュメントのタイトルとステータス

プレゼンテーション生成:

  • ツール:generate_ppt
  • 出力:PPT のタイトルとステータス

HTML 生成:

  • ツール:generate_html
  • 出力:HTML ページのタイトルとステータス

Twitter/X 検索:

  • ツール:search_x
  • 出力:ツイートの内容、投稿者情報、各種指標(いいね、リツイート、閲覧数)

エラー処理

一般的なエラーコード
コードHTTP説明
INVALID_API_KEY401API Key が無効か、取り消されています
SUPER_AGENT_CONVERSATION_CREATE_FAILED502会話の作成に失敗しました(上流エラー)
SUPER_AGENT_CONVERSATION_QUERY_FAILED502会話の詳細の取得に失敗しました
SSE ストリームのエラー

ストリームでは、次の内容が送信される場合があります。

  • event: error と data: {"message": "..."} — 失敗として扱い、メッセージを表示します
  • 接続タイムアウト — スクリプトは 2 秒の遅延を挟んで自動的に再接続します
  • アイドルタイムアウト(2 時間)— データを受信しない場合、ストリームは中断されます
API キーが未設定の場合

FELO_API_KEY が設定されていない場合は、次のメッセージを表示します。

ERROR: FELO_API_KEY not set

To use this skill, you need to set up your Felo API Key:

1. Get your API key from https://felo.ai (Settings -> API Keys)
2. Set the environment variable:

   Linux/macOS:
   export FELO_API_KEY="your-api-key-here"

   Windows (PowerShell):
   $env:FELO_API_KEY="your-api-key-here"

3. Restart Claude Code or reload the environment
タイムアウト処理
  • SSE ストリームには独自のアイドルタイムアウトがあります。データを受信しない状態が 2 時間続くとタイムアウトします。データが流れ続ける限り、ストリームは開いたままです。
  • Bash ツールのタイムアウト: SSE ストリームは長時間実行される場合があるため、スクリプトの実行時には必ず 600000ms(10 分)以上に設定してください。

重要な注意事項

  • このスキルは Bash ツールを使用してすぐに実行してください。実行する内容を説明するだけではいけません。
  • 必ず --json を使用してください。Claude Code の Bash ツールでは、標準出力はストリーミングされずにキャプチャされます。JSON モードを使うと、Claude がテキストとして出力する構造化レスポンスで回答が返されます。
  • 必ず data.answer をそのまま出力してください。回答テキストとして一字一句変えずに出力し、ユーザーに全文が表示されるようにしてください。
  • 作成後、スクリプトは直ちにストリームへ接続します。stream_key の有効期間には限りがあります。
  • SSE の処理には同梱の Node スクリプトを使用してください。SSE の解析に jq やその他のツールを使えると想定しないでください。
  • 他の Felo スキルと同じ API キーを使用します(FELO_API_KEY)。
  • ストリームが切断された場合、スクリプトは自動的に再接続します。
  • 同じリソースが複数回表示されないよう、ツールの結果は重複排除されます。
  • live_doc_id が他のスキル、ユーザー入力、過去の呼び出しなどですでにわかっている場合は、そのまま使用してください。LiveDoc リストを再取得してはいけません。
  • 多言語対応:簡体字中国語、繁体字中国語、日本語、英語に完全対応しています。
  • 可能な場合、API はクエリと同じ言語で結果を返します。

判断フローチャート

User sends a message
        |
        v
Have live_doc_id from ANY source?
   NO  --> Step 2b: fetch list --> got is_shared=false item?
              YES --> use data.items.find(i => !i.is_shared)?.short_id as live_doc_id
              NO  --> Step 2c: create new LiveDoc
   YES --> continue (reuse it, do NOT fetch list)
        |
        v
Have thread_short_id from previous call?
   NO  --> This is a NEW conversation
              --> Step 4: determine skill-id by analyzing user intent
              --> skill-id found (twitter-writer / logo-and-branding / ecommerce-product-image)?
                    YES --> Step 4.5: fetch style library for matching category
                              --> styles available?
                                    YES --> present to user, wait for selection
                                              --> user picked a style?
                                                    YES --> build --ext '{"brand_style_requirement":"..."}'
                                                    NO  --> no --ext
                                    NO  --> no --ext
                    NO  --> no --ext, no --skill-id
              --> Step 5: run WITHOUT --thread-id (with --skill-id and --ext if determined above)
   YES --> Does user's intent require a skill-id not matching current thread?
              YES --> NEW conversation (same live-doc-id, with --skill-id, repeat Step 4.5)
              NO  --> Is user explicitly starting a new topic?
                        YES --> NEW conversation (same live-doc-id, no --thread-id)
                        NO  --> FOLLOW-UP (pass --thread-id, NO --ext)
        |
        v
Run script (WITH --json, Bash timeout >= 600000ms) --> parse JSON, output data.answer verbatim
        |
        v
Extract thread_short_id + live_doc_id from stderr [state] line
        |
        v
Do NOT repeat or summarize the answer (already shown)

スタイルライブラリスクリプト(run_style_library.mjs)

指定したカテゴリのスタイルライブラリ一覧を取得します。ユーザースタイルの後に、おすすめのスタイルが表示されます。

node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en

オプション:

  • --category <category>(必須)— 次のいずれかを指定します:TWITTER、INSTAGRAM、LEMON8、NOTECOM、WEBSITE、IMAGE
  • --accept-language <lang> — ラベルやタグの言語を指定します(例:en、zh-Hans、ja)。デフォルト:en。ユーザーの言語に合わせるため、必ず指定してください。
  • --json / -j — 生の JSON を出力します。
  • --timeout <seconds> — リクエストのタイムアウト(デフォルト:60)

デフォルトのテキスト出力形式(スタイルごとに 1 ブロック、ブロック間は空行):

TWITTER カテゴリの場合:

Style name: darioamodei
Style labels: Thoughtful long-form essays
Style DNA: # Dario Amodei (@DarioAmodei) Tweet Writing Style DNA
...(full styleDna content)

エントリーごとに含まれるフィールド(値が null または空のフィールドは省略されます):

  • Style name — 常に含まれます(name フィールド)
  • Style labels — content.labels(TWITTER)または content.tags(その他のカテゴリ)に基づき、指定した言語でカンマ区切りで表示されます。存在しない場合は省略されます。
  • Style DNA — content.styleDna(TWITTER タイプ)に基づきます。存在しない場合は省略されます。
  • Cover file ID — coverFileId に基づきます。null または空の場合は省略されます。

ユーザーが作成したスタイルは、おすすめのスタイルより先に表示されます。

参考資料

コメント