feat: 更新 @kevisual/js-filter 依赖至 0.0.6,重构 runAgent 和 createTools 函数以支持 token 参数

This commit is contained in:
2026-03-11 01:45:13 +08:00
parent a06081dc19
commit 77dc9e7f81
5 changed files with 35 additions and 31 deletions

View File

@@ -3,18 +3,20 @@ import { cnb, proxyCnb, models, showMore } from '../common.ts';
import { runAgent } from './lib.ts';
const result = await runAgent({
app,
query:"WHERE path='task' AND key='today'",
languageModel: proxyCnb(models['auto']),
app: app as any,
// query: "WHERE path='task' AND key='today'",
// languageModel: proxyCnb('auto'),
languageModel: cnb('auto'),
messages: [
{
role: 'user',
content: '任务步骤:第一步获取今天的任务列表,第二步完成id为1的任务。'
}
]
],
token: ''
})
console.log('最终结果:', result.text);
console.log('最终结果:', result);
console.log('=== 生成内容详情 ===');
console.log(showMore(result.steps));
console.log(showMore(result));

View File

@@ -1,6 +1,6 @@
import { App } from '@kevisual/router'
import z from 'zod';
import { filter } from '@kevisual/js-filter';
export const app = new App();
const tasks = [
@@ -64,4 +64,7 @@ app.route({
completed: task.completed,
}))
ctx.body = { list }
}).addTo(app)
}).addTo(app)
// const routes = filter(app.routes, 'WHERE path like "task2%"');
// console.log(routes.map(r => ({ path: r.path, key: r.key, description: r.description })));

View File

@@ -1,36 +1,32 @@
import { App, type RouteInfo } from '@kevisual/router'
import { type QueryRouterServer, type RouteInfo } from '@kevisual/router'
import { generateText, tool, type ModelMessage, type LanguageModel, type GenerateTextResult } from 'ai';
import z from 'zod';
import { filter } from '@kevisual/js-filter'
const createTool = async (app: App, message: { path: string, key: string }) => {
const createTool = async (app: QueryRouterServer, message: { path: string, key: string, token?: string }) => {
const route = app.findRoute({ path: message.path, key: message.key });
if (!route) {
console.error(`未找到路径 ${message.path} 和 key ${message.key} 的路由`);
return null;
}
const _tool = tool({
description: route.description || '无描述',
description: route?.metadata?.summary || route?.description || '无描述',
inputSchema: z.object({
...route.metadata?.args
}), // 这里可以根据实际需要定义输入参数的 schema
execute: async (args: any) => {
console.log(`执行工具 ${message.path} ${message.key},输入参数:`, args);
// 这里可以根据实际需要调用对应的路由处理函数
const res = await app.run({ path: message.path, key: message.key, payload: args });
// 假设路由处理函数返回一个字符串结果
console.log(`工具 ${message.path} ${message.key} 执行结果:`, res);
// return '任务列表:' + JSON.stringify(res);
const res = await app.run({ path: message.path, key: message.key, payload: args, token: message.token });
return res;
}
});
return _tool;
}
const createTools = async (app: App) => {
const createTools = async (opts: { app: QueryRouterServer, token: string }) => {
const { app, token } = opts;
const tools: Record<string, any> = {};
for (const route of app.routes) {
const id = route.id!;
const _tool = await createTool(app, { path: route.path!, key: route.key! });
const _tool = await createTool(app, { path: route.path!, key: route.key!, token });
if (_tool && id) {
tools[id] = _tool;
}
@@ -38,8 +34,11 @@ const createTools = async (app: App) => {
return tools;
}
type Route = Partial<RouteInfo>
export const reCallAgent = async (opts: { messages?: ModelMessage[], tools?: Record<string, any>, languageModel: LanguageModel }): Promise<GenerateTextResult<Record<string, any>, any>> => {
type AgentResult = {
result: GenerateTextResult<Record<string, any>, any>,
messages: ModelMessage[],
}
export const reCallAgent = async (opts: { messages?: ModelMessage[], tools?: Record<string, any>, languageModel: LanguageModel }): Promise<AgentResult> => {
const { messages = [], tools = {}, languageModel } = opts;
const result = await generateText({
model: languageModel,
@@ -51,16 +50,16 @@ export const reCallAgent = async (opts: { messages?: ModelMessage[], tools?: Rec
messages.push(...result.response.messages);
return reCallAgent({ messages, tools, languageModel });
}
return result
return { result, messages };
}
export const runAgent = async (opts: { app: App, messages?: ModelMessage[], routes?: Route[], query?: string, languageModel: LanguageModel }) => {
export const runAgent = async (opts: { app: QueryRouterServer, messages?: ModelMessage[], routes?: Route[], query?: string, languageModel: LanguageModel, token: string }) => {
const { app, languageModel } = opts;
let messages = opts.messages || [];
let routes = app.routes;
let routes = opts?.routes || app.routes;
if (opts.query) {
routes = filter(routes, opts.query);
};
const tools = await createTools(app);
const tools = await createTools({ app, token: opts.token });
return await reCallAgent({ messages, tools, languageModel });
}