@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,360 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.assemblyAIProvider = exports.AssemblyAIProvider = void 0;
37
+ const base_provider_js_1 = require("./base_provider.cjs");
38
+ const ASSEMBLYAI_STREAMING_URL = 'wss://streaming.assemblyai.com/v3/ws';
39
+ const ASSEMBLYAI_STREAMING_MODELS = new Set(['u3-rt-pro']);
40
+ const DEFAULT_SAMPLE_RATE = 16000;
41
+ const DEFAULT_CHANNELS = 1;
42
+ const BYTES_PER_SAMPLE = 2;
43
+ const TARGET_CHUNK_MS = 50;
44
+ const WEBSOCKET_OPEN_STATE = 1;
45
+ const DONE = Symbol('done');
46
+ function normalizeAudioSource(source) {
47
+ if (source instanceof ReadableStream) {
48
+ return source;
49
+ }
50
+ if (typeof source === 'object' && source !== null && Symbol.asyncIterator in source) {
51
+ return new ReadableStream({
52
+ async start(controller) {
53
+ try {
54
+ for await (const chunk of source) {
55
+ controller.enqueue(chunk);
56
+ }
57
+ controller.close();
58
+ }
59
+ catch (error) {
60
+ controller.error(error);
61
+ }
62
+ },
63
+ });
64
+ }
65
+ if (typeof source === 'function') {
66
+ return normalizeAudioSource(source());
67
+ }
68
+ if (source instanceof ArrayBuffer || source instanceof Uint8Array) {
69
+ const data = source instanceof ArrayBuffer ? new Uint8Array(source) : source;
70
+ return new ReadableStream({
71
+ start(controller) {
72
+ controller.enqueue(data);
73
+ controller.close();
74
+ },
75
+ });
76
+ }
77
+ throw new Error(`Unsupported audio source type: ${typeof source}`);
78
+ }
79
+ function appendBuffer(left, right) {
80
+ if (left.length === 0)
81
+ return right;
82
+ const merged = new Uint8Array(left.length + right.length);
83
+ merged.set(left);
84
+ merged.set(right, left.length);
85
+ return merged;
86
+ }
87
+ function copyChunk(chunk) {
88
+ const copy = new Uint8Array(chunk.length);
89
+ copy.set(chunk);
90
+ return copy;
91
+ }
92
+ function wait(ms) {
93
+ return new Promise(resolve => setTimeout(resolve, ms));
94
+ }
95
+ function getTranscriptDelta(previous, next) {
96
+ if (!previous)
97
+ return next;
98
+ if (next.startsWith(previous))
99
+ return next.slice(previous.length);
100
+ let commonPrefixLength = 0;
101
+ const limit = Math.min(previous.length, next.length);
102
+ while (commonPrefixLength < limit && previous[commonPrefixLength] === next[commonPrefixLength]) {
103
+ commonPrefixLength++;
104
+ }
105
+ return next.slice(commonPrefixLength);
106
+ }
107
+ function setParam(params, name, value) {
108
+ if (value === undefined || value === null || value === '')
109
+ return;
110
+ if (Array.isArray(value)) {
111
+ if (value.length === 0)
112
+ return;
113
+ params.set(name, JSON.stringify(value));
114
+ return;
115
+ }
116
+ params.set(name, String(value));
117
+ }
118
+ function buildStreamingUrl(model, opts) {
119
+ const params = new URLSearchParams();
120
+ params.set('sample_rate', String(opts.audioFormat?.sampleRate || DEFAULT_SAMPLE_RATE));
121
+ params.set('speech_model', model);
122
+ setParam(params, 'mode', opts.mode);
123
+ setParam(params, 'prompt', opts.prompt);
124
+ setParam(params, 'language_code', opts.language_code || opts.languageCode || opts.language);
125
+ setParam(params, 'keyterms_prompt', opts.keyterms_prompt || opts.keytermsPrompt);
126
+ setParam(params, 'min_turn_silence', opts.min_turn_silence || opts.minTurnSilence);
127
+ setParam(params, 'max_turn_silence', opts.max_turn_silence || opts.maxTurnSilence);
128
+ setParam(params, 'vad_threshold', opts.vad_threshold || opts.vadThreshold);
129
+ setParam(params, 'agent_context', opts.agent_context || opts.agentContext);
130
+ return `${ASSEMBLYAI_STREAMING_URL}?${params.toString()}`;
131
+ }
132
+ function isSocketOpen(ws) {
133
+ return ws.readyState === WEBSOCKET_OPEN_STATE;
134
+ }
135
+ class AssemblyAIProvider extends base_provider_js_1.BaseModelProvider {
136
+ apiKey;
137
+ constructor(apiKey) {
138
+ super('assemblyai');
139
+ this.apiKey = apiKey;
140
+ }
141
+ async *createResponseStream() {
142
+ yield* [];
143
+ throw new Error('AssemblyAI provider only supports streaming transcription');
144
+ }
145
+ async *createTranscription(audio, _agent, model, opts = {}) {
146
+ if (!ASSEMBLYAI_STREAMING_MODELS.has(model)) {
147
+ throw new Error(`Model ${model} does not support AssemblyAI streaming transcription. Supported models: ${Array.from(ASSEMBLYAI_STREAMING_MODELS).join(', ')}`);
148
+ }
149
+ const apiKey = this.apiKey || process.env.ASSEMBLYAI_API_KEY;
150
+ if (!apiKey) {
151
+ throw new Error('Failed to initialize AssemblyAI transcription. Make sure ASSEMBLYAI_API_KEY is set.');
152
+ }
153
+ const { WebSocket } = await Promise.resolve().then(() => __importStar(require('ws')));
154
+ const ws = new WebSocket(buildStreamingUrl(model, opts), {
155
+ headers: { Authorization: apiKey },
156
+ });
157
+ const queue = [];
158
+ let wake;
159
+ let finished = false;
160
+ let socketError;
161
+ const previousTurnTranscripts = new Map();
162
+ const push = (item) => {
163
+ queue.push(item);
164
+ wake?.();
165
+ wake = undefined;
166
+ };
167
+ const markDone = () => {
168
+ if (finished)
169
+ return;
170
+ finished = true;
171
+ push(DONE);
172
+ };
173
+ const connected = new Promise((resolve, reject) => {
174
+ const timeout = setTimeout(() => {
175
+ reject(new Error('AssemblyAI streaming connection timeout'));
176
+ }, 10000);
177
+ ws.once('open', () => {
178
+ clearTimeout(timeout);
179
+ resolve();
180
+ });
181
+ ws.once('error', error => {
182
+ clearTimeout(timeout);
183
+ reject(error);
184
+ });
185
+ });
186
+ ws.on('message', data => {
187
+ let message;
188
+ try {
189
+ message = JSON.parse(data.toString());
190
+ }
191
+ catch (error) {
192
+ socketError = error instanceof Error ? error : new Error(String(error));
193
+ push({
194
+ type: 'error',
195
+ timestamp: new Date().toISOString(),
196
+ error: `Failed to parse AssemblyAI message: ${socketError.message}`,
197
+ });
198
+ return;
199
+ }
200
+ const timestamp = new Date().toISOString();
201
+ switch (message.type) {
202
+ case 'Begin':
203
+ break;
204
+ case 'SpeechStarted':
205
+ push({
206
+ type: 'transcription_turn_start',
207
+ timestamp,
208
+ });
209
+ break;
210
+ case 'Turn': {
211
+ const transcript = typeof message.transcript === 'string' ? message.transcript : '';
212
+ const turnOrder = typeof message.turn_order === 'number' ? message.turn_order : 0;
213
+ const previousTranscript = previousTurnTranscripts.get(turnOrder) || '';
214
+ const delta = getTranscriptDelta(previousTranscript, transcript);
215
+ previousTurnTranscripts.set(turnOrder, transcript);
216
+ if (delta) {
217
+ push({
218
+ type: 'transcription_turn_delta',
219
+ timestamp,
220
+ delta,
221
+ partial: !message.end_of_turn,
222
+ });
223
+ }
224
+ if (message.end_of_turn) {
225
+ previousTurnTranscripts.delete(turnOrder);
226
+ push({
227
+ type: 'transcription_turn_complete',
228
+ timestamp,
229
+ text: transcript,
230
+ });
231
+ }
232
+ break;
233
+ }
234
+ case 'Termination':
235
+ markDone();
236
+ break;
237
+ case 'Error':
238
+ socketError = new Error(message.error || 'AssemblyAI streaming error');
239
+ push({
240
+ type: 'error',
241
+ timestamp,
242
+ error: socketError.message,
243
+ });
244
+ markDone();
245
+ break;
246
+ default:
247
+ break;
248
+ }
249
+ });
250
+ ws.on('error', error => {
251
+ socketError = error instanceof Error ? error : new Error(String(error));
252
+ push({
253
+ type: 'error',
254
+ timestamp: new Date().toISOString(),
255
+ error: socketError.message,
256
+ });
257
+ markDone();
258
+ });
259
+ ws.on('close', (code, reason) => {
260
+ if (!finished && code !== 1000) {
261
+ const detail = reason.toString() || `AssemblyAI streaming socket closed with code ${code}`;
262
+ push({
263
+ type: 'error',
264
+ timestamp: new Date().toISOString(),
265
+ error: detail,
266
+ });
267
+ }
268
+ markDone();
269
+ });
270
+ let audioPump;
271
+ try {
272
+ await connected;
273
+ audioPump = this.streamAudio(ws, audio, opts)
274
+ .then(() => {
275
+ if (isSocketOpen(ws)) {
276
+ ws.send(JSON.stringify({ type: 'Terminate' }));
277
+ }
278
+ })
279
+ .catch(error => {
280
+ socketError = error instanceof Error ? error : new Error(String(error));
281
+ push({
282
+ type: 'error',
283
+ timestamp: new Date().toISOString(),
284
+ error: socketError.message,
285
+ });
286
+ if (isSocketOpen(ws)) {
287
+ ws.close();
288
+ }
289
+ markDone();
290
+ });
291
+ while (true) {
292
+ if (queue.length === 0) {
293
+ await new Promise(resolve => {
294
+ wake = resolve;
295
+ });
296
+ }
297
+ const item = queue.shift();
298
+ if (!item)
299
+ continue;
300
+ if (item === DONE)
301
+ break;
302
+ yield item;
303
+ }
304
+ if (socketError) {
305
+ return;
306
+ }
307
+ }
308
+ finally {
309
+ await audioPump?.catch(() => undefined);
310
+ if (isSocketOpen(ws)) {
311
+ ws.close();
312
+ }
313
+ }
314
+ }
315
+ async streamAudio(ws, audio, opts) {
316
+ const stream = normalizeAudioSource(audio);
317
+ const reader = stream.getReader();
318
+ const sampleRate = opts.audioFormat?.sampleRate || DEFAULT_SAMPLE_RATE;
319
+ const channels = opts.audioFormat?.channels || DEFAULT_CHANNELS;
320
+ const throttleAudio = opts.throttleAudio ??
321
+ (!opts.disableRealtimeThrottle && (audio instanceof ArrayBuffer || audio instanceof Uint8Array));
322
+ const targetBytes = Math.max(1, Math.floor((sampleRate * channels * BYTES_PER_SAMPLE * TARGET_CHUNK_MS) / 1000));
323
+ let buffer = new Uint8Array(0);
324
+ while (true) {
325
+ const { done, value } = await reader.read();
326
+ if (done)
327
+ break;
328
+ if (value?.length) {
329
+ buffer = appendBuffer(buffer, copyChunk(value));
330
+ }
331
+ while (buffer.length >= targetBytes) {
332
+ const chunk = buffer.slice(0, targetBytes);
333
+ buffer = buffer.slice(targetBytes);
334
+ await this.sendAudioChunk(ws, chunk, throttleAudio);
335
+ }
336
+ }
337
+ if (buffer.length > 0) {
338
+ await this.sendAudioChunk(ws, buffer, throttleAudio);
339
+ }
340
+ }
341
+ async sendAudioChunk(ws, chunk, throttleAudio) {
342
+ if (!isSocketOpen(ws)) {
343
+ throw new Error('AssemblyAI streaming socket closed before audio could be sent');
344
+ }
345
+ await new Promise((resolve, reject) => {
346
+ ws.send(chunk, error => {
347
+ if (error)
348
+ reject(error);
349
+ else
350
+ resolve();
351
+ });
352
+ });
353
+ if (throttleAudio) {
354
+ await wait(TARGET_CHUNK_MS);
355
+ }
356
+ }
357
+ }
358
+ exports.AssemblyAIProvider = AssemblyAIProvider;
359
+ exports.assemblyAIProvider = new AssemblyAIProvider();
360
+ //# sourceMappingURL=assemblyai.js.map
@@ -0,0 +1,30 @@
1
+ import { BaseModelProvider } from "./base_provider.cjs";
2
+ import type { AgentDefinition, ProviderStreamEvent, TranscriptionAudioSource, TranscriptionEvent, TranscriptionOpts } from "../types/types.cjs";
3
+ type AssemblyAIStreamingOptions = TranscriptionOpts & {
4
+ mode?: 'min_latency' | 'balanced' | 'max_accuracy';
5
+ languageCode?: string;
6
+ language_code?: string;
7
+ keytermsPrompt?: string[];
8
+ keyterms_prompt?: string[];
9
+ minTurnSilence?: number;
10
+ min_turn_silence?: number;
11
+ maxTurnSilence?: number;
12
+ max_turn_silence?: number;
13
+ vadThreshold?: number;
14
+ vad_threshold?: number;
15
+ agentContext?: string;
16
+ agent_context?: string;
17
+ throttleAudio?: boolean;
18
+ disableRealtimeThrottle?: boolean;
19
+ };
20
+ export declare class AssemblyAIProvider extends BaseModelProvider {
21
+ private apiKey?;
22
+ constructor(apiKey?: string);
23
+ createResponseStream(): AsyncGenerator<ProviderStreamEvent>;
24
+ createTranscription(audio: TranscriptionAudioSource, _agent: AgentDefinition, model: string, opts?: AssemblyAIStreamingOptions): AsyncGenerator<TranscriptionEvent>;
25
+ private streamAudio;
26
+ private sendAudioChunk;
27
+ }
28
+ export declare const assemblyAIProvider: AssemblyAIProvider;
29
+ export {};
30
+ //# sourceMappingURL=assemblyai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assemblyai.d.ts","sourceRoot":"","sources":["../../../model_providers/assemblyai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EACR,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,mBAAmB,CAAC;AAW3B,KAAK,0BAA0B,GAAG,iBAAiB,GAAG;IAClD,IAAI,CAAC,EAAE,aAAa,GAAG,UAAU,GAAG,cAAc,CAAC;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AA0GF,qBAAa,kBAAmB,SAAQ,iBAAiB;IACzC,OAAO,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,EAAE,MAAM;IAI5B,oBAAoB,IAAI,cAAc,CAAC,mBAAmB,CAAC;IAK3D,mBAAmB,CACtB,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,0BAA+B,GACtC,cAAc,CAAC,kBAAkB,CAAC;YA4LvB,WAAW;YAqCX,cAAc;CAoB/B;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assemblyai.js","sourceRoot":"","sources":["../../../model_providers/assemblyai.ts"],"names":[],"mappings":"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"}
@@ -620,6 +620,24 @@ function isGemmaModel(model) {
620
620
  const modelId = model.startsWith('models/') ? model.slice('models/'.length) : model;
621
621
  return modelId.startsWith('gemma-4-');
622
622
  }
623
+ function isGemini25FlashImageModel(model) {
624
+ return model.includes('gemini-2.5-flash-image');
625
+ }
626
+ function isGemini31FlashImageModel(model) {
627
+ return model.includes('gemini-3.1-flash-image');
628
+ }
629
+ function isGemini31FlashLiteImageModel(model) {
630
+ return model.includes('gemini-3.1-flash-lite-image');
631
+ }
632
+ function isGemini3ProImageModel(model) {
633
+ return model.includes('gemini-3-pro-image');
634
+ }
635
+ function isGeminiStreamingImageModel(model) {
636
+ return (isGemini25FlashImageModel(model) ||
637
+ isGemini31FlashImageModel(model) ||
638
+ isGemini31FlashLiteImageModel(model) ||
639
+ isGemini3ProImageModel(model));
640
+ }
623
641
  function getSupportedThinkingLevels(model) {
624
642
  if (isGemmaModel(model)) {
625
643
  return new Set(['HIGH']);
@@ -627,17 +645,17 @@ function getSupportedThinkingLevels(model) {
627
645
  if (model.includes('gemini-3.1-pro-preview') || model.includes('gemini-3-pro-preview')) {
628
646
  return new Set(['LOW', 'MEDIUM', 'HIGH']);
629
647
  }
648
+ if (isGemini31FlashImageModel(model) || isGemini31FlashLiteImageModel(model)) {
649
+ return new Set(['MINIMAL', 'HIGH']);
650
+ }
651
+ if (isGemini3ProImageModel(model)) {
652
+ return new Set(['HIGH']);
653
+ }
630
654
  if (model.includes('gemini-3.5-flash') ||
631
655
  model.includes('gemini-3.1-flash-lite') ||
632
656
  model.includes('gemini-3-flash-preview')) {
633
657
  return new Set(['MINIMAL', 'LOW', 'MEDIUM', 'HIGH']);
634
658
  }
635
- if (model.includes('gemini-3.1-flash-image-preview')) {
636
- return new Set(['MINIMAL', 'HIGH']);
637
- }
638
- if (model.includes('gemini-3-pro-image-preview')) {
639
- return new Set(['HIGH']);
640
- }
641
659
  return null;
642
660
  }
643
661
  const GEMINI_3_PRO_IMAGE_DIMENSION_PRESETS = {
@@ -1268,7 +1286,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1268
1286
  const requestId = `req_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
1269
1287
  let finalRequestId = requestId;
1270
1288
  try {
1271
- model = model || 'gemini-2.5-flash-image-preview';
1289
+ model = model || 'gemini-3.1-flash-image';
1272
1290
  const numberOfImages = opts?.n ?? 1;
1273
1291
  if (!Number.isInteger(numberOfImages) || numberOfImages < 1) {
1274
1292
  throw new Error('[Gemini] ImageGenerationOpts.n must be a positive integer.');
@@ -1282,11 +1300,17 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1282
1300
  }
1283
1301
  const explicitWebGrounding = opts?.grounding?.web_search;
1284
1302
  const explicitImageGrounding = opts?.grounding?.image_search;
1285
- const enableWebGrounding = explicitWebGrounding ?? hasGoogleWebSearch ?? false;
1286
- const isGemini31FlashImageModel = model.includes('gemini-3.1-flash-image-preview');
1287
- const enableImageGrounding = explicitImageGrounding === true && isGemini31FlashImageModel;
1288
- if (explicitImageGrounding && !isGemini31FlashImageModel) {
1289
- console.warn('[Gemini] Image Search grounding is only available for gemini-3.1-flash-image-preview. Ignoring image_search=true.');
1303
+ const isGemini31FlashImage = isGemini31FlashImageModel(model);
1304
+ const isGemini31FlashLiteImage = isGemini31FlashLiteImageModel(model);
1305
+ const isGemini3ProImage = isGemini3ProImageModel(model);
1306
+ const supportsWebGrounding = isGemini31FlashImage || isGemini3ProImage;
1307
+ const enableWebGrounding = supportsWebGrounding && (explicitWebGrounding ?? hasGoogleWebSearch ?? false);
1308
+ const enableImageGrounding = explicitImageGrounding === true && isGemini31FlashImage;
1309
+ if ((explicitWebGrounding || hasGoogleWebSearch) && !supportsWebGrounding) {
1310
+ console.warn('[Gemini] Google Search grounding is only available for gemini-3.1-flash-image and gemini-3-pro-image. Ignoring web_search=true.');
1311
+ }
1312
+ if (explicitImageGrounding && !isGemini31FlashImage) {
1313
+ console.warn('[Gemini] Image Search grounding is only available for gemini-3.1-flash-image. Ignoring image_search=true.');
1290
1314
  }
1291
1315
  const thinkingOptions = opts?.thinking;
1292
1316
  const hasThinkingOptionsObject = thinkingOptions !== null && typeof thinkingOptions === 'object' && !Array.isArray(thinkingOptions);
@@ -1296,11 +1320,12 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1296
1320
  ? thinkingOptions.level
1297
1321
  : undefined;
1298
1322
  const thinkingLevel = requestedThinkingLevel === 'high' ? 'High' : requestedThinkingLevel ? 'Minimal' : undefined;
1299
- if (requestedThinkingLevel && !isGemini31FlashImageModel) {
1300
- console.warn('[Gemini] thinking.level is currently supported for gemini-3.1-flash-image-preview only. Ignoring thinking level.');
1323
+ const supportsImageThinkingControls = isGemini31FlashImage || isGemini31FlashLiteImage;
1324
+ if (requestedThinkingLevel && !supportsImageThinkingControls) {
1325
+ 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.');
1301
1326
  }
1302
- if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && !isGemini31FlashImageModel) {
1303
- console.warn('[Gemini] thinking.include_thoughts is currently supported for gemini-3.1-flash-image-preview only. Ignoring include_thoughts.');
1327
+ if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && !supportsImageThinkingControls) {
1328
+ 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.');
1304
1329
  }
1305
1330
  let aspectRatio = '1:1';
1306
1331
  if (opts?.size === 'landscape')
@@ -1308,9 +1333,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1308
1333
  else if (opts?.size === 'portrait')
1309
1334
  aspectRatio = '2:3';
1310
1335
  console.log(`[Gemini] Generating ${numberOfImages} image(s) with model ${model}, prompt: "${prompt.substring(0, 100)}${prompt.length > 100 ? '...' : ''}"`);
1311
- if (model.includes('gemini-2.5-flash-image-preview') ||
1312
- model.includes('gemini-3.1-flash-image-preview') ||
1313
- model.includes('gemini-3-pro-image-preview')) {
1336
+ if (isGeminiStreamingImageModel(model)) {
1314
1337
  let aggregateMetadata = { model };
1315
1338
  const sizeMap = {
1316
1339
  '1:1': { ar: '1:1' },
@@ -1341,7 +1364,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1341
1364
  '1024x1792': { ar: '9:16' },
1342
1365
  };
1343
1366
  const sm = opts?.size ? sizeMap[String(opts.size)] : undefined;
1344
- const gemini3ProDimensionPreset = model.includes('gemini-3-pro-image-preview')
1367
+ const gemini3ProDimensionPreset = isGemini3ProImage
1345
1368
  ? GEMINI_3_PRO_IMAGE_DIMENSION_PRESETS[String(opts?.size)]
1346
1369
  : undefined;
1347
1370
  const imageConfig = {};
@@ -1350,7 +1373,24 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1350
1373
  if (gemini3ProDimensionPreset?.ar)
1351
1374
  imageConfig.aspectRatio = gemini3ProDimensionPreset.ar;
1352
1375
  const qualityKey = typeof opts?.quality === 'string' ? opts.quality.toLowerCase() : '';
1353
- const imageSizeMap = isGemini31FlashImageModel
1376
+ if (isGemini31FlashLiteImage && imageConfig.aspectRatio) {
1377
+ const liteAspectRatios = new Set([
1378
+ '1:1',
1379
+ '2:3',
1380
+ '3:2',
1381
+ '3:4',
1382
+ '4:3',
1383
+ '4:5',
1384
+ '5:4',
1385
+ '9:16',
1386
+ '16:9',
1387
+ '21:9',
1388
+ ]);
1389
+ if (!liteAspectRatios.has(imageConfig.aspectRatio)) {
1390
+ throw new Error(`[Gemini] gemini-3.1-flash-lite-image does not support aspect ratio ${imageConfig.aspectRatio}.`);
1391
+ }
1392
+ }
1393
+ const imageSizeMap = isGemini31FlashImage
1354
1394
  ? {
1355
1395
  low: '0.5K',
1356
1396
  standard: '1K',
@@ -1358,28 +1398,44 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1358
1398
  hd: '4K',
1359
1399
  high: '4K',
1360
1400
  }
1361
- : {
1362
- low: '1K',
1363
- standard: '2K',
1364
- medium: '2K',
1365
- hd: '4K',
1366
- high: '4K',
1367
- };
1401
+ : isGemini31FlashLiteImage
1402
+ ? {
1403
+ low: '1K',
1404
+ standard: '1K',
1405
+ medium: '1K',
1406
+ hd: '1K',
1407
+ high: '1K',
1408
+ }
1409
+ : {
1410
+ low: '1K',
1411
+ standard: '2K',
1412
+ medium: '2K',
1413
+ hd: '4K',
1414
+ high: '4K',
1415
+ };
1368
1416
  let imageSize = imageSizeMap[qualityKey];
1369
1417
  if (gemini3ProDimensionPreset?.imageSize) {
1370
1418
  imageSize = gemini3ProDimensionPreset.imageSize;
1371
1419
  }
1372
- if (isGemini31FlashImageModel && opts?.size === '512x512') {
1420
+ if (isGemini31FlashImage && opts?.size === '512x512') {
1373
1421
  imageSize = '0.5K';
1374
1422
  }
1423
+ if (isGemini31FlashLiteImage) {
1424
+ imageSize = '1K';
1425
+ if (opts?.size === '512x512') {
1426
+ throw new Error('[Gemini] gemini-3.1-flash-lite-image only supports 1K image output.');
1427
+ }
1428
+ }
1375
1429
  const requestImageSize = imageSize === '0.5K' ? '512' : imageSize;
1376
1430
  if (requestImageSize)
1377
1431
  imageConfig.imageSize = requestImageSize;
1378
1432
  const thinkingConfig = {};
1379
- if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && isGemini31FlashImageModel) {
1433
+ if (hasThinkingOptionsObject &&
1434
+ 'include_thoughts' in thinkingOptions &&
1435
+ supportsImageThinkingControls) {
1380
1436
  thinkingConfig.includeThoughts = includeThoughts;
1381
1437
  }
1382
- if (thinkingLevel && isGemini31FlashImageModel) {
1438
+ if (thinkingLevel && supportsImageThinkingControls) {
1383
1439
  thinkingConfig.thinkingLevel = thinkingLevel;
1384
1440
  }
1385
1441
  const searchTypes = {};
@@ -1695,7 +1751,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1695
1751
  }
1696
1752
  }
1697
1753
  getImageCost(model, imageSize) {
1698
- if (model.includes('gemini-3.1-flash-image-preview')) {
1754
+ if (isGemini31FlashImageModel(model)) {
1699
1755
  if (imageSize === '4K')
1700
1756
  return 0.151;
1701
1757
  if (imageSize === '2K')
@@ -1704,10 +1760,13 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1704
1760
  return 0.045;
1705
1761
  return 0.067;
1706
1762
  }
1707
- else if (model.includes('gemini-2.5-flash-image-preview')) {
1763
+ else if (isGemini31FlashLiteImageModel(model)) {
1764
+ return 0.0336;
1765
+ }
1766
+ else if (isGemini25FlashImageModel(model)) {
1708
1767
  return 0.039;
1709
1768
  }
1710
- else if (model.includes('gemini-3-pro-image-preview')) {
1769
+ else if (isGemini3ProImageModel(model)) {
1711
1770
  if (imageSize === '4K')
1712
1771
  return 0.24;
1713
1772
  return 0.134;
@@ -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"}