sum の問(10 行ほどのプログラム)では、モデルとエージェントの組の向き不向きが分かった。
実際の作業に近い、数十行で、待ち受けと通信を含み、仕様を満たすかを外から確かめられるプログラムを書かせ、どの組が「使える」かを確かめる。
題材は HTTP のプロキシサーバ。標準の http・net モジュールだけで書け、正しく動くかを試験側で機械的に確かめられる。あわせて、作ったものの仕様書を書かせる。
2 つの試験に分ける。HTTPS を通すには CONNECT の扱いを指示する必要があり、1 つ目の指示文では仕様が足りないため。どちらも、エージェントには次の指示文だけを渡す(sum と同じく補足の文や例は付けない)。
Node.js の標準モジュールだけで HTTP のプロキシサーバを proxy.js に書く。127.0.0.1 の 18080 番で待ち受け、受けたリクエストを URL の宛先へ転送し、応答をそのまま返す。node proxy で起動する。仕様書を proxy.md と proxy.html に書く。書いたら起動はしたままにせず終える
Node.js の標準モジュールだけで HTTP と HTTPS のプロキシサーバを proxy.js に書く。127.0.0.1 の 18080 番で待ち受ける。HTTP は受けたリクエストを URL の宛先へ転送し、応答をそのまま返す。HTTPS は CONNECT を受けて宛先との TCP の接続をつなぎ、双方向にそのまま中継する(中身は復号しない)。node proxy で起動する。仕様書を proxy.md と proxy.html に書く。書いたら起動はしたままにせず終える
エージェントが終わったあと、試験側で次を順に行う。
proxy.js・proxy.md・proxy.html があるかGET /hello に決めた文字列、POST /echo に受けた本文をそのまま返すnode proxy を起動し、18080 番が開くまで最大 10 秒待つ| 記号 | 送るもの | 正しい応答 | 試験 1 | 試験 2 |
|---|---|---|---|---|
| local-get | GET http://127.0.0.1:<宛先>/hello | 200 と決めた文字列 | ○ | ○ |
| local-post | POST http://127.0.0.1:<宛先>/echo(日本語を含む本文) | 同じ本文 | ○ | ○ |
| local-404 | GET http://127.0.0.1:<宛先>/missing | 宛先の 404 がそのまま返る | ○ | ○ |
| ext-http | GET http://example.com/ | 200 と Example Domain を含む本文 | ○ | ○ |
| ext-https | CONNECT example.com:443 を経て https://example.com/ | 200 と Example Domain を含む本文(証明書の検証も通る) | — | ○ |
試験 1 で ext-https も送り、通らないこと(CONNECT を扱わない)を記録する。合否には入れない。
proxy.md と proxy.html の両方がある127.0.0.1・18080)と起動の方法(node proxy)が書いてある。試験 2 では、さらに CONNECT が書いてあるproxy.html がブラウザで開ける HTML になっている(<html と </html> がある)| 印 | 条件 |
|---|---|
| ✅ 合格 | その試験の送るものがすべて正しく返り、仕様書の判定を満たし、エージェントの作業ログに node で動かして確かめた跡がある |
| ☑️ 補欠合格 | 送るものはすべて通り仕様書もあるが、自分では動かしていない |
| ⚠️ 一部 | 一部だけ通る、または仕様書が欠けている(どれが欠けたかを記録する) |
| ❌ 不合格 | proxy.js が無い、起動しない、どれも通らない |
| ⏱️ 時間切れ | エージェントが時間内に終わらない(サーバを起動したまま待ち続けた場合も含む) |
判定の関数は sum-judge.ps1 と同じく別の関数にし、テストを先に書く(正しいプロキシ・GET しか通さないプロキシ・CONNECT も通すプロキシ・起動しない proxy.js・仕様書の欠けた組を試験用に用意して、それぞれの印になることを確かめる)。
-Tests proxy・-Tests proxy-https を足す(test-agents.ps1・test-cc-tools.ps1)Test-LlmPortFree)--allowedTools "Bash(node:*)" で node だけを許している。プロキシを試すのに curl を使おうとした場合は止められる。止められた回数も記録する