@h-ai/ai 0.1.0-alpha5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,243 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/api/ai-api-schemas.ts","../../src/api/ai-api-contract.ts"],"names":["z"],"mappings":";;;AAYA,IAAM,iBAAA,GAAoB,EAAE,IAAA,CAAK,CAAC,UAAU,MAAA,EAAQ,WAAA,EAAa,MAAM,CAAC,CAAA;AAGxE,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAM,EAAE,MAAA;AACV,CAAC,CAAA;AAGD,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAClC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,EAC3B,SAAA,EAAW,EAAE,MAAA,CAAO;AAAA,IAClB,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,IACd,MAAA,EAAQ,EAAE,IAAA,CAAK,CAAC,QAAQ,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,QAAA;AAAS,GAClD;AACH,CAAC,CAAA;AAGD,IAAM,oBAAA,GAAuB,EAAE,KAAA,CAAM;AAAA,EACnC,EAAE,MAAA,EAAO;AAAA,EACT,CAAA,CAAE,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,iBAAA,EAAmB,kBAAkB,CAAC,CAAC;AAC1D,CAAC,CAAA;AAGD,IAAM,cAAA,GAAiB,EAAE,MAAA,CAAO;AAAA,EAC9B,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,QAAA,EAAU,EAAE,MAAA,CAAO;AAAA,IACjB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,SAAA,EAAW,EAAE,MAAA;AAAO,GACrB;AACH,CAAC,CAAA;AAGM,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,iBAAA;AAAA,EACN,OAAA,EAAS,qBAAqB,QAAA,EAAS;AAAA,EACvC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,UAAA,EAAY,CAAA,CAAE,KAAA,CAAM,cAAc,EAAE,QAAA,EAAS;AAAA,EAC7C,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC3B,CAAC;AAKD,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EACnC,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,MAAM,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC5B,CAAC,CAAA;AAGD,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,QAAA,EAAU,EAAE,MAAA,CAAO;AAAA,IACjB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACjC,UAAA,EAAY,EAAE,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACxB,UAAA,EAAY,EAAE,MAAA,CAAO,CAAA,CAAE,QAAO,EAAG,mBAAmB,EAAE,QAAA,EAAS;AAAA,MAC/D,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,KACxC,EAAE,QAAA;AAAS,GACb;AACH,CAAC,CAAA;AAKM,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EAChD,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,UAAU,CAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1C,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/C,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACzC,UAAA,EAAY,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7C,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC7B,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,oBAAoB,EAAE,QAAA,EAAS;AAAA,EAC9C,WAAA,EAAa,EAAE,KAAA,CAAM;AAAA,IACnB,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,IAChB,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,IAChB,EAAE,MAAA,CAAO,EAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA,EAAG,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,EAAE,IAAA,EAAM,CAAA,CAAE,QAAO,EAAG,GAAG;AAAA,GACnF,EAAE,QAAA;AACL,CAAC;AAGD,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EAChC,aAAA,EAAe,EAAE,MAAA,EAAO;AAAA,EACxB,iBAAA,EAAmB,EAAE,MAAA,EAAO;AAAA,EAC5B,YAAA,EAAc,EAAE,MAAA;AAClB,CAAC,CAAA;AAGD,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,EAC3B,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACxC,UAAA,EAAY,CAAA,CAAE,KAAA,CAAM,cAAc,EAAE,QAAA;AACtC,CAAC,CAAA;AAGD,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EAC1C,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAAS,sBAAA;AAAA,EACT,aAAA,EAAe,EAAE,IAAA,CAAK,CAAC,QAAQ,QAAA,EAAU,YAAA,EAAc,gBAAgB,CAAC;AAC1E,CAAC,CAAA;AAGM,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EACjD,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,MAAA,EAAQ,CAAA,CAAE,OAAA,CAAQ,iBAAiB,CAAA;AAAA,EACnC,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,0BAA0B,CAAA;AAAA,EAC3C,KAAA,EAAO;AACT,CAAC;AAGM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC7C,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA;AACxC,CAAC;AAGM,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC9C,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,KAAA,EAAO,iBAAiB,QAAA;AAC1B,CAAC;AAKD,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,IAAA,EAAM,EAAE,IAAA,CAAK,CAAC,QAAQ,YAAA,EAAc,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,EACjE,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,EACrB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,cAAA,EAAgB,EAAE,MAAA,EAAO;AAAA,EACzB,WAAA,EAAa,EAAE,MAAA;AACjB,CAAC,CAAA;AAGM,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,IAAA,EAAM,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACvC,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,MAAA,EAAQ,YAAA,EAAc,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EACtF,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC;AAGM,IAAM,wBAAA,GAA2B,EAAE,MAAA,CAAO;AAAA,EAC/C,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,iBAAiB;AAClC,CAAC;AAGM,IAAM,qBAAA,GAAwB,EAAE,MAAA,CAAO;AAAA,EAC5C,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,MAAA,EAAQ,YAAA,EAAc,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EACtF,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,MAAA,EAAQ,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACzC,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAC1C,CAAC;AAGM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC7C,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA;AAAA,EAChC,KAAA,EAAO,EAAE,MAAA;AACX,CAAC;AAKD,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC9C,CAAC,CAAA;AAGM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC7C,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AAC5B,CAAC;AAGM,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,iBAAiB;AAClC,CAAC;AAKD,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EAChC,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,OAAA,EAAS,EAAE,MAAA,CAAO;AAAA,IAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,IAChB,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,iBAAiB;AAAA,GACpC,CAAA;AAAA,EACD,QAAA,EAAU,EAAE,MAAA,CAAO;AAAA,IACjB,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,IAClB,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,cAAc,EAAE,QAAA,EAAS;AAAA,IAC5C,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,IACvB,KAAA,EAAO;AAAA,GACR,CAAA;AAAA,EACD,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,QAAA,EAAU,EAAE,MAAA;AACd,CAAC,CAAA;AAGM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC7C,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,KAAA,EAAO,EAAE,IAAA,CAAK,CAAC,OAAO,MAAM,CAAC,EAAE,QAAA;AACjC,CAAC;AAGM,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,gBAAgB;AACjC,CAAC;;;ACrMD,SAAS,eAAgC,GAAA,EAAiE;AACxG,EAAA,OAAO,GAAA;AACT;AA2BO,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,MAAM,cAAA,CAAe;AAAA,IACnB,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,0BAAA;AAAA,IACR,MAAM,EAAE,OAAA,EAAS,mCAAmC,IAAA,EAAM,CAAC,IAAI,CAAA;AAAE,GAClE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASD,YAAY,cAAA,CAAe;AAAA,IACzB,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQA,EAAE,OAAA,EAAQ;AAAA,IAClB,WAAA,EAAa,IAAA;AAAA,IACb,IAAA,EAAM,EAAE,OAAA,EAAS,iCAAA,EAAmC,MAAM,CAAC,IAAI,CAAA,EAAG,SAAA,EAAW,IAAA;AAAK,GACnF,CAAA;AAAA;AAAA,EAGD,aAAa,cAAA,CAAe;AAAA,IAC1B,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,uBAAA;AAAA,IACR,MAAM,EAAE,OAAA,EAAS,uCAAuC,IAAA,EAAM,CAAC,IAAI,CAAA;AAAE,GACtE,CAAA;AAAA;AAAA,EAGD,cAAc,cAAA,CAAe;AAAA,IAC3B,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO,uBAAA;AAAA,IACP,MAAA,EAAQ,wBAAA;AAAA,IACR,IAAA,EAAM,EAAE,OAAA,EAAS,0BAAA,EAA4B,MAAM,CAAC,IAAA,EAAM,QAAQ,CAAA;AAAE,GACrE,CAAA;AAAA;AAAA,EAGD,YAAY,cAAA,CAAe;AAAA,IACzB,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,qBAAA;AAAA,IACP,MAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAM,EAAE,OAAA,EAAS,2BAAA,EAA6B,MAAM,CAAC,IAAA,EAAM,QAAQ,CAAA;AAAE,GACtE,CAAA;AAAA;AAAA,EAGD,aAAa,cAAA,CAAe;AAAA,IAC1B,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,uBAAA;AAAA,IACR,IAAA,EAAM,EAAE,OAAA,EAAS,6BAAA,EAA+B,MAAM,CAAC,IAAA,EAAM,SAAS,CAAA;AAAE,GACzE,CAAA;AAAA;AAAA,EAGD,aAAa,cAAA,CAAe;AAAA,IAC1B,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,uBAAA;AAAA,IACR,IAAA,EAAM,EAAE,OAAA,EAAS,gCAAA,EAAkC,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA;AAAE,GACxE;AACH","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"]}
@@ -0,0 +1,9 @@
1
+ export { A as A2AConfig, a as A2AConfigSchema, b as A2ASkillConfigSchema, c as AIConfig, d as AIConfigInput, e as AIConfigSchema, C as CompressConfig, f as CompressConfigSchema, E as EmbeddingConfig, g as EmbeddingConfigSchema, h as EntityType, i as EntityTypeSchema, F as FileConfig, j as FileConfigSchema, K as KnowledgeConfig, k as KnowledgeConfigSchema, L as LLMConfig, l as LLMConfigSchema, M as MCPConfig, m as MCPConfigSchema, n as MCPServerCapabilities, o as MCPServerCapabilitiesSchema, p as MCPServerConfig, q as MCPServerConfigSchema, r as MemoryConfig, s as MemoryConfigSchema, t as MemoryType, u as MemoryTypeSchema, v as ModelEntry, w as ModelEntrySchema, x as ModelScenario, y as ModelScenarioSchema, R as ResolveRequiredModelEntryOptions, z as ResolvedModelConfig, B as RetrievalConfig, D as RetrievalConfigSchema, G as RetrievalSourceConfig, H as RetrievalSourceSchema, S as SummaryConfig, I as SummaryConfigSchema, T as TokenConfig, J as TokenConfigSchema, N as resolveModelEntry } from './ai-reasoning-types-ZRy23rSK.js';
2
+ export { A as AIFunctions, a as AIInitOptions, C as CompressionStrategy, b as CompressionStrategySchema, H as HaiAIError } from './ai-types-7iSHMnGM.js';
3
+ export { A2AClientOperations, AIApiAdapter, AIClient, AIClientConfig, StreamOptions, StreamProgress, collectStreamContent, createA2AClient, createAIClient, parseSSE } from './client/index.js';
4
+ import '@a2a-js/sdk/server';
5
+ import '@h-ai/core';
6
+ import '@h-ai/datapipe';
7
+ import 'zod';
8
+ import 'openai';
9
+ import 'node:buffer';
@@ -0,0 +1,4 @@
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-ZOTQ75VE.js';
2
+ export { collectStreamContent, createA2AClient, createAIClient, parseSSE } from './chunk-ABP7RKIP.js';
3
+ //# sourceMappingURL=browser.js.map
4
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"browser.js"}
@@ -0,0 +1,311 @@
1
+ // src/client/ai-a2a-client.ts
2
+ var A2A_PATH = {
3
+ agentCard: "/a2a/agent-card",
4
+ messages: "/a2a/messages",
5
+ callRemote: "/a2a/call"
6
+ };
7
+ function createA2AClient(api) {
8
+ return {
9
+ async getAgentCard() {
10
+ const result = await api.post(A2A_PATH.agentCard);
11
+ if (!result.success) {
12
+ throw new Error(`A2A get agent card failed: ${result.error.message}`);
13
+ }
14
+ return result.data;
15
+ },
16
+ async listMessages(filter) {
17
+ const result = await api.post(A2A_PATH.messages, filter ?? {});
18
+ if (!result.success) {
19
+ throw new Error(`A2A list messages failed: ${result.error.message}`);
20
+ }
21
+ return result.data;
22
+ },
23
+ async callRemoteAgent(remoteUrl, message, options) {
24
+ const result = await api.post(A2A_PATH.callRemote, {
25
+ remoteUrl,
26
+ message,
27
+ ...options
28
+ });
29
+ if (!result.success) {
30
+ throw new Error(`A2A remote call failed: ${result.error.message}`);
31
+ }
32
+ return result.data;
33
+ }
34
+ };
35
+ }
36
+
37
+ // src/client/ai-client.ts
38
+ var AI_PATH = {
39
+ // LLM
40
+ chat: "/ai/chat",
41
+ chatStream: "/ai/chat/stream",
42
+ chatHistory: "/ai/chat/history",
43
+ ask: "/ai/ask",
44
+ askStream: "/ai/ask/stream",
45
+ // Knowledge
46
+ knowledgeRetrieve: "/ai/knowledge/retrieve",
47
+ knowledgeAsk: "/ai/knowledge/ask",
48
+ knowledgeIngest: "/ai/knowledge/ingest",
49
+ knowledgeDocuments: "/ai/knowledge/documents",
50
+ knowledgeRemoveDocument: "/ai/knowledge/documents/remove",
51
+ // Memory
52
+ memoryRecall: "/ai/memory/recall",
53
+ memoryList: "/ai/memory/list",
54
+ memoryAdd: "/ai/memory/add",
55
+ memoryUpdate: "/ai/memory/update",
56
+ memoryRemove: "/ai/memory/remove",
57
+ // Session
58
+ sessions: "/ai/sessions",
59
+ sessionRename: "/ai/sessions/rename",
60
+ sessionRemove: "/ai/sessions/remove",
61
+ // RAG
62
+ ragQuery: "/ai/rag/query",
63
+ ragQueryStream: "/ai/rag/query/stream",
64
+ // Reasoning
65
+ reasoningRun: "/ai/reasoning/run",
66
+ reasoningRunStream: "/ai/reasoning/run/stream",
67
+ // Token
68
+ tokenEstimate: "/ai/token/estimate"
69
+ };
70
+ function createAIClient(config) {
71
+ const { api } = config;
72
+ return {
73
+ async chat(req) {
74
+ const result = await api.post(AI_PATH.chat, { ...req, stream: false });
75
+ if (!result.success) {
76
+ throw new Error(`AI chat request failed: ${result.error.message}`);
77
+ }
78
+ return result.data;
79
+ },
80
+ async *chatStream(req, options) {
81
+ let content = "";
82
+ for await (const data of api.stream(AI_PATH.chatStream, { ...req, stream: true })) {
83
+ try {
84
+ const chunk = JSON.parse(data);
85
+ const delta = chunk.choices[0]?.delta?.content;
86
+ if (delta) {
87
+ content += delta;
88
+ }
89
+ const finishReason = chunk.choices[0]?.finish_reason;
90
+ if (finishReason) {
91
+ options?.onProgress?.({ content, done: true, finishReason });
92
+ } else {
93
+ options?.onProgress?.({ content, done: false });
94
+ }
95
+ yield chunk;
96
+ } catch {
97
+ }
98
+ }
99
+ },
100
+ async sendMessage(message, systemPrompt) {
101
+ const messages = [];
102
+ if (systemPrompt) {
103
+ messages.push({ role: "system", content: systemPrompt });
104
+ }
105
+ messages.push({ role: "user", content: message });
106
+ const response = await this.chat({ messages });
107
+ return response.choices[0]?.message?.content ?? "";
108
+ },
109
+ async sendMessageStream(message, options, systemPrompt) {
110
+ const messages = [];
111
+ if (systemPrompt) {
112
+ messages.push({ role: "system", content: systemPrompt });
113
+ }
114
+ messages.push({ role: "user", content: message });
115
+ let content = "";
116
+ for await (const chunk of this.chatStream({ messages }, options)) {
117
+ const delta = chunk.choices[0]?.delta?.content;
118
+ if (delta) {
119
+ content += delta;
120
+ }
121
+ }
122
+ return content;
123
+ },
124
+ async recallMemories(query, options) {
125
+ const result = await api.post(AI_PATH.memoryRecall, { query, ...options });
126
+ if (!result.success) {
127
+ throw new Error(`Memory recall failed: ${result.error.message}`);
128
+ }
129
+ return result.data.items;
130
+ },
131
+ async listMemories(options) {
132
+ const result = await api.post(AI_PATH.memoryList, options ?? {});
133
+ if (!result.success) {
134
+ throw new Error(`Memory list failed: ${result.error.message}`);
135
+ }
136
+ return result.data;
137
+ },
138
+ async listSessions(objectId) {
139
+ const result = await api.post(AI_PATH.sessions, { objectId });
140
+ if (!result.success) {
141
+ throw new Error(`Session list failed: ${result.error.message}`);
142
+ }
143
+ return result.data.items;
144
+ },
145
+ async chatHistory(objectId, sessionId, options) {
146
+ const result = await api.post(AI_PATH.chatHistory, { objectId, sessionId, ...options });
147
+ if (!result.success) {
148
+ throw new Error(`Chat history failed: ${result.error.message}`);
149
+ }
150
+ return result.data.items;
151
+ },
152
+ // ─── LLM ask/askStream ───
153
+ async ask(question, options) {
154
+ const result = await api.post(AI_PATH.ask, { question, ...options });
155
+ if (!result.success) {
156
+ throw new Error(`AI ask failed: ${result.error.message}`);
157
+ }
158
+ return result.data.text;
159
+ },
160
+ async *askStream(question, options) {
161
+ for await (const data of api.stream(AI_PATH.askStream, { question, ...options })) {
162
+ yield data;
163
+ }
164
+ },
165
+ // ─── Knowledge ───
166
+ async knowledgeRetrieve(query, options) {
167
+ const result = await api.post(AI_PATH.knowledgeRetrieve, { query, ...options });
168
+ if (!result.success) {
169
+ throw new Error(`Knowledge retrieve failed: ${result.error.message}`);
170
+ }
171
+ return result.data;
172
+ },
173
+ async knowledgeAsk(query, options) {
174
+ const result = await api.post(AI_PATH.knowledgeAsk, { query, ...options });
175
+ if (!result.success) {
176
+ throw new Error(`Knowledge ask failed: ${result.error.message}`);
177
+ }
178
+ return result.data;
179
+ },
180
+ async knowledgeIngest(input) {
181
+ const result = await api.post(AI_PATH.knowledgeIngest, input);
182
+ if (!result.success) {
183
+ throw new Error(`Knowledge ingest failed: ${result.error.message}`);
184
+ }
185
+ return result.data;
186
+ },
187
+ async knowledgeListDocuments(options) {
188
+ const result = await api.post(AI_PATH.knowledgeDocuments, options ?? {});
189
+ if (!result.success) {
190
+ throw new Error(`Knowledge list documents failed: ${result.error.message}`);
191
+ }
192
+ return result.data.items;
193
+ },
194
+ async knowledgeRemoveDocument(documentId, options) {
195
+ const result = await api.post(AI_PATH.knowledgeRemoveDocument, { documentId, ...options });
196
+ if (!result.success) {
197
+ throw new Error(`Knowledge remove document failed: ${result.error.message}`);
198
+ }
199
+ },
200
+ // ─── Memory (extended) ───
201
+ async addMemory(entry) {
202
+ const result = await api.post(AI_PATH.memoryAdd, entry);
203
+ if (!result.success) {
204
+ throw new Error(`Memory add failed: ${result.error.message}`);
205
+ }
206
+ return result.data;
207
+ },
208
+ async updateMemory(memoryId, updates) {
209
+ const result = await api.post(AI_PATH.memoryUpdate, { memoryId, ...updates });
210
+ if (!result.success) {
211
+ throw new Error(`Memory update failed: ${result.error.message}`);
212
+ }
213
+ return result.data;
214
+ },
215
+ async removeMemory(memoryId) {
216
+ const result = await api.post(AI_PATH.memoryRemove, { memoryId });
217
+ if (!result.success) {
218
+ throw new Error(`Memory remove failed: ${result.error.message}`);
219
+ }
220
+ },
221
+ // ─── Session (extended) ───
222
+ async renameSession(sessionId, title) {
223
+ const result = await api.post(AI_PATH.sessionRename, { sessionId, title });
224
+ if (!result.success) {
225
+ throw new Error(`Session rename failed: ${result.error.message}`);
226
+ }
227
+ },
228
+ async removeSession(sessionId) {
229
+ const result = await api.post(AI_PATH.sessionRemove, { sessionId });
230
+ if (!result.success) {
231
+ throw new Error(`Session remove failed: ${result.error.message}`);
232
+ }
233
+ },
234
+ // ─── RAG ───
235
+ async ragQuery(query, options) {
236
+ const result = await api.post(AI_PATH.ragQuery, { query, ...options });
237
+ if (!result.success) {
238
+ throw new Error(`RAG query failed: ${result.error.message}`);
239
+ }
240
+ return result.data;
241
+ },
242
+ async *ragQueryStream(query, options) {
243
+ for await (const data of api.stream(AI_PATH.ragQueryStream, { query, ...options })) {
244
+ yield data;
245
+ }
246
+ },
247
+ // ─── Reasoning ───
248
+ async reasoningRun(query, options) {
249
+ const result = await api.post(AI_PATH.reasoningRun, { query, ...options });
250
+ if (!result.success) {
251
+ throw new Error(`Reasoning run failed: ${result.error.message}`);
252
+ }
253
+ return result.data;
254
+ },
255
+ async *reasoningRunStream(query, options) {
256
+ for await (const data of api.stream(AI_PATH.reasoningRunStream, { query, ...options })) {
257
+ yield data;
258
+ }
259
+ },
260
+ // ─── Token ───
261
+ async estimateTokens(text) {
262
+ const result = await api.post(AI_PATH.tokenEstimate, { text });
263
+ if (!result.success) {
264
+ throw new Error(`Token estimate failed: ${result.error.message}`);
265
+ }
266
+ return result.data;
267
+ }
268
+ };
269
+ }
270
+ async function* parseSSE(response) {
271
+ const reader = response.body?.getReader();
272
+ if (!reader) {
273
+ throw new Error("Response body is not readable");
274
+ }
275
+ const decoder = new TextDecoder();
276
+ let buffer = "";
277
+ try {
278
+ while (true) {
279
+ const { done, value } = await reader.read();
280
+ if (done)
281
+ break;
282
+ buffer += decoder.decode(value, { stream: true });
283
+ const lines = buffer.split("\n");
284
+ buffer = lines.pop() ?? "";
285
+ for (const line of lines) {
286
+ if (line.startsWith("data: ")) {
287
+ const data = line.slice(6);
288
+ if (data !== "[DONE]") {
289
+ yield data;
290
+ }
291
+ }
292
+ }
293
+ }
294
+ } finally {
295
+ reader.releaseLock();
296
+ }
297
+ }
298
+ async function collectStreamContent(stream) {
299
+ let content = "";
300
+ for await (const chunk of stream) {
301
+ const delta = chunk.choices[0]?.delta?.content;
302
+ if (delta) {
303
+ content += delta;
304
+ }
305
+ }
306
+ return content;
307
+ }
308
+
309
+ export { collectStreamContent, createA2AClient, createAIClient, parseSSE };
310
+ //# sourceMappingURL=chunk-ABP7RKIP.js.map
311
+ //# sourceMappingURL=chunk-ABP7RKIP.js.map