@just-every/ensemble 0.2.257 → 0.2.259

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 (40) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/data/model_data.cjs +66 -11
  3. package/dist/cjs/data/model_data.d.ts.map +1 -1
  4. package/dist/cjs/data/model_data.js.map +1 -1
  5. package/dist/cjs/model_providers/assemblyai.cjs +360 -0
  6. package/dist/cjs/model_providers/assemblyai.d.ts +30 -0
  7. package/dist/cjs/model_providers/assemblyai.d.ts.map +1 -0
  8. package/dist/cjs/model_providers/assemblyai.js.map +1 -0
  9. package/dist/cjs/model_providers/gemini.cjs +93 -34
  10. package/dist/cjs/model_providers/gemini.d.ts.map +1 -1
  11. package/dist/cjs/model_providers/gemini.js.map +1 -1
  12. package/dist/cjs/model_providers/model_provider.cjs +10 -0
  13. package/dist/cjs/model_providers/model_provider.d.ts.map +1 -1
  14. package/dist/cjs/model_providers/model_provider.js.map +1 -1
  15. package/dist/cjs/model_providers/openai.cjs +91 -25
  16. package/dist/cjs/model_providers/openai.d.ts.map +1 -1
  17. package/dist/cjs/model_providers/openai.js.map +1 -1
  18. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  19. package/dist/cjs/types/types.d.ts +2 -1
  20. package/dist/cjs/types/types.d.ts.map +1 -1
  21. package/dist/data/model_data.d.ts.map +1 -1
  22. package/dist/data/model_data.js +66 -11
  23. package/dist/data/model_data.js.map +1 -1
  24. package/dist/model_providers/assemblyai.d.ts +30 -0
  25. package/dist/model_providers/assemblyai.d.ts.map +1 -0
  26. package/dist/model_providers/assemblyai.js +323 -0
  27. package/dist/model_providers/assemblyai.js.map +1 -0
  28. package/dist/model_providers/gemini.d.ts.map +1 -1
  29. package/dist/model_providers/gemini.js +93 -34
  30. package/dist/model_providers/gemini.js.map +1 -1
  31. package/dist/model_providers/model_provider.d.ts.map +1 -1
  32. package/dist/model_providers/model_provider.js +10 -0
  33. package/dist/model_providers/model_provider.js.map +1 -1
  34. package/dist/model_providers/openai.d.ts.map +1 -1
  35. package/dist/model_providers/openai.js +91 -25
  36. package/dist/model_providers/openai.js.map +1 -1
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/dist/types/types.d.ts +2 -1
  39. package/dist/types/types.d.ts.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,323 @@
1
+ import { BaseModelProvider } from './base_provider.js';
2
+ const ASSEMBLYAI_STREAMING_URL = 'wss://streaming.assemblyai.com/v3/ws';
3
+ const ASSEMBLYAI_STREAMING_MODELS = new Set(['u3-rt-pro']);
4
+ const DEFAULT_SAMPLE_RATE = 16000;
5
+ const DEFAULT_CHANNELS = 1;
6
+ const BYTES_PER_SAMPLE = 2;
7
+ const TARGET_CHUNK_MS = 50;
8
+ const WEBSOCKET_OPEN_STATE = 1;
9
+ const DONE = Symbol('done');
10
+ function normalizeAudioSource(source) {
11
+ if (source instanceof ReadableStream) {
12
+ return source;
13
+ }
14
+ if (typeof source === 'object' && source !== null && Symbol.asyncIterator in source) {
15
+ return new ReadableStream({
16
+ async start(controller) {
17
+ try {
18
+ for await (const chunk of source) {
19
+ controller.enqueue(chunk);
20
+ }
21
+ controller.close();
22
+ }
23
+ catch (error) {
24
+ controller.error(error);
25
+ }
26
+ },
27
+ });
28
+ }
29
+ if (typeof source === 'function') {
30
+ return normalizeAudioSource(source());
31
+ }
32
+ if (source instanceof ArrayBuffer || source instanceof Uint8Array) {
33
+ const data = source instanceof ArrayBuffer ? new Uint8Array(source) : source;
34
+ return new ReadableStream({
35
+ start(controller) {
36
+ controller.enqueue(data);
37
+ controller.close();
38
+ },
39
+ });
40
+ }
41
+ throw new Error(`Unsupported audio source type: ${typeof source}`);
42
+ }
43
+ function appendBuffer(left, right) {
44
+ if (left.length === 0)
45
+ return right;
46
+ const merged = new Uint8Array(left.length + right.length);
47
+ merged.set(left);
48
+ merged.set(right, left.length);
49
+ return merged;
50
+ }
51
+ function copyChunk(chunk) {
52
+ const copy = new Uint8Array(chunk.length);
53
+ copy.set(chunk);
54
+ return copy;
55
+ }
56
+ function wait(ms) {
57
+ return new Promise(resolve => setTimeout(resolve, ms));
58
+ }
59
+ function getTranscriptDelta(previous, next) {
60
+ if (!previous)
61
+ return next;
62
+ if (next.startsWith(previous))
63
+ return next.slice(previous.length);
64
+ let commonPrefixLength = 0;
65
+ const limit = Math.min(previous.length, next.length);
66
+ while (commonPrefixLength < limit && previous[commonPrefixLength] === next[commonPrefixLength]) {
67
+ commonPrefixLength++;
68
+ }
69
+ return next.slice(commonPrefixLength);
70
+ }
71
+ function setParam(params, name, value) {
72
+ if (value === undefined || value === null || value === '')
73
+ return;
74
+ if (Array.isArray(value)) {
75
+ if (value.length === 0)
76
+ return;
77
+ params.set(name, JSON.stringify(value));
78
+ return;
79
+ }
80
+ params.set(name, String(value));
81
+ }
82
+ function buildStreamingUrl(model, opts) {
83
+ const params = new URLSearchParams();
84
+ params.set('sample_rate', String(opts.audioFormat?.sampleRate || DEFAULT_SAMPLE_RATE));
85
+ params.set('speech_model', model);
86
+ setParam(params, 'mode', opts.mode);
87
+ setParam(params, 'prompt', opts.prompt);
88
+ setParam(params, 'language_code', opts.language_code || opts.languageCode || opts.language);
89
+ setParam(params, 'keyterms_prompt', opts.keyterms_prompt || opts.keytermsPrompt);
90
+ setParam(params, 'min_turn_silence', opts.min_turn_silence || opts.minTurnSilence);
91
+ setParam(params, 'max_turn_silence', opts.max_turn_silence || opts.maxTurnSilence);
92
+ setParam(params, 'vad_threshold', opts.vad_threshold || opts.vadThreshold);
93
+ setParam(params, 'agent_context', opts.agent_context || opts.agentContext);
94
+ return `${ASSEMBLYAI_STREAMING_URL}?${params.toString()}`;
95
+ }
96
+ function isSocketOpen(ws) {
97
+ return ws.readyState === WEBSOCKET_OPEN_STATE;
98
+ }
99
+ export class AssemblyAIProvider extends BaseModelProvider {
100
+ apiKey;
101
+ constructor(apiKey) {
102
+ super('assemblyai');
103
+ this.apiKey = apiKey;
104
+ }
105
+ async *createResponseStream() {
106
+ yield* [];
107
+ throw new Error('AssemblyAI provider only supports streaming transcription');
108
+ }
109
+ async *createTranscription(audio, _agent, model, opts = {}) {
110
+ if (!ASSEMBLYAI_STREAMING_MODELS.has(model)) {
111
+ throw new Error(`Model ${model} does not support AssemblyAI streaming transcription. Supported models: ${Array.from(ASSEMBLYAI_STREAMING_MODELS).join(', ')}`);
112
+ }
113
+ const apiKey = this.apiKey || process.env.ASSEMBLYAI_API_KEY;
114
+ if (!apiKey) {
115
+ throw new Error('Failed to initialize AssemblyAI transcription. Make sure ASSEMBLYAI_API_KEY is set.');
116
+ }
117
+ const { WebSocket } = await import('ws');
118
+ const ws = new WebSocket(buildStreamingUrl(model, opts), {
119
+ headers: { Authorization: apiKey },
120
+ });
121
+ const queue = [];
122
+ let wake;
123
+ let finished = false;
124
+ let socketError;
125
+ const previousTurnTranscripts = new Map();
126
+ const push = (item) => {
127
+ queue.push(item);
128
+ wake?.();
129
+ wake = undefined;
130
+ };
131
+ const markDone = () => {
132
+ if (finished)
133
+ return;
134
+ finished = true;
135
+ push(DONE);
136
+ };
137
+ const connected = new Promise((resolve, reject) => {
138
+ const timeout = setTimeout(() => {
139
+ reject(new Error('AssemblyAI streaming connection timeout'));
140
+ }, 10000);
141
+ ws.once('open', () => {
142
+ clearTimeout(timeout);
143
+ resolve();
144
+ });
145
+ ws.once('error', error => {
146
+ clearTimeout(timeout);
147
+ reject(error);
148
+ });
149
+ });
150
+ ws.on('message', data => {
151
+ let message;
152
+ try {
153
+ message = JSON.parse(data.toString());
154
+ }
155
+ catch (error) {
156
+ socketError = error instanceof Error ? error : new Error(String(error));
157
+ push({
158
+ type: 'error',
159
+ timestamp: new Date().toISOString(),
160
+ error: `Failed to parse AssemblyAI message: ${socketError.message}`,
161
+ });
162
+ return;
163
+ }
164
+ const timestamp = new Date().toISOString();
165
+ switch (message.type) {
166
+ case 'Begin':
167
+ break;
168
+ case 'SpeechStarted':
169
+ push({
170
+ type: 'transcription_turn_start',
171
+ timestamp,
172
+ });
173
+ break;
174
+ case 'Turn': {
175
+ const transcript = typeof message.transcript === 'string' ? message.transcript : '';
176
+ const turnOrder = typeof message.turn_order === 'number' ? message.turn_order : 0;
177
+ const previousTranscript = previousTurnTranscripts.get(turnOrder) || '';
178
+ const delta = getTranscriptDelta(previousTranscript, transcript);
179
+ previousTurnTranscripts.set(turnOrder, transcript);
180
+ if (delta) {
181
+ push({
182
+ type: 'transcription_turn_delta',
183
+ timestamp,
184
+ delta,
185
+ partial: !message.end_of_turn,
186
+ });
187
+ }
188
+ if (message.end_of_turn) {
189
+ previousTurnTranscripts.delete(turnOrder);
190
+ push({
191
+ type: 'transcription_turn_complete',
192
+ timestamp,
193
+ text: transcript,
194
+ });
195
+ }
196
+ break;
197
+ }
198
+ case 'Termination':
199
+ markDone();
200
+ break;
201
+ case 'Error':
202
+ socketError = new Error(message.error || 'AssemblyAI streaming error');
203
+ push({
204
+ type: 'error',
205
+ timestamp,
206
+ error: socketError.message,
207
+ });
208
+ markDone();
209
+ break;
210
+ default:
211
+ break;
212
+ }
213
+ });
214
+ ws.on('error', error => {
215
+ socketError = error instanceof Error ? error : new Error(String(error));
216
+ push({
217
+ type: 'error',
218
+ timestamp: new Date().toISOString(),
219
+ error: socketError.message,
220
+ });
221
+ markDone();
222
+ });
223
+ ws.on('close', (code, reason) => {
224
+ if (!finished && code !== 1000) {
225
+ const detail = reason.toString() || `AssemblyAI streaming socket closed with code ${code}`;
226
+ push({
227
+ type: 'error',
228
+ timestamp: new Date().toISOString(),
229
+ error: detail,
230
+ });
231
+ }
232
+ markDone();
233
+ });
234
+ let audioPump;
235
+ try {
236
+ await connected;
237
+ audioPump = this.streamAudio(ws, audio, opts)
238
+ .then(() => {
239
+ if (isSocketOpen(ws)) {
240
+ ws.send(JSON.stringify({ type: 'Terminate' }));
241
+ }
242
+ })
243
+ .catch(error => {
244
+ socketError = error instanceof Error ? error : new Error(String(error));
245
+ push({
246
+ type: 'error',
247
+ timestamp: new Date().toISOString(),
248
+ error: socketError.message,
249
+ });
250
+ if (isSocketOpen(ws)) {
251
+ ws.close();
252
+ }
253
+ markDone();
254
+ });
255
+ while (true) {
256
+ if (queue.length === 0) {
257
+ await new Promise(resolve => {
258
+ wake = resolve;
259
+ });
260
+ }
261
+ const item = queue.shift();
262
+ if (!item)
263
+ continue;
264
+ if (item === DONE)
265
+ break;
266
+ yield item;
267
+ }
268
+ if (socketError) {
269
+ return;
270
+ }
271
+ }
272
+ finally {
273
+ await audioPump?.catch(() => undefined);
274
+ if (isSocketOpen(ws)) {
275
+ ws.close();
276
+ }
277
+ }
278
+ }
279
+ async streamAudio(ws, audio, opts) {
280
+ const stream = normalizeAudioSource(audio);
281
+ const reader = stream.getReader();
282
+ const sampleRate = opts.audioFormat?.sampleRate || DEFAULT_SAMPLE_RATE;
283
+ const channels = opts.audioFormat?.channels || DEFAULT_CHANNELS;
284
+ const throttleAudio = opts.throttleAudio ??
285
+ (!opts.disableRealtimeThrottle && (audio instanceof ArrayBuffer || audio instanceof Uint8Array));
286
+ const targetBytes = Math.max(1, Math.floor((sampleRate * channels * BYTES_PER_SAMPLE * TARGET_CHUNK_MS) / 1000));
287
+ let buffer = new Uint8Array(0);
288
+ while (true) {
289
+ const { done, value } = await reader.read();
290
+ if (done)
291
+ break;
292
+ if (value?.length) {
293
+ buffer = appendBuffer(buffer, copyChunk(value));
294
+ }
295
+ while (buffer.length >= targetBytes) {
296
+ const chunk = buffer.slice(0, targetBytes);
297
+ buffer = buffer.slice(targetBytes);
298
+ await this.sendAudioChunk(ws, chunk, throttleAudio);
299
+ }
300
+ }
301
+ if (buffer.length > 0) {
302
+ await this.sendAudioChunk(ws, buffer, throttleAudio);
303
+ }
304
+ }
305
+ async sendAudioChunk(ws, chunk, throttleAudio) {
306
+ if (!isSocketOpen(ws)) {
307
+ throw new Error('AssemblyAI streaming socket closed before audio could be sent');
308
+ }
309
+ await new Promise((resolve, reject) => {
310
+ ws.send(chunk, error => {
311
+ if (error)
312
+ reject(error);
313
+ else
314
+ resolve();
315
+ });
316
+ });
317
+ if (throttleAudio) {
318
+ await wait(TARGET_CHUNK_MS);
319
+ }
320
+ }
321
+ }
322
+ export const assemblyAIProvider = new AssemblyAIProvider();
323
+ //# sourceMappingURL=assemblyai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assemblyai.js","sourceRoot":"","sources":["../../model_providers/assemblyai.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../model_providers/gemini.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAGH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EAInB,mBAAmB,EAEnB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EAOd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA6NvD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AAmCD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAqgBD,qBAAa,cAAe,SAAQ,iBAAiB;IACjD,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM;IAS3B,OAAO,KAAK,MAAM,GAejB;IASK,eAAe,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;YAmKlB,2BAA2B;IA+BnC,oBAAoB,CACvB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,SAAS,CAAC,EAAE,MAAM,GACnB,cAAc,CAAC,mBAAmB,CAAC;IAukBhC,WAAW,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IA4hBpB,OAAO,CAAC,YAAY;IAmCd,WAAW,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;IAgMpD,OAAO,CAAC,gBAAgB;IA6DjB,mBAAmB,CACtB,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,iBAAiB,GACzB,cAAc,CAAC,kBAAkB,CAAC;IA6S/B,iBAAiB,CACnB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC;CAyB1B;AAyfD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../model_providers/gemini.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAGH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EAInB,mBAAmB,EAEnB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EAOd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA6NvD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AAmCD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AA8hBD,qBAAa,cAAe,SAAQ,iBAAiB;IACjD,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM;IAS3B,OAAO,KAAK,MAAM,GAejB;IASK,eAAe,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;YAmKlB,2BAA2B;IA+BnC,oBAAoB,CACvB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,SAAS,CAAC,EAAE,MAAM,GACnB,cAAc,CAAC,mBAAmB,CAAC;IAukBhC,WAAW,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IAwkBpB,OAAO,CAAC,YAAY;IAsCd,WAAW,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;IAgMpD,OAAO,CAAC,gBAAgB;IA6DjB,mBAAmB,CACtB,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,iBAAiB,GACzB,cAAc,CAAC,kBAAkB,CAAC;IA6S/B,iBAAiB,CACnB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC;CAyB1B;AAyfD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -582,6 +582,24 @@ function isGemmaModel(model) {
582
582
  const modelId = model.startsWith('models/') ? model.slice('models/'.length) : model;
583
583
  return modelId.startsWith('gemma-4-');
584
584
  }
585
+ function isGemini25FlashImageModel(model) {
586
+ return model.includes('gemini-2.5-flash-image');
587
+ }
588
+ function isGemini31FlashImageModel(model) {
589
+ return model.includes('gemini-3.1-flash-image');
590
+ }
591
+ function isGemini31FlashLiteImageModel(model) {
592
+ return model.includes('gemini-3.1-flash-lite-image');
593
+ }
594
+ function isGemini3ProImageModel(model) {
595
+ return model.includes('gemini-3-pro-image');
596
+ }
597
+ function isGeminiStreamingImageModel(model) {
598
+ return (isGemini25FlashImageModel(model) ||
599
+ isGemini31FlashImageModel(model) ||
600
+ isGemini31FlashLiteImageModel(model) ||
601
+ isGemini3ProImageModel(model));
602
+ }
585
603
  function getSupportedThinkingLevels(model) {
586
604
  if (isGemmaModel(model)) {
587
605
  return new Set(['HIGH']);
@@ -589,17 +607,17 @@ function getSupportedThinkingLevels(model) {
589
607
  if (model.includes('gemini-3.1-pro-preview') || model.includes('gemini-3-pro-preview')) {
590
608
  return new Set(['LOW', 'MEDIUM', 'HIGH']);
591
609
  }
610
+ if (isGemini31FlashImageModel(model) || isGemini31FlashLiteImageModel(model)) {
611
+ return new Set(['MINIMAL', 'HIGH']);
612
+ }
613
+ if (isGemini3ProImageModel(model)) {
614
+ return new Set(['HIGH']);
615
+ }
592
616
  if (model.includes('gemini-3.5-flash') ||
593
617
  model.includes('gemini-3.1-flash-lite') ||
594
618
  model.includes('gemini-3-flash-preview')) {
595
619
  return new Set(['MINIMAL', 'LOW', 'MEDIUM', 'HIGH']);
596
620
  }
597
- if (model.includes('gemini-3.1-flash-image-preview')) {
598
- return new Set(['MINIMAL', 'HIGH']);
599
- }
600
- if (model.includes('gemini-3-pro-image-preview')) {
601
- return new Set(['HIGH']);
602
- }
603
621
  return null;
604
622
  }
605
623
  const GEMINI_3_PRO_IMAGE_DIMENSION_PRESETS = {
@@ -1230,7 +1248,7 @@ export class GeminiProvider extends BaseModelProvider {
1230
1248
  const requestId = `req_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
1231
1249
  let finalRequestId = requestId;
1232
1250
  try {
1233
- model = model || 'gemini-2.5-flash-image-preview';
1251
+ model = model || 'gemini-3.1-flash-image';
1234
1252
  const numberOfImages = opts?.n ?? 1;
1235
1253
  if (!Number.isInteger(numberOfImages) || numberOfImages < 1) {
1236
1254
  throw new Error('[Gemini] ImageGenerationOpts.n must be a positive integer.');
@@ -1244,11 +1262,17 @@ export class GeminiProvider extends BaseModelProvider {
1244
1262
  }
1245
1263
  const explicitWebGrounding = opts?.grounding?.web_search;
1246
1264
  const explicitImageGrounding = opts?.grounding?.image_search;
1247
- const enableWebGrounding = explicitWebGrounding ?? hasGoogleWebSearch ?? false;
1248
- const isGemini31FlashImageModel = model.includes('gemini-3.1-flash-image-preview');
1249
- const enableImageGrounding = explicitImageGrounding === true && isGemini31FlashImageModel;
1250
- if (explicitImageGrounding && !isGemini31FlashImageModel) {
1251
- console.warn('[Gemini] Image Search grounding is only available for gemini-3.1-flash-image-preview. Ignoring image_search=true.');
1265
+ const isGemini31FlashImage = isGemini31FlashImageModel(model);
1266
+ const isGemini31FlashLiteImage = isGemini31FlashLiteImageModel(model);
1267
+ const isGemini3ProImage = isGemini3ProImageModel(model);
1268
+ const supportsWebGrounding = isGemini31FlashImage || isGemini3ProImage;
1269
+ const enableWebGrounding = supportsWebGrounding && (explicitWebGrounding ?? hasGoogleWebSearch ?? false);
1270
+ const enableImageGrounding = explicitImageGrounding === true && isGemini31FlashImage;
1271
+ if ((explicitWebGrounding || hasGoogleWebSearch) && !supportsWebGrounding) {
1272
+ console.warn('[Gemini] Google Search grounding is only available for gemini-3.1-flash-image and gemini-3-pro-image. Ignoring web_search=true.');
1273
+ }
1274
+ if (explicitImageGrounding && !isGemini31FlashImage) {
1275
+ console.warn('[Gemini] Image Search grounding is only available for gemini-3.1-flash-image. Ignoring image_search=true.');
1252
1276
  }
1253
1277
  const thinkingOptions = opts?.thinking;
1254
1278
  const hasThinkingOptionsObject = thinkingOptions !== null && typeof thinkingOptions === 'object' && !Array.isArray(thinkingOptions);
@@ -1258,11 +1282,12 @@ export class GeminiProvider extends BaseModelProvider {
1258
1282
  ? thinkingOptions.level
1259
1283
  : undefined;
1260
1284
  const thinkingLevel = requestedThinkingLevel === 'high' ? 'High' : requestedThinkingLevel ? 'Minimal' : undefined;
1261
- if (requestedThinkingLevel && !isGemini31FlashImageModel) {
1262
- console.warn('[Gemini] thinking.level is currently supported for gemini-3.1-flash-image-preview only. Ignoring thinking level.');
1285
+ const supportsImageThinkingControls = isGemini31FlashImage || isGemini31FlashLiteImage;
1286
+ if (requestedThinkingLevel && !supportsImageThinkingControls) {
1287
+ console.warn('[Gemini] thinking.level is currently supported for gemini-3.1-flash-image and gemini-3.1-flash-lite-image only. Ignoring thinking level.');
1263
1288
  }
1264
- if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && !isGemini31FlashImageModel) {
1265
- console.warn('[Gemini] thinking.include_thoughts is currently supported for gemini-3.1-flash-image-preview only. Ignoring include_thoughts.');
1289
+ if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && !supportsImageThinkingControls) {
1290
+ console.warn('[Gemini] thinking.include_thoughts is currently supported for gemini-3.1-flash-image and gemini-3.1-flash-lite-image only. Ignoring include_thoughts.');
1266
1291
  }
1267
1292
  let aspectRatio = '1:1';
1268
1293
  if (opts?.size === 'landscape')
@@ -1270,9 +1295,7 @@ export class GeminiProvider extends BaseModelProvider {
1270
1295
  else if (opts?.size === 'portrait')
1271
1296
  aspectRatio = '2:3';
1272
1297
  console.log(`[Gemini] Generating ${numberOfImages} image(s) with model ${model}, prompt: "${prompt.substring(0, 100)}${prompt.length > 100 ? '...' : ''}"`);
1273
- if (model.includes('gemini-2.5-flash-image-preview') ||
1274
- model.includes('gemini-3.1-flash-image-preview') ||
1275
- model.includes('gemini-3-pro-image-preview')) {
1298
+ if (isGeminiStreamingImageModel(model)) {
1276
1299
  let aggregateMetadata = { model };
1277
1300
  const sizeMap = {
1278
1301
  '1:1': { ar: '1:1' },
@@ -1303,7 +1326,7 @@ export class GeminiProvider extends BaseModelProvider {
1303
1326
  '1024x1792': { ar: '9:16' },
1304
1327
  };
1305
1328
  const sm = opts?.size ? sizeMap[String(opts.size)] : undefined;
1306
- const gemini3ProDimensionPreset = model.includes('gemini-3-pro-image-preview')
1329
+ const gemini3ProDimensionPreset = isGemini3ProImage
1307
1330
  ? GEMINI_3_PRO_IMAGE_DIMENSION_PRESETS[String(opts?.size)]
1308
1331
  : undefined;
1309
1332
  const imageConfig = {};
@@ -1312,7 +1335,24 @@ export class GeminiProvider extends BaseModelProvider {
1312
1335
  if (gemini3ProDimensionPreset?.ar)
1313
1336
  imageConfig.aspectRatio = gemini3ProDimensionPreset.ar;
1314
1337
  const qualityKey = typeof opts?.quality === 'string' ? opts.quality.toLowerCase() : '';
1315
- const imageSizeMap = isGemini31FlashImageModel
1338
+ if (isGemini31FlashLiteImage && imageConfig.aspectRatio) {
1339
+ const liteAspectRatios = new Set([
1340
+ '1:1',
1341
+ '2:3',
1342
+ '3:2',
1343
+ '3:4',
1344
+ '4:3',
1345
+ '4:5',
1346
+ '5:4',
1347
+ '9:16',
1348
+ '16:9',
1349
+ '21:9',
1350
+ ]);
1351
+ if (!liteAspectRatios.has(imageConfig.aspectRatio)) {
1352
+ throw new Error(`[Gemini] gemini-3.1-flash-lite-image does not support aspect ratio ${imageConfig.aspectRatio}.`);
1353
+ }
1354
+ }
1355
+ const imageSizeMap = isGemini31FlashImage
1316
1356
  ? {
1317
1357
  low: '0.5K',
1318
1358
  standard: '1K',
@@ -1320,28 +1360,44 @@ export class GeminiProvider extends BaseModelProvider {
1320
1360
  hd: '4K',
1321
1361
  high: '4K',
1322
1362
  }
1323
- : {
1324
- low: '1K',
1325
- standard: '2K',
1326
- medium: '2K',
1327
- hd: '4K',
1328
- high: '4K',
1329
- };
1363
+ : isGemini31FlashLiteImage
1364
+ ? {
1365
+ low: '1K',
1366
+ standard: '1K',
1367
+ medium: '1K',
1368
+ hd: '1K',
1369
+ high: '1K',
1370
+ }
1371
+ : {
1372
+ low: '1K',
1373
+ standard: '2K',
1374
+ medium: '2K',
1375
+ hd: '4K',
1376
+ high: '4K',
1377
+ };
1330
1378
  let imageSize = imageSizeMap[qualityKey];
1331
1379
  if (gemini3ProDimensionPreset?.imageSize) {
1332
1380
  imageSize = gemini3ProDimensionPreset.imageSize;
1333
1381
  }
1334
- if (isGemini31FlashImageModel && opts?.size === '512x512') {
1382
+ if (isGemini31FlashImage && opts?.size === '512x512') {
1335
1383
  imageSize = '0.5K';
1336
1384
  }
1385
+ if (isGemini31FlashLiteImage) {
1386
+ imageSize = '1K';
1387
+ if (opts?.size === '512x512') {
1388
+ throw new Error('[Gemini] gemini-3.1-flash-lite-image only supports 1K image output.');
1389
+ }
1390
+ }
1337
1391
  const requestImageSize = imageSize === '0.5K' ? '512' : imageSize;
1338
1392
  if (requestImageSize)
1339
1393
  imageConfig.imageSize = requestImageSize;
1340
1394
  const thinkingConfig = {};
1341
- if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && isGemini31FlashImageModel) {
1395
+ if (hasThinkingOptionsObject &&
1396
+ 'include_thoughts' in thinkingOptions &&
1397
+ supportsImageThinkingControls) {
1342
1398
  thinkingConfig.includeThoughts = includeThoughts;
1343
1399
  }
1344
- if (thinkingLevel && isGemini31FlashImageModel) {
1400
+ if (thinkingLevel && supportsImageThinkingControls) {
1345
1401
  thinkingConfig.thinkingLevel = thinkingLevel;
1346
1402
  }
1347
1403
  const searchTypes = {};
@@ -1657,7 +1713,7 @@ export class GeminiProvider extends BaseModelProvider {
1657
1713
  }
1658
1714
  }
1659
1715
  getImageCost(model, imageSize) {
1660
- if (model.includes('gemini-3.1-flash-image-preview')) {
1716
+ if (isGemini31FlashImageModel(model)) {
1661
1717
  if (imageSize === '4K')
1662
1718
  return 0.151;
1663
1719
  if (imageSize === '2K')
@@ -1666,10 +1722,13 @@ export class GeminiProvider extends BaseModelProvider {
1666
1722
  return 0.045;
1667
1723
  return 0.067;
1668
1724
  }
1669
- else if (model.includes('gemini-2.5-flash-image-preview')) {
1725
+ else if (isGemini31FlashLiteImageModel(model)) {
1726
+ return 0.0336;
1727
+ }
1728
+ else if (isGemini25FlashImageModel(model)) {
1670
1729
  return 0.039;
1671
1730
  }
1672
- else if (model.includes('gemini-3-pro-image-preview')) {
1731
+ else if (isGemini3ProImageModel(model)) {
1673
1732
  if (imageSize === '4K')
1674
1733
  return 0.24;
1675
1734
  return 0.134;