Codemode
Codemodeでは、モデルがJavaScriptプログラム内でツール呼び出しを組み合わせ、プログラム向け結果を調べ、簡潔な回答を出力できます。現在のSessionで呼び出せるツールとアクセス範囲を使います。Node.js、直接のファイルアクセス、ネットワークのグローバル、タイマーは提供しません。これらの操作には利用可能なホストツールが必要です。
有効化とモードの選択
Dashboard → Tools → Built-in → codemodeで、Profileの既定値を設定するか、待機中で保留入力のないSessionにCodemodeだけの変更を適用します。ProfileのSaveは既存Sessionを再選択しません。Dashboard設定を参照してください。
新規Sessionや待機中の再開Sessionでは、ツール選択にCodemodeを含められます。
anyy --tools '+codemode,+tool_search'
anyy --resume SESSION_ID --tools '+codemode,+tool_search'
+規則は、再開Sessionの現在のアクティブ一覧ではなくProfileの既定選択を変更します。config.yamlには書き込みません。MCP検出によっても、明示的な除外がなければ自動有効化される場合があります。
codemode.mode: onは直接ツールをCodemodeと併存させます。onlyはスクリプト呼び出し可能な直接宣言をモデル要求から隠しつつ、Codemodeからは呼べる状態を維持します。モードはCodemodeを有効化したり、ツールを増やしたり、Roleを変えたりしません。codemode.inline_budgetは宣言に含める入れ子ツールドキュメント量を制御します(既定は推定約3000トークン)。一覧から省略したツールも検出できます。ツールセットを参照してください。
スクリプトを書く
公開引数の形式は、必須のcode文字列を持つオブジェクトです。
{"code":"const result = await tools.bash({command: \"pwd\"}); text(result);"}
選択したネイティブモデルがcompat.supportsOpenAIGrammarToolsを宣言し、プロバイダーがその要求経路に対応する場合、生のJavaScript文法入力を送れます。他のモデルは上のJSON形式を使います。どちらも同じ正規引数を保存します。
スクリプトは非同期関数の本体なので、最上位のawaitとreturnが使えます。Markdownフェンスなしのソースを渡します。たとえばreadが利用可能な場合:
const page = await tools.read({path: "README.md", offset: 1, limit: 60});
text(page);
開始した呼び出しはすべてawaitしてください。スクリプト終了時に残る呼び出しはキャンセルされます。呼び出しごとに新しいVMとグローバルが作られるので、次のCodemode呼び出しまで保持する値にはstoreを使います。
任意の先頭行で出力と実行の上限を指定できます。
// @options: {"max_output_tokens": 2000, "timeout_ms": 30000}
const results = await Promise.all([
tools.bash({command: "git status --short"}),
tools.read({path: "README.md", limit: 40})
]);
for (const result of results) text(result);
これは独立した2つの読み取りです。依存する操作は順番に実行します。timeout_msは2147483647以下の正の整数で、VMの読み込み/起動も含みます。省略時に追加のスクリプトタイムアウトはありませんが、親のキャンセルやホストツールの制限は適用されます。max_output_tokensは非負整数、既定10000で、概算テキスト予算です。
ツールを検出して呼び出す
MCP名を推測せず、検出結果の正確な識別子を使います。
| API | 動作 |
|---|---|
ALL_TOOLS | 現在呼び出せる名前と説明 |
await searchTools(query, {limit, namespace}) | そのスナップショットを検索。既定件数8、任意の名前空間 |
await describeTool(name) | 宣言またはundefinedを返す。正規名かスクリプト識別子を受け付ける |
await describeNamespace(name) | 名前空間の説明/指示とツール識別子、またはundefinedを返す |
await tools.name({...}) | 通常のホスト経路で既存の呼び出し可能ツールを実行 |
名前はJavaScript識別子に正規化され、記号は_になります。衝突時はライブ宣言が正式です。名前空間メタデータは検出用にグループ化するもので、アクセスを許可しません。非表示ツールとモデル専用宣言はスクリプトから呼べません。
searchToolsは既存の呼び出し可能メタデータだけを検索します。別サーバーカタログの取得や、後続モデル要求用の宣言の有効化は行いません。その有効化は別のモデルツールtool_searchが行います。
入れ子呼び出しは通常、失敗するとrejectします。ただし構造化戻り値を宣言するツールは、エラーオブジェクトをresolveする場合があります。resolveされたPromiseをすべて成功とせず、bash.exit_code、製品結果の状態、MCPのisErrorを確認します。構造化結果はスクリプトで調べるためのものです。リモート応答全体を出すより、有用な部分をtextで出力します。
出力と分岐内の値
| グローバル | 用途 |
|---|---|
text(value) | テキストを追加。オブジェクトはJSON化 |
image(dataURLOrBlock) | base64のPNG/JPEG/GIF/WebP画像を追加し、一時画像ファイルを保存。リモートURLは拒否 |
console.log(...) | コンソール出力ブロックに診断を追加 |
return value | 戻り値を出力に追加 |
exit() | スクリプトを正常終了 |
store(key, value) / load(key) | 文字列キーでJSONシリアライズ可能な値を保存/取得。undefinedで削除 |
成功したstore変更は選択中の会話分岐に確定します。別分岐を読み込むとその分岐の確定値を使い、DBを開き直しても保持されます。エラー、キャンセル、タイムアウトでは現在スクリプトの未確定変更を破棄します。完了済みツールの作用は取り消しません。
保存する各JSON値は最大262144文字、キーとシリアライズ値の合計は最大1048576文字です。完全なファイルや認証情報ではなく小さな状態を保存します。VMのメモリ上限は256 MiBです。出力の厳密な上限は16777216 JavaScript文字または出力/console呼び出し100000回で、超えるとスクリプトが失敗します。
失敗スクリプトはエラーと一部出力を返す場合があります。テキスト予算による短縮では先頭/末尾抜粋と一時的な全文パスを示します。ファイルが存在する間にreadのoffset/limitで読みます。一時出力パスは永続添付を保証しません。保存済み論理結果参照とコンテキスト予算はツール結果を参照してください。
分類・画像モデルAPI
Codemode内には次の非同期モデルAPIもあります。ツール説明は、同梱の読み取り可能な参照<ProfileHome>/system/docs/pi-v1.2.0/codemode.mdを示します。使用前に完全なスキーマを読んでください。
| API | 引数 |
|---|---|
models.getModelsOfType(type, provider?) | 設定済みモデルを一覧表示 |
models.getAvailableOfType(type, provider?) | 有効なプロバイダーとローカル解決可能な認証情報で絞る。リモートのヘルスプローブではない |
models.getModelOfType(type, provider, id) | 3つの独立文字列で1モデルを検索。未知ならundefined |
models.classify(model, context) | 設定済み分類モデルを使用 |
models.generateImages(model, context) | 設定済み画像モデルを使用 |
型はchat、image、classifierです。chatモデルを列挙してもチャット生成関数は公開されません。実行にはカタログのproviderとidを持つモデルオブジェクトが必要で、結合したprovider/id文字列や独自エンドポイントは使いません。
分類のcontext.stateはオブジェクトで、任意のimagesにはbase64画像ブロックを入れます。questionsは空でないオブジェクトです。各質問はinstructions、type、criteriaを持ちます。choiceはラベルと意味の対応、scoreは低から高への段階、boolはtrueとfalseの文字列の意味を定義します。
const available = await models.getAvailableOfType("classifier");
if (!available.length) { text("No configured classifier is available"); exit(); }
const result = await models.classify(available[0], {
state: {subject: "Move tomorrow's meeting to Friday"},
questions: {
scheduling: {
type: "bool", instructions: "Does this request change a meeting?",
criteria: {true: "A meeting change is requested", false: "No meeting change"}
}
}
});
if (result.stopReason !== "stop") throw new Error(result.errorMessage || result.stopReason);
text(result);
生成には{input: [{type: "text", text: "..."}]}を渡し、base64画像ブロックを参照に使えます。例:
const available = await models.getAvailableOfType("image");
if (!available.length) { text("No configured image model is available"); exit(); }
const result = await models.generateImages(available[0], {
input: [{type: "text", text: "A simple blue bird icon on white"}]
});
if (result.stopReason !== "stop") throw new Error(result.errorMessage || result.stopReason);
for (const part of result.output) {
if (part.type === "image") image(part);
else if (part.type === "text") text(part.text);
}
1スクリプト内で同時実行できる分類/画像操作は最大4件です。プロバイダー失敗はstopReason: "error"または"aborted"とerrorMessageを持つ結果になり、不正引数はプロバイダー呼び出し前にrejectされる場合があります。モデル使用量はCodemode結果に合算されます。可用性、課金、受け付ける画像入力は設定プロバイダーによって異なります。