@henjicc/ai-sdk 0.6.2 → 0.8.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 (119) hide show
  1. package/CHANGELOG.md +45 -33
  2. package/README.md +60 -60
  3. package/dist/catalog/audio/tts-common.d.ts +5 -0
  4. package/dist/catalog/audio/tts-common.js +17 -0
  5. package/dist/catalog/bailian/cosyvoice-v3.5.model.d.ts +2 -0
  6. package/dist/catalog/bailian/cosyvoice-v3.5.model.js +40 -0
  7. package/dist/catalog/bailian/minimax-speech-2.8.model.d.ts +2 -0
  8. package/dist/catalog/bailian/minimax-speech-2.8.model.js +38 -0
  9. package/dist/catalog/bailian/qwen-audio-3.1-tts-flash.model.d.ts +2 -0
  10. package/dist/catalog/bailian/qwen-audio-3.1-tts-flash.model.js +35 -0
  11. package/dist/catalog/fal/eleven-v3-tts.model.d.ts +2 -0
  12. package/dist/catalog/fal/eleven-v3-tts.model.js +31 -0
  13. package/dist/catalog/fal/minimax-speech-2.8.model.d.ts +2 -0
  14. package/dist/catalog/fal/minimax-speech-2.8.model.js +39 -0
  15. package/dist/catalog/fal/qwen3-tts-1.7b.model.d.ts +2 -0
  16. package/dist/catalog/fal/qwen3-tts-1.7b.model.js +33 -0
  17. package/dist/catalog/index.js +116 -90
  18. package/dist/catalog/kie/eleven-turbo-2.5-tts.model.d.ts +2 -0
  19. package/dist/catalog/kie/eleven-turbo-2.5-tts.model.js +29 -0
  20. package/dist/catalog/kie/eleven-v3-dialogue.model.d.ts +2 -0
  21. package/dist/catalog/kie/eleven-v3-dialogue.model.js +46 -0
  22. package/dist/catalog/kie/gemini-3.1-flash-tts.model.d.ts +2 -0
  23. package/dist/catalog/kie/gemini-3.1-flash-tts.model.js +40 -0
  24. package/dist/catalog/ppio/minimax-speech.model.js +1 -3
  25. package/dist/catalog/siliconflow/cosyvoice2-tts.model.d.ts +2 -0
  26. package/dist/catalog/siliconflow/cosyvoice2-tts.model.js +27 -0
  27. package/dist/catalog/siliconflow/moss-ttsd-0.5.model.d.ts +2 -0
  28. package/dist/catalog/siliconflow/moss-ttsd-0.5.model.js +28 -0
  29. package/dist/catalog/volcengine-speech/seed-icl-2.0.model.d.ts +2 -0
  30. package/dist/catalog/volcengine-speech/seed-icl-2.0.model.js +26 -0
  31. package/dist/catalog/volcengine-speech/seed-tts-2.0.model.d.ts +2 -0
  32. package/dist/catalog/volcengine-speech/seed-tts-2.0.model.js +25 -0
  33. package/dist/packs/models/bailian/cosyvoice-v3.5.d.ts +6 -0
  34. package/dist/packs/models/bailian/cosyvoice-v3.5.js +7 -0
  35. package/dist/packs/models/bailian/minimax-speech-2.8.d.ts +6 -0
  36. package/dist/packs/models/bailian/minimax-speech-2.8.js +7 -0
  37. package/dist/packs/models/bailian/qwen-audio-3.1-tts-flash.d.ts +6 -0
  38. package/dist/packs/models/bailian/qwen-audio-3.1-tts-flash.js +7 -0
  39. package/dist/packs/models/fal/eleven-v3-tts.d.ts +6 -0
  40. package/dist/packs/models/fal/eleven-v3-tts.js +7 -0
  41. package/dist/packs/models/fal/minimax-speech-2.8.d.ts +6 -0
  42. package/dist/packs/models/fal/minimax-speech-2.8.js +7 -0
  43. package/dist/packs/models/fal/qwen3-tts-1.7b.d.ts +6 -0
  44. package/dist/packs/models/fal/qwen3-tts-1.7b.js +7 -0
  45. package/dist/packs/models/kie/eleven-turbo-2.5-tts.d.ts +6 -0
  46. package/dist/packs/models/kie/eleven-turbo-2.5-tts.js +7 -0
  47. package/dist/packs/models/kie/eleven-v3-dialogue.d.ts +6 -0
  48. package/dist/packs/models/kie/eleven-v3-dialogue.js +7 -0
  49. package/dist/packs/models/kie/gemini-3.1-flash-tts.d.ts +6 -0
  50. package/dist/packs/models/kie/gemini-3.1-flash-tts.js +7 -0
  51. package/dist/packs/models/siliconflow/cosyvoice2-tts.d.ts +6 -0
  52. package/dist/packs/models/siliconflow/cosyvoice2-tts.js +7 -0
  53. package/dist/packs/models/siliconflow/moss-ttsd-0.5.d.ts +6 -0
  54. package/dist/packs/models/siliconflow/moss-ttsd-0.5.js +7 -0
  55. package/dist/packs/models/volcengine-speech/seed-icl-2.0.d.ts +6 -0
  56. package/dist/packs/models/volcengine-speech/seed-icl-2.0.js +7 -0
  57. package/dist/packs/models/volcengine-speech/seed-tts-2.0.d.ts +6 -0
  58. package/dist/packs/models/volcengine-speech/seed-tts-2.0.js +7 -0
  59. package/dist/packs/provider-adapters/siliconflow.d.ts +3 -0
  60. package/dist/packs/provider-adapters/siliconflow.js +5 -0
  61. package/dist/packs/provider-adapters/volcengine-speech.d.ts +3 -0
  62. package/dist/packs/provider-adapters/volcengine-speech.js +5 -0
  63. package/dist/packs/provider-packs/bailian.d.ts +1 -1
  64. package/dist/packs/provider-packs/bailian.js +6 -3
  65. package/dist/packs/provider-packs/fal.d.ts +1 -1
  66. package/dist/packs/provider-packs/fal.js +41 -38
  67. package/dist/packs/provider-packs/kie.d.ts +1 -1
  68. package/dist/packs/provider-packs/kie.js +33 -30
  69. package/dist/packs/provider-packs/siliconflow.d.ts +4 -0
  70. package/dist/packs/provider-packs/siliconflow.js +7 -0
  71. package/dist/packs/provider-packs/volcengine-speech.d.ts +4 -0
  72. package/dist/packs/provider-packs/volcengine-speech.js +7 -0
  73. package/dist/providers/audio-data.d.ts +2 -0
  74. package/dist/providers/audio-data.js +21 -0
  75. package/dist/providers/bailian.js +30 -2
  76. package/dist/providers/index.d.ts +1 -0
  77. package/dist/providers/index.js +5 -0
  78. package/dist/providers/metadata.js +8 -0
  79. package/dist/providers/siliconflow.d.ts +3 -0
  80. package/dist/providers/siliconflow.js +34 -0
  81. package/dist/providers/tts-voices.d.ts +9 -0
  82. package/dist/providers/tts-voices.js +139 -0
  83. package/dist/providers/volcengine-speech.d.ts +3 -0
  84. package/dist/providers/volcengine-speech.js +143 -0
  85. package/dist/types/model.d.ts +4 -4
  86. package/dist/types/model.js +3 -1
  87. package/docs/consumers.md +130 -119
  88. package/docs/llm-adaptation/README.md +29 -29
  89. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/DeepSeek.md +14 -14
  90. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/Kimi.md +3 -3
  91. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//345/260/217/347/261/263MiMo.md +42 -42
  92. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//346/231/272/350/260/261GLM.md +3 -3
  93. package/docs/model-adaptation/Fun-ASR-Realtime/Fun-ASR-Realtime_/347/231/276/347/202/274.md +22 -22
  94. package/docs/model-adaptation/GLM-5.3-Flash/GLM-5.3-Flash_/346/231/272/350/260/261.md +6 -6
  95. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_APIMart.md +66 -66
  96. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_Fal.md +55 -55
  97. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_Grsai.md +53 -53
  98. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_KIE.md +55 -55
  99. package/docs/model-adaptation/HappyHorse-1.1/HappyHorse-1.1_KIE.md +27 -27
  100. package/docs/model-adaptation/IC-Light-v2/IC-Light-v2_Fal.md +14 -14
  101. package/docs/model-adaptation/Qwen-MT-Flash/Qwen-MT-Flash_/347/231/276/347/202/274.md +24 -24
  102. package/docs/model-adaptation/Qwen-MT-Lite/Qwen-MT-Lite_/347/231/276/347/202/274.md +3 -3
  103. package/docs/model-adaptation/Qwen-MT-Plus/Qwen-MT-Plus_/347/231/276/347/202/274.md +3 -3
  104. package/docs/model-adaptation/Qwen3-ASR-Flash-Realtime/Qwen3-ASR-Flash-Realtime_/347/231/276/347/202/274.md +25 -25
  105. package/docs/model-adaptation/README.md +16 -10
  106. package/docs/model-adaptation/SeedASR-2.0-Realtime/SeedASR-2.0-Realtime_/347/201/253/345/261/261/345/274/225/346/223/216.md +7 -7
  107. package/docs/model-adaptation/Seedream-5.0-Flash/Seedream-5.0-Flash_/347/201/253/345/261/261/345/274/225/346/223/216.md +18 -18
  108. package/docs/model-adaptation/TTS-/345/244/232/344/276/233/345/272/224/345/225/206-2026-09.md +69 -0
  109. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//346/264/276/346/254/247/344/272/221.md +9 -9
  110. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//347/201/253/345/261/261/345/274/225/346/223/216.md +11 -11
  111. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//347/231/276/347/202/274.md +31 -31
  112. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//347/241/205/345/237/272/346/265/201/345/212/250.md +67 -67
  113. package/docs/model-adaptation//346/226/207/346/241/243/351/207/207/351/233/206/346/211/213/345/206/214.md +8 -8
  114. package/examples/form-renderer/package.json +1 -1
  115. package/examples/llm-chat/README.md +8 -8
  116. package/examples/llm-chat/index.ts +1 -1
  117. package/examples/llm-chat/package.json +1 -1
  118. package/examples/minimal-node/package.json +1 -1
  119. package/package.json +258 -258
@@ -0,0 +1,139 @@
1
+ import { fetchProvider } from './provider-fetch.js';
2
+ const VOICE_PROVIDERS = {
3
+ 'bailian-minimax-speech-2.8': 'bailian',
4
+ 'bailian-cosyvoice-v3.5': 'bailian',
5
+ 'bailian-qwen-audio-3.1-tts-flash': 'bailian',
6
+ 'siliconflow-cosyvoice2-tts': 'siliconflow',
7
+ };
8
+ function object(value) {
9
+ return value && typeof value === 'object' && !Array.isArray(value)
10
+ ? value
11
+ : null;
12
+ }
13
+ function string(value) {
14
+ return typeof value === 'string' ? value.trim() : '';
15
+ }
16
+ function voiceDescription(value) {
17
+ if (typeof value === 'string')
18
+ return value.trim() || undefined;
19
+ if (Array.isArray(value)) {
20
+ const joined = value.filter((item) => typeof item === 'string' && item.trim().length > 0).join(' · ');
21
+ return joined || undefined;
22
+ }
23
+ return undefined;
24
+ }
25
+ function uniqueVoices(voices) {
26
+ return [...new Map(voices.map((voice) => [voice.id, voice])).values()];
27
+ }
28
+ async function requestJson(providerId, url, apiKey, runtime, body) {
29
+ const response = await fetchProvider(providerId, url, {
30
+ method: body ? 'POST' : 'GET',
31
+ headers: {
32
+ Authorization: `Bearer ${apiKey}`,
33
+ ...(body ? { 'Content-Type': 'application/json' } : {}),
34
+ },
35
+ ...(body ? { body: JSON.stringify(body) } : {}),
36
+ }, { transport: runtime.transport, retryPreconnectOnce: false });
37
+ if (!response.ok) {
38
+ throw new Error(`${providerId} 音色列表请求失败(HTTP ${response.status})`);
39
+ }
40
+ try {
41
+ return await response.json();
42
+ }
43
+ catch {
44
+ throw new Error(`${providerId} 音色列表响应格式错误`);
45
+ }
46
+ }
47
+ async function listBailianMinimax(apiKey, runtime) {
48
+ const payload = object(await requestJson('bailian', 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation', apiKey, runtime, { model: 'MiniMax/speech-2.8-turbo', input: { action: 'get_voice', voice_type: 'all' } }));
49
+ const output = object(payload?.output);
50
+ const baseResp = object(output?.base_resp);
51
+ if (!output || baseResp?.status_code !== 0 || (!Array.isArray(output.system_voice) && !Array.isArray(output.voice_cloning))) {
52
+ throw new Error('百炼 MiniMax 音色列表返回错误');
53
+ }
54
+ const voices = [];
55
+ for (const source of ['system_voice', 'voice_cloning']) {
56
+ const entries = output[source];
57
+ if (!Array.isArray(entries))
58
+ continue;
59
+ for (const item of entries) {
60
+ const entry = object(item);
61
+ const id = string(entry?.voice_id);
62
+ if (!id)
63
+ continue;
64
+ voices.push({
65
+ id,
66
+ name: string(entry?.voice_name) || id,
67
+ description: voiceDescription(entry?.description),
68
+ source: source === 'system_voice' ? 'system' : 'clone',
69
+ });
70
+ }
71
+ }
72
+ return uniqueVoices(voices);
73
+ }
74
+ async function listBailianEnrollment(modelId, apiKey, runtime) {
75
+ const prefix = modelId === 'bailian-cosyvoice-v3.5' ? 'cosyvoice-v3.5-' : 'qwen-audio-3.1-tts-flash-';
76
+ const voices = [];
77
+ const pageSize = 50;
78
+ for (let pageIndex = 0; pageIndex < 20; pageIndex += 1) {
79
+ const payload = object(await requestJson('bailian', 'https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization', apiKey, runtime, { model: 'voice-enrollment', input: { action: 'list_voice', page_index: pageIndex, page_size: pageSize } }));
80
+ const output = object(payload?.output);
81
+ const entries = output?.voice_list;
82
+ if (!Array.isArray(entries))
83
+ throw new Error('百炼复刻音色列表响应格式错误');
84
+ for (const item of entries) {
85
+ const entry = object(item);
86
+ const id = string(entry?.voice_id);
87
+ if (!id.startsWith(prefix) || entry?.status !== 'OK')
88
+ continue;
89
+ voices.push({ id, name: id, source: 'clone' });
90
+ }
91
+ if (entries.length < pageSize)
92
+ return uniqueVoices(voices);
93
+ }
94
+ throw new Error('百炼复刻音色超过查询页数限制');
95
+ }
96
+ async function listSiliconflow(apiKey, runtime) {
97
+ const payload = await requestJson('siliconflow', 'https://api.siliconflow.cn/v1/audio/voice/list', apiKey, runtime);
98
+ const root = object(payload);
99
+ const data = object(root?.data);
100
+ const entries = Array.isArray(payload) ? payload
101
+ : Array.isArray(root?.data) ? root.data
102
+ : Array.isArray(data?.voices) ? data.voices
103
+ : Array.isArray(root?.voices) ? root.voices
104
+ : null;
105
+ if (!entries)
106
+ throw new Error('硅基流动音色列表响应格式错误');
107
+ const voices = [];
108
+ for (const item of entries) {
109
+ const entry = object(item);
110
+ const id = string(entry?.uri);
111
+ if (!id)
112
+ continue;
113
+ voices.push({ id, name: string(entry?.customName) || string(entry?.name) || id, source: 'clone' });
114
+ }
115
+ return uniqueVoices(voices);
116
+ }
117
+ /** 查询供应商账号中的可用音色;静态系统音色由宿主的展示目录提供。 */
118
+ export async function listTtsVoices(modelId, runtime) {
119
+ if (!Object.prototype.hasOwnProperty.call(VOICE_PROVIDERS, modelId))
120
+ throw new Error(`不支持查询 ${modelId} 的音色`);
121
+ const providerId = VOICE_PROVIDERS[modelId];
122
+ const apiKey = await runtime.credentials.get('generation', providerId);
123
+ if (!apiKey)
124
+ throw new Error(`请先设置${providerId} API Key`);
125
+ runtime.logger?.info('tts_voice.list.start', { providerId, modelId });
126
+ try {
127
+ const voices = modelId === 'bailian-minimax-speech-2.8'
128
+ ? await listBailianMinimax(apiKey, runtime)
129
+ : modelId === 'siliconflow-cosyvoice2-tts'
130
+ ? await listSiliconflow(apiKey, runtime)
131
+ : await listBailianEnrollment(modelId, apiKey, runtime);
132
+ runtime.logger?.info('tts_voice.list.completed', { providerId, modelId, context: { count: voices.length } });
133
+ return voices;
134
+ }
135
+ catch (error) {
136
+ runtime.logger?.warn('tts_voice.list.failed', { providerId, modelId, error });
137
+ throw error;
138
+ }
139
+ }
@@ -0,0 +1,3 @@
1
+ import type { ProviderContinuePollingInput, ProviderExecutionInput, ProviderExecutionResult } from '../types/runtime.js';
2
+ export declare function execute(input: ProviderExecutionInput): Promise<ProviderExecutionResult>;
3
+ export declare function continuePolling(_input: ProviderContinuePollingInput): Promise<ProviderExecutionResult>;
@@ -0,0 +1,143 @@
1
+ import { AiRuntimeError } from '../runtime/AiRuntimeError.js';
2
+ import { volcengineRequestId } from '../capabilities/speech-recognition/volcengine/request-id.js';
3
+ import { createUtf8StreamDecoder } from '../protocols/utf8-stream-decoder.js';
4
+ import { fromBase64 } from '../upload/base64.js';
5
+ import { audioBytesToDataUri } from './audio-data.js';
6
+ import { isJsonObject, normalizeEndpoint } from './helpers.js';
7
+ import { fetchProvider } from './provider-fetch.js';
8
+ const BASE_URL = 'https://openspeech.bytedance.com';
9
+ const ENDPOINT = '/api/v3/tts/unidirectional';
10
+ function decodeChunk(encoded) {
11
+ try {
12
+ return fromBase64(encoded);
13
+ }
14
+ catch {
15
+ throw new AiRuntimeError('invalid_response', 'Volcengine speech returned invalid base64 audio');
16
+ }
17
+ }
18
+ function parseFrame(payload, audio, usage) {
19
+ if (!payload)
20
+ return;
21
+ let value;
22
+ try {
23
+ value = JSON.parse(payload);
24
+ }
25
+ catch {
26
+ throw new AiRuntimeError('invalid_response', 'Volcengine speech returned invalid JSON frame');
27
+ }
28
+ if (!isJsonObject(value) || value.code !== 0) {
29
+ throw new AiRuntimeError('provider_task_failed', isJsonObject(value) && typeof value.message === 'string' ? value.message : 'Volcengine speech failed');
30
+ }
31
+ if (typeof value.data === 'string' && value.data.length > 0)
32
+ audio.push(decodeChunk(value.data));
33
+ if (isJsonObject(value.usage) && typeof value.usage.text_words === 'number')
34
+ usage.textWords = value.usage.text_words;
35
+ }
36
+ function consumeFrames(buffer, audio, usage) {
37
+ let start = -1;
38
+ let depth = 0;
39
+ let quoted = false;
40
+ let escaped = false;
41
+ let consumed = 0;
42
+ for (let index = 0; index < buffer.length; index += 1) {
43
+ const character = buffer[index];
44
+ if (start < 0) {
45
+ if (/\s/.test(character)) {
46
+ consumed = index + 1;
47
+ continue;
48
+ }
49
+ if (character !== '{')
50
+ throw new AiRuntimeError('invalid_response', 'Volcengine speech returned invalid JSON frame');
51
+ start = index;
52
+ depth = 1;
53
+ continue;
54
+ }
55
+ if (quoted) {
56
+ if (escaped)
57
+ escaped = false;
58
+ else if (character === '\\')
59
+ escaped = true;
60
+ else if (character === '"')
61
+ quoted = false;
62
+ }
63
+ else if (character === '"')
64
+ quoted = true;
65
+ else if (character === '{')
66
+ depth += 1;
67
+ else if (character === '}') {
68
+ depth -= 1;
69
+ if (depth === 0) {
70
+ parseFrame(buffer.slice(start, index + 1), audio, usage);
71
+ start = -1;
72
+ consumed = index + 1;
73
+ }
74
+ }
75
+ }
76
+ return buffer.slice(start < 0 ? consumed : start);
77
+ }
78
+ export async function execute(input) {
79
+ if (!isJsonObject(input.body) || !isJsonObject(input.body.req_params)) {
80
+ throw new AiRuntimeError('invalid_request', 'Volcengine speech requires req_params');
81
+ }
82
+ const resourceId = input.body.resource_id;
83
+ if (resourceId !== 'seed-tts-2.0' && resourceId !== 'seed-icl-2.0') {
84
+ throw new AiRuntimeError('invalid_request', 'Volcengine speech resource ID is invalid');
85
+ }
86
+ const response = await fetchProvider('Volcengine Speech', normalizeEndpoint(BASE_URL, ENDPOINT), {
87
+ method: 'POST',
88
+ headers: {
89
+ 'X-Api-Key': input.apiKey,
90
+ 'X-Api-Resource-Id': resourceId,
91
+ 'X-Api-Request-Id': volcengineRequestId(input.requestId, undefined),
92
+ 'X-Control-Require-Usage-Tokens-Return': '*',
93
+ 'Content-Type': 'application/json',
94
+ },
95
+ body: JSON.stringify({ req_params: input.body.req_params }),
96
+ signal: input.signal,
97
+ }, { transport: input.runtime.transport, retryPreconnectOnce: false });
98
+ if (!response.ok) {
99
+ await response.body?.cancel().catch(() => undefined);
100
+ throw new AiRuntimeError('provider_task_failed', `Volcengine speech request failed (HTTP ${response.status})`);
101
+ }
102
+ if (!response.body)
103
+ throw new AiRuntimeError('empty_result', 'Volcengine speech returned no body');
104
+ const reader = response.body.getReader();
105
+ const decoder = createUtf8StreamDecoder();
106
+ const audio = [];
107
+ const usage = {};
108
+ let pending = '';
109
+ const cancelReader = () => { void reader.cancel(input.signal?.reason).catch(() => undefined); };
110
+ input.signal?.addEventListener('abort', cancelReader, { once: true });
111
+ try {
112
+ while (true) {
113
+ input.signal?.throwIfAborted();
114
+ const { done, value } = await reader.read();
115
+ input.signal?.throwIfAborted();
116
+ pending += done ? decoder.decode() : decoder.decode(value, { stream: true });
117
+ pending = consumeFrames(pending, audio, usage);
118
+ if (done)
119
+ break;
120
+ }
121
+ if (pending.trim())
122
+ throw new AiRuntimeError('invalid_response', 'Volcengine speech returned incomplete JSON frame');
123
+ }
124
+ finally {
125
+ input.signal?.removeEventListener('abort', cancelReader);
126
+ reader.releaseLock();
127
+ }
128
+ const total = audio.reduce((sum, chunk) => sum + chunk.byteLength, 0);
129
+ const joined = new Uint8Array(total);
130
+ let offset = 0;
131
+ for (const chunk of audio) {
132
+ joined.set(chunk, offset);
133
+ offset += chunk.byteLength;
134
+ }
135
+ return {
136
+ status: 'completed',
137
+ url: audioBytesToDataUri(joined, 'mp3'),
138
+ metadata: { byteLength: total, ...(usage.textWords === undefined ? {} : { textWords: usage.textWords }) },
139
+ };
140
+ }
141
+ export async function continuePolling(_input) {
142
+ throw new AiRuntimeError('unsupported_provider', 'Volcengine speech uses one HTTP stream');
143
+ }
@@ -17,11 +17,11 @@ export type BuiltinModelType = 'image' | 'video' | 'audio';
17
17
  * 它描述模型目录中的产出能力,不等同于上传预处理层的 `MediaKind`。
18
18
  */
19
19
  export type ModelType = BuiltinModelType | (string & {});
20
- /** SDK 随包提供的 8 个供应商;同时作为初始化与测试的单一清单。 */
21
- export declare const BUILTIN_PROVIDER_IDS: readonly ["apimart", "bailian", "volcengine", "ppio", "kie", "modelscope", "fal", "grsai"];
22
- /** 开放 ProviderId 仍保留这 8 个字面量的编辑器补全。 */
20
+ /** SDK 随包提供的生成供应商;同时作为初始化与测试的单一清单。 */
21
+ export declare const BUILTIN_PROVIDER_IDS: readonly ["apimart", "bailian", "volcengine", "volcengine-speech", "ppio", "kie", "modelscope", "fal", "grsai", "siliconflow"];
22
+ /** 开放 ProviderId 仍保留内置供应商字面量的编辑器补全。 */
23
23
  export type BuiltinProviderId = (typeof BUILTIN_PROVIDER_IDS)[number];
24
- /** Provider ID:8 个内置供应商 + 第三方扩展字符串。 */
24
+ /** Provider ID:内置供应商 + 第三方扩展字符串。 */
25
25
  export type ProviderId = BuiltinProviderId | (string & {});
26
26
  /**
27
27
  * 模型标签。
@@ -8,14 +8,16 @@
8
8
  * 这里保留 selector/builder 的真实函数,是 catalog 与所有宿主运行时共同消费的唯一模型
9
9
  * 契约;JSON DTO 等跨进程数据类型仍位于 `./runtime.ts`。
10
10
  */
11
- /** SDK 随包提供的 8 个供应商;同时作为初始化与测试的单一清单。 */
11
+ /** SDK 随包提供的生成供应商;同时作为初始化与测试的单一清单。 */
12
12
  export const BUILTIN_PROVIDER_IDS = [
13
13
  'apimart',
14
14
  'bailian',
15
15
  'volcengine',
16
+ 'volcengine-speech',
16
17
  'ppio',
17
18
  'kie',
18
19
  'modelscope',
19
20
  'fal',
20
21
  'grsai',
22
+ 'siliconflow',
21
23
  ];