Slide 1

Slide 1 text

go-spidermonkeyでAIエージェントの Code Modeを実装する 2026-8-24 layerx.go #5 @syumai

Slide 2

Slide 2 text

whoami syumai LayerX ソフトウェアエンジニア バクラクヘルプデスク エージェントを開発中 Asakusa.go / ECMAScript 仕様輪読会 主催 X: @__syumai Website: https://syum.ai © LayerX Inc.

Slide 3

Slide 3 text

Code Modeとは?

Slide 4

Slide 4 text

Code Modeとは? 「LLMに個々のツール呼び出しを生成させる」のではなく、「ツールを呼び出すコード を書かせ、そのコードをSandboxで実行する」 方式 生成されるのは基本的にJavaScriptのコード 2025年9月にCloudflare Blogで紹介された https://blog.cloudflare.com/code-mode/ 先行研究に、CodeActという手法があった https://proceedings.mlr.press/v235/wang24h.html © LayerX Inc. 4

Slide 5

Slide 5 text

https://blog.cloudflare.com/code-mode/ © LayerX Inc. 5

Slide 6

Slide 6 text

Code Modeによる実行の例

Slide 7

Slide 7 text

ツール定義のイメージ © LayerX Inc. 7

Slide 8

Slide 8 text

ツールのTypeScript関数への変換のイメージ © LayerX Inc. 8

Slide 9

Slide 9 text

Code Modeによるツールの呼び出しイメージ © LayerX Inc. 9

Slide 10

Slide 10 text

Code Modeの優れた点

Slide 11

Slide 11 text

Code Modeの優れた点 中間結果をLLMのContextに持たない 複雑なツール呼び出しをコードとして合成できる LLMが得意なコード生成を活用できる © LayerX Inc. 11

Slide 12

Slide 12 text

1. 中間結果をLLMのContextに持たない 通常のTool Callingでは、ツールの結果が毎回LLMに戻る。 © LayerX Inc. 12

Slide 13

Slide 13 text

1. 中間結果をLLMのContextに持たない Code Modeでは、中間結果をSandbox内に保持できる。 © LayerX Inc. 13

Slide 14

Slide 14 text

2. 複雑なツール呼び出しをコードとして合成できる 以下のような、複数回のツール呼び出しを map で表現し、結果のソートを配列の sort で表現したりできる 決定的な処理をLLMに任せなくていい © LayerX Inc. 14

Slide 15

Slide 15 text

3. LLMが得意なコード生成を活用できる 通常のTool Callingでは、ツール呼び出し固有の形式を生成する。 © LayerX Inc. など。この部分は変わりうる 15

Slide 16

Slide 16 text

3. LLMが得意なコード生成を活用できる Code Modeでは普通のコードを書く コードには大量の学習データが存在 LLMのプログラミング能力をそのまま活用可能 → 「ツールを呼ぶ能力」を「コードを書く能力」に寄せられる © LayerX Inc. 16

Slide 17

Slide 17 text

Code Modeの優れた点 ツール呼び出しの中間結果と制御フローをLLMのContextから実行環境へ移すことがで きる トークン効率や実行時間などのパフォーマンスが向上することが期待できる © LayerX Inc. 17

Slide 18

Slide 18 text

直近の話題: Vercel AI SDKのCode Modeサポート TypeScript向けのAI機能提供ライブラリとして最も有名なVercel AI SDKがCode Mode をサポートした Cloudflareがブログで示していたのはMCP toolにおけるユースケースだが、Vercel AI SDKはMCPに限らないツールのコード変換を対象としている Cloudflareに留まらず、活用が進んでいる https://ai-sdk.dev/docs/ai-sdk-core/code-mode © LayerX Inc. 18

Slide 19

Slide 19 text

Go製のエージェントでCode Modeを使うには?

Slide 20

Slide 20 text

Go製のエージェントでCode Modeを使うには? LLMが生成したコードを実行するSandboxが必要 Code Modeでは、関数に変換したツールの呼び出しくらいのライトなコードしか記述さ れない インタプリタ型言語が適切 いちいちコンテナを立ち上げると時間がかかる Go向けの軽量Sandbox実装が豊富なJavaScriptが有力な選択肢 © LayerX Inc. 20

Slide 21

Slide 21 text

Go製のJavaScriptインタプリタ実装

Slide 22

Slide 22 text

Go製のJavaScriptインタプリタ実装 いくつか存在する 特に有名なものはgoja https://github.com/dop251/goja 今回はgoccy/go-spidermonkeyを選択 https://github.com/goccy/go-spidermonkey © LayerX Inc. 22

Slide 23

Slide 23 text

go-spidermonkey FirefoxのJSエンジンのSpiderMonkeyを丸ごとPure Goに変換したライブラリ SpiderMonkeyベースなので、test262 (ECMAScript互換性テスト) のスコアが高い Web API / Node.js互換機能も一部提供 デフォルトでOSやネットワークへのバインディングを持たないので安全 Optionalで追加可能 goccyさん製 © LayerX Inc. 23

Slide 24

Slide 24 text

go-spidermonkey の基本的な使い方 spidermonkey.New でインスタンスを生成し、 Eval メソッド呼び出しで実行 実行結果は .String() / .Float() / .Object() などで取り出す © LayerX Inc. 24

Slide 25

Slide 25 text

Go側の関数のJSへの公開 Global().DefineFunc でGo側の関数をJSに公開できる 引数の取り出し方も実行結果の取り出し方と同様 © LayerX Inc. 25

Slide 26

Slide 26 text

GoによるCode Mode付きエージェントの実装例

Slide 27

Slide 27 text

実装例: funcbox-agent https://github.com/syumai/funcbox-agent syumaiが開発中のfuncboxというサーバーレス関数プラットフォームのエージェント funcboxにワークスペースを追加したり、関数をデプロイしたりするMCP tool実装を持つ エージェントとしては、チャット形式のUIを提供している © LayerX Inc. 27

Slide 28

Slide 28 text

funcbox-agentのアーキテクチャ Backend: Genkit Go https://github.com/genkit-ai/genkit/tree/main/go Backend (Sandbox): go-spidermonkey Frontend: Vercel AI SDK + @genkit-ai/vercel-ai/client Genkitが公式でVercel AI SDKとのストリーム変換アダプタを提供している © LayerX Inc. 28

Slide 29

Slide 29 text

デモ

Slide 30

Slide 30 text

funcbox-agentの実装解説

Slide 31

Slide 31 text

run_js tool エージェントが公開するツールは run_js の1つだけ LLMがツール呼び出しをまとめて記述したコードを1回で実行する © LayerX Inc. 31

Slide 32

Slide 32 text

MCP toolのTypeScript型定義への変換 各MCP toolのJSON Schemaを、起動時にTSの型定義へ変換し、コード生成に利用して いる run_js © LayerX Inc. toolのdescriptionに埋め込み、LLMに型付きのシグネチャとして見せている 32

Slide 33

Slide 33 text

LLMが生成するJavaScriptコード例 © LayerX Inc. 33

Slide 34

Slide 34 text

ツール呼び出し用関数のGoからJSへの公開 を使って、JSからGo側にあるMCP tool呼び出し関数を呼び出すバイ ンディングを行っている Global().DefineFunc : MCP toolの実呼び出し。Go側で CallTool を実行し、結果をPromiseとしてJSに返す この関数が funcbox.listFunctions({}) などの内部で呼ばれる __fbx_call(name, argsJSON) © LayerX Inc. 34

Slide 35

Slide 35 text

ツール呼び出し用関数のGoからJSへの公開 © LayerX Inc. 35

Slide 36

Slide 36 text

まとめ Code Modeを使うことで、エージェントからのツール呼び出しを効率化できる Code Mode用のコードの実行にはJavaScriptを使うのが楽 Go環境下でのJS Sandboxとして、go-spidermonkeyが使える © LayerX Inc. 36