@h-ai/api-contract 1.0.0-beta.17 → 1.0.0-beta.19

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 CHANGED
@@ -45,8 +45,15 @@ import { z } from 'zod'
45
45
 
46
46
  export const appContract = {
47
47
  ping: apiContract
48
- .route({ method: 'POST', path: '/app/ping', operationId: 'app.ping', tags: ['app'] })
49
- .output(apiContract.haiResultSchema(z.object({ pong: z.boolean() }))),
48
+ .route({
49
+ method: 'POST',
50
+ path: '/app/ping',
51
+ operationId: 'app.ping',
52
+ tags: ['app']
53
+ })
54
+ .output(apiContract.haiResultSchema(z.object({
55
+ pong: z.boolean()
56
+ }))),
50
57
  }
51
58
  ```
52
59
 
package/README.ja.md CHANGED
@@ -45,8 +45,15 @@ import { z } from 'zod'
45
45
 
46
46
  export const appContract = {
47
47
  ping: apiContract
48
- .route({ method: 'POST', path: '/app/ping', operationId: 'app.ping', tags: ['app'] })
49
- .output(apiContract.haiResultSchema(z.object({ pong: z.boolean() }))),
48
+ .route({
49
+ method: 'POST',
50
+ path: '/app/ping',
51
+ operationId: 'app.ping',
52
+ tags: ['app']
53
+ })
54
+ .output(apiContract.haiResultSchema(z.object({
55
+ pong: z.boolean()
56
+ }))),
50
57
  }
51
58
  ```
52
59
 
package/README.md CHANGED
@@ -45,8 +45,15 @@ import { z } from 'zod'
45
45
 
46
46
  export const appContract = {
47
47
  ping: apiContract
48
- .route({ method: 'POST', path: '/app/ping', operationId: 'app.ping', tags: ['app'] })
49
- .output(apiContract.haiResultSchema(z.object({ pong: z.boolean() }))),
48
+ .route({
49
+ method: 'POST',
50
+ path: '/app/ping',
51
+ operationId: 'app.ping',
52
+ tags: ['app']
53
+ })
54
+ .output(apiContract.haiResultSchema(z.object({
55
+ pong: z.boolean()
56
+ }))),
50
57
  }
51
58
  ```
52
59
 
@@ -260,9 +260,9 @@ declare const aiContract: {
260
260
  }, zod_v4_core.$strict>>>;
261
261
  }, zod_v4_core.$strip>;
262
262
  finish_reason: zod.ZodEnum<{
263
- length: "length";
264
263
  tool_calls: "tool_calls";
265
264
  stop: "stop";
265
+ length: "length";
266
266
  content_filter: "content_filter";
267
267
  }>;
268
268
  }, zod_v4_core.$strip>>;
@@ -934,9 +934,9 @@ declare const AiChatCompletionChoiceSchema: z.ZodObject<{
934
934
  }, z.core.$strict>>>;
935
935
  }, z.core.$strip>;
936
936
  finish_reason: z.ZodEnum<{
937
- length: "length";
938
937
  tool_calls: "tool_calls";
939
938
  stop: "stop";
939
+ length: "length";
940
940
  content_filter: "content_filter";
941
941
  }>;
942
942
  }, z.core.$strip>;
@@ -990,9 +990,9 @@ declare const AiChatCompletionDataSchema: z.ZodObject<{
990
990
  }, z.core.$strict>>>;
991
991
  }, z.core.$strip>;
992
992
  finish_reason: z.ZodEnum<{
993
- length: "length";
994
993
  tool_calls: "tool_calls";
995
994
  stop: "stop";
995
+ length: "length";
996
996
  content_filter: "content_filter";
997
997
  }>;
998
998
  }, z.core.$strip>>;
@@ -1751,4 +1751,5 @@ type AiChatHistoryInput = z.infer<typeof AiChatHistoryInputSchema>;
1751
1751
  */
1752
1752
  type AiChatRecord = z.infer<typeof AiChatRecordSchema>;
1753
1753
 
1754
- export { AUDIO_WS_PATH, AiAssistantMessageSchema, AiChatCompletionChoiceSchema, type AiChatCompletionData, AiChatCompletionDataSchema, type AiChatCompletionInput, AiChatCompletionInputSchema, type AiChatCompletionOutput, AiChatHistoryDataSchema, type AiChatHistoryInput, AiChatHistoryInputSchema, AiChatMessageSchema, type AiChatRecord, AiChatRecordSchema, type AiContract, AiImageContentSchema, AiMemoryEntrySchema, AiMemoryListDataSchema, type AiMemoryListInput, AiMemoryListInputSchema, AiMemoryRecallDataSchema, type AiMemoryRecallInput, AiMemoryRecallInputSchema, AiMemoryTypeSchema, AiMessageContentSchema, AiMessageRoleSchema, type AiSendMessageData, AiSendMessageDataSchema, type AiSendMessageInput, AiSendMessageInputSchema, type AiSendMessageOutput, AiSessionInfoSchema, AiSessionListDataSchema, type AiSessionListInput, AiSessionListInputSchema, AiTextContentSchema, AiTokenUsageSchema, AiToolCallSchema, AiToolDefinitionSchema, AudioFormatSchema, AudioWsClientMessageSchema, AudioWsDoneMessageSchema, AudioWsStartMessageSchema, AudioWsTextMessageSchema, aiContract };
1754
+ 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 };
1755
+ export type { AiChatCompletionData, AiChatCompletionInput, AiChatCompletionOutput, AiChatHistoryInput, AiChatRecord, AiContract, AiMemoryListInput, AiMemoryRecallInput, AiSendMessageData, AiSendMessageInput, AiSendMessageOutput, AiSessionListInput };
package/dist/ai/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 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 } from '../chunk-LD5PSL4C.js';
2
- import '../chunk-5UEDYQLG.js';
1
+ 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 } from '../chunk-NMTOSEVA.js';
2
+ import '../chunk-5LBEMLDK.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -3,7 +3,10 @@ import { oc } from '@orpc/contract';
3
3
 
4
4
  // src/common/result-schemas.ts
5
5
  var HaiErrorSchema = z.object({
6
- code: z.union([z.string(), z.number()]),
6
+ code: z.union([
7
+ z.string(),
8
+ z.number()
9
+ ]),
7
10
  message: z.string(),
8
11
  traceId: z.string().max(128).optional(),
9
12
  httpStatus: z.number().optional(),
@@ -35,5 +38,5 @@ function pathOf(procedure) {
35
38
  }
36
39
 
37
40
  export { HaiErrorSchema, HaiVoidResultSchema, haiResultSchema, pathOf, route };
38
- //# sourceMappingURL=chunk-5UEDYQLG.js.map
39
- //# sourceMappingURL=chunk-5UEDYQLG.js.map
41
+ //# sourceMappingURL=chunk-5LBEMLDK.js.map
42
+ //# sourceMappingURL=chunk-5LBEMLDK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/result-schemas.ts","../src/common/route.ts"],"names":[],"mappings":";;;;AA0BO,IAAM,cAAA,GAAiB,EAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAM,EAAE,KAAA,CAAM;AAAA,IACZ,EAAE,MAAA,EAAO;AAAA,IACT,EAAE,MAAA;AAAO,GACV,CAAA;AAAA,EACD,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,SAAS,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,GAAG,EAAE,QAAA,EAAS;AAAA,EACtC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC5B,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,GAAA,EAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AACzC,CAAC;AAiBM,SAAS,gBAAqC,UAAA,EAAe;AAClE,EAAA,OAAO,CAAA,CAAE,mBAAmB,SAAA,EAAW;AAAA,IACrC,EAAE,MAAA,CAAO;AAAA,MACP,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,MACvB,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACD,EAAE,MAAA,CAAO;AAAA,MACP,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,MACxB,KAAA,EAAO;AAAA,KACR;AAAA,GACF,CAAA;AACH;AAYO,IAAM,mBAAA,GAAsB,eAAA,CAAgB,CAAA,CAAE,IAAA,EAAM;ACzDpD,IAAM,QAAyB,CAAA,GAAI,IAAA,KAAS,EAAA,CAAG,KAAA,CAAM,GAAG,IAAI;AAkB5D,SAAS,OAAO,SAAA,EAA+C;AACpE,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAO,CAAA,CAAE,KAAA,CAAM,IAAA;AACtC,EAAA,IAAI,CAAC,IAAA;AACH,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAC/D,EAAA,OAAO,IAAA;AACT","file":"chunk-5LBEMLDK.js","sourcesContent":["/**\n * @h-ai/api-contract — HaiResult Schema\n *\n * 提供与 `@h-ai/core` HaiResult<T> 结构一致的 Zod Schema 工厂,\n * 用于 oRPC contract 的 output 定义和客户端响应校验。\n * @module result-schemas\n */\n\nimport { z } from 'zod'\n\n/**\n * HaiError 的跨端 JSON Schema。\n *\n * 仅描述公共错误字段,不暴露内部异常对象结构。\n * @example\n * ```ts\n * import { HaiErrorSchema } from '@h-ai/api-contract'\n *\n * const value = HaiErrorSchema.parse({\n * code: 'app:orders:001',\n * message: 'Order not found',\n * httpStatus: 404\n * })\n * void value\n * ```\n */\nexport const HaiErrorSchema = z.object({\n code: z.union([\n z.string(),\n z.number(),\n ]),\n message: z.string(),\n traceId: z.string().max(128).optional(),\n httpStatus: z.number().optional(),\n system: z.string().optional(),\n module: z.string().optional(),\n cause: z.unknown().optional(),\n suggestion: z.string().optional(),\n ext: z.record(z.string(), z.unknown()).optional(),\n})\n\n/**\n * 创建与 @h-ai/core HaiResult<T> 一致的响应 Schema。\n *\n * @param dataSchema - 成功分支 data 字段 Schema\n * @returns HaiResult<T> 的 Zod Schema\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n * import { z } from 'zod'\n *\n * const result = apiContract.haiResultSchema(z.object({ id: z.string() }))\n * .parse({ success: true, data: { id: 'order_1' } })\n * if (result.success) void result.data.id\n * ```\n */\nexport function haiResultSchema<T extends z.ZodType>(dataSchema: T) {\n return z.discriminatedUnion('success', [\n z.object({\n success: z.literal(true),\n data: dataSchema,\n }),\n z.object({\n success: z.literal(false),\n error: HaiErrorSchema,\n }),\n ])\n}\n\n/**\n * 无内容成功响应 Schema。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const result = apiContract.voidResultSchema.parse({ success: true, data: undefined })\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\nexport const HaiVoidResultSchema = haiResultSchema(z.void())\n","/**\n * @h-ai/api-contract — route builder\n *\n * 统一封装 oRPC 的 route builder。应用与契约包通过 `apiContract.route(...)`\n * 定义 HTTP 路由元数据,不需要直接依赖 `@orpc/contract` 或 `@h-ai/serv`。\n */\n\nimport type { AnyContractProcedure } from '@orpc/contract'\nimport { oc } from '@orpc/contract'\n\n/**\n * 创建 oRPC contract 路由节点。\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n * import { z } from 'zod'\n *\n * const health = apiContract.route({ method: 'GET', path: '/health' })\n * .output(z.object({ healthy: z.boolean() }))\n * void health\n * ```\n */\nexport const route: typeof oc.route = (...args) => oc.route(...args)\n\n/**\n * 读取 contract procedure 中声明的业务路径。\n *\n * 路径只在对应 `*-contract.ts` 的 route 定义中维护;transport、client 与\n * middleware 通过本函数读取,避免再维护一份路由常量。\n *\n * @param procedure - 已声明 HTTP route 的 oRPC contract procedure\n * @returns contract 中的绝对业务路径\n * @example\n * ```ts\n * import { apiContract } from '@h-ai/api-contract'\n *\n * const path = apiContract.pathOf(apiContract.iam.auth.login)\n * void path\n * ```\n */\nexport function pathOf(procedure: AnyContractProcedure): `/${string}` {\n const path = procedure['~orpc'].route.path\n if (!path)\n throw new Error('Contract procedure must define an HTTP path')\n return path\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { haiResultSchema, route, HaiErrorSchema, HaiVoidResultSchema } from './chunk-5UEDYQLG.js';
1
+ import { haiResultSchema, route, HaiErrorSchema, HaiVoidResultSchema } from './chunk-5LBEMLDK.js';
2
2
  import { StorageKeySchema, StoragePresignExpiresInSchema, StoragePrefixSchema, StorageDeleteKeysSchema } from '@h-ai/storage/schemas';
3
3
  import { z } from 'zod';
4
4
 
@@ -54,23 +54,66 @@ var StorageDeleteSummarySchema = z.object({
54
54
  var presignedUrlOutputSchema = haiResultSchema(StoragePresignedUrlSchema);
55
55
  var storageContract = {
56
56
  presignedUrls: {
57
- createDownload: route({ method: "POST", path: "/storage/presigned-urls/download", operationId: "storage.presignedUrls.createDownload", summary: "Create presigned download URL", tags: ["storage"] }).input(StoragePresignDownloadInputSchema).output(presignedUrlOutputSchema),
58
- createUpload: route({ method: "POST", path: "/storage/presigned-urls/upload", operationId: "storage.presignedUrls.createUpload", summary: "Create presigned upload URL", tags: ["storage"] }).input(StoragePresignUploadInputSchema).output(presignedUrlOutputSchema)
57
+ createDownload: route({
58
+ method: "POST",
59
+ path: "/storage/presigned-urls/download",
60
+ operationId: "storage.presignedUrls.createDownload",
61
+ summary: "Create presigned download URL",
62
+ tags: ["storage"]
63
+ }).input(StoragePresignDownloadInputSchema).output(presignedUrlOutputSchema),
64
+ createUpload: route({
65
+ method: "POST",
66
+ path: "/storage/presigned-urls/upload",
67
+ operationId: "storage.presignedUrls.createUpload",
68
+ summary: "Create presigned upload URL",
69
+ tags: ["storage"]
70
+ }).input(StoragePresignUploadInputSchema).output(presignedUrlOutputSchema)
59
71
  },
60
72
  files: {
61
- list: route({ method: "GET", path: "/storage/files", operationId: "storage.files.list", summary: "List files", tags: ["storage"] }).input(StorageListFilesInputSchema).output(haiResultSchema(StorageListFilesDataSchema)),
62
- getMetadata: route({ method: "POST", path: "/storage/files/metadata", operationId: "storage.files.getMetadata", summary: "Get file metadata", tags: ["storage"] }).input(StorageFileKeyInputSchema).output(haiResultSchema(StorageFileMetadataSchema)),
63
- delete: route({ method: "DELETE", path: "/storage/files", operationId: "storage.files.delete", summary: "Delete file", tags: ["storage"] }).input(StorageFileKeyInputSchema).output(HaiVoidResultSchema),
64
- deleteMany: route({ method: "POST", path: "/storage/files/delete-many", operationId: "storage.files.deleteMany", summary: "Delete files", tags: ["storage"] }).input(StorageDeleteFilesInputSchema).output(z.discriminatedUnion("success", [
65
- z.object({ success: z.literal(true), data: StorageDeleteSummarySchema }),
73
+ list: route({
74
+ method: "GET",
75
+ path: "/storage/files",
76
+ operationId: "storage.files.list",
77
+ summary: "List files",
78
+ tags: ["storage"]
79
+ }).input(StorageListFilesInputSchema).output(haiResultSchema(StorageListFilesDataSchema)),
80
+ getMetadata: route({
81
+ method: "POST",
82
+ path: "/storage/files/metadata",
83
+ operationId: "storage.files.getMetadata",
84
+ summary: "Get file metadata",
85
+ tags: ["storage"]
86
+ }).input(StorageFileKeyInputSchema).output(haiResultSchema(StorageFileMetadataSchema)),
87
+ delete: route({
88
+ method: "DELETE",
89
+ path: "/storage/files",
90
+ operationId: "storage.files.delete",
91
+ summary: "Delete file",
92
+ tags: ["storage"]
93
+ }).input(StorageFileKeyInputSchema).output(HaiVoidResultSchema),
94
+ deleteMany: route({
95
+ method: "POST",
96
+ path: "/storage/files/delete-many",
97
+ operationId: "storage.files.deleteMany",
98
+ summary: "Delete files",
99
+ tags: ["storage"]
100
+ }).input(StorageDeleteFilesInputSchema).output(z.discriminatedUnion("success", [
101
+ z.object({
102
+ success: z.literal(true),
103
+ data: StorageDeleteSummarySchema
104
+ }),
66
105
  z.object({
67
106
  success: z.literal(false),
68
- error: HaiErrorSchema.extend({ ext: z.object({ deleteMany: StorageDeleteSummarySchema.optional() }).catchall(z.unknown()).optional() })
107
+ error: HaiErrorSchema.extend({
108
+ ext: z.object({
109
+ deleteMany: StorageDeleteSummarySchema.optional()
110
+ }).catchall(z.unknown()).optional()
111
+ })
69
112
  })
70
113
  ]))
71
114
  }
72
115
  };
73
116
 
74
117
  export { StorageDeleteFilesInputSchema, StorageDeleteSummarySchema, StorageFileKeyInputSchema, StorageFileMetadataSchema, StorageListFilesDataSchema, StorageListFilesInputSchema, StoragePresignDownloadInputSchema, StoragePresignUploadInputSchema, StoragePresignedUrlSchema, storageContract };
75
- //# sourceMappingURL=chunk-ZM7KM6V3.js.map
76
- //# sourceMappingURL=chunk-ZM7KM6V3.js.map
118
+ //# sourceMappingURL=chunk-BAEWPPKY.js.map
119
+ //# sourceMappingURL=chunk-BAEWPPKY.js.map
@@ -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-5UEDYQLG.js';
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([z.literal(1), z.literal(2)]).optional()
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([z.string(), z.array(AiTextContentSchema)]);
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({ type: z.literal("function"), function: z.object({ name: z.string().min(1) }).strict() }).strict()
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({ code: "custom", path: ["tool_choice"] });
116
- if (typeof choice === "object" && !input.tools?.some((tool) => tool.function.name === choice.function.name))
117
- context.addIssue({ code: "custom", path: ["tool_choice"] });
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(["stop", "length", "tool_calls", "content_filter"])
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(["fact", "preference", "event", "entity", "instruction"]);
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({ method: "POST", path: "/ai/chats/completions", operationId: "ai.chats.createCompletion", summary: "Create non-streaming chat completion with function tools", tags: ["ai", "chats"] }).input(AiChatCompletionInputSchema).output(haiResultSchema(AiChatCompletionDataSchema)),
235
- sendMessage: route({ method: "POST", path: "/ai/chats/messages", operationId: "ai.chats.sendMessage", summary: "Send a single chat message", tags: ["ai", "chats"] }).input(AiSendMessageInputSchema).output(haiResultSchema(AiSendMessageDataSchema)),
236
- listHistory: route({ method: "POST", path: "/ai/chats/history", operationId: "ai.chats.listHistory", summary: "List chat history", tags: ["ai", "chats"] }).input(AiChatHistoryInputSchema).output(haiResultSchema(AiChatHistoryDataSchema))
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({ method: "POST", path: "/ai/memories/recall", operationId: "ai.memories.recall", summary: "Recall relevant memories", tags: ["ai", "memories"] }).input(AiMemoryRecallInputSchema).output(haiResultSchema(AiMemoryRecallDataSchema)),
240
- list: route({ method: "POST", path: "/ai/memories/list", operationId: "ai.memories.list", summary: "List memories", tags: ["ai", "memories"] }).input(AiMemoryListInputSchema).output(haiResultSchema(AiMemoryListDataSchema))
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({ method: "POST", path: "/ai/sessions/list", operationId: "ai.sessions.list", summary: "List sessions", tags: ["ai", "sessions"] }).input(AiSessionListInputSchema).output(haiResultSchema(AiSessionListDataSchema))
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-LD5PSL4C.js.map
249
- //# sourceMappingURL=chunk-LD5PSL4C.js.map
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"]}