🤖
AI による自然言語アサーション
claude-code sdk を使えば、TypeScirpt/Python コードから claude-code を呼べる。
これを使って、自動テスト中に自然言語によるアサーションをするという、(最悪な)アイデアを思いついたのでメモしておく。
// node --test ask-claude.test.ts
import { test } from "node:test";
import { query, type Options } from "@anthropic-ai/claude-code";
// claude-code が起動し、prompt が条件を満たしたら MARKER を投げて停止する。
async function assertAI(prompt: string, options: Options = {}): Promise<void> {
const MARKER = "**ASSERT_OK**";
const abortController = new AbortController();
const finalPrompt = `Assert user query. Return ${MARKER} if it is true. \n\n${prompt}`;
for await (const message of query({
prompt: finalPrompt,
options: {
maxTurns: 5,
cwd: process.cwd(),
abortController,
...options,
},
})) {
if (message.type === "assistant") {
const c = message.message.content;
const res: string = Array.isArray(c) ? c.map((c) => c.text).join("") : c;
if (res.includes(MARKER)) {
abortController.abort();
return;
}
}
}
throw new Error("No response");
}
test("Use assertAI", async (t) => {
// README.md があったらアサーションが通る。
// Read(*) でファイル読み書き権限を与えている
await assertAI(`Exists README.md`, {
allowedTools: ["Read(*)"],
});
});
/**
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 8802.512038
*/
本来ならミリ秒以下で fs.exists(Sync)
を使うだけではあるところが、なんと AI を使うと 8.8 秒かけてテストが通る。
...これはもはや自動テストなのかも怪しく、超富豪的なので、これを更に AI に自身でルールベースに書き換える、という実装とセットじゃないと使いたくない。超フレーキー。
Discussion