feat: 更新 @kevisual/js-filter 依赖至 0.0.6,重构 runAgent 和 createTools 函数以支持 token 参数
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"private": true,
|
"private": true,
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@kevisual/js-filter": "^0.0.5",
|
"@kevisual/js-filter": "^0.0.6",
|
||||||
"@kevisual/router": "^0.1.0",
|
"@kevisual/router": "^0.1.0",
|
||||||
"@types/bun": "latest",
|
"@types/bun": "latest",
|
||||||
"dotenv": "^17.3.1",
|
"dotenv": "^17.3.1",
|
||||||
|
|||||||
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -28,8 +28,8 @@ importers:
|
|||||||
version: 5.9.3
|
version: 5.9.3
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@kevisual/js-filter':
|
'@kevisual/js-filter':
|
||||||
specifier: ^0.0.5
|
specifier: ^0.0.6
|
||||||
version: 0.0.5
|
version: 0.0.6
|
||||||
'@kevisual/router':
|
'@kevisual/router':
|
||||||
specifier: ^0.1.0
|
specifier: ^0.1.0
|
||||||
version: 0.1.0
|
version: 0.1.0
|
||||||
@@ -82,8 +82,8 @@ packages:
|
|||||||
'@kevisual/ai@0.0.26':
|
'@kevisual/ai@0.0.26':
|
||||||
resolution: {integrity: sha512-lhaMpxi+vgqPdyBKiuNbSil4hy13tNLbDiqCtG0qUXKtvoowK6xMx269pSSYkYBivczM8g8I0XEouuJceUpJPg==}
|
resolution: {integrity: sha512-lhaMpxi+vgqPdyBKiuNbSil4hy13tNLbDiqCtG0qUXKtvoowK6xMx269pSSYkYBivczM8g8I0XEouuJceUpJPg==}
|
||||||
|
|
||||||
'@kevisual/js-filter@0.0.5':
|
'@kevisual/js-filter@0.0.6':
|
||||||
resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==}
|
resolution: {integrity: sha512-FcbOsmS1inhwrfgXMM/XLFTGTHUxBCss32JEMYdEFWQDYCar5rN8cxD1W8FuKDTVRlpA+zBpQ/BE6XT4UaeljA==}
|
||||||
|
|
||||||
'@kevisual/logger@0.0.4':
|
'@kevisual/logger@0.0.4':
|
||||||
resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==}
|
resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==}
|
||||||
@@ -192,7 +192,7 @@ snapshots:
|
|||||||
'@kevisual/permission': 0.0.4
|
'@kevisual/permission': 0.0.4
|
||||||
'@kevisual/query': 0.0.52
|
'@kevisual/query': 0.0.52
|
||||||
|
|
||||||
'@kevisual/js-filter@0.0.5': {}
|
'@kevisual/js-filter@0.0.6': {}
|
||||||
|
|
||||||
'@kevisual/logger@0.0.4': {}
|
'@kevisual/logger@0.0.4': {}
|
||||||
|
|
||||||
|
|||||||
@@ -3,18 +3,20 @@ import { cnb, proxyCnb, models, showMore } from '../common.ts';
|
|||||||
import { runAgent } from './lib.ts';
|
import { runAgent } from './lib.ts';
|
||||||
|
|
||||||
const result = await runAgent({
|
const result = await runAgent({
|
||||||
app,
|
app: app as any,
|
||||||
query:"WHERE path='task' AND key='today'",
|
// query: "WHERE path='task' AND key='today'",
|
||||||
languageModel: proxyCnb(models['auto']),
|
// languageModel: proxyCnb('auto'),
|
||||||
|
languageModel: cnb('auto'),
|
||||||
messages: [
|
messages: [
|
||||||
{
|
{
|
||||||
role: 'user',
|
role: 'user',
|
||||||
content: '任务步骤:第一步获取今天的任务列表,第二步完成id为1的任务。'
|
content: '任务步骤:第一步获取今天的任务列表,第二步完成id为1的任务。'
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
token: ''
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log('最终结果:', result.text);
|
console.log('最终结果:', result);
|
||||||
|
|
||||||
console.log('=== 生成内容详情 ===');
|
console.log('=== 生成内容详情 ===');
|
||||||
console.log(showMore(result.steps));
|
console.log(showMore(result));
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { App } from '@kevisual/router'
|
import { App } from '@kevisual/router'
|
||||||
import z from 'zod';
|
import z from 'zod';
|
||||||
|
import { filter } from '@kevisual/js-filter';
|
||||||
export const app = new App();
|
export const app = new App();
|
||||||
|
|
||||||
const tasks = [
|
const tasks = [
|
||||||
@@ -64,4 +64,7 @@ app.route({
|
|||||||
completed: task.completed,
|
completed: task.completed,
|
||||||
}))
|
}))
|
||||||
ctx.body = { list }
|
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 })));
|
||||||
@@ -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 { generateText, tool, type ModelMessage, type LanguageModel, type GenerateTextResult } from 'ai';
|
||||||
import z from 'zod';
|
import z from 'zod';
|
||||||
import { filter } from '@kevisual/js-filter'
|
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 });
|
const route = app.findRoute({ path: message.path, key: message.key });
|
||||||
if (!route) {
|
if (!route) {
|
||||||
console.error(`未找到路径 ${message.path} 和 key ${message.key} 的路由`);
|
console.error(`未找到路径 ${message.path} 和 key ${message.key} 的路由`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const _tool = tool({
|
const _tool = tool({
|
||||||
description: route.description || '无描述',
|
description: route?.metadata?.summary || route?.description || '无描述',
|
||||||
inputSchema: z.object({
|
inputSchema: z.object({
|
||||||
...route.metadata?.args
|
...route.metadata?.args
|
||||||
}), // 这里可以根据实际需要定义输入参数的 schema
|
}), // 这里可以根据实际需要定义输入参数的 schema
|
||||||
execute: async (args: any) => {
|
execute: async (args: any) => {
|
||||||
console.log(`执行工具 ${message.path} ${message.key},输入参数:`, args);
|
const res = await app.run({ path: message.path, key: message.key, payload: args, token: message.token });
|
||||||
// 这里可以根据实际需要调用对应的路由处理函数
|
|
||||||
const res = await app.run({ path: message.path, key: message.key, payload: args });
|
|
||||||
// 假设路由处理函数返回一个字符串结果
|
|
||||||
console.log(`工具 ${message.path} ${message.key} 执行结果:`, res);
|
|
||||||
// return '任务列表:' + JSON.stringify(res);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return _tool;
|
return _tool;
|
||||||
}
|
}
|
||||||
|
|
||||||
const createTools = async (app: App) => {
|
const createTools = async (opts: { app: QueryRouterServer, token: string }) => {
|
||||||
|
const { app, token } = opts;
|
||||||
const tools: Record<string, any> = {};
|
const tools: Record<string, any> = {};
|
||||||
for (const route of app.routes) {
|
for (const route of app.routes) {
|
||||||
const id = route.id!;
|
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) {
|
if (_tool && id) {
|
||||||
tools[id] = _tool;
|
tools[id] = _tool;
|
||||||
}
|
}
|
||||||
@@ -38,8 +34,11 @@ const createTools = async (app: App) => {
|
|||||||
return tools;
|
return tools;
|
||||||
}
|
}
|
||||||
type Route = Partial<RouteInfo>
|
type Route = Partial<RouteInfo>
|
||||||
|
type AgentResult = {
|
||||||
export const reCallAgent = async (opts: { messages?: ModelMessage[], tools?: Record<string, any>, languageModel: LanguageModel }): Promise<GenerateTextResult<Record<string, any>, any>> => {
|
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 { messages = [], tools = {}, languageModel } = opts;
|
||||||
const result = await generateText({
|
const result = await generateText({
|
||||||
model: languageModel,
|
model: languageModel,
|
||||||
@@ -51,16 +50,16 @@ export const reCallAgent = async (opts: { messages?: ModelMessage[], tools?: Rec
|
|||||||
messages.push(...result.response.messages);
|
messages.push(...result.response.messages);
|
||||||
return reCallAgent({ messages, tools, languageModel });
|
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;
|
const { app, languageModel } = opts;
|
||||||
let messages = opts.messages || [];
|
let messages = opts.messages || [];
|
||||||
|
|
||||||
let routes = app.routes;
|
let routes = opts?.routes || app.routes;
|
||||||
if (opts.query) {
|
if (opts.query) {
|
||||||
routes = filter(routes, 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 });
|
return await reCallAgent({ messages, tools, languageModel });
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user