@h-ai/api-contract 1.0.0-beta.2 → 1.0.0-beta.20
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.en.md +51 -35
- package/README.ja.md +50 -34
- package/README.md +50 -34
- package/dist/ai/index.d.ts +5 -4
- package/dist/ai/index.js +2 -2
- package/dist/{chunk-5UEDYQLG.js → chunk-5LBEMLDK.js} +6 -3
- package/dist/chunk-5LBEMLDK.js.map +1 -0
- package/dist/{chunk-ZM7KM6V3.js → chunk-BAEWPPKY.js} +54 -11
- package/dist/chunk-BAEWPPKY.js.map +1 -0
- package/dist/{chunk-LD5PSL4C.js → chunk-NMTOSEVA.js} +84 -18
- package/dist/chunk-NMTOSEVA.js.map +1 -0
- package/dist/chunk-PS3OHILQ.js +571 -0
- package/dist/chunk-PS3OHILQ.js.map +1 -0
- package/dist/chunk-VEUL2AEK.js +330 -0
- package/dist/chunk-VEUL2AEK.js.map +1 -0
- package/dist/chunk-XFW626TI.js +115 -0
- package/dist/chunk-XFW626TI.js.map +1 -0
- package/dist/feedback/index.d.ts +30 -29
- package/dist/feedback/index.js +2 -2
- package/dist/iam/index.d.ts +4 -3
- package/dist/iam/index.js +2 -2
- package/dist/index.d.ts +22 -21
- package/dist/index.js +12 -12
- package/dist/payment/index.d.ts +6 -5
- package/dist/payment/index.js +2 -2
- package/dist/storage/index.d.ts +2 -1
- package/dist/storage/index.js +2 -2
- package/package.json +9 -9
- package/dist/chunk-5UEDYQLG.js.map +0 -1
- package/dist/chunk-CXOK55BY.js +0 -274
- package/dist/chunk-CXOK55BY.js.map +0 -1
- package/dist/chunk-FGB5O4VA.js +0 -164
- package/dist/chunk-FGB5O4VA.js.map +0 -1
- package/dist/chunk-LD5PSL4C.js.map +0 -1
- package/dist/chunk-M4DEKGOP.js +0 -67
- package/dist/chunk-M4DEKGOP.js.map +0 -1
- package/dist/chunk-ZM7KM6V3.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/storage-schemas.ts","../src/storage/storage-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-BAEWPPKY.js","sourcesContent":["/**\n * @h-ai/api-contract — Storage 领域 Schema\n *\n * 包含文件元数据、预签名 URL、文件列表与删除相关的 input/output Zod Schema。\n * 仅保留跨接口、跨层复用的数据结构;一次性输出包装在 contract 中内联。\n * @module storage-schemas\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { StorageDeleteKeysSchema, StorageKeySchema, StoragePrefixSchema, StoragePresignExpiresInSchema } from '@h-ai/storage/schemas'\nimport { z } from 'zod'\n\n/**\n * 文件元数据 Schema。\n * @example\n * ```ts\n * import { StorageFileMetadataSchema } from '@h-ai/api-contract'\n *\n * const value = StorageFileMetadataSchema.parse({\n * key: 'examples/readme.txt',\n * size: 0,\n * contentType: 'example',\n * lastModified: null\n * })\n * void value\n * ```\n */\nexport const StorageFileMetadataSchema = z.object({\n key: z.string(),\n size: z.number(),\n contentType: z.string(),\n lastModified: z.coerce.date(),\n etag: z.string().optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n})\n\n/**\n * 获取下载签名 URL 入参 Schema。\n * @example\n * ```ts\n * import { StoragePresignDownloadInputSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignDownloadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignDownloadInputSchema = z.strictObject({\n key: StorageKeySchema,\n expiresIn: StoragePresignExpiresInSchema.optional(),\n})\n\n/**\n * 获取上传签名 URL 入参 Schema。\n * @example\n * ```ts\n * import { StoragePresignUploadInputSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignUploadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignUploadInputSchema = z.strictObject({\n key: StorageKeySchema,\n contentType: z.string().optional(),\n expiresIn: StoragePresignExpiresInSchema.optional(),\n})\n\n/**\n * 签名 URL 业务数据 Schema。\n * @example\n * ```ts\n * import { StoragePresignedUrlSchema } from '@h-ai/api-contract'\n *\n * const value = StoragePresignedUrlSchema.parse({\n * url: 'https://example.com/resource',\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StoragePresignedUrlSchema = z.object({\n url: z.string(),\n key: z.string(),\n expiresAt: z.coerce.date().optional(),\n})\n\n/**\n * 文件列表查询入参 Schema。\n * @example\n * ```ts\n * import { StorageListFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageListFilesInputSchema.parse({})\n * void value\n * ```\n */\nexport const StorageListFilesInputSchema = z.object({\n prefix: StoragePrefixSchema.optional(),\n maxKeys: z.coerce.number().int().min(1).max(1000).optional(),\n continuationToken: z.string().optional(),\n delimiter: z.string().optional(),\n})\n\n/**\n * 文件列表业务数据 Schema。\n * @example\n * ```ts\n * import { StorageListFilesDataSchema } from '@h-ai/api-contract'\n *\n * const value = StorageListFilesDataSchema.parse({\n * files: [\n * {\n * key: 'examples/readme.txt',\n * size: 0,\n * contentType: 'example',\n * lastModified: null\n * }\n * ],\n * commonPrefixes: [\n * 'example'\n * ],\n * isTruncated: true\n * })\n * void value\n * ```\n */\nexport const StorageListFilesDataSchema = z.object({\n files: z.array(StorageFileMetadataSchema),\n commonPrefixes: z.array(z.string()),\n nextContinuationToken: z.string().optional(),\n isTruncated: z.boolean(),\n})\n\n/**\n * 单文件操作入参 Schema。\n * @example\n * ```ts\n * import { StorageFileKeyInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageFileKeyInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport const StorageFileKeyInputSchema = z.object({\n key: StorageKeySchema,\n})\n\n/**\n * 批量删除文件入参 Schema。\n * @example\n * ```ts\n * import { StorageDeleteFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value = StorageDeleteFilesInputSchema.parse({\n * keys: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport const StorageDeleteFilesInputSchema = z.object({\n keys: StorageDeleteKeysSchema,\n})\n\n/**\n * 批量删除的安全进度;响应失败时通过 error.ext.deleteMany 返回同一结构。\n * @example\n * ```ts\n * import { StorageDeleteSummarySchema } from '@h-ai/api-contract'\n *\n * const value = StorageDeleteSummarySchema.parse({\n * deletedKeys: [\n * 'example'\n * ],\n * failures: [\n * {\n * key: 'examples/readme.txt',\n * code: 'example-1',\n * retryable: true,\n * outcome: 'failed'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const StorageDeleteSummarySchema = z.object({\n deletedKeys: z.array(z.string()),\n failures: z.array(z.object({\n key: z.string(),\n code: z.string(),\n retryable: z.boolean(),\n outcome: z.enum(['failed', 'unknown', 'notAttempted']),\n })),\n})\n\n/**\n * 为对象生成下载地址的请求。\n * @example\n * ```ts\n * import type { StoragePresignDownloadInput } from '@h-ai/api-contract'\n * import { StoragePresignDownloadInputSchema } from '@h-ai/api-contract'\n *\n * const value: StoragePresignDownloadInput = StoragePresignDownloadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StoragePresignDownloadInput = z.infer<typeof StoragePresignDownloadInputSchema>\n/**\n * 为对象生成上传地址的请求。\n * @example\n * ```ts\n * import type { StoragePresignUploadInput } from '@h-ai/api-contract'\n * import { StoragePresignUploadInputSchema } from '@h-ai/api-contract'\n *\n * const value: StoragePresignUploadInput = StoragePresignUploadInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StoragePresignUploadInput = z.infer<typeof StoragePresignUploadInputSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 StoragePresignedUrlOutput 响应。\n * @example\n * ```ts\n * import type { StoragePresignedUrlOutput } from '@h-ai/api-contract'\n * import { StoragePresignedUrlSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: StoragePresignedUrlOutput = ok(StoragePresignedUrlSchema.parse({\n * url: 'https://example.com/resource',\n * key: 'examples/readme.txt'\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type StoragePresignedUrlOutput = HaiResult<z.infer<typeof StoragePresignedUrlSchema>>\n/**\n * 按前缀和游标列出对象的请求。\n * @example\n * ```ts\n * import type { StorageListFilesInput } from '@h-ai/api-contract'\n * import { StorageListFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageListFilesInput = StorageListFilesInputSchema.parse({})\n * void value\n * ```\n */\nexport type StorageListFilesInput = z.infer<typeof StorageListFilesInputSchema>\n/**\n * 以对象 key 定位文件的请求。\n * @example\n * ```ts\n * import type { StorageFileKeyInput } from '@h-ai/api-contract'\n * import { StorageFileKeyInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageFileKeyInput = StorageFileKeyInputSchema.parse({\n * key: 'examples/readme.txt'\n * })\n * void value\n * ```\n */\nexport type StorageFileKeyInput = z.infer<typeof StorageFileKeyInputSchema>\n/**\n * 批量删除指定对象 key 的请求。\n * @example\n * ```ts\n * import type { StorageDeleteFilesInput } from '@h-ai/api-contract'\n * import { StorageDeleteFilesInputSchema } from '@h-ai/api-contract'\n *\n * const value: StorageDeleteFilesInput = StorageDeleteFilesInputSchema.parse({\n * keys: [\n * 'example'\n * ]\n * })\n * void value\n * ```\n */\nexport type StorageDeleteFilesInput = z.infer<typeof StorageDeleteFilesInputSchema>\n","/**\n * @h-ai/api-contract — Storage 领域 contract\n *\n * 定义文件存储相关 API 的接口边界:预签名 URL 生成与文件管理。\n * 所有接口均需 Bearer Token 认证(由 `@h-ai/serv` 的 feature 层强制)。\n * 资源访问还须通过应用注入的 authorize 策略;认证不等同于拥有任意 key 的访问权。\n * @module storage-contract\n */\n\nimport { z } from 'zod'\nimport { HaiErrorSchema, haiResultSchema, HaiVoidResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n StorageDeleteFilesInputSchema,\n StorageDeleteSummarySchema,\n StorageFileKeyInputSchema,\n StorageFileMetadataSchema,\n StorageListFilesDataSchema,\n StorageListFilesInputSchema,\n StoragePresignDownloadInputSchema,\n StoragePresignedUrlSchema,\n StoragePresignUploadInputSchema,\n} from './storage-schemas.js'\n\n// 下载与上传接口共享同一响应结构,仅在本 contract 内复用。\nconst presignedUrlOutputSchema = haiResultSchema(StoragePresignedUrlSchema)\n\n/**\n * Storage 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.storage\n * void contract\n * ```\n */\nexport const storageContract = {\n presignedUrls: {\n createDownload: route({\n method: 'POST',\n path: '/storage/presigned-urls/download',\n operationId: 'storage.presignedUrls.createDownload',\n summary: 'Create presigned download URL',\n tags: ['storage'],\n })\n .input(StoragePresignDownloadInputSchema)\n .output(presignedUrlOutputSchema),\n createUpload: route({\n method: 'POST',\n path: '/storage/presigned-urls/upload',\n operationId: 'storage.presignedUrls.createUpload',\n summary: 'Create presigned upload URL',\n tags: ['storage'],\n })\n .input(StoragePresignUploadInputSchema)\n .output(presignedUrlOutputSchema),\n },\n files: {\n list: route({\n method: 'GET',\n path: '/storage/files',\n operationId: 'storage.files.list',\n summary: 'List files',\n tags: ['storage'],\n })\n .input(StorageListFilesInputSchema)\n .output(haiResultSchema(StorageListFilesDataSchema)),\n getMetadata: route({\n method: 'POST',\n path: '/storage/files/metadata',\n operationId: 'storage.files.getMetadata',\n summary: 'Get file metadata',\n tags: ['storage'],\n })\n .input(StorageFileKeyInputSchema)\n .output(haiResultSchema(StorageFileMetadataSchema)),\n delete: route({\n method: 'DELETE',\n path: '/storage/files',\n operationId: 'storage.files.delete',\n summary: 'Delete file',\n tags: ['storage'],\n })\n .input(StorageFileKeyInputSchema)\n .output(HaiVoidResultSchema),\n deleteMany: route({\n method: 'POST',\n path: '/storage/files/delete-many',\n operationId: 'storage.files.deleteMany',\n summary: 'Delete files',\n tags: ['storage'],\n })\n .input(StorageDeleteFilesInputSchema)\n .output(z.discriminatedUnion('success', [\n z.object({\n success: z.literal(true),\n data: StorageDeleteSummarySchema,\n }),\n z.object({\n success: z.literal(false),\n error: HaiErrorSchema.extend({\n ext: z.object({\n deleteMany: StorageDeleteSummarySchema.optional(),\n }).catchall(z.unknown()).optional(),\n }),\n }),\n ])),\n },\n}\n\n/**\n * storage 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { StorageContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: StorageContract = apiContract.storage\n * void contract\n * ```\n */\nexport type StorageContract = typeof storageContract\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { route, haiResultSchema } from './chunk-
|
|
1
|
+
import { route, haiResultSchema } from './chunk-5LBEMLDK.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
4
|
var AUDIO_WS_PATH = "/ai/audio";
|
|
@@ -20,7 +20,10 @@ var AudioWsStartMessageSchema = z.object({
|
|
|
20
20
|
instruction: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),
|
|
21
21
|
format: AudioFormatSchema.optional(),
|
|
22
22
|
sampleRate: z.number().int().min(MIN_SAMPLE_RATE).max(MAX_SAMPLE_RATE).optional(),
|
|
23
|
-
channels: z.union([
|
|
23
|
+
channels: z.union([
|
|
24
|
+
z.literal(1),
|
|
25
|
+
z.literal(2)
|
|
26
|
+
]).optional()
|
|
24
27
|
});
|
|
25
28
|
var AudioWsTextMessageSchema = z.object({
|
|
26
29
|
type: z.literal("text"),
|
|
@@ -59,7 +62,10 @@ var AiToolCallSchema = z.object({
|
|
|
59
62
|
arguments: z.string()
|
|
60
63
|
}).strict()
|
|
61
64
|
}).strict();
|
|
62
|
-
var AiTextMessageContentSchema = z.union([
|
|
65
|
+
var AiTextMessageContentSchema = z.union([
|
|
66
|
+
z.string(),
|
|
67
|
+
z.array(AiTextContentSchema)
|
|
68
|
+
]);
|
|
63
69
|
var AiChatMessageSchema = z.discriminatedUnion("role", [
|
|
64
70
|
z.object({
|
|
65
71
|
role: z.literal("system"),
|
|
@@ -107,14 +113,27 @@ var AiChatCompletionInputSchema = z.object({
|
|
|
107
113
|
z.literal("auto"),
|
|
108
114
|
z.literal("none"),
|
|
109
115
|
z.literal("required"),
|
|
110
|
-
z.object({
|
|
116
|
+
z.object({
|
|
117
|
+
type: z.literal("function"),
|
|
118
|
+
function: z.object({
|
|
119
|
+
name: z.string().min(1)
|
|
120
|
+
}).strict()
|
|
121
|
+
}).strict()
|
|
111
122
|
]).optional()
|
|
112
123
|
}).strict().superRefine((input, context) => {
|
|
113
124
|
const choice = input.tool_choice;
|
|
114
|
-
if (choice === "required" && !input.tools?.length)
|
|
115
|
-
context.addIssue({
|
|
116
|
-
|
|
117
|
-
|
|
125
|
+
if (choice === "required" && !input.tools?.length) {
|
|
126
|
+
context.addIssue({
|
|
127
|
+
code: "custom",
|
|
128
|
+
path: ["tool_choice"]
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
if (typeof choice === "object" && !input.tools?.some((tool) => tool.function.name === choice.function.name)) {
|
|
132
|
+
context.addIssue({
|
|
133
|
+
code: "custom",
|
|
134
|
+
path: ["tool_choice"]
|
|
135
|
+
});
|
|
136
|
+
}
|
|
118
137
|
});
|
|
119
138
|
var AiTokenUsageSchema = z.object({
|
|
120
139
|
prompt_tokens: z.number(),
|
|
@@ -129,7 +148,12 @@ var AiAssistantMessageSchema = z.object({
|
|
|
129
148
|
var AiChatCompletionChoiceSchema = z.object({
|
|
130
149
|
index: z.number(),
|
|
131
150
|
message: AiAssistantMessageSchema,
|
|
132
|
-
finish_reason: z.enum([
|
|
151
|
+
finish_reason: z.enum([
|
|
152
|
+
"stop",
|
|
153
|
+
"length",
|
|
154
|
+
"tool_calls",
|
|
155
|
+
"content_filter"
|
|
156
|
+
])
|
|
133
157
|
});
|
|
134
158
|
var AiChatCompletionDataSchema = z.object({
|
|
135
159
|
id: z.string(),
|
|
@@ -154,7 +178,13 @@ var AiSendMessageDataSchema = z.object({
|
|
|
154
178
|
model: z.string(),
|
|
155
179
|
usage: AiTokenUsageSchema.optional()
|
|
156
180
|
});
|
|
157
|
-
var AiMemoryTypeSchema = z.enum([
|
|
181
|
+
var AiMemoryTypeSchema = z.enum([
|
|
182
|
+
"fact",
|
|
183
|
+
"preference",
|
|
184
|
+
"event",
|
|
185
|
+
"entity",
|
|
186
|
+
"instruction"
|
|
187
|
+
]);
|
|
158
188
|
var AiMemoryEntrySchema = z.object({
|
|
159
189
|
id: z.string(),
|
|
160
190
|
content: z.string(),
|
|
@@ -231,19 +261,55 @@ var AiChatHistoryDataSchema = z.object({
|
|
|
231
261
|
// src/ai/ai-contract.ts
|
|
232
262
|
var aiContract = {
|
|
233
263
|
chats: {
|
|
234
|
-
createCompletion: route({
|
|
235
|
-
|
|
236
|
-
|
|
264
|
+
createCompletion: route({
|
|
265
|
+
method: "POST",
|
|
266
|
+
path: "/ai/chats/completions",
|
|
267
|
+
operationId: "ai.chats.createCompletion",
|
|
268
|
+
summary: "Create non-streaming chat completion with function tools",
|
|
269
|
+
tags: ["ai", "chats"]
|
|
270
|
+
}).input(AiChatCompletionInputSchema).output(haiResultSchema(AiChatCompletionDataSchema)),
|
|
271
|
+
sendMessage: route({
|
|
272
|
+
method: "POST",
|
|
273
|
+
path: "/ai/chats/messages",
|
|
274
|
+
operationId: "ai.chats.sendMessage",
|
|
275
|
+
summary: "Send a single chat message",
|
|
276
|
+
tags: ["ai", "chats"]
|
|
277
|
+
}).input(AiSendMessageInputSchema).output(haiResultSchema(AiSendMessageDataSchema)),
|
|
278
|
+
listHistory: route({
|
|
279
|
+
method: "POST",
|
|
280
|
+
path: "/ai/chats/history",
|
|
281
|
+
operationId: "ai.chats.listHistory",
|
|
282
|
+
summary: "List chat history",
|
|
283
|
+
tags: ["ai", "chats"]
|
|
284
|
+
}).input(AiChatHistoryInputSchema).output(haiResultSchema(AiChatHistoryDataSchema))
|
|
237
285
|
},
|
|
238
286
|
memories: {
|
|
239
|
-
recall: route({
|
|
240
|
-
|
|
287
|
+
recall: route({
|
|
288
|
+
method: "POST",
|
|
289
|
+
path: "/ai/memories/recall",
|
|
290
|
+
operationId: "ai.memories.recall",
|
|
291
|
+
summary: "Recall relevant memories",
|
|
292
|
+
tags: ["ai", "memories"]
|
|
293
|
+
}).input(AiMemoryRecallInputSchema).output(haiResultSchema(AiMemoryRecallDataSchema)),
|
|
294
|
+
list: route({
|
|
295
|
+
method: "POST",
|
|
296
|
+
path: "/ai/memories/list",
|
|
297
|
+
operationId: "ai.memories.list",
|
|
298
|
+
summary: "List memories",
|
|
299
|
+
tags: ["ai", "memories"]
|
|
300
|
+
}).input(AiMemoryListInputSchema).output(haiResultSchema(AiMemoryListDataSchema))
|
|
241
301
|
},
|
|
242
302
|
sessions: {
|
|
243
|
-
list: route({
|
|
303
|
+
list: route({
|
|
304
|
+
method: "POST",
|
|
305
|
+
path: "/ai/sessions/list",
|
|
306
|
+
operationId: "ai.sessions.list",
|
|
307
|
+
summary: "List sessions",
|
|
308
|
+
tags: ["ai", "sessions"]
|
|
309
|
+
}).input(AiSessionListInputSchema).output(haiResultSchema(AiSessionListDataSchema))
|
|
244
310
|
}
|
|
245
311
|
};
|
|
246
312
|
|
|
247
313
|
export { AUDIO_WS_PATH, AiAssistantMessageSchema, AiChatCompletionChoiceSchema, AiChatCompletionDataSchema, AiChatCompletionInputSchema, AiChatHistoryDataSchema, AiChatHistoryInputSchema, AiChatMessageSchema, AiChatRecordSchema, AiImageContentSchema, AiMemoryEntrySchema, AiMemoryListDataSchema, AiMemoryListInputSchema, AiMemoryRecallDataSchema, AiMemoryRecallInputSchema, AiMemoryTypeSchema, AiMessageContentSchema, AiMessageRoleSchema, AiSendMessageDataSchema, AiSendMessageInputSchema, AiSessionInfoSchema, AiSessionListDataSchema, AiSessionListInputSchema, AiTextContentSchema, AiTokenUsageSchema, AiToolCallSchema, AiToolDefinitionSchema, AudioFormatSchema, AudioWsClientMessageSchema, AudioWsDoneMessageSchema, AudioWsStartMessageSchema, AudioWsTextMessageSchema, aiContract };
|
|
248
|
-
//# sourceMappingURL=chunk-
|
|
249
|
-
//# sourceMappingURL=chunk-
|
|
314
|
+
//# sourceMappingURL=chunk-NMTOSEVA.js.map
|
|
315
|
+
//# sourceMappingURL=chunk-NMTOSEVA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ai/ai-audio-ws-schemas.ts","../src/ai/ai-schemas.ts","../src/ai/ai-contract.ts"],"names":["z"],"mappings":"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","file":"chunk-NMTOSEVA.js","sourcesContent":["/**\n * Audio WebSocket 传输协议的运行时 Schema。\n *\n * 该协议同时被 AI 客户端与 Serv 服务端消费,因此由 api-contract 维护单一事实源,\n * 避免 Serv 根入口为了校验可选 Audio 消息而静态加载整个 `@h-ai/ai` 包。\n */\nimport { z } from 'zod'\n\n/**\n * 统一语音入口的默认路径(相对 API 前缀)。\n * @example\n * ```ts\n * import { AUDIO_WS_PATH } from '@h-ai/api-contract'\n *\n * const endpoint = new URL(AUDIO_WS_PATH, 'https://api.example.com')\n * endpoint.protocol = 'wss:'\n * void endpoint\n * ```\n */\nexport const AUDIO_WS_PATH = '/ai/audio'\n\n/**\n * 合法音频格式。\n * @example\n * ```ts\n * import { AudioFormatSchema } from '@h-ai/api-contract'\n *\n * const value = AudioFormatSchema.parse('pcm16')\n * void value\n * ```\n */\nexport const AudioFormatSchema = z.enum(['pcm16', 'wav', 'mp3', 'opus'])\n\nconst MAX_CONTROL_FIELD_LEN = 512\nconst MAX_HINT_LEN = 256\nconst MAX_HINTS = 64\nconst MAX_SEGMENT_ID_LEN = 128\nconst MIN_SAMPLE_RATE = 8000\nconst MAX_SAMPLE_RATE = 192000\n\n/**\n * 会话起始帧 Schema。\n * @example\n * ```ts\n * import { AudioWsStartMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsStartMessageSchema.parse({\n * type: 'start',\n * operation: 'transcribe'\n * })\n * void value\n * ```\n */\nexport const AudioWsStartMessageSchema = z.object({\n type: z.literal('start'),\n operation: z.enum(['transcribe', 'synthesize']),\n stream: z.boolean().optional(),\n model: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n language: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n contextHints: z.array(z.string().max(MAX_HINT_LEN)).max(MAX_HINTS).optional(),\n voice: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n instruction: z.string().max(MAX_CONTROL_FIELD_LEN).optional(),\n format: AudioFormatSchema.optional(),\n sampleRate: z.number().int().min(MIN_SAMPLE_RATE).max(MAX_SAMPLE_RATE).optional(),\n channels: z.union([\n z.literal(1),\n z.literal(2),\n ]).optional(),\n})\n\n/**\n * 文本输入帧 Schema。\n * @example\n * ```ts\n * import { AudioWsTextMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsTextMessageSchema.parse({\n * type: 'text',\n * segmentId: 'example',\n * text: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AudioWsTextMessageSchema = z.object({\n type: z.literal('text'),\n segmentId: z.string().min(1).max(MAX_SEGMENT_ID_LEN),\n text: z.string(),\n})\n\n/**\n * 输入结束帧 Schema。\n * @example\n * ```ts\n * import { AudioWsDoneMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsDoneMessageSchema.parse({\n * type: 'done'\n * })\n * void value\n * ```\n */\nexport const AudioWsDoneMessageSchema = z.object({\n type: z.literal('done'),\n})\n\n/**\n * 客户端 JSON 控制消息 Schema。\n * @example\n * ```ts\n * import { AudioWsClientMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AudioWsClientMessageSchema.parse({\n * type: 'start',\n * operation: 'transcribe'\n * })\n * void value\n * ```\n */\nexport const AudioWsClientMessageSchema = z.discriminatedUnion('type', [\n AudioWsStartMessageSchema,\n AudioWsTextMessageSchema,\n AudioWsDoneMessageSchema,\n])\n","/**\n * @h-ai/api-contract — AI 领域 Schema\n *\n * 包含聊天补全、消息占位、记忆召回与历史会话相关的 input/output Zod Schema。\n * 默认聊天补全为非流式 JSON,支持 function tool calling;未声明字段在边界拒绝。\n * 仅保留跨接口、跨层复用的数据结构;一次性输出包装在 contract 中内联。\n * @module ai-schemas\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { z } from 'zod'\n\n/**\n * 消息角色 Schema。\n * @example\n * ```ts\n * import { AiMessageRoleSchema } from '@h-ai/api-contract'\n *\n * const value = AiMessageRoleSchema.parse('system')\n * void value\n * ```\n */\nexport const AiMessageRoleSchema = z.enum(['system', 'user', 'assistant', 'tool'])\n\n/**\n * 文本内容 Schema。\n * @example\n * ```ts\n * import { AiTextContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiTextContentSchema.parse({\n * type: 'text',\n * text: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiTextContentSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n}).strict()\n\n/**\n * 图片内容 Schema。\n * @example\n * ```ts\n * import { AiImageContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiImageContentSchema.parse({\n * type: 'image_url',\n * image_url: {\n * url: 'https://example.com/resource'\n * }\n * })\n * void value\n * ```\n */\nexport const AiImageContentSchema = 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 }).strict(),\n}).strict()\n\n/**\n * 消息内容 Schema。\n * @example\n * ```ts\n * import { AiMessageContentSchema } from '@h-ai/api-contract'\n *\n * const value = AiMessageContentSchema.parse('example')\n * void value\n * ```\n */\nexport const AiMessageContentSchema = z.union([\n z.string(),\n z.array(z.union([AiTextContentSchema, AiImageContentSchema])),\n])\n\n/**\n * 工具调用 Schema。\n * @example\n * ```ts\n * import { AiToolCallSchema } from '@h-ai/api-contract'\n *\n * const value = AiToolCallSchema.parse({\n * id: 'call_1',\n * type: 'function',\n * function: {\n * name: 'lookupOrder',\n * arguments: '{\\'id\\':\\'order_1\\'}'\n * }\n * })\n * void value\n * ```\n */\nexport const AiToolCallSchema = z.object({\n id: z.string().min(1),\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n arguments: z.string(),\n }).strict(),\n}).strict()\n\n/** system、assistant 和 tool 只接收文本,不把图片 URL 静默转换为文本。 */\nconst AiTextMessageContentSchema = z.union([\n z.string(),\n z.array(AiTextContentSchema),\n])\n\n/**\n * 按角色校验聊天消息;工具结果必须携带非空 tool_call_id。\n * @example\n * ```ts\n * import { AiChatMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatMessageSchema.parse({\n * role: 'system',\n * content: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiChatMessageSchema = z.discriminatedUnion('role', [\n z.object({\n role: z.literal('system'),\n content: AiTextMessageContentSchema,\n name: z.string().optional(),\n }).strict(),\n z.object({\n role: z.literal('user'),\n content: AiMessageContentSchema,\n name: z.string().optional(),\n }).strict(),\n z.object({\n role: z.literal('assistant'),\n content: AiTextMessageContentSchema.nullable().optional(),\n name: z.string().optional(),\n tool_calls: z.array(AiToolCallSchema).min(1).optional(),\n }).strict().refine(message => message.content != null || message.tool_calls !== undefined),\n z.object({\n role: z.literal('tool'),\n content: AiTextMessageContentSchema,\n tool_call_id: z.string().min(1),\n }).strict(),\n])\n\n/**\n * 完整的 function 工具定义;parameters 保留嵌套 JSON Schema,不裁剪其关键字。\n * @example\n * ```ts\n * import { AiToolDefinitionSchema } from '@h-ai/api-contract'\n *\n * const value = AiToolDefinitionSchema.parse({\n * type: 'function',\n * function: {\n * name: 'lookupOrder',\n * description: 'Look up an order',\n * parameters: {\n * type: 'object',\n * properties: {\n * id: {\n * type: 'string'\n * }\n * },\n * required: [\n * 'id'\n * ]\n * }\n * }\n * })\n * void value\n * ```\n */\nexport const AiToolDefinitionSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n parameters: z.record(z.string(), z.json()).optional(),\n strict: z.boolean().nullable().optional(),\n }).strict(),\n}).strict()\n\n/**\n * 非流式聊天补全入参;stream 等未声明字段明确拒绝。\n * @example\n * ```ts\n * import { AiChatCompletionInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionInputSchema.parse({\n * messages: [\n * {\n * role: 'user',\n * content: 'Say hello'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionInputSchema = z.object({\n /** 默认绑定认证用户;跨主体访问需服务端显式授权。 */\n objectId: z.string().min(1).optional(),\n /** 用户主体内的会话 ID,省略时为 default。 */\n sessionId: z.string().min(1).optional(),\n model: z.string().optional(),\n messages: z.array(AiChatMessageSchema).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 tools: z.array(AiToolDefinitionSchema).min(1).optional(),\n tool_choice: z.union([\n z.literal('auto'),\n z.literal('none'),\n z.literal('required'),\n z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n }).strict(),\n }).strict(),\n ]).optional(),\n}).strict().superRefine((input, context) => {\n const choice = input.tool_choice\n if (choice === 'required' && !input.tools?.length) {\n context.addIssue({\n code: 'custom',\n path: ['tool_choice'],\n })\n }\n if (typeof choice === 'object' && !input.tools?.some(tool => tool.function.name === choice.function.name)) {\n context.addIssue({\n code: 'custom',\n path: ['tool_choice'],\n })\n }\n})\n\n/**\n * Token 使用统计 Schema。\n * @example\n * ```ts\n * import { AiTokenUsageSchema } from '@h-ai/api-contract'\n *\n * const value = AiTokenUsageSchema.parse({\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * })\n * void value\n * ```\n */\nexport const AiTokenUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n})\n\n/**\n * 助手消息 Schema。\n * @example\n * ```ts\n * import { AiAssistantMessageSchema } from '@h-ai/api-contract'\n *\n * const value = AiAssistantMessageSchema.parse({\n * role: 'assistant',\n * content: 'Hello'\n * })\n * void value\n * ```\n */\nexport const AiAssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.string().nullable().optional(),\n tool_calls: z.array(AiToolCallSchema).optional(),\n})\n\n/**\n * 聊天完成选择 Schema。\n * @example\n * ```ts\n * import { AiChatCompletionChoiceSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionChoiceSchema.parse({\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: AiAssistantMessageSchema,\n finish_reason: z.enum([\n 'stop',\n 'length',\n 'tool_calls',\n 'content_filter',\n ]),\n})\n\n/**\n * 聊天完成业务数据 Schema。\n * @example\n * ```ts\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * })\n * void value\n * ```\n */\nexport const AiChatCompletionDataSchema = z.object({\n id: z.string(),\n object: z.literal('chat.completion'),\n created: z.number(),\n model: z.string(),\n choices: z.array(AiChatCompletionChoiceSchema),\n usage: AiTokenUsageSchema,\n})\n\n/**\n * 简单消息入参 Schema。\n * @example\n * ```ts\n * import { AiSendMessageInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiSendMessageInputSchema.parse({\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport const AiSendMessageInputSchema = z.object({\n /** 默认绑定认证用户;跨主体访问需服务端显式授权。 */\n objectId: z.string().min(1).optional(),\n /** 用户主体内的会话 ID,省略时为 default。 */\n sessionId: z.string().min(1).optional(),\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/**\n * 简单消息业务数据 Schema。\n * @example\n * ```ts\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * })\n * void value\n * ```\n */\nexport const AiSendMessageDataSchema = z.object({\n content: z.string(),\n model: z.string(),\n usage: AiTokenUsageSchema.optional(),\n})\n\n/**\n * 记忆类型 Schema。\n * @example\n * ```ts\n * import { AiMemoryTypeSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryTypeSchema.parse('fact')\n * void value\n * ```\n */\nexport const AiMemoryTypeSchema = z.enum([\n 'fact',\n 'preference',\n 'event',\n 'entity',\n 'instruction',\n])\n\n/**\n * 记忆条目 Schema。\n * @example\n * ```ts\n * import { AiMemoryEntrySchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryEntrySchema.parse({\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * })\n * void value\n * ```\n */\nexport const AiMemoryEntrySchema = z.object({\n id: z.string(),\n content: z.string(),\n type: AiMemoryTypeSchema,\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/**\n * 记忆检索入参 Schema。\n * @example\n * ```ts\n * import { AiMemoryRecallInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryRecallInputSchema.parse({\n * query: 'example'\n * })\n * void value\n * ```\n */\nexport const AiMemoryRecallInputSchema = z.object({\n query: z.string().min(1),\n topK: z.number().int().min(1).optional(),\n types: z.array(AiMemoryTypeSchema).optional(),\n minImportance: z.number().min(0).max(1).optional(),\n objectId: z.string().min(1).optional(),\n})\n\n/**\n * 记忆检索业务数据 Schema。\n * @example\n * ```ts\n * import { AiMemoryRecallDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryRecallDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiMemoryRecallDataSchema = z.object({\n items: z.array(AiMemoryEntrySchema),\n})\n\n/**\n * 记忆列表入参 Schema。\n * @example\n * ```ts\n * import { AiMemoryListInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryListInputSchema.parse({})\n * void value\n * ```\n */\nexport const AiMemoryListInputSchema = z.object({\n types: z.array(AiMemoryTypeSchema).optional(),\n objectId: z.string().min(1).optional(),\n offset: z.number().int().min(0).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n})\n\n/**\n * 记忆列表业务数据 Schema。\n * @example\n * ```ts\n * import { AiMemoryListDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiMemoryListDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * content: 'Hello',\n * type: 'fact',\n * importance: 0,\n * createdAt: 0,\n * lastAccessedAt: 0,\n * accessCount: 0\n * }\n * ],\n * total: 0\n * })\n * void value\n * ```\n */\nexport const AiMemoryListDataSchema = z.object({\n items: z.array(AiMemoryEntrySchema),\n total: z.number(),\n})\n\n/**\n * 会话信息 Schema。\n * @example\n * ```ts\n * import { AiSessionInfoSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionInfoSchema.parse({\n * objectId: 'example',\n * sessionId: 'example',\n * createdAt: 0,\n * updatedAt: 0\n * })\n * void value\n * ```\n */\nexport const AiSessionInfoSchema = 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/**\n * 会话列表入参 Schema。\n * @example\n * ```ts\n * import { AiSessionListInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionListInputSchema.parse({})\n * void value\n * ```\n */\nexport const AiSessionListInputSchema = z.object({\n /** 省略时由服务端绑定认证用户,不能据客户端参数推断身份。 */\n objectId: z.string().min(1).optional(),\n})\n\n/**\n * 会话列表业务数据 Schema。\n * @example\n * ```ts\n * import { AiSessionListDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiSessionListDataSchema.parse({\n * items: [\n * {\n * objectId: 'example',\n * sessionId: 'example',\n * createdAt: 0,\n * updatedAt: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiSessionListDataSchema = z.object({\n items: z.array(AiSessionInfoSchema),\n})\n\n/**\n * 对话记录 Schema。\n * @example\n * ```ts\n * import { AiChatRecordSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatRecordSchema.parse({\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * })\n * void value\n * ```\n */\nexport const AiChatRecordSchema = 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(AiChatMessageSchema),\n }),\n response: z.object({\n content: z.string(),\n toolCalls: z.array(AiToolCallSchema).optional(),\n finishReason: z.string(),\n usage: AiTokenUsageSchema,\n }),\n createdAt: z.number(),\n duration: z.number(),\n})\n\n/**\n * 对话历史入参 Schema。\n * @example\n * ```ts\n * import { AiChatHistoryInputSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatHistoryInputSchema.parse({\n * sessionId: 'example'\n * })\n * void value\n * ```\n */\nexport const AiChatHistoryInputSchema = z.object({\n /** 省略时由服务端绑定认证用户,跨主体访问需显式授权。 */\n objectId: z.string().min(1).optional(),\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/**\n * 对话历史业务数据 Schema。\n * @example\n * ```ts\n * import { AiChatHistoryDataSchema } from '@h-ai/api-contract'\n *\n * const value = AiChatHistoryDataSchema.parse({\n * items: [\n * {\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport const AiChatHistoryDataSchema = z.object({\n items: z.array(AiChatRecordSchema),\n})\n\n/**\n * 聊天补全请求,含消息、模型和生成参数。\n * @example\n * ```ts\n * import type { AiChatCompletionInput } from '@h-ai/api-contract'\n * import { AiChatCompletionInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatCompletionInput = AiChatCompletionInputSchema.parse({\n * messages: [\n * {\n * role: 'user',\n * content: 'Say hello'\n * }\n * ]\n * })\n * void value\n * ```\n */\nexport type AiChatCompletionInput = z.infer<typeof AiChatCompletionInputSchema>\n/**\n * 聊天补全业务数据,含候选消息与用量。\n * @example\n * ```ts\n * import type { AiChatCompletionData } from '@h-ai/api-contract'\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatCompletionData = AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * })\n * void value\n * ```\n */\nexport type AiChatCompletionData = z.infer<typeof AiChatCompletionDataSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 AiChatCompletionOutput 响应。\n * @example\n * ```ts\n * import type { AiChatCompletionOutput } from '@h-ai/api-contract'\n * import { AiChatCompletionDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: AiChatCompletionOutput = ok(AiChatCompletionDataSchema.parse({\n * id: 'example-1',\n * object: 'chat.completion',\n * created: 0,\n * model: 'example',\n * choices: [\n * {\n * index: 0,\n * message: {\n * role: 'assistant',\n * content: 'Hello'\n * },\n * finish_reason: 'stop'\n * }\n * ],\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type AiChatCompletionOutput = HaiResult<AiChatCompletionData>\n/**\n * 会话消息发送请求。\n * @example\n * ```ts\n * import type { AiSendMessageInput } from '@h-ai/api-contract'\n * import { AiSendMessageInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiSendMessageInput = AiSendMessageInputSchema.parse({\n * message: 'example'\n * })\n * void value\n * ```\n */\nexport type AiSendMessageInput = z.infer<typeof AiSendMessageInputSchema>\n/**\n * 会话消息写入后的业务数据。\n * @example\n * ```ts\n * import type { AiSendMessageData } from '@h-ai/api-contract'\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n *\n * const value: AiSendMessageData = AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * })\n * void value\n * ```\n */\nexport type AiSendMessageData = z.infer<typeof AiSendMessageDataSchema>\n/**\n * 以 HaiResult 区分成功业务数据和公共错误的 AiSendMessageOutput 响应。\n * @example\n * ```ts\n * import type { AiSendMessageOutput } from '@h-ai/api-contract'\n * import { AiSendMessageDataSchema } from '@h-ai/api-contract'\n * import { ok } from '@h-ai/core'\n *\n * const response: AiSendMessageOutput = ok(AiSendMessageDataSchema.parse({\n * content: 'Hello',\n * model: 'example'\n * }))\n * if (response.success) void response.data\n * ```\n */\nexport type AiSendMessageOutput = HaiResult<AiSendMessageData>\n/**\n * 按主体和条件检索记忆的请求。\n * @example\n * ```ts\n * import type { AiMemoryRecallInput } from '@h-ai/api-contract'\n * import { AiMemoryRecallInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiMemoryRecallInput = AiMemoryRecallInputSchema.parse({\n * query: 'example'\n * })\n * void value\n * ```\n */\nexport type AiMemoryRecallInput = z.infer<typeof AiMemoryRecallInputSchema>\n/**\n * 按主体查询记忆列表的分页请求。\n * @example\n * ```ts\n * import type { AiMemoryListInput } from '@h-ai/api-contract'\n * import { AiMemoryListInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiMemoryListInput = AiMemoryListInputSchema.parse({})\n * void value\n * ```\n */\nexport type AiMemoryListInput = z.infer<typeof AiMemoryListInputSchema>\n/**\n * 按主体列出会话的分页请求。\n * @example\n * ```ts\n * import type { AiSessionListInput } from '@h-ai/api-contract'\n * import { AiSessionListInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiSessionListInput = AiSessionListInputSchema.parse({})\n * void value\n * ```\n */\nexport type AiSessionListInput = z.infer<typeof AiSessionListInputSchema>\n/**\n * 读取指定会话历史的请求。\n * @example\n * ```ts\n * import type { AiChatHistoryInput } from '@h-ai/api-contract'\n * import { AiChatHistoryInputSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatHistoryInput = AiChatHistoryInputSchema.parse({\n * sessionId: 'example'\n * })\n * void value\n * ```\n */\nexport type AiChatHistoryInput = z.infer<typeof AiChatHistoryInputSchema>\n/**\n * 会话持久化消息记录。\n * @example\n * ```ts\n * import type { AiChatRecord } from '@h-ai/api-contract'\n * import { AiChatRecordSchema } from '@h-ai/api-contract'\n *\n * const value: AiChatRecord = AiChatRecordSchema.parse({\n * id: 'example-1',\n * objectId: 'example',\n * sessionId: 'example',\n * request: {\n * model: 'example',\n * messages: [\n * {\n * role: 'system',\n * content: 'Hello'\n * }\n * ]\n * },\n * response: {\n * content: 'Hello',\n * finishReason: 'example',\n * usage: {\n * prompt_tokens: 0,\n * completion_tokens: 0,\n * total_tokens: 0\n * }\n * },\n * createdAt: 0,\n * duration: 0\n * })\n * void value\n * ```\n */\nexport type AiChatRecord = z.infer<typeof AiChatRecordSchema>\n","/**\n * @h-ai/api-contract — AI 领域 contract\n *\n * 定义 AI 功能相关 API 的接口边界:聊天补全、记忆管理与会话管理。\n * 聊天补全使用 OpenAI 兼容结构(`messages` 数组 + `choices` 数组)。\n * 所有接口均需 Bearer Token 认证(由 `@h-ai/serv` 的 feature 层强制)。\n * 默认绑定认证用户的 objectId;其它主体和会话的访问须经过服务端资源授权。\n * @module ai-contract\n */\n\nimport { haiResultSchema } from '../common/result-schemas.js'\nimport { route } from '../common/route.js'\nimport {\n AiChatCompletionDataSchema,\n AiChatCompletionInputSchema,\n AiChatHistoryDataSchema,\n AiChatHistoryInputSchema,\n AiMemoryListDataSchema,\n AiMemoryListInputSchema,\n AiMemoryRecallDataSchema,\n AiMemoryRecallInputSchema,\n AiSendMessageDataSchema,\n AiSendMessageInputSchema,\n AiSessionListDataSchema,\n AiSessionListInputSchema,\n} from './ai-schemas.js'\n\n/**\n * AI 领域 oRPC contract。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract = apiContract.ai\n * void contract\n * ```\n */\nexport const aiContract = {\n chats: {\n createCompletion: route({\n method: 'POST',\n path: '/ai/chats/completions',\n operationId: 'ai.chats.createCompletion',\n summary: 'Create non-streaming chat completion with function tools',\n tags: ['ai', 'chats'],\n })\n .input(AiChatCompletionInputSchema)\n .output(haiResultSchema(AiChatCompletionDataSchema)),\n sendMessage: route({\n method: 'POST',\n path: '/ai/chats/messages',\n operationId: 'ai.chats.sendMessage',\n summary: 'Send a single chat message',\n tags: ['ai', 'chats'],\n })\n .input(AiSendMessageInputSchema)\n .output(haiResultSchema(AiSendMessageDataSchema)),\n listHistory: route({\n method: 'POST',\n path: '/ai/chats/history',\n operationId: 'ai.chats.listHistory',\n summary: 'List chat history',\n tags: ['ai', 'chats'],\n })\n .input(AiChatHistoryInputSchema)\n .output(haiResultSchema(AiChatHistoryDataSchema)),\n },\n memories: {\n recall: route({\n method: 'POST',\n path: '/ai/memories/recall',\n operationId: 'ai.memories.recall',\n summary: 'Recall relevant memories',\n tags: ['ai', 'memories'],\n })\n .input(AiMemoryRecallInputSchema)\n .output(haiResultSchema(AiMemoryRecallDataSchema)),\n list: route({\n method: 'POST',\n path: '/ai/memories/list',\n operationId: 'ai.memories.list',\n summary: 'List memories',\n tags: ['ai', 'memories'],\n })\n .input(AiMemoryListInputSchema)\n .output(haiResultSchema(AiMemoryListDataSchema)),\n },\n sessions: {\n list: route({\n method: 'POST',\n path: '/ai/sessions/list',\n operationId: 'ai.sessions.list',\n summary: 'List sessions',\n tags: ['ai', 'sessions'],\n })\n .input(AiSessionListInputSchema)\n .output(haiResultSchema(AiSessionListDataSchema)),\n },\n}\n\n/**\n * ai 领域公开 procedure 契约的完整类型。\n * @example\n * ```ts\n * import type { AiContract } from '@h-ai/api-contract'\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const contract: AiContract = apiContract.ai\n * void contract\n * ```\n */\nexport type AiContract = typeof aiContract\n"]}
|