ember について
ember は、変更をレビューすべきか、先に質問すべきかといったコーディングエージェントの判断に、較正済みの確率を返します。MCP ツールは Cloudflare の Clef-Flash 判断モデルをローカルまたは指定サーバーで実行し、最終判断はエージェントに委ねます。
主な機能
- 01型付き選択肢ごとの確率出力
- 02ローカルまたは指定サーバーでの推論
- 03コーディングエージェント環境との連携
- 04エージェント向けガイドと MCP リソース
活用シーン
- 01変更にレビューが必要か評価
- 02実行前に質問すべきか判断
- 03テスト失敗の確信度を評価
- 04プッシュ前に変更リスクを確認
MCP 対応
状態と型付き質問スキーマを受け取り、選択肢ごとの較正済み確率を返す `advise` ツールを提供します。また、`ember://guide` MCP リソースも提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx ember-adviseEMBER_SERVER_URLInference endpoint; defaults to the local model server at http://127.0.0.1:8765EMBER_AUTH_TOKENシークレットCredential for a remote inference endpointローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
コーディングエージェントに直感を。 Claude Code、Codex、 opencode、Kilo Code などの AI コーディングアシスタントは、常に判断を迫られています。今すぐ始めるべきか、それともまず質問するべきか。このテスト失敗は本物か。この変更を安全にプッシュできるか。ember は、そんな場面で素早くセカンドオピニオンを返す小さなアドオンです。「レビューが必要な可能性は 93%」のように数値で示すので、不必要に作業を中断したり、確認せずに危険な変更を加えたりすることがなくなります。自分で呼び出す必要はありません。アシスタントが呼び出します。無料のオープンソースで、モデルをどこで実行するかは自由に選べます。Apple Silicon Mac(メモリ 32 GB 以上、一度限りの約 18 GB のダウンロード)でも、自分でホストするサーバーでも、チームがすでに運用しているサーバーでも実行できます。ember は助言し、判断するのはエージェントです。
内部では、ember は Cloudflare の Clef-Flash 判断モデルを実行します。このモデルは公開 Hugging Face リポジトリから取得でき、1 つの MCP ツール advise として公開されます。このツールは、それぞれの選択肢について較正済みの確率を返します。
ウェブサイト: shapeandshare.github.io/ember
ember の実行方法
3 つの方法はいずれも同等にサポートされています。ember init で希望する方法を選べます。
| Mac 上で実行 | 自分でホストするサーバー上で実行 | 他の人が運用するサーバー上で実行 | |
|---|---|---|---|
| モデルの実行場所 | お使いの Apple Silicon Mac | 自分で運用する Mac または NVIDIA GPU マシン | 運用者が実行する場所 |
| リクエストの送信先 | どこにも送信されません。Mac 上にとどまります | 自分のサーバー | そのサーバー |
| 必要なもの | メモリ 32 GB、ディスク約 18 GB | サーバー:ローカル実行と同じ要件、または CUDA GPU。クライアント:サーバーのアドレスのみ | サーバーのアドレスと、要求される場合はトークン |
| セットアップ方法 | ember model pull を実行し、その後 ember init | リモート推論またはホスト型デプロイ | ember init --server-url URL |
設定していないサーバーにデータが送信されることはありません。質問をするためのターミナルがない場合(スクリプトや CI など)、ember init はローカル推論をセットアップします。--local または --server-url を指定すると、事前に質問に回答できます。
仕組み
判断モデルはチャットモデルとは異なります。state と型付きの質問のスキーマを受け取り、テキストを生成せずに、選択肢ごとに 1 つの確率を返します。そのため、ember はエージェントにツールとして組み込まれ、エージェントの推論は通常の LLM 上で行われます。
- モデルサーバー(
ember/serving/server.py)はモデルを一度読み込み、エージェントのセッション間も起動状態を保ちます。 - MCP サーバー(
ember/mcp/mcp_server.py)はモデルを読み込みません。最初のツール呼び出し時にモデルサーバーを起動するため、MCP ハンドシェイクは即時に完了します。
名称
| 項目 | 名称 |
|---|---|
| 製品、Python インポート、リポジトリ | ember |
ディストリビューション(uv tool install、PyPI) | ember-advise。PyPI では ember がすでに使用されており、gut は空のプロジェクトに確保されているためです |
| CLI | ember(短縮エイリアス:gut。ember-advise も使用できるため、uvx ember-advise mcp が動作します) |
| MCP サーバー/コマンド | ember/ember-mcp |
| ツール | advise — opencode:ember_advise、Claude Code:mcp__ember__advise(プラグイン:mcp__plugin_ember_ember__advise)、Kilo Code:ember_advise |
| プレイブックスキル/MCP リソース | ember-advise/ember://guide |
| 環境変数 | EMBER_* |
「Clef」は常に Cloudflare の上流モデルを指し、この製品を指すことはありません。ember model pull <name>/EMBER_MODEL=<name> でモデルを選択し、ember model list を実行すると登録済みの全エントリー(flash、full)を確認できます。
モデルの S3 ロケーションを起動時に直接指定するホステッドデプロイ(例:Outerbounds)では、このレジストリは一切使用しません。下記の「ホステッドデプロイ:起動時に指定するモデルのロケーション」を参照してください。
検証済み
テスト済みのバージョンとハードウェアについては、COMPATIBILITY.md を参照してください。最新の追跡対象ベンチマーク実行による現在の精度とレイテンシは、ベンチマークレポートで確認できます。
インストール(Apple Silicon)
要件
他の人が実行するサーバーを利用する場合、必要なのは Python 3.12(uv で管理)とサーバーのアドレスだけです。ember model pull はスキップしてください。モデルを自分で実行する場合:
- Apple Silicon Mac(M シリーズ)、ローカル利用(MPS)の場合は macOS が必要です。Intel Mac は対象外です。NVIDIA/CUDA コンピューティング環境でのホステッドデプロイ(例:Outerbounds)については、下記の「ホステッドデプロイ」と
deployment/README.mdを参照してください。 - ユニファイドメモリ:モデルのサイズを上回る容量が必要です。
flash(9B)には 32 GB 以上、full(27B)には 96 GB 以上が必要です。検証済みなのは 128 GB のみです。 - ディスク:Hugging Face の共有キャッシュ(
~/.cache/huggingface)に、flashは約 18 GiB、fullは約 55 GiB が必要です。設定、状態、ログは~/Library/Application Support/emberに保存されます。 - Python 3.12(uv で管理)。
uv tool install --python 3.12 ember-advise
ember model pull # ~18 GB, resumable, disk-space checked
ember doctor # platform, dependencies, model, server, and agent registration
ember init --opencode --global # register with opencode for every repo on this machine
--python 3.12 はそのまま指定してください。そうしないと uv は最も新しいインタープリターを選びますが、固定された torch/transformers の構成ではテストされていません。
これにより、PyPI から最新リリースのホイールがインストールされます。
代わりに、GitHub の特定のリリースタグを指定してインストールする場合(PyPI は不要です):
uv tool install --python 3.12 "ember-advise @ git+https://github.com/shapeandshare/[email protected]"
リポジトリは公開されているため、git インストールに認証情報は必要ありません。代わりに SSH を使用するには、git+ssh://[email protected]/shapeandshare/[email protected] からインストールしてください。
conda、mamba、または pixi で Python を管理している場合は、Anaconda.org の暫定 joshburt チャンネルから同じツールをインストールしてください(フィードストックが conda-forge に登録され次第、そちらに移行します)。
conda install -c joshburt -c conda-forge ember-advise # mamba and pixi take the same flags
名称変更前に gut として ember をインストールしていましたか? まず uv tool uninstall gut を実行してください。両方のディストリビューションが同じコマンドを提供します。
opencode を再起動すると、このマシン上のすべてのリポジトリで ember_advise を利用できるようになります。モデルサーバーは遅延起動され、最初のツール呼び出し時(または ember start の実行時)に起動します。
プロジェクトごとのスキルとポリシー(ember を認識するエージェントを使いたい各リポジトリで一度実行します):
cd /path/to/your/repo
ember agents install --agent opencode # installs the ember-advise playbook skill
ember agents show snippet >> AGENTS.md # then edit the project policy block at the end
このスキルは、ember をいつ参照し、どのように質問するかをエージェントに教えます。AGENTS.md のスニペットでは、カスタマイズ可能なプロジェクト固有のポリシー(例:「プッシュする前に毎回、変更のリスクを確認する」)を追加します。すべてのハーネスとオプションについては、下記のエージェントのオンボーディングを参照してください。
flash は MPS で検証済みのコミット(17f0b0a)を、full はリリースコミット(2f3de3d。ローカルでは未検証)をダウンロードの便宜のために対象としています。また、torch/torchvision はテスト済みのマイナーバージョン系列に固定されています。ただし ember は、個別に検証済みの重みだけを列挙した手動管理の許可リストに限定されません。ローダーの契約に適合するモデルであれば実行します(憲章第 V 条「モデルの読み込み」)。別の重みディレクトリを実行するには、EMBER_MODEL_DIR を設定してください。
クラウド
ember はローカルでは Apple Silicon を優先し、ホスト環境へのデプロイでは NVIDIA GPU をサポートします
(憲章第 VI 条「Apple Silicon and CUDA」)。合計 3 種類のデバイスで実行できます。上記のメモリを備えた Apple Silicon ホスト(MPS)、NVIDIA GPU ホスト(EMBER_DEVICE=cuda、float16。「ホスト環境へのデプロイ:起動時に指定するモデルの場所」と、Outerbounds の完全な例については deployment/README.md を参照)、または CPU フォールバックを使う任意のホスト(EMBER_DEVICE=cpu — float32、必要なメモリは約 2 倍で、速度は大幅に低下します)です。HTTP サーバーはデフォルトでループバックにバインドされます。他のマシンに公開するには、EMBER_HOST を設定し、EMBER_SERVER_AUTH_TOKEN を設定して Authorization: Bearer <token> を必須にしてください(クライアント側では EMBER_AUTH_HEADER を使って任意のヘッダー名を指定できます。例:x-api-key)。Ember は TLS を終端しません。リモートで公開するデプロイにはプロキシを前段に配置してください。クライアントは EMBER_SERVER_URL を指定して接続します。COMPATIBILITY.md と SECURITY.md を参照してください。
エージェントのオンボーディング
ツールのインストールは作業の半分にすぎません。もう半分は、適切なタイミングでエージェントがツールを参照し、回答を適切に読み取るようにすることです。ember/agent_kit/ には、各エージェントが実際に読むすべてのチャネルを通じてガイダンスが提供されています。
| チャネル | opencode | Kilo Code | Claude Code | Codex CLI | 利用方法 |
|---|---|---|---|---|---|
| MCP サーバーの指示(参照するタイミング、質問の仕方、回答の読み方) | ✅ システムプロンプト内 | ✅ システムプロンプト内 | ✅(上限 2 KB) | — | 組み込み済み、作業不要 |
ember://guide リソース(完全なプレイブック) | ✅ read_mcp_resource 経由 | ✅ read_mcp_resource 経由 | ✅ | — | 組み込み済み |
ember-advise スキル(必要に応じて読み込むプレイブック) | ✅ | ✅ | ✅ | ✅ | ember agents install --agent <agent> |
| AGENTS.md / CLAUDE.md のポリシーブロック | ✅ | ✅ | ✅(CLAUDE.md) | ✅ | ember agents show snippet >> AGENTS.md |
ember init --opencode # opencode: config entry, plugin, and skill
ember init --kilocode # Kilo Code: kilo.json entry and skill
ember init --codex # Codex CLI: .codex/config.toml entry and skill
ember agents install --agent claude # .claude/skills/ember-advise/SKILL.md
ember agents install --agent codex # .agents/skills/... (opencode reads this too)
ember agents show snippet >> AGENTS.md # then edit the project policy at the end
このスキルはリファレンスカードではなく、プレイブックです。ember に相談する価値のある判断ポイント、意図と準備状況を確認するためのコピー&ペースト可能な質問セット、障害のトリアージ、変更リスク、振り分け、作業量、そして観測されたモデル出力に基づいて調整した信頼度の開始しきい値が含まれています(固定されたモデルリビジョンが変更されるたびに再測定されます)。スニペットの末尾にはプロジェクトポリシーがあります。たとえば「プッシュの前に必ず変更リスクを確認する」のように、独自のワークフローに ember を組み込むために編集してください。
エージェント固有の注意事項:
-
opencode は
.opencode/skills、.claude/skills、.agents/skillsからスキルを読み込むため、重複して表示されないよう、プロジェクトごとに 1 つずつインストールしてください。 -
Kilo Code:
ember init --kilocodeはkilo.jsonにmcp.emberエントリーを書き込みます(opencode と同じ設定形式)。また、スキルを.kilo/skills/ember-advise/SKILL.mdにインストールします。ツール名はember_adviseです。Kilo Code はAGENTS.mdも自動的に読み込みます。 -
Claude Code:
claude mcp add --scope user ember -- ember-mcpでサーバーを登録します(すべてのプロジェクトが対象です。現在のプロジェクトだけに登録するには--scope userを省略してください)。ツール名はmcp__ember__adviseです。または、MCP エントリーとember-adviseスキルが含まれるember プラグインをインストールしてください(その場合はember agents install --agent claudeを省略します)。claude plugin marketplace add shapeandshare/ember claude plugin install ember@emberプラグインは、
uv tool installでインストールしたember-mcpを引き続き実行し、ツール名はmcp__plugin_ember_ember__adviseになります。ツールが二重に表示されないよう、どちらか一方だけを利用してください。 -
Codex CLI:
ember init --codexは.codex/config.tomlに[mcp_servers.ember]を書き込みます(--globalを指定すると~/.codex/config.toml、または$CODEX_HOME/config.tomlに書き込みます)。また、スキルを.agents/skills/ember-advise/SKILL.mdにインストールします。Codex がプロジェクトの.codex/config.tomlを読み込むのは、信頼済みのプロジェクトに限られます。ember init --codexは、このプロジェクトが信頼済みかどうかを通知します。エントリーはEMBER_AUTH_TOKENを名前で転送します(env_vars)。値を転送することはありません。MCP サーバーの指示とリソースへの対応は確認されていないため、スキルと AGENTS.md のスニペットを利用してください。
登録内容を確認する
ember doctor の最後には、各ハーネスについて2行ずつ表示されます。1行目には PATH 上の実行ファイル、2行目には ember の登録先(このディレクトリとグローバル設定)、または登録に使うコマンドが表示されます。各ハーネスの設定ファイルを読み取るだけで、ハーネスの CLI を実行することはありません。
| ハーネス | 登録コマンド | プロジェクトスコープ | グローバルスコープ | doctor があわせて検出する項目 |
|---|---|---|---|---|
| opencode | ember init --opencode [--global] | opencode.json、.opencode/plugins/ember.js | ~/.config/opencode/opencode.json、~/.config/opencode/plugins/ember.js | 古いバージョンの ember init が残した mcp.vault エントリ |
| Kilo Code | ember init --kilocode [--global] | kilo.json | ~/.config/kilo/kilo.json | — |
| Codex CLI | ember init --codex [--global] | .codex/config.toml | ~/.codex/config.toml | プロジェクトが信頼されていないために Codex が無視するプロジェクトファイル |
| Claude Code | claude mcp add --scope user ember -- ember-mcp、または ember@ember プラグイン | .mcp.json(--scope project);プロジェクトごとの ~/.claude.json(--scope local);.claude/settings.json / settings.local.json の enabledPlugins | ~/.claude.json;~/.claude/settings.json の enabledPlugins | Claude Code が承認を求めるプロジェクトの .mcp.json |
各ハーネスには専用の確認コマンドもあります:opencode mcp list、codex mcp list、claude mcp list。
古いバージョンの ember init は、このリポジトリの vault MCP サーバーも、書き込むすべての設定に追加していました。ember init --global を実行した場合、doctor はグローバルな opencode 設定に残っているエントリを示すので、削除できます。
ember init は、PATH 上で見つかった ember-mcp を記録し、見つからない場合は実行に使われた Python を記録します。そのため、チェックアウトの .venv ではなく、インストール済みのツール(uv tool install …)から ember init --global を実行してください。既存の設定に変更を加え、解析できない設定(たとえばコメントを含む opencode.json)は書き換えず、そのまま残します。
CLI
以下のすべてのコマンドでは、短縮形の gut も使えます。
# lifecycle
ember doctor # platform, dependencies, model, server, agent registration
ember serve # run the model server in the foreground
ember start | stop | restart | status | logs
ember config path | show
ember uninstall [--purge-models] # also removes global opencode/Kilo Code/Codex and skill installs
# models
ember model pull [flash|full] # flash = 9B (default)
ember model list | path [name] | rm [name]
# opencode, Kilo Code, Codex CLI, and agents
ember init [--opencode] [--kilocode] [--codex] [--global] [--local | --server-url URL] [--auth-header NAME]
ember agents install [--agent opencode|claude|codex|kilocode] [--global]
ember agents show instructions|skill|snippet
ember mcp # the MCP stdio server agents launch
使用方法
「このバグ報告は緊急ですか。また、どのチームが担当すべきですか?」のように自然言語でエージェントに質問すると、エージェントは状態と型付きの質問を指定して ember_advise を呼び出します。
{
"model": "clef-flash",
"answers": {
"urgent": { "type": "noul", "noul": 0.967 },
"team": {
"type": "choice",
"choice": "db",
"confidence": 0.9782,
"probabilities": { "db": 0.9782, "frontend": 0.0218 }
}
},
"usage": {
"input_tokens": 220, "output_tokens": 0,
"state_tokens": 34, "fixed_tokens": 186, "media_tokens": 0
},
"latency_ms": 930.9
}
質問の種類:noul(はい/いいえ → P(true))、choice(名前付きの選択肢)、score(順序付きの選択肢 → 期待スコアと凡例)。model フィールドには、上流のモデルラベルがそのまま返されます。usage は input_tokens を、状態、固定オーバーヘッド(質問、スキーマ、プロンプトラッパー)、メディアに分割します。これにより、リクエストの各部分にかかったトークン数を呼び出し側が確認できます。この分割はベンチマーク用ハーネスで必要です。
視覚的な証拠を使う場合は、画像または動画フレームをインラインで添付します。images は data:image/png;base64,... URI のリスト(または {"content_type": "image/png", "base64": "..."} オブジェクトのリスト)、videos はフレーム参照のリストを動画ごとにまとめたリストです。リモート URL とローカルパスは拒否されます。モデルサーバーがホスト上のファイルを読み取ったり、エージェントに代わって URL を取得したりすることはありません。
設定
設定は CLI フラグ > 環境変数 > 設定ファイル > デフォルト の優先順位で解決されます。設定ファイルは ember config path にある JSON ファイルです(キーは model、host、port、device、max_length、server_url、auth_token、auth_header、allow_insecure_transport、request_timeout、server_auth_token、max_request_length です。max_length が 0 の場合はモデル自体の最大値を意味し、max_request_length が未設定の場合は、読み込まれたモデル自体のデフォルト上限が使われます)。
| 変数 | デフォルト | 用途 |
|---|---|---|
EMBER_HOST / EMBER_PORT | 127.0.0.1 / 8765 | ローカルモデルサーバーのバインドアドレス |
EMBER_DEVICE | auto | auto、mps、cuda、または cpu |
EMBER_TORCH_DISABLE_NATIVE_JIT | 1 | torch 2.14 の Triton ベースの torch._native 演算オーバーライド(例:Qwen3.5 の RoPE のフォワード処理が CUDA で使用する aten::bmm 外積の特殊化)を無効にします。これらは JIT コンパイル時に C コンパイラーを使用しますが、最小構成の CUDA コンテナー(例:Outerbounds の Fast Bakery)には通常ありません。これを無効にしないと、最初の実際の CUDA リクエストは RuntimeError: Failed to find C compiler で失敗します。動作するコンパイラツールチェーンがあるホストでは、0 に設定して(おそらく高速な)Triton の経路を再び有効にできます。MPS/CPU には影響しません |
EMBER_MODEL | flash | flash(9B、デフォルト)または full(27B)。どちらも Cloudflare の公開 Hugging Face リポジトリのモデルです |
EMBER_MODEL_DIR | — | 固定キャッシュの代わりに、このディレクトリのモデルウェイトを実行します |
EMBER_MAX_LENGTH | 0(モデルの最大値:262,144) | モデルが処理するトークンの最大数です。0 の場合はモデルの config.json から値を取得し、それより大きな値はその上限に制限されます |
EMBER_MAX_REQUEST_LENGTH | 未設定:ロードしたモデル独自のデフォルト値、実測された上限、または実測されるまではフォールバック値(メモリ予算のうち 4 GiB を空けておける最大長。flash では 24,576、full では 65,536)です。レジストリ外のモデル(EMBER_MODEL_DIR、EMBER_MODEL_S3_URI)には、レジストリ内で最も低い上限である現在の 24,576 が適用されます | リクエストごとに、エンコード済みリクエスト全体(状態、メディア、質問、スキーマ、プロンプトラッパー)に適用する上限です。推論の前に確認されます。上限を超えるリクエストはトークンの内訳を示す 413 エラーで拒否され、切り詰められることはありません。0 にすると上限は無効になりますが、最大値は引き続き適用されます |
EMBER_SERVER_URL | http://127.0.0.1:8765 | クライアントがリクエストを送信する推論エンドポイントです。デフォルトはループバックですが、リモートも指定できます |
EMBER_AUTH_TOKEN | — | リモートエンドポイント用のクライアント認証情報 |
EMBER_AUTH_HEADER | Authorization | 認証情報を含めるヘッダーです。Authorization の場合は Bearer <token> を送信し、それ以外の名前の場合はトークンをそのまま送信します |
EMBER_ALLOW_INSECURE_TRANSPORT | 0 | ループバック以外のエンドポイントへの暗号化されていない http を許可します(デフォルトでは無効) |
EMBER_REQUEST_TIMEOUT | 900 | ローカルまたはリモートを問わず、MCP クライアントが各 advise リクエストを待つ秒数です。full の上限近くまで処理するリクエストは M4 Max で約 12 分かかり、リクエストは一度に 1 件ずつ実行されるため、長時間の full リクエストが重なる場合は、この値を増やしてください |
EMBER_SERVER_AUTH_TOKEN | — | 設定すると、サーバーは /v1/systemone へのリクエストに Authorization: Bearer <token> を必須とします |
EMBER_AUTOSTART | 1 | MCP サーバーが必要に応じてローカルサーバーを起動できるようにします(ループバックのみ) |
EMBER_START_TIMEOUT | 300 | モデルサーバーの起動を待つ秒数 |
EMBER_STATE_DIR | Application Support | PID ファイルとログの保存場所 |
EMBER_MODEL_S3_URI | — | ロードするモデルの正確な場所を指定する s3://bucket/prefix URIです。REGISTRY キーの代わりに、起動時にデプロイ環境(例:Outerbounds)からモデルの S3 ロケーションが渡される場合に使用します。下記の「ホステッドデプロイ:起動時に指定するモデルのロケーション」を参照してください。 |
EMBER_S3_ACCESS_KEY_ID / EMBER_S3_SECRET_ACCESS_KEY | — | EMBER_MODEL_S3_URI 用の AWS 認証情報です。省略可能です。未設定の場合は、boto3 独自のデフォルト認証情報チェーンが適用されます(コンピュートにアタッチされた IAM ロール(例:Outerbounds)、環境変数、~/.aws/credentials)。ロールがアタッチされていない環境(例:ローカルの開発マシン)でのみ、明示的に設定してください |
EMBER_S3_REGION | — | S3 クライアントに渡す AWS リージョン |
ember doctor と GET /health(engine)は、有効な制限と、それぞれの由来(モデル、フォールバック、オペレーター設定、または実測されたデフォルト値)を報告します。
ホステッドデプロイ:起動時に指定するモデルの場所
一部のデプロイ(例:Outerbounds アプリ)では、REGISTRY のエントリーを選択する代わりに、起動時にモデルの S3 の場所を直接指定します。次のように設定します。
export EMBER_MODEL_S3_URI=s3://my-bucket/clef-flash
export EMBER_DEVICE=cuda # Outerbounds compute is Linux — no MPS; cuda is the GPU path
ember serve # foreground, container-friendly (not `ember start`)
コンピューティング環境に IAM ロールがすでにアタッチされている場合(Outerbounds ではこれが想定されています)、AWS 認証情報を明示的に設定する必要はありません。boto3 のデフォルト認証情報チェーンが自動的に認証情報を取得します。ロールがアタッチされていない場合に限り、EMBER_S3_ACCESS_KEY_ID/_SECRET_ACCESS_KEY を明示的に設定してください。
これはサーバーの起動前に一度だけ確認され、EMBER_MODEL/model 設定キーよりも優先されます。この方法では REGISTRY の検索は行われません。ember は、ローダーの契約(constitution Article V「Model Loading」)に従って実行できる任意のモデルをサポートします。個別にハッシュ検証した重みだけを手作業で登録した許可リストではないため、URI で場所を指定すると、照合するピン留めやハッシュなしで直接読み込まれます。
Outerbounds のデプロイ例一式(モデルごとに異なるコンピューティングリソースが必要なため、モデルごとに用意された flash.yaml/full.yaml、生成された requirements.txt、および make deployment-requirements ターゲット)は、deployment/ にあります。
リモート推論
サーバーを 1 台起動して共有します。チームや CI、あるいはモデルを動かすメモリが足りない 2 台目の Mac と共有できます。ホストでサーバーを起動し、各クライアントから接続します。
ホストマシン(モデルを搭載しているマシン)
# Bind to all interfaces so other machines can reach it
EMBER_HOST=0.0.0.0 ember start
# Recommended: also require a bearer token so only your client can use it
EMBER_HOST=0.0.0.0 EMBER_SERVER_AUTH_TOKEN=your-secret ember start
Ember は TLS を終端しません。信頼できる LAN ではプレーンな HTTP で問題ありません(以下のクライアントに関する注意を参照してください)。インターネット経由の場合は、TLS プロキシ(nginx、Caddy)を前段に配置し、https:// を使用してください。
クライアントマシン(エージェントを実行するマシン)
export EMBER_SERVER_URL="http://<host-ip>:8765" # use https:// if behind a TLS proxy
export EMBER_AUTH_TOKEN="your-secret" # matches EMBER_SERVER_AUTH_TOKEN on the host
export EMBER_AUTOSTART=0 # nothing local to start
ember status # reports remote endpoint + reachability
ループバック以外のホストへのプレーンな http はデフォルトで拒否されます。信頼できる LAN で許可するには、EMBER_ALLOW_INSECURE_TRANSPORT=1 を設定してください。認証情報はカスタムヘッダー(EMBER_AUTH_HEADER=X-API-KEY)として送信することもできます。ember status / ember doctor では、エンドポイントの種類、到達可能性、リモートが通知する auth_required、認証情報が設定されているかどうかを確認できます。ローカル接続に戻すには、これらの環境変数を解除するだけです。
ホステッドエンドポイントに接続するクライアントの初期設定
ember init は、生成された opencode.json / kilo.json / .codex/config.toml を手動で編集する代わりに、リモートエンドポイント用の mcp.ember エントリーを直接生成できます。
ember init --opencode --kilocode \
--server-url https://decisions.example.com \
--auth-header X-API-KEY # omit for the default Authorization: Bearer header
--server-url を指定せずにターミナルで ember init を実行すると、アドレスを尋ねられます。Claude Code は独自の CLI で登録するため、同じ設定を指定してください。
claude mcp add --scope user ember -e EMBER_SERVER_URL=https://ember.example.com -e EMBER_AUTOSTART=0 -- ember-mcp
これにより、設定ファイルに EMBER_SERVER_URL(指定した場合は EMBER_AUTH_HEADER も)が書き込まれ、EMBER_AUTOSTART=0 に設定されます。ローカルで自動起動するものはありません。認証情報そのものがファイルに書き込まれることはありません。シークレットがプロジェクトのコミット対象になる可能性のある設定ファイルに残らないよう、エージェントを起動するシェル(または GUI アプリの環境)で EMBER_AUTH_TOKEN をエクスポートしてください。--server-url を指定しない場合、ember init はターミナルでアドレスを尋ね、尋ねられない場合(または --local を指定した場合)はローカルのループバックエントリーを書き込みます。新しい MCP 登録を反映するには、その後ハーネスを再起動してください。
これは生成されたハーネス設定のみを更新します。シェルから直接実行した ember status / ember doctor は、シェルでも同じ EMBER_SERVER_URL/EMBER_AUTH_HEADER/EMBER_AUTH_TOKEN をエクスポートするか、ember 独自の設定ファイル(ember config path)に server_url/auth_header(トークンは保存しないでください)を永続化しない限り、引き続きローカルのデフォルトを確認します。正確な手順と正常な応答の例については、deployment/README.md の「Verifying from the shell」を参照してください。
Tailscale 経由で AWS にホスト
make aws-up は ember を AWS 上の単一の NVIDIA GPU インスタンスにデプロイし、パブリックポートを開放せずに Tailscale ネットワーク経由でのみアクセスできるようにします。インスタンスでは EMBER_DEVICE=cuda を設定して ember serve を実行し、プライベートな S3 モデルキャッシュから重みを読み込みます。クライアントはノードの MagicDNS 名(https://ember-<name>.<tailnet>.ts.net)を使って HTTPS 経由で接続します。EMBER_ALLOW_INSECURE_TRANSPORT は不要です。
make aws-tools # install the tailscale CLI (macOS: brew; Linux: prints URL)
make aws-cache MODEL=flash # upload the pinned model to S3 once per region (~18 GiB)
make aws-up # deploy; prints the URL and the ember init line
export EMBER_AUTH_TOKEN="$(make -s aws-token)"
ember init --opencode --server-url https://ember-default.<tailnet>.ts.net
ember はアドバイスを提供し、判断はエージェントが行います。デプロイによって変わるのはモデルの実行場所であり、エージェントからの呼び出し方ではありません。前提条件(AWS のクォータ、Tailscale OAuth クライアント、MagicDNS、HTTPS 証明書)、コスト、すべてのライフサイクルコマンド、削除手順については、deployment/aws/README.md を参照してください。
メトリクス
モデルサーバーの実行中は、Prometheus メトリクスが http://127.0.0.1:8765/metrics(EMBER_HOST/EMBER_PORT のアドレス)で公開されます。
| メトリクス | 種類 | 意味 |
|---|---|---|
ember_advise_requests_total{status} | カウンター | HTTP ステータス(200、413、422、503、500)別のアドバイスリクエスト数 |
ember_advise_latency_seconds | ヒストグラム | ステータス別のアドバイスリクエストのレイテンシ |
ember_advise_input_tokens_total | カウンター | 処理された入力トークン数 |
ember_advise_output_tokens_total | カウンター | 生成された出力トークン数 |
ember_model_info{model,device,dtype} | ゲージ | モデルが読み込まれている間は 1 |
エンドポイントは API の他の部分と同じアドレス(デフォルトではループバック)にバインドされるため、EMBER_HOST を変更しない限り、その場所でのみアクセスできます。Ember のメトリクスは専用の Prometheus レジストリに保存されるため、標準の python_*/process_* コレクターは含まれません。/metrics に表示されるのは上記の表の項目だけです。
開発
ember/
cli.py # the `ember` command (alias `gut`): argparse wiring + main()
commands/ # subcommand handlers: lifecycle, doctor, models, agents, eval, config
models.py # pinned model registry + pull/list/rm
serving/ # HTTP model server, MPS runtime, lifecycle, media
server.py # FastAPI: POST /v1/systemone, GET /health (reports pid)
runtime.py # MPS-safe loader (CPU load → .to("mps")) + Engine
process.py # model-server lifecycle (pid file + HTTP health)
media.py # base64 data-URI / {content_type,base64} → PIL decoder
mcp/ # MCP stdio server and wire types
mcp_server.py # MCP stdio server: advise tool, instructions, ember://guide
mcp_types.py # Pydantic wire types (Question, AdviseInput)
cfg/ # configuration, endpoint, and platform paths
config.py # config resolution (CLI flag > env > file > default)
endpoint.py # client endpoint: loopback check, transport guard, auth headers
paths.py # platform-aware app dirs (macOS Library, XDG)
repo_root.py # checkout / main-worktree root from .git on disk
opencode/ # opencode integration
opencode_config.py # generates opencode.json
opencode_plugin.py # installs the npm plugin
kilocode/ # Kilo Code integration: generates kilo.json
codex/ # Codex CLI integration: .codex/config.toml entry, project trust
claude/ # Claude Code registration detection (read-only)
agent_kit/ # what agents read: instructions, ember-advise skill, AGENTS snippet
api.py # public API: instructions(), skill(), snippet(), install_skill()
packages/opencode-plugin/ # opencode plugin source (unpublished; `ember init --opencode` writes the installed copy)
packages/claude-plugin/ # Claude Code plugin (MCP entry + mirrored ember-advise skill), listed by .claude-plugin/marketplace.json
server.json # MCP Registry entry (io.github.shapeandshare/ember), published by release-ember.yml
scripts/ # make-only dev tools: MPS smoke, MCP e2e, site build, provenance/vault audits
evals/eval/ # benchmark harness: run, report, export, snapshot, agent-in-the-loop
tests/ # pytest suite (unit + model-backed, host-isolated)
vault/ # project memory (Obsidian): decisions, discoveries, session logs
.specify/ # spec-kit; memory/constitution.md governs this repo
AGENTS.md CLAUDE.md # guidelines for agents working on this repo
Makefile # contributor lifecycle (wraps the CLI)
make bootstrap # deps + pinned weights + opencode.json + doctor (idempotent)
make start # model server in the background; stop | restart | status | logs
make opencode # this checkout's opencode plugin and skill
opencode.json、.opencode/plugins/ember.js、.opencode/skills/ember-advise/(kilo.json、.codex/config.toml、および他のハーネス用の ember-advise スキルのコピーと同様)は、このクローンの絶対パスを埋め込むか、パッケージ化されたファイルをコピーするため、gitignore されています。クローン後に make init / make opencode を実行して再生成してください。.opencode/opencode.json は共有され、コミットされています。エージェントが vault/ の読み書きに使う vault MCP サーバーを登録します(リポジトリのルートから opencode を起動してください)。
Make のターゲット
| ターゲット | 説明 |
|---|---|
make help | すべてのターゲットを一覧表示します(デフォルト) |
make bootstrap | 新規クローンから実行します:setup + download + init + doctor |
make setup / sync / download | 依存関係のみ / 依存関係のみ(エイリアス) / 固定された重みを .models/ にダウンロード |
make init / make opencode | このチェックアウトに対して ember init / ember init --opencode を実行 |
make serve / start / stop / restart / status / logs | CLI によるモデルサーバーのライフサイクル管理 |
make mcp / make mcp-list | MCP サーバーを実行 / opencode mcp list を実行 |
make test / test-fast / test-strict | 全テストスイート / ユニットテストのみ / 重みがない場合に失敗する全テストスイート |
make test-evals | キャリブレーション評価スイート:正例 + 負例のレシピケース(モデルをロード) |
make eval-run | 稼働中のサーバーに対してベンチマークデータセットを実行し、results/ に書き込みます |
make eval-snapshot | 最新の実行結果を benchmark/ にコピーし、サイトで表示できるようにします |
make eval-context | 長文コンテキストのプローブ:MPS で各モデルのリクエスト上限を測定します(数時間) |
make eval-context-smoke | 長文コンテキストのプローブのスモークテスト:flash、2K、4K、3 項目(数分) |
make eval-report | 最新の実行結果を Markdown テーブルとして表示します |
make dataset-lint / dataset-card | ベンチマークデータセットを検査します(レポートモード。no-live-secret を適用)/ evals/dataset/card.json + CARD.md を再生成します |
make audit-sources | データセット公開前に、すべてのデータソース登録行をオンラインで再確認します |
make mcp-check / make smoke | MCP のエンドツーエンドチェック / MPS の直接推論 |
make compile / make check | バイトコードのコンパイル / コンパイル + ユニットテスト |
make ci | bootstrap + check + test-strict |
make doctor | ember doctor |
make vault-audit | vault/ のノートを確認します:フロントマター、タグ、Wiki リンク、コード参照、孤立ファイル |
make site / make site-serve | Pages サイトを site/_site にビルド / :4000 でプレビューします。編集のたびに再ビルドしてブラウザーを再読み込みします(Docker が必要) |
make aws-tools / aws-tools-rm | tailscale CLI をインストール / 削除します(macOS:brew、Linux:URL を表示) |
make aws-preflight | リソース作成前に AWS の ID、クォータ、Tailscale OAuth、MagicDNS を確認します |
make aws-cache | S3 モデルキャッシュスタックを作成し(存在しない場合)、固定モデルをアップロードします |
make aws-cache-list / aws-cache-rm | キャッシュ済みモデルを一覧表示 / キャッシュ済みリビジョンを 1 つ削除します |
make aws-cache-destroy | キャッシュバケットを削除します(CONFIRM=<bucket> が必要。デプロイが存在する間は拒否されます) |
make aws-up | ember GPU インスタンスをデプロイ(または更新)し、ヘルスチェックを待ちます |
make aws-status | デプロイ状態、インスタンス、tailnet URL、ヘルス、コスト見積もりを表示します |
make aws-stop / aws-start | EC2 インスタンスを停止 / 起動します |
make aws-replace | 最新の DLAMI でインスタンスを置き換え、ヘルスチェックを待ちます |
make aws-logs | Tailscale SSH 経由でインスタンスログをストリーミングします(UNIT=ember|converge|idle|tailscale) |
make aws-ssh | インスタンス上で Tailscale SSH シェルを開きます |
make aws-token | サーバー認証トークンを表示します |
make aws-rotate-token | 新しいサーバートークンを生成し、インスタンスを再起動します |
make aws-down | デプロイを破棄します(CONFIRM=<name> が必要。S3 キャッシュは保持されます) |
make aws-verify | Tailscale SSH 経由で CUDA 検証ゲートを実行し、ここからベンチマークを実施します |
make release-dry | 変更を加えずに、次の ember バージョン更新をプレビューします |
make release-ember | main でリリースワークフローを起動します(バージョン更新 PR → GitHub Release → PyPI) |
make clean / make clean-model | キャッシュとビルド出力 / 重みを削除します(EMBER_FORCE=1 を指定すると確認プロンプトを省略します) |
pyproject.toml または uv.lock が変更されると、Make は環境を自動的に再同期します。
テスト
make test # full suite (~30 s, loads the model once)
make test-fast # unit tests only, no model load (~12 s)
make check # compile + test-fast
make test-strict # full suite; fails (not skips) if weights are missing
make ci # bootstrap + check + test-strict
tests/ では、以下のサポート対象の呼び出し経路を網羅しています。
GET /healthとPOST /v1/systemoneにおけるnoul/choice/score、確率の正規化、リクエスト検証の422- MCP ツールの検出、stdio 経由の
advise、実行可能なエラー(サーバー停止、モデル不足、不正な質問)、および設定済みポートでの PID クリーンアップを伴う自動起動 - エージェントキット:指示のサイズ、スキルのフロントマター、
ember://guideリソース - CLI:
agents、init --opencode、未使用ポートでのstatus/stop、doctor、uninstall - プロセスの安全性:
stopは、起動した ember サーバーのものではない PID にシグナルを送信しません
ほかの opencode インスタンスが実行中のホストでも安全です。 テストスイートはランダムな空きポート(8765 は使用しません)にバインドし、一時ディレクトリに状態を保存し、起動したプロセスのみを停止します。また、opencode CLI の実行やグローバルな opencode 設定へのアクセスは行いません。
CI(.github/workflows/ci.yml)では uv sync --locked を実行し、その後、フォーマットと lint、mypy --strict、bandit、make check、uv build と、ホスト型 Apple Silicon ランナーでビルドした wheel のインストールスモークテスト、SonarCloud スキャン(リポジトリシークレット SONAR_TOKEN が必要)、ワークフローの zizmor 監査を、それぞれ別のジョブとして実行します。モデルを使用するテストは CI では実行しません。約 19 GB の fp16 モデルは、利用可能なランナー(ホスト型または組織の 8 GiB セルフホスト VM)に収まらないため、モデルに影響する変更についてはローカルで make test を実行してください。
カバレッジは追跡され、下限が設定されています(憲章第 XI 条)。完全なレポートを確認するには make test-cov を実行してください。強制される下限(pyproject.toml の fail_under)は現在の測定値であり、引き上げることのみ可能です。現在は 94 % です。引き下げるには、第 XI 条 §11.2 に従い、明示的な承認を記録する必要があります。
ベンチマーク
evals/clef-flash.jsonl がベンチマークです。5 つのエージェントキットのレシピ(意図と準備状況、失敗のトリアージ、変更リスク、ルーティング、労力とアプローチ)、メンテナーの保管庫から採掘した 2 つのレシピ(tag_assignment、note_placement)、および 4 つのビジョンレシピ(vision_noul、vision_choice、vision_score、vision_video)を網羅し、すべての項目を dev または test の分割に含めています。ベンチマークレポートには、現在の項目数と質問数が記載されています。ビジョン項目には、state と questions に加えて、images または videos フィールド(base64 の data: URI)が含まれます。各行は自己完結しており(state、レシピごとに固定された質問セット、各質問の正解ラベル、rationale、構造化された source)、このハーネスがなくても、ほかの実装でスコアを算出できます。
各項目には出典が記されています。source.kind は、authored(ベンチマーク用に作成)、mined(公開記録。登録簿の行で特定)、captured(同意を得た実セッション)、perturbed(parent_id の管理されたバリエーション)、templated、drafted(モデルで下書きし、その後レビュー)、または imported(ライセンスに基づく外部データセット)のいずれかです。公開ソースはデータソース登録簿(evals/dataset/register.json:ライセンスの確認、スナップショット、ミラー、判定)で追跡されます。make audit-sources はデータセットを公開する前に各行をオンラインで再確認し、登録簿の行で許可されていないものをインポートすることはありません。
make eval-run # or: ember eval run [--split dev|test] [--category <recipe>] [--resume]
make eval-report # Markdown report of the most recent run
make eval-export # or: ember eval export; the reviewer bundle described below
make eval-snapshot # or: ember eval snapshot [--rebuild]; copy a run into benchmark/
make dataset-lint # or: ember eval dataset lint [--dataset PATH]
make dataset-card # or: ember eval dataset card [--check]; the data card
ember eval dataset hash # content, file, per-recipe, and register hashes
ember eval dataset check # provenance check: every item's source and register row
ember eval report --compare results/<a>_results.json results/<b>_results.json
データセットには2つのハッシュがあります。コンテンツハッシュは採点対象(ID、カテゴリ、
分割、状態、メディア、質問、正解ラベル)を対象とし、データセットのバージョンを示します。アイテムの種類、ティア、出典、根拠などの注釈では
変わりませんが、正解ラベル、状態、質問、分割が変わると変わります。ファイルハッシュは
来歴を確認するためにバイト列を対象とします。各実行では両方に加えてレシピごとの
ハッシュを記録し、リーダーボードにはコンテンツハッシュごとに1つの表が新しい順に表示されます。
異なるバージョンの結果を比較することはありません。各表には、モデル、
デプロイ、エンジン設定ごとに1行を設け、レシピごとに1列を設けます。単一レシピを再実行すると
(--category)、その列だけが更新され、そのバージョンのすべての判定レシピの採点が
完了すると、ヘッドラインが一度だけ表示されます。ビジョンレシピは能力
パネルとして別途報告し、ヘッドラインには含めません。splits.lockは各アイテムの分割を永久に固定し、versions.lockは
公開済みのすべてのデータセットバージョンを記録します(各プロトコルルールと尺度には、最初に適用される
バージョンを明記します)。また、各リリースの変更履歴には、その測定に使用したバージョンを示す
Benchmark dataset: <content hash>の行が含まれます。
ベンチマークプログラムのフェーズ1では、品質管理を強化します。riskとeffortのレシピには、
すべてのレベルにルーブリックの基準を設け、盲検で再ラベル付けを行った際のラベル安定性の測定値を公開します
(評価者は1名であり、その旨をレポートに明記します)。同じデータセットをMPSではfloat16で、
CUDAデプロイでは通常の精度で実行し、制御された比較を行います。ビルドゲート付きで、2つのバンドルを
ペアとしてコミットします。各アイテムには種類と難易度ティアを付与します(これらの注釈ではデータセットのバージョンは
変わりません)。また、レポートでは簡単ではない問題の正解率を分けて示します。各リーダーボードの行には、
長いコンテキストの形状として、リクエスト上限、最初にドロップする長さ、最悪時の深さを記載するか、
プローブ実行がまだない場合は「未測定」と記載します。実際のエージェントセッションはember eval capture importを使って
候補アイテムにできます。このコマンドは、秘匿化の記録がないセッションや、秘密情報が残っているセッションを拒否します。
モデルをラベル付けには使いません。
データセットのバージョン、レシピ、モデル、設定がマニフェストと一致していれば、実行を中断して再開できます
(ember eval run --resume)。ember eval snapshot --rebuildを使うと、レポートコードの変更後でも、
保存済みトレースから既存のバンドルを再生成でき、モデルを再実行する必要はありません。ハーネスには、
usageでトークンの内訳を報告するサーバー(ember 0.12.0以降)が必要です。また、その内訳をアイテムごとに
記録します。
ember eval exportは、外部レビュアー向けにresults/<run_id>_report/を書き出します。
このディレクトリには、report.html(インラインのグラフ、ライトテーマとダークテーマ、印刷用レイアウト、
アイテムフィルターを備えた自己完結型の単一ファイルで、ネットワークから何も読み込みません)、
figures/*.svgを含むreport.md、そして実行結果、トレース、採点対象となった正確なデータセットを含むdata/が
格納されます。レポートでは、コンテキスト、評価対象システム、ベンチマーク設計、参考文献付きの指標の定義、
結果、キャリブレーション、すべてのアイテムに対して再現したエージェントキットの判定ルール、
各誤答に対するレビュカード、制約、再現性を確保するための固定情報を取り上げます。
レポートには、95%ブートストラップ区間付きの正解率、macro-F1、トップラベルECE、Brierスコア
(choice、noul)、順位確率スコアとMAE(score)、エージェントキットの実行判断しきい値におけるカバレッジと正解率、
リスクレシピの危険な選択肢に対する再現率、出典の種類別およびアイテムのティア別の正解率、
同じ親アイテムの摂動版間の一貫性、リクエストごとのトークン内訳(状態、固定、メディア)を示します。
各実行では、Gitハッシュ、エンジンとその設定、データセットのハッシュを記録します。また、2つの実行で
採点対象のアイテム集合が異なる場合は、--compareが警告します。
正解ラベルは、レシピのオプションの説明に照らしてstateだけから判定し、実行前に固定します。needs_reviewがtrueになるのはriskがMediumまたはHighの場合だけで、retryがtrueになるのはflakyな失敗の場合だけです。不一致は人が確認します。モデルに合わせてラベルを変更することはありません。make checkはデータセットを検証します(tests/test_eval_benchmark.py)。また、データセットのリンターは各レシピの設計に照らして不足を報告します(オプションのバランス、分割間のリーク、近似重複)。強制されるルールはno-live-secretの1つだけで、実際の認証情報らしきものが見つかると失敗します。ember evalはチェックアウト内のevals/とscripts/を読み込むため、クローン内でのみ動作します。
長文コンテキストプローブ
make eval-context(またはember eval context)は、リクエストが長くなるにつれて各登録済みモデルがどの程度性能を維持できるかを測定します。テキストのみのベンチマーク項目すべてにパブリックドメインの文章を追加して2K〜64Kトークンにし、エビデンスを先頭・中間・末尾に配置して、正解率、キャリブレーション、MPSのピークメモリ、レイテンシを記録します。事前に定めたルールに基づいて各モデルのデフォルト上限を選びます。すべての深度で、2Kの結果と比べて正解率の低下が2ポイント以内、Brierスコアの差が0.02以内であり、かつピークメモリが32 GB(flash)または96 GB(full)に収まる最大の長さが選ばれます。MPS上で数時間、プロセス内で実行され、稼働中のサーバーには一切触れません。結果はresults/context/<run_id>/に書き込まれます。判断の根拠として引用する実行結果は、--snapshotを指定してevals/context/runs/にコピーします。--rescoreはサマリーをバイト単位で完全に再構築し、--reproduceは実行結果に固定された入力を再実行して比較します。
エージェントの評価
上記のベンチマークではモデルを評価します。ember eval agentでは、実際の使われ方、つまりコーディングエージェント経由でemberを評価します。opencodeに54件のスクリプト化されたリクエスト(曖昧な依頼と具体的な依頼、失敗するテスト、リスクの高いコミットと些細なコミット、ルーティングと作業量に関する質問、対照ケース)を与え、それぞれ使い捨てのgitリポジトリ内で実行します。評価対象はエージェントが実際に行ったこと(ファイル、コミット、テスト、返信)のみです。各シナリオは4つの条件で実行します。none(emberなし)、mcp(MCP サーバーとその指示あり)、skill(さらにember-adviseスキルあり)、full(さらにAGENTS.mdポリシーあり)です。
ember start # the agent sessions call the warm server
make eval-agent-smoke # 6 scenarios x 4 conditions x 2 models, 1 trial
make eval-agent # or: ember eval agent [--models ...] [--trials 3] [--parallel 8]
ember eval export --agent latest # put the agent results first in the reviewer report
各セッションは、プライベートなHOMEおよびXDGディレクトリを使用し、TCPポートを開かずにopencode run --pureを実行します。そのため、opencodeの設定、プラグイン、セッション、稼働中のインスタンスには影響しません。プロバイダーキーは環境変数またはopencodeの認証ファイルから読み込まれ、子プロセスにのみ渡されます。実行結果では、モデルと条件ごとに、正解アクションの正解率、noneに対する対応のある変化、判断時点(および対照ケース)でエージェントがemberに相談した頻度、行動前に相談したか、キットのレシピに関する質問をしたか、エビデンスを渡したか、emberの回答に従ったかに加え、セッションあたりのコストと所要時間が報告されます。実際のプロバイダー利用料金が発生します。また、make check、make test、CIの一部として実行されることはありません。
注意事項
- Gated DeltaNetへのフォールバック。 Qwen3.5のバックボーンはハイブリッド線形アテンションモデルです。最適化されたCUDAカーネル(
causal_conv1d、flash-linear-attention)はApple Siliconには存在しないため、純粋なPyTorchのリファレンス実装パスを使用します。正確ですが低速です。「falling back」というログが2行表示されますが、これは想定どおりです。 - MPSでのfp16。
bfloat16は動作しますが、MPSではエミュレートされており、十分に検証されていません。そのため、ローダーはfloat16を使用し、CPUモードではfloat32を使用します。 - MPSでのビジョン機能。 画像と動画フレームは、テキストと同じfp16パスで処理されます。
images/videosにはbase64のdata:URIとして埋め込んでください。リモートURLとローカルパスは意図的に拒否されるため、エージェントがホストのファイルを読み込んだり、URLを取得したりすることはできません。テキストのみの入力では、ビジョンタワーを完全にスキップします。 - 数値計算。 MPSではCUDA/CPUと若干異なる場合があります。キャリブレーション済み確率が重要な場合は、
EMBER_DEVICE=cpu ember restartでクロスチェックしてください。 device_map={"": "mps"}は固定されたスタックでセグメンテーション違反を起こします。ローダーはCPU上でモデルを読み込んでからMPSに移動させます。この処理を「簡略化」して削除しないでください。
トラブルシューティング
- まず
ember doctorを実行し、次にember logsを実行してください (~/Library/Application Support/ember/logs/server.log)。 - エージェントからツールが見えない場合:
ember doctorで、各ハーネスにおける ember の登録先を確認できます(信頼されていない Codex プロジェクトや、承認待ちの Claude Code.mcp.jsonも警告されます)。opencode mcp listに✓ ember connectedと表示されるはずです。 - 「model … is not pulled」と表示される場合:
ember model pullを実行するか、EMBER_MODEL_DIRを重みの保存先に設定してください。 Qwen3VLVideoProcessor requires Torchvision→ torchvision はバージョンが固定された依存関係です。uv syncを実行してください(またはツールを再インストールしてください)。- 未実装の MPS オペレーションは、1 つでもあれば CPU にフォールバックします(ランタイムによって
PYTORCH_ENABLE_MPS_FALLBACK=1が設定されます)。
ライセンス
MIT(LICENSE を参照)。Cloudflare の Clef の重みと joint_schema_model.py は Apache-2.0 で、ここでは再配布せず、実行時に Hugging Face からダウンロードします。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。