記事一覧に戻る

Alina Lozovskayaのプロフィール画像

Reachy Miniが窓の外を見ている様子
Reachy Miniはもう天気を伝えるために窓の外を見る必要がありません

Reachy Mini会話アプリが、MCP経由で呼び出される公開Hugging Face Spacesでホストされるツールを使えるようになりました。アプリを編集する代わりにHubのSpaceを追加するだけで、天気の確認やウェブ検索など、ロボットに新しい機能を追加できます。ツールはSpace自体で実行されるため、コードがマシンにダウンロードされることはありません。また、自分で作成したツールを他の人に公開することも可能です。

ツールの追加は1つのコマンドで行います:

reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-weather-tool

その後、通常通りアプリを起動します:

reachy-mini-conversation-app

これで以下のように質問するだけで済みます:

今日のパリの天気は?

以下では、ツールとは何か、プロファイルがロボットの使用可能ツールをどのように制御するか、リモートパスの現在の制限について説明します。

組み込みツール

ロボットと会話するとき、返ってくるのは音声だけではありません。会話に応じてシステムが反応します:ロボットは必要に応じて動き、非言語的な応答をします。ここで焦点を当てたいのは、それを可能にするツールです。ツールとは、会話中にモデルが実行できるものです:感情を再生したり、頭を動かしたり、カメラを通して見たり。各ツールには名前と簡単な説明があります。モデルはそれらを読み、いつ役立つかを判断し、呼び出し、返ってきたものを使用します。

現在、すべてのツールはローカルで、アプリ内に同梱されており、そのほとんどはロボットの身体に関するものです:

ツール 機能
move_head 頭の姿勢変更をキューに追加
dance / stop_dance ダンスライブラリからダンスを再生またはクリア
play_emotion / stop_emotion 録画された感情クリップを再生またはクリア
head_tracking 頭のトラッキングオフセットを切り替え
camera フレームをキャプチャして解析
idle_do_nothing アイドルターン時に明示的にアイドル状態を維持

プロファイルによるツールの制御方法

コード内のツールは、プロファイルで有効化されるまで使用できません。プロファイルは、ここで重要な2つのファイルを含むフォルダです:instructions.txt(プロンプト)とtools.txt(有効化されたツール)。

defaultプロファイルは全セットを有効にします:

# profiles/default/tools.txt
dance
stop_dance
play_emotion
stop_emotion
camera
idle_do_nothing
head_tracking
move_head

名前がtools.txtにない場合、モデルはそのツールを呼び出すことができません。

独自のツールを作成することもできます:プロファイル(またはexternal_tools/)にPythonファイルを追加し、名前と説明を付け、その名前をtools.txtにリストします。

現在は組み込みツールとカスタムローカルツールがあり、tools.txtがどれをアクティブにするかを決定します。これはロボットの身体には適しており、信頼できるコアを小さく保ちます。

ローカルツールの制限

ここでの制約は、すべてのツールがローカルPythonでなければならないことです。move_headplay_emotionの場合、これは正しいことです:それらはハードウェアと通信し、アプリに属します。しかし、ウェブ検索、天気、検索などの多くの有用なものは身体とは関係ありません。これらについてすべてをローカルに保つことは主に摩擦になります:

  • ツールの共有はPythonファイルを誰かに渡すことを意味する
  • 更新はそれらのファイルを再度送信することを意味する
  • 変更はアプリの編集を意味する、たとえ機能がアプリから独立していても

Spacesからのツール呼び出し

リモートツールは、すでに持っている組み込みツールとカスタムローカルツールに加えて、公開・共有・更新が容易な機能を追加する3つ目の種類です:

  • 組み込みロボットツールはローカルで信頼できる状態を維持
  • 共有可能なリモートツールは公開Hugging Face Spacesで実行可能
  • カスタムの一時ツールはexternal_tools/から引き続き使用可能 これは検索、天気、検索などのステートレスな機能に適しています:アプリ自体に触れずに反復したい任意の機能です。また、誰でも互換性のあるSpaceを公開できるため、ツールの共有や相互の作業の基盤構築が容易です。

最初に2つのカナリーツール(新しいフローをテストするための小さなテストツール)を開始しました:

これらは機能全体をテストするのに十分です:Hubからのインストール、リモートツールの発見、プロファイルごとの有効化、およびリアルタイムバックエンドによる組み込みツールとまったく同じ呼び出し。

両方を同時に使用するには、各Spaceを追加し、同じプロファイルにツールを積み重ねます:

reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-search-tool
reachy-mini-conversation-app tool-spaces add pollen-robotics/reachy-mini-weather-tool

これでロボットは同じ会話内でウェブ検索と天気確認ができるようになり、まさに以下のcanary_web_search_weatherプロファイルが実現するものです。

インストール、一覧表示、削除

# インストール + アクティブプロファイルで有効化
reachy-mini-conversation-app tool-spaces add <owner/space-name>
 
# 特定のプロファイルで有効化
reachy-mini-conversation-app tool-spaces add <owner/space-name> --profile <NAME>
 
# 有効化せずにインストール
reachy-mini-conversation-app tool-spaces add <owner/space-name> --install-only
 
# インストール済みSpaceの一覧表示
reachy-mini-conversation-app tool-spaces list
 
# インストール済みSpaceの削除
reachy-mini-conversation-app tool-spaces remove <owner/space-name>

addはHub上のSpaceを検証し、MCPエンドポイントをプローブし、ツールを発見し、デフォルトでアクティブプロファイルのtools.txtにツールIDを追加します。アクティブプロファイルはREACHY_MINI_CUSTOM_PROFILEを設定していない限りdefaultです。--install-onlyを使用してこのステップをスキップします。

tools.txtはゲートキーパーです:リモートツールは、組み込みツールと並んでプロファイルのtools.txtにそのIDが表示されている場合にのみアクティブになります。

マニフェストの保存場所

インストール済みソースは以下に永続化されます:

  • マネージドアプリモードではinstalled_tool_spaces.json
  • ターミナルモードではexternal_content/installed_tool_spaces.json

ツール命名

インストールされた各Spaceには、スラッグから派生したローカルエイリアスが割り当てられ、ハイフン、ドット、スラッシュはアンダースコアに置き換えられます:

pollen-robotics/reachy-mini-search-tool → pollen_robotics_reachy_mini_search_tool

リモートツールはダブルアンダースコアで名前空間化されます:

pollen_robotics_reachy_mini_search_tool__search_web
pollen_robotics_reachy_mini_weather_tool__get_day_brief

これにより、リモートツール名が組み込みツールと衝突することを防ぎ、複数のSpaceが同じプロファイルに共存できるようになります。

実装では、冗長なSpace名プレフィックスを可能な限り削除するため、冗長なリモートツール名はよりクリーンなローカルIDになります。削除によって同じSpaceの2つのツール間で衝突が発生する可能性がある場合、コードは完全な名前空間化された名前にフォールバックします。

レジストリレベルでも重複安全チェックがあります:Tool.nameの値はマージされたツールセット全体で一意である必要があります。2つのソースが同じ名前を主張する場合、アプリは即座に失敗します。

プロファイル例

この作業では、MCP実験を完全な身体ツールセットから分離するために、2つの焦点を絞ったカナリープロファイルを作成しました。

1つ目は、いくつかの表現ツール(感情、頭の動き)を保持し、その上にウェブ検索を追加します:

# profiles/canary_web_search/tools.txt
play_emotion
stop_emotion
idle_do_nothing
move_head
pollen_robotics_reachy_mini_search_tool__search_web

2つ目は同じで、天気ツールが検索と並んで追加されています:

# profiles/canary_web_search_weather/tools.txt
play_emotion
stop_emotion
idle_do_nothing
move_head
pollen_robotics_reachy_mini_search_tool__search_web
pollen_robotics_reachy_mini_weather_tool__get_day_brief

小さな物理ツールセットにより、Reachy Miniはウェブからの現在の質問に答える間も表現豊かに反応できます。

プロンプトが重要な理由

リモートツールの基盤はツールをモデルに取り込みます。プロンプトはモデルがそれらをどのように使用するかを決定します。

それは特に検索と天気の組み合わせのカナリーで顕著でした。以下のような複合質問:

今日ボルドーでジャケットを持っていくべきですか?また、ダウンタウンで今夜何か大きなイベントはありますか?

は少なくとも3つの方法で処理できます:天気を先に呼び出し、その後検索、検索を先に呼び出し、その後天気、または同じターンで両方を呼び出す。プロンプトが曖昧な場合、モデルは呼び出しを直列化し、不必要な遅延を作成します。そのため、カナリープロンプトは付随的な設定ではなく、機能の一部となりました。

canary_web_search/instructions.txt

[default_prompt]

## CANARY WEB SEARCH RULES
現在のウェブ情報用のリモートツールが1つあります。
最新の事実、ニュース、ライブ可用性、または最近変更された可能性のあるその他のものをユーザーが尋ねたときに使用してください。

検索結果がすでに質問に答えている場合は、平易な言葉で直接答えてください。
ツールの話ではなく、答えから始めてください。
リモート検索に少し時間がかかる場合は、「確認してすぐ戻ります」のような非常に短い英語の確認を1つ行い、その後続けてください。
ユーザーが明示的に別の言語を求めない限り、英語で答えてください。
結果のスニペットが不完全または曖昧な場合は、不確実性を簡単に言及してください。
リンクは価値を追加する場合やユーザーが出典を求めた場合にのみ言及してください。

応答は短く、音声アシスタントが読み上げるような話し言葉スタイルにしてください。通常1〜2文で十分です。導入部、リスト、見出し、フィラーを省略してください。ユーザーが必要とする事実または直接の答えだけを提供してください。

canary_web_search_weather/instructions.txt

[default_prompt]

## CANARY SEARCH AND WEATHER RULES
2つのリモートツールがあります:
- 場所のコンパクトな日次天気用の天気概要ツール
- より広範な現在のウェブ情報用のウェブ検索ツール

今日の状況、気温、降水確率、日の出、日の入り、ジャケットを持っていくべきかなどの簡単なアドバイスには天気ツールを使用してください。
ニュース、イベント、営業時間、旅行情報、重大な警報、またはより広範な現在のコンテキストにはウェブ検索を使用してください。

ユーザーの質問が天気部分と現在の情報部分を組み合わせている場合(例:「今日ボルドーでジャケットを持っていくべきか、そしてダウンタウンで今夜何か大きなイベントはありますか?」)、天気結果が検索を絞り込むために必要な場合を除き、同じターンで両方のツールを並行して呼び出してください。1つの結果を待ってから他のツールを開始しないでください。

次に結果を1つの短い回答に統合します。天気部分を最初にカバーし、その後イベントまたはニュース部分を、つながりのある平易な文でカバーしてください。セクションにラベルを付けたり、どのツールがどの部分を提供したかを言及したりしないでください。

イベント、ニュース、または何が起こっているかを尋ねられた場合、検索結果から実際の答えを提供してください:具体的なイベント名、会場、見出しを挙げてください。ウェブサイトを確認するよう指示したり、リストサイトにアクセスさせたり、自分で調べるよう誘導したりしないでください。検索で具体的な結果が得られない場合は、注目すべきイベントが見つからなかったことを率直に述べ、他の場所にリダイレクトしないでください。

リモート検索に少し時間がかかる場合は、「確認してすぐ戻ります」のような非常に短い英語の確認を1つ行い、その後続けてください。
ユーザーが明示的に別の言語を求めない限り、英語で答えてください。
ユーザーが尋ねない限り、ツールの使用について話さないでください。

応答は短く、音声アシスタントが読み上げるような話し言葉スタイルにしてください。通常1〜2文で十分です。導入部、リスト、見出し、フィラーを省略してください。ユーザーが必要とする事実または直接の答えだけを提供してください。

現在の動作状況と動作しない機能

機能 サポート状況
公開のMCP対応Gradio Spaces(標準/gradio_api/mcp/エンドポイント)へのスラッグによるインストール
複数のSpaceの同時使用
tools.txtによるプロファイルごとの有効化
名前空間化されたリモートツールID
バックエンド非依存の登録(OpenAI、Gemini、Hugging Face)
ローカルアプリへの任意のコードダウンロードなし
プライベートまたは認証が必要なSpace
Gradio以外のSpace
任意の生MCP URLまたはHugging Face以外のMCPサーバー
保証された並列ツールオーケストレーション

2点指摘しておきます。まず、Spaceは実際にMCPサーバーのように動作する必要があります。ツール発見に失敗した場合、インストールは失敗します。次に、プロンプトの指示は並列呼び出しを促すことはできますが、保証することはできません。決定的なオーケストレーションがユースケースで重要である場合、そのロジックはプロンプトからコードに移す必要があります。

ツールSpace公開のヒント

他の人にツールを使ってもらいたい場合は、標準のMCPエンドポイントを公開する公開Gradio Spaceとして公開し、ネットワーク経由でうまく動作するようにツールをステートレスに保ってください。Spaceのインストールはタグではなく、このランタイム動作に依存します。

タグはインストールに必須ではありませんが、互換性のあるSpaceを見つけるのに役立ちます:

  • reachy-mini-tool
  • mcp

結論

アプリは現在、1つのレジストリを共有する3種類のツールを持ちます:組み込み、ローカルカスタム、リモートMCPツールであり、プロファイルは依然として特定のアシスタントが到達できるツールを決定します。小さな信頼できるコアが中心に残り、その周りのオプション機能はアプリ自体に触れずに追加、テスト、スワップできます。

今最も興味があるのは、人々が何を構築するかです。ツールSpaceを公開する場合は、他の人が見つけられるようにreachy-mini-toolmcpでタグ付けしてください。Reachy Miniが最終的に何ができるようになるか、ぜひ見てみたいです!

謝辞:この投稿の校正とワークフローのテストを手伝ってくれたFabien Danieau、テストを手伝ってくれたAndres Marafioti、リモートツールワークフローのアイデアとフィードバックを提供してくれたRemi FabreとPollen Roboticsチームに感謝します。