@h-ai/ai 0.1.0-alpha5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +1886 -0
- package/dist/ai-reasoning-types-ZRy23rSK.d.ts +2790 -0
- package/dist/ai-types-7iSHMnGM.d.ts +1095 -0
- package/dist/api/index.d.ts +628 -0
- package/dist/api/index.js +243 -0
- package/dist/api/index.js.map +1 -0
- package/dist/browser.d.ts +9 -0
- package/dist/browser.js +4 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-ABP7RKIP.js +311 -0
- package/dist/chunk-ABP7RKIP.js.map +1 -0
- package/dist/chunk-ZOTQ75VE.js +462 -0
- package/dist/chunk-ZOTQ75VE.js.map +1 -0
- package/dist/client/index.d.ts +266 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +5074 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/ai-a2a-client.ts","../src/client/ai-client.ts"],"names":[],"mappings":"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","file":"chunk-ABP7RKIP.js","sourcesContent":["/**\n * @h-ai/ai — 前端 A2A 客户端\n *\n * 浏览器端 A2A 操作客户端,通过 API 服务调用后端 A2A 能力。\n * @module ai-a2a-client\n */\n\nimport type {\n A2AAgentCardConfig,\n A2ACallResult,\n A2AMessageRecord,\n} from '../a2a/ai-a2a-types.js'\nimport type { StorePage } from '../store/ai-store-types.js'\nimport type { AIApiAdapter } from './ai-client.js'\n\n// ─── A2A 客户端接口 ───\n\n/**\n * A2A 客户端接口\n *\n * 提供浏览器端调用后端 A2A API 的能力。\n */\nexport interface A2AClientOperations {\n /** 获取当前 Agent Card 配置 */\n getAgentCard: () => Promise<A2AAgentCardConfig>\n /** 查询 A2A 消息记录 */\n listMessages: (filter?: { contextId?: string, status?: string, limit?: number, offset?: number }) => Promise<StorePage<A2AMessageRecord>>\n /** 作为客户端调用远端 Agent */\n callRemoteAgent: (remoteUrl: string, message: string, options?: { timeout?: number }) => Promise<A2ACallResult>\n}\n\n// ─── A2A API 路径 ───\n\nconst A2A_PATH = {\n agentCard: '/a2a/agent-card',\n messages: '/a2a/messages',\n callRemote: '/a2a/call',\n} as const\n\n// ─── 工厂函数 ───\n\n/**\n * 创建 A2A 客户端\n *\n * @param api - API 适配器(来自 @h-ai/api-client)\n * @returns A2A 客户端操作实例\n */\nexport function createA2AClient(api: AIApiAdapter): A2AClientOperations {\n return {\n async getAgentCard(): Promise<A2AAgentCardConfig> {\n const result = await api.post<A2AAgentCardConfig>(A2A_PATH.agentCard)\n if (!result.success) {\n throw new Error(`A2A get agent card failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async listMessages(filter?: { contextId?: string, status?: string, limit?: number, offset?: number }): Promise<StorePage<A2AMessageRecord>> {\n const result = await api.post<StorePage<A2AMessageRecord>>(A2A_PATH.messages, filter ?? {})\n if (!result.success) {\n throw new Error(`A2A list messages failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async callRemoteAgent(remoteUrl: string, message: string, options?: { timeout?: number }): Promise<A2ACallResult> {\n const result = await api.post<A2ACallResult>(A2A_PATH.callRemote, {\n remoteUrl,\n message,\n ...options,\n })\n if (!result.success) {\n throw new Error(`A2A remote call failed: ${result.error.message}`)\n }\n return result.data\n },\n }\n}\n","/**\n * @h-ai/ai — 前端 AI 客户端\n *\n * 基于 @h-ai/api-client 的 AI 领域客户端。\n * 通过 `createAIClient()` 工厂函数创建,消除自建 HTTP 层,\n * 复用 api-client 提供的 Token 管理、超时、拦截器等基础能力。\n * @module ai-client\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { KnowledgeAskResult, KnowledgeDocumentInfo, KnowledgeIngestResult, KnowledgeRetrieveResult } from '../knowledge/ai-knowledge-types.js'\nimport type {\n ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatMessage,\n ChatRecord,\n} from '../llm/ai-llm-types.js'\nimport type { MemoryEntry, MemoryEntryInput, MemoryUpdateInput } from '../memory/ai-memory-types.js'\nimport type { RagResult } from '../rag/ai-rag-types.js'\nimport type { ReasoningResult } from '../reasoning/ai-reasoning-types.js'\nimport type { SessionInfo, StorePage } from '../store/ai-store-types.js'\n\n// ─── API 适配器接口 ───\n\n/**\n * AI 客户端所需的 API 调用能力\n *\n * 结构兼容 `@h-ai/api-client` 的 `api` 单例(鸭子类型)。\n * 传入 `api` 单例即可,无需额外适配。\n */\nexport interface AIApiAdapter {\n /** POST 请求(返回 HaiResult) */\n post: <T>(path: string, body?: unknown) => Promise<HaiResult<T>>\n /** 流式请求(返回 SSE data 行的 AsyncIterable) */\n stream: (path: string, body?: unknown) => AsyncIterable<string>\n}\n\n// ─── 客户端配置 ───\n\n/**\n * AI 客户端配置\n *\n * @example\n * ```ts\n * import { api } from '@h-ai/api-client'\n * import { createAIClient } from '@h-ai/ai/client'\n *\n * await api.init({ baseUrl: '/api', auth: { ... } })\n * const aiClient = createAIClient({ api })\n * ```\n */\nexport interface AIClientConfig {\n /**\n * API 调用适配器\n *\n * 传入 `api` 单例(初始化后)。\n * baseUrl、Token 管理、超时等通过 api-client 配置。\n */\n api: AIApiAdapter\n}\n\n/** 流式响应进度(`onProgress` 回调参数) */\nexport interface StreamProgress {\n /** 当前累积的文本内容 */\n content: string\n /** 是否已完成 */\n done: boolean\n /** 完成原因(仅 `done=true` 时有值,如 `'stop'`) */\n finishReason?: string\n}\n\n/** 流式响应选项 */\nexport interface StreamOptions {\n /** 进度回调(每次收到 chunk 时触发) */\n onProgress?: (progress: StreamProgress) => void\n}\n\n// ─── 客户端接口 ───\n\n/**\n * AI 客户端接口\n *\n * 提供浏览器端调用 AI API 的能力,HTTP 基础设施委托给 @h-ai/api-client。\n */\nexport interface AIClient {\n // ─── LLM ───\n /** 发送对话请求(非流式) */\n chat: (request: ChatCompletionRequest) => Promise<ChatCompletionResponse>\n /** 发送流式对话请求,返回异步迭代器 */\n chatStream: (request: ChatCompletionRequest, options?: StreamOptions) => AsyncIterable<ChatCompletionChunk>\n /** 便捷方法:发送纯文本消息并返回回复文本 */\n sendMessage: (message: string, systemPrompt?: string) => Promise<string>\n /** 便捷方法:流式发送纯文本消息并返回完整回复 */\n sendMessageStream: (message: string, options?: StreamOptions, systemPrompt?: string) => Promise<string>\n /** 简单问答(单轮,自动构造 messages) */\n ask: (question: string, options?: { systemPrompt?: string, model?: string }) => Promise<string>\n /** 流式简单问答,返回异步文本流 */\n askStream: (question: string, options?: { systemPrompt?: string, model?: string }) => AsyncIterable<string>\n\n // ─── Knowledge ───\n /** 知识检索(向量 + 实体增强) */\n knowledgeRetrieve: (query: string, options?: { topK?: number, collection?: string }) => Promise<KnowledgeRetrieveResult>\n /** 知识问答(RAG + 信源) */\n knowledgeAsk: (query: string, options?: { model?: string, collection?: string }) => Promise<KnowledgeAskResult>\n /** 导入文档 */\n knowledgeIngest: (input: { documentId: string, content: string, title?: string, collection?: string, metadata?: Record<string, unknown> }) => Promise<KnowledgeIngestResult>\n /** 列出已导入文档 */\n knowledgeListDocuments: (options?: { collection?: string, offset?: number, limit?: number }) => Promise<KnowledgeDocumentInfo[]>\n /** 删除已导入文档 */\n knowledgeRemoveDocument: (documentId: string, options?: { collection?: string }) => Promise<void>\n\n // ─── Memory ───\n /** 检索相关记忆 */\n recallMemories: (query: string, options?: { topK?: number, types?: string[], minImportance?: number, objectId?: string }) => Promise<MemoryEntry[]>\n /** 列出记忆(分页) */\n listMemories: (options?: { types?: string[], objectId?: string, offset?: number, limit?: number }) => Promise<StorePage<MemoryEntry>>\n /** 添加记忆 */\n addMemory: (entry: MemoryEntryInput) => Promise<MemoryEntry>\n /** 更新记忆 */\n updateMemory: (memoryId: string, updates: MemoryUpdateInput) => Promise<MemoryEntry>\n /** 删除记忆 */\n removeMemory: (memoryId: string) => Promise<void>\n\n // ─── Session ───\n /** 列出会话 */\n listSessions: (objectId: string) => Promise<SessionInfo[]>\n /** 重命名会话 */\n renameSession: (sessionId: string, title: string) => Promise<void>\n /** 删除会话 */\n removeSession: (sessionId: string) => Promise<void>\n /** 获取对话历史 */\n chatHistory: (objectId: string, sessionId: string, options?: { limit?: number, order?: 'asc' | 'desc' }) => Promise<ChatRecord[]>\n\n // ─── RAG ───\n /** RAG 查询(检索 + 生成) */\n ragQuery: (query: string, options?: { collection?: string, topK?: number, model?: string }) => Promise<RagResult>\n /** RAG 流式查询,返回 SSE 数据行 */\n ragQueryStream: (query: string, options?: { collection?: string, topK?: number, model?: string }) => AsyncIterable<string>\n\n // ─── Reasoning ───\n /** 推理(多步思考) */\n reasoningRun: (query: string, options?: { model?: string, maxSteps?: number }) => Promise<ReasoningResult>\n /** 推理流式,返回 SSE 数据行 */\n reasoningRunStream: (query: string, options?: { model?: string, maxSteps?: number }) => AsyncIterable<string>\n\n // ─── Token ───\n /** 估算文本的 Token 数 */\n estimateTokens: (text: string) => Promise<{ tokens: number }>\n}\n\n// ─── AI API 路径(与 ai-api-contract 保持一致) ───\n\nconst AI_PATH = {\n // LLM\n chat: '/ai/chat',\n chatStream: '/ai/chat/stream',\n chatHistory: '/ai/chat/history',\n ask: '/ai/ask',\n askStream: '/ai/ask/stream',\n // Knowledge\n knowledgeRetrieve: '/ai/knowledge/retrieve',\n knowledgeAsk: '/ai/knowledge/ask',\n knowledgeIngest: '/ai/knowledge/ingest',\n knowledgeDocuments: '/ai/knowledge/documents',\n knowledgeRemoveDocument: '/ai/knowledge/documents/remove',\n // Memory\n memoryRecall: '/ai/memory/recall',\n memoryList: '/ai/memory/list',\n memoryAdd: '/ai/memory/add',\n memoryUpdate: '/ai/memory/update',\n memoryRemove: '/ai/memory/remove',\n // Session\n sessions: '/ai/sessions',\n sessionRename: '/ai/sessions/rename',\n sessionRemove: '/ai/sessions/remove',\n // RAG\n ragQuery: '/ai/rag/query',\n ragQueryStream: '/ai/rag/query/stream',\n // Reasoning\n reasoningRun: '/ai/reasoning/run',\n reasoningRunStream: '/ai/reasoning/run/stream',\n // Token\n tokenEstimate: '/ai/token/estimate',\n} as const\n\n// ─── 工厂函数 ───\n\n/**\n * 创建 AI 客户端\n *\n * 通过 @h-ai/api-client 的 ApiClient 实例调用后端 AI API。\n * HTTP 层(Token、超时、拦截器)全部复用 api-client,本模块仅负责:\n * - 非流式 / 流式 ChatCompletion 协议适配\n * - SSE 解析与 ChatCompletionChunk 类型化\n * - onProgress 进度回调\n *\n * @param config - 客户端配置\n * @returns AI 客户端实例\n *\n * @example\n * ```ts\n * import { api } from '@h-ai/api-client'\n * import { createAIClient } from '@h-ai/ai/client'\n *\n * await api.init({ baseUrl: '/api' })\n * const client = createAIClient({ api })\n * const reply = await client.sendMessage('你好')\n * ```\n */\nexport function createAIClient(config: AIClientConfig): AIClient {\n const { api } = config\n\n return {\n async chat(req: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n const result = await api.post<ChatCompletionResponse>(AI_PATH.chat, { ...req, stream: false })\n if (!result.success) {\n throw new Error(`AI chat request failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async* chatStream(\n req: ChatCompletionRequest,\n options?: StreamOptions,\n ): AsyncIterable<ChatCompletionChunk> {\n let content = ''\n\n for await (const data of api.stream(AI_PATH.chatStream, { ...req, stream: true })) {\n try {\n const chunk: ChatCompletionChunk = JSON.parse(data)\n const delta = chunk.choices[0]?.delta?.content\n if (delta) {\n content += delta\n }\n const finishReason = chunk.choices[0]?.finish_reason\n if (finishReason) {\n options?.onProgress?.({ content, done: true, finishReason })\n }\n else {\n options?.onProgress?.({ content, done: false })\n }\n yield chunk\n }\n catch {\n // 忽略解析错误的行\n }\n }\n },\n\n async sendMessage(message: string, systemPrompt?: string): Promise<string> {\n const messages: ChatMessage[] = []\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt })\n }\n messages.push({ role: 'user', content: message })\n const response = await this.chat({ messages })\n return response.choices[0]?.message?.content ?? ''\n },\n\n async sendMessageStream(\n message: string,\n options?: StreamOptions,\n systemPrompt?: string,\n ): Promise<string> {\n const messages: ChatMessage[] = []\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt })\n }\n messages.push({ role: 'user', content: message })\n\n let content = ''\n for await (const chunk of this.chatStream({ messages }, options)) {\n const delta = chunk.choices[0]?.delta?.content\n if (delta) {\n content += delta\n }\n }\n return content\n },\n\n async recallMemories(query: string, options?: { topK?: number, types?: string[], minImportance?: number, objectId?: string }): Promise<MemoryEntry[]> {\n const result = await api.post<{ items: MemoryEntry[] }>(AI_PATH.memoryRecall, { query, ...options })\n if (!result.success) {\n throw new Error(`Memory recall failed: ${result.error.message}`)\n }\n return result.data.items\n },\n\n async listMemories(options?: { types?: string[], objectId?: string, offset?: number, limit?: number }): Promise<StorePage<MemoryEntry>> {\n const result = await api.post<StorePage<MemoryEntry>>(AI_PATH.memoryList, options ?? {})\n if (!result.success) {\n throw new Error(`Memory list failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async listSessions(objectId: string): Promise<SessionInfo[]> {\n const result = await api.post<{ items: SessionInfo[] }>(AI_PATH.sessions, { objectId })\n if (!result.success) {\n throw new Error(`Session list failed: ${result.error.message}`)\n }\n return result.data.items\n },\n\n async chatHistory(objectId: string, sessionId: string, options?: { limit?: number, order?: 'asc' | 'desc' }): Promise<ChatRecord[]> {\n const result = await api.post<{ items: ChatRecord[] }>(AI_PATH.chatHistory, { objectId, sessionId, ...options })\n if (!result.success) {\n throw new Error(`Chat history failed: ${result.error.message}`)\n }\n return result.data.items\n },\n\n // ─── LLM ask/askStream ───\n\n async ask(question: string, options?: { systemPrompt?: string, model?: string }): Promise<string> {\n const result = await api.post<{ text: string }>(AI_PATH.ask, { question, ...options })\n if (!result.success) {\n throw new Error(`AI ask failed: ${result.error.message}`)\n }\n return result.data.text\n },\n\n async* askStream(question: string, options?: { systemPrompt?: string, model?: string }): AsyncIterable<string> {\n for await (const data of api.stream(AI_PATH.askStream, { question, ...options })) {\n yield data\n }\n },\n\n // ─── Knowledge ───\n\n async knowledgeRetrieve(query: string, options?: { topK?: number, collection?: string }): Promise<KnowledgeRetrieveResult> {\n const result = await api.post<KnowledgeRetrieveResult>(AI_PATH.knowledgeRetrieve, { query, ...options })\n if (!result.success) {\n throw new Error(`Knowledge retrieve failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async knowledgeAsk(query: string, options?: { model?: string, collection?: string }): Promise<KnowledgeAskResult> {\n const result = await api.post<KnowledgeAskResult>(AI_PATH.knowledgeAsk, { query, ...options })\n if (!result.success) {\n throw new Error(`Knowledge ask failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async knowledgeIngest(input: { documentId: string, content: string, title?: string, collection?: string, metadata?: Record<string, unknown> }): Promise<KnowledgeIngestResult> {\n const result = await api.post<KnowledgeIngestResult>(AI_PATH.knowledgeIngest, input)\n if (!result.success) {\n throw new Error(`Knowledge ingest failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async knowledgeListDocuments(options?: { collection?: string, offset?: number, limit?: number }): Promise<KnowledgeDocumentInfo[]> {\n const result = await api.post<{ items: KnowledgeDocumentInfo[] }>(AI_PATH.knowledgeDocuments, options ?? {})\n if (!result.success) {\n throw new Error(`Knowledge list documents failed: ${result.error.message}`)\n }\n return result.data.items\n },\n\n async knowledgeRemoveDocument(documentId: string, options?: { collection?: string }): Promise<void> {\n const result = await api.post<void>(AI_PATH.knowledgeRemoveDocument, { documentId, ...options })\n if (!result.success) {\n throw new Error(`Knowledge remove document failed: ${result.error.message}`)\n }\n },\n\n // ─── Memory (extended) ───\n\n async addMemory(entry: MemoryEntryInput): Promise<MemoryEntry> {\n const result = await api.post<MemoryEntry>(AI_PATH.memoryAdd, entry)\n if (!result.success) {\n throw new Error(`Memory add failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async updateMemory(memoryId: string, updates: MemoryUpdateInput): Promise<MemoryEntry> {\n const result = await api.post<MemoryEntry>(AI_PATH.memoryUpdate, { memoryId, ...updates })\n if (!result.success) {\n throw new Error(`Memory update failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async removeMemory(memoryId: string): Promise<void> {\n const result = await api.post<void>(AI_PATH.memoryRemove, { memoryId })\n if (!result.success) {\n throw new Error(`Memory remove failed: ${result.error.message}`)\n }\n },\n\n // ─── Session (extended) ───\n\n async renameSession(sessionId: string, title: string): Promise<void> {\n const result = await api.post<void>(AI_PATH.sessionRename, { sessionId, title })\n if (!result.success) {\n throw new Error(`Session rename failed: ${result.error.message}`)\n }\n },\n\n async removeSession(sessionId: string): Promise<void> {\n const result = await api.post<void>(AI_PATH.sessionRemove, { sessionId })\n if (!result.success) {\n throw new Error(`Session remove failed: ${result.error.message}`)\n }\n },\n\n // ─── RAG ───\n\n async ragQuery(query: string, options?: { collection?: string, topK?: number, model?: string }): Promise<RagResult> {\n const result = await api.post<RagResult>(AI_PATH.ragQuery, { query, ...options })\n if (!result.success) {\n throw new Error(`RAG query failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async* ragQueryStream(query: string, options?: { collection?: string, topK?: number, model?: string }): AsyncIterable<string> {\n for await (const data of api.stream(AI_PATH.ragQueryStream, { query, ...options })) {\n yield data\n }\n },\n\n // ─── Reasoning ───\n\n async reasoningRun(query: string, options?: { model?: string, maxSteps?: number }): Promise<ReasoningResult> {\n const result = await api.post<ReasoningResult>(AI_PATH.reasoningRun, { query, ...options })\n if (!result.success) {\n throw new Error(`Reasoning run failed: ${result.error.message}`)\n }\n return result.data\n },\n\n async* reasoningRunStream(query: string, options?: { model?: string, maxSteps?: number }): AsyncIterable<string> {\n for await (const data of api.stream(AI_PATH.reasoningRunStream, { query, ...options })) {\n yield data\n }\n },\n\n // ─── Token ───\n\n async estimateTokens(text: string): Promise<{ tokens: number }> {\n const result = await api.post<{ tokens: number }>(AI_PATH.tokenEstimate, { text })\n if (!result.success) {\n throw new Error(`Token estimate failed: ${result.error.message}`)\n }\n return result.data\n },\n }\n}\n\n// ─── SSE 解析工具 ───\n\n/**\n * 从 fetch Response 中解析 SSE data 字段\n *\n * 自动处理分片缓冲和 `[DONE]` 结束标记。\n *\n * @param response - fetch 响应对象\n * @yields SSE data 字符串(不含 `[DONE]`)\n *\n * @example\n * ```ts\n * const resp = await fetch('/api/chat', { method: 'POST', body })\n * for await (const data of parseSSE(resp)) {\n * const chunk = JSON.parse(data) // ChatCompletionChunk\n * }\n * ```\n */\nexport async function* parseSSE(response: Response): AsyncIterable<string> {\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n if (data !== '[DONE]') {\n yield data\n }\n }\n }\n }\n }\n finally {\n reader.releaseLock()\n }\n}\n\n/**\n * 收集流式响应的完整文本内容\n *\n * 完整消费流并拼接所有 `delta.content` 片段。\n *\n * @param stream - 聊天响应块流\n * @returns 完整文本\n *\n * @example\n * ```ts\n * const client = createAIClient({ api })\n * const stream = client.chatStream({ messages })\n * const fullText = await collectStreamContent(stream)\n * ```\n */\nexport async function collectStreamContent(\n stream: AsyncIterable<ChatCompletionChunk>,\n): Promise<string> {\n let content = ''\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content\n if (delta) {\n content += delta\n }\n }\n return content\n}\n"]}
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import { core, err, ok } from '@h-ai/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import process from 'process';
|
|
4
|
+
import { ChunkOptionsSchema, CleanOptionsSchema } from '@h-ai/datapipe';
|
|
5
|
+
|
|
6
|
+
// src/ai-types.ts
|
|
7
|
+
var AIErrorInfo = {
|
|
8
|
+
// 通用 (000-009)
|
|
9
|
+
INTERNAL_ERROR: "000:500",
|
|
10
|
+
// 初始化 (010-019)
|
|
11
|
+
NOT_INITIALIZED: "010:500",
|
|
12
|
+
CONFIGURATION_ERROR: "011:500",
|
|
13
|
+
INIT_IN_PROGRESS: "012:500",
|
|
14
|
+
RERANK_API_ERROR: "020:502",
|
|
15
|
+
RERANK_INVALID_REQUEST: "021:400",
|
|
16
|
+
// LLM (100-199)
|
|
17
|
+
API_ERROR: "100:502",
|
|
18
|
+
INVALID_REQUEST: "101:400",
|
|
19
|
+
RATE_LIMITED: "102:429",
|
|
20
|
+
TIMEOUT: "103:504",
|
|
21
|
+
MODEL_NOT_FOUND: "104:404",
|
|
22
|
+
CONTEXT_LENGTH_EXCEEDED: "105:400",
|
|
23
|
+
LLM_RECORD_FAILED: "106:500",
|
|
24
|
+
LLM_HISTORY_FAILED: "107:500",
|
|
25
|
+
// MCP (200-299)
|
|
26
|
+
MCP_CONNECTION_ERROR: "200:502",
|
|
27
|
+
MCP_PROTOCOL_ERROR: "201:502",
|
|
28
|
+
MCP_TOOL_ERROR: "202:500",
|
|
29
|
+
MCP_RESOURCE_ERROR: "203:500",
|
|
30
|
+
MCP_SERVER_ERROR: "204:502",
|
|
31
|
+
// Embedding (300-399)
|
|
32
|
+
EMBEDDING_API_ERROR: "300:502",
|
|
33
|
+
EMBEDDING_MODEL_NOT_FOUND: "301:404",
|
|
34
|
+
EMBEDDING_INPUT_TOO_LONG: "302:400",
|
|
35
|
+
// 工具 (400-499)
|
|
36
|
+
TOOL_NOT_FOUND: "400:404",
|
|
37
|
+
TOOL_VALIDATION_FAILED: "401:400",
|
|
38
|
+
TOOL_EXECUTION_FAILED: "402:500",
|
|
39
|
+
TOOL_TIMEOUT: "403:504",
|
|
40
|
+
// Reasoning (500-599)
|
|
41
|
+
REASONING_FAILED: "500:500",
|
|
42
|
+
REASONING_MAX_ROUNDS: "501:400",
|
|
43
|
+
REASONING_STRATEGY_NOT_FOUND: "502:404",
|
|
44
|
+
// Retrieval (600-699)
|
|
45
|
+
RETRIEVAL_FAILED: "600:500",
|
|
46
|
+
RETRIEVAL_SOURCE_NOT_FOUND: "601:404",
|
|
47
|
+
// RAG (700-799)
|
|
48
|
+
RAG_FAILED: "700:500",
|
|
49
|
+
RAG_CONTEXT_BUILD_FAILED: "701:500",
|
|
50
|
+
// Knowledge (800-899)
|
|
51
|
+
KNOWLEDGE_SETUP_FAILED: "800:500",
|
|
52
|
+
KNOWLEDGE_INGEST_FAILED: "801:500",
|
|
53
|
+
KNOWLEDGE_RETRIEVE_FAILED: "802:500",
|
|
54
|
+
KNOWLEDGE_ENTITY_EXTRACT_FAILED: "803:500",
|
|
55
|
+
KNOWLEDGE_NOT_SETUP: "804:500",
|
|
56
|
+
KNOWLEDGE_COLLECTION_NOT_FOUND: "805:404",
|
|
57
|
+
// Memory (900-949)
|
|
58
|
+
MEMORY_EXTRACT_FAILED: "900:500",
|
|
59
|
+
MEMORY_STORE_FAILED: "901:500",
|
|
60
|
+
MEMORY_RECALL_FAILED: "902:500",
|
|
61
|
+
MEMORY_NOT_FOUND: "903:404",
|
|
62
|
+
MEMORY_ENRICH_FAILED: "904:500",
|
|
63
|
+
// File (030-049)
|
|
64
|
+
FILE_PARSE_FAILED: "030:500",
|
|
65
|
+
FILE_UNSUPPORTED_FORMAT: "031:400",
|
|
66
|
+
FILE_OCR_FAILED: "032:500",
|
|
67
|
+
FILE_INVALID_CONTENT: "033:400",
|
|
68
|
+
// Context (950-999)
|
|
69
|
+
CONTEXT_COMPRESS_FAILED: "950:500",
|
|
70
|
+
CONTEXT_SUMMARIZE_FAILED: "951:500",
|
|
71
|
+
CONTEXT_TOKEN_ESTIMATE_FAILED: "952:500",
|
|
72
|
+
CONTEXT_BUDGET_EXCEEDED: "953:400",
|
|
73
|
+
// Store (960-969)
|
|
74
|
+
STORE_FAILED: "960:500",
|
|
75
|
+
STORE_NOT_AVAILABLE: "961:503",
|
|
76
|
+
// Session (970-979)
|
|
77
|
+
SESSION_NOT_FOUND: "970:404",
|
|
78
|
+
SESSION_FAILED: "971:500",
|
|
79
|
+
// A2A (980-999)
|
|
80
|
+
A2A_NOT_CONFIGURED: "980:500",
|
|
81
|
+
A2A_HANDLE_FAILED: "981:500",
|
|
82
|
+
A2A_REMOTE_CALL_FAILED: "982:502",
|
|
83
|
+
A2A_AUTH_FAILED: "983:401",
|
|
84
|
+
A2A_LIST_MESSAGES_FAILED: "984:500"
|
|
85
|
+
};
|
|
86
|
+
var HaiAIError = core.error.buildHaiErrorsDef("ai", AIErrorInfo);
|
|
87
|
+
var CompressionStrategySchema = z.enum(["summary", "sliding-window", "hybrid"]);
|
|
88
|
+
var EntityTypeSchema = z.enum(["person", "project", "concept", "organization", "location", "event", "other"]);
|
|
89
|
+
var MemoryTypeSchema = z.enum(["fact", "preference", "event", "entity", "instruction"]);
|
|
90
|
+
|
|
91
|
+
// messages/en-US.json
|
|
92
|
+
var en_US_default = {
|
|
93
|
+
$schema: "https://inlang.com/schema/inlang-message-format",
|
|
94
|
+
ai_notInitialized: "AI service not initialized. Call ai.init() first.",
|
|
95
|
+
ai_initFailed: "Failed to initialize AI service: {error}",
|
|
96
|
+
ai_initInProgress: "AI service initialization is already in progress.",
|
|
97
|
+
ai_requestTimeout: "Request timeout",
|
|
98
|
+
ai_internalError: "Internal error: {error}",
|
|
99
|
+
ai_mcpToolNotFound: "MCP tool '{name}' not found",
|
|
100
|
+
ai_mcpToolFailed: "MCP tool '{name}' execution failed: {error}",
|
|
101
|
+
ai_mcpResourceNotFound: "MCP resource '{uri}' not found",
|
|
102
|
+
ai_mcpResourceFailed: "MCP resource '{uri}' read failed: {error}",
|
|
103
|
+
ai_mcpPromptNotFound: "MCP prompt '{name}' not found",
|
|
104
|
+
ai_mcpPromptMissingArg: "MCP prompt '{name}' missing required argument '{arg}'",
|
|
105
|
+
ai_mcpPromptFailed: "MCP prompt '{name}' execution failed: {error}",
|
|
106
|
+
ai_toolNotFound: "Tool '{name}' not found",
|
|
107
|
+
ai_toolInvalidJson: "Invalid JSON in tool call arguments",
|
|
108
|
+
ai_configError: "AI config validation failed: {error}",
|
|
109
|
+
ai_llmRecordFailed: "Chat record save failed: {error}",
|
|
110
|
+
ai_llmHistoryFailed: "Chat history query failed: {error}",
|
|
111
|
+
ai_embeddingApiFailed: "Embedding API call failed: {error}",
|
|
112
|
+
ai_embeddingModelNotFound: "Embedding model '{model}' not found",
|
|
113
|
+
ai_embeddingInputTooLong: "Embedding input text exceeds maximum length",
|
|
114
|
+
ai_reasoningFailed: "Reasoning execution failed: {error}",
|
|
115
|
+
ai_reasoningMaxRounds: "Reasoning rounds limit reached ({rounds} rounds)",
|
|
116
|
+
ai_reasoningStrategyNotFound: "Reasoning strategy '{strategy}' not found",
|
|
117
|
+
ai_retrievalFailed: "Retrieval execution failed: {error}",
|
|
118
|
+
ai_retrievalSourceNotFound: "Retrieval source '{source}' not configured",
|
|
119
|
+
ai_ragFailed: "RAG execution failed: {error}",
|
|
120
|
+
ai_ragContextBuildFailed: "RAG context build failed: {error}",
|
|
121
|
+
ai_knowledgeSetupFailed: "Knowledge base setup failed: {error}",
|
|
122
|
+
ai_knowledgeIngestFailed: "Knowledge ingestion failed: {error}",
|
|
123
|
+
ai_knowledgeRetrieveFailed: "Knowledge retrieval failed: {error}",
|
|
124
|
+
ai_knowledgeEntityExtractFailed: "Entity extraction failed: {error}",
|
|
125
|
+
ai_knowledgeNotSetup: "Knowledge base not initialized. Call ai.knowledge.setup() first.",
|
|
126
|
+
ai_knowledgeCollectionNotFound: "Knowledge collection '{collection}' not found",
|
|
127
|
+
ai_memoryExtractFailed: "Memory extraction failed: {error}",
|
|
128
|
+
ai_memoryStoreFailed: "Memory storage failed: {error}",
|
|
129
|
+
ai_memoryRecallFailed: "Memory recall failed: {error}",
|
|
130
|
+
ai_memoryNotFound: "Memory entry '{id}' not found",
|
|
131
|
+
ai_memoryEnrichFailed: "Memory enrichment failed: {error}",
|
|
132
|
+
ai_contextCompressFailed: "Context compression failed: {error}",
|
|
133
|
+
ai_contextSummarizeFailed: "Context summarization failed: {error}",
|
|
134
|
+
ai_contextTokenEstimateFailed: "Token estimation failed: {error}",
|
|
135
|
+
ai_storeFailed: "Store operation failed: {error}",
|
|
136
|
+
ai_storeNotAvailable: "Store backend not available, degraded to memory mode",
|
|
137
|
+
ai_sessionNotFound: "Session '{id}' not found",
|
|
138
|
+
ai_sessionFailed: "Session operation failed: {error}",
|
|
139
|
+
ai_rerankApiFailed: "Rerank API call failed: {error}",
|
|
140
|
+
ai_rerankInvalidRequest: "Invalid rerank request: {reason}",
|
|
141
|
+
ai_fileParseFailed: "File parsing failed: {error}",
|
|
142
|
+
ai_fileUnsupportedFormat: "Unsupported file format: {mimeType}",
|
|
143
|
+
ai_fileOcrFailed: "OCR recognition failed: {error}",
|
|
144
|
+
ai_fileInvalidContent: "Invalid file content: {reason}",
|
|
145
|
+
ai_configMissingApiKey: "API Key is required for scenario '{scenario}'",
|
|
146
|
+
ai_a2aNotConfigured: "A2A service not configured. Provide 'a2a' config in ai.init().",
|
|
147
|
+
ai_a2aHandleFailed: "A2A request handling failed: {error}",
|
|
148
|
+
ai_a2aRemoteCallFailed: "A2A remote call to '{url}' failed: {error}",
|
|
149
|
+
ai_a2aAuthFailed: "A2A authentication failed: {error}",
|
|
150
|
+
ai_a2aListMessagesFailed: "A2A message listing failed: {error}"
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// messages/zh-CN.json
|
|
154
|
+
var zh_CN_default = {
|
|
155
|
+
$schema: "https://inlang.com/schema/inlang-message-format",
|
|
156
|
+
ai_notInitialized: "AI \u670D\u52A1\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 ai.init()",
|
|
157
|
+
ai_initFailed: "AI \u670D\u52A1\u521D\u59CB\u5316\u5931\u8D25\uFF1A{error}",
|
|
158
|
+
ai_initInProgress: "AI \u670D\u52A1\u6B63\u5728\u521D\u59CB\u5316\u4E2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u8C03\u7528\u3002",
|
|
159
|
+
ai_requestTimeout: "\u8BF7\u6C42\u8D85\u65F6",
|
|
160
|
+
ai_internalError: "\u5185\u90E8\u9519\u8BEF\uFF1A{error}",
|
|
161
|
+
ai_mcpToolNotFound: "MCP \u5DE5\u5177 '{name}' \u672A\u627E\u5230",
|
|
162
|
+
ai_mcpToolFailed: "MCP \u5DE5\u5177 '{name}' \u6267\u884C\u5931\u8D25\uFF1A{error}",
|
|
163
|
+
ai_mcpResourceNotFound: "MCP \u8D44\u6E90 '{uri}' \u672A\u627E\u5230",
|
|
164
|
+
ai_mcpResourceFailed: "MCP \u8D44\u6E90 '{uri}' \u8BFB\u53D6\u5931\u8D25\uFF1A{error}",
|
|
165
|
+
ai_mcpPromptNotFound: "MCP \u63D0\u793A\u8BCD '{name}' \u672A\u627E\u5230",
|
|
166
|
+
ai_mcpPromptMissingArg: "MCP \u63D0\u793A\u8BCD '{name}' \u7F3A\u5C11\u5FC5\u9700\u53C2\u6570 '{arg}'",
|
|
167
|
+
ai_mcpPromptFailed: "MCP \u63D0\u793A\u8BCD '{name}' \u6267\u884C\u5931\u8D25\uFF1A{error}",
|
|
168
|
+
ai_toolNotFound: "\u5DE5\u5177 '{name}' \u672A\u627E\u5230",
|
|
169
|
+
ai_toolInvalidJson: "\u5DE5\u5177\u8C03\u7528\u53C2\u6570 JSON \u683C\u5F0F\u65E0\u6548",
|
|
170
|
+
ai_configError: "AI \u914D\u7F6E\u6821\u9A8C\u5931\u8D25\uFF1A{error}",
|
|
171
|
+
ai_llmRecordFailed: "\u5BF9\u8BDD\u8BB0\u5F55\u4FDD\u5B58\u5931\u8D25\uFF1A{error}",
|
|
172
|
+
ai_llmHistoryFailed: "\u5BF9\u8BDD\u5386\u53F2\u67E5\u8BE2\u5931\u8D25\uFF1A{error}",
|
|
173
|
+
ai_embeddingApiFailed: "Embedding API \u8C03\u7528\u5931\u8D25\uFF1A{error}",
|
|
174
|
+
ai_embeddingModelNotFound: "Embedding \u6A21\u578B '{model}' \u672A\u627E\u5230",
|
|
175
|
+
ai_embeddingInputTooLong: "Embedding \u8F93\u5165\u6587\u672C\u8D85\u8FC7\u6700\u5927\u957F\u5EA6\u9650\u5236",
|
|
176
|
+
ai_reasoningFailed: "\u63A8\u7406\u6267\u884C\u5931\u8D25\uFF1A{error}",
|
|
177
|
+
ai_reasoningMaxRounds: "\u63A8\u7406\u8F6E\u6B21\u5DF2\u8FBE\u4E0A\u9650\uFF08{rounds} \u8F6E\uFF09",
|
|
178
|
+
ai_reasoningStrategyNotFound: "\u63A8\u7406\u7B56\u7565 '{strategy}' \u4E0D\u5B58\u5728",
|
|
179
|
+
ai_retrievalFailed: "\u68C0\u7D22\u6267\u884C\u5931\u8D25\uFF1A{error}",
|
|
180
|
+
ai_retrievalSourceNotFound: "\u68C0\u7D22\u6E90 '{source}' \u672A\u914D\u7F6E",
|
|
181
|
+
ai_ragFailed: "RAG \u6267\u884C\u5931\u8D25\uFF1A{error}",
|
|
182
|
+
ai_ragContextBuildFailed: "RAG \u4E0A\u4E0B\u6587\u6784\u5EFA\u5931\u8D25\uFF1A{error}",
|
|
183
|
+
ai_knowledgeSetupFailed: "\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\u5931\u8D25\uFF1A{error}",
|
|
184
|
+
ai_knowledgeIngestFailed: "\u77E5\u8BC6\u5165\u5E93\u5931\u8D25\uFF1A{error}",
|
|
185
|
+
ai_knowledgeRetrieveFailed: "\u77E5\u8BC6\u68C0\u7D22\u5931\u8D25\uFF1A{error}",
|
|
186
|
+
ai_knowledgeEntityExtractFailed: "\u5B9E\u4F53\u63D0\u53D6\u5931\u8D25\uFF1A{error}",
|
|
187
|
+
ai_knowledgeNotSetup: "\u77E5\u8BC6\u5E93\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 ai.knowledge.setup()",
|
|
188
|
+
ai_knowledgeCollectionNotFound: "\u77E5\u8BC6\u96C6\u5408 '{collection}' \u4E0D\u5B58\u5728",
|
|
189
|
+
ai_memoryExtractFailed: "\u8BB0\u5FC6\u63D0\u53D6\u5931\u8D25\uFF1A{error}",
|
|
190
|
+
ai_memoryStoreFailed: "\u8BB0\u5FC6\u5B58\u50A8\u5931\u8D25\uFF1A{error}",
|
|
191
|
+
ai_memoryRecallFailed: "\u8BB0\u5FC6\u53EC\u56DE\u5931\u8D25\uFF1A{error}",
|
|
192
|
+
ai_memoryNotFound: "\u8BB0\u5FC6\u6761\u76EE '{id}' \u4E0D\u5B58\u5728",
|
|
193
|
+
ai_memoryEnrichFailed: "\u8BB0\u5FC6\u6CE8\u5165\u5931\u8D25\uFF1A{error}",
|
|
194
|
+
ai_contextCompressFailed: "\u4E0A\u4E0B\u6587\u538B\u7F29\u5931\u8D25\uFF1A{error}",
|
|
195
|
+
ai_contextSummarizeFailed: "\u4E0A\u4E0B\u6587\u603B\u7ED3\u5931\u8D25\uFF1A{error}",
|
|
196
|
+
ai_contextTokenEstimateFailed: "Token \u4F30\u7B97\u5931\u8D25\uFF1A{error}",
|
|
197
|
+
ai_storeFailed: "\u5B58\u50A8\u64CD\u4F5C\u5931\u8D25\uFF1A{error}",
|
|
198
|
+
ai_storeNotAvailable: "\u5B58\u50A8\u540E\u7AEF\u4E0D\u53EF\u7528\uFF0C\u5DF2\u964D\u7EA7\u4E3A\u5185\u5B58\u6A21\u5F0F",
|
|
199
|
+
ai_sessionNotFound: "\u4F1A\u8BDD '{id}' \u4E0D\u5B58\u5728",
|
|
200
|
+
ai_sessionFailed: "\u4F1A\u8BDD\u64CD\u4F5C\u5931\u8D25\uFF1A{error}",
|
|
201
|
+
ai_rerankApiFailed: "Rerank API \u8C03\u7528\u5931\u8D25\uFF1A{error}",
|
|
202
|
+
ai_rerankInvalidRequest: "Rerank \u8BF7\u6C42\u53C2\u6570\u65E0\u6548\uFF1A{reason}",
|
|
203
|
+
ai_fileParseFailed: "\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF1A{error}",
|
|
204
|
+
ai_fileUnsupportedFormat: "\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u683C\u5F0F\uFF1A{mimeType}",
|
|
205
|
+
ai_fileOcrFailed: "OCR \u8BC6\u522B\u5931\u8D25\uFF1A{error}",
|
|
206
|
+
ai_fileInvalidContent: "\u6587\u4EF6\u5185\u5BB9\u65E0\u6548\uFF1A{reason}",
|
|
207
|
+
ai_configMissingApiKey: "\u573A\u666F '{scenario}' \u9700\u8981\u63D0\u4F9B API Key",
|
|
208
|
+
ai_a2aNotConfigured: "A2A \u670D\u52A1\u672A\u914D\u7F6E\uFF0C\u8BF7\u5728 ai.init() \u4E2D\u63D0\u4F9B 'a2a' \u914D\u7F6E\u3002",
|
|
209
|
+
ai_a2aHandleFailed: "A2A \u8BF7\u6C42\u5904\u7406\u5931\u8D25\uFF1A{error}",
|
|
210
|
+
ai_a2aRemoteCallFailed: "A2A \u8FDC\u7AEF\u8C03\u7528 '{url}' \u5931\u8D25\uFF1A{error}",
|
|
211
|
+
ai_a2aAuthFailed: "A2A \u8BA4\u8BC1\u5931\u8D25\uFF1A{error}",
|
|
212
|
+
ai_a2aListMessagesFailed: "A2A \u6D88\u606F\u67E5\u8BE2\u5931\u8D25\uFF1A{error}"
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
// src/ai-i18n.ts
|
|
216
|
+
var aiM = core.i18n.createMessageGetter({
|
|
217
|
+
"zh-CN": zh_CN_default,
|
|
218
|
+
"en-US": en_US_default
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// src/ai-config.ts
|
|
222
|
+
var ModelScenarioSchema = z.enum(["default", "chat", "reasoning", "plan", "execute", "extraction", "summary", "embedding", "rerank", "ocr", "fast"]);
|
|
223
|
+
var ModelEntrySchema = z.object({
|
|
224
|
+
/** 模型唯一标识(用于 ModelResolver 解析) */
|
|
225
|
+
id: z.string(),
|
|
226
|
+
/** 模型名称(传给 API 的实际模型名) */
|
|
227
|
+
model: z.string(),
|
|
228
|
+
/** API Key 覆盖(可选,未提供时使用全局配置) */
|
|
229
|
+
apiKey: z.string().optional(),
|
|
230
|
+
/** Base URL 覆盖(可选) */
|
|
231
|
+
baseUrl: z.url().optional(),
|
|
232
|
+
/** 最大 Token 数覆盖(可选) */
|
|
233
|
+
maxTokens: z.number().positive().optional(),
|
|
234
|
+
/** 温度覆盖(可选) */
|
|
235
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
236
|
+
/** 超时覆盖(可选,毫秒) */
|
|
237
|
+
timeout: z.number().positive().optional()
|
|
238
|
+
});
|
|
239
|
+
var LLMConfigSchema = z.object({
|
|
240
|
+
/** 全局 API Key(各模型 fallback;未提供时回退到 `process.env.HAI_AI_LLM_API_KEY` 或 `process.env.OPENAI_API_KEY`) */
|
|
241
|
+
apiKey: z.string().optional(),
|
|
242
|
+
/** 全局 API 基础 URL(各模型 fallback;未提供时回退到 `process.env.HAI_AI_LLM_BASE_URL` 或 `process.env.OPENAI_BASE_URL`) */
|
|
243
|
+
baseUrl: z.url().optional(),
|
|
244
|
+
/** 默认模型名称(默认 `'gpt-4o-mini'`) */
|
|
245
|
+
model: z.string().optional().default("gpt-4o-mini"),
|
|
246
|
+
/** 全局最大 Token 数(各模型 fallback,默认 `4096`) */
|
|
247
|
+
maxTokens: z.number().positive().optional().default(4096),
|
|
248
|
+
/** 全局采样温度(各模型 fallback,范围 `[0, 2]`,默认 `0.7`) */
|
|
249
|
+
temperature: z.number().min(0).max(2).optional().default(0.7),
|
|
250
|
+
/** 全局请求超时时间(各模型 fallback,毫秒,默认 `60000`) */
|
|
251
|
+
timeout: z.number().positive().optional().default(6e4),
|
|
252
|
+
/** 多模型配置列表(各字段可选,未指定时回退到全局默认值) */
|
|
253
|
+
models: z.array(ModelEntrySchema).optional(),
|
|
254
|
+
/** 场景模型映射(场景名 → 模型 ID 或直接模型名称,各场景均可选) */
|
|
255
|
+
scenarios: z.object(Object.fromEntries(ModelScenarioSchema.options.map((k) => [k, z.string().optional()]))).optional()
|
|
256
|
+
});
|
|
257
|
+
function resolveModelEntry(llmConfig, scenario, explicit, options) {
|
|
258
|
+
let entry;
|
|
259
|
+
let modelName;
|
|
260
|
+
if (explicit) {
|
|
261
|
+
entry = llmConfig.models?.find((m) => m.id === explicit || m.model === explicit);
|
|
262
|
+
modelName = entry?.model ?? explicit;
|
|
263
|
+
} else {
|
|
264
|
+
const modelId = llmConfig.scenarios?.[scenario] ?? llmConfig.scenarios?.default;
|
|
265
|
+
if (modelId) {
|
|
266
|
+
entry = llmConfig.models?.find((m) => m.id === modelId);
|
|
267
|
+
modelName = entry?.model ?? modelId;
|
|
268
|
+
} else {
|
|
269
|
+
modelName = llmConfig.model ?? "gpt-4o-mini";
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const resolved = {
|
|
273
|
+
model: modelName,
|
|
274
|
+
apiKey: entry?.apiKey ?? llmConfig.apiKey ?? process.env.HAI_AI_LLM_API_KEY ?? process.env.OPENAI_API_KEY,
|
|
275
|
+
baseUrl: entry?.baseUrl ?? llmConfig.baseUrl ?? process.env.HAI_AI_LLM_BASE_URL ?? process.env.OPENAI_BASE_URL ?? "https://api.openai.com/v1",
|
|
276
|
+
maxTokens: entry?.maxTokens ?? llmConfig.maxTokens ?? 4096,
|
|
277
|
+
temperature: entry?.temperature ?? llmConfig.temperature ?? 0.7,
|
|
278
|
+
timeout: entry?.timeout ?? llmConfig.timeout ?? 6e4
|
|
279
|
+
};
|
|
280
|
+
if (!resolved.apiKey) {
|
|
281
|
+
return err(HaiAIError.CONFIGURATION_ERROR, options?.missingApiKeyMessage ?? aiM("ai_configMissingApiKey", { params: { scenario } }));
|
|
282
|
+
}
|
|
283
|
+
return ok(resolved);
|
|
284
|
+
}
|
|
285
|
+
var MCPServerCapabilitiesSchema = z.object({
|
|
286
|
+
/** 是否支持工具调用(默认 `true`) */
|
|
287
|
+
tools: z.boolean().optional().default(true),
|
|
288
|
+
/** 是否支持资源访问(默认 `true`) */
|
|
289
|
+
resources: z.boolean().optional().default(true),
|
|
290
|
+
/** 是否支持提示词模板(默认 `true`) */
|
|
291
|
+
prompts: z.boolean().optional().default(true)
|
|
292
|
+
});
|
|
293
|
+
var MCPServerConfigSchema = z.object({
|
|
294
|
+
/** 服务器名称 */
|
|
295
|
+
name: z.string(),
|
|
296
|
+
/** 服务器版本(默认 `'1.0.0'`) */
|
|
297
|
+
version: z.string().optional().default("1.0.0"),
|
|
298
|
+
/** 服务器能力声明 */
|
|
299
|
+
capabilities: MCPServerCapabilitiesSchema.optional()
|
|
300
|
+
});
|
|
301
|
+
var MCPConfigSchema = z.object({
|
|
302
|
+
/** 服务器配置 */
|
|
303
|
+
server: MCPServerConfigSchema.optional()
|
|
304
|
+
});
|
|
305
|
+
var EmbeddingConfigSchema = z.object({
|
|
306
|
+
/** 向量维度(可选,部分模型支持指定维度) */
|
|
307
|
+
dimensions: z.number().int().positive().optional(),
|
|
308
|
+
/** 批量大小(单次请求最多处理的文本数,默认 100) */
|
|
309
|
+
batchSize: z.number().int().positive().default(100)
|
|
310
|
+
});
|
|
311
|
+
var KnowledgeConfigSchema = z.object({
|
|
312
|
+
/** 默认向量集合名(默认 'hai_ai_knowledge') */
|
|
313
|
+
collection: z.string().default("hai_ai_knowledge"),
|
|
314
|
+
/** 向量维度(默认 1536,需与 embedding 模型匹配) */
|
|
315
|
+
dimension: z.number().int().positive().default(1536),
|
|
316
|
+
/** 是否启用实体提取(默认 true) */
|
|
317
|
+
enableEntityExtraction: z.boolean().default(true),
|
|
318
|
+
/**
|
|
319
|
+
* 默认文本清洗选项
|
|
320
|
+
*
|
|
321
|
+
* 字段含义与 @h-ai/datapipe CleanOptionsInput 完全一致,
|
|
322
|
+
* 支持 removeHtml、removeUrls、normalizeWhitespace、customReplacements 等。
|
|
323
|
+
*/
|
|
324
|
+
cleanOptions: CleanOptionsSchema.default(CleanOptionsSchema.parse({})),
|
|
325
|
+
/**
|
|
326
|
+
* 默认分块选项
|
|
327
|
+
*
|
|
328
|
+
* 字段含义与 @h-ai/datapipe ChunkOptionsInput 完全一致,
|
|
329
|
+
* 支持 mode、maxSize、overlap、separator、markdownMinLevel 等完整选项。
|
|
330
|
+
*/
|
|
331
|
+
chunkOptions: ChunkOptionsSchema.default(ChunkOptionsSchema.parse({
|
|
332
|
+
mode: "markdown",
|
|
333
|
+
maxSize: 1500,
|
|
334
|
+
overlap: 200
|
|
335
|
+
})),
|
|
336
|
+
/** 实体查询命中的额外加权系数(默认 0.15,叠加到向量分数上) */
|
|
337
|
+
entityBoostWeight: z.number().min(0).max(1).default(0.15),
|
|
338
|
+
/** 自定义实体类型列表(不指定时使用内置默认类型) */
|
|
339
|
+
entityTypes: z.array(z.string()).optional(),
|
|
340
|
+
/** 自定义实体提取系统提示词(不指定时使用内置默认提示词) */
|
|
341
|
+
systemPrompt: z.string().optional()
|
|
342
|
+
});
|
|
343
|
+
var MemoryConfigSchema = z.object({
|
|
344
|
+
/** 最大记忆条数(默认 1000) */
|
|
345
|
+
maxEntries: z.number().int().positive().default(1e3),
|
|
346
|
+
/** 自定义记忆提取 systemPrompt(可选,覆盖内置默认提示词) */
|
|
347
|
+
systemPrompt: z.string().optional(),
|
|
348
|
+
/** 时间衰减系数(默认 0.95,每次检索乘以此系数调整 recency 权重) */
|
|
349
|
+
recencyDecay: z.number().min(0).max(1).default(0.95),
|
|
350
|
+
/** 是否启用向量检索(默认 true,关闭则仅使用关键词匹配) */
|
|
351
|
+
embeddingEnabled: z.boolean().default(true),
|
|
352
|
+
/** 检索时默认返回数量(默认 10) */
|
|
353
|
+
defaultTopK: z.number().int().positive().default(10)
|
|
354
|
+
});
|
|
355
|
+
var TokenConfigSchema = z.object({
|
|
356
|
+
/** Token 估算每字符系数(默认 0.25,即 4 字符 ≈ 1 token) */
|
|
357
|
+
tokenRatio: z.number().positive().default(0.25)
|
|
358
|
+
});
|
|
359
|
+
var SummaryConfigSchema = z.object({
|
|
360
|
+
/** 自定义摘要 systemPrompt(可选,覆盖内置默认提示词) */
|
|
361
|
+
systemPrompt: z.string().optional()
|
|
362
|
+
});
|
|
363
|
+
var CompressConfigSchema = z.object({
|
|
364
|
+
/** 默认压缩策略(默认 'hybrid') */
|
|
365
|
+
defaultStrategy: CompressionStrategySchema.default("hybrid"),
|
|
366
|
+
/** 默认 Token 预算(默认 0 表示取模型上限的 80%) */
|
|
367
|
+
defaultMaxTokens: z.number().int().min(0).default(0),
|
|
368
|
+
/** 默认保留最近消息数(默认 4) */
|
|
369
|
+
preserveLastN: z.number().int().min(0).default(4)
|
|
370
|
+
});
|
|
371
|
+
var FileConfigSchema = z.object({
|
|
372
|
+
/** OCR 系统提示词(可选,覆盖内置默认提示词) */
|
|
373
|
+
systemPrompt: z.string().optional()
|
|
374
|
+
});
|
|
375
|
+
var RetrievalSourceSchema = z.object({
|
|
376
|
+
/** 来源唯一标识 */
|
|
377
|
+
id: z.string(),
|
|
378
|
+
/** vecdb collection 名称 */
|
|
379
|
+
collection: z.string(),
|
|
380
|
+
/** 信源显示名 */
|
|
381
|
+
name: z.string().optional(),
|
|
382
|
+
/** 信源 URL / 路径 */
|
|
383
|
+
url: z.string().optional(),
|
|
384
|
+
/** 最大返回条数(默认 5) */
|
|
385
|
+
topK: z.number().int().positive().optional(),
|
|
386
|
+
/** 最低相似度 0~1(低于此值的结果被过滤) */
|
|
387
|
+
minScore: z.number().min(0).max(1).optional(),
|
|
388
|
+
/** 元数据过滤条件 */
|
|
389
|
+
filter: z.record(z.string(), z.unknown()).optional()
|
|
390
|
+
});
|
|
391
|
+
var RetrievalConfigSchema = z.object({
|
|
392
|
+
/** 预注册检索源列表 */
|
|
393
|
+
sources: z.array(RetrievalSourceSchema).optional()
|
|
394
|
+
});
|
|
395
|
+
var A2ASkillConfigSchema = z.object({
|
|
396
|
+
/** 技能 ID */
|
|
397
|
+
id: z.string(),
|
|
398
|
+
/** 技能名称 */
|
|
399
|
+
name: z.string(),
|
|
400
|
+
/** 技能描述 */
|
|
401
|
+
description: z.string().optional(),
|
|
402
|
+
/** 标签列表 */
|
|
403
|
+
tags: z.array(z.string()).optional()
|
|
404
|
+
});
|
|
405
|
+
var A2AConfigSchema = z.object({
|
|
406
|
+
/** Agent Card 配置 */
|
|
407
|
+
agentCard: z.object({
|
|
408
|
+
/** Agent 名称 */
|
|
409
|
+
name: z.string(),
|
|
410
|
+
/** Agent 描述 */
|
|
411
|
+
description: z.string().optional(),
|
|
412
|
+
/** Agent 对外 URL */
|
|
413
|
+
url: z.string(),
|
|
414
|
+
/** Agent 版本 */
|
|
415
|
+
version: z.string().optional(),
|
|
416
|
+
/** Agent 技能列表 */
|
|
417
|
+
skills: z.array(A2ASkillConfigSchema).optional()
|
|
418
|
+
}),
|
|
419
|
+
/** A2A 安全认证配置 */
|
|
420
|
+
security: z.object({
|
|
421
|
+
/** API Key 认证(通过 IAM apiKey.verifyApiKey 验证) */
|
|
422
|
+
apiKey: z.object({
|
|
423
|
+
/** API Key 的传递位置(默认 header) */
|
|
424
|
+
in: z.enum(["header", "query"]).default("header"),
|
|
425
|
+
/** 参数名(默认 x-api-key) */
|
|
426
|
+
name: z.string().default("x-api-key")
|
|
427
|
+
}).optional()
|
|
428
|
+
}).optional()
|
|
429
|
+
});
|
|
430
|
+
var AIConfigSchema = z.object({
|
|
431
|
+
/** LLM 配置(可选,所有字段有默认值) */
|
|
432
|
+
llm: LLMConfigSchema.default({
|
|
433
|
+
model: "gpt-4o-mini",
|
|
434
|
+
maxTokens: 4096,
|
|
435
|
+
temperature: 0.7,
|
|
436
|
+
timeout: 6e4
|
|
437
|
+
}),
|
|
438
|
+
/** MCP 配置 */
|
|
439
|
+
mcp: MCPConfigSchema.optional(),
|
|
440
|
+
/** Embedding 配置 */
|
|
441
|
+
embedding: EmbeddingConfigSchema.optional(),
|
|
442
|
+
/** Knowledge 配置 */
|
|
443
|
+
knowledge: KnowledgeConfigSchema.optional(),
|
|
444
|
+
/** Memory 配置 */
|
|
445
|
+
memory: MemoryConfigSchema.optional(),
|
|
446
|
+
/** Token 配置 */
|
|
447
|
+
token: TokenConfigSchema.optional(),
|
|
448
|
+
/** Summary 配置 */
|
|
449
|
+
summary: SummaryConfigSchema.optional(),
|
|
450
|
+
/** Compress 配置 */
|
|
451
|
+
compress: CompressConfigSchema.optional(),
|
|
452
|
+
/** Retrieval 配置(预注册检索源) */
|
|
453
|
+
retrieval: RetrievalConfigSchema.optional(),
|
|
454
|
+
/** File 解析配置 */
|
|
455
|
+
file: FileConfigSchema.optional(),
|
|
456
|
+
/** A2A 配置(Agent-to-Agent 协议) */
|
|
457
|
+
a2a: A2AConfigSchema.optional()
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
export { A2AConfigSchema, A2ASkillConfigSchema, AIConfigSchema, CompressConfigSchema, CompressionStrategySchema, EmbeddingConfigSchema, EntityTypeSchema, FileConfigSchema, HaiAIError, KnowledgeConfigSchema, LLMConfigSchema, MCPConfigSchema, MCPServerCapabilitiesSchema, MCPServerConfigSchema, MemoryConfigSchema, MemoryTypeSchema, ModelEntrySchema, ModelScenarioSchema, RetrievalConfigSchema, RetrievalSourceSchema, SummaryConfigSchema, TokenConfigSchema, aiM, resolveModelEntry };
|
|
461
|
+
//# sourceMappingURL=chunk-ZOTQ75VE.js.map
|
|
462
|
+
//# sourceMappingURL=chunk-ZOTQ75VE.js.map
|