@h-ai/ai 0.1.0-alpha9 → 1.0.0-beta.2

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/dist/index.js.map CHANGED
@@ -1 +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 `![${alt}](${src})`\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 collection,\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, collection)\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 collection: options?.collection,\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.deleteDocumentEntities(documentId, collection)\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 // ─── deleteCollection ───\n async deleteCollection(collection?: string): 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 col = collection ?? config.collection\n logger.debug('Deleting knowledge collection', { collection: col })\n\n try {\n await store.deleteCollection(col)\n logger.debug('Knowledge collection deleted', { collection: col })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Knowledge collection deletion failed', { collection: col, error })\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: String(error) } }), error)\n }\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 collection ${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 INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_collection ON hai_ai_knowledge_entity(collection)`,\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, collection: string, aliases?: string[], description?: string }): Promise<void> {\n const now = Date.now()\n const params = [entity.id, entity.name, entity.type, entity.collection, 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, collection, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), type = VALUES(type), collection = VALUES(collection), aliases = VALUES(aliases), description = VALUES(description), updated_at = VALUES(updated_at)`\n : `INSERT INTO hai_ai_knowledge_entity (id, name, type, collection, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = excluded.name, type = excluded.type, collection = excluded.collection, 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, collection?: string): Promise<Array<{ id: string, name: string, type: string, aliases: string[] }>> {\n const pattern = `%${keyword}%`\n let stmt = `SELECT id, name, type, aliases FROM hai_ai_knowledge_entity WHERE (name LIKE ? OR aliases LIKE ?)`\n const params: unknown[] = [pattern, pattern]\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 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?: { collection?: string, 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?.collection) {\n stmt += ' AND collection = ?'\n params.push(options.collection)\n }\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 deleteEntities(entityIds: string[]): Promise<void> {\n if (entityIds.length === 0)\n return\n const placeholders = entityIds.map(() => '?').join(', ')\n await this.sql.execute(\n `DELETE FROM hai_ai_knowledge_entity WHERE id IN (${placeholders})`,\n entityIds,\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, options?.collection)\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 deleteDocumentEntities(documentId: string, collection: string): Promise<void> {\n // 必须在 removeDocumentEntityRelations 之前调用,子查询依赖关联行尚未删除\n await this.sql.execute(\n 'DELETE FROM hai_ai_knowledge_entity WHERE collection = ? AND id IN (SELECT DISTINCT entity_id FROM hai_ai_knowledge_entity_document WHERE document_id = ? AND collection = ?)',\n [collection, documentId, collection],\n )\n }\n\n async removeDocumentEntityRelations(documentId: string, collection: string): Promise<void> {\n await this.sql.execute(\n 'DELETE FROM hai_ai_knowledge_entity_document WHERE document_id = ? AND collection = ?',\n [documentId, collection],\n )\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 async deleteCollection(collection: string): Promise<void> {\n // ① 删除 vecdb 集合(向量数据)\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && exists.data)\n await this.vecdb.collection.drop(collection)\n\n // ② 删除 reldb 中所有与该 collection 相关的数据(顺序:关联表先、主表后)\n await this.sql.execute('DELETE FROM hai_ai_knowledge_entity_document WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_document WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_entity WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_collections WHERE collection = ?', [collection])\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"]}
1
+ {"version":3,"sources":["../src/a2a/ai-a2a-card.ts","../src/a2a/ai-a2a-runtime.ts","../src/a2a/ai-a2a-functions.ts","../src/audio/providers/ai-audio-provider.ts","../src/audio/providers/ai-audio-provider-doubao.ts","../src/audio/providers/ai-audio-provider-indextts.ts","../src/llm/ai-llm-stream.ts","../src/audio/providers/ai-audio-provider-mimo.ts","../src/audio/providers/ai-audio-provider-openai.ts","../src/audio/providers/ai-audio-provider-qwen.ts","../src/audio/providers/ai-audio-provider-whisper.ts","../src/audio/ai-audio-functions.ts","../src/compress/ai-compress-functions.ts","../src/store/ai-store-key.ts","../src/store/ai-store-session.ts","../src/context/ai-context-state.ts","../src/context/ai-context-functions.ts","../src/embedding/ai-embedding-functions.ts","../src/file/ai-file-functions.ts","../src/image/providers/ai-image-provider.ts","../src/image/providers/ai-image-provider-google.ts","../src/image/providers/ai-image-provider-openai.ts","../src/image/providers/ai-image-provider-pollinations.ts","../src/image/providers/ai-image-provider-qwen.ts","../src/image/providers/ai-image-provider-seedream.ts","../src/image/ai-image-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-anthropic.ts","../src/llm/providers/ai-llm-provider-openai-responses.ts","../src/llm/providers/ai-llm-provider-openai.ts","../src/llm/providers/ai-llm-provider-router.ts","../src/llm/ai-llm-functions.ts","../src/mcp/ai-mcp-functions.ts","../src/memory/ai-memory-facade.ts","../src/memory/ai-memory-extractor.ts","../src/memory/ai-memory-injection.ts","../src/memory/providers/ai-memory-provider-mem0-oss.ts","../src/memory/ai-memory-consolidation.ts","../src/memory/providers/ai-memory-provider-native.ts","../src/persona/ai-persona-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-knowledge-db.ts","../src/store/providers/ai-store-provider-db.ts","../src/store/providers/ai-store-provider-memory.ts","../src/ai-main.ts","../src/mcp/ai-mcp-server.ts"],"names":["receipt","delay","logger","core","ServerCallContextImpl","options","Buffer","size","ok","err","resolveSynthesisOutput","FormData","fetchAudio","OpenAI","systemMessages","conversationMessages","removableUnits","protectedUnits","toSummarize","snapshot","onAbort","fullReply","model","usage","result","Agent","fetchImage","message","response","createProvider","datapipe","nanoid","zod","contentToText","isRecord","process","LEADING_MARKDOWN_FENCE_REGEX","TRAILING_MARKDOWN_FENCE_REGEX","extractMemories","DEFAULT_IMPORTANCE","MEMORY_TYPES","normalizeType","normalizeImportance","matchScope","DEFAULT_OBJECT_ID","topK","createHash","vecdb","randomUUID","countResult","count","HaiVecdbError","cosineSimilarity"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/ai — A2A Agent Card 构建\n *\n * 将模块的声明配置转换为实际支持的 A2A 协议能力。\n * @module ai-a2a-card\n */\n\nimport type { AgentCard } from '@a2a-js/sdk'\n\nimport type { A2AAgentCardConfig } from './ai-a2a-types.js'\n\n// ─── 便捷工厂 ───\n\n/**\n * 从简化配置构建符合 SDK 规范的 AgentCard 对象\n *\n * @param config - 应用层提供的 Agent Card 配置\n * @returns 由共享 journal handler 提供的完整 AgentCard 对象\n *\n * @example 模块内部上下文\n * ```ts\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/plain'],\n defaultOutputModes: ['text/plain'],\n capabilities: { streaming: true, pushNotifications: false },\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 * A2A共享执行journal:Task与事件同一CAS提交;本地Map只跟踪本进程执行句柄。\n * @module ai-a2a-runtime\n */\nimport type { AgentCard, Message, MessageSendParams, Task, TaskIdParams, TaskQueryParams } from '@a2a-js/sdk'\nimport type { A2ARequestHandler, AgentExecutionEvent, AgentExecutor, ExecutionEventBus, ServerCallContext } from '@a2a-js/sdk/server'\nimport type { AIRelStore, AIVersionedRecord } from '../store/ai-store-types.js'\nimport type { A2AMessageRecord } from './ai-a2a-types.js'\nimport { Buffer } from 'node:buffer'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { A2AError, DefaultExecutionEventBus, RequestContext, ResultManager } from '@a2a-js/sdk/server'\nimport { core } from '@h-ai/core'\nimport { aiM } from '../ai-i18n.js'\n\n/**\n * Task、稳定消息回执及事件的单文档权威状态;历史不自动删除,防止旧重试重新执行。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(store: AIRelStore<A2AJournal>, taskId: string) {\n * const receipt = await store.readVersioned(taskId)\n * if (!receipt) return undefined\n * return { version: receipt.version, task: receipt.data.task, interrupted: receipt.data.interrupted }\n * }\n * // 消息日志不构成执行提交证据;以同文档 Task/finished/中断状态核对未知外部效果。\n * ```\n */\nexport interface A2AJournal {\n owner: string\n executionId: string\n leasedUntil: number\n deadline: number\n task: Task\n events: AgentExecutionEvent[]\n receipts: Array<{ id: string, digest: string }>\n message: Message\n result?: Message | Task\n finished: boolean\n cancelRequested: boolean\n interrupted: boolean\n}\n\n/**\n * A2A共享执行参数,时钟和截止条件均由Store提供。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const options: A2ARuntimeOptions = { leaseMs: 30_000, pollIntervalMs: 250, maxExecutionMs: 300_000 }\n * const checksPerLease = options.leaseMs / options.pollIntervalMs\n * ```\n */\nexport interface A2ARuntimeOptions {\n leaseMs: number\n pollIntervalMs: number\n maxExecutionMs: number\n}\n\nconst FINAL_STATES = new Set(['completed', 'failed', 'canceled', 'rejected'])\nconst MAX_JOURNAL_BYTES = 8 * 1024 * 1024\nconst MAX_EVENTS = 2048\nconst MAX_RECEIPTS = 256\nconst logger = core.logger.child({ module: 'ai', scope: 'a2a-runtime' })\n\n/** 存储异常只输出固定协议错误,避免SDK把驱动连接串或SQL直接写入响应及流日志。 */\nfunction safeState<T>(store: AIRelStore<T>): Pick<AIRelStore<T>, 'readVersioned' | 'compareAndSwap' | 'currentTime'> {\n const guard = async <V>(operation: () => Promise<V>): Promise<V> => {\n try {\n return await operation()\n }\n catch {\n throw A2AError.internalError(aiM('ai_a2aStateUnavailable'))\n }\n }\n return {\n readVersioned: id => guard(() => store.readVersioned(id)),\n compareAndSwap: (id, value) => guard(() => store.compareAndSwap(id, value)),\n currentTime: () => guard(() => store.currentTime()),\n }\n}\n\n/** 已认证身份只能来自可信传输上下文。 */\nfunction principal(context?: ServerCallContext): string {\n return context?.user?.isAuthenticated ? `user:${context.user.userName}` : 'anonymous'\n}\n\n/**\n * 共享执行器;未知外部效果不会在另一个节点自动重放。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(card: AgentCard, executor: AgentExecutor, journal: AIRelStore<A2AJournal>, contexts: AIRelStore<{ owner: string }>, messages: AIRelStore<A2AMessageRecord>, taskId: string, trustedContext: ServerCallContext) {\n * const handler = new SharedA2ARequestHandler(card, executor, journal, contexts, messages, { leaseMs: 30_000, pollIntervalMs: 250, maxExecutionMs: 300_000 })\n * try { return await handler.getTask({ id: taskId }, trustedContext) }\n * finally { await handler.close() }\n * }\n * ```\n */\nexport class SharedA2ARequestHandler implements A2ARequestHandler {\n private readonly executions = new Map<string, { controller: AbortController, done: Promise<void> }>()\n private closed = false\n private readonly journal: ReturnType<typeof safeState<A2AJournal>>\n private readonly contexts: ReturnType<typeof safeState<{ owner: string }>>\n\n constructor(private readonly card: AgentCard, private readonly executor: AgentExecutor, journal: AIRelStore<A2AJournal>, contexts: AIRelStore<{ owner: string }>, private readonly messages: AIRelStore<A2AMessageRecord>, private readonly options: A2ARuntimeOptions) {\n this.journal = safeState(journal)\n this.contexts = safeState(contexts)\n }\n\n /** 只返回当前公开 Agent Card;任务权威状态完全由共享 journal 负责。 */\n async getAgentCard(): Promise<AgentCard> {\n return this.card\n }\n\n /** 未配置扩展卡时保留 SDK 的标准协议错误。 */\n async getAuthenticatedExtendedAgentCard(): Promise<never> {\n throw A2AError.authenticatedExtendedCardNotConfigured()\n }\n\n /** 未声明推送能力,拒绝通过 SDK 的其它存储路径读写任务。 */\n async setTaskPushNotificationConfig(): Promise<never> {\n throw A2AError.pushNotificationNotSupported()\n }\n\n /** 未声明推送能力,保留标准 unsupported 错误。 */\n async getTaskPushNotificationConfig(): Promise<never> {\n throw A2AError.pushNotificationNotSupported()\n }\n\n /** 未声明推送能力,保留标准 unsupported 错误。 */\n async listTaskPushNotificationConfigs(): Promise<never> {\n throw A2AError.pushNotificationNotSupported()\n }\n\n /** 未声明推送能力,保留标准 unsupported 错误。 */\n async deleteTaskPushNotificationConfig(): Promise<never> {\n throw A2AError.pushNotificationNotSupported()\n }\n\n /**\n * 消息持久化必须被执行流程等待;稳定键使同一执行的写入不产生重复日志。\n * 此日志不是 journal 的发布回执:之后 CAS 失租时,仍须以 Task 的未知效果标记核对业务。\n */\n private async saveMessage(request: RequestContext, executionId: string, message: Message): Promise<void> {\n try {\n const callerId = request.context?.user?.isAuthenticated ? request.context.user.userName : undefined\n const record: A2AMessageRecord = {\n id: `msg_${createHash('sha256').update(JSON.stringify([request.taskId, executionId, message.role, message.messageId])).digest('hex')}`,\n taskId: request.taskId,\n contextId: request.contextId,\n role: message.role,\n parts: structuredClone(message.parts),\n createdAt: await this.journal.currentTime(),\n ...(callerId ? { caller: { agentId: callerId } } : {}),\n }\n await this.messages.save(record.id, record, { objectId: callerId, status: record.role })\n }\n catch {\n logger.warn('A2A message persistence failed', { direction: message.role })\n throw A2AError.internalError(aiM('ai_a2aMessageStoreFailed'))\n }\n }\n\n /** 只读取对应调用方的共享权威状态;DB故障向上失败。 */\n private async read(id: string, owner: string): Promise<AIVersionedRecord<A2AJournal>> {\n const record = await this.journal.readVersioned(id)\n if (!record || record.data.owner !== owner)\n throw A2AError.taskNotFound(id)\n return record\n }\n\n /** CAS变更从最新状态计算,生产不依赖本机时钟,活跃执行的写入还须通过数据库截止条件。 */\n private async mutate(id: string, owner: string, operation: (value: A2AJournal) => Promise<A2AJournal> | A2AJournal, executionId?: string): Promise<A2AJournal> {\n for (let attempt = 0;\n attempt < 32;\n attempt++) {\n const current = await this.read(id, owner)\n if (executionId && (current.data.executionId !== executionId || current.data.finished || current.data.interrupted))\n throw A2AError.internalError(aiM('ai_a2aExecutionLost'))\n const next = await operation(structuredClone(current.data))\n if (next.events.length > MAX_EVENTS || Buffer.byteLength(JSON.stringify(next)) > MAX_JOURNAL_BYTES)\n throw A2AError.internalError(aiM('ai_a2aJournalLimit'))\n const version = await this.journal.compareAndSwap(id, {\n expectedVersion: current.version,\n data: next,\n scope: { objectId: owner, refId: next.task.contextId },\n ...(executionId ? { notAfter: Math.min(current.data.leasedUntil, current.data.deadline) } : {}),\n })\n if (version)\n return next\n if (executionId && await this.journal.currentTime() >= Math.min(current.data.leasedUntil, current.data.deadline))\n throw A2AError.internalError(aiM('ai_a2aLeaseExpired'))\n }\n throw A2AError.internalError(aiM('ai_a2aUpdateConflict'))\n }\n\n /** 过期在途仅标记中断,不接管业务副作用;旧执行的CAS和数据库截止均会失败。 */\n private async inspect(id: string, owner: string): Promise<A2AJournal> {\n const current = await this.read(id, owner)\n if (!current.data.finished && await this.journal.currentTime() >= Math.min(current.data.leasedUntil, current.data.deadline)) {\n return this.mutate(id, owner, async (value) => {\n if (!value.finished && await this.journal.currentTime() >= Math.min(value.leasedUntil, value.deadline)) {\n value.finished = true\n value.interrupted = true\n value.task.status = { state: 'failed', timestamp: new Date(await this.journal.currentTime()).toISOString() }\n value.task.metadata = { ...value.task.metadata, haiExecution: { interrupted: true, requiresEffectReconciliation: true } }\n value.result = value.task\n value.events.push({ kind: 'status-update', taskId: id, contextId: value.task.contextId, status: value.task.status, final: true })\n }\n return value\n })\n }\n return current.data\n }\n\n /** 外部指定的context必须先以CAS绑定身份,不能把同名上下文当不同租户共用。 */\n private async claimContext(id: string, owner: string): Promise<void> {\n const key = createHash('sha256').update(id).digest('hex')\n const current = await this.contexts.readVersioned(key)\n if (current) {\n if (current.data.owner !== owner)\n throw A2AError.invalidParams(aiM('ai_a2aContextUnavailable'))\n return\n }\n const created = await this.contexts.compareAndSwap(key, { expectedVersion: undefined, data: { owner } })\n if (!created) {\n const winner = await this.contexts.readVersioned(key)\n if (winner?.data.owner !== owner)\n throw A2AError.invalidParams(aiM('ai_a2aContextUnavailable'))\n }\n }\n\n /** 幂等消息在同一Task持久留存;需要输入的Task可由任意节点继续,终态/中断任务不能重新执行。 */\n private async begin(params: MessageSendParams, context?: ServerCallContext): Promise<{ id: string, owner: string, executionId: string }> {\n if (this.closed)\n throw A2AError.internalError(aiM('ai_a2aRuntimeClosed'))\n const message = structuredClone(params.message)\n const identifiers = [message.messageId, message.taskId, message.contextId, ...message.referenceTaskIds ?? []]\n if (message.role !== 'user' || !message.messageId || identifiers.some(value => value !== undefined && (typeof value !== 'string' || value.length === 0 || value.length > 256)) || Buffer.byteLength(JSON.stringify(message)) > 1048576)\n throw A2AError.invalidParams(aiM('ai_a2aInvalidMessage'))\n const owner = principal(context)\n const id = message.taskId ?? `task_${createHash('sha256').update(JSON.stringify([owner, message.contextId ?? '', message.messageId])).digest('hex')}`\n for (let attempt = 0;\n attempt < 32;\n attempt++) {\n const current = await this.journal.readVersioned(id)\n if (current && current.data.owner !== owner)\n throw A2AError.taskNotFound(id)\n if (message.taskId && !current)\n throw A2AError.taskNotFound(id)\n if (current?.data.receipts.some(receipt => receipt.id === message.messageId)) {\n const receipt = current.data.receipts.find(receipt => receipt.id === message.messageId)!\n if (receipt.digest !== createHash('sha256').update(JSON.stringify(message)).digest('hex'))\n throw A2AError.invalidParams(aiM('ai_a2aIdempotencyConflict'))\n if (current.data.message.messageId !== message.messageId)\n throw A2AError.invalidParams(aiM('ai_a2aTaskAdvanced'))\n return { id, owner, executionId: current.data.executionId }\n }\n // 取消器只接收 taskId;旧取消尚未确认时不可换代,避免迟到取消作用到下一轮执行。\n if (current && (!current.data.finished || current.data.cancelRequested || FINAL_STATES.has(current.data.task.status.state) || current.data.interrupted))\n throw A2AError.invalidParams(aiM('ai_a2aTaskNotAccepting'))\n if (current && current.data.receipts.length >= MAX_RECEIPTS)\n throw A2AError.invalidParams(aiM('ai_a2aReceiptLimit'))\n const contextId = current?.data.task.contextId ?? message.contextId ?? randomUUID()\n if (message.contextId && message.contextId !== contextId)\n throw A2AError.invalidParams(aiM('ai_a2aContextMismatch'))\n await this.claimContext(contextId, owner)\n const referenceTasks: Task[] = []\n if ((message.referenceTaskIds?.length ?? 0) > 32)\n throw A2AError.invalidParams(aiM('ai_a2aReferenceLimit'))\n for (const reference of message.referenceTaskIds ?? []) referenceTasks.push((await this.read(reference, owner)).data.task)\n const now = await this.journal.currentTime()\n const task: Task = current ? structuredClone(current.data.task) : { kind: 'task', id, contextId, status: { state: 'submitted' }, history: [] }\n task.status = { state: 'submitted', timestamp: new Date(now).toISOString() }\n task.history = [...task.history ?? [], message]\n const executionId = randomUUID()\n const next: A2AJournal = { owner, executionId, leasedUntil: now + this.options.leaseMs, deadline: now + this.options.maxExecutionMs, task, events: [], receipts: [...current?.data.receipts ?? [], { id: message.messageId, digest: createHash('sha256').update(JSON.stringify(message)).digest('hex') }], message, finished: false, cancelRequested: false, interrupted: false }\n if (Buffer.byteLength(JSON.stringify(next)) > MAX_JOURNAL_BYTES)\n throw A2AError.invalidParams(aiM('ai_a2aJournalLimit'))\n const created = await this.journal.compareAndSwap(id, { expectedVersion: current?.version, data: next, scope: { objectId: owner, refId: contextId }, notAfter: Math.min(next.leasedUntil, next.deadline) })\n if (!created)\n continue\n const request = new RequestContext(message, id, contextId, current?.data.task, referenceTasks, context)\n const controller = new AbortController()\n const done = this.execute(request, next, controller).finally(() => this.executions.delete(executionId))\n this.executions.set(executionId, { controller, done })\n // 执行失败由共享journal记录,不能留下未处理rejection或将原始业务异常发送给用户。\n void done.catch(() => undefined)\n return { id, owner, executionId }\n }\n throw A2AError.internalError(aiM('ai_a2aUpdateConflict'))\n }\n\n /** 用SDK计算artifact/status合并,临时TaskStore仅参与纯内存计算,最后与事件一起单CAS发布。 */\n private async publish(id: string, owner: string, executionId: string, event: AgentExecutionEvent): Promise<void> {\n if ((event.kind === 'task' ? event.id : event.taskId) && (event.kind === 'task' ? event.id : event.taskId) !== id)\n throw A2AError.invalidParams(aiM('ai_a2aEventTaskMismatch'))\n await this.mutate(id, owner, async (value) => {\n let task = structuredClone(value.task)\n const manager = new ResultManager({ load: async () => task, save: async (next) => {\n task = structuredClone(next)\n } })\n manager.setContext(value.message)\n await manager.processEvent(structuredClone(event))\n value.task = manager.getCurrentTask() ?? task\n const result = manager.getFinalResult()\n if (result?.kind === 'message') {\n value.result = result\n value.task.status = { state: 'completed' }\n }\n else {\n value.result = value.task\n }\n value.events.push(event)\n return value\n }, executionId)\n }\n\n /** 发布队列有界;finished不会早于尚未持久化的事件,跨节点取消由执行owner调用真实取消器。 */\n private async execute(request: RequestContext, initial: A2AJournal, controller: AbortController): Promise<void> {\n const signal = controller.signal\n let queue = Promise.resolve()\n let pending = 0\n let failed = false\n let producerFinished = false\n const local = new DefaultExecutionEventBus()\n const enqueue = (event: AgentExecutionEvent) => {\n if (signal.aborted || producerFinished || failed)\n throw A2AError.internalError(aiM('ai_a2aExecutionNotWritable'))\n if (++pending > MAX_EVENTS)\n throw A2AError.internalError(aiM('ai_a2aOutputLimit'))\n const copy = structuredClone(event)\n if (copy.kind === 'message' || (copy.kind === 'status-update' && copy.final))\n producerFinished = true\n queue = queue.then(async () => {\n // 任一事件失败后,已排队事件也不得继续持久化或通知,避免发布虚假的 completed。\n if (failed)\n return\n // 复用已有有界发布队列;日志失败后不发布该消息,也不发布后续虚假的完成事件。\n if (copy.kind === 'message' && copy.role === 'agent')\n await this.saveMessage(request, initial.executionId, copy)\n await this.publish(initial.task.id, initial.owner, initial.executionId, copy)\n pending--\n local.publish(copy)\n }).catch(() => { failed = true })\n }\n const bus: ExecutionEventBus = {\n publish: enqueue,\n finished: () => { producerFinished = true },\n on(name, fn) {\n local.on(name, fn)\n return this\n },\n off(name, fn) {\n local.off(name, fn)\n return this\n },\n once(name, fn) {\n local.once(name, fn)\n return this\n },\n removeAllListeners(name) {\n local.removeAllListeners(name)\n return this\n },\n }\n let cancelled = false\n let executorStarted = false\n const heartbeat = (async () => {\n while (!signal.aborted) {\n try {\n await delay(Math.max(50, Math.floor(this.options.leaseMs / 3)), undefined, { signal })\n const renewed = await this.mutate(initial.task.id, initial.owner, async (value) => {\n value.leasedUntil = await this.journal.currentTime() + this.options.leaseMs\n return value\n }, initial.executionId)\n if (renewed.cancelRequested && !cancelled && executorStarted) {\n cancelled = true\n await this.executor.cancelTask(initial.task.id, bus)\n }\n }\n catch {\n if (!signal.aborted)\n failed = true\n break\n }\n }\n })()\n try {\n // 领取响应本身也可能延迟;按共享时钟拒绝已知过期或关闭后才恢复的业务入口。\n await this.saveMessage(request, initial.executionId, request.userMessage)\n // 日志写入也可能暂停跨过租约/期限;业务入口必须重新核验共享代际和存储时钟。\n const current = await this.read(initial.task.id, initial.owner)\n const now = await this.journal.currentTime()\n if (this.closed || signal.aborted || failed || current.data.executionId !== initial.executionId || current.data.finished || current.data.interrupted\n || now >= Math.min(current.data.leasedUntil, current.data.deadline)) {\n throw A2AError.internalError(aiM('ai_a2aExecutionInterrupted'))\n }\n if (current.data.cancelRequested) {\n // 等待入站持久化时尚未进入业务,owner 可确认取消而不调用未启动执行器的取消副作用。\n await this.mutate(initial.task.id, initial.owner, (value) => {\n value.task.status = { state: 'canceled' }\n value.finished = true\n value.result = value.task\n value.events.push({ kind: 'status-update', taskId: value.task.id, contextId: value.task.contextId, status: value.task.status, final: true })\n return value\n }, initial.executionId)\n return\n }\n executorStarted = true\n await this.executor.execute(request, bus)\n await queue\n if (failed || signal.aborted)\n throw A2AError.internalError(aiM('ai_a2aExecutionInterrupted'))\n await this.mutate(initial.task.id, initial.owner, (value) => {\n if (!value.result || value.task.status.state === 'submitted' || value.task.status.state === 'working') {\n value.task.status = { state: 'failed' }\n value.interrupted = true\n }\n value.finished = true\n if (value.interrupted)\n value.task.metadata = { ...value.task.metadata, haiExecution: { interrupted: true, requiresEffectReconciliation: true } }\n value.result = value.result?.kind === 'message' && !value.interrupted ? value.result : value.task\n return value\n }, initial.executionId)\n }\n catch {\n try {\n await this.mutate(initial.task.id, initial.owner, (value) => {\n value.task.status = { state: 'failed' }\n value.finished = true\n value.interrupted = true\n value.task.metadata = { ...value.task.metadata, haiExecution: { interrupted: true, requiresEffectReconciliation: true } }\n value.result = value.task\n return value\n }, initial.executionId)\n }\n catch { /* DB故障或租约丢失不覆盖未知状态;后续inspect按持久期限标记中断。 */ }\n }\n finally {\n controller.abort()\n // 延时器最多等待一个续租周期;执行完成后不再续租。\n await heartbeat.catch(() => undefined)\n local.finished()\n }\n }\n\n async sendMessage(params: MessageSendParams, context?: ServerCallContext): Promise<Message | Task> {\n const run = await this.begin(params, context)\n if (params.configuration?.blocking === false)\n return structuredClone((await this.inspect(run.id, run.owner)).task)\n for await (const _event of this.watch(run.id, run.owner)) { /* 共享journal完成后返回最终权威结果。 */ }\n const final = await this.inspect(run.id, run.owner)\n return structuredClone(final.result ?? final.task)\n }\n\n async* sendMessageStream(params: MessageSendParams, context?: ServerCallContext): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n const run = await this.begin(params, context)\n yield structuredClone((await this.inspect(run.id, run.owner)).task)\n yield* this.watch(run.id, run.owner)\n }\n\n /** 每个订阅有独立游标,无本地bus依赖;取消订阅不会谎称业务执行已取消。 */\n private async* watch(id: string, owner: string): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n let cursor = 0\n let executionId: string | undefined\n while (!this.closed) {\n const value = await this.inspect(id, owner)\n if (executionId && executionId !== value.executionId)\n throw A2AError.internalError(aiM('ai_a2aSubscriptionAdvanced'))\n executionId = value.executionId\n while (cursor < value.events.length) yield structuredClone(value.events[cursor++]!)\n if (value.finished) {\n // 执行器抛错或事件写失败可能没有最终事件;从同一权威快照明确交付失败Task,不能静默结束working流。\n if (value.interrupted)\n yield structuredClone(value.task)\n return\n }\n await delay(this.options.pollIntervalMs)\n }\n throw A2AError.internalError(aiM('ai_a2aRuntimeClosed'))\n }\n\n async getTask(params: TaskQueryParams, context?: ServerCallContext): Promise<Task> {\n const task = structuredClone((await this.inspect(params.id, principal(context))).task)\n task.history = params.historyLength && params.historyLength > 0 ? task.history?.slice(-params.historyLength) : []\n return task\n }\n\n async cancelTask(params: TaskIdParams, context?: ServerCallContext): Promise<Task> {\n const owner = principal(context)\n const current = await this.inspect(params.id, owner)\n if (FINAL_STATES.has(current.task.status.state))\n throw A2AError.taskNotCancelable(params.id)\n await this.mutate(params.id, owner, (value) => {\n if (FINAL_STATES.has(value.task.status.state))\n throw A2AError.taskNotCancelable(params.id)\n value.cancelRequested = true\n if (value.finished) {\n value.task.status = { state: 'canceled' }\n value.result = value.task\n }\n return value\n })\n for await (const _event of this.watch(params.id, owner)) { /* 只等待owner确认,不在当前节点伪造canceled。 */ }\n return (await this.inspect(params.id, owner)).task\n }\n\n async* resubscribe(params: TaskIdParams, context?: ServerCallContext): AsyncGenerator<Exclude<AgentExecutionEvent, Message>, void, undefined> {\n const owner = principal(context)\n yield structuredClone((await this.inspect(params.id, owner)).task)\n for await (const event of this.watch(params.id, owner)) {\n if (event.kind !== 'message')\n yield event\n }\n }\n\n /** 模块关闭取消本机执行并等待一个租约周期;未退出的业务仍被持久代际约束。 */\n async close(): Promise<void> {\n this.closed = true\n for (const execution of this.executions.values()) execution.controller.abort()\n const deadline = new AbortController()\n try {\n await Promise.race([Promise.allSettled([...this.executions.values()].map(item => item.done)), delay(this.options.leaseMs, undefined, { signal: deadline.signal })])\n }\n finally { deadline.abort() }\n }\n}\n","/**\n * @h-ai/ai — A2A 子功能组装\n *\n * 实现 A2A 操作接口:共享 journal 任务状态、消息日志、远端调用。\n * 包含延迟初始化代理工厂(`createA2ALazyProxy`)和完整操作实例工厂(`createA2AOperations`)。\n * @module ai-a2a-functions\n */\n\nimport type { Message, Task } from '@a2a-js/sdk'\nimport type { AgentExecutor } from '@a2a-js/sdk/server'\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { A2AConfig } from '../ai-config.js'\nimport type { AIRelStore, AIStoreProvider } from '../store/ai-store-types.js'\n\nimport type { A2AJournal, A2ARuntimeOptions } from './ai-a2a-runtime.js'\nimport type {\n A2AAgentCardConfig,\n A2ACallOptions,\n A2ACallResult,\n A2AHandleResult,\n A2AMessageRecord,\n A2AOperations,\n A2ATaskFilter,\n} from './ai-a2a-types.js'\n\nimport { A2AClient } from '@a2a-js/sdk/client'\nimport { 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-card.js'\nimport { SharedA2ARequestHandler } from './ai-a2a-runtime.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'a2a' })\nconst DEFAULT_A2A_CALL_TIMEOUT_MS = 60_000\n\n/**\n * 校验通过的真实远端地址与去除查询和片段后的诊断标签。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const validated = validateRemoteUrl('https://trusted-agent.example.com/a2a?route=docs')\n * const request: ValidatedRemoteUrl = validated\n * const safeLabel = request.safeLabel // 日志不记录 query/hash。\n * ```\n */\ninterface ValidatedRemoteUrl {\n requestUrl: string\n safeLabel: string\n}\n\n/**\n * 校验远端 Agent URL 的基础边界。\n *\n * A2A 目标通常来自服务端配置;这里拒绝非 HTTP(S) 协议和 URL 内嵌凭据,\n * 并生成不含 query/hash 的安全标签用于错误与持久化记录。部署侧仍应对可访问 origin\n * 使用白名单,因为 DNS 解析与重定向策略属于应用网络边界。\n */\nfunction validateRemoteUrl(remoteUrl: string): ValidatedRemoteUrl {\n const parsed = new URL(remoteUrl)\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')\n throw new Error('A2A remote URL must use HTTP or HTTPS')\n if (parsed.username || parsed.password)\n throw new Error('A2A remote URL must not contain credentials')\n\n return {\n requestUrl: parsed.toString(),\n safeLabel: `${parsed.origin}${parsed.pathname}`,\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' ? value as Record<string, unknown> : undefined\n}\n\nfunction isTaskResult(value: unknown): value is Task {\n return asRecord(value)?.status !== undefined\n}\n\nfunction isMessageResult(value: unknown): value is Message {\n return Array.isArray(asRecord(value)?.parts)\n}\n\nfunction getPartText(part: unknown): string | undefined {\n const record = asRecord(part)\n return typeof record?.text === 'string' ? record.text : undefined\n}\n\nfunction getTextParts(parts: readonly unknown[] | undefined): string[] {\n return parts?.map(getPartText).filter((text): text is string => text != null) ?? []\n}\n\nasync function executeRemoteAgentCall(\n remoteUrl: string,\n message: string,\n options?: A2ACallOptions,\n): Promise<HaiResult<A2ACallResult>> {\n let safeLabel = '(invalid or unavailable URL)'\n try {\n const validatedUrl = validateRemoteUrl(remoteUrl)\n const requestUrl = validatedUrl.requestUrl\n safeLabel = validatedUrl.safeLabel\n const customHeaders = options?.headers\n const timeoutMs = Math.max(1, options?.timeout ?? DEFAULT_A2A_CALL_TIMEOUT_MS)\n const client = new A2AClient(requestUrl, {\n fetchImpl: ((input: RequestInfo | URL, init?: RequestInit) => {\n const existingHeaders = init?.headers\n ? Object.fromEntries(new Headers(init.headers as HeadersInit).entries())\n : {}\n const signals = [init?.signal, AbortSignal.timeout(timeoutMs)].filter((signal): signal is AbortSignal => Boolean(signal))\n const fetchInit: RequestInit = {\n ...init,\n headers: { ...existingHeaders, ...customHeaders },\n signal: signals.length > 1 ? AbortSignal.any(signals) : signals[0],\n }\n return globalThis.fetch(input, fetchInit)\n }) as typeof fetch,\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 if ('error' in response) {\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: safeLabel, error: 'Remote agent returned an error' } }))\n }\n\n const responseData = response.result\n let result: A2ACallResult\n if (isTaskResult(responseData)) {\n const textParts = responseData.artifacts?.flatMap(artifact => getTextParts(artifact.parts)) ?? []\n result = {\n taskId: responseData.id,\n taskState: responseData.status?.state,\n responseText: textParts.join('\\n') || undefined,\n responseParts: responseData.artifacts?.flatMap(artifact => artifact.parts ?? []),\n }\n }\n else if (isMessageResult(responseData)) {\n const textParts = getTextParts(responseData.parts)\n result = {\n responseText: textParts.join('\\n') || undefined,\n responseParts: responseData.parts,\n }\n }\n else {\n result = {}\n }\n\n return ok(result)\n }\n catch (error) {\n const errorName = error instanceof Error ? error.name : 'UnknownError'\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: safeLabel, error: errorName } }))\n }\n}\n\n// ─── 工厂函数 ───\n\n/**\n * A2A 子功能组装依赖\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function bind(provider: AIStoreProvider): A2ADeps {\n * // 必须在 provider.initialize() 前登记表,延迟注册 executor 不再创建遗漏的表。\n * return createA2AStores(provider)\n * }\n * ```\n */\nexport interface A2ADeps {\n /** Task和事件同文档CAS权威状态。 */\n journalStore: AIRelStore<A2AJournal>\n /** context身份归属持久CAS登记。 */\n contextStore: AIRelStore<{ owner: string }>\n /** 初始化阶段已创建的消息存储 */\n messageStore: AIRelStore<A2AMessageRecord>\n}\n\n/**\n * 在 StoreProvider.initialize 前创建 A2A 表,避免延迟注册 executor 时漏建表。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function prepare(provider: AIStoreProvider) {\n * const stores = createA2AStores(provider)\n * await provider.initialize()\n * return stores\n * }\n * ```\n */\nexport function createA2AStores(storeProvider: AIStoreProvider): A2ADeps {\n return {\n journalStore: storeProvider.createRelStore<A2AJournal>('hai_ai_a2a_journal', { hasObjectId: true, hasRefId: true }),\n contextStore: storeProvider.createRelStore<{ owner: string }>('hai_ai_a2a_contexts'),\n messageStore: storeProvider.createRelStore<A2AMessageRecord>('hai_ai_a2a_messages', { hasObjectId: true, hasStatus: true }),\n }\n}\n\n/**\n * A2A 子功能配置\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function options(executor: AgentExecutor): A2ACreateOptions {\n * return { executor, agentCard: { name: 'guide', url: 'https://example.com/a2a' }, runtime: { leaseMs: 30_000, pollIntervalMs: 250, maxExecutionMs: 300_000 } }\n * }\n * ```\n */\nexport interface A2ACreateOptions {\n /** Agent Card 配置 */\n agentCard: A2AAgentCardConfig\n /** Agent 执行器(由应用层实现) */\n executor: AgentExecutor\n /** 内部可注入的执行预算;公开默认30秒租约、250毫秒轮询、5分钟执行期限。 */\n runtime?: Partial<A2ARuntimeOptions>\n}\n\n/**\n * AI生命周期内部持有的实现;关闭先停止A2A执行再关闭共享Store。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function stop(implementation: A2AImplementation) {\n * await implementation.close() // 等待本地执行停止后,应用才能关闭借用的共享 Store。\n * }\n * ```\n */\nexport interface A2AImplementation extends A2AOperations {\n close: () => Promise<void>\n}\n\n/**\n * 创建 A2A 操作接口实例\n *\n * 组装共享 journal 的 RequestHandler、消息日志、远端调用等能力。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function run(options: A2ACreateOptions, deps: A2ADeps) {\n * const operations = createA2AOperations(options, deps)\n * try {\n * const result = await operations.listMessages({ callerId: 'agent-1', limit: 20 })\n * if (!result.success) return result\n * return result.data\n * }\n * finally { await operations.close() }\n * }\n * ```\n */\nexport function createA2AOperations(\n options: A2ACreateOptions,\n deps: A2ADeps,\n): A2AImplementation {\n const { messageStore, journalStore, contextStore } = deps\n const agentCardConfig = options.agentCard\n\n // 构建 SDK 层\n const agentCard = buildAgentCard(agentCardConfig)\n const requestHandler = new SharedA2ARequestHandler(agentCard, options.executor, journalStore, contextStore, messageStore, { leaseMs: 30000, pollIntervalMs: 250, maxExecutionMs: 300000, ...options.runtime })\n const transportHandler = new JsonRpcTransportHandler(requestHandler)\n\n return {\n close: () => requestHandler.close(),\n registerExecutor() {\n logger.warn('A2A executor already registered, ignoring duplicate registerExecutor call')\n return ok(undefined)\n },\n\n getAgentCard() {\n return ok(buildAgentCard(agentCardConfig))\n },\n\n async handleRequest(requestBody: unknown, context?: Record<string, unknown>): Promise<A2AHandleResult> {\n // 身份只能来自可信传输层认证结果,不能从 JSON-RPC 参数中读取。\n const agentId = typeof context?.agentId === 'string' ? context.agentId : undefined\n const serverContext = new ServerCallContextImpl(undefined, agentId\n ? { isAuthenticated: true, userName: agentId }\n : undefined)\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.callerId,\n status: filter.status,\n where: {\n ...(filter.contextId === undefined ? {} : { contextId: filter.contextId }),\n ...(filter.since === undefined ? {} : { createdAt: { $gte: filter.since } }),\n },\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 {\n return err(HaiAIError.A2A_LIST_MESSAGES_FAILED, aiM('ai_a2aListMessagesFailed'))\n }\n },\n\n async callRemoteAgent(remoteUrl: string, message: string, options?: A2ACallOptions) {\n return executeRemoteAgentCall(remoteUrl, message, options)\n },\n }\n}\n\n// ─── 延迟初始化代理 ───\n\n/**\n * 延迟代理的外部依赖(由 ai-main 注入状态访问器)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function initialized(deps: A2ALazyProxyDeps) {\n * return deps.isInitialized() && deps.getA2AConfig() !== null && deps.getStores() !== null\n * }\n * ```\n */\nexport interface A2ALazyProxyDeps {\n /** 是否已初始化(即 currentConfig !== null) */\n isInitialized: () => boolean\n /** 获取 A2A 配置(config.a2a) */\n getA2AConfig: () => A2AConfig | null\n /** 获取当前 A2A 实现(registerExecutor 后才有值) */\n getA2AImpl: () => A2AImplementation | null\n /** 保存 A2A 实现引用 */\n setA2AImpl: (impl: A2AImplementation) => void\n /** 获取初始化阶段已建表的 A2A 存储 */\n getStores: () => A2ADeps | null\n /** 未初始化错误工厂 */\n notInitializedResult: <T>() => HaiResult<T>\n}\n\n/**\n * 创建 A2A 延迟初始化代理\n *\n * `callRemoteAgent()` 是独立客户端能力,只需 `ai.init()`;`getAgentCard()` 可直接读取配置。\n * 只有服务端请求处理与消息查询依赖 `registerExecutor()`。\n *\n * @param deps - 由 ai-main 注入的状态访问器\n * @returns A2AOperations 代理对象\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function card(deps: A2ALazyProxyDeps) {\n * const operations = createA2ALazyProxy(deps)\n * const result = operations.getAgentCard()\n * if (!result.success) return result\n * return result.data\n * }\n * ```\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 return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_a2aExecutorAlreadyRegistered'))\n }\n const stores = deps.getStores()\n if (!stores) {\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, runtime: a2aConfig.execution },\n stores,\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(buildAgentCard({ ...a2aConfig.agentCard, security: a2aConfig.security }))\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 const id = asRecord(requestBody)?.id\n return {\n streaming: false,\n body: {\n jsonrpc: '2.0',\n id: typeof id === 'string' || typeof id === 'number' ? id : null,\n error: {\n code: -32603,\n message: aiM(deps.isInitialized() ? 'ai_a2aNotConfigured' : 'ai_notInitialized'),\n },\n },\n }\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 executeRemoteAgentCall(remoteUrl, message, options)\n },\n }\n}\n","/**\n * @h-ai/ai — Audio Provider 内部接口与共享传输辅助\n *\n * 定义 audio 子系统内部的协议适配接口 `AudioProvider`,以及各 Provider 复用的\n * Node WebSocket 连接、Base64、取消等底层辅助。这些类型与函数是 audio 子系统内部实现,\n * 不从 `@h-ai/ai` 根入口导出,也不作为模块消费者需要了解的概念。\n * @internal\n * @module audio/providers/ai-audio-provider\n */\n\nimport type { HaiError, HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type { ResolvedAudioModel } from '../../ai-config.js'\nimport type {\n AudioContent,\n AudioFormat,\n AudioInputStream,\n AudioModelCapabilities,\n AudioReference,\n SynthesisResult,\n TranscriptionEvent,\n TranscriptionResult,\n TranscriptionTimestampGranularity,\n} from '../ai-audio-types.js'\n\nimport { Buffer } from 'node:buffer'\nimport { core } from '@h-ai/core'\nimport WebSocket from 'ws'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\n\n// ─── Provider 请求类型(已解析模型 + 公共请求字段) ───\n\n/**\n * Provider 层完整识别请求\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function request(model: ResolvedAudioModel, audio: AudioContent): ProviderTranscriptionRequest {\n * return { model, audio, language: 'zh', timestampGranularities: ['word'] }\n * }\n * ```\n */\nexport interface ProviderTranscriptionRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整音频 */\n audio: AudioContent\n /** 语言提示 */\n language?: string\n /** 领域提示词 / 热词 */\n contextHints?: string[]\n /** 请求返回的时间戳粒度 */\n timestampGranularities?: TranscriptionTimestampGranularity[]\n /** 是否启用服务端 VAD */\n vad?: boolean\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/**\n * Provider 层流式识别请求\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function request(model: ResolvedAudioModel, audio: AudioInputStream): ProviderTranscriptionStreamRequest {\n * return { model, audio, language: 'zh', vad: true }\n * }\n * ```\n */\nexport interface ProviderTranscriptionStreamRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整音频或持续音频输入流 */\n audio: AudioContent | AudioInputStream\n /** 语言提示 */\n language?: string\n /** 领域提示词 / 热词 */\n contextHints?: string[]\n /** 请求返回的时间戳粒度 */\n timestampGranularities?: TranscriptionTimestampGranularity[]\n /** 是否启用服务端 VAD */\n vad?: boolean\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/**\n * Provider 层完整合成请求\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function request(model: ResolvedAudioModel): ProviderSynthesisRequest {\n * return { model, text: '欢迎使用', format: 'mp3' }\n * }\n * ```\n */\nexport interface ProviderSynthesisRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 待合成文本 */\n text: string\n /** 目标语言 */\n language?: string\n /** 音色 */\n voice?: string\n /** 说话人 / 音色参考 */\n speakerReference?: AudioReference\n /** 风格 / 情绪参考 */\n styleReference?: AudioReference\n /** 风格参考强度 `[0, 1]` */\n styleStrength?: number\n /** 自然语言风格指令 */\n instruction?: string\n /** 语速倍数 */\n speed?: number\n /** 目标时长(毫秒) */\n targetDurationMs?: number\n /** 目标时长容差(毫秒) */\n durationToleranceMs?: number\n /** 输出格式 */\n format?: AudioFormat\n /** 输出采样率 */\n sampleRate?: number\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/**\n * Provider 层流式合成请求\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function request(model: ResolvedAudioModel, text: AsyncIterable<string>): ProviderSynthesisStreamRequest {\n * return { model, text, format: 'pcm16', sampleRate: 24000 }\n * }\n * ```\n */\nexport interface ProviderSynthesisStreamRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整文本或持续文本流 */\n text: string | AsyncIterable<string>\n /** 目标语言 */\n language?: string\n /** 音色 */\n voice?: string\n /** 说话人 / 音色参考 */\n speakerReference?: AudioReference\n /** 风格 / 情绪参考 */\n styleReference?: AudioReference\n /** 风格参考强度 `[0, 1]` */\n styleStrength?: number\n /** 自然语言风格指令 */\n instruction?: string\n /** 语速倍数 */\n speed?: number\n /** 输出格式 */\n format?: AudioFormat\n /** 输出采样率 */\n sampleRate?: number\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/**\n * Provider 解析后的最终输出音频元数据\n *\n * 不同平台对未指定格式时的默认值不同(如 OpenAI 默认 mp3、Qwen/Doubao/MiMo 默认 pcm16),\n * 由各 Provider 依据自身规则解析,供流式合成在 `segment_started` 标注真实格式,\n * 避免调用方根据请求参数猜测导致解码 / 播放参数错误。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const output: SynthesisOutputMeta = { format: 'pcm16', sampleRate: 24000, channels: 1 }\n * const bytesPerSecond = (output.sampleRate ?? 0) * output.channels * 2\n * ```\n */\nexport interface SynthesisOutputMeta {\n /** 最终输出音频格式 */\n format: AudioFormat\n /** 采样率(Hz);pcm16 等裸音频必填,wav / mp3 等自描述格式为 undefined */\n sampleRate?: number\n /** 声道数 */\n channels: 1 | 2\n}\n\n/**\n * Provider ASR 子能力\n *\n * 仅具备语音识别能力的平台(如 Whisper)只实现本接口。`transcribeStream` 可选:\n * 未实现时由 Framework 做有限降级(完整音频→完整识别后产出最终结果;持续音频输入→拒绝)。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function recognize(provider: AudioTranscriptionProvider, request: ProviderTranscriptionRequest) {\n * const result = await provider.transcribe(request)\n * if (!result.success) return result\n * return result.data.text\n * }\n * ```\n */\nexport interface AudioTranscriptionProvider {\n /** 完整语音识别 */\n transcribe: (request: ProviderTranscriptionRequest) => Promise<HaiResult<TranscriptionResult>>\n /** 原生流式语音识别(未实现时由 Framework 降级) */\n transcribeStream?: (request: ProviderTranscriptionStreamRequest) => AsyncIterable<TranscriptionEvent>\n}\n\n/**\n * Provider TTS 子能力\n *\n * 仅具备语音合成能力的平台(如 IndexTTS)只实现本接口。`synthesizeStream` 可选:\n * 未实现时由 Framework 做有限降级(每段文本完整合成后按段产出音频)。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function synthesize(provider: AudioSynthesisProvider, request: ProviderSynthesisRequest) {\n * const output = provider.resolveSynthesisOutput(request)\n * const result = await provider.synthesize(request)\n * if (!result.success) return result\n * return { output, audio: result.data }\n * }\n * ```\n */\nexport interface AudioSynthesisProvider {\n /** 完整语音合成 */\n synthesize: (request: ProviderSynthesisRequest) => Promise<HaiResult<SynthesisResult>>\n /** 原生流式语音合成(未实现时由 Framework 降级) */\n synthesizeStream?: (request: ProviderSynthesisStreamRequest) => AsyncIterable<Uint8Array>\n /**\n * 解析该次合成请求的最终输出音频元数据(格式 / 采样率 / 声道)\n *\n * 与 `synthesizeStream` 采用一致的默认规则,供上层在 `segment_started` 标注真实格式。\n */\n resolveSynthesisOutput: (request: { format?: AudioFormat, sampleRate?: number }) => SynthesisOutputMeta\n}\n\n/**\n * Audio Provider 内部接口\n *\n * 每个平台一个实现,负责厂商协议适配、连接、响应解析与错误映射。Provider 只描述「如何调用某种协议」,\n * 不描述服务部署在哪里。使用工厂函数 + 闭包实现,不使用抽象基类。ASR / TTS 子能力按平台按需提供,\n * 不需要为不支持的操作实现空占位。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function requiresRealtime(provider: AudioProvider, model: ResolvedAudioModel) {\n * const capabilities = provider.getCapabilities(model)\n * return Boolean(provider.transcription?.transcribeStream && capabilities.transcribe?.realtimeAudioInput)\n * }\n * ```\n */\nexport interface AudioProvider {\n /** 可选 ASR 子能力 */\n transcription?: AudioTranscriptionProvider\n /** 可选 TTS 子能力 */\n synthesis?: AudioSynthesisProvider\n /**\n * 获取指定模型的能力声明\n *\n * 同一个 Provider 下的不同模型可以返回不同 Capability。\n */\n getCapabilities: (model: ResolvedAudioModel) => AudioModelCapabilities\n}\n\n/** 句子结束边界(中英标点 + 换行) */\nconst SENTENCE_BOUNDARY_REGEX = /[。!?;!?;\\n]|\\.(?=\\s|$)/\n\n/**\n * 将持续到达的文本流按句子边界切分,边到达边产出完整短句。\n *\n * 供不原生支持增量文本输入的 TTS 平台(OpenAI / MiMo)使用:以句子级分段逐句发起合成,\n * 实现近似实时的首音低延迟,而非等待整段文本生成完毕(消除“虚假增量”语义)。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function* fragments() { yield '你好,'; yield '欢迎使用。下一句'; yield '结束。' }\n * const sentences: string[] = []\n * for await (const sentence of streamSentences(fragments())) sentences.push(sentence)\n * ```\n */\nexport async function* streamSentences(stream: AsyncIterable<string>): AsyncIterable<string> {\n let buffer = ''\n for await (const part of stream) {\n buffer += part\n let match = SENTENCE_BOUNDARY_REGEX.exec(buffer)\n while (match !== null) {\n const end = match.index + match[0].length\n const sentence = buffer.slice(0, end).trim()\n buffer = buffer.slice(end)\n if (sentence)\n yield sentence\n match = SENTENCE_BOUNDARY_REGEX.exec(buffer)\n }\n }\n const rest = buffer.trim()\n if (rest)\n yield rest\n}\n\n// ─── Base64 辅助 ───\n\n/**\n * 将二进制数据编码为 Base64 字符串\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const encoded = toBase64(new Uint8Array([0, 1, 255]))\n * const original = fromBase64(encoded)\n * ```\n */\nexport function toBase64(data: Uint8Array): string {\n return Buffer.from(data).toString('base64')\n}\n\n/**\n * 将 Base64 字符串解码为二进制数据\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const bytes = fromBase64('AAH/')\n * const restored = toBase64(bytes)\n * ```\n */\nexport function fromBase64(base64: string): Uint8Array {\n return new Uint8Array(Buffer.from(base64, 'base64'))\n}\n\n/**\n * 顺序拼接多个二进制分片\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const data = concatChunks([new Uint8Array([1, 2]), new Uint8Array([3])])\n * const byteLength = data.byteLength\n * ```\n */\nexport function concatChunks(chunks: Uint8Array[]): Uint8Array {\n return new Uint8Array(Buffer.concat(chunks.map(c => Buffer.from(c))))\n}\n\n// ─── 音频上传辅助 ───\n\n/** 音频格式 → 上传文件扩展名(文件型服务依据扩展名识别容器) */\nconst AUDIO_UPLOAD_EXT: Record<AudioFormat, string> = { pcm16: 'wav', wav: 'wav', mp3: 'mp3', opus: 'ogg' }\n\n/** 音频格式 → MIME 类型 */\nconst AUDIO_UPLOAD_MIME: Record<AudioFormat, string> = { pcm16: 'audio/wav', wav: 'audio/wav', mp3: 'audio/mpeg', opus: 'audio/opus' }\n\n/**\n * 可上传的音频分片(真实字节 + 与内容一致的文件名 / MIME)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const part: AudioUploadPart = toAudioUploadPart({ data: new Uint8Array(320), format: 'pcm16', sampleRate: 16000 })\n * const form = new FormData()\n * form.append('file', toAudioBlob(part), part.filename)\n * ```\n */\nexport interface AudioUploadPart {\n /** 上传字节(裸 pcm16 已封装为 WAV) */\n data: Uint8Array\n /** 与真实内容一致的文件名(扩展名不伪装) */\n filename: string\n /** 与真实内容一致的 MIME 类型 */\n mimeType: string\n}\n\n/**\n * 将音频内容标准化为可上传的字节 + 文件名 + MIME\n *\n * 裸 `pcm16` 没有容器头,文件型 Model Service 无法从字节推断采样率 / 声道,故先封装为 WAV;\n * 其余格式按真实内容生成扩展名与 MIME,避免「扩展名是 WAV、内容是 MP3」导致模型加载异常。\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const part = toAudioUploadPart({ data: new Uint8Array(320), format: 'pcm16', sampleRate: 16000, channels: 1 }, 'reference')\n * const form = new FormData()\n * form.append('file', toAudioBlob(part), part.filename)\n * ```\n */\nexport function toAudioUploadPart(audio: AudioContent, baseName = 'audio'): AudioUploadPart {\n if (audio.format === 'pcm16') {\n const wav = wrapPcm16ToWav(audio.data, audio.sampleRate ?? 16000, audio.channels ?? 1)\n return { data: wav, filename: `${baseName}.wav`, mimeType: 'audio/wav' }\n }\n return { data: audio.data, filename: `${baseName}.${AUDIO_UPLOAD_EXT[audio.format]}`, mimeType: AUDIO_UPLOAD_MIME[audio.format] }\n}\n\n/**\n * 将上传分片构造为 multipart Blob\n *\n * 复制为 ArrayBuffer 承载的字节,满足全局 `Blob` / `FormData` 的 `BlobPart` 类型约束。\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const part = toAudioUploadPart({ data: new Uint8Array(320), format: 'pcm16', sampleRate: 16000 })\n * const file = toAudioBlob(part)\n * const mimeType = file.type\n * ```\n */\nexport function toAudioBlob(part: AudioUploadPart): Blob {\n return new Blob([new Uint8Array(part.data)], { type: part.mimeType })\n}\n\n/**\n * 将 16bit 小端裸 PCM 封装为标准 WAV 容器(44 字节头 + 数据)\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const wav = wrapPcm16ToWav(new Uint8Array(320), 16000, 1)\n * const riff = new TextDecoder().decode(wav.subarray(0, 4))\n * ```\n */\nexport function wrapPcm16ToWav(pcm: Uint8Array, sampleRate: number, channels: 1 | 2 = 1): Uint8Array {\n const bitsPerSample = 16\n const byteRate = (sampleRate * channels * bitsPerSample) / 8\n const blockAlign = (channels * bitsPerSample) / 8\n const dataSize = pcm.length\n const buffer = Buffer.alloc(44 + dataSize)\n buffer.write('RIFF', 0)\n buffer.writeUInt32LE(36 + dataSize, 4)\n buffer.write('WAVE', 8)\n buffer.write('fmt ', 12)\n buffer.writeUInt32LE(16, 16)\n buffer.writeUInt16LE(1, 20)\n buffer.writeUInt16LE(channels, 22)\n buffer.writeUInt32LE(sampleRate, 24)\n buffer.writeUInt32LE(byteRate, 28)\n buffer.writeUInt16LE(blockAlign, 32)\n buffer.writeUInt16LE(bitsPerSample, 34)\n buffer.write('data', 36)\n buffer.writeUInt32LE(dataSize, 40)\n Buffer.from(pcm).copy(buffer, 44)\n return new Uint8Array(buffer)\n}\n\n/**\n * 提取错误对象的消息或字符串表示;不自动执行凭据脱敏,调用方只能传入安全上下文。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const message = errorMessage(new Error('Connection failed'))\n * // 只用于已知安全错误;函数不负责移除任意 error.message 中的业务秘密。\n * ```\n */\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/**\n * 构造可抛出的 HaiError(供流式 async generator 在迭代期间抛出)\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const failure = audioError(HaiAIError.AUDIO_PROTOCOL_ERROR, 'Audio protocol response is invalid')\n * const code = failure.code\n * ```\n */\nexport function audioError(def: HaiErrorDef, message: string, cause?: unknown): HaiError {\n return core.error.buildHaiErrorInst(def, message, cause)\n}\n\n/**\n * 依据取消原因返回统一取消/超时错误(区分主动取消与超时)\n *\n * `AbortSignal.timeout()` 触发时 `signal.reason` 是 `TimeoutError`,映射为 `AUDIO_TIMEOUT`;\n * 其余主动取消映射为 `AUDIO_CANCELLED`。\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const controller = new AbortController()\n * controller.abort()\n * const failure = audioAbortError(controller.signal)\n * const cancelled = failure.code === HaiAIError.AUDIO_CANCELLED.code\n * ```\n */\nexport function audioAbortError(signal?: AbortSignal): HaiError {\n const reason = signal?.reason as { name?: string } | undefined\n if (reason?.name === 'TimeoutError')\n return audioError(HaiAIError.AUDIO_TIMEOUT, aiM('ai_audioTimeout'))\n return audioError(HaiAIError.AUDIO_CANCELLED, aiM('ai_audioCancelled'))\n}\n\n/**\n * 将流式迭代 / 请求抛出的错误映射为统一 HaiError\n *\n * - 已是领域 HaiError(取消/超时/连接/协议等)→ 原样返回,保留错误码\n * - fetch / SDK 的 `AbortError` / `TimeoutError` → 按取消原因映射 `AUDIO_CANCELLED` / `AUDIO_TIMEOUT`\n * - 其余 → `AUDIO_UPSTREAM_ERROR`\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const cause = new DOMException('Cancelled', 'AbortError')\n * const failure = mapStreamError(cause)\n * const code = failure.code\n * ```\n */\nexport function mapStreamError(error: unknown, signal?: AbortSignal): HaiError {\n const maybe = error as { code?: unknown, name?: unknown }\n if (typeof maybe.code === 'string' && maybe.code.startsWith('hai:ai:'))\n return error as HaiError\n if (maybe.name === 'TimeoutError')\n return audioError(HaiAIError.AUDIO_TIMEOUT, aiM('ai_audioTimeout'))\n if (maybe.name === 'AbortError')\n return audioAbortError(signal)\n return audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: errorMessage(error) } }), error)\n}\n\n/**\n * 将流式迭代抛出的错误转换为 HaiResult(供非流式 transcribe/synthesize 复用底层流)\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const result = toAudioErrorResult<TranscriptionResult>(new DOMException('Cancelled', 'AbortError'))\n * if (!result.success) {\n * const code = result.error.code\n * }\n * ```\n */\nexport function toAudioErrorResult<T>(error: unknown, signal?: AbortSignal): HaiResult<T> {\n return { success: false, error: mapStreamError(error, signal) }\n}\n\n// ─── HTTP 辅助 ───\n\n/**\n * 组合取消信号与超时(不泄露原信号)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const controller = new AbortController()\n * const signal = combineSignal(controller.signal, 5000)\n * controller.abort()\n * const cancelled = signal.aborted\n * ```\n */\nexport function combineSignal(signal: AbortSignal | undefined, timeout: number): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeout)\n return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal\n}\n\n/**\n * 读取 HTTP 错误正文后,将摘要截断到前 200 个字符;这不是有界流读取,也不自动脱敏正文。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const summary = await describeHttpError(new Response('Upstream unavailable', { status: 503 }))\n * const unavailable = summary.startsWith('HTTP 503')\n * ```\n */\nexport async function describeHttpError(response: Pick<Response, 'status' | 'text'>): Promise<string> {\n const text = await response.text().catch(() => '')\n return `HTTP ${response.status} ${text.slice(0, 200)}`.trim()\n}\n\n// ─── Node WebSocket 连接辅助 ───\n\n/**\n * WebSocket 收到的单条消息\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const message: AudioWsMessage = { isBinary: true, binary: new Uint8Array([0, 0]) }\n * const byteLength = message.binary?.byteLength ?? 0\n * ```\n */\nexport interface AudioWsMessage {\n /** 文本帧的字符串内容(`isBinary=false` 时有效) */\n text?: string\n /** 二进制帧内容(`isBinary=true` 时有效) */\n binary?: Uint8Array\n /** 是否为二进制帧 */\n isBinary: boolean\n}\n\n/**\n * WebSocket 连接封装(隐藏 ws 事件模型,向 Provider 暴露异步迭代)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function consume(connection: AudioWsConnection) {\n * try {\n * for await (const message of connection.messages()) {\n * if (!message.isBinary && message.text) return JSON.parse(message.text)\n * }\n * return undefined\n * }\n * finally { connection.close() }\n * }\n * ```\n */\nexport interface AudioWsConnection {\n /** 发送文本或二进制帧 */\n send: (data: string | Uint8Array) => void\n /** 按到达顺序异步迭代服务端消息,连接关闭时正常结束,出错时抛出 */\n messages: () => AsyncIterableIterator<AudioWsMessage>\n /** 主动关闭连接并释放资源 */\n close: () => void\n}\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-ws' })\n\n/**\n * 建立 Node WebSocket 连接\n *\n * 内部维护消息队列,将 ws 的事件模型转换为背压友好的异步迭代。连接失败或超时返回 rejected Promise。\n * 传入的 `signal` 触发时立即关闭连接并终止迭代。\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function connect(url: string, headers: Record<string, string>, signal: AbortSignal) {\n * const connection = await openAudioWebSocket(url, headers, { signal, timeout: 5000 })\n * try {\n * for await (const message of connection.messages()) {\n * if (!message.isBinary && message.text) return message.text\n * }\n * return undefined\n * }\n * finally { connection.close() }\n * }\n * ```\n */\nexport function openAudioWebSocket(\n url: string,\n headers: Record<string, string>,\n options?: { signal?: AbortSignal, timeout?: number },\n): Promise<AudioWsConnection> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url, { headers, handshakeTimeout: options?.timeout ?? 15000 })\n ws.binaryType = 'arraybuffer'\n\n // 消息队列 + 等待者:经典异步队列,实现背压友好的 for await\n const queue: AudioWsMessage[] = []\n let waiting: ((result: IteratorResult<AudioWsMessage>) => void) | null = null\n let closed = false\n let opened = false\n let aborted = false\n let failure: Error | null = null\n\n const onSignalAbort = (): void => {\n aborted = true\n try {\n ws.close()\n }\n catch { /* 忽略 */ }\n }\n\n function settleClosed(): void {\n if (closed)\n return\n closed = true\n if (options?.signal)\n options.signal.removeEventListener('abort', onSignalAbort)\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: undefined, done: true })\n }\n }\n\n function pushMessage(msg: AudioWsMessage): void {\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: msg, done: false })\n }\n else {\n queue.push(msg)\n }\n }\n\n ws.on('message', (data: ArrayBuffer | Buffer, isBinary: boolean) => {\n if (isBinary) {\n const buf = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer)\n pushMessage({ isBinary: true, binary: new Uint8Array(buf) })\n }\n else {\n const text = Buffer.isBuffer(data) ? data.toString('utf8') : Buffer.from(data as ArrayBuffer).toString('utf8')\n pushMessage({ isBinary: false, text })\n }\n })\n\n ws.on('error', (error: Error) => {\n // open 之前出错视为连接建立失败,映射为 AUDIO_CONNECTION_FAILED\n if (!opened) {\n settleClosed()\n reject(audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: error.message } }), error))\n return\n }\n failure = error\n logger.debug('Audio WebSocket error', { error: error.message })\n settleClosed()\n })\n\n ws.on('close', () => {\n settleClosed()\n })\n\n if (options?.signal) {\n if (options.signal.aborted)\n onSignalAbort()\n else\n options.signal.addEventListener('abort', onSignalAbort, { once: true })\n }\n\n ws.on('open', () => {\n opened = true\n const connection: AudioWsConnection = {\n send(data) {\n ws.send(data)\n },\n async* messages() {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift() as AudioWsMessage\n continue\n }\n if (closed) {\n if (aborted)\n throw audioAbortError(options?.signal)\n if (failure)\n throw audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: failure.message } }), failure)\n return\n }\n const next = await new Promise<IteratorResult<AudioWsMessage>>((res) => {\n waiting = res\n })\n if (next.done) {\n if (aborted)\n throw audioAbortError(options?.signal)\n if (failure)\n throw audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: failure.message } }), failure)\n return\n }\n yield next.value\n }\n },\n close() {\n try {\n ws.close()\n }\n catch { /* 忽略 */ }\n },\n }\n resolve(connection)\n })\n })\n}\n","/**\n * @h-ai/ai — Audio Provider: 豆包 / 火山引擎实现\n *\n * 基于火山引擎二进制 WebSocket 协议实现语音识别与语音合成。协议编解码保留在本 Provider 内部:\n * - ASR(`/api/v3/sauc/bigmodel`):4 字节头 + payload_size + payload 的序列号协议。\n * - TTS(`/api/v3/tts/bidirection`):4 字节头 + event + [session_id] + payload_size + payload 的事件协议。\n *\n * 二进制协议整数字段均为大端。公共 API 不暴露协议版本、消息类型、序列号、事件号等细节。\n * @internal\n * @module audio/providers/ai-audio-provider-doubao\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ResolvedAudioModel } from '../../ai-config.js'\n\nimport type { AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n AudioWsMessage,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { Buffer } from 'node:buffer'\nimport { gunzipSync } from 'node:zlib'\nimport { core, ok } from '@h-ai/core'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { audioError, concatChunks, errorMessage, openAudioWebSocket, toAudioErrorResult } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-doubao' })\n\n/** 豆包实时平台能力:WebSocket 实时识别(不产出服务端 VAD 起止事件)+ 实时合成(支持增量文本输入) */\nconst DOUBAO_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: true, speechBoundaryEvents: false, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: true, streamingAudioOutput: true },\n}\n\n// ─── 二进制协议常量 ───\n\nconst PROTOCOL_VERSION = 0b0001\nconst HEADER_SIZE = 0b0001\n\n/** 消息类型 */\nconst MSG_FULL_CLIENT = 0b0001\nconst MSG_AUDIO_ONLY_CLIENT = 0b0010\nconst MSG_FULL_SERVER = 0b1001\nconst MSG_AUDIO_ONLY_SERVER = 0b1011\nconst MSG_SERVER_ERROR = 0b1111\n\n/** 消息类型补充标志 */\nconst FLAG_NO_SEQ = 0b0000\nconst FLAG_LAST_NO_SEQ = 0b0010\nconst FLAG_WITH_EVENT = 0b0100\n\n/** 序列化方式 */\nconst SERIAL_NONE = 0b0000\nconst SERIAL_JSON = 0b0001\n\n/** 压缩方式 */\nconst COMPRESS_NONE = 0b0000\nconst COMPRESS_GZIP = 0b0001\n\n/** TTS 事件号(火山引擎双向流式 TTS v3 协议) */\nconst EVENT_START_CONNECTION = 1\nconst EVENT_FINISH_CONNECTION = 2\nconst EVENT_CONNECTION_STARTED = 50\nconst EVENT_CONNECTION_FAILED = 51\nconst EVENT_START_SESSION = 100\nconst EVENT_FINISH_SESSION = 102\nconst EVENT_SESSION_FINISHED = 152\nconst EVENT_SESSION_FAILED = 153\nconst EVENT_TASK_REQUEST = 200\nconst EVENT_TTS_RESPONSE = 352\n\n/** 连接级事件(不携带 session_id) */\nconst CONNECTION_EVENTS = new Set<number>([\n EVENT_START_CONNECTION,\n EVENT_FINISH_CONNECTION,\n EVENT_CONNECTION_STARTED,\n EVENT_CONNECTION_FAILED,\n])\n\n/** 我方音频格式 → 火山引擎 ASR / TTS 容器格式 */\nconst DOUBAO_FORMAT: Record<AudioFormat, string> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'ogg_opus',\n}\n\n// ─── 二进制编解码 ───\n\n/** 构造 4 字节协议头 */\nfunction buildHeader(messageType: number, flags: number, serialization: number, compression: number): Buffer {\n return Buffer.from([\n (PROTOCOL_VERSION << 4) | HEADER_SIZE,\n (messageType << 4) | flags,\n (serialization << 4) | compression,\n 0x00,\n ])\n}\n\n/** 大端 uint32 */\nfunction uint32BE(value: number): Buffer {\n const b = Buffer.alloc(4)\n b.writeUInt32BE(value >>> 0, 0)\n return b\n}\n\n/** 大端 int32 */\nfunction int32BE(value: number): Buffer {\n const b = Buffer.alloc(4)\n b.writeInt32BE(value, 0)\n return b\n}\n\n/** 编码 ASR full client request(4B 头 + payload_size + JSON payload) */\nfunction encodeAsrConfig(config: object): Uint8Array {\n const payload = Buffer.from(JSON.stringify(config), 'utf8')\n return new Uint8Array(Buffer.concat([\n buildHeader(MSG_FULL_CLIENT, FLAG_NO_SEQ, SERIAL_JSON, COMPRESS_NONE),\n uint32BE(payload.length),\n payload,\n ]))\n}\n\n/** 编码 ASR audio only request(4B 头 + payload_size + 原始音频;`last` 标记最后一包) */\nfunction encodeAsrAudio(audio: Uint8Array, last: boolean): Uint8Array {\n return new Uint8Array(Buffer.concat([\n buildHeader(MSG_AUDIO_ONLY_CLIENT, last ? FLAG_LAST_NO_SEQ : FLAG_NO_SEQ, SERIAL_NONE, COMPRESS_NONE),\n uint32BE(audio.length),\n Buffer.from(audio),\n ]))\n}\n\n/** 编码 TTS 事件帧(4B 头 + event + [session_id] + payload_size + JSON payload) */\nfunction encodeTtsEvent(event: number, payload: object, sessionId?: string): Uint8Array {\n const parts: Buffer[] = [\n buildHeader(MSG_FULL_CLIENT, FLAG_WITH_EVENT, SERIAL_JSON, COMPRESS_NONE),\n int32BE(event),\n ]\n if (!CONNECTION_EVENTS.has(event) && sessionId !== undefined) {\n const sid = Buffer.from(sessionId, 'utf8')\n parts.push(uint32BE(sid.length), sid)\n }\n const body = Buffer.from(JSON.stringify(payload), 'utf8')\n parts.push(uint32BE(body.length), body)\n return new Uint8Array(Buffer.concat(parts))\n}\n\n/**\n * 解析后的服务端帧\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const frame: DecodedFrame = { messageType: MSG_AUDIO_ONLY_SERVER, audio: new Uint8Array([0, 0]) }\n * const audio = frame.messageType === MSG_AUDIO_ONLY_SERVER ? frame.audio : undefined\n * ```\n */\ninterface DecodedFrame {\n messageType: number\n /** 事件号(TTS 协议有效) */\n event?: number\n /** 序列号(ASR 协议有效,负值表示最后一包) */\n sequence?: number\n /** JSON 负载(消息为 JSON 序列化时) */\n json?: Record<string, unknown>\n /** 原始二进制负载(音频帧) */\n audio?: Uint8Array\n /** 错误码(错误帧有效) */\n errorCode?: number\n /** 错误消息(错误帧有效) */\n errorMessage?: string\n}\n\n/** 解压 payload(依据 compression 位) */\nfunction maybeGunzip(payload: Buffer, compression: number): Buffer {\n return compression === COMPRESS_GZIP ? gunzipSync(payload) : payload\n}\n\n/** 解析服务端二进制帧 */\nfunction decodeFrame(data: Uint8Array): DecodedFrame {\n const buf = Buffer.from(data)\n const messageType = (buf[1] >> 4) & 0x0F\n const flags = buf[1] & 0x0F\n const serialization = (buf[2] >> 4) & 0x0F\n const compression = buf[2] & 0x0F\n let offset = 4\n\n if (messageType === MSG_SERVER_ERROR) {\n const errorCode = buf.readUInt32BE(offset)\n offset += 4\n const size = buf.readUInt32BE(offset)\n offset += 4\n const msg = maybeGunzip(buf.subarray(offset, offset + size), compression).toString('utf8')\n return { messageType, errorCode, errorMessage: msg }\n }\n\n let event: number | undefined\n if (flags & FLAG_WITH_EVENT) {\n event = buf.readInt32BE(offset)\n offset += 4\n // 会话级事件携带 session_id\n if (event !== undefined && !CONNECTION_EVENTS.has(event)) {\n const sidSize = buf.readUInt32BE(offset)\n offset += 4 + sidSize\n }\n }\n\n let sequence: number | undefined\n if (!(flags & FLAG_WITH_EVENT) && messageType === MSG_FULL_SERVER) {\n // ASR 服务端响应携带 sequence(4B 有符号,负值表示最后一包)\n sequence = buf.readInt32BE(offset)\n offset += 4\n }\n\n const size = buf.readUInt32BE(offset)\n offset += 4\n const payload = buf.subarray(offset, offset + size)\n\n if (messageType === MSG_AUDIO_ONLY_SERVER)\n return { messageType, event, audio: new Uint8Array(payload) }\n\n const decompressed = maybeGunzip(payload, compression)\n if (serialization === SERIAL_JSON) {\n try {\n return { messageType, event, sequence, json: JSON.parse(decompressed.toString('utf8')) as Record<string, unknown> }\n }\n catch {\n return { messageType, event, sequence }\n }\n }\n return { messageType, event, sequence, audio: new Uint8Array(decompressed) }\n}\n\n// ─── Provider 实现 ───\n\n/**\n * 创建豆包 / 火山引擎 Audio Provider\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function invoke(request: ProviderTranscriptionRequest) {\n * const provider = createDoubaoAudioProvider()\n * if (!provider.transcription) throw new Error('Audio operation is unavailable')\n * const result = await provider.transcription.transcribe(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createDoubaoAudioProvider(): AudioProvider {\n function buildAuthHeaders(model: ResolvedAudioModel, isTts: boolean): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-Api-Resource-Id': model.resourceId,\n 'X-Api-Connect-Id': globalThis.crypto.randomUUID(),\n }\n if (model.apiKey)\n headers['X-Api-Key'] = model.apiKey\n // 旧版控制台 ASR 使用 App-Key + Access-Key\n if (!isTts && model.appKey && model.accessKey) {\n headers['X-Api-App-Key'] = model.appKey\n headers['X-Api-Access-Key'] = model.accessKey\n }\n headers['X-Api-Request-Id'] = globalThis.crypto.randomUUID()\n return headers\n }\n\n // ─── ASR ───\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n try {\n let finalText = ''\n for await (const event of transcribeStream({ model: request.model, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })) {\n if (event.type === 'transcript' && event.final)\n finalText = event.text\n }\n return ok({ text: finalText })\n }\n catch (error) {\n logger.debug('Doubao transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, contextHints, signal } = request\n const url = `${model.baseUrl}/api/v3/sauc/bigmodel`\n const conn = await openAudioWebSocket(url, buildAuthHeaders(model, false), { signal, timeout: model.timeout })\n try {\n const sampleRate = audio.sampleRate ?? 16000\n const channels = audio.channels ?? 1\n conn.send(encodeAsrConfig({\n user: { uid: 'hai' },\n audio: {\n format: DOUBAO_FORMAT[audio.format],\n rate: sampleRate,\n bits: 16,\n channel: channels,\n ...(language ? { language } : {}),\n },\n request: {\n model_name: 'bigmodel',\n enable_itn: true,\n enable_punc: true,\n result_type: 'full',\n // 领域提示词 → 热词(直传 context)\n ...(contextHints?.length ? { context: JSON.stringify({ hotwords: contextHints.map(word => ({ word })) }) } : {}),\n },\n }))\n\n const sendAudio = (async () => {\n if ('chunks' in audio) {\n // 持续输入:一包前瞻,末包打 last 标记\n let prev: Uint8Array | undefined\n for await (const part of audio.chunks) {\n if (prev !== undefined)\n conn.send(encodeAsrAudio(prev, false))\n prev = part\n }\n conn.send(encodeAsrAudio(prev ?? new Uint8Array(0), true))\n }\n else {\n conn.send(encodeAsrAudio(audio.data, true))\n }\n })()\n let sendError: unknown\n sendAudio.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (!message.isBinary || !message.binary)\n continue\n const frame = decodeFrame(message.binary)\n if (frame.messageType === MSG_SERVER_ERROR)\n throw audioError(HaiAIError.AUDIO_PROTOCOL_ERROR, aiM('ai_audioProtocolError', { params: { error: `${frame.errorCode} ${frame.errorMessage ?? ''}`.trim() } }))\n\n const text = extractAsrText(frame.json)\n const isLast = frame.sequence !== undefined && frame.sequence < 0\n if (text !== undefined)\n yield { type: 'transcript', text, final: isLast }\n if (isLast) {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n // ─── TTS ───\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const out = resolveSynthesisOutput({ format: request.format, sampleRate: request.sampleRate })\n try {\n const chunks: Uint8Array[] = []\n for await (const audio of synthesizeStream({ model: request.model, text: request.text, voice: request.voice, format: out.format, sampleRate: request.sampleRate, signal: request.signal }))\n chunks.push(audio)\n return ok({ data: concatChunks(chunks), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('Doubao synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, format, sampleRate, signal } = request\n const outFormat = resolveSynthesisOutput({ format }).format\n const url = `${model.baseUrl}/api/v3/tts/bidirection`\n const conn = await openAudioWebSocket(url, buildAuthHeaders(model, true), { signal, timeout: model.timeout })\n const sessionId = globalThis.crypto.randomUUID()\n\n const reqParams = {\n speaker: voice ?? '',\n audio_params: { format: DOUBAO_FORMAT[outFormat], sample_rate: sampleRate ?? 24000 },\n }\n\n try {\n conn.send(encodeTtsEvent(EVENT_START_CONNECTION, {}))\n conn.send(encodeTtsEvent(EVENT_START_SESSION, { event: EVENT_START_SESSION, req_params: reqParams }, sessionId))\n\n const sendText = (async () => {\n if (typeof text === 'string') {\n conn.send(encodeTtsEvent(EVENT_TASK_REQUEST, { event: EVENT_TASK_REQUEST, req_params: { ...reqParams, text } }, sessionId))\n }\n else {\n for await (const part of text)\n conn.send(encodeTtsEvent(EVENT_TASK_REQUEST, { event: EVENT_TASK_REQUEST, req_params: { ...reqParams, text: part } }, sessionId))\n }\n conn.send(encodeTtsEvent(EVENT_FINISH_SESSION, { event: EVENT_FINISH_SESSION }, sessionId))\n conn.send(encodeTtsEvent(EVENT_FINISH_CONNECTION, { event: EVENT_FINISH_CONNECTION }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n const frame = decodeBinaryMessage(message)\n if (!frame)\n continue\n if (frame.messageType === MSG_SERVER_ERROR || frame.event === EVENT_SESSION_FAILED || frame.event === EVENT_CONNECTION_FAILED)\n throw audioError(HaiAIError.AUDIO_PROTOCOL_ERROR, aiM('ai_audioProtocolError', { params: { error: `${frame.errorCode ?? frame.event} ${frame.errorMessage ?? ''}`.trim() } }))\n\n if (frame.event === EVENT_TTS_RESPONSE && frame.audio) {\n yield frame.audio\n }\n else if (frame.event === EVENT_SESSION_FINISHED) {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n return {\n transcription: { transcribe, transcribeStream },\n synthesis: { synthesize, synthesizeStream, resolveSynthesisOutput },\n getCapabilities: () => DOUBAO_CAPABILITIES,\n }\n}\n\n/** 豆包未指定格式时默认 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format ?? 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n// ─── 内部辅助 ───\n\n/** 从 ASR 响应 JSON 提取识别文本(`result.text`) */\nfunction extractAsrText(json: Record<string, unknown> | undefined): string | undefined {\n if (!json)\n return undefined\n const result = json.result as { text?: string } | undefined\n return result?.text\n}\n\n/** 将 WebSocket 消息解析为二进制帧(非二进制返回 undefined) */\nfunction decodeBinaryMessage(message: AudioWsMessage): DecodedFrame | undefined {\n if (!message.isBinary || !message.binary)\n return undefined\n return decodeFrame(message.binary)\n}\n","/**\n * @h-ai/ai — Audio Provider: IndexTTS 实现\n *\n * 适配 hai-framework IndexTTS Service 协议(`POST /v1/audio/speech`,multipart/form-data,二进制音频响应)。\n * `indextts` 表示协议,而非部署位置:可连接本地、内网或云端任意实现该协议的 Endpoint。\n * 公共层只表达模型无关的业务语义(说话人 / 风格参考、语速、目标时长),模型私有参数由 Model Service 转换。\n * 首期不实现原生流式(由 Framework 层按段完整合成降级)。\n * @internal\n * @module audio/providers/ai-audio-provider-indextts\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { Headers } from 'undici'\n\nimport type { AudioFormat, AudioModelCapabilities, AudioReference, SynthesisResult } from '../ai-audio-types.js'\n\nimport type { AudioProvider, ProviderSynthesisRequest, SynthesisOutputMeta } from './ai-audio-provider.js'\nimport { core, err, ok } from '@h-ai/core'\nimport { Agent, fetch as fetchAudio, FormData } from 'undici'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { combineSignal, describeHttpError, errorMessage, toAudioBlob, toAudioErrorResult, toAudioUploadPart } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-indextts' })\n\n/** IndexTTS 2.5 能力:说话人参考(必需)+ 风格参考 + 语速 + 目标时长(无预置音色 / 无原生流式输出) */\nconst INDEX_TTS_CAPABILITIES: AudioModelCapabilities = {\n synthesize: {\n supported: true,\n incrementalTextInput: false,\n streamingAudioOutput: false,\n languageSelection: true,\n presetVoice: false,\n speakerReference: true,\n speakerReferenceRequired: true,\n styleReference: true,\n instruction: false,\n speedControl: true,\n targetDuration: true,\n supportedLanguages: ['zh', 'en', 'ja'],\n },\n}\n\n/** 响应头字段名(Model Service 回传的真实音频元数据) */\nconst HEADER_DURATION_MS = 'x-hai-audio-duration-ms'\nconst HEADER_DURATION_MATCHED = 'x-hai-duration-matched'\nconst HEADER_APPLIED_SPEED = 'x-hai-applied-speed'\nconst HEADER_SAMPLE_RATE = 'x-hai-audio-sample-rate'\nconst HEADER_CHANNELS = 'x-hai-audio-channels'\n\n/**\n * 创建 IndexTTS Audio Provider(仅 TTS)\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function invoke(request: ProviderSynthesisRequest) {\n * const provider = createIndexTtsAudioProvider()\n * if (!provider.synthesis) throw new Error('Audio operation is unavailable')\n * const result = await provider.synthesis.synthesize(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createIndexTtsAudioProvider(): AudioProvider {\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { model, text, language, speakerReference, styleReference, styleStrength, speed, targetDurationMs, durationToleranceMs, format, sampleRate, signal } = request\n // IndexTTS 需要说话人参考音频;缺失时在调用服务前返回明确错误\n if (!speakerReference)\n return err(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'speaker_reference is required' } }))\n\n const out = resolveSynthesisOutput({ format, sampleRate })\n let requestSignal = signal\n try {\n const form = new FormData()\n form.append('text', text)\n form.append('model', model.model)\n if (language)\n form.append('language', language)\n\n appendReference(form, 'speaker_reference', speakerReference)\n if (styleReference)\n appendReference(form, 'style_reference', styleReference)\n if (styleStrength !== undefined)\n form.append('style_strength', String(styleStrength))\n if (speed !== undefined)\n form.append('speed', String(speed))\n if (targetDurationMs !== undefined)\n form.append('target_duration_ms', String(targetDurationMs))\n if (durationToleranceMs !== undefined)\n form.append('duration_tolerance_ms', String(durationToleranceMs))\n form.append('response_format', out.format)\n if (out.sampleRate !== undefined)\n form.append('sample_rate', String(out.sampleRate))\n\n const headers: Record<string, string> = {}\n if (model.apiKey)\n headers.Authorization = `Bearer ${model.apiKey}`\n\n requestSignal = combineSignal(signal, model.timeout)\n // Agent 与 fetch 来自同一 Undici 版本,避免与 Node 内置 fetch 的 dispatcher 协议混用。\n const dispatcher = new Agent({\n connectTimeout: Math.min(model.timeout, 30_000),\n headersTimeout: model.timeout,\n bodyTimeout: model.timeout,\n })\n try {\n const response = await fetchAudio(`${model.baseUrl.replace(/\\/$/, '')}/audio/speech`, {\n method: 'POST',\n headers,\n body: form,\n signal: requestSignal,\n dispatcher,\n })\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const data = new Uint8Array(await response.arrayBuffer())\n return ok(buildSynthesisResult(data, out, response.headers))\n }\n finally {\n await dispatcher.close()\n }\n }\n catch (error) {\n logger.debug('IndexTTS synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, requestSignal)\n }\n }\n\n return {\n synthesis: { synthesize, resolveSynthesisOutput },\n getCapabilities: () => INDEX_TTS_CAPABILITIES,\n }\n}\n\n/** IndexTTS 未指定格式时默认 wav;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format ?? 'wav'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n/** 追加参考音频及其文本 / 语言到表单(裸 pcm16 已由 toAudioUploadPart 封装为 WAV) */\nfunction appendReference(form: FormData, field: string, reference: AudioReference): void {\n const part = toAudioUploadPart(reference.audio, field)\n form.append(field, toAudioBlob(part), part.filename)\n if (reference.transcript)\n form.append(`${field}_text`, reference.transcript)\n if (reference.language)\n form.append(`${field}_language`, reference.language)\n}\n\n/** 由二进制响应体 + 响应头构造 SynthesisResult(真实时长 / 采样率 / 声道以服务端为准) */\nfunction buildSynthesisResult(data: Uint8Array, out: SynthesisOutputMeta, headers: Headers): SynthesisResult {\n const durationMs = parseNumberHeader(headers.get(HEADER_DURATION_MS))\n const sampleRate = parseNumberHeader(headers.get(HEADER_SAMPLE_RATE)) ?? out.sampleRate\n const channels = parseNumberHeader(headers.get(HEADER_CHANNELS)) === 2 ? 2 : out.channels\n const durationMatched = parseBooleanHeader(headers.get(HEADER_DURATION_MATCHED))\n const appliedSpeed = parseNumberHeader(headers.get(HEADER_APPLIED_SPEED))\n\n const metadata: SynthesisResult['metadata'] = {}\n if (durationMatched !== undefined)\n metadata.durationMatched = durationMatched\n if (appliedSpeed !== undefined)\n metadata.speed = appliedSpeed\n\n return {\n data,\n format: out.format,\n sampleRate,\n channels,\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(Object.keys(metadata).length ? { metadata } : {}),\n }\n}\n\n/** 解析数值响应头(缺失或非法返回 undefined) */\nfunction parseNumberHeader(value: string | null): number | undefined {\n if (value === null)\n return undefined\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\n/** 解析布尔响应头(缺失返回 undefined,保留「无法判断」语义) */\nfunction parseBooleanHeader(value: string | null): boolean | undefined {\n if (value === null)\n return undefined\n return value === 'true' || value === '1'\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 * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const processor = createStreamProcessor()\n * processor.process({ id: 'chunk-1', object: 'chat.completion.chunk', created: 0, model: 'configured-model', choices: [{ index: 0, delta: { content: '你好' }, finish_reason: null }] })\n * const text = processor.getResult().content\n * ```\n */\nexport function createStreamProcessor(): StreamProcessor {\n /** 累积文本内容 */\n let content = ''\n /** 累积 reasoning 内容 */\n let reasoningContent = ''\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 const reasoningDelta = 'reasoning_content' in delta && typeof delta.reasoning_content === 'string'\n ? delta.reasoning_content\n : ''\n if (reasoningDelta) {\n reasoningContent += reasoningDelta\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 reasoningContent,\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.reasoningContent) {\n message.reasoning_content = result.reasoningContent\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 reasoningContent = ''\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 * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function consume(stream: AsyncIterable<ChatCompletionChunk>) {\n * const result = await collectStream(stream)\n * return { text: result.content, toolCalls: result.toolCalls }\n * }\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 * 接受 LF、CRLF、CR(含跨分片的 CRLF),仅移除冒号后的一个空格。\n * 多行 data 按 LF 合并;空 data 仍是事件,注释与无 data 块不派发。\n * id/retry 保留最近有效值;EOF 不补空行,未完成事件由 reset 丢弃。\n *\n * @returns SSE 解码器实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const decoder = createSSEDecoder()\n * const first = [...decoder.decode('data: 你')]\n * const completed = [...decoder.decode('好\\n\\n')]\n * const text = completed[0]?.data\n * decoder.reset()\n * ```\n */\nexport function createSSEDecoder(): SSEDecoder {\n let line = ''\n let data: string[] = []\n let eventType = ''\n let lastId: string | undefined\n let retry: number | undefined\n let skipLf = false\n let firstCharacter = true\n\n /** 完整行才处理字段;空行派发后仅清空当前 data/event,保留连接级 id/retry。 */\n function consumeLine(): SSEEvent | undefined {\n const current = line\n line = ''\n if (current === '') {\n const result: SSEEvent | undefined = data.length > 0\n ? { data: data.join('\\n'), ...(eventType ? { event: eventType } : {}), ...(lastId === undefined ? {} : { id: lastId }), ...(retry === undefined ? {} : { retry }) }\n : undefined\n data = []\n eventType = ''\n return result\n }\n if (current.startsWith(':'))\n return undefined\n const colon = current.indexOf(':')\n const field = colon < 0 ? current : current.slice(0, colon)\n let value = colon < 0 ? '' : current.slice(colon + 1)\n if (value.startsWith(' '))\n value = value.slice(1)\n if (field === 'data')\n data.push(value)\n else if (field === 'event')\n eventType = value\n else if (field === 'id' && !value.includes('\\0'))\n lastId = value\n else if (field === 'retry' && /^\\d+$/.test(value) && Number.isSafeInteger(Number(value)))\n retry = Number(value)\n return undefined\n }\n\n return {\n * decode(text: string): Iterable<SSEEvent> {\n for (const character of text) {\n if (firstCharacter) {\n firstCharacter = false\n if (character === '\\uFEFF')\n continue\n }\n if (skipLf) {\n skipLf = false\n if (character === '\\n')\n continue\n }\n if (character !== '\\r' && character !== '\\n') {\n line += character\n continue\n }\n skipLf = character === '\\r'\n const event = consumeLine()\n if (event)\n yield event\n }\n },\n\n reset(): void {\n line = ''\n data = []\n eventType = ''\n lastId = undefined\n retry = undefined\n skipLf = false\n firstCharacter = true\n },\n }\n}\n\n/**\n * 读取真实 SSE 响应,跨字节分片解码 UTF-8;退出、取消和失败均取消正文并释放 reader。\n *\n * EOF 只刷新字符解码器,不补协议空行;未终止的 SSE 事件不会伪造完成。\n * 此函数仅供实际 Provider 复用,不提供自动重连或业务副作用重放。\n *\n * @example\n * ```ts\n * // 模块内部上下文:消费方提前 return 仍取消底层 HTTP 正文。\n * async function first(response: Response, signal: AbortSignal) {\n * for await (const event of readSSEStream(response, signal)) return event.data\n * return undefined\n * }\n * ```\n */\nexport async function* readSSEStream(response: Response, signal?: AbortSignal): AsyncIterable<SSEEvent> {\n if (!response.body)\n return\n const reader = response.body.getReader()\n // BOM 由文本协议层只剥离一次;避免 TextDecoder 和协议解析器各剥离一次。\n const text = new TextDecoder('utf-8', { ignoreBOM: true })\n const decoder = createSSEDecoder()\n const abort = () => {\n void reader.cancel(signal?.reason).catch(() => {})\n }\n signal?.addEventListener('abort', abort, { once: true })\n try {\n while (true) {\n signal?.throwIfAborted()\n const { done, value } = await reader.read()\n signal?.throwIfAborted()\n if (done)\n break\n yield* decoder.decode(text.decode(value, { stream: true }))\n }\n yield* decoder.decode(text.decode())\n }\n finally {\n signal?.removeEventListener('abort', abort)\n decoder.reset()\n await reader.cancel().catch(() => {})\n reader.releaseLock()\n }\n}\n\n/**\n * 将 SSE 事件编码为符合规范的文本格式\n *\n * 输出以双换行 `\\n\\n` 结尾,可直接写入 HTTP 响应流。\n * data 中的 CRLF/CR 规范化为 LF;拒绝 id/event 字段换行、id 的 NUL 和无效 retry。\n *\n * @param event - SSE 事件\n * @returns 编码后的文本(以 `\\n\\n` 结尾)\n * @throws 字段无法编码为合法的单个 SSE 事件时抛 TypeError / RangeError。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const encoded = encodeSSE({ event: 'message', id: 'event-1', data: '第一行\\n第二行' })\n * const decoder = createSSEDecoder()\n * const events = [...decoder.decode(encoded)]\n * ```\n */\nexport function encodeSSE(event: SSEEvent): string {\n if ((event.event !== undefined && /[\\r\\n]/.test(event.event)) || (event.id !== undefined && /[\\r\\n\\0]/.test(event.id)))\n throw new TypeError('SSE event/id must not contain line breaks; id must not contain NUL')\n if (event.retry !== undefined && (!Number.isSafeInteger(event.retry) || event.retry < 0))\n throw new RangeError('SSE retry must be a non-negative safe integer')\n const lines: string[] = []\n if (event.event) {\n lines.push(`event: ${event.event}`)\n }\n if (event.id !== undefined) {\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(/\\r\\n|\\r|\\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 — Audio Provider: MiMo(小米)实现\n *\n * 基于 MiMo 兼容 Chat Completions 的 HTTP 接口实现语音识别与语音合成:\n * - ASR(`mimo-v2.5-asr`):完整音频以 `input_audio` 传入,`stream` 时增量返回识别文本。\n * MiMo ASR 不支持持续上传音频,故 `transcribeStream` 传入 `AudioInputStream` 时明确返回不支持。\n * - TTS(`mimo-v2.5-tts`):合成文本放入 `assistant` 消息,`stream` 时以 Base64 分片返回 PCM 音频。\n * @internal\n * @module audio/providers/ai-audio-provider-mimo\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AudioContent, AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { readSSEStream } from '../../llm/ai-llm-stream.js'\nimport { audioError, combineSignal, describeHttpError, errorMessage, fromBase64, streamSentences, toAudioErrorResult, toBase64 } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-mimo' })\n\n/** MiMo 平台能力:HTTP 识别(非持续音频输入,流式返回文本)+ HTTP 流式合成(不接收增量文本,框架内句子分段) */\nconst MIMO_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: false, speechBoundaryEvents: false, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: false, streamingAudioOutput: true },\n}\n\n/** MiMo ASR 支持的音频容器 → MIME 类型 */\nconst MIMO_ASR_MIME: Partial<Record<AudioFormat, string>> = {\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n}\n\n/**\n * MiMo 流式响应中的增量结构\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const delta: MimoDelta = { audio: { data: 'AAA=' } }\n * const bytes = delta.audio?.data ? fromBase64(delta.audio.data) : undefined\n * ```\n */\ninterface MimoDelta {\n content?: string\n audio?: { data?: string }\n}\n\n/**\n * MiMo Chat Completions 响应/流块结构(仅取本模块关心的字段)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const chunk: MimoChunk = { choices: [{ delta: { content: '你好' } }] }\n * const text = chunk.choices?.[0]?.delta?.content ?? ''\n * ```\n */\ninterface MimoChunk {\n choices?: Array<{\n delta?: MimoDelta\n message?: { content?: string, audio?: { data?: string } }\n }>\n}\n\n/**\n * 创建 MiMo Audio Provider\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function invoke(request: ProviderSynthesisRequest) {\n * const provider = createMimoAudioProvider()\n * if (!provider.synthesis) throw new Error('Audio operation is unavailable')\n * const result = await provider.synthesis.synthesize(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createMimoAudioProvider(): AudioProvider {\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n const { model, audio, language, signal } = request\n const mime = MIMO_ASR_MIME[audio.format]\n if (!mime)\n return err(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: `format ${audio.format} (only wav/mp3)` } }))\n\n const requestSignal = combineSignal(signal, model.timeout)\n try {\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: [{ role: 'user', content: [{ type: 'input_audio', input_audio: { data: `data:${mime};base64,${toBase64(audio.data)}` } }] }],\n asr_options: { language: language ?? 'auto' },\n }, requestSignal)\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const body = await response.json() as MimoChunk\n const text = body.choices?.[0]?.message?.content ?? ''\n return ok({ text })\n }\n catch (error) {\n logger.debug('MiMo transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, requestSignal)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, signal } = request\n if ('chunks' in audio) {\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: 'streaming audio input' } }))\n }\n const content = audio as AudioContent\n const mime = MIMO_ASR_MIME[content.format]\n if (!mime)\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: `format ${content.format} (only wav/mp3)` } }))\n\n const requestSignal = combineSignal(signal, model.timeout)\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: [{ role: 'user', content: [{ type: 'input_audio', input_audio: { data: `data:${mime};base64,${toBase64(content.data)}` } }] }],\n asr_options: { language: language ?? 'auto' },\n stream: true,\n }, requestSignal)\n if (!response.ok)\n throw audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n let text = ''\n for await (const chunk of readChunks(response, requestSignal)) {\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n text += delta\n yield { type: 'transcript', text, final: false }\n }\n }\n yield { type: 'transcript', text, final: true }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n // 与 synthesizeStream 共用同一解析函数,确保完整与流式合成对同一 format 得到一致编码\n const out = resolveSynthesisOutput({ format, sampleRate })\n const requestSignal = combineSignal(signal, model.timeout)\n try {\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: buildTtsMessages(text, instruction),\n audio: { format: out.format, ...(voice ? { voice } : {}) },\n }, requestSignal)\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const body = await response.json() as MimoChunk\n const base64 = body.choices?.[0]?.message?.audio?.data\n if (!base64)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: 'missing audio data' } }))\n\n return ok({ data: fromBase64(base64), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('MiMo synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, requestSignal)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, signal } = request\n const outFormat = resolveSynthesisOutput({ format }).format\n\n // MiMo TTS 不原生接收增量文本:字符串一次合成;持续文本流按句子分段逐句合成,降低首音延迟\n const segments = typeof text === 'string' ? [text] : streamSentences(text)\n for await (const segment of segments) {\n if (!segment)\n continue\n // 每个真实 HTTP 合成请求保留原有独立 timeout,读取正文时仍使用同一信号。\n const requestSignal = combineSignal(signal, model.timeout)\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: buildTtsMessages(segment, instruction),\n audio: { format: outFormat, ...(voice ? { voice } : {}) },\n stream: true,\n }, requestSignal)\n if (!response.ok)\n throw audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n for await (const chunk of readChunks(response, requestSignal)) {\n const base64 = chunk.choices?.[0]?.delta?.audio?.data\n if (base64)\n yield fromBase64(base64)\n }\n }\n }\n\n return {\n transcription: { transcribe, transcribeStream },\n synthesis: { synthesize, synthesizeStream, resolveSynthesisOutput },\n getCapabilities: () => MIMO_CAPABILITIES,\n }\n}\n\n/** MiMo 流式合成除 wav 外均输出 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format === 'wav' ? 'wav' : 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n// ─── 内部辅助 ───\n\n/** 构造 MiMo TTS 消息:风格指令放入 user 消息,待合成文本放入 assistant 消息 */\nfunction buildTtsMessages(text: string, instruction?: string): Array<{ role: string, content: string }> {\n const messages: Array<{ role: string, content: string }> = []\n if (instruction)\n messages.push({ role: 'user', content: instruction })\n messages.push({ role: 'assistant', content: text })\n return messages\n}\n\n/** 发送 Chat Completions 请求(Authorization Bearer) */\nfunction postChat(baseUrl: string, apiKey: string | undefined, body: Record<string, unknown>, signal: AbortSignal): Promise<Response> {\n const url = `${baseUrl.replace(/\\/$/, '')}/chat/completions`\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (apiKey)\n headers.Authorization = `Bearer ${apiKey}`\n return fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal,\n })\n}\n\n/** 迭代 SSE 响应,逐个产出解析后的 MiMo 数据块(`[DONE]` 结束) */\nasync function* readChunks(response: Response, signal?: AbortSignal): AsyncIterable<MimoChunk> {\n for await (const event of readSSEStream(response, signal)) {\n if (event.data === '[DONE]')\n return\n if (!event.data)\n continue\n let chunk: MimoChunk\n try {\n chunk = JSON.parse(event.data) as MimoChunk\n }\n catch {\n // 忽略无法解析的心跳/空行。\n continue\n }\n yield chunk\n }\n}\n","/**\n * @h-ai/ai — Audio Provider: OpenAI 实现\n *\n * 基于 OpenAI Audio API(transcriptions / speech)实现完整与流式的语音识别、语音合成。\n * OpenAI 标准 Audio API 不支持持续音频输入的实时识别,故 `transcribeStream` 传入\n * `AudioInputStream` 时明确返回不支持,不将整段音频缓冲后伪装为实时识别。\n * @internal\n * @module audio/providers/ai-audio-provider-openai\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AudioContent, AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { Buffer } from 'node:buffer'\nimport { core, err, ok } from '@h-ai/core'\nimport OpenAI, { toFile } from 'openai'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { audioError, errorMessage, streamSentences, toAudioErrorResult, toAudioUploadPart } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-openai' })\n\n/** OpenAI 平台能力:HTTP 文件识别(非实时)+ HTTP 流式合成(不原生接收增量文本,框架内句子分段) */\nconst OPENAI_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: false, speechBoundaryEvents: false, streamingTranscriptOutput: false },\n synthesize: { supported: true, incrementalTextInput: false, streamingAudioOutput: true },\n}\n\n/** 我方音频格式 → OpenAI speech response_format */\nconst OPENAI_SPEECH_FORMAT: Record<AudioFormat, 'pcm' | 'wav' | 'mp3' | 'opus'> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'opus',\n}\n\n/**\n * 创建 OpenAI Audio Provider\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function invoke(request: ProviderSynthesisRequest) {\n * const provider = createOpenAIAudioProvider()\n * if (!provider.synthesis) throw new Error('Audio operation is unavailable')\n * const result = await provider.synthesis.synthesize(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createOpenAIAudioProvider(): AudioProvider {\n function createClient(apiKey: string, baseUrl: string, timeout: number): OpenAI {\n return new OpenAI({ apiKey, baseURL: baseUrl, timeout })\n }\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n const { model, audio, language, contextHints, signal } = request\n if (!model.apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n try {\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const file = await toUploadFile(audio)\n const result = await client.audio.transcriptions.create({\n file,\n model: model.model,\n language,\n ...(contextHints?.length ? { prompt: contextHints.join(', ') } : {}),\n }, { signal })\n return ok({ text: result.text })\n }\n catch (error) {\n logger.debug('OpenAI transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, contextHints, signal } = request\n if (!model.apiKey)\n throw audioError(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n // OpenAI 标准 Audio API 仅支持完整音频文件,不支持持续音频输入的实时识别\n if ('chunks' in audio) {\n throw audioError(\n HaiAIError.AUDIO_UNSUPPORTED_INPUT,\n aiM('ai_audioUnsupportedInput', { params: { provider: 'openai', reason: 'streaming audio input' } }),\n )\n }\n\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const file = await toUploadFile(audio)\n const stream = await client.audio.transcriptions.create({\n file,\n model: model.model,\n language,\n stream: true,\n ...(contextHints?.length ? { prompt: contextHints.join(', ') } : {}),\n }, { signal })\n\n let text = ''\n for await (const event of stream) {\n if (event.type === 'transcript.text.delta') {\n text += event.delta\n yield { type: 'transcript', text, final: false }\n }\n else if (event.type === 'transcript.text.done') {\n yield { type: 'transcript', text: event.text, final: true }\n }\n }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n if (!model.apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const response = await client.audio.speech.create({\n model: model.model,\n voice: voice ?? 'alloy',\n input: text,\n response_format: OPENAI_SPEECH_FORMAT[out.format],\n ...(instruction ? { instructions: instruction } : {}),\n }, { signal })\n const data = new Uint8Array(await response.arrayBuffer())\n return ok({ data, format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('OpenAI synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, signal } = request\n if (!model.apiKey)\n throw audioError(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n const outFormat = resolveSynthesisOutput({ format }).format\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n\n // OpenAI TTS 不原生接收增量文本:字符串一次合成;持续文本流按句子分段逐句合成,降低首音延迟\n const segments = typeof text === 'string' ? [text] : streamSentences(text)\n for await (const segment of segments) {\n if (!segment)\n continue\n const response = await client.audio.speech.create({\n model: model.model,\n voice: voice ?? 'alloy',\n input: segment,\n response_format: OPENAI_SPEECH_FORMAT[outFormat],\n ...(instruction ? { instructions: instruction } : {}),\n }, { signal })\n\n const body = response.body\n if (!body) {\n yield new Uint8Array(await response.arrayBuffer())\n continue\n }\n const reader = body.getReader()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n if (value)\n yield value\n }\n }\n finally {\n reader.releaseLock()\n }\n }\n }\n\n return {\n transcription: { transcribe, transcribeStream },\n synthesis: { synthesize, synthesizeStream, resolveSynthesisOutput },\n getCapabilities: () => OPENAI_CAPABILITIES,\n }\n}\n\n/** OpenAI 未指定格式时默认 mp3;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format = request.format ?? 'mp3'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n/** 构造上传文件:裸 pcm16 先封装为 WAV 容器,其余按真实格式生成文件名(OpenAI 文件接口依据扩展名识别容器) */\nasync function toUploadFile(audio: AudioContent): Promise<Awaited<ReturnType<typeof toFile>>> {\n const part = toAudioUploadPart(audio)\n return toFile(Buffer.from(part.data), part.filename)\n}\n","/**\n * @h-ai/ai — Audio Provider: Qwen(阿里云百炼)实现\n *\n * 基于 DashScope Realtime WebSocket 协议实现实时语音识别与语音合成。\n * Provider 内部负责 Session、Buffer、Commit 等协议事件,公共 API 不暴露这些概念:\n * - ASR(`qwen3-asr-flash-realtime`):完整音频用 Manual 模式,持续音频输入用 VAD 模式。\n * - TTS(`qwen3-tts-flash-realtime`):完整文本用 Commit 模式,持续文本输入用 ServerCommit 模式。\n * @internal\n * @module audio/providers/ai-audio-provider-qwen\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ResolvedAudioModel } from '../../ai-config.js'\n\nimport type { AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n AudioWsConnection,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { core, ok } from '@h-ai/core'\nimport { nanoid } from 'nanoid'\nimport { concatChunks, errorMessage, fromBase64, openAudioWebSocket, toAudioErrorResult, toBase64 } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-qwen' })\n\n/** Qwen 实时平台能力:WebSocket 实时识别(含服务端 VAD)+ 实时合成(支持增量文本输入) */\nconst QWEN_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: true, speechBoundaryEvents: true, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: true, streamingAudioOutput: true },\n}\n\n/** 我方音频格式 → Qwen input_audio_format / response_format */\nconst QWEN_FORMAT: Record<AudioFormat, string> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'opus',\n}\n\n/**\n * Qwen 服务端事件(仅取本模块关心的字段,字段名做防御性兼容)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const event: QwenServerEvent = { type: 'conversation.item.input_audio_transcription.completed', transcript: '你好' }\n * const text = event.transcript ?? event.text ?? ''\n * ```\n */\ninterface QwenServerEvent {\n type?: string\n text?: string\n transcript?: string\n delta?: string\n audio?: string\n transcription?: { text?: string, transcript?: string }\n}\n/**\n * 创建 Qwen Audio Provider\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function invoke(request: ProviderTranscriptionRequest) {\n * const provider = createQwenAudioProvider()\n * if (!provider.transcription) throw new Error('Audio operation is unavailable')\n * const result = await provider.transcription.transcribe(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createQwenAudioProvider(): AudioProvider {\n function connect(model: ResolvedAudioModel, signal?: AbortSignal): Promise<AudioWsConnection> {\n const url = `${model.baseUrl}?model=${encodeURIComponent(model.model)}`\n const headers: Record<string, string> = {}\n if (model.apiKey)\n headers.Authorization = `Bearer ${model.apiKey}`\n if (model.workspaceId)\n headers['X-DashScope-WorkSpace'] = model.workspaceId\n return openAudioWebSocket(url, headers, { signal, timeout: model.timeout })\n }\n\n function newEventId(): string {\n return `event_${nanoid()}`\n }\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n try {\n let finalText = ''\n for await (const event of transcribeStream({ model: request.model, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })) {\n if (event.type === 'transcript' && event.final)\n finalText = finalText ? `${finalText}${event.text}` : event.text\n }\n return ok({ text: finalText })\n }\n catch (error) {\n logger.debug('Qwen transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, signal } = request\n const isStreamInput = 'chunks' in audio\n const format = audio.format\n const sampleRate = audio.sampleRate\n\n const conn = await connect(model, signal)\n try {\n // 会话配置:持续音频输入用服务端 VAD 断句;完整音频用 Manual 模式(手动 commit)\n conn.send(JSON.stringify({\n event_id: newEventId(),\n type: 'session.update',\n session: {\n input_audio_format: QWEN_FORMAT[format],\n sample_rate: sampleRate ?? 16000,\n input_audio_transcription: language ? { language } : {},\n turn_detection: isStreamInput ? { type: 'server_vad' } : null,\n },\n }))\n\n // 音频发送:持续输入边到边送,完整音频一次送出后手动 commit\n const sendAudio = (async () => {\n if ('chunks' in audio) {\n for await (const part of audio.chunks)\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.append', audio: toBase64(part) }))\n }\n else {\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.append', audio: toBase64(audio.data) }))\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.commit' }))\n }\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'session.finish' }))\n })()\n // 发送失败不阻塞读取循环,读取结束后再统一 surface\n let sendError: unknown\n sendAudio.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = parseEvent(message.text)\n switch (event.type) {\n case 'input_audio_buffer.speech_started':\n yield { type: 'speech_started' }\n break\n case 'input_audio_buffer.speech_stopped':\n yield { type: 'speech_stopped' }\n break\n case 'conversation.item.input_audio_transcription.text': {\n const text = event.text ?? event.transcript ?? event.transcription?.text ?? event.delta\n if (text)\n yield { type: 'transcript', text, final: false }\n break\n }\n case 'conversation.item.input_audio_transcription.completed': {\n const text = event.transcript ?? event.text ?? event.transcription?.transcript ?? event.transcription?.text\n if (text)\n yield { type: 'transcript', text, final: true }\n break\n }\n case 'session.finished':\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { format, sampleRate } = request\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const chunks: Uint8Array[] = []\n for await (const audio of synthesizeStream({ model: request.model, text: request.text, voice: request.voice, instruction: request.instruction, format: out.format, sampleRate, signal: request.signal }))\n chunks.push(audio)\n return ok({ data: concatChunks(chunks), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('Qwen synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n const isStreamInput = typeof text !== 'string'\n const outFormat = resolveSynthesisOutput({ format }).format\n\n const conn = await connect(model, signal)\n try {\n conn.send(JSON.stringify({\n event_id: newEventId(),\n type: 'session.update',\n session: {\n voice: voice ?? 'Cherry',\n // 持续文本输入用 ServerCommit(服务端智能分段,低时延);完整文本用 Commit\n mode: isStreamInput ? 'server_commit' : 'commit',\n response_format: QWEN_FORMAT[outFormat],\n sample_rate: sampleRate ?? 24000,\n ...(instruction ? { instructions: instruction } : {}),\n },\n }))\n\n const sendText = (async () => {\n if (typeof text === 'string') {\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.append', text }))\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.commit' }))\n }\n else {\n for await (const part of text)\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.append', text: part }))\n }\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'session.finish' }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = parseEvent(message.text)\n if (event.type === 'response.audio.delta') {\n const base64 = event.audio ?? event.delta\n if (base64)\n yield fromBase64(base64)\n }\n else if (event.type === 'session.finished') {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n return {\n transcription: { transcribe, transcribeStream },\n synthesis: { synthesize, synthesizeStream, resolveSynthesisOutput },\n getCapabilities: () => QWEN_CAPABILITIES,\n }\n}\n\n/** Qwen 未指定格式时默认 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format ?? 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n/** 解析服务端 JSON 事件(解析失败返回空对象,交由调用方忽略) */\nfunction parseEvent(text: string): QwenServerEvent {\n try {\n return JSON.parse(text) as QwenServerEvent\n }\n catch {\n return {}\n }\n}\n","/**\n * @h-ai/ai — Audio Provider: Whisper 实现\n *\n * 适配 hai-framework Whisper Service 协议(`POST /v1/audio/transcriptions`,multipart/form-data)。\n * `whisper` 表示协议,而非部署位置:可连接本地、内网或云端任意实现该协议的 Endpoint。\n * 首期仅支持完整文件识别,不实现原生流式(持续音频输入由 Framework 层拒绝)。\n * @internal\n * @module audio/providers/ai-audio-provider-whisper\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AudioModelCapabilities, TranscriptionResult, TranscriptionSegment, TranscriptionWord } from '../ai-audio-types.js'\nimport type { AudioProvider, ProviderTranscriptionRequest } from './ai-audio-provider.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { combineSignal, describeHttpError, errorMessage, toAudioBlob, toAudioErrorResult, toAudioUploadPart } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-whisper' })\n\n/** faster-whisper-large-v3 能力:完整文件识别 + 语言检测 + 段/词时间戳 + VAD(无实时输入 / 无原生流式输出) */\nconst WHISPER_CAPABILITIES: AudioModelCapabilities = {\n transcribe: {\n supported: true,\n realtimeAudioInput: false,\n speechBoundaryEvents: false,\n streamingTranscriptOutput: false,\n languageHint: true,\n languageDetection: true,\n segmentTimestamps: true,\n wordTimestamps: true,\n contextHints: true,\n vad: true,\n speakerDiarization: false,\n },\n}\n\n/**\n * Whisper Service 词级结果(毫秒整数时间轴)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const word: WhisperWord = { text: '你好', startMs: 0, endMs: 400 }\n * const durationMs = (word.endMs ?? 0) - (word.startMs ?? 0)\n * ```\n */\ninterface WhisperWord {\n text?: string\n startMs?: number\n endMs?: number\n confidence?: number\n}\n\n/**\n * Whisper Service 分段结果\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const segment: WhisperSegment = { id: 1, text: '你好', startMs: 0, endMs: 400, words: [{ text: '你好', startMs: 0, endMs: 400 }] }\n * const wordCount = segment.words?.length ?? 0\n * ```\n */\ninterface WhisperSegment {\n id?: string | number\n text?: string\n startMs?: number\n endMs?: number\n words?: WhisperWord[]\n}\n\n/**\n * Whisper Service 识别响应\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: WhisperResponse = { text: '你好', language: 'zh', durationMs: 400, segments: [{ text: '你好', startMs: 0, endMs: 400 }] }\n * const text = response.text ?? ''\n * ```\n */\ninterface WhisperResponse {\n text?: string\n language?: string\n durationMs?: number\n segments?: WhisperSegment[]\n}\n\n/**\n * 创建 Whisper Audio Provider(仅 ASR)\n *\n * @internal\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function invoke(request: ProviderTranscriptionRequest) {\n * const provider = createWhisperAudioProvider()\n * if (!provider.transcription) throw new Error('Audio operation is unavailable')\n * const result = await provider.transcription.transcribe(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createWhisperAudioProvider(): AudioProvider {\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n const { model, audio, language, contextHints, timestampGranularities, vad, signal } = request\n try {\n // 裸 pcm16 先封装为 WAV,其余按真实格式生成文件名 / MIME(文件型服务依据容器解析)\n const part = toAudioUploadPart(audio)\n const form = new FormData()\n form.append('file', toAudioBlob(part), part.filename)\n form.append('model', model.model)\n if (language)\n form.append('language', language)\n if (contextHints?.length)\n form.append('prompt', contextHints.join(', '))\n for (const granularity of timestampGranularities ?? [])\n form.append('timestamp_granularities', granularity)\n if (vad !== undefined)\n form.append('vad', String(vad))\n\n const headers: Record<string, string> = {}\n if (model.apiKey)\n headers.Authorization = `Bearer ${model.apiKey}`\n\n const response = await fetch(`${model.baseUrl.replace(/\\/$/, '')}/audio/transcriptions`, {\n method: 'POST',\n headers,\n body: form,\n signal: combineSignal(signal, model.timeout),\n })\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const body = await response.json() as WhisperResponse\n return ok(mapWhisperResponse(body))\n }\n catch (error) {\n logger.debug('Whisper transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n return {\n transcription: { transcribe },\n getCapabilities: () => WHISPER_CAPABILITIES,\n }\n}\n\n/** 将 Whisper Service 响应映射为公共 TranscriptionResult(Word Timestamp 统一存于 segments[].words) */\nfunction mapWhisperResponse(body: WhisperResponse): TranscriptionResult {\n const segments = body.segments?.map(mapWhisperSegment).filter((segment): segment is TranscriptionSegment => segment !== null)\n return {\n text: body.text ?? '',\n language: body.language,\n durationMs: body.durationMs,\n ...(segments?.length ? { segments } : {}),\n }\n}\n\n/** 映射单个分段;缺少必要时间轴的分段忽略 */\nfunction mapWhisperSegment(segment: WhisperSegment): TranscriptionSegment | null {\n if (typeof segment.startMs !== 'number' || typeof segment.endMs !== 'number')\n return null\n const words = segment.words?.map(mapWhisperWord).filter((word): word is TranscriptionWord => word !== null)\n return {\n ...(segment.id !== undefined ? { id: String(segment.id) } : {}),\n text: segment.text ?? '',\n startMs: segment.startMs,\n endMs: segment.endMs,\n ...(words?.length ? { words } : {}),\n }\n}\n\n/** 映射单个词;缺少必要时间轴的词忽略 */\nfunction mapWhisperWord(word: WhisperWord): TranscriptionWord | null {\n if (typeof word.startMs !== 'number' || typeof word.endMs !== 'number')\n return null\n return {\n text: word.text ?? '',\n startMs: word.startMs,\n endMs: word.endMs,\n ...(typeof word.confidence === 'number' ? { confidence: word.confidence } : {}),\n }\n}\n","/**\n * @h-ai/ai — Audio 子功能工厂\n *\n * 组装 `AudioOperations`:参数校验、模型解析、Provider 路由与调用。\n * Provider 惰性创建并缓存,未使用的平台不初始化客户端与连接。\n * @module audio/ai-audio-functions\n */\n\nimport type { HaiError, HaiResult } from '@h-ai/core'\nimport type { AIConfig, AudioConfig, AudioProviderName } from '../ai-config.js'\n\nimport type {\n AudioCapabilitiesRequest,\n AudioContent,\n AudioModelCapabilities,\n AudioOperations,\n SynthesisEvent,\n SynthesisOptions,\n SynthesisRequest,\n SynthesisResult,\n SynthesisStreamRequest,\n SynthesisTextSegment,\n TranscriptionEvent,\n TranscriptionOptions,\n TranscriptionRequest,\n TranscriptionResult,\n TranscriptionStreamRequest,\n} from './ai-audio-types.js'\nimport type { AudioProvider, AudioSynthesisProvider, AudioTranscriptionProvider, ProviderSynthesisStreamRequest, ProviderTranscriptionStreamRequest } from './providers/ai-audio-provider.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { AudioConfigSchema, ensureAudioCredential, resolveAudioModel } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createDoubaoAudioProvider } from './providers/ai-audio-provider-doubao.js'\nimport { createIndexTtsAudioProvider } from './providers/ai-audio-provider-indextts.js'\nimport { createMimoAudioProvider } from './providers/ai-audio-provider-mimo.js'\nimport { createOpenAIAudioProvider } from './providers/ai-audio-provider-openai.js'\nimport { createQwenAudioProvider } from './providers/ai-audio-provider-qwen.js'\nimport { createWhisperAudioProvider } from './providers/ai-audio-provider-whisper.js'\nimport { audioError, mapStreamError } from './providers/ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio' })\n\n/**\n * 创建 Audio 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @returns Audio 操作接口\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function speak(config: AIConfig) {\n * const audio = createAudioOperations(config)\n * const result = await audio.synthesize({ text: '欢迎使用', format: 'mp3' })\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createAudioOperations(config: AIConfig): AudioOperations {\n const audioConfig: AudioConfig = AudioConfigSchema.parse(config.audio ?? {})\n const providerCache = new Map<AudioProviderName, AudioProvider>()\n\n /** 惰性创建并缓存 Provider(未使用的平台不初始化) */\n function getProvider(name: AudioProviderName): AudioProvider {\n const cached = providerCache.get(name)\n if (cached)\n return cached\n const provider = createProvider(name)\n providerCache.set(name, provider)\n return provider\n }\n\n /** 校验完整音频大小,超过上限返回错误 */\n function guardAudioSize(audio: AudioContent): HaiError | null {\n if (audio.data.length > audioConfig.maxAudioBytes)\n return audioError(HaiAIError.AUDIO_INPUT_TOO_LARGE, aiM('ai_audioInputTooLarge', { params: { limit: audioConfig.maxAudioBytes } }))\n return null\n }\n\n /** 校验 TTS 参考音频大小(说话人 / 风格参考与主音频同样受 maxAudioBytes 保护) */\n function guardSynthesisReferences(options: SynthesisOptions): HaiError | null {\n if (options.speakerReference) {\n const e = guardAudioSize(options.speakerReference.audio)\n if (e)\n return e\n }\n if (options.styleReference) {\n const e = guardAudioSize(options.styleReference.audio)\n if (e)\n return e\n }\n return null\n }\n\n /** 组合请求取消信号与实时连接时长上限(P0-5:maxStreamDurationMs 生效) */\n function withStreamTimeout(signal: AbortSignal | undefined): AbortSignal {\n const timeout = AbortSignal.timeout(audioConfig.maxStreamDurationMs)\n return signal ? AbortSignal.any([signal, timeout]) : timeout\n }\n\n async function transcribe(request: TranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n if (!request.audio?.data?.length)\n return err(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty audio' } }))\n const sizeErr = guardAudioSize(request.audio)\n if (sizeErr)\n return { success: false, error: sizeErr }\n\n const resolved = resolveAudioModel(audioConfig, 'transcribe', request.model, config.llm.apiKey)\n if (!resolved.success)\n return resolved\n const provider = getProvider(resolved.data.provider)\n const transcription = provider.transcription\n if (!transcription)\n return err(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: resolved.data.provider, reason: 'transcription' } }))\n const credErr = ensureAudioCredential(resolved.data)\n if (credErr)\n return { success: false, error: credErr }\n if (request.strictCapabilities) {\n const capErr = checkTranscribeCapabilities(resolved.data.provider, request, provider.getCapabilities(resolved.data))\n if (capErr)\n return { success: false, error: capErr }\n }\n\n const startedAt = Date.now()\n const context = { provider: resolved.data.provider, model: resolved.data.model, audioBytes: request.audio.data.length }\n logger.debug('Audio transcription started', context)\n const result = await transcription.transcribe({ model: resolved.data, audio: request.audio, language: request.language, contextHints: request.contextHints, timestampGranularities: request.timestampGranularities, vad: request.vad, signal: request.signal })\n if (result.success)\n logger.info('Audio transcription completed', { ...context, durationMs: Date.now() - startedAt, textLength: result.data.text.length })\n else\n logger.warn('Audio transcription failed', { ...context, durationMs: Date.now() - startedAt, code: result.error.code, error: result.error.message })\n return result\n }\n\n async function* transcribeStream(request: TranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n if (!('chunks' in request.audio) && !request.audio.data?.length)\n throw audioError(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty audio' } }))\n if (!('chunks' in request.audio)) {\n const sizeErr = guardAudioSize(request.audio)\n if (sizeErr)\n throw sizeErr\n }\n\n const resolved = resolveAudioModel(audioConfig, 'transcribe', request.model, config.llm.apiKey)\n if (!resolved.success)\n throw resolved.error\n const provider = getProvider(resolved.data.provider)\n const transcription = provider.transcription\n if (!transcription)\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: resolved.data.provider, reason: 'transcription' } }))\n const credErr = ensureAudioCredential(resolved.data)\n if (credErr)\n throw credErr\n if (request.strictCapabilities) {\n const capErr = checkTranscribeCapabilities(resolved.data.provider, request, provider.getCapabilities(resolved.data))\n if (capErr)\n throw capErr\n }\n\n const startedAt = Date.now()\n const context = { provider: resolved.data.provider, model: resolved.data.model }\n logger.debug('Audio transcription stream started', context)\n const signal = withStreamTimeout(request.signal)\n try {\n yield* transcribeStreamOrFallback(transcription, { model: resolved.data, audio: request.audio, language: request.language, contextHints: request.contextHints, timestampGranularities: request.timestampGranularities, vad: request.vad, signal })\n logger.info('Audio transcription stream completed', { ...context, durationMs: Date.now() - startedAt })\n }\n catch (error) {\n logger.warn('Audio transcription stream failed', { ...context, durationMs: Date.now() - startedAt, error })\n throw mapStreamError(error, signal)\n }\n }\n\n async function synthesize(request: SynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n if (!request.text)\n return err(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty text' } }))\n const validErr = validateSynthesisRequest(request)\n if (validErr)\n return { success: false, error: validErr }\n const refErr = guardSynthesisReferences(request)\n if (refErr)\n return { success: false, error: refErr }\n\n const resolved = resolveAudioModel(audioConfig, 'synthesize', request.model, config.llm.apiKey)\n if (!resolved.success)\n return resolved\n const provider = getProvider(resolved.data.provider)\n const synthesis = provider.synthesis\n if (!synthesis)\n return err(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: resolved.data.provider, reason: 'synthesis' } }))\n const credErr = ensureAudioCredential(resolved.data)\n if (credErr)\n return { success: false, error: credErr }\n if (request.strictCapabilities) {\n const capErr = checkSynthesizeCapabilities(resolved.data.provider, request, provider.getCapabilities(resolved.data))\n if (capErr)\n return { success: false, error: capErr }\n }\n\n const startedAt = Date.now()\n const context = { provider: resolved.data.provider, model: resolved.data.model, textLength: request.text.length, voice: request.voice }\n logger.debug('Audio synthesis started', context)\n const result = await synthesis.synthesize({ model: resolved.data, text: request.text, language: request.language, voice: request.voice, speakerReference: request.speakerReference, styleReference: request.styleReference, styleStrength: request.styleStrength, instruction: request.instruction, speed: request.speed, targetDurationMs: request.targetDurationMs, durationToleranceMs: request.durationToleranceMs, format: request.format, sampleRate: request.sampleRate, signal: request.signal })\n if (result.success)\n logger.info('Audio synthesis completed', { ...context, durationMs: Date.now() - startedAt, audioBytes: result.data.data.length, format: result.data.format })\n else\n logger.warn('Audio synthesis failed', { ...context, durationMs: Date.now() - startedAt, code: result.error.code, error: result.error.message })\n return result\n }\n\n async function* synthesizeStream(request: SynthesisStreamRequest): AsyncIterable<SynthesisEvent> {\n const validErr = validateSynthesisRequest(request)\n if (validErr)\n throw validErr\n const refErr = guardSynthesisReferences(request)\n if (refErr)\n throw refErr\n\n const resolved = resolveAudioModel(audioConfig, 'synthesize', request.model, config.llm.apiKey)\n if (!resolved.success)\n throw resolved.error\n const provider = getProvider(resolved.data.provider)\n const synthesis = provider.synthesis\n if (!synthesis)\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: resolved.data.provider, reason: 'synthesis' } }))\n const credErr = ensureAudioCredential(resolved.data)\n if (credErr)\n throw credErr\n if (request.strictCapabilities) {\n const capErr = checkSynthesizeCapabilities(resolved.data.provider, request, provider.getCapabilities(resolved.data))\n if (capErr)\n throw capErr\n }\n\n const startedAt = Date.now()\n const context = { provider: resolved.data.provider, model: resolved.data.model, voice: request.voice }\n logger.debug('Audio synthesis stream started', context)\n const signal = withStreamTimeout(request.signal)\n // 由 Provider 依据自身默认规则解析真实输出格式,供 segment_started 标注(不由调用方猜测)\n const output = synthesis.resolveSynthesisOutput({ format: request.format, sampleRate: request.sampleRate })\n try {\n const segments = isSynthesisTextSegment(request.text) ? singleSegment(request.text) : request.text\n for await (const segment of segments) {\n if (!segment.id || !segment.text)\n throw audioError(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty segment id or text' } }))\n yield { type: 'segment_started', segmentId: segment.id, text: segment.text, format: output.format, sampleRate: output.sampleRate, channels: output.channels }\n for await (const data of synthesizeSegmentAudio(synthesis, { model: resolved.data, text: segment.text, language: request.language, voice: request.voice, speakerReference: request.speakerReference, styleReference: request.styleReference, styleStrength: request.styleStrength, instruction: request.instruction, speed: request.speed, format: request.format, sampleRate: request.sampleRate, signal }))\n yield { type: 'audio', segmentId: segment.id, data }\n yield { type: 'segment_done', segmentId: segment.id }\n }\n logger.info('Audio synthesis stream completed', { ...context, durationMs: Date.now() - startedAt })\n }\n catch (error) {\n logger.warn('Audio synthesis stream failed', { ...context, durationMs: Date.now() - startedAt, error })\n throw mapStreamError(error, signal)\n }\n }\n\n /**\n * 查询模型能力声明(复用统一模型解析,不需凭据)\n */\n function getCapabilities(request: AudioCapabilitiesRequest): HaiResult<AudioModelCapabilities> {\n const resolved = resolveAudioModel(audioConfig, request.operation, request.model, config.llm.apiKey)\n if (!resolved.success)\n return resolved\n const capabilities = getProvider(resolved.data.provider).getCapabilities(resolved.data)\n return ok(request.operation === 'transcribe'\n ? { transcribe: capabilities.transcribe }\n : { synthesize: capabilities.synthesize })\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, getCapabilities }\n}\n\nfunction isSynthesisTextSegment(value: SynthesisStreamRequest['text']): value is SynthesisTextSegment {\n return typeof value === 'object' && value !== null && 'id' in value && 'text' in value\n}\n\nasync function* singleSegment(segment: SynthesisTextSegment): AsyncIterable<SynthesisTextSegment> {\n yield segment\n}\n\n/** 构造 `AUDIO_INVALID_REQUEST` 错误 */\nfunction invalidRequest(reason: string): HaiError {\n return audioError(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason } }))\n}\n\n/** 构造「模型不支持某能力」的 `AUDIO_UNSUPPORTED_INPUT` 错误 */\nfunction unsupportedCapability(provider: AudioProviderName, feature: string): HaiError {\n return audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider, reason: `${feature} not supported by this model` } }))\n}\n\n/** 校验 TTS 公共选项(风格强度 / 语速);识别与合成流式均复用 */\nfunction validateSynthesisOptions(options: SynthesisOptions): HaiError | null {\n if (options.styleStrength !== undefined && (options.styleStrength < 0 || options.styleStrength > 1))\n return invalidRequest('styleStrength must be between 0 and 1')\n if (options.styleStrength !== undefined && !options.styleReference)\n return invalidRequest('styleStrength requires styleReference')\n if (options.speed !== undefined && (!Number.isFinite(options.speed) || options.speed <= 0))\n return invalidRequest('speed must be greater than 0')\n return null\n}\n\n/** 校验完整 TTS 请求(公共选项 + 目标时长 / 容差 / 与语速冲突) */\nfunction validateSynthesisRequest(request: SynthesisRequest | SynthesisStreamRequest): HaiError | null {\n const base = validateSynthesisOptions(request)\n if (base)\n return base\n // targetDurationMs / durationToleranceMs 仅完整合成支持\n const targetDurationMs = 'targetDurationMs' in request ? request.targetDurationMs : undefined\n const durationToleranceMs = 'durationToleranceMs' in request ? request.durationToleranceMs : undefined\n if (targetDurationMs !== undefined && (!Number.isInteger(targetDurationMs) || targetDurationMs <= 0))\n return invalidRequest('targetDurationMs must be a positive integer')\n if (durationToleranceMs !== undefined && targetDurationMs === undefined)\n return invalidRequest('durationToleranceMs requires targetDurationMs')\n if (durationToleranceMs !== undefined && (!Number.isInteger(durationToleranceMs) || durationToleranceMs < 0))\n return invalidRequest('durationToleranceMs must be a non-negative integer')\n // 语速与固定目标时长是两个互斥的控制量\n if (request.speed !== undefined && targetDurationMs !== undefined)\n return invalidRequest('speed and targetDurationMs cannot be used together')\n return null\n}\n\n/** 严格能力校验:请求的高级 ASR 能力必须被模型支持,否则在调用 Provider 前失败 */\nfunction checkTranscribeCapabilities(provider: AudioProviderName, options: TranscriptionOptions, capabilities: AudioModelCapabilities): HaiError | null {\n const caps = capabilities.transcribe\n if (!caps?.supported)\n return unsupportedCapability(provider, 'transcription')\n if (options.timestampGranularities?.includes('word') && !caps.wordTimestamps)\n return unsupportedCapability(provider, 'word timestamps')\n if (options.timestampGranularities?.includes('segment') && !caps.segmentTimestamps)\n return unsupportedCapability(provider, 'segment timestamps')\n if (options.vad && !caps.vad)\n return unsupportedCapability(provider, 'vad')\n if (options.contextHints?.length && !caps.contextHints)\n return unsupportedCapability(provider, 'context hints')\n return null\n}\n\n/** 严格能力校验:请求的高级 TTS 能力必须被模型支持,否则在调用 Provider 前失败 */\nfunction checkSynthesizeCapabilities(provider: AudioProviderName, options: SynthesisOptions & { targetDurationMs?: number }, capabilities: AudioModelCapabilities): HaiError | null {\n const caps = capabilities.synthesize\n if (!caps?.supported)\n return unsupportedCapability(provider, 'synthesis')\n if (options.speakerReference && !caps.speakerReference)\n return unsupportedCapability(provider, 'speaker reference')\n if (options.styleReference && !caps.styleReference)\n return unsupportedCapability(provider, 'style reference')\n if (options.instruction && !caps.instruction)\n return unsupportedCapability(provider, 'instruction')\n if (options.speed !== undefined && !caps.speedControl)\n return unsupportedCapability(provider, 'speed control')\n if (options.targetDurationMs !== undefined && !caps.targetDuration)\n return unsupportedCapability(provider, 'target duration')\n return null\n}\n\n/**\n * 流式识别:优先原生流式,无则有限降级\n *\n * 完整音频→完整识别后产出最终结果;持续音频输入→拒绝(不伪装实时)。\n */\nasync function* transcribeStreamOrFallback(transcription: AudioTranscriptionProvider, request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n if (transcription.transcribeStream) {\n yield* transcription.transcribeStream(request)\n return\n }\n if ('chunks' in request.audio)\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: request.model.provider, reason: 'streaming audio input' } }))\n const result = await transcription.transcribe({ model: request.model, audio: request.audio, language: request.language, contextHints: request.contextHints, timestampGranularities: request.timestampGranularities, vad: request.vad, signal: request.signal })\n if (!result.success)\n throw result.error\n yield { type: 'transcript', text: result.data.text, final: true }\n}\n\n/**\n * 流式合成:优先原生流式,无则完整合成后一次性产出该段音频\n *\n * Capability 仍保持 `streamingAudioOutput=false`(API 可兼容 ≠ 模型具备原生实时能力)。\n */\nasync function* synthesizeSegmentAudio(synthesis: AudioSynthesisProvider, request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n if (synthesis.synthesizeStream) {\n yield* synthesis.synthesizeStream(request)\n return\n }\n const text = typeof request.text === 'string' ? request.text : await collectText(request.text)\n const result = await synthesis.synthesize({ model: request.model, text, language: request.language, voice: request.voice, speakerReference: request.speakerReference, styleReference: request.styleReference, styleStrength: request.styleStrength, instruction: request.instruction, speed: request.speed, format: request.format, sampleRate: request.sampleRate, signal: request.signal })\n if (!result.success)\n throw result.error\n yield result.data.data\n}\n\n/** 收集持续文本流为完整字符串(降级路径使用) */\nasync function collectText(stream: AsyncIterable<string>): Promise<string> {\n let text = ''\n for await (const part of stream)\n text += part\n return text\n}\n\n/** 按平台创建 Provider */\nfunction createProvider(name: AudioProviderName): AudioProvider {\n switch (name) {\n case 'openai':\n return createOpenAIAudioProvider()\n case 'mimo':\n return createMimoAudioProvider()\n case 'qwen':\n return createQwenAudioProvider()\n case 'doubao':\n return createDoubaoAudioProvider()\n case 'whisper':\n return createWhisperAudioProvider()\n case 'indextts':\n return createIndexTtsAudioProvider()\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' })\nconst CONVERSATION_SUMMARY_PREFIX = '[Conversation Summary]'\n/** 框架摘要的保留参与者名;不得改用 content 前缀识别,避免与调用方指令冲突。 */\nconst CONVERSATION_SUMMARY_NAME = 'hai_internal_conversation_summary_v1'\n\n/**\n * 压缩时不可拆分的消息组;工具调用与匹配的工具结果共同构成一个协议单元。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const unit: MessageProtocolUnit = [{ role: 'assistant', content: null, tool_calls: [{ id: 'call-1', type: 'function', function: { name: 'weather', arguments: '{\"city\":\"北京\"}' } }] }, { role: 'tool', tool_call_id: 'call-1', content: '晴' }]\n * const messageCount = unit.length // 此单元必须整体保留或移除。\n * ```\n */\ntype MessageProtocolUnit = ChatMessage[]\n\n/** 确保压缩操作只在结果确实满足调用方预算时返回成功。 */\nfunction completeCompression(result: CompressResult, maxTokens: number): HaiResult<CompressResult> {\n if (result.compressedTokens > maxTokens) {\n return err(\n HaiAIError.CONTEXT_BUDGET_EXCEEDED,\n aiM('ai_contextBudgetExceeded', {\n params: {\n tokens: result.compressedTokens,\n budget: maxTokens,\n },\n }),\n )\n }\n\n return ok(result)\n}\n\n/** 识别框架生成的可替换摘要,避免后续压缩把它当成永久 system 指令累积。 */\nfunction isGeneratedConversationSummary(message: ChatMessage): boolean {\n return message.role === 'system'\n && message.name === CONVERSATION_SUMMARY_NAME\n}\n\n/** 将永久 system 指令与可再次摘要的对话载荷分开。 */\nfunction partitionSummaryMessages(messages: ChatMessage[], preserveSystem: boolean): {\n systemMessages: ChatMessage[]\n conversationMessages: ChatMessage[]\n} {\n const isPreservedSystem = (message: ChatMessage): boolean => {\n return preserveSystem && message.role === 'system' && !isGeneratedConversationSummary(message)\n }\n return {\n systemMessages: messages.filter(isPreservedSystem),\n conversationMessages: messages.filter(message => !isPreservedSystem(message)),\n }\n}\n\n/**\n * 将非系统消息切分为不可拆分的协议单元\n *\n * 普通消息各自形成一个单元;包含 tool_calls 的 assistant 消息与其后连续、匹配的\n * tool 结果共同形成一个单元,避免压缩时产生孤立的工具调用或工具结果。\n *\n * @param messages - 待切分的非系统消息列表\n * @returns 保持原始顺序的消息协议单元列表\n */\nfunction unitizeNonSystemMessages(messages: ChatMessage[]): MessageProtocolUnit[] {\n const units: MessageProtocolUnit[] = []\n\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index]\n if (message?.role !== 'assistant' || !message.tool_calls?.length) {\n if (message) {\n units.push([message])\n }\n continue\n }\n\n const toolCallIds = new Set(message.tool_calls.map(toolCall => toolCall.id))\n const unit: ChatMessage[] = [message]\n let nextIndex = index + 1\n while (nextIndex < messages.length) {\n const nextMessage = messages[nextIndex]\n if (nextMessage?.role !== 'tool' || !toolCallIds.has(nextMessage.tool_call_id)) {\n break\n }\n unit.push(nextMessage)\n nextIndex += 1\n }\n units.push(unit)\n index = nextIndex - 1\n }\n\n return units\n}\n\n/**\n * 将消息协议单元还原为连续消息列表\n *\n * @param units - 保持原始顺序的消息协议单元列表\n * @returns 按单元与单元内顺序展开的消息列表\n */\nfunction flattenUnits(units: MessageProtocolUnit[]): ChatMessage[] {\n return units.flatMap(unit => unit)\n}\n\n/**\n * 划分可移除前缀与受保护尾部\n *\n * preserveLastN 表示至少保留的消息数量;包含最新 user 的协议尾部始终受保护。\n * 若数量边界落在工具协议单元内部,则保留整个单元。\n *\n * @param messages - 待划分的非系统消息列表\n * @param preserveLastN - 至少保留的尾部消息数量\n * @returns 可移除协议单元与受保护协议单元\n */\nfunction splitProtectedSuffix(messages: ChatMessage[], preserveLastN: number): {\n removableUnits: MessageProtocolUnit[]\n protectedUnits: MessageProtocolUnit[]\n} {\n const units = unitizeNonSystemMessages(messages)\n let protectedStart = units.length\n let protectedMessageCount = 0\n const requiredMessageCount = Math.max(0, preserveLastN)\n\n while (protectedStart > 0 && protectedMessageCount < requiredMessageCount) {\n protectedStart -= 1\n protectedMessageCount += units[protectedStart]?.length ?? 0\n }\n\n let latestUserUnitIndex = -1\n for (let index = units.length - 1; index >= 0; index -= 1) {\n if (units[index]?.some(message => message.role === 'user')) {\n latestUserUnitIndex = index\n break\n }\n }\n if (latestUserUnitIndex >= 0) {\n protectedStart = Math.min(protectedStart, latestUserUnitIndex)\n }\n\n return {\n removableUnits: units.slice(0, protectedStart),\n protectedUnits: units.slice(protectedStart),\n }\n}\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function compress(config: CompressConfig, token: TokenOperations, summary: SummaryOperations) {\n * const operations = createCompressOperations(config, token, summary, 8192)\n * const result = await operations.tryCompress([{ role: 'user', content: '项目介绍' }], { maxTokens: 1000, strategy: 'sliding-window' })\n * if (!result.success) return result\n * return result.data.messages\n * }\n * ```\n */\nexport function createCompressOperations(\n config: CompressConfig,\n token: TokenOperations,\n summary: SummaryOperations,\n modelMaxTokens: number,\n): CompressOperations {\n /**\n * 计算有效的 maxTokens\n *\n * @param optionMaxTokens - 单次压缩显式指定的 Token 上限\n * @returns 本次压缩使用的 Token 上限\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 * 从受保护尾部开始,按完整协议单元向前扩展窗口。受保护消息自身超过预算时仍原样保留,\n * 最终由 tryCompress 返回显式预算错误,禁止静默丢弃当前用户输入或谎报成功。\n *\n * @param messages - 待压缩的完整消息列表\n * @param maxTokens - 压缩后的 Token 预算\n * @param preserveSystem - 是否无条件保留 system 消息\n * @param preserveLastN - 至少保留的尾部非系统消息数量\n * @returns 压缩后的消息列表与移除消息数量\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 { removableUnits, protectedUnits } = splitProtectedSuffix(nonSystemMessages, preserveLastN)\n const emptyMessageTokens = token.estimateMessages([])\n const estimateUnitTokens = (unit: MessageProtocolUnit): number => {\n return Math.max(0, token.estimateMessages(unit) - emptyMessageTokens)\n }\n let retainedTokens = token.estimateMessages(systemMessages)\n + protectedUnits.reduce((total, unit) => total + estimateUnitTokens(unit), 0)\n let retainedStart = removableUnits.length\n let retainedUnits = [...protectedUnits]\n let finalMessages = [...systemMessages, ...flattenUnits(retainedUnits)]\n\n // 受保护尾部即使自身超过预算也不能静默丢弃;调用方可据 compressedTokens 作显式处理。\n if (retainedTokens > maxTokens) {\n return {\n messages: finalMessages,\n removedCount: flattenUnits(removableUnits).length,\n }\n }\n\n // 按完整协议单元从后向前扩展连续窗口。\n for (let index = removableUnits.length - 1; index >= 0; index -= 1) {\n const unit = removableUnits[index]\n if (!unit) {\n continue\n }\n const unitTokens = estimateUnitTokens(unit)\n if (retainedTokens + unitTokens > maxTokens) {\n break\n }\n retainedTokens += unitTokens\n retainedStart = index\n }\n\n retainedUnits = [...removableUnits.slice(retainedStart), ...protectedUnits]\n finalMessages = [...systemMessages, ...flattenUnits(retainedUnits)]\n\n return {\n messages: finalMessages,\n removedCount: nonSystemMessages.length - flattenUnits(retainedUnits).length,\n }\n }\n\n /**\n * 压缩消息列表\n *\n * @param messages - 待压缩的完整消息列表\n * @param options - 本次压缩策略与预算选项\n * @returns 包含压缩消息、Token 统计与移除数量的 HaiResult\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 completeCompression({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount,\n }, maxTokens)\n }\n\n if (strategy === 'summary') {\n const { systemMessages, conversationMessages } = partitionSummaryMessages(messages, preserveSystem)\n const { removableUnits, protectedUnits } = splitProtectedSuffix(conversationMessages, preserveLastN)\n const preserved = flattenUnits(protectedUnits)\n const toSummarize = flattenUnits(removableUnits)\n\n if (toSummarize.length === 0) {\n return completeCompression({\n messages: [...messages],\n originalTokens,\n compressedTokens: originalTokens,\n removedCount: 0,\n }, maxTokens)\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 name: CONVERSATION_SUMMARY_NAME,\n content: `${CONVERSATION_SUMMARY_PREFIX}\\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 completeCompression({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n }, maxTokens)\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 completeCompression({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n }, maxTokens)\n }\n\n // 滑动窗口不够,对被移除的部分生成摘要\n const { systemMessages, conversationMessages } = partitionSummaryMessages(messages, preserveSystem)\n const { removableUnits, protectedUnits } = splitProtectedSuffix(conversationMessages, preserveLastN)\n const preservedMessages = flattenUnits(protectedUnits)\n const toSummarize = flattenUnits(removableUnits)\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 name: CONVERSATION_SUMMARY_NAME,\n content: `${CONVERSATION_SUMMARY_PREFIX}\\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 completeCompression({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n }, maxTokens)\n }\n\n return completeCompression({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n }, maxTokens)\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 — 会话存储键\n *\n * 提供 LLM / Context / SessionStore 共用的复合存储键构造,确保不同交互主体\n * 使用相同 sessionId 时不会在会话目录(SessionInfo)与上下文正文上互相覆盖。\n * @module store/ai-store-key\n */\n\nimport type { InteractionScope } from './ai-store-types.js'\n\n/**\n * 构造会话存储的复合主键\n *\n * 用 JSON 数组序列化 `[objectId, sessionId]`,避免朴素拼接 `${objectId}:${sessionId}`\n * 在 id 本身含分隔符时产生碰撞(如 `a` + `b:c` 与 `a:b` + `c` 得到同一键),\n * 也避免不同主体相同 sessionId 因裸 sessionId 作主键而互相覆盖。\n *\n * LLM、Context 与 SessionStore 必须共用此实现。\n *\n * @param scope - 交互作用域(主体 ID + 会话 ID)\n * @returns 复合存储键\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const first = sessionStoreKey({ objectId: 'user:a', sessionId: 'b' })\n * const second = sessionStoreKey({ objectId: 'user', sessionId: 'a:b' })\n * if (first === second) throw new Error('Scope key collision')\n * ```\n */\nexport function sessionStoreKey(scope: InteractionScope): string {\n return JSON.stringify([scope.objectId, scope.sessionId])\n}\n","/** 共享会话目录的版本化更新,供 LLM 记录与 Context 共用。 @module ai-store-session */\nimport type { AIRelStore, InteractionScope, SessionInfo } from './ai-store-types.js'\nimport { sessionStoreKey } from './ai-store-key.js'\n\n/**\n * 条件更新目录;冲突后重读,保留并发重命名与永久删除标记。\n * @param store - 会话目录 Store\n * @param scope - 主体和会话\n * @param change - 由最新记录计算新值;undefined 表示不写入\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function touch(store: AIRelStore<SessionInfo>, scope: InteractionScope) {\n * await updateSessionInfo(store, scope, (current, now) => {\n * if (current?.deleted) return undefined\n * return { ...current, ...scope, createdAt: current?.createdAt ?? now, updatedAt: now }\n * })\n * }\n * ```\n */\nexport async function updateSessionInfo(\n store: AIRelStore<SessionInfo>,\n scope: InteractionScope,\n change: (existing: SessionInfo | undefined, now: number) => SessionInfo | undefined,\n): Promise<void> {\n const index = { objectId: scope.objectId, sessionId: scope.sessionId }\n const key = sessionStoreKey(index)\n for (let attempt = 0; attempt < 64; attempt++) {\n const current = await store.readVersioned(key)\n const next = change(current?.data, await store.currentTime())\n if (!next)\n return\n if (await store.compareAndSwap(key, { expectedVersion: current?.version, data: next, scope: index }) !== undefined)\n return\n }\n throw new Error('Session directory changed too frequently')\n}\n","/**\n * 共享上下文聚合状态。所有业务写入必须通过版本 CAS,租约仅用于发现失联生成。\n * @module ai-context-state\n */\nimport type { HaiErrorDef } from '@h-ai/core'\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { AIRelStore, InteractionScope } from '../store/ai-store-types.js'\nimport type { SummaryResult } from '../summary/ai-summary-types.js'\nimport type { ConversationTurn } from './ai-context-types.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { sessionStoreKey } from '../store/ai-store-key.js'\n\n/**\n * 生成所有权;pending 没有超时,必须由业务确认实际表达内容。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const generation: ContextGeneration = { epoch: crypto.randomUUID(), id: crypto.randomUUID(), owner: crypto.randomUUID(), phase: 'generating', expiresAt: 30_000, userMessage: '你好' }\n * const owner = generation.owner\n * ```\n */\nexport interface ContextGeneration {\n /** 获取许可时的上下文纪元,reset 后旧 producer 不可复用。 */\n epoch: string\n /** 全局唯一轮次 ID。 */\n id: string\n /** 每次获取生成许可的不可复用 owner。 */\n owner: string\n /** generating 需要租约;pending 可由任意节点提交。 */\n phase: 'generating' | 'pending'\n /** 存储端时钟的截止时间,Unix 毫秒。 */\n expiresAt: number\n /** 与实际回复配对的用户输入。 */\n userMessage: string\n}\n\n/**\n * 一条记录原子保存消息、摘要、轮次和待提交状态,避免恢复时跨记录拼接。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const state: PersistedContextState = { scope: { objectId: 'user-1', sessionId: 'session-1' }, messages: [], summaries: [], turns: [], epoch: crypto.randomUUID(), updatedAt: 0 }\n * const scope = structuredClone(state.scope)\n * ```\n */\nexport interface PersistedContextState {\n /** 作用域副本用于批量目录过滤,不从客户端消息推导身份。 */\n scope: InteractionScope\n /** 已提交消息。 */\n messages: ChatMessage[]\n /** 历次压缩摘要。 */\n summaries: SummaryResult[]\n /** 生成与实际提交记录。 */\n turns: ConversationTurn[]\n /** reset 更换纪元,旧 producer 无法回写。 */\n epoch: string\n /** 当前生成或待提交轮次。 */\n active?: ContextGeneration\n /** 永久删除墓碑;相同 scope 不再复用。 */\n deleted?: boolean\n /** 存储端更新时间,Unix 毫秒。 */\n updatedAt: number\n}\n\n/**\n * 内部流程异常由公开 HaiResult 边界转换;流式接口继续以异常终止。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const failure = new ContextStateError(HaiAIError.CONTEXT_BUSY, 'Context busy')\n * const definition = failure.definition\n * ```\n */\nexport class ContextStateError extends Error {\n readonly code: HaiErrorDef['code']\n\n constructor(readonly definition: HaiErrorDef, message: string) {\n super(message)\n this.code = definition.code\n }\n}\n\n/**\n * 一次候选变更;期限在最终 SQL 中检查。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const readonlyResult: StateChange<number> = { value: 2, write: false }\n * const committedCount = readonlyResult.value\n * ```\n */\ninterface StateChange<T> {\n /** CAS 成功后交给调用方的业务结果。 */\n value: T\n /** 最终写入的存储端截止时间。 */\n notAfter?: number\n /** false 表示幂等只读结果,不更换版本。 */\n write?: false\n}\n\n/**\n * 创建作用域内共享状态访问器;冲突后重新读取并重算,绝不保存旧快照。\n * @param store - 支持原子版本及存储端时钟的持久化 Store\n * @param scope - 明确的主体与会话\n * @param initial - 仅在记录不存在时使用的初始状态\n * @param receive - 成功读取/提交后更新管理器的只读快照\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function readScope(store: AIRelStore<PersistedContextState>, scope: InteractionScope) {\n * const initial: PersistedContextState = { scope, messages: [], summaries: [], turns: [], epoch: crypto.randomUUID(), updatedAt: 0 }\n * let snapshot = structuredClone(initial)\n * const access = createContextStateAccess(store, scope, initial, current => { snapshot = current })\n * await access.read()\n * return snapshot\n * }\n * ```\n */\nexport function createContextStateAccess(\n store: AIRelStore<PersistedContextState>,\n scope: InteractionScope,\n initial: PersistedContextState,\n receive: (state: PersistedContextState) => void,\n) {\n const key = sessionStoreKey(scope)\n return {\n async read(): Promise<PersistedContextState> {\n const record = await store.readVersioned(key)\n const state = record?.data ?? structuredClone(initial)\n receive(structuredClone(state))\n return state\n },\n async mutate<T>(\n change: (state: PersistedContextState, now: number) => Promise<StateChange<T>> | StateChange<T>,\n allowDeleted = false,\n ): Promise<T> {\n for (let attempt = 0; attempt < 64; attempt++) {\n const record = await store.readVersioned(key)\n const state = record?.data ?? structuredClone(initial)\n if (state.deleted && !allowDeleted)\n throw new ContextStateError(HaiAIError.SESSION_FAILED, 'Context has been deleted')\n const now = await store.currentTime()\n const result = await change(state, now)\n if (result.write === false) {\n receive(structuredClone(state))\n return result.value\n }\n state.updatedAt = now\n const version = await store.compareAndSwap(key, {\n expectedVersion: record?.version,\n data: state,\n scope,\n notAfter: result.notAfter,\n })\n if (version !== undefined) {\n receive(structuredClone(state))\n return result.value\n }\n }\n throw new ContextStateError(HaiAIError.CONTEXT_BUSY, 'Context changed too frequently')\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, LLMOperations } from '../llm/ai-llm-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 { AIRelStore, InteractionScope, 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'\nimport type { ContextGeneration, PersistedContextState } from './ai-context-state.js'\n\nimport type {\n CommitTurnInput,\n ConsolidateOptions,\n ConsolidateResult,\n ContextChatOptions,\n ContextChatResult,\n ContextManager,\n ContextManagerOptions,\n ContextOperations,\n ContextStreamEvent,\n ConversationTurn,\n} from './ai-context-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createStreamProcessor } from '../llm/ai-llm-stream.js'\nimport { sessionStoreKey } from '../store/ai-store-key.js'\nimport { updateSessionInfo } from '../store/ai-store-session.js'\nimport { ContextStateError, createContextStateAccess } from './ai-context-state.js'\n\n// ─── Context 子功能可选依赖 ───\n\n/**\n * Context 子功能可选依赖\n *\n * 传入后 ContextManager 可提供 chat/chatStream 等高层编排能力。\n * 各依赖按需传入,未传入的能力不可用。\n * @internal\n * @example\n * ```ts\n * // 模块内部上下文:复用已经构造的 LLM,Context 不另建模型连接。\n * function bindLlm(llm: LLMOperations): ContextDeps {\n * return { llm }\n * }\n * ```\n */\ninterface ContextDeps {\n /** LLM 操作(chat/chatStream 必需) */\n llm?: LLMOperations\n /** Memory 操作(记忆注入/提取需要) */\n memory?: MemoryOperations\n /** RAG 操作(检索增强生成需要) */\n rag?: RagOperations\n /** Reasoning 操作(推理引擎需要) */\n reasoning?: ReasoningOperations\n /** Summary 操作(会话固化 consolidate 需要) */\n summary?: SummaryOperations\n}\n\nconst logger = core.logger.child({ module: 'ai', scope: 'context' })\n\n/** 失联生成等待 30 秒后可被其他节点中断;续租不能替代最终 CAS 期限。 */\nconst GENERATION_LEASE_MS = 30_000\n\n/** 将存储/冲突错误转换为公开业务结果。 */\nfunction contextFailure(error: unknown): HaiResult<never> {\n const code = error instanceof ContextStateError ? error.definition : HaiAIError.STORE_FAILED\n return err(code, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\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 - 必需的版本化共享状态存储;测试可显式使用 Memory Store\n * @param sessionStore - 会话信息存储(可选,用于目录管理)\n * @param deps - 可选子模块依赖(LLM / Memory / RAG / Reasoning)\n * @returns ContextOperations 实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function compose(config: CompressConfig, token: TokenOperations, compress: CompressOperations, store: AIRelStore<PersistedContextState>, scope: InteractionScope) {\n * const operations = createContextOperations(config, token, compress, store)\n * const result = operations.createManager({ scope, turnCommit: 'manual' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\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 * 创建 ContextManager 实例(共享逻辑)\n */\n function buildManager(\n options: ContextManagerOptions,\n initial?: PersistedContextState,\n ): ContextManager {\n const scope = structuredClone(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 fresh: PersistedContextState = initial ?? {\n messages: options.systemPrompt ? [{ role: 'system', content: options.systemPrompt }] : [],\n scope,\n summaries: [],\n turns: [],\n epoch: crypto.randomUUID(),\n updatedAt: 0,\n }\n let state = structuredClone(fresh)\n const access = createContextStateAccess(contextStore, scope, fresh, (snapshot) => {\n state = snapshot\n })\n\n /** 压缩候选快照;仅 CAS 成功后才对外发布。 */\n async function append(candidate: PersistedContextState, message: ChatMessage): Promise<void> {\n candidate.messages.push(structuredClone(message))\n if (!autoCompress || tokenOps.estimateMessages(candidate.messages) <= managerMaxTokens)\n return\n const result = await compressOps.tryCompress(candidate.messages, {\n strategy: strategy as 'summary' | 'sliding-window' | 'hybrid',\n maxTokens: managerMaxTokens,\n preserveSystem,\n preserveLastN,\n summaryModel,\n })\n if (!result.success) {\n throw new ContextStateError(result.error.code === HaiAIError.CONTEXT_BUDGET_EXCEEDED.code\n ? HaiAIError.CONTEXT_BUDGET_EXCEEDED\n : HaiAIError.CONTEXT_COMPRESS_FAILED, result.error.message)\n }\n if (result.data.summary) {\n candidate.summaries.push({ summary: result.data.summary, tokenCount: tokenOps.estimateText(result.data.summary), coveredMessages: result.data.removedCount })\n }\n candidate.messages = result.data.messages\n }\n\n // 后台记忆提取任务集合:chat/chatStream 的自动提取是即发即忘,flush() 统一等待,\n // 避免「AI 回答结束→下一轮召回/生成总结→上一轮记忆仍未写完」的时序问题。\n const pendingMemoryTasks = new Set<Promise<void>>()\n let failedMemoryTasks = 0\n let memoryFlush: Promise<HaiResult<void>> | undefined\n\n // 记忆注入选项:将 scope / types / minImportance / 位置等完整透传给 Memory\n function memoryInjectionOptions() {\n return {\n objectId: scope?.objectId,\n scope: options.memory?.scope,\n types: options.memory?.types,\n minImportance: options.memory?.minImportance,\n topK: options.memory?.topK,\n maxTokens: options.memory?.maxTokens,\n position: options.memory?.position,\n }\n }\n\n // 触发一次后台记忆提取并纳入 pending 集合(scope / types / 模型 / systemPrompt 完整透传)\n function enqueueMemoryExtract(userMessage: string, reply: string): void {\n const memory = deps?.memory\n const memoryOptions = options.memory\n if (!memoryOptions?.enableExtract || !memory)\n return\n const recentMessages: ChatMessage[] = [\n { role: 'user', content: userMessage },\n { role: 'assistant', content: reply },\n ]\n // 将同步抛错、rejection 和失败 HaiResult 统一纳入本地观察批次;不重试未知副作用。\n const task = Promise.resolve()\n .then(() => memory.extract(recentMessages, {\n objectId: scope?.objectId,\n scope: memoryOptions.scope,\n types: memoryOptions.types,\n model: memoryOptions.extractionModel,\n systemPrompt: memoryOptions.extractionSystemPrompt,\n }))\n .then((result) => {\n if (!result.success) {\n failedMemoryTasks++\n logger.warn('Background memory extraction failed', { source: 'result' })\n }\n })\n .catch(() => {\n failedMemoryTasks++\n logger.warn('Background memory extraction failed', { source: 'exception' })\n })\n .finally(() => {\n pendingMemoryTasks.delete(task)\n })\n pendingMemoryTasks.add(task)\n }\n\n const turnCommit = options.turnCommit ?? 'auto'\n const concurrency = options.concurrency ?? 'reject'\n // 本地仅持有取消/定时器资源;共享 Store 才是轮次和所有权的唯一事实来源。\n const producers = new Map<string, { abort: AbortController, stop: () => void }>()\n const systemPromptText = options.systemPrompt\n ?? (fresh.messages[0]?.role === 'system' && typeof fresh.messages[0].content === 'string'\n ? fresh.messages[0].content\n : undefined)\n\n /** 校验共享 owner 和期限;最终 CAS 再以存储端时钟检查截止时间。 */\n function owned(candidate: PersistedContextState, generation: ContextGeneration, now: number): ContextGeneration {\n const active = candidate.active\n if (!active || candidate.epoch !== generation.epoch || active.id !== generation.id || active.owner !== generation.owner\n || active.phase !== 'generating' || active.expiresAt <= now) {\n throw new ContextStateError(HaiAIError.CONTEXT_TURN_INVALID_STATE, 'Generation ownership expired or changed')\n }\n return active\n }\n\n /** 回收失联生成,不重放任何未知 LLM/工具副作用;保留已持久化的生成文本供审计。 */\n function recoverExpired(candidate: PersistedContextState, now: number): void {\n if (candidate.active?.phase !== 'generating' || candidate.active.expiresAt > now)\n return\n const turn = candidate.turns.find(item => item.id === candidate.active?.id)\n if (turn) {\n turn.status = 'interrupted'\n turn.committed = ''\n turn.committedAt = now\n }\n delete candidate.active\n }\n\n /** 跨节点排队轮询可取消;等待不保留无界事件监听器或本地许可。 */\n async function waitForContext(signal?: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(finish, 50)\n function finish(): void {\n clearTimeout(timer)\n signal?.removeEventListener('abort', abort)\n resolve()\n }\n function abort(): void {\n clearTimeout(timer)\n signal?.removeEventListener('abort', abort)\n reject(signal?.reason ?? new Error('Generation cancelled'))\n }\n signal?.addEventListener('abort', abort, { once: true })\n if (signal?.aborted)\n abort()\n })\n }\n\n /** 原子写入用户消息和生成 owner,再调用上游;每次许可都使用全新 ID。 */\n async function acquireGeneration(message: string, caller: AbortSignal | undefined, keepPendingOnAbort: boolean): Promise<HaiResult<{\n generation: ContextGeneration\n signal: AbortSignal\n release: () => void\n }>> {\n try {\n for (;;) {\n if (caller?.aborted)\n throw caller.reason ?? new Error('Generation cancelled')\n const generation = await access.mutate(async (candidate, now) => {\n recoverExpired(candidate, now)\n if (candidate.active)\n return { value: undefined, write: false }\n const active: ContextGeneration = { epoch: candidate.epoch, id: crypto.randomUUID(), owner: crypto.randomUUID(), phase: 'generating', expiresAt: now + GENERATION_LEASE_MS, userMessage: message }\n candidate.active = active\n candidate.turns.push({ id: active.id, speaker: 'assistant', generated: '', committed: '', status: 'generating', createdAt: now })\n await append(candidate, { role: 'user', content: message })\n return { value: active, notAfter: active.expiresAt }\n })\n if (!generation) {\n if (concurrency === 'reject')\n return err(HaiAIError.CONTEXT_BUSY, aiM('ai_contextBusy'))\n await waitForContext(caller)\n continue\n }\n const abort = new AbortController()\n const signal = caller ? AbortSignal.any([caller, abort.signal]) : abort.signal\n const acquired = generation\n let renewing = false\n const timer = setInterval(() => {\n if (renewing)\n return\n renewing = true\n void access.mutate((candidate, now) => {\n const active = owned(candidate, generation, now)\n const deadline = active.expiresAt\n active.expiresAt = now + GENERATION_LEASE_MS\n return { value: undefined, notAfter: deadline }\n }).catch(() => abort.abort()).finally(() => { renewing = false })\n }, GENERATION_LEASE_MS / 3)\n timer.unref?.()\n const release = (): void => {\n clearInterval(timer)\n signal.removeEventListener('abort', onAbort)\n producers.delete(generation.id)\n }\n function onAbort(): void {\n release()\n // 消费者停在 yield 时也要停止续租并持久化 pending,不能等待下一次 next() 才释放。\n void settleGeneration(acquired, keepPendingOnAbort)\n }\n producers.set(generation.id, { abort, stop: release })\n signal.addEventListener('abort', onAbort, { once: true })\n if (signal.aborted)\n onAbort()\n return ok({ generation, signal, release })\n }\n }\n catch (error) { return contextFailure(error) }\n }\n\n /** 每个对外 delta 先写入共享记录;旧 producer 不能继续广播未持久化内容。 */\n async function checkpoint(generation: ContextGeneration, generated: string): Promise<void> {\n await access.mutate((candidate, now) => {\n const active = owned(candidate, generation, now)\n candidate.turns.find(item => item.id === active.id)!.generated = generated\n return { value: undefined, notAfter: active.expiresAt }\n })\n }\n\n /** 异常退出关闭 owner;取消流保留可跨节点提交的 pending,失败不自动重放。 */\n async function settleGeneration(generation: ContextGeneration, keepPending: boolean, requirePersistence = false): Promise<void> {\n try {\n await access.mutate((candidate, now) => {\n if (candidate.active?.id !== generation.id || candidate.active.owner !== generation.owner\n || candidate.active.phase === 'pending') {\n return { value: undefined, write: false }\n }\n const active = owned(candidate, generation, now)\n const deadline = active.expiresAt\n if (keepPending) {\n active.phase = 'pending'\n }\n else {\n const turn = candidate.turns.find(item => item.id === active.id)!\n turn.status = 'interrupted'\n turn.committedAt = now\n delete candidate.active\n }\n return { value: undefined, notAfter: deadline }\n })\n }\n catch (error) {\n if (requirePersistence)\n throw error\n logger.warn('Context producer settlement failed', { error })\n }\n }\n\n const manager: ContextManager = {\n get scope() { return structuredClone(scope) },\n\n async addMessage(message: ChatMessage): Promise<HaiResult<void>> {\n try {\n await access.mutate(async (candidate, now) => {\n recoverExpired(candidate, now)\n if (candidate.active)\n throw new ContextStateError(HaiAIError.CONTEXT_BUSY, aiM('ai_contextBusy'))\n await append(candidate, message)\n return { value: undefined }\n })\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\n },\n async reload(): Promise<HaiResult<void>> {\n try {\n await access.read()\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\n },\n\n getMessages(): HaiResult<ChatMessage[]> {\n return ok(structuredClone(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(structuredClone(state.summaries))\n },\n\n async save(): Promise<HaiResult<void>> {\n const flushed = await manager.flush()\n if (!flushed.success)\n return flushed\n try {\n // 消息即时 CAS;save 仅同步共享快照和目录,绝不覆盖远端新版本。\n await access.mutate(() => ({ value: undefined }))\n await touchSession(scope)\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\n },\n async reset(resetOpts?): Promise<HaiResult<void>> {\n if (resetOpts?.waitForMemoryTasks) {\n const flushed = await manager.flush()\n if (!flushed.success)\n return flushed\n }\n try {\n await access.mutate((candidate) => {\n candidate.epoch = crypto.randomUUID()\n candidate.messages = resetOpts?.preserveSystemPrompt !== false && systemPromptText\n ? [{ role: 'system', content: systemPromptText }]\n : []\n candidate.summaries = []\n candidate.turns = []\n delete candidate.active\n return { value: undefined }\n })\n if (resetOpts?.cancelActiveTurn !== false) {\n for (const producer of producers.values()) {\n producer.abort.abort()\n producer.stop()\n }\n }\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\n },\n getTurns(): HaiResult<ConversationTurn[]> { return ok(structuredClone(state.turns)) },\n async markTurnSpeaking(turnId: string): Promise<HaiResult<void>> {\n try {\n await access.mutate((candidate, now) => {\n const turn = candidate.turns.find(item => item.id === turnId)\n if (!turn)\n throw new ContextStateError(HaiAIError.CONTEXT_TURN_NOT_FOUND, 'Turn not found')\n const active = candidate.active\n if (active?.id !== turnId)\n return { value: undefined, write: false }\n if (active.phase === 'generating' && active.expiresAt <= now)\n throw new ContextStateError(HaiAIError.CONTEXT_TURN_INVALID_STATE, 'Generation expired')\n turn.status = 'speaking'\n return { value: undefined, notAfter: active.phase === 'generating' ? active.expiresAt : undefined }\n })\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\n },\n\n commitTurn(turnId: string, input?: CommitTurnInput): Promise<HaiResult<void>> {\n return finalizeCommit(turnId, input?.text, 'completed')\n },\n\n interruptTurn(turnId: string, input?: CommitTurnInput): Promise<HaiResult<void>> {\n return finalizeCommit(turnId, input?.text, 'interrupted')\n },\n\n async consolidate(consolidateOpts?: ConsolidateOptions): Promise<HaiResult<ConsolidateResult>> {\n if (!deps?.summary || !deps?.memory) {\n return err(HaiAIError.MEMORY_PROMOTE_FAILED, aiM('ai_memoryPromoteFailed', { params: { error: 'summary/memory deps unavailable' } }))\n }\n\n // 先等待后台记忆提取完成,避免固化时短期记忆尚未落库\n const flushed = await manager.flush()\n if (!flushed.success)\n return flushed\n\n try {\n await access.read()\n // 1) 整合会话摘要:以历史摘要为前序上下文,对当前消息做增量摘要\n const previousSummary = state.summaries.map(s => s.summary).join('\\n\\n') || undefined\n const summaryResult = await deps.summary.generate(state.messages, {\n model: consolidateOpts?.model,\n previousSummary,\n })\n if (!summaryResult.success)\n return summaryResult\n const summaryText = summaryResult.data\n\n if (!summaryText.trim()) {\n return ok({ summary: summaryText, memories: [] })\n }\n\n // 2) 从摘要中提取长期记忆,写入持久作用域(默认取管理器 memory.scope,通常不含 sessionId)\n const durableScope = consolidateOpts?.scope ?? options.memory?.scope\n const extracted = await deps.memory.extract(\n [{ role: 'user', content: summaryText }],\n {\n objectId: scope?.objectId,\n scope: durableScope,\n types: consolidateOpts?.types ?? options.memory?.types,\n model: consolidateOpts?.model ?? options.memory?.extractionModel,\n systemPrompt: consolidateOpts?.extractionSystemPrompt ?? options.memory?.extractionSystemPrompt,\n },\n )\n if (!extracted.success)\n return extracted\n\n return ok({ summary: summaryText, memories: extracted.data })\n }\n catch (error) {\n logger.error('Context consolidate failed', { error })\n return err(HaiAIError.MEMORY_PROMOTE_FAILED, aiM('ai_memoryPromoteFailed', { params: { error: String(error) } }), error)\n }\n },\n\n get pendingMemoryTasks(): number {\n return pendingMemoryTasks.size\n },\n\n flush(): Promise<HaiResult<void>> {\n // 同轮观察者共享结果;报告后确认该批失败,下一次 flush 不重放已经执行的提取。\n memoryFlush ??= (async () => {\n while (pendingMemoryTasks.size > 0)\n await Promise.allSettled([...pendingMemoryTasks])\n const failed = failedMemoryTasks\n failedMemoryTasks = 0\n return failed > 0\n ? err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_contextMemoryTasksFailed', { params: { count: failed } }))\n : ok(undefined)\n })().finally(() => { memoryFlush = undefined })\n return memoryFlush\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 // 单活动生成:获取许可(reject 时直接返回 CONTEXT_BUSY)\n const acq = await acquireGeneration(message, chatOpts?.signal, false)\n if (!acq.success)\n return acq\n const { generation, signal, release } = acq.data\n let turnId: string\n\n try {\n // 获取当前消息列表\n const messagesResult = manager.getMessages()\n if (!messagesResult.success)\n return messagesResult\n let messages = messagesResult.data\n\n // 可选:注入记忆(scope / types / minImportance 完整透传)\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, memoryInjectionOptions())\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 signal,\n })\n if (ragResult.success) {\n // RAG query 已直接返回完整结果,将 answer 作为回复\n const reply = ragResult.data.answer\n turnId = await finalizeAssistantReply(generation, reply)\n\n return ok({\n reply,\n model: ragResult.data.model,\n turnId,\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 signal,\n })\n if (reasonResult.success) {\n const reply = reasonResult.data.answer\n turnId = await finalizeAssistantReply(generation, reply)\n\n return ok({ reply, model: chatOpts?.model ?? options.model ?? '', turnId, 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 signal,\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, { signal, objectId: scope?.objectId, sessionId: scope?.sessionId })\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 // 完成本轮生成:auto 直接提交完整文本,manual 登记待提交轮次\n turnId = await finalizeAssistantReply(generation, reply)\n\n return ok({ reply, model: lastModel, turnId, 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 turnId = await finalizeAssistantReply(generation, fallbackReply)\n return ok({ reply: fallbackReply, model: lastModel, turnId, usage: lastUsage })\n }\n catch (error) {\n logger.error('Context chat failed', { error })\n return contextFailure(error)\n }\n finally {\n // 结算并发屏障:auto 已终态立即释放;manual 待提交轮次的屏障移交 commit/interrupt\n release()\n await settleGeneration(generation, false)\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 // 单活动生成:获取许可(reject 时抛出 CONTEXT_BUSY,供调用方 for-await 捕获)\n const acq = await acquireGeneration(message, chatOpts?.signal, true)\n if (!acq.success)\n throw acq.error\n const { generation, signal, release } = acq.data\n let keepPending = true\n\n try {\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 // 可选:注入记忆(scope / types / minImportance 完整透传)\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, memoryInjectionOptions())\n if (injected.success) {\n messages = injected.data\n }\n }\n\n // 调用上游模型前先登记轮次(含配对用户输入)并广播 turn_started:\n // 中途取消(AbortSignal)时仍能保留 turnId 与已生成文本,供调用方用真实内容 commit/interrupt。\n const turn = structuredClone(state.turns.find(item => item.id === generation.id)!)\n yield { type: 'turn_started', turnId: turn.id }\n\n try {\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 signal,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n await checkpoint(generation, fullReply)\n turn.generated = fullReply\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 // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(generation, fullReply))\n yield { type: 'done', reply: fullReply, model, turnId: turn.id, 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 signal,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n await checkpoint(generation, fullReply)\n turn.generated = fullReply\n yield { type: 'delta', text: event.text }\n }\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(generation, fullReply))\n yield { type: 'done', reply: fullReply, model: chatOpts?.model ?? options.model ?? '', turnId: turn.id, 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 signal,\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 await checkpoint(generation, fullReply)\n turn.generated = fullReply\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, { signal, objectId: scope?.objectId, sessionId: scope?.sessionId })\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 // 重置本轮生成文本,下一轮 LLM 会产出最终文本\n fullReply = ''\n await checkpoint(generation, '')\n turn.generated = ''\n continue\n }\n\n // 无工具调用:结束循环\n break\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(generation, fullReply))\n yield { type: 'done', reply: fullReply, model, turnId: turn.id, usage }\n }\n catch (error) {\n // 上游取消后将已持久化的轮次转为 pending,供其他节点按实际表达内容提交;\n // 若已被 interrupt 进入终态则忽略。\n if (signal.aborted) {\n await settleGeneration(generation, true, true)\n keepPending = true\n yield { type: 'cancelled', turnId: turn.id, generated: turn.generated }\n return\n }\n keepPending = false\n throw error\n }\n }\n finally {\n // 结算并发屏障:auto 已终态立即释放;manual / 取消后待提交轮次的屏障移交 commit/interrupt\n release()\n await settleGeneration(generation, keepPending)\n }\n },\n }\n\n /** 将生成文本与 pending/自动提交一次性写入;失败后不得宣称完成。 */\n async function completeStreamTurn(generation: ContextGeneration, generated: string): Promise<boolean> {\n const applied = await access.mutate(async (candidate, now) => {\n const turn = candidate.turns.find(item => item.id === generation.id)\n if (turn && (turn.status === 'completed' || turn.status === 'interrupted'))\n return { value: false, write: false }\n const active = owned(candidate, generation, now)\n const deadline = active.expiresAt\n turn!.generated = generated\n if (turnCommit === 'manual') {\n active.phase = 'pending'\n }\n else {\n turn!.committed = generated\n turn!.status = 'completed'\n turn!.committedAt = now\n if (generated)\n await append(candidate, { role: 'assistant', content: generated })\n delete candidate.active\n }\n return { value: true, notAfter: deadline }\n })\n if (applied && turnCommit === 'auto')\n enqueueMemoryExtract(generation.userMessage, generated)\n return applied\n }\n\n /** 非流式共享相同轮次 ID;过期/reset/delete 后不得返回伪成功。 */\n async function finalizeAssistantReply(generation: ContextGeneration, generated: string): Promise<string> {\n if (!await completeStreamTurn(generation, generated))\n throw new ContextStateError(HaiAIError.CONTEXT_TURN_INVALID_STATE, 'Turn already settled')\n return generation.id\n }\n\n /** 同一 turnId、终态、文本重复提交幂等;并发节点最多追加一次真实回复。 */\n async function finalizeCommit(turnId: string, text: string | undefined, status: 'completed' | 'interrupted'): Promise<HaiResult<void>> {\n try {\n const extracted = await access.mutate(async (candidate, now) => {\n const turn = candidate.turns.find(item => item.id === turnId)\n if (!turn)\n throw new ContextStateError(HaiAIError.CONTEXT_TURN_NOT_FOUND, 'Turn not found')\n const committed = text ?? (status === 'completed' ? turn.generated : '')\n if (turn.status === 'completed' || turn.status === 'interrupted') {\n if (turn.status === status && turn.committed === committed)\n return { value: undefined, write: false }\n throw new ContextStateError(HaiAIError.CONTEXT_TURN_INVALID_STATE, 'Turn already settled differently')\n }\n const active = candidate.active\n if (!active || active.id !== turnId || (active.phase === 'generating' && active.expiresAt <= now))\n throw new ContextStateError(HaiAIError.CONTEXT_TURN_INVALID_STATE, 'Generation expired or changed')\n const deadline = active.phase === 'generating' ? active.expiresAt : undefined\n const pair = { user: active.userMessage, reply: committed }\n turn.committed = committed\n turn.status = status\n turn.committedAt = now\n if (committed)\n await append(candidate, { role: 'assistant', content: committed })\n delete candidate.active\n return { value: pair, notAfter: deadline }\n })\n producers.get(turnId)?.abort.abort()\n producers.get(turnId)?.stop()\n if (extracted?.reply)\n enqueueMemoryExtract(extracted.user, extracted.reply)\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\n }\n\n return manager\n }\n\n /** CAS 同步目录,删除墓碑不可由迟到 save/LLM 重建。 */\n async function touchSession(scope: InteractionScope): Promise<void> {\n if (!sessionStore)\n return\n await updateSessionInfo(sessionStore, scope, (existing, now) => {\n if (existing?.deleted)\n return undefined\n return existing\n ? { ...existing, updatedAt: now }\n : { ...scope, createdAt: now, updatedAt: now }\n })\n }\n\n /** scope 是持久化隔离与并发协议的必需条件。 */\n function validScope(scope: InteractionScope | undefined): scope is InteractionScope {\n return !!scope && typeof scope.objectId === 'string' && !!scope.objectId.trim()\n && typeof scope.sessionId === 'string' && !!scope.sessionId.trim()\n }\n\n return {\n createManager(options: ContextManagerOptions): HaiResult<ContextManager> {\n try {\n if (!validScope(options?.scope))\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_contextScopeRequired'))\n return ok(buildManager(options))\n }\n catch (error) { return contextFailure(error) }\n },\n async restoreManager(scope: InteractionScope, options?: Omit<ContextManagerOptions, 'scope'>): Promise<HaiResult<ContextManager>> {\n try {\n if (!validScope(scope))\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_contextScopeRequired'))\n const persisted = await contextStore.readVersioned(sessionStoreKey(scope))\n if (persisted?.data.deleted)\n throw new ContextStateError(HaiAIError.SESSION_FAILED, 'Context has been deleted')\n return ok(buildManager({ ...options, scope }, persisted?.data))\n }\n catch (error) { return contextFailure(error) }\n },\n async listSessions(objectId: string): Promise<HaiResult<SessionInfo[]>> {\n if (!sessionStore)\n return ok([])\n try {\n const sessions = await sessionStore.query({ objectId, orderBy: { field: 'updatedAt', direction: 'desc' } })\n const contexts = await contextStore.query({ objectId })\n // 一次批量读,避免目录同步失败后重新展示已删除正文;不做逐会话 N+1 查询。\n const deleted = new Set(contexts.filter(item => item.deleted).map(item => sessionStoreKey(item.scope)))\n return ok(sessions.filter(item => !item.deleted && !deleted.has(sessionStoreKey(item))))\n }\n catch (error) { return contextFailure(error) }\n },\n async renameSession(scope: InteractionScope, title: string): Promise<HaiResult<void>> {\n if (!sessionStore)\n return ok(undefined)\n try {\n const context = await contextStore.readVersioned(sessionStoreKey(scope))\n if (context?.data.deleted)\n throw new ContextStateError(HaiAIError.SESSION_FAILED, 'Context has been deleted')\n await updateSessionInfo(sessionStore, scope, (existing, now) => {\n if (!existing || existing.deleted)\n throw new ContextStateError(HaiAIError.SESSION_FAILED, 'Session not found')\n return { ...existing, title, updatedAt: now }\n })\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\n },\n async removeSession(scope: InteractionScope): Promise<HaiResult<void>> {\n try {\n const initial: PersistedContextState = { scope, messages: [], summaries: [], turns: [], epoch: crypto.randomUUID(), updatedAt: 0 }\n const access = createContextStateAccess(contextStore, scope, initial, () => {})\n await access.mutate((candidate) => {\n candidate.deleted = true\n candidate.epoch = crypto.randomUUID()\n candidate.messages = []\n candidate.summaries = []\n candidate.turns = []\n delete candidate.active\n return { value: undefined }\n }, true)\n if (sessionStore) {\n await updateSessionInfo(sessionStore, scope, (existing, now) => ({ ...existing, ...scope, createdAt: existing?.createdAt ?? now, updatedAt: now, deleted: true }))\n }\n return ok(undefined)\n }\n catch (error) { return contextFailure(error) }\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function embed(config: AIConfig) {\n * const embedding = createEmbeddingOperations(config)\n * const result = await embedding.embedText('语义检索')\n * if (!result.success) return result\n * return result.data.length\n * }\n * ```\n */\nexport function createEmbeddingOperations(config: AIConfig): EmbeddingOperations {\n const embeddingConfig: EmbeddingConfig = config.embedding ?? { batchSize: 100 }\n\n /**\n * 缓存的 OpenAI 客户端实例(按 apiKey + baseURL + timeout 缓存,避免不同端点共用同一个客户端)\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 const timeout = resolved.timeout\n const cacheKey = `${apiKey}::${baseURL}::${timeout}`\n\n // 如果端点或超时配置变化,需要重建客户端\n if (cachedClient && cachedResolvedKey === cacheKey)\n return cachedClient\n\n cachedClient = new OpenAI({ apiKey, baseURL, timeout })\n cachedResolvedKey = cacheKey\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: Parameters<typeof client.embeddings.create>[0] = {\n model: resolved.model,\n input,\n }\n\n if (request.dimensions ?? embeddingConfig.dimensions) {\n params.dimensions = request.dimensions ?? embeddingConfig.dimensions\n }\n\n const response = await client.embeddings.create(params)\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' })\nconst HTML_SCRIPT_BLOCK_REGEX = /<script[^>]*>[\\s\\S]*?<\\/script[^>]*>/gi\nconst HTML_STYLE_BLOCK_REGEX = /<style[^>]*>[\\s\\S]*?<\\/style[^>]*>/gi\nconst HTML_LIST_OPEN_TAG_REGEX = /<[ou]l[^>]*>/gi\nconst HTML_LIST_CLOSE_TAG_REGEX = /<\\/[ou]l>/gi\nconst HTML_BOLD_TAG_REGEX = /<(?:strong|b)[^>]*>([\\s\\S]*?)<\\/(?:strong|b)>/gi\nconst HTML_ITALIC_TAG_REGEX = /<(?:em|i)[^>]*>([\\s\\S]*?)<\\/(?:em|i)>/gi\nconst HTML_LINK_TAG_REGEX = /<a[^>]+href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi\nconst HTML_IMAGE_TAG_REGEX = /<img([^>]*)>/gi\nconst HTML_IMAGE_SRC_ATTR_REGEX = /src=\"([^\"]*)\"/\nconst HTML_IMAGE_ALT_ATTR_REGEX = /alt=\"([^\"]*)\"/\nconst HTML_INLINE_CODE_TAG_REGEX = /<code[^>]*>([\\s\\S]*?)<\\/code>/gi\nconst HTML_TABLE_ROW_REGEX = /<tr[^>]*>([\\s\\S]*?)<\\/tr>/gi\nconst HTML_TABLE_CELL_REGEX = /<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/gi\nconst HTML_TABLE_CONTAINER_TAG_REGEX = /<\\/?t(?:able|head|body|foot)[^>]*>/gi\nconst HTML_TABLE_ELEMENT_TAG_REGEX = /<\\/?t[rdh][^>]*>/gi\nconst HTML_LINE_BREAK_REGEX = /<br\\s*\\/?>/gi\nconst HTML_BLOCK_CLOSE_TAG_REGEX = /<\\/(?:p|div|section|article|header|footer|main|nav|aside)>/gi\nconst HTML_BLOCK_OPEN_TAG_REGEX = /<(?:p|div|section|article|header|footer|main|nav|aside)[^>]*>/gi\nconst HTML_ANY_TAG_REGEX = /<[^>]+>/g\nconst MULTI_LINE_BREAK_REGEX = /\\n{3,}/g\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(HTML_ANY_TAG_REGEX, '')\n}\n\n/**\n * 解析 HTML,剥除标签并提取纯文本\n */\nfunction parseHtmlContent(content: Buffer | string): string {\n const html = parseTextContent(content)\n const noScript = html.replace(HTML_SCRIPT_BLOCK_REGEX, ' ')\n const noStyle = noScript.replace(HTML_STYLE_BLOCK_REGEX, ' ')\n const noTags = noStyle.replace(HTML_ANY_TAG_REGEX, ' ')\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(HTML_SCRIPT_BLOCK_REGEX, '')\n md = md.replace(HTML_STYLE_BLOCK_REGEX, '')\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(HTML_LIST_OPEN_TAG_REGEX, '\\n')\n md = md.replace(HTML_LIST_CLOSE_TAG_REGEX, '\\n')\n md = md.replace(/<li[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, c) => `\\n- ${stripTags(c).trim()}`)\n\n // 粗体 / 斜体\n md = md.replace(HTML_BOLD_TAG_REGEX, (_, c) => `**${stripTags(c).trim()}**`)\n md = md.replace(HTML_ITALIC_TAG_REGEX, (_, c) => `*${stripTags(c).trim()}*`)\n\n // 超链接\n md = md.replace(HTML_LINK_TAG_REGEX, (_, href, text) =>\n `[${stripTags(text).trim()}](${href})`)\n\n // 图片(src/alt 属性顺序不定,逐属性提取)\n md = md.replace(HTML_IMAGE_TAG_REGEX, (_, attrs: string) => {\n const src = attrs.match(HTML_IMAGE_SRC_ATTR_REGEX)?.[1] ?? ''\n const alt = attrs.match(HTML_IMAGE_ALT_ATTR_REGEX)?.[1] ?? ''\n return `![${alt}](${src})`\n })\n\n // 行内代码\n md = md.replace(HTML_INLINE_CODE_TAG_REGEX, (_, c) =>\n `\\`${decodeHtmlEntities(stripTags(c))}\\``)\n\n // 表格(简化:每行单元格用 | 分隔)\n md = md.replace(HTML_TABLE_ROW_REGEX, (_, row) => {\n const cells = [...row.matchAll(HTML_TABLE_CELL_REGEX)]\n return `| ${cells.map(([, c]) => stripTags(c).trim()).join(' | ')} |\\n`\n })\n md = md.replace(HTML_TABLE_CONTAINER_TAG_REGEX, '')\n md = md.replace(HTML_TABLE_ELEMENT_TAG_REGEX, '')\n\n // 换行与段落\n md = md.replace(HTML_LINE_BREAK_REGEX, '\\n')\n md = md.replace(HTML_BLOCK_CLOSE_TAG_REGEX, '\\n\\n')\n md = md.replace(HTML_BLOCK_OPEN_TAG_REGEX, '')\n\n // 移除剩余标签并解码实体\n md = md.replace(HTML_ANY_TAG_REGEX, '')\n md = decodeHtmlEntities(md)\n\n return md.replace(MULTI_LINE_BREAK_REGEX, '\\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function parse(config: AIConfig, llm: LLMOperations) {\n * const file = createFileOperations(config, llm)\n * const result = await file.parse({ content: Buffer.from('项目说明'), filename: 'README.txt' })\n * if (!result.success) return result\n * return result.data.text\n * }\n * ```\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 — 文生图 Provider 内部契约与 HTTP 辅助\n * @internal\n * @module image/providers/ai-image-provider\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { LookupFunction } from 'node:net'\nimport type { Response as UndiciResponse } from 'undici'\nimport type { ResolvedImageModel } from '../../ai-config.js'\nimport type { GeneratedImage, ImageSize, ReferenceImage } from '../ai-image-types.js'\n\nimport { Buffer } from 'node:buffer'\nimport dns from 'node:dns'\nimport { BlockList, isIP } from 'node:net'\nimport { err, ok } from '@h-ai/core'\nimport { Agent, fetch as fetchImage } from 'undici'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\n\n/**\n * Provider 层文生图请求;signal 已包含整次操作的 deadline。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function request(model: ResolvedImageModel): ProviderGenerateImageRequest {\n * return { model, prompt: '一座山', referenceImages: [], maxImageBytes: 20 * 1024 * 1024, maxImages: 1 }\n * }\n * ```\n */\nexport interface ProviderGenerateImageRequest {\n model: ResolvedImageModel\n prompt: string\n size?: ImageSize\n referenceImages: ReferenceImage[]\n signal?: AbortSignal\n /** 单张图片字节上限;JSON 最多读取 max(64 KiB, 两倍图片上限)。 */\n maxImageBytes: number\n /** 单次图片数量上限。 */\n maxImages: number\n}\n\n/**\n * 文生图 Provider 内部接口。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function generate(provider: ImageProvider, request: ProviderGenerateImageRequest) {\n * const result = await provider.generate(request)\n * if (!result.success) return result\n * return result.data.map(image => ({ mimeType: image.mimeType, bytes: image.data.byteLength }))\n * }\n * ```\n */\nexport interface ImageProvider {\n generate: (request: ProviderGenerateImageRequest) => Promise<HaiResult<GeneratedImage[]>>\n}\n\n/**\n * 受限上游错误诊断结构;保留状态与有限摘要,不包含完整请求或签名下载地址。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const details: ImageUpstreamErrorDetails = { status: 429, upstreamCode: 'rate_limit', requestId: 'request-1' }\n * const diagnostic = { status: details.status, requestId: details.requestId }\n * ```\n */\ninterface ImageUpstreamErrorDetails {\n status: number\n upstreamCode?: string\n upstreamMessage?: string\n requestId?: string\n}\n\n/** 地址拒绝只携带固定说明,不把厂商签名 URL 或 DNS 详情写进错误日志。 */\nclass ImageDownloadBlockedError extends Error {}\n\n/**\n * 厂商请求使用全局 fetch,受限下载使用与 Agent 同版本的 undici fetch。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function read(response: ImageHttpResponse) {\n * const result = await readJson(response, { maxImageBytes: 1024 })\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\ntype ImageHttpResponse = Response | UndiciResponse\n\n/** IANA 特殊用途地址不作为上游图片下载目标;IPv6 仅开放普通全局单播。 */\nconst blockedAddresses = new BlockList()\nfor (const [address, prefix] of [\n ['0.0.0.0', 8],\n ['10.0.0.0', 8],\n ['100.64.0.0', 10],\n ['127.0.0.0', 8],\n ['169.254.0.0', 16],\n ['172.16.0.0', 12],\n ['192.0.0.0', 24],\n ['192.0.2.0', 24],\n ['192.88.99.0', 24],\n ['192.168.0.0', 16],\n ['198.18.0.0', 15],\n ['198.51.100.0', 24],\n ['203.0.113.0', 24],\n ['224.0.0.0', 4],\n ['240.0.0.0', 4],\n] as const) blockedAddresses.addSubnet(address, prefix, 'ipv4')\nfor (const [address, prefix] of [['2001::', 23], ['2001:db8::', 32], ['2002::', 16], ['3ffe::', 16], ['3fff::', 20]] as const)\n blockedAddresses.addSubnet(address, prefix, 'ipv6')\nconst globalIpv6 = new BlockList()\nglobalIpv6.addSubnet('2000::', 3, 'ipv6')\n\n/** 不接受映射/转换地址、回环、私网、链路本地、组播及保留地址。 */\nfunction isPublicImageAddress(address: string): boolean {\n const family = isIP(address)\n return family === 4\n ? !blockedAddresses.check(address, 'ipv4')\n : family === 6 && globalIpv6.check(address, 'ipv6') && !blockedAddresses.check(address, 'ipv6')\n}\n\n/** 在真实 socket lookup 中校验并返回同一批地址,不能校验后再让 fetch 二次解析。 */\nconst imageLookup: LookupFunction = (hostname, options, callback) => {\n dns.lookup(hostname, { all: true, verbatim: true }, (error, addresses) => {\n if (error)\n return callback(error, '')\n if (!addresses.length || addresses.some(item => !isPublicImageAddress(item.address)))\n return callback(new ImageDownloadBlockedError('Image download address is blocked'), '')\n const candidates = options.family ? addresses.filter(item => item.family === options.family) : addresses\n if (!candidates.length)\n return callback(new ImageDownloadBlockedError('Image download address is blocked'), '')\n if (options.all)\n callback(null, candidates)\n else\n callback(null, candidates[0].address, candidates[0].family)\n })\n}\n\n/** 每一跳仅允许无 URL 凭证的公共 HTTPS;端口固定为 HTTPS 默认端口。 */\nfunction checkedImageUrl(value: string, base?: URL): URL {\n let url: URL\n try {\n url = new URL(value, base)\n }\n catch {\n throw new ImageDownloadBlockedError('Image download URL is blocked')\n }\n const hostname = url.hostname.replace(/^\\[|\\]$/g, '')\n if (url.protocol !== 'https:' || url.username || url.password || url.port\n || !hostname || (isIP(hostname) && !isPublicImageAddress(hostname))) {\n throw new ImageDownloadBlockedError('Image download URL is blocked')\n }\n return url\n}\n\n/** 逐块限流读取实际字节;取消、超限与格式失败均取消 reader,释放响应连接。 */\nasync function readImageBody(response: ImageHttpResponse, maxBytes: number, signal?: AbortSignal): Promise<Uint8Array> {\n const declared = response.headers.get('content-length')\n if (declared && /^\\d+$/.test(declared) && Number(declared) > maxBytes) {\n await response.body?.cancel()\n throw new RangeError('Image response exceeds byte limit')\n }\n if (!response.body)\n return new Uint8Array()\n const reader = response.body.getReader()\n const abort = () => {\n void reader.cancel(signal?.reason).catch(() => {})\n }\n signal?.addEventListener('abort', abort, { once: true })\n const chunks: Uint8Array[] = []\n let length = 0\n try {\n while (true) {\n signal?.throwIfAborted()\n const chunk = await reader.read()\n signal?.throwIfAborted()\n if (chunk.done)\n break\n length += chunk.value.byteLength\n if (length > maxBytes)\n throw new RangeError('Image response exceeds byte limit')\n chunks.push(chunk.value)\n }\n return new Uint8Array(Buffer.concat(chunks, length))\n }\n finally {\n signal?.removeEventListener('abort', abort)\n await reader.cancel().catch(() => {})\n reader.releaseLock()\n }\n}\n\n/**\n * 校验允许的栅格 MIME 与文件魔数;这是类型识别,不是完整图片解码/尺寸验证。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const result = validateImageOutput({ data: new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]), mimeType: 'image/png' }, 1024)\n * if (result.success) {\n * const mimeType = result.data.mimeType // 魔数识别不代替完整图片解码。\n * }\n * ```\n */\nexport function validateImageOutput(image: GeneratedImage, maxBytes: number): HaiResult<GeneratedImage> {\n if (image.data.byteLength > maxBytes)\n return err(HaiAIError.IMAGE_TOO_LARGE, aiM('ai_imageTooLarge'))\n const bytes = image.data\n const mime = image.mimeType.toLowerCase() === 'image/jpg' ? 'image/jpeg' : image.mimeType.toLowerCase()\n const prefix = (value: number[]) => value.every((byte, index) => bytes[index] === byte)\n const valid = mime === 'image/png'\n ? prefix([137, 80, 78, 71, 13, 10, 26, 10])\n : mime === 'image/jpeg'\n ? prefix([255, 216, 255])\n : mime === 'image/gif'\n ? ['GIF87a', 'GIF89a'].includes(Buffer.from(bytes.subarray(0, 6)).toString('ascii'))\n : mime === 'image/webp' && Buffer.from(bytes.subarray(0, 4)).toString('ascii') === 'RIFF' && Buffer.from(bytes.subarray(8, 12)).toString('ascii') === 'WEBP'\n return valid ? ok({ ...image, mimeType: mime }) : imageProtocolError()\n}\n\n/**\n * 先核验解码字节预算,再将 Base64 转为图片结构;超限抛 RangeError,由 Provider 边界转换。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const image = imageFromBase64('iVBORw0KGgo=', 'image/png', { maxImageBytes: 1024 })\n * const result = validateImageOutput(image, 1024)\n * if (!result.success) {\n * const code = result.error.code\n * }\n * ```\n */\nexport function imageFromBase64(data: string, mimeType: string, options: { size?: ImageSize, maxImageBytes: number }): GeneratedImage {\n if (Buffer.byteLength(data, 'base64') > options.maxImageBytes)\n throw new RangeError('Image response exceeds byte limit')\n return {\n data: new Uint8Array(Buffer.from(data, 'base64')),\n mimeType,\n width: options.size?.width,\n height: options.size?.height,\n }\n}\n\n/**\n * 将参考图转换为厂商 JSON 接口通用的 Data URL\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const dataUrl = referenceImageDataUrl({ data: new Uint8Array([137, 80, 78, 71]), mimeType: 'image/png' })\n * const prefix = dataUrl.slice(0, dataUrl.indexOf(','))\n * ```\n */\nexport function referenceImageDataUrl(image: ReferenceImage): string {\n return `data:${image.mimeType};base64,${referenceImageBase64(image)}`\n}\n\n/**\n * 将参考图转换为不带 Data URL 前缀的 Base64\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const base64 = referenceImageBase64({ data: new Uint8Array([137, 80, 78, 71]), mimeType: 'image/png' })\n * const byteLength = Buffer.byteLength(base64, 'base64')\n * ```\n */\nexport function referenceImageBase64(image: ReferenceImage): string {\n return Buffer.from(image.data).toString('base64')\n}\n\n/**\n * 将参考图追加到 multipart 表单,并生成仅用于传输的安全文件名\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const form = new FormData()\n * appendReferenceImages(form, 'image[]', [{ data: new Uint8Array([137, 80, 78, 71]), mimeType: 'image/png' }])\n * const files = form.getAll('image[]')\n * ```\n */\nexport function appendReferenceImages(form: FormData, field: string, images: ReferenceImage[]): void {\n images.forEach((image, index) => {\n const subtype = image.mimeType.split('/')[1]?.replace(/[^a-z0-9.+-]/gi, '') || 'bin'\n const bytes = image.data.buffer.slice(image.data.byteOffset, image.data.byteOffset + image.data.byteLength) as ArrayBuffer\n form.append(field, new Blob([bytes], { type: image.mimeType }), `reference-${index + 1}.${subtype}`)\n })\n}\n\n/**\n * 有界读取成功 HTTP 响应 JSON;失败时转换为统一上游错误。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const result = await readJson(new Response('{\"data\":[]}', { headers: { 'Content-Type': 'application/json' } }), { maxImageBytes: 1024 })\n * if (result.success) {\n * const body = result.data // unknown:厂商适配层继续验证响应结构。\n * }\n * ```\n */\nexport async function readJson(response: ImageHttpResponse, request: Pick<ProviderGenerateImageRequest, 'maxImageBytes' | 'signal'>): Promise<HaiResult<unknown>> {\n if (!response.ok)\n return imageUpstreamError(response, request.signal)\n try {\n return ok(JSON.parse(new TextDecoder().decode(await readImageBody(response, Math.max(64 * 1024, request.maxImageBytes * 2), request.signal))))\n }\n catch (error) {\n if (error instanceof RangeError || request.signal?.aborted)\n return imageProviderFailure(error)\n return err(HaiAIError.IMAGE_PROTOCOL_ERROR, aiM('ai_imageProtocolError'), error)\n }\n}\n\n/**\n * 限定公网 HTTPS 与实际 DNS 连接,逐跳校验重定向并有界读取,finally 销毁专属 Agent。\n * 网络/读取异常由外层 Provider 转成 HaiResult;禁止把 API 鉴权或 Cookie 带入此下载。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function download(url: string, request: ProviderGenerateImageRequest) {\n * // url 来自厂商;下载器仍逐跳验证公共 HTTPS 地址并绑定实际 DNS 结果。\n * const result = await downloadImage(url, request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport async function downloadImage(url: string, request: ProviderGenerateImageRequest): Promise<HaiResult<GeneratedImage>> {\n const dispatcher = new Agent({ connect: { lookup: imageLookup }, connections: 1 })\n try {\n let target = checkedImageUrl(url)\n for (let redirect = 0; redirect <= 3; redirect++) {\n request.signal?.throwIfAborted()\n const response = await fetchImage(target, { signal: request.signal, redirect: 'manual', dispatcher })\n if (![301, 302, 303, 307, 308].includes(response.status))\n return await readImageResponse(response, request)\n const location = response.headers.get('location')\n await response.body?.cancel()\n if (!location || redirect === 3)\n return imageProtocolError()\n target = checkedImageUrl(location, target)\n }\n return imageProtocolError()\n }\n finally {\n // 使用 destroy 而非等待未消费/中断的连接自然结束。\n await dispatcher.destroy()\n }\n}\n\n/**\n * 有界串行下载,避免上游数组并行放大连接数与内存;失败不返回部分图片。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function download(urls: string[], request: ProviderGenerateImageRequest) {\n * const result = await downloadImages(urls, request)\n * if (!result.success) return result\n * return result.data.length // 失败时不发布部分下载结果。\n * }\n * ```\n */\nexport async function downloadImages(urls: string[], request: ProviderGenerateImageRequest): Promise<HaiResult<GeneratedImage[]>> {\n if (urls.length > request.maxImages)\n return err(HaiAIError.IMAGE_TOO_LARGE, aiM('ai_imageTooLarge'))\n const images: GeneratedImage[] = []\n for (const url of urls) {\n const downloaded = await downloadImage(url, request)\n if (!downloaded.success)\n return downloaded\n images.push(downloaded.data)\n }\n return ok(images)\n}\n\n/**\n * 按 MIME、实际流字节上限和魔数验证 HTTP 图片;读取异常由 Provider 边界处理。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function read(response: ImageHttpResponse, request: ProviderGenerateImageRequest) {\n * const result = await readImageResponse(response, request)\n * if (!result.success) return result\n * return result.data.mimeType\n * }\n * ```\n */\nexport async function readImageResponse(response: ImageHttpResponse, request: ProviderGenerateImageRequest): Promise<HaiResult<GeneratedImage>> {\n if (!response.ok)\n return imageUpstreamError(response, request.signal)\n const contentType = response.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase()\n if (!contentType || !['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp'].includes(contentType)) {\n await response.body?.cancel()\n return imageProtocolError()\n }\n return validateImageOutput({\n data: await readImageBody(response, request.maxImageBytes, request.signal),\n mimeType: contentType,\n width: request.size?.width,\n height: request.size?.height,\n }, request.maxImageBytes)\n}\n\n/**\n * 将 Provider 异常转换为稳定的下载拒绝、超限、超时、取消或上游错误。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const result = imageProviderFailure(new RangeError('Image response exceeds byte limit'))\n * if (!result.success) {\n * const tooLarge = result.error.code === HaiAIError.IMAGE_TOO_LARGE.code\n * }\n * ```\n */\nexport function imageProviderFailure(error: unknown): HaiResult<never> {\n let cause = error\n for (let depth = 0; depth < 4 && cause instanceof Error; depth++, cause = cause.cause) {\n if (cause instanceof ImageDownloadBlockedError)\n return err(HaiAIError.IMAGE_DOWNLOAD_BLOCKED, aiM('ai_imageDownloadBlocked'))\n }\n if (error instanceof RangeError)\n return err(HaiAIError.IMAGE_TOO_LARGE, aiM('ai_imageTooLarge'))\n if (error instanceof DOMException && error.name === 'TimeoutError')\n return err(HaiAIError.IMAGE_TIMEOUT, aiM('ai_imageTimeout'))\n if (error instanceof DOMException && error.name === 'AbortError')\n return err(HaiAIError.IMAGE_CANCELLED, aiM('ai_imageCancelled'), error)\n return err(HaiAIError.IMAGE_UPSTREAM_ERROR, aiM('ai_imageRequestFailed'), error)\n}\n\n/**\n * 创建响应格式错误\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const result = imageProtocolError()\n * if (!result.success) {\n * const code = result.error.code\n * }\n * ```\n */\nexport function imageProtocolError(): HaiResult<never> {\n return err(HaiAIError.IMAGE_PROTOCOL_ERROR, aiM('ai_imageProtocolError'))\n}\n\n/** 提取安全、有限的上游错误摘要,供调用日志定位问题。 */\nasync function imageUpstreamError(response: ImageHttpResponse, signal?: AbortSignal): Promise<HaiResult<never>> {\n const details: ImageUpstreamErrorDetails = {\n status: response.status,\n requestId: response.headers.get('x-request-id') ?? response.headers.get('request-id') ?? undefined,\n }\n try {\n const body = JSON.parse(new TextDecoder().decode(await readImageBody(response, 64 * 1024, signal))) as {\n code?: unknown\n message?: unknown\n error?: { code?: unknown, message?: unknown, requestId?: unknown } | string\n }\n const nested = typeof body.error === 'object' && body.error ? body.error : undefined\n const code = nested?.code ?? body.code\n const message = nested?.message ?? body.message ?? (typeof body.error === 'string' ? body.error : undefined)\n if (typeof code === 'string')\n details.upstreamCode = code.slice(0, 120)\n if (typeof message === 'string')\n details.upstreamMessage = message.slice(0, 500)\n if (typeof nested?.requestId === 'string')\n details.requestId = nested.requestId.slice(0, 120)\n }\n catch {\n signal?.throwIfAborted()\n // 非 JSON 错误页只记录 HTTP 状态,避免日志泄漏任意响应正文。\n }\n\n const message = response.status === 401\n ? aiM('ai_imageAuthenticationFailed')\n : response.status === 402\n ? aiM('ai_imagePaymentRequired')\n : response.status === 403\n ? aiM('ai_imageAccessDenied')\n : aiM('ai_imageUpstreamError', { params: { status: response.status } })\n return err(HaiAIError.IMAGE_UPSTREAM_ERROR, message, details)\n}\n","/** @h-ai/ai — Google Gemini Image / Nano Banana Provider */\n\nimport type { ImageSize } from '../ai-image-types.js'\nimport type { ImageProvider } from './ai-image-provider.js'\nimport { imageFromBase64, imageProtocolError, imageProviderFailure, readJson, referenceImageBase64 } from './ai-image-provider.js'\n\n/**\n * Gemini 返回的候选图片片段,只描述本适配器消费的字段。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: GoogleImageResponse = { candidates: [{ content: { parts: [{ inlineData: { mimeType: 'image/png', data: 'iVBORw0KGgo=' } }] } }] }\n * const parts = response.candidates?.flatMap(candidate => candidate.content?.parts ?? []) ?? []\n * ```\n */\ninterface GoogleImageResponse {\n candidates?: Array<{\n content?: {\n parts?: Array<{\n inlineData?: { mimeType?: string, data?: string }\n inline_data?: { mime_type?: string, data?: string }\n }>\n }\n }>\n}\n\nfunction greatestCommonDivisor(left: number, right: number): number {\n let a = left\n let b = right\n while (b !== 0)\n [a, b] = [b, a % b]\n return a\n}\n\nfunction googleImageFormat(size: ImageSize): { aspectRatio: string, imageSize: string } {\n const divisor = greatestCommonDivisor(size.width, size.height)\n const edge = Math.max(size.width, size.height)\n return {\n aspectRatio: `${size.width / divisor}:${size.height / divisor}`,\n imageSize: edge <= 1024 ? '1K' : edge <= 2048 ? '2K' : '4K',\n }\n}\n\n/**\n * 创建 Google Gemini Image Provider\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function generate(request: Parameters<ImageProvider['generate']>[0]) {\n * const provider = createGoogleImageProvider()\n * const result = await provider.generate(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createGoogleImageProvider(): ImageProvider {\n return {\n async generate(request) {\n try {\n const generationConfig = request.size\n ? {\n responseModalities: ['IMAGE'],\n responseFormat: { image: googleImageFormat(request.size) },\n }\n : { responseModalities: ['IMAGE'] }\n const response = await fetch(`${request.model.baseUrl}/v1/models/${encodeURIComponent(request.model.model)}:generateContent`, {\n method: 'POST',\n headers: {\n 'x-goog-api-key': request.model.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n contents: [{\n parts: [\n ...request.referenceImages.map(image => ({\n inlineData: {\n mimeType: image.mimeType,\n data: referenceImageBase64(image),\n },\n })),\n { text: request.prompt },\n ],\n }],\n generationConfig,\n }),\n signal: request.signal,\n redirect: 'error',\n })\n const parsed = await readJson(response, request)\n if (!parsed.success)\n return parsed\n const body = parsed.data as GoogleImageResponse\n const parts = body.candidates?.flatMap(candidate => candidate.content?.parts ?? []) ?? []\n if (parts.filter(part => part.inlineData?.data || part.inline_data?.data).length > request.maxImages)\n throw new RangeError('Image count exceeds limit')\n const images = parts.flatMap((part) => {\n if (part.inlineData?.data)\n return [imageFromBase64(part.inlineData.data, part.inlineData.mimeType ?? 'image/png', request)]\n if (part.inline_data?.data)\n return [imageFromBase64(part.inline_data.data, part.inline_data.mime_type ?? 'image/png', request)]\n return []\n })\n return images.length ? { success: true, data: images } : imageProtocolError()\n }\n catch (error) {\n return imageProviderFailure(error)\n }\n },\n }\n}\n","/** @h-ai/ai — OpenAI GPT Image Provider */\n\nimport type { ImageProvider } from './ai-image-provider.js'\nimport { appendReferenceImages, imageFromBase64, imageProtocolError, imageProviderFailure, readJson } from './ai-image-provider.js'\n\n/**\n * OpenAI 图片接口的 Base64 响应与实际输出格式。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: OpenAIImageResponse = { data: [{ b64_json: 'iVBORw0KGgo=' }], output_format: 'png' }\n * const count = response.data?.length ?? 0\n * ```\n */\ninterface OpenAIImageResponse {\n data?: Array<{ b64_json?: string }>\n output_format?: string\n size?: string\n}\n\n/**\n * 创建 OpenAI GPT Image Provider\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function generate(request: Parameters<ImageProvider['generate']>[0]) {\n * const provider = createOpenAIImageProvider()\n * const result = await provider.generate(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createOpenAIImageProvider(): ImageProvider {\n return {\n async generate(request) {\n try {\n const hasReferences = request.referenceImages.length > 0\n const size = request.size ? `${request.size.width}x${request.size.height}` : undefined\n const form = new FormData()\n if (hasReferences) {\n form.set('model', request.model.model)\n form.set('prompt', request.prompt)\n form.set('n', '1')\n if (size)\n form.set('size', size)\n form.set('output_format', 'png')\n appendReferenceImages(form, 'image[]', request.referenceImages)\n }\n const response = await fetch(`${request.model.baseUrl}/images/${hasReferences ? 'edits' : 'generations'}`, {\n method: 'POST',\n headers: hasReferences\n ? { Authorization: `Bearer ${request.model.apiKey}` }\n : {\n 'Authorization': `Bearer ${request.model.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: hasReferences\n ? form\n : JSON.stringify({\n model: request.model.model,\n prompt: request.prompt,\n n: 1,\n ...(size ? { size } : {}),\n output_format: 'png',\n }),\n signal: request.signal,\n redirect: 'error',\n })\n const parsed = await readJson(response, request)\n if (!parsed.success)\n return parsed\n const body = parsed.data as OpenAIImageResponse\n if ((body.data?.length ?? 0) > request.maxImages)\n throw new RangeError('Image count exceeds limit')\n const format = body.output_format ?? 'png'\n const mimeType = format === 'jpg' ? 'image/jpeg' : `image/${format}`\n const images = body.data\n ?.filter(item => typeof item.b64_json === 'string')\n .map(item => imageFromBase64(item.b64_json!, mimeType, request))\n .filter(image => image.data.byteLength > 0)\n return images?.length ? { success: true, data: images } : imageProtocolError()\n }\n catch (error) {\n return imageProviderFailure(error)\n }\n },\n }\n}\n","/** @h-ai/ai — Pollinations 免费额度图片 Provider */\n\nimport type { ImageProvider } from './ai-image-provider.js'\nimport { appendReferenceImages, downloadImages, imageFromBase64, imageProtocolError, imageProviderFailure, readImageResponse, readJson } from './ai-image-provider.js'\n\n/**\n * Pollinations 编辑接口返回的 Base64 或受限远端图片地址。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: PollinationsImageResponse = { data: [{ url: 'https://images.example.com/generated.png' }] }\n * const urls = response.data?.flatMap(item => item.url ? [item.url] : []) ?? []\n * ```\n */\ninterface PollinationsImageResponse {\n data?: Array<{ b64_json?: string, url?: string }>\n}\n\n/**\n * 创建 Pollinations Provider\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function generate(request: Parameters<ImageProvider['generate']>[0]) {\n * const provider = createPollinationsImageProvider()\n * const result = await provider.generate(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createPollinationsImageProvider(): ImageProvider {\n return {\n async generate(request) {\n try {\n if (request.referenceImages.length) {\n const form = new FormData()\n form.set('prompt', request.prompt)\n form.set('model', request.model.model)\n form.set('response_format', 'b64_json')\n if (request.size)\n form.set('size', `${request.size.width}x${request.size.height}`)\n appendReferenceImages(form, 'image', request.referenceImages)\n const response = await fetch(`${request.model.baseUrl}/v1/images/edits`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${request.model.apiKey}` },\n body: form,\n signal: request.signal,\n redirect: 'error',\n })\n const parsed = await readJson(response, request)\n if (!parsed.success)\n return parsed\n const body = parsed.data as PollinationsImageResponse\n if ((body.data?.length ?? 0) > request.maxImages)\n throw new RangeError('Image count exceeds limit')\n const base64Images = body.data?.flatMap(item => item.b64_json\n ? [imageFromBase64(item.b64_json, 'image/png', request)]\n : []) ?? []\n const urls = body.data?.flatMap(item => item.url ? [item.url] : []) ?? []\n if (base64Images.length + urls.length > request.maxImages)\n throw new RangeError('Image count exceeds limit')\n const downloaded = await downloadImages(urls, request)\n if (!downloaded.success)\n return downloaded\n const images = [...base64Images, ...downloaded.data]\n return images.length ? { success: true, data: images } : imageProtocolError()\n }\n\n const url = new URL(`${request.model.baseUrl}/image/${encodeURIComponent(request.prompt)}`)\n url.searchParams.set('model', request.model.model)\n if (request.size) {\n url.searchParams.set('width', String(request.size.width))\n url.searchParams.set('height', String(request.size.height))\n }\n const response = await fetch(url.toString(), {\n headers: { Authorization: `Bearer ${request.model.apiKey}` },\n signal: request.signal,\n redirect: 'error',\n })\n const image = await readImageResponse(response, request)\n return image.success ? { success: true, data: [image.data] } : image\n }\n catch (error) {\n return imageProviderFailure(error)\n }\n },\n }\n}\n","/** @h-ai/ai — Qwen-Image 2.0 / 3.0 Provider */\n\nimport type { ImageProvider } from './ai-image-provider.js'\nimport { downloadImages, imageProtocolError, imageProviderFailure, readJson, referenceImageDataUrl } from './ai-image-provider.js'\n\n/**\n * Qwen 多模态生成响应中的图片信源;地址仍须经过公共 HTTPS 下载校验。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: QwenImageResponse = { output: { choices: [{ message: { content: [{ image: 'https://images.example.com/generated.png' }] } }] } }\n * const choices = response.output?.choices ?? []\n * ```\n */\ninterface QwenImageResponse {\n output?: {\n choices?: Array<{\n message?: { content?: Array<{ image?: string }> }\n }>\n }\n}\n\n/**\n * 创建 Qwen-Image Provider\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function generate(request: Parameters<ImageProvider['generate']>[0]) {\n * const provider = createQwenImageProvider()\n * const result = await provider.generate(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createQwenImageProvider(): ImageProvider {\n return {\n async generate(request) {\n try {\n const response = await fetch(`${request.model.baseUrl}/services/aigc/multimodal-generation/generation`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${request.model.apiKey}`,\n 'Content-Type': 'application/json',\n ...(request.model.workspaceId ? { 'X-DashScope-WorkSpace': request.model.workspaceId } : {}),\n },\n body: JSON.stringify({\n model: request.model.model,\n input: {\n messages: [{\n role: 'user',\n content: [\n ...request.referenceImages.map(image => ({ image: referenceImageDataUrl(image) })),\n { text: request.prompt },\n ],\n }],\n },\n parameters: {\n n: 1,\n ...(request.size ? { size: `${request.size.width}*${request.size.height}` } : {}),\n watermark: false,\n },\n }),\n signal: request.signal,\n redirect: 'error',\n })\n const parsed = await readJson(response, request)\n if (!parsed.success)\n return parsed\n const body = parsed.data as QwenImageResponse\n const urls = body.output?.choices\n ?.flatMap(choice => choice.message?.content ?? [])\n .flatMap(item => item.image ? [item.image] : []) ?? []\n if (!urls.length)\n return imageProtocolError()\n return await downloadImages(urls, request)\n }\n catch (error) {\n return imageProviderFailure(error)\n }\n },\n }\n}\n","/** @h-ai/ai — 火山方舟 Seedream 4.x / 5.x Provider */\n\nimport type { ImageProvider } from './ai-image-provider.js'\nimport { downloadImages, imageFromBase64, imageProtocolError, imageProviderFailure, readJson, referenceImageDataUrl } from './ai-image-provider.js'\n\n/**\n * Seedream 生成响应中的 Base64 或受限远端图片地址。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: SeedreamImageResponse = { data: [{ b64_json: 'iVBORw0KGgo=' }] }\n * const encoded = response.data?.[0]?.b64_json\n * ```\n */\ninterface SeedreamImageResponse {\n data?: Array<{ b64_json?: string, url?: string }>\n}\n\n/**\n * 创建 Seedream Provider\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function generate(request: Parameters<ImageProvider['generate']>[0]) {\n * const provider = createSeedreamImageProvider()\n * const result = await provider.generate(request)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createSeedreamImageProvider(): ImageProvider {\n return {\n async generate(request) {\n try {\n const response = await fetch(`${request.model.baseUrl}/images/generations`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${request.model.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: request.model.model,\n prompt: request.prompt,\n ...(request.referenceImages.length\n ? { image: request.referenceImages.map(image => referenceImageDataUrl(image)) }\n : {}),\n ...(request.size ? { size: `${request.size.width}x${request.size.height}` } : {}),\n response_format: 'b64_json',\n sequential_image_generation: 'disabled',\n watermark: false,\n }),\n signal: request.signal,\n redirect: 'error',\n })\n const parsed = await readJson(response, request)\n if (!parsed.success)\n return parsed\n const body = parsed.data as SeedreamImageResponse\n if ((body.data?.length ?? 0) > request.maxImages)\n throw new RangeError('Image count exceeds limit')\n const base64Images = body.data?.flatMap(item => item.b64_json\n ? [imageFromBase64(item.b64_json, 'image/png', request)]\n : []) ?? []\n const urls = body.data?.flatMap(item => item.url ? [item.url] : []) ?? []\n if (base64Images.length + urls.length > request.maxImages)\n throw new RangeError('Image count exceeds limit')\n const downloaded = await downloadImages(urls, request)\n if (!downloaded.success)\n return downloaded\n const images = [...base64Images, ...downloaded.data]\n return images.length ? { success: true, data: images } : imageProtocolError()\n }\n catch (error) {\n return imageProviderFailure(error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — 文生图子功能工厂\n *\n * 负责公共参数校验、模型解析与 Provider 路由。\n * @module image/ai-image-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig, ImageConfig, ImageProviderName } from '../ai-config.js'\nimport type { GeneratedImage, ImageOperations } from './ai-image-types.js'\nimport type { ImageProvider } from './providers/ai-image-provider.js'\nimport { core, err } from '@h-ai/core'\nimport { ImageConfigSchema, resolveImageModel } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createGoogleImageProvider } from './providers/ai-image-provider-google.js'\nimport { createOpenAIImageProvider } from './providers/ai-image-provider-openai.js'\nimport { createPollinationsImageProvider } from './providers/ai-image-provider-pollinations.js'\nimport { createQwenImageProvider } from './providers/ai-image-provider-qwen.js'\nimport { createSeedreamImageProvider } from './providers/ai-image-provider-seedream.js'\nimport { imageProviderFailure, validateImageOutput } from './providers/ai-image-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'image' })\n\n/**\n * 创建文生图操作接口\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function generate(config: AIConfig) {\n * const image = createImageOperations(config)\n * const result = await image.generate({ prompt: '一座山', size: { width: 1024, height: 1024 } })\n * if (!result.success) return result\n * return result.data.images\n * }\n * ```\n */\nexport function createImageOperations(config: AIConfig): ImageOperations {\n const imageConfig: ImageConfig = ImageConfigSchema.parse(config.image ?? {})\n const providers = new Map<ImageProviderName, ImageProvider>()\n\n function provider(name: ImageProviderName): ImageProvider {\n const cached = providers.get(name)\n if (cached)\n return cached\n const created = createProvider(name)\n providers.set(name, created)\n return created\n }\n\n return {\n async generate(request) {\n if (!request.prompt?.trim())\n return err(HaiAIError.IMAGE_INVALID_REQUEST, aiM('ai_imageInvalidRequest'))\n if (request.size && (!Number.isInteger(request.size.width) || !Number.isInteger(request.size.height) || request.size.width <= 0 || request.size.height <= 0))\n return err(HaiAIError.IMAGE_INVALID_REQUEST, aiM('ai_imageInvalidSize'))\n if (request.referenceImages?.some(image => image.data.byteLength === 0 || !image.mimeType.toLowerCase().startsWith('image/')))\n return err(HaiAIError.IMAGE_INVALID_REQUEST, aiM('ai_imageInvalidReferenceImage'))\n if ((request.referenceImages?.length ?? 0) > imageConfig.maxImages || request.referenceImages?.some(image => image.data.byteLength > imageConfig.maxImageBytes))\n return err(HaiAIError.IMAGE_TOO_LARGE, aiM('ai_imageTooLarge'))\n if (request.signal?.aborted)\n return err(HaiAIError.IMAGE_CANCELLED, aiM('ai_imageCancelled'))\n\n const resolved = resolveImageModel(imageConfig, request.model)\n if (!resolved.success) {\n logger.warn('Image model resolution failed', {\n code: resolved.error.code,\n error: resolved.error.message,\n requestedModel: request.model,\n })\n return resolved\n }\n const startedAt = Date.now()\n const logContext = {\n provider: resolved.data.provider,\n model: resolved.data.model,\n referenceImageCount: request.referenceImages?.length ?? 0,\n width: request.size?.width,\n height: request.size?.height,\n }\n logger.debug('Image generation started', logContext)\n const deadline = new AbortController()\n const timer = setTimeout(() => deadline.abort(new DOMException('Image deadline exceeded', 'TimeoutError')), resolved.data.timeout)\n timer.unref()\n let generated: HaiResult<GeneratedImage[]>\n try {\n generated = await provider(resolved.data.provider).generate({\n model: resolved.data,\n prompt: request.prompt.trim(),\n size: request.size,\n referenceImages: request.referenceImages ?? [],\n signal: request.signal ? AbortSignal.any([request.signal, deadline.signal]) : deadline.signal,\n maxImageBytes: imageConfig.maxImageBytes,\n maxImages: imageConfig.maxImages,\n })\n }\n catch (error) {\n generated = imageProviderFailure(error)\n }\n finally {\n clearTimeout(timer)\n }\n if (request.signal?.aborted)\n return err(HaiAIError.IMAGE_CANCELLED, aiM('ai_imageCancelled'))\n if (deadline.signal.aborted)\n return err(HaiAIError.IMAGE_TIMEOUT, aiM('ai_imageTimeout'))\n if (!generated.success) {\n logger.warn('Image generation failed', {\n ...logContext,\n durationMs: Date.now() - startedAt,\n code: generated.error.code,\n error: generated.error.message,\n upstream: generated.error.cause,\n })\n return generated\n }\n if (generated.data.length > imageConfig.maxImages)\n return err(HaiAIError.IMAGE_TOO_LARGE, aiM('ai_imageTooLarge'))\n const images: GeneratedImage[] = []\n for (const image of generated.data) {\n const validated = validateImageOutput(image, imageConfig.maxImageBytes)\n if (!validated.success)\n return validated\n images.push(validated.data)\n }\n logger.info('Image generation completed', {\n ...logContext,\n durationMs: Date.now() - startedAt,\n imageCount: generated.data.length,\n mimeTypes: [...new Set(images.map(image => image.mimeType))],\n })\n return { success: true, data: { images } }\n },\n }\n}\n\nfunction createProvider(name: ImageProviderName): ImageProvider {\n switch (name) {\n case 'openai':\n return createOpenAIImageProvider()\n case 'google':\n return createGoogleImageProvider()\n case 'qwen':\n return createQwenImageProvider()\n case 'seedream':\n return createSeedreamImageProvider()\n case 'pollinations':\n return createPollinationsImageProvider()\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' })\nconst LEADING_MARKDOWN_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_MARKDOWN_FENCE_REGEX = /\\n?```$/\n\n// ─── 提取结果类型 ───\n\n/**\n * LLM 实体提取结果(单条)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const entity: ExtractedEntity = { name: 'hai-framework', type: 'project', aliases: ['hai'] }\n * const names = [entity.name, ...(entity.aliases ?? [])]\n * ```\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/**\n * 默认实体类型列表\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const allowed = new Set(DEFAULT_ENTITY_TYPES)\n * const valid = allowed.has('project')\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function extract(llm: LLMOperations) {\n * const result = await extractEntities(llm, 'hai-framework 是一个 TypeScript 框架', undefined, ['project', 'concept'])\n * if (!result.success) return result\n * return result.data.map(entity => entity.name)\n * }\n * ```\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(LEADING_MARKDOWN_FENCE_REGEX, '').replace(TRAILING_MARKDOWN_FENCE_REGEX, '')\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 * 对多个 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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function extract(llm: LLMOperations) {\n * const result = await extractEntitiesBatch(llm, [{ chunkId: 'chunk-1', content: 'hai-framework 使用 TypeScript' }], undefined, ['project', 'concept'], undefined, 2)\n * if (!result.success) return result\n * return result.data.map(entity => ({ name: entity.name, chunkIds: entity.chunkIds }))\n * }\n * ```\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(chunk => extractEntities(llm, chunk.content, model, entityTypes, systemPrompt)),\n )\n\n for (const [index, result] of results.entries()) {\n if (!result.success)\n return result\n allEntities.push(...result.data.map(entity => ({ entity, chunkId: batch[index].chunkId })))\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 { KnowledgeDocumentRevision, 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 KnowledgeRepairOptions,\n KnowledgeRepairResult,\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function prepare(config: KnowledgeConfig, llm: LLMOperations, embedding: EmbeddingOperations, pipe: DatapipeFunctions, store: KnowledgeStore) {\n * const knowledge = createKnowledgeOperations(config, llm, embedding, pipe, store)\n * const ready = await knowledge.setup({ collection: 'docs', dimension: 1536 })\n * if (!ready.success) return ready\n * return await knowledge.ingest({ collection: 'docs', documentId: 'doc-1', content: '项目使用 TypeScript' })\n * }\n * ```\n */\nexport function createKnowledgeOperations(\n config: KnowledgeConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations,\n datapipe: DatapipeFunctions,\n store?: KnowledgeStore,\n): KnowledgeOperations {\n /**\n * 检查 collection 是否已就绪,每次查询共享注册表,不缓存可变发布状态。\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 幂等),并恢复前 100 份清单。\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 await store.repair(collection)\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 → CAS 发布;\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: { mode: 'paragraph', maxSize: 512, overlap: 100 },\n * })\n * ```\n */\n async ingest(input: KnowledgeIngestInput): Promise<HaiResult<KnowledgeIngestResult>> {\n const collection = input.collection ?? config.collection\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 if (!await isCollectionReady(collection))\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n // ① 清洗:标准化文本(去 HTML、空白规整等)\n const cleanResult = datapipe.clean(input.content, cleanOptions)\n const cleanedText = cleanResult.success ? cleanResult.data : input.content\n\n // ② 分块预算是输入约束;失败不能回退整篇文本绕过上限后继续向量化/发布。\n const chunkResult = datapipe.chunk(cleanedText, chunkOptions)\n if (!chunkResult.success)\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: chunkResult.error.message } }), chunkResult.error)\n const chunks = chunkResult.data\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 // ④ 每次导入使用不可复用 revision,任何新旧分块都不会覆盖同一个向量 ID。\n const revision = nanoid(32)\n const vectorDocuments = chunks.map((chunk, i) => {\n const chunkId = `${revision}: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 revision,\n },\n }\n })\n\n // ⑤ 完整准备实体后再开始存储;实体与命中关系随同一文档 revision 一次发布。\n const extractedEntities: KnowledgeEntity[] = []\n const entities: KnowledgeDocumentRevision['entities'] = []\n\n if (enableEntityExtraction) {\n const chunkInputs = chunks.map(chunk => ({\n content: chunk.content,\n chunkId: `${revision}:chunk-${chunk.index}`,\n }))\n\n const entityResult = await extractEntitiesBatch(llm, chunkInputs, undefined, config.entityTypes, config.systemPrompt)\n if (entityResult.success) {\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 entities.push({\n id: entityId,\n name: entity.name,\n type: entity.type,\n aliases: entity.aliases ?? [],\n description: entity.description,\n chunkIds: entity.chunkIds.filter(chunkId => vectorDocuments.some(chunk => chunk.id === chunkId)),\n })\n }\n }\n else {\n // 显式要求的实体提取失败不能发布不完整的新版本。\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: entityResult.error.message } }), entityResult.error)\n }\n }\n\n const published = await store!.replaceDocument({\n documentId: input.documentId,\n collection,\n revision,\n title: input.title,\n url: input.url,\n createdAt: Date.now(),\n chunks: vectorDocuments,\n entities,\n })\n\n const duration = Date.now() - startTime\n logger.debug('Document ingested', {\n documentId: input.documentId,\n revision,\n cleanupPending: published.cleanupPending,\n chunkCount: chunks.length,\n entityCount: extractedEntities.length,\n duration,\n })\n\n return ok({\n documentId: input.documentId,\n revision,\n cleanupPending: published.cleanupPending,\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 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 if (!await isCollectionReady(collection))\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\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, collection)\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 if (itemId === chunkKey) {\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 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) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n if (!await isCollectionReady(collection))\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\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 collection: options?.collection,\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) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n if (!await isCollectionReady(collection))\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n const docs = await store.listDocuments(collection, {\n offset: options?.offset,\n limit: options?.limit,\n })\n\n const result: KnowledgeDocumentInfo[] = docs.map(d => ({\n documentId: d.documentId,\n revision: d.revision,\n title: d.title ?? undefined,\n url: d.url ?? undefined,\n chunkCount: d.chunkCount,\n entityCount: d.entityCount,\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) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n if (!await isCollectionReady(collection))\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n // 先原子撤销完整版本,再按持久清单清理;删除失败必须报告并可用 repair 重试。\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 * 有界恢复过期暂存并重试旧向量清理;故障时保留持久补偿信息。\n */\n async repair(options?: KnowledgeRepairOptions): Promise<HaiResult<KnowledgeRepairResult>> {\n if (!store)\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n if (!Number.isSafeInteger(options?.offset ?? 0) || (options?.offset ?? 0) < 0\n || !Number.isSafeInteger(options?.limit ?? 100) || (options?.limit ?? 100) < 1 || (options?.limit ?? 100) > 1000) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: 'Repair offset must be nonnegative and limit must be between 1 and 1000' } }))\n }\n try {\n return ok(await store.repair(options?.collection ?? config.collection, options))\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 // ─── deleteCollection ───\n async deleteCollection(collection?: string): 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 col = collection ?? config.collection\n logger.debug('Deleting knowledge collection', { collection: col })\n\n try {\n await store.deleteCollection(col)\n logger.debug('Knowledge collection deleted', { collection: col })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Knowledge collection deletion failed', { collection: col, error })\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: String(error) } }), error)\n }\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 ToolExecutionContext,\n ToolExecutionOptions,\n ToolMessage,\n ToolRegistryOperations,\n ToolRegistryOptions,\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/** 工具默认执行超时(毫秒):未指定 deadline / timeoutMs / 工具默认时生效 */\nconst DEFAULT_TOOL_TIMEOUT_MS = 30_000\n\n/**\n * 依据执行入参解析出传给 handler 的执行上下文(含始终存在的取消信号)。\n *\n * 组合调用方 `signal` 与超时信号:超时时长优先级 `deadline` > `timeoutMs` > 工具默认 > 全局默认。\n * 返回上下文与实际生效的超时毫秒数(用于超时错误信息)。\n */\nfunction resolveExecutionContext(\n options: ToolExecutionOptions | undefined,\n toolTimeoutMs: number | undefined,\n): { context: ToolExecutionContext, timeoutMs: number } {\n const now = Date.now()\n const timeoutMs = options?.deadline !== undefined\n ? Math.max(0, options.deadline - now)\n : options?.timeoutMs ?? toolTimeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS\n const deadline = options?.deadline ?? now + timeoutMs\n\n const timeoutSignal = AbortSignal.timeout(timeoutMs)\n const signal = options?.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n return {\n context: { signal, objectId: options?.objectId, sessionId: options?.sessionId, deadline },\n timeoutMs,\n }\n}\n\n/**\n * 执行 handler 并与取消信号竞速:即便 handler 未响应 signal,取消 / 超时后也立即停止等待。\n *\n * 返回 handler 结果,或在取消 / 超时时抛出(由调用方映射为 TOOL_TIMEOUT)。\n */\nasync function runWithCancellation<T>(\n run: (context: ToolExecutionContext) => Promise<T> | T,\n context: ToolExecutionContext,\n): Promise<T> {\n const { signal } = context\n if (signal.aborted)\n throw new DOMException('Aborted', 'AbortError')\n\n return await new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(new DOMException('Aborted', 'AbortError'))\n signal.addEventListener('abort', onAbort, { once: true })\n Promise.resolve()\n .then(() => run(context))\n .then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error: unknown) => {\n signal.removeEventListener('abort', onAbort)\n reject(error instanceof Error ? error : new Error(String(error)))\n },\n )\n })\n}\n\n/** 判断错误是否为取消 / 超时(AbortError / TimeoutError) */\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError')\n}\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 * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const add = defineTool({ name: 'add', description: '计算整数和', parameters: zod.object({ a: zod.number().int(), b: zod.number().int() }), handler: ({ a, b }) => a + b })\n * const result = await add.execute({ a: 2, b: 3 })\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\nexport function defineTool<TInput, TOutput>(\n options: DefineToolOptions<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const { name, description, parameters, handler, timeoutMs } = options\n\n return {\n name,\n description,\n parameters,\n\n async execute(input: TInput, execOptions?: ToolExecutionOptions): Promise<HaiResult<TOutput>> {\n const parseResult = parameters.safeParse(input)\n if (!parseResult.success) {\n return err(HaiAIError.TOOL_VALIDATION_FAILED, parseResult.error.message)\n }\n const { context, timeoutMs: effectiveTimeout } = resolveExecutionContext(execOptions, timeoutMs)\n const authorizer = execOptions?.authorize\n if (authorizer) {\n try {\n const allowed = await runWithCancellation(\n ctx => authorizer({ toolName: name, input: parseResult.data, context: ctx }),\n context,\n )\n if (!allowed)\n return err(HaiAIError.TOOL_FORBIDDEN, aiM('ai_toolForbidden', { params: { name } }))\n }\n catch (error) {\n if (isAbortError(error))\n return err(HaiAIError.TOOL_TIMEOUT, aiM('ai_toolTimeout', { params: { name, ms: effectiveTimeout } }), error)\n return err(HaiAIError.TOOL_FORBIDDEN, aiM('ai_toolForbidden', { params: { name } }))\n }\n }\n\n try {\n const output = await runWithCancellation(ctx => handler(parseResult.data, ctx), context)\n return ok(output)\n }\n catch (error) {\n if (isAbortError(error))\n return err(HaiAIError.TOOL_TIMEOUT, aiM('ai_toolTimeout', { params: { name, ms: effectiveTimeout } }), 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 * 注册表默认拒绝重复名称;确需替换时必须显式调用 `replace()`。\n *\n * @returns 工具注册表实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const registry = createToolRegistry({ authorize: request => request.context.objectId === 'user-1' })\n * const echo = defineTool({ name: 'echo', description: '返回文本', parameters: zod.object({ text: zod.string() }), handler: input => input.text })\n * const registered = registry.register(echo)\n * if (!registered.success) throw new Error(registered.error.message)\n * const result = await registry.execute({ id: 'call-1', type: 'function', function: { name: 'echo', arguments: JSON.stringify({ text: '你好' }) } }, { objectId: 'user-1' })\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\nexport function createToolRegistry(options: ToolRegistryOptions = {}): ToolRegistryOperations {\n const tools: Map<string, Tool> = new Map()\n\n function duplicateTool(name: string): HaiResult<void> {\n return err(HaiAIError.TOOL_ALREADY_REGISTERED, aiM('ai_toolAlreadyRegistered', { params: { name } }))\n }\n\n const registry: ToolRegistryOperations = {\n /** 注册单个工具;默认拒绝同名覆盖 */\n register<TInput, TOutput>(tool: Tool<TInput, TOutput>): HaiResult<void> {\n if (tools.has(tool.name))\n return duplicateTool(tool.name)\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 原子批量注册工具;发现任何重名时不写入 */\n registerMany(toolList: Tool<unknown, unknown>[]): HaiResult<void> {\n const incomingNames = new Set<string>()\n for (const tool of toolList) {\n if (tools.has(tool.name) || incomingNames.has(tool.name))\n return duplicateTool(tool.name)\n incomingNames.add(tool.name)\n }\n for (const tool of toolList)\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 显式替换已注册工具 */\n replace<TInput, TOutput>(tool: Tool<TInput, TOutput>): HaiResult<void> {\n if (!tools.has(tool.name))\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: tool.name } }))\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\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, execOptions?: ToolExecutionOptions): 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 registryAuthorize = options.authorize\n const executionAuthorize = execOptions?.authorize\n const authorize = registryAuthorize || executionAuthorize\n ? async (request: Parameters<NonNullable<ToolExecutionOptions['authorize']>>[0]): Promise<boolean> => {\n if (registryAuthorize && !await registryAuthorize(request))\n return false\n if (executionAuthorize && !await executionAuthorize(request))\n return false\n return true\n }\n : undefined\n\n const result = await tool.execute(args, { ...execOptions, authorize })\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 /** 批量执行工具调用(默认串行),仅显式 parallel=true 时并行 */\n async executeAll(\n toolCalls: ToolCall[],\n options: ToolExecutionOptions & { parallel?: boolean } = {},\n ): Promise<HaiResult<ToolMessage[]>> {\n const { parallel = false, ...execOptions } = options\n const messages: ToolMessage[] = []\n\n if (parallel) {\n const results = await Promise.all(\n toolCalls.map(tc => registry.execute(tc, execOptions)),\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, execOptions)\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: Anthropic Messages API 实现\n *\n * 通过原生 `fetch` 直连 Anthropic Messages API(`/v1/messages`),无需引入 SDK,\n * 天然支持 `AbortSignal` 取消。将框架统一的 Chat Completions 请求/响应形状与\n * Anthropic 协议互相转换,使 `ai.llm.chat/chatStream` 的调用方无需感知底层协议差异。\n *\n * 文本对话与工具调用(tool_use / tool_result)支持;流式覆盖文本增量与用量统计。\n * @module ai-llm-provider-anthropic\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type { ChatCompletionChunk, ChatCompletionRequest, ChatCompletionResponse, ChatMessage, TempModelConfig, ToolCall, ToolDefinition } from '../ai-llm-types.js'\nimport type { AILLMFunctionsDeps, LLMProvider } from './ai-llm-provider-types.js'\n\nimport process from 'node:process'\nimport { err, ok } from '@h-ai/core'\n\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { readSSEStream } from '../ai-llm-stream.js'\n\nconst ANTHROPIC_VERSION = '2023-06-01'\nconst DEFAULT_ANTHROPIC_BASE_URL = 'https://api.anthropic.com'\nconst DEFAULT_MAX_TOKENS = 4096\n\n// ─── Anthropic REST 形状(无 SDK,最小类型定义) ───\n\n/**\n * Anthropic 原生文本内容块。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const block: AnthropicTextBlock = { type: 'text', text: '你好' }\n * const text = block.text\n * ```\n */\ninterface AnthropicTextBlock { type: 'text', text: string }\n/**\n * Anthropic 工具调用块;input 保留未知结构,由工具 Schema 边界校验。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const block: AnthropicToolUseBlock = { type: 'tool_use', id: 'call-1', name: 'weather', input: { city: '北京' } }\n * const callId = block.id\n * ```\n */\ninterface AnthropicToolUseBlock { type: 'tool_use', id: string, name: string, input: unknown }\n/**\n * Anthropic 工具结果块,通过 tool_use_id 关联先前调用。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const block: AnthropicToolResultBlock = { type: 'tool_result', tool_use_id: 'call-1', content: '晴' }\n * const message: AnthropicMessage = { role: 'user', content: [block] }\n * ```\n */\ninterface AnthropicToolResultBlock { type: 'tool_result', tool_use_id: string, content: string }\n/**\n * 本适配器消费的 Anthropic 文本、工具调用和工具结果联合类型。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function text(block: AnthropicContentBlock) {\n * if (block.type === 'text') return block.text\n * if (block.type === 'tool_result') return block.content\n * return block.name\n * }\n * ```\n */\ntype AnthropicContentBlock = AnthropicTextBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n\n/**\n * Anthropic messages 项;系统与开发者指令由适配器移入顶层 system。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const message: AnthropicMessage = { role: 'user', content: [{ type: 'tool_result', tool_use_id: 'call-1', content: '晴' }] }\n * const role = message.role\n * ```\n */\ninterface AnthropicMessage { role: 'user' | 'assistant', content: string | AnthropicContentBlock[] }\n\n/**\n * 发送给 Anthropic 的工具定义,参数使用 JSON Schema。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const tool: AnthropicTool = { name: 'weather', description: '查询天气', input_schema: { type: 'object', properties: { city: { type: 'string' } }, required: ['city'] } }\n * const schema = tool.input_schema\n * ```\n */\ninterface AnthropicTool { name: string, description?: string, input_schema: Record<string, unknown> }\n\n/**\n * Anthropic Messages API 请求体;凭据只进入请求头,不写入此结构。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const request: AnthropicRequest = { model: 'claude-sonnet-4-5', max_tokens: 1024, messages: [{ role: 'user', content: '你好' }], stream: false }\n * const body = JSON.stringify(request)\n * ```\n */\ninterface AnthropicRequest {\n model: string\n max_tokens: number\n messages: AnthropicMessage[]\n system?: string\n temperature?: number\n top_p?: number\n tools?: AnthropicTool[]\n stream?: boolean\n}\n\n/**\n * Anthropic 返回的输入与输出 token 计数。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const usage: AnthropicUsage = { input_tokens: 10, output_tokens: 5 }\n * const totalTokens = usage.input_tokens + usage.output_tokens\n * ```\n */\ninterface AnthropicUsage { input_tokens: number, output_tokens: number }\n\n/**\n * Anthropic 非流式响应的最小消费形状,保留工具块与 token 用量。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: AnthropicResponse = { id: 'message-1', model: 'claude-sonnet-4-5', content: [{ type: 'text', text: '你好' }], stop_reason: 'end_turn', usage: { input_tokens: 10, output_tokens: 5 } }\n * const text = response.content.filter(block => block.type === 'text').map(block => block.text).join('')\n * ```\n */\ninterface AnthropicResponse {\n id: string\n model: string\n content: AnthropicContentBlock[]\n stop_reason: string | null\n usage: AnthropicUsage\n}\n\n/**\n * 已解析的 Anthropic 端点参数\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function endpoint(secret: string): ResolvedAnthropic {\n * return { apiKey: secret, baseUrl: 'https://api.anthropic.com', model: 'claude-sonnet-4-5', maxTokens: 1024, timeout: 30_000 }\n * }\n * ```\n */\ninterface ResolvedAnthropic {\n apiKey: string\n baseUrl: string\n model: string\n maxTokens: number\n temperature?: number\n timeout: number\n}\n\n// ─── 辅助转换 ───\n\n/** 从消息内容提取纯文本(字符串直接返回,多模态数组拼接 text 片段,忽略 refusal 等非文本块) */\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string')\n return content\n if (Array.isArray(content))\n return content.map(part => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? part.text : '')).filter(Boolean).join('')\n return ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * 将框架消息转换为 Anthropic messages + 顶层 system\n *\n * - system / developer 消息合并为顶层 `system` 字符串\n * - assistant 的 `tool_calls` 转 tool_use 块;tool 消息转 tool_result 块\n * - 连续同角色消息各自成条(Anthropic 允许交替,SDK 侧一般无强约束)\n */\nfunction toAnthropicMessages(messages: ChatMessage[]): { messages: AnthropicMessage[], system?: string } {\n const systemParts: string[] = []\n const result: AnthropicMessage[] = []\n\n for (const message of messages) {\n if (message.role === 'system' || message.role === 'developer') {\n const text = contentToText(message.content)\n if (text)\n systemParts.push(text)\n continue\n }\n\n if (message.role === 'tool') {\n result.push({\n role: 'user',\n content: [{ type: 'tool_result', tool_use_id: message.tool_call_id, content: contentToText(message.content) }],\n })\n continue\n }\n\n if (message.role === 'assistant') {\n const blocks: AnthropicContentBlock[] = []\n const text = contentToText(message.content)\n if (text)\n blocks.push({ type: 'text', text })\n if (message.tool_calls) {\n for (const call of message.tool_calls) {\n if (call.type === 'function') {\n let input: unknown = {}\n try {\n input = call.function.arguments ? JSON.parse(call.function.arguments) : {}\n }\n catch {\n input = {}\n }\n blocks.push({ type: 'tool_use', id: call.id, name: call.function.name, input })\n }\n }\n }\n result.push({ role: 'assistant', content: blocks.length > 0 ? blocks : (text || '') })\n continue\n }\n\n // user\n result.push({ role: 'user', content: contentToText(message.content) })\n }\n\n return { messages: result, system: systemParts.length > 0 ? systemParts.join('\\n\\n') : undefined }\n}\n\n/** 将 Chat Completions 工具定义转换为 Anthropic 工具定义 */\nfunction toAnthropicTools(tools?: ToolDefinition[]): AnthropicTool[] | undefined {\n if (!tools || tools.length === 0)\n return undefined\n const mapped: AnthropicTool[] = []\n for (const tool of tools) {\n if (tool.type !== 'function')\n continue\n mapped.push({\n name: tool.function.name,\n description: tool.function.description ?? undefined,\n input_schema: (tool.function.parameters ?? { type: 'object', properties: {} }) as Record<string, unknown>,\n })\n }\n return mapped.length > 0 ? mapped : undefined\n}\n\n/** 将 Anthropic stop_reason 映射为 Chat Completions finish_reason */\nfunction mapStopReason(stopReason: string | null, hasToolUse: boolean): string {\n if (hasToolUse || stopReason === 'tool_use')\n return 'tool_calls'\n if (stopReason === 'max_tokens')\n return 'length'\n return 'stop'\n}\n\n/** 将 Anthropic 响应转换为 Chat Completions 响应形状 */\nfunction toChatResponse(response: AnthropicResponse, model: string): ChatCompletionResponse {\n const textParts: string[] = []\n const toolCalls: ToolCall[] = []\n for (const block of response.content) {\n if (block.type === 'text')\n textParts.push(block.text)\n else if (block.type === 'tool_use')\n toolCalls.push({ id: block.id, type: 'function', function: { name: block.name, arguments: JSON.stringify(block.input ?? {}) } })\n }\n const text = textParts.join('')\n\n return {\n id: response.id,\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: response.model ?? model,\n choices: [{\n index: 0,\n message: {\n role: 'assistant',\n content: toolCalls.length > 0 && text.length === 0 ? null : text,\n refusal: null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n },\n finish_reason: mapStopReason(response.stop_reason, toolCalls.length > 0) as ChatCompletionResponse['choices'][number]['finish_reason'],\n logprobs: null,\n }],\n usage: {\n prompt_tokens: response.usage.input_tokens,\n completion_tokens: response.usage.output_tokens,\n total_tokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n }\n}\n\n/** 构造纯文本增量的流块 */\nfunction textChunk(id: string, model: string, delta: string): ChatCompletionChunk {\n return {\n id,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [{ index: 0, delta: { content: delta }, finish_reason: null, logprobs: null }],\n }\n}\n\n// ─── 工厂 ───\n\n/**\n * 创建 Anthropic LLM Provider\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns LLMProvider 实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function complete(deps: AILLMFunctionsDeps) {\n * const provider = createAnthropicProvider(deps)\n * const result = await provider.chat({ messages: [{ role: 'user', content: '你好' }] })\n * if (!result.success) return result\n * return result.data.choices[0]?.message.content\n * }\n * ```\n */\nexport function createAnthropicProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const { config } = deps\n\n /**\n * 解析 Anthropic 端点参数\n *\n * 默认协议为 Anthropic 时使用全局标准配置与 HAI_AI_LLM_BASEURL;\n * 混合模型池中的 Anthropic 条目不继承 OpenAI 的全局端点,最后使用厂商变量兜底。\n */\n function resolveAnthropic(requestModel?: string, tempModel?: TempModelConfig): HaiResult<ResolvedAnthropic> {\n const entry = requestModel ? config.llm.models?.find(m => m.id === requestModel || m.model === requestModel) : undefined\n const model = tempModel?.model ?? entry?.model ?? requestModel ?? config.llm.model ?? 'claude-3-5-sonnet-latest'\n const apiKey = tempModel?.apiKey ?? entry?.apiKey ?? config.llm.apiKey ?? (process.env.HAI_AI_LLM_APIKEY?.trim() || process.env.ANTHROPIC_API_KEY)\n if (!apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_configError', { params: { error: 'API Key is required for Anthropic' } }))\n const globalBaseUrl = config.llm.api === 'anthropic' ? config.llm.baseUrl ?? (process.env.HAI_AI_LLM_BASEURL?.trim() || undefined) : undefined\n const baseUrl = (tempModel?.baseUrl ?? entry?.baseUrl ?? globalBaseUrl ?? process.env.ANTHROPIC_BASE_URL ?? DEFAULT_ANTHROPIC_BASE_URL).replace(/\\/+$/, '')\n return ok({\n apiKey,\n baseUrl,\n model,\n maxTokens: tempModel?.maxTokens ?? entry?.maxTokens ?? config.llm.maxTokens ?? DEFAULT_MAX_TOKENS,\n temperature: tempModel?.temperature ?? entry?.temperature ?? config.llm.temperature,\n timeout: tempModel?.timeout ?? entry?.timeout ?? config.llm.timeout ?? 60000,\n })\n }\n\n /** 构造 Anthropic 请求体 */\n function buildRequest(request: ChatCompletionRequest, resolved: ResolvedAnthropic, stream: boolean): AnthropicRequest {\n const { messages, system } = toAnthropicMessages(request.messages)\n const temperature = request.temperature ?? resolved.temperature\n return {\n model: resolved.model,\n max_tokens: request.max_tokens ?? resolved.maxTokens,\n messages,\n ...(system ? { system } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(request.top_p != null ? { top_p: request.top_p } : {}),\n ...(toAnthropicTools(request.tools) ? { tools: toAnthropicTools(request.tools) } : {}),\n stream,\n }\n }\n\n /** 发送 fetch 请求并统一超时/取消/错误处理 */\n async function post(resolved: ResolvedAnthropic, body: AnthropicRequest, signal?: AbortSignal): Promise<Response> {\n // 信号覆盖正文消费,不能在只收到响应头时就解除总超时。\n const timeout = AbortSignal.timeout(resolved.timeout)\n return fetch(`${resolved.baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': resolved.apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n body: JSON.stringify(body),\n signal: signal ? AbortSignal.any([signal, timeout]) : timeout,\n })\n }\n\n /** 将 HTTP 错误状态映射为标准错误定义 */\n function httpError(status: number, detail: string): { def: HaiErrorDef, message: string } {\n if (status === 429)\n return { def: HaiAIError.RATE_LIMITED, message: detail }\n if (status === 404)\n return { def: HaiAIError.MODEL_NOT_FOUND, message: detail }\n if (status === 400)\n return { def: HaiAIError.INVALID_REQUEST, message: detail }\n return { def: HaiAIError.API_ERROR, message: detail }\n }\n\n return {\n async chat(request): Promise<HaiResult<ChatCompletionResponse>> {\n const resolvedResult = resolveAnthropic(request.model, request.tempModel)\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n try {\n const res = await post(resolved, buildRequest(request, resolved, false), request.signal)\n if (!res.ok) {\n const detail = await res.text().catch(() => res.statusText)\n const mapped = httpError(res.status, detail.slice(0, 500))\n return err(mapped.def, mapped.message, { status: res.status })\n }\n const data = await res.json() as AnthropicResponse\n return ok(toChatResponse(data, resolved.model))\n }\n catch (error) {\n if (error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError'))\n return err(HaiAIError.TIMEOUT, aiM('ai_requestTimeout'), { message: error.message })\n return err(HaiAIError.INTERNAL_ERROR, aiM('ai_internalError', { params: { error: error instanceof Error ? error.message : 'Unknown error' } }), error)\n }\n },\n\n async* chatStream(request): AsyncIterable<ChatCompletionChunk> {\n const resolvedResult = resolveAnthropic(request.model, request.tempModel)\n if (!resolvedResult.success)\n throw new Error(resolvedResult.error.message)\n const resolved = resolvedResult.data\n\n const res = await post(resolved, buildRequest(request, resolved, true), request.signal)\n if (!res.ok || !res.body) {\n const detail = await res.text().catch(() => res.statusText)\n throw new Error(`Anthropic stream failed (${res.status}): ${detail.slice(0, 300)}`)\n }\n\n for await (const event of readSSEStream(res, request.signal)) {\n if (event.data === '[DONE]')\n return\n if (!event.data)\n continue\n let payload: { type?: string, delta?: { type?: string, text?: string }, usage?: AnthropicUsage, message?: { usage?: AnthropicUsage } }\n try {\n payload = JSON.parse(event.data)\n }\n catch {\n continue\n }\n if (payload.type === 'message_stop')\n return\n // 文本增量\n if (payload.type === 'content_block_delta' && payload.delta?.type === 'text_delta' && payload.delta.text) {\n yield textChunk(resolved.model, resolved.model, payload.delta.text)\n }\n // 完成事件:携带输出用量\n else if (payload.type === 'message_delta' && payload.usage) {\n yield {\n id: resolved.model,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model: resolved.model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop', logprobs: null }],\n usage: {\n prompt_tokens: payload.message?.usage?.input_tokens ?? 0,\n completion_tokens: payload.usage.output_tokens,\n total_tokens: (payload.message?.usage?.input_tokens ?? 0) + payload.usage.output_tokens,\n },\n }\n }\n }\n },\n\n async listModels(): Promise<HaiResult<string[]>> {\n // Anthropic 未提供公开的模型列表端点;返回配置中声明的模型名\n const models = new Set<string>()\n if (config.llm.model)\n models.add(config.llm.model)\n for (const entry of config.llm.models ?? []) {\n if ((entry.api ?? config.llm.api) === 'anthropic')\n models.add(entry.model)\n }\n return ok([...models])\n },\n }\n}\n","/**\n * @h-ai/ai — OpenAI Responses API 适配器\n *\n * 将框架统一的 Chat Completions 请求/响应形状与 OpenAI Responses API\n * (`/v1/responses`)互相转换,使 `ai.llm.chat/chatStream` 的调用方无需感知底层协议差异。\n *\n * 纯函数、无副作用,便于单测。文本对话与非流式工具调用完整支持;\n * 流式仅覆盖文本增量(流式工具调用建议使用 `api: 'chat'`)。\n * @module ai-llm-provider-openai-responses\n */\n\nimport type OpenAI from 'openai'\n\nimport type {\n AssistantMessage,\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatMessage,\n ToolCall,\n ToolDefinition,\n} from '../ai-llm-types.js'\n\n/**\n * OpenAI SDK 的 Responses 输入项数组;由统一消息适配后发送。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const input: ResponseInput = toResponsesInput([{ role: 'user', content: '你好' }])\n * const count = input.length\n * ```\n */\ntype ResponseInput = OpenAI.Responses.ResponseInput\n/**\n * OpenAI Responses 单项输入,包括消息、工具调用与工具结果。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const item: ResponseInputItem = { type: 'function_call_output', call_id: 'call-1', output: '晴' }\n * const input: ResponseInput = [item]\n * ```\n */\ntype ResponseInputItem = OpenAI.Responses.ResponseInputItem\n/**\n * OpenAI SDK 的完整 Responses 响应,由适配器转换为统一完成结果。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function convert(response: ResponsesResponse) {\n * const completion = responsesToChatResponse(response, response.model)\n * return { text: completion.choices[0]?.message.content, usage: completion.usage }\n * }\n * ```\n */\ntype ResponsesResponse = OpenAI.Responses.Response\n/**\n * OpenAI SDK 的 Responses 流事件;仅已实现事件映射为统一文本或用量增量。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function convert(event: ResponseStreamEvent) {\n * return responsesEventToChunk(event, 'gpt-4.1')\n * }\n * ```\n */\ntype ResponseStreamEvent = OpenAI.Responses.ResponseStreamEvent\n/**\n * OpenAI Responses 工具形状;统一 function 定义转换后传给 SDK。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const tools: ResponsesTool[] | undefined = toResponsesTools([{ type: 'function', function: { name: 'weather', parameters: { type: 'object', properties: { city: { type: 'string' } }, required: ['city'] } } }])\n * const count = tools?.length ?? 0\n * ```\n */\ntype ResponsesTool = OpenAI.Responses.Tool\n\n/** 从消息内容中提取纯文本(字符串直接返回,多模态数组拼接其 text 片段,忽略 refusal 等非文本块) */\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string')\n return content\n if (Array.isArray(content)) {\n return content\n .map(part => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? part.text : ''))\n .filter(Boolean)\n .join('')\n }\n return ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * 将框架消息列表转换为 Responses API 的 input 项\n *\n * - system / developer / user:映射为 EasyInputMessage\n * - assistant:文本映射为 assistant 消息;`tool_calls` 映射为 function_call 项\n * - tool:映射为 function_call_output 项(按 tool_call_id 关联)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const input = toResponsesInput([{ role: 'assistant', content: null, tool_calls: [{ id: 'call-1', type: 'function', function: { name: 'weather', arguments: '{\"city\":\"北京\"}' } }] }, { role: 'tool', tool_call_id: 'call-1', content: '晴' }])\n * const count = input.length\n * ```\n */\nexport function toResponsesInput(messages: ChatMessage[]): ResponseInput {\n const items: ResponseInputItem[] = []\n for (const message of messages) {\n if (message.role === 'tool') {\n items.push({\n type: 'function_call_output',\n call_id: message.tool_call_id,\n output: contentToText(message.content),\n })\n continue\n }\n\n if (message.role === 'assistant') {\n const assistant = message as AssistantMessage\n const text = contentToText(assistant.content)\n if (text)\n items.push({ role: 'assistant', content: text })\n if (assistant.tool_calls) {\n for (const call of assistant.tool_calls) {\n if (call.type === 'function') {\n items.push({\n type: 'function_call',\n call_id: call.id,\n name: call.function.name,\n arguments: call.function.arguments,\n })\n }\n }\n }\n continue\n }\n\n // system / developer / user——仅映射 EasyInputMessage 支持的角色(跳过遗留 function 角色)\n if (message.role === 'user' || message.role === 'system' || message.role === 'developer')\n items.push({ role: message.role, content: contentToText(message.content) })\n }\n return items\n}\n\n/**\n * 将 Chat Completions 工具定义转换为 Responses API 工具定义\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const tools = toResponsesTools([{ type: 'function', function: { name: 'weather', description: '查询天气', parameters: { type: 'object', properties: { city: { type: 'string' } }, required: ['city'] } } }])\n * const count = tools?.length ?? 0\n * ```\n */\nexport function toResponsesTools(tools?: ToolDefinition[]): ResponsesTool[] | undefined {\n if (!tools || tools.length === 0)\n return undefined\n const mapped: ResponsesTool[] = []\n for (const tool of tools) {\n if (tool.type !== 'function')\n continue\n mapped.push({\n type: 'function',\n name: tool.function.name,\n description: tool.function.description ?? null,\n parameters: (tool.function.parameters ?? {}) as Record<string, unknown>,\n strict: tool.function.strict ?? false,\n })\n }\n return mapped.length > 0 ? mapped : undefined\n}\n\n/** 从 Responses 响应的 output 数组提取 function_call → Chat Completions tool_calls */\nfunction extractToolCalls(response: ResponsesResponse): ToolCall[] {\n const toolCalls: ToolCall[] = []\n for (const item of response.output) {\n if (item.type === 'function_call') {\n toolCalls.push({\n id: item.call_id,\n type: 'function',\n function: { name: item.name, arguments: item.arguments },\n })\n }\n }\n return toolCalls\n}\n\n/** 将 Responses usage 映射为 Chat Completions usage */\nfunction mapUsage(usage: ResponsesResponse['usage']): ChatCompletionResponse['usage'] | undefined {\n if (!usage)\n return undefined\n return {\n prompt_tokens: usage.input_tokens,\n completion_tokens: usage.output_tokens,\n total_tokens: usage.total_tokens,\n }\n}\n\n/**\n * 将 Responses API 的完整响应转换为 Chat Completions 响应形状\n *\n * @param response - Responses API 响应\n * @param model - 请求使用的模型名(响应缺省时回退)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function convert(response: ResponsesResponse) {\n * const completion = responsesToChatResponse(response, 'gpt-4.1')\n * return { text: completion.choices[0]?.message.content, tools: completion.choices[0]?.message.tool_calls }\n * }\n * ```\n */\nexport function responsesToChatResponse(response: ResponsesResponse, model: string): ChatCompletionResponse {\n const toolCalls = extractToolCalls(response)\n const text = response.output_text ?? ''\n\n const message: ChatCompletionResponse['choices'][number]['message'] = {\n role: 'assistant',\n content: toolCalls.length > 0 && text.length === 0 ? null : text,\n refusal: null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n }\n\n const usage = mapUsage(response.usage)\n\n return {\n id: response.id,\n object: 'chat.completion',\n created: response.created_at,\n model: response.model ?? model,\n choices: [{\n index: 0,\n message,\n finish_reason: toolCalls.length > 0 ? 'tool_calls' : 'stop',\n logprobs: null,\n }],\n ...(usage ? { usage } : {}),\n }\n}\n\n/**\n * 将单个 Responses 流事件转换为 Chat Completions 流块\n *\n * 仅处理文本增量与完成事件;其余事件(工具调用、推理等)返回 null 由上层忽略。\n *\n * @param event - Responses 流事件\n * @param model - 请求使用的模型名\n * @returns 对应的 ChatCompletionChunk,或 null(无需转发的事件)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function convert(event: ResponseStreamEvent) {\n * const chunk = responsesEventToChunk(event, 'gpt-4.1')\n * return chunk?.choices[0]?.delta.content ?? ''\n * }\n * ```\n */\nexport function responsesEventToChunk(event: ResponseStreamEvent, model: string): ChatCompletionChunk | null {\n if (event.type === 'response.output_text.delta') {\n return {\n id: event.item_id,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [{ index: 0, delta: { content: event.delta }, finish_reason: null, logprobs: null }],\n }\n }\n\n if (event.type === 'response.completed') {\n const usage = mapUsage(event.response.usage)\n return {\n id: event.response.id,\n object: 'chat.completion.chunk',\n created: event.response.created_at,\n model: event.response.model ?? model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop', logprobs: null }],\n ...(usage ? { usage } : {}),\n }\n }\n\n return null\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 ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatMessage,\n TempModelConfig,\n} from '../ai-llm-types.js'\nimport type { AILLMFunctionsDeps, LLMProvider } from './ai-llm-provider-types.js'\n\nimport process from 'node:process'\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'\nimport {\n responsesEventToChunk,\n responsesToChatResponse,\n toResponsesInput,\n toResponsesTools,\n} from './ai-llm-provider-openai-responses.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\nfunction toOpenAIMessage(message: ChatMessage): OpenAI.Chat.Completions.ChatCompletionMessageParam {\n if (message.role === 'developer') {\n const developerMessage: OpenAI.Chat.Completions.ChatCompletionDeveloperMessageParam = {\n role: 'developer',\n content: message.content,\n ...(message.name ? { name: message.name } : {}),\n }\n return developerMessage\n }\n\n return message\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 已解析的客户端及其参数回填默认值(maxTokens/temperature 仅临时模型路径有值)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function resolved(client: OpenAI, model: string): ResolvedClient {\n * return { client, model, api: 'chat', maxTokens: 1024 }\n * }\n * ```\n */\ninterface ResolvedClient {\n client: OpenAI\n model: string\n /** API 协议:chat = Chat Completions;responses = Responses API */\n api: 'chat' | 'responses'\n maxTokens?: number\n temperature?: number\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function complete(deps: AILLMFunctionsDeps) {\n * const provider = createOpenAIProvider(deps)\n * const result = await provider.chat({ messages: [{ role: 'user', content: '你好' }] })\n * if (!result.success) return result\n * return result.data.choices[0]?.message.content\n * }\n * ```\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 // 临时模型客户端缓存:与常驻 clientCache 隔离,带 TTL 过期(默认 10 分钟,见 LLMConfig.tempModelCacheTtl)\n const tempClientCache = new Map<string, { client: OpenAI, expiresAt: number }>()\n const tempCacheTtl = config.llm.tempModelCacheTtl ?? 600000\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 /**\n * 获取临时模型客户端(带 TTL 过期)\n *\n * 每次调用惰性清理过期实例(无需定时器,避免 close 清理负担)。\n * 命中未过期缓存直接复用;否则创建新实例并记录过期时间(自创建起 `tempCacheTtl` 毫秒)。\n */\n function getTempClient(apiKey: string, baseURL: string, timeout: number): OpenAI {\n const now = Date.now()\n // 惰性清理过期实例,避免缓存无限增长\n for (const [k, v] of tempClientCache) {\n if (v.expiresAt <= now)\n tempClientCache.delete(k)\n }\n const key = `${apiKey}::${baseURL}::${timeout}`\n const cached = tempClientCache.get(key)\n if (cached)\n return cached.client\n const client = new OpenAI({ apiKey, baseURL, timeout })\n tempClientCache.set(key, { client, expiresAt: now + tempCacheTtl })\n return client\n }\n\n function resolveClient(requestModel?: string, tempModel?: TempModelConfig): HaiResult<ResolvedClient> {\n if (tempModel)\n return resolveTempClient(tempModel)\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, api } = resolvedResult.data\n // 本 Provider 覆盖 OpenAI 原生的两种协议;anthropic 由路由层分派到 Anthropic Provider\n const resolvedApi = api === 'responses' ? 'responses' : 'chat'\n return ok({ client: getClient(apiKey ?? '', baseUrl ?? 'https://api.openai.com/v1', timeout), model, api: resolvedApi })\n }\n\n /**\n * 解析临时模型客户端\n *\n * 临时模型字段优先,未指定时回退到全局 LLM 配置 / 环境变量;\n * `maxTokens` / `temperature` 作为请求未显式指定时的回填默认值返回。\n */\n function resolveTempClient(tempModel: TempModelConfig): HaiResult<ResolvedClient> {\n const apiKey = tempModel.apiKey ?? config.llm.apiKey ?? (process.env.HAI_AI_LLM_APIKEY?.trim() || process.env.OPENAI_API_KEY)\n if (!apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_configError', { params: { error: 'API Key is required for temp model' } }))\n const baseUrl = tempModel.baseUrl ?? config.llm.baseUrl ?? (process.env.HAI_AI_LLM_BASEURL?.trim() || process.env.OPENAI_BASE_URL) ?? 'https://api.openai.com/v1'\n const timeout = tempModel.timeout ?? config.llm.timeout ?? 60000\n const api = (tempModel.api ?? config.llm.api) === 'responses' ? 'responses' : 'chat'\n return ok({\n client: getTempClient(apiKey, baseUrl, timeout),\n model: tempModel.model,\n api,\n maxTokens: tempModel.maxTokens ?? config.llm.maxTokens,\n temperature: tempModel.temperature ?? config.llm.temperature,\n })\n }\n\n /**\n * 构建 Responses API 请求参数(非流式基础形状)\n *\n * 将 Chat Completions 语义映射到 Responses:messages→input、max_tokens→max_output_tokens、\n * tools 转 Responses 工具定义;`tool_choice` 仅透传字符串枚举。\n */\n function buildResponsesParams(\n request: ChatCompletionRequest,\n resolved: ResolvedClient,\n ): OpenAI.Responses.ResponseCreateParamsNonStreaming {\n const maxOutput = request.max_tokens ?? resolved.maxTokens\n const temperature = request.temperature ?? resolved.temperature\n const toolChoice = typeof request.tool_choice === 'string' ? request.tool_choice : undefined\n return {\n model: resolved.model,\n input: toResponsesInput(request.messages),\n ...(maxOutput != null ? { max_output_tokens: maxOutput } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(request.top_p != null ? { top_p: request.top_p } : {}),\n ...(toResponsesTools(request.tools) ? { tools: toResponsesTools(request.tools) } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n stream: false,\n }\n }\n\n return {\n async chat(request: ChatCompletionRequest): Promise<HaiResult<ChatCompletionResponse>> {\n const clientResult = resolveClient(request.model, request.tempModel)\n if (!clientResult.success)\n return clientResult\n const resolved = clientResult.data\n const { client, model, maxTokens, temperature, api } = resolved\n const { objectId: _objectId, sessionId: _sessionId, tempModel: _tempModel, signal, ...openaiRequest } = request\n try {\n // Responses API 分支:转换请求/响应形状,对调用方透明\n if (api === 'responses') {\n const response = await client.responses.create(buildResponsesParams(request, resolved), { signal })\n return ok(responsesToChatResponse(response, model))\n }\n\n const openaiMessages = request.messages.map(toOpenAIMessage)\n const params = {\n ...openaiRequest,\n messages: openaiMessages,\n model,\n ...(maxTokens !== undefined && openaiRequest.max_tokens == null ? { max_tokens: maxTokens } : {}),\n ...(temperature !== undefined && openaiRequest.temperature == null ? { temperature } : {}),\n stream: false,\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n // 仅在存在取消信号时传入请求选项,避免无谓的第二参数\n const response = signal\n ? await client.chat.completions.create(params, { signal })\n : await client.chat.completions.create(params)\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, request.tempModel)\n if (!clientResult.success)\n throw new Error(clientResult.error.message)\n const resolved = clientResult.data\n const { client, model, maxTokens, temperature, api } = resolved\n const { objectId: _objectId, sessionId: _sessionId, tempModel: _tempModel, signal, ...openaiRequest } = request\n\n // Responses API 流式分支:转发文本增量与完成事件\n if (api === 'responses') {\n const responsesStream = await client.responses.create(\n { ...buildResponsesParams(request, resolved), stream: true },\n { signal },\n )\n for await (const event of responsesStream) {\n const chunk = responsesEventToChunk(event, model)\n if (chunk)\n yield chunk\n }\n return\n }\n\n const openaiMessages = request.messages.map(toOpenAIMessage)\n const params = {\n ...openaiRequest,\n messages: openaiMessages,\n model,\n ...(maxTokens !== undefined && openaiRequest.max_tokens == null ? { max_tokens: maxTokens } : {}),\n ...(temperature !== undefined && openaiRequest.temperature == null ? { temperature } : {}),\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming\n const stream = signal\n ? await client.chat.completions.create(params, { signal })\n : await client.chat.completions.create(params)\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 Provider 路由层\n *\n * 按每次请求解析出的 API 协议(`chat` / `responses` / `anthropic`)分派到具体 Provider,\n * 对上层 `ai.llm` 暴露统一的 `LLMProvider` 接口。OpenAI Provider 内部同时覆盖\n * Chat Completions 与 Responses 两种原生协议;Anthropic 走独立 Provider。\n * @module ai-llm-provider-router\n */\n\nimport type { ChatCompletionChunk, ChatCompletionRequest } from '../ai-llm-types.js'\nimport type { AILLMFunctionsDeps, LLMProvider } from './ai-llm-provider-types.js'\n\nimport { resolveModelApi } from '../../ai-config.js'\nimport { createAnthropicProvider } from './ai-llm-provider-anthropic.js'\nimport { createOpenAIProvider } from './ai-llm-provider-openai.js'\n\n/**\n * 创建按协议分派的 LLM Provider\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns 统一的 LLMProvider(内部按模型 `api` 路由)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function complete(deps: AILLMFunctionsDeps) {\n * const provider = createLLMProvider(deps)\n * const result = await provider.chat({ messages: [{ role: 'user', content: '你好' }] })\n * if (!result.success) return result\n * return result.data.choices[0]?.message.content\n * }\n * ```\n */\nexport function createLLMProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const openai = createOpenAIProvider(deps)\n // Anthropic Provider 惰性创建:仅在实际使用到 anthropic 协议时初始化\n let anthropic: LLMProvider | undefined\n\n function getAnthropic(): LLMProvider {\n anthropic ??= createAnthropicProvider(deps)\n return anthropic\n }\n\n /** 按请求解析协议并选择 Provider(chat / responses → OpenAI;anthropic → Anthropic) */\n function pick(request: ChatCompletionRequest): LLMProvider {\n const api = resolveModelApi(deps.config.llm, request.model, request.tempModel?.api)\n return api === 'anthropic' ? getAnthropic() : openai\n }\n\n return {\n chat: request => pick(request).chat(request),\n chatStream: (request): AsyncIterable<ChatCompletionChunk> => pick(request).chatStream(request),\n listModels: () => {\n const api = deps.config.llm.api ?? 'chat'\n return api === 'anthropic' ? getAnthropic().listModels() : openai.listModels()\n },\n }\n}\n","/**\n * @h-ai/ai — LLM 子功能工厂\n *\n * 根据配置的 API 协议选择 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 GenerateObjectRequest,\n LLMOperations,\n StreamOperations,\n TokenUsage,\n ToolsOperations,\n} from './ai-llm-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { z } from 'zod'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { updateSessionInfo } from '../store/ai-store-session.js'\nimport { collectStream, createSSEDecoder, createStreamProcessor, encodeSSE } from './ai-llm-stream.js'\nimport { createToolRegistry, defineTool } from './ai-llm-tool.js'\nimport { createLLMProvider } from './providers/ai-llm-provider-router.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'llm' })\n\n// ─── LLM 子功能 ───\n\n/**\n * LLM 子功能存储依赖\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function bindHistory(recordStore: AIRelStore<ChatRecord>, sessionStore: AIRelStore<SessionInfo>): AILLMStores {\n * return { recordStore, sessionStore }\n * }\n * ```\n */\nexport interface AILLMStores {\n /** 对话记录存储(可选;未传入时不记录) */\n recordStore?: AIRelStore<ChatRecord>\n /** 会话信息存储(可选;未传入时 listSessions 返回空) */\n sessionStore?: AIRelStore<SessionInfo>\n}\n\n/**\n * LLM 子功能创建结果\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function encodeMessage(functions: AILLMFunctions): string {\n * return functions.stream.encodeSSE({ event: 'message', data: '你好' })\n * }\n * ```\n */\nexport interface AILLMFunctions {\n /** LLM 操作接口(对话 / 流式对话 / 模型列表 / 历史 / 会话) */\n llm: LLMOperations\n /** 工具操作接口(定义工具 / 创建注册表) */\n tools: ToolsOperations\n /** 流处理操作接口(流处理器 / SSE 编解码) */\n stream: StreamOperations\n}\n\n/**\n * 创建 LLM 相关的全部子功能\n *\n * 根据配置的 API 协议选择 Provider,组装 LLM、工具、流处理三个操作接口。\n * 若传入 `deps.recordStore`,chat 调用会自动保存 ChatRecord。\n *\n * @param config - 校验后的 AI 配置\n * @param deps - 可选依赖(记录存储、会话存储)\n * @returns `{ llm, tools, stream }` 三个操作接口\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function ask(config: AIConfig, stores: AILLMStores) {\n * const functions = createAILLMFunctions(config, stores)\n * const result = await functions.llm.chat({ messages: [{ role: 'user', content: '你好' }], objectId: 'user-1', sessionId: 'session-1' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport function createAILLMFunctions(config: AIConfig, deps?: AILLMStores): AILLMFunctions {\n const provider = createLLMProvider({ 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 await updateSessionInfo(sessionStore, record, (existing, now) => {\n if (existing?.deleted)\n return undefined\n return existing\n ? { ...existing, updatedAt: now }\n : { sessionId: record.sessionId, objectId: record.objectId, title: extractTitle(messages), createdAt: now, updatedAt: now }\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 context = { model: request.model ?? request.tempModel?.model, messageCount: request.messages.length }\n logger.debug('LLM chat started', context)\n const result = await provider.chat(request)\n if (result.success) {\n logger.info('LLM chat completed', {\n ...context,\n model: result.data.model,\n durationMs: Date.now() - start,\n choiceCount: result.data.choices.length,\n totalTokens: result.data.usage?.total_tokens,\n })\n }\n else {\n logger.warn('LLM chat failed', {\n ...context,\n durationMs: Date.now() - start,\n code: result.error.code,\n error: result.error.message,\n })\n }\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 logContext = { model: request.model ?? request.tempModel?.model, messageCount: request.messages.length }\n logger.debug('LLM chat stream started', logContext)\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 ?? request.tempModel?.model ?? ''\n\n try {\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 logger.info('LLM chat stream completed', {\n ...logContext,\n model: resolvedModel || logContext.model,\n durationMs: Date.now() - start,\n contentLength: content.length,\n finishReason,\n })\n }\n catch (error) {\n logger.warn('LLM chat stream failed', { ...logContext, durationMs: Date.now() - start, error })\n throw error\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.filter(item => !item.deleted))\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 tempModel: options?.tempModel,\n signal: options?.signal,\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 tempModel: options?.tempModel,\n signal: options?.signal,\n })) {\n const delta = chunk.choices[0]?.delta?.content\n if (delta)\n yield delta\n }\n },\n\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<HaiResult<T>> {\n const baseMessages: ChatMessage[] = []\n if (request.systemPrompt)\n baseMessages.push({ role: 'system', content: request.systemPrompt })\n baseMessages.push(...request.messages)\n\n const jsonSchema = z.toJSONSchema(request.schema)\n const schemaName = request.schemaName ?? 'result'\n const maxRepairs = request.maxRepairs ?? 1\n let lastError = ''\n\n for (let attempt = 0; attempt <= maxRepairs; attempt++) {\n const messages: ChatMessage[] = attempt === 0\n ? baseMessages\n : [...baseMessages, { role: 'user', content: aiM('ai_generateObjectRepair', { params: { error: lastError } }) }]\n const result = await chatWithRecord({\n messages,\n model: request.model,\n temperature: request.temperature,\n tempModel: request.tempModel,\n enablePersist: false,\n signal: request.signal,\n response_format: { type: 'json_schema', json_schema: { name: schemaName, schema: jsonSchema, strict: true } },\n })\n if (!result.success)\n return result as HaiResult<never>\n\n const content = result.data.choices[0]?.message?.content\n const text = typeof content === 'string' ? content : ''\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n }\n catch {\n lastError = 'invalid JSON'\n continue\n }\n const validated = request.schema.safeParse(parsed)\n if (validated.success)\n return ok(validated.data)\n lastError = validated.error.message\n }\n\n return err(HaiAIError.INVALID_REQUEST, aiM('ai_generateObjectFailed', { params: { error: lastError || 'unknown' } }))\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'\nimport type { JsonSchemaValidator } from '@modelcontextprotocol/sdk/validation'\n\nimport type {\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'\nimport { BlobResourceContentsSchema, PromptMessageSchema, TextResourceContentsSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { AjvJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/ajv'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n// ─── 内部类型 ───\n\n/**\n * 工具注册记录(定义 + 处理器)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const validator = new AjvJsonSchemaValidator()\n * const definition: MCPToolDefinition = { name: 'echo', description: '返回输入', inputSchema: { type: 'string' } }\n * const registration: ToolRegistration = { definition, handler: input => input, validate: validator.getValidator(definition.inputSchema) }\n * const validation = registration.validate('你好')\n * ```\n */\ninterface ToolRegistration {\n /** 工具元数据 */\n definition: MCPToolDefinition\n /** 工具执行处理器 */\n handler: MCPToolHandler\n /** 注册时编译一次,调用时复用输入校验器 */\n validate: JsonSchemaValidator<unknown>\n}\n\n/**\n * 资源注册记录(元数据 + 内容加载器)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const registration: ResourceRegistration = { resource: { uri: 'config://public/features', name: '公开特性' }, handler: async () => ({ uri: 'config://public/features', text: 'enabled' }) }\n * const content = await registration.handler()\n * ```\n */\ninterface ResourceRegistration {\n /** 资源元数据 */\n resource: MCPResource\n /** 内容加载器(延迟读取) */\n handler: () => Promise<MCPResourceContent>\n}\n\n/**\n * 提示词注册记录(元数据 + 模板渲染器)\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const registration: PromptRegistration = { prompt: { name: 'explain' }, handler: async args => [{ role: 'user', content: { type: 'text', text: args.topic ?? '共享状态' } }] }\n * const messages = await registration.handler({ topic: '共享状态' })\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 * @returns MCPOperations 接口\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const mcp = createAIMCPFunctions()\n * const registered = mcp.registerTool({ name: 'echo', description: '返回输入', inputSchema: { type: 'string' } }, (input: string) => input)\n * if (!registered.success) throw new Error(registered.error.message)\n * const result = await mcp.callTool('echo', '你好')\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\nexport function createAIMCPFunctions(): MCPOperations {\n const validator = new AjvJsonSchemaValidator()\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 try {\n const validate = validator.getValidator(definition.inputSchema)\n tools.set(definition.name, { definition, handler: handler as MCPToolHandler, validate })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.MCP_TOOL_ERROR, aiM('ai_mcpInvalidToolSchema', { params: { name: definition.name } }), error)\n }\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 validation = registration.validate(args)\n if (!validation.valid)\n return err(HaiAIError.MCP_TOOL_ERROR, aiM('ai_mcpInvalidToolInput', { params: { name } }))\n const ctx: MCPContext = { ...context, requestId: 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 // SDK Schema 校验字段类型,再保证 text/blob 恰好存在一项。\n const text = TextResourceContentsSchema.safeParse(content)\n const blob = BlobResourceContentsSchema.safeParse(content)\n if (text.success === blob.success\n || (text.success && Object.hasOwn(content, 'blob'))\n || (blob.success && Object.hasOwn(content, 'text'))) {\n return err(HaiAIError.MCP_RESOURCE_ERROR, aiM('ai_mcpInvalidResource', { params: { uri } }))\n }\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 && !Object.hasOwn(args, arg.name)) {\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpPromptMissingArg', { params: { name, arg: arg.name } }))\n }\n if (Object.hasOwn(args, arg.name) && typeof args[arg.name] !== 'string')\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpInvalidPrompt', { params: { name } }))\n }\n\n const messages = await registration.handler(args)\n if (!Array.isArray(messages) || messages.some(message => !PromptMessageSchema.safeParse(message).success))\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpInvalidPrompt', { params: { name } }))\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 * 在 Provider 实现的 {@link MemoryCoreOperations} 基础上,封装出对外的 {@link MemoryOperations}:\n * - `scoped(binding)`:返回自动绑定 objectId / scope 的安全实例(多租户推荐入口);\n * - `admin.clearAll({ confirm })`:唯一的全局清空入口,需显式确认;\n * - `clear`:拒绝空过滤调用,防止「忘记传条件」导致误清全局。\n * @module memory/ai-memory-facade\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type {\n MemoryClearAllOptions,\n MemoryClearOptions,\n MemoryCoreOperations,\n MemoryEntryInput,\n MemoryOperations,\n ScopedMemoryBinding,\n ScopedMemoryOperations,\n} from './ai-memory-types.js'\n\nimport { err } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n/**\n * 创建绑定作用域的记忆实例:所有操作自动携带 objectId / scope,get/update/remove 自动归属校验。\n */\nfunction createScopedMemory(core: MemoryCoreOperations, binding: ScopedMemoryBinding): ScopedMemoryOperations {\n const { objectId, scope } = binding\n const accessScope = { objectId, scope }\n\n return {\n extract: (messages: ChatMessage[], options) =>\n core.extract(messages, { ...options, objectId, scope }),\n recall: (query: string, options) =>\n core.recall(query, { ...options, objectId, scope }),\n injectMemories: (messages: ChatMessage[], options) =>\n core.injectMemories(messages, { ...options, objectId, scope }),\n add: (entry: Omit<MemoryEntryInput, 'objectId' | 'scope'>) =>\n core.add({ ...entry, objectId, scope }),\n update: (memoryId: string, updates) => core.update(memoryId, updates, accessScope),\n get: (memoryId: string) => core.get(memoryId, accessScope),\n remove: (memoryId: string) => core.remove(memoryId, accessScope),\n list: options =>\n core.list({ ...options, objectId, scope }),\n listPage: options =>\n core.listPage({ ...options, objectId, scope }),\n clear: options =>\n core.clear({ ...options, objectId, scope }),\n }\n}\n\n/**\n * 将 Provider 核心操作封装为对外的公共记忆操作接口。\n *\n * @param core - Provider 实现的核心操作\n * @returns 增加 scoped / admin 且对 clear 施加空过滤保护的公共接口\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function scoped(core: MemoryCoreOperations) {\n * const memory = createMemoryOperations(core).scoped({ objectId: 'user-1', scope: { tenant: 'tenant-1' } })\n * const result = await memory.add({ content: '用户喜欢绿茶', type: 'preference' })\n * if (!result.success) return result\n * return result.data.id\n * }\n * ```\n */\nexport function createMemoryOperations(core: MemoryCoreOperations): MemoryOperations {\n return {\n ...core,\n\n /**\n * 清空记忆(空过滤保护)。\n *\n * 未传任何过滤条件(objectId / types / scope 全空)时**拒绝执行**,\n * 避免误清全局;全局清空必须显式使用 `admin.clearAll({ confirm: true })`。\n */\n async clear(options?: MemoryClearOptions): Promise<HaiResult<void>> {\n const hasFilter = Boolean(options?.objectId) || Boolean(options?.types?.length) || Boolean(options?.scope)\n if (!hasFilter) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryClearRequiresFilter'))\n }\n return core.clear(options)\n },\n\n scoped: (binding: ScopedMemoryBinding) => createScopedMemory(core, binding),\n\n admin: {\n async clearAll(options: MemoryClearAllOptions): Promise<HaiResult<void>> {\n if (options?.confirm !== true) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryClearAllUnconfirmed'))\n }\n return core.clear()\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, TempModelConfig } 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' })\nconst LEADING_MARKDOWN_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_MARKDOWN_FENCE_REGEX = /\\n?```$/\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 * @param options.tempModel - 临时模型配置\n * @param options.signal - 取消信号\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function extract(llm: LLMOperations) {\n * const result = await extractMemories(llm, [{ role: 'user', content: '我喜欢绿茶' }], { objectId: 'user-1', types: ['preference'], minImportance: 0.5 })\n * if (!result.success) return result\n * return result.data.map(entry => entry.content)\n * }\n * ```\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 tempModel?: TempModelConfig\n signal?: AbortSignal\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 ...(options?.tempModel ? { tempModel: options.tempModel } : {}),\n messages: [\n { role: 'system', content: options?.systemPrompt ?? MEMORY_EXTRACTION_SYSTEM_PROMPT },\n { role: 'user', content: userPrompt },\n ],\n temperature: 0.1,\n signal: options?.signal,\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(LEADING_MARKDOWN_FENCE_REGEX, '').replace(TRAILING_MARKDOWN_FENCE_REGEX, '')\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 * 原生与 Mem0 后端共用同一套上下文注入行为,确保切换后端不改变消息结构。\n * @module ai-memory-injection\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { MemoryAccessScope, MemoryEntry, MemoryInjectionOptions, MemoryRecallOptions } 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' })\n\n/**\n * 供共享注入逻辑调用的召回能力;失败保留 HaiResult,主体范围由可信装配绑定。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function bind(recall: RecallMemories): RecallMemories {\n * return (query, options) => recall(query, { ...options, objectId: 'user-1' })\n * }\n * ```\n */\ntype RecallMemories = (query: string, options?: MemoryRecallOptions) => Promise<HaiResult<MemoryEntry[]>>\n\n/**\n * 按 ID 访问单条记忆时的归属校验(native / Mem0 后端共用)。\n *\n * 返回 `true` 表示该记忆不属于调用主体 / 作用域,调用方应统一返回 `MEMORY_NOT_FOUND`;\n * `accessScope` 未传时不做校验(返回 `false`),仅供已建立可信边界的模块内部调用;外部请求应使用 scoped 实例。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function visible(entry: MemoryEntry) {\n * return !isMemoryAccessDenied(entry, { objectId: 'user-1', scope: { tenant: 'tenant-1' } })\n * }\n * ```\n */\nexport function isMemoryAccessDenied(entry: MemoryEntry, accessScope?: MemoryAccessScope): boolean {\n if (!accessScope)\n return false\n if (entry.objectId !== accessScope.objectId)\n return true\n if (accessScope.scope) {\n if (!entry.scope)\n return true\n const entryScope = entry.scope as Record<string, unknown>\n return !Object.entries(accessScope.scope).every(([key, value]) => entryScope[key] === value)\n }\n return false\n}\n\n/** 从消息中提取最后一条用户文本 */\nfunction extractQueryFromMessages(messages: ChatMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message.role === 'user')\n return typeof message.content === 'string' ? message.content : ''\n }\n return ''\n}\n\n/**\n * 将召回结果注入消息列表\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function enrich(recall: RecallMemories) {\n * const result = await injectRelevantMemories([{ role: 'user', content: '我喜欢喝什么?' }], { objectId: 'user-1', topK: 5, maxTokens: 500 }, recall)\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport async function injectRelevantMemories(\n messages: ChatMessage[],\n options: MemoryInjectionOptions | undefined,\n recall: RecallMemories,\n): 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 const recallResult = await recall(query, {\n topK,\n candidateMultiplier: options?.candidateMultiplier,\n objectId: options?.objectId,\n scope: options?.scope,\n types: options?.types,\n minImportance: options?.minImportance,\n })\n if (!recallResult.success) {\n return err(HaiAIError.MEMORY_ENRICH_FAILED, aiM('ai_memoryEnrichFailed', { params: { error: recallResult.error.message } }), recallResult.error)\n }\n\n if (recallResult.data.length === 0)\n return ok([...messages])\n\n let memoryText = recallResult.data\n .map((memory, index) => `[${index + 1}] (${memory.type}) ${memory.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 const result = [...messages]\n\n if (position === 'system') {\n const systemIndex = result.findIndex(message => message.role === 'system')\n if (systemIndex >= 0) {\n const systemMessage = result[systemIndex]\n result[systemIndex] = {\n ...systemMessage,\n content: (systemMessage 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 lastUserIndex = -1\n for (let index = result.length - 1; index >= 0; index--) {\n if (result[index].role === 'user') {\n lastUserIndex = index\n break\n }\n }\n if (lastUserIndex > 0) {\n result.splice(lastUserIndex, 0, {\n role: 'system',\n content: `Relevant memories:${memoryBlock}`,\n })\n }\n }\n\n logger.trace('Memories enriched', { count: recallResult.data.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 * @h-ai/ai — Mem0 OSS 记忆 Provider(真·嵌入式 mem0 引擎)\n *\n * 通过 `mem0ai/oss` 的 `Memory` 引擎实现记忆能力,LLM / Embedder 从 AIConfig 提取\n * (OpenAI 兼容,走 baseURL),向量库从 storeProvider 暴露的原始连接映射:\n * qdrant 复用同一后端;当前适配无法映射的后端默认 fail-fast。\n * 临时内存回退仅用于开发或明确的 E2E 环境,生产必须使用实际持久化 Qdrant 后端。\n * @module ai-memory-provider-mem0-oss\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\nimport type { MemoryConfig as Mem0Config, Memory as Mem0Memory, MemoryItem as Mem0MemoryItem } from 'mem0ai/oss'\n\nimport type { AIConfig, MemoryConfig } from '../../ai-config.js'\nimport type { ChatMessage, LLMOperations } from '../../llm/ai-llm-types.js'\nimport type { AIVectorBackend } from '../../store/ai-store-types.js'\nimport type {\n MemoryAccessScope,\n MemoryCoreOperations,\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryType,\n MemoryUpdateInput,\n} from '../ai-memory-types.js'\n\nimport process from 'node:process'\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'\nimport { extractMemories as extractTypedMemories } from '../ai-memory-extractor.js'\nimport { injectRelevantMemories, isMemoryAccessDenied } from '../ai-memory-injection.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-mem0-oss' })\nconst DEFAULT_IMPORTANCE = 0.5\nconst DEFAULT_OBJECT_ID = 'hai-global'\nconst MEM0_LIST_CANDIDATE_LIMIT = 1000\nconst MEMORY_TYPES = new Set<MemoryType>(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/** SDK 无游标;拒绝把截断的候选集当成完整结果或执行部分删除。 */\nclass Mem0ListIncompleteError extends Error {}\n\n/** 写后读或回执失败不证明未写入;保留可核对的 ID,调用方不得盲目重做 add/extract。 */\nfunction memoryWriteFailure(definition: HaiErrorDef, message: string, cause: unknown, memoryIds: string[]): HaiResult<never> {\n const failure = err(definition, message, cause)\n if (!failure.success)\n failure.error.ext = { requiresEffectReconciliation: true, memoryIds: [...memoryIds] }\n return failure\n}\n\n/**\n * 创建 Mem0 OSS Provider 的依赖\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function bind(config: MemoryConfig, aiConfig: AIConfig, llm: LLMOperations, backend: AIVectorBackend): Mem0OssDeps {\n * return { config, aiConfig, llm, collectionName: 'hai_memories', embeddingDims: 1536, vectorBackend: backend }\n * }\n * // 只有受支持且已就绪的实际 Qdrant 连接可用于生产,不以 provider 字符串代替能力检查。\n * ```\n */\nexport interface Mem0OssDeps {\n /** 记忆配置(与 native 共用顶层字段) */\n config: MemoryConfig\n /** 完整 AI 配置(用于解析 LLM / Embedder) */\n aiConfig: AIConfig\n /** hai LLM 操作接口(用于框架层记忆提取,保证 type/importance 分类与 native 一致) */\n llm: LLMOperations\n /** 向量库集合名 */\n collectionName: string\n /** 向量维度(可选,未提供时由 mem0 探测) */\n embeddingDims?: number\n /** hai vecdb 后端连接(qdrant 复用;pgvector 无可管理的 SDK 生命周期,拒绝启动) */\n vectorBackend?: AIVectorBackend\n}\n\n/**\n * 完成公开 SDK 就绪检查后的内部能力与默认召回参数,不拥有调用方的向量连接。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function context(memory: Mem0Memory, llm: LLMOperations): Mem0OssContext {\n * return { memory, llm, defaultObjectId: 'hai-global', defaultTopK: 5, candidateMultiplier: 3 }\n * }\n * ```\n */\ninterface Mem0OssContext {\n memory: Mem0Memory\n /** hai LLM 操作接口(框架层提取用) */\n llm: LLMOperations\n /** 提取默认 systemPrompt(模块配置,可被调用级 systemPrompt 覆盖) */\n systemPrompt?: string\n defaultObjectId: string\n /** 检索默认返回数量 */\n defaultTopK: number\n /** 候选池倍数(scope 过滤前的候选取回宽度 = topK × candidateMultiplier) */\n candidateMultiplier: number\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction normalizeType(value: unknown, fallback: MemoryType): MemoryType {\n return typeof value === 'string' && MEMORY_TYPES.has(value as MemoryType) ? value as MemoryType : fallback\n}\n\nfunction normalizeImportance(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, Math.min(1, value)) : fallback\n}\n\nfunction parseTimestamp(value: unknown, fallback: number): number {\n if (typeof value === 'string' || typeof value === 'number') {\n const timestamp = new Date(value).getTime()\n if (Number.isFinite(timestamp))\n return timestamp\n }\n return fallback\n}\n\n/**\n * 将 hai 业务字段编码为 mem0 metadata\n *\n * 完整保留业务 metadata,\n * 并记录归属主体 `hai_object_id`。\n * `category` 额外平铺到顶层,兼容 consolidation 逻辑与 mem0 过滤。\n *\n * @param entry - 记忆输入字段(type / importance / scope / metadata)\n * @param objectId - 归属主体 ID(写入 hai_object_id)\n */\nfunction buildMetadata(\n entry: Pick<MemoryEntryInput, 'type' | 'importance' | 'scope' | 'metadata'>,\n objectId: string,\n): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n hai_type: entry.type,\n hai_importance: entry.importance ?? DEFAULT_IMPORTANCE,\n hai_object_id: objectId,\n }\n if (entry.scope)\n metadata.hai_scope = entry.scope\n if (entry.metadata && Object.keys(entry.metadata).length > 0)\n metadata.hai_metadata = entry.metadata\n const category = entry.metadata?.category\n if (typeof category === 'string' && category.trim().length > 0)\n metadata.category = category.trim()\n return metadata\n}\n\n/**\n * 从 mem0 metadata 还原 hai 公共元数据(剥离内部保留键)\n *\n * 优先返回完整业务 metadata(`hai_metadata`);对早期仅平铺 `category` 的数据做兼容。\n */\nfunction toPublicMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const business: Record<string, unknown> = isRecord(metadata.hai_metadata) ? { ...metadata.hai_metadata } : {}\n if (business.category === undefined && typeof metadata.category === 'string' && metadata.category.trim().length > 0)\n business.category = metadata.category.trim()\n return Object.keys(business).length > 0 ? business : undefined\n}\n\n/** 将 mem0 MemoryItem 映射为 hai MemoryEntry */\nfunction toMemoryEntry(item: Mem0MemoryItem, fallbackObjectId: string): MemoryEntry {\n const metadata = isRecord(item.metadata) ? item.metadata : {}\n const now = Date.now()\n const createdAt = parseTimestamp(item.createdAt, now)\n const scope = isRecord(metadata.hai_scope) ? metadata.hai_scope : undefined\n // 优先使用写入时记录的归属主体,避免按 memoryId 直读时误判为默认主体\n const objectId = typeof metadata.hai_object_id === 'string' ? metadata.hai_object_id : fallbackObjectId\n\n return {\n id: item.id,\n content: item.memory ?? '',\n type: normalizeType(metadata.hai_type, 'fact'),\n importance: normalizeImportance(metadata.hai_importance, DEFAULT_IMPORTANCE),\n objectId,\n scope,\n metadata: toPublicMetadata(metadata),\n createdAt,\n lastAccessedAt: parseTimestamp(item.updatedAt, createdAt),\n accessCount: 0,\n }\n}\n\n/**\n * 判断记忆条目是否匹配指定业务作用域(key-value 全部相等;条目无 scope 时不匹配)\n */\nfunction matchScope(entry: MemoryEntry, scope: Record<string, unknown>): boolean {\n if (!entry.scope)\n return false\n return Object.entries(scope).every(([k, v]) => (entry.scope as Record<string, unknown>)[k] === v)\n}\n\n/**\n * mem0 向量库解析结果:配置 + 实际生效 provider + 是否持久化\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const resolution: Mem0VectorStoreResolution = { provider: 'qdrant', persistent: true, vectorStore: { provider: 'qdrant', config: { url: 'http://127.0.0.1:6333', collectionName: 'hai_memories' } } }\n * const persistent = resolution.persistent && resolution.provider === 'qdrant'\n * ```\n */\ninterface Mem0VectorStoreResolution {\n vectorStore: Mem0Config['vectorStore']\n /** 实际生效的向量 provider(qdrant / memory) */\n provider: string\n /** 是否为持久化后端(服务重启后数据是否保留) */\n persistent: boolean\n}\n\n/**\n * 将 hai vecdb 后端映射为 mem0 vectorStore 配置\n *\n * 当前框架适配仅映射 qdrant,且连接字段必须足以指向实际服务。\n * 其它后端的显式内存回退仍须经过生产共享状态检查。\n */\nfunction buildVectorStoreConfig(deps: Mem0OssDeps): HaiResult<Mem0VectorStoreResolution> {\n const collectionName = deps.collectionName\n const dimension = deps.embeddingDims\n const backend = deps.vectorBackend\n\n if (backend?.type === 'qdrant') {\n let validConnection = false\n try {\n const url = new URL(backend.url ?? '')\n validConnection = url.protocol === 'https:' || url.protocol === 'http:'\n }\n catch {}\n if (!validConnection)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_memoryBackendConnectionRequired', { params: { backend: backend.type } }))\n return ok({\n provider: 'qdrant',\n persistent: true,\n vectorStore: {\n provider: 'qdrant',\n config: {\n url: backend.url,\n apiKey: backend.apiKey,\n collectionName,\n ...(dimension ? { dimension, embeddingModelDims: dimension } : {}),\n },\n },\n })\n }\n\n // SDK Memory 隐藏了 PGVector 独占的 pg.Client,未提供公开关闭入口;不能发布会泄漏连接的组合。\n if (backend?.type === 'pgvector')\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_memoryBackendLifecycleUnsupported'))\n\n // 配置了持久化后端但 mem0 无法映射(lancedb / chroma / 未知):默认 fail-fast,\n // 避免服务重启后记忆静默丢失;仅当 memory.allowEphemeralFallback=true 时退回内存存储。\n if (backend && !deps.config.allowEphemeralFallback) {\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_memoryEphemeralFallbackDenied', { params: { backend: backend.type } }),\n )\n }\n if (backend)\n logger.warn('Mem0 OSS falls back to in-memory vector store (allowEphemeralFallback=true); data will not survive restart', { backend: backend.type })\n return ok({\n provider: 'memory',\n persistent: false,\n vectorStore: {\n provider: 'memory',\n config: {\n collectionName,\n ...(dimension ? { dimension } : {}),\n },\n },\n })\n}\n\n/** 解析 LLM / Embedder 配置并构建 mem0 Memory 配置(含实际生效向量 provider 与持久化状态) */\nfunction buildMem0Config(deps: Mem0OssDeps): HaiResult<{ config: Mem0Config, vectorProvider: string, persistent: boolean }> {\n const llmResolved = resolveModelEntry(deps.aiConfig.llm, 'extraction', undefined, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for mem0 LLM' } }),\n })\n if (!llmResolved.success)\n return llmResolved\n\n const embedderResolved = resolveModelEntry(deps.aiConfig.llm, 'embedding', undefined, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for mem0 embedder' } }),\n })\n if (!embedderResolved.success)\n return embedderResolved\n\n const vectorResolved = buildVectorStoreConfig(deps)\n if (!vectorResolved.success)\n return vectorResolved\n if (core.module.requiresSharedState(process.env) && !vectorResolved.data.persistent)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_memorySharedBackendRequired'))\n\n return ok({\n vectorProvider: vectorResolved.data.provider,\n persistent: vectorResolved.data.persistent,\n config: {\n llm: {\n provider: 'openai',\n config: {\n apiKey: llmResolved.data.apiKey,\n model: llmResolved.data.model,\n baseURL: llmResolved.data.baseUrl,\n temperature: 0.1,\n },\n },\n embedder: {\n provider: 'openai',\n config: {\n apiKey: embedderResolved.data.apiKey,\n model: embedderResolved.data.model,\n baseURL: embedderResolved.data.baseUrl,\n ...(deps.embeddingDims ? { embeddingDims: deps.embeddingDims } : {}),\n },\n },\n vectorStore: vectorResolved.data.vectorStore,\n disableHistory: true,\n customInstructions: deps.config.systemPrompt,\n },\n })\n}\n\nasync function extractMemories(context: Mem0OssContext, messages: ChatMessage[], options?: MemoryExtractOptions): Promise<HaiResult<MemoryEntry[]>> {\n const objectId = options?.objectId ?? context.defaultObjectId\n const memoryIds: string[] = []\n\n // 在框架层用统一提取器完成分类与打分(honor types / model / minImportance / systemPrompt / tempModel),\n // 再以 infer:false 写入 mem0 并保留 hai_type / hai_importance,确保与 native 后端业务语义一致。\n const extracted = await extractTypedMemories(context.llm, messages, {\n types: options?.types,\n model: options?.model,\n minImportance: options?.minImportance,\n systemPrompt: options?.systemPrompt ?? context.systemPrompt,\n objectId,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })\n if (!extracted.success)\n return extracted\n if (extracted.data.length === 0)\n return ok([])\n\n try {\n // 批量并发写入,避免 await-in-loop(N+1)\n const stored = await Promise.allSettled(extracted.data.map(async (entry) => {\n const response = await context.memory.add([{ role: 'user', content: entry.content }], {\n userId: objectId,\n metadata: buildMetadata({ type: entry.type, importance: entry.importance, scope: options?.scope, metadata: entry.metadata }, objectId),\n infer: false,\n })\n const item = response.results[0]\n if (!item)\n throw new Error('Mem0 OSS did not return the stored memory')\n memoryIds.push(item.id)\n // infer:false 的写入回执仅有 id/text/event,不包含权威 metadata 或创建时间。\n const persisted = await context.memory.get(item.id)\n if (!persisted)\n throw new Error('Mem0 OSS stored memory could not be read back')\n return toMemoryEntry(persisted, objectId)\n }))\n // 等待全部在途写入结束后报告,避免失败返回后仍有写入导致遗漏已知 ID。\n const failed = stored.find(result => result.status === 'rejected')\n if (failed?.status === 'rejected')\n throw failed.reason\n return ok(stored.flatMap(result => result.status === 'fulfilled' ? [result.value] : []))\n }\n catch (error) {\n logger.error('Mem0 OSS extract failed', { error })\n return memoryWriteFailure(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(error) } }), error, memoryIds)\n }\n}\n\nasync function recallMemories(context: Mem0OssContext, query: string, options?: { topK?: number, candidateMultiplier?: number, objectId?: string, minImportance?: number, types?: MemoryType[], recencyWeight?: number, scope?: Record<string, unknown> }): Promise<HaiResult<MemoryEntry[]>> {\n const objectId = options?.objectId ?? context.defaultObjectId\n const topK = options?.topK ?? context.defaultTopK\n const candidateMultiplier = Math.max(1, options?.candidateMultiplier ?? context.candidateMultiplier)\n try {\n // mem0 无法下推 scope(存于 metadata),只能先取回更大的候选池再在内存过滤。\n // 若仅取 topK,scope 命中的记忆很可能已被同主体其它主题/角色的高相关条目挤出候选,导致漏召回。\n const response = await context.memory.search(query, {\n filters: { user_id: objectId },\n topK: topK * candidateMultiplier,\n })\n let entries = response.results\n .map(item => toMemoryEntry(item, objectId))\n // 主体隔离兜底:即便底层向量库未按 user 过滤,也确保只召回归属该主体的记忆\n .filter(entry => entry.objectId === objectId)\n // 按业务作用域严格过滤,避免同一主体下不同主题/角色互相召回\n .filter(entry => !options?.scope || matchScope(entry, options.scope))\n // 按类型过滤\n .filter(entry => !options?.types?.length || options.types.includes(entry.type))\n .filter(entry => entry.importance >= (options?.minImportance ?? 0))\n\n // 时间衰减重排:mem0 已按相关度排序,以排名作为相关度代理与时间新近度线性加权\n const recencyWeight = options?.recencyWeight\n if (recencyWeight && recencyWeight > 0 && entries.length > 1) {\n const times = entries.map(entry => entry.createdAt)\n const minTime = Math.min(...times)\n const span = Math.max(1, Math.max(...times) - minTime)\n const count = entries.length\n entries = entries\n .map((entry, index) => {\n const relevance = 1 - index / (count - 1)\n const recency = (entry.createdAt - minTime) / span\n return { entry, score: relevance * (1 - recencyWeight) + recency * recencyWeight }\n })\n .sort((a, b) => b.score - a.score)\n .map(ranked => ranked.entry)\n }\n\n return ok(entries.slice(0, topK))\n }\n catch (error) {\n logger.error('Mem0 OSS recall failed', { error })\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function addMemory(context: Mem0OssContext, entry: MemoryEntryInput): Promise<HaiResult<MemoryEntry>> {\n const objectId = entry.objectId ?? context.defaultObjectId\n const memoryIds: string[] = []\n try {\n const response = await context.memory.add([{ role: 'user', content: entry.content }], {\n userId: objectId,\n metadata: buildMetadata(entry, objectId),\n infer: false,\n })\n const stored = response.results[0]\n if (!stored)\n throw new Error('Mem0 OSS did not return the stored memory')\n memoryIds.push(stored.id)\n const persisted = await context.memory.get(stored.id)\n if (!persisted)\n throw new Error('Mem0 OSS stored memory could not be read back')\n return ok(toMemoryEntry(persisted, objectId))\n }\n catch (error) {\n logger.error('Mem0 OSS add failed', { error })\n return memoryWriteFailure(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error, memoryIds)\n }\n}\n\n/** 更新文本与元数据时使用 SDK 原地更新,保留 ID、创建时间和未修改的业务字段。 */\nasync function updateMemory(context: Mem0OssContext, memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const item = await context.memory.get(memoryId)\n if (!item)\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n\n const existing = toMemoryEntry(item, context.defaultObjectId)\n if (isMemoryAccessDenied(existing, accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n const objectId = existing.objectId ?? context.defaultObjectId\n const merged: MemoryEntryInput = {\n content: updates.content ?? existing.content,\n type: updates.type ?? existing.type,\n importance: updates.importance ?? existing.importance,\n objectId,\n scope: existing.scope,\n metadata: updates.metadata ?? existing.metadata,\n }\n // mem0 3.x 支持 metadata;禁止先删除再添加,避免后续写入失败丢失原记忆。\n await context.memory.update(memoryId, {\n ...(updates.content !== undefined ? { text: updates.content } : {}),\n metadata: buildMetadata(merged, objectId),\n })\n const refreshed = await context.memory.get(memoryId)\n if (!refreshed)\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n return ok(toMemoryEntry(refreshed, objectId))\n }\n catch (error) {\n logger.error('Mem0 OSS update failed', { id: memoryId, error })\n return memoryWriteFailure(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error, [memoryId])\n }\n}\n\nasync function getMemory(context: Mem0OssContext, memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const item = await context.memory.get(memoryId)\n if (!item)\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n const entry = toMemoryEntry(item, context.defaultObjectId)\n if (isMemoryAccessDenied(entry, accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n return ok(entry)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function removeMemory(context: Mem0OssContext, memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<void>> {\n try {\n if (accessScope) {\n const item = await context.memory.get(memoryId)\n if (!item || isMemoryAccessDenied(toMemoryEntry(item, context.defaultObjectId), accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n await context.memory.delete(memoryId)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/** 与 SDK 的 UTC 日期到期规则一致;无效日期不被当作已过期。 */\nfunction isExpiredMemory(item: Mem0MemoryItem, today: string): boolean {\n const expiration = item.metadata?.expiration_date\n if (typeof expiration !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(expiration))\n return false\n const parsed = new Date(`${expiration}T00:00:00.000Z`)\n return Number.isFinite(parsed.getTime()) && parsed.toISOString().slice(0, 10) === expiration && expiration < today\n}\n\n/**\n * 列出指定主体的完整候选,再按过期、类型和业务作用域过滤。\n *\n * SDK 无游标,最多支持 1000 条主体候选;多取一条探测截断,超限明确失败。\n * showExpired 保证 SDK 不先隐藏过期条目,避免短页被误判为完整集合。\n */\nasync function listMemories(context: Mem0OssContext, options?: { objectId?: string, types?: MemoryType[], scope?: Record<string, unknown>, limit?: number }): Promise<MemoryEntry[]> {\n const objectId = options?.objectId ?? context.defaultObjectId\n const response = await context.memory.getAll({ filters: { user_id: objectId }, topK: MEM0_LIST_CANDIDATE_LIMIT + 1, showExpired: true })\n if (response.results.length > MEM0_LIST_CANDIDATE_LIMIT)\n throw new Mem0ListIncompleteError(aiM('ai_memoryListIncomplete', { params: { limit: String(MEM0_LIST_CANDIDATE_LIMIT) } }))\n const today = new Date().toISOString().slice(0, 10)\n let entries = response.results\n .filter(item => !isExpiredMemory(item, today))\n .map(item => toMemoryEntry(item, objectId))\n .filter(entry => entry.objectId === objectId)\n if (options?.types?.length)\n entries = entries.filter(entry => options.types!.includes(entry.type))\n if (options?.scope)\n entries = entries.filter(entry => matchScope(entry, options.scope!))\n return options?.limit !== undefined ? entries.slice(0, options.limit) : entries\n}\n\n/**\n * 创建 Mem0 OSS 记忆操作接口\n *\n * @param deps - LLM / Embedder / 向量库来源\n * @returns MemoryOperations 实例\n * @throws 当 `mem0ai` 未安装或配置缺失时抛出,由 `ai.init()` 转为 HaiResult\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function prepare(deps: Mem0OssDeps) {\n * // 工厂显式抛错:上层 init 捕获并转为 HaiResult,不能发布半就绪实例。\n * const memory = await createMem0OssMemoryOperations(deps)\n * const result = await memory.list({ objectId: 'user-1' })\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport async function createMem0OssMemoryOperations(deps: Mem0OssDeps): Promise<MemoryCoreOperations> {\n const configResult = buildMem0Config(deps)\n if (!configResult.success)\n throw configResult.error\n\n let mod: typeof import('mem0ai/oss')\n try {\n mod = await import('mem0ai/oss')\n }\n catch (error) {\n logger.error('Failed to load mem0ai/oss', { error })\n throw new Error('mem0ai is required for memory.provider=\"mem0\"; install it with `pnpm add mem0ai`')\n }\n\n if (configResult.data.vectorProvider === 'qdrant') {\n // 可选 peer 约束受测版本,启动仍校验公开能力,拒绝非严格安装器留下的不兼容依赖。\n const sdk = await import('@qdrant/js-client-rest').catch(() => undefined)\n if (sdk && typeof sdk.QdrantClient?.prototype?.search === 'function') {\n const url = deps.vectorBackend?.url ?? ''\n const client = new sdk.QdrantClient({\n url,\n port: Number(new URL(url).port) || 6333,\n apiKey: deps.vectorBackend?.apiKey,\n })\n // SDK 删除默认只等待接收回执;独享客户端统一等待应用,避免分批清理和写后读竞态。\n const upsert = client.upsert.bind(client)\n const remove = client.delete.bind(client)\n client.upsert = (collection, options) => upsert(collection, { ...options, wait: true })\n client.delete = (collection, options) => remove(collection, { ...options, wait: true })\n configResult.data.config.vectorStore.config.client = client\n }\n else {\n const failure = err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_memoryBackendSdkIncompatible'))\n if (!failure.success)\n throw failure.error\n }\n }\n\n const memory = new mod.Memory(configResult.data.config)\n // 构造器在后台建集合;公开的一条有界只读查询等待 ready,失败时不得发布初始化成功。\n await memory.getAll({ filters: { user_id: DEFAULT_OBJECT_ID }, topK: 1, showExpired: true })\n\n // 暴露实际生效的向量 provider 与持久化状态,便于运维确认记忆是否会在重启后保留\n logger.info('Mem0 OSS memory initialized', {\n vectorProvider: configResult.data.vectorProvider,\n persistent: configResult.data.persistent,\n })\n\n const context: Mem0OssContext = {\n memory,\n llm: deps.llm,\n systemPrompt: deps.config.systemPrompt,\n defaultObjectId: DEFAULT_OBJECT_ID,\n defaultTopK: deps.config.defaultTopK,\n candidateMultiplier: deps.config.candidateMultiplier,\n }\n\n const recall: MemoryCoreOperations['recall'] = (query, options) => recallMemories(context, query, {\n topK: options?.topK ?? deps.config.defaultTopK,\n candidateMultiplier: options?.candidateMultiplier,\n objectId: options?.objectId,\n minImportance: options?.minImportance,\n types: options?.types,\n recencyWeight: options?.recencyWeight,\n scope: options?.scope,\n })\n\n return {\n extract: (messages, options) => extractMemories(context, messages, options),\n recall,\n injectMemories: (messages, options) => injectRelevantMemories(messages, options, recall),\n add: entry => addMemory(context, entry),\n update: (memoryId, updates, accessScope) => updateMemory(context, memoryId, updates, accessScope),\n get: (memoryId, accessScope) => getMemory(context, memoryId, accessScope),\n remove: (memoryId, accessScope) => removeMemory(context, memoryId, accessScope),\n async list(options) {\n try {\n return ok(await listMemories(context, options))\n }\n catch (error) {\n if (error instanceof Mem0ListIncompleteError)\n return err(HaiAIError.MEMORY_LIST_INCOMPLETE, error.message)\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n },\n async listPage(options) {\n try {\n const offset = options?.offset ?? 0\n const limit = options?.limit ?? 20\n // mem0 getAll 不支持 offset 分页,只能取回匹配集合后在内存切片(后端能力限制,已在 README 说明)\n const all = await listMemories(context, { objectId: options?.objectId, types: options?.types, scope: options?.scope })\n return ok({ items: all.slice(offset, offset + limit), total: all.length })\n }\n catch (error) {\n if (error instanceof Mem0ListIncompleteError)\n return err(HaiAIError.MEMORY_LIST_INCOMPLETE, error.message)\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n },\n /**\n * 清除记忆\n *\n * - 无任何过滤条件:`reset()` 清空整个后端。\n * - 仅 objectId(无 types / scope):`deleteAll({ userId })` 删除该主体全部记忆。\n * - 含 types 或 scope:先列出同时匹配的条目,再逐条 `delete`,避免误删该主体其他类型/作用域的记忆。\n */\n async clear(options) {\n try {\n const hasTypeOrScope = Boolean(options?.types?.length) || Boolean(options?.scope)\n\n if (!options?.objectId && !hasTypeOrScope) {\n await context.memory.reset()\n return ok(undefined)\n }\n\n if (options?.objectId && !hasTypeOrScope) {\n await context.memory.deleteAll({ userId: options.objectId })\n return ok(undefined)\n }\n\n // 存在 types / scope:精确匹配后逐条删除\n const matched = await listMemories(context, { objectId: options?.objectId, types: options?.types, scope: options?.scope })\n for (const entry of matched)\n await context.memory.delete(entry.id)\n logger.debug('Mem0 OSS memories cleared', { removed: matched.length, objectId: options?.objectId, types: options?.types, scoped: Boolean(options?.scope) })\n return ok(undefined)\n }\n catch (error) {\n if (error instanceof Mem0ListIncompleteError)\n return err(HaiAIError.MEMORY_LIST_INCOMPLETE, error.message)\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 合并(Mem0 式增量更新)\n *\n * 对一批抽取事实与相关既有记忆做单次 LLM 合并决策,产出 ADD/UPDATE/DELETE/NONE\n * 操作并应用,实现增量更新、跨条去重与矛盾删除。作为 native 记忆的默认写入策略。\n * @module ai-memory-consolidation\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryOperations,\n MemoryType,\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-consolidation' })\nconst DEFAULT_IMPORTANCE = 0.5\nconst MEMORY_TYPES = new Set<MemoryType>(['fact', 'preference', 'event', 'entity', 'instruction'])\nconst LEADING_CODE_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_CODE_FENCE_REGEX = /\\n?```$/\n\nconst MEMORY_CONSOLIDATION_SYSTEM_PROMPT = [\n 'You maintain a long-term memory store using the Mem0 consolidation algorithm.',\n 'You receive existing related memories (each with an id) and newly extracted facts.',\n 'Decide the minimal set of operations that keeps the store consistent and non-redundant.',\n 'Return exactly one JSON object: { \"memory\": [ { \"id\"?, \"text\", \"type\", \"importance\", \"category\"?, \"event\" } ] }.',\n 'Allowed event values:',\n '- \"ADD\": the fact is new information; omit id.',\n '- \"UPDATE\": refine an existing memory; include its id and the merged text.',\n '- \"DELETE\": an existing memory is contradicted or obsolete; include its id.',\n '- \"NONE\": an existing memory already fully covers the fact; include its id and make no change.',\n 'Rules:',\n '- \"type\" must be one of: fact, preference, event, entity, instruction.',\n '- \"importance\" is a float in [0, 1].',\n '- \"category\" is an optional short topical label (e.g. \"work\", \"food\", \"travel\").',\n '- Only reference ids that appear in the provided existing memories.',\n '- Be conservative: prefer UPDATE or NONE over duplicating information with ADD.',\n 'Return JSON only, without markdown fences or explanation.',\n].join('\\n')\n\n/**\n * 单条合并操作\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const operation: ConsolidationOp = { event: 'UPDATE', id: 'memory-1', text: '用户偏好绿茶', type: 'preference', importance: 0.7 }\n * const requiresExistingId = operation.event !== 'ADD'\n * ```\n */\ninterface ConsolidationOp {\n event: 'ADD' | 'UPDATE' | 'DELETE' | 'NONE'\n id?: string\n text: string\n type: MemoryType\n importance: number\n category?: string\n}\n\n/**\n * 合并依赖:默认记忆引擎通过公共操作接口注入\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function bind(llm: LLMOperations, memory: MemoryOperations): ConsolidationDeps {\n * return { llm, recall: memory.recall, add: memory.add, update: memory.update, remove: memory.remove, relatedTopK: 5 }\n * }\n * ```\n */\nexport interface ConsolidationDeps {\n llm: LLMOperations\n recall: MemoryOperations['recall']\n add: MemoryOperations['add']\n update: MemoryOperations['update']\n remove: MemoryOperations['remove']\n /** 检索相关既有记忆的数量 */\n relatedTopK: number\n /** 抽取阶段的自定义 systemPrompt */\n systemPrompt?: string\n}\n\nfunction stripCodeFences(content: string): string {\n const cleaned = content.trim()\n if (!cleaned.startsWith('```'))\n return cleaned\n return cleaned.replace(LEADING_CODE_FENCE_REGEX, '').replace(TRAILING_CODE_FENCE_REGEX, '').trim()\n}\n\nfunction normalizeText(content: string): string {\n return content.trim().replace(/\\s+/g, ' ').toLocaleLowerCase()\n}\n\nfunction normalizeType(value: unknown, fallback: MemoryType): MemoryType {\n return typeof value === 'string' && MEMORY_TYPES.has(value as MemoryType)\n ? value as MemoryType\n : fallback\n}\n\nfunction normalizeImportance(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, Math.min(1, value))\n : fallback\n}\n\n/** 收集候选事实的相关既有记忆,按 id 去重 */\nasync function collectRelated(\n deps: ConsolidationDeps,\n candidates: MemoryEntryInput[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n const recallResults = await Promise.all(\n candidates.map(candidate => deps.recall(candidate.content, {\n topK: deps.relatedTopK,\n objectId: candidate.objectId ?? options?.objectId,\n scope: options?.scope,\n types: options?.types,\n })),\n )\n\n const related = new Map<string, MemoryEntry>()\n for (const result of recallResults) {\n if (!result.success)\n return result\n for (const entry of result.data)\n related.set(entry.id, entry)\n }\n return ok([...related.values()])\n}\n\n/**\n * 解析 LLM 返回的合并操作列表\n *\n * 缺失的 type / importance / category 会从匹配文本的候选事实回填;UPDATE/DELETE/NONE\n * 的 id 必须命中既有记忆,否则 UPDATE 降级为 ADD、DELETE/NONE 丢弃。\n */\nfunction parseConsolidationOps(\n raw: string,\n candidates: MemoryEntryInput[],\n relatedIds: Set<string>,\n): ConsolidationOp[] {\n const parsed = JSON.parse(stripCodeFences(raw)) as unknown\n const list = Array.isArray(parsed)\n ? parsed\n : typeof parsed === 'object' && parsed !== null && Array.isArray((parsed as { memory?: unknown }).memory)\n ? (parsed as { memory: unknown[] }).memory\n : []\n\n const candidateByText = new Map(candidates.map(candidate => [normalizeText(candidate.content), candidate]))\n const ops: ConsolidationOp[] = []\n\n for (const item of list) {\n if (typeof item !== 'object' || item === null)\n continue\n const record = item as Record<string, unknown>\n const text = typeof record.text === 'string' ? record.text.trim() : ''\n if (!text)\n continue\n\n const event = String(record.event ?? 'ADD').toUpperCase()\n const fallback = candidateByText.get(normalizeText(text))\n const type = normalizeType(record.type, fallback?.type ?? 'fact')\n const importance = normalizeImportance(record.importance, fallback?.importance ?? DEFAULT_IMPORTANCE)\n const category = typeof record.category === 'string' && record.category.trim().length > 0\n ? record.category.trim()\n : readCategory(fallback?.metadata)\n const id = typeof record.id === 'string' ? record.id : undefined\n\n if (event === 'UPDATE' && id && relatedIds.has(id)) {\n ops.push({ event: 'UPDATE', id, text, type, importance, category })\n }\n else if (event === 'DELETE' && id && relatedIds.has(id)) {\n ops.push({ event: 'DELETE', id, text, type, importance })\n }\n else if (event === 'NONE') {\n // 已被既有记忆覆盖,无需写入\n continue\n }\n else {\n ops.push({ event: 'ADD', text, type, importance, category })\n }\n }\n\n return ops\n}\n\n/** 从元数据中读取 category(若有) */\nfunction readCategory(metadata: Record<string, unknown> | undefined): string | undefined {\n const value = metadata?.category\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n}\n\n/** 合并 category 到元数据 */\nfunction withCategory(metadata: Record<string, unknown> | undefined, category: string | undefined): Record<string, unknown> | undefined {\n if (!category)\n return metadata\n return { ...metadata, category }\n}\n\n/**\n * 应用合并操作\n *\n * 顺序执行以保证容量淘汰(maxEntriesPerObject / maxEntriesGlobal)状态一致;批量规模受单次抽取的事实数量约束\n * (通常远小于 20 条)。返回新增与更新后的记忆条目。\n */\nasync function applyConsolidationOps(\n deps: ConsolidationDeps,\n ops: ConsolidationOp[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n const entries: MemoryEntry[] = []\n\n for (const op of ops) {\n if (op.event === 'DELETE' && op.id) {\n const removeResult = await deps.remove(op.id)\n if (!removeResult.success)\n logger.warn('Consolidation delete skipped', { id: op.id, error: removeResult.error.message })\n continue\n }\n\n if (op.event === 'UPDATE' && op.id) {\n const updateResult = await deps.update(op.id, {\n content: op.text,\n type: op.type,\n importance: op.importance,\n metadata: op.category ? { category: op.category } : undefined,\n })\n if (!updateResult.success)\n return updateResult\n entries.push(updateResult.data)\n continue\n }\n\n const addResult = await deps.add({\n content: op.text,\n type: op.type,\n importance: op.importance,\n objectId: options?.objectId,\n scope: options?.scope,\n metadata: withCategory(undefined, op.category),\n })\n if (!addResult.success)\n return addResult\n entries.push(addResult.data)\n }\n\n return ok(entries)\n}\n\n/**\n * 从对话消息中抽取事实并执行 Mem0 式合并\n *\n * 流程:抽取事实 → 检索相关记忆 → 单次 LLM 批量合并 → 应用 ADD/UPDATE/DELETE 操作。\n *\n * @param deps - 合并依赖(LLM + 记忆操作 + relatedTopK)\n * @param messages - 对话消息列表\n * @param options - 抽取选项(types / minImportance / objectId / scope / model 等)\n * @returns 新增与更新后的记忆条目\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function consolidate(deps: ConsolidationDeps) {\n * const result = await extractAndConsolidate(deps, [{ role: 'user', content: '我改喝绿茶了' }], { objectId: 'user-1' })\n * if (!result.success) return result\n * return result.data.map(memory => memory.id)\n * }\n * ```\n */\nexport async function extractAndConsolidate(\n deps: ConsolidationDeps,\n messages: ChatMessage[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n logger.trace('Consolidation extract', { messageCount: messages.length })\n\n const extractResult = await extractMemories(deps.llm, messages, {\n types: options?.types,\n model: options?.model,\n minImportance: options?.minImportance,\n objectId: options?.objectId,\n systemPrompt: options?.systemPrompt ?? deps.systemPrompt,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })\n if (!extractResult.success)\n return extractResult\n\n const candidates = extractResult.data\n if (candidates.length === 0)\n return ok([])\n\n const relatedResult = await collectRelated(deps, candidates, options)\n if (!relatedResult.success)\n return relatedResult\n const related = relatedResult.data\n\n const consolidationResult = await deps.llm.chat({\n model: options?.model,\n ...(options?.tempModel ? { tempModel: options.tempModel } : {}),\n messages: [\n { role: 'system', content: MEMORY_CONSOLIDATION_SYSTEM_PROMPT },\n {\n role: 'user',\n content: JSON.stringify({\n existingMemories: related.map(entry => ({\n id: entry.id,\n content: entry.content,\n type: entry.type,\n importance: entry.importance,\n category: readCategory(entry.metadata),\n })),\n newFacts: candidates.map(candidate => ({\n text: candidate.content,\n type: candidate.type,\n importance: candidate.importance ?? DEFAULT_IMPORTANCE,\n })),\n }),\n },\n ],\n temperature: 0.1,\n signal: options?.signal,\n })\n if (!consolidationResult.success) {\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(consolidationResult.error.message) } }), consolidationResult.error)\n }\n\n const rawContent = consolidationResult.data.choices[0]?.message?.content ?? ''\n const relatedIds = new Set(related.map(entry => entry.id))\n let ops: ConsolidationOp[]\n try {\n ops = parseConsolidationOps(rawContent, candidates, relatedIds)\n }\n catch {\n // 解析失败时退化为直接新增全部候选事实,保证抽取结果不丢失\n logger.warn('Consolidation returned invalid JSON, falling back to ADD-all', { content: rawContent.slice(0, 200) })\n ops = candidates.map(candidate => ({\n event: 'ADD' as const,\n text: candidate.content,\n type: candidate.type,\n importance: candidate.importance ?? DEFAULT_IMPORTANCE,\n }))\n }\n\n const applyResult = await applyConsolidationOps(deps, ops, options)\n if (!applyResult.success)\n return applyResult\n\n logger.trace('Consolidation completed', { candidates: candidates.length, related: related.length, ops: ops.length, written: applyResult.data.length })\n return ok(applyResult.data)\n}\n","/**\n * @h-ai/ai — 原生记忆 Provider(hai 自研引擎)\n *\n * 基于 AIRelStore + AIVectorStore 抽象,复用 vecdb / reldb / LLM / Embedding 组件,\n * 提供记忆的提取、存储、检索与注入。`extract` 采用共享的 mem0 式批量合并\n * (ADD/UPDATE/DELETE/NONE),跨条去重并增量更新。\n *\n * 与 mem0 OSS Provider(`ai-memory-provider-mem0-oss.ts`)并列,二者实现同一\n * `MemoryOperations` 接口,通过 `memory.provider` 配置切换。\n * @module ai-memory-provider-native\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 MemoryAccessScope,\n MemoryClearOptions,\n MemoryCoreOperations,\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryInjectionOptions,\n MemoryListOptions,\n MemoryListPageOptions,\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 { extractAndConsolidate } from '../ai-memory-consolidation.js'\nimport { injectRelevantMemories, isMemoryAccessDenied } from '../ai-memory-injection.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-native' })\n\n/** 记忆淘汰的时间窗口:超过 7 天的记忆 recency 分量衰减为 0。 */\nconst EVICTION_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000\n\n/**\n * 生成记忆条目唯一 ID\n *\n * 形如 `mem_<毫秒时间戳>_<随机后缀>`,保证同一毫秒内多次写入也不冲突。\n */\nfunction generateId(): string {\n return `mem_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n}\n\n/**\n * 计算两个等长向量的余弦相似度\n *\n * 长度不一致或任一向量为零向量时返回 0(视为不相关),作为向量检索的回退度量。\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 *\n * scope 存放在 JSON 列中,未建立索引,因此匹配在内存中完成:\n * 要求 scope 的每个 key-value 都与条目的 scope 严格相等;条目无 scope 时不匹配\n * (指定 scope 的查询不应召回全局记忆)。\n *\n * @param entry - 记忆条目\n * @param scope - 期望匹配的作用域(key-value 全部满足才算命中)\n */\nfunction matchScope(entry: MemoryEntry, scope: Record<string, unknown>): boolean {\n if (!entry.scope)\n return false\n return Object.entries(scope).every(([k, v]) => entry.scope![k] === v)\n}\n\n/**\n * 创建原生 Memory 操作接口\n *\n * 提供基于 LLM 的记忆提取并持久化、基于向量相似度的记忆检索,并支持将相关记忆\n * 注入消息用于 LLM 上下文。\n *\n * @param config - 记忆配置(maxEntriesPerObject / maxEntriesGlobal、recencyDecay、systemPrompt 等)\n * @param llm - LLM 操作接口(用于记忆提取)\n * @param embedding - Embedding 接口(可为 null,为 null 时使用关键词回退)\n * @param store - 记忆条目持久化存储\n * @param vectorStore - 向量库存储(用于语义检索)\n * @returns MemoryCoreOperations 实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function prepare(config: MemoryConfig, llm: LLMOperations, store: AIRelStore<MemoryEntry>, vectors: AIVectorStore, embedding: EmbeddingOperations) {\n * const memory = createNativeMemoryOperations(config, llm, embedding, store, vectors)\n * const result = await memory.recall('茶饮偏好', { objectId: 'user-1', topK: 5 })\n * if (!result.success) return result\n * return result.data\n * }\n * ```\n */\nexport function createNativeMemoryOperations(\n config: MemoryConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations | null,\n store: AIRelStore<MemoryEntry>,\n vectorStore: AIVectorStore,\n): MemoryCoreOperations {\n /**\n * 为文本计算 embedding 向量(embedding 不可用或关闭时返回 undefined)\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 * 从给定候选集中淘汰优先级最低的一条(importance 0.7 + recency 0.3 加权最小者)\n *\n * @param candidates - 参与淘汰评估的候选条目(通常按 objectId 或全局筛出)\n */\n async function evictLowest(candidates: MemoryEntry[]): Promise<void> {\n if (candidates.length === 0)\n return\n\n const now = Date.now()\n let lowestScore = Infinity\n let lowestId: string | null = null\n\n for (const entry of candidates) {\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / EVICTION_MAX_AGE_MS)\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 * 分两级触发:\n * 1. 单主体配额(maxEntriesPerObject):仅在传入 objectId 时生效,只统计并淘汰\n * 该主体自身的条目,避免用户 A 大量写入淘汰掉用户 B 的记忆。\n * 2. 全局配额(maxEntriesGlobal):跨所有主体的总量保护,超限时淘汰全局最低优先级条目。\n *\n * @param objectId - 即将写入条目的所属主体(undefined 表示全局记忆,仅受全局配额约束)\n */\n async function evictIfNeeded(objectId?: string): Promise<void> {\n // 全局总量保护\n const globalTotal = await store.count()\n if (globalTotal >= config.maxEntriesGlobal) {\n const all = await store.query({ orderBy: { field: 'createdAt', direction: 'asc' }, limit: globalTotal })\n await evictLowest(all)\n }\n\n // 单主体配额:仅对具名主体生效(undefined 时 store 不会按 object_id 过滤,会误统计全局)\n if (objectId) {\n const objectTotal = await store.count({ objectId })\n if (objectTotal >= config.maxEntriesPerObject) {\n const objectEntries = await store.query({ objectId, orderBy: { field: 'createdAt', direction: 'asc' }, limit: objectTotal })\n await evictLowest(objectEntries)\n }\n }\n }\n\n /**\n * 持久化一条记忆条目(含向量 upsert),写入前按主体配额淘汰\n */\n async function saveEntry(input: MemoryEntryInput, vector?: number[]): Promise<MemoryEntry> {\n await evictIfNeeded(input.objectId)\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 scope: input.scope,\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 /**\n * 更新一条记忆的任意字段(content / type / importance / metadata),\n * content 变更时重算向量并同步向量库。\n */\n async function updateEntry(memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const existing = await store.get(memoryId)\n if (!existing || isMemoryAccessDenied(existing, accessScope)) {\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 * 检索最相关的记忆条目(内部实现,供 recall / extract / injectMemories 共用)\n *\n * 三阶段:候选筛选(objectId / type / minImportance / scope)→ 综合打分\n * (向量相似度 + 重要性 + 时间新鲜度)→ 排序截取 topK。\n *\n * @param query - 查询文本\n * @param options - 检索选项(objectId / type / minImportance / scope / topK 等)\n * @param updateAccessStats - 是否更新命中条目的访问统计(recall 为 true,提取阶段为 false)\n */\n async function recallEntries(\n query: string,\n options?: MemoryRecallOptions,\n updateAccessStats = true,\n ): Promise<HaiResult<MemoryEntry[]>> {\n const topK = options?.topK ?? config.defaultTopK\n const recencyWeight = options?.recencyWeight ?? (1 - config.recencyDecay)\n const candidateMultiplier = Math.max(1, options?.candidateMultiplier ?? config.candidateMultiplier)\n\n logger.trace('Recalling memories', { query: query.slice(0, 100), topK, updateAccessStats })\n\n try {\n const where: WhereClause<MemoryEntry> = {}\n\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 if (options?.minImportance && options.minImportance > 0) {\n where.importance = { $gte: options.minImportance }\n }\n\n const allCandidates = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n\n // scope 过滤在内存中完成:指定 scope 时 key-value 严格匹配,不纳入全局记忆(scope 为 null/undefined)\n const candidates = options?.scope\n ? allCandidates.filter(e => matchScope(e, options.scope!))\n : allCandidates\n\n if (candidates.length === 0) {\n return ok([])\n }\n\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 const vectorScores = new Map<string, number>()\n if (queryVector) {\n const vectorResults = await vectorStore.search(queryVector, {\n topK: topK * candidateMultiplier,\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\n const scored = candidates.map((entry) => {\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 const queryLower = query.toLowerCase()\n const contentLower = entry.content.toLowerCase()\n similarity = contentLower.includes(queryLower) ? 0.8 : 0\n }\n\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / EVICTION_MAX_AGE_MS)\n const relevance = similarity * 0.8 + entry.importance * 0.2\n const score = relevance * (1 - recencyWeight) + recency * recencyWeight\n\n return { entry, score }\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 if (updateAccessStats) {\n entry.lastAccessedAt = now\n entry.accessCount++\n await store.save(entry.id, entry, { objectId: entry.objectId })\n results.push(entry)\n continue\n }\n\n results.push({ ...entry })\n }\n\n logger.trace('Memory recall completed', { query: query.slice(0, 50), resultCount: results.length, updateAccessStats })\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 const operations: MemoryCoreOperations = {\n /**\n * 从对话消息中提取记忆并合并存储(Mem0 式增量更新)\n *\n * 抽取事实 → 检索相关记忆 → 单次 LLM 批量合并 → 应用 ADD/UPDATE/DELETE/NONE。\n * 相比逐条写回,能跨条去重、增量更新并删除被矛盾的旧记忆。\n *\n * @param messages - 待分析的对话消息列表\n * @param options - 可选(记忆类型过滤、最小重要性阈值、自定义 model / systemPrompt / scope 等)\n * @returns `ok(MemoryEntry[])` 新写入与更新后的记忆列表;LLM 调用失败时返回 `MEMORY_EXTRACT_FAILED`\n */\n async extract(messages: ChatMessage[], options?: MemoryExtractOptions): Promise<HaiResult<MemoryEntry[]>> {\n return extractAndConsolidate({\n llm,\n recall: (query, recallOptions) => recallEntries(query, recallOptions, false),\n add: entry => operations.add(entry),\n update: (memoryId, updates) => updateEntry(memoryId, updates),\n remove: memoryId => operations.remove(memoryId),\n relatedTopK: config.writebackRelatedTopK,\n systemPrompt: config.systemPrompt,\n }, messages, options)\n },\n\n /**\n * 根据查询文本检索最相关的记忆条目并更新访问统计\n */\n async recall(query: string, options?: MemoryRecallOptions): Promise<HaiResult<MemoryEntry[]>> {\n return recallEntries(query, options, true)\n },\n\n /**\n * 将检索到的相关记忆注入消息列表(system 追加或最后一条用户消息前插入)\n */\n async injectMemories(messages: ChatMessage[], options?: MemoryInjectionOptions): Promise<HaiResult<ChatMessage[]>> {\n return injectRelevantMemories(messages, options, recallEntries)\n },\n\n /**\n * 手动添加一条记忆(非 LLM 提取),超过主体配额时自动淘汰最低优先级条目\n *\n * @param entry - 记忆条目输入(content、type、importance、objectId、scope、metadata 等)\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 * 更新一条已有记忆(仅更新传入字段,content 变更时重算向量)\n */\n async update(memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n return updateEntry(memoryId, updates, accessScope)\n },\n\n /**\n * 根据 ID 获取一条记忆并更新访问统计\n *\n * @param memoryId - 记忆条目的唯一 ID\n * @param accessScope - 可选归属校验(不匹配返回 MEMORY_NOT_FOUND)\n * @returns `ok(MemoryEntry)` 操作成功;ID 不存在或归属不符时返回 `MEMORY_NOT_FOUND`\n */\n async get(memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n const entry = await store.get(memoryId)\n if (!entry || isMemoryAccessDenied(entry, accessScope)) {\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 * @param memoryId - 记忆条目的唯一 ID\n * @param accessScope - 可选归属校验(不匹配返回 MEMORY_NOT_FOUND)\n * @returns `ok(undefined)` 删除成功;ID 不存在或归属不符时返回 `MEMORY_NOT_FOUND`\n */\n async remove(memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<void>> {\n if (accessScope) {\n const existing = await store.get(memoryId)\n if (!existing || isMemoryAccessDenied(existing, accessScope)) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n }\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 * objectId / type 走存储层索引过滤,scope 在内存中 key-value 严格匹配。\n *\n * @param options - 可选(objectId、type、scope 过滤,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 scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n // scope 需要内存过滤,故不能在存储层直接 limit(否则可能截断掉待匹配条目)\n limit: options?.scope ? undefined : options?.limit,\n })\n\n if (!options?.scope)\n return ok(results)\n\n const filtered = results.filter(e => matchScope(e, options.scope!))\n return ok(options.limit ? filtered.slice(0, options.limit) : filtered)\n },\n\n /**\n * 分页列出记忆条目\n *\n * 无 scope 时走存储层原生分页;指定 scope 时因作用域存于 JSON 列无法下推,\n * 先按 objectId / type 取出候选,再内存过滤后切片(数据量大时应优先用 objectId 收窄)。\n *\n * @param options - 可选(objectId、type、scope 过滤,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 offset = options?.offset ?? 0\n const limit = options?.limit ?? 20\n\n if (!options?.scope) {\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 { offset, limit },\n )\n return ok(page)\n }\n\n const all = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n })\n const filtered = all.filter(e => matchScope(e, options.scope!))\n return ok({ items: filtered.slice(offset, offset + limit), total: filtered.length })\n },\n\n /**\n * 清除记忆条目(安全语义)\n *\n * - 不传任何过滤条件:清空全部记忆(含向量库)。\n * - 传入 objectId / types / scope:仅删除同时满足全部条件的条目,避免误删。\n *\n * @param options - 可选范围过滤(objectId / types / scope 任意组合)\n * @returns `ok(undefined)` 操作成功\n */\n async clear(options?: MemoryClearOptions): Promise<HaiResult<void>> {\n if (!options?.types && !options?.objectId && !options?.scope) {\n await store.clear()\n await vectorStore.clear()\n logger.debug('All memories cleared')\n return ok(undefined)\n }\n\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 candidates = await store.query({\n objectId: options.objectId,\n scope: options.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n const toRemove = options.scope\n ? candidates.filter(e => matchScope(e, options.scope!))\n : candidates\n\n for (const entry of toRemove) {\n await store.remove(entry.id)\n await vectorStore.remove(entry.id)\n }\n logger.debug('Memories cleared', { removed: toRemove.length, objectId: options.objectId, types: options.types, scoped: Boolean(options.scope) })\n return ok(undefined)\n },\n }\n\n return operations\n}\n","/**\n * @h-ai/ai — Persona 子功能实现\n *\n * 基于 AIRelStore 持久化 AI 角色档案,并提供系统提示词组合。\n * 角色按 [objectId, id] 复合键隔离;省略 objectId 时访问平台 system 主体。\n * @module ai-persona-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AIRelStore } from '../store/ai-store-types.js'\nimport type { PersonaOperations, PersonaProfile, PersonaProfileInput, PersonaProfileUpdate, PersonaScopeOptions } from './ai-persona-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: 'persona' })\n\n/** 默认主体:平台内置角色(未指定 objectId 时使用) */\nconst DEFAULT_OBJECT_ID = 'system'\n\n/** 构造存储键(JSON 数组序列化 [objectId, personaId],避免朴素拼接碰撞) */\nfunction personaKey(objectId: string, id: string): string {\n return JSON.stringify([objectId, id])\n}\n\n/**\n * 将角色档案的 traits 组合进系统提示词\n *\n * 无 traits 时直接返回 systemPrompt;有 traits 时追加一段「性格特征」清单。\n */\nfunction composeSystemPrompt(profile: PersonaProfile): string {\n if (profile.traits.length === 0)\n return profile.systemPrompt\n const traitLines = profile.traits.map(t => `- ${t}`).join('\\n')\n return `${profile.systemPrompt}\\n\\n性格特征:\\n${traitLines}`\n}\n\n/**\n * 创建 Persona 操作接口\n *\n * @param store - 角色档案持久化存储(按 [objectId, id] 复合键隔离多租户)\n * @returns PersonaOperations 实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function save(store: AIRelStore<PersonaProfile>) {\n * const personas = createPersonaOperations(store)\n * const result = await personas.save({ id: 'guide', objectId: 'tenant-1', name: '向导', systemPrompt: '用简短中文回答' })\n * if (!result.success) return result\n * return result.data.id\n * }\n * ```\n */\nexport function createPersonaOperations(store: AIRelStore<PersonaProfile>): PersonaOperations {\n return {\n async save(input: PersonaProfileInput): Promise<HaiResult<PersonaProfile>> {\n try {\n const now = Date.now()\n const objectId = input.objectId ?? DEFAULT_OBJECT_ID\n const key = personaKey(objectId, input.id)\n const existing = await store.get(key)\n const profile: PersonaProfile = {\n id: input.id,\n objectId,\n name: input.name,\n systemPrompt: input.systemPrompt,\n traits: input.traits ?? [],\n metadata: input.metadata,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n }\n await store.save(key, profile, { objectId })\n logger.trace('Persona saved', { id: profile.id, objectId })\n return ok(profile)\n }\n catch (error) {\n return err(HaiAIError.PERSONA_SAVE_FAILED, aiM('ai_personaSaveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async get(id: string, options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profile = await store.get(personaKey(objectId, id))\n if (!profile)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n return ok(profile)\n },\n\n async update(id: string, updates: PersonaProfileUpdate, options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const key = personaKey(objectId, id)\n const existing = await store.get(key)\n if (!existing)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n try {\n const profile: PersonaProfile = {\n ...existing,\n name: updates.name ?? existing.name,\n systemPrompt: updates.systemPrompt ?? existing.systemPrompt,\n traits: updates.traits ?? existing.traits,\n metadata: updates.metadata ?? existing.metadata,\n updatedAt: Date.now(),\n }\n await store.save(key, profile, { objectId })\n return ok(profile)\n }\n catch (error) {\n return err(HaiAIError.PERSONA_SAVE_FAILED, aiM('ai_personaSaveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async remove(id: string, options?: PersonaScopeOptions): Promise<HaiResult<void>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n await store.remove(personaKey(objectId, id))\n return ok(undefined)\n },\n\n async list(options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile[]>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profiles = await store.query({ objectId, orderBy: { field: 'createdAt', direction: 'asc' } })\n return ok(profiles)\n },\n\n async compose(id: string, options?: PersonaScopeOptions): Promise<HaiResult<string>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profile = await store.get(personaKey(objectId, id))\n if (!profile)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n return ok(composeSystemPrompt(profile))\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function query(llm: LLMOperations, retrieval: RetrievalOperations) {\n * const rag = createRagOperations(llm, retrieval)\n * const result = await rag.query('项目使用什么语言?', { topK: 5 })\n * if (!result.success) return result\n * return { answer: result.data.answer, citations: result.data.citations }\n * }\n * ```\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 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 signal: options?.signal,\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 signal: options?.signal,\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function reason(config: AIConfig, llm: LLMOperations) {\n * const reasoning = createReasoningOperations(config, llm)\n * const result = await reasoning.run('如何安排三天的开发工作?', { strategy: 'plan-execute', maxRounds: 3 })\n * if (!result.success) return result\n * return result.data.answer\n * }\n * ```\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 signal: options.signal,\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, { signal: options.signal, objectId: options.objectId, sessionId: options.sessionId })\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 signal: options.signal,\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 signal: options.signal,\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 signal: options.signal,\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, { signal: options.signal, objectId: options.objectId, sessionId: options.sessionId })\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const item: CohereRerankResult = { index: 1, relevance_score: 0.9, document: { text: '框架说明' } }\n * const score = item.relevance_score\n * ```\n */\ninterface CohereRerankResult {\n index: number\n relevance_score: number\n document?: { text: string }\n}\n\n/**\n * Cohere Rerank API 响应体\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const response: CohereRerankResponse = { id: 'rerank-1', results: [{ index: 0, relevance_score: 0.9 }] }\n * const indices = response.results.map(item => item.index)\n * ```\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function rerank(config: AIConfig) {\n * const reranker = createRerankOperations(config)\n * const result = await reranker.rerank({ query: '开发语言', documents: ['项目使用 TypeScript', '明天天气晴'], topN: 1 })\n * if (!result.success) return result\n * return result.data.results\n * }\n * ```\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function retrieve(embedding: EmbeddingOperations, provider: AIStoreProvider, sources: AIRelStore<RetrievalSource>) {\n * const retrieval = createRetrievalOperations(embedding, provider, sources)\n * const registered = await retrieval.addSource({ id: 'docs', collection: 'documents', name: '项目文档' })\n * if (!registered.success) return registered\n * return await retrieval.retrieve({ query: '项目介绍', sources: ['docs'], topK: 5 })\n * }\n * ```\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 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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function summarize(llmConfig: LLMConfig, llm: LLMOperations, token: TokenOperations, config: SummaryConfig) {\n * const summary = createSummaryOperations(llmConfig, llm, token, config)\n * const result = await summary.summarize([{ role: 'user', content: '周一发布周报。' }])\n * if (!result.success)\n * return result\n * return result.data.summary\n * }\n * ```\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const tokens = estimateTextTokens('Hello 世界', 0.25)\n * // CJK 逐字估算,非 CJK 按 tokenRatio 估算。\n * ```\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const tokens = estimateMessagesTokens([{ role: 'user', content: '总结会议决策' }], 0.25)\n * ```\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 // 预算必须覆盖实际发送的完整协议载荷,而不只是 content 文本。\n // tool_calls.arguments、reasoning_content、name 与多模态字段都可能占用大量 token。\n total += estimateTextTokens(JSON.stringify(msg), tokenRatio)\n }\n\n // 回复开始标记\n total += 2\n\n return total\n}\n\n/**\n * 创建 Token 操作接口\n *\n * @param config - Token 配置\n * @returns TokenOperations 实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const token = createTokenOperations({ tokenRatio: 0.25 })\n * const budget = token.estimateMessages([{ role: 'user', content: 'Hello' }])\n * ```\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'\nimport type { A2ADeps } from './a2a/ai-a2a-functions.js'\n\nimport type { AIConfig } from './ai-config.js'\nimport type { AudioOperations } from './audio/ai-audio-types.js'\nimport type { CompressOperations } from './compress/ai-compress-types.js'\nimport type { PersistedContextState } from './context/ai-context-state.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 { ImageOperations } from './image/ai-image-types.js'\nimport type { KnowledgeOperations } from './knowledge/ai-knowledge-types.js'\nimport type { 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 { PersonaOperations, PersonaProfile } from './persona/ai-persona-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 } from './summary/ai-summary-types.js'\nimport type { TokenOperations } from './token/ai-token-types.js'\n\nimport { core } from '@h-ai/core'\nimport { createA2AStores } from './a2a/ai-a2a-functions.js'\n\nimport { CompressConfigSchema, KnowledgeConfigSchema, MemoryConfigSchema, RetrievalConfigSchema, SummaryConfigSchema, TokenConfigSchema } from './ai-config.js'\nimport { createAudioOperations } from './audio/ai-audio-functions.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 { createImageOperations } from './image/ai-image-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-facade.js'\nimport { createMem0OssMemoryOperations } from './memory/providers/ai-memory-provider-mem0-oss.js'\nimport { createNativeMemoryOperations } from './memory/providers/ai-memory-provider-native.js'\nimport { createPersonaOperations } from './persona/ai-persona-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/**\n * 子功能组装依赖\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function dependencies(storeProvider: AIStoreProvider, datapipe: DatapipeFunctions): AISubsystemDeps {\n * return { storeProvider, datapipe }\n * }\n * ```\n */\nexport interface AISubsystemDeps {\n storeProvider: AIStoreProvider\n datapipe: DatapipeFunctions\n}\n\n/**\n * 子功能组装结果\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function openContext(subsystems: AISubsystems) {\n * const result = subsystems.context.createManager({ scope: { objectId: 'user-1', sessionId: 'session-1' } })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface AISubsystems {\n /** 在统一初始化之前创建的 A2A 存储 */\n a2aStores: A2ADeps | null\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 persona: PersonaOperations\n token: TokenOperations\n summary: SummaryOperations\n compress: CompressOperations\n context: ContextOperations\n file: FileOperations\n audio: AudioOperations\n image: ImageOperations\n}\n\n/**\n * 组装所有 AI 子功能实例\n *\n * 根据 parsed config 和外部依赖创建所有子功能操作接口。\n * 与 main.ts 解耦——main 仅负责生命周期,本函数负责创建逻辑。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function assemble(config: AIConfig, dependencies: AISubsystemDeps) {\n * // 生命周期与失败清理由 ai.init/close 管理,此工厂复用注入的真实依赖。\n * const subsystems = await createAISubsystems(config, dependencies)\n * const result = subsystems.context.createManager({ scope: { objectId: 'user-1', sessionId: 'session-1' } })\n * if (!result.success) throw new Error(result.error.message)\n * return subsystems\n * }\n * ```\n */\nexport async function createAISubsystems(config: AIConfig, deps: AISubsystemDeps): Promise<AISubsystems> {\n const { storeProvider, datapipe: datapipeDep } = deps\n\n // 记忆后端:mem0 OSS 自管理存储,无需 hai 的 memoryStore / memoryVectorStore\n const memoryParsed = MemoryConfigSchema.parse(config.memory ?? {})\n const useMem0Oss = memoryParsed.provider === 'mem0'\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 = useMem0Oss ? null : storeProvider.createRelStore<MemoryEntry>('hai_ai_memory', { hasObjectId: true, hasScopeIndex: true })\n const contextStore = storeProvider.createRelStore<PersistedContextState>('hai_ai_context', { hasObjectId: true, hasSessionId: true })\n const personaStore = storeProvider.createRelStore<PersonaProfile>('hai_ai_persona', { hasObjectId: true })\n const a2aStores = config.a2a ? createA2AStores(storeProvider) : null\n\n // 向量存储\n const memoryVectorStore = useMem0Oss ? null : 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()\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 memoryCore = memoryStore && memoryVectorStore\n ? createNativeMemoryOperations(memoryParsed, llm, embedding, memoryStore, memoryVectorStore)\n : await createMem0OssMemoryOperations({\n config: memoryParsed,\n aiConfig: config,\n llm,\n collectionName: 'hai_ai_memory',\n embeddingDims: config.embedding?.dimensions,\n vectorBackend: storeProvider.getVectorBackend?.(),\n })\n // 封装出对外的公共记忆接口(作用域绑定 scoped + 管理接口 admin + clear 空过滤保护)\n const memory: MemoryOperations = createMemoryOperations(memoryCore)\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 summary,\n })\n\n // Persona(全局共享的 AI 角色档案)\n const persona = createPersonaOperations(personaStore)\n\n // File(依赖 LLM)\n const file = createFileOperations(config, llm)\n\n // Audio(语音识别 / 语音合成,独立平台 Provider)\n const audio = createAudioOperations(config)\n const image = createImageOperations(config)\n\n return { a2aStores, llm, mcp, embedding, reasoning, rerank, retrieval, rag, knowledge, memory, persona, token, summary, compress, context, file, audio, image }\n}\n","/**\n * Knowledge 的版本发布与跨存储补偿。\n * 文档正文、实体与当前版本在同一 CAS 清单中可见,vecdb 仅作为可重建的检索索引。\n * @module ai-store-knowledge-db\n */\nimport type { HaiResult } from '@h-ai/core'\nimport type { VecdbFunctions } from '@h-ai/vecdb'\nimport type { AIRelStore, KnowledgeDocumentRevision, KnowledgeStore } from '../ai-store-types.js'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { HaiVecdbError } from '@h-ai/vecdb'\n\n/**\n * 已发布快照不保存向量数组,避免同一向量在 SQL 和 vecdb 重复持久化。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const document: PublishedRevision = { documentId: 'doc-1', collection: 'docs', revision: 'revision-1', createdAt: Date.now(), chunks: [{ id: 'chunk-1', content: '指南', metadata: {} }], entities: [] }\n * const ids = document.chunks.map(chunk => chunk.id)\n * ```\n */\ntype PublishedRevision = Omit<KnowledgeDocumentRevision, 'chunks'> & {\n chunks: Array<Omit<KnowledgeDocumentRevision['chunks'][number], 'vector'>>\n}\n\n/**\n * 补偿记录在任何外部写入前持久化;abandoned 墓碑不能因一次删除成功就遗忘。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const garbage: GarbageRevision = { revision: 'old-revision', ids: ['old-chunk'], abandoned: true }\n * // abandoned 为永久墓碑:一次删除成功也不能让迟到 writer 重新发布。\n * const retainTombstone = garbage.abandoned\n * ```\n */\ninterface GarbageRevision {\n revision: string\n ids: string[]\n abandoned: boolean\n}\n\n/**\n * 每文档一个永久清单;删除保留墓碑,阻断旧 writer 的 missing ABA。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function nextManifest(store: AIRelStore<KnowledgeDocumentManifest>, current: KnowledgeDocumentManifest, document: PublishedRevision): Promise<KnowledgeDocumentManifest> {\n * return { ...current, pending: { document, deadline: await store.currentTime() + 30_000 } }\n * }\n * // 最终发布仍须携带 readVersioned 读到的版本,并由存储原子核验期限。\n * ```\n */\nexport interface KnowledgeDocumentManifest {\n /** 集合、代际、文档 ID 的散列组合键。 */\n key: string\n /** 逻辑集合。 */\n collection: string\n /** 集合代际,删除后不复用。 */\n generation: string\n /** 业务文档 ID。 */\n documentId: string\n /** 已完整发布的正文与实体快照。 */\n current?: PublishedRevision\n /** 尚未可见的写入及存储时钟期限。 */\n pending?: { document: PublishedRevision, deadline: number }\n /** 外部索引补偿记录。 */\n garbage: GarbageRevision[]\n}\n\n/**\n * 集合删除也保留代际,重新 setup 不会重新显示上一代的数据。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const manifest: KnowledgeCollectionManifest = { collection: 'docs', dimension: 2, generation: randomUUID(), deleted: false }\n * const next = { ...manifest, generation: randomUUID() } // 重新建立集合不复用旧代际。\n * ```\n */\nexport interface KnowledgeCollectionManifest {\n /** 逻辑集合名。 */\n collection: string\n /** 固定向量维度。 */\n dimension: number\n /** 当前代际,删除后重新 setup 会更换。 */\n generation: string\n /** 集合是否已撤销可见性。 */\n deleted: boolean\n}\n\n/**\n * 内部依赖;只由默认 DB Provider 构造,不作为包公开 API。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function bind(deps: KnowledgeDbDependencies): KnowledgeDbDependencies {\n * // prepare 归调用方装配,必须等待共享表就绪,不能把失败当作空集合。\n * return { documents: deps.documents, collections: deps.collections, prepare: deps.prepare, vecdb: deps.vecdb }\n * }\n * ```\n */\ninterface KnowledgeDbDependencies {\n documents: AIRelStore<KnowledgeDocumentManifest>\n collections: AIRelStore<KnowledgeCollectionManifest>\n prepare: () => Promise<void>\n vecdb: VecdbFunctions\n}\n\nconst WRITE_LEASE_MS = 300_000\nconst CAS_ATTEMPTS = 12\n\n/** SQL/vecdb HaiResult 失败必须向上层传播,不能伪装为空或写入成功。 */\nfunction required<T>(result: HaiResult<T>): T {\n if (!result.success)\n throw new Error(result.error.message, { cause: result.error })\n return result.data\n}\n\n/** 组合键先编码再散列,避免文档/集合名中的分隔符产生碰撞。 */\nfunction keyFor(...parts: string[]): string {\n return createHash('sha256').update(JSON.stringify(parts)).digest('hex')\n}\n\n/** 发布快照与暂存输入分离,调用方修改输入不能隐式更改已发布内容。 */\nfunction snapshot(document: KnowledgeDocumentRevision): PublishedRevision {\n return structuredClone({ ...document, chunks: document.chunks.map(({ vector: _vector, ...chunk }) => chunk) })\n}\n\n/** 已完成的旧版本可以移除补偿记录;被遗弃的写入需保留永久墓碑。 */\nfunction garbageFor(document: PublishedRevision, abandoned: boolean): GarbageRevision {\n return { revision: document.revision, ids: document.chunks.map(chunk => chunk.id), abandoned }\n}\n\n/**\n * 基于共享 RelStore CAS 实现 Knowledge 存储,不承诺 SQL 与 vecdb 的跨库事务。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function prepare(deps: KnowledgeDbDependencies) {\n * const store = createDbKnowledgeStore(deps)\n * await store.initialize('docs', 2)\n * const recovery = await store.repair('docs', { offset: 0, limit: 100 })\n * return { store, recovery }\n * }\n * ```\n */\nexport function createDbKnowledgeStore(deps: KnowledgeDbDependencies): KnowledgeStore {\n const { documents, collections, vecdb, prepare } = deps\n\n async function collectionState(collection: string): Promise<KnowledgeCollectionManifest> {\n const state = await collections.get(keyFor(collection))\n if (!state || state.deleted)\n throw new Error('Knowledge collection is not initialized')\n return state\n }\n\n async function visible(collection?: string): Promise<KnowledgeDocumentManifest[]> {\n const rows = await documents.query(collection ? { objectId: collection } : {})\n const states = new Map((await collections.query({})).map(state => [state.collection, state]))\n return rows.filter((row) => {\n const state = states.get(row.collection)\n return row.current && state && !state.deleted && state.generation === row.generation\n })\n }\n\n /** 先 CAS 撤销过期 owner,再删除外部索引,旧 owner 此后不能发布。 */\n async function detachExpired(key: string): Promise<void> {\n for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {\n const row = await documents.readVersioned(key)\n if (!row?.data.pending || row.data.pending.deadline > await documents.currentTime())\n return\n const next = { ...row.data, pending: undefined, garbage: [...row.data.garbage, garbageFor(row.data.pending.document, true)] }\n if (await documents.compareAndSwap(key, { expectedVersion: row.version, data: next }))\n return\n }\n throw new Error('Knowledge recovery contention')\n }\n\n /** 删除失败保留清单;清理结果提交冲突时重读,不能覆盖新版本。 */\n async function cleanup(key: string): Promise<void> {\n for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {\n const row = await documents.readVersioned(key)\n if (!row || row.data.garbage.length === 0)\n return\n const currentId = row.data.current?.revision\n const pendingId = row.data.pending?.document.revision\n const eligible = row.data.garbage.filter(item => item.revision !== currentId && item.revision !== pendingId)\n for (const garbage of eligible) {\n if (garbage.ids.length > 0)\n required(await vecdb.vector.delete(row.data.collection, garbage.ids))\n }\n const completed = new Set(eligible.filter(item => !item.abandoned).map(item => item.revision))\n if (completed.size === 0)\n return\n const next = { ...row.data, garbage: row.data.garbage.filter(item => !completed.has(item.revision)) }\n if (await documents.compareAndSwap(key, { expectedVersion: row.version, data: next }))\n return\n }\n throw new Error('Knowledge cleanup contention')\n }\n\n /** 正在进行的外部写入不可强行取消;永久墓碑用于后续重复清理迟到写入。 */\n async function abandon(key: string, revision: string): Promise<void> {\n for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {\n const row = await documents.readVersioned(key)\n if (row?.data.pending?.document.revision !== revision)\n return\n const next = { ...row.data, pending: undefined, garbage: [...row.data.garbage, garbageFor(row.data.pending.document, true)] }\n if (await documents.compareAndSwap(key, { expectedVersion: row.version, data: next }))\n return\n }\n throw new Error('Knowledge abandonment contention')\n }\n\n async function removeManifest(documentId: string, collection: string, generationOverride?: string): Promise<void> {\n const generation = generationOverride ?? (await collectionState(collection)).generation\n const key = keyFor(collection, generation, documentId)\n for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {\n const row = await documents.readVersioned(key)\n if (!row)\n return\n const next = {\n ...row.data,\n current: undefined,\n pending: undefined,\n garbage: [...row.data.garbage, ...(row.data.current ? [garbageFor(row.data.current, false)] : []), ...(row.data.pending ? [garbageFor(row.data.pending.document, true)] : [])],\n }\n if (await documents.compareAndSwap(key, { expectedVersion: row.version, data: next })) {\n await cleanup(key)\n return\n }\n }\n throw new Error('Knowledge document removal contention')\n }\n\n const store: KnowledgeStore = {\n async initialize(collection, dimension) {\n await prepare()\n await store.ensureCollection(collection, dimension)\n },\n\n async replaceDocument(document) {\n const state = await collectionState(document.collection)\n const key = keyFor(document.collection, state.generation, document.documentId)\n await detachExpired(key)\n const previous = await documents.readVersioned(key)\n if (previous?.data.pending)\n throw new Error('Knowledge document is already being rebuilt')\n const published = snapshot(document)\n const pending = { document: published, deadline: await documents.currentTime() + WRITE_LEASE_MS }\n const manifest: KnowledgeDocumentManifest = {\n key,\n collection: document.collection,\n generation: state.generation,\n documentId: document.documentId,\n current: previous?.data.current,\n pending,\n garbage: previous?.data.garbage ?? [],\n }\n const claimVersion = await documents.compareAndSwap(key, {\n expectedVersion: previous?.version,\n data: manifest,\n scope: { objectId: document.collection, sessionId: state.generation },\n })\n if (!claimVersion)\n throw new Error('Knowledge document was concurrently modified')\n\n try {\n // 所有 ID 和清单已经持久化;部分成功、网络超时或进程崩溃均可恢复删除。\n if (document.chunks.length > 0)\n required(await vecdb.vector.upsert(document.collection, document.chunks))\n const liveCollection = await collectionState(document.collection)\n if (liveCollection.generation !== state.generation)\n throw new Error('Knowledge collection generation changed')\n const next: KnowledgeDocumentManifest = {\n ...manifest,\n current: published,\n pending: undefined,\n garbage: manifest.current ? [...manifest.garbage, garbageFor(manifest.current, false)] : manifest.garbage,\n }\n if (!await documents.compareAndSwap(key, { expectedVersion: claimVersion, data: next, notAfter: pending.deadline }))\n throw new Error('Knowledge document publication lease expired or was revoked')\n }\n catch (error) {\n // 发布结果不确定时必须先读当前清单;abandon 只撤销仍归本版本的 pending。\n try {\n await abandon(key, document.revision)\n await cleanup(key)\n }\n catch (cleanupError) {\n throw new AggregateError([error, cleanupError], 'Knowledge staging failed; durable cleanup is pending')\n }\n throw error\n }\n try {\n await cleanup(key)\n return { cleanupPending: false }\n }\n catch {\n // 完整版本已经发布;不能谎称发布失败,也不能掩盖尚未完成的清理。\n return { cleanupPending: true }\n }\n },\n\n async repair(collection, options) {\n const page = await documents.queryPage({ objectId: collection, orderBy: { field: 'key', direction: 'asc' } }, { offset: options?.offset ?? 0, limit: options?.limit ?? 100 })\n const state = await collections.get(keyFor(collection))\n for (const row of page.items) {\n if (!state || state.deleted || row.generation !== state.generation) {\n // 已删除集合的旧 owner 也通过同一清单 CAS 撤销。\n await removeManifest(row.documentId, collection, row.generation)\n }\n else {\n await detachExpired(row.key)\n await cleanup(row.key)\n }\n }\n return { processed: page.items.length, total: page.total }\n },\n\n async findEntitiesByName(keyword, collection) {\n const needle = keyword.toLocaleLowerCase()\n return (await visible(collection)).flatMap(row => row.current!.entities).filter(entity => [entity.name, ...entity.aliases].some(value => value.toLocaleLowerCase().includes(needle))).map(({ id, name, type, aliases }) => ({ id, name, type, aliases }))\n },\n\n async listEntities(options) {\n const needle = options?.keyword?.toLocaleLowerCase()\n return (await visible(options?.collection)).flatMap(row => row.current!.entities.map(entity => ({\n id: entity.id,\n name: entity.name,\n type: entity.type,\n aliases: entity.aliases,\n description: entity.description ?? null,\n createdAt: String(row.current!.createdAt),\n updatedAt: String(row.current!.createdAt),\n }))).filter(entity => (!options?.type || entity.type === options.type)\n && (!needle || [entity.name, ...entity.aliases].some(value => value.toLocaleLowerCase().includes(needle)))).sort((a, b) => a.name.localeCompare(b.name)).slice(0, options?.limit)\n },\n\n async findDocumentsByEntityIds(ids, collection) {\n const wanted = new Set(ids)\n return (await visible(collection)).flatMap(row => row.current!.entities.filter(entity => wanted.has(entity.id))\n .flatMap(entity => entity.chunkIds.map(chunkId => ({\n entityId: entity.id,\n documentId: row.documentId,\n chunkId,\n collection: row.collection,\n relevance: 1,\n context: row.current!.chunks.find(chunk => chunk.id === chunkId)?.content.slice(0, 200) ?? null,\n }))))\n },\n\n async findByEntityName(name, options) {\n const needle = name.toLocaleLowerCase()\n // 实体和命中关系从同一份快照派生,不能在两次查询之间拼接不同 revision。\n return (await visible(options?.collection)).flatMap(row => row.current!.entities\n .filter(entity => (!options?.type || options.type === entity.type)\n && [entity.name, ...entity.aliases].some(value => value.toLocaleLowerCase().includes(needle)))\n .map(entity => ({\n entity: { id: entity.id, name: entity.name, type: entity.type, aliases: entity.aliases, description: entity.description ?? null },\n documents: entity.chunkIds.map(chunkId => ({\n documentId: row.documentId,\n chunkId,\n collection: row.collection,\n relevance: 1,\n context: row.current!.chunks.find(chunk => chunk.id === chunkId)?.content.slice(0, 200) ?? null,\n })),\n })))\n },\n\n async getDocument(documentId, collection) {\n const row = (await visible(collection)).find(item => item.documentId === documentId)\n return row?.current ? documentInfo(row.current) : undefined\n },\n\n async listDocuments(collection, options) {\n return (await visible(collection)).map(row => documentInfo(row.current!)).sort((a, b) => b.createdAt - a.createdAt || a.documentId.localeCompare(b.documentId)).slice(options?.offset ?? 0, options?.limit === undefined ? undefined : (options.offset ?? 0) + options.limit)\n },\n\n removeDocument: (documentId, collection) => removeManifest(documentId, collection),\n\n async searchVectors(collection, vector, options) {\n const topK = options?.topK ?? 10\n if (!Number.isSafeInteger(topK) || topK < 1 || topK > 10_000)\n throw new Error('Knowledge topK must be an integer between 1 and 10000')\n for (let attempt = 0; attempt < 4; attempt++) {\n // 查询前后核对同一批可见版本;清理与版本切换穿插时重试,不能返回空窗或混合版本。\n const before = await visible(collection)\n const signature = (rows: KnowledgeDocumentManifest[]) => JSON.stringify(rows.map(row => [row.key, row.current!.revision]).sort())\n const active = new Map(before.flatMap(row => row.current!.chunks.map(chunk => [chunk.id, chunk] as const)))\n let total = required(await vecdb.vector.count(collection))\n let requested = Math.min(Math.max(topK * 2, 1), Math.max(total, 1))\n let results: Awaited<ReturnType<KnowledgeStore['searchVectors']>> = []\n let complete = false\n for (let candidateRound = 0; candidateRound < 16; candidateRound++) {\n const hits = required(await vecdb.vector.search(collection, vector, { ...options, topK: requested }))\n results = hits.filter(hit => active.has(hit.id)).map((hit) => {\n const chunk = active.get(hit.id)!\n return { id: hit.id, score: hit.score, content: chunk.content, metadata: chunk.metadata }\n })\n if (results.length >= topK || hits.length < requested) {\n complete = true\n break\n }\n // 暂存写入可能发生在 count 和 search 之间;旧计数不能让新暂存挤掉全部可见结果。\n total = required(await vecdb.vector.count(collection))\n if (requested >= total) {\n complete = true\n break\n }\n requested = Math.min(total, requested * 2)\n }\n if (!complete)\n throw new Error('Knowledge candidate expansion limit reached; repair stale indexes and retry')\n if (signature(before) === signature(await visible(collection)))\n return results.slice(0, topK)\n }\n throw new Error('Knowledge publication changed repeatedly during retrieval; retry the read')\n },\n\n async ensureCollection(collection, dimension) {\n if (!required(await vecdb.collection.exists(collection))) {\n const result = await vecdb.collection.create(collection, { dimension })\n if (!result.success && result.error.code !== HaiVecdbError.COLLECTION_ALREADY_EXISTS.code)\n required(result)\n }\n },\n\n async registerCollection(collection, dimension) {\n const key = keyFor(collection)\n for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {\n const row = await collections.readVersioned(key)\n if (row && !row.data.deleted) {\n if (row.data.dimension !== dimension)\n throw new Error('Knowledge collection dimension cannot be changed')\n return\n }\n if (await collections.compareAndSwap(key, {\n expectedVersion: row?.version,\n data: { collection, dimension, generation: randomUUID(), deleted: false },\n })) {\n return\n }\n }\n throw new Error('Knowledge collection setup contention')\n },\n\n async collectionExists(collection) {\n const state = await collections.get(keyFor(collection))\n return Boolean(state && !state.deleted)\n },\n\n async deleteCollection(collection) {\n const key = keyFor(collection)\n for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {\n const row = await collections.readVersioned(key)\n if (!row)\n return\n if (row.data.deleted || await collections.compareAndSwap(key, { expectedVersion: row.version, data: { ...row.data, deleted: true } })) {\n // 先撤销可见性,再按页清理;只把当前页加载进内存,失败保留进度清单供 repair。\n let offset = 0\n while (true) {\n const page = await store.repair(collection, { offset, limit: 100 })\n offset += page.processed\n if (page.processed === 0 || offset >= page.total)\n break\n }\n return\n }\n }\n throw new Error('Knowledge collection deletion contention')\n },\n }\n return store\n}\n\n/** 可见文档元数据只从完整发布快照派生。 */\nfunction documentInfo(document: PublishedRevision) {\n return {\n documentId: document.documentId,\n revision: document.revision,\n entityCount: document.entities.length,\n collection: document.collection,\n title: document.title ?? null,\n url: document.url ?? null,\n chunkCount: document.chunks.length,\n createdAt: document.createdAt,\n }\n}\n","/**\n * @h-ai/ai — 默认 DB 存储 Provider(reldb + vecdb)\n *\n * 基于 @h-ai/reldb 和 @h-ai/vecdb 的 AIStoreProvider 默认实现。\n * AI 默认初始化路径直接使用该实现,因此 @h-ai/reldb 与 @h-ai/vecdb 是运行时依赖。\n * @module ai-store-provider-db\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { DbType, DmlOperations, ReldbJsonOps } from '@h-ai/reldb'\nimport type { VecdbFunctions } from '@h-ai/vecdb'\nimport type { AIRelStore, AIRelStoreCompareAndSwap, AIRelStoreOptions, AIStoreProvider, AIVectorBackend, AIVectorStore, AIVersionedRecord, KnowledgeStore, StoreFilter, StorePage, StoreScope, WhereClause, WhereOperator } from '../ai-store-types.js'\n\nimport type { KnowledgeCollectionManifest, KnowledgeDocumentManifest } from './ai-store-knowledge-db.js'\nimport { core } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { HaiVecdbError, vecdb } from '@h-ai/vecdb'\nimport { aiM } from '../../ai-i18n.js'\nimport { createDbKnowledgeStore } from './ai-store-knowledge-db.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'store-provider-db' })\n\n/** 内部 Store 以异常通知上层失败,不能把 SQL HaiResult 错误当空数据或写入成功。 */\nfunction requireSqlSuccess<T>(result: HaiResult<T>): Extract<HaiResult<T>, { success: true }> {\n if (!result.success)\n throw new Error(result.error.message, { cause: result.error })\n return result\n}\n\n/** 单条批量 SQL 的参数上限,保守低于 SQLite 默认 999 变量限制。 */\nconst MAX_BATCH_SQL_PARAMS = 900\n\n/** 从业务数据读取可用于索引的 Unix 毫秒时间;没有时间字段时回退到写入时间。 */\nfunction dataTimestamp<T>(data: T, field: 'createdAt' | 'updatedAt', fallback: number): number {\n if (typeof data !== 'object' || data === null)\n return fallback\n\n const value = (data as Record<string, unknown>)[field]\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback\n}\n\n/**\n * MySQL 单个索引列的真实结构;完整列、顺序、可见性和非唯一 BTREE 都必须匹配。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const column: MysqlIndexColumn = { column_name: 'object_id', seq_in_index: 1, non_unique: 1, sub_part: null, index_type: 'BTREE', collation: 'A', is_visible: 'YES', expression: null }\n * const usable = column.index_type === 'BTREE' && column.sub_part === null && column.is_visible === 'YES'\n * ```\n */\ninterface MysqlIndexColumn {\n column_name: string | null\n seq_in_index: number | string\n non_unique: number | string\n sub_part: number | null\n index_type: string\n collation: string | null\n is_visible: string\n expression: string | null\n}\n\n/**\n * 只识别驱动明确的重复索引错误;沿 HaiResult/Error cause 查找,不根据错误文案猜测。\n */\nfunction isMysqlDuplicateIndex(error: unknown): boolean {\n const seen = new Set<object>()\n let current = error\n while (current !== null && typeof current === 'object' && !seen.has(current)) {\n seen.add(current)\n const details = current as Record<string, unknown>\n if (details.code === 'ER_DUP_KEYNAME' && details.errno === 1061)\n return true\n current = details.cause\n }\n return false\n}\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 private readonly hasScopeIndex: boolean\n\n constructor(sql: DmlOperations, table: string, jsonOps: ReldbJsonOps, dbType: DbType, options?: AIRelStoreOptions) {\n this.sql = {\n ...sql,\n execute: (query, params) => sql.execute(query, params).then(requireSqlSuccess),\n query: <R>(query: string, params?: unknown[]) => sql.query<R>(query, params).then(requireSqlSuccess),\n get: <R>(query: string, params?: unknown[]) => sql.get<R>(query, params).then(requireSqlSuccess),\n }\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 this.hasScopeIndex = options?.hasScopeIndex ?? 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('version VARCHAR(36) NOT NULL', `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.createIndex(`idx_${t}_object_id`, 'object_id')\n if (this.hasSessionId)\n await this.createIndex(`idx_${t}_session_id`, 'session_id')\n if (this.hasObjectId && this.hasSessionId)\n await this.createIndex(`idx_${t}_object_session`, 'object_id, session_id')\n if (this.hasStatus)\n await this.createIndex(`idx_${t}_status`, 'status')\n if (this.hasRefId)\n await this.createIndex(`idx_${t}_ref_id`, 'ref_id')\n // 业务作用域索引:仅 PostgreSQL 支持 JSONB GIN,用于加速 data @> '{\"scope\":...}' 包含查询。\n if (this.hasScopeIndex && db === 'postgresql')\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_data_gin ON ${t} USING GIN (data jsonb_path_ops)`)\n }\n\n /**\n * MySQL 并发首次创建只接受明确的重复名称错误,并重读结构,权限/DDL/不匹配仍失败。\n */\n private async createIndex(name: string, columns: string): Promise<void> {\n if (this.dbType === 'mysql') {\n const read = async () => requireSqlSuccess(await this.sql.query<MysqlIndexColumn>(\n 'SELECT COLUMN_NAME AS column_name, SEQ_IN_INDEX AS seq_in_index, NON_UNIQUE AS non_unique, SUB_PART AS sub_part, INDEX_TYPE AS index_type, COLLATION AS collation, IS_VISIBLE AS is_visible, EXPRESSION AS expression FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ? ORDER BY SEQ_IN_INDEX',\n [this.table, name],\n )).data\n const expected = columns.split(',').map(column => column.trim())\n const matches = (definition: MysqlIndexColumn[]) => definition.length === expected.length\n && definition.every((column, index) => column.column_name === expected[index]\n && Number(column.seq_in_index) === index + 1 && Number(column.non_unique) === 1\n && column.sub_part === null && column.index_type === 'BTREE' && column.collation === 'A'\n && column.is_visible === 'YES' && column.expression === null)\n const existing = await read()\n if (existing.length > 0) {\n if (!matches(existing))\n throw new Error(aiM('ai_storeIndexMismatch'))\n return\n }\n try {\n await this.sql.execute(`CREATE INDEX ${name} ON ${this.table}(${columns})`)\n }\n catch (error) {\n if (!isMysqlDuplicateIndex(error))\n throw error\n // 两个节点都读到缺失时,败者只能在实际结构与预期一致后继续;不能吞掉其它失败。\n if (!matches(await read()))\n throw new Error(aiM('ai_storeIndexMismatch'), { cause: error })\n }\n return\n }\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS ${name} ON ${this.table}(${columns})`)\n }\n\n /** 普通写入也更换版本,使并发条件写入识别所有较新修改。 */\n async save(id: string, data: T, scope?: StoreScope): Promise<void> {\n await this.saveManyBatch([{ id, data, scope }], this.buildSaveColumnNames())\n }\n\n /** SQLite TEXT 需要解码;PostgreSQL JSONB/MySQL JSON 已由驱动解码,包含标量字符串。 */\n private decodeData(value: unknown): T {\n if (this.dbType !== 'sqlite')\n return structuredClone(value) as T\n if (typeof value !== 'string')\n throw new TypeError('Invalid SQLite JSON record')\n return JSON.parse(value) as T\n }\n\n /** 数据和版本由同一次 SELECT 返回,禁止拆成两次不一致的读取。 */\n async readVersioned(id: string): Promise<AIVersionedRecord<T> | undefined> {\n const found = requireSqlSuccess(await this.sql.get<{ version: string, data: unknown }>(`SELECT version, data FROM ${this.table} WHERE id = ?`, [id]))\n if (!found.data)\n return undefined\n return { version: found.data.version, data: this.decodeData(found.data.data) }\n }\n\n /** 所有节点从持久化端读取租约时钟;不使用进程 Date.now() 判断共享 owner 是否过期。 */\n async currentTime(): Promise<number> {\n const found = requireSqlSuccess(await this.sql.get<{ now: number | string }>(`SELECT ${this.databaseClock()} AS now`))\n if (!found.data || !Number.isFinite(Number(found.data.now)))\n throw new Error('Store clock unavailable')\n return Math.floor(Number(found.data.now))\n }\n\n /** 仅由当前已验证的数据库类型选择时钟表达式。 */\n private databaseClock(): string {\n if (this.dbType === 'postgresql')\n return '(EXTRACT(EPOCH FROM clock_timestamp()) * 1000)'\n if (this.dbType === 'mysql')\n // NOW/CURRENT_TIMESTAMP 固定在语句开始时;SYSDATE 在行锁等待结束后仍取实际时钟。\n return '(UNIX_TIMESTAMP(SYSDATE(3)) * 1000)'\n return 'CAST((julianday(\\'now\\') - 2440587.5) * 86400000 AS INTEGER)'\n }\n\n /** 原子检查版本和可选存储端期限;lease 续租或本地布尔值不能替代最终条件。 */\n async compareAndSwap(id: string, input: AIRelStoreCompareAndSwap<T>): Promise<string | undefined> {\n if (input.notAfter !== undefined && !Number.isSafeInteger(input.notAfter))\n throw new RangeError('Invalid Store write deadline')\n const version = crypto.randomUUID()\n const now = Date.now()\n const columns = this.buildSaveColumnNames()\n const values = this.buildSaveValues(id, input.data, input.scope, now)\n values[columns.indexOf('version')] = version\n const deadline = input.notAfter === undefined ? '1 = 1' : `${this.databaseClock()} < ?`\n const deadlineParams = input.notAfter === undefined ? [] : [input.notAfter]\n if (input.expectedVersion !== undefined) {\n const updated = columns.filter(column => column !== 'id' && column !== 'created_at'\n && (input.scope !== undefined || ['version', 'data', 'updated_at'].includes(column)))\n const result = requireSqlSuccess(await this.sql.execute(\n `UPDATE ${this.table} SET ${updated.map(column => `${column} = ?`).join(', ')} WHERE id = ? AND version = ? AND ${deadline}`,\n [...updated.map(column => values[columns.indexOf(column)]), id, input.expectedVersion, ...deadlineParams],\n ))\n return result.data.changes === 1 ? version : undefined\n }\n try {\n // MySQL 不用 INSERT IGNORE:除唯一主键冲突外,任何故障都必须向上抛出。\n const conflict = this.dbType === 'mysql' ? '' : ' ON CONFLICT(id) DO NOTHING'\n const result = requireSqlSuccess(await this.sql.execute(\n `INSERT INTO ${this.table} (${columns.join(', ')}) SELECT ${values.map(() => '?').join(', ')} WHERE ${deadline}${conflict}`,\n [...values, ...deadlineParams],\n ))\n return result.data.changes === 1 ? version : undefined\n }\n catch (error) {\n if (this.dbType === 'mysql') {\n let cause: unknown = error\n for (let depth = 0; depth < 8 && cause && typeof cause === 'object'; depth++) {\n if (('code' in cause && cause.code === 'ER_DUP_ENTRY') || ('errno' in cause && cause.errno === 1062))\n return undefined\n cause = 'cause' in cause ? cause.cause : undefined\n }\n }\n throw error\n }\n }\n\n async saveMany(items: Array<{ id: string, data: T, scope?: StoreScope }>): Promise<void> {\n if (items.length === 0)\n return\n\n const colNames = this.buildSaveColumnNames()\n const rowsPerBatch = Math.max(1, Math.floor(MAX_BATCH_SQL_PARAMS / colNames.length))\n\n // 大批量入库时使用多行 INSERT,减少 SQL 往返;按参数数分批避免 SQLite / MySQL 参数上限。\n for (let start = 0; start < items.length; start += rowsPerBatch) {\n // 每批都是参数化批量 SQL;顺序执行避免同一连接上并发写入争抢。\n await this.saveManyBatch(items.slice(start, start + rowsPerBatch), colNames)\n }\n }\n\n async get(id: string): Promise<T | undefined> {\n const result = await this.sql.get<{ data: unknown }>(`SELECT data FROM ${this.table} WHERE id = ?`, [id])\n if (!result.success || !result.data)\n return undefined\n return this.decodeData(result.data.data)\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: unknown }>(sql, params)\n if (!result.success)\n return []\n return result.data.map(row => this.decodeData(row.data))\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: unknown }>(pagedSql, [...params, page.limit, page.offset])\n const items = result.success ? result.data.map(row => this.decodeData(row.data)) : []\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 /** 构造 save/saveMany 共用的列名,确保批量写入与单条写入索引列一致。 */\n private buildSaveColumnNames(): string[] {\n const colNames = ['id']\n if (this.hasObjectId)\n colNames.push('object_id')\n if (this.hasSessionId)\n colNames.push('session_id')\n if (this.hasStatus)\n colNames.push('status')\n if (this.hasRefId)\n colNames.push('ref_id')\n colNames.push('version', 'data', 'created_at', 'updated_at')\n return colNames\n }\n\n /** 构造单行 upsert 参数;动态值全部通过 params 传入,SQL 中不拼接用户输入。 */\n private buildSaveValues(id: string, data: T, scope: StoreScope | undefined, now: number): unknown[] {\n const values: unknown[] = [id]\n if (this.hasObjectId)\n values.push(scope?.objectId ?? null)\n if (this.hasSessionId)\n values.push(scope?.sessionId ?? null)\n if (this.hasStatus)\n values.push(scope?.status ?? null)\n if (this.hasRefId)\n values.push(scope?.refId ?? null)\n values.push(\n crypto.randomUUID(),\n JSON.stringify(data),\n dataTimestamp(data, 'createdAt', now),\n dataTimestamp(data, 'updatedAt', now),\n )\n return values\n }\n\n /** 构造跨数据库 upsert 更新片段;列名来自内部白名单,不接受外部输入。 */\n private buildSaveUpdateParts(): string[] {\n const valueRef = (column: string) => this.dbType === 'mysql' ? `VALUES(${column})` : `excluded.${column}`\n const updateParts: string[] = [`version = ${valueRef('version')}`, `data = ${valueRef('data')}`, `updated_at = ${valueRef('updated_at')}`]\n if (this.hasObjectId)\n updateParts.push(`object_id = ${valueRef('object_id')}`)\n if (this.hasSessionId)\n updateParts.push(`session_id = ${valueRef('session_id')}`)\n if (this.hasStatus)\n updateParts.push(`status = ${valueRef('status')}`)\n if (this.hasRefId)\n updateParts.push(`ref_id = ${valueRef('ref_id')}`)\n return updateParts\n }\n\n /** 执行一批参数化 upsert;调用方已按数据库参数上限切好 batch。 */\n private async saveManyBatch(items: Array<{ id: string, data: T, scope?: StoreScope }>, colNames: string[]): Promise<void> {\n const now = Date.now()\n const values: unknown[] = []\n const placeholders = items.map(({ id, data, scope }) => {\n const rowValues = this.buildSaveValues(id, data, scope, now)\n values.push(...rowValues)\n return `(${rowValues.map(() => '?').join(', ')})`\n })\n\n const updateParts = this.buildSaveUpdateParts()\n const conflictSql = this.dbType === 'mysql'\n ? `ON DUPLICATE KEY UPDATE ${updateParts.join(', ')}`\n : `ON CONFLICT(id) DO UPDATE SET ${updateParts.join(', ')}`\n\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES ${placeholders.join(', ')} ${conflictSql}`,\n values,\n )\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 // 业务作用域下推:仅 PostgreSQL 用 JSONB 包含查询(可命中 GIN 索引)。\n // 其它后端为 no-op —— 结果不受影响,由调用方在内存中完成 scope 匹配。\n if (filter.scope && Object.keys(filter.scope).length > 0 && this.dbType === 'postgresql') {\n conditions.push('data @> ?::jsonb')\n params.push(JSON.stringify({ scope: filter.scope }))\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/** 内部 Store 使用显式异常通知调用方,向量写入失败不能继续登记为成功。 */\nfunction requireVecdbSuccess<T>(result: HaiResult<T>): T {\n if (!result.success)\n throw new Error(result.error.message, { cause: result.error })\n return result.data\n}\n\n/** 以共享后端为准懒建集合;并发创建的 already-exists 可继续,其它错误必须传播。 */\nasync function ensureVecdbCollection(database: VecdbFunctions, name: string, dimension: number): Promise<void> {\n const exists = requireVecdbSuccess(await database.collection.exists(name))\n if (exists)\n return\n const created = await database.collection.create(name, { dimension })\n if (!created.success && created.error.code !== HaiVecdbError.COLLECTION_ALREADY_EXISTS.code)\n requireVecdbSuccess(created)\n}\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\n constructor(vecdb: VecdbFunctions, collection: string) {\n this.vecdb = vecdb\n this.collection = collection\n }\n\n async upsert(id: string, vector: number[], metadata?: Record<string, unknown>): Promise<void> {\n await ensureVecdbCollection(this.vecdb, this.collection, vector.length)\n requireVecdbSuccess(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 // 过滤校验/执行失败必须向上层传播,不能伪装成空的合法检索结果。\n return requireVecdbSuccess(await this.vecdb.vector.search(this.collection, vector, options))\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 }\n }\n}\n\n// ─── Provider 工厂 ───\n\n/**\n * DB Provider 依赖\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function bind(sql: DmlOperations, jsonOps: ReldbJsonOps, vector: VecdbFunctions): DbStoreProviderDeps {\n * return { sql, jsonOps, dbType: 'postgresql', vecdb: vector }\n * }\n * ```\n */\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 * MySQL 首次建索引只在明确的 1061 重复名称后重查并接受匹配结构;其它 DDL 失败向上传播。\n * initialize 等待全部已启动 DDL 结束,失败不回滚 MySQL 已创建结构,也不关闭调用方的依赖。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function prepare(deps: DbStoreProviderDeps) {\n * const provider = createDbStoreProvider(deps)\n * const store = provider.createRelStore<{ title: string }>('hai_ai_example', { hasObjectId: true })\n * await provider.initialize()\n * await store.save('doc-1', { title: '指南' }, { objectId: 'user-1' })\n * await provider.close?.() // 只释放本 Provider 状态;借用的 reldb/vecdb 由调用方关闭。\n * }\n * ```\n */\nexport function createDbStoreProvider(deps: DbStoreProviderDeps): AIStoreProvider {\n const { sql, jsonOps, vecdb: vecdbDep } = deps\n const dbType = deps.dbType ?? 'sqlite'\n\n /** 按表归组,避免同表 Store 并发 DDL 竞争 PostgreSQL 系统目录。 */\n const relStores = new Map<string, ReldbAIRelStore<unknown>[]>()\n\n return {\n name: 'db',\n get stateScope(): 'local' | 'shared' {\n const vector = vecdbDep.config\n const sharedVector = vector?.type === 'qdrant' || vector?.type === 'pgvector' || (vector?.type === 'chroma' && (!vector.path || Boolean(vector.url)))\n return dbType !== 'sqlite' && sharedVector ? 'shared' : 'local'\n },\n\n createRelStore<T>(name: string, options?: AIRelStoreOptions): AIRelStore<T> {\n const store = new ReldbAIRelStore<T>(sql, name, jsonOps, dbType, options)\n const stores = relStores.get(name) ?? []\n stores.push(store as ReldbAIRelStore<unknown>)\n relStores.set(name, stores)\n return store\n },\n\n createVectorStore(name: string): AIVectorStore {\n return new VecdbAIVectorStore(vecdbDep, name)\n },\n\n getVectorBackend(): AIVectorBackend | undefined {\n const connection = vecdbDep.rawConnection\n return connection ? { ...connection } : undefined\n },\n\n createKnowledgeStore(): KnowledgeStore {\n const documents = new ReldbAIRelStore<KnowledgeDocumentManifest>(sql, 'hai_ai_knowledge_documents', jsonOps, dbType, { hasObjectId: true, hasSessionId: true })\n const collections = new ReldbAIRelStore<KnowledgeCollectionManifest>(sql, 'hai_ai_knowledge_collections', jsonOps, dbType)\n return createDbKnowledgeStore({\n documents,\n collections,\n vecdb: vecdbDep,\n prepare: async () => {\n await documents.createTable()\n await collections.createTable()\n },\n })\n },\n\n async initialize(): Promise<void> {\n if (relStores.size > 0) {\n // 同表串行、独立表并行;失败后仍等待所有在途 DDL,避免关闭连接时操作尚未结束。\n const results = await Promise.allSettled([...relStores.values()].map(async (stores) => {\n for (const store of stores)\n await store.createTable()\n }))\n for (const result of results) {\n if (result.status === 'rejected')\n throw result.reason\n }\n logger.debug('DB store provider initialized', { tableCount: relStores.size })\n }\n },\n\n async close(): Promise<void> {\n relStores.clear()\n },\n }\n}\n\n// ─── Singleton 便捷工厂 ───\n\n/**\n * 检查 reldb + vecdb 是否已初始化\n *\n * 由 ai-main.ts 在创建默认 DB Provider 前调用。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * if (!isDbStoreAvailable()) {\n * const missing = getUnavailableDbDeps()\n * throw new Error('Missing AI dependencies: ' + missing.join(', '))\n * }\n * ```\n */\nexport function isDbStoreAvailable(): boolean {\n return reldb.isInitialized && vecdb.isInitialized\n}\n\n/**\n * 获取未初始化的依赖名称列表\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const missing = getUnavailableDbDeps()\n * if (missing.length > 0) throw new Error('Initialize first: ' + missing.join(', '))\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 * 调用方先检查依赖就绪;生产共享能力由实际数据库和向量后端决定,不由配置标签推断。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * if (!isDbStoreAvailable()) throw new Error('Initialize reldb and vecdb first')\n * const provider = createDbStoreProviderFromModules()\n * provider.createRelStore<{ content: string }>('hai_ai_notes')\n * await provider.initialize()\n * await provider.close?.()\n * ```\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 — 进程内临时 Store Provider\n *\n * 为 LLM-only、工具和本地原型提供零外部依赖的默认体验。数据只存在于当前进程,\n * 不提供 KnowledgeStore,也不应作为多实例或需要持久化的生产存储使用。\n * @module ai-store-provider-memory\n */\n\nimport type {\n AIRelStore,\n AIStoreProvider,\n AIVectorStore,\n StoreFilter,\n StoreScope,\n WhereOperator,\n} from '../ai-store-types.js'\n\n/**\n * 进程内关系记录及每次写入更换的版本;仅供显式开发/测试 Store 使用。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const stored: StoredValue = { version: 'version-1', data: { count: 1 }, scope: { objectId: 'user-1' } }\n * const snapshot = structuredClone(stored.data)\n * ```\n */\ninterface StoredValue {\n version: string\n data: unknown\n scope?: StoreScope\n}\n\n/**\n * 进程内向量及附属检索元数据,不提供跨节点持久化。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const entry: StoredVector = { vector: [1, 0], metadata: { content: '指南' } }\n * const dimension = entry.vector.length\n * ```\n */\ninterface StoredVector {\n vector: number[]\n metadata?: Record<string, unknown>\n}\n\nfunction isWhereOperator(value: unknown): value is WhereOperator<unknown> {\n return typeof value === 'object'\n && value !== null\n && ['$in', '$gte', '$gt', '$lte', '$lt'].some(key => key in value)\n}\n\nfunction compare(left: unknown, right: unknown): number {\n if (typeof left === 'number' && typeof right === 'number')\n return left - right\n return String(left ?? '').localeCompare(String(right ?? ''))\n}\n\nfunction matchesOperator(value: unknown, operator: WhereOperator<unknown>): boolean {\n if (operator.$in && !operator.$in.some(candidate => Object.is(candidate, value)))\n return false\n if (operator.$gte !== undefined && compare(value, operator.$gte) < 0)\n return false\n if (operator.$gt !== undefined && compare(value, operator.$gt) <= 0)\n return false\n if (operator.$lte !== undefined && compare(value, operator.$lte) > 0)\n return false\n if (operator.$lt !== undefined && compare(value, operator.$lt) >= 0)\n return false\n return true\n}\n\nfunction matchesRecord<T>(record: StoredValue, filter: StoreFilter<T>): boolean {\n if (filter.objectId !== undefined && record.scope?.objectId !== filter.objectId)\n return false\n if (filter.sessionId !== undefined && record.scope?.sessionId !== filter.sessionId)\n return false\n if (filter.refId !== undefined && record.scope?.refId !== filter.refId)\n return false\n if (filter.status !== undefined) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status]\n if (!record.scope?.status || !statuses.includes(record.scope.status))\n return false\n }\n\n const data = record.data as Record<string, unknown>\n if (filter.where) {\n for (const [key, expected] of Object.entries(filter.where)) {\n const actual = data[key]\n if (isWhereOperator(expected)) {\n if (!matchesOperator(actual, expected))\n return false\n }\n else if (!Object.is(actual, expected)) {\n return false\n }\n }\n }\n\n if (filter.scope) {\n const dataScope = data.scope\n if (typeof dataScope !== 'object' || dataScope === null)\n return false\n for (const [key, expected] of Object.entries(filter.scope)) {\n if (!Object.is((dataScope as Record<string, unknown>)[key], expected))\n return false\n }\n }\n\n return true\n}\n\nfunction createRelStore<T>(records: Map<string, StoredValue>): AIRelStore<T> {\n function select(filter: StoreFilter<T>): T[] {\n let values = Array.from(records.values())\n .filter(record => matchesRecord(record, filter))\n .map(record => structuredClone(record.data) as T)\n\n if (filter.orderBy) {\n const { field, direction } = filter.orderBy\n const multiplier = direction === 'asc' ? 1 : -1\n values = values.sort((left, right) => compare(left[field], right[field]) * multiplier)\n }\n if (filter.limit !== undefined)\n values = values.slice(0, Math.max(0, filter.limit))\n return values\n }\n\n return {\n async currentTime() {\n return Date.now()\n },\n async readVersioned(id) {\n const record = records.get(id)\n return record ? { version: record.version, data: structuredClone(record.data) as T } : undefined\n },\n async compareAndSwap(id, input) {\n if (input.notAfter !== undefined && !Number.isSafeInteger(input.notAfter))\n throw new RangeError('Invalid Store write deadline')\n const record = records.get(id)\n if (record?.version !== input.expectedVersion || (input.notAfter !== undefined && Date.now() >= input.notAfter))\n return undefined\n const version = crypto.randomUUID()\n records.set(id, { version, data: structuredClone(input.data), scope: structuredClone(input.scope ?? record?.scope) })\n return version\n },\n async save(id, data, scope) {\n records.set(id, { version: crypto.randomUUID(), data: structuredClone(data), scope: structuredClone(scope) })\n },\n async saveMany(items) {\n for (const item of items)\n records.set(item.id, { version: crypto.randomUUID(), data: structuredClone(item.data), scope: structuredClone(item.scope) })\n },\n async get(id) {\n return structuredClone(records.get(id)?.data) as T | undefined\n },\n async query(filter) {\n return select(filter)\n },\n async queryPage(filter, page) {\n const values = select({ ...filter, limit: undefined })\n return {\n items: values.slice(page.offset, page.offset + page.limit),\n total: values.length,\n }\n },\n async remove(id) {\n return records.delete(id)\n },\n async removeBy(filter) {\n const ids = Array.from(records.entries())\n .filter(([, record]) => matchesRecord(record, filter))\n .map(([id]) => id)\n for (const id of ids)\n records.delete(id)\n return ids.length\n },\n async count(filter = {}) {\n return select({ ...filter, limit: undefined }).length\n },\n async clear(filter) {\n if (!filter) {\n records.clear()\n return\n }\n const ids = Array.from(records.entries())\n .filter(([, record]) => matchesRecord(record, filter))\n .map(([id]) => id)\n for (const id of ids)\n records.delete(id)\n },\n }\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n if (left.length !== right.length || left.length === 0)\n return 0\n let dot = 0\n let leftNorm = 0\n let rightNorm = 0\n for (let index = 0; index < left.length; index += 1) {\n dot += left[index] * right[index]\n leftNorm += left[index] ** 2\n rightNorm += right[index] ** 2\n }\n if (leftNorm === 0 || rightNorm === 0)\n return 0\n return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm))\n}\n\nfunction createVectorStore(vectors: Map<string, StoredVector>): AIVectorStore {\n return {\n async upsert(id, vector, metadata) {\n vectors.set(id, { vector: [...vector], metadata })\n },\n async search(vector, options = {}) {\n const matches = Array.from(vectors.entries())\n .filter(([, item]) => !options.filter || Object.entries(options.filter).every(\n ([key, expected]) => Object.is(item.metadata?.[key], expected),\n ))\n .map(([id, item]) => ({\n id,\n score: cosineSimilarity(vector, item.vector),\n content: typeof item.metadata?.content === 'string' ? item.metadata.content : undefined,\n metadata: item.metadata,\n }))\n .filter(item => item.score >= (options.minScore ?? 0))\n .sort((left, right) => right.score - left.score)\n return matches.slice(0, options.topK ?? 10)\n },\n async remove(id) {\n vectors.delete(id)\n },\n async clear(filter) {\n if (!filter) {\n vectors.clear()\n return\n }\n for (const [id, item] of vectors) {\n if (Object.entries(filter).every(([key, expected]) => Object.is(item.metadata?.[key], expected)))\n vectors.delete(id)\n }\n },\n }\n}\n\n/**\n * 创建进程内临时 Store Provider;`close()` 会释放全部记录\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const provider = createMemoryStoreProvider() // 显式开发/测试装配。\n * const store = provider.createRelStore<{ count: number }>('counter')\n * await provider.initialize()\n * const version = await store.compareAndSwap('counter-1', { expectedVersion: undefined, data: { count: 1 }, notAfter: await store.currentTime() + 1000 })\n * if (!version) throw new Error('Record already exists or deadline expired')\n * await provider.close?.()\n * ```\n */\nexport function createMemoryStoreProvider(): AIStoreProvider {\n const relStores = new Map<string, Map<string, StoredValue>>()\n const vectorStores = new Map<string, Map<string, StoredVector>>()\n\n return {\n name: 'memory',\n stateScope: 'local',\n createRelStore<T>(name: string): AIRelStore<T> {\n let records = relStores.get(name)\n if (!records) {\n records = new Map()\n relStores.set(name, records)\n }\n return createRelStore<T>(records)\n },\n createVectorStore(name: string): AIVectorStore {\n let vectors = vectorStores.get(name)\n if (!vectors) {\n vectors = new Map()\n vectorStores.set(name, vectors)\n }\n return createVectorStore(vectors)\n },\n initialize: () => Promise.resolve(),\n async close() {\n for (const records of relStores.values())\n records.clear()\n for (const vectors of vectorStores.values())\n vectors.clear()\n relStores.clear()\n vectorStores.clear()\n },\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 { A2ADeps, A2AImplementation } from './a2a/ai-a2a-functions.js'\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 { AudioOperations } from './audio/ai-audio-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 { ImageOperations } from './image/ai-image-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 { PersonaOperations } from './persona/ai-persona-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 process from 'node:process'\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, isDbStoreAvailable } from './store/providers/ai-store-provider-db.js'\nimport { createMemoryStoreProvider } from './store/providers/ai-store-provider-memory.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/** 当前 Persona 操作实例 */\nlet currentPersona: PersonaOperations | 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/** 当前 Audio 操作实例 */\nlet currentAudio: AudioOperations | null = null\n/** 当前 Image 操作实例 */\nlet currentImage: ImageOperations | null = null\n/** A2A 配置(从 config.a2a 存储,供延迟初始化使用) */\nlet currentA2AConfig: AIConfig['a2a']\n/** A2A 内部实现(registerExecutor 成功后才有值) */\nlet currentA2AImpl: A2AImplementation | null = null\n/** 初始化阶段准备完成的任务与消息存储 */\nlet currentA2AStores: A2ADeps | null = null\n/** 当前存储 Provider(用于模块关闭时统一释放资源) */\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 generateObject: () => Promise.resolve(notInitialized.result()),\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/** Persona 未初始化占位 */\nconst notInitializedPersona = notInitialized.proxy<PersonaOperations>()\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/**\n * Audio 未初始化占位\n *\n * transcribe / synthesize 返回 NOT_INITIALIZED HaiResult;\n * 流式方法是 async generator,无法返回 HaiResult,只能在迭代时抛出异常。\n */\nconst notInitializedAudio: AudioOperations = {\n transcribe: () => Promise.resolve(notInitialized.result()),\n async* transcribeStream() { throw notInitialized.error() },\n synthesize: () => Promise.resolve(notInitialized.result()),\n async* synthesizeStream() { throw notInitialized.error() },\n getCapabilities: () => notInitialized.result(),\n}\n\n/** Image 未初始化占位 */\nconst notInitializedImage: ImageOperations = {\n generate: () => Promise.resolve(notInitialized.result()),\n}\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 getStores: () => currentA2AStores,\n notInitializedResult: () => notInitialized.result(),\n})\n\n// ─── 内部辅助 ───\n\n/** 重置所有子功能引用并释放 StoreProvider(用于 close 和 init 失败清理) */\nasync function resetAllState(): Promise<void> {\n const storeProvider = currentStoreProvider\n await currentA2AImpl?.close()\n\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 currentPersona = null\n currentToken = null\n currentSummary = null\n currentCompress = null\n currentContext = null\n currentRerank = null\n currentFile = null\n currentAudio = null\n currentImage = null\n currentA2AConfig = undefined\n currentA2AImpl = null\n currentA2AStores = null\n currentStoreProvider = null\n currentConfig = null\n\n if (storeProvider?.close) {\n try {\n await storeProvider.close()\n }\n catch (error) {\n logger.error('AI store provider close failed', { error })\n }\n }\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 * import type { AIConfigInput, AIInitOptions } from '@h-ai/ai'\n * async function run(config: AIConfigInput, options: AIInitOptions) {\n * // 默认 Store 所需 reldb/vecdb 已由应用初始化;显式测试 Store 通过 options 注入。\n * const initialized = await ai.init(config, options)\n * if (!initialized.success) return initialized\n * try {\n * const result = await ai.llm.chat({ messages: [{ role: 'user', content: '你好' }] })\n * if (!result.success) return result\n * return result.data.choices[0]?.message.content\n * }\n * finally { await ai.close() }\n * }\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 await 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:外部 Provider > 已初始化的 DB Provider > 进程内临时 Provider。\n // 临时 Provider 让 LLM-only 场景零依赖启动;生产持久化仍应显式初始化 reldb + vecdb。\n let storeProvider: AIStoreProvider\n if (options?.storeProvider) {\n storeProvider = options.storeProvider\n }\n else if (isDbStoreAvailable()) {\n storeProvider = createDbStoreProviderFromModules()\n }\n else {\n storeProvider = createMemoryStoreProvider()\n logger.warn('AI is using the ephemeral in-memory store; initialize reldb and vecdb before ai.init() for persistent data')\n }\n if (core.module.requiresSharedState(process.env) && storeProvider.stateScope !== 'shared')\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_sharedBackendRequired'))\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 currentPersona = subs.persona\n currentToken = subs.token\n currentSummary = subs.summary\n currentCompress = subs.compress\n currentContext = subs.context\n currentFile = subs.file\n currentAudio = subs.audio\n currentImage = subs.image\n\n currentA2AConfig = parsed.a2a\n currentA2AStores = subs.a2aStores\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 await 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 persona(): PersonaOperations { return currentPersona ?? notInitializedPersona },\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 audio(): AudioOperations { return currentAudio ?? notInitializedAudio },\n get image(): ImageOperations { return currentImage ?? notInitializedImage },\n get a2a(): A2AOperations { return a2aLazyOperations },\n get config() { return currentConfig ? core.sanitize.sanitizeSensitiveFields(currentConfig) : null },\n get isInitialized() { return currentConfig !== null },\n\n async close(): Promise<void> {\n if (!currentConfig) {\n logger.info('AI module already closed, skipping')\n return\n }\n\n logger.info('Closing AI module')\n await resetAllState()\n logger.info('AI module closed')\n },\n}\n","/**\n * @h-ai/ai — MCP Server 创建与传输层\n *\n * 基于 `@modelcontextprotocol/sdk` 封装,提供便捷的 MCP 服务器创建。\n * @module ai-mcp-server\n */\n\nimport type { McpServerOptions } from './ai-mcp-types.js'\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n\n// ─── 核心类导出 ───\n\nexport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n\n// ─── 传输层导出 ───\n\n/** SSE 传输层 */\nexport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'\n\n/** Stdio 传输层 */\nexport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\n\n/** Streamable HTTP 传输层(推荐) */\nexport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\n\n// ─── 便捷工厂 ───\n\n/**\n * 创建 MCP 服务器\n *\n * @param options - 服务器选项(名称、版本)\n * @returns McpServer 实例\n *\n * @example\n * ```ts\n * import { createMcpServer, StdioServerTransport } from '@h-ai/ai'\n *\n * const server = createMcpServer({ name: 'my-server', version: '1.0.0' })\n * // 注册工具 / 资源 ...\n * const transport = new StdioServerTransport()\n * await server.connect(transport)\n * ```\n */\nexport function createMcpServer(options: McpServerOptions): McpServer {\n return new McpServer(\n { name: options.name, version: options.version ?? '1.0.0' },\n )\n}\n"]}