🤖

AI による自然言語アサーション

に公開

claude-code sdk を使えば、TypeScirpt/Python コードから claude-code を呼べる。

これを使って、自動テスト中に自然言語によるアサーションをするという、(最悪な)アイデアを思いついたのでメモしておく。

https://docs.anthropic.com/ja/docs/claude-code/sdk#基本的なsdkの使用方法

// 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