sa2kit 3.4.0 → 3.7.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.
- package/dist/business/index.d.mts +2 -7
- package/dist/business/index.d.ts +2 -7
- package/dist/business/index.js +1761 -8045
- package/dist/business/index.js.map +1 -1
- package/dist/business/index.mjs +1169 -7452
- package/dist/business/index.mjs.map +1 -1
- package/dist/business/portfolio/index.d.mts +1 -2
- package/dist/business/portfolio/index.d.ts +1 -2
- package/dist/{chunk-KVYHCGRY.js → chunk-7Z3XR2Y4.js} +552 -263
- package/dist/chunk-7Z3XR2Y4.js.map +1 -0
- package/dist/chunk-XPY45Y75.js +1143 -0
- package/dist/chunk-XPY45Y75.js.map +1 -0
- package/dist/{chunk-YIRPPMCN.mjs → chunk-XSTMLLJV.mjs} +474 -198
- package/dist/chunk-XSTMLLJV.mjs.map +1 -0
- package/dist/chunk-ZJLS5JU5.mjs +1090 -0
- package/dist/chunk-ZJLS5JU5.mjs.map +1 -0
- package/dist/common/aiApi/client/index.d.mts +71 -0
- package/dist/common/aiApi/client/index.d.ts +71 -0
- package/dist/common/aiApi/client/index.js +165 -0
- package/dist/common/aiApi/client/index.js.map +1 -0
- package/dist/common/aiApi/client/index.mjs +151 -0
- package/dist/common/aiApi/client/index.mjs.map +1 -0
- package/dist/common/aiApi/index.d.mts +184 -0
- package/dist/common/aiApi/index.d.ts +184 -0
- package/dist/common/aiApi/index.js +217 -0
- package/dist/common/aiApi/index.mjs +4 -0
- package/dist/common/aiApi/server/index.d.mts +3 -0
- package/dist/common/aiApi/server/index.d.ts +3 -0
- package/dist/common/aiApi/server/index.js +217 -0
- package/dist/common/aiApi/server/index.mjs +4 -0
- package/dist/common/components/index.js +176 -177
- package/dist/common/components/index.mjs +1 -2
- package/dist/common/index.js +2 -3
- package/dist/common/index.mjs +1 -2
- package/dist/{index-BSmd4ikf.d.ts → index-B4wDXFL0.d.mts} +39 -2
- package/dist/{index-r2-zE3iC.d.mts → index-B4wDXFL0.d.ts} +39 -2
- package/dist/{index-DLLPTprx.d.mts → index-B9vXYzok.d.mts} +48 -13
- package/dist/{index-VFDbZxVM.d.ts → index-BZ0MhRau.d.ts} +48 -13
- package/dist/index.d.mts +703 -181
- package/dist/index.d.ts +703 -181
- package/dist/index.js +2921 -7257
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2161 -6538
- package/dist/index.mjs.map +1 -1
- package/dist/types-CiqMQ-uu.d.mts +166 -0
- package/dist/types-CiqMQ-uu.d.ts +166 -0
- package/package.json +15 -60
- package/dist/CollisionBalls-DgKtscU2.d.mts +0 -41
- package/dist/CollisionBalls-DgKtscU2.d.ts +0 -41
- package/dist/business/calendar/index.d.mts +0 -6
- package/dist/business/calendar/index.d.ts +0 -6
- package/dist/business/calendar/index.js +0 -7433
- package/dist/business/calendar/index.js.map +0 -1
- package/dist/business/calendar/index.mjs +0 -7257
- package/dist/business/calendar/index.mjs.map +0 -1
- package/dist/business/calendar/routes/index.d.mts +0 -191
- package/dist/business/calendar/routes/index.d.ts +0 -191
- package/dist/business/calendar/routes/index.js +0 -844
- package/dist/business/calendar/routes/index.js.map +0 -1
- package/dist/business/calendar/routes/index.mjs +0 -826
- package/dist/business/calendar/routes/index.mjs.map +0 -1
- package/dist/chunk-3R6JHA6D.js +0 -120
- package/dist/chunk-3R6JHA6D.js.map +0 -1
- package/dist/chunk-4PJM4752.js +0 -4
- package/dist/chunk-4PJM4752.js.map +0 -1
- package/dist/chunk-7PMT4L4I.js +0 -324
- package/dist/chunk-7PMT4L4I.js.map +0 -1
- package/dist/chunk-FY2X3LYR.mjs +0 -3
- package/dist/chunk-FY2X3LYR.mjs.map +0 -1
- package/dist/chunk-GS4SAW25.mjs +0 -116
- package/dist/chunk-GS4SAW25.mjs.map +0 -1
- package/dist/chunk-HL4H2HF6.js +0 -279
- package/dist/chunk-HL4H2HF6.js.map +0 -1
- package/dist/chunk-IJIQUMAK.mjs +0 -272
- package/dist/chunk-IJIQUMAK.mjs.map +0 -1
- package/dist/chunk-KVYHCGRY.js.map +0 -1
- package/dist/chunk-MMDSZIXD.mjs +0 -286
- package/dist/chunk-MMDSZIXD.mjs.map +0 -1
- package/dist/chunk-N2O3OX5Y.mjs +0 -243
- package/dist/chunk-N2O3OX5Y.mjs.map +0 -1
- package/dist/chunk-RRQ2X26Z.js +0 -106
- package/dist/chunk-RRQ2X26Z.js.map +0 -1
- package/dist/chunk-RVNQI6BI.js +0 -249
- package/dist/chunk-RVNQI6BI.js.map +0 -1
- package/dist/chunk-UJUWDF7M.mjs +0 -336
- package/dist/chunk-UJUWDF7M.mjs.map +0 -1
- package/dist/chunk-VCKXK6V5.js +0 -345
- package/dist/chunk-VCKXK6V5.js.map +0 -1
- package/dist/chunk-VIEXDTNF.mjs +0 -100
- package/dist/chunk-VIEXDTNF.mjs.map +0 -1
- package/dist/chunk-YIRPPMCN.mjs.map +0 -1
- package/dist/common/ai/llm/core/index.d.mts +0 -70
- package/dist/common/ai/llm/core/index.d.ts +0 -70
- package/dist/common/ai/llm/core/index.js +0 -54
- package/dist/common/ai/llm/core/index.mjs +0 -5
- package/dist/common/ai/llm/electron/index.d.mts +0 -6
- package/dist/common/ai/llm/electron/index.d.ts +0 -6
- package/dist/common/ai/llm/electron/index.js +0 -67
- package/dist/common/ai/llm/electron/index.mjs +0 -10
- package/dist/common/ai/llm/index.d.mts +0 -3
- package/dist/common/ai/llm/index.d.ts +0 -3
- package/dist/common/ai/llm/index.js +0 -54
- package/dist/common/ai/llm/index.js.map +0 -1
- package/dist/common/ai/llm/index.mjs +0 -5
- package/dist/common/ai/llm/index.mjs.map +0 -1
- package/dist/common/ai/llm/miniapp/index.d.mts +0 -6
- package/dist/common/ai/llm/miniapp/index.d.ts +0 -6
- package/dist/common/ai/llm/miniapp/index.js +0 -59
- package/dist/common/ai/llm/miniapp/index.js.map +0 -1
- package/dist/common/ai/llm/miniapp/index.mjs +0 -6
- package/dist/common/ai/llm/miniapp/index.mjs.map +0 -1
- package/dist/common/ai/llm/rn/index.d.mts +0 -6
- package/dist/common/ai/llm/rn/index.d.ts +0 -6
- package/dist/common/ai/llm/rn/index.js +0 -59
- package/dist/common/ai/llm/rn/index.js.map +0 -1
- package/dist/common/ai/llm/rn/index.mjs +0 -6
- package/dist/common/ai/llm/rn/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/electron/index.d.mts +0 -5
- package/dist/common/ai/llm/ui/electron/index.d.ts +0 -5
- package/dist/common/ai/llm/ui/electron/index.js +0 -22
- package/dist/common/ai/llm/ui/electron/index.js.map +0 -1
- package/dist/common/ai/llm/ui/electron/index.mjs +0 -9
- package/dist/common/ai/llm/ui/electron/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/miniapp/index.d.mts +0 -9
- package/dist/common/ai/llm/ui/miniapp/index.d.ts +0 -9
- package/dist/common/ai/llm/ui/miniapp/index.js +0 -14
- package/dist/common/ai/llm/ui/miniapp/index.js.map +0 -1
- package/dist/common/ai/llm/ui/miniapp/index.mjs +0 -5
- package/dist/common/ai/llm/ui/miniapp/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/rn/index.d.mts +0 -9
- package/dist/common/ai/llm/ui/rn/index.d.ts +0 -9
- package/dist/common/ai/llm/ui/rn/index.js +0 -14
- package/dist/common/ai/llm/ui/rn/index.js.map +0 -1
- package/dist/common/ai/llm/ui/rn/index.mjs +0 -5
- package/dist/common/ai/llm/ui/rn/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/web/index.d.mts +0 -15
- package/dist/common/ai/llm/ui/web/index.d.ts +0 -15
- package/dist/common/ai/llm/ui/web/index.js +0 -21
- package/dist/common/ai/llm/ui/web/index.js.map +0 -1
- package/dist/common/ai/llm/ui/web/index.mjs +0 -8
- package/dist/common/ai/llm/ui/web/index.mjs.map +0 -1
- package/dist/common/ai/llm/web/index.d.mts +0 -6
- package/dist/common/ai/llm/web/index.d.ts +0 -6
- package/dist/common/ai/llm/web/index.js +0 -66
- package/dist/common/ai/llm/web/index.js.map +0 -1
- package/dist/common/ai/llm/web/index.mjs +0 -9
- package/dist/common/ai/llm/web/index.mjs.map +0 -1
- package/dist/index-BMgdH5dL.d.mts +0 -1716
- package/dist/index-IXMAeTtN.d.ts +0 -1716
- package/dist/types-B2rs_jq1.d.mts +0 -38
- package/dist/types-DgACCUpT.d.ts +0 -122
- package/dist/types-DwS2Eg0q.d.ts +0 -38
- package/dist/types-LU_BGSzk.d.mts +0 -122
- /package/dist/common/{ai/llm/core → aiApi}/index.js.map +0 -0
- /package/dist/common/{ai/llm/core → aiApi}/index.mjs.map +0 -0
- /package/dist/common/{ai/llm/electron → aiApi/server}/index.js.map +0 -0
- /package/dist/common/{ai/llm/electron → aiApi/server}/index.mjs.map +0 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import '../../../chunk-MAI35PU6.mjs';
|
|
2
|
+
import { useState, useCallback } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/common/aiApi/client/settingsCore.ts
|
|
5
|
+
var DEFAULT_AI_API_SETTINGS = {
|
|
6
|
+
apiKey: "",
|
|
7
|
+
baseUrl: "https://api.openai.com/v1",
|
|
8
|
+
visionModel: "gpt-4o-mini",
|
|
9
|
+
textModel: "gpt-4o-mini",
|
|
10
|
+
audioModel: "whisper-1",
|
|
11
|
+
audioStrategy: "auto"
|
|
12
|
+
};
|
|
13
|
+
var AI_API_SETTINGS_STORAGE_KEY = "ai-api-settings";
|
|
14
|
+
function loadAiApiSettings(storageKey = AI_API_SETTINGS_STORAGE_KEY) {
|
|
15
|
+
if (typeof window === "undefined") return DEFAULT_AI_API_SETTINGS;
|
|
16
|
+
try {
|
|
17
|
+
const raw = localStorage.getItem(storageKey);
|
|
18
|
+
if (!raw) return DEFAULT_AI_API_SETTINGS;
|
|
19
|
+
return { ...DEFAULT_AI_API_SETTINGS, ...JSON.parse(raw) };
|
|
20
|
+
} catch {
|
|
21
|
+
return DEFAULT_AI_API_SETTINGS;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function saveAiApiSettings(settings, storageKey = AI_API_SETTINGS_STORAGE_KEY) {
|
|
25
|
+
if (typeof window === "undefined") return;
|
|
26
|
+
localStorage.setItem(storageKey, JSON.stringify(settings));
|
|
27
|
+
}
|
|
28
|
+
function toClientSettings(settings) {
|
|
29
|
+
const client = {};
|
|
30
|
+
if (settings.apiKey.trim()) client.apiKey = settings.apiKey.trim();
|
|
31
|
+
if (settings.baseUrl.trim()) client.baseUrl = settings.baseUrl.trim();
|
|
32
|
+
const visionModel = settings.visionModel.trim();
|
|
33
|
+
const textModel = settings.textModel?.trim() || visionModel;
|
|
34
|
+
const audioModel = settings.audioModel?.trim();
|
|
35
|
+
if (visionModel) client.visionModel = visionModel;
|
|
36
|
+
if (textModel) client.textModel = textModel;
|
|
37
|
+
if (audioModel) client.audioModel = audioModel;
|
|
38
|
+
if (settings.audioStrategy) client.audioStrategy = settings.audioStrategy;
|
|
39
|
+
return Object.keys(client).length > 0 ? client : void 0;
|
|
40
|
+
}
|
|
41
|
+
function pickClientSettingsFromStorage(storageKey = AI_API_SETTINGS_STORAGE_KEY) {
|
|
42
|
+
return toClientSettings(loadAiApiSettings(storageKey));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/common/aiApi/client/aiApiClient.ts
|
|
46
|
+
var AiApiClientError = class extends Error {
|
|
47
|
+
constructor(message, code, response) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.code = code;
|
|
50
|
+
this.response = response;
|
|
51
|
+
this.name = "AiApiClientError";
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
async function runAiTask(taskId, input, options) {
|
|
55
|
+
const fetchFn = options?.fetchImpl ?? fetch;
|
|
56
|
+
const endpoint = options?.runEndpoint ?? "/api/ai/run";
|
|
57
|
+
const clientSettings = options?.clientSettings ?? pickClientSettingsFromStorage();
|
|
58
|
+
const payload = {
|
|
59
|
+
taskId,
|
|
60
|
+
input,
|
|
61
|
+
...clientSettings ? { clientSettings } : {}
|
|
62
|
+
};
|
|
63
|
+
const response = await fetchFn(endpoint, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
credentials: "include",
|
|
66
|
+
headers: { "Content-Type": "application/json" },
|
|
67
|
+
body: JSON.stringify(payload),
|
|
68
|
+
signal: options?.signal
|
|
69
|
+
});
|
|
70
|
+
const data = await response.json();
|
|
71
|
+
return data;
|
|
72
|
+
}
|
|
73
|
+
async function runAiTaskOrThrow(taskId, input, options) {
|
|
74
|
+
const result = await runAiTask(taskId, input, options);
|
|
75
|
+
if (!result.success || result.data === void 0) {
|
|
76
|
+
throw new AiApiClientError(
|
|
77
|
+
result.error?.message ?? "AI \u4EFB\u52A1\u5931\u8D25",
|
|
78
|
+
result.error?.code,
|
|
79
|
+
result
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return result.data;
|
|
83
|
+
}
|
|
84
|
+
function createAiTaskRunner(taskId, options) {
|
|
85
|
+
return (input, runOptions) => runAiTaskOrThrow(taskId, input, {
|
|
86
|
+
...runOptions,
|
|
87
|
+
runEndpoint: options?.runEndpoint,
|
|
88
|
+
fetchImpl: options?.fetchImpl
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
var aiApiClient = {
|
|
92
|
+
run: runAiTask,
|
|
93
|
+
runOrThrow: runAiTaskOrThrow,
|
|
94
|
+
createRunner: createAiTaskRunner
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// src/common/aiApi/client/fetchModels.ts
|
|
98
|
+
async function fetchAiModels(clientSettings, options) {
|
|
99
|
+
const fetchFn = options?.fetchImpl ?? fetch;
|
|
100
|
+
const endpoint = options?.modelsEndpoint ?? "/api/ai/models";
|
|
101
|
+
const response = await fetchFn(endpoint, {
|
|
102
|
+
method: "POST",
|
|
103
|
+
credentials: "include",
|
|
104
|
+
headers: { "Content-Type": "application/json" },
|
|
105
|
+
body: JSON.stringify({ clientSettings }),
|
|
106
|
+
signal: options?.signal
|
|
107
|
+
});
|
|
108
|
+
return await response.json();
|
|
109
|
+
}
|
|
110
|
+
function useAiTask(taskId) {
|
|
111
|
+
const [loading, setLoading] = useState(false);
|
|
112
|
+
const [error, setError] = useState(null);
|
|
113
|
+
const [result, setResult] = useState(null);
|
|
114
|
+
const execute = useCallback(
|
|
115
|
+
async (input, options) => {
|
|
116
|
+
setLoading(true);
|
|
117
|
+
setError(null);
|
|
118
|
+
try {
|
|
119
|
+
const response = await runAiTask(taskId, input, options);
|
|
120
|
+
setResult(response);
|
|
121
|
+
if (!response.success) {
|
|
122
|
+
setError(response.error?.message ?? "AI \u4EFB\u52A1\u5931\u8D25");
|
|
123
|
+
}
|
|
124
|
+
return response;
|
|
125
|
+
} catch (err) {
|
|
126
|
+
const message = err instanceof Error ? err.message : "AI \u4EFB\u52A1\u5931\u8D25";
|
|
127
|
+
setError(message);
|
|
128
|
+
const failed = {
|
|
129
|
+
success: false,
|
|
130
|
+
taskId,
|
|
131
|
+
error: { code: "AI_REQUEST_FAILED", message }
|
|
132
|
+
};
|
|
133
|
+
setResult(failed);
|
|
134
|
+
return failed;
|
|
135
|
+
} finally {
|
|
136
|
+
setLoading(false);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
[taskId]
|
|
140
|
+
);
|
|
141
|
+
const reset = useCallback(() => {
|
|
142
|
+
setLoading(false);
|
|
143
|
+
setError(null);
|
|
144
|
+
setResult(null);
|
|
145
|
+
}, []);
|
|
146
|
+
return { execute, loading, error, result, reset };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export { AI_API_SETTINGS_STORAGE_KEY, AiApiClientError, DEFAULT_AI_API_SETTINGS, aiApiClient, createAiTaskRunner, fetchAiModels, loadAiApiSettings, pickClientSettingsFromStorage, runAiTask, runAiTaskOrThrow, saveAiApiSettings, toClientSettings, useAiTask };
|
|
150
|
+
//# sourceMappingURL=index.mjs.map
|
|
151
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/common/aiApi/client/settingsCore.ts","../../../../src/common/aiApi/client/aiApiClient.ts","../../../../src/common/aiApi/client/fetchModels.ts","../../../../src/common/aiApi/client/hooks/useAiTask.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { AiClientSettings, AudioStrategy } from '../types';\n\nexport interface AiApiSettings {\n apiKey: string;\n baseUrl: string;\n visionModel: string;\n textModel?: string;\n audioModel?: string;\n audioStrategy?: AudioStrategy;\n}\n\nexport const DEFAULT_AI_API_SETTINGS: AiApiSettings = {\n apiKey: '',\n baseUrl: 'https://api.openai.com/v1',\n visionModel: 'gpt-4o-mini',\n textModel: 'gpt-4o-mini',\n audioModel: 'whisper-1',\n audioStrategy: 'auto',\n};\n\nexport const AI_API_SETTINGS_STORAGE_KEY = 'ai-api-settings';\n\nexport function loadAiApiSettings(storageKey = AI_API_SETTINGS_STORAGE_KEY): AiApiSettings {\n if (typeof window === 'undefined') return DEFAULT_AI_API_SETTINGS;\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return DEFAULT_AI_API_SETTINGS;\n return { ...DEFAULT_AI_API_SETTINGS, ...JSON.parse(raw) };\n } catch {\n return DEFAULT_AI_API_SETTINGS;\n }\n}\n\nexport function saveAiApiSettings(\n settings: AiApiSettings,\n storageKey = AI_API_SETTINGS_STORAGE_KEY\n): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(storageKey, JSON.stringify(settings));\n}\n\nexport function toClientSettings(settings: AiApiSettings): AiClientSettings | undefined {\n const client: AiClientSettings = {};\n if (settings.apiKey.trim()) client.apiKey = settings.apiKey.trim();\n if (settings.baseUrl.trim()) client.baseUrl = settings.baseUrl.trim();\n const visionModel = settings.visionModel.trim();\n const textModel = settings.textModel?.trim() || visionModel;\n const audioModel = settings.audioModel?.trim();\n if (visionModel) client.visionModel = visionModel;\n if (textModel) client.textModel = textModel;\n if (audioModel) client.audioModel = audioModel;\n if (settings.audioStrategy) client.audioStrategy = settings.audioStrategy;\n return Object.keys(client).length > 0 ? client : undefined;\n}\n\nexport function pickClientSettingsFromStorage(\n storageKey = AI_API_SETTINGS_STORAGE_KEY\n): AiClientSettings | undefined {\n return toClientSettings(loadAiApiSettings(storageKey));\n}\n","import type { AiApiResponse, AiApiRunRequest, AiClientSettings } from '../types';\nimport { pickClientSettingsFromStorage } from './settingsCore';\n\nexport class AiApiClientError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n public readonly response?: AiApiResponse\n ) {\n super(message);\n this.name = 'AiApiClientError';\n }\n}\n\nexport interface AiApiClientOptions {\n /** 默认 POST /api/ai/run,宿主应用可覆盖 */\n runEndpoint?: string;\n fetchImpl?: typeof fetch;\n}\n\n/**\n * 通过 HTTP 调用宿主暴露的 AI 任务入口(如 Next.js route)。\n * 连接配置可通过请求体 clientSettings 传入,或从 localStorage 读取。\n */\nexport async function runAiTask<TInput, TOutput>(\n taskId: string,\n input: TInput,\n options?: {\n signal?: AbortSignal;\n clientSettings?: AiClientSettings;\n runEndpoint?: string;\n fetchImpl?: typeof fetch;\n }\n): Promise<AiApiResponse<TOutput>> {\n const fetchFn = options?.fetchImpl ?? fetch;\n const endpoint = options?.runEndpoint ?? '/api/ai/run';\n const clientSettings = options?.clientSettings ?? pickClientSettingsFromStorage();\n\n const payload: AiApiRunRequest<TInput> = {\n taskId,\n input,\n ...(clientSettings ? { clientSettings } : {}),\n };\n\n const response = await fetchFn(endpoint, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: options?.signal,\n });\n\n const data = (await response.json()) as AiApiResponse<TOutput>;\n return data;\n}\n\nexport async function runAiTaskOrThrow<TInput, TOutput>(\n taskId: string,\n input: TInput,\n options?: {\n signal?: AbortSignal;\n clientSettings?: AiClientSettings;\n runEndpoint?: string;\n fetchImpl?: typeof fetch;\n }\n): Promise<TOutput> {\n const result = await runAiTask<TInput, TOutput>(taskId, input, options);\n if (!result.success || result.data === undefined) {\n throw new AiApiClientError(\n result.error?.message ?? 'AI 任务失败',\n result.error?.code,\n result\n );\n }\n return result.data;\n}\n\nexport function createAiTaskRunner<TInput, TOutput>(\n taskId: string,\n options?: AiApiClientOptions\n) {\n return (\n input: TInput,\n runOptions?: { signal?: AbortSignal; clientSettings?: AiClientSettings }\n ) =>\n runAiTaskOrThrow<TInput, TOutput>(taskId, input, {\n ...runOptions,\n runEndpoint: options?.runEndpoint,\n fetchImpl: options?.fetchImpl,\n });\n}\n\nexport const aiApiClient = {\n run: runAiTask,\n runOrThrow: runAiTaskOrThrow,\n createRunner: createAiTaskRunner,\n};\n","import type { AiClientSettings, AiModelsListResponse } from '../types';\n\nexport async function fetchAiModels(\n clientSettings?: AiClientSettings,\n options?: { signal?: AbortSignal; modelsEndpoint?: string; fetchImpl?: typeof fetch }\n): Promise<AiModelsListResponse> {\n const fetchFn = options?.fetchImpl ?? fetch;\n const endpoint = options?.modelsEndpoint ?? '/api/ai/models';\n\n const response = await fetchFn(endpoint, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ clientSettings }),\n signal: options?.signal,\n });\n\n return (await response.json()) as AiModelsListResponse;\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport type { AiClientSettings, AiApiResponse } from '../../types';\nimport { runAiTask } from '../aiApiClient';\n\nexport function useAiTask<TInput, TOutput>(taskId: string) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<AiApiResponse<TOutput> | null>(null);\n\n const execute = useCallback(\n async (\n input: TInput,\n options?: { signal?: AbortSignal; clientSettings?: AiClientSettings }\n ) => {\n setLoading(true);\n setError(null);\n try {\n const response = await runAiTask<TInput, TOutput>(taskId, input, options);\n setResult(response);\n if (!response.success) {\n setError(response.error?.message ?? 'AI 任务失败');\n }\n return response;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'AI 任务失败';\n setError(message);\n const failed: AiApiResponse<TOutput> = {\n success: false,\n taskId,\n error: { code: 'AI_REQUEST_FAILED', message },\n };\n setResult(failed);\n return failed;\n } finally {\n setLoading(false);\n }\n },\n [taskId]\n );\n\n const reset = useCallback(() => {\n setLoading(false);\n setError(null);\n setResult(null);\n }, []);\n\n return { execute, loading, error, result, reset };\n}\n"]}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { A as AiClientSettings, d as AiConnectionConfig, M as MultimodalChatParams, e as MultimodalChatResult, f as AiImageInput, g as AiAudioInput, h as AiMediaInput, c as AudioStrategy, i as AiTaskDefinition, j as AiTaskContext, a as AiApiResponse, T as TextCompletionInput, k as TextCompletionOutput, S as StructuredMultimodalInput, l as StructuredMultimodalOutput, C as ConnectivityTestOutput } from '../../types-CiqMQ-uu.mjs';
|
|
2
|
+
export { p as AiApiErrorBody, q as AiApiErrorCode, r as AiApiResponseMeta, n as AiApiRunRequest, u as AiAudioMediaInput, m as AiConnectionSettings, t as AiImageMediaInput, s as AiMediaKind, y as AiModelsListRequest, b as AiModelsListResponse, o as AiTaskRunOptions, x as CORE_CONNECTIVITY_TEST_TASK_ID, v as CORE_LLM_COMPLETION_TASK_ID, w as CORE_STRUCTURED_MULTIMODAL_TASK_ID } from '../../types-CiqMQ-uu.mjs';
|
|
3
|
+
import { R as RequestAdapter } from '../../types-CbTsi9CZ.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 合并连接配置:显式 connection > clientSettings > 环境变量。
|
|
7
|
+
* 缺少 apiKey 时返回 null。
|
|
8
|
+
*/
|
|
9
|
+
declare function resolveAiConnectionConfig(...sources: Array<AiClientSettings | undefined>): AiConnectionConfig | null;
|
|
10
|
+
declare function requireAiConnectionConfig(...sources: Array<AiClientSettings | undefined>): AiConnectionConfig;
|
|
11
|
+
|
|
12
|
+
type JsonRequestOptions = {
|
|
13
|
+
url: string;
|
|
14
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
body?: unknown;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
requestAdapter?: RequestAdapter;
|
|
19
|
+
};
|
|
20
|
+
declare function requestJson<T>(options: JsonRequestOptions): Promise<T>;
|
|
21
|
+
|
|
22
|
+
declare const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
|
|
23
|
+
declare const DEFAULT_TEXT_MODEL = "gpt-4o-mini";
|
|
24
|
+
type ChatRole = 'system' | 'user' | 'assistant';
|
|
25
|
+
interface ChatMessage {
|
|
26
|
+
role: ChatRole;
|
|
27
|
+
content: string;
|
|
28
|
+
}
|
|
29
|
+
interface CallChatOptions {
|
|
30
|
+
/** OpenAI 兼容 API Base URL */
|
|
31
|
+
baseUrl: string;
|
|
32
|
+
/** API Key */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
model?: string;
|
|
35
|
+
systemPrompt?: string;
|
|
36
|
+
userPrompt?: string;
|
|
37
|
+
messages?: ChatMessage[];
|
|
38
|
+
temperature?: number;
|
|
39
|
+
maxTokens?: number;
|
|
40
|
+
topP?: number;
|
|
41
|
+
stop?: string | string[];
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
requestAdapter?: RequestAdapter;
|
|
44
|
+
}
|
|
45
|
+
interface ChatUsage {
|
|
46
|
+
promptTokens?: number;
|
|
47
|
+
completionTokens?: number;
|
|
48
|
+
totalTokens?: number;
|
|
49
|
+
}
|
|
50
|
+
interface CallChatResult {
|
|
51
|
+
content: string;
|
|
52
|
+
model: string;
|
|
53
|
+
usage?: ChatUsage;
|
|
54
|
+
raw?: unknown;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* OpenAI 兼容文本对话:外部传入 URL、Key、提示词,返回模型生成内容。
|
|
58
|
+
*/
|
|
59
|
+
declare function callChat(options: CallChatOptions): Promise<CallChatResult>;
|
|
60
|
+
|
|
61
|
+
interface CallCompletionParams {
|
|
62
|
+
systemPrompt?: string;
|
|
63
|
+
userPrompt: string;
|
|
64
|
+
model?: string;
|
|
65
|
+
temperature?: number;
|
|
66
|
+
maxTokens?: number;
|
|
67
|
+
connection?: AiClientSettings;
|
|
68
|
+
}
|
|
69
|
+
interface CallCompletionResult {
|
|
70
|
+
content: string;
|
|
71
|
+
model: string;
|
|
72
|
+
raw?: unknown;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 文本补全:连接信息与提示词均由调用方传入(或通过 connection 合并 env)。
|
|
76
|
+
*/
|
|
77
|
+
declare function callCompletion(params: CallCompletionParams, clientSettings?: AiClientSettings): Promise<CallCompletionResult>;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* OpenAI 兼容多模态对话:文本 + 可选图片/语音。
|
|
81
|
+
* audioStrategy=auto 时:优先 chat 内嵌音频(native),失败或未支持则 STT 转写后走文本 chat。
|
|
82
|
+
*/
|
|
83
|
+
declare function callMultimodalChat(params: MultimodalChatParams, clientSettings?: AiClientSettings): Promise<MultimodalChatResult>;
|
|
84
|
+
|
|
85
|
+
declare function extractJsonObject(text: string): Record<string, unknown>;
|
|
86
|
+
|
|
87
|
+
declare function assertValidImageInput(image: AiImageInput, maxImageBytes?: number): void;
|
|
88
|
+
declare function fileToAiImageInput(file: File): Promise<AiImageInput>;
|
|
89
|
+
|
|
90
|
+
declare function mimeToAudioFormat(mimeType: string): string;
|
|
91
|
+
declare function assertValidAudioInput(audio: AiAudioInput, maxAudioBytes?: number): void;
|
|
92
|
+
declare function fileToAiAudioInput(file: File): Promise<AiAudioInput>;
|
|
93
|
+
declare function base64ToBlob(base64: string, mimeType: string): Blob;
|
|
94
|
+
|
|
95
|
+
declare function splitMediaByKind(media: AiMediaInput[]): {
|
|
96
|
+
images: AiMediaInput[];
|
|
97
|
+
audios: AiMediaInput[];
|
|
98
|
+
};
|
|
99
|
+
declare function assertValidMultimodalMedia(media: AiMediaInput[] | undefined, limits: {
|
|
100
|
+
maxImageBytes: number;
|
|
101
|
+
maxAudioBytes: number;
|
|
102
|
+
maxImages?: number;
|
|
103
|
+
maxAudios?: number;
|
|
104
|
+
}): AiMediaInput[];
|
|
105
|
+
|
|
106
|
+
type ResolvedAudioHandling = 'none' | 'native' | 'stt';
|
|
107
|
+
declare function resolveAudioHandling(options: {
|
|
108
|
+
hasAudio: boolean;
|
|
109
|
+
strategy: AudioStrategy;
|
|
110
|
+
model: string;
|
|
111
|
+
baseUrl: string;
|
|
112
|
+
}): ResolvedAudioHandling;
|
|
113
|
+
declare function isAudioInputError(message: string): boolean;
|
|
114
|
+
declare function appendTranscriptionsToPrompt(userPrompt: string, transcriptions: string[]): string;
|
|
115
|
+
|
|
116
|
+
interface TranscribeAudioOptions {
|
|
117
|
+
audio: AiAudioInput;
|
|
118
|
+
config: AiConnectionConfig;
|
|
119
|
+
model?: string;
|
|
120
|
+
language?: string;
|
|
121
|
+
}
|
|
122
|
+
declare function transcribeAudio(options: TranscribeAudioOptions): Promise<string>;
|
|
123
|
+
declare function transcribeAudios(audios: AiAudioInput[], config: AiConnectionConfig, model?: string): Promise<string[]>;
|
|
124
|
+
|
|
125
|
+
declare function isLikelyNativeAudioChatModel(id: string): boolean;
|
|
126
|
+
declare function isLikelySttModel(id: string): boolean;
|
|
127
|
+
declare function filterSttModels(modelIds: string[]): string[];
|
|
128
|
+
declare function pickDefaultSttModel(modelIds: string[], current?: string): string | undefined;
|
|
129
|
+
declare function isLikelyVisionModel(id: string): boolean;
|
|
130
|
+
declare function isKnownTextOnlyModel(id: string): boolean;
|
|
131
|
+
declare function filterChatModels(modelIds: string[]): string[];
|
|
132
|
+
declare function filterVisionModels(modelIds: string[]): string[];
|
|
133
|
+
/** 从可用模型中挑选默认视觉模型 */
|
|
134
|
+
declare function pickDefaultVisionModel(modelIds: string[], current?: string): string | undefined;
|
|
135
|
+
|
|
136
|
+
type VisionMessageFormat = 'openai' | 'ollama';
|
|
137
|
+
declare function detectVisionMessageFormat(baseUrl: string): VisionMessageFormat;
|
|
138
|
+
declare function assertVisionCapableModel(modelId: string, options?: {
|
|
139
|
+
baseUrl?: string;
|
|
140
|
+
hasImages?: boolean;
|
|
141
|
+
}): void;
|
|
142
|
+
declare function isImageUrlVariantError(message: string): boolean;
|
|
143
|
+
declare function toVisionApiErrorMessage(rawMessage: string, modelId: string): string;
|
|
144
|
+
|
|
145
|
+
declare function buildMultimodalMessages(options: {
|
|
146
|
+
systemPrompt: string;
|
|
147
|
+
userPrompt: string;
|
|
148
|
+
images: AiMediaInput[];
|
|
149
|
+
nativeAudios: AiMediaInput[];
|
|
150
|
+
format: VisionMessageFormat;
|
|
151
|
+
}): Array<Record<string, unknown>>;
|
|
152
|
+
declare function assertMultimodalCapableModel(modelId: string, options: {
|
|
153
|
+
baseUrl?: string;
|
|
154
|
+
hasImages?: boolean;
|
|
155
|
+
hasNativeAudio?: boolean;
|
|
156
|
+
}): void;
|
|
157
|
+
|
|
158
|
+
interface ListModelsResult {
|
|
159
|
+
models: string[];
|
|
160
|
+
visionModels: string[];
|
|
161
|
+
suggestedVisionModel?: string;
|
|
162
|
+
}
|
|
163
|
+
declare function listOpenAiCompatibleModels(clientSettings?: AiClientSettings, currentVisionModel?: string): Promise<ListModelsResult>;
|
|
164
|
+
|
|
165
|
+
declare function registerAiTask<TInput, TOutput>(task: AiTaskDefinition<TInput, TOutput>): void;
|
|
166
|
+
declare function getAiTask(taskId: string): AiTaskDefinition | undefined;
|
|
167
|
+
declare function listAiTasks(): string[];
|
|
168
|
+
declare function clearAiTasksForTest(): void;
|
|
169
|
+
|
|
170
|
+
declare function runAiTask<TData = unknown>(taskId: string, input: unknown, ctx?: AiTaskContext): Promise<AiApiResponse<TData>>;
|
|
171
|
+
|
|
172
|
+
/** 注册内置通用 AI 任务(幂等) */
|
|
173
|
+
declare function registerCoreAiTasks(): void;
|
|
174
|
+
/** 别名:确保 core 任务已注册 */
|
|
175
|
+
declare const ensureCoreAiTasksRegistered: typeof registerCoreAiTasks;
|
|
176
|
+
declare function resetCoreAiTasksForTest(): void;
|
|
177
|
+
|
|
178
|
+
declare const coreLlmCompletionTask: AiTaskDefinition<TextCompletionInput, TextCompletionOutput>;
|
|
179
|
+
|
|
180
|
+
declare const coreStructuredMultimodalTask: AiTaskDefinition<StructuredMultimodalInput, StructuredMultimodalOutput>;
|
|
181
|
+
|
|
182
|
+
declare const coreConnectivityTestTask: AiTaskDefinition<Record<string, never>, ConnectivityTestOutput>;
|
|
183
|
+
|
|
184
|
+
export { AiApiResponse, AiAudioInput, AiClientSettings, AiConnectionConfig, AiImageInput, AiMediaInput, AiTaskContext, AiTaskDefinition, AudioStrategy, type CallChatOptions, type CallChatResult, type CallCompletionParams, type CallCompletionResult, type ChatMessage, type ChatRole, type ChatUsage, ConnectivityTestOutput, DEFAULT_OPENAI_BASE_URL, DEFAULT_TEXT_MODEL, type JsonRequestOptions, type ListModelsResult, MultimodalChatParams, MultimodalChatResult, type ResolvedAudioHandling, StructuredMultimodalInput, StructuredMultimodalOutput, TextCompletionInput, TextCompletionOutput, type TranscribeAudioOptions, type VisionMessageFormat, appendTranscriptionsToPrompt, assertMultimodalCapableModel, assertValidAudioInput, assertValidImageInput, assertValidMultimodalMedia, assertVisionCapableModel, base64ToBlob, buildMultimodalMessages, callChat, callCompletion, callMultimodalChat, clearAiTasksForTest, coreConnectivityTestTask, coreLlmCompletionTask, coreStructuredMultimodalTask, detectVisionMessageFormat, ensureCoreAiTasksRegistered, extractJsonObject, fileToAiAudioInput, fileToAiImageInput, filterChatModels, filterSttModels, filterVisionModels, getAiTask, isAudioInputError, isImageUrlVariantError, isKnownTextOnlyModel, isLikelyNativeAudioChatModel, isLikelySttModel, isLikelyVisionModel, listAiTasks, listOpenAiCompatibleModels, mimeToAudioFormat, pickDefaultSttModel, pickDefaultVisionModel, registerAiTask, registerCoreAiTasks, requestJson, requireAiConnectionConfig, resetCoreAiTasksForTest, resolveAiConnectionConfig, resolveAudioHandling, runAiTask, splitMediaByKind, toVisionApiErrorMessage, transcribeAudio, transcribeAudios };
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { A as AiClientSettings, d as AiConnectionConfig, M as MultimodalChatParams, e as MultimodalChatResult, f as AiImageInput, g as AiAudioInput, h as AiMediaInput, c as AudioStrategy, i as AiTaskDefinition, j as AiTaskContext, a as AiApiResponse, T as TextCompletionInput, k as TextCompletionOutput, S as StructuredMultimodalInput, l as StructuredMultimodalOutput, C as ConnectivityTestOutput } from '../../types-CiqMQ-uu.js';
|
|
2
|
+
export { p as AiApiErrorBody, q as AiApiErrorCode, r as AiApiResponseMeta, n as AiApiRunRequest, u as AiAudioMediaInput, m as AiConnectionSettings, t as AiImageMediaInput, s as AiMediaKind, y as AiModelsListRequest, b as AiModelsListResponse, o as AiTaskRunOptions, x as CORE_CONNECTIVITY_TEST_TASK_ID, v as CORE_LLM_COMPLETION_TASK_ID, w as CORE_STRUCTURED_MULTIMODAL_TASK_ID } from '../../types-CiqMQ-uu.js';
|
|
3
|
+
import { R as RequestAdapter } from '../../types-CbTsi9CZ.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 合并连接配置:显式 connection > clientSettings > 环境变量。
|
|
7
|
+
* 缺少 apiKey 时返回 null。
|
|
8
|
+
*/
|
|
9
|
+
declare function resolveAiConnectionConfig(...sources: Array<AiClientSettings | undefined>): AiConnectionConfig | null;
|
|
10
|
+
declare function requireAiConnectionConfig(...sources: Array<AiClientSettings | undefined>): AiConnectionConfig;
|
|
11
|
+
|
|
12
|
+
type JsonRequestOptions = {
|
|
13
|
+
url: string;
|
|
14
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
body?: unknown;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
requestAdapter?: RequestAdapter;
|
|
19
|
+
};
|
|
20
|
+
declare function requestJson<T>(options: JsonRequestOptions): Promise<T>;
|
|
21
|
+
|
|
22
|
+
declare const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
|
|
23
|
+
declare const DEFAULT_TEXT_MODEL = "gpt-4o-mini";
|
|
24
|
+
type ChatRole = 'system' | 'user' | 'assistant';
|
|
25
|
+
interface ChatMessage {
|
|
26
|
+
role: ChatRole;
|
|
27
|
+
content: string;
|
|
28
|
+
}
|
|
29
|
+
interface CallChatOptions {
|
|
30
|
+
/** OpenAI 兼容 API Base URL */
|
|
31
|
+
baseUrl: string;
|
|
32
|
+
/** API Key */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
model?: string;
|
|
35
|
+
systemPrompt?: string;
|
|
36
|
+
userPrompt?: string;
|
|
37
|
+
messages?: ChatMessage[];
|
|
38
|
+
temperature?: number;
|
|
39
|
+
maxTokens?: number;
|
|
40
|
+
topP?: number;
|
|
41
|
+
stop?: string | string[];
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
requestAdapter?: RequestAdapter;
|
|
44
|
+
}
|
|
45
|
+
interface ChatUsage {
|
|
46
|
+
promptTokens?: number;
|
|
47
|
+
completionTokens?: number;
|
|
48
|
+
totalTokens?: number;
|
|
49
|
+
}
|
|
50
|
+
interface CallChatResult {
|
|
51
|
+
content: string;
|
|
52
|
+
model: string;
|
|
53
|
+
usage?: ChatUsage;
|
|
54
|
+
raw?: unknown;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* OpenAI 兼容文本对话:外部传入 URL、Key、提示词,返回模型生成内容。
|
|
58
|
+
*/
|
|
59
|
+
declare function callChat(options: CallChatOptions): Promise<CallChatResult>;
|
|
60
|
+
|
|
61
|
+
interface CallCompletionParams {
|
|
62
|
+
systemPrompt?: string;
|
|
63
|
+
userPrompt: string;
|
|
64
|
+
model?: string;
|
|
65
|
+
temperature?: number;
|
|
66
|
+
maxTokens?: number;
|
|
67
|
+
connection?: AiClientSettings;
|
|
68
|
+
}
|
|
69
|
+
interface CallCompletionResult {
|
|
70
|
+
content: string;
|
|
71
|
+
model: string;
|
|
72
|
+
raw?: unknown;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 文本补全:连接信息与提示词均由调用方传入(或通过 connection 合并 env)。
|
|
76
|
+
*/
|
|
77
|
+
declare function callCompletion(params: CallCompletionParams, clientSettings?: AiClientSettings): Promise<CallCompletionResult>;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* OpenAI 兼容多模态对话:文本 + 可选图片/语音。
|
|
81
|
+
* audioStrategy=auto 时:优先 chat 内嵌音频(native),失败或未支持则 STT 转写后走文本 chat。
|
|
82
|
+
*/
|
|
83
|
+
declare function callMultimodalChat(params: MultimodalChatParams, clientSettings?: AiClientSettings): Promise<MultimodalChatResult>;
|
|
84
|
+
|
|
85
|
+
declare function extractJsonObject(text: string): Record<string, unknown>;
|
|
86
|
+
|
|
87
|
+
declare function assertValidImageInput(image: AiImageInput, maxImageBytes?: number): void;
|
|
88
|
+
declare function fileToAiImageInput(file: File): Promise<AiImageInput>;
|
|
89
|
+
|
|
90
|
+
declare function mimeToAudioFormat(mimeType: string): string;
|
|
91
|
+
declare function assertValidAudioInput(audio: AiAudioInput, maxAudioBytes?: number): void;
|
|
92
|
+
declare function fileToAiAudioInput(file: File): Promise<AiAudioInput>;
|
|
93
|
+
declare function base64ToBlob(base64: string, mimeType: string): Blob;
|
|
94
|
+
|
|
95
|
+
declare function splitMediaByKind(media: AiMediaInput[]): {
|
|
96
|
+
images: AiMediaInput[];
|
|
97
|
+
audios: AiMediaInput[];
|
|
98
|
+
};
|
|
99
|
+
declare function assertValidMultimodalMedia(media: AiMediaInput[] | undefined, limits: {
|
|
100
|
+
maxImageBytes: number;
|
|
101
|
+
maxAudioBytes: number;
|
|
102
|
+
maxImages?: number;
|
|
103
|
+
maxAudios?: number;
|
|
104
|
+
}): AiMediaInput[];
|
|
105
|
+
|
|
106
|
+
type ResolvedAudioHandling = 'none' | 'native' | 'stt';
|
|
107
|
+
declare function resolveAudioHandling(options: {
|
|
108
|
+
hasAudio: boolean;
|
|
109
|
+
strategy: AudioStrategy;
|
|
110
|
+
model: string;
|
|
111
|
+
baseUrl: string;
|
|
112
|
+
}): ResolvedAudioHandling;
|
|
113
|
+
declare function isAudioInputError(message: string): boolean;
|
|
114
|
+
declare function appendTranscriptionsToPrompt(userPrompt: string, transcriptions: string[]): string;
|
|
115
|
+
|
|
116
|
+
interface TranscribeAudioOptions {
|
|
117
|
+
audio: AiAudioInput;
|
|
118
|
+
config: AiConnectionConfig;
|
|
119
|
+
model?: string;
|
|
120
|
+
language?: string;
|
|
121
|
+
}
|
|
122
|
+
declare function transcribeAudio(options: TranscribeAudioOptions): Promise<string>;
|
|
123
|
+
declare function transcribeAudios(audios: AiAudioInput[], config: AiConnectionConfig, model?: string): Promise<string[]>;
|
|
124
|
+
|
|
125
|
+
declare function isLikelyNativeAudioChatModel(id: string): boolean;
|
|
126
|
+
declare function isLikelySttModel(id: string): boolean;
|
|
127
|
+
declare function filterSttModels(modelIds: string[]): string[];
|
|
128
|
+
declare function pickDefaultSttModel(modelIds: string[], current?: string): string | undefined;
|
|
129
|
+
declare function isLikelyVisionModel(id: string): boolean;
|
|
130
|
+
declare function isKnownTextOnlyModel(id: string): boolean;
|
|
131
|
+
declare function filterChatModels(modelIds: string[]): string[];
|
|
132
|
+
declare function filterVisionModels(modelIds: string[]): string[];
|
|
133
|
+
/** 从可用模型中挑选默认视觉模型 */
|
|
134
|
+
declare function pickDefaultVisionModel(modelIds: string[], current?: string): string | undefined;
|
|
135
|
+
|
|
136
|
+
type VisionMessageFormat = 'openai' | 'ollama';
|
|
137
|
+
declare function detectVisionMessageFormat(baseUrl: string): VisionMessageFormat;
|
|
138
|
+
declare function assertVisionCapableModel(modelId: string, options?: {
|
|
139
|
+
baseUrl?: string;
|
|
140
|
+
hasImages?: boolean;
|
|
141
|
+
}): void;
|
|
142
|
+
declare function isImageUrlVariantError(message: string): boolean;
|
|
143
|
+
declare function toVisionApiErrorMessage(rawMessage: string, modelId: string): string;
|
|
144
|
+
|
|
145
|
+
declare function buildMultimodalMessages(options: {
|
|
146
|
+
systemPrompt: string;
|
|
147
|
+
userPrompt: string;
|
|
148
|
+
images: AiMediaInput[];
|
|
149
|
+
nativeAudios: AiMediaInput[];
|
|
150
|
+
format: VisionMessageFormat;
|
|
151
|
+
}): Array<Record<string, unknown>>;
|
|
152
|
+
declare function assertMultimodalCapableModel(modelId: string, options: {
|
|
153
|
+
baseUrl?: string;
|
|
154
|
+
hasImages?: boolean;
|
|
155
|
+
hasNativeAudio?: boolean;
|
|
156
|
+
}): void;
|
|
157
|
+
|
|
158
|
+
interface ListModelsResult {
|
|
159
|
+
models: string[];
|
|
160
|
+
visionModels: string[];
|
|
161
|
+
suggestedVisionModel?: string;
|
|
162
|
+
}
|
|
163
|
+
declare function listOpenAiCompatibleModels(clientSettings?: AiClientSettings, currentVisionModel?: string): Promise<ListModelsResult>;
|
|
164
|
+
|
|
165
|
+
declare function registerAiTask<TInput, TOutput>(task: AiTaskDefinition<TInput, TOutput>): void;
|
|
166
|
+
declare function getAiTask(taskId: string): AiTaskDefinition | undefined;
|
|
167
|
+
declare function listAiTasks(): string[];
|
|
168
|
+
declare function clearAiTasksForTest(): void;
|
|
169
|
+
|
|
170
|
+
declare function runAiTask<TData = unknown>(taskId: string, input: unknown, ctx?: AiTaskContext): Promise<AiApiResponse<TData>>;
|
|
171
|
+
|
|
172
|
+
/** 注册内置通用 AI 任务(幂等) */
|
|
173
|
+
declare function registerCoreAiTasks(): void;
|
|
174
|
+
/** 别名:确保 core 任务已注册 */
|
|
175
|
+
declare const ensureCoreAiTasksRegistered: typeof registerCoreAiTasks;
|
|
176
|
+
declare function resetCoreAiTasksForTest(): void;
|
|
177
|
+
|
|
178
|
+
declare const coreLlmCompletionTask: AiTaskDefinition<TextCompletionInput, TextCompletionOutput>;
|
|
179
|
+
|
|
180
|
+
declare const coreStructuredMultimodalTask: AiTaskDefinition<StructuredMultimodalInput, StructuredMultimodalOutput>;
|
|
181
|
+
|
|
182
|
+
declare const coreConnectivityTestTask: AiTaskDefinition<Record<string, never>, ConnectivityTestOutput>;
|
|
183
|
+
|
|
184
|
+
export { AiApiResponse, AiAudioInput, AiClientSettings, AiConnectionConfig, AiImageInput, AiMediaInput, AiTaskContext, AiTaskDefinition, AudioStrategy, type CallChatOptions, type CallChatResult, type CallCompletionParams, type CallCompletionResult, type ChatMessage, type ChatRole, type ChatUsage, ConnectivityTestOutput, DEFAULT_OPENAI_BASE_URL, DEFAULT_TEXT_MODEL, type JsonRequestOptions, type ListModelsResult, MultimodalChatParams, MultimodalChatResult, type ResolvedAudioHandling, StructuredMultimodalInput, StructuredMultimodalOutput, TextCompletionInput, TextCompletionOutput, type TranscribeAudioOptions, type VisionMessageFormat, appendTranscriptionsToPrompt, assertMultimodalCapableModel, assertValidAudioInput, assertValidImageInput, assertValidMultimodalMedia, assertVisionCapableModel, base64ToBlob, buildMultimodalMessages, callChat, callCompletion, callMultimodalChat, clearAiTasksForTest, coreConnectivityTestTask, coreLlmCompletionTask, coreStructuredMultimodalTask, detectVisionMessageFormat, ensureCoreAiTasksRegistered, extractJsonObject, fileToAiAudioInput, fileToAiImageInput, filterChatModels, filterSttModels, filterVisionModels, getAiTask, isAudioInputError, isImageUrlVariantError, isKnownTextOnlyModel, isLikelyNativeAudioChatModel, isLikelySttModel, isLikelyVisionModel, listAiTasks, listOpenAiCompatibleModels, mimeToAudioFormat, pickDefaultSttModel, pickDefaultVisionModel, registerAiTask, registerCoreAiTasks, requestJson, requireAiConnectionConfig, resetCoreAiTasksForTest, resolveAiConnectionConfig, resolveAudioHandling, runAiTask, splitMediaByKind, toVisionApiErrorMessage, transcribeAudio, transcribeAudios };
|