import { tool } from 'ai'; import { z } from 'zod'; import { AiApiError } from '../ai-shared/AiError'; import type { KnowledgeRepository } from './KnowledgeRepository'; export function createKnowledgeTools(repository: KnowledgeRepository) { return { listKnowledgeFiles: tool({ description: '列出企业知识库中的可用文件。回答需要知识库事实的问题前先查看可用文件。', inputSchema: z.object({ dir: z.string().optional().describe('相对知识库根的目录;省略时列出全部根'), }), execute: ({ dir }, { abortSignal }) => safeToolResult(() => ( repository.listFiles(dir, abortSignal) )), }), readKnowledgeFile: tool({ description: '按相对路径读取知识库文件;文件较大时根据 nextOffset 分块续读。', inputSchema: z.object({ path: z.string().min(1).describe('listKnowledgeFiles 返回的相对路径'), offset: z.number().int().nonnegative().optional().describe('UTF-8 字节偏移'), }), execute: ({ path, offset }, { abortSignal }) => safeToolResult(() => ( repository.readFile(path, offset, abortSignal) )), }), searchKnowledge: tool({ description: '在企业知识库中搜索关键词,返回文件、行号和片段。', inputSchema: z.object({ keyword: z.string().min(2).max(64).describe('要搜索的关键词'), }), execute: ({ keyword }, { abortSignal }) => safeToolResult(() => ( repository.search(keyword, abortSignal) )), }), }; } function safeToolResult(operation: () => T): T | { error: { code: number; message: string } } { try { return operation(); } catch (error) { if (error instanceof AiApiError) { return { error: { code: error.code, message: error.message } }; } return { error: { code: 4505, message: '知识库工具执行失败' } }; } }