shitton of the ai changes
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
const {
|
||||
buildToolRankerSystemPrompt,
|
||||
getToolRankerAvailableToolInfos,
|
||||
sanitizeToolRankerResult,
|
||||
} = await import("../dist/ai/tool-ranker-metadata.js");
|
||||
|
||||
function toolInfos(...toolTypes) {
|
||||
return getToolRankerAvailableToolInfos(toolTypes.map(type => ({type})));
|
||||
}
|
||||
|
||||
function promptFor(...toolTypes) {
|
||||
return buildToolRankerSystemPrompt({
|
||||
availableTools: toolInfos(...toolTypes),
|
||||
includeExamples: true,
|
||||
maxExamplesPerTool: 1,
|
||||
compact: true,
|
||||
});
|
||||
}
|
||||
|
||||
test("prompt contains only available tools", () => {
|
||||
const prompt = promptFor("no_tool", "get_datetime", "image_generation", "code_interpreter", "file_search");
|
||||
|
||||
assert.ok(prompt.includes("no_tool"));
|
||||
assert.ok(prompt.includes("get_datetime"));
|
||||
assert.ok(prompt.includes("image_generation"));
|
||||
assert.ok(prompt.includes("code_interpreter"));
|
||||
assert.ok(prompt.includes("file_search"));
|
||||
assert.ok(!prompt.includes("get_weather"));
|
||||
assert.ok(!prompt.includes("python_interpreter"));
|
||||
});
|
||||
|
||||
test("prompt does not contain disabled tools", () => {
|
||||
const prompt = promptFor("no_tool", "read_file", "search_files");
|
||||
|
||||
assert.ok(prompt.includes("read_file"));
|
||||
assert.ok(prompt.includes("search_files"));
|
||||
assert.ok(!prompt.includes("get_weather"));
|
||||
assert.ok(!prompt.includes("shell_execute"));
|
||||
assert.ok(!prompt.includes("python_interpreter"));
|
||||
});
|
||||
|
||||
test("examples are filtered when tools are unavailable", () => {
|
||||
const prompt = promptFor("no_tool", "read_file", "search_files");
|
||||
|
||||
assert.ok(prompt.includes("прочитай src/index.ts"));
|
||||
assert.ok(prompt.includes("найди где используется sendMessage"));
|
||||
assert.ok(!prompt.includes("погода завтра"));
|
||||
assert.ok(!prompt.includes("выполни этот python код"));
|
||||
});
|
||||
|
||||
test("prompt includes image generation routing example", () => {
|
||||
const prompt = promptFor("no_tool", "image_generation");
|
||||
|
||||
assert.ok(prompt.includes("сделай его лысым"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["image_generation"]})));
|
||||
});
|
||||
|
||||
test("prompt includes weather routing example", () => {
|
||||
const prompt = promptFor("no_tool", "get_weather");
|
||||
|
||||
assert.ok(prompt.includes("погода завтра"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["get_weather"]})));
|
||||
});
|
||||
|
||||
test("prompt includes web search routing example for current information", () => {
|
||||
const prompt = promptFor("no_tool", "web_search");
|
||||
|
||||
assert.ok(prompt.includes("найди актуальную документацию OpenAI API"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["web_search"]})));
|
||||
});
|
||||
|
||||
test("prompt includes read file routing example for known file paths", () => {
|
||||
const prompt = promptFor("no_tool", "read_file");
|
||||
|
||||
assert.ok(prompt.includes("прочитай src/index.ts"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["read_file"]})));
|
||||
});
|
||||
|
||||
test("prompt includes search files routing example for usage search", () => {
|
||||
const prompt = promptFor("no_tool", "search_files");
|
||||
|
||||
assert.ok(prompt.includes("найди где используется sendMessage"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["search_files"]})));
|
||||
});
|
||||
|
||||
test("prompt includes edit file patch routing example for targeted edits", () => {
|
||||
const prompt = promptFor("no_tool", "edit_file_patch");
|
||||
|
||||
assert.ok(prompt.includes("исправь этот баг патчем"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["edit_file_patch"]})));
|
||||
});
|
||||
|
||||
test("prompt includes update file routing example for full overwrite", () => {
|
||||
const prompt = promptFor("no_tool", "update_file");
|
||||
|
||||
assert.ok(prompt.includes("полностью перезапиши config.json"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["update_file"]})));
|
||||
});
|
||||
|
||||
test("prompt includes delete path caution for explicit deletion only", () => {
|
||||
const prompt = promptFor("no_tool", "delete_path");
|
||||
|
||||
assert.ok(prompt.includes("delete_path only when the user clearly asks to delete or remove something."));
|
||||
assert.ok(prompt.includes("удали папку dist"));
|
||||
assert.ok(prompt.includes(JSON.stringify({toolNames: ["delete_path"]})));
|
||||
});
|
||||
|
||||
test("sanitizer returns no_tool for normal explanation", () => {
|
||||
const result = sanitizeToolRankerResult({
|
||||
raw: "объясни docker volumes",
|
||||
availableToolNames: ["read_file", "search_files"],
|
||||
});
|
||||
|
||||
assert.deepEqual(result, ["no_tool"]);
|
||||
});
|
||||
|
||||
test("sanitizer removes unavailable tools", () => {
|
||||
const result = sanitizeToolRankerResult({
|
||||
raw: JSON.stringify({toolNames: ["read_file", "missing_tool"]}),
|
||||
availableToolNames: ["read_file"],
|
||||
});
|
||||
|
||||
assert.deepEqual(result, ["read_file"]);
|
||||
});
|
||||
|
||||
test("sanitizer deduplicates tools", () => {
|
||||
const result = sanitizeToolRankerResult({
|
||||
raw: JSON.stringify({toolNames: ["read_file", "read_file", "search_files"]}),
|
||||
availableToolNames: ["read_file", "search_files"],
|
||||
});
|
||||
|
||||
assert.deepEqual(result, ["read_file", "search_files"]);
|
||||
});
|
||||
|
||||
test("sanitizer handles malformed output", () => {
|
||||
const result = sanitizeToolRankerResult({
|
||||
raw: "```json\nnot json\n```",
|
||||
availableToolNames: ["read_file"],
|
||||
});
|
||||
|
||||
assert.deepEqual(result, ["no_tool"]);
|
||||
});
|
||||
|
||||
test("sanitizer removes no_tool when mixed with real tools", () => {
|
||||
const result = sanitizeToolRankerResult({
|
||||
raw: JSON.stringify({toolNames: ["no_tool", "read_file"]}),
|
||||
availableToolNames: ["read_file"],
|
||||
});
|
||||
|
||||
assert.deepEqual(result, ["read_file"]);
|
||||
});
|
||||
Reference in New Issue
Block a user