@just-every/ensemble 0.2.160 → 0.2.162

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 (132) hide show
  1. package/README.md +45 -1
  2. package/dist/cjs/core/ensemble_image.cjs +92 -6
  3. package/dist/cjs/core/ensemble_image.d.ts +2 -2
  4. package/dist/cjs/core/ensemble_image.d.ts.map +1 -1
  5. package/dist/cjs/core/ensemble_image.js.map +1 -1
  6. package/dist/cjs/data/model_data.cjs +668 -94
  7. package/dist/cjs/data/model_data.d.ts.map +1 -1
  8. package/dist/cjs/data/model_data.js.map +1 -1
  9. package/dist/cjs/model_providers/bytedance.cjs +202 -0
  10. package/dist/cjs/model_providers/bytedance.d.ts +9 -0
  11. package/dist/cjs/model_providers/bytedance.d.ts.map +1 -0
  12. package/dist/cjs/model_providers/bytedance.js.map +1 -0
  13. package/dist/cjs/model_providers/fal.cjs +97 -0
  14. package/dist/cjs/model_providers/fal.d.ts +10 -0
  15. package/dist/cjs/model_providers/fal.d.ts.map +1 -0
  16. package/dist/cjs/model_providers/fal.js.map +1 -0
  17. package/dist/cjs/model_providers/fireworks.cjs +193 -0
  18. package/dist/cjs/model_providers/fireworks.d.ts +12 -0
  19. package/dist/cjs/model_providers/fireworks.d.ts.map +1 -0
  20. package/dist/cjs/model_providers/fireworks.js.map +1 -0
  21. package/dist/cjs/model_providers/gemini.cjs +141 -7
  22. package/dist/cjs/model_providers/gemini.d.ts.map +1 -1
  23. package/dist/cjs/model_providers/gemini.js.map +1 -1
  24. package/dist/cjs/model_providers/ideogram.cjs +136 -0
  25. package/dist/cjs/model_providers/ideogram.d.ts +9 -0
  26. package/dist/cjs/model_providers/ideogram.d.ts.map +1 -0
  27. package/dist/cjs/model_providers/ideogram.js.map +1 -0
  28. package/dist/cjs/model_providers/luma.cjs +150 -0
  29. package/dist/cjs/model_providers/luma.d.ts +9 -0
  30. package/dist/cjs/model_providers/luma.d.ts.map +1 -0
  31. package/dist/cjs/model_providers/luma.js.map +1 -0
  32. package/dist/cjs/model_providers/midjourney.cjs +134 -0
  33. package/dist/cjs/model_providers/midjourney.d.ts +9 -0
  34. package/dist/cjs/model_providers/midjourney.d.ts.map +1 -0
  35. package/dist/cjs/model_providers/midjourney.js.map +1 -0
  36. package/dist/cjs/model_providers/model_provider.cjs +60 -0
  37. package/dist/cjs/model_providers/model_provider.d.ts.map +1 -1
  38. package/dist/cjs/model_providers/model_provider.js.map +1 -1
  39. package/dist/cjs/model_providers/openai.cjs +24 -14
  40. package/dist/cjs/model_providers/openai.d.ts.map +1 -1
  41. package/dist/cjs/model_providers/openai.js.map +1 -1
  42. package/dist/cjs/model_providers/runway.cjs +145 -0
  43. package/dist/cjs/model_providers/runway.d.ts +9 -0
  44. package/dist/cjs/model_providers/runway.d.ts.map +1 -0
  45. package/dist/cjs/model_providers/runway.js.map +1 -0
  46. package/dist/cjs/model_providers/stability.cjs +130 -0
  47. package/dist/cjs/model_providers/stability.d.ts +10 -0
  48. package/dist/cjs/model_providers/stability.d.ts.map +1 -0
  49. package/dist/cjs/model_providers/stability.js.map +1 -0
  50. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  51. package/dist/cjs/types/types.d.ts +11 -3
  52. package/dist/cjs/types/types.d.ts.map +1 -1
  53. package/dist/cjs/utils/cost_tracker.cjs +3 -0
  54. package/dist/cjs/utils/cost_tracker.d.ts +1 -0
  55. package/dist/cjs/utils/cost_tracker.d.ts.map +1 -1
  56. package/dist/cjs/utils/cost_tracker.js.map +1 -1
  57. package/dist/cjs/utils/ensemble_result.d.ts +1 -1
  58. package/dist/cjs/utils/ensemble_result.d.ts.map +1 -1
  59. package/dist/cjs/utils/fetch_with_timeout.cjs +28 -0
  60. package/dist/cjs/utils/fetch_with_timeout.d.ts +2 -0
  61. package/dist/cjs/utils/fetch_with_timeout.d.ts.map +1 -0
  62. package/dist/cjs/utils/fetch_with_timeout.js.map +1 -0
  63. package/dist/cjs/utils/image_utils.cjs +23 -0
  64. package/dist/cjs/utils/image_utils.d.ts +5 -0
  65. package/dist/cjs/utils/image_utils.d.ts.map +1 -1
  66. package/dist/cjs/utils/image_utils.js.map +1 -1
  67. package/dist/core/ensemble_image.d.ts +2 -2
  68. package/dist/core/ensemble_image.d.ts.map +1 -1
  69. package/dist/core/ensemble_image.js +59 -6
  70. package/dist/core/ensemble_image.js.map +1 -1
  71. package/dist/data/model_data.d.ts.map +1 -1
  72. package/dist/data/model_data.js +668 -94
  73. package/dist/data/model_data.js.map +1 -1
  74. package/dist/model_providers/bytedance.d.ts +9 -0
  75. package/dist/model_providers/bytedance.d.ts.map +1 -0
  76. package/dist/model_providers/bytedance.js +198 -0
  77. package/dist/model_providers/bytedance.js.map +1 -0
  78. package/dist/model_providers/fal.d.ts +10 -0
  79. package/dist/model_providers/fal.d.ts.map +1 -0
  80. package/dist/model_providers/fal.js +93 -0
  81. package/dist/model_providers/fal.js.map +1 -0
  82. package/dist/model_providers/fireworks.d.ts +12 -0
  83. package/dist/model_providers/fireworks.d.ts.map +1 -0
  84. package/dist/model_providers/fireworks.js +189 -0
  85. package/dist/model_providers/fireworks.js.map +1 -0
  86. package/dist/model_providers/gemini.d.ts.map +1 -1
  87. package/dist/model_providers/gemini.js +141 -7
  88. package/dist/model_providers/gemini.js.map +1 -1
  89. package/dist/model_providers/ideogram.d.ts +9 -0
  90. package/dist/model_providers/ideogram.d.ts.map +1 -0
  91. package/dist/model_providers/ideogram.js +132 -0
  92. package/dist/model_providers/ideogram.js.map +1 -0
  93. package/dist/model_providers/luma.d.ts +9 -0
  94. package/dist/model_providers/luma.d.ts.map +1 -0
  95. package/dist/model_providers/luma.js +146 -0
  96. package/dist/model_providers/luma.js.map +1 -0
  97. package/dist/model_providers/midjourney.d.ts +9 -0
  98. package/dist/model_providers/midjourney.d.ts.map +1 -0
  99. package/dist/model_providers/midjourney.js +130 -0
  100. package/dist/model_providers/midjourney.js.map +1 -0
  101. package/dist/model_providers/model_provider.d.ts.map +1 -1
  102. package/dist/model_providers/model_provider.js +60 -0
  103. package/dist/model_providers/model_provider.js.map +1 -1
  104. package/dist/model_providers/openai.d.ts.map +1 -1
  105. package/dist/model_providers/openai.js +24 -14
  106. package/dist/model_providers/openai.js.map +1 -1
  107. package/dist/model_providers/runway.d.ts +9 -0
  108. package/dist/model_providers/runway.d.ts.map +1 -0
  109. package/dist/model_providers/runway.js +141 -0
  110. package/dist/model_providers/runway.js.map +1 -0
  111. package/dist/model_providers/stability.d.ts +10 -0
  112. package/dist/model_providers/stability.d.ts.map +1 -0
  113. package/dist/model_providers/stability.js +126 -0
  114. package/dist/model_providers/stability.js.map +1 -0
  115. package/dist/tsconfig.tsbuildinfo +1 -1
  116. package/dist/types/types.d.ts +11 -3
  117. package/dist/types/types.d.ts.map +1 -1
  118. package/dist/utils/cost_tracker.d.ts +1 -0
  119. package/dist/utils/cost_tracker.d.ts.map +1 -1
  120. package/dist/utils/cost_tracker.js +3 -0
  121. package/dist/utils/cost_tracker.js.map +1 -1
  122. package/dist/utils/ensemble_result.d.ts +1 -1
  123. package/dist/utils/ensemble_result.d.ts.map +1 -1
  124. package/dist/utils/fetch_with_timeout.d.ts +2 -0
  125. package/dist/utils/fetch_with_timeout.d.ts.map +1 -0
  126. package/dist/utils/fetch_with_timeout.js +25 -0
  127. package/dist/utils/fetch_with_timeout.js.map +1 -0
  128. package/dist/utils/image_utils.d.ts +5 -0
  129. package/dist/utils/image_utils.d.ts.map +1 -1
  130. package/dist/utils/image_utils.js +22 -0
  131. package/dist/utils/image_utils.js.map +1 -1
  132. package/package.json +122 -114
@@ -0,0 +1,189 @@
1
+ import { BaseModelProvider } from './base_provider.js';
2
+ import { costTracker } from '../utils/cost_tracker.js';
3
+ import { fetchWithTimeout } from '../utils/fetch_with_timeout.js';
4
+ import { log_llm_error, log_llm_request, log_llm_response } from '../utils/llm_logger.js';
5
+ const FW_BASE = 'https://api.fireworks.ai';
6
+ function mapAspect(size) {
7
+ if (!size)
8
+ return undefined;
9
+ const s = String(size);
10
+ if (s === 'square' || s === '1024x1024' || s === '512x512' || s === '256x256')
11
+ return '1:1';
12
+ if (s === 'landscape' || s === '1792x1024' || s === '1536x1024')
13
+ return '16:9';
14
+ if (s === 'portrait' || s === '1024x1792' || s === '1024x1536')
15
+ return '9:16';
16
+ return undefined;
17
+ }
18
+ export class FireworksProvider extends BaseModelProvider {
19
+ constructor() {
20
+ super('fireworks');
21
+ }
22
+ async *createResponseStream() {
23
+ throw new Error('Fireworks provider does not support text streaming');
24
+ }
25
+ isKontext(model) {
26
+ return model.includes('kontext');
27
+ }
28
+ fireworksModelId(model) {
29
+ const m = model.toLowerCase();
30
+ if (m.includes('kontext') && m.includes('max'))
31
+ return 'flux-kontext-max';
32
+ if (m.includes('kontext'))
33
+ return 'flux-kontext-pro';
34
+ if (m.includes('pro'))
35
+ return 'flux-pro-1.1';
36
+ if (m.includes('schnell'))
37
+ return 'flux-schnell';
38
+ return model;
39
+ }
40
+ async createImage(prompt, model, agent, opts = {}) {
41
+ const apiKey = process.env.FIREWORKS_API_KEY;
42
+ const falKey = process.env.FAL_KEY;
43
+ const requestId = log_llm_request(agent.agent_id || 'default', 'fireworks', model, { prompt, opts }, new Date());
44
+ try {
45
+ if (!apiKey)
46
+ throw new Error('FIREWORKS_API_KEY is not set');
47
+ const aspect_ratio = mapAspect(opts.size);
48
+ const modelId = this.fireworksModelId(model);
49
+ if (this.isKontext(modelId)) {
50
+ const createUrl = `${FW_BASE}/inference/v1/workflows/accounts/fireworks/models/${modelId}`;
51
+ let input_image;
52
+ if (opts?.source_images) {
53
+ const s = Array.isArray(opts.source_images) ? opts.source_images[0] : opts.source_images;
54
+ const v = typeof s === 'string' ? s : s?.data || s;
55
+ if (typeof v === 'string')
56
+ input_image = v;
57
+ }
58
+ const res = await fetchWithTimeout(createUrl, {
59
+ method: 'POST',
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ Authorization: `Bearer ${apiKey}`,
63
+ },
64
+ body: JSON.stringify({ prompt, aspect_ratio: aspect_ratio, output_format: 'png', ...(input_image ? { input_image } : {}) }),
65
+ }, 60000);
66
+ if (!res.ok) {
67
+ if ((res.status === 401 || res.status === 403) && falKey) {
68
+ return this.fallbackToFAL(prompt, modelId, opts);
69
+ }
70
+ throw new Error(`Fireworks Kontext create failed: ${res.status} ${await res.text()}`);
71
+ }
72
+ const data = await res.json();
73
+ const id = data.request_id || data.id;
74
+ if (!id)
75
+ throw new Error('Fireworks Kontext: missing request id');
76
+ const pollUrl = `${FW_BASE}/inference/v1/workflows/accounts/fireworks/models/${modelId}/get_result`;
77
+ const started = Date.now();
78
+ const timeoutMs = 240000;
79
+ while (true) {
80
+ const r = await fetchWithTimeout(pollUrl, {
81
+ method: 'POST',
82
+ headers: {
83
+ 'Content-Type': 'application/json',
84
+ Authorization: `Bearer ${apiKey}`,
85
+ },
86
+ body: JSON.stringify({ id }),
87
+ }, 60000);
88
+ if (!r.ok)
89
+ throw new Error(`Fireworks Kontext poll failed: ${r.status} ${await r.text()}`);
90
+ const out = await r.json();
91
+ const status = String(out.status || '').toLowerCase();
92
+ if (status.includes('ready') || status === 'succeeded' || status === 'completed') {
93
+ const urls = [];
94
+ if (Array.isArray(out.result?.images)) {
95
+ for (const im of out.result.images)
96
+ if (im?.url)
97
+ urls.push(im.url);
98
+ }
99
+ if (out.result?.image?.url)
100
+ urls.push(out.result.image.url);
101
+ if (out.result?.url)
102
+ urls.push(out.result.url);
103
+ if (out.result?.sample)
104
+ urls.push(out.result.sample);
105
+ if (!urls.length && out.result?.image_base64) {
106
+ urls.push(`data:image/png;base64,${out.result.image_base64}`);
107
+ }
108
+ if (!urls.length && typeof out.result === 'string' && /^https?:\/\//.test(out.result)) {
109
+ urls.push(out.result);
110
+ }
111
+ if (!urls.length)
112
+ throw new Error('Fireworks Kontext: no image result found');
113
+ costTracker.addUsage({ model, image_count: urls.length, request_id: opts?.request_id, metadata: { source: 'fireworks', model: modelId } });
114
+ return urls;
115
+ }
116
+ if (status.includes('error') || status.includes('failed')) {
117
+ throw new Error(`Fireworks Kontext failed: ${status}`);
118
+ }
119
+ if (Date.now() - started > timeoutMs)
120
+ throw new Error('Fireworks Kontext timed out');
121
+ await new Promise(r2 => setTimeout(r2, 1500));
122
+ }
123
+ }
124
+ try {
125
+ return await this.createImage(prompt, 'flux-kontext-pro', agent, opts);
126
+ }
127
+ catch (e) {
128
+ if (falKey)
129
+ return this.fallbackToFAL(prompt, model, opts);
130
+ throw e;
131
+ }
132
+ }
133
+ catch (err) {
134
+ log_llm_error(requestId, err);
135
+ if (process.env.FAL_KEY) {
136
+ try {
137
+ const urls = await this.fallbackToFAL(prompt, model, opts);
138
+ log_llm_response(requestId, { ok: true, fallback: 'fal' });
139
+ return urls;
140
+ }
141
+ catch (_) {
142
+ }
143
+ }
144
+ throw err;
145
+ }
146
+ finally {
147
+ log_llm_response(requestId, { ok: true });
148
+ }
149
+ }
150
+ async fallbackToFAL(prompt, model, opts = {}) {
151
+ const lower = model.toLowerCase();
152
+ let endpoint = '';
153
+ if (lower.includes('schnell'))
154
+ endpoint = 'fal-ai/flux/schnell';
155
+ else if (lower.includes('dev'))
156
+ endpoint = 'fal-ai/flux/dev';
157
+ else if (lower.includes('pro') || lower.includes('kontext'))
158
+ endpoint = 'fal-ai/flux-pro/kontext';
159
+ else
160
+ endpoint = 'fal-ai/flux/schnell';
161
+ const res = await fetch(`https://fal.run/${endpoint}`, {
162
+ method: 'POST',
163
+ headers: {
164
+ 'Content-Type': 'application/json',
165
+ Authorization: `Key ${process.env.FAL_KEY}`,
166
+ },
167
+ body: JSON.stringify({
168
+ prompt,
169
+ input: { prompt },
170
+ }),
171
+ });
172
+ if (!res.ok)
173
+ throw new Error(`FAL fallback failed: ${res.status} ${await res.text()}`);
174
+ const data = await res.json();
175
+ const images = [];
176
+ const arr = data?.images || data?.output?.images || [];
177
+ for (const im of arr)
178
+ if (im?.url)
179
+ images.push(im.url);
180
+ if (!images.length && data?.url)
181
+ images.push(data.url);
182
+ if (!images.length)
183
+ throw new Error('FAL fallback: no image url');
184
+ costTracker.addUsage({ model, image_count: images.length, request_id: opts?.request_id, metadata: { source: 'fal-fallback' } });
185
+ return images;
186
+ }
187
+ }
188
+ export const fireworksProvider = new FireworksProvider();
189
+ //# sourceMappingURL=fireworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireworks.js","sourceRoot":"","sources":["../../model_providers/fireworks.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,EACnB,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;AAyNvD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AAKD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAsKD,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,GAcjB;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;IAqbhC,WAAW,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IA+FpB,OAAO,CAAC,YAAY;IAmBd,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,EACnB,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;AAyNvD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AAKD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAsKD,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;IAqbhC,WAAW,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IAkPpB,OAAO,CAAC,YAAY;IA0Bd,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"}
@@ -318,7 +318,7 @@ export class GeminiProvider extends BaseModelProvider {
318
318
  this._client = new GoogleGenAI({
319
319
  apiKey: apiKey,
320
320
  vertexai: false,
321
- httpOptions: { apiVersion: 'v1alpha' },
321
+ httpOptions: { apiVersion: 'v1beta' },
322
322
  });
323
323
  }
324
324
  return this._client;
@@ -779,16 +779,143 @@ export class GeminiProvider extends BaseModelProvider {
779
779
  const requestId = `req_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
780
780
  let finalRequestId = requestId;
781
781
  try {
782
- model = model || 'imagen-3.0-generate-002';
782
+ model = model || 'gemini-2.5-flash-image-preview';
783
783
  const numberOfImages = opts?.n || 1;
784
784
  let aspectRatio = '1:1';
785
- if (opts?.size === 'landscape') {
785
+ if (opts?.size === 'landscape')
786
786
  aspectRatio = '16:9';
787
- }
788
- else if (opts?.size === 'portrait') {
787
+ else if (opts?.size === 'portrait')
789
788
  aspectRatio = '9:16';
790
- }
791
789
  console.log(`[Gemini] Generating ${numberOfImages} image(s) with model ${model}, prompt: "${prompt.substring(0, 100)}${prompt.length > 100 ? '...' : ''}"`);
790
+ if (model.includes('gemini-2.5-flash-image-preview') || model.includes('gemini-3-pro-image-preview')) {
791
+ const constraints = [];
792
+ const sizeMap = {
793
+ square: { ar: '1:1', px: '1024x1024' },
794
+ landscape: { ar: '16:9' },
795
+ portrait: { ar: '9:16' },
796
+ '256x256': { ar: '1:1', px: '256x256' },
797
+ '512x512': { ar: '1:1', px: '512x512' },
798
+ '1024x1024': { ar: '1:1', px: '1024x1024' },
799
+ '1536x1024': { ar: '3:2', px: '1536x1024' },
800
+ '1024x1536': { ar: '2:3', px: '1024x1536' },
801
+ '1792x1024': { ar: '16:9', px: '1792x1024' },
802
+ '1024x1792': { ar: '9:16', px: '1024x1792' },
803
+ };
804
+ const sm = opts?.size ? sizeMap[String(opts.size)] : undefined;
805
+ if (sm?.ar)
806
+ constraints.push(`Aspect ratio: ${sm.ar}.`);
807
+ if (sm?.px)
808
+ constraints.push(`Target size: ${sm.px} pixels (approximate).`);
809
+ if (opts?.style)
810
+ constraints.push(`Style: ${opts.style}.`);
811
+ if (opts?.background)
812
+ constraints.push(`Background: ${opts.background} (use transparency if supported).`);
813
+ const constraintText = constraints.length
814
+ ? `\n\nImage constraints (please prioritize):\n- ${constraints.join('\n- ')}`
815
+ : '';
816
+ const makeOne = async () => {
817
+ const requestParams = {
818
+ model,
819
+ contents: [
820
+ {
821
+ role: 'user',
822
+ parts: [
823
+ ...(Array.isArray(opts?.source_images)
824
+ ? opts.source_images
825
+ .map((img) => typeof img === 'string' ? { _src: img } : img)
826
+ .map((it) => {
827
+ const src = it?.data || it?._src || it;
828
+ if (typeof src !== 'string')
829
+ return null;
830
+ if (src.startsWith('data:')) {
831
+ const m = /^data:([^;]+);base64,(.+)$/i.exec(src);
832
+ if (!m)
833
+ return null;
834
+ return {
835
+ inlineData: {
836
+ mimeType: m[1] || 'image/png',
837
+ data: m[2],
838
+ },
839
+ };
840
+ }
841
+ return {
842
+ fileData: {
843
+ mimeType: 'image/*',
844
+ fileUri: src,
845
+ },
846
+ };
847
+ })
848
+ .filter(Boolean)
849
+ : typeof opts?.source_images === 'string'
850
+ ? [
851
+ (() => {
852
+ const s = String(opts?.source_images);
853
+ if (s.startsWith('data:')) {
854
+ const m = /^data:([^;]+);base64,(.+)$/i.exec(s);
855
+ return m
856
+ ? { inlineData: { mimeType: m[1] || 'image/png', data: m[2] } }
857
+ : null;
858
+ }
859
+ return { fileData: { mimeType: 'image/*', fileUri: s } };
860
+ })(),
861
+ ].filter(Boolean)
862
+ : []),
863
+ { text: `${prompt}${constraintText}` },
864
+ ],
865
+ },
866
+ ],
867
+ config: {
868
+ responseModalities: [Modality.IMAGE, Modality.TEXT],
869
+ },
870
+ };
871
+ const loggedRequestId = log_llm_request(agent.agent_id || 'default', 'gemini', model, requestParams, new Date(), requestId, agent.tags);
872
+ finalRequestId = loggedRequestId;
873
+ const response = await this.client.models.generateContentStream(requestParams);
874
+ const images = [];
875
+ for await (const chunk of response) {
876
+ if (!chunk.candidates)
877
+ continue;
878
+ for (const cand of chunk.candidates) {
879
+ const parts = cand.content?.parts || [];
880
+ for (const part of parts) {
881
+ if (part.inlineData?.data) {
882
+ const mime = part.inlineData.mimeType || 'image/png';
883
+ images.push(`data:${mime};base64,${part.inlineData.data}`);
884
+ }
885
+ }
886
+ }
887
+ }
888
+ if (images.length > 0) {
889
+ costTracker.addUsage({
890
+ model,
891
+ image_count: images.length,
892
+ request_id: opts?.request_id,
893
+ metadata: { cost_per_image: this.getImageCost(model) },
894
+ });
895
+ }
896
+ return images;
897
+ };
898
+ const allImages = [];
899
+ const calls = Math.max(1, numberOfImages);
900
+ for (let i = 0; i < calls; i++) {
901
+ const imgs = await makeOne();
902
+ for (const img of imgs) {
903
+ if (allImages.length < numberOfImages)
904
+ allImages.push(img);
905
+ }
906
+ if (allImages.length >= numberOfImages)
907
+ break;
908
+ }
909
+ if (allImages.length === 0) {
910
+ throw new Error('No images returned from Gemini 2.5 Flash Image model');
911
+ }
912
+ log_llm_response(finalRequestId, {
913
+ model,
914
+ image_count: allImages.length,
915
+ cost: allImages.length * this.getImageCost(model),
916
+ });
917
+ return allImages;
918
+ }
792
919
  const requestParams = {
793
920
  model,
794
921
  prompt,
@@ -813,6 +940,7 @@ export class GeminiProvider extends BaseModelProvider {
813
940
  costTracker.addUsage({
814
941
  model,
815
942
  image_count: images.length,
943
+ request_id: opts?.request_id,
816
944
  metadata: {
817
945
  aspect_ratio: aspectRatio,
818
946
  cost_per_image: perImageCost,
@@ -837,6 +965,12 @@ export class GeminiProvider extends BaseModelProvider {
837
965
  }
838
966
  }
839
967
  getImageCost(model) {
968
+ if (model.includes('gemini-2.5-flash-image-preview')) {
969
+ return 0.039;
970
+ }
971
+ else if (model.includes('gemini-3-pro-image-preview')) {
972
+ return 0.134;
973
+ }
840
974
  if (model.includes('imagen-3')) {
841
975
  return 0.04;
842
976
  }
@@ -1036,7 +1170,7 @@ export class GeminiProvider extends BaseModelProvider {
1036
1170
  try {
1037
1171
  const ai = new GoogleGenAI({
1038
1172
  apiKey: this.apiKey,
1039
- httpOptions: { apiVersion: 'v1alpha' },
1173
+ httpOptions: { apiVersion: 'v1beta' },
1040
1174
  });
1041
1175
  const realtimeInputConfig = opts?.realtimeInputConfig || {
1042
1176
  automaticActivityDetection: {