From 77dc9e7f813a7212d6e315f319a32a948bcbf9b7 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Wed, 11 Mar 2026 01:45:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20@kevisual/js-filte?= =?UTF-8?q?r=20=E4=BE=9D=E8=B5=96=E8=87=B3=200.0.6=EF=BC=8C=E9=87=8D?= =?UTF-8?q?=E6=9E=84=20runAgent=20=E5=92=8C=20createTools=20=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=BB=A5=E6=94=AF=E6=8C=81=20token=20=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/routes/ai2.ts | 14 ++++++++------ src/routes/app.ts | 7 +++++-- src/routes/lib.ts | 33 ++++++++++++++++----------------- 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 553ad54..415df6e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "type": "module", "private": true, "devDependencies": { - "@kevisual/js-filter": "^0.0.5", + "@kevisual/js-filter": "^0.0.6", "@kevisual/router": "^0.1.0", "@types/bun": "latest", "dotenv": "^17.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83bb0c6..f14920b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,8 +28,8 @@ importers: version: 5.9.3 devDependencies: '@kevisual/js-filter': - specifier: ^0.0.5 - version: 0.0.5 + specifier: ^0.0.6 + version: 0.0.6 '@kevisual/router': specifier: ^0.1.0 version: 0.1.0 @@ -82,8 +82,8 @@ packages: '@kevisual/ai@0.0.26': resolution: {integrity: sha512-lhaMpxi+vgqPdyBKiuNbSil4hy13tNLbDiqCtG0qUXKtvoowK6xMx269pSSYkYBivczM8g8I0XEouuJceUpJPg==} - '@kevisual/js-filter@0.0.5': - resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==} + '@kevisual/js-filter@0.0.6': + resolution: {integrity: sha512-FcbOsmS1inhwrfgXMM/XLFTGTHUxBCss32JEMYdEFWQDYCar5rN8cxD1W8FuKDTVRlpA+zBpQ/BE6XT4UaeljA==} '@kevisual/logger@0.0.4': resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==} @@ -192,7 +192,7 @@ snapshots: '@kevisual/permission': 0.0.4 '@kevisual/query': 0.0.52 - '@kevisual/js-filter@0.0.5': {} + '@kevisual/js-filter@0.0.6': {} '@kevisual/logger@0.0.4': {} diff --git a/src/routes/ai2.ts b/src/routes/ai2.ts index de08d43..399937e 100644 --- a/src/routes/ai2.ts +++ b/src/routes/ai2.ts @@ -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)); \ No newline at end of file +console.log(showMore(result)); \ No newline at end of file diff --git a/src/routes/app.ts b/src/routes/app.ts index eb06536..5a698df 100644 --- a/src/routes/app.ts +++ b/src/routes/app.ts @@ -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) \ No newline at end of file +}).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 }))); \ No newline at end of file diff --git a/src/routes/lib.ts b/src/routes/lib.ts index afa727c..2a80a18 100644 --- a/src/routes/lib.ts +++ b/src/routes/lib.ts @@ -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 = {}; 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 - -export const reCallAgent = async (opts: { messages?: ModelMessage[], tools?: Record, languageModel: LanguageModel }): Promise, any>> => { +type AgentResult = { + result: GenerateTextResult, any>, + messages: ModelMessage[], +} +export const reCallAgent = async (opts: { messages?: ModelMessage[], tools?: Record, languageModel: LanguageModel }): Promise => { 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 }); }