felo-superAgent について
felo-superAgent は、Felo SuperAgent との複数ターンの会話を行うスキルです。LiveDoc とスレッド ID で会話を継続し、依頼内容に応じて専用スキルを選択します。
主な機能
- 01LiveDoc 上で会話を継続
- 02追質問にスレッド ID を再利用
- 03意図に応じたスキル選択
- 04ブランドスタイルの選択
- 05JSON モードで回答を取得
活用シーン
- 01同じキャンバスで継続的に質問
- 02ロゴやEC商品画像の生成
- 03文書や PPT を含む回答の取得
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ felo-inc/ felo-skills --skill felo-superagentインストール後、Claude Code で/felo-superagentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
clawhub.jsonLICENSEREADME.mdscripts/run_style_library.mjsrun_superagent.mjs詳細
Felo SuperAgent スキル
制約(最初に必ずお読みください)
これらのルールは必須です。いずれかに違反すると、動作が正しくなくなります。
-
必ず
--jsonフラグを使用してください。 スクリプトは必ず JSON モード(--json)で実行してください。Claude Code の Bash ツールでは、標準出力は常にキャプチャされ、ユーザーに直接ストリーミングされることはありません。JSON モードでは構造化された応答として回答全体が返され、それを Claude がテキストとして出力できます。状態 ID は、JSON 応答のフィールドthread_short_idとlive_doc_short_idから抽出します。 -
回答は必ずテキストとしてそのまま出力してください。 スクリプトの実行後、JSON 出力から
data.answerを読み取り、回答テキストとして一字一句そのまま出力してください。要約、言い換え、補足説明の追加はしないでください。ユーザーに内容全体が表示されるよう、完全にそのまま出力してください。その後、data.image_urlsが空でない場合は、直後に画像リンクを追加してください。画像ごとに 1 行で、次の形式にします:title。 -
会話を作成する場合、
--live-doc-idは必須です。--live-doc-idを指定せずにrun_superagent.mjsを実行してはいけません。まだ ID がない場合は、先に取得してください(下記のステップ 2 を参照)。 -
あらゆる取得元の
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に対応します。) -
1 セッションにつき LiveDoc は 1 つです。 セッション内のすべての会話で、同じ
--live-doc-idを使用してください。ユーザーが明示的に「新しいキャンバスを開く」「新しい LiveDoc を開始する」「新しいワークスペースを作成する」と依頼しない限り、新しい LiveDoc を作成してはいけません。 -
デフォルトの動作は、新しい会話ではなくフォローアップです。 最初の質問の後、ユーザーからのメッセージはすべてフォローアップです。前回の応答から
--thread-idを渡してください。--thread-idを省略して(同じ LiveDoc 上で新しいスレッドを開始して)よいのは、次の場合に限ります。- ユーザーが明示的に「新しいトピック」「話題を変える」「最初からやり直す」と言った場合
- ユーザーの意図に特定の
--skill-idが必要(例:ツイートの作成、ロゴデザイン、商品画像の作成)で、現在のスレッドがそのスキルで作成されていない場合。--skill-idは新しい会話でのみ有効なためです。
-
状態は必ず保存してください。 呼び出しのたびに、stderr の
[state]行からthread_short_idとlive_doc_id(live_doc_short_idとして出力されます)を抽出してください。次の呼び出しでは、これらの ID を使用してください。これらの ID を失うと、会話の継続性が損なわれます。 -
スキル ID の選択(新しい会話のみ)。 新しい会話を作成するとき(
--thread-idがない場合)は、ユーザーの意図を分析し、対応しているスキル ID に該当するか判断してください。利用可能なスキル ID:
twitter-writer— ツイート/X 投稿の作成、下書き、投稿用logo-and-branding— ロゴ、ブランドデザイン、ビジュアルアイデンティティの作成用ecommerce-product-image— E コマース向けの商品画像の生成用
選択ロジック:
- ユーザーが特定のスキル ID を明示的に指定した場合は、指定された値を使用します
- ユーザーの意図が上記のいずれかに明確に該当する場合は、その値を
--skill-idに指定します - いずれにも該当しない場合は、
--skill-idを指定しません(一般的な会話モード) --skill-idが有効なのは、新しい会話を作成する場合のみです。フォローアップモード(--thread-idがある場合)では無視されます。
-
スキルを使った新しい会話でのブランドスタイル選択。 スキル 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:
- スキルに合ったカテゴリーを使用してください。
twitter-writerにはTWITTER、logo-and-brandingとecommerce-product-imageにはIMAGEを使用します。 - ラベルをユーザーの言語で取得できるよう、必ず
run_style_library.mjsに--accept-languageを渡してください。 - ユーザーがすでにスタイルを指定している場合(名前の指定、またはスタイルブロックの貼り付け)、取得を省略し、ユーザーが選んだスタイルをそのまま使用してください。
- スタイルライブラリからエントリーが返されない場合は、
--extを付けずに進めてください。 --extは新しい会話でのみ有効です。フォローアップモード(--thread-id)では決して渡さないでください。
- スタイル文字列は、各エントリーについて
-
**安易に新しい 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 キーを取得する
- felo.ai にアクセスして、ログイン(または登録)します
- 右上のアバターをクリックし、[Settings]を選択します
- [API Keys]タブに移動します
- [Create New Key]をクリックして、新しい API Key を生成します
- 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 コマース向けの商品画像の生成用
決定方法:
- ユーザーがスキル ID を明示的に指定した場合は、その値を使用します
- それ以外の場合は、ユーザーのリクエストを分析し、上記のいずれかに該当するか判断します
- どれにも該当しない場合は、
--skill-idを渡さないでください
フォローアップ(--thread-id が設定されている場合)であれば、このステップは完全にスキップします。フォローアップモードでは --skill-id は無視されます。
ステップ 4.5:ブランドスタイルの取得と選択(新しいスキルの会話のみ)
このステップを実行するタイミング: 新しい会話で、かつステップ 4 でスキル ID(twitter-writer、logo-and-branding、または ecommerce-product-image)が決定された場合にのみ実行します。フォローアップの会話、または一般的な会話(スキルなし)では、このステップを完全にスキップしてください。
カテゴリの対応関係:
| スキル ID | スタイルカテゴリ |
|---|---|
twitter-writer | TWITTER |
logo-and-branding | IMAGE |
ecommerce-product-image | IMAGE |
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"
}
]
}
}
-
data.answerをそのまま出力する: 回答テキストとしてdata.answerを出力します。ユーザーに完全な内容が表示されるよう、変更せずにそのまま表示してください。 -
data.thread_short_idとdata.live_doc_short_idを抽出して保存する: 次回の呼び出しで必ずこれらを使用してください。 -
必要に応じて
data.live_doc_urlを表示する: ユーザーがブラウザーで LiveDoc キャンバスを表示できるようにします。 -
画像の結果(
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 ワークフロー(リファレンス)
スクリプトは次のワークフローを自動的に処理します。
-
会話の作成:
- 新規:
POST /v2/conversations(body にlive_doc_short_idが必要です) - 続き:
POST /v2/conversations/{threadId}/follow_up - 返される値:
stream_key、thread_short_id、live_doc_short_id
- 新規:
-
SSE ストリームの取得:
GET /v2/conversations/stream/{stream_key}- 再開用のオフセットパラメーターをサポート:
?offset={lastOffset} - 接続が切断された場合、自動的に再接続します(2 秒の遅延)
-
イベントの解析:
message— 直接のテキストコンテンツstream— 種類の情報を含むラップされたコンテンツheartbeat— 接続維持のシグナルdone/completed/complete— ストリームの完了error— エラーイベント(終端ではなく、読み取りを続行)
-
ツールの結果の抽出:
- 画像生成(
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_KEY | 401 | API Key が無効か、取り消されています |
| SUPER_AGENT_CONVERSATION_CREATE_FAILED | 502 | 会話の作成に失敗しました(上流エラー) |
| SUPER_AGENT_CONVERSATION_QUERY_FAILED | 502 | 会話の詳細の取得に失敗しました |
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 または空の場合は省略されます。
ユーザーが作成したスタイルは、おすすめのスタイルより先に表示されます。
参考資料
- SuperAgent API(Felo Open Platform)
- Felo Open Platform
- API キーを取得(Settings -> API Keys)