sa2kit 3.4.0 → 3.6.0

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.
Files changed (129) hide show
  1. package/dist/{chunk-KVYHCGRY.js → chunk-7Z3XR2Y4.js} +552 -263
  2. package/dist/chunk-7Z3XR2Y4.js.map +1 -0
  3. package/dist/chunk-XPY45Y75.js +1143 -0
  4. package/dist/chunk-XPY45Y75.js.map +1 -0
  5. package/dist/{chunk-YIRPPMCN.mjs → chunk-XSTMLLJV.mjs} +474 -198
  6. package/dist/chunk-XSTMLLJV.mjs.map +1 -0
  7. package/dist/chunk-ZJLS5JU5.mjs +1090 -0
  8. package/dist/chunk-ZJLS5JU5.mjs.map +1 -0
  9. package/dist/common/aiApi/client/index.d.mts +71 -0
  10. package/dist/common/aiApi/client/index.d.ts +71 -0
  11. package/dist/common/aiApi/client/index.js +165 -0
  12. package/dist/common/aiApi/client/index.js.map +1 -0
  13. package/dist/common/aiApi/client/index.mjs +151 -0
  14. package/dist/common/aiApi/client/index.mjs.map +1 -0
  15. package/dist/common/aiApi/index.d.mts +184 -0
  16. package/dist/common/aiApi/index.d.ts +184 -0
  17. package/dist/common/aiApi/index.js +217 -0
  18. package/dist/common/aiApi/index.mjs +4 -0
  19. package/dist/common/aiApi/server/index.d.mts +3 -0
  20. package/dist/common/aiApi/server/index.d.ts +3 -0
  21. package/dist/common/aiApi/server/index.js +217 -0
  22. package/dist/common/aiApi/server/index.mjs +4 -0
  23. package/dist/common/components/index.js +176 -177
  24. package/dist/common/components/index.mjs +1 -2
  25. package/dist/common/index.js +2 -3
  26. package/dist/common/index.mjs +1 -2
  27. package/dist/index.d.mts +314 -154
  28. package/dist/index.d.ts +314 -154
  29. package/dist/index.js +1055 -369
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +1005 -360
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/types-CiqMQ-uu.d.mts +166 -0
  34. package/dist/types-CiqMQ-uu.d.ts +166 -0
  35. package/package.json +15 -50
  36. package/dist/chunk-3R6JHA6D.js +0 -120
  37. package/dist/chunk-3R6JHA6D.js.map +0 -1
  38. package/dist/chunk-4PJM4752.js +0 -4
  39. package/dist/chunk-4PJM4752.js.map +0 -1
  40. package/dist/chunk-7PMT4L4I.js +0 -324
  41. package/dist/chunk-7PMT4L4I.js.map +0 -1
  42. package/dist/chunk-FY2X3LYR.mjs +0 -3
  43. package/dist/chunk-FY2X3LYR.mjs.map +0 -1
  44. package/dist/chunk-GS4SAW25.mjs +0 -116
  45. package/dist/chunk-GS4SAW25.mjs.map +0 -1
  46. package/dist/chunk-HL4H2HF6.js +0 -279
  47. package/dist/chunk-HL4H2HF6.js.map +0 -1
  48. package/dist/chunk-IJIQUMAK.mjs +0 -272
  49. package/dist/chunk-IJIQUMAK.mjs.map +0 -1
  50. package/dist/chunk-KVYHCGRY.js.map +0 -1
  51. package/dist/chunk-MMDSZIXD.mjs +0 -286
  52. package/dist/chunk-MMDSZIXD.mjs.map +0 -1
  53. package/dist/chunk-N2O3OX5Y.mjs +0 -243
  54. package/dist/chunk-N2O3OX5Y.mjs.map +0 -1
  55. package/dist/chunk-RRQ2X26Z.js +0 -106
  56. package/dist/chunk-RRQ2X26Z.js.map +0 -1
  57. package/dist/chunk-RVNQI6BI.js +0 -249
  58. package/dist/chunk-RVNQI6BI.js.map +0 -1
  59. package/dist/chunk-UJUWDF7M.mjs +0 -336
  60. package/dist/chunk-UJUWDF7M.mjs.map +0 -1
  61. package/dist/chunk-VCKXK6V5.js +0 -345
  62. package/dist/chunk-VCKXK6V5.js.map +0 -1
  63. package/dist/chunk-VIEXDTNF.mjs +0 -100
  64. package/dist/chunk-VIEXDTNF.mjs.map +0 -1
  65. package/dist/chunk-YIRPPMCN.mjs.map +0 -1
  66. package/dist/common/ai/llm/core/index.d.mts +0 -70
  67. package/dist/common/ai/llm/core/index.d.ts +0 -70
  68. package/dist/common/ai/llm/core/index.js +0 -54
  69. package/dist/common/ai/llm/core/index.mjs +0 -5
  70. package/dist/common/ai/llm/electron/index.d.mts +0 -6
  71. package/dist/common/ai/llm/electron/index.d.ts +0 -6
  72. package/dist/common/ai/llm/electron/index.js +0 -67
  73. package/dist/common/ai/llm/electron/index.mjs +0 -10
  74. package/dist/common/ai/llm/index.d.mts +0 -3
  75. package/dist/common/ai/llm/index.d.ts +0 -3
  76. package/dist/common/ai/llm/index.js +0 -54
  77. package/dist/common/ai/llm/index.js.map +0 -1
  78. package/dist/common/ai/llm/index.mjs +0 -5
  79. package/dist/common/ai/llm/index.mjs.map +0 -1
  80. package/dist/common/ai/llm/miniapp/index.d.mts +0 -6
  81. package/dist/common/ai/llm/miniapp/index.d.ts +0 -6
  82. package/dist/common/ai/llm/miniapp/index.js +0 -59
  83. package/dist/common/ai/llm/miniapp/index.js.map +0 -1
  84. package/dist/common/ai/llm/miniapp/index.mjs +0 -6
  85. package/dist/common/ai/llm/miniapp/index.mjs.map +0 -1
  86. package/dist/common/ai/llm/rn/index.d.mts +0 -6
  87. package/dist/common/ai/llm/rn/index.d.ts +0 -6
  88. package/dist/common/ai/llm/rn/index.js +0 -59
  89. package/dist/common/ai/llm/rn/index.js.map +0 -1
  90. package/dist/common/ai/llm/rn/index.mjs +0 -6
  91. package/dist/common/ai/llm/rn/index.mjs.map +0 -1
  92. package/dist/common/ai/llm/ui/electron/index.d.mts +0 -5
  93. package/dist/common/ai/llm/ui/electron/index.d.ts +0 -5
  94. package/dist/common/ai/llm/ui/electron/index.js +0 -22
  95. package/dist/common/ai/llm/ui/electron/index.js.map +0 -1
  96. package/dist/common/ai/llm/ui/electron/index.mjs +0 -9
  97. package/dist/common/ai/llm/ui/electron/index.mjs.map +0 -1
  98. package/dist/common/ai/llm/ui/miniapp/index.d.mts +0 -9
  99. package/dist/common/ai/llm/ui/miniapp/index.d.ts +0 -9
  100. package/dist/common/ai/llm/ui/miniapp/index.js +0 -14
  101. package/dist/common/ai/llm/ui/miniapp/index.js.map +0 -1
  102. package/dist/common/ai/llm/ui/miniapp/index.mjs +0 -5
  103. package/dist/common/ai/llm/ui/miniapp/index.mjs.map +0 -1
  104. package/dist/common/ai/llm/ui/rn/index.d.mts +0 -9
  105. package/dist/common/ai/llm/ui/rn/index.d.ts +0 -9
  106. package/dist/common/ai/llm/ui/rn/index.js +0 -14
  107. package/dist/common/ai/llm/ui/rn/index.js.map +0 -1
  108. package/dist/common/ai/llm/ui/rn/index.mjs +0 -5
  109. package/dist/common/ai/llm/ui/rn/index.mjs.map +0 -1
  110. package/dist/common/ai/llm/ui/web/index.d.mts +0 -15
  111. package/dist/common/ai/llm/ui/web/index.d.ts +0 -15
  112. package/dist/common/ai/llm/ui/web/index.js +0 -21
  113. package/dist/common/ai/llm/ui/web/index.js.map +0 -1
  114. package/dist/common/ai/llm/ui/web/index.mjs +0 -8
  115. package/dist/common/ai/llm/ui/web/index.mjs.map +0 -1
  116. package/dist/common/ai/llm/web/index.d.mts +0 -6
  117. package/dist/common/ai/llm/web/index.d.ts +0 -6
  118. package/dist/common/ai/llm/web/index.js +0 -66
  119. package/dist/common/ai/llm/web/index.js.map +0 -1
  120. package/dist/common/ai/llm/web/index.mjs +0 -9
  121. package/dist/common/ai/llm/web/index.mjs.map +0 -1
  122. package/dist/types-B2rs_jq1.d.mts +0 -38
  123. package/dist/types-DgACCUpT.d.ts +0 -122
  124. package/dist/types-DwS2Eg0q.d.ts +0 -38
  125. package/dist/types-LU_BGSzk.d.mts +0 -122
  126. /package/dist/common/{ai/llm/core → aiApi}/index.js.map +0 -0
  127. /package/dist/common/{ai/llm/core → aiApi}/index.mjs.map +0 -0
  128. /package/dist/common/{ai/llm/electron → aiApi/server}/index.js.map +0 -0
  129. /package/dist/common/{ai/llm/electron → aiApi/server}/index.mjs.map +0 -0
@@ -0,0 +1,166 @@
1
+ /** 音频处理策略:native=chat 内嵌音频,stt=先转写再 chat,auto=按模型能力自动选择(失败时 STT 回退) */
2
+ type AudioStrategy = 'native' | 'stt' | 'auto';
3
+ /** 连接配置(调用方可显式传入,或与 env 合并) */
4
+ interface AiConnectionSettings {
5
+ apiKey: string;
6
+ baseUrl: string;
7
+ model?: string;
8
+ textModel?: string;
9
+ visionModel?: string;
10
+ audioModel?: string;
11
+ audioStrategy?: AudioStrategy;
12
+ timeoutMs?: number;
13
+ maxImageBytes?: number;
14
+ maxAudioBytes?: number;
15
+ }
16
+ /** 客户端/请求可携带的 AI 连接配置(字段均可选,用于覆盖环境变量) */
17
+ type AiClientSettings = Partial<AiConnectionSettings>;
18
+ /** 解析后的完整连接配置 */
19
+ interface AiConnectionConfig extends AiConnectionSettings {
20
+ textModel: string;
21
+ visionModel: string;
22
+ audioModel: string;
23
+ audioStrategy: AudioStrategy;
24
+ timeoutMs: number;
25
+ maxImageBytes: number;
26
+ maxAudioBytes: number;
27
+ }
28
+ /** 统一 AI 任务请求 */
29
+ interface AiApiRunRequest<TInput = unknown> {
30
+ taskId: string;
31
+ input: TInput;
32
+ options?: AiTaskRunOptions;
33
+ clientSettings?: AiClientSettings;
34
+ }
35
+ interface AiTaskRunOptions {
36
+ model?: string;
37
+ temperature?: number;
38
+ maxTokens?: number;
39
+ }
40
+ /** 统一 AI 任务响应 */
41
+ interface AiApiResponse<TData = unknown> {
42
+ success: boolean;
43
+ taskId: string;
44
+ data?: TData;
45
+ error?: AiApiErrorBody;
46
+ meta?: AiApiResponseMeta;
47
+ }
48
+ interface AiApiErrorBody {
49
+ code: AiApiErrorCode;
50
+ message: string;
51
+ details?: unknown;
52
+ }
53
+ type AiApiErrorCode = 'UNAUTHORIZED' | 'INVALID_INPUT' | 'TASK_NOT_FOUND' | 'AI_CONFIG_MISSING' | 'AI_REQUEST_FAILED' | 'AI_PARSE_FAILED' | 'PAYLOAD_TOO_LARGE' | 'UNSUPPORTED_MEDIA';
54
+ interface AiApiResponseMeta {
55
+ model: string;
56
+ latencyMs: number;
57
+ provider?: string;
58
+ confidence?: number;
59
+ rawSummary?: string;
60
+ }
61
+ /** 多模态图片输入(base64) */
62
+ interface AiImageInput {
63
+ base64: string;
64
+ mimeType: string;
65
+ }
66
+ /** 多模态音频输入(base64) */
67
+ interface AiAudioInput {
68
+ base64: string;
69
+ mimeType: string;
70
+ }
71
+ type AiMediaKind = 'image' | 'audio';
72
+ interface AiImageMediaInput extends AiImageInput {
73
+ kind: 'image';
74
+ }
75
+ interface AiAudioMediaInput extends AiAudioInput {
76
+ kind: 'audio';
77
+ }
78
+ type AiMediaInput = AiImageMediaInput | AiAudioMediaInput;
79
+ /** 通用文本补全任务输入 */
80
+ interface TextCompletionInput {
81
+ systemPrompt?: string;
82
+ userPrompt: string;
83
+ model?: string;
84
+ temperature?: number;
85
+ maxTokens?: number;
86
+ /** 显式连接配置,优先级高于 clientSettings / 环境变量 */
87
+ connection?: AiClientSettings;
88
+ }
89
+ /** 通用文本补全任务输出 */
90
+ interface TextCompletionOutput {
91
+ content: string;
92
+ rawText: string;
93
+ }
94
+ /** 通用结构化多模态任务输入 */
95
+ interface StructuredMultimodalInput {
96
+ systemPrompt: string;
97
+ userPrompt: string;
98
+ media?: AiMediaInput[];
99
+ jsonSchemaHint?: string;
100
+ model?: string;
101
+ temperature?: number;
102
+ maxTokens?: number;
103
+ audioStrategy?: AudioStrategy;
104
+ connection?: AiClientSettings;
105
+ }
106
+ /** 通用结构化多模态任务输出 */
107
+ interface StructuredMultimodalOutput {
108
+ json: Record<string, unknown>;
109
+ rawText: string;
110
+ }
111
+ declare const CORE_LLM_COMPLETION_TASK_ID = "core.llmCompletion";
112
+ declare const CORE_STRUCTURED_MULTIMODAL_TASK_ID = "core.structuredMultimodal";
113
+ declare const CORE_CONNECTIVITY_TEST_TASK_ID = "core.connectivityTest";
114
+ interface ConnectivityTestOutput {
115
+ ok: boolean;
116
+ reply: string;
117
+ }
118
+ interface AiModelsListRequest {
119
+ clientSettings?: AiClientSettings;
120
+ }
121
+ interface AiModelsListResponse {
122
+ success: boolean;
123
+ models: string[];
124
+ visionModels: string[];
125
+ suggestedVisionModel?: string;
126
+ error?: {
127
+ code: string;
128
+ message: string;
129
+ };
130
+ }
131
+ interface AiTaskContext {
132
+ requestId?: string;
133
+ userId?: string | number;
134
+ clientSettings?: AiClientSettings;
135
+ }
136
+ interface AiTaskDefinition<TInput = unknown, TOutput = unknown> {
137
+ id: string;
138
+ description?: string;
139
+ validateInput: (input: unknown) => TInput;
140
+ execute: (input: TInput, ctx: AiTaskContext) => Promise<{
141
+ data: TOutput;
142
+ meta?: Partial<AiApiResponseMeta>;
143
+ }>;
144
+ }
145
+ interface MultimodalChatParams {
146
+ systemPrompt: string;
147
+ userPrompt: string;
148
+ media?: AiMediaInput[];
149
+ model?: string;
150
+ temperature?: number;
151
+ maxTokens?: number;
152
+ jsonMode?: boolean;
153
+ audioStrategy?: AudioStrategy;
154
+ connection?: AiClientSettings;
155
+ }
156
+ interface MultimodalChatResult {
157
+ content: string;
158
+ model: string;
159
+ raw: unknown;
160
+ /** auto/native/stt 实际采用的音频处理方式 */
161
+ audioHandling?: 'none' | 'native' | 'stt';
162
+ /** STT 或 native 失败回退时的转写文本 */
163
+ transcriptions?: string[];
164
+ }
165
+
166
+ export { type AiClientSettings as A, type ConnectivityTestOutput as C, type MultimodalChatParams as M, type StructuredMultimodalInput as S, type TextCompletionInput as T, type AiApiResponse as a, type AiModelsListResponse as b, type AudioStrategy as c, type AiConnectionConfig as d, type MultimodalChatResult as e, type AiImageInput as f, type AiAudioInput as g, type AiMediaInput as h, type AiTaskDefinition as i, type AiTaskContext as j, type TextCompletionOutput as k, type StructuredMultimodalOutput as l, type AiConnectionSettings as m, type AiApiRunRequest as n, type AiTaskRunOptions as o, type AiApiErrorBody as p, type AiApiErrorCode as q, type AiApiResponseMeta as r, type AiMediaKind as s, type AiImageMediaInput as t, type AiAudioMediaInput as u, CORE_LLM_COMPLETION_TASK_ID as v, CORE_STRUCTURED_MULTIMODAL_TASK_ID as w, CORE_CONNECTIVITY_TEST_TASK_ID as x, type AiModelsListRequest as y };
@@ -0,0 +1,166 @@
1
+ /** 音频处理策略:native=chat 内嵌音频,stt=先转写再 chat,auto=按模型能力自动选择(失败时 STT 回退) */
2
+ type AudioStrategy = 'native' | 'stt' | 'auto';
3
+ /** 连接配置(调用方可显式传入,或与 env 合并) */
4
+ interface AiConnectionSettings {
5
+ apiKey: string;
6
+ baseUrl: string;
7
+ model?: string;
8
+ textModel?: string;
9
+ visionModel?: string;
10
+ audioModel?: string;
11
+ audioStrategy?: AudioStrategy;
12
+ timeoutMs?: number;
13
+ maxImageBytes?: number;
14
+ maxAudioBytes?: number;
15
+ }
16
+ /** 客户端/请求可携带的 AI 连接配置(字段均可选,用于覆盖环境变量) */
17
+ type AiClientSettings = Partial<AiConnectionSettings>;
18
+ /** 解析后的完整连接配置 */
19
+ interface AiConnectionConfig extends AiConnectionSettings {
20
+ textModel: string;
21
+ visionModel: string;
22
+ audioModel: string;
23
+ audioStrategy: AudioStrategy;
24
+ timeoutMs: number;
25
+ maxImageBytes: number;
26
+ maxAudioBytes: number;
27
+ }
28
+ /** 统一 AI 任务请求 */
29
+ interface AiApiRunRequest<TInput = unknown> {
30
+ taskId: string;
31
+ input: TInput;
32
+ options?: AiTaskRunOptions;
33
+ clientSettings?: AiClientSettings;
34
+ }
35
+ interface AiTaskRunOptions {
36
+ model?: string;
37
+ temperature?: number;
38
+ maxTokens?: number;
39
+ }
40
+ /** 统一 AI 任务响应 */
41
+ interface AiApiResponse<TData = unknown> {
42
+ success: boolean;
43
+ taskId: string;
44
+ data?: TData;
45
+ error?: AiApiErrorBody;
46
+ meta?: AiApiResponseMeta;
47
+ }
48
+ interface AiApiErrorBody {
49
+ code: AiApiErrorCode;
50
+ message: string;
51
+ details?: unknown;
52
+ }
53
+ type AiApiErrorCode = 'UNAUTHORIZED' | 'INVALID_INPUT' | 'TASK_NOT_FOUND' | 'AI_CONFIG_MISSING' | 'AI_REQUEST_FAILED' | 'AI_PARSE_FAILED' | 'PAYLOAD_TOO_LARGE' | 'UNSUPPORTED_MEDIA';
54
+ interface AiApiResponseMeta {
55
+ model: string;
56
+ latencyMs: number;
57
+ provider?: string;
58
+ confidence?: number;
59
+ rawSummary?: string;
60
+ }
61
+ /** 多模态图片输入(base64) */
62
+ interface AiImageInput {
63
+ base64: string;
64
+ mimeType: string;
65
+ }
66
+ /** 多模态音频输入(base64) */
67
+ interface AiAudioInput {
68
+ base64: string;
69
+ mimeType: string;
70
+ }
71
+ type AiMediaKind = 'image' | 'audio';
72
+ interface AiImageMediaInput extends AiImageInput {
73
+ kind: 'image';
74
+ }
75
+ interface AiAudioMediaInput extends AiAudioInput {
76
+ kind: 'audio';
77
+ }
78
+ type AiMediaInput = AiImageMediaInput | AiAudioMediaInput;
79
+ /** 通用文本补全任务输入 */
80
+ interface TextCompletionInput {
81
+ systemPrompt?: string;
82
+ userPrompt: string;
83
+ model?: string;
84
+ temperature?: number;
85
+ maxTokens?: number;
86
+ /** 显式连接配置,优先级高于 clientSettings / 环境变量 */
87
+ connection?: AiClientSettings;
88
+ }
89
+ /** 通用文本补全任务输出 */
90
+ interface TextCompletionOutput {
91
+ content: string;
92
+ rawText: string;
93
+ }
94
+ /** 通用结构化多模态任务输入 */
95
+ interface StructuredMultimodalInput {
96
+ systemPrompt: string;
97
+ userPrompt: string;
98
+ media?: AiMediaInput[];
99
+ jsonSchemaHint?: string;
100
+ model?: string;
101
+ temperature?: number;
102
+ maxTokens?: number;
103
+ audioStrategy?: AudioStrategy;
104
+ connection?: AiClientSettings;
105
+ }
106
+ /** 通用结构化多模态任务输出 */
107
+ interface StructuredMultimodalOutput {
108
+ json: Record<string, unknown>;
109
+ rawText: string;
110
+ }
111
+ declare const CORE_LLM_COMPLETION_TASK_ID = "core.llmCompletion";
112
+ declare const CORE_STRUCTURED_MULTIMODAL_TASK_ID = "core.structuredMultimodal";
113
+ declare const CORE_CONNECTIVITY_TEST_TASK_ID = "core.connectivityTest";
114
+ interface ConnectivityTestOutput {
115
+ ok: boolean;
116
+ reply: string;
117
+ }
118
+ interface AiModelsListRequest {
119
+ clientSettings?: AiClientSettings;
120
+ }
121
+ interface AiModelsListResponse {
122
+ success: boolean;
123
+ models: string[];
124
+ visionModels: string[];
125
+ suggestedVisionModel?: string;
126
+ error?: {
127
+ code: string;
128
+ message: string;
129
+ };
130
+ }
131
+ interface AiTaskContext {
132
+ requestId?: string;
133
+ userId?: string | number;
134
+ clientSettings?: AiClientSettings;
135
+ }
136
+ interface AiTaskDefinition<TInput = unknown, TOutput = unknown> {
137
+ id: string;
138
+ description?: string;
139
+ validateInput: (input: unknown) => TInput;
140
+ execute: (input: TInput, ctx: AiTaskContext) => Promise<{
141
+ data: TOutput;
142
+ meta?: Partial<AiApiResponseMeta>;
143
+ }>;
144
+ }
145
+ interface MultimodalChatParams {
146
+ systemPrompt: string;
147
+ userPrompt: string;
148
+ media?: AiMediaInput[];
149
+ model?: string;
150
+ temperature?: number;
151
+ maxTokens?: number;
152
+ jsonMode?: boolean;
153
+ audioStrategy?: AudioStrategy;
154
+ connection?: AiClientSettings;
155
+ }
156
+ interface MultimodalChatResult {
157
+ content: string;
158
+ model: string;
159
+ raw: unknown;
160
+ /** auto/native/stt 实际采用的音频处理方式 */
161
+ audioHandling?: 'none' | 'native' | 'stt';
162
+ /** STT 或 native 失败回退时的转写文本 */
163
+ transcriptions?: string[];
164
+ }
165
+
166
+ export { type AiClientSettings as A, type ConnectivityTestOutput as C, type MultimodalChatParams as M, type StructuredMultimodalInput as S, type TextCompletionInput as T, type AiApiResponse as a, type AiModelsListResponse as b, type AudioStrategy as c, type AiConnectionConfig as d, type MultimodalChatResult as e, type AiImageInput as f, type AiAudioInput as g, type AiMediaInput as h, type AiTaskDefinition as i, type AiTaskContext as j, type TextCompletionOutput as k, type StructuredMultimodalOutput as l, type AiConnectionSettings as m, type AiApiRunRequest as n, type AiTaskRunOptions as o, type AiApiErrorBody as p, type AiApiErrorCode as q, type AiApiResponseMeta as r, type AiMediaKind as s, type AiImageMediaInput as t, type AiAudioMediaInput as u, CORE_LLM_COMPLETION_TASK_ID as v, CORE_STRUCTURED_MULTIMODAL_TASK_ID as w, CORE_CONNECTIVITY_TEST_TASK_ID as x, type AiModelsListRequest as y };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sa2kit",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "SA2Kit 2.0 — common API 稳定;business 实验田模块逐步迁出 profile-v1",
5
5
  "keywords": [
6
6
  "react",
@@ -288,55 +288,20 @@
288
288
  "import": "./dist/business/vocaloidBooth/web/index.mjs",
289
289
  "require": "./dist/business/vocaloidBooth/web/index.js"
290
290
  },
291
- "./common/ai/llm/core": {
292
- "types": "./dist/common/ai/llm/core/index.d.ts",
293
- "import": "./dist/common/ai/llm/core/index.mjs",
294
- "require": "./dist/common/ai/llm/core/index.js"
295
- },
296
- "./common/ai/llm/electron": {
297
- "types": "./dist/common/ai/llm/electron/index.d.ts",
298
- "import": "./dist/common/ai/llm/electron/index.mjs",
299
- "require": "./dist/common/ai/llm/electron/index.js"
300
- },
301
- "./common/ai/llm": {
302
- "types": "./dist/common/ai/llm/index.d.ts",
303
- "import": "./dist/common/ai/llm/index.mjs",
304
- "require": "./dist/common/ai/llm/index.js"
305
- },
306
- "./common/ai/llm/miniapp": {
307
- "types": "./dist/common/ai/llm/miniapp/index.d.ts",
308
- "import": "./dist/common/ai/llm/miniapp/index.mjs",
309
- "require": "./dist/common/ai/llm/miniapp/index.js"
310
- },
311
- "./common/ai/llm/rn": {
312
- "types": "./dist/common/ai/llm/rn/index.d.ts",
313
- "import": "./dist/common/ai/llm/rn/index.mjs",
314
- "require": "./dist/common/ai/llm/rn/index.js"
315
- },
316
- "./common/ai/llm/ui/electron": {
317
- "types": "./dist/common/ai/llm/ui/electron/index.d.ts",
318
- "import": "./dist/common/ai/llm/ui/electron/index.mjs",
319
- "require": "./dist/common/ai/llm/ui/electron/index.js"
320
- },
321
- "./common/ai/llm/ui/miniapp": {
322
- "types": "./dist/common/ai/llm/ui/miniapp/index.d.ts",
323
- "import": "./dist/common/ai/llm/ui/miniapp/index.mjs",
324
- "require": "./dist/common/ai/llm/ui/miniapp/index.js"
325
- },
326
- "./common/ai/llm/ui/rn": {
327
- "types": "./dist/common/ai/llm/ui/rn/index.d.ts",
328
- "import": "./dist/common/ai/llm/ui/rn/index.mjs",
329
- "require": "./dist/common/ai/llm/ui/rn/index.js"
330
- },
331
- "./common/ai/llm/ui/web": {
332
- "types": "./dist/common/ai/llm/ui/web/index.d.ts",
333
- "import": "./dist/common/ai/llm/ui/web/index.mjs",
334
- "require": "./dist/common/ai/llm/ui/web/index.js"
335
- },
336
- "./common/ai/llm/web": {
337
- "types": "./dist/common/ai/llm/web/index.d.ts",
338
- "import": "./dist/common/ai/llm/web/index.mjs",
339
- "require": "./dist/common/ai/llm/web/index.js"
291
+ "./common/aiApi/client": {
292
+ "types": "./dist/common/aiApi/client/index.d.ts",
293
+ "import": "./dist/common/aiApi/client/index.mjs",
294
+ "require": "./dist/common/aiApi/client/index.js"
295
+ },
296
+ "./common/aiApi": {
297
+ "types": "./dist/common/aiApi/index.d.ts",
298
+ "import": "./dist/common/aiApi/index.mjs",
299
+ "require": "./dist/common/aiApi/index.js"
300
+ },
301
+ "./common/aiApi/server": {
302
+ "types": "./dist/common/aiApi/server/index.d.ts",
303
+ "import": "./dist/common/aiApi/server/index.mjs",
304
+ "require": "./dist/common/aiApi/server/index.js"
340
305
  },
341
306
  "./common/analytics/server": {
342
307
  "types": "./dist/common/analytics/server/index.d.ts",
@@ -1,120 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
-
5
- // src/common/ai/llm/prompt/variables.ts
6
- var normalizePromptVariables = (variables = {}) => {
7
- const normalized = {};
8
- Object.entries(variables).forEach(([key, value]) => {
9
- if (value === null || value === void 0) {
10
- normalized[key] = "";
11
- } else {
12
- normalized[key] = String(value);
13
- }
14
- });
15
- return normalized;
16
- };
17
-
18
- // src/common/ai/llm/prompt/template.ts
19
- var applyPromptTemplate = (template, variables = {}, options = {}) => {
20
- if (!template) {
21
- return "";
22
- }
23
- const resolved = normalizePromptVariables(variables);
24
- const missingValue = options.missingValue ?? "";
25
- return template.replace(/\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g, (_match, key) => {
26
- if (Object.prototype.hasOwnProperty.call(resolved, key)) {
27
- return resolved[key] ?? "";
28
- }
29
- return options.preserveUnknown ? `{{${key}}}` : missingValue;
30
- });
31
- };
32
- var buildBaseMessages = (systemPrompt, initialMessages) => {
33
- const baseMessages = [];
34
- if (systemPrompt) {
35
- baseMessages.push({ role: "system", content: systemPrompt });
36
- }
37
- if (initialMessages?.length) {
38
- baseMessages.push(...initialMessages);
39
- }
40
- return baseMessages;
41
- };
42
- var useAiChat = (options) => {
43
- const systemPromptRef = react.useRef(options.systemPrompt);
44
- const templateRef = react.useRef(options.template);
45
- const [messages, setMessages] = react.useState(
46
- () => buildBaseMessages(systemPromptRef.current, options.initialMessages)
47
- );
48
- const messagesRef = react.useRef(messages);
49
- const [status, setStatus] = react.useState("idle");
50
- const [error, setError] = react.useState(null);
51
- const [lastResponse, setLastResponse] = react.useState(null);
52
- const syncMessages = (nextMessages) => {
53
- messagesRef.current = nextMessages;
54
- setMessages(nextMessages);
55
- };
56
- const reset = react.useCallback(() => {
57
- syncMessages(buildBaseMessages(systemPromptRef.current, options.initialMessages));
58
- setStatus("idle");
59
- setError(null);
60
- setLastResponse(null);
61
- }, [options.initialMessages]);
62
- const setSystemPrompt = react.useCallback(
63
- (prompt) => {
64
- systemPromptRef.current = prompt;
65
- reset();
66
- },
67
- [reset]
68
- );
69
- const sendMessage = react.useCallback(
70
- async (input, requestOptions = {}) => {
71
- const { template, variables, ...chatOptions } = requestOptions;
72
- const activeTemplate = template ?? templateRef.current;
73
- const mergedVariables = { input, ...variables ?? {} };
74
- const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;
75
- const userMessage = { role: "user", content };
76
- const nextMessages = [...messagesRef.current, userMessage];
77
- syncMessages(nextMessages);
78
- setStatus("loading");
79
- setError(null);
80
- try {
81
- const response = await options.client.sendChat({
82
- messages: nextMessages,
83
- ...chatOptions
84
- });
85
- const assistantMessage = response.message ?? {
86
- role: "assistant",
87
- content: response.content,
88
- toolCalls: response.toolCalls
89
- };
90
- const updatedMessages = [...nextMessages, assistantMessage];
91
- syncMessages(updatedMessages);
92
- setStatus("success");
93
- setLastResponse(response);
94
- return response;
95
- } catch (err) {
96
- const nextError = err instanceof Error ? err : new Error(String(err));
97
- setStatus("error");
98
- setError(nextError);
99
- throw nextError;
100
- }
101
- },
102
- [options.client]
103
- );
104
- return {
105
- status,
106
- isLoading: status === "loading",
107
- error,
108
- messages,
109
- lastResponse,
110
- sendMessage,
111
- reset,
112
- setSystemPrompt
113
- };
114
- };
115
-
116
- exports.applyPromptTemplate = applyPromptTemplate;
117
- exports.normalizePromptVariables = normalizePromptVariables;
118
- exports.useAiChat = useAiChat;
119
- //# sourceMappingURL=chunk-3R6JHA6D.js.map
120
- //# sourceMappingURL=chunk-3R6JHA6D.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/ai/llm/prompt/variables.ts","../src/common/ai/llm/prompt/template.ts","../src/common/ai/llm/hooks/useAiChat.ts"],"names":["useRef","useState","useCallback"],"mappings":"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","file":"chunk-3R6JHA6D.js","sourcesContent":["export type PromptVariableValue = string | number | boolean | null | undefined;\n\nexport type PromptVariables = Record<string, PromptVariableValue>;\n\nexport const normalizePromptVariables = (\n variables: PromptVariables = {}\n): Record<string, string> => {\n const normalized: Record<string, string> = {};\n\n Object.entries(variables).forEach(([key, value]) => {\n if (value === null || value === undefined) {\n normalized[key] = '';\n } else {\n normalized[key] = String(value);\n }\n });\n\n return normalized;\n};\n","import { normalizePromptVariables, PromptVariables } from './variables';\n\nexport interface PromptTemplateOptions {\n missingValue?: string;\n preserveUnknown?: boolean;\n}\n\nexport const applyPromptTemplate = (\n template: string,\n variables: PromptVariables = {},\n options: PromptTemplateOptions = {}\n): string => {\n if (!template) {\n return '';\n }\n\n const resolved = normalizePromptVariables(variables);\n const missingValue = options.missingValue ?? '';\n\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_.-]+)\\s*\\}\\}/g, (_match, key: string) => {\n if (Object.prototype.hasOwnProperty.call(resolved, key)) {\n return resolved[key] ?? '';\n }\n\n return options.preserveUnknown ? `{{${key}}}` : missingValue;\n });\n};\n","import { useCallback, useRef, useState } from 'react';\nimport { applyPromptTemplate } from '../prompt/template';\nimport type {\n AiChatInputOptions,\n AiChatResponse,\n AiChatStatus,\n AiClient,\n AiMessage,\n} from '../types';\n\nexport interface UseAiChatOptions {\n client: AiClient;\n systemPrompt?: string;\n template?: string;\n initialMessages?: AiMessage[];\n}\n\nconst buildBaseMessages = (systemPrompt?: string, initialMessages?: AiMessage[]): AiMessage[] => {\n const baseMessages: AiMessage[] = [];\n if (systemPrompt) {\n baseMessages.push({ role: 'system', content: systemPrompt });\n }\n if (initialMessages?.length) {\n baseMessages.push(...initialMessages);\n }\n return baseMessages;\n};\n\nexport const useAiChat = (options: UseAiChatOptions) => {\n const systemPromptRef = useRef(options.systemPrompt);\n const templateRef = useRef(options.template);\n const [messages, setMessages] = useState<AiMessage[]>(() =>\n buildBaseMessages(systemPromptRef.current, options.initialMessages)\n );\n const messagesRef = useRef(messages);\n const [status, setStatus] = useState<AiChatStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [lastResponse, setLastResponse] = useState<AiChatResponse | null>(null);\n\n const syncMessages = (nextMessages: AiMessage[]) => {\n messagesRef.current = nextMessages;\n setMessages(nextMessages);\n };\n\n const reset = useCallback(() => {\n syncMessages(buildBaseMessages(systemPromptRef.current, options.initialMessages));\n setStatus('idle');\n setError(null);\n setLastResponse(null);\n }, [options.initialMessages]);\n\n const setSystemPrompt = useCallback(\n (prompt?: string) => {\n systemPromptRef.current = prompt;\n reset();\n },\n [reset]\n );\n\n const sendMessage = useCallback(\n async (input: string, requestOptions: AiChatInputOptions = {}) => {\n const { template, variables, ...chatOptions } = requestOptions;\n const activeTemplate = template ?? templateRef.current;\n const mergedVariables = { input, ...(variables ?? {}) };\n const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;\n\n const userMessage: AiMessage = { role: 'user', content };\n const nextMessages = [...messagesRef.current, userMessage];\n syncMessages(nextMessages);\n setStatus('loading');\n setError(null);\n\n try {\n const response = await options.client.sendChat({\n messages: nextMessages,\n ...chatOptions,\n });\n\n const assistantMessage: AiMessage =\n response.message ?? {\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n };\n const updatedMessages = [...nextMessages, assistantMessage];\n syncMessages(updatedMessages);\n setStatus('success');\n setLastResponse(response);\n return response;\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n setStatus('error');\n setError(nextError);\n throw nextError;\n }\n },\n [options.client]\n );\n\n return {\n status,\n isLoading: status === 'loading',\n error,\n messages,\n lastResponse,\n sendMessage,\n reset,\n setSystemPrompt,\n };\n};\n"]}
@@ -1,4 +0,0 @@
1
- 'use strict';
2
-
3
- //# sourceMappingURL=chunk-4PJM4752.js.map
4
- //# sourceMappingURL=chunk-4PJM4752.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-4PJM4752.js"}