@h-ai/ai 0.1.0-alpha.13 → 0.1.0-alpha.16

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/README.md CHANGED
@@ -1404,76 +1404,62 @@ const prompt = await ai.mcp.getPrompt('greet', { name: '张三' })
1404
1404
 
1405
1405
  ---
1406
1406
 
1407
- ## 前端客户端 — `createAIClient`
1407
+ ## 前端客户端 — typed API client
1408
1408
 
1409
- > 浏览器端轻量客户端,通过 API 代理层与后端 AI 通信。
1409
+ > 浏览器 / App 端通过 `@h-ai/api-client` 调用由 `@h-ai/api-contract` 定义、`@h-ai/serv` 挂载的 AI HTTP API。`@h-ai/ai/client` 中的低层 helper 只适用于应用自定义了 `post/stream` 适配器的场景;标准公共 API 请优先使用 typed client。
1410
1410
 
1411
1411
  ```ts
1412
- import { createAIClient } from '@h-ai/ai/client'
1413
- import { api } from '@h-ai/api-client'
1412
+ import { apiClient } from '@h-ai/api-client'
1414
1413
 
1415
- await api.init({ baseUrl: '/api' })
1416
- const client = createAIClient({ api })
1414
+ await apiClient.init({ baseUrl: '/api/v1', auth: {} })
1417
1415
  ```
1418
1416
 
1419
1417
  ### 非流式对话
1420
1418
 
1421
1419
  ```ts
1422
- const response = await client.chat({
1420
+ const response = await apiClient.ai.chats.createCompletion({
1423
1421
  messages: [{ role: 'user', content: '你好' }],
1424
1422
  })
1425
- // response: ChatCompletionResponse(同服务端返回结构)
1423
+ if (response.success) {
1424
+ // response.data: ChatCompletionResponse(同服务端返回结构)
1425
+ }
1426
1426
  ```
1427
1427
 
1428
1428
  ### 流式对话
1429
1429
 
1430
- ```ts
1431
- for await (const chunk of client.chatStream({ messages }, {
1432
- onProgress: (progress) => {
1433
- // progress.content — 已累积的内容
1434
- // progress.done — 是否结束
1435
- // progress.finishReason — 结束原因
1436
- },
1437
- })) {
1438
- const delta = chunk.choices[0]?.delta?.content
1439
- if (delta) {
1440
- updateUI(delta)
1441
- }
1442
- }
1443
- ```
1430
+ 标准 `api-client` 不提供旧式通用流式方法;如需 SSE 流式输出,请在应用服务端显式暴露自定义流式 endpoint,再用 `fetch` / `apiFetch` 消费。
1444
1431
 
1445
1432
  ### 便捷方式
1446
1433
 
1447
1434
  ```ts
1448
1435
  // 发送单条消息,返回回复文本
1449
- const reply = await client.sendMessage('你好', '你是一个翻译助手')
1450
-
1451
- // 流式发送,返回完整回复文本
1452
- const reply = await client.sendMessageStream('写一首诗', {
1453
- onProgress: p => updateUI(p.content),
1454
- })
1436
+ const reply = await apiClient.ai.chats.sendMessage({ message: '你好', systemPrompt: '你是一个翻译助手' })
1455
1437
  ```
1456
1438
 
1457
1439
  ### 记忆与会话查询
1458
1440
 
1459
1441
  ```ts
1460
1442
  // 检索相关记忆
1461
- const memories = await client.recallMemories('用户偏好', {
1443
+ const memories = await apiClient.ai.memories.recall({
1444
+ query: '用户偏好',
1462
1445
  topK: 5,
1463
1446
  objectId: 'user-001',
1464
1447
  })
1465
1448
 
1466
1449
  // 分页列出记忆
1467
- const page = await client.listMemories({
1450
+ const page = await apiClient.ai.memories.list({
1468
1451
  objectId: 'user-001',
1469
- offset: 0,
1470
1452
  limit: 20,
1471
1453
  })
1472
- // page.items: MemoryEntry[], page.total: number
1454
+ if (page.success) {
1455
+ // page.data.items: MemoryEntry[]
1456
+ }
1473
1457
 
1474
1458
  // 列出某对象的所有会话
1475
- const sessions = await client.listSessions('user-001')
1476
- // sessions: SessionInfo[]
1459
+ const sessions = await apiClient.ai.sessions.list({ objectId: 'user-001' })
1460
+ if (sessions.success) {
1461
+ // sessions.data.items: SessionInfo[]
1462
+ }
1477
1463
  ```
1478
1464
 
1479
1465
  ---
package/dist/browser.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { A2AConfigSchema, A2ASkillConfigSchema, AIConfigSchema, CompressConfigSchema, CompressionStrategySchema, EmbeddingConfigSchema, EntityTypeSchema, FileConfigSchema, HaiAIError, KnowledgeConfigSchema, LLMConfigSchema, MCPConfigSchema, MCPServerCapabilitiesSchema, MCPServerConfigSchema, MemoryConfigSchema, MemoryTypeSchema, ModelEntrySchema, ModelScenarioSchema, RetrievalConfigSchema, RetrievalSourceSchema, SummaryConfigSchema, TokenConfigSchema, resolveModelEntry } from './chunk-UCG4OLAP.js';
2
- export { collectStreamContent, createA2AClient, createAIClient, parseSSE } from './chunk-ABP7RKIP.js';
2
+ export { collectStreamContent, createA2AClient, createAIClient, parseSSE } from './chunk-Y5BQR7QA.js';
3
3
  //# sourceMappingURL=browser.js.map
4
4
  //# sourceMappingURL=browser.js.map
@@ -307,5 +307,5 @@ async function collectStreamContent(stream) {
307
307
  }
308
308
 
309
309
  export { collectStreamContent, createA2AClient, createAIClient, parseSSE };
310
- //# sourceMappingURL=chunk-ABP7RKIP.js.map
311
- //# sourceMappingURL=chunk-ABP7RKIP.js.map
310
+ //# sourceMappingURL=chunk-Y5BQR7QA.js.map
311
+ //# sourceMappingURL=chunk-Y5BQR7QA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/ai-a2a-client.ts","../src/client/ai-client.ts"],"names":[],"mappings":";AAiCA,IAAM,QAAA,GAAW;AAAA,EACf,SAAA,EAAW,iBAAA;AAAA,EACX,QAAA,EAAU,eAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAUO,SAAS,gBAAgB,GAAA,EAAwC;AACtE,EAAA,OAAO;AAAA,IACL,MAAM,YAAA,GAA4C;AAChD,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAyB,SAAS,SAAS,CAAA;AACpE,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACtE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAAyH;AAC1I,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAkC,SAAS,QAAA,EAAU,MAAA,IAAU,EAAE,CAAA;AAC1F,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACrE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,OAAA,EAAiB,OAAA,EAAwD;AAChH,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAoB,SAAS,UAAA,EAAY;AAAA,QAChE,SAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAG;AAAA,OACJ,CAAA;AACD,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AAAA,GACF;AACF;;;AC4EA,IAAM,OAAA,GAAU;AAAA;AAAA,EAEd,IAAA,EAAM,UAAA;AAAA,EACN,UAAA,EAAY,iBAAA;AAAA,EACZ,WAAA,EAAa,kBAAA;AAAA,EACb,GAAA,EAAK,SAAA;AAAA,EACL,SAAA,EAAW,gBAAA;AAAA;AAAA,EAEX,iBAAA,EAAmB,wBAAA;AAAA,EACnB,YAAA,EAAc,mBAAA;AAAA,EACd,eAAA,EAAiB,sBAAA;AAAA,EACjB,kBAAA,EAAoB,yBAAA;AAAA,EACpB,uBAAA,EAAyB,gCAAA;AAAA;AAAA,EAEzB,YAAA,EAAc,mBAAA;AAAA,EACd,UAAA,EAAY,iBAAA;AAAA,EACZ,SAAA,EAAW,gBAAA;AAAA,EACX,YAAA,EAAc,mBAAA;AAAA,EACd,YAAA,EAAc,mBAAA;AAAA;AAAA,EAEd,QAAA,EAAU,cAAA;AAAA,EACV,aAAA,EAAe,qBAAA;AAAA,EACf,aAAA,EAAe,qBAAA;AAAA;AAAA,EAEf,QAAA,EAAU,eAAA;AAAA,EACV,cAAA,EAAgB,sBAAA;AAAA;AAAA,EAEhB,YAAA,EAAc,mBAAA;AAAA,EACd,kBAAA,EAAoB,0BAAA;AAAA;AAAA,EAEpB,aAAA,EAAe;AACjB,CAAA;AA0BO,SAAS,eAAe,MAAA,EAAkC;AAC/D,EAAA,MAAM,EAAE,KAAI,GAAI,MAAA;AAEhB,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,GAAA,EAA6D;AACtE,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAA6B,OAAA,CAAQ,IAAA,EAAM,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,CAAA;AAC7F,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,OAAO,UAAA,CACL,GAAA,EACA,OAAA,EACoC;AACpC,MAAA,IAAI,OAAA,GAAU,EAAA;AAEd,MAAA,WAAA,MAAiB,IAAA,IAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG;AACjF,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAA6B,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAClD,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA;AACvC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAA,IAAW,KAAA;AAAA,UACb;AACA,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,aAAA;AACvC,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,cAAc,CAAA;AAAA,UAC7D,CAAA,MACK;AACH,YAAA,OAAA,EAAS,UAAA,GAAa,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA;AAAA,UAChD;AACA,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,CAAA,MACM;AAAA,QAEN;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,OAAA,EAAiB,YAAA,EAAwC;AACzE,MAAA,MAAM,WAA0B,EAAC;AACjC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAAA,MACzD;AACA,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAChD,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,UAAU,CAAA;AAC7C,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,IAClD,CAAA;AAAA,IAEA,MAAM,iBAAA,CACJ,OAAA,EACA,OAAA,EACA,YAAA,EACiB;AACjB,MAAA,MAAM,WAA0B,EAAC;AACjC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAAA,MACzD;AACA,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAEhD,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,WAAA,MAAiB,SAAS,IAAA,CAAK,UAAA,CAAW,EAAE,QAAA,EAAS,EAAG,OAAO,CAAA,EAAG;AAChE,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA;AACvC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAA,IAAW,KAAA;AAAA,QACb;AAAA,MACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,cAAA,CAAe,KAAA,EAAe,OAAA,EAAkH;AACpJ,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAA+B,OAAA,CAAQ,cAAc,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA;AACnG,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,OAAO,OAAO,IAAA,CAAK,KAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,aAAa,OAAA,EAAqH;AACtI,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAA6B,QAAQ,UAAA,EAAY,OAAA,IAAW,EAAE,CAAA;AACvF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,aAAa,QAAA,EAA0C;AAC3D,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAA+B,QAAQ,QAAA,EAAU,EAAE,UAAU,CAAA;AACtF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAChE;AACA,MAAA,OAAO,OAAO,IAAA,CAAK,KAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,QAAA,EAAkB,SAAA,EAAmB,OAAA,EAA6E;AAClI,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAA8B,OAAA,CAAQ,WAAA,EAAa,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,OAAA,EAAS,CAAA;AAC/G,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAChE;AACA,MAAA,OAAO,OAAO,IAAA,CAAK,KAAA;AAAA,IACrB,CAAA;AAAA;AAAA,IAIA,MAAM,GAAA,CAAI,QAAA,EAAkB,OAAA,EAAsE;AAChG,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAuB,OAAA,CAAQ,KAAK,EAAE,QAAA,EAAU,GAAG,OAAA,EAAS,CAAA;AACrF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC1D;AACA,MAAA,OAAO,OAAO,IAAA,CAAK,IAAA;AAAA,IACrB,CAAA;AAAA,IAEA,OAAO,SAAA,CAAU,QAAA,EAAkB,OAAA,EAA4E;AAC7G,MAAA,WAAA,MAAiB,IAAA,IAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,QAAA,EAAU,GAAG,OAAA,EAAS,CAAA,EAAG;AAChF,QAAA,MAAM,IAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA;AAAA,IAIA,MAAM,iBAAA,CAAkB,KAAA,EAAe,OAAA,EAAoF;AACzH,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAA8B,OAAA,CAAQ,mBAAmB,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA;AACvG,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACtE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,YAAA,CAAa,KAAA,EAAe,OAAA,EAAgF;AAChH,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAyB,OAAA,CAAQ,cAAc,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA;AAC7F,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,gBAAgB,KAAA,EAAyJ;AAC7K,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,IAAA,CAA4B,OAAA,CAAQ,iBAAiB,KAAK,CAAA;AACnF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACpE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,uBAAuB,OAAA,EAAsG;AACjI,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAyC,QAAQ,kBAAA,EAAoB,OAAA,IAAW,EAAE,CAAA;AAC3G,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AACA,MAAA,OAAO,OAAO,IAAA,CAAK,KAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,uBAAA,CAAwB,UAAA,EAAoB,OAAA,EAAkD;AAClG,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAW,OAAA,CAAQ,yBAAyB,EAAE,UAAA,EAAY,GAAG,OAAA,EAAS,CAAA;AAC/F,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC7E;AAAA,IACF,CAAA;AAAA;AAAA,IAIA,MAAM,UAAU,KAAA,EAA+C;AAC7D,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,IAAA,CAAkB,OAAA,CAAQ,WAAW,KAAK,CAAA;AACnE,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC9D;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,YAAA,CAAa,QAAA,EAAkB,OAAA,EAAkD;AACrF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAkB,OAAA,CAAQ,cAAc,EAAE,QAAA,EAAU,GAAG,OAAA,EAAS,CAAA;AACzF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,aAAa,QAAA,EAAiC;AAClD,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAW,QAAQ,YAAA,EAAc,EAAE,UAAU,CAAA;AACtE,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACjE;AAAA,IACF,CAAA;AAAA;AAAA,IAIA,MAAM,aAAA,CAAc,SAAA,EAAmB,KAAA,EAA8B;AACnE,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAW,QAAQ,aAAA,EAAe,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAC/E,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,cAAc,SAAA,EAAkC;AACpD,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAW,QAAQ,aAAA,EAAe,EAAE,WAAW,CAAA;AACxE,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF,CAAA;AAAA;AAAA,IAIA,MAAM,QAAA,CAAS,KAAA,EAAe,OAAA,EAAsF;AAClH,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAgB,OAAA,CAAQ,UAAU,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA;AAChF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC7D;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,OAAO,cAAA,CAAe,KAAA,EAAe,OAAA,EAAyF;AAC5H,MAAA,WAAA,MAAiB,IAAA,IAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA,EAAG;AAClF,QAAA,MAAM,IAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA;AAAA,IAIA,MAAM,YAAA,CAAa,KAAA,EAAe,OAAA,EAA2E;AAC3G,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAsB,OAAA,CAAQ,cAAc,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA;AAC1F,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,OAAO,kBAAA,CAAmB,KAAA,EAAe,OAAA,EAAwE;AAC/G,MAAA,WAAA,MAAiB,IAAA,IAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,kBAAA,EAAoB,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA,EAAG;AACtF,QAAA,MAAM,IAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA;AAAA,IAIA,MAAM,eAAe,IAAA,EAA2C;AAC9D,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,CAAyB,QAAQ,aAAA,EAAe,EAAE,MAAM,CAAA;AACjF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AAAA,GACF;AACF;AAoBA,gBAAuB,SAAS,QAAA,EAA2C;AACzE,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA;AACF,QAAA;AAEF,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,UAAA,IAAI,SAAS,QAAA,EAAU;AACrB,YAAA,MAAM,IAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,SACA;AACE,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAiBA,eAAsB,qBACpB,MAAA,EACiB;AACjB,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA;AACvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,IAAW,KAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT","file":"chunk-Y5BQR7QA.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` 的 `apiClient` 默认单例(鸭子类型)。\n * 传入 `apiClient` 默认单例即可,无需额外适配。\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 { apiClient } from '@h-ai/api-client'\n * import { createAIClient } from '@h-ai/ai/client'\n *\n * await apiClient.init({ baseUrl: '/api', auth: { ... } })\n * const aiClient = createAIClient({ api: apiClient })\n * ```\n */\nexport interface AIClientConfig {\n /**\n * API 调用适配器\n *\n * 传入 `apiClient` 默认单例(初始化后)。\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 { apiClient } from '@h-ai/api-client'\n * import { createAIClient } from '@h-ai/ai/client'\n *\n * await apiClient.init({ baseUrl: '/api' })\n * const client = createAIClient({ api: apiClient })\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"]}
@@ -17,8 +17,8 @@ import 'openai';
17
17
  /**
18
18
  * AI 客户端所需的 API 调用能力
19
19
  *
20
- * 结构兼容 `@h-ai/api-client` 的 `api` 单例(鸭子类型)。
21
- * 传入 `api` 单例即可,无需额外适配。
20
+ * 结构兼容 `@h-ai/api-client` 的 `apiClient` 默认单例(鸭子类型)。
21
+ * 传入 `apiClient` 默认单例即可,无需额外适配。
22
22
  */
23
23
  interface AIApiAdapter {
24
24
  /** POST 请求(返回 HaiResult) */
@@ -31,18 +31,18 @@ interface AIApiAdapter {
31
31
  *
32
32
  * @example
33
33
  * ```ts
34
- * import { api } from '@h-ai/api-client'
34
+ * import { apiClient } from '@h-ai/api-client'
35
35
  * import { createAIClient } from '@h-ai/ai/client'
36
36
  *
37
- * await api.init({ baseUrl: '/api', auth: { ... } })
38
- * const aiClient = createAIClient({ api })
37
+ * await apiClient.init({ baseUrl: '/api', auth: { ... } })
38
+ * const aiClient = createAIClient({ api: apiClient })
39
39
  * ```
40
40
  */
41
41
  interface AIClientConfig {
42
42
  /**
43
43
  * API 调用适配器
44
44
  *
45
- * 传入 `api` 单例(初始化后)。
45
+ * 传入 `apiClient` 默认单例(初始化后)。
46
46
  * baseUrl、Token 管理、超时等通过 api-client 配置。
47
47
  */
48
48
  api: AIApiAdapter;
@@ -185,11 +185,11 @@ interface AIClient {
185
185
  *
186
186
  * @example
187
187
  * ```ts
188
- * import { api } from '@h-ai/api-client'
188
+ * import { apiClient } from '@h-ai/api-client'
189
189
  * import { createAIClient } from '@h-ai/ai/client'
190
190
  *
191
- * await api.init({ baseUrl: '/api' })
192
- * const client = createAIClient({ api })
191
+ * await apiClient.init({ baseUrl: '/api' })
192
+ * const client = createAIClient({ api: apiClient })
193
193
  * const reply = await client.sendMessage('你好')
194
194
  * ```
195
195
  */
@@ -1,3 +1,3 @@
1
- export { collectStreamContent, createA2AClient, createAIClient, parseSSE } from '../chunk-ABP7RKIP.js';
1
+ export { collectStreamContent, createA2AClient, createAIClient, parseSSE } from '../chunk-Y5BQR7QA.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@h-ai/ai",
3
3
  "type": "module",
4
- "version": "0.1.0-alpha.13",
4
+ "version": "0.1.0-alpha.16",
5
5
  "description": "Hai Framework AI module (LLM, MCP, tools, and clients).",
6
6
  "license": "Apache-2.0",
7
7
  "exports": {
@@ -14,10 +14,6 @@
14
14
  "./client": {
15
15
  "types": "./dist/client/index.d.ts",
16
16
  "import": "./dist/client/index.js"
17
- },
18
- "./api": {
19
- "types": "./dist/api/index.d.ts",
20
- "import": "./dist/api/index.js"
21
17
  }
22
18
  },
23
19
  "main": "./dist/index.js",
@@ -35,12 +31,12 @@
35
31
  "nanoid": "^5.0.9",
36
32
  "openai": "^6.17.0",
37
33
  "zod": "^4.3.6",
38
- "@h-ai/core": "0.1.0-alpha.13"
34
+ "@h-ai/core": "0.1.0-alpha.16"
39
35
  },
40
36
  "optionalDependencies": {
41
- "@h-ai/datapipe": "0.1.0-alpha.13",
42
- "@h-ai/reldb": "0.1.0-alpha.13",
43
- "@h-ai/vecdb": "0.1.0-alpha.13"
37
+ "@h-ai/datapipe": "0.1.0-alpha.16",
38
+ "@h-ai/vecdb": "0.1.0-alpha.16",
39
+ "@h-ai/reldb": "0.1.0-alpha.16"
44
40
  },
45
41
  "devDependencies": {
46
42
  "@types/node": "^25.1.0",
@@ -1,628 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- /**
4
- * @h-ai/ai/api — AI API 端点契约定义
5
- *
6
- * 所有 ai 模块的 API 端点(path + method + schema),
7
- * 客户端和服务端都从此处引用,编译时保证一致性。
8
- *
9
- * 注意:`chatStream` 使用 SSE 流式协议,客户端应使用
10
- * `createAIClient().chatStream()` 而非 `api.call()`。
11
- * 此处定义仅用于服务端路由注册和文档生成。
12
- *
13
- * @module ai-api-contract
14
- */
15
-
16
- interface EndpointDef<TInput = unknown, TOutput = unknown> {
17
- method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
18
- path: string;
19
- input: z.ZodType<TInput>;
20
- output: z.ZodType<TOutput>;
21
- requireAuth?: boolean;
22
- meta?: {
23
- summary?: string;
24
- tags?: string[];
25
- streaming?: boolean;
26
- };
27
- }
28
- /**
29
- * ai 所有 API 端点
30
- *
31
- * @example
32
- * ```ts
33
- * // 客户端(非流式)
34
- * import { aiEndpoints } from '@h-ai/ai/api'
35
- * const result = await api.call(aiEndpoints.chat, { messages: [...] })
36
- *
37
- * // 客户端(流式)— 使用专用 AIClient
38
- * import { api } from '@h-ai/api-client'
39
- * import { createAIClient } from '@h-ai/ai/client'
40
- * await api.init({ baseUrl: '/api' })
41
- * const client = createAIClient({ api })
42
- * for await (const chunk of client.chatStream({ messages })) { ... }
43
- *
44
- * // 服务端
45
- * export const POST = kit.fromContract(aiEndpoints.chat, async (input) => {
46
- * const result = await ai.llm.chat(input)
47
- * return result.success ? result.data : kit.response.internalError(result.error.message)
48
- * })
49
- * ```
50
- */
51
- declare const aiEndpoints: {
52
- /** 聊天完成(非流式) */
53
- readonly chat: EndpointDef<{
54
- messages: {
55
- role: "system" | "user" | "assistant" | "tool";
56
- content?: string | ({
57
- type: "text";
58
- text: string;
59
- } | {
60
- type: "image_url";
61
- image_url: {
62
- url: string;
63
- detail?: "auto" | "low" | "high" | undefined;
64
- };
65
- })[] | undefined;
66
- name?: string | undefined;
67
- tool_calls?: {
68
- id: string;
69
- type: "function";
70
- function: {
71
- name: string;
72
- arguments: string;
73
- };
74
- }[] | undefined;
75
- tool_call_id?: string | undefined;
76
- }[];
77
- model?: string | undefined;
78
- temperature?: number | undefined;
79
- top_p?: number | undefined;
80
- max_tokens?: number | undefined;
81
- stream?: boolean | undefined;
82
- tools?: {
83
- type: "function";
84
- function: {
85
- name: string;
86
- description?: string | undefined;
87
- parameters?: {
88
- type: "object";
89
- properties?: Record<string, {
90
- type: string;
91
- description?: string | undefined;
92
- enum?: string[] | undefined;
93
- }> | undefined;
94
- required?: string[] | undefined;
95
- } | undefined;
96
- };
97
- }[] | undefined;
98
- tool_choice?: "auto" | "none" | {
99
- type: "function";
100
- function: {
101
- name: string;
102
- };
103
- } | undefined;
104
- }, {
105
- id: string;
106
- object: "chat.completion";
107
- created: number;
108
- model: string;
109
- choices: {
110
- index: number;
111
- message: {
112
- role: "assistant";
113
- content?: string | null | undefined;
114
- tool_calls?: {
115
- id: string;
116
- type: "function";
117
- function: {
118
- name: string;
119
- arguments: string;
120
- };
121
- }[] | undefined;
122
- };
123
- finish_reason: "tool_calls" | "stop" | "length" | "content_filter";
124
- }[];
125
- usage: {
126
- prompt_tokens: number;
127
- completion_tokens: number;
128
- total_tokens: number;
129
- };
130
- }>;
131
- /**
132
- * 聊天完成(流式 SSE)
133
- *
134
- * 此端点使用 Server-Sent Events 协议返回流式 chunk。
135
- * 客户端应使用 `createAIClient().chatStream()` 而非 `api.call()`。
136
- * 定义此契约用于服务端路由注册和 API 文档。
137
- */
138
- readonly chatStream: EndpointDef<{
139
- messages: {
140
- role: "system" | "user" | "assistant" | "tool";
141
- content?: string | ({
142
- type: "text";
143
- text: string;
144
- } | {
145
- type: "image_url";
146
- image_url: {
147
- url: string;
148
- detail?: "auto" | "low" | "high" | undefined;
149
- };
150
- })[] | undefined;
151
- name?: string | undefined;
152
- tool_calls?: {
153
- id: string;
154
- type: "function";
155
- function: {
156
- name: string;
157
- arguments: string;
158
- };
159
- }[] | undefined;
160
- tool_call_id?: string | undefined;
161
- }[];
162
- model?: string | undefined;
163
- temperature?: number | undefined;
164
- top_p?: number | undefined;
165
- max_tokens?: number | undefined;
166
- stream?: boolean | undefined;
167
- tools?: {
168
- type: "function";
169
- function: {
170
- name: string;
171
- description?: string | undefined;
172
- parameters?: {
173
- type: "object";
174
- properties?: Record<string, {
175
- type: string;
176
- description?: string | undefined;
177
- enum?: string[] | undefined;
178
- }> | undefined;
179
- required?: string[] | undefined;
180
- } | undefined;
181
- };
182
- }[] | undefined;
183
- tool_choice?: "auto" | "none" | {
184
- type: "function";
185
- function: {
186
- name: string;
187
- };
188
- } | undefined;
189
- }, unknown>;
190
- /** 简单消息(便捷接口,封装单轮对话) */
191
- readonly sendMessage: EndpointDef<{
192
- message: string;
193
- systemPrompt?: string | undefined;
194
- model?: string | undefined;
195
- temperature?: number | undefined;
196
- }, {
197
- content: string;
198
- model: string;
199
- usage?: {
200
- prompt_tokens: number;
201
- completion_tokens: number;
202
- total_tokens: number;
203
- } | undefined;
204
- }>;
205
- /** 记忆检索 */
206
- readonly memoryRecall: EndpointDef<{
207
- query: string;
208
- topK?: number | undefined;
209
- types?: ("custom" | "fact" | "preference" | "event" | "summary")[] | undefined;
210
- minImportance?: number | undefined;
211
- objectId?: string | undefined;
212
- }, {
213
- items: {
214
- id: string;
215
- content: string;
216
- type: "custom" | "fact" | "preference" | "event" | "summary";
217
- importance: number;
218
- createdAt: number;
219
- lastAccessedAt: number;
220
- accessCount: number;
221
- objectId?: string | undefined;
222
- metadata?: Record<string, unknown> | undefined;
223
- }[];
224
- }>;
225
- /** 记忆列表(分页) */
226
- readonly memoryList: EndpointDef<{
227
- types?: ("custom" | "fact" | "preference" | "event" | "summary")[] | undefined;
228
- objectId?: string | undefined;
229
- offset?: number | undefined;
230
- limit?: number | undefined;
231
- }, {
232
- items: {
233
- id: string;
234
- content: string;
235
- type: "custom" | "fact" | "preference" | "event" | "summary";
236
- importance: number;
237
- createdAt: number;
238
- lastAccessedAt: number;
239
- accessCount: number;
240
- objectId?: string | undefined;
241
- metadata?: Record<string, unknown> | undefined;
242
- }[];
243
- total: number;
244
- }>;
245
- /** 会话列表 */
246
- readonly sessionList: EndpointDef<{
247
- objectId: string;
248
- }, {
249
- items: {
250
- objectId: string;
251
- sessionId: string;
252
- createdAt: number;
253
- updatedAt: number;
254
- metadata?: Record<string, unknown> | undefined;
255
- }[];
256
- }>;
257
- /** 对话历史 */
258
- readonly chatHistory: EndpointDef<{
259
- objectId: string;
260
- sessionId: string;
261
- limit?: number | undefined;
262
- order?: "asc" | "desc" | undefined;
263
- }, {
264
- items: {
265
- id: string;
266
- objectId: string;
267
- sessionId: string;
268
- request: {
269
- model: string;
270
- messages: {
271
- role: "system" | "user" | "assistant" | "tool";
272
- content?: string | ({
273
- type: "text";
274
- text: string;
275
- } | {
276
- type: "image_url";
277
- image_url: {
278
- url: string;
279
- detail?: "auto" | "low" | "high" | undefined;
280
- };
281
- })[] | undefined;
282
- name?: string | undefined;
283
- tool_calls?: {
284
- id: string;
285
- type: "function";
286
- function: {
287
- name: string;
288
- arguments: string;
289
- };
290
- }[] | undefined;
291
- tool_call_id?: string | undefined;
292
- }[];
293
- };
294
- response: {
295
- content: string;
296
- finishReason: string;
297
- usage: {
298
- prompt_tokens: number;
299
- completion_tokens: number;
300
- total_tokens: number;
301
- };
302
- toolCalls?: {
303
- id: string;
304
- type: "function";
305
- function: {
306
- name: string;
307
- arguments: string;
308
- };
309
- }[] | undefined;
310
- };
311
- createdAt: number;
312
- duration: number;
313
- }[];
314
- }>;
315
- };
316
-
317
- /**
318
- * @h-ai/ai/api — AI API 契约 Schema
319
- *
320
- * 入参/出参 Schema,客户端和服务端共享的唯一真相源。
321
- * @module ai-api-schemas
322
- */
323
-
324
- /** 聊天消息 */
325
- declare const ChatMessageSchema: z.ZodObject<{
326
- role: z.ZodEnum<{
327
- system: "system";
328
- user: "user";
329
- assistant: "assistant";
330
- tool: "tool";
331
- }>;
332
- content: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
333
- type: z.ZodLiteral<"text">;
334
- text: z.ZodString;
335
- }, z.core.$strip>, z.ZodObject<{
336
- type: z.ZodLiteral<"image_url">;
337
- image_url: z.ZodObject<{
338
- url: z.ZodString;
339
- detail: z.ZodOptional<z.ZodEnum<{
340
- auto: "auto";
341
- low: "low";
342
- high: "high";
343
- }>>;
344
- }, z.core.$strip>;
345
- }, z.core.$strip>]>>]>>;
346
- name: z.ZodOptional<z.ZodString>;
347
- tool_calls: z.ZodOptional<z.ZodArray<z.ZodObject<{
348
- id: z.ZodString;
349
- type: z.ZodLiteral<"function">;
350
- function: z.ZodObject<{
351
- name: z.ZodString;
352
- arguments: z.ZodString;
353
- }, z.core.$strip>;
354
- }, z.core.$strip>>>;
355
- tool_call_id: z.ZodOptional<z.ZodString>;
356
- }, z.core.$strip>;
357
- /** 聊天完成请求入参 */
358
- declare const ChatCompletionInputSchema: z.ZodObject<{
359
- model: z.ZodOptional<z.ZodString>;
360
- messages: z.ZodArray<z.ZodObject<{
361
- role: z.ZodEnum<{
362
- system: "system";
363
- user: "user";
364
- assistant: "assistant";
365
- tool: "tool";
366
- }>;
367
- content: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
368
- type: z.ZodLiteral<"text">;
369
- text: z.ZodString;
370
- }, z.core.$strip>, z.ZodObject<{
371
- type: z.ZodLiteral<"image_url">;
372
- image_url: z.ZodObject<{
373
- url: z.ZodString;
374
- detail: z.ZodOptional<z.ZodEnum<{
375
- auto: "auto";
376
- low: "low";
377
- high: "high";
378
- }>>;
379
- }, z.core.$strip>;
380
- }, z.core.$strip>]>>]>>;
381
- name: z.ZodOptional<z.ZodString>;
382
- tool_calls: z.ZodOptional<z.ZodArray<z.ZodObject<{
383
- id: z.ZodString;
384
- type: z.ZodLiteral<"function">;
385
- function: z.ZodObject<{
386
- name: z.ZodString;
387
- arguments: z.ZodString;
388
- }, z.core.$strip>;
389
- }, z.core.$strip>>>;
390
- tool_call_id: z.ZodOptional<z.ZodString>;
391
- }, z.core.$strip>>;
392
- temperature: z.ZodOptional<z.ZodNumber>;
393
- top_p: z.ZodOptional<z.ZodNumber>;
394
- max_tokens: z.ZodOptional<z.ZodNumber>;
395
- stream: z.ZodOptional<z.ZodBoolean>;
396
- tools: z.ZodOptional<z.ZodArray<z.ZodObject<{
397
- type: z.ZodLiteral<"function">;
398
- function: z.ZodObject<{
399
- name: z.ZodString;
400
- description: z.ZodOptional<z.ZodString>;
401
- parameters: z.ZodOptional<z.ZodObject<{
402
- type: z.ZodLiteral<"object">;
403
- properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
404
- type: z.ZodString;
405
- description: z.ZodOptional<z.ZodString>;
406
- enum: z.ZodOptional<z.ZodArray<z.ZodString>>;
407
- }, z.core.$strip>>>;
408
- required: z.ZodOptional<z.ZodArray<z.ZodString>>;
409
- }, z.core.$strip>>;
410
- }, z.core.$strip>;
411
- }, z.core.$strip>>>;
412
- tool_choice: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodLiteral<"none">, z.ZodObject<{
413
- type: z.ZodLiteral<"function">;
414
- function: z.ZodObject<{
415
- name: z.ZodString;
416
- }, z.core.$strip>;
417
- }, z.core.$strip>]>>;
418
- }, z.core.$strip>;
419
- /** 聊天完成响应出参 */
420
- declare const ChatCompletionOutputSchema: z.ZodObject<{
421
- id: z.ZodString;
422
- object: z.ZodLiteral<"chat.completion">;
423
- created: z.ZodNumber;
424
- model: z.ZodString;
425
- choices: z.ZodArray<z.ZodObject<{
426
- index: z.ZodNumber;
427
- message: z.ZodObject<{
428
- role: z.ZodLiteral<"assistant">;
429
- content: z.ZodOptional<z.ZodNullable<z.ZodString>>;
430
- tool_calls: z.ZodOptional<z.ZodArray<z.ZodObject<{
431
- id: z.ZodString;
432
- type: z.ZodLiteral<"function">;
433
- function: z.ZodObject<{
434
- name: z.ZodString;
435
- arguments: z.ZodString;
436
- }, z.core.$strip>;
437
- }, z.core.$strip>>>;
438
- }, z.core.$strip>;
439
- finish_reason: z.ZodEnum<{
440
- tool_calls: "tool_calls";
441
- stop: "stop";
442
- length: "length";
443
- content_filter: "content_filter";
444
- }>;
445
- }, z.core.$strip>>;
446
- usage: z.ZodObject<{
447
- prompt_tokens: z.ZodNumber;
448
- completion_tokens: z.ZodNumber;
449
- total_tokens: z.ZodNumber;
450
- }, z.core.$strip>;
451
- }, z.core.$strip>;
452
- /** 简单消息请求入参(便捷接口) */
453
- declare const SendMessageInputSchema: z.ZodObject<{
454
- message: z.ZodString;
455
- systemPrompt: z.ZodOptional<z.ZodString>;
456
- model: z.ZodOptional<z.ZodString>;
457
- temperature: z.ZodOptional<z.ZodNumber>;
458
- }, z.core.$strip>;
459
- /** 简单消息响应出参 */
460
- declare const SendMessageOutputSchema: z.ZodObject<{
461
- content: z.ZodString;
462
- model: z.ZodString;
463
- usage: z.ZodOptional<z.ZodObject<{
464
- prompt_tokens: z.ZodNumber;
465
- completion_tokens: z.ZodNumber;
466
- total_tokens: z.ZodNumber;
467
- }, z.core.$strip>>;
468
- }, z.core.$strip>;
469
- /** 记忆检索请求入参 */
470
- declare const MemoryRecallInputSchema: z.ZodObject<{
471
- query: z.ZodString;
472
- topK: z.ZodOptional<z.ZodNumber>;
473
- types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
474
- custom: "custom";
475
- fact: "fact";
476
- preference: "preference";
477
- event: "event";
478
- summary: "summary";
479
- }>>>;
480
- minImportance: z.ZodOptional<z.ZodNumber>;
481
- objectId: z.ZodOptional<z.ZodString>;
482
- }, z.core.$strip>;
483
- /** 记忆检索响应出参 */
484
- declare const MemoryRecallOutputSchema: z.ZodObject<{
485
- items: z.ZodArray<z.ZodObject<{
486
- id: z.ZodString;
487
- content: z.ZodString;
488
- type: z.ZodEnum<{
489
- custom: "custom";
490
- fact: "fact";
491
- preference: "preference";
492
- event: "event";
493
- summary: "summary";
494
- }>;
495
- importance: z.ZodNumber;
496
- objectId: z.ZodOptional<z.ZodString>;
497
- metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
498
- createdAt: z.ZodNumber;
499
- lastAccessedAt: z.ZodNumber;
500
- accessCount: z.ZodNumber;
501
- }, z.core.$strip>>;
502
- }, z.core.$strip>;
503
- /** 记忆列表请求入参 */
504
- declare const MemoryListInputSchema: z.ZodObject<{
505
- types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
506
- custom: "custom";
507
- fact: "fact";
508
- preference: "preference";
509
- event: "event";
510
- summary: "summary";
511
- }>>>;
512
- objectId: z.ZodOptional<z.ZodString>;
513
- offset: z.ZodOptional<z.ZodNumber>;
514
- limit: z.ZodOptional<z.ZodNumber>;
515
- }, z.core.$strip>;
516
- /** 记忆列表响应出参 */
517
- declare const MemoryListOutputSchema: z.ZodObject<{
518
- items: z.ZodArray<z.ZodObject<{
519
- id: z.ZodString;
520
- content: z.ZodString;
521
- type: z.ZodEnum<{
522
- custom: "custom";
523
- fact: "fact";
524
- preference: "preference";
525
- event: "event";
526
- summary: "summary";
527
- }>;
528
- importance: z.ZodNumber;
529
- objectId: z.ZodOptional<z.ZodString>;
530
- metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
531
- createdAt: z.ZodNumber;
532
- lastAccessedAt: z.ZodNumber;
533
- accessCount: z.ZodNumber;
534
- }, z.core.$strip>>;
535
- total: z.ZodNumber;
536
- }, z.core.$strip>;
537
- /** 会话列表请求入参 */
538
- declare const SessionListInputSchema: z.ZodObject<{
539
- objectId: z.ZodString;
540
- }, z.core.$strip>;
541
- /** 会话列表响应出参 */
542
- declare const SessionListOutputSchema: z.ZodObject<{
543
- items: z.ZodArray<z.ZodObject<{
544
- objectId: z.ZodString;
545
- sessionId: z.ZodString;
546
- createdAt: z.ZodNumber;
547
- updatedAt: z.ZodNumber;
548
- metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
549
- }, z.core.$strip>>;
550
- }, z.core.$strip>;
551
- /** 对话历史请求入参 */
552
- declare const ChatHistoryInputSchema: z.ZodObject<{
553
- objectId: z.ZodString;
554
- sessionId: z.ZodString;
555
- limit: z.ZodOptional<z.ZodNumber>;
556
- order: z.ZodOptional<z.ZodEnum<{
557
- asc: "asc";
558
- desc: "desc";
559
- }>>;
560
- }, z.core.$strip>;
561
- /** 对话历史响应出参 */
562
- declare const ChatHistoryOutputSchema: z.ZodObject<{
563
- items: z.ZodArray<z.ZodObject<{
564
- id: z.ZodString;
565
- objectId: z.ZodString;
566
- sessionId: z.ZodString;
567
- request: z.ZodObject<{
568
- model: z.ZodString;
569
- messages: z.ZodArray<z.ZodObject<{
570
- role: z.ZodEnum<{
571
- system: "system";
572
- user: "user";
573
- assistant: "assistant";
574
- tool: "tool";
575
- }>;
576
- content: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
577
- type: z.ZodLiteral<"text">;
578
- text: z.ZodString;
579
- }, z.core.$strip>, z.ZodObject<{
580
- type: z.ZodLiteral<"image_url">;
581
- image_url: z.ZodObject<{
582
- url: z.ZodString;
583
- detail: z.ZodOptional<z.ZodEnum<{
584
- auto: "auto";
585
- low: "low";
586
- high: "high";
587
- }>>;
588
- }, z.core.$strip>;
589
- }, z.core.$strip>]>>]>>;
590
- name: z.ZodOptional<z.ZodString>;
591
- tool_calls: z.ZodOptional<z.ZodArray<z.ZodObject<{
592
- id: z.ZodString;
593
- type: z.ZodLiteral<"function">;
594
- function: z.ZodObject<{
595
- name: z.ZodString;
596
- arguments: z.ZodString;
597
- }, z.core.$strip>;
598
- }, z.core.$strip>>>;
599
- tool_call_id: z.ZodOptional<z.ZodString>;
600
- }, z.core.$strip>>;
601
- }, z.core.$strip>;
602
- response: z.ZodObject<{
603
- content: z.ZodString;
604
- toolCalls: z.ZodOptional<z.ZodArray<z.ZodObject<{
605
- id: z.ZodString;
606
- type: z.ZodLiteral<"function">;
607
- function: z.ZodObject<{
608
- name: z.ZodString;
609
- arguments: z.ZodString;
610
- }, z.core.$strip>;
611
- }, z.core.$strip>>>;
612
- finishReason: z.ZodString;
613
- usage: z.ZodObject<{
614
- prompt_tokens: z.ZodNumber;
615
- completion_tokens: z.ZodNumber;
616
- total_tokens: z.ZodNumber;
617
- }, z.core.$strip>;
618
- }, z.core.$strip>;
619
- createdAt: z.ZodNumber;
620
- duration: z.ZodNumber;
621
- }, z.core.$strip>>;
622
- }, z.core.$strip>;
623
- type ChatCompletionInput = z.infer<typeof ChatCompletionInputSchema>;
624
- type ChatCompletionOutput = z.infer<typeof ChatCompletionOutputSchema>;
625
- type SendMessageInput = z.infer<typeof SendMessageInputSchema>;
626
- type SendMessageOutput = z.infer<typeof SendMessageOutputSchema>;
627
-
628
- export { type ChatCompletionInput, ChatCompletionInputSchema, type ChatCompletionOutput, ChatCompletionOutputSchema, ChatHistoryInputSchema, ChatHistoryOutputSchema, ChatMessageSchema, MemoryListInputSchema, MemoryListOutputSchema, MemoryRecallInputSchema, MemoryRecallOutputSchema, type SendMessageInput, SendMessageInputSchema, type SendMessageOutput, SendMessageOutputSchema, SessionListInputSchema, SessionListOutputSchema, aiEndpoints };
package/dist/api/index.js DELETED
@@ -1,243 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- // src/api/ai-api-contract.ts
4
- var MessageRoleSchema = z.enum(["system", "user", "assistant", "tool"]);
5
- var TextContentSchema = z.object({
6
- type: z.literal("text"),
7
- text: z.string()
8
- });
9
- var ImageContentSchema = z.object({
10
- type: z.literal("image_url"),
11
- image_url: z.object({
12
- url: z.string(),
13
- detail: z.enum(["auto", "low", "high"]).optional()
14
- })
15
- });
16
- var MessageContentSchema = z.union([
17
- z.string(),
18
- z.array(z.union([TextContentSchema, ImageContentSchema]))
19
- ]);
20
- var ToolCallSchema = z.object({
21
- id: z.string(),
22
- type: z.literal("function"),
23
- function: z.object({
24
- name: z.string(),
25
- arguments: z.string()
26
- })
27
- });
28
- var ChatMessageSchema = z.object({
29
- role: MessageRoleSchema,
30
- content: MessageContentSchema.optional(),
31
- name: z.string().optional(),
32
- tool_calls: z.array(ToolCallSchema).optional(),
33
- tool_call_id: z.string().optional()
34
- });
35
- var ToolParameterSchema = z.object({
36
- type: z.string(),
37
- description: z.string().optional(),
38
- enum: z.array(z.string()).optional()
39
- });
40
- var ToolDefinitionSchema = z.object({
41
- type: z.literal("function"),
42
- function: z.object({
43
- name: z.string(),
44
- description: z.string().optional(),
45
- parameters: z.object({
46
- type: z.literal("object"),
47
- properties: z.record(z.string(), ToolParameterSchema).optional(),
48
- required: z.array(z.string()).optional()
49
- }).optional()
50
- })
51
- });
52
- var ChatCompletionInputSchema = z.object({
53
- model: z.string().optional(),
54
- messages: z.array(ChatMessageSchema).min(1),
55
- temperature: z.number().min(0).max(2).optional(),
56
- top_p: z.number().min(0).max(1).optional(),
57
- max_tokens: z.number().int().min(1).optional(),
58
- stream: z.boolean().optional(),
59
- tools: z.array(ToolDefinitionSchema).optional(),
60
- tool_choice: z.union([
61
- z.literal("auto"),
62
- z.literal("none"),
63
- z.object({ type: z.literal("function"), function: z.object({ name: z.string() }) })
64
- ]).optional()
65
- });
66
- var TokenUsageSchema = z.object({
67
- prompt_tokens: z.number(),
68
- completion_tokens: z.number(),
69
- total_tokens: z.number()
70
- });
71
- var AssistantMessageSchema = z.object({
72
- role: z.literal("assistant"),
73
- content: z.string().nullable().optional(),
74
- tool_calls: z.array(ToolCallSchema).optional()
75
- });
76
- var ChatCompletionChoiceSchema = z.object({
77
- index: z.number(),
78
- message: AssistantMessageSchema,
79
- finish_reason: z.enum(["stop", "length", "tool_calls", "content_filter"])
80
- });
81
- var ChatCompletionOutputSchema = z.object({
82
- id: z.string(),
83
- object: z.literal("chat.completion"),
84
- created: z.number(),
85
- model: z.string(),
86
- choices: z.array(ChatCompletionChoiceSchema),
87
- usage: TokenUsageSchema
88
- });
89
- var SendMessageInputSchema = z.object({
90
- message: z.string().min(1),
91
- systemPrompt: z.string().optional(),
92
- model: z.string().optional(),
93
- temperature: z.number().min(0).max(2).optional()
94
- });
95
- var SendMessageOutputSchema = z.object({
96
- content: z.string(),
97
- model: z.string(),
98
- usage: TokenUsageSchema.optional()
99
- });
100
- var MemoryEntrySchema = z.object({
101
- id: z.string(),
102
- content: z.string(),
103
- type: z.enum(["fact", "preference", "event", "summary", "custom"]),
104
- importance: z.number(),
105
- objectId: z.string().optional(),
106
- metadata: z.record(z.string(), z.unknown()).optional(),
107
- createdAt: z.number(),
108
- lastAccessedAt: z.number(),
109
- accessCount: z.number()
110
- });
111
- var MemoryRecallInputSchema = z.object({
112
- query: z.string().min(1),
113
- topK: z.number().int().min(1).optional(),
114
- types: z.array(z.enum(["fact", "preference", "event", "summary", "custom"])).optional(),
115
- minImportance: z.number().min(0).max(1).optional(),
116
- objectId: z.string().optional()
117
- });
118
- var MemoryRecallOutputSchema = z.object({
119
- items: z.array(MemoryEntrySchema)
120
- });
121
- var MemoryListInputSchema = z.object({
122
- types: z.array(z.enum(["fact", "preference", "event", "summary", "custom"])).optional(),
123
- objectId: z.string().optional(),
124
- offset: z.number().int().min(0).optional(),
125
- limit: z.number().int().min(1).max(100).optional()
126
- });
127
- var MemoryListOutputSchema = z.object({
128
- items: z.array(MemoryEntrySchema),
129
- total: z.number()
130
- });
131
- var SessionInfoSchema = z.object({
132
- objectId: z.string(),
133
- sessionId: z.string(),
134
- createdAt: z.number(),
135
- updatedAt: z.number(),
136
- metadata: z.record(z.string(), z.unknown()).optional()
137
- });
138
- var SessionListInputSchema = z.object({
139
- objectId: z.string().min(1)
140
- });
141
- var SessionListOutputSchema = z.object({
142
- items: z.array(SessionInfoSchema)
143
- });
144
- var ChatRecordSchema = z.object({
145
- id: z.string(),
146
- objectId: z.string(),
147
- sessionId: z.string(),
148
- request: z.object({
149
- model: z.string(),
150
- messages: z.array(ChatMessageSchema)
151
- }),
152
- response: z.object({
153
- content: z.string(),
154
- toolCalls: z.array(ToolCallSchema).optional(),
155
- finishReason: z.string(),
156
- usage: TokenUsageSchema
157
- }),
158
- createdAt: z.number(),
159
- duration: z.number()
160
- });
161
- var ChatHistoryInputSchema = z.object({
162
- objectId: z.string().min(1),
163
- sessionId: z.string().min(1),
164
- limit: z.number().int().min(1).max(200).optional(),
165
- order: z.enum(["asc", "desc"]).optional()
166
- });
167
- var ChatHistoryOutputSchema = z.object({
168
- items: z.array(ChatRecordSchema)
169
- });
170
-
171
- // src/api/ai-api-contract.ts
172
- function defineEndpoint(def) {
173
- return def;
174
- }
175
- var aiEndpoints = {
176
- /** 聊天完成(非流式) */
177
- chat: defineEndpoint({
178
- method: "POST",
179
- path: "/ai/chat",
180
- input: ChatCompletionInputSchema,
181
- output: ChatCompletionOutputSchema,
182
- meta: { summary: "Chat completion (non-streaming)", tags: ["ai"] }
183
- }),
184
- /**
185
- * 聊天完成(流式 SSE)
186
- *
187
- * 此端点使用 Server-Sent Events 协议返回流式 chunk。
188
- * 客户端应使用 `createAIClient().chatStream()` 而非 `api.call()`。
189
- * 定义此契约用于服务端路由注册和 API 文档。
190
- */
191
- chatStream: defineEndpoint({
192
- method: "POST",
193
- path: "/ai/chat/stream",
194
- input: ChatCompletionInputSchema,
195
- output: z.unknown(),
196
- requireAuth: true,
197
- meta: { summary: "Chat completion (SSE streaming)", tags: ["ai"], streaming: true }
198
- }),
199
- /** 简单消息(便捷接口,封装单轮对话) */
200
- sendMessage: defineEndpoint({
201
- method: "POST",
202
- path: "/ai/message",
203
- input: SendMessageInputSchema,
204
- output: SendMessageOutputSchema,
205
- meta: { summary: "Send a single message (convenience)", tags: ["ai"] }
206
- }),
207
- /** 记忆检索 */
208
- memoryRecall: defineEndpoint({
209
- method: "POST",
210
- path: "/ai/memory/recall",
211
- input: MemoryRecallInputSchema,
212
- output: MemoryRecallOutputSchema,
213
- meta: { summary: "Recall relevant memories", tags: ["ai", "memory"] }
214
- }),
215
- /** 记忆列表(分页) */
216
- memoryList: defineEndpoint({
217
- method: "POST",
218
- path: "/ai/memory/list",
219
- input: MemoryListInputSchema,
220
- output: MemoryListOutputSchema,
221
- meta: { summary: "List memories (paginated)", tags: ["ai", "memory"] }
222
- }),
223
- /** 会话列表 */
224
- sessionList: defineEndpoint({
225
- method: "POST",
226
- path: "/ai/sessions",
227
- input: SessionListInputSchema,
228
- output: SessionListOutputSchema,
229
- meta: { summary: "List sessions for an object", tags: ["ai", "session"] }
230
- }),
231
- /** 对话历史 */
232
- chatHistory: defineEndpoint({
233
- method: "POST",
234
- path: "/ai/chat/history",
235
- input: ChatHistoryInputSchema,
236
- output: ChatHistoryOutputSchema,
237
- meta: { summary: "Get chat history for a session", tags: ["ai", "llm"] }
238
- })
239
- };
240
-
241
- export { ChatCompletionInputSchema, ChatCompletionOutputSchema, ChatHistoryInputSchema, ChatHistoryOutputSchema, ChatMessageSchema, MemoryListInputSchema, MemoryListOutputSchema, MemoryRecallInputSchema, MemoryRecallOutputSchema, SendMessageInputSchema, SendMessageOutputSchema, SessionListInputSchema, SessionListOutputSchema, aiEndpoints };
242
- //# sourceMappingURL=index.js.map
243
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/ai-api-schemas.ts","../../src/api/ai-api-contract.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/ai/api — AI API 契约 Schema\n *\n * 入参/出参 Schema,客户端和服务端共享的唯一真相源。\n * @module ai-api-schemas\n */\n\nimport { z } from 'zod'\n\n// ─── 消息 Schema ───\n\n/** 消息角色 */\nconst MessageRoleSchema = z.enum(['system', 'user', 'assistant', 'tool'])\n\n/** 文本消息内容 */\nconst TextContentSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n})\n\n/** 图片消息内容 */\nconst ImageContentSchema = z.object({\n type: z.literal('image_url'),\n image_url: z.object({\n url: z.string(),\n detail: z.enum(['auto', 'low', 'high']).optional(),\n }),\n})\n\n/** 消息内容(字符串或结构化数组) */\nconst MessageContentSchema = z.union([\n z.string(),\n z.array(z.union([TextContentSchema, ImageContentSchema])),\n])\n\n/** 工具调用 */\nconst ToolCallSchema = z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n})\n\n/** 聊天消息 */\nexport const ChatMessageSchema = z.object({\n role: MessageRoleSchema,\n content: MessageContentSchema.optional(),\n name: z.string().optional(),\n tool_calls: z.array(ToolCallSchema).optional(),\n tool_call_id: z.string().optional(),\n})\n\n// ─── 工具定义 ───\n\n/** 工具参数 Schema */\nconst ToolParameterSchema = z.object({\n type: z.string(),\n description: z.string().optional(),\n enum: z.array(z.string()).optional(),\n})\n\n/** 工具定义 */\nconst ToolDefinitionSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.object({\n type: z.literal('object'),\n properties: z.record(z.string(), ToolParameterSchema).optional(),\n required: z.array(z.string()).optional(),\n }).optional(),\n }),\n})\n\n// ─── 请求/响应 Schema ───\n\n/** 聊天完成请求入参 */\nexport const ChatCompletionInputSchema = z.object({\n model: z.string().optional(),\n messages: z.array(ChatMessageSchema).min(1),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n max_tokens: z.number().int().min(1).optional(),\n stream: z.boolean().optional(),\n tools: z.array(ToolDefinitionSchema).optional(),\n tool_choice: z.union([\n z.literal('auto'),\n z.literal('none'),\n z.object({ type: z.literal('function'), function: z.object({ name: z.string() }) }),\n ]).optional(),\n})\n\n/** Token 使用统计 */\nconst TokenUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n})\n\n/** 助手消息 */\nconst AssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.string().nullable().optional(),\n tool_calls: z.array(ToolCallSchema).optional(),\n})\n\n/** 聊天完成选择 */\nconst ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: AssistantMessageSchema,\n finish_reason: z.enum(['stop', 'length', 'tool_calls', 'content_filter']),\n})\n\n/** 聊天完成响应出参 */\nexport const ChatCompletionOutputSchema = z.object({\n id: z.string(),\n object: z.literal('chat.completion'),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: TokenUsageSchema,\n})\n\n/** 简单消息请求入参(便捷接口) */\nexport const SendMessageInputSchema = z.object({\n message: z.string().min(1),\n systemPrompt: z.string().optional(),\n model: z.string().optional(),\n temperature: z.number().min(0).max(2).optional(),\n})\n\n/** 简单消息响应出参 */\nexport const SendMessageOutputSchema = z.object({\n content: z.string(),\n model: z.string(),\n usage: TokenUsageSchema.optional(),\n})\n\n// ─── Memory Schema ───\n\n/** 记忆条目 Schema */\nconst MemoryEntrySchema = z.object({\n id: z.string(),\n content: z.string(),\n type: z.enum(['fact', 'preference', 'event', 'summary', 'custom']),\n importance: z.number(),\n objectId: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n createdAt: z.number(),\n lastAccessedAt: z.number(),\n accessCount: z.number(),\n})\n\n/** 记忆检索请求入参 */\nexport const MemoryRecallInputSchema = z.object({\n query: z.string().min(1),\n topK: z.number().int().min(1).optional(),\n types: z.array(z.enum(['fact', 'preference', 'event', 'summary', 'custom'])).optional(),\n minImportance: z.number().min(0).max(1).optional(),\n objectId: z.string().optional(),\n})\n\n/** 记忆检索响应出参 */\nexport const MemoryRecallOutputSchema = z.object({\n items: z.array(MemoryEntrySchema),\n})\n\n/** 记忆列表请求入参 */\nexport const MemoryListInputSchema = z.object({\n types: z.array(z.enum(['fact', 'preference', 'event', 'summary', 'custom'])).optional(),\n objectId: z.string().optional(),\n offset: z.number().int().min(0).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n})\n\n/** 记忆列表响应出参 */\nexport const MemoryListOutputSchema = z.object({\n items: z.array(MemoryEntrySchema),\n total: z.number(),\n})\n\n// ─── Session Schema ───\n\n/** 会话信息 Schema */\nconst SessionInfoSchema = z.object({\n objectId: z.string(),\n sessionId: z.string(),\n createdAt: z.number(),\n updatedAt: z.number(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n/** 会话列表请求入参 */\nexport const SessionListInputSchema = z.object({\n objectId: z.string().min(1),\n})\n\n/** 会话列表响应出参 */\nexport const SessionListOutputSchema = z.object({\n items: z.array(SessionInfoSchema),\n})\n\n// ─── ChatHistory Schema ───\n\n/** 对话记录响应条目 */\nconst ChatRecordSchema = z.object({\n id: z.string(),\n objectId: z.string(),\n sessionId: z.string(),\n request: z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n }),\n response: z.object({\n content: z.string(),\n toolCalls: z.array(ToolCallSchema).optional(),\n finishReason: z.string(),\n usage: TokenUsageSchema,\n }),\n createdAt: z.number(),\n duration: z.number(),\n})\n\n/** 对话历史请求入参 */\nexport const ChatHistoryInputSchema = z.object({\n objectId: z.string().min(1),\n sessionId: z.string().min(1),\n limit: z.number().int().min(1).max(200).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n})\n\n/** 对话历史响应出参 */\nexport const ChatHistoryOutputSchema = z.object({\n items: z.array(ChatRecordSchema),\n})\n\n// ─── 推导类型 ───\n\nexport type ChatCompletionInput = z.infer<typeof ChatCompletionInputSchema>\nexport type ChatCompletionOutput = z.infer<typeof ChatCompletionOutputSchema>\nexport type SendMessageInput = z.infer<typeof SendMessageInputSchema>\nexport type SendMessageOutput = z.infer<typeof SendMessageOutputSchema>\n","/**\n * @h-ai/ai/api — AI API 端点契约定义\n *\n * 所有 ai 模块的 API 端点(path + method + schema),\n * 客户端和服务端都从此处引用,编译时保证一致性。\n *\n * 注意:`chatStream` 使用 SSE 流式协议,客户端应使用\n * `createAIClient().chatStream()` 而非 `api.call()`。\n * 此处定义仅用于服务端路由注册和文档生成。\n *\n * @module ai-api-contract\n */\n\nimport { z } from 'zod'\nimport {\n ChatCompletionInputSchema,\n ChatCompletionOutputSchema,\n ChatHistoryInputSchema,\n ChatHistoryOutputSchema,\n MemoryListInputSchema,\n MemoryListOutputSchema,\n MemoryRecallInputSchema,\n MemoryRecallOutputSchema,\n SendMessageInputSchema,\n SendMessageOutputSchema,\n SessionListInputSchema,\n SessionListOutputSchema,\n} from './ai-api-schemas.js'\n\n// ─── 端点定义辅助(内联,避免对 @h-ai/api-client 的循环依赖) ───\n\ninterface EndpointDef<TInput = unknown, TOutput = unknown> {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n path: string\n input: z.ZodType<TInput>\n output: z.ZodType<TOutput>\n requireAuth?: boolean\n meta?: { summary?: string, tags?: string[], streaming?: boolean }\n}\n\nfunction defineEndpoint<TInput, TOutput>(def: EndpointDef<TInput, TOutput>): EndpointDef<TInput, TOutput> {\n return def\n}\n\n// ─── ai API 端点 ───\n\n/**\n * ai 所有 API 端点\n *\n * @example\n * ```ts\n * // 客户端(非流式)\n * import { aiEndpoints } from '@h-ai/ai/api'\n * const result = await api.call(aiEndpoints.chat, { messages: [...] })\n *\n * // 客户端(流式)— 使用专用 AIClient\n * import { api } from '@h-ai/api-client'\n * import { createAIClient } from '@h-ai/ai/client'\n * await api.init({ baseUrl: '/api' })\n * const client = createAIClient({ api })\n * for await (const chunk of client.chatStream({ messages })) { ... }\n *\n * // 服务端\n * export const POST = kit.fromContract(aiEndpoints.chat, async (input) => {\n * const result = await ai.llm.chat(input)\n * return result.success ? result.data : kit.response.internalError(result.error.message)\n * })\n * ```\n */\nexport const aiEndpoints = {\n /** 聊天完成(非流式) */\n chat: defineEndpoint({\n method: 'POST',\n path: '/ai/chat',\n input: ChatCompletionInputSchema,\n output: ChatCompletionOutputSchema,\n meta: { summary: 'Chat completion (non-streaming)', tags: ['ai'] },\n }),\n\n /**\n * 聊天完成(流式 SSE)\n *\n * 此端点使用 Server-Sent Events 协议返回流式 chunk。\n * 客户端应使用 `createAIClient().chatStream()` 而非 `api.call()`。\n * 定义此契约用于服务端路由注册和 API 文档。\n */\n chatStream: defineEndpoint({\n method: 'POST',\n path: '/ai/chat/stream',\n input: ChatCompletionInputSchema,\n output: z.unknown(),\n requireAuth: true,\n meta: { summary: 'Chat completion (SSE streaming)', tags: ['ai'], streaming: true },\n }),\n\n /** 简单消息(便捷接口,封装单轮对话) */\n sendMessage: defineEndpoint({\n method: 'POST',\n path: '/ai/message',\n input: SendMessageInputSchema,\n output: SendMessageOutputSchema,\n meta: { summary: 'Send a single message (convenience)', tags: ['ai'] },\n }),\n\n /** 记忆检索 */\n memoryRecall: defineEndpoint({\n method: 'POST',\n path: '/ai/memory/recall',\n input: MemoryRecallInputSchema,\n output: MemoryRecallOutputSchema,\n meta: { summary: 'Recall relevant memories', tags: ['ai', 'memory'] },\n }),\n\n /** 记忆列表(分页) */\n memoryList: defineEndpoint({\n method: 'POST',\n path: '/ai/memory/list',\n input: MemoryListInputSchema,\n output: MemoryListOutputSchema,\n meta: { summary: 'List memories (paginated)', tags: ['ai', 'memory'] },\n }),\n\n /** 会话列表 */\n sessionList: defineEndpoint({\n method: 'POST',\n path: '/ai/sessions',\n input: SessionListInputSchema,\n output: SessionListOutputSchema,\n meta: { summary: 'List sessions for an object', tags: ['ai', 'session'] },\n }),\n\n /** 对话历史 */\n chatHistory: defineEndpoint({\n method: 'POST',\n path: '/ai/chat/history',\n input: ChatHistoryInputSchema,\n output: ChatHistoryOutputSchema,\n meta: { summary: 'Get chat history for a session', tags: ['ai', 'llm'] },\n }),\n} as const\n"]}
@@ -1 +0,0 @@
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"]}