@h-ai/ai 1.0.0-beta.5 → 1.0.0-beta.7

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.
@@ -4,6 +4,21 @@ import { core } from '@h-ai/core';
4
4
  var AIErrorInfo = {
5
5
  // 通用 (000-009)
6
6
  INTERNAL_ERROR: "000:500",
7
+ ACP_GIT_NOT_FOUND: "070:500",
8
+ ACP_OPERATION_FAILED: "071:500",
9
+ ACP_INVALID_REQUEST: "072:400",
10
+ ACP_NOT_FOUND: "073:404",
11
+ ACP_BUSY: "074:409",
12
+ ACP_UNSUPPORTED: "075:422",
13
+ ACP_CANCELLED: "076:499",
14
+ ACP_TIMEOUT: "077:504",
15
+ ACP_OUTPUT_INVALID: "078:422",
16
+ ACP_CONFLICT: "079:409",
17
+ ACP_PARTIAL_FAILURE: "080:409",
18
+ ACP_CLOSED: "081:409",
19
+ ACP_RUNTIME_UNAVAILABLE: "082:503",
20
+ ACP_MODEL_INCOMPATIBLE: "083:422",
21
+ ACP_CLEANUP_FAILED: "084:500",
7
22
  // 初始化 (010-019)
8
23
  NOT_INITIALIZED: "010:500",
9
24
  CONFIGURATION_ERROR: "011:500",
@@ -90,6 +105,12 @@ var AIErrorInfo = {
90
105
  IMAGE_DOWNLOAD_BLOCKED: "066:502",
91
106
  IMAGE_TOO_LARGE: "067:413",
92
107
  IMAGE_TIMEOUT: "068:504",
108
+ // 可维护资源清单(090-094)
109
+ RESOURCE_READ_ONLY: "090:403",
110
+ RESOURCE_NOT_FOUND: "091:404",
111
+ RESOURCE_CONFLICT: "092:409",
112
+ RESOURCE_INVALID: "093:400",
113
+ RESOURCE_OPERATION_FAILED: "094:500",
93
114
  // Context (950-999)
94
115
  CONTEXT_COMPRESS_FAILED: "950:500",
95
116
  CONTEXT_SUMMARIZE_FAILED: "951:500",
@@ -114,5 +135,5 @@ var AIErrorInfo = {
114
135
  var HaiAIError = core.error.buildHaiErrorsDef("ai", AIErrorInfo);
115
136
 
116
137
  export { HaiAIError };
117
- //# sourceMappingURL=chunk-HYMP57AC.js.map
118
- //# sourceMappingURL=chunk-HYMP57AC.js.map
138
+ //# sourceMappingURL=chunk-M77C3VAP.js.map
139
+ //# sourceMappingURL=chunk-M77C3VAP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ai-types.ts"],"names":[],"mappings":"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","file":"chunk-M77C3VAP.js","sourcesContent":["import type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport type { A2AOperations } from './a2a/ai-a2a-types.js'\nimport type { ACPAgentAdapter, ACPOperations } from './acp/ai-acp-types.js'\n/**\n * @h-ai/ai — 公共类型定义\n *\n * 聚合导出模块根类型和子功能类型,供外部通过 `@h-ai/ai` 一站式引入。\n * @module ai-types\n */\n\nimport type { AIConfig, AIConfigInput } from './ai-config.js'\n\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 { StreamOperations, ToolsOperations } from './llm/ai-llm-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 { ManagedAudioOperations, ManagedImageOperations, ManagedLLMOperations, ManagedMCPOperations, ManagedRetrievalOperations } from './registry/ai-registry-types.js'\nimport type { RerankOperations } from './rerank/ai-rerank-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'\nimport { core } from '@h-ai/core'\n\n// ─── 错误定义(照 @h-ai/core 范式) ───\n\n/**\n * AI 错误信息映射(错误码:HTTP状态码)。\n *\n * 错误码采用 3 位数字格式(000-999),HTTP 状态码遵循标准 HTTP 规范。\n * 完整错误码将自动生成为:`hai:ai:NNN`\n */\nconst AIErrorInfo = {\n // 通用 (000-009)\n INTERNAL_ERROR: '000:500',\n ACP_GIT_NOT_FOUND: '070:500',\n ACP_OPERATION_FAILED: '071:500',\n ACP_INVALID_REQUEST: '072:400',\n ACP_NOT_FOUND: '073:404',\n ACP_BUSY: '074:409',\n ACP_UNSUPPORTED: '075:422',\n ACP_CANCELLED: '076:499',\n ACP_TIMEOUT: '077:504',\n ACP_OUTPUT_INVALID: '078:422',\n ACP_CONFLICT: '079:409',\n ACP_PARTIAL_FAILURE: '080:409',\n ACP_CLOSED: '081:409',\n ACP_RUNTIME_UNAVAILABLE: '082:503',\n ACP_MODEL_INCOMPATIBLE: '083:422',\n ACP_CLEANUP_FAILED: '084:500',\n\n // 初始化 (010-019)\n NOT_INITIALIZED: '010:500',\n CONFIGURATION_ERROR: '011:500',\n INIT_IN_PROGRESS: '012:500',\n RERANK_API_ERROR: '020:502',\n RERANK_INVALID_REQUEST: '021:400',\n\n // LLM (100-199)\n API_ERROR: '100:502',\n INVALID_REQUEST: '101:400',\n RATE_LIMITED: '102:429',\n TIMEOUT: '103:504',\n MODEL_NOT_FOUND: '104:404',\n CONTEXT_LENGTH_EXCEEDED: '105:400',\n LLM_RECORD_FAILED: '106:500',\n LLM_HISTORY_FAILED: '107:500',\n\n // MCP (200-299)\n MCP_CONNECTION_ERROR: '200:502',\n MCP_PROTOCOL_ERROR: '201:502',\n MCP_TOOL_ERROR: '202:500',\n MCP_RESOURCE_ERROR: '203:500',\n MCP_SERVER_ERROR: '204:502',\n\n // Embedding (300-399)\n EMBEDDING_API_ERROR: '300:502',\n EMBEDDING_MODEL_NOT_FOUND: '301:404',\n EMBEDDING_INPUT_TOO_LONG: '302:400',\n\n // 工具 (400-499)\n TOOL_NOT_FOUND: '400:404',\n TOOL_VALIDATION_FAILED: '401:400',\n TOOL_EXECUTION_FAILED: '402:500',\n TOOL_TIMEOUT: '403:504',\n TOOL_ALREADY_REGISTERED: '404:409',\n TOOL_FORBIDDEN: '405:403',\n\n // Reasoning (500-599)\n REASONING_FAILED: '500:500',\n REASONING_MAX_ROUNDS: '501:400',\n REASONING_STRATEGY_NOT_FOUND: '502:404',\n\n // Retrieval (600-699)\n RETRIEVAL_FAILED: '600:500',\n RETRIEVAL_SOURCE_NOT_FOUND: '601:404',\n\n // RAG (700-799)\n RAG_FAILED: '700:500',\n RAG_CONTEXT_BUILD_FAILED: '701:500',\n\n // Knowledge (800-899)\n KNOWLEDGE_SETUP_FAILED: '800:500',\n KNOWLEDGE_INGEST_FAILED: '801:500',\n KNOWLEDGE_RETRIEVE_FAILED: '802:500',\n KNOWLEDGE_ENTITY_EXTRACT_FAILED: '803:500',\n KNOWLEDGE_NOT_SETUP: '804:500',\n KNOWLEDGE_COLLECTION_NOT_FOUND: '805:404',\n\n // Memory (900-949)\n MEMORY_EXTRACT_FAILED: '900:500',\n MEMORY_STORE_FAILED: '901:500',\n MEMORY_RECALL_FAILED: '902:500',\n MEMORY_NOT_FOUND: '903:404',\n MEMORY_ENRICH_FAILED: '904:500',\n MEMORY_PROMOTE_FAILED: '905:500',\n MEMORY_LIST_INCOMPLETE: '906:422',\n\n // Persona (910-919)\n PERSONA_NOT_FOUND: '910:404',\n PERSONA_SAVE_FAILED: '911:500',\n\n // File (030-049)\n FILE_PARSE_FAILED: '030:500',\n FILE_UNSUPPORTED_FORMAT: '031:400',\n FILE_OCR_FAILED: '032:500',\n FILE_INVALID_CONTENT: '033:400',\n\n // Audio (050-059)\n AUDIO_INVALID_REQUEST: '050:400',\n AUDIO_MODEL_NOT_FOUND: '051:404',\n AUDIO_PROVIDER_NOT_FOUND: '052:404',\n AUDIO_UNSUPPORTED_INPUT: '053:400',\n AUDIO_UPSTREAM_ERROR: '054:502',\n AUDIO_PROTOCOL_ERROR: '055:502',\n AUDIO_CONNECTION_FAILED: '056:502',\n AUDIO_TIMEOUT: '057:504',\n AUDIO_INPUT_TOO_LARGE: '058:413',\n AUDIO_CANCELLED: '059:499',\n\n // Image (060-069)\n IMAGE_INVALID_REQUEST: '060:400',\n IMAGE_MODEL_NOT_FOUND: '061:404',\n IMAGE_PROVIDER_NOT_FOUND: '062:404',\n IMAGE_UPSTREAM_ERROR: '063:502',\n IMAGE_PROTOCOL_ERROR: '064:502',\n IMAGE_CANCELLED: '065:499',\n IMAGE_DOWNLOAD_BLOCKED: '066:502',\n IMAGE_TOO_LARGE: '067:413',\n IMAGE_TIMEOUT: '068:504',\n\n // 可维护资源清单(090-094)\n RESOURCE_READ_ONLY: '090:403',\n RESOURCE_NOT_FOUND: '091:404',\n RESOURCE_CONFLICT: '092:409',\n RESOURCE_INVALID: '093:400',\n RESOURCE_OPERATION_FAILED: '094:500',\n\n // Context (950-999)\n CONTEXT_COMPRESS_FAILED: '950:500',\n CONTEXT_SUMMARIZE_FAILED: '951:500',\n CONTEXT_TOKEN_ESTIMATE_FAILED: '952:500',\n CONTEXT_BUDGET_EXCEEDED: '953:400',\n CONTEXT_TURN_NOT_FOUND: '954:404',\n CONTEXT_TURN_INVALID_STATE: '955:409',\n CONTEXT_BUSY: '956:409',\n\n // Store (960-969)\n STORE_FAILED: '960:500',\n STORE_NOT_AVAILABLE: '961:503',\n\n // Session (970-979)\n SESSION_NOT_FOUND: '970:404',\n SESSION_FAILED: '971:500',\n\n // A2A (980-999)\n A2A_NOT_CONFIGURED: '980:500',\n A2A_HANDLE_FAILED: '981:500',\n A2A_REMOTE_CALL_FAILED: '982:502',\n A2A_AUTH_FAILED: '983:401',\n A2A_LIST_MESSAGES_FAILED: '984:500',\n} as const satisfies ErrorInfo\n\n/**\n * AI 模块标准错误定义。通过错误码比较分支,用户文案由业务边界本地化。\n *\n * @example\n * ```ts\n * import { HaiAIError } from '@h-ai/ai'\n * import { err } from '@h-ai/core'\n * const result = err(HaiAIError.NOT_INITIALIZED, 'AI is not initialized')\n * if (!result.success) {\n * const status = result.error.httpStatus\n * const code = result.error.code\n * }\n * ```\n */\nexport const HaiAIError = core.error.buildHaiErrorsDef('ai', AIErrorInfo)\n\n// ─── 初始化选项 ───\n\n/**\n * AI 初始化运行时选项\n *\n * 用于传入运行时对象(如自定义 StoreProvider),\n * 这些对象无法通过 Zod 配置 Schema 传递。\n *\n * @example\n * ```ts\n * import { ai, type AIConfigInput, type AIInitOptions, type AIStoreProvider } from '@h-ai/ai'\n * async function start(config: AIConfigInput, storeProvider: AIStoreProvider) {\n * const options: AIInitOptions = { storeProvider }\n * const result = await ai.init(config, options)\n * if (!result.success) throw new Error(result.error.message)\n * }\n * ```\n */\nexport interface AIInitOptions {\n /** 可信服务端扩展:为其他 ACP 智能体生成原生配置。 */\n acpAdapters?: Record<string, ACPAgentAdapter>\n /**\n * 自定义存储 Provider\n *\n * 提供后 AI 模块将使用此 Provider,而不采用自动选择的存储实现。\n * 未提供时:reldb + vecdb 已初始化则使用持久化 DB Provider,否则使用进程内临时 Provider。\n */\n storeProvider?: AIStoreProvider\n}\n\n// ─── AIFunctions 接口 ───\n\n/**\n * AI 服务接口(通过 `ai` 对象访问)\n *\n * 所有 AI 功能的统一入口,需先调用 `init()` 初始化后才能使用 `llm`、`mcp` 操作。\n * `tools` 和 `stream` 为纯函数,无需初始化即可使用。\n *\n * @example\n * ```ts\n * import { ai, type AIConfigInput, type AIInitOptions } from '@h-ai/ai'\n * // 一次性脚本示例;服务应用在启动阶段 init,在停止接入请求后 close。\n * async function run(config: AIConfigInput, options: AIInitOptions) {\n * const ready = await ai.init(config, options)\n * if (!ready.success) throw new Error(ready.error.message)\n * try {\n * const answer = await ai.llm.ask('你好', { objectId: 'user-1' })\n * if (!answer.success) throw new Error(answer.error.message)\n * return answer.data\n * }\n * finally {\n * await ai.close()\n * }\n * }\n * ```\n */\nexport interface AIFunctions {\n /**\n * 初始化 AI 服务\n *\n * 使用 Zod Schema 校验配置,失败返回 `CONFIGURATION_ERROR`。\n * 重复调用会先关闭旧实例再重新初始化。\n *\n * @param config - AI 配置(可选,默认使用空对象并应用 Schema 默认值)\n * @param options - 运行时选项(可选,用于传入自定义 StoreProvider 等运行时对象)\n * @returns 成功返回 `ok(undefined)`;配置校验失败返回 `err(HaiAIError.CONFIGURATION_ERROR)`\n */\n init: (config?: AIConfigInput, options?: AIInitOptions) => Promise<HaiResult<void>>\n /**\n * 关闭 AI 服务,释放内部状态\n *\n * 关闭后 `llm`、`mcp` 操作将返回 `NOT_INITIALIZED` 错误。\n * 重复关闭不会报错。\n */\n close: () => Promise<void>\n /** 当前脱敏后的配置快照(未初始化时为 `null`) */\n readonly config: AIConfig | null\n /** 是否已初始化(`init()` 成功后为 `true`,`close()` 后为 `false`) */\n readonly isInitialized: boolean\n /** LLM 操作(聊天、流式、模型列表),需要先调用 `init()` */\n readonly llm: ManagedLLMOperations\n /** ACP 智能体、工作区与原生会话,需要先调用 `init()`。 */\n readonly acp: ACPOperations\n /** MCP 本地函数注册及配置/数据库外部服务清单,需要先调用 `init()`。 */\n readonly mcp: ManagedMCPOperations\n /** 工具操作(定义工具与注册表),纯函数,无需初始化 */\n readonly tools: ToolsOperations\n /** 流处理操作(流处理器、SSE 编解码),纯函数,无需初始化 */\n readonly stream: StreamOperations\n /** Embedding 操作(向量嵌入),需要先调用 `init()` */\n readonly embedding: EmbeddingOperations\n /** 推理操作(ReAct / CoT / Plan-Execute),需要先调用 `init()` */\n readonly reasoning: ReasoningOperations\n /** 检索操作(向量检索),需要先调用 `init()` */\n readonly retrieval: ManagedRetrievalOperations\n /** RAG 操作(检索增强生成),需要先调用 `init()` */\n readonly rag: RagOperations\n /** Knowledge 操作(知识库管理与检索),需要先调用 `init()` 和 `knowledge.setup()` */\n readonly knowledge: KnowledgeOperations\n /** Memory 操作(记忆提取、存储、检索、注入),需要先调用 `init()` */\n readonly memory: MemoryOperations\n /** Persona 操作(AI 角色人格档案与系统提示词组合),需要先调用 `init()` */\n readonly persona: PersonaOperations\n /** Token 操作(Token 估算),需要先调用 `init()` */\n readonly token: TokenOperations\n /** Summary 操作(消息摘要生成),需要先调用 `init()` */\n readonly summary: SummaryOperations\n /** Compress 操作(上下文压缩),需要先调用 `init()` */\n readonly compress: CompressOperations\n /** Context 操作(有状态上下文管理器,编排 LLM + Memory + RAG + Reasoning),需要先调用 `init()` */\n readonly context: ContextOperations\n /** Rerank 操作(文档重排序),需要先调用 `init()` */\n readonly rerank: RerankOperations\n /** File 操作(文件内容解析),需要先调用 `init()` */\n readonly file: FileOperations\n /** A2A 操作(Agent-to-Agent 协议),需要先调用 `init()` 并配置 `a2a` */\n readonly a2a: A2AOperations\n /** Audio 操作(语音识别 / 语音合成),需要先调用 `init()` 并配置 `audio` */\n readonly audio: ManagedAudioOperations\n /** Image 操作(文生图),需要先调用 `init()` 并配置 `image` */\n readonly image: ManagedImageOperations\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { HaiAIError } from './chunk-HYMP57AC.js';
1
+ import { HaiAIError } from './chunk-M77C3VAP.js';
2
2
 
3
3
  // src/client/ai-audio-client.ts
4
4
  function audioClientError(code, message) {
@@ -250,5 +250,5 @@ async function* singleSegment(segment) {
250
250
  }
251
251
 
252
252
  export { createAudioClient };
253
- //# sourceMappingURL=chunk-GMQFIWND.js.map
254
- //# sourceMappingURL=chunk-GMQFIWND.js.map
253
+ //# sourceMappingURL=chunk-O6P4P5PC.js.map
254
+ //# sourceMappingURL=chunk-O6P4P5PC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/ai-audio-client.ts"],"names":[],"mappings":"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","file":"chunk-GMQFIWND.js","sourcesContent":["/**\n * @h-ai/ai/client — 浏览器语音客户端\n *\n * 通过统一 WebSocket 连接 `@h-ai/serv` 的语音入口,向浏览器暴露与 Node 端一致的\n * `ai.audio.*` 业务 API。WebSocket 建立、消息编解码等传输细节在此内部完成,\n * 调用方不接触任何厂商原生事件。\n * @module client/ai-audio-client\n */\n\nimport type {\n SynthesisEvent,\n SynthesisRequest,\n SynthesisResult,\n SynthesisStreamRequest,\n SynthesisTextSegment,\n TranscriptionEvent,\n TranscriptionRequest,\n TranscriptionResult,\n TranscriptionStreamRequest,\n} from '../audio/ai-audio-types.js'\nimport type { AudioWsServerMessage, AudioWsStartMessage } from '../audio/ai-audio-ws-protocol.js'\nimport { HaiAIError } from '../ai-types.js'\n\n/**\n * 构造带领域错误码的浏览器客户端错误\n *\n * 浏览器 Client 约定出错抛异常;此处在 `Error.code` 上保留领域错误码\n * (取消 / 连接失败 / 服务端领域错误),供调用方区分正常结束、取消与异常断连。\n */\nfunction audioClientError(code: string | number, message: string): Error {\n const error = new Error(message)\n ;(error as { code?: string | number }).code = code\n return error\n}\n\n// ─── 客户端配置 ───\n\n/**\n * getTicket 收到的当前 Audio 请求摘要\n *\n * 供应用签发与本次操作严格绑定的能力票据(如 `iam.ticket.issue({ grant })`),\n * 使票据只能用于本次操作 / 模型 / 会话,降低票据被重放的风险。\n *\n * @example\n * ```ts\n * import type { AudioTicketRequest } from '@h-ai/ai/client'\n * function grant(request: AudioTicketRequest) {\n * return { operation: request.operation, model: request.model } // 经已登录 HTTP 接口签发并在服务端原子消费。\n * }\n * ```\n */\nexport interface AudioTicketRequest {\n /** 本次操作类型 */\n operation: 'transcribe' | 'synthesize'\n /** 本次使用的模型 ID(如有指定) */\n model?: string\n}\n\n/**\n * 浏览器语音客户端配置\n *\n * @example\n * ```ts\n * import { createAudioClient } from '@h-ai/ai/client'\n * import type { AudioTicketRequest } from '@h-ai/ai/client'\n * function connect(issueTicket: (request: AudioTicketRequest) => Promise<string>) {\n * return createAudioClient({ url: 'wss://example.com/api/v1/ai/audio', getTicket: issueTicket })\n * }\n * ```\n */\nexport interface AudioClientConfig {\n /** 语音 WebSocket 完整 URL(如 `wss://host/api/v1/ai/audio`) */\n url: string\n /**\n * 获取短期、一次性的 Audio WebSocket ticket\n *\n * ticket 应由已登录 HTTP 请求签发,并在服务端首次校验时原子消费。\n * 收到当前请求摘要(operation / model),可签发与本次操作严格绑定的票据。\n */\n getTicket: (request: AudioTicketRequest) => string | Promise<string>\n}\n\n/**\n * 浏览器语音操作接口\n *\n * 与 Node 端 `AudioOperations` 业务形态一致;出错时抛出异常(浏览器 Client 约定)。\n *\n * @example\n * ```ts\n * import type { AudioClientOperations } from '@h-ai/ai/client'\n * async function speak(audio: AudioClientOperations) {\n * // 浏览器 AudioClient 普通方法也显式抛错,由应用交互边界处理。\n * const result = await audio.synthesize({ text: '你好', format: 'mp3' })\n * return result.data\n * }\n * ```\n */\nexport interface AudioClientOperations {\n /** 将完整音频识别为完整文本 */\n transcribe: (request: TranscriptionRequest) => Promise<TranscriptionResult>\n /** 持续输入音频或增量返回识别文本(含语音起止事件) */\n transcribeStream: (request: TranscriptionStreamRequest) => AsyncIterable<TranscriptionEvent>\n /** 将完整文本合成为完整音频 */\n synthesize: (request: SynthesisRequest) => Promise<SynthesisResult>\n /** 持续输入文本段并按段输出结构化音频事件 */\n synthesizeStream: (request: SynthesisStreamRequest) => AsyncIterable<SynthesisEvent>\n}\n\n// ─── 浏览器 WebSocket 辅助 ───\n\n/**\n * WebSocket 收到的消息\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const frame: BrowserWsMessage = { isBinary: true, binary: new Uint8Array([0, 0]) }\n * const bytes = frame.isBinary ? frame.binary : undefined\n * ```\n */\ninterface BrowserWsMessage {\n text?: string\n binary?: Uint8Array\n isBinary: boolean\n}\n\n/**\n * 浏览器 WebSocket 连接封装\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function consume(connection: BrowserWsConnection) {\n * try {\n * connection.send(JSON.stringify({ type: 'done' }))\n * for await (const frame of connection.messages()) {\n * if (!frame.isBinary && frame.text) return JSON.parse(frame.text)\n * }\n * return undefined\n * }\n * finally { connection.close() }\n * }\n * ```\n */\ninterface BrowserWsConnection {\n send: (data: string | Uint8Array) => void\n messages: () => AsyncIterableIterator<BrowserWsMessage>\n close: () => void\n}\n\n/** 建立浏览器 WebSocket 连接(内部消息队列 → 异步迭代) */\nfunction openBrowserWs(url: string, signal?: AbortSignal): Promise<BrowserWsConnection> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url)\n ws.binaryType = 'arraybuffer'\n\n const queue: BrowserWsMessage[] = []\n let waiting: ((result: IteratorResult<BrowserWsMessage>) => void) | null = null\n let closed = false\n let opened = false\n let aborted = false\n let failure: Error | null = null\n\n function settleClosed(): void {\n if (closed)\n return\n closed = true\n signal?.removeEventListener('abort', onAbort)\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: undefined, done: true })\n }\n }\n\n function onAbort(): void {\n aborted = true\n if (!opened) {\n // 连接建立前取消:直接以取消错误拒绝建连\n settleClosed()\n reject(audioClientError(HaiAIError.AUDIO_CANCELLED.code, 'Audio operation cancelled'))\n }\n // 连接建立后取消:关闭连接,由消息迭代器在终止时抛出 AUDIO_CANCELLED\n ws.close()\n }\n\n /**\n * socket 关闭且未按协议正常收到 `end` 时的终止错误。\n *\n * 消费方在收到服务端 `end` 时会主动 break,因而正常结束不会走到此分支;\n * 走到此分支即意味着连接在完成前关闭,须区分取消 / 网络异常抛出对应领域错误。\n */\n function terminalError(): Error {\n if (aborted)\n return audioClientError(HaiAIError.AUDIO_CANCELLED.code, 'Audio operation cancelled')\n if (failure)\n return failure\n return audioClientError(HaiAIError.AUDIO_CONNECTION_FAILED.code, 'Audio WebSocket closed before completion')\n }\n\n function push(message: BrowserWsMessage): void {\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: message, done: false })\n }\n else {\n queue.push(message)\n }\n }\n\n ws.onmessage = (event: MessageEvent): void => {\n if (typeof event.data === 'string')\n push({ isBinary: false, text: event.data })\n else\n push({ isBinary: true, binary: new Uint8Array(event.data as ArrayBuffer) })\n }\n // 连接建立前后的错误都记录:建立前直接拒绝,建立后由迭代器在关闭时抛出 AUDIO_CONNECTION_FAILED\n ws.onerror = (): void => {\n failure = audioClientError(HaiAIError.AUDIO_CONNECTION_FAILED.code, 'Audio WebSocket connection failed')\n if (!opened) {\n settleClosed()\n reject(failure)\n }\n }\n ws.onclose = (): void => settleClosed()\n\n if (signal) {\n if (signal.aborted)\n onAbort()\n else\n signal.addEventListener('abort', onAbort, { once: true })\n }\n\n ws.onopen = (): void => {\n opened = true\n resolve({\n // DOM WebSocket.send 的 BufferSource 泛型限定为 ArrayBuffer,Uint8Array 需显式收窄\n send: data => ws.send(data as string | Uint8Array<ArrayBuffer>),\n async* messages() {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift() as BrowserWsMessage\n continue\n }\n if (closed)\n throw terminalError()\n const next = await new Promise<IteratorResult<BrowserWsMessage>>((res) => {\n waiting = res\n })\n if (next.done)\n throw terminalError()\n yield next.value\n }\n },\n close: () => ws.close(),\n })\n }\n })\n}\n\n// ─── 客户端实现 ───\n\n/**\n * 创建浏览器语音客户端\n *\n * @param config - 语音客户端配置\n * @returns 浏览器语音操作接口\n *\n * @example\n * ```ts\n * import { createAudioClient } from '@h-ai/ai/client'\n * import type { AudioTicketRequest } from '@h-ai/ai/client'\n * function connect(issueTicket: (request: AudioTicketRequest) => Promise<string>) {\n * return createAudioClient({ url: 'wss://example.com/api/v1/ai/audio', getTicket: issueTicket })\n * }\n * ```\n */\nexport function createAudioClient(config: AudioClientConfig): AudioClientOperations {\n async function buildUrl(request: AudioTicketRequest): Promise<string> {\n const ticket = await config.getTicket(request)\n if (!ticket)\n throw new Error('Audio WebSocket ticket is required')\n const separator = config.url.includes('?') ? '&' : '?'\n return `${config.url}${separator}ticket=${encodeURIComponent(ticket)}`\n }\n\n function startMessage(operation: 'transcribe' | 'synthesize', extra: Partial<AudioWsStartMessage>): string {\n return JSON.stringify({ type: 'start', operation, ...extra } satisfies AudioWsStartMessage)\n }\n\n async function* transcribeStream(request: TranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const conn = await openBrowserWs(await buildUrl({ operation: 'transcribe', model: request.model }), request.signal)\n try {\n const format = request.audio.format\n const sampleRate = request.audio.sampleRate\n conn.send(startMessage('transcribe', { stream: true, model: request.model, language: request.language, contextHints: request.contextHints, format, sampleRate, channels: request.audio.channels }))\n\n const sendAudio = (async () => {\n if ('chunks' in request.audio) {\n for await (const part of request.audio.chunks)\n conn.send(part)\n }\n else {\n conn.send(request.audio.data)\n }\n conn.send(JSON.stringify({ type: 'done' }))\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.text)\n continue\n const event = JSON.parse(message.text) as AudioWsServerMessage\n if (event.type === 'transcript')\n yield { type: 'transcript', text: event.text, final: event.final }\n else if (event.type === 'speech_started')\n yield { type: 'speech_started' }\n else if (event.type === 'speech_stopped')\n yield { type: 'speech_stopped' }\n else if (event.type === 'error')\n throw audioClientError(event.code, event.message)\n else if (event.type === 'end')\n break\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n async function transcribe(request: TranscriptionRequest): Promise<TranscriptionResult> {\n // 完整识别:服务端缓冲全部音频后返回单条最终结果\n const conn = await openBrowserWs(await buildUrl({ operation: 'transcribe', model: request.model }), request.signal)\n try {\n conn.send(startMessage('transcribe', { stream: false, model: request.model, language: request.language, contextHints: request.contextHints, format: request.audio.format, sampleRate: request.audio.sampleRate, channels: request.audio.channels }))\n conn.send(request.audio.data)\n conn.send(JSON.stringify({ type: 'done' }))\n\n let text = ''\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = JSON.parse(message.text) as AudioWsServerMessage\n if (event.type === 'transcript')\n text = event.text\n else if (event.type === 'error')\n throw audioClientError(event.code, event.message)\n else if (event.type === 'end')\n break\n }\n return { text }\n }\n finally {\n conn.close()\n }\n }\n\n async function* synthesizeStream(request: SynthesisStreamRequest): AsyncIterable<SynthesisEvent> {\n const conn = await openBrowserWs(await buildUrl({ operation: 'synthesize', model: request.model }), request.signal)\n try {\n conn.send(startMessage('synthesize', { model: request.model, voice: request.voice, instruction: request.instruction, format: request.format, sampleRate: request.sampleRate }))\n\n const sendText = (async () => {\n const segments = isSynthesisTextSegment(request.text) ? singleSegment(request.text) : request.text\n for await (const segment of segments)\n conn.send(JSON.stringify({ type: 'text', segmentId: segment.id, text: segment.text }))\n conn.send(JSON.stringify({ type: 'done' }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n let activeSegmentId: string | undefined\n for await (const message of conn.messages()) {\n if (message.isBinary && message.binary) {\n if (!activeSegmentId)\n throw new Error('Audio frame received outside a synthesis segment')\n yield { type: 'audio', segmentId: activeSegmentId, data: message.binary }\n continue\n }\n if (!message.text)\n continue\n const event = JSON.parse(message.text) as AudioWsServerMessage\n if (event.type === 'segment_started') {\n if (activeSegmentId)\n throw new Error('Synthesis segment started before the previous segment completed')\n activeSegmentId = event.segmentId\n yield event\n }\n else if (event.type === 'segment_done') {\n if (activeSegmentId !== event.segmentId)\n throw new Error('Synthesis segment completion does not match the active segment')\n yield event\n activeSegmentId = undefined\n }\n else if (event.type === 'error') {\n throw audioClientError(event.code, event.message)\n }\n else if (event.type === 'end') {\n // 收到 end 但仍有未完成的合成段:视为本次合成失败,不得把部分音频当作成功结果\n if (activeSegmentId)\n throw audioClientError(HaiAIError.AUDIO_PROTOCOL_ERROR.code, 'Synthesis ended before the active segment completed')\n break\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n async function synthesize(request: SynthesisRequest): Promise<SynthesisResult> {\n const chunks: Uint8Array[] = []\n let meta: { format: SynthesisResult['format'], sampleRate?: number, channels?: 1 | 2 } | undefined\n for await (const event of synthesizeStream({ ...request, text: { id: 'synthesis', text: request.text } })) {\n if (event.type === 'segment_started')\n meta = { format: event.format, sampleRate: event.sampleRate, channels: event.channels }\n else if (event.type === 'audio')\n chunks.push(event.data)\n }\n // 音频格式来自服务端解析后的 Provider 真实输出(随 segment_started 下发),不由请求参数猜测\n if (!meta)\n throw audioClientError(HaiAIError.AUDIO_PROTOCOL_ERROR.code, 'Synthesis completed without segment metadata')\n const total = chunks.reduce((sum, c) => sum + c.length, 0)\n const data = new Uint8Array(total)\n let offset = 0\n for (const chunk of chunks) {\n data.set(chunk, offset)\n offset += chunk.length\n }\n return { data, format: meta.format, sampleRate: meta.sampleRate, channels: meta.channels ?? 1 }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream }\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"]}
1
+ {"version":3,"sources":["../src/client/ai-audio-client.ts"],"names":[],"mappings":"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","file":"chunk-O6P4P5PC.js","sourcesContent":["/**\n * @h-ai/ai/client — 浏览器语音客户端\n *\n * 通过统一 WebSocket 连接 `@h-ai/serv` 的语音入口,向浏览器暴露与 Node 端一致的\n * `ai.audio.*` 业务 API。WebSocket 建立、消息编解码等传输细节在此内部完成,\n * 调用方不接触任何厂商原生事件。\n * @module client/ai-audio-client\n */\n\nimport type {\n SynthesisEvent,\n SynthesisRequest,\n SynthesisResult,\n SynthesisStreamRequest,\n SynthesisTextSegment,\n TranscriptionEvent,\n TranscriptionRequest,\n TranscriptionResult,\n TranscriptionStreamRequest,\n} from '../audio/ai-audio-types.js'\nimport type { AudioWsServerMessage, AudioWsStartMessage } from '../audio/ai-audio-ws-protocol.js'\nimport { HaiAIError } from '../ai-types.js'\n\n/**\n * 构造带领域错误码的浏览器客户端错误\n *\n * 浏览器 Client 约定出错抛异常;此处在 `Error.code` 上保留领域错误码\n * (取消 / 连接失败 / 服务端领域错误),供调用方区分正常结束、取消与异常断连。\n */\nfunction audioClientError(code: string | number, message: string): Error {\n const error = new Error(message)\n ;(error as { code?: string | number }).code = code\n return error\n}\n\n// ─── 客户端配置 ───\n\n/**\n * getTicket 收到的当前 Audio 请求摘要\n *\n * 供应用签发与本次操作严格绑定的能力票据(如 `iam.ticket.issue({ grant })`),\n * 使票据只能用于本次操作 / 模型 / 会话,降低票据被重放的风险。\n *\n * @example\n * ```ts\n * import type { AudioTicketRequest } from '@h-ai/ai/client'\n * function grant(request: AudioTicketRequest) {\n * return { operation: request.operation, model: request.model } // 经已登录 HTTP 接口签发并在服务端原子消费。\n * }\n * ```\n */\nexport interface AudioTicketRequest {\n /** 本次操作类型 */\n operation: 'transcribe' | 'synthesize'\n /** 本次使用的模型 ID(如有指定) */\n model?: string\n}\n\n/**\n * 浏览器语音客户端配置\n *\n * @example\n * ```ts\n * import { createAudioClient } from '@h-ai/ai/client'\n * import type { AudioTicketRequest } from '@h-ai/ai/client'\n * function connect(issueTicket: (request: AudioTicketRequest) => Promise<string>) {\n * return createAudioClient({ url: 'wss://example.com/api/v1/ai/audio', getTicket: issueTicket })\n * }\n * ```\n */\nexport interface AudioClientConfig {\n /** 语音 WebSocket 完整 URL(如 `wss://host/api/v1/ai/audio`) */\n url: string\n /**\n * 获取短期、一次性的 Audio WebSocket ticket\n *\n * ticket 应由已登录 HTTP 请求签发,并在服务端首次校验时原子消费。\n * 收到当前请求摘要(operation / model),可签发与本次操作严格绑定的票据。\n */\n getTicket: (request: AudioTicketRequest) => string | Promise<string>\n}\n\n/**\n * 浏览器语音操作接口\n *\n * 与 Node 端 `AudioOperations` 业务形态一致;出错时抛出异常(浏览器 Client 约定)。\n *\n * @example\n * ```ts\n * import type { AudioClientOperations } from '@h-ai/ai/client'\n * async function speak(audio: AudioClientOperations) {\n * // 浏览器 AudioClient 普通方法也显式抛错,由应用交互边界处理。\n * const result = await audio.synthesize({ text: '你好', format: 'mp3' })\n * return result.data\n * }\n * ```\n */\nexport interface AudioClientOperations {\n /** 将完整音频识别为完整文本 */\n transcribe: (request: TranscriptionRequest) => Promise<TranscriptionResult>\n /** 持续输入音频或增量返回识别文本(含语音起止事件) */\n transcribeStream: (request: TranscriptionStreamRequest) => AsyncIterable<TranscriptionEvent>\n /** 将完整文本合成为完整音频 */\n synthesize: (request: SynthesisRequest) => Promise<SynthesisResult>\n /** 持续输入文本段并按段输出结构化音频事件 */\n synthesizeStream: (request: SynthesisStreamRequest) => AsyncIterable<SynthesisEvent>\n}\n\n// ─── 浏览器 WebSocket 辅助 ───\n\n/**\n * WebSocket 收到的消息\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const frame: BrowserWsMessage = { isBinary: true, binary: new Uint8Array([0, 0]) }\n * const bytes = frame.isBinary ? frame.binary : undefined\n * ```\n */\ninterface BrowserWsMessage {\n text?: string\n binary?: Uint8Array\n isBinary: boolean\n}\n\n/**\n * 浏览器 WebSocket 连接封装\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function consume(connection: BrowserWsConnection) {\n * try {\n * connection.send(JSON.stringify({ type: 'done' }))\n * for await (const frame of connection.messages()) {\n * if (!frame.isBinary && frame.text) return JSON.parse(frame.text)\n * }\n * return undefined\n * }\n * finally { connection.close() }\n * }\n * ```\n */\ninterface BrowserWsConnection {\n send: (data: string | Uint8Array) => void\n messages: () => AsyncIterableIterator<BrowserWsMessage>\n close: () => void\n}\n\n/** 建立浏览器 WebSocket 连接(内部消息队列 → 异步迭代) */\nfunction openBrowserWs(url: string, signal?: AbortSignal): Promise<BrowserWsConnection> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url)\n ws.binaryType = 'arraybuffer'\n\n const queue: BrowserWsMessage[] = []\n let waiting: ((result: IteratorResult<BrowserWsMessage>) => void) | null = null\n let closed = false\n let opened = false\n let aborted = false\n let failure: Error | null = null\n\n function settleClosed(): void {\n if (closed)\n return\n closed = true\n signal?.removeEventListener('abort', onAbort)\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: undefined, done: true })\n }\n }\n\n function onAbort(): void {\n aborted = true\n if (!opened) {\n // 连接建立前取消:直接以取消错误拒绝建连\n settleClosed()\n reject(audioClientError(HaiAIError.AUDIO_CANCELLED.code, 'Audio operation cancelled'))\n }\n // 连接建立后取消:关闭连接,由消息迭代器在终止时抛出 AUDIO_CANCELLED\n ws.close()\n }\n\n /**\n * socket 关闭且未按协议正常收到 `end` 时的终止错误。\n *\n * 消费方在收到服务端 `end` 时会主动 break,因而正常结束不会走到此分支;\n * 走到此分支即意味着连接在完成前关闭,须区分取消 / 网络异常抛出对应领域错误。\n */\n function terminalError(): Error {\n if (aborted)\n return audioClientError(HaiAIError.AUDIO_CANCELLED.code, 'Audio operation cancelled')\n if (failure)\n return failure\n return audioClientError(HaiAIError.AUDIO_CONNECTION_FAILED.code, 'Audio WebSocket closed before completion')\n }\n\n function push(message: BrowserWsMessage): void {\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: message, done: false })\n }\n else {\n queue.push(message)\n }\n }\n\n ws.onmessage = (event: MessageEvent): void => {\n if (typeof event.data === 'string')\n push({ isBinary: false, text: event.data })\n else\n push({ isBinary: true, binary: new Uint8Array(event.data as ArrayBuffer) })\n }\n // 连接建立前后的错误都记录:建立前直接拒绝,建立后由迭代器在关闭时抛出 AUDIO_CONNECTION_FAILED\n ws.onerror = (): void => {\n failure = audioClientError(HaiAIError.AUDIO_CONNECTION_FAILED.code, 'Audio WebSocket connection failed')\n if (!opened) {\n settleClosed()\n reject(failure)\n }\n }\n ws.onclose = (): void => settleClosed()\n\n if (signal) {\n if (signal.aborted)\n onAbort()\n else\n signal.addEventListener('abort', onAbort, { once: true })\n }\n\n ws.onopen = (): void => {\n opened = true\n resolve({\n // DOM WebSocket.send 的 BufferSource 泛型限定为 ArrayBuffer,Uint8Array 需显式收窄\n send: data => ws.send(data as string | Uint8Array<ArrayBuffer>),\n async* messages() {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift() as BrowserWsMessage\n continue\n }\n if (closed)\n throw terminalError()\n const next = await new Promise<IteratorResult<BrowserWsMessage>>((res) => {\n waiting = res\n })\n if (next.done)\n throw terminalError()\n yield next.value\n }\n },\n close: () => ws.close(),\n })\n }\n })\n}\n\n// ─── 客户端实现 ───\n\n/**\n * 创建浏览器语音客户端\n *\n * @param config - 语音客户端配置\n * @returns 浏览器语音操作接口\n *\n * @example\n * ```ts\n * import { createAudioClient } from '@h-ai/ai/client'\n * import type { AudioTicketRequest } from '@h-ai/ai/client'\n * function connect(issueTicket: (request: AudioTicketRequest) => Promise<string>) {\n * return createAudioClient({ url: 'wss://example.com/api/v1/ai/audio', getTicket: issueTicket })\n * }\n * ```\n */\nexport function createAudioClient(config: AudioClientConfig): AudioClientOperations {\n async function buildUrl(request: AudioTicketRequest): Promise<string> {\n const ticket = await config.getTicket(request)\n if (!ticket)\n throw new Error('Audio WebSocket ticket is required')\n const separator = config.url.includes('?') ? '&' : '?'\n return `${config.url}${separator}ticket=${encodeURIComponent(ticket)}`\n }\n\n function startMessage(operation: 'transcribe' | 'synthesize', extra: Partial<AudioWsStartMessage>): string {\n return JSON.stringify({ type: 'start', operation, ...extra } satisfies AudioWsStartMessage)\n }\n\n async function* transcribeStream(request: TranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const conn = await openBrowserWs(await buildUrl({ operation: 'transcribe', model: request.model }), request.signal)\n try {\n const format = request.audio.format\n const sampleRate = request.audio.sampleRate\n conn.send(startMessage('transcribe', { stream: true, model: request.model, language: request.language, contextHints: request.contextHints, format, sampleRate, channels: request.audio.channels }))\n\n const sendAudio = (async () => {\n if ('chunks' in request.audio) {\n for await (const part of request.audio.chunks)\n conn.send(part)\n }\n else {\n conn.send(request.audio.data)\n }\n conn.send(JSON.stringify({ type: 'done' }))\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.text)\n continue\n const event = JSON.parse(message.text) as AudioWsServerMessage\n if (event.type === 'transcript')\n yield { type: 'transcript', text: event.text, final: event.final }\n else if (event.type === 'speech_started')\n yield { type: 'speech_started' }\n else if (event.type === 'speech_stopped')\n yield { type: 'speech_stopped' }\n else if (event.type === 'error')\n throw audioClientError(event.code, event.message)\n else if (event.type === 'end')\n break\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n async function transcribe(request: TranscriptionRequest): Promise<TranscriptionResult> {\n // 完整识别:服务端缓冲全部音频后返回单条最终结果\n const conn = await openBrowserWs(await buildUrl({ operation: 'transcribe', model: request.model }), request.signal)\n try {\n conn.send(startMessage('transcribe', { stream: false, model: request.model, language: request.language, contextHints: request.contextHints, format: request.audio.format, sampleRate: request.audio.sampleRate, channels: request.audio.channels }))\n conn.send(request.audio.data)\n conn.send(JSON.stringify({ type: 'done' }))\n\n let text = ''\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = JSON.parse(message.text) as AudioWsServerMessage\n if (event.type === 'transcript')\n text = event.text\n else if (event.type === 'error')\n throw audioClientError(event.code, event.message)\n else if (event.type === 'end')\n break\n }\n return { text }\n }\n finally {\n conn.close()\n }\n }\n\n async function* synthesizeStream(request: SynthesisStreamRequest): AsyncIterable<SynthesisEvent> {\n const conn = await openBrowserWs(await buildUrl({ operation: 'synthesize', model: request.model }), request.signal)\n try {\n conn.send(startMessage('synthesize', { model: request.model, voice: request.voice, instruction: request.instruction, format: request.format, sampleRate: request.sampleRate }))\n\n const sendText = (async () => {\n const segments = isSynthesisTextSegment(request.text) ? singleSegment(request.text) : request.text\n for await (const segment of segments)\n conn.send(JSON.stringify({ type: 'text', segmentId: segment.id, text: segment.text }))\n conn.send(JSON.stringify({ type: 'done' }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n let activeSegmentId: string | undefined\n for await (const message of conn.messages()) {\n if (message.isBinary && message.binary) {\n if (!activeSegmentId)\n throw new Error('Audio frame received outside a synthesis segment')\n yield { type: 'audio', segmentId: activeSegmentId, data: message.binary }\n continue\n }\n if (!message.text)\n continue\n const event = JSON.parse(message.text) as AudioWsServerMessage\n if (event.type === 'segment_started') {\n if (activeSegmentId)\n throw new Error('Synthesis segment started before the previous segment completed')\n activeSegmentId = event.segmentId\n yield event\n }\n else if (event.type === 'segment_done') {\n if (activeSegmentId !== event.segmentId)\n throw new Error('Synthesis segment completion does not match the active segment')\n yield event\n activeSegmentId = undefined\n }\n else if (event.type === 'error') {\n throw audioClientError(event.code, event.message)\n }\n else if (event.type === 'end') {\n // 收到 end 但仍有未完成的合成段:视为本次合成失败,不得把部分音频当作成功结果\n if (activeSegmentId)\n throw audioClientError(HaiAIError.AUDIO_PROTOCOL_ERROR.code, 'Synthesis ended before the active segment completed')\n break\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n async function synthesize(request: SynthesisRequest): Promise<SynthesisResult> {\n const chunks: Uint8Array[] = []\n let meta: { format: SynthesisResult['format'], sampleRate?: number, channels?: 1 | 2 } | undefined\n for await (const event of synthesizeStream({ ...request, text: { id: 'synthesis', text: request.text } })) {\n if (event.type === 'segment_started')\n meta = { format: event.format, sampleRate: event.sampleRate, channels: event.channels }\n else if (event.type === 'audio')\n chunks.push(event.data)\n }\n // 音频格式来自服务端解析后的 Provider 真实输出(随 segment_started 下发),不由请求参数猜测\n if (!meta)\n throw audioClientError(HaiAIError.AUDIO_PROTOCOL_ERROR.code, 'Synthesis completed without segment metadata')\n const total = chunks.reduce((sum, c) => sum + c.length, 0)\n const data = new Uint8Array(total)\n let offset = 0\n for (const chunk of chunks) {\n data.set(chunk, offset)\n offset += chunk.length\n }\n return { data, format: meta.format, sampleRate: meta.sampleRate, channels: meta.channels ?? 1 }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream }\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"]}
@@ -1,4 +1,4 @@
1
- export { createAudioClient } from '../chunk-GMQFIWND.js';
2
- import '../chunk-HYMP57AC.js';
1
+ export { createAudioClient } from '../chunk-O6P4P5PC.js';
2
+ import '../chunk-M77C3VAP.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { r as AIFunctions, bK as McpServerOptions } from './ai-audio-ws-protocol-1VhScfis.js';
2
- export { A as A2AAgentCardConfig, a as A2AApiKeySecurity, b as A2AAuthenticator, c as A2ACallOptions, d as A2ACallResult, e as A2ACallerIdentity, f as A2AConfig, g as A2AConfigSchema, h as A2AContextInfo, i as A2AHandleResult, j as A2AMessageRecord, k as A2AOperations, l as A2ASecurityConfig, m as A2ASkillConfigSchema, n as A2ATaskFilter, o as AIConfig, p as AIConfigInput, q as AIConfigSchema, s as AIInitOptions, t as AIRelStore, u as AIRelStoreCompareAndSwap, v as AIRelStoreOptions, w as AIStoreProvider, x as AIVectorBackend, y as AIVectorStore, z as AIVersionedRecord, B as AUDIO_WS_PATH, C as ApiType, D as ApiTypeSchema, E as AskOptions, F as AssistantMessage, G as AudioConfig, H as AudioConfigSchema, I as AudioFormatSchema, J as AudioModelEntry, K as AudioModelEntrySchema, L as AudioOperation, M as AudioOperationSchema, N as AudioOperationsSchema, O as AudioProviderName, P as AudioProviderSchema, Q as AudioWsClientMessage, R as AudioWsClientMessageSchema, S as AudioWsDoneMessage, T as AudioWsDoneMessageSchema, U as AudioWsEndMessage, V as AudioWsErrorMessage, W as AudioWsSegmentDoneMessage, X as AudioWsSegmentStartedMessage, Y as AudioWsServerMessage, Z as AudioWsSpeechMessage, _ as AudioWsStartMessage, $ as AudioWsStartMessageSchema, a0 as AudioWsTextMessage, a1 as AudioWsTextMessageSchema, a2 as AudioWsTranscriptMessage, a3 as ChatCompletionChoice, a4 as ChatCompletionChunk, a5 as ChatCompletionDelta, a6 as ChatCompletionRequest, a7 as ChatCompletionResponse, a8 as ChatHistoryOptions, a9 as ChatMessage, aa as ChatRecord, ab as Citation, ac as CommitTurnInput, ad as CompressConfig, ae as CompressConfigSchema, af as CompressOperations, ag as CompressOptions, ah as CompressResult, ai as CompressionStrategy, aj as CompressionStrategySchema, ak as ConsolidateOptions, al as ConsolidateResult, am as ContextChatOptions, an as ContextChatResult, ao as ContextManager, ap as ContextManagerOptions, aq as ContextOperations, ar as ContextResetOptions, as as ContextStreamEvent, at as ConversationTurn, au as ConversationTurnStatus, av as DefineToolOptions, aw as DeveloperMessage, ax as EmbeddingConfig, ay as EmbeddingConfigSchema, az as EmbeddingItem, aA as EmbeddingOperations, aB as EmbeddingRequest, aC as EmbeddingResponse, aD as EntityDocumentRelation, aE as EntityDocumentResult, aF as EntityListOptions, aG as EntityQueryOptions, aH as EntityType, aI as EntityTypeSchema, aJ as FileConfig, aK as FileConfigSchema, aL as FileOperations, aM as FileParseMethod, aN as FileParseOptions, aO as FileParseRequest, aP as FileParseResult, aQ as GenerateImageRequest, aR as GenerateImageResult, aS as GenerateObjectRequest, aT as GeneratedImage, aU as HaiAIError, aV as ImageConfig, aW as ImageConfigSchema, aX as ImageContent, aY as ImageModelEntry, aZ as ImageModelEntrySchema, a_ as ImageOperations, a$ as ImageProviderName, b0 as ImageProviderSchema, b1 as ImageSize, b2 as InteractionScope, b3 as KnowledgeAskOptions, b4 as KnowledgeAskResult, b5 as KnowledgeConfig, b6 as KnowledgeConfigSchema, b7 as KnowledgeDocumentInfo, b8 as KnowledgeDocumentListOptions, b9 as KnowledgeDocumentMetadata, ba as KnowledgeDocumentRemoveOptions, bb as KnowledgeDocumentRevision, bc as KnowledgeEntity, bd as KnowledgeIngestBatchProgress, be as KnowledgeIngestBatchResult, bf as KnowledgeIngestFileInput, bg as KnowledgeIngestInput, bh as KnowledgeIngestResult, bi as KnowledgeOperations, bj as KnowledgeRepairOptions, bk as KnowledgeRepairProgress, bl as KnowledgeRepairResult, bm as KnowledgeRetrieveItem, bn as KnowledgeRetrieveOptions, bo as KnowledgeRetrieveResult, bp as KnowledgeSetupOptions, bq as KnowledgeStore, br as LLMConfig, bs as LLMConfigSchema, bt as LLMOperations, bu as MCPConfig, bv as MCPConfigSchema, bw as MCPContext, bx as MCPOperations, by as MCPPrompt, bz as MCPPromptArgument, bA as MCPPromptContent, bB as MCPPromptMessage, bC as MCPResource, bD as MCPResourceContent, bE as MCPServerCapabilities, bF as MCPServerCapabilitiesSchema, bG as MCPServerConfig, bH as MCPServerConfigSchema, bI as MCPToolDefinition, bJ as MCPToolHandler, bL as MemoryAccessScope, bM as MemoryAdminOperations, bN as MemoryClearAllOptions, bO as MemoryClearOptions, bP as MemoryConfig, bQ as MemoryConfigSchema, bR as MemoryCoreOperations, bS as MemoryEntry, bT as MemoryEntryInput, bU as MemoryExtractOptions, bV as MemoryInjectionOptions, bW as MemoryListOptions, bX as MemoryListPageOptions, bY as MemoryOperations, bZ as MemoryRecallOptions, b_ as MemoryType, b$ as MemoryTypeSchema, c0 as MemoryUpdateInput, c1 as MessageContent, c2 as MessageRole, c3 as ModelEntry, c4 as ModelEntrySchema, c5 as ModelScenario, c6 as ModelScenarioSchema, c7 as ObjectRef, c8 as OptionalSecretSchema, c9 as OutputFormat, ca as PersonaOperations, cb as PersonaProfile, cc as PersonaProfileInput, cd as PersonaProfileUpdate, ce as PersonaScopeOptions, cf as RagContextItem, cg as RagOperations, ch as RagOptions, ci as RagResult, cj as RagStreamEvent, ck as ReasoningOperations, cl as ReasoningOptions, cm as ReasoningResult, cn as ReasoningStep, co as ReasoningStepType, cp as ReasoningStrategy, cq as ReasoningStreamEvent, cr as ReferenceImage, cs as RerankDocument, ct as RerankItem, cu as RerankOperations, cv as RerankRequest, cw as RerankResponse, cx as ResolveRequiredModelEntryOptions, cy as ResolvedAudioModel, cz as ResolvedImageModel, cA as ResolvedModelConfig, cB as RetrievalConfig, cC as RetrievalConfigSchema, cD as RetrievalOperations, cE as RetrievalRequest, cF as RetrievalResult, cG as RetrievalResultItem, cH as RetrievalSource, cI as RetrievalSourceConfig, cJ as RetrievalSourceSchema, cK as SSEDecoder, cL as SSEEvent, cM as ScopedMemoryBinding, cN as ScopedMemoryOperations, cO as SessionInfo, cP as StoreFilter, cQ as StorePage, cR as StoreScope, cS as StreamOperations, cT as StreamProcessor, cU as StreamResult, cV as SummaryConfig, cW as SummaryConfigSchema, cX as SummaryOperations, cY as SummaryOptions, cZ as SummaryResult, c_ as SystemMessage, c$ as TempModelConfig, d0 as TextContent, d1 as TokenConfig, d2 as TokenConfigSchema, d3 as TokenOperations, d4 as TokenUsage, d5 as Tool, d6 as ToolAuthorizationRequest, d7 as ToolAuthorizer, d8 as ToolCall, d9 as ToolDefinition, da as ToolErrorType, db as ToolExecutionContext, dc as ToolExecutionOptions, dd as ToolMessage, de as ToolRegistryOperations, df as ToolRegistryOptions, dg as ToolsOperations, dh as UserMessage, di as WhereClause, dj as WhereOperator, dk as WhereValue, dl as ensureAudioCredential, dm as resolveAudioModel, dn as resolveImageModel, dp as resolveModelApi, dq as resolveModelEntry, dr as serializePlayableAudio } from './ai-audio-ws-protocol-1VhScfis.js';
1
+ import { I as AIFunctions, c7 as McpServerOptions } from './ai-acp-types-DQ8jO9Ie.js';
2
+ export { A as A2AAgentCardConfig, a as A2AApiKeySecurity, b as A2AAuthenticator, c as A2ACallOptions, d as A2ACallResult, e as A2ACallerIdentity, f as A2AConfig, g as A2AConfigSchema, h as A2AContextInfo, i as A2AHandleResult, j as A2AMessageRecord, k as A2AOperations, l as A2ASecurityConfig, m as A2ASkillConfigSchema, n as A2ATaskFilter, o as ACPAgentAdapter, p as ACPAgentAdapterInput, q as ACPAgentLaunch, r as ACPAgentSchema, s as ACPClientOptions, t as ACPConfig, u as ACPConfigInput, v as ACPConfigSchema, w as ACPCreateSessionOptions, x as ACPGitReport, y as ACPOperations, z as ACPPublishSchema, B as ACPRepositorySchema, C as ACPSessionInfo, D as ACPTransport, E as ACPWorkspaceSchema, F as AIConfig, G as AIConfigInput, H as AIConfigSchema, J as AIInitOptions, K as AIRelStore, L as AIRelStoreCompareAndSwap, M as AIRelStoreOptions, N as AIResourceEntry, O as AIResourceRegistry, P as AIStoreProvider, Q as AIVectorBackend, R as AIVectorStore, S as AIVersionedRecord, T as AUDIO_WS_PATH, U as ApiType, V as ApiTypeSchema, W as AskOptions, X as AssistantMessage, Y as AudioConfig, Z as AudioConfigSchema, _ as AudioFormatSchema, $ as AudioModelEntry, a0 as AudioModelEntrySchema, a1 as AudioOperation, a2 as AudioOperationSchema, a3 as AudioOperationsSchema, a4 as AudioProviderName, a5 as AudioProviderSchema, a6 as AudioWsClientMessage, a7 as AudioWsClientMessageSchema, a8 as AudioWsDoneMessage, a9 as AudioWsDoneMessageSchema, aa as AudioWsEndMessage, ab as AudioWsErrorMessage, ac as AudioWsSegmentDoneMessage, ad as AudioWsSegmentStartedMessage, ae as AudioWsServerMessage, af as AudioWsSpeechMessage, ag as AudioWsStartMessage, ah as AudioWsStartMessageSchema, ai as AudioWsTextMessage, aj as AudioWsTextMessageSchema, ak as AudioWsTranscriptMessage, al as ChatCompletionChoice, am as ChatCompletionChunk, an as ChatCompletionDelta, ao as ChatCompletionRequest, ap as ChatCompletionResponse, aq as ChatHistoryOptions, ar as ChatMessage, as as ChatRecord, at as Citation, au as CommitTurnInput, av as CompressConfig, aw as CompressConfigSchema, ax as CompressOperations, ay as CompressOptions, az as CompressResult, aA as CompressionStrategy, aB as CompressionStrategySchema, aC as ConsolidateOptions, aD as ConsolidateResult, aE as ContextChatOptions, aF as ContextChatResult, aG as ContextManager, aH as ContextManagerOptions, aI as ContextOperations, aJ as ContextResetOptions, aK as ContextStreamEvent, aL as ConversationTurn, aM as ConversationTurnStatus, aN as DefineToolOptions, aO as DeveloperMessage, aP as EmbeddingConfig, aQ as EmbeddingConfigSchema, aR as EmbeddingItem, aS as EmbeddingOperations, aT as EmbeddingRequest, aU as EmbeddingResponse, aV as EntityDocumentRelation, aW as EntityDocumentResult, aX as EntityListOptions, aY as EntityQueryOptions, aZ as EntityType, a_ as EntityTypeSchema, a$ as FileConfig, b0 as FileConfigSchema, b1 as FileOperations, b2 as FileParseMethod, b3 as FileParseOptions, b4 as FileParseRequest, b5 as FileParseResult, b6 as GenerateImageRequest, b7 as GenerateImageResult, b8 as GenerateObjectRequest, b9 as GeneratedImage, ba as HaiAIError, bb as ImageConfig, bc as ImageConfigSchema, bd as ImageContent, be as ImageModelEntry, bf as ImageModelEntrySchema, bg as ImageOperations, bh as ImageProviderName, bi as ImageProviderSchema, bj as ImageSize, bk as InteractionScope, bl as KnowledgeAskOptions, bm as KnowledgeAskResult, bn as KnowledgeConfig, bo as KnowledgeConfigSchema, bp as KnowledgeDocumentInfo, bq as KnowledgeDocumentListOptions, br as KnowledgeDocumentMetadata, bs as KnowledgeDocumentRemoveOptions, bt as KnowledgeDocumentRevision, bu as KnowledgeEntity, bv as KnowledgeIngestBatchProgress, bw as KnowledgeIngestBatchResult, bx as KnowledgeIngestFileInput, by as KnowledgeIngestInput, bz as KnowledgeIngestResult, bA as KnowledgeOperations, bB as KnowledgeRepairOptions, bC as KnowledgeRepairProgress, bD as KnowledgeRepairResult, bE as KnowledgeRetrieveItem, bF as KnowledgeRetrieveOptions, bG as KnowledgeRetrieveResult, bH as KnowledgeSetupOptions, bI as KnowledgeStore, bJ as LLMConfig, bK as LLMConfigSchema, bL as LLMOperations, bM as MCPConfig, bN as MCPConfigSchema, bO as MCPContext, bP as MCPExternalServer, bQ as MCPExternalServerSchema, bR as MCPOperations, bS as MCPPrompt, bT as MCPPromptArgument, bU as MCPPromptContent, bV as MCPPromptMessage, bW as MCPResource, bX as MCPResourceContent, bY as MCPServerCapabilities, bZ as MCPServerCapabilitiesSchema, b_ as MCPServerConfig, b$ as MCPServerConfigSchema, c0 as MCPToolDefinition, c1 as MCPToolHandler, c2 as ManagedAudioOperations, c3 as ManagedImageOperations, c4 as ManagedLLMOperations, c5 as ManagedMCPOperations, c6 as ManagedRetrievalOperations, c8 as MemoryAccessScope, c9 as MemoryAdminOperations, ca as MemoryClearAllOptions, cb as MemoryClearOptions, cc as MemoryConfig, cd as MemoryConfigSchema, ce as MemoryCoreOperations, cf as MemoryEntry, cg as MemoryEntryInput, ch as MemoryExtractOptions, ci as MemoryInjectionOptions, cj as MemoryListOptions, ck as MemoryListPageOptions, cl as MemoryOperations, cm as MemoryRecallOptions, cn as MemoryType, co as MemoryTypeSchema, cp as MemoryUpdateInput, cq as MessageContent, cr as MessageRole, cs as ModelCapabilitiesSchema, ct as ModelEntry, cu as ModelEntrySchema, cv as ModelScenario, cw as ModelScenarioSchema, cx as ObjectRef, cy as OptionalSecretSchema, cz as OutputFormat, cA as PersonaOperations, cB as PersonaProfile, cC as PersonaProfileInput, cD as PersonaProfileUpdate, cE as PersonaScopeOptions, cF as RagContextItem, cG as RagOperations, cH as RagOptions, cI as RagResult, cJ as RagStreamEvent, cK as ReasoningOperations, cL as ReasoningOptions, cM as ReasoningResult, cN as ReasoningStep, cO as ReasoningStepType, cP as ReasoningStrategy, cQ as ReasoningStreamEvent, cR as ReferenceImage, cS as RerankDocument, cT as RerankItem, cU as RerankOperations, cV as RerankRequest, cW as RerankResponse, cX as ResolveRequiredModelEntryOptions, cY as ResolvedAudioModel, cZ as ResolvedImageModel, c_ as ResolvedModelConfig, c$ as RetrievalConfig, d0 as RetrievalConfigSchema, d1 as RetrievalOperations, d2 as RetrievalRequest, d3 as RetrievalResult, d4 as RetrievalResultItem, d5 as RetrievalSource, d6 as RetrievalSourceConfig, d7 as RetrievalSourceSchema, d8 as SSEDecoder, d9 as SSEEvent, da as ScopedMemoryBinding, db as ScopedMemoryOperations, dc as SessionInfo, dd as StoreFilter, de as StorePage, df as StoreScope, dg as StreamOperations, dh as StreamProcessor, di as StreamResult, dj as SummaryConfig, dk as SummaryConfigSchema, dl as SummaryOperations, dm as SummaryOptions, dn as SummaryResult, dp as SystemMessage, dq as TempModelConfig, dr as TextContent, ds as TokenConfig, dt as TokenConfigSchema, du as TokenOperations, dv as TokenUsage, dw as Tool, dx as ToolAuthorizationRequest, dy as ToolAuthorizer, dz as ToolCall, dA as ToolDefinition, dB as ToolErrorType, dC as ToolExecutionContext, dD as ToolExecutionOptions, dE as ToolMessage, dF as ToolRegistryOperations, dG as ToolRegistryOptions, dH as ToolsOperations, dI as UserMessage, dJ as WhereClause, dK as WhereOperator, dL as WhereValue, dM as ensureAudioCredential, dN as resolveAudioModel, dO as resolveImageModel, dP as resolveModelApi, dQ as resolveModelEntry, dR as serializePlayableAudio } from './ai-acp-types-DQ8jO9Ie.js';
3
3
  export { A as AudioCapabilitiesRequest, a as AudioContent, b as AudioFormat, c as AudioInputStream, d as AudioModelCapabilities, e as AudioOperations, f as AudioReference, P as PlayableAudio, S as SynthesisEvent, g as SynthesisOptions, h as SynthesisRequest, i as SynthesisResult, j as SynthesisStreamRequest, k as SynthesisTextSegment, T as TranscriptionEvent, l as TranscriptionOptions, m as TranscriptionRequest, n as TranscriptionResult, o as TranscriptionSegment, p as TranscriptionStreamRequest, q as TranscriptionTimestampGranularity, r as TranscriptionWord } from './ai-audio-types-4R5yUAVl.js';
4
4
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
5
  export { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
@@ -10,18 +10,12 @@ export { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
10
10
  export { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
11
11
  import '@h-ai/core';
12
12
  import 'zod';
13
- import 'openai';
14
13
  import 'node:buffer';
15
14
  import '@h-ai/datapipe';
16
- import '@modelcontextprotocol/sdk/types.js';
17
15
  import 'zod/v4/core';
18
-
19
- /**
20
- * @h-ai/ai — AI 服务主入口
21
- *
22
- * 提供统一的 `ai` 对象,聚合所有 AI 操作功能。
23
- * @module ai-main
24
- */
16
+ import '@agentclientprotocol/sdk';
17
+ import 'openai';
18
+ import '@modelcontextprotocol/sdk/types.js';
25
19
 
26
20
  /**
27
21
  * AI 服务对象,统一的 AI 访问入口