@h-ai/ai 0.1.0-alpha5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +1886 -0
- package/dist/ai-reasoning-types-ZRy23rSK.d.ts +2790 -0
- package/dist/ai-types-7iSHMnGM.d.ts +1095 -0
- package/dist/api/index.d.ts +628 -0
- package/dist/api/index.js +243 -0
- package/dist/api/index.js.map +1 -0
- package/dist/browser.d.ts +9 -0
- package/dist/browser.js +4 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-ABP7RKIP.js +311 -0
- package/dist/chunk-ABP7RKIP.js.map +1 -0
- package/dist/chunk-ZOTQ75VE.js +462 -0
- package/dist/chunk-ZOTQ75VE.js.map +1 -0
- package/dist/client/index.d.ts +266 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +5074 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/a2a/ai-a2a-server.ts","../src/a2a/ai-a2a-functions.ts","../src/compress/ai-compress-functions.ts","../src/llm/ai-llm-stream.ts","../src/context/ai-context-functions.ts","../src/embedding/ai-embedding-functions.ts","../src/file/ai-file-functions.ts","../src/knowledge/ai-knowledge-entity.ts","../src/knowledge/ai-knowledge-functions.ts","../src/llm/ai-llm-tool.ts","../src/llm/providers/ai-llm-provider-openai.ts","../src/llm/ai-llm-functions.ts","../src/mcp/ai-mcp-functions.ts","../src/memory/ai-memory-extractor.ts","../src/memory/ai-memory-functions.ts","../src/rag/ai-rag-functions.ts","../src/reasoning/ai-reasoning-functions.ts","../src/rerank/ai-rerank-functions.ts","../src/retrieval/ai-retrieval-functions.ts","../src/summary/ai-summary-functions.ts","../src/token/ai-token-functions.ts","../src/ai-functions.ts","../src/store/providers/ai-store-provider-db.ts","../src/ai-main.ts"],"names":["DefaultExecutionEventBusManager","DefaultRequestHandler","JsonRpcTransportHandler","ServerCallContextImpl","logger","core","ok","systemMessages","nonSystem","toSummarize","err","fullReply","model","usage","OpenAI","result","datapipe","zod","topK","countResult","count","vecdb"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/ai — A2A Server 创建与传输层\n *\n * 基于 `@a2a-js/sdk/server` 封装,提供便捷的 A2A 服务器创建和 SDK 再导出。\n * @module ai-a2a-server\n */\n\nimport type { AgentCard } from '@a2a-js/sdk'\n\nimport type { A2AAgentCardConfig } from './ai-a2a-types.js'\n\n// ─── SDK Server 导出 ───\n\nexport {\n A2AError,\n DefaultExecutionEventBus,\n DefaultExecutionEventBusManager,\n DefaultRequestHandler,\n ExecutionEventQueue,\n InMemoryPushNotificationStore,\n InMemoryTaskStore,\n JsonRpcTransportHandler,\n RequestContext,\n ResultManager,\n} from '@a2a-js/sdk/server'\n\nexport type {\n AgentExecutionEvent,\n AgentExecutor,\n ExecutionEventBus,\n ExecutionEventBusManager,\n PushNotificationSender,\n PushNotificationStore,\n ServerCallContext,\n TaskStore,\n} from '@a2a-js/sdk/server'\n\n// ─── 便捷工厂 ───\n\n/**\n * 从简化配置构建符合 SDK 规范的 AgentCard 对象\n *\n * @param config - 应用层提供的 Agent Card 配置\n * @returns 完整的 AgentCard 对象(可传给 DefaultRequestHandler)\n *\n * @example\n * ```ts\n * import { buildAgentCard } from '@h-ai/ai'\n *\n * const card = buildAgentCard({\n * name: 'my-agent',\n * description: 'An example agent',\n * url: 'https://example.com',\n * skills: [{ id: 'chat', name: 'Chat', description: 'General chat' }],\n * })\n * ```\n */\nexport function buildAgentCard(config: A2AAgentCardConfig): AgentCard {\n const card: AgentCard = {\n name: config.name,\n description: config.description ?? '',\n url: config.url,\n version: config.version ?? '1.0.0',\n protocolVersion: '0.3.0',\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n capabilities: {},\n skills: (config.skills ?? []).map(s => ({\n id: s.id,\n name: s.name,\n description: s.description ?? '',\n tags: s.tags ?? [],\n })),\n }\n\n // 声明安全认证方案到 Agent Card\n if (config.security?.apiKey) {\n const { in: location, name } = config.security.apiKey\n card.securitySchemes = {\n apiKey: { type: 'apiKey', in: location, name },\n }\n card.security = [{ apiKey: [] }]\n }\n\n return card\n}\n","/**\n * @h-ai/ai — A2A 子功能组装\n *\n * 实现 A2A 操作接口:RelDB 持久化 TaskStore、消息日志、远端调用。\n * 包含延迟初始化代理工厂(`createA2ALazyProxy`)和完整操作实例工厂(`createA2AOperations`)。\n * @module ai-a2a-functions\n */\n\nimport type { Message, Task } from '@a2a-js/sdk'\nimport type { AgentExecutor, ExecutionEventBus, ServerCallContext, TaskStore } from '@a2a-js/sdk/server'\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { A2AConfig } from '../ai-config.js'\n\nimport type { AIRelStore, AIStoreProvider } from '../store/ai-store-types.js'\nimport type {\n A2AAgentCardConfig,\n A2ACallOptions,\n A2ACallResult,\n A2AClientCallRecord,\n A2AHandleResult,\n A2AMessageRecord,\n A2AOperations,\n A2ATaskFilter,\n} from './ai-a2a-types.js'\n\nimport { A2AClient } from '@a2a-js/sdk/client'\nimport { DefaultExecutionEventBusManager, DefaultRequestHandler, JsonRpcTransportHandler, ServerCallContext as ServerCallContextImpl } from '@a2a-js/sdk/server'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { buildAgentCard } from './ai-a2a-server.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'a2a' })\n\n// ─── RelDB 持久化 TaskStore ───\n\n/**\n * 基于 ReldbAIStore 的 A2A TaskStore 实现\n *\n * 将 SDK 的 Task 对象桥接到 RelDB 存储,利用 status 和 refId 索引列\n * 实现按状态和上下文查询。\n */\nexport class ReldbA2ATaskStore implements TaskStore {\n constructor(private readonly store: AIRelStore<Task>) {}\n\n async save(task: Task, _context?: ServerCallContext): Promise<void> {\n await this.store.save(task.id, task, {\n objectId: task.contextId,\n status: task.status?.state,\n refId: task.contextId,\n })\n }\n\n async load(taskId: string, _context?: ServerCallContext): Promise<Task | undefined> {\n return this.store.get(taskId)\n }\n}\n\n// ─── A2A 消息日志拦截器 ───\n\n/**\n * 创建带消息日志的 AgentExecutor 包装器\n *\n * 在真实 AgentExecutor.execute 前后记录入站消息和出站响应到 messageStore。\n */\nfunction wrapExecutorWithLogging(\n executor: AgentExecutor,\n messageStore: AIRelStore<A2AMessageRecord>,\n): AgentExecutor {\n return {\n async execute(requestContext, eventBus) {\n // 记录入站消息\n const inboundRecord: A2AMessageRecord = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n taskId: requestContext.taskId,\n role: 'user',\n parts: requestContext.userMessage.parts ?? [],\n createdAt: Date.now(),\n }\n messageStore.save(inboundRecord.id, inboundRecord, { objectId: requestContext.taskId, status: 'user' })\n .catch(e => logger.warn('Failed to save inbound A2A message', { error: e }))\n\n // 监听出站事件并记录\n const originalPublish = eventBus.publish.bind(eventBus)\n const wrappedBus: ExecutionEventBus = Object.create(eventBus)\n wrappedBus.publish = (event) => {\n // @a2a-js/sdk ExecutionEventBus.publish 的 event 参数是联合类型,\n // 此处需要通过运行时检查判断是否为 Message 类型(含 role 属性),\n // SDK 未导出 Message 类型守卫,故使用 Record 断言访问属性\n if (event && typeof event === 'object' && 'role' in event && (event as unknown as Record<string, unknown>).role === 'agent') {\n const outboundRecord: A2AMessageRecord = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n taskId: requestContext.taskId,\n role: 'agent',\n parts: (event as unknown as Record<string, unknown>).parts as unknown[] ?? [],\n createdAt: Date.now(),\n }\n messageStore.save(outboundRecord.id, outboundRecord, { objectId: requestContext.taskId, status: 'agent' })\n .catch(e => logger.warn('Failed to save outbound A2A message', { error: e }))\n }\n originalPublish(event)\n }\n\n await executor.execute(requestContext, wrappedBus)\n },\n async cancelTask(taskId, eventBus) {\n await executor.cancelTask(taskId, eventBus)\n },\n }\n}\n\n// ─── 工厂函数 ───\n\n/** A2A 子功能组装依赖 */\nexport interface A2ADeps {\n storeProvider: AIStoreProvider\n}\n\n/** A2A 子功能配置 */\nexport interface A2ACreateOptions {\n /** Agent Card 配置 */\n agentCard: A2AAgentCardConfig\n /** Agent 执行器(由应用层实现) */\n executor: AgentExecutor\n}\n\n/**\n * 创建 A2A 操作接口实例\n *\n * 组装 TaskStore、RequestHandler、消息日志、远端调用等能力。\n */\nexport function createA2AOperations(\n options: A2ACreateOptions,\n deps: A2ADeps,\n): A2AOperations {\n const { storeProvider } = deps\n const agentCardConfig = options.agentCard\n\n // A2AClient 实例缓存(按 URL 复用,避免每次调用都创建新实例)\n const clientCache = new Map<string, A2AClient>()\n\n // 创建持久化存储\n const taskStore = storeProvider.createRelStore<Task>('hai_ai_a2a_tasks', {\n hasObjectId: true,\n hasStatus: true,\n hasRefId: true,\n })\n const messageStore = storeProvider.createRelStore<A2AMessageRecord>('hai_ai_a2a_messages', {\n hasObjectId: true,\n hasStatus: true,\n })\n const callRecordStore = storeProvider.createRelStore<A2AClientCallRecord>('hai_ai_a2a_calls', {\n hasObjectId: true,\n hasStatus: true,\n })\n\n // 构建 SDK 层\n const agentCard = buildAgentCard(agentCardConfig)\n const a2aTaskStore = new ReldbA2ATaskStore(taskStore)\n const wrappedExecutor = wrapExecutorWithLogging(options.executor, messageStore)\n const eventBusManager = new DefaultExecutionEventBusManager()\n const requestHandler = new DefaultRequestHandler(agentCard, a2aTaskStore, wrappedExecutor, eventBusManager)\n const transportHandler = new JsonRpcTransportHandler(requestHandler)\n\n return {\n registerExecutor() {\n logger.warn('A2A executor already registered, ignoring duplicate registerExecutor call')\n return ok(undefined)\n },\n\n getAgentCard() {\n return ok(agentCardConfig)\n },\n\n async handleRequest(requestBody: unknown, _context?: Record<string, unknown>): Promise<A2AHandleResult> {\n const serverContext = new ServerCallContextImpl()\n\n const result = await transportHandler.handle(requestBody, serverContext)\n\n // 判断是否为 AsyncGenerator(流式响应)\n if (result && typeof result === 'object' && Symbol.asyncIterator in result) {\n return {\n streaming: true,\n stream: result as AsyncGenerator<unknown, void, undefined>,\n }\n }\n\n return {\n streaming: false,\n body: result,\n }\n },\n\n async listMessages(filter: A2ATaskFilter) {\n try {\n const page = await messageStore.queryPage(\n {\n objectId: filter.contextId ?? filter.callerId,\n status: filter.status,\n orderBy: { field: 'createdAt' as keyof A2AMessageRecord, direction: 'desc' },\n },\n { offset: filter.offset ?? 0, limit: filter.limit ?? 50 },\n )\n return ok(page)\n }\n catch (error) {\n return err(HaiAIError.STORE_FAILED, aiM('ai_a2aListMessagesFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async callRemoteAgent(remoteUrl: string, message: string, _options?: A2ACallOptions) {\n const startTime = Date.now()\n try {\n let client = clientCache.get(remoteUrl)\n if (!client) {\n client = new A2AClient(remoteUrl)\n clientCache.set(remoteUrl, client)\n }\n const params: { message: Message } = {\n message: {\n kind: 'message',\n messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n role: 'user',\n parts: [{ kind: 'text', text: message }],\n },\n }\n\n const response = await client.sendMessage(params)\n\n // 处理 JSON-RPC 响应(SendMessageResponse = JSONRPCErrorResponse | SendMessageSuccessResponse)\n if ('error' in response) {\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: remoteUrl, error: JSON.stringify(response.error) } }))\n }\n\n // 提取 result(Task | Message)\n // @a2a-js/sdk SendMessageResponse.result 为 Task | Message 联合类型,\n // SDK 未提供类型守卫,通过 'status'/'parts' 属性运行时判别后断言\n const responseData = response.result\n let result: A2ACallResult\n if (responseData && 'status' in responseData) {\n // 通过 'status' 判别为 Task 类型\n const task = responseData as unknown as Task\n const textParts = task.artifacts?.flatMap(a => a.parts?.filter(p => 'text' in p).map(p => (p as { text: string }).text) ?? []) ?? []\n result = {\n taskId: task.id,\n taskState: task.status?.state,\n responseText: textParts.join('\\n') || undefined,\n responseParts: task.artifacts?.flatMap(a => a.parts ?? []),\n }\n }\n else if (responseData && 'parts' in responseData) {\n // 通过 'parts' 判别为 Message 类型\n const msg = responseData as unknown as { role: string, parts: Array<{ text?: string }> }\n const textParts = msg.parts?.filter(p => p.text).map(p => p.text!) ?? []\n result = {\n responseText: textParts.join('\\n') || undefined,\n responseParts: msg.parts,\n }\n }\n else {\n result = {} as A2ACallResult\n }\n\n // 记录调用日志\n const callRecord: A2AClientCallRecord = {\n id: `call_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n remoteUrl,\n requestParts: params.message.parts,\n responseParts: result.responseParts,\n taskId: result.taskId,\n taskState: result.taskState,\n duration: Date.now() - startTime,\n createdAt: startTime,\n }\n callRecordStore.save(callRecord.id, callRecord, { objectId: remoteUrl, status: result.taskState })\n .catch(e => logger.warn('Failed to save A2A call record', { error: e }))\n\n return ok(result)\n }\n catch (error) {\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: remoteUrl, error: String(error) } }), error)\n }\n },\n }\n}\n\n// ─── 延迟初始化代理 ───\n\n/** 延迟代理的外部依赖(由 ai-main 注入状态访问器) */\nexport interface A2ALazyProxyDeps {\n /** 是否已初始化(即 currentConfig !== null) */\n isInitialized: () => boolean\n /** 获取 A2A 配置(config.a2a) */\n getA2AConfig: () => A2AConfig | null\n /** 获取当前 A2A 实现(registerExecutor 后才有值) */\n getA2AImpl: () => A2AOperations | null\n /** 保存 A2A 实现引用 */\n setA2AImpl: (impl: A2AOperations) => void\n /** 获取 StoreProvider(用于 createA2AOperations) */\n getStoreProvider: () => AIStoreProvider | null\n /** 未初始化错误工厂 */\n notInitializedResult: <T>() => HaiResult<T>\n}\n\n/**\n * 创建 A2A 延迟初始化代理\n *\n * 代理在 `ai.init()` 之后、`registerExecutor()` 之前即可提供 `getAgentCard()`。\n * 其余方法需在 `registerExecutor()` 成功后才可用。\n *\n * @param deps - 由 ai-main 注入的状态访问器\n * @returns A2AOperations 代理对象\n */\nexport function createA2ALazyProxy(deps: A2ALazyProxyDeps): A2AOperations {\n return {\n registerExecutor(executor: AgentExecutor): HaiResult<void> {\n if (!deps.isInitialized()) {\n return deps.notInitializedResult()\n }\n const a2aConfig = deps.getA2AConfig()\n if (!a2aConfig) {\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n }\n if (deps.getA2AImpl()) {\n logger.warn('A2A executor already registered, re-registering')\n }\n const storeProvider = deps.getStoreProvider()\n if (!storeProvider) {\n return err(HaiAIError.STORE_FAILED, aiM('ai_internalError', { params: { error: 'StoreProvider not available' } }))\n }\n const agentCardWithSecurity = { ...a2aConfig.agentCard, security: a2aConfig.security }\n const impl = createA2AOperations(\n { agentCard: agentCardWithSecurity, executor },\n { storeProvider },\n )\n deps.setA2AImpl(impl)\n logger.info('A2A executor registered', { agentName: a2aConfig.agentCard.name })\n return ok(undefined)\n },\n\n getAgentCard() {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.getAgentCard()\n const a2aConfig = deps.getA2AConfig()\n if (a2aConfig)\n return ok({ ...a2aConfig.agentCard, security: a2aConfig.security } as A2AAgentCardConfig)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n },\n\n async handleRequest(requestBody: unknown, context?: Record<string, unknown>) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.handleRequest(requestBody, context)\n if (!deps.isInitialized())\n return deps.notInitializedResult() as never\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured')) as never\n },\n\n async listMessages(filter) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.listMessages(filter)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n },\n\n async callRemoteAgent(remoteUrl, message, options) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.callRemoteAgent(remoteUrl, message, options)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n },\n }\n}\n","/**\n * @h-ai/ai — Compress 子功能实现\n *\n * 提供上下文压缩能力,支持滑动窗口、摘要、混合三种策略。\n * 依赖 Token 子模块进行 Token 估算,依赖 Summary 子模块生成摘要。\n * @module ai-compress-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { CompressConfig } from '../ai-config.js'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { SummaryOperations } from '../summary/ai-summary-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type { CompressOperations, CompressOptions, CompressResult } from './ai-compress-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'compress' })\n\n/**\n * 创建 Compress 操作接口\n *\n * @param config - Compress 配置\n * @param token - Token 操作接口(用于估算 Token 数)\n * @param summary - Summary 操作接口(用于 summary/hybrid 策略生成摘要)\n * @param modelMaxTokens - 模型最大 Token 数(用于 defaultMaxTokens 为 0 时的回退计算)\n * @returns CompressOperations 实例\n */\nexport function createCompressOperations(\n config: CompressConfig,\n token: TokenOperations,\n summary: SummaryOperations,\n modelMaxTokens: number,\n): CompressOperations {\n /**\n * 计算有效的 maxTokens\n */\n function resolveMaxTokens(optionMaxTokens?: number): number {\n const fromOption = optionMaxTokens ?? config.defaultMaxTokens\n if (fromOption > 0)\n return fromOption\n return Math.floor(modelMaxTokens * 0.8)\n }\n\n /**\n * 滑动窗口压缩\n */\n function slidingWindow(\n messages: ChatMessage[],\n maxTokens: number,\n preserveSystem: boolean,\n preserveLastN: number,\n ): { messages: ChatMessage[], removedCount: number } {\n const systemMessages: ChatMessage[] = []\n const nonSystemMessages: ChatMessage[] = []\n\n for (const msg of messages) {\n if (msg.role === 'system' && preserveSystem) {\n systemMessages.push(msg)\n }\n else {\n nonSystemMessages.push(msg)\n }\n }\n\n const preserved = nonSystemMessages.slice(-preserveLastN)\n const result = [...systemMessages, ...preserved]\n const currentTokens = token.estimateMessages(result)\n\n if (currentTokens <= maxTokens) {\n return {\n messages: result,\n removedCount: nonSystemMessages.length - preserved.length,\n }\n }\n\n // 从最新的消息开始逆向添加\n let finalMessages = [...systemMessages]\n let tokens = token.estimateMessages(finalMessages)\n const addable: ChatMessage[] = []\n\n for (let i = nonSystemMessages.length - 1; i >= 0; i--) {\n const msgTokens = token.estimateMessages([nonSystemMessages[i]])\n if (tokens + msgTokens > maxTokens)\n break\n addable.unshift(nonSystemMessages[i])\n tokens += msgTokens\n }\n\n finalMessages = [...systemMessages, ...addable]\n\n return {\n messages: finalMessages,\n removedCount: nonSystemMessages.length - addable.length,\n }\n }\n\n /**\n * 压缩消息列表\n */\n async function tryCompress(messages: ChatMessage[], options?: CompressOptions): Promise<HaiResult<CompressResult>> {\n const strategy = options?.strategy ?? config.defaultStrategy\n const maxTokens = resolveMaxTokens(options?.maxTokens)\n const preserveSystem = options?.preserveSystem ?? true\n const preserveLastN = options?.preserveLastN ?? config.preserveLastN\n\n logger.trace('Compressing context', { strategy, maxTokens, messageCount: messages.length })\n\n try {\n const originalTokens = token.estimateMessages(messages)\n\n // 不需要压缩\n if (originalTokens <= maxTokens) {\n return ok({\n messages: [...messages],\n originalTokens,\n compressedTokens: originalTokens,\n removedCount: 0,\n })\n }\n\n if (strategy === 'sliding-window') {\n const { messages: compressed, removedCount } = slidingWindow(\n messages,\n maxTokens,\n preserveSystem,\n preserveLastN,\n )\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Sliding window compression completed', { originalTokens, compressedTokens, removedCount })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount,\n })\n }\n\n if (strategy === 'summary') {\n const systemMessages = preserveSystem ? messages.filter(m => m.role === 'system') : []\n const nonSystem = messages.filter(m => m.role !== 'system' || !preserveSystem)\n const preserved = nonSystem.slice(-preserveLastN)\n const toSummarize = nonSystem.slice(0, nonSystem.length - preserveLastN)\n\n if (toSummarize.length === 0) {\n return ok({\n messages: [...messages],\n originalTokens,\n compressedTokens: originalTokens,\n removedCount: 0,\n })\n }\n\n const summaryResult = await summary.generate(toSummarize, { model: options?.summaryModel })\n if (!summaryResult.success)\n return summaryResult as HaiResult<never>\n\n const summaryText = summaryResult.data\n const summaryMessage: ChatMessage = {\n role: 'system',\n content: `[Conversation Summary]\\n${summaryText}`,\n }\n\n const compressed = [...systemMessages, summaryMessage, ...preserved]\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Summary compression completed', { originalTokens, compressedTokens, removedCount: toSummarize.length })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n })\n }\n\n // hybrid:先滑动窗口,如果仍超限则摘要\n const { messages: windowResult, removedCount: windowRemoved } = slidingWindow(\n messages,\n maxTokens,\n preserveSystem,\n preserveLastN,\n )\n const windowTokens = token.estimateMessages(windowResult)\n\n if (windowTokens <= maxTokens) {\n return ok({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n })\n }\n\n // 滑动窗口不够,对被移除的部分生成摘要\n const systemMessages = preserveSystem ? messages.filter(m => m.role === 'system') : []\n const nonSystem = messages.filter(m => m.role !== 'system' || !preserveSystem)\n const preservedMessages = nonSystem.slice(-preserveLastN)\n const toSummarize = nonSystem.slice(0, nonSystem.length - preserveLastN)\n\n if (toSummarize.length > 0) {\n const summaryResult = await summary.generate(toSummarize, { model: options?.summaryModel })\n if (!summaryResult.success)\n return summaryResult as HaiResult<never>\n\n const summaryText = summaryResult.data\n const summaryMessage: ChatMessage = {\n role: 'system',\n content: `[Conversation Summary]\\n${summaryText}`,\n }\n\n const compressed = [...systemMessages, summaryMessage, ...preservedMessages]\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Hybrid compression completed', { originalTokens, compressedTokens, removedCount: toSummarize.length })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n })\n }\n\n return ok({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n })\n }\n catch (error) {\n logger.error('Context compression failed', { error })\n return err(HaiAIError.CONTEXT_COMPRESS_FAILED, aiM('ai_contextCompressFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n tryCompress,\n }\n}\n","/**\n * @h-ai/ai — LLM 流式响应处理\n *\n * 提供流处理器、SSE 编解码等纯函数工具。\n * @module ai-llm-stream\n */\n\nimport type {\n AssistantMessage,\n ChatCompletionChunk,\n ChatCompletionDelta,\n SSEDecoder,\n SSEEvent,\n StreamProcessor,\n StreamResult,\n} from './ai-llm-types.js'\n\n// ─── 流处理器 ───\n\n/**\n * 创建流处理器,逐块累积流式响应的文本内容和工具调用\n *\n * @returns 流处理器实例\n *\n * @example\n * ```ts\n * const processor = createStreamProcessor()\n * for await (const chunk of stream) {\n * processor.process(chunk)\n * }\n * const result = processor.getResult() // { content, toolCalls, finishReason }\n * ```\n */\nexport function createStreamProcessor(): StreamProcessor {\n /** 累积文本内容 */\n let content = ''\n /** 按索引累积工具调用片段(流式中可能跨多个 chunk) */\n let toolCalls: Map<number, { id: string, name: string, arguments: string }> = new Map()\n /** 完成原因(`'stop'` | `'tool_calls'` 等) */\n let finishReason: string | null = null\n\n return {\n /** 处理单个 chunk,累积内容/工具调用/完成原因 */\n process(chunk: ChatCompletionChunk): ChatCompletionDelta | null {\n const choice = chunk.choices[0]\n if (!choice)\n return null\n\n const delta = choice.delta\n\n if (delta.content) {\n content += delta.content\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const existing = toolCalls.get(tc.index)\n if (existing) {\n if (tc.function?.name) {\n existing.name += tc.function.name\n }\n if (tc.function?.arguments) {\n existing.arguments += tc.function.arguments\n }\n }\n else if (tc.id) {\n toolCalls.set(tc.index, {\n id: tc.id,\n name: tc.function?.name || '',\n arguments: tc.function?.arguments || '',\n })\n }\n }\n }\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason\n }\n\n return delta\n },\n\n /** 获取当前累积结果快照 */\n getResult(): StreamResult {\n return {\n content,\n toolCalls: Array.from(toolCalls.values()).map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: tc.arguments,\n },\n })),\n finishReason,\n }\n },\n\n /** 将累积结果转为 AssistantMessage(含工具调用时 content 为 `null`) */\n toAssistantMessage(): AssistantMessage {\n const result = this.getResult()\n const message: AssistantMessage = {\n role: 'assistant',\n content: result.toolCalls.length > 0 ? null : result.content,\n }\n if (result.toolCalls.length > 0) {\n message.tool_calls = result.toolCalls\n }\n return message\n },\n\n /** 重置所有状态,可复用处理器处理下一次流 */\n reset(): void {\n content = ''\n toolCalls = new Map()\n finishReason = null\n },\n }\n}\n\n// ─── 收集完整流 ───\n\n/**\n * 完整消费流式响应并返回累积结果\n *\n * @param stream - 流式响应迭代器\n * @returns 完整的流处理结果\n *\n * @example\n * ```ts\n * const result = await collectStream(ai.llm.chatStream({ messages }))\n * core.logger.info({ content: result.content, finishReason: result.finishReason })\n * ```\n */\nexport async function collectStream(\n stream: AsyncIterable<ChatCompletionChunk>,\n): Promise<StreamResult> {\n const processor = createStreamProcessor()\n for await (const chunk of stream) {\n processor.process(chunk)\n }\n return processor.getResult()\n}\n\n// ─── SSE 编解码 ───\n\n/**\n * 创建 SSE 解码器,内部维护缓冲区,支持跨分片拼接\n *\n * 按 SSE 规范解析 `event:`、`data:`、`id:`、`retry:` 字段,\n * 多行 `data:` 自动用换行符拼接。\n *\n * @returns SSE 解码器实例\n *\n * @example\n * ```ts\n * const decoder = createSSEDecoder()\n * for (const event of decoder.decode(rawText)) {\n * core.logger.info({ data: event.data }) // SSE data 内容\n * }\n * ```\n */\nexport function createSSEDecoder(): SSEDecoder {\n let buffer = ''\n\n return {\n * decode(text: string): Iterable<SSEEvent> {\n buffer += text\n\n const parts = buffer.split('\\n\\n')\n buffer = parts.pop() || ''\n\n for (const part of parts) {\n if (!part.trim())\n continue\n\n const event: SSEEvent = {}\n const lines = part.split('\\n')\n const dataLines: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('event:')) {\n event.event = line.slice(6).trim()\n }\n else if (line.startsWith('id:')) {\n event.id = line.slice(3).trim()\n }\n else if (line.startsWith('retry:')) {\n event.retry = Number.parseInt(line.slice(6).trim(), 10)\n }\n else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trim())\n }\n else if (line.startsWith('data ')) {\n dataLines.push(line.slice(5))\n }\n }\n\n if (dataLines.length > 0) {\n event.data = dataLines.join('\\n')\n }\n\n yield event\n }\n },\n\n reset(): void {\n buffer = ''\n },\n }\n}\n\n/**\n * 将 SSE 事件编码为符合规范的文本格式\n *\n * 输出以双换行 `\\n\\n` 结尾,可直接写入 HTTP 响应流。\n *\n * @param event - SSE 事件\n * @returns 编码后的文本(以 `\\n\\n` 结尾)\n *\n * @example\n * ```ts\n * const text = encodeSSE({ event: 'message', data: '{\"content\":\"hi\"}' })\n * // => 'event: message\\ndata: {\"content\":\"hi\"}\\n\\n'\n * ```\n */\nexport function encodeSSE(event: SSEEvent): string {\n const lines: string[] = []\n if (event.event) {\n lines.push(`event: ${event.event}`)\n }\n if (event.id) {\n lines.push(`id: ${event.id}`)\n }\n if (event.retry !== undefined) {\n lines.push(`retry: ${event.retry}`)\n }\n if (event.data !== undefined) {\n const dataLines = event.data.split('\\n')\n for (const line of dataLines) {\n lines.push(`data: ${line}`)\n }\n }\n return `${lines.join('\\n')}\\n\\n`\n}\n","/**\n * @h-ai/ai — Context 子功能实现\n *\n * 聚合 Token、Summary、Compress 三个子模块,并在此基础上\n * 提供有状态的 ContextManager(多轮对话自动压缩 + 对话编排 + 持久化)。\n * @module ai-context-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { CompressConfig } from '../ai-config.js'\n\nimport type { CompressOperations } from '../compress/ai-compress-types.js'\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { AIRelStore, InteractionScope, SessionInfo } from '../store/ai-store-types.js'\nimport type { SummaryResult } from '../summary/ai-summary-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type {\n ContextChatOptions,\n ContextChatResult,\n ContextDeps,\n ContextManager,\n ContextManagerOptions,\n ContextOperations,\n ContextStreamEvent,\n} from './ai-context-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createStreamProcessor } from '../llm/ai-llm-stream.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'context' })\n\n// ─── 持久化状态结构 ───\n\n/**\n * 持久化的上下文管理器状态\n */\ninterface PersistedContextState {\n messages: ChatMessage[]\n summaries: SummaryResult[]\n updatedAt: number\n}\n\n/**\n * 创建 Context 操作接口\n *\n * 聚合 Token、Summary、Compress 子模块,提供统一的上下文管理 API。\n * 若传入 deps(LLM / Memory / RAG / Reasoning),ContextManager 可提供\n * chat/chatStream 高层编排能力。\n *\n * @param compressConfig - Compress 配置(用于 ContextManager 的默认值)\n * @param tokenOps - Token 操作接口(由 token 子模块创建)\n * @param compressOps - Compress 操作接口(由 compress 子模块创建)\n * @param contextStore - 上下文状态存储(可选,用于持久化)\n * @param sessionStore - 会话信息存储(可选,用于目录管理)\n * @param deps - 可选子模块依赖(LLM / Memory / RAG / Reasoning)\n * @returns ContextOperations 实例\n */\nexport function createContextOperations(\n compressConfig: CompressConfig,\n tokenOps: TokenOperations,\n compressOps: CompressOperations,\n contextStore?: AIRelStore<PersistedContextState>,\n sessionStore?: AIRelStore<SessionInfo>,\n deps?: ContextDeps,\n): ContextOperations {\n /**\n * 计算有效的 maxTokens(用于 ContextManager 初始化)\n */\n function resolveMaxTokens(optionMaxTokens?: number): number {\n const fromOption = optionMaxTokens ?? compressConfig.defaultMaxTokens\n if (fromOption > 0)\n return fromOption\n return compressConfig.defaultMaxTokens > 0 ? compressConfig.defaultMaxTokens : 4096\n }\n\n /**\n * 构造存储键\n */\n function storeKey(scope: InteractionScope): string {\n return `${scope.objectId}:${scope.sessionId}`\n }\n\n /**\n * 创建 ContextManager 实例(共享逻辑)\n */\n function buildManager(\n options: ContextManagerOptions,\n initialMessages: ChatMessage[],\n initialSummaries: SummaryResult[],\n ): ContextManager {\n const scope = options.scope\n\n // 解析压缩参数\n const compress = options.compress\n const managerMaxTokens = resolveMaxTokens(compress?.maxTokens)\n const strategy = compress?.strategy ?? compressConfig.defaultStrategy\n const preserveSystem = compress?.preserveSystem ?? true\n const preserveLastN = compress?.preserveLastN ?? compressConfig.preserveLastN\n const autoCompress = compress?.auto ?? true\n const summaryModel = compress?.summaryModel\n\n const state = {\n messages: initialMessages,\n summaries: initialSummaries,\n }\n\n const manager: ContextManager = {\n scope,\n\n async addMessage(message: ChatMessage): Promise<HaiResult<void>> {\n state.messages.push(message)\n\n if (!autoCompress)\n return ok(undefined)\n\n const currentTokens = tokenOps.estimateMessages(state.messages)\n if (currentTokens <= managerMaxTokens)\n return ok(undefined)\n\n logger.trace('Auto-compressing context', { currentTokens, budget: managerMaxTokens })\n\n const compressResult = await compressOps.tryCompress(state.messages, {\n strategy: strategy as 'summary' | 'sliding-window' | 'hybrid',\n maxTokens: managerMaxTokens,\n preserveSystem,\n preserveLastN,\n summaryModel,\n })\n\n if (!compressResult.success) {\n logger.warn('Auto-compression failed, keeping original messages', { error: compressResult.error })\n return ok(undefined)\n }\n\n if (compressResult.data.summary) {\n state.summaries.push({\n summary: compressResult.data.summary,\n tokenCount: tokenOps.estimateText(compressResult.data.summary),\n coveredMessages: compressResult.data.removedCount,\n })\n }\n\n state.messages = compressResult.data.messages\n return ok(undefined)\n },\n\n getMessages(): HaiResult<ChatMessage[]> {\n return ok([...state.messages])\n },\n\n getTokenUsage(): HaiResult<{ current: number, budget: number }> {\n return ok({\n current: tokenOps.estimateMessages(state.messages),\n budget: managerMaxTokens,\n })\n },\n\n getSummaries(): HaiResult<SummaryResult[]> {\n return ok([...state.summaries])\n },\n\n async save(): Promise<HaiResult<void>> {\n if (!scope || !contextStore) {\n return ok(undefined)\n }\n try {\n const key = storeKey(scope)\n await contextStore.save(key, {\n messages: state.messages,\n summaries: state.summaries,\n updatedAt: Date.now(),\n }, { objectId: scope.objectId, sessionId: scope.sessionId })\n\n // 同步更新会话信息\n if (sessionStore) {\n const existing = await sessionStore.get(scope.sessionId)\n if (existing) {\n existing.updatedAt = Date.now()\n await sessionStore.save(scope.sessionId, existing, { objectId: existing.objectId })\n }\n else {\n await sessionStore.save(scope.sessionId, {\n sessionId: scope.sessionId,\n objectId: scope.objectId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }, { objectId: scope.objectId })\n }\n }\n\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n reset(): void {\n state.messages = []\n state.summaries = []\n },\n\n // ─── chat/chatStream 编排 ───\n\n async chat(message: string, chatOpts?: ContextChatOptions): Promise<HaiResult<ContextChatResult>> {\n if (!deps?.llm) {\n return err(HaiAIError.NOT_INITIALIZED, aiM('ai_notInitialized'))\n }\n\n try {\n // 追加用户消息(自动压缩)\n const addResult = await manager.addMessage({ role: 'user', content: message })\n if (!addResult.success)\n return addResult\n\n // 获取当前消息列表\n const messagesResult = manager.getMessages()\n if (!messagesResult.success)\n return messagesResult\n let messages = messagesResult.data\n\n // 可选:注入记忆\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, {\n objectId: scope?.objectId,\n topK: options.memory.topK,\n maxTokens: options.memory.maxTokens,\n position: options.memory.position,\n })\n if (injected.success) {\n messages = injected.data\n }\n }\n\n // 可选:RAG 检索增强 — 将检索结果作为 system 消息注入\n if (options.rag?.enable && deps.rag) {\n const ragResult = await deps.rag.query(message, {\n sources: options.rag.sources,\n topK: options.rag.topK,\n minScore: options.rag.minScore,\n enableRerank: options.rag.enableRerank,\n rerankModel: options.rag.rerankModel,\n model: chatOpts?.model ?? options.model,\n messages,\n enablePersist: false,\n })\n if (ragResult.success) {\n // RAG query 已直接返回完整结果,将 answer 作为回复\n const reply = ragResult.data.answer\n await manager.addMessage({ role: 'assistant', content: reply })\n\n if (options.memory?.enableExtract && deps.memory) {\n const recentMessages: ChatMessage[] = [\n { role: 'user', content: message },\n { role: 'assistant', content: reply },\n ]\n deps.memory.extract(recentMessages, { objectId: scope?.objectId })\n .catch(e => logger.warn('Memory extract failed', { error: e }))\n }\n\n return ok({\n reply,\n model: ragResult.data.model,\n usage: ragResult.data.usage,\n })\n }\n }\n\n // 可选:推理引擎\n if (options.reasoning?.enable && deps.reasoning) {\n const reasonResult = await deps.reasoning.run(message, {\n strategy: options.reasoning.strategy,\n maxRounds: options.reasoning.maxRounds,\n model: chatOpts?.model ?? options.model,\n temperature: chatOpts?.temperature ?? options.temperature,\n messages,\n tools: options.tools,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n enablePersist: false,\n })\n if (reasonResult.success) {\n const reply = reasonResult.data.answer\n await manager.addMessage({ role: 'assistant', content: reply })\n\n if (options.memory?.enableExtract && deps.memory) {\n const recentMessages: ChatMessage[] = [\n { role: 'user', content: message },\n { role: 'assistant', content: reply },\n ]\n deps.memory.extract(recentMessages, { objectId: scope?.objectId })\n .catch(e => logger.warn('Memory extract failed', { error: e }))\n }\n\n return ok({ reply, model: chatOpts?.model ?? options.model ?? '', usage: undefined })\n }\n }\n\n // 普通 LLM 调用(含工具调用循环)\n const toolDefs = options.tools?.getDefinitions()\n const maxToolRounds = options.maxToolRounds ?? 10\n let lastModel = ''\n let lastUsage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for (let round = 0; round <= maxToolRounds; round++) {\n const chatResult = await deps.llm.chat({\n model: chatOpts?.model ?? options.model,\n messages,\n temperature: chatOpts?.temperature ?? options.temperature,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n tools: toolDefs,\n tool_choice: toolDefs ? 'auto' : undefined,\n enablePersist: chatOpts?.enablePersist ?? false,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n lastModel = chatResult.data.model\n if (chatResult.data.usage) {\n lastUsage = {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n }\n\n if (!choice)\n break\n\n const assistantMessage = choice.message\n\n // 有工具调用且注册表可用:执行工具并将结果回传 LLM\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0 && options.tools) {\n messages.push(assistantMessage)\n\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n const toolResult = await options.tools.execute(toolCall)\n const rawContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawContent === 'string'\n ? rawContent\n : (rawContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n continue\n }\n\n // 无工具调用:提取文本回复\n const reply = typeof assistantMessage.content === 'string' ? assistantMessage.content : ''\n\n // 追加助手回复\n await manager.addMessage({ role: 'assistant', content: reply })\n\n // 可选:自动提取记忆\n if (options.memory?.enableExtract && deps.memory) {\n const recentMessages: ChatMessage[] = [\n { role: 'user', content: message },\n { role: 'assistant', content: reply },\n ]\n deps.memory.extract(recentMessages, { objectId: scope?.objectId })\n .catch(e => logger.warn('Memory extract failed', { error: e }))\n }\n\n return ok({ reply, model: lastModel, usage: lastUsage })\n }\n\n // 达到最大工具调用轮次,返回最后可用的回复\n const lastAssistantMsg = messages.filter(m => m.role === 'assistant').pop()\n const fallbackReply = lastAssistantMsg && 'content' in lastAssistantMsg && typeof lastAssistantMsg.content === 'string'\n ? lastAssistantMsg.content\n : ''\n return ok({ reply: fallbackReply, model: lastModel, usage: lastUsage })\n }\n catch (error) {\n logger.error('Context chat failed', { error })\n return err(HaiAIError.INTERNAL_ERROR, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n\n async* chatStream(message: string, chatOpts?: ContextChatOptions): AsyncIterable<ContextStreamEvent> {\n if (!deps?.llm) {\n throw new Error('LLM not initialized: deps.llm is required for chatStream')\n }\n\n // 追加用户消息\n await manager.addMessage({ role: 'user', content: message })\n\n // 获取消息列表\n const messagesResult = manager.getMessages()\n if (!messagesResult.success) {\n throw new Error(`Failed to get messages: ${String(messagesResult.error)}`)\n }\n let messages = messagesResult.data\n\n // 可选:注入记忆\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, {\n objectId: scope?.objectId,\n topK: options.memory.topK,\n maxTokens: options.memory.maxTokens,\n position: options.memory.position,\n })\n if (injected.success) {\n messages = injected.data\n }\n }\n\n // 提取记忆的通用逻辑\n const extractMemory = (reply: string) => {\n if (options.memory?.enableExtract && deps?.memory) {\n const recentMessages: ChatMessage[] = [\n { role: 'user', content: message },\n { role: 'assistant', content: reply },\n ]\n deps.memory.extract(recentMessages, { objectId: scope?.objectId })\n .catch(e => logger.warn('Memory extract failed', { error: e }))\n }\n }\n\n // 可选:RAG 流式检索增强\n if (options.rag?.enable && deps.rag) {\n let fullReply = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for await (const event of deps.rag.queryStream(message, {\n sources: options.rag.sources,\n topK: options.rag.topK,\n minScore: options.rag.minScore,\n enableRerank: options.rag.enableRerank,\n rerankModel: options.rag.rerankModel,\n model: chatOpts?.model ?? options.model,\n messages,\n enablePersist: false,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n yield { type: 'delta', text: event.text }\n }\n else if (event.type === 'done') {\n fullReply = event.answer\n model = event.model\n usage = event.usage\n }\n }\n\n await manager.addMessage({ role: 'assistant', content: fullReply })\n extractMemory(fullReply)\n yield { type: 'done', reply: fullReply, model, usage }\n return\n }\n\n // 可选:Reasoning 流式推理\n if (options.reasoning?.enable && deps.reasoning) {\n let fullReply = ''\n\n for await (const event of deps.reasoning.runStream(message, {\n strategy: options.reasoning.strategy,\n maxRounds: options.reasoning.maxRounds,\n model: chatOpts?.model ?? options.model,\n temperature: chatOpts?.temperature ?? options.temperature,\n messages,\n tools: options.tools,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n enablePersist: false,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n yield { type: 'delta', text: event.text }\n }\n }\n\n await manager.addMessage({ role: 'assistant', content: fullReply })\n extractMemory(fullReply)\n yield { type: 'done', reply: fullReply, model: chatOpts?.model ?? options.model ?? '', usage: undefined }\n return\n }\n\n // 普通流式 LLM 调用(含工具调用循环)\n const toolDefs = options.tools?.getDefinitions()\n const maxToolRounds = options.maxToolRounds ?? 10\n\n let fullReply = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for (let round = 0; round <= maxToolRounds; round++) {\n const processor = createStreamProcessor()\n\n const stream = deps.llm.chatStream({\n model: chatOpts?.model ?? options.model,\n messages,\n temperature: chatOpts?.temperature ?? options.temperature,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n tools: toolDefs,\n tool_choice: toolDefs ? 'auto' : undefined,\n enablePersist: chatOpts?.enablePersist ?? false,\n })\n\n for await (const chunk of stream) {\n processor.process(chunk)\n\n if (!model && chunk.model)\n model = chunk.model\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n fullReply += delta\n yield { type: 'delta', text: delta }\n }\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n }\n }\n }\n\n const streamResult = processor.getResult()\n\n // 有工具调用:执行工具并继续下一轮\n if (streamResult.toolCalls.length > 0 && options.tools) {\n messages.push(processor.toAssistantMessage())\n\n for (const toolCall of streamResult.toolCalls) {\n if (toolCall.type !== 'function')\n continue\n yield { type: 'tool_call', name: toolCall.function.name, arguments: toolCall.function.arguments }\n\n const toolResult = await options.tools.execute(toolCall)\n const rawContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawContent === 'string'\n ? rawContent\n : (rawContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n yield { type: 'tool_result', name: toolCall.function.name, content: toolContent, success: toolResult.success }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n\n // 重置 fullReply,下一轮 LLM 会产出最终文本\n fullReply = ''\n continue\n }\n\n // 无工具调用:结束循环\n break\n }\n\n // 追加助手回复\n await manager.addMessage({ role: 'assistant', content: fullReply })\n\n extractMemory(fullReply)\n\n yield { type: 'done', reply: fullReply, model, usage }\n },\n }\n\n return manager\n }\n\n return {\n /**\n * 创建有状态上下文管理器\n */\n createManager(options?: ContextManagerOptions): HaiResult<ContextManager> {\n const opts = options ?? {}\n\n const manager = buildManager(\n opts,\n [],\n [],\n )\n\n // 如果有系统提示词,将其作为第一条 system 消息\n if (opts.systemPrompt) {\n void manager.addMessage({ role: 'system', content: opts.systemPrompt })\n }\n\n return ok(manager)\n },\n\n /**\n * 从存储恢复管理器实例\n */\n async restoreManager(scope: InteractionScope, options?: Omit<ContextManagerOptions, 'scope'>): Promise<HaiResult<ContextManager>> {\n const opts = { ...options, scope } as ContextManagerOptions\n\n let initialMessages: ChatMessage[] = []\n let initialSummaries: SummaryResult[] = []\n\n // 从存储恢复\n if (contextStore) {\n const key = storeKey(scope)\n const persisted = await contextStore.get(key)\n if (persisted) {\n initialMessages = persisted.messages\n initialSummaries = persisted.summaries\n logger.trace('Context manager restored from store', { scope, messageCount: initialMessages.length })\n }\n }\n\n const manager = buildManager(\n // 恢复时不再追加 systemPrompt(历史中已有)\n { ...opts, systemPrompt: undefined },\n initialMessages,\n initialSummaries,\n )\n\n return ok(manager)\n },\n\n /**\n * 列出指定对象的所有会话\n */\n async listSessions(objectId: string): Promise<HaiResult<SessionInfo[]>> {\n if (!sessionStore) {\n return ok([])\n }\n\n try {\n const sessions = await sessionStore.query({\n objectId,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n })\n return ok(sessions)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async renameSession(sessionId: string, title: string): Promise<HaiResult<void>> {\n if (!sessionStore) {\n return ok(undefined)\n }\n\n try {\n const existing = await sessionStore.get(sessionId)\n if (!existing) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: `Session not found: ${sessionId}` } }))\n }\n existing.title = title\n existing.updatedAt = Date.now()\n await sessionStore.save(sessionId, existing, { objectId: existing.objectId })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async removeSession(sessionId: string): Promise<HaiResult<void>> {\n if (!sessionStore) {\n return ok(undefined)\n }\n\n try {\n // 先获取会话信息,需要 objectId 来构建上下文存储 key\n const existing = await sessionStore.get(sessionId)\n if (existing && contextStore) {\n const key = `${existing.objectId}:${existing.sessionId}`\n await contextStore.remove(key)\n }\n await sessionStore.remove(sessionId)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Embedding 子功能实现\n *\n * 基于 OpenAI Embeddings API 的向量嵌入实现。\n * @module ai-embedding-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig, EmbeddingConfig, ResolvedModelConfig } from '../ai-config.js'\n\nimport type {\n EmbeddingOperations,\n EmbeddingRequest,\n EmbeddingResponse,\n} from './ai-embedding-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport OpenAI from 'openai'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'embedding' })\n\n/**\n * 创建 Embedding 操作接口\n *\n * 提供文本向量嵌入能力,支持单条、批量和原始请求三种模式。\n * 内部复用同一个 OpenAI 客户端实例,批量请求按 batchSize 自动拆分。\n *\n * @param config - 校验后的 AI 配置(apiKey / baseUrl 来自 llm 配置,dimensions / batchSize 来自 embedding 配置)\n * @returns EmbeddingOperations 实例(`embed` / `embedText` / `embedBatch`)\n */\nexport function createEmbeddingOperations(config: AIConfig): EmbeddingOperations {\n const embeddingConfig: EmbeddingConfig = config.embedding ?? { batchSize: 100 }\n\n /**\n * 缓存的 OpenAI 客户端实例(按 model 缓存,避免不同模型共用同一个客户端)\n */\n let cachedClient: OpenAI | null = null\n let cachedResolvedKey: string | undefined\n\n /**\n * 获取或创建 OpenAI 客户端(首次调用时初始化,后续复用同一实例)\n */\n function getOrCreateClient(resolved: ResolvedModelConfig) {\n const apiKey = resolved.apiKey\n const baseURL = resolved.baseUrl\n\n // 如果 apiKey 变了(不同模型条目),需要重建客户端\n if (cachedClient && cachedResolvedKey === apiKey)\n return cachedClient\n\n cachedClient = new OpenAI({ apiKey, baseURL })\n cachedResolvedKey = apiKey\n return cachedClient\n }\n\n /**\n * 调用 OpenAI Embeddings API(单次请求)\n */\n async function callEmbeddingAPI(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n const resolvedResult = resolveModelEntry(config.llm, 'embedding', request.model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for embedding' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n\n const input = Array.isArray(request.input) ? request.input : [request.input]\n\n try {\n const client = getOrCreateClient(resolved)\n\n const params: Record<string, unknown> = {\n model: resolved.model,\n input,\n }\n\n if (request.dimensions ?? embeddingConfig.dimensions) {\n params.dimensions = request.dimensions ?? embeddingConfig.dimensions\n }\n\n // OpenAI SDK embeddings.create 参数类型与动态构造的 params 不兼容,\n // 此处按需组装 model/input/dimensions 字段后断言为 SDK 参数类型\n const response = await client.embeddings.create(params as unknown as Parameters<typeof client.embeddings.create>[0])\n\n return ok({\n model: response.model,\n data: response.data.map(item => ({\n index: item.index,\n embedding: item.embedding,\n })),\n usage: {\n prompt_tokens: response.usage.prompt_tokens,\n total_tokens: response.usage.total_tokens,\n },\n })\n }\n catch (error) {\n logger.error('Embedding API call failed', { error })\n return err(HaiAIError.EMBEDDING_API_ERROR, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n }\n\n /**\n * 对外统一嵌入入口:单条 / 批量都复用同一套分批逻辑\n */\n async function embedRequest(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n const input = Array.isArray(request.input) ? request.input : [request.input]\n const batchSize = embeddingConfig.batchSize\n\n // 如果输入不超过 batchSize,直接调用\n if (input.length <= batchSize) {\n return callEmbeddingAPI(request)\n }\n\n // 批量处理:按 batchSize 分组\n const allData: EmbeddingResponse['data'] = []\n let totalPromptTokens = 0\n let totalTokens = 0\n let resultModel = ''\n\n for (let i = 0; i < input.length; i += batchSize) {\n const batch = input.slice(i, i + batchSize)\n const result = await callEmbeddingAPI({ ...request, input: batch })\n if (!result.success)\n return result\n\n resultModel = result.data.model\n totalPromptTokens += result.data.usage.prompt_tokens\n totalTokens += result.data.usage.total_tokens\n\n // 调整 index 以反映全局位置\n for (const item of result.data.data) {\n allData.push({\n index: i + item.index,\n embedding: item.embedding,\n })\n }\n }\n\n return ok({\n model: resultModel,\n data: allData,\n usage: { prompt_tokens: totalPromptTokens, total_tokens: totalTokens },\n })\n }\n\n return {\n async embed(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n return embedRequest(request)\n },\n\n async embedText(text: string): Promise<HaiResult<number[]>> {\n const result = await embedRequest({ input: text })\n if (!result.success)\n return result\n const first = result.data.data.find(item => item.index === 0)\n if (!first) {\n return err(HaiAIError.EMBEDDING_API_ERROR, aiM('ai_internalError', { params: { error: 'Embedding result is empty' } }))\n }\n return ok(first.embedding)\n },\n\n async embedBatch(texts: string[]): Promise<HaiResult<number[][]>> {\n const result = await embedRequest({ input: texts })\n if (!result.success)\n return result\n const sorted = [...result.data.data].sort((a, b) => a.index - b.index)\n return ok(sorted.map(item => item.embedding))\n },\n }\n}\n","/**\n * @h-ai/ai — File 子功能实现\n *\n * 支持多格式文件内容提取:文本、HTML、PDF、DOCX 和 OCR 图片识别。\n * @module ai-file-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig } from '../ai-config.js'\n\nimport type { LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n FileOperations,\n FileParseMethod,\n FileParseRequest,\n FileParseResult,\n OutputFormat,\n} from './ai-file-types.js'\n\nimport { Buffer } from 'node:buffer'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'file' })\n\n// ─── MIME 类型与扩展名映射 ───\n\n/** 文本 MIME 类型集合(直接解码) */\nconst TEXT_MIME_TYPES = new Set([\n 'text/plain',\n 'text/markdown',\n 'text/x-markdown',\n 'text/csv',\n 'application/json',\n 'application/xml',\n 'text/xml',\n 'text/x-yaml',\n 'application/yaml',\n])\n\n/** 图片 MIME 类型集合(OCR) */\nconst IMAGE_MIME_TYPES = new Set([\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'image/tiff',\n])\n\n/** 文件扩展名 → MIME 类型映射 */\nconst EXT_TO_MIME: Record<string, string> = {\n txt: 'text/plain',\n md: 'text/markdown',\n markdown: 'text/markdown',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'text/x-yaml',\n yml: 'text/x-yaml',\n html: 'text/html',\n htm: 'text/html',\n pdf: 'application/pdf',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n doc: 'application/msword',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n tiff: 'image/tiff',\n tif: 'image/tiff',\n}\n\n/** 根据文件内容的 magic bytes 检测 MIME 类型 */\nfunction detectMimeFromMagicBytes(buffer: Buffer): string | undefined {\n if (buffer.length < 4)\n return undefined\n // PDF: %PDF\n if (buffer[0] === 0x25 && buffer[1] === 0x50 && buffer[2] === 0x44 && buffer[3] === 0x46) {\n return 'application/pdf'\n }\n // PNG: \\x89PNG\n if (buffer[0] === 0x89 && buffer[1] === 0x50 && buffer[2] === 0x4E && buffer[3] === 0x47) {\n return 'image/png'\n }\n // JPEG: \\xFF\\xD8\n if (buffer[0] === 0xFF && buffer[1] === 0xD8) {\n return 'image/jpeg'\n }\n // GIF: GIF8\n if (buffer[0] === 0x47 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x38) {\n return 'image/gif'\n }\n // RIFF/WebP\n if (\n buffer[0] === 0x52 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x46\n && buffer.length >= 12 && buffer[8] === 0x57 && buffer[9] === 0x45 && buffer[10] === 0x42 && buffer[11] === 0x50\n ) {\n return 'image/webp'\n }\n // ZIP (DOCX is ZIP-based): PK\\x03\\x04\n if (buffer[0] === 0x50 && buffer[1] === 0x4B && buffer[2] === 0x03 && buffer[3] === 0x04) {\n return 'application/zip'\n }\n return undefined\n}\n\n/**\n * 检测文件 MIME 类型\n *\n * 优先顺序:显式指定 > 文件名扩展名 > magic bytes > 默认 text/plain\n */\nfunction detectMimeType(content: Buffer | string, filename?: string, explicitMime?: string): string {\n if (explicitMime)\n return explicitMime.toLowerCase()\n\n if (filename) {\n const ext = filename.split('.').pop()?.toLowerCase()\n if (ext && ext in EXT_TO_MIME) {\n return EXT_TO_MIME[ext]\n }\n }\n\n if (Buffer.isBuffer(content)) {\n const detected = detectMimeFromMagicBytes(content)\n if (detected)\n return detected\n }\n\n return 'text/plain'\n}\n\n/**\n * 解析文本格式内容(UTF-8 解码)\n */\nfunction parseTextContent(content: Buffer | string): string {\n if (typeof content === 'string')\n return content\n return content.toString('utf-8')\n}\n\n/** HTML 实体名称映射表 */\nconst HTML_ENTITIES: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: '\\'',\n nbsp: ' ',\n mdash: '—',\n ndash: '–',\n ldquo: '\\u201C',\n rdquo: '\\u201D',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n hellip: '…',\n copy: '©',\n reg: '®',\n trade: '™',\n}\n\n/** 解码 HTML 实体(命名实体 + 十进制/十六进制数字实体) */\nfunction decodeHtmlEntities(text: string): string {\n return text.replace(/&(?:#(\\d+)|#x([\\dA-Fa-f]+)|([A-Za-z]+));/g, (match, dec, hex, named) => {\n if (dec !== undefined)\n return String.fromCharCode(Number.parseInt(dec, 10))\n if (hex !== undefined)\n return String.fromCharCode(Number.parseInt(hex, 16))\n return HTML_ENTITIES[named] ?? match\n })\n}\n\n/** 剥除 HTML 标签,仅保留文本内容 */\nfunction stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '')\n}\n\n/**\n * 解析 HTML,剥除标签并提取纯文本\n */\nfunction parseHtmlContent(content: Buffer | string): string {\n const html = parseTextContent(content)\n const noScript = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script[^>]*>/gi, ' ')\n const noStyle = noScript.replace(/<style[^>]*>[\\s\\S]*?<\\/style[^>]*>/gi, ' ')\n const noTags = noStyle.replace(/<[^>]+>/g, ' ')\n return decodeHtmlEntities(noTags).replace(/\\s+/g, ' ').trim()\n}\n\n/**\n * 将 HTML 转换为 Markdown\n *\n * 保留常见文档结构:标题、列表、粗体/斜体、超链接、代码块、水平线。\n * 不支持的复杂结构(如嵌套表格、内联样式)将降级为纯文本。\n */\nfunction htmlToMarkdown(content: Buffer | string): string {\n let md = parseTextContent(content)\n\n // 移除 script / style 块\n md = md.replace(/<script[^>]*>[\\s\\S]*?<\\/script[^>]*>/gi, '')\n md = md.replace(/<style[^>]*>[\\s\\S]*?<\\/style[^>]*>/gi, '')\n\n // 代码块(pre > code,先处理避免内部标签被转换)\n md = md.replace(/<pre[^>]*>\\s*<code[^>]*>([\\s\\S]*?)<\\/code>\\s*<\\/pre>/gi, (_, code) =>\n `\\n\\`\\`\\`\\n${decodeHtmlEntities(stripTags(code)).trim()}\\n\\`\\`\\`\\n`)\n md = md.replace(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, code) =>\n `\\n\\`\\`\\`\\n${decodeHtmlEntities(stripTags(code)).trim()}\\n\\`\\`\\`\\n`)\n\n // 标题 h1–h6\n for (let level = 1; level <= 6; level++) {\n md = md.replace(\n new RegExp(`<h${level}[^>]*>([\\\\s\\\\S]*?)<\\\\/h${level}>`, 'gi'),\n (_, c) => `\\n${'#'.repeat(level)} ${stripTags(c).trim()}\\n`,\n )\n }\n\n // 水平线\n md = md.replace(/<hr\\s*\\/?>/gi, '\\n\\n---\\n\\n')\n\n // 引用块\n md = md.replace(/<blockquote[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, (_, c) =>\n stripTags(c).trim().split('\\n').map(l => `> ${l.trim()}`).filter(l => l !== '> ').join('\\n'))\n\n // 列表项\n md = md.replace(/<[ou]l[^>]*>/gi, '\\n')\n md = md.replace(/<\\/[ou]l>/gi, '\\n')\n md = md.replace(/<li[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, c) => `\\n- ${stripTags(c).trim()}`)\n\n // 粗体 / 斜体\n md = md.replace(/<(?:strong|b)[^>]*>([\\s\\S]*?)<\\/(?:strong|b)>/gi, (_, c) => `**${stripTags(c).trim()}**`)\n md = md.replace(/<(?:em|i)[^>]*>([\\s\\S]*?)<\\/(?:em|i)>/gi, (_, c) => `*${stripTags(c).trim()}*`)\n\n // 超链接\n md = md.replace(/<a[^>]+href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href, text) =>\n `[${stripTags(text).trim()}](${href})`)\n\n // 图片(src/alt 属性顺序不定,逐属性提取)\n md = md.replace(/<img([^>]*)>/gi, (_, attrs: string) => {\n const src = attrs.match(/src=\"([^\"]*)\"/)?.[1] ?? ''\n const alt = attrs.match(/alt=\"([^\"]*)\"/)?.[1] ?? ''\n return ``\n })\n\n // 行内代码\n md = md.replace(/<code[^>]*>([\\s\\S]*?)<\\/code>/gi, (_, c) =>\n `\\`${decodeHtmlEntities(stripTags(c))}\\``)\n\n // 表格(简化:每行单元格用 | 分隔)\n md = md.replace(/<tr[^>]*>([\\s\\S]*?)<\\/tr>/gi, (_, row) => {\n const cells = [...row.matchAll(/<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/gi)]\n return `| ${cells.map(([, c]) => stripTags(c).trim()).join(' | ')} |\\n`\n })\n md = md.replace(/<\\/?t(?:able|head|body|foot)[^>]*>/gi, '')\n md = md.replace(/<\\/?t[rdh][^>]*>/gi, '')\n\n // 换行与段落\n md = md.replace(/<br\\s*\\/?>/gi, '\\n')\n md = md.replace(/<\\/(?:p|div|section|article|header|footer|main|nav|aside)>/gi, '\\n\\n')\n md = md.replace(/<(?:p|div|section|article|header|footer|main|nav|aside)[^>]*>/gi, '')\n\n // 移除剩余标签并解码实体\n md = md.replace(/<[^>]+>/g, '')\n md = decodeHtmlEntities(md)\n\n return md.replace(/\\n{3,}/g, '\\n\\n').trim()\n}\n\n/**\n * 使用 pdfjs-dist 解析 PDF 内容\n */\nasync function parsePdfContent(content: Buffer, outputFormat: OutputFormat = 'text', maxPages?: number): Promise<HaiResult<{ text: string, pageCount: number }>> {\n try {\n const pdfjs = await import(\n\n // @ts-expect-error — pdfjs-dist is an optional peer dependency\n 'pdfjs-dist/legacy/build/pdf.mjs',\n ) as { getDocument: (...args: unknown[]) => { promise: Promise<unknown> } }\n const loadingTask = pdfjs.getDocument({ data: new Uint8Array(content) })\n const pdf = await loadingTask.promise as {\n numPages: number\n getPage: (n: number) => Promise<{ getTextContent: () => Promise<{ items: Array<{ str?: string }> }> }>\n }\n const totalPages = pdf.numPages\n const pagesToProcess = maxPages ? Math.min(maxPages, totalPages) : totalPages\n const textParts: string[] = []\n\n for (let i = 1; i <= pagesToProcess; i++) {\n const page = await pdf.getPage(i)\n const textContent = await page.getTextContent()\n const pageText = textContent.items\n .map(item => item.str ?? '')\n .join(' ')\n textParts.push(pageText)\n }\n\n // markdown 模式用页分隔线区分每页\n const separator = outputFormat === 'markdown' ? '\\n\\n---\\n\\n' : '\\n\\n'\n return ok({ text: textParts.join(separator), pageCount: totalPages })\n }\n catch (error) {\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 使用 mammoth 解析 DOCX 内容\n *\n * - `'text'`:使用 `extractRawText` 提取纯文本\n * - `'markdown'`:使用 `convertToHtml` 后转换为 Markdown\n */\nasync function parseDocxContent(content: Buffer, outputFormat: OutputFormat = 'text'): Promise<HaiResult<string>> {\n try {\n const mammoth = await import(\n\n // @ts-expect-error — mammoth is an optional peer dependency\n 'mammoth',\n ) as {\n extractRawText: (options: unknown) => Promise<{ value: string }>\n convertToHtml: (options: unknown) => Promise<{ value: string }>\n }\n if (outputFormat === 'markdown') {\n const result = await mammoth.convertToHtml({ buffer: content })\n return ok(htmlToMarkdown(result.value))\n }\n const result = await mammoth.extractRawText({ buffer: content })\n return ok(result.value)\n }\n catch (error) {\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 使用视觉 LLM 进行 OCR 图片识别\n */\nasync function parseImageWithOcr(\n content: Buffer,\n mimeType: string,\n llmOps: LLMOperations,\n model?: string,\n outputFormat: OutputFormat = 'text',\n customPrompt?: string,\n): Promise<HaiResult<string>> {\n const base64 = content.toString('base64')\n const dataUrl = `data:${mimeType};base64,${base64}`\n const defaultPrompt = outputFormat === 'markdown'\n ? 'Please extract all text content from this image as Markdown, preserving document structure (headings, bullet lists, bold/italic). Return only the Markdown without additional commentary.'\n : 'Please extract all text content from this image accurately. Return only the extracted text without any additional commentary.'\n const prompt = customPrompt ?? defaultPrompt\n\n logger.trace('Running OCR via vision LLM', { mimeType, model })\n\n const result = await llmOps.chat({\n model,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: { url: dataUrl, detail: 'high' },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ],\n })\n\n if (!result.success) {\n return err(HaiAIError.FILE_OCR_FAILED, aiM('ai_fileOcrFailed', { params: { error: result.error.message } }), result.error)\n }\n\n return ok(result.data.choices[0]?.message?.content ?? '')\n}\n\n/**\n * 创建 File 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @param llmOps - LLM 操作接口(用于 OCR)\n * @returns FileOperations 实例\n */\nexport function createFileOperations(config: AIConfig, llmOps: LLMOperations): FileOperations {\n /**\n * 统一 OCR 执行入口:解析模型配置 → 调用视觉 LLM → 包装结果\n *\n * 调用方负责确保 content 为 Buffer 类型。\n */\n async function runOcr(\n content: Buffer,\n mimeType: string,\n filename: string | undefined,\n model: string | undefined,\n outputFormat: OutputFormat,\n systemPrompt: string | undefined,\n ): Promise<HaiResult<FileParseResult>> {\n const resolvedResult = resolveModelEntry(config.llm, 'ocr', model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for OCR' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n\n const ocrResult = await parseImageWithOcr(\n content,\n mimeType,\n llmOps,\n resolvedResult.data.model,\n outputFormat,\n systemPrompt,\n )\n if (!ocrResult.success)\n return ocrResult\n\n return ok({\n text: ocrResult.data,\n method: 'ocr' as FileParseMethod,\n metadata: { filename, mimeType, charCount: ocrResult.data.length },\n })\n }\n\n /**\n * 核心解析逻辑\n */\n async function doParse(request: FileParseRequest): Promise<HaiResult<FileParseResult>> {\n const { content, filename, options = {} } = request\n const mimeType = detectMimeType(content, filename, options.mimeType)\n const outputFormat: OutputFormat = options.outputFormat ?? 'text'\n\n logger.trace('Parsing file', { filename, mimeType, outputFormat, useOcr: options.useOcr })\n\n // 强制 OCR 模式\n if (options.useOcr) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'OCR requires Buffer content' } }))\n }\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 文本格式:直接解码(markdown 不改变纯文本语义)\n if (TEXT_MIME_TYPES.has(mimeType)) {\n const text = parseTextContent(content)\n return ok({\n text,\n method: 'text' as FileParseMethod,\n metadata: { filename, mimeType, charCount: text.length },\n })\n }\n\n // HTML:按输出格式选择解析方式\n if (mimeType === 'text/html') {\n const text = outputFormat === 'markdown' ? htmlToMarkdown(content) : parseHtmlContent(content)\n return ok({\n text,\n method: 'html' as FileParseMethod,\n metadata: { filename, mimeType, charCount: text.length },\n })\n }\n\n // PDF:尝试 pdfjs-dist,失败则回退 OCR\n if (mimeType === 'application/pdf') {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'PDF parsing requires Buffer content' } }))\n }\n const pdfResult = await parsePdfContent(content, outputFormat, options.maxPages)\n if (pdfResult.success) {\n return ok({\n text: pdfResult.data.text,\n method: 'pdf' as FileParseMethod,\n pageCount: pdfResult.data.pageCount,\n metadata: { filename, mimeType, charCount: pdfResult.data.text.length },\n })\n }\n logger.warn('PDF native parser failed, falling back to OCR', { filename })\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // DOCX:尝试 mammoth,失败则回退 OCR\n if (\n mimeType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n || mimeType === 'application/msword'\n || mimeType === 'application/zip'\n ) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'DOCX parsing requires Buffer content' } }))\n }\n const docxResult = await parseDocxContent(content, outputFormat)\n if (docxResult.success) {\n return ok({\n text: docxResult.data,\n method: 'docx' as FileParseMethod,\n metadata: { filename, mimeType, charCount: docxResult.data.length },\n })\n }\n logger.warn('DOCX native parser failed, falling back to OCR', { filename })\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 图片格式:OCR\n if (IMAGE_MIME_TYPES.has(mimeType)) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'Image OCR requires Buffer content' } }))\n }\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 其他格式:不支持\n return err(HaiAIError.FILE_UNSUPPORTED_FORMAT, aiM('ai_fileUnsupportedFormat', { params: { mimeType } }))\n }\n\n return {\n async parse(request: FileParseRequest): Promise<HaiResult<FileParseResult>> {\n try {\n return await doParse(request)\n }\n catch (error) {\n logger.error('File parse failed unexpectedly', { filename: request.filename, error })\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async parseText(content: Buffer | string, filename?: string): Promise<HaiResult<string>> {\n const result = await this.parse({ content, filename })\n if (!result.success)\n return result\n return ok(result.data.text)\n },\n }\n}\n","/**\n * @h-ai/ai — Knowledge 实体提取\n *\n * 使用 LLM 从文本中提取命名实体(人名、项目名、概念等)。\n * @module ai-knowledge-entity\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { LLMOperations } from '../llm/ai-llm-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'knowledge-entity' })\n\n// ─── 提取结果类型 ───\n\n/**\n * LLM 实体提取结果(单条)\n */\nexport interface ExtractedEntity {\n /** 实体名称 */\n name: string\n /** 实体类型(内置类型或用户自定义类型) */\n type: string\n /** 别名列表 */\n aliases?: string[]\n /** 简短描述 */\n description?: string\n}\n\n// ─── Prompt ───\n\n/** 默认实体类型列表 */\nexport const DEFAULT_ENTITY_TYPES = ['person', 'project', 'concept', 'organization', 'location', 'event', 'other']\n\n/**\n * 根据实体类型列表生成实体提取系统提示词\n */\nfunction buildEntityExtractionPrompt(entityTypes: string[]): string {\n const typeList = entityTypes.map(t => `\"${t}\"`).join(', ')\n return `You are a named entity extraction assistant. Extract named entities from the given text.\n\nReturn a JSON array of entities. Each entity has:\n- \"name\": the primary name (string, required)\n- \"type\": one of ${typeList} (required)\n- \"aliases\": alternative names or abbreviations (string array, optional)\n- \"description\": a one-sentence description (string, optional)\n\nRules:\n- Only extract clearly mentioned entities. Do NOT infer or guess.\n- Deduplicate: if the same entity appears with different names, merge into one entry with aliases.\n- Be precise and concise.\n- Return an empty array [] if no entities are found.\n- Return ONLY the JSON array, no markdown fences, no explanation.`\n}\n\n/**\n * 从文本中提取实体\n *\n * 调用 LLM 分析文本,返回结构化的实体列表。\n *\n * @param llm - LLM 操作接口\n * @param text - 待提取的文本(通常是单个 chunk 的内容)\n * @param model - 模型名称覆盖(可选)\n * @param entityTypes - 实体类型列表(可选,默认使用内置类型)\n * @param systemPrompt - 系统提示词覆盖(可选,默认根据 entityTypes 自动生成)\n * @returns 提取到的实体列表\n */\nexport async function extractEntities(\n llm: LLMOperations,\n text: string,\n model?: string,\n entityTypes?: string[],\n systemPrompt?: string,\n): Promise<HaiResult<ExtractedEntity[]>> {\n if (!text.trim()) {\n return ok([])\n }\n\n const resolvedTypes = entityTypes ?? DEFAULT_ENTITY_TYPES\n const resolvedPrompt = systemPrompt ?? buildEntityExtractionPrompt(resolvedTypes)\n\n try {\n const chatResult = await llm.chat({\n model,\n messages: [\n { role: 'system', content: resolvedPrompt },\n { role: 'user', content: text },\n ],\n temperature: 0.1,\n enablePersist: false,\n })\n\n if (!chatResult.success) {\n logger.warn('Entity extraction LLM call failed', { error: chatResult.error })\n return err(HaiAIError.KNOWLEDGE_ENTITY_EXTRACT_FAILED, aiM('ai_knowledgeEntityExtractFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n const content = chatResult.data.choices[0]?.message?.content ?? ''\n\n // 解析 JSON 响应\n const validTypes = new Set(resolvedTypes)\n const entities = parseEntityResponse(content, validTypes)\n logger.trace('Entity extraction completed', { textLength: text.length, entityCount: entities.length })\n\n return ok(entities)\n }\n catch (error) {\n logger.error('Entity extraction failed', { error })\n return err(HaiAIError.KNOWLEDGE_ENTITY_EXTRACT_FAILED, aiM('ai_knowledgeEntityExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 解析 LLM 返回的实体 JSON\n *\n * 容错处理:去除 markdown 代码围栏、尝试 JSON.parse。\n */\nfunction parseEntityResponse(content: string, validTypes: Set<string>): ExtractedEntity[] {\n let cleaned = content.trim()\n\n // 去除 markdown 代码围栏\n if (cleaned.startsWith('```')) {\n cleaned = cleaned.replace(/^```(?:json)?\\n?/, '').replace(/\\n?```$/, '')\n }\n\n try {\n const parsed = JSON.parse(cleaned) as unknown\n\n // 可能是数组\n if (Array.isArray(parsed)) {\n return parsed\n .filter(isValidEntity)\n .map(e => normalizeEntity(e, validTypes))\n }\n\n // 可能是 { entities: [...] } 包装\n if (typeof parsed === 'object' && parsed !== null && 'entities' in parsed) {\n const entities = (parsed as { entities: unknown }).entities\n if (Array.isArray(entities)) {\n return entities.filter(isValidEntity).map(e => normalizeEntity(e, validTypes))\n }\n }\n\n logger.warn('Entity extraction returned unexpected format', { content: content.slice(0, 200) })\n return []\n }\n catch {\n logger.warn('Entity extraction returned invalid JSON', { content: content.slice(0, 200) })\n return []\n }\n}\n\n/**\n * 校验实体结构\n */\nfunction isValidEntity(item: unknown): item is Record<string, unknown> {\n if (typeof item !== 'object' || item === null)\n return false\n const obj = item as Record<string, unknown>\n return typeof obj.name === 'string' && obj.name.length > 0\n && typeof obj.type === 'string'\n}\n\n/**\n * 标准化实体\n *\n * @param item - 原始实体对象\n * @param validTypes - 合法类型集合(不在集合内的归为 'other')\n */\nfunction normalizeEntity(item: Record<string, unknown>, validTypes: Set<string>): ExtractedEntity {\n const type = validTypes.has(item.type as string) ? item.type as string : 'other'\n\n return {\n name: (item.name as string).trim(),\n type,\n aliases: Array.isArray(item.aliases) ? (item.aliases as string[]).map(String) : undefined,\n description: typeof item.description === 'string' ? item.description.trim() : undefined,\n }\n}\n\n/**\n/**\n * 批量提取实体并去重合并\n *\n * 对多个 chunk 并发提取,合并同名实体。\n *\n * @param llm - LLM 操作接口\n * @param chunks - 文本块列表\n * @param model - 模型名称覆盖(可选)\n * @param entityTypes - 实体类型列表(可选,默认使用内置类型)\n * @param systemPrompt - 系统提示词覆盖(可选)\n * @param concurrency - 并发数(默认 3)\n * @returns 去重合并后的实体列表\n */\nexport async function extractEntitiesBatch(\n llm: LLMOperations,\n chunks: Array<{ content: string, chunkId: string }>,\n model?: string,\n entityTypes?: string[],\n systemPrompt?: string,\n concurrency = 3,\n): Promise<HaiResult<Array<ExtractedEntity & { chunkIds: string[] }>>> {\n // 简单并发控制:按批次执行\n const allEntities: Array<{ entity: ExtractedEntity, chunkId: string }> = []\n\n for (let i = 0; i < chunks.length; i += concurrency) {\n const batch = chunks.slice(i, i + concurrency)\n const results = await Promise.all(\n batch.map(async (chunk) => {\n const result = await extractEntities(llm, chunk.content, model, entityTypes, systemPrompt)\n if (result.success) {\n return result.data.map(e => ({ entity: e, chunkId: chunk.chunkId }))\n }\n logger.warn('Entity extraction failed for chunk', { chunkId: chunk.chunkId })\n return []\n }),\n )\n\n for (const entities of results) {\n allEntities.push(...entities)\n }\n }\n\n // 去重合并:按名称(忽略大小写)分组\n const entityMap = new Map<string, ExtractedEntity & { chunkIds: string[] }>()\n\n for (const { entity, chunkId } of allEntities) {\n const key = entity.name.toLowerCase()\n const existing = entityMap.get(key)\n\n if (existing) {\n // 合并 chunkIds\n if (!existing.chunkIds.includes(chunkId)) {\n existing.chunkIds.push(chunkId)\n }\n // 合并别名\n if (entity.aliases) {\n const existingAliases = new Set(existing.aliases ?? [])\n for (const alias of entity.aliases) {\n existingAliases.add(alias)\n }\n existing.aliases = Array.from(existingAliases)\n }\n // 使用更详细的描述\n if (entity.description && (!existing.description || entity.description.length > existing.description.length)) {\n existing.description = entity.description\n }\n }\n else {\n entityMap.set(key, { ...entity, chunkIds: [chunkId] })\n }\n }\n\n return ok(Array.from(entityMap.values()))\n}\n","/**\n * @h-ai/ai — Knowledge 子功能实现\n *\n * 编排 datapipe + KnowledgeStore + embedding + LLM,\n * 实现文档导入、实体索引、信源追踪检索。\n * @module ai-knowledge-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ChunkOptionsInput, CleanOptionsInput, DatapipeFunctions } from '@h-ai/datapipe'\nimport type { KnowledgeConfig } from '../ai-config.js'\n\nimport type { EmbeddingOperations } from '../embedding/ai-embedding-types.js'\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { Citation } from '../retrieval/ai-retrieval-types.js'\nimport type { KnowledgeStore } from '../store/ai-store-types.js'\nimport type {\n EntityDocumentResult,\n EntityListOptions,\n EntityQueryOptions,\n KnowledgeAskOptions,\n KnowledgeAskResult,\n KnowledgeDocumentInfo,\n KnowledgeDocumentListOptions,\n KnowledgeDocumentRemoveOptions,\n KnowledgeEntity,\n KnowledgeIngestBatchProgress,\n KnowledgeIngestBatchResult,\n KnowledgeIngestFileInput,\n KnowledgeIngestInput,\n KnowledgeIngestResult,\n KnowledgeOperations,\n KnowledgeRetrieveItem,\n KnowledgeRetrieveOptions,\n KnowledgeRetrieveResult,\n KnowledgeSetupOptions,\n} from './ai-knowledge-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { nanoid } from 'nanoid'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { extractEntities, extractEntitiesBatch } from './ai-knowledge-entity.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'knowledge' })\n\n// ─── 默认提示词 ───\n\nconst DEFAULT_KNOWLEDGE_ASK_SYSTEM_PROMPT = `You are an expert assistant. Answer the user's question based ONLY on the provided context.\n\nRules:\n- Cite sources using [N] notation where N matches the context item number.\n- If the context doesn't contain enough information, say so honestly.\n- Be precise and factual.\n- Prefer direct quotes when appropriate.`\n\n/**\n * 创建 Knowledge 操作接口\n *\n * 编排 datapipe → embedding → KnowledgeStore(向量存储 + 实体倒排索引),\n * 实现文档导入、语义检索与实体增强。\n *\n * @param config - Knowledge 配置(分块策略、向量集合、实体提取开关等)\n * @param llm - LLM 操作(用于实体提取和问答生成)\n * @param embedding - Embedding 操作(用于文本向量化)\n * @param datapipe - datapipe 实例(必选,用于文本清洗与分块)\n * @param store - KnowledgeStore 实例(可选,未提供时 knowledge 子系统不可用)\n * @returns KnowledgeOperations 实例\n */\nexport function createKnowledgeOperations(\n config: KnowledgeConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations,\n datapipe: DatapipeFunctions,\n store?: KnowledgeStore,\n): KnowledgeOperations {\n /**\n * 检查 collection 是否已就绪(cache-aside:先查进程内缓存,未命中则查 DB 注册表并回填缓存)\n *\n * 支持多节点场景:其他节点完成 setup 后,本节点通过 DB 查询亦可感知。\n */\n async function isCollectionReady(collection: string): Promise<boolean> {\n if (!store)\n return false\n return await store.collectionExists(collection)\n }\n\n return {\n // ─── setup ───\n /**\n * 初始化知识库(幂等,支持多次调用以初始化不同 collection)\n *\n * 创建 vecdb 集合(已存在则跳过)和 reldb 实体索引表(DDL 幂等)。\n * **每个 collection 在使用 `ingest` / `retrieve` / `ask` 前必须先对该 collection 执行 `setup`。**\n * 多分场景下可多次调用本方法,每次传入不同 `collection` 名称。\n *\n * @param options - 可选覆盖(collection 名称、向量维度)\n * @returns `ok(undefined)` 成功;建表失败时返回 `KNOWLEDGE_SETUP_FAILED`\n */\n async setup(options?: KnowledgeSetupOptions): Promise<HaiResult<void>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: 'KnowledgeStore not available. Provider may not support knowledge operations.' } }))\n }\n\n const collection = options?.collection ?? config.collection\n const dimension = options?.dimension ?? config.dimension\n\n logger.debug('Setting up knowledge base', { collection, dimension })\n\n try {\n await store.initialize(collection, dimension)\n await store.registerCollection(collection, dimension)\n\n logger.debug('Knowledge base setup completed', { collection })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Knowledge base setup failed', { error })\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── ingest ───\n /**\n * 导入文档到知识库\n *\n * 流程:清洗 → 分块 → Embedding 向量化 → 存入 vecdb;\n * 可选地提取命名实体并建立倒排索引(实体增强相关度)。\n *\n * @param input - 导入输入(documentId、content、可选 cleanOptions / chunkOptions / metadata 等)\n * @returns `ok(KnowledgeIngestResult)` 含导入信息;未初始化时返回 `KNOWLEDGE_NOT_SETUP`\n *\n * @example\n * ```ts\n * await knowledge.ingest({\n * documentId: 'doc-001',\n * content: '文章内容...',\n * chunkOptions: { maxSize: 512 },\n * })\n * ```\n */\n async ingest(input: KnowledgeIngestInput): Promise<HaiResult<KnowledgeIngestResult>> {\n const collection = input.collection ?? config.collection\n if (!await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n const startTime = Date.now()\n const enableEntityExtraction = input.enableEntityExtraction ?? config.enableEntityExtraction\n // 合并 config 默认值与 input 覆盖选项(input 优先级更高)\n const cleanOptions: CleanOptionsInput = {\n ...config.cleanOptions,\n ...input.cleanOptions,\n }\n const chunkOptions: ChunkOptionsInput = {\n ...config.chunkOptions,\n ...input.chunkOptions,\n }\n\n logger.trace('Ingesting document', { documentId: input.documentId, collection, contentLength: input.content.length })\n\n try {\n // ① 清洗:标准化文本(去 HTML、空白规整等)\n const cleanResult = datapipe.clean(input.content, cleanOptions)\n const cleanedText = cleanResult.success ? cleanResult.data : input.content\n\n // ② 分块:按指定策略切割(分块失败退回整文本单一 chunk)\n const chunkResult = datapipe.chunk(cleanedText, chunkOptions)\n const chunks: Array<{ index: number, content: string, metadata?: Record<string, unknown> }> = chunkResult.success\n ? chunkResult.data\n : [{ index: 0, content: cleanedText }]\n\n // ③ 批量向量化\n const texts = chunks.map(c => c.content)\n const embedResult = await embedding.embedBatch(texts)\n if (!embedResult.success) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: 'Embedding failed' } }), embedResult.error)\n }\n\n // ④ 存入 vecdb\n const vectorDocuments = chunks.map((chunk, i) => {\n const chunkId = `${input.documentId}:chunk-${chunk.index}`\n return {\n id: chunkId,\n vector: embedResult.data[i],\n content: chunk.content,\n metadata: {\n ...input.metadata,\n ...chunk.metadata,\n documentId: input.documentId,\n title: input.title,\n url: input.url,\n position: `chunk:${chunk.index}`,\n chunkIndex: chunk.index,\n },\n }\n })\n\n await store!.upsertVectors(collection, vectorDocuments)\n\n // ④.b 记录文档元数据\n await store!.upsertDocument({\n documentId: input.documentId,\n collection,\n title: input.title,\n url: input.url,\n chunkCount: chunks.length,\n createdAt: Date.now(),\n })\n\n // ⑤ 实体提取(可选)\n const extractedEntities: KnowledgeEntity[] = []\n\n if (enableEntityExtraction) {\n const chunkInputs = chunks.map(chunk => ({\n content: chunk.content,\n chunkId: `${input.documentId}:chunk-${chunk.index}`,\n }))\n\n const entityResult = await extractEntitiesBatch(llm, chunkInputs, undefined, config.entityTypes, config.systemPrompt)\n if (entityResult.success) {\n // ⑥ 写入 reldb\n for (const entity of entityResult.data) {\n const entityId = `ent-${nanoid(12)}`\n const knowledgeEntity: KnowledgeEntity = {\n id: entityId,\n name: entity.name,\n type: entity.type,\n aliases: entity.aliases,\n description: entity.description,\n }\n extractedEntities.push(knowledgeEntity)\n\n // 插入实体\n await store!.upsertEntity({\n id: entityId,\n name: entity.name,\n type: entity.type,\n aliases: entity.aliases,\n description: entity.description,\n })\n\n // 插入文档-实体关联(每个命中的 chunkId 建一条倒排记录)\n for (const chunkId of entity.chunkIds) {\n await store!.insertEntityDocument({\n entityId,\n documentId: input.documentId,\n chunkId,\n collection,\n relevance: 1.0,\n context: chunks.find(c => `${input.documentId}:chunk-${c.index}` === chunkId)?.content?.slice(0, 200),\n })\n }\n }\n }\n else {\n logger.warn('Entity extraction failed, skipping', { error: entityResult.error })\n }\n }\n\n const duration = Date.now() - startTime\n logger.debug('Document ingested', {\n documentId: input.documentId,\n chunkCount: chunks.length,\n entityCount: extractedEntities.length,\n duration,\n })\n\n return ok({\n documentId: input.documentId,\n chunkCount: chunks.length,\n entities: extractedEntities,\n duration,\n })\n }\n catch (error) {\n logger.error('Document ingestion failed', { documentId: input.documentId, error })\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── retrieve ───\n /**\n * 语义检索知识库\n *\n * 1. 将查询向量化 → 2. vecdb 向量搜索 → 3. 实体增强(可选):\n * LLM 提取查询中的命名实体,查实体倒排索引对匹配文档加权重排。\n *\n * @param query - 查询文本\n * @param options - 可选(collection、topK、minScore、enableEntityBoost、filter 等)\n * @returns `ok(KnowledgeRetrieveResult)` 含检索项和引用列表;未初始化时返回 `KNOWLEDGE_NOT_SETUP`\n */\n async retrieve(query: string, options?: KnowledgeRetrieveOptions): Promise<HaiResult<KnowledgeRetrieveResult>> {\n const collection = options?.collection ?? config.collection\n if (!await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n const startTime = Date.now()\n const topK = options?.topK ?? 10\n const enableEntityBoost = options?.enableEntityBoost ?? true\n\n logger.trace('Knowledge retrieval', { query: query.slice(0, 100), collection, topK })\n\n try {\n // ① 向量化查询\n const embedResult = await embedding.embedText(query)\n if (!embedResult.success) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: 'Query embedding failed' } }), embedResult.error)\n }\n\n // ② 向量搜索\n const searchHits = await store!.searchVectors(collection, embedResult.data, {\n topK: topK * 2, // 多取一些,后续合并后再截断\n minScore: options?.minScore,\n filter: options?.filter,\n })\n\n // 构建结果项\n const itemMap = new Map<string, KnowledgeRetrieveItem>()\n for (const hit of searchHits) {\n const metadata = hit.metadata ?? {}\n const citation: Citation = {\n documentId: metadata.documentId as string | undefined,\n title: metadata.title as string | undefined,\n url: metadata.url as string | undefined,\n position: metadata.position as string | undefined,\n chunkId: hit.id,\n collection,\n }\n\n itemMap.set(hit.id, {\n id: hit.id,\n content: hit.content ?? '',\n score: hit.score,\n citation,\n metadata,\n matchedEntities: [],\n })\n }\n\n // ③ 实体增强(可选):先用 LLM 从查询中提取命名实体,再查倒排索引对向量结果加权\n if (enableEntityBoost) {\n const queryEntityResult = await extractEntities(\n llm,\n query,\n undefined,\n config.entityTypes,\n config.systemPrompt,\n )\n const queryEntityNames = queryEntityResult.success\n ? queryEntityResult.data.map(e => e.name)\n : []\n\n if (queryEntityNames.length > 0) {\n // 合并多个实体名的匹配结果(Map 保证去重)\n const entityMap = new Map<string, { id: string, name: string, type: string, aliases: string[] }>()\n for (const name of queryEntityNames) {\n const entities = await store!.findEntitiesByName(name)\n for (const e of entities)\n entityMap.set(e.id, e)\n }\n\n if (entityMap.size > 0) {\n const entityIds = Array.from(entityMap.keys())\n const entityNameMap = new Map(Array.from(entityMap.values()).map(e => [e.id, e.name]))\n\n const docRelations = await store!.findDocumentsByEntityIds(entityIds, collection)\n const boostWeight = config.entityBoostWeight\n\n for (const relation of docRelations) {\n const chunkKey = relation.chunkId || relation.documentId\n const entityName = entityNameMap.get(relation.entityId) ?? ''\n\n for (const [itemId, item] of itemMap) {\n const itemDocId = item.metadata?.documentId as string | undefined\n if (itemId === chunkKey || itemDocId === relation.documentId) {\n item.score += boostWeight * relation.relevance\n if (entityName && !item.matchedEntities!.includes(entityName)) {\n item.matchedEntities!.push(entityName)\n }\n }\n }\n }\n }\n }\n }\n\n // 排序 + 截断\n const items = Array.from(itemMap.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, topK)\n\n // 去重信源引用\n const citationMap = new Map<string, Citation>()\n for (const item of items) {\n const key = item.citation.documentId ?? item.citation.chunkId ?? item.id\n if (!citationMap.has(key)) {\n citationMap.set(key, item.citation)\n }\n }\n\n const duration = Date.now() - startTime\n logger.trace('Knowledge retrieval completed', { resultCount: items.length, duration })\n\n return ok({\n items,\n citations: Array.from(citationMap.values()),\n query,\n duration,\n })\n }\n catch (error) {\n logger.error('Knowledge retrieval failed', { error })\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── ask ───\n /**\n * 基于知识库回答问题(RAG 模式)\n *\n * 内部调用 `retrieve` 获取相关文档,将检索结果格式化为上下文后和历史消息一起发送给 LLM 生成回答。\n *\n * @param query - 用户问题\n * @param options - 可选(满足 `KnowledgeRetrieveOptions` 的所有选项 + systemPrompt、messages、temperature、model)\n * @returns `ok(KnowledgeAskResult)` 含 answer、context 列表、citations、usage 等;检索或生成失败时返回错误\n *\n * @example\n * ```ts\n * const result = await knowledge.ask('座山方皮是什么?')\n * if (result.success) console.log(result.data.answer)\n * ```\n */\n async ask(query: string, options?: KnowledgeAskOptions): Promise<HaiResult<KnowledgeAskResult>> {\n // 先检索\n const retrieveResult = await this.retrieve(query, options)\n if (!retrieveResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_ragFailed', { params: { error: retrieveResult.error.message } }), retrieveResult.error)\n }\n\n const { items, citations } = retrieveResult.data\n\n // 格式化上下文(带编号引用标记)\n const contextText = items.length > 0\n ? items.map((item, i) => {\n const source = item.citation.title ?? item.citation.documentId ?? item.citation.chunkId ?? 'unknown'\n return `[${i + 1}] (source: ${source}, score: ${item.score.toFixed(3)})\\n${item.content}`\n }).join('\\n\\n')\n : 'No relevant context found.'\n\n // 构建 LLM 消息\n const systemPrompt = options?.systemPrompt ?? DEFAULT_KNOWLEDGE_ASK_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n\n // 消息历史\n if (options?.messages) {\n messages.push(...options.messages)\n }\n\n messages.push({ role: 'user', content: query })\n\n // 调用 LLM\n const chatResult = await llm.chat({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_ragFailed', { params: { error: chatResult.error.message } }), chatResult.error)\n }\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n logger.trace('Knowledge ask completed', {\n contextCount: items.length,\n model: chatResult.data.model,\n })\n\n return ok({\n answer,\n context: items,\n citations,\n query,\n model: chatResult.data.model,\n usage: chatResult.data.usage\n ? {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n : undefined,\n })\n },\n\n // ─── findByEntity ───\n async findByEntity(entityName: string, options?: EntityQueryOptions): Promise<HaiResult<EntityDocumentResult[]>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const results = await store.findByEntityName(entityName, {\n collection,\n type: options?.type,\n })\n\n return ok(results.map(item => ({\n entity: {\n id: item.entity.id,\n name: item.entity.name,\n type: item.entity.type as KnowledgeEntity['type'],\n aliases: item.entity.aliases,\n description: item.entity.description ?? undefined,\n },\n documents: item.documents.map(doc => ({\n documentId: doc.documentId,\n chunkId: doc.chunkId || undefined,\n collection: doc.collection,\n relevance: doc.relevance,\n context: doc.context ?? undefined,\n })),\n })))\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── listEntities ───\n async listEntities(options?: EntityListOptions): Promise<HaiResult<KnowledgeEntity[]>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const rows = await store.listEntities({\n type: options?.type,\n keyword: options?.keyword,\n limit: options?.limit,\n })\n\n return ok(rows.map(row => ({\n id: row.id,\n name: row.name,\n type: row.type as KnowledgeEntity['type'],\n aliases: row.aliases,\n description: row.description ?? undefined,\n createdAt: row.createdAt ?? undefined,\n updatedAt: row.updatedAt ?? undefined,\n })))\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── listDocuments ───\n async listDocuments(options?: KnowledgeDocumentListOptions): Promise<HaiResult<KnowledgeDocumentInfo[]>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const docs = await store.listDocuments(collection, {\n offset: options?.offset,\n limit: options?.limit,\n })\n\n // 查询每个文档的实体关联数\n const docIds = docs.map(d => d.documentId)\n const entityCounts = await store.listDocumentEntityCounts(docIds, collection)\n\n const result: KnowledgeDocumentInfo[] = docs.map(d => ({\n documentId: d.documentId,\n title: d.title ?? undefined,\n url: d.url ?? undefined,\n chunkCount: d.chunkCount,\n entityCount: entityCounts.get(d.documentId) ?? 0,\n createdAt: d.createdAt,\n }))\n\n return ok(result)\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── removeDocument ───\n async removeDocument(documentId: string, options?: KnowledgeDocumentRemoveOptions): Promise<HaiResult<void>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n // ① 查询该文档的所有 chunk ID\n const docMeta = await store.getDocument(documentId, collection)\n const chunkCount = docMeta?.chunkCount ?? 100 // 回退到大数保证覆盖\n\n // 生成要删除的向量 ID 列表\n const vectorIds: string[] = []\n for (let i = 0; i < chunkCount; i++) {\n vectorIds.push(`${documentId}:chunk-${i}`)\n }\n\n // ② 删除向量\n if (vectorIds.length > 0) {\n try {\n await store.removeVectors(collection, vectorIds)\n }\n catch (vecError) {\n logger.warn('Failed to delete some vectors', { documentId, error: vecError })\n }\n }\n\n // ③ 删除实体关联\n await store.removeDocumentEntityRelations(documentId, collection)\n\n // ④ 删除文档元数据\n await store.removeDocument(documentId, collection)\n\n logger.debug('Document removed', { documentId, collection })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 从文件路径读取并导入文档(仅 Node.js 端可用)\n */\n async ingestFile(input: KnowledgeIngestFileInput): Promise<HaiResult<KnowledgeIngestResult>> {\n try {\n const { readFile } = await import('node:fs/promises')\n const { basename } = await import('node:path')\n const content = await readFile(input.filePath, { encoding: input.encoding ?? 'utf-8' })\n const fileName = basename(input.filePath)\n const documentId = input.documentId ?? fileName\n\n return this.ingest({\n documentId,\n content,\n title: input.title ?? fileName,\n url: input.filePath,\n collection: input.collection,\n metadata: input.metadata,\n enableEntityExtraction: input.enableEntityExtraction,\n cleanOptions: input.cleanOptions,\n chunkOptions: input.chunkOptions,\n })\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 批量导入文档,逐个执行 ingest(),单个失败不中断\n */\n async ingestBatch(\n inputs: KnowledgeIngestInput[],\n onProgress?: (progress: KnowledgeIngestBatchProgress) => void,\n ): Promise<HaiResult<KnowledgeIngestBatchResult>> {\n const startTime = Date.now()\n let successCount = 0\n let failureCount = 0\n const results: KnowledgeIngestBatchResult['results'] = []\n\n for (let i = 0; i < inputs.length; i++) {\n const input = inputs[i]\n const documentId = input.documentId ?? `batch-${i}`\n const ingestResult = await this.ingest(input)\n\n if (ingestResult.success) {\n successCount++\n results.push({ documentId, result: ingestResult.data })\n onProgress?.({ completed: i + 1, total: inputs.length, currentDocumentId: documentId, result: ingestResult.data })\n }\n else {\n failureCount++\n results.push({ documentId, error: ingestResult.error })\n onProgress?.({ completed: i + 1, total: inputs.length, currentDocumentId: documentId, error: ingestResult.error })\n }\n }\n\n return ok({ successCount, failureCount, results, duration: Date.now() - startTime })\n },\n }\n}\n","/**\n * @h-ai/ai — LLM 工具定义与注册表\n *\n * 提供 OpenAI function calling 的工具定义、参数校验和批量执行功能。\n * @module ai-llm-tool\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { z } from 'zod'\n\nimport type {\n DefineToolOptions,\n Tool,\n ToolCall,\n ToolDefinition,\n ToolMessage,\n ToolRegistryOperations,\n} from './ai-llm-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport { z as zod } from 'zod'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n// ─── 工具定义 ───\n\n/**\n * 定义工具(Zod schema 类型推断 + 自动参数校验)\n *\n * 调用 `execute()` 时自动用 Zod schema 校验输入,校验失败返回 `VALIDATION_FAILED` 错误。\n *\n * @param options - 工具选项(名称、描述、参数 schema、处理函数)\n * @returns 工具实例(含 `execute` 和 `toDefinition`)\n *\n * @example\n * ```ts\n * const weatherTool = defineTool({\n * name: 'getWeather',\n * description: '获取天气',\n * parameters: z.object({ city: z.string() }),\n * handler: async ({ city }) => ({ temp: 25, city }),\n * })\n * const result = await weatherTool.execute({ city: '北京' })\n * ```\n */\nexport function defineTool<TInput, TOutput>(\n options: DefineToolOptions<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const { name, description, parameters, handler } = options\n\n return {\n name,\n description,\n parameters,\n\n async execute(input: TInput): Promise<HaiResult<TOutput>> {\n try {\n const parseResult = parameters.safeParse(input)\n if (!parseResult.success) {\n return err(HaiAIError.TOOL_VALIDATION_FAILED, parseResult.error.message)\n }\n const output = await handler(parseResult.data)\n return ok(output)\n }\n catch (error) {\n return err(HaiAIError.TOOL_EXECUTION_FAILED, error instanceof Error ? error.message : String(error), error)\n }\n },\n\n toDefinition(): ToolDefinition {\n return {\n type: 'function',\n function: {\n name,\n description,\n parameters: zodToJsonSchema(parameters),\n },\n }\n },\n }\n}\n\n// ─── 工具注册表 ───\n\n/**\n * 创建工具注册表(闭包实现,非 class)\n *\n * 注册表支持链式调用(`register` / `registerMany` 返回自身),\n * 同名工具注册时覆盖旧值。\n *\n * @returns 工具注册表实例\n *\n * @example\n * ```ts\n * const registry = createToolRegistry()\n * registry.register(weatherTool).register(searchTool)\n * const defs = registry.getDefinitions() // 用于 ChatCompletionRequest.tools\n * const result = await registry.execute(toolCall)\n * ```\n */\nexport function createToolRegistry(): ToolRegistryOperations {\n const tools: Map<string, Tool> = new Map()\n\n const registry: ToolRegistryOperations = {\n /** 注册单个工具(同名覆盖),返回 registry 支持链式调用 */\n register<TInput, TOutput>(tool: Tool<TInput, TOutput>): ToolRegistryOperations {\n tools.set(tool.name, tool as Tool)\n return registry\n },\n\n /** 批量注册工具,返回 registry 支持链式调用 */\n registerMany(toolList: Tool<unknown, unknown>[]): ToolRegistryOperations {\n for (const tool of toolList) {\n tools.set(tool.name, tool as Tool)\n }\n return registry\n },\n\n /** 移除指定名称的工具,返回是否成功删除 */\n unregister(name: string): boolean {\n return tools.delete(name)\n },\n\n /** 按名称获取工具实例(未注册返回 `undefined`) */\n get(name: string): Tool | undefined {\n return tools.get(name)\n },\n\n /** 判断是否已注册指定名称的工具 */\n has(name: string): boolean {\n return tools.has(name)\n },\n\n /** 获取所有已注册工具的名称列表 */\n getNames(): string[] {\n return Array.from(tools.keys())\n },\n\n /** 获取所有工具的 OpenAI function calling 定义 */\n getDefinitions(): ToolDefinition[] {\n return Array.from(tools.values()).map(tool => tool.toDefinition())\n },\n\n /** 执行单个工具调用,解析 JSON 参数后调用工具的 execute 方法 */\n async execute(toolCall: ToolCall): Promise<HaiResult<ToolMessage>> {\n // 仅支持 function 类型工具调用(OpenAI SDK union 含 custom 类型)\n if (toolCall.type !== 'function') {\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: 'unknown' } }))\n }\n const tool = tools.get(toolCall.function.name)\n if (!tool) {\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: toolCall.function.name } }))\n }\n\n let args: unknown\n try {\n args = JSON.parse(toolCall.function.arguments)\n }\n catch {\n return err(HaiAIError.TOOL_VALIDATION_FAILED, aiM('ai_toolInvalidJson'))\n }\n\n const result = await tool.execute(args)\n if (!result.success) {\n return result\n }\n\n const content = typeof result.data === 'string'\n ? result.data\n : JSON.stringify(result.data)\n\n return ok({\n role: 'tool',\n content,\n tool_call_id: toolCall.id,\n })\n },\n\n /** 批量执行工具调用(默认并行),任一失败时立即返回错误 */\n async executeAll(\n toolCalls: ToolCall[],\n options: { parallel?: boolean } = {},\n ): Promise<HaiResult<ToolMessage[]>> {\n const { parallel = true } = options\n const messages: ToolMessage[] = []\n\n if (parallel) {\n const results = await Promise.all(\n toolCalls.map(tc => registry.execute(tc)),\n )\n for (const result of results) {\n if (!result.success) {\n return result\n }\n messages.push(result.data)\n }\n }\n else {\n for (const toolCall of toolCalls) {\n const result = await registry.execute(toolCall)\n if (!result.success) {\n return result\n }\n messages.push(result.data)\n }\n }\n\n return ok(messages)\n },\n\n /** 清空所有已注册工具 */\n clear(): void {\n tools.clear()\n },\n\n /** 已注册工具数量 */\n get size(): number {\n return tools.size\n },\n }\n\n return registry\n}\n\n// ─── Zod → JSON Schema ───\n\n/**\n * 将 Zod schema 转换为 JSON Schema(移除 $schema 字段)\n *\n * @param schema - Zod 类型定义\n * @returns JSON Schema 对象\n */\nfunction zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = zod.toJSONSchema(schema)\n const { $schema: _, ...rest } = jsonSchema as Record<string, unknown>\n return rest\n}\n","/**\n * @h-ai/ai — LLM Provider: OpenAI 兼容实现\n *\n * 工厂函数创建,基于 OpenAI SDK 支持所有 OpenAI 兼容的 API 端点。\n * @module ai-llm-provider-openai\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type {\n AILLMFunctionsDeps,\n ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n LLMProvider,\n} from '../ai-llm-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport OpenAI from 'openai'\n\nimport { resolveModelEntry } from '../../ai-config.js'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\n\n// ─── 辅助函数 ───\n\n/**\n * 清理错误对象中可能包含的敏感信息\n *\n * OpenAI SDK 的 APIError 可能在 headers 中携带 Authorization Bearer Token,\n * 直接作为 cause 传递会泄漏 API Key。此函数仅保留安全字段。\n *\n * @param error - 原始错误对象\n * @returns 去除敏感信息的错误摘要\n */\nfunction sanitizeErrorCause(error: unknown): { message: string, status?: number, code?: string } {\n if (error instanceof OpenAI.APIError) {\n return { message: error.message, status: error.status, code: error.code ?? undefined }\n }\n if (error instanceof Error) {\n return { message: error.message }\n }\n return { message: String(error) }\n}\n\n/**\n * 将 OpenAI SDK 异常映射为标准错误定义 + 消息\n *\n * 映射规则:\n * - HTTP 429 → `RATE_LIMITED`\n * - HTTP 404 → `MODEL_NOT_FOUND`\n * - HTTP 400 → `INVALID_REQUEST`\n * - 其他 `APIError` → `API_ERROR`\n * - `AbortError` → `TIMEOUT`\n * - 其他 → `INTERNAL_ERROR`\n *\n * @param error - 捕获的异常\n * @returns 统一错误映射(cause 已脱敏,不含 API Key)\n */\nfunction toAIError(error: unknown): { def: HaiErrorDef, message: string, cause: unknown } {\n if (error instanceof OpenAI.APIError) {\n let def = HaiAIError.API_ERROR\n if (error.status === 429) {\n def = HaiAIError.RATE_LIMITED\n }\n else if (error.status === 404) {\n def = HaiAIError.MODEL_NOT_FOUND\n }\n else if (error.status === 400) {\n def = HaiAIError.INVALID_REQUEST\n }\n return { def, message: error.message, cause: sanitizeErrorCause(error) }\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n def: HaiAIError.TIMEOUT,\n message: aiM('ai_requestTimeout'),\n cause: sanitizeErrorCause(error),\n }\n }\n\n return {\n def: HaiAIError.INTERNAL_ERROR,\n message: aiM('ai_internalError', {\n params: { error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n cause: sanitizeErrorCause(error),\n }\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 创建 OpenAI 兼容 LLM Provider\n *\n * 支持所有 OpenAI 兼容 API 端点(如 Azure OpenAI、本地 Ollama 等)。\n * 通过 `resolveModelEntry()` 统一解析模型配置(apiKey / baseUrl / timeout 等),\n * 支持多模型条目各自配置不同的 API 端点。\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns LLMProvider 实例\n */\nexport function createOpenAIProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const { config } = deps\n\n // 缓存客户端实例,按 apiKey+baseURL+timeout 复用,支持多端点并发调用\n const clientCache = new Map<string, OpenAI>()\n\n function getClient(apiKey: string, baseURL: string, timeout: number): OpenAI {\n const key = `${apiKey}::${baseURL}::${timeout}`\n let client = clientCache.get(key)\n if (!client) {\n client = new OpenAI({ apiKey, baseURL, timeout })\n clientCache.set(key, client)\n }\n return client\n }\n\n function resolveClient(requestModel?: string): HaiResult<{ client: OpenAI, model: string }> {\n const resolvedResult = resolveModelEntry(config.llm, 'chat', requestModel, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for chat' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const { apiKey, baseUrl, timeout, model } = resolvedResult.data\n return ok({ client: getClient(apiKey ?? '', baseUrl ?? 'https://api.openai.com/v1', timeout), model })\n }\n\n return {\n async chat(request: ChatCompletionRequest): Promise<HaiResult<ChatCompletionResponse>> {\n const clientResult = resolveClient(request.model)\n if (!clientResult.success)\n return clientResult\n const { client, model } = clientResult.data\n const { objectId: _objectId, sessionId: _sessionId, ...openaiRequest } = request\n try {\n const response = await client.chat.completions.create({\n ...openaiRequest,\n model,\n stream: false,\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming)\n return ok(response)\n }\n catch (error) {\n const mapped = toAIError(error)\n return err(mapped.def, mapped.message, mapped.cause)\n }\n },\n\n async* chatStream(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk> {\n const clientResult = resolveClient(request.model)\n if (!clientResult.success)\n throw new Error(clientResult.error.message)\n const { client, model } = clientResult.data\n const { objectId: _objectId, sessionId: _sessionId, ...openaiRequest } = request\n const stream = await client.chat.completions.create({\n ...openaiRequest,\n model,\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming)\n for await (const chunk of stream) {\n yield chunk\n }\n },\n\n async listModels(): Promise<HaiResult<string[]>> {\n const clientResult = resolveClient()\n if (!clientResult.success)\n return clientResult\n const { client } = clientResult.data\n try {\n const response = await client.models.list()\n const models = response.data.map((m: { id: string }) => m.id)\n return ok(models)\n }\n catch (error) {\n const mapped = toAIError(error)\n return err(mapped.def, mapped.message, mapped.cause)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — LLM 子功能工厂\n *\n * 根据配置创建 OpenAI Provider,组装 LLM 操作接口。\n * 同时导出工具与流处理的纯函数包装器(不依赖配置,可独立使用)。\n * @module ai-llm-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AIConfig } from '../ai-config.js'\n\nimport type { AIRelStore, InteractionScope, SessionInfo } from '../store/ai-store-types.js'\nimport type {\n AskOptions,\n ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatHistoryOptions,\n ChatMessage,\n ChatRecord,\n LLMOperations,\n StreamOperations,\n TokenUsage,\n ToolsOperations,\n} from './ai-llm-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { collectStream, createSSEDecoder, createStreamProcessor, encodeSSE } from './ai-llm-stream.js'\nimport { createToolRegistry, defineTool } from './ai-llm-tool.js'\nimport { createOpenAIProvider } from './providers/ai-llm-provider-openai.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'llm' })\n\n// ─── LLM 子功能 ───\n\n/** LLM 子功能存储依赖 */\nexport interface AILLMStores {\n /** 对话记录存储(可选;未传入时不记录) */\n recordStore?: AIRelStore<ChatRecord>\n /** 会话信息存储(可选;未传入时 listSessions 返回空) */\n sessionStore?: AIRelStore<SessionInfo>\n}\n\n/** LLM 子功能创建结果 */\nexport interface AILLMFunctions {\n /** LLM 操作接口(对话 / 流式对话 / 模型列表 / 历史 / 会话) */\n llm: LLMOperations\n /** 工具操作接口(定义工具 / 创建注册表) */\n tools: ToolsOperations\n /** 流处理操作接口(流处理器 / SSE 编解码) */\n stream: StreamOperations\n}\n\n/**\n * 创建 LLM 相关的全部子功能\n *\n * 根据配置创建 OpenAI Provider,组装 LLM、工具、流处理三个操作接口。\n * 若传入 `deps.recordStore`,chat 调用会自动保存 ChatRecord。\n *\n * @param config - 校验后的 AI 配置\n * @param deps - 可选依赖(记录存储、会话存储)\n * @returns `{ llm, tools, stream }` 三个操作接口\n */\nexport function createAILLMFunctions(config: AIConfig, deps?: AILLMStores): AILLMFunctions {\n const provider = createOpenAIProvider({ config })\n const recordStore = deps?.recordStore\n const sessionStore = deps?.sessionStore\n let recordSeq = 0\n\n /**\n * 从消息列表中提取会话标题(取最后一条用户消息,截断到 50 字符)\n */\n function extractTitle(messages: ChatMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg.role === 'user') {\n const text = typeof msg.content === 'string'\n ? msg.content\n : msg.content.filter(c => c.type === 'text').map(c => c.text).join(' ')\n return text.length > 50 ? `${text.slice(0, 50)}...` : text\n }\n }\n return 'New Session'\n }\n\n /**\n * 保存 ChatRecord 并同步更新 SessionInfo\n */\n async function saveRecordAndSession(\n record: ChatRecord,\n messages: ChatMessage[],\n ): Promise<void> {\n await recordStore!.save(record.id, record, { objectId: record.objectId, sessionId: record.sessionId })\n logger.trace('Chat record saved', { id: record.id, objectId: record.objectId, sessionId: record.sessionId })\n\n if (sessionStore) {\n const sid = record.sessionId\n const existing = await sessionStore.get(sid)\n const now = Date.now()\n if (existing) {\n await sessionStore.save(sid, { ...existing, updatedAt: now }, { objectId: existing.objectId })\n }\n else {\n await sessionStore.save(sid, {\n sessionId: sid,\n objectId: record.objectId,\n title: extractTitle(messages),\n createdAt: now,\n updatedAt: now,\n }, { objectId: record.objectId })\n }\n }\n }\n\n /**\n * 包装 chat,在有 objectId 时自动保存 ChatRecord\n */\n async function chatWithRecord(request: ChatCompletionRequest): Promise<HaiResult<ChatCompletionResponse>> {\n const start = Date.now()\n const result = await provider.chat(request)\n\n // 仅在调用成功且传入了 objectId + recordStore 且未禁用持久化时记录\n if (result.success && request.objectId && recordStore && request.enablePersist !== false) {\n try {\n const response = result.data\n const choice = response.choices[0]\n const record: ChatRecord = {\n id: `${response.id}_${Date.now()}_${recordSeq++}`,\n objectId: request.objectId,\n sessionId: request.sessionId ?? 'default',\n request: {\n model: response.model,\n messages: request.messages,\n },\n response: {\n content: choice?.message?.content ?? '',\n toolCalls: choice?.message?.tool_calls,\n finishReason: choice?.finish_reason ?? 'stop',\n usage: response.usage ?? { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n },\n createdAt: Date.now(),\n duration: Date.now() - start,\n }\n await saveRecordAndSession(record, request.messages)\n }\n catch (error) {\n // 记录失败不影响 chat 结果\n logger.debug('Failed to save chat record', { error })\n }\n }\n\n return result\n }\n\n /**\n * 包装 chatStream,在有 objectId 时自动保存 ChatRecord\n *\n * 流式输出不受影响,记录在流消费完成后异步保存。\n */\n async function* chatStreamWithRecord(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk> {\n const start = Date.now()\n const shouldRecord = !!(request.objectId && recordStore && request.enablePersist !== false)\n\n // 累积流式响应的中间状态\n let content = ''\n let finishReason: string | null = null\n // 使用更窄的本地类型:流式响应中工具调用均为 function 类型\n const toolCalls: Array<{ id: string, type: 'function', function: { name: string, arguments: string } }> = []\n let streamId = ''\n let resolvedModel = request.model ?? ''\n\n for await (const chunk of provider.chatStream(request)) {\n yield chunk\n\n if (!shouldRecord)\n continue\n\n // 累积元数据\n if (!streamId && chunk.id)\n streamId = chunk.id\n if (!resolvedModel && chunk.model)\n resolvedModel = chunk.model\n\n for (const choice of chunk.choices) {\n if (choice.delta.content)\n content += choice.delta.content\n if (choice.finish_reason)\n finishReason = choice.finish_reason\n // 累积工具调用片段\n if (choice.delta.tool_calls) {\n for (const tc of choice.delta.tool_calls) {\n if (!toolCalls[tc.index]) {\n toolCalls[tc.index] = { id: tc.id ?? '', type: 'function', function: { name: tc.function?.name ?? '', arguments: '' } }\n }\n if (tc.function?.arguments)\n toolCalls[tc.index].function.arguments += tc.function.arguments\n if (tc.function?.name)\n toolCalls[tc.index].function.name = tc.function.name\n if (tc.id)\n toolCalls[tc.index].id = tc.id\n }\n }\n }\n }\n\n // 流消费完成后保存记录\n if (shouldRecord) {\n try {\n const usage: TokenUsage = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 }\n const record: ChatRecord = {\n id: `${streamId || 'stream'}_${Date.now()}_${recordSeq++}`,\n objectId: request.objectId!,\n sessionId: request.sessionId ?? 'default',\n request: {\n model: resolvedModel,\n messages: request.messages,\n },\n response: {\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls.filter(Boolean) : undefined,\n finishReason: finishReason ?? 'stop',\n usage,\n },\n createdAt: Date.now(),\n duration: Date.now() - start,\n }\n await saveRecordAndSession(record, request.messages)\n }\n catch (error) {\n logger.debug('Failed to save stream chat record', { error })\n }\n }\n }\n\n /**\n * 查询对话历史记录\n */\n async function getHistory(\n scope: InteractionScope,\n options?: ChatHistoryOptions,\n ): Promise<HaiResult<ChatRecord[]>> {\n if (!recordStore) {\n return ok([])\n }\n try {\n const records = await recordStore.query({\n objectId: scope.objectId,\n sessionId: scope.sessionId,\n orderBy: { field: 'createdAt', direction: options?.order ?? 'desc' },\n limit: options?.limit,\n })\n return ok(records)\n }\n catch (error) {\n return err(HaiAIError.LLM_HISTORY_FAILED, aiM('ai_llmHistoryFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n\n /**\n * 列出指定 objectId 下的所有会话\n */\n async function listSessions(\n objectId: string,\n ): Promise<HaiResult<SessionInfo[]>> {\n if (!sessionStore) {\n return ok([])\n }\n try {\n const sessions = await sessionStore.query({\n objectId,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n })\n return ok(sessions)\n }\n catch (error) {\n return err(HaiAIError.LLM_HISTORY_FAILED, aiM('ai_llmHistoryFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n\n const llm: LLMOperations = {\n chat: chatWithRecord,\n chatStream: chatStreamWithRecord,\n listModels: () => provider.listModels(),\n getHistory,\n listSessions,\n\n async ask(question: string, options?: AskOptions): Promise<HaiResult<string>> {\n const messages: ChatMessage[] = []\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt })\n }\n messages.push({ role: 'user', content: question })\n const result = await chatWithRecord({\n messages,\n model: options?.model,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n })\n if (!result.success)\n return result as HaiResult<never>\n return ok(result.data.choices[0]?.message?.content ?? '')\n },\n\n async* askStream(question: string, options?: AskOptions): AsyncIterable<string> {\n const messages: ChatMessage[] = []\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt })\n }\n messages.push({ role: 'user', content: question })\n for await (const chunk of chatStreamWithRecord({\n messages,\n model: options?.model,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n })) {\n const delta = chunk.choices[0]?.delta?.content\n if (delta)\n yield delta\n }\n },\n }\n\n const tools: ToolsOperations = {\n define: defineTool,\n createRegistry: createToolRegistry,\n }\n\n const stream: StreamOperations = {\n createProcessor: createStreamProcessor,\n collect: collectStream,\n createSSEDecoder,\n encodeSSE,\n }\n\n return { llm, tools, stream }\n}\n","/**\n * @h-ai/ai — MCP 子功能工厂\n *\n * 提供 MCP 工具/资源/提示词的注册与调用功能。\n * @module ai-mcp-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type {\n AIMCPFunctionsDeps,\n MCPContext,\n MCPOperations,\n MCPPrompt,\n MCPPromptMessage,\n MCPResource,\n MCPResourceContent,\n MCPToolDefinition,\n MCPToolHandler,\n} from './ai-mcp-types.js'\n\nimport { err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n// ─── 内部类型 ───\n\n/** 工具注册记录(定义 + 处理器) */\ninterface ToolRegistration {\n /** 工具元数据 */\n definition: MCPToolDefinition\n /** 工具执行处理器 */\n handler: MCPToolHandler\n}\n\n/** 资源注册记录(元数据 + 内容加载器) */\ninterface ResourceRegistration {\n /** 资源元数据 */\n resource: MCPResource\n /** 内容加载器(延迟读取) */\n handler: () => Promise<MCPResourceContent>\n}\n\n/** 提示词注册记录(元数据 + 模板渲染器) */\ninterface PromptRegistration {\n /** 提示词元数据 */\n prompt: MCPPrompt\n /** 模板渲染器(接收参数,返回消息列表) */\n handler: (args: Record<string, string>) => Promise<MCPPromptMessage[]>\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 创建 MCP 子功能\n *\n * 提供工具、资源、提示词的注册与调用功能。\n * 注册是同步,调用是异步。所有调用方法返回 `HaiResult<T>`。\n *\n * @param _deps - MCP 子功能依赖(config 保留供将来使用)\n * @returns MCPOperations 接口\n *\n * @example\n * ```ts\n * const mcp = createAIMCPFunctions({ config })\n * mcp.registerTool(\n * { name: 'echo', description: '回音', inputSchema: { type: 'object' } },\n * async (input) => input,\n * )\n * const result = await mcp.callTool('echo', { msg: 'hi' })\n * ```\n */\nexport function createAIMCPFunctions(_deps: AIMCPFunctionsDeps): MCPOperations {\n // _deps.config 保留供将来使用\n\n /** 工具注册表(按 name 索引) */\n const tools = new Map<string, ToolRegistration>()\n /** 资源注册表(按 uri 索引) */\n const resources = new Map<string, ResourceRegistration>()\n /** 提示词注册表(按 name 索引) */\n const prompts = new Map<string, PromptRegistration>()\n\n return {\n /** 注册 MCP 工具(同名覆盖) */\n registerTool<TInput, TOutput>(\n definition: MCPToolDefinition,\n handler: MCPToolHandler<TInput, TOutput>,\n ): HaiResult<void> {\n tools.set(definition.name, {\n definition,\n handler: handler as MCPToolHandler,\n })\n return ok(undefined)\n },\n\n /** 注册 MCP 资源(同 URI 覆盖) */\n registerResource(\n resource: MCPResource,\n handler: () => Promise<MCPResourceContent>,\n ): HaiResult<void> {\n resources.set(resource.uri, { resource, handler })\n return ok(undefined)\n },\n\n /** 注册 MCP 提示词模板(同名覆盖) */\n registerPrompt(\n prompt: MCPPrompt,\n handler: (args: Record<string, string>) => Promise<MCPPromptMessage[]>,\n ): HaiResult<void> {\n prompts.set(prompt.name, { prompt, handler })\n return ok(undefined)\n },\n\n /**\n * 调用已注册的 MCP 工具\n *\n * @param name - 工具名称\n * @param args - 输入参数\n * @param context - 执行上下文(可选,未传时自动生成 requestId)\n * @returns 工具返回值或 `MCP_TOOL_ERROR`\n */\n async callTool(\n name: string,\n args: unknown,\n context?: MCPContext,\n ): Promise<HaiResult<unknown>> {\n try {\n const registration = tools.get(name)\n if (!registration) {\n return err(HaiAIError.MCP_TOOL_ERROR, aiM('ai_mcpToolNotFound', { params: { name } }))\n }\n const ctx: MCPContext = context || { requestId: crypto.randomUUID() }\n const result = await registration.handler(args, ctx)\n return ok(result)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_TOOL_ERROR,\n aiM('ai_mcpToolFailed', {\n params: { name, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n\n /**\n * 读取已注册的 MCP 资源\n *\n * @param uri - 资源 URI\n * @returns 资源内容或 `MCP_RESOURCE_ERROR`\n */\n async readResource(uri: string): Promise<HaiResult<MCPResourceContent>> {\n try {\n const registration = resources.get(uri)\n if (!registration) {\n return err(HaiAIError.MCP_RESOURCE_ERROR, aiM('ai_mcpResourceNotFound', { params: { uri } }))\n }\n const content = await registration.handler()\n return ok(content)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_RESOURCE_ERROR,\n aiM('ai_mcpResourceFailed', {\n params: { uri, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n\n /**\n * 获取已注册的 MCP 提示词\n *\n * 自动校验必填参数,缺少时返回 `MCP_PROTOCOL_ERROR`。\n *\n * @param name - 提示词名称\n * @param args - 模板参数\n * @returns 渲染后的消息列表或错误\n */\n async getPrompt(\n name: string,\n args: Record<string, string>,\n ): Promise<HaiResult<MCPPromptMessage[]>> {\n try {\n const registration = prompts.get(name)\n if (!registration) {\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpPromptNotFound', { params: { name } }))\n }\n\n // 验证必需参数\n for (const arg of registration.prompt.arguments || []) {\n if (arg.required && !(arg.name in args)) {\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpPromptMissingArg', { params: { name, arg: arg.name } }))\n }\n }\n\n const messages = await registration.handler(args)\n return ok(messages)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_PROTOCOL_ERROR,\n aiM('ai_mcpPromptFailed', {\n params: { name, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 记忆提取\n *\n * 使用 LLM 从对话消息中提取值得记住的事实、偏好、事件等。\n * @module ai-memory-extractor\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { MemoryEntryInput, MemoryType } from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-extractor' })\n\n// ─── 提取提示词 ───\n\nconst MEMORY_EXTRACTION_SYSTEM_PROMPT = `You are a memory extraction assistant. Analyze the conversation and extract important information worth remembering for future interactions.\n\nExtract items in the following categories:\n- \"fact\": Factual information mentioned in the conversation\n- \"preference\": User preferences, likes, dislikes, or habits\n- \"event\": Important events, deadlines, or time-specific information\n- \"entity\": Key people, organizations, projects, or concepts mentioned\n- \"instruction\": Explicit user instructions or rules for future behavior\n\nReturn a JSON array of extracted memories. Each memory has:\n- \"content\": a concise description of the memory (string, required)\n- \"type\": one of \"fact\", \"preference\", \"event\", \"entity\", \"instruction\" (required)\n- \"importance\": a float from 0.0 to 1.0 indicating how important this is to remember (required)\n\nRules:\n- Only extract clearly stated information. Do NOT infer or guess.\n- Be concise — each memory should be a single clear statement.\n- Deduplicate: do not extract the same information twice.\n- Rate importance based on likely future usefulness (0.3 = minor detail, 0.7 = moderately useful, 1.0 = critical).\n- Return an empty array [] if no memories worth extracting are found.\n- Return ONLY the JSON array, no markdown fences, no explanation.`\n\n/**\n * 将对话消息格式化为文本\n */\nfunction formatMessages(messages: ChatMessage[]): string {\n return messages\n .filter(m => m.role === 'user' || m.role === 'assistant')\n .map((m) => {\n const content = typeof m.content === 'string' ? m.content : '[multimodal content]'\n return `${m.role}: ${content}`\n })\n .join('\\n')\n}\n\n/**\n * 从对话中提取记忆\n *\n * @param llm - LLM 操作接口\n * @param messages - 对话消息列表\n * @param options - 提取选项\n * @param options.types - 只提取指定类型\n * @param options.model - 指定提取用的模型\n * @param options.minImportance - 过滤低重要性条目\n * @param options.objectId - 所属主体 ID\n * @param options.systemPrompt - 自定义提取用的系统提示词\n * @returns 提取到的记忆输入列表\n */\nexport async function extractMemories(\n llm: LLMOperations,\n messages: ChatMessage[],\n options?: {\n types?: MemoryType[]\n model?: string\n minImportance?: number\n objectId?: string\n systemPrompt?: string\n },\n): Promise<HaiResult<MemoryEntryInput[]>> {\n const conversationText = formatMessages(messages)\n if (!conversationText.trim()) {\n return ok([])\n }\n\n try {\n let userPrompt = conversationText\n if (options?.types && options.types.length > 0) {\n userPrompt += `\\n\\nOnly extract memories of these types: ${options.types.join(', ')}`\n }\n\n const chatResult = await llm.chat({\n model: options?.model,\n messages: [\n { role: 'system', content: options?.systemPrompt ?? MEMORY_EXTRACTION_SYSTEM_PROMPT },\n { role: 'user', content: userPrompt },\n ],\n temperature: 0.1,\n })\n\n if (!chatResult.success) {\n logger.warn('Memory extraction LLM call failed', { error: chatResult.error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n const content = chatResult.data.choices[0]?.message?.content ?? ''\n let entries = parseMemoryResponse(content)\n\n // 按 minImportance 过滤\n if (options?.minImportance && options.minImportance > 0) {\n entries = entries.filter(e => (e.importance ?? 0) >= options.minImportance!)\n }\n\n // 按类型过滤\n if (options?.types && options.types.length > 0) {\n const typeSet = new Set<MemoryType>(options.types)\n entries = entries.filter(e => typeSet.has(e.type))\n }\n\n // 附加 objectId\n if (options?.objectId) {\n entries = entries.map(e => ({ ...e, objectId: options.objectId }))\n }\n\n logger.trace('Memory extraction completed', { messageCount: messages.length, extractedCount: entries.length })\n return ok(entries)\n }\n catch (error) {\n logger.error('Memory extraction failed', { error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\n// ─── 响应解析 ───\n\nconst VALID_MEMORY_TYPES = new Set<string>(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/**\n * 解析 LLM 返回的记忆 JSON\n */\nfunction parseMemoryResponse(content: string): MemoryEntryInput[] {\n let cleaned = content.trim()\n\n // 去除 markdown 代码围栏\n if (cleaned.startsWith('```')) {\n cleaned = cleaned.replace(/^```(?:json)?\\n?/, '').replace(/\\n?```$/, '')\n }\n\n try {\n const parsed = JSON.parse(cleaned) as unknown\n\n if (Array.isArray(parsed)) {\n return parsed.filter(isValidMemoryItem).map(normalizeMemoryItem)\n }\n\n if (typeof parsed === 'object' && parsed !== null && 'memories' in parsed) {\n const memories = (parsed as { memories: unknown }).memories\n if (Array.isArray(memories)) {\n return memories.filter(isValidMemoryItem).map(normalizeMemoryItem)\n }\n }\n\n logger.warn('Memory extraction returned unexpected format', { content: content.slice(0, 200) })\n return []\n }\n catch {\n logger.warn('Memory extraction returned invalid JSON', { content: content.slice(0, 200) })\n return []\n }\n}\n\n/**\n * 校验记忆结构\n */\nfunction isValidMemoryItem(item: unknown): item is Record<string, unknown> {\n if (typeof item !== 'object' || item === null)\n return false\n const obj = item as Record<string, unknown>\n return typeof obj.content === 'string' && obj.content.length > 0\n && typeof obj.type === 'string'\n}\n\n/**\n * 标准化记忆条目\n */\nfunction normalizeMemoryItem(item: Record<string, unknown>): MemoryEntryInput {\n const type = VALID_MEMORY_TYPES.has(item.type as string)\n ? item.type as MemoryType\n : 'fact'\n\n const importance = typeof item.importance === 'number'\n ? Math.max(0, Math.min(1, item.importance))\n : 0.5\n\n return {\n content: (item.content as string).trim(),\n type,\n importance,\n }\n}\n","/**\n * @h-ai/ai — Memory 子功能实现\n *\n * 编排记忆的提取、存储、检索与注入。基于 AIRelStore + AIVectorStore 抽象,\n * 根据配置自动选择内存或持久化存储后端。\n * @module ai-memory-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { MemoryConfig } from '../ai-config.js'\n\nimport type { EmbeddingOperations } from '../embedding/ai-embedding-types.js'\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { AIRelStore, AIVectorStore, StorePage, WhereClause } from '../store/ai-store-types.js'\nimport type {\n MemoryClearOptions,\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryInjectionOptions,\n MemoryListOptions,\n MemoryListPageOptions,\n MemoryOperations,\n MemoryRecallOptions,\n MemoryUpdateInput,\n} from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { extractMemories } from './ai-memory-extractor.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory' })\n\n/**\n * 生成唯一 ID\n */\nfunction generateId(): string {\n return `mem_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n}\n\n/**\n * 余弦相似度\n */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length)\n return 0\n let dot = 0\n let normA = 0\n let normB = 0\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n normA += a[i] * a[i]\n normB += b[i] * b[i]\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\n/**\n * 从消息中提取查询文本(取最后一条用户消息)\n */\nfunction extractQueryFromMessages(messages: ChatMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg.role === 'user') {\n return typeof msg.content === 'string' ? msg.content : ''\n }\n }\n return ''\n}\n\n/**\n * 创建 Memory 操作接口\n *\n * @param config - Memory 配置\n * @param llm - LLM 操作接口(用于提取记忆)\n * @param embedding - Embedding 操作接口(用于向量化 + 相似度检索)\n * @param store - 记忆条目存储\n * @param vectorStore - 向量存储(用于相似度检索)\n * @returns MemoryOperations 实例\n */\n/**\n * 创建 Memory 操作接口\n *\n * 提供基于 LLM 的记忆提取并持久化、基于向量相似度的记忆检索,并支持将相关记忆注入消息得到于 LLM 上下文。\n *\n * @param config - 记忆配置(maxEntries、recencyDecay、systemPrompt 等)\n * @param llm - LLM 操作接口(用于记忆提取)\n * @param embedding - Embedding 接口(可为 null,为 null 时働用关键词回退)\n * @param store - 记忆条目持久化存储\n * @param vectorStore - 向量库存储(用于语义检索)\n * @returns MemoryOperations 实例\n */\nexport function createMemoryOperations(\n config: MemoryConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations | null,\n store: AIRelStore<MemoryEntry>,\n vectorStore: AIVectorStore,\n): MemoryOperations {\n /**\n * 为文本计算 embedding 向量(如果 embedding 可用)\n */\n async function computeVector(text: string): Promise<number[] | undefined> {\n if (!config.embeddingEnabled || !embedding)\n return undefined\n\n const result = await embedding.embedText(text)\n if (result.success)\n return result.data\n\n logger.warn('Failed to compute embedding for memory', { error: result.error })\n return undefined\n }\n\n /**\n * 淘汰低优先级条目(当超过 maxEntries 时)\n */\n async function evictIfNeeded(): Promise<void> {\n const total = await store.count()\n if (total < config.maxEntries)\n return\n\n const all = await store.query({ orderBy: { field: 'createdAt', direction: 'asc' }, limit: total })\n if (all.length === 0)\n return\n\n const now = Date.now()\n const maxAge = 7 * 24 * 60 * 60 * 1000\n\n let lowestScore = Infinity\n let lowestId: string | null = null\n\n for (const entry of all) {\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / maxAge)\n const score = entry.importance * 0.7 + recency * 0.3\n if (score < lowestScore) {\n lowestScore = score\n lowestId = entry.id\n }\n }\n\n if (lowestId) {\n await store.remove(lowestId)\n await vectorStore.remove(lowestId)\n }\n }\n\n /**\n * 持久化一条记忆条目\n */\n async function saveEntry(input: MemoryEntryInput, vector?: number[]): Promise<MemoryEntry> {\n await evictIfNeeded()\n\n const now = Date.now()\n const entry: MemoryEntry = {\n id: generateId(),\n content: input.content,\n type: input.type,\n importance: input.importance ?? 0.5,\n objectId: input.objectId,\n metadata: input.metadata,\n vector,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n }\n\n await store.save(entry.id, entry, { objectId: entry.objectId })\n\n if (vector) {\n await vectorStore.upsert(entry.id, vector, {\n objectId: entry.objectId,\n type: entry.type,\n })\n }\n\n return entry\n }\n\n return {\n /**\n * 从对话消息中提取记忆并存储\n *\n * 调用 LLM 分析对话内容,提取具有持久化价值的记忆条目并写入存储。\n * 每条记忆提取后会同步计算向量(如已启用 embedding)。\n *\n * @param messages - 待分析的对话消息列表\n * @param options - 可选(记忆类型过滤、最小重要性阈值、自定义 model / systemPrompt 等)\n * @returns `ok(MemoryEntry[])` 新写入的记忆列表;LLM 调用失败时返回 `MEMORY_EXTRACT_FAILED`\n */\n async extract(messages: ChatMessage[], options?: MemoryExtractOptions): Promise<HaiResult<MemoryEntry[]>> {\n logger.trace('Extracting memories from conversation', { messageCount: messages.length })\n\n try {\n const extractResult = await extractMemories(llm, messages, {\n types: options?.types,\n model: options?.model,\n minImportance: options?.minImportance,\n objectId: options?.objectId,\n systemPrompt: options?.systemPrompt ?? config.systemPrompt,\n })\n\n if (!extractResult.success)\n return extractResult\n\n const entries: MemoryEntry[] = []\n for (const input of extractResult.data) {\n const vector = await computeVector(input.content)\n const entryInput: MemoryEntryInput = { ...input, objectId: input.objectId ?? options?.objectId }\n const entry = await saveEntry(entryInput, vector)\n entries.push(entry)\n }\n\n logger.trace('Memories extracted and stored', { count: entries.length })\n return ok(entries)\n }\n catch (error) {\n logger.error('Memory extraction failed', { error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 根据查询文本检索最相关的记忆条目\n *\n * 分三阶段执行:\n * 1. 筛选候选集 — 从 store 中检索并按 objectId / type / minImportance 过滤\n * 2. 计算综合得分 — 融合向量相似度、重要性、时间新鲜度三个维度\n * 3. 排序截取 — 按得分降序,返回前 topK 条并更新访问统计\n */\n async recall(query: string, options?: MemoryRecallOptions): Promise<HaiResult<MemoryEntry[]>> {\n const topK = options?.topK ?? config.defaultTopK\n const recencyWeight = options?.recencyWeight ?? (1 - config.recencyDecay)\n\n logger.trace('Recalling memories', { query: query.slice(0, 100), topK })\n\n try {\n // ── 第一阶段:筛选候选集 ──\n const where: WhereClause<MemoryEntry> = {}\n\n // type 过滤:单值用等值匹配,多值用 $in 操作符\n const types = options?.types\n if (types && types.length === 1) {\n where.type = types[0]\n }\n else if (types && types.length > 1) {\n where.type = { $in: types }\n }\n\n // minImportance 用 $gte 操作符下推\n if (options?.minImportance && options.minImportance > 0) {\n where.importance = { $gte: options.minImportance }\n }\n\n const candidates = await store.query({\n objectId: options?.objectId,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n\n if (candidates.length === 0) {\n return ok([])\n }\n\n // ── 第二阶段:计算每条记忆的综合得分 ──\n\n // 2a. 将查询文本转为向量(如启用 embedding)\n let queryVector: number[] | undefined\n if (config.embeddingEnabled && embedding) {\n const embedResult = await embedding.embedText(query)\n if (embedResult.success) {\n queryVector = embedResult.data\n }\n }\n\n // 2b. 从向量库批量获取预计算的相似度得分\n const vectorScores = new Map<string, number>()\n if (queryVector) {\n const vectorResults = await vectorStore.search(queryVector, {\n topK: topK * 3,\n filter: options?.objectId ? { objectId: options.objectId } : undefined,\n })\n for (const r of vectorResults) {\n vectorScores.set(r.id, r.score)\n }\n }\n\n const now = Date.now()\n /** 7 天为时间衰减的基准周期 */\n const maxAge = 7 * 24 * 60 * 60 * 1000\n\n // 2c. 为每条候选计算综合得分\n const scored = candidates.map((entry) => {\n // 向量相似度:优先用向量库预计算得分 → 实时计算余弦相似度 → 关键词匹配回退\n let similarity = vectorScores.get(entry.id) ?? 0\n if (!similarity && queryVector && entry.vector) {\n similarity = cosineSimilarity(queryVector, entry.vector)\n }\n else if (!similarity) {\n // 无向量时通过关键词包含关系进行粗略匹配\n const queryLower = query.toLowerCase()\n const contentLower = entry.content.toLowerCase()\n similarity = contentLower.includes(queryLower) ? 0.8 : 0\n }\n\n // 时间新鲜度:创建时间越近越接近 1,超过 maxAge 后为 0\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / maxAge)\n\n // 语义相关度 = 向量相似度 (80%) + 重要性 (20%)\n const relevance = similarity * 0.8 + entry.importance * 0.2\n\n // 综合得分 = 相关度 × (1 - 时间权重) + 新鲜度 × 时间权重\n // recencyWeight = 0 → 纯相关度排序;recencyWeight = 1 → 纯时间排序\n const score = relevance * (1 - recencyWeight) + recency * recencyWeight\n\n return { entry, score }\n })\n\n // ── 第三阶段:排序截取 + 更新访问统计 ──\n scored.sort((a, b) => b.score - a.score)\n const results: MemoryEntry[] = []\n for (const { entry } of scored.slice(0, topK)) {\n entry.lastAccessedAt = now\n entry.accessCount++\n await store.save(entry.id, entry, { objectId: entry.objectId })\n results.push(entry)\n }\n\n logger.trace('Memory recall completed', { query: query.slice(0, 50), resultCount: results.length })\n return ok(results)\n }\n catch (error) {\n logger.error('Memory recall failed', { error })\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 将检索到的相关记忆注入消息列表\n *\n * 工作流程:\n * 1. 从最后一条用户消息提取查询文本\n * 2. 调用 recall 检索 topK 条相关记忆\n * 3. 将记忆格式化为编号列表(如 [1] (preference) ...)\n * 4. 按 position 注入:\n * - 'system':追加到现有 system 消息末尾(无则插入新 system 消息)\n * - 'before-last':在最后一条用户消息之前插入 system 消息\n */\n async injectMemories(messages: ChatMessage[], options?: MemoryInjectionOptions): Promise<HaiResult<ChatMessage[]>> {\n const topK = options?.topK ?? 5\n const position = options?.position ?? 'system'\n\n try {\n const query = extractQueryFromMessages(messages)\n if (!query) {\n return ok([...messages])\n }\n\n const recallResult = await this.recall(query, { topK, objectId: options?.objectId })\n if (!recallResult.success) {\n return err(HaiAIError.MEMORY_ENRICH_FAILED, aiM('ai_memoryEnrichFailed', { params: { error: recallResult.error.message } }), recallResult.error)\n }\n\n const memories = recallResult.data\n if (memories.length === 0) {\n return ok([...messages])\n }\n\n let memoryText = memories\n .map((m, i) => `[${i + 1}] (${m.type}) ${m.content}`)\n .join('\\n')\n\n if (options?.maxTokens && options.maxTokens > 0) {\n const estimatedTokens = memoryText.length * 0.25\n if (estimatedTokens > options.maxTokens) {\n const maxChars = Math.floor(options.maxTokens / 0.25)\n memoryText = `${memoryText.slice(0, maxChars)}...`\n }\n }\n\n const memoryBlock = `\\n\\n--- Relevant Memories ---\\n${memoryText}\\n--- End Memories ---`\n\n const result = [...messages]\n\n if (position === 'system') {\n const systemIdx = result.findIndex(m => m.role === 'system')\n if (systemIdx >= 0) {\n const systemMsg = result[systemIdx]\n result[systemIdx] = {\n ...systemMsg,\n content: (systemMsg as { content: string }).content + memoryBlock,\n }\n }\n else {\n result.unshift({\n role: 'system',\n content: `You have the following relevant memories from previous interactions:${memoryBlock}`,\n })\n }\n }\n else {\n let lastUserIdx = -1\n for (let i = result.length - 1; i >= 0; i--) {\n if (result[i].role === 'user') {\n lastUserIdx = i\n break\n }\n }\n if (lastUserIdx > 0) {\n result.splice(lastUserIdx, 0, {\n role: 'system',\n content: `Relevant memories:${memoryBlock}`,\n })\n }\n }\n\n logger.trace('Memories enriched', { count: memories.length, position })\n return ok(result)\n }\n catch (error) {\n logger.error('Memory enrichment failed', { error })\n return err(HaiAIError.MEMORY_ENRICH_FAILED, aiM('ai_memoryEnrichFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 手动添加一条记忆\n *\n * 适用于外部直接写入记忆(非 LLM 提取)的场景。\n * 超过 maxEntries 时会自动淡汰优先级最低的条目。\n *\n * @param entry - 记忆条目输入(content、type、importance 等)\n * @returns `ok(MemoryEntry)` 含完整字段(id、时间戳等);存储失败时返回 `MEMORY_STORE_FAILED`\n */\n async add(entry: MemoryEntryInput): Promise<HaiResult<MemoryEntry>> {\n try {\n const vector = await computeVector(entry.content)\n const stored = await saveEntry(entry, vector)\n logger.trace('Memory added', { id: stored.id, type: stored.type })\n return ok(stored)\n }\n catch (error) {\n logger.error('Memory add failed', { error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 更新一条已有记忆\n */\n async update(memoryId: string, updates: MemoryUpdateInput): Promise<HaiResult<MemoryEntry>> {\n try {\n const existing = await store.get(memoryId)\n if (!existing) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n\n if (updates.content !== undefined)\n existing.content = updates.content\n if (updates.type !== undefined)\n existing.type = updates.type\n if (updates.importance !== undefined)\n existing.importance = updates.importance\n if (updates.metadata !== undefined)\n existing.metadata = updates.metadata\n\n // 内容变更时重新计算向量\n if (updates.content !== undefined) {\n const vector = await computeVector(updates.content)\n existing.vector = vector\n if (vector) {\n await vectorStore.upsert(memoryId, vector, {\n objectId: existing.objectId,\n type: existing.type,\n })\n }\n }\n\n await store.save(memoryId, existing, { objectId: existing.objectId })\n logger.trace('Memory updated', { id: memoryId })\n return ok(existing)\n }\n catch (error) {\n logger.error('Memory update failed', { id: memoryId, error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 根据 ID 获取一条记忆并更新访问统计\n *\n * 访问成功后自动更新 `lastAccessedAt` 和 `accessCount`。\n *\n * @param memoryId - 记忆条目的唯一 ID\n * @returns `ok(MemoryEntry)` 操作成功;ID 不存在时返回 `MEMORY_NOT_FOUND`\n */\n async get(memoryId: string): Promise<HaiResult<MemoryEntry>> {\n const entry = await store.get(memoryId)\n if (!entry) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n entry.lastAccessedAt = Date.now()\n entry.accessCount++\n await store.save(memoryId, entry, { objectId: entry.objectId })\n return ok(entry)\n },\n\n /**\n * 根据 ID 删除一条记忆\n *\n * 同时从关系型存储和向量库中删除。\n *\n * @param memoryId - 记忆条目的唯一 ID\n * @returns `ok(undefined)` 删除成功;ID 不存在时返回 `MEMORY_NOT_FOUND`\n */\n async remove(memoryId: string): Promise<HaiResult<void>> {\n const removed = await store.remove(memoryId)\n if (!removed) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n await vectorStore.remove(memoryId)\n logger.trace('Memory removed', { id: memoryId })\n return ok(undefined)\n },\n\n /**\n * 列出记忆条目(不分页)\n *\n * @param options - 可选(objectId、type 过滤、limit 限制数量)\n * @returns `ok(MemoryEntry[])` 按创建时间降序排列的记忆列表\n */\n async list(options?: MemoryListOptions): Promise<HaiResult<MemoryEntry[]>> {\n const where: WhereClause<MemoryEntry> = {}\n if (options?.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options?.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const results = await store.query({\n objectId: options?.objectId,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n limit: options?.limit,\n })\n\n return ok(results)\n },\n\n /**\n * 分页列出记忆条目\n *\n * @param options - 可选(objectId、type 过滤、offset / limit 分页参数)\n * @returns `ok(StorePage<MemoryEntry>)` 含当前页数据与总数\n */\n async listPage(options?: MemoryListPageOptions): Promise<HaiResult<StorePage<MemoryEntry>>> {\n const where: WhereClause<MemoryEntry> = {}\n if (options?.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options?.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const page = await store.queryPage(\n {\n objectId: options?.objectId,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n },\n {\n offset: options?.offset ?? 0,\n limit: options?.limit ?? 20,\n },\n )\n\n return ok(page)\n },\n\n /**\n * 清除记忆条目\n *\n * - 不传任何 options 时清除全部记忆(包括向量库)。\n * - 传入 objectId 或 types 时仅删除匹配的条目。\n *\n * @param options - 可选范围过滤(objectId 或 types 任意组合)\n * @returns `ok(undefined)` 操作成功\n */\n async clear(options?: MemoryClearOptions): Promise<HaiResult<void>> {\n if (!options?.types && !options?.objectId) {\n await store.clear()\n await vectorStore.clear()\n }\n else {\n const where: WhereClause<MemoryEntry> = {}\n if (options.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const toRemove = await store.query({\n objectId: options.objectId,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n\n for (const entry of toRemove) {\n await store.remove(entry.id)\n await vectorStore.remove(entry.id)\n }\n }\n logger.debug('Memories cleared', { options })\n return ok(undefined)\n },\n }\n}\n","/**\n * @h-ai/ai — RAG 子功能实现\n *\n * 组合 Retrieval + LLM 实现检索增强生成。\n * @module ai-rag-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { Citation, RetrievalOperations } from '../retrieval/ai-retrieval-types.js'\nimport type {\n RagContextItem,\n RagOperations,\n RagOptions,\n RagResult,\n RagStreamEvent,\n} from './ai-rag-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'rag' })\n\n// ─── 默认提示词 ───\n\nconst DEFAULT_RAG_SYSTEM_PROMPT = `You are a helpful assistant. Answer the user's question based on the provided context.\nIf the context doesn't contain relevant information, say so honestly.\nWhen using information from the context, cite the source by its number, e.g. [1] or [2].`\n\n/**\n * 默认上下文格式化:将检索结果格式化为编号列表,含标题和 URL、便于 LLM 注明信源\n */\nfunction defaultFormatContext(items: RagContextItem[]): string {\n if (items.length === 0)\n return 'No relevant context found.'\n\n return items\n .map((item, i) => {\n const sourceLabel = item.citation?.title ?? item.citation?.url ?? item.sourceId\n const urlPart = item.citation?.url ? ` (${item.citation.url})` : ''\n return `[${i + 1}] Source: ${sourceLabel}${urlPart}\\n${item.content}`\n })\n .join('\\n\\n')\n}\n\n/**\n * 创建 RAG 操作接口\n *\n * @param llm - LLM 操作(用于生成回答)\n * @param retrieval - Retrieval 操作(用于检索上下文)\n * @returns RagOperations 实例\n */\nexport function createRagOperations(llm: LLMOperations, retrieval: RetrievalOperations): RagOperations {\n return {\n /**\n * 执行 RAG 查询\n *\n * 流程:\n * 1. 向量检索相关文档(`retrieval.retrieve`)\n * 2. 格式化为编号列表上下文(可通过 `options.formatContext` 自定义)\n * 3. 组装系统提示 + 上下文 → 调用 LLM 生成回答\n *\n * @param query - 用户查询文本\n * @param options - 可选配置(sources / topK / minScore / systemPrompt / formatContext / history 等)\n * @returns `ok(RagResult)` 含 answer、context 列表与引用信源;检索或生成失败时返回错误\n *\n * @example\n * ```ts\n * const result = await rag.query('什么是 vecdb?')\n * if (result.success) console.log(result.data.answer)\n * ```\n */\n async query(query: string, options?: RagOptions): Promise<HaiResult<RagResult>> {\n logger.trace('Starting RAG query', { query: query.slice(0, 100) })\n\n try {\n // 阶段1:检索相关上下文\n const retrieveResult = await retrieval.retrieve({\n query,\n sources: options?.sources,\n topK: options?.topK ?? 5,\n minScore: options?.minScore,\n enableRerank: options?.enableRerank,\n rerankModel: options?.rerankModel,\n })\n\n if (!retrieveResult.success) {\n return err(HaiAIError.RAG_CONTEXT_BUILD_FAILED, aiM('ai_internalError', { params: { error: 'Failed to retrieve context' } }), retrieveResult.error)\n }\n\n // 构建上下文\n const contextItems: RagContextItem[] = retrieveResult.data.items.map(item => ({\n content: item.content,\n score: item.score,\n sourceId: item.sourceId,\n metadata: item.metadata,\n citation: item.citation,\n }))\n\n // 格式化上下文\n const formatFn = options?.formatContext ?? defaultFormatContext\n const contextText = formatFn(contextItems)\n\n // 阶段2:构建 LLM 消息\n const systemPrompt = options?.systemPrompt ?? DEFAULT_RAG_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n\n // 添加消息历史(多轮对话)\n if (options?.messages) {\n messages.push(...options.messages)\n }\n\n // 添加当前查询\n messages.push({ role: 'user', content: query })\n\n // 阶段3:调用 LLM 生成回答\n const chatResult = await llm.chat({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_internalError', { params: { error: 'LLM generation failed' } }), chatResult.error)\n }\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n logger.trace('RAG query completed', {\n contextCount: contextItems.length,\n model: chatResult.data.model,\n })\n\n // 从上下文项中去重聚合信源引用\n const citationMap = new Map<string, Citation>()\n for (const ctx of contextItems) {\n if (ctx.citation) {\n const key = ctx.citation.documentId ?? ctx.citation.chunkId ?? ctx.citation.url ?? `${ctx.sourceId}:${ctx.content.slice(0, 50)}`\n if (!citationMap.has(key)) {\n citationMap.set(key, ctx.citation)\n }\n }\n }\n const citations = Array.from(citationMap.values())\n\n return ok({\n answer,\n context: contextItems,\n citations,\n query,\n model: chatResult.data.model,\n usage: chatResult.data.usage\n ? {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n : undefined,\n })\n }\n catch (error) {\n logger.error('RAG query failed', { error })\n return err(HaiAIError.RAG_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 流式 RAG 查询:先产出 context,再逐 chunk 产出 delta,最后 done\n */\n async* queryStream(query: string, options?: RagOptions): AsyncIterable<RagStreamEvent> {\n logger.trace('Starting RAG stream', { query: query.slice(0, 100) })\n\n // 阶段1:检索\n const retrieveResult = await retrieval.retrieve({\n query,\n sources: options?.sources,\n topK: options?.topK ?? 5,\n minScore: options?.minScore,\n enableRerank: options?.enableRerank,\n rerankModel: options?.rerankModel,\n })\n\n if (!retrieveResult.success) {\n throw new Error(`RAG context build failed: ${String(retrieveResult.error)}`)\n }\n\n const contextItems: RagContextItem[] = retrieveResult.data.items.map(item => ({\n content: item.content,\n score: item.score,\n sourceId: item.sourceId,\n metadata: item.metadata,\n citation: item.citation,\n }))\n\n // 去重信源\n const citationMap = new Map<string, Citation>()\n for (const ctx of contextItems) {\n if (ctx.citation) {\n const key = ctx.citation.documentId ?? ctx.citation.chunkId ?? ctx.citation.url ?? `${ctx.sourceId}:${ctx.content.slice(0, 50)}`\n if (!citationMap.has(key)) {\n citationMap.set(key, ctx.citation)\n }\n }\n }\n const citations = Array.from(citationMap.values())\n\n // 产出上下文事件\n yield { type: 'context', items: contextItems, citations }\n\n // 阶段2:流式 LLM 生成\n const formatFn = options?.formatContext ?? defaultFormatContext\n const contextText = formatFn(contextItems)\n const systemPrompt = options?.systemPrompt ?? DEFAULT_RAG_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n if (options?.messages) {\n messages.push(...options.messages)\n }\n messages.push({ role: 'user', content: query })\n\n const stream = llm.chatStream({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n })\n\n let fullAnswer = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for await (const chunk of stream) {\n if (!model && chunk.model)\n model = chunk.model\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n fullAnswer += delta\n yield { type: 'delta', text: delta }\n }\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n }\n }\n }\n\n yield { type: 'done', answer: fullAnswer, model, usage }\n },\n }\n}\n","/**\n * @h-ai/ai — Reasoning 子功能实现\n *\n * 提供 ReAct、CoT、Plan-and-Execute 三种推理策略的实现。\n * @module ai-reasoning-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig, ModelScenario } from '../ai-config.js'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n ReasoningOperations,\n ReasoningOptions,\n ReasoningResult,\n ReasoningStep,\n ReasoningStreamEvent,\n} from './ai-reasoning-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'reasoning' })\n\n// ─── 策略提示词 ───\n\nconst REACT_SYSTEM_PROMPT = `You are a reasoning agent that follows the ReAct (Reasoning and Acting) framework.\nFor each step:\n1. Think: Analyze what you know and what you need to find out.\n2. Act: If you need to use a tool, call it. If you have enough information, provide the final answer.\n3. Observe: Review the tool results.\n\nRepeat until you can provide a confident final answer.\nAlways think step by step before acting.`\n\nconst COT_SYSTEM_PROMPT = `You are a reasoning assistant that uses Chain-of-Thought reasoning.\nBreak down the problem into clear logical steps.\nShow your reasoning process explicitly.\nAfter working through all steps, provide a clear final answer.`\n\nconst PLAN_EXECUTE_SYSTEM_PROMPT = `You are a planning and execution agent.\nFirst, create a detailed step-by-step plan to solve the problem.\nThen, execute each step one by one.\nAfter completing all steps, provide the final answer.\n\nFormat your plan as a numbered list.`\n\n/**\n * 创建 Reasoning 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @param llm - LLM 操作接口\n * @returns ReasoningOperations 实例\n */\nexport function createReasoningOperations(config: AIConfig, llm: LLMOperations): ReasoningOperations {\n /**\n * 提取场景对应的模型名称(仅用于构造请求, API Key 校验由 provider 层负责)\n */\n function scenarioModel(scenario: ModelScenario, explicit?: string): string | undefined {\n const result = resolveModelEntry(config.llm, scenario, explicit)\n return result.success ? result.data.model : explicit\n }\n /**\n * 执行 ReAct 策略推理\n */\n async function runReact(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const maxRounds = options.maxRounds ?? 10\n const systemPrompt = options.systemPrompt ?? REACT_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n let stepIndex = 0\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: query },\n ]\n\n for (let round = 0; round < maxRounds; round++) {\n // 调用 LLM\n const chatResult = await llm.chat({\n model: scenarioModel('reasoning', options.model),\n messages,\n temperature: options.temperature,\n tools: options.tools?.getDefinitions(),\n tool_choice: options.tools ? 'auto' : undefined,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n if (!choice) {\n return err(HaiAIError.REASONING_FAILED, aiM('ai_internalError', { params: { error: 'No response from LLM' } }))\n }\n\n const assistantMessage = choice.message\n\n // 记录思考步骤\n if (assistantMessage.content) {\n steps.push({\n type: 'thought',\n content: typeof assistantMessage.content === 'string' ? assistantMessage.content : '',\n index: stepIndex++,\n })\n }\n\n // 添加助手消息到历史\n messages.push(assistantMessage)\n\n // 如果有工具调用\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0 && options.tools) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n // 记录 action 步骤\n steps.push({\n type: 'action',\n content: `Calling tool: ${toolCall.function.name}`,\n toolCall: {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n },\n index: stepIndex++,\n })\n\n // 执行工具\n const toolResult = await options.tools.execute(toolCall)\n const rawToolContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawToolContent === 'string'\n ? rawToolContent\n : (rawToolContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n // 记录 observation 步骤\n steps.push({\n type: 'observation',\n content: toolContent,\n index: stepIndex++,\n })\n\n // 添加工具消息\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n continue\n }\n\n // 完成推理\n if (choice.finish_reason === 'stop') {\n const answer = typeof assistantMessage.content === 'string' ? assistantMessage.content : ''\n steps.push({ type: 'answer', content: answer, index: stepIndex })\n\n return ok({\n answer,\n steps,\n strategy: 'react',\n rounds: round + 1,\n messages,\n })\n }\n }\n\n // 达到最大轮次\n return err(HaiAIError.REASONING_MAX_ROUNDS, aiM('ai_internalError', { params: { error: `Max rounds (${maxRounds}) reached` } }))\n }\n\n /**\n * 执行 Chain-of-Thought 策略推理\n */\n async function runCoT(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const systemPrompt = options.systemPrompt ?? COT_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: `${query}\\n\\nPlease think step by step.` },\n ]\n\n const chatResult = await llm.chat({\n model: scenarioModel('reasoning', options.model),\n messages,\n temperature: options.temperature,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n // 将回答解析为步骤\n const lines = answer.split('\\n').filter(l => l.trim().length > 0)\n let isAnswer = false\n let stepIndex = 0\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.toLowerCase().startsWith('final answer') || trimmed.toLowerCase().startsWith('answer:')) {\n isAnswer = true\n }\n\n steps.push({\n type: isAnswer ? 'answer' : 'thought',\n content: trimmed,\n index: stepIndex++,\n })\n }\n\n messages.push({ role: 'assistant', content: answer })\n\n return ok({\n answer,\n steps,\n strategy: 'cot',\n rounds: 1,\n messages,\n })\n }\n\n /**\n * 执行 Plan-and-Execute 策略推理\n */\n async function runPlanExecute(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const maxRounds = options.maxRounds ?? 10\n const systemPrompt = options.systemPrompt ?? PLAN_EXECUTE_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n let stepIndex = 0\n\n // 阶段1:生成计划\n const planMessages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: `Create a plan to solve this:\\n${query}` },\n ]\n\n const planResult = await llm.chat({\n model: scenarioModel('plan', options.planModel ?? options.model),\n messages: planMessages,\n temperature: options.temperature,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n })\n\n if (!planResult.success)\n return planResult\n\n const plan = planResult.data.choices[0]?.message?.content ?? ''\n steps.push({ type: 'plan', content: plan, index: stepIndex++ })\n\n // 阶段2:执行计划\n const executeMessages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: query },\n { role: 'assistant', content: plan },\n { role: 'user', content: 'Now execute each step of the plan. Use tools if available.' },\n ]\n\n for (let round = 0; round < maxRounds; round++) {\n const execResult = await llm.chat({\n model: scenarioModel('execute', options.executeModel ?? options.model),\n messages: executeMessages,\n temperature: options.temperature,\n tools: options.tools?.getDefinitions(),\n tool_choice: options.tools ? 'auto' : undefined,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n })\n\n if (!execResult.success)\n return execResult\n\n const choice = execResult.data.choices[0]\n if (!choice)\n break\n\n const msg = choice.message\n\n if (msg.content) {\n steps.push({ type: 'thought', content: typeof msg.content === 'string' ? msg.content : '', index: stepIndex++ })\n }\n\n executeMessages.push(msg)\n\n // 工具调用\n if (msg.tool_calls && msg.tool_calls.length > 0 && options.tools) {\n for (const toolCall of msg.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n steps.push({\n type: 'action',\n content: `Executing: ${toolCall.function.name}`,\n toolCall: {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n },\n index: stepIndex++,\n })\n\n const toolResult = await options.tools.execute(toolCall)\n const rawToolContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawToolContent === 'string'\n ? rawToolContent\n : (rawToolContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n steps.push({ type: 'observation', content: toolContent, index: stepIndex++ })\n executeMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: toolContent })\n }\n continue\n }\n\n // 完成\n if (choice.finish_reason === 'stop') {\n const answer = typeof msg.content === 'string' ? msg.content : ''\n steps.push({ type: 'answer', content: answer, index: stepIndex })\n return ok({\n answer,\n steps,\n strategy: 'plan-execute',\n rounds: round + 1,\n messages: executeMessages,\n })\n }\n }\n\n return err(HaiAIError.REASONING_MAX_ROUNDS, aiM('ai_internalError', { params: { error: `Max rounds (${maxRounds}) reached` } }))\n }\n\n return {\n async run(query: string, options?: ReasoningOptions): Promise<HaiResult<ReasoningResult>> {\n const strategy = options?.strategy ?? 'react'\n logger.trace('Starting reasoning', { strategy, maxRounds: options?.maxRounds })\n\n try {\n switch (strategy) {\n case 'react':\n return await runReact(query, options ?? {})\n case 'cot':\n return await runCoT(query, options ?? {})\n case 'plan-execute':\n return await runPlanExecute(query, options ?? {})\n default:\n return err(HaiAIError.REASONING_STRATEGY_NOT_FOUND, aiM('ai_internalError', { params: { error: `Unknown strategy: ${strategy}` } }))\n }\n }\n catch (error) {\n logger.error('Reasoning failed', { error })\n return err(HaiAIError.REASONING_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 流式推理:逐步产出推理步骤 + 最终答案增量\n *\n * 当前实现基于 run() 的结果分步产出事件,\n * 后续可优化为真正逐轮流式输出。\n */\n async* runStream(query: string, options?: ReasoningOptions): AsyncIterable<ReasoningStreamEvent> {\n const result = await this.run(query, options)\n\n if (!result.success) {\n throw result.error\n }\n\n const { steps, answer } = result.data\n\n // 产出所有推理步骤(排除最终 answer 步骤)\n for (const step of steps) {\n if (step.type !== 'answer') {\n yield { type: 'step', step }\n }\n }\n\n // 产出最终答案作为 delta\n if (answer) {\n yield { type: 'delta', text: answer }\n }\n\n // 产出完成事件\n yield { type: 'done', result: result.data }\n },\n }\n}\n","/**\n * @h-ai/ai — Rerank 子功能实现\n *\n * 基于 Cohere 兼容格式的文档重排序实现。\n * @module ai-rerank-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig } from '../ai-config.js'\n\nimport type {\n RerankDocument,\n RerankItem,\n RerankOperations,\n RerankRequest,\n RerankResponse,\n} from './ai-rerank-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'rerank' })\n\n/**\n * Cohere Rerank API 响应结果条目\n */\ninterface CohereRerankResult {\n index: number\n relevance_score: number\n document?: { text: string }\n}\n\n/**\n * Cohere Rerank API 响应体\n */\ninterface CohereRerankResponse {\n id: string\n results: CohereRerankResult[]\n meta?: Record<string, unknown>\n}\n\n/**\n * 创建 Rerank 操作接口\n *\n * 通过 Cohere 兼容的 Rerank API 对文档进行相关性重排序。\n * apiKey / baseUrl / model 统一通过 `resolveModelEntry(llm, 'rerank')` 解析,\n * 可在 `llm.models` 中为 rerank 场景配置独立的 apiKey / baseUrl。\n *\n * @param config - 校验后的 AI 配置\n * @returns RerankOperations 实例\n */\nexport function createRerankOperations(config: AIConfig): RerankOperations {\n /** 将输入文档统一转换为文本数组和 id 映射 */\n function normalizeDocuments(documents: string[] | RerankDocument[]): {\n texts: string[]\n ids: (string | undefined)[]\n } {\n if (documents.length === 0) {\n return { texts: [], ids: [] }\n }\n if (typeof documents[0] === 'string') {\n const strs = documents as string[]\n return { texts: strs, ids: strs.map(() => undefined) }\n }\n const docs = documents as RerankDocument[]\n return {\n texts: docs.map(d => d.text),\n ids: docs.map(d => d.id),\n }\n }\n\n /**\n * 调用 Cohere 兼容的 Rerank API\n */\n async function callRerankAPI(request: RerankRequest): Promise<HaiResult<RerankResponse>> {\n const resolvedResult = resolveModelEntry(config.llm, 'rerank', request.model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for rerank' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n\n const { texts, ids } = normalizeDocuments(request.documents)\n if (texts.length === 0) {\n return err(HaiAIError.RERANK_INVALID_REQUEST, aiM('ai_rerankInvalidRequest', { params: { reason: 'documents cannot be empty' } }))\n }\n\n const body: Record<string, unknown> = {\n model: resolved.model,\n query: request.query,\n documents: texts,\n }\n if (request.topN !== undefined) {\n body.top_n = request.topN\n }\n if (request.returnDocuments) {\n body.return_documents = true\n }\n\n logger.trace('Calling rerank API', { model: resolved.model, documentCount: texts.length, topN: request.topN })\n\n try {\n const response = await fetch(`${resolved.baseUrl}/v1/rerank`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${resolved.apiKey}`,\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText)\n logger.error('Rerank API request failed', { status: response.status, error: errorText })\n return err(HaiAIError.RERANK_API_ERROR, aiM('ai_rerankApiFailed', { params: { error: `HTTP ${response.status}: ${errorText}` } }))\n }\n\n const data = await response.json() as CohereRerankResponse\n\n const results: RerankItem[] = data.results.map(item => ({\n index: item.index,\n id: ids[item.index],\n relevanceScore: item.relevance_score,\n document: item.document?.text,\n }))\n\n logger.trace('Rerank completed', { resultCount: results.length })\n\n return ok({ model: resolved.model, results })\n }\n catch (error) {\n logger.error('Rerank API call failed', { error })\n return err(HaiAIError.RERANK_API_ERROR, aiM('ai_rerankApiFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n /**\n * 对文档列表进行相关度重排\n *\n * 调用 Cohere 兼容 Rerank API,按与 query 的语义相关度对文档重新排序。\n *\n * @param request - 重排请求(query、documents、可选 topN/model)\n * @returns `ok(RerankResponse)` 含重排后的结果列表;API 调用失败时返回 `RERANK_API_ERROR`\n */\n async rerank(request: RerankRequest): Promise<HaiResult<RerankResponse>> {\n return callRerankAPI(request)\n },\n\n /**\n * 对纯文本数组进行重排(`rerank` 的简化版本)\n *\n * @param query - 用于对比相关度的查询文本\n * @param texts - 待重排的文本列表\n * @param topN - 仅返回前 N 个结果(可选)\n * @returns `ok(RerankItem[])` 按相关度降序排列的结果;API 调用失败时返回错误\n */\n async rerankTexts(query: string, texts: string[], topN?: number): Promise<HaiResult<RerankItem[]>> {\n const result = await callRerankAPI({ query, documents: texts, topN })\n if (!result.success)\n return result\n return ok(result.data.results)\n },\n }\n}\n","/**\n * @h-ai/ai — Retrieval 子功能实现\n *\n * 基于向量数据库 (@h-ai/vecdb) 和 Embedding 实现的检索功能。\n * @module ai-retrieval-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { EmbeddingOperations } from '../embedding/ai-embedding-types.js'\nimport type { RerankOperations } from '../rerank/ai-rerank-types.js'\nimport type { AIRelStore, AIStoreProvider } from '../store/ai-store-types.js'\nimport type {\n Citation,\n RetrievalOperations,\n RetrievalRequest,\n RetrievalResult,\n RetrievalResultItem,\n RetrievalSource,\n} from './ai-retrieval-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'retrieval' })\n\n/**\n * 创建 Retrieval 操作接口\n *\n * @param embeddingOps - Embedding 操作(用于将查询文本向量化)\n * @param storeProvider - 存储 Provider(用于按 collection 创建向量存储实例)\n * @param sourceStore - 检索源持久化存储(支持分布式一致)\n * @returns RetrievalOperations 实例\n */\nexport function createRetrievalOperations(\n embeddingOps: EmbeddingOperations,\n storeProvider: AIStoreProvider,\n sourceStore: AIRelStore<RetrievalSource>,\n rerankOps?: RerankOperations | null,\n): RetrievalOperations {\n // vectorStore 实例缓存(按 collection 复用,避免每次检索都创建新实例)\n const vectorStoreCache = new Map<string, ReturnType<AIStoreProvider['createVectorStore']>>()\n function getVectorStore(collection: string) {\n let store = vectorStoreCache.get(collection)\n if (!store) {\n store = storeProvider.createVectorStore(collection)\n vectorStoreCache.set(collection, store)\n }\n return store\n }\n\n return {\n /**\n * 注册检索源\n *\n * 将配置好的检索源持久化到 store,后续 `retrieve` 时根据 source.id 匹配。\n * 同一 id 不可重复注册,重复调用返回错误。\n *\n * @param source - 检索源配置(id、collection、描述等)\n * @returns `ok(undefined)` 注册成功;`err` 含错误码 `RETRIEVAL_FAILED`(重复注册)\n */\n async addSource(source: RetrievalSource): Promise<HaiResult<void>> {\n const existing = await sourceStore.get(source.id)\n if (existing) {\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: `Source '${source.id}' already exists` } }))\n }\n await sourceStore.save(source.id, source)\n logger.debug('Retrieval source added', { sourceId: source.id, collection: source.collection })\n return ok(undefined)\n },\n\n /**\n * 取消注册检索源\n *\n * 从 store 删除指定 id 的检索源。源不存在时返回 `RETRIEVAL_SOURCE_NOT_FOUND` 错误。\n *\n * @param sourceId - 检索源的唯一标识\n * @returns `ok(undefined)` 删除成功;`err` 含错误码 `RETRIEVAL_SOURCE_NOT_FOUND`\n */\n async removeSource(sourceId: string): Promise<HaiResult<void>> {\n const existing = await sourceStore.get(sourceId)\n if (!existing) {\n return err(HaiAIError.RETRIEVAL_SOURCE_NOT_FOUND, aiM('ai_internalError', { params: { error: `Source '${sourceId}' not found` } }))\n }\n await sourceStore.remove(sourceId)\n logger.debug('Retrieval source removed', { sourceId })\n return ok(undefined)\n },\n\n /**\n * 列出所有已注册的检索源\n *\n * @returns 全部检索源数组(无源时返回空数组)\n */\n async listSources(): Promise<RetrievalSource[]> {\n return sourceStore.query({})\n },\n\n /**\n * 执行向量检索\n *\n * 流程:\n * 1. 将 `request.query` 向量化(Embedding)\n * 2. 对每个目标检索源并发执行向量近邻搜索\n * 3. 合并结果 → 按 score 降序 → 截取 topK\n *\n * @param request - 检索请求(query、可选 sources / topK / minScore 等)\n * @returns `ok(RetrievalResult)` 含检索项列表与引用信息;无源时返回 `RETRIEVAL_SOURCE_NOT_FOUND` 错误\n *\n * @example\n * ```ts\n * const result = await retrieval.retrieve({ query: '向量数据库', topK: 5 })\n * if (result.success) console.log(result.data.items)\n * ```\n */\n async retrieve(request: RetrievalRequest): Promise<HaiResult<RetrievalResult>> {\n const startTime = Date.now()\n\n // 确定要查询的源(从 DB 读取,分布式一致)\n const targetSources = await sourceStore.query(\n request.sources?.length\n ? { where: { id: { $in: request.sources } } }\n : {},\n )\n\n if (targetSources.length === 0) {\n return err(HaiAIError.RETRIEVAL_SOURCE_NOT_FOUND, aiM('ai_internalError', { params: { error: 'No retrieval sources configured' } }))\n }\n\n try {\n // 向量化查询文本\n const embedResult = await embeddingOps.embedText(request.query)\n if (!embedResult.success) {\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: 'Failed to embed query' } }), embedResult.error)\n }\n\n const queryVector = embedResult.data\n\n // 并发查询所有源\n const allItems: RetrievalResultItem[] = []\n\n const searchPromises = targetSources.map(async (source) => {\n const topK = request.topK ?? source.topK ?? 5\n const minScore = request.minScore ?? source.minScore\n\n const vectorStore = getVectorStore(source.collection)\n const searchResults = await vectorStore.search(queryVector, {\n topK,\n minScore,\n filter: source.filter,\n })\n\n for (const item of searchResults) {\n // 从向量记录 metadata 构建结构化信源引用\n const citation: Citation = {\n documentId: item.metadata?.documentId as string | undefined,\n title: item.metadata?.title as string | undefined ?? source.name,\n url: item.metadata?.url as string | undefined ?? source.url,\n position: item.metadata?.position as string | undefined,\n chunkId: item.id,\n collection: source.collection,\n }\n\n allItems.push({\n id: item.id,\n content: item.content ?? '',\n score: item.score,\n sourceId: source.id,\n metadata: item.metadata,\n citation,\n })\n }\n })\n\n await Promise.all(searchPromises)\n\n // 可选:Rerank 重排序\n if (request.enableRerank && rerankOps && allItems.length > 0) {\n const rerankResult = await rerankOps.rerank({\n query: request.query,\n documents: allItems.map(item => item.content),\n model: request.rerankModel,\n topN: request.topK ?? 10,\n returnDocuments: false,\n })\n if (rerankResult.success) {\n const reranked = rerankResult.data.results\n .map(r => ({ ...allItems[r.index], score: r.relevanceScore }))\n allItems.length = 0\n allItems.push(...reranked)\n }\n else {\n logger.warn('Rerank failed, falling back to vector scores', { error: rerankResult.error })\n }\n }\n\n // 按分数降序排列\n allItems.sort((a, b) => b.score - a.score)\n\n // 限制总数(取全局 topK 或所有结果)\n const topK = request.topK ?? 10\n const limitedItems = allItems.slice(0, topK)\n\n const duration = Date.now() - startTime\n logger.trace('Retrieval completed', { query: request.query, resultCount: limitedItems.length, duration })\n\n return ok({\n items: limitedItems,\n query: request.query,\n duration,\n })\n }\n catch (error) {\n logger.error('Retrieval failed', { error })\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Summary 子功能实现\n *\n * 使用 LLM 对对话消息生成摘要,支持增量摘要(传入前序摘要合并)。\n * @module ai-summary-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { LLMConfig, SummaryConfig } from '../ai-config.js'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type { SummaryOperations, SummaryOptions, SummaryResult } from './ai-summary-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'summary' })\n\n// ─── 摘要提示词 ───\n\nconst SUMMARIZE_SYSTEM_PROMPT = `You are a conversation summarizer. Create a concise summary of the conversation that preserves:\n1. Key facts and decisions made\n2. Important context and background information\n3. User preferences or instructions mentioned\n4. Any unresolved questions or pending topics\n\nRules:\n- Be concise but comprehensive — capture all important information\n- Use third person (\"The user asked...\", \"The assistant explained...\")\n- Preserve specific details like names, numbers, dates, and technical terms\n- Structure the summary in logical paragraphs\n- Keep the summary under 500 words`\n\nconst INCREMENTAL_SUMMARIZE_SUFFIX = `You have a previous summary and new messages to incorporate.\n\nPrevious Summary:\n{previousSummary}\n\nMerge the previous summary with the new conversation messages to create an updated, comprehensive summary. Follow the same rules as above: be concise, preserve key details, use third person.`\n\n/**\n * 创建 Summary 操作接口\n *\n * @param llmConfig - LLM 配置(用于通过 resolveModelEntry 解析场景模型)\n * @param llm - LLM 操作接口(用于生成摘要)\n * @param token - Token 操作接口(用于估算摘要 Token 数)\n * @param config - Summary 配置\n * @returns SummaryOperations 实例\n */\nexport function createSummaryOperations(\n llmConfig: LLMConfig,\n llm: LLMOperations,\n token: TokenOperations,\n config: SummaryConfig,\n): SummaryOperations {\n const { systemPrompt } = config\n\n /**\n * 构建摘要用 systemPrompt\n */\n function buildSummaryPrompt(options?: SummaryOptions): string {\n const basePrompt = options?.systemPrompt ?? systemPrompt ?? SUMMARIZE_SYSTEM_PROMPT\n if (!options?.previousSummary)\n return basePrompt\n\n return `${basePrompt}\\n\\n${INCREMENTAL_SUMMARIZE_SUFFIX.replace('{previousSummary}', options.previousSummary)}`\n }\n\n /**\n * 提取场景对应的模型名称(API Key 校验由 provider 层负责)\n */\n function scenarioModel(explicit?: string): string | undefined {\n const result = resolveModelEntry(llmConfig, 'summary', explicit)\n return result.success ? result.data.model : explicit\n }\n\n /**\n * 生成摘要文本\n */\n async function generate(\n messages: ChatMessage[],\n options?: SummaryOptions,\n ): Promise<HaiResult<string>> {\n const conversationText = messages\n .filter(m => m.role !== 'system')\n .map((m) => {\n const content = m.role === 'assistant'\n ? (m.content ?? '[tool call]')\n : m.role === 'tool'\n ? `[tool result: ${m.content.slice(0, 200)}]`\n : (typeof m.content === 'string' ? m.content : '[multimodal]')\n return `${m.role}: ${content}`\n })\n .join('\\n')\n\n const prompt = buildSummaryPrompt(options)\n\n const chatResult = await llm.chat({\n model: scenarioModel(options?.model),\n messages: [\n { role: 'system', content: prompt },\n { role: 'user', content: conversationText },\n ],\n temperature: options?.temperature ?? 0.3,\n enablePersist: false,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.CONTEXT_SUMMARIZE_FAILED, aiM('ai_contextSummarizeFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n return ok(chatResult.data.choices[0]?.message?.content ?? '')\n }\n\n /**\n * 生成摘要(含元数据)\n */\n async function summarize(\n messages: ChatMessage[],\n options?: SummaryOptions,\n ): Promise<HaiResult<SummaryResult>> {\n logger.trace('Summarizing messages', { messageCount: messages.length })\n\n try {\n const result = await generate(messages, options)\n if (!result.success)\n return result as HaiResult<never>\n\n const summary = result.data\n return ok({\n summary,\n tokenCount: token.estimateText(summary),\n coveredMessages: messages.filter(m => m.role !== 'system').length,\n })\n }\n catch (error) {\n logger.error('Context summarization failed', { error })\n return err(HaiAIError.CONTEXT_SUMMARIZE_FAILED, aiM('ai_contextSummarizeFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n generate,\n summarize,\n }\n}\n","/**\n * @h-ai/ai — Token 子功能实现\n *\n * 提供轻量级 Token 估算能力,无需外部依赖。\n * 同时导出纯函数(可指定 tokenRatio)和工厂函数(绑定配置的 tokenRatio)。\n * @module ai-token-functions\n */\n\nimport type { TokenConfig } from '../ai-config.js'\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { TokenOperations } from './ai-token-types.js'\n\n/**\n * 估算单条文本的 Token 数\n *\n * 使用字符级估算:中文约每字 1-2 token,英文约每 4 字符 1 token。\n * 这是一个保守估算,实际 token 数通常略低于此值。\n *\n * @param text - 文本内容\n * @param tokenRatio - 每字符对应的 token 数(默认 0.25)\n * @returns 估算 token 数\n */\nexport function estimateTextTokens(text: string, tokenRatio = 0.25): number {\n if (!text)\n return 0\n\n // 区分中文和非中文字符\n let cjkCount = 0\n let otherCount = 0\n\n for (const char of text) {\n const code = char.codePointAt(0) ?? 0\n // CJK 统一表意文字范围\n if (\n (code >= 0x4E00 && code <= 0x9FFF)\n || (code >= 0x3400 && code <= 0x4DBF)\n || (code >= 0x20000 && code <= 0x2A6DF)\n ) {\n cjkCount++\n }\n else {\n otherCount++\n }\n }\n\n // 中文:约 1.5 token/字;其他:按 tokenRatio 计算\n return Math.ceil(cjkCount * 1.5 + otherCount * tokenRatio)\n}\n\n/**\n * 估算消息列表的总 Token 数\n *\n * 包含消息结构开销(每条消息约 4 token 用于角色标记和分隔)。\n *\n * @param messages - 消息列表\n * @param tokenRatio - 每字符对应的 token 数\n * @returns 估算 token 总数\n */\nexport function estimateMessagesTokens(messages: ChatMessage[], tokenRatio = 0.25): number {\n let total = 0\n\n for (const msg of messages) {\n // 每条消息固定开销(角色标记 + 分隔符)\n total += 4\n\n const content = getMessageContent(msg)\n total += estimateTextTokens(content, tokenRatio)\n }\n\n // 回复开始标记\n total += 2\n\n return total\n}\n\n/**\n * 提取消息的文本内容\n */\nfunction getMessageContent(msg: ChatMessage): string {\n if (msg.role === 'assistant') {\n const c = msg.content\n if (typeof c === 'string')\n return c\n if (Array.isArray(c))\n return (c as Array<{ type: string, text?: string }>).filter(p => p.type === 'text').map(p => p.text ?? '').join(' ')\n return ''\n }\n if (msg.role === 'tool') {\n const c = msg.content\n if (typeof c === 'string')\n return c\n if (Array.isArray(c))\n return (c as Array<{ type: string, text?: string }>).filter(p => p.type === 'text').map(p => p.text ?? '').join(' ')\n return ''\n }\n // system / user\n const content = (msg as { content: string | Array<{ type: string, text?: string }> }).content\n if (typeof content === 'string')\n return content\n if (Array.isArray(content)) {\n return content\n .filter((c): c is { type: 'text', text: string } => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n }\n return ''\n}\n\n/**\n * 创建 Token 操作接口\n *\n * @param config - Token 配置\n * @returns TokenOperations 实例\n */\nexport function createTokenOperations(config: TokenConfig): TokenOperations {\n const { tokenRatio } = config\n return {\n estimateText: (text: string) => estimateTextTokens(text, tokenRatio),\n estimateMessages: (messages: ChatMessage[]) => estimateMessagesTokens(messages, tokenRatio),\n }\n}\n","/**\n * @h-ai/ai — 子功能组装工厂\n *\n * 将所有子功能的创建逻辑集中在此文件,main.ts 仅做生命周期管理和 API 编排。\n * @module ai-functions\n */\n\nimport type { DatapipeFunctions } from '@h-ai/datapipe'\n\nimport type { AIConfig } from './ai-config.js'\nimport type { CompressOperations } from './compress/ai-compress-types.js'\nimport type { ContextOperations } from './context/ai-context-types.js'\nimport type { EmbeddingOperations } from './embedding/ai-embedding-types.js'\nimport type { FileOperations } from './file/ai-file-types.js'\nimport type { KnowledgeOperations } from './knowledge/ai-knowledge-types.js'\nimport type { ChatMessage, ChatRecord, LLMOperations } from './llm/ai-llm-types.js'\nimport type { MCPOperations } from './mcp/ai-mcp-types.js'\nimport type { MemoryEntry, MemoryOperations } from './memory/ai-memory-types.js'\nimport type { RagOperations } from './rag/ai-rag-types.js'\nimport type { ReasoningOperations } from './reasoning/ai-reasoning-types.js'\nimport type { RerankOperations } from './rerank/ai-rerank-types.js'\nimport type { RetrievalOperations, RetrievalSource } from './retrieval/ai-retrieval-types.js'\nimport type { AIStoreProvider, SessionInfo } from './store/ai-store-types.js'\nimport type { SummaryOperations, SummaryResult } from './summary/ai-summary-types.js'\nimport type { TokenOperations } from './token/ai-token-types.js'\n\nimport { core } from '@h-ai/core'\n\nimport { CompressConfigSchema, KnowledgeConfigSchema, MemoryConfigSchema, RetrievalConfigSchema, SummaryConfigSchema, TokenConfigSchema } from './ai-config.js'\nimport { createCompressOperations } from './compress/ai-compress-functions.js'\nimport { createContextOperations } from './context/ai-context-functions.js'\nimport { createEmbeddingOperations } from './embedding/ai-embedding-functions.js'\nimport { createFileOperations } from './file/ai-file-functions.js'\nimport { createKnowledgeOperations } from './knowledge/ai-knowledge-functions.js'\nimport { createAILLMFunctions } from './llm/ai-llm-functions.js'\nimport { createAIMCPFunctions } from './mcp/ai-mcp-functions.js'\nimport { createMemoryOperations } from './memory/ai-memory-functions.js'\nimport { createRagOperations } from './rag/ai-rag-functions.js'\nimport { createReasoningOperations } from './reasoning/ai-reasoning-functions.js'\nimport { createRerankOperations } from './rerank/ai-rerank-functions.js'\nimport { createRetrievalOperations } from './retrieval/ai-retrieval-functions.js'\nimport { createSummaryOperations } from './summary/ai-summary-functions.js'\nimport { createTokenOperations } from './token/ai-token-functions.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'functions' })\n\n/** 子功能组装依赖 */\nexport interface AISubsystemDeps {\n storeProvider: AIStoreProvider\n datapipe: DatapipeFunctions\n}\n\n/** 子功能组装结果 */\nexport interface AISubsystems {\n llm: LLMOperations\n mcp: MCPOperations\n embedding: EmbeddingOperations\n reasoning: ReasoningOperations\n rerank: RerankOperations\n retrieval: RetrievalOperations\n rag: RagOperations\n knowledge: KnowledgeOperations\n memory: MemoryOperations\n token: TokenOperations\n summary: SummaryOperations\n compress: CompressOperations\n context: ContextOperations\n file: FileOperations\n}\n\n/**\n * 组装所有 AI 子功能实例\n *\n * 根据 parsed config 和外部依赖创建所有子功能操作接口。\n * 与 main.ts 解耦——main 仅负责生命周期,本函数负责创建逻辑。\n */\nexport async function createAISubsystems(config: AIConfig, deps: AISubsystemDeps): Promise<AISubsystems> {\n const { storeProvider, datapipe: datapipeDep } = deps\n\n // 通过 Provider 创建存储实例\n const chatRecordStore = storeProvider.createRelStore<ChatRecord>('hai_ai_chat_records', { hasObjectId: true, hasSessionId: true })\n const sessionStore = storeProvider.createRelStore<SessionInfo>('hai_ai_sessions', { hasObjectId: true })\n const sourceStore = storeProvider.createRelStore<RetrievalSource>('hai_ai_retrieval_sources')\n const memoryStore = storeProvider.createRelStore<MemoryEntry>('hai_ai_memory', { hasObjectId: true })\n const contextStore = storeProvider.createRelStore<{ messages: ChatMessage[], summaries: SummaryResult[], updatedAt: number }>('hai_ai_context', { hasObjectId: true, hasSessionId: true })\n\n // 向量存储\n const memoryVectorStore = storeProvider.createVectorStore('hai_ai_memory_vectors')\n\n // 统一初始化(建表等)\n await storeProvider.initialize()\n\n const llmFunctions = createAILLMFunctions(config, { recordStore: chatRecordStore, sessionStore })\n const llm = llmFunctions.llm\n\n // MCP\n const mcp = createAIMCPFunctions({ config })\n\n // Embedding\n const embedding = createEmbeddingOperations(config)\n\n // Reasoning(依赖 LLM)\n const reasoning = createReasoningOperations(config, llm)\n\n // Rerank\n const rerank = createRerankOperations(config)\n\n const retrieval = createRetrievalOperations(embedding, storeProvider, sourceStore, rerank)\n\n // 预注册配置中的检索源(幂等写入,就算其他实例已有相同数据也安全)\n if (config.retrieval?.sources?.length) {\n const configSources = RetrievalConfigSchema.parse(config.retrieval).sources ?? []\n sourceStore\n .saveMany(configSources.map(s => ({ id: s.id, data: s })))\n .catch((e: unknown) => logger.warn('Failed to pre-register retrieval sources', { error: e }))\n }\n\n // RAG(依赖 LLM + Retrieval)\n const rag = createRagOperations(llm, retrieval)\n\n // Knowledge(依赖 KnowledgeStore + LLM + Embedding + datapipe)\n const knowledgeParsed = KnowledgeConfigSchema.parse(config.knowledge ?? {})\n const knowledgeStore = storeProvider.createKnowledgeStore?.()\n const knowledge = createKnowledgeOperations(knowledgeParsed, llm, embedding, datapipeDep, knowledgeStore)\n\n const memoryParsed = MemoryConfigSchema.parse(config.memory ?? {})\n const memory = createMemoryOperations(memoryParsed, llm, embedding, memoryStore, memoryVectorStore)\n\n // Token / Summary / Compress\n const tokenParsed = TokenConfigSchema.parse(config.token ?? {})\n const summaryParsed = SummaryConfigSchema.parse(config.summary ?? {})\n const compressParsed = CompressConfigSchema.parse(config.compress ?? {})\n\n const token = createTokenOperations(tokenParsed)\n const summary = createSummaryOperations(config.llm, llm, token, summaryParsed)\n const compress = createCompressOperations(compressParsed, token, summary, config.llm.maxTokens ?? 4096)\n\n const context = createContextOperations(compressParsed, token, compress, contextStore, sessionStore, {\n llm,\n memory: memory ?? undefined,\n rag: rag ?? undefined,\n reasoning: reasoning ?? undefined,\n })\n\n // File(依赖 LLM)\n const file = createFileOperations(config, llm)\n\n return { llm, mcp, embedding, reasoning, rerank, retrieval, rag, knowledge, memory, token, summary, compress, context, file }\n}\n","/**\n * @h-ai/ai — 默认 DB 存储 Provider(reldb + vecdb)\n *\n * 基于 @h-ai/reldb 和 @h-ai/vecdb 的 AIStoreProvider 默认实现。\n * 仅在选择 `store.type: 'db'` 时加载,AI 模块本身不直接依赖 reldb/vecdb。\n * @module ai-store-provider-db\n */\n\nimport type { DbType, DmlOperations, ReldbJsonOps } from '@h-ai/reldb'\nimport type { VecdbFunctions } from '@h-ai/vecdb'\nimport type { AIRelStore, AIRelStoreOptions, AIStoreProvider, AIVectorStore, KnowledgeStore, StoreFilter, StorePage, StoreScope, WhereClause, WhereOperator } from '../ai-store-types.js'\n\nimport { core } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { vecdb } from '@h-ai/vecdb'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'store-provider-db' })\n\n// ─── ReldbAIRelStore 实现 ───\n\n/**\n * 基于 reldb 的持久化 AIRelStore 实现\n *\n * 将记录以 JSON 格式存储在 reldb 表中,支持 SQLite / PostgreSQL / MySQL。\n * 表结构:id PK, object_id?, session_id?, status?, ref_id?, data JSON, created_at, updated_at\n */\nclass ReldbAIRelStore<T> implements AIRelStore<T> {\n private readonly sql: DmlOperations\n private readonly table: string\n private readonly jsonOps: ReldbJsonOps\n private readonly dbType: DbType\n private readonly hasObjectId: boolean\n private readonly hasSessionId: boolean\n private readonly hasStatus: boolean\n private readonly hasRefId: boolean\n\n constructor(sql: DmlOperations, table: string, jsonOps: ReldbJsonOps, dbType: DbType, options?: AIRelStoreOptions) {\n this.sql = sql\n this.table = table\n this.jsonOps = jsonOps\n this.dbType = dbType\n this.hasObjectId = options?.hasObjectId ?? false\n this.hasSessionId = options?.hasSessionId ?? false\n this.hasStatus = options?.hasStatus ?? false\n this.hasRefId = options?.hasRefId ?? false\n }\n\n /** 创建表及索引(幂等) */\n async createTable(): Promise<void> {\n const t = this.table\n const db = this.dbType\n const idType = db === 'mysql' ? 'VARCHAR(512)' : 'TEXT'\n const scopeType = db === 'mysql' ? 'VARCHAR(255)' : 'TEXT'\n const dataType = db === 'postgresql' ? 'JSONB' : db === 'mysql' ? 'JSON' : 'TEXT'\n\n const cols: string[] = [`id ${idType} PRIMARY KEY`]\n if (this.hasObjectId)\n cols.push(`object_id ${scopeType}`)\n if (this.hasSessionId)\n cols.push(`session_id ${scopeType}`)\n if (this.hasStatus)\n cols.push(`status ${scopeType}`)\n if (this.hasRefId)\n cols.push(`ref_id ${scopeType}`)\n cols.push(`data ${dataType} NOT NULL`, `created_at BIGINT NOT NULL`, `updated_at BIGINT NOT NULL`)\n\n await this.sql.execute(`CREATE TABLE IF NOT EXISTS ${t} (${cols.join(', ')})`)\n\n if (this.hasObjectId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_object_id ON ${t}(object_id)`)\n if (this.hasSessionId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_session_id ON ${t}(session_id)`)\n if (this.hasObjectId && this.hasSessionId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_object_session ON ${t}(object_id, session_id)`)\n if (this.hasStatus)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_status ON ${t}(status)`)\n if (this.hasRefId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_ref_id ON ${t}(ref_id)`)\n }\n\n async save(id: string, data: T, scope?: StoreScope): Promise<void> {\n const now = Date.now()\n const json = JSON.stringify(data)\n\n const colNames = ['id']\n const values: unknown[] = [id]\n const placeholders: string[] = ['?']\n\n if (this.hasObjectId) {\n colNames.push('object_id')\n values.push(scope?.objectId ?? null)\n placeholders.push('?')\n }\n if (this.hasSessionId) {\n colNames.push('session_id')\n values.push(scope?.sessionId ?? null)\n placeholders.push('?')\n }\n if (this.hasStatus) {\n colNames.push('status')\n values.push(scope?.status ?? null)\n placeholders.push('?')\n }\n if (this.hasRefId) {\n colNames.push('ref_id')\n values.push(scope?.refId ?? null)\n placeholders.push('?')\n }\n\n colNames.push('data', 'created_at', 'updated_at')\n values.push(json, now, now)\n placeholders.push('?', '?', '?')\n\n if (this.dbType === 'mysql') {\n const updateParts: string[] = ['data = VALUES(data)', 'updated_at = VALUES(updated_at)']\n if (this.hasObjectId)\n updateParts.push('object_id = VALUES(object_id)')\n if (this.hasSessionId)\n updateParts.push('session_id = VALUES(session_id)')\n if (this.hasStatus)\n updateParts.push('status = VALUES(status)')\n if (this.hasRefId)\n updateParts.push('ref_id = VALUES(ref_id)')\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES (${placeholders.join(', ')}) ON DUPLICATE KEY UPDATE ${updateParts.join(', ')}`,\n values,\n )\n }\n else {\n const updateParts: string[] = ['data = excluded.data', 'updated_at = excluded.updated_at']\n if (this.hasObjectId)\n updateParts.push('object_id = excluded.object_id')\n if (this.hasSessionId)\n updateParts.push('session_id = excluded.session_id')\n if (this.hasStatus)\n updateParts.push('status = excluded.status')\n if (this.hasRefId)\n updateParts.push('ref_id = excluded.ref_id')\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES (${placeholders.join(', ')}) ON CONFLICT(id) DO UPDATE SET ${updateParts.join(', ')}`,\n values,\n )\n }\n }\n\n async saveMany(items: Array<{ id: string, data: T, scope?: StoreScope }>): Promise<void> {\n if (items.length === 0)\n return\n await Promise.all(items.map(({ id, data, scope }) => this.save(id, data, scope)))\n }\n\n async get(id: string): Promise<T | undefined> {\n const result = await this.sql.get<{ data: string }>(`SELECT data FROM ${this.table} WHERE id = ?`, [id])\n if (!result.success || !result.data)\n return undefined\n return JSON.parse(result.data.data) as T\n }\n\n async query(filter: StoreFilter<T>): Promise<T[]> {\n const { sql, params } = this.buildQuery(filter)\n const result = await this.sql.query<{ data: string }>(sql, params)\n if (!result.success)\n return []\n return result.data.map(row => JSON.parse(row.data) as T)\n }\n\n async queryPage(filter: StoreFilter<T>, page: { offset: number, limit: number }): Promise<StorePage<T>> {\n const countParams: unknown[] = []\n const countConditions = this.buildAllConditions(filter, countParams)\n let countSql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (countConditions.length > 0)\n countSql += ` WHERE ${countConditions.join(' AND ')}`\n const countResult = await this.sql.get<{ cnt: number }>(countSql, countParams)\n const total = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n\n const { sql, params } = this.buildQuery({ ...filter, limit: undefined })\n const pagedSql = `${sql} LIMIT ? OFFSET ?`\n const result = await this.sql.query<{ data: string }>(pagedSql, [...params, page.limit, page.offset])\n const items = result.success ? result.data.map(row => JSON.parse(row.data) as T) : []\n\n return { items, total }\n }\n\n async remove(id: string): Promise<boolean> {\n await this.sql.execute(`DELETE FROM ${this.table} WHERE id = ?`, [id])\n return true\n }\n\n async removeBy(filter: StoreFilter<T>): Promise<number> {\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter, params)\n\n let countSql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (conditions.length > 0) {\n const whereClause = ` WHERE ${conditions.join(' AND ')}`\n countSql += whereClause\n const countResult = await this.sql.get<{ cnt: number }>(countSql, [...params])\n const count = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n await this.sql.execute(`DELETE FROM ${this.table}${whereClause}`, params)\n return count\n }\n\n const countResult = await this.sql.get<{ cnt: number }>(countSql)\n const count = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n await this.sql.execute(`DELETE FROM ${this.table}`)\n return count\n }\n\n async count(filter?: StoreFilter<T>): Promise<number> {\n if (!filter?.where && !filter?.objectId && !filter?.sessionId && !filter?.status && !filter?.refId) {\n const result = await this.sql.get<{ cnt: number }>(`SELECT COUNT(*) as cnt FROM ${this.table}`)\n return result.success && result.data != null ? result.data.cnt : 0\n }\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter!, params)\n let sql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (conditions.length > 0)\n sql += ` WHERE ${conditions.join(' AND ')}`\n const result = await this.sql.get<{ cnt: number }>(sql, params)\n return result.success && result.data != null ? result.data.cnt : 0\n }\n\n async clear(filter?: StoreFilter<T>): Promise<void> {\n if (!filter?.where && !filter?.objectId && !filter?.sessionId && !filter?.status && !filter?.refId) {\n await this.sql.execute(`DELETE FROM ${this.table}`)\n return\n }\n await this.removeBy(filter!)\n }\n\n private buildQuery(filter: StoreFilter<T>): { sql: string, params: unknown[] } {\n let sql = `SELECT data FROM ${this.table}`\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter, params)\n if (conditions.length > 0)\n sql += ` WHERE ${conditions.join(' AND ')}`\n\n if (filter.orderBy) {\n const dir = filter.orderBy.direction === 'asc' ? 'ASC' : 'DESC'\n const field = String(filter.orderBy.field)\n if (field === 'createdAt') {\n sql += ` ORDER BY created_at ${dir}`\n }\n else if (field === 'updatedAt') {\n sql += ` ORDER BY updated_at ${dir}`\n }\n else {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', `$.${field}`)\n params.push(...jsonParams)\n sql += ` ORDER BY ${jsonSql} ${dir}`\n }\n }\n else {\n sql += ` ORDER BY created_at DESC`\n }\n\n if (filter.limit) {\n sql += ` LIMIT ?`\n params.push(filter.limit)\n }\n return { sql, params }\n }\n\n private buildAllConditions(filter: StoreFilter<T>, params: unknown[]): string[] {\n const conditions: string[] = []\n if (filter.objectId && this.hasObjectId) {\n conditions.push('object_id = ?')\n params.push(filter.objectId)\n }\n if (filter.sessionId && this.hasSessionId) {\n conditions.push('session_id = ?')\n params.push(filter.sessionId)\n }\n if (filter.status && this.hasStatus) {\n if (Array.isArray(filter.status)) {\n conditions.push(`status IN (${filter.status.map(() => '?').join(', ')})`)\n params.push(...filter.status)\n }\n else {\n conditions.push('status = ?')\n params.push(filter.status)\n }\n }\n if (filter.refId && this.hasRefId) {\n conditions.push('ref_id = ?')\n params.push(filter.refId)\n }\n if (filter.where)\n conditions.push(...this.buildWhereConditions(filter.where, params))\n return conditions\n }\n\n private buildWhereConditions(where: WhereClause<T>, params: unknown[]): string[] {\n const conditions: string[] = []\n for (const key of Object.keys(where)) {\n const value = (where as Record<string, unknown>)[key]\n const path = `$.${key}`\n if (this.isWhereOperator(value)) {\n const op = value as WhereOperator<unknown>\n if (op.$in !== undefined && Array.isArray(op.$in)) {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', path)\n params.push(...jsonParams)\n conditions.push(`${jsonSql} IN (${op.$in.map(() => '?').join(', ')})`)\n params.push(...op.$in)\n }\n if (op.$gte !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} >= ?`)\n params.push(op.$gte)\n }\n if (op.$gt !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} > ?`)\n params.push(op.$gt)\n }\n if (op.$lte !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} <= ?`)\n params.push(op.$lte)\n }\n if (op.$lt !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} < ?`)\n params.push(op.$lt)\n }\n }\n else {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', path)\n params.push(...jsonParams)\n conditions.push(`${jsonSql} = ?`)\n params.push(value)\n }\n }\n return conditions\n }\n\n private isWhereOperator<V>(value: unknown): value is WhereOperator<V> {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n return false\n const keys = Object.keys(value)\n return keys.length > 0 && keys.every(k => ['$in', '$gte', '$gt', '$lte', '$lt'].includes(k))\n }\n}\n\n// ─── VecdbAIVectorStore 实现 ───\n\n/**\n * 基于 vecdb 的持久化向量存储实现\n *\n * 使用 vecdb.vector / vecdb.collection 子对象操作向量数据。\n * 集合在首次 upsert 时按需创建(lazy),clear 时 drop 集合。\n */\nclass VecdbAIVectorStore implements AIVectorStore {\n private readonly vecdb: VecdbFunctions\n private readonly collection: string\n private collectionDimension: number | null = null\n\n constructor(vecdb: VecdbFunctions, collection: string) {\n this.vecdb = vecdb\n this.collection = collection\n }\n\n private async ensureCollection(dimension: number): Promise<void> {\n if (this.collectionDimension === dimension)\n return\n const exists = await this.vecdb.collection.exists(this.collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(this.collection, { dimension })\n this.collectionDimension = dimension\n }\n\n async upsert(id: string, vector: number[], metadata?: Record<string, unknown>): Promise<void> {\n await this.ensureCollection(vector.length)\n await this.vecdb.vector.upsert(this.collection, [{ id, vector, metadata }])\n }\n\n async search(vector: number[], options?: { topK?: number, minScore?: number, filter?: Record<string, unknown> }): Promise<Array<{ id: string, score: number, content?: string, metadata?: Record<string, unknown> }>> {\n const result = await this.vecdb.vector.search(this.collection, vector, options)\n return result.success ? result.data : []\n }\n\n async remove(id: string): Promise<void> {\n await this.vecdb.vector.delete(this.collection, [id])\n }\n\n async clear(_filter?: Record<string, unknown>): Promise<void> {\n const exists = await this.vecdb.collection.exists(this.collection)\n if (exists.success && exists.data) {\n await this.vecdb.collection.drop(this.collection)\n this.collectionDimension = null\n }\n }\n}\n\n// ─── DB KnowledgeStore 实现 ───\n\n/** 根据数据库类型生成 DDL 语句 */\nfunction buildKnowledgeSchemaStatements(dbType: DbType): string[] {\n const pk = dbType === 'mysql' ? 'VARCHAR(512)' : 'TEXT'\n const textCol = dbType === 'mysql' ? 'VARCHAR(255)' : 'TEXT'\n const longText = 'TEXT'\n\n return [\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_entity (\n id ${pk} PRIMARY KEY,\n name ${textCol} NOT NULL,\n type ${textCol} NOT NULL,\n aliases ${longText},\n description ${longText},\n created_at BIGINT DEFAULT 0,\n updated_at BIGINT DEFAULT 0\n)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_name ON hai_ai_knowledge_entity(name)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_type ON hai_ai_knowledge_entity(type)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_entity_document (\n entity_id ${pk} NOT NULL,\n document_id ${pk} NOT NULL,\n chunk_id ${pk} DEFAULT '',\n collection ${textCol} NOT NULL,\n relevance REAL DEFAULT 1.0,\n context ${longText},\n created_at BIGINT DEFAULT 0,\n PRIMARY KEY (entity_id, document_id, chunk_id)\n)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_ed_document ON hai_ai_knowledge_entity_document(document_id)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_ed_collection ON hai_ai_knowledge_entity_document(collection)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_document (\n document_id ${pk} NOT NULL,\n collection ${textCol} NOT NULL,\n title ${longText},\n url ${longText},\n chunk_count INTEGER DEFAULT 0,\n created_at BIGINT DEFAULT 0,\n PRIMARY KEY (document_id, collection)\n)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_collections (\n collection ${textCol} PRIMARY KEY,\n dimension INTEGER NOT NULL,\n created_at BIGINT NOT NULL\n)`,\n ]\n}\n\n/**\n * 基于 reldb + vecdb 的 KnowledgeStore 实现\n *\n * reldb 用于实体/文档/关联的归一化存储,vecdb 用于向量存储。\n * 表结构由 buildKnowledgeSchemaStatements() 生成。\n */\nclass DbKnowledgeStore implements KnowledgeStore {\n private readonly sql: DmlOperations\n private readonly dbType: DbType\n private readonly vecdb: VecdbFunctions\n\n constructor(sql: DmlOperations, dbType: DbType, vecdb: VecdbFunctions) {\n this.sql = sql\n this.dbType = dbType\n this.vecdb = vecdb\n }\n\n async initialize(collection: string, dimension: number): Promise<void> {\n // 创建 vecdb 集合\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension })\n\n // 创建 reldb 表\n const statements = buildKnowledgeSchemaStatements(this.dbType)\n for (const stmt of statements) {\n const result = await this.sql.execute(stmt)\n if (!result.success) {\n logger.error('Knowledge schema creation failed', { sql: stmt.trim().slice(0, 60), error: result.error })\n throw new Error(`Knowledge schema creation failed: ${String(result.error)}`)\n }\n }\n }\n\n async upsertEntity(entity: { id: string, name: string, type: string, aliases?: string[], description?: string }): Promise<void> {\n const now = Date.now()\n const params = [entity.id, entity.name, entity.type, entity.aliases ? JSON.stringify(entity.aliases) : null, entity.description ?? null, now, now]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_entity (id, name, type, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), type = VALUES(type), aliases = VALUES(aliases), description = VALUES(description), updated_at = VALUES(updated_at)`\n : `INSERT INTO hai_ai_knowledge_entity (id, name, type, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = excluded.name, type = excluded.type, aliases = excluded.aliases, description = excluded.description, updated_at = excluded.updated_at`\n const result = await this.sql.execute(stmt, params)\n if (!result.success)\n throw new Error(`upsertEntity failed: ${String(result.error)}`)\n }\n\n async findEntitiesByName(keyword: string): Promise<Array<{ id: string, name: string, type: string, aliases: string[] }>> {\n const pattern = `%${keyword}%`\n const result = await this.sql.query<Record<string, unknown>>(\n `SELECT id, name, type, aliases FROM hai_ai_knowledge_entity WHERE name LIKE ? OR aliases LIKE ?`,\n [pattern, pattern],\n )\n if (!result.success)\n return []\n return result.data.map(row => ({\n id: row.id as string,\n name: row.name as string,\n type: row.type as string,\n aliases: row.aliases ? JSON.parse(row.aliases as string) as string[] : [],\n }))\n }\n\n async listEntities(options?: { type?: string, keyword?: string, limit?: number }): Promise<Array<{ id: string, name: string, type: string, aliases: string[], description: string | null, createdAt: string | null, updatedAt: string | null }>> {\n let stmt = 'SELECT id, name, type, aliases, description, created_at, updated_at FROM hai_ai_knowledge_entity WHERE 1=1'\n const params: unknown[] = []\n if (options?.type) {\n stmt += ' AND type = ?'\n params.push(options.type)\n }\n if (options?.keyword) {\n stmt += ' AND (name LIKE ? OR aliases LIKE ?)'\n const p = `%${options.keyword}%`\n params.push(p, p)\n }\n stmt += ' ORDER BY name'\n if (options?.limit) {\n stmt += ' LIMIT ?'\n params.push(options.limit)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n id: row.id as string,\n name: row.name as string,\n type: row.type as string,\n aliases: row.aliases ? JSON.parse(row.aliases as string) as string[] : [],\n description: row.description as string | null,\n createdAt: row.created_at as string | null,\n updatedAt: row.updated_at as string | null,\n }))\n }\n\n async insertEntityDocument(relation: { entityId: string, documentId: string, chunkId?: string, collection: string, relevance?: number, context?: string }): Promise<void> {\n const now = Date.now()\n const params = [relation.entityId, relation.documentId, relation.chunkId ?? '', relation.collection, relation.relevance ?? 1.0, relation.context ?? null, now]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_entity_document (entity_id, document_id, chunk_id, collection, relevance, context, created_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE relevance = VALUES(relevance), context = VALUES(context)`\n : `INSERT INTO hai_ai_knowledge_entity_document (entity_id, document_id, chunk_id, collection, relevance, context, created_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(entity_id, document_id, chunk_id) DO UPDATE SET relevance = excluded.relevance, context = excluded.context`\n const result = await this.sql.execute(stmt, params)\n if (!result.success)\n throw new Error(`insertEntityDocument failed: ${String(result.error)}`)\n }\n\n async findDocumentsByEntityIds(entityIds: string[], collection?: string): Promise<Array<{ entityId: string, documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }>> {\n if (entityIds.length === 0)\n return []\n const placeholders = entityIds.map(() => '?').join(', ')\n let stmt = `SELECT entity_id, document_id, chunk_id, collection, relevance, context FROM hai_ai_knowledge_entity_document WHERE entity_id IN (${placeholders})`\n const params: unknown[] = [...entityIds]\n if (collection) {\n stmt += ' AND collection = ?'\n params.push(collection)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n entityId: row.entity_id as string,\n documentId: row.document_id as string,\n chunkId: row.chunk_id as string,\n collection: row.collection as string,\n relevance: row.relevance as number,\n context: row.context as string | null,\n }))\n }\n\n async findByEntityName(entityName: string, options?: { collection?: string, type?: string }): Promise<Array<{ entity: { id: string, name: string, type: string, aliases: string[], description: string | null }, documents: Array<{ documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }> }>> {\n const entities = await this.findEntitiesByName(entityName)\n let filtered = entities\n if (options?.type)\n filtered = filtered.filter(e => e.type === options.type)\n if (filtered.length === 0)\n return []\n\n const entityIds = filtered.map(e => e.id)\n const docs = await this.findDocumentsByEntityIds(entityIds, options?.collection)\n\n const docsByEntity = new Map<string, Array<{ documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }>>()\n for (const doc of docs) {\n const list = docsByEntity.get(doc.entityId) ?? []\n const { entityId: _entityId, ...rest } = doc\n list.push(rest)\n docsByEntity.set(doc.entityId, list)\n }\n\n return filtered.map(entity => ({\n entity: { ...entity, description: null as string | null },\n documents: docsByEntity.get(entity.id) ?? [],\n }))\n }\n\n async removeDocumentEntityRelations(documentId: string, collection: string): Promise<void> {\n await this.sql.execute('DELETE FROM hai_ai_knowledge_entity_document WHERE document_id = ? AND collection = ?', [documentId, collection])\n }\n\n async upsertDocument(doc: { documentId: string, collection: string, title?: string, url?: string, chunkCount: number, createdAt: number }): Promise<void> {\n const params = [doc.documentId, doc.collection, doc.title ?? null, doc.url ?? null, doc.chunkCount, doc.createdAt]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_document (document_id, collection, title, url, chunk_count, created_at) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE title = VALUES(title), url = VALUES(url), chunk_count = VALUES(chunk_count)`\n : `INSERT INTO hai_ai_knowledge_document (document_id, collection, title, url, chunk_count, created_at) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(document_id, collection) DO UPDATE SET title = excluded.title, url = excluded.url, chunk_count = excluded.chunk_count`\n await this.sql.execute(stmt, params)\n }\n\n async getDocument(documentId: string, collection: string): Promise<{ documentId: string, collection: string, title: string | null, url: string | null, chunkCount: number, createdAt: number } | undefined> {\n const result = await this.sql.query<Record<string, unknown>>(\n 'SELECT document_id, collection, title, url, chunk_count, created_at FROM hai_ai_knowledge_document WHERE document_id = ? AND collection = ?',\n [documentId, collection],\n )\n if (!result.success || result.data.length === 0)\n return undefined\n const row = result.data[0]\n return {\n documentId: row.document_id as string,\n collection: row.collection as string,\n title: row.title as string | null,\n url: row.url as string | null,\n chunkCount: row.chunk_count as number,\n createdAt: row.created_at as number,\n }\n }\n\n async listDocuments(collection: string, options?: { offset?: number, limit?: number }): Promise<Array<{ documentId: string, collection: string, title: string | null, url: string | null, chunkCount: number, createdAt: number }>> {\n let stmt = 'SELECT document_id, collection, title, url, chunk_count, created_at FROM hai_ai_knowledge_document WHERE collection = ?'\n const params: unknown[] = [collection]\n stmt += ' ORDER BY created_at DESC'\n if (options?.limit) {\n stmt += ' LIMIT ?'\n params.push(options.limit)\n }\n if (options?.offset) {\n stmt += ' OFFSET ?'\n params.push(options.offset)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n documentId: row.document_id as string,\n collection: row.collection as string,\n title: row.title as string | null,\n url: row.url as string | null,\n chunkCount: row.chunk_count as number,\n createdAt: row.created_at as number,\n }))\n }\n\n async listDocumentEntityCounts(documentIds: string[], collection: string): Promise<Map<string, number>> {\n if (documentIds.length === 0)\n return new Map()\n const placeholders = documentIds.map(() => '?').join(', ')\n const result = await this.sql.query<Record<string, unknown>>(\n `SELECT document_id, COUNT(DISTINCT entity_id) as cnt FROM hai_ai_knowledge_entity_document WHERE document_id IN (${placeholders}) AND collection = ? GROUP BY document_id`,\n [...documentIds, collection],\n )\n const map = new Map<string, number>()\n if (result.success) {\n for (const row of result.data) map.set(row.document_id as string, row.cnt as number)\n }\n return map\n }\n\n async removeDocument(documentId: string, collection: string): Promise<void> {\n await this.sql.execute('DELETE FROM hai_ai_knowledge_document WHERE document_id = ? AND collection = ?', [documentId, collection])\n }\n\n async upsertVectors(collection: string, vectors: Array<{ id: string, vector: number[], content?: string, metadata?: Record<string, unknown> }>): Promise<void> {\n // 确保集合存在\n if (vectors.length > 0) {\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension: vectors[0].vector.length })\n }\n await this.vecdb.vector.upsert(collection, vectors)\n }\n\n async searchVectors(collection: string, vector: number[], options?: { topK?: number, minScore?: number, filter?: Record<string, unknown> }): Promise<Array<{ id: string, score: number, content?: string, metadata?: Record<string, unknown> }>> {\n const result = await this.vecdb.vector.search(collection, vector, options)\n return result.success ? result.data : []\n }\n\n async removeVectors(collection: string, ids: string[]): Promise<void> {\n await this.vecdb.vector.delete(collection, ids)\n }\n\n async ensureCollection(collection: string, dimension: number): Promise<void> {\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension })\n }\n\n async registerCollection(collection: string, dimension: number): Promise<void> {\n const now = Date.now()\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_collections (collection, dimension, created_at) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE dimension = VALUES(dimension)`\n : `INSERT INTO hai_ai_knowledge_collections (collection, dimension, created_at) VALUES (?, ?, ?) ON CONFLICT(collection) DO UPDATE SET dimension = excluded.dimension`\n const result = await this.sql.execute(stmt, [collection, dimension, now])\n if (!result.success)\n throw new Error(`registerCollection failed: ${String(result.error)}`)\n }\n\n async collectionExists(collection: string): Promise<boolean> {\n const result = await this.sql.get<{ cnt: number }>(\n `SELECT 1 as cnt FROM hai_ai_knowledge_collections WHERE collection = ?`,\n [collection],\n )\n return result.success && result.data != null\n }\n}\n\n// ─── Provider 工厂 ───\n\n/** DB Provider 依赖 */\nexport interface DbStoreProviderDeps {\n sql: DmlOperations\n jsonOps: ReldbJsonOps\n dbType?: DbType\n vecdb: VecdbFunctions\n}\n\n/**\n * 创建默认 DB 存储 Provider\n *\n * 基于 reldb + vecdb 的 AIStoreProvider 实现。\n * reldb 用于关系数据存储,vecdb 用于向量存储。\n */\nexport function createDbStoreProvider(deps: DbStoreProviderDeps): AIStoreProvider {\n const { sql, jsonOps, vecdb: vecdbDep } = deps\n const dbType = deps.dbType ?? 'sqlite'\n\n /** 已创建的 RelStore 实例(用于批量建表) */\n const relStores: ReldbAIRelStore<unknown>[] = []\n\n return {\n name: 'db',\n\n createRelStore<T>(name: string, options?: AIRelStoreOptions): AIRelStore<T> {\n const store = new ReldbAIRelStore<T>(sql, name, jsonOps, dbType, options)\n relStores.push(store as ReldbAIRelStore<unknown>)\n return store\n },\n\n createVectorStore(name: string): AIVectorStore {\n return new VecdbAIVectorStore(vecdbDep, name)\n },\n\n createKnowledgeStore(): KnowledgeStore {\n return new DbKnowledgeStore(sql, dbType, vecdbDep)\n },\n\n async initialize(): Promise<void> {\n if (relStores.length > 0) {\n await Promise.all(relStores.map(s => s.createTable()))\n logger.debug('DB store provider initialized', { tableCount: relStores.length })\n }\n },\n\n async close(): Promise<void> {\n relStores.length = 0\n },\n }\n}\n\n// ─── Singleton 便捷工厂 ───\n\n/**\n * 检查 reldb + vecdb 是否已初始化\n *\n * 由 ai-main.ts 在创建默认 DB Provider 前调用。\n */\nexport function isDbStoreAvailable(): boolean {\n return reldb.isInitialized && vecdb.isInitialized\n}\n\n/**\n * 获取未初始化的依赖名称列表\n */\nexport function getUnavailableDbDeps(): string[] {\n const missing: string[] = []\n if (!reldb.isInitialized)\n missing.push('reldb')\n if (!vecdb.isInitialized)\n missing.push('vecdb')\n return missing\n}\n\n/**\n * 从已初始化的 reldb/vecdb 单例创建 DB Provider\n *\n * 用于默认 `store.type: 'db'` 场景。调用前应先用 `isDbStoreAvailable()` 检查。\n */\nexport function createDbStoreProviderFromModules(): AIStoreProvider {\n return createDbStoreProvider({\n sql: reldb.sql,\n jsonOps: reldb.json,\n dbType: reldb.config?.type,\n vecdb,\n })\n}\n","/**\n * @h-ai/ai — AI 服务主入口\n *\n * 提供统一的 `ai` 对象,聚合所有 AI 操作功能。\n * @module ai-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { A2AOperations } from './a2a/ai-a2a-types.js'\nimport type { AIConfig, AIConfigInput } from './ai-config.js'\nimport type { AIFunctions, AIInitOptions } from './ai-types.js'\nimport type { CompressOperations } from './compress/ai-compress-types.js'\nimport type { ContextOperations } from './context/ai-context-types.js'\nimport type { EmbeddingOperations } from './embedding/ai-embedding-types.js'\nimport type { FileOperations } from './file/ai-file-types.js'\nimport type { KnowledgeOperations } from './knowledge/ai-knowledge-types.js'\nimport type { LLMOperations, StreamOperations, ToolsOperations } from './llm/ai-llm-types.js'\nimport type { MCPOperations } from './mcp/ai-mcp-types.js'\nimport type { MemoryOperations } from './memory/ai-memory-types.js'\nimport type { RagOperations } from './rag/ai-rag-types.js'\nimport type { ReasoningOperations } from './reasoning/ai-reasoning-types.js'\nimport type { RerankOperations } from './rerank/ai-rerank-types.js'\nimport type { RetrievalOperations } from './retrieval/ai-retrieval-types.js'\nimport type { AIStoreProvider } from './store/ai-store-types.js'\nimport type { SummaryOperations } from './summary/ai-summary-types.js'\nimport type { TokenOperations } from './token/ai-token-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { datapipe } from '@h-ai/datapipe'\n\nimport { createA2ALazyProxy } from './a2a/ai-a2a-functions.js'\nimport { AIConfigSchema } from './ai-config.js'\nimport { createAISubsystems } from './ai-functions.js'\nimport { aiM } from './ai-i18n.js'\nimport { HaiAIError } from './ai-types.js'\nimport { collectStream, createSSEDecoder, createStreamProcessor, encodeSSE } from './llm/ai-llm-stream.js'\nimport { createToolRegistry, defineTool } from './llm/ai-llm-tool.js'\nimport { createDbStoreProviderFromModules, getUnavailableDbDeps, isDbStoreAvailable } from './store/providers/ai-store-provider-db.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 并发初始化防护 */\nlet initInProgress = false\n/** 当前配置(`null` 表示未初始化) */\nlet currentConfig: AIConfig | null = null\n/** 当前 LLM 操作实例 */\nlet currentLLM: LLMOperations | null = null\n/** 当前 MCP 操作实例 */\nlet currentMCP: MCPOperations | null = null\n/** 当前 Embedding 操作实例 */\nlet currentEmbedding: EmbeddingOperations | null = null\n/** 当前 Reasoning 操作实例 */\nlet currentReasoning: ReasoningOperations | null = null\n/** 当前 Retrieval 操作实例 */\nlet currentRetrieval: RetrievalOperations | null = null\n/** 当前 RAG 操作实例 */\nlet currentRag: RagOperations | null = null\n/** 当前 Knowledge 操作实例 */\nlet currentKnowledge: KnowledgeOperations | null = null\n/** 当前 Memory 操作实例 */\nlet currentMemory: MemoryOperations | null = null\n/** 当前 Context 操作实例 */\nlet currentContext: ContextOperations | null = null\n/** 当前 Token 操作实例 */\nlet currentToken: TokenOperations | null = null\n/** 当前 Summary 操作实例 */\nlet currentSummary: SummaryOperations | null = null\n/** 当前 Compress 操作实例 */\nlet currentCompress: CompressOperations | null = null\n/** 当前 Rerank 操作实例 */\nlet currentRerank: RerankOperations | null = null\n/** 当前 File 操作实例 */\nlet currentFile: FileOperations | null = null\n/** A2A 配置(从 config.a2a 存储,供延迟初始化使用) */\nlet currentA2AConfig: AIConfig['a2a']\n/** A2A 内部实现(registerExecutor 成功后才有值) */\nlet currentA2AImpl: A2AOperations | null = null\n/** 当前存储 Provider(用于 A2A 延迟初始化) */\nlet currentStoreProvider: AIStoreProvider | null = null\n\n// ─── 未初始化占位 ───\n\n/** 创建未初始化错误工具(统一的 NOT_INITIALIZED 响应) */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiAIError.NOT_INITIALIZED,\n () => aiM('ai_notInitialized'),\n)\n\n/**\n * LLM 未初始化占位\n *\n * 异步方法返回 NOT_INITIALIZED HaiResult。\n * chatStream 是 async generator,无法返回 HaiResult,\n * 只能在迭代时抛出异常通知调用方。\n */\nconst notInitializedLLM: LLMOperations = {\n chat: () => Promise.resolve(notInitialized.result()),\n async* chatStream() {\n throw notInitialized.error()\n },\n listModels: () => Promise.resolve(notInitialized.result()),\n getHistory: () => Promise.resolve(notInitialized.result()),\n listSessions: () => Promise.resolve(notInitialized.result()),\n ask: () => Promise.resolve(notInitialized.result()),\n async* askStream() {\n throw notInitialized.error()\n },\n}\n\n/** MCP 未初始化占位:所有方法返回 NOT_INITIALIZED 错误 */\nconst notInitializedMCP: MCPOperations = {\n registerTool: () => notInitialized.result(),\n registerResource: () => notInitialized.result(),\n registerPrompt: () => notInitialized.result(),\n callTool: () => Promise.resolve(notInitialized.result()),\n readResource: () => Promise.resolve(notInitialized.result()),\n getPrompt: () => Promise.resolve(notInitialized.result()),\n}\n\n/** Embedding 未初始化占位 */\nconst notInitializedEmbedding = notInitialized.proxy<EmbeddingOperations>()\n\n/** Reasoning 未初始化占位 */\nconst notInitializedReasoning: ReasoningOperations = {\n run: () => Promise.resolve(notInitialized.result()),\n async* runStream() { throw notInitialized.error() },\n}\n\n/** Retrieval 未初始化占位 */\nconst notInitializedRetrieval: RetrievalOperations = {\n addSource: () => Promise.resolve(notInitialized.result()),\n removeSource: () => Promise.resolve(notInitialized.result()),\n listSources: () => Promise.resolve([]),\n retrieve: () => Promise.resolve(notInitialized.result()),\n}\n\n/** RAG 未初始化占位 */\nconst notInitializedRag: RagOperations = {\n query: () => Promise.resolve(notInitialized.result()),\n async* queryStream() { throw notInitialized.error() },\n}\n\n/** Knowledge 未初始化占位 */\nconst notInitializedKnowledge = notInitialized.proxy<KnowledgeOperations>()\n\n/** Memory 未初始化占位 */\nconst notInitializedMemory = notInitialized.proxy<MemoryOperations>()\n\n/**\n * Token 未初始化占位\n *\n * Token 方法返回原始 number 而非 HaiResult,无法通过 proxy 安全拦截。\n * 未初始化时直接抛出异常,避免静默返回 0 导致下游 Token 计算错误。\n */\nconst notInitializedToken: TokenOperations = {\n estimateText: () => { throw notInitialized.error() },\n estimateMessages: () => { throw notInitialized.error() },\n}\n\n/** Summary 未初始化占位 */\nconst notInitializedSummary = notInitialized.proxy<SummaryOperations>()\n\n/** Compress 未初始化占位 */\nconst notInitializedCompress = notInitialized.proxy<CompressOperations>()\n\n/** Context 未初始化占位 */\nconst notInitializedContext: ContextOperations = {\n createManager: () => notInitialized.result(),\n restoreManager: () => Promise.resolve(notInitialized.result()),\n listSessions: () => Promise.resolve(notInitialized.result()),\n renameSession: () => Promise.resolve(notInitialized.result()),\n removeSession: () => Promise.resolve(notInitialized.result()),\n}\n\n/** Rerank 未初始化占位 */\nconst notInitializedRerank = notInitialized.proxy<RerankOperations>()\n\n/** File 未初始化占位 */\nconst notInitializedFile = notInitialized.proxy<FileOperations>()\n\n/** A2A 延迟初始化代理(委托给 a2a 模块的 createA2ALazyProxy) */\nconst a2aLazyOperations: A2AOperations = createA2ALazyProxy({\n isInitialized: () => currentConfig !== null,\n getA2AConfig: () => currentA2AConfig ?? null,\n getA2AImpl: () => currentA2AImpl,\n setA2AImpl: (impl) => { currentA2AImpl = impl },\n getStoreProvider: () => currentStoreProvider,\n notInitializedResult: () => notInitialized.result(),\n})\n\n// ─── 内部辅助 ───\n\n/** 重置所有子功能引用为 null(用于 close 和 init 失败清理) */\nfunction resetAllState(): void {\n currentLLM = null\n currentMCP = null\n currentEmbedding = null\n currentReasoning = null\n currentRetrieval = null\n currentRag = null\n currentKnowledge = null\n currentMemory = null\n currentToken = null\n currentSummary = null\n currentCompress = null\n currentContext = null\n currentRerank = null\n currentFile = null\n currentA2AConfig = undefined\n currentA2AImpl = null\n currentStoreProvider = null\n currentConfig = null\n}\n\n// ─── 纯函数操作(不依赖初始化) ───\n\nconst toolsOperations: ToolsOperations = {\n define: defineTool,\n createRegistry: createToolRegistry,\n}\n\nconst streamOperations: StreamOperations = {\n createProcessor: createStreamProcessor,\n collect: collectStream,\n createSSEDecoder,\n encodeSSE,\n}\n\n// ─── 服务对象 ───\n\n/**\n * AI 服务对象,统一的 AI 访问入口\n *\n * @example\n * ```ts\n * import { ai } from '@h-ai/ai'\n *\n * // 初始化\n * await ai.init({ llm: { model: 'gpt-4o-mini', apiKey: process.env.HAI_AI_LLM_API_KEY } })\n *\n * // LLM 调用\n * const result = await ai.llm.chat({\n * messages: [{ role: 'user', content: '你好' }],\n * })\n *\n * // 关闭\n * ai.close()\n * ```\n */\nexport const ai: AIFunctions = {\n async init(config?: AIConfigInput, options?: AIInitOptions): Promise<HaiResult<void>> {\n // 并发初始化防护:避免多次 init 同时执行导致资源泄漏\n if (initInProgress) {\n logger.warn('AI init already in progress, skipping concurrent call')\n return err(HaiAIError.INIT_IN_PROGRESS, aiM('ai_initInProgress'))\n }\n initInProgress = true\n\n try {\n // 关闭旧实例\n if (currentConfig) {\n logger.warn('AI module is already initialized, reinitializing')\n ai.close()\n }\n\n logger.info('Initializing AI module')\n\n const parseResult = AIConfigSchema.safeParse(config ?? {})\n if (!parseResult.success) {\n logger.error('AI config validation failed', { error: parseResult.error.message })\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_configError', { params: { error: parseResult.error.message } }),\n parseResult.error,\n )\n }\n const parsed = parseResult.data\n\n // 注入存储 Provider(外部传入或使用默认 DB Provider)\n let storeProvider: AIStoreProvider\n if (options?.storeProvider) {\n storeProvider = options.storeProvider\n }\n else {\n // 默认使用 reldb + vecdb(需要已初始化)\n if (!isDbStoreAvailable()) {\n const missing = getUnavailableDbDeps().join(', ')\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_configError', { params: { error: `${missing} not initialized. reldb and vecdb are required for default db store.` } }),\n )\n }\n storeProvider = createDbStoreProviderFromModules()\n }\n currentStoreProvider = storeProvider\n\n // 委托 ai-functions 组装所有子功能(含建表)\n const subs = await createAISubsystems(parsed, {\n storeProvider,\n datapipe,\n })\n\n currentLLM = subs.llm\n currentMCP = subs.mcp\n currentEmbedding = subs.embedding\n currentReasoning = subs.reasoning\n currentRerank = subs.rerank\n currentRetrieval = subs.retrieval\n currentRag = subs.rag\n currentKnowledge = subs.knowledge\n currentMemory = subs.memory\n currentToken = subs.token\n currentSummary = subs.summary\n currentCompress = subs.compress\n currentContext = subs.context\n currentFile = subs.file\n\n currentA2AConfig = parsed.a2a\n\n currentConfig = parsed\n logger.info('AI module initialized', { model: parsed.llm?.model })\n return ok(undefined)\n }\n catch (error) {\n // 清理部分赋值的子功能引用,避免 isInitialized=false 但 getter 返回无效实例\n resetAllState()\n logger.error('AI module initialization failed', { error })\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_initFailed', {\n params: { error: String(error) },\n }),\n error,\n )\n }\n finally {\n initInProgress = false\n }\n },\n\n get llm(): LLMOperations { return currentLLM ?? notInitializedLLM },\n get mcp(): MCPOperations { return currentMCP ?? notInitializedMCP },\n get tools(): ToolsOperations { return toolsOperations },\n get stream(): StreamOperations { return streamOperations },\n get embedding(): EmbeddingOperations { return currentEmbedding ?? notInitializedEmbedding },\n get reasoning(): ReasoningOperations { return currentReasoning ?? notInitializedReasoning },\n get retrieval(): RetrievalOperations { return currentRetrieval ?? notInitializedRetrieval },\n get rag(): RagOperations { return currentRag ?? notInitializedRag },\n get knowledge(): KnowledgeOperations { return currentKnowledge ?? notInitializedKnowledge },\n get memory(): MemoryOperations { return currentMemory ?? notInitializedMemory },\n get token(): TokenOperations { return currentToken ?? notInitializedToken },\n get summary(): SummaryOperations { return currentSummary ?? notInitializedSummary },\n get compress(): CompressOperations { return currentCompress ?? notInitializedCompress },\n get context(): ContextOperations { return currentContext ?? notInitializedContext },\n get rerank(): RerankOperations { return currentRerank ?? notInitializedRerank },\n get file(): FileOperations { return currentFile ?? notInitializedFile },\n get a2a(): A2AOperations { return a2aLazyOperations },\n get config() { return currentConfig },\n get isInitialized() { return currentConfig !== null },\n\n close(): void {\n if (!currentConfig) {\n logger.info('AI module already closed, skipping')\n return\n }\n\n logger.info('Closing AI module')\n resetAllState()\n logger.info('AI module closed')\n },\n}\n"]}
|