@just-every/ensemble 0.2.159 → 0.2.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -1
- package/dist/cjs/core/ensemble_image.cjs +92 -6
- package/dist/cjs/core/ensemble_image.d.ts +2 -2
- package/dist/cjs/core/ensemble_image.d.ts.map +1 -1
- package/dist/cjs/core/ensemble_image.js.map +1 -1
- package/dist/cjs/data/model_data.cjs +185 -1
- package/dist/cjs/data/model_data.d.ts.map +1 -1
- package/dist/cjs/data/model_data.js.map +1 -1
- package/dist/cjs/model_providers/bytedance.cjs +202 -0
- package/dist/cjs/model_providers/bytedance.d.ts +9 -0
- package/dist/cjs/model_providers/bytedance.d.ts.map +1 -0
- package/dist/cjs/model_providers/bytedance.js.map +1 -0
- package/dist/cjs/model_providers/fal.cjs +97 -0
- package/dist/cjs/model_providers/fal.d.ts +10 -0
- package/dist/cjs/model_providers/fal.d.ts.map +1 -0
- package/dist/cjs/model_providers/fal.js.map +1 -0
- package/dist/cjs/model_providers/fireworks.cjs +193 -0
- package/dist/cjs/model_providers/fireworks.d.ts +12 -0
- package/dist/cjs/model_providers/fireworks.d.ts.map +1 -0
- package/dist/cjs/model_providers/fireworks.js.map +1 -0
- package/dist/cjs/model_providers/gemini.cjs +136 -5
- package/dist/cjs/model_providers/gemini.d.ts.map +1 -1
- package/dist/cjs/model_providers/gemini.js.map +1 -1
- package/dist/cjs/model_providers/ideogram.cjs +136 -0
- package/dist/cjs/model_providers/ideogram.d.ts +9 -0
- package/dist/cjs/model_providers/ideogram.d.ts.map +1 -0
- package/dist/cjs/model_providers/ideogram.js.map +1 -0
- package/dist/cjs/model_providers/luma.cjs +150 -0
- package/dist/cjs/model_providers/luma.d.ts +9 -0
- package/dist/cjs/model_providers/luma.d.ts.map +1 -0
- package/dist/cjs/model_providers/luma.js.map +1 -0
- package/dist/cjs/model_providers/midjourney.cjs +134 -0
- package/dist/cjs/model_providers/midjourney.d.ts +9 -0
- package/dist/cjs/model_providers/midjourney.d.ts.map +1 -0
- package/dist/cjs/model_providers/midjourney.js.map +1 -0
- package/dist/cjs/model_providers/model_provider.cjs +60 -0
- package/dist/cjs/model_providers/model_provider.d.ts.map +1 -1
- package/dist/cjs/model_providers/model_provider.js.map +1 -1
- package/dist/cjs/model_providers/openai.cjs +24 -14
- package/dist/cjs/model_providers/openai.d.ts.map +1 -1
- package/dist/cjs/model_providers/openai.js.map +1 -1
- package/dist/cjs/model_providers/runway.cjs +145 -0
- package/dist/cjs/model_providers/runway.d.ts +9 -0
- package/dist/cjs/model_providers/runway.d.ts.map +1 -0
- package/dist/cjs/model_providers/runway.js.map +1 -0
- package/dist/cjs/model_providers/stability.cjs +130 -0
- package/dist/cjs/model_providers/stability.d.ts +10 -0
- package/dist/cjs/model_providers/stability.d.ts.map +1 -0
- package/dist/cjs/model_providers/stability.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types/types.d.ts +11 -3
- package/dist/cjs/types/types.d.ts.map +1 -1
- package/dist/cjs/utils/cost_tracker.cjs +3 -0
- package/dist/cjs/utils/cost_tracker.d.ts +1 -0
- package/dist/cjs/utils/cost_tracker.d.ts.map +1 -1
- package/dist/cjs/utils/cost_tracker.js.map +1 -1
- package/dist/cjs/utils/ensemble_result.d.ts +1 -1
- package/dist/cjs/utils/ensemble_result.d.ts.map +1 -1
- package/dist/cjs/utils/fetch_with_timeout.cjs +28 -0
- package/dist/cjs/utils/fetch_with_timeout.d.ts +2 -0
- package/dist/cjs/utils/fetch_with_timeout.d.ts.map +1 -0
- package/dist/cjs/utils/fetch_with_timeout.js.map +1 -0
- package/dist/cjs/utils/image_utils.cjs +23 -0
- package/dist/cjs/utils/image_utils.d.ts +5 -0
- package/dist/cjs/utils/image_utils.d.ts.map +1 -1
- package/dist/cjs/utils/image_utils.js.map +1 -1
- package/dist/core/ensemble_image.d.ts +2 -2
- package/dist/core/ensemble_image.d.ts.map +1 -1
- package/dist/core/ensemble_image.js +59 -6
- package/dist/core/ensemble_image.js.map +1 -1
- package/dist/data/model_data.d.ts.map +1 -1
- package/dist/data/model_data.js +185 -1
- package/dist/data/model_data.js.map +1 -1
- package/dist/model_providers/bytedance.d.ts +9 -0
- package/dist/model_providers/bytedance.d.ts.map +1 -0
- package/dist/model_providers/bytedance.js +198 -0
- package/dist/model_providers/bytedance.js.map +1 -0
- package/dist/model_providers/fal.d.ts +10 -0
- package/dist/model_providers/fal.d.ts.map +1 -0
- package/dist/model_providers/fal.js +93 -0
- package/dist/model_providers/fal.js.map +1 -0
- package/dist/model_providers/fireworks.d.ts +12 -0
- package/dist/model_providers/fireworks.d.ts.map +1 -0
- package/dist/model_providers/fireworks.js +189 -0
- package/dist/model_providers/fireworks.js.map +1 -0
- package/dist/model_providers/gemini.d.ts.map +1 -1
- package/dist/model_providers/gemini.js +136 -5
- package/dist/model_providers/gemini.js.map +1 -1
- package/dist/model_providers/ideogram.d.ts +9 -0
- package/dist/model_providers/ideogram.d.ts.map +1 -0
- package/dist/model_providers/ideogram.js +132 -0
- package/dist/model_providers/ideogram.js.map +1 -0
- package/dist/model_providers/luma.d.ts +9 -0
- package/dist/model_providers/luma.d.ts.map +1 -0
- package/dist/model_providers/luma.js +146 -0
- package/dist/model_providers/luma.js.map +1 -0
- package/dist/model_providers/midjourney.d.ts +9 -0
- package/dist/model_providers/midjourney.d.ts.map +1 -0
- package/dist/model_providers/midjourney.js +130 -0
- package/dist/model_providers/midjourney.js.map +1 -0
- package/dist/model_providers/model_provider.d.ts.map +1 -1
- package/dist/model_providers/model_provider.js +60 -0
- package/dist/model_providers/model_provider.js.map +1 -1
- package/dist/model_providers/openai.d.ts.map +1 -1
- package/dist/model_providers/openai.js +24 -14
- package/dist/model_providers/openai.js.map +1 -1
- package/dist/model_providers/runway.d.ts +9 -0
- package/dist/model_providers/runway.d.ts.map +1 -0
- package/dist/model_providers/runway.js +141 -0
- package/dist/model_providers/runway.js.map +1 -0
- package/dist/model_providers/stability.d.ts +10 -0
- package/dist/model_providers/stability.d.ts.map +1 -0
- package/dist/model_providers/stability.js +126 -0
- package/dist/model_providers/stability.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/types.d.ts +11 -3
- package/dist/types/types.d.ts.map +1 -1
- package/dist/utils/cost_tracker.d.ts +1 -0
- package/dist/utils/cost_tracker.d.ts.map +1 -1
- package/dist/utils/cost_tracker.js +3 -0
- package/dist/utils/cost_tracker.js.map +1 -1
- package/dist/utils/ensemble_result.d.ts +1 -1
- package/dist/utils/ensemble_result.d.ts.map +1 -1
- package/dist/utils/fetch_with_timeout.d.ts +2 -0
- package/dist/utils/fetch_with_timeout.d.ts.map +1 -0
- package/dist/utils/fetch_with_timeout.js +25 -0
- package/dist/utils/fetch_with_timeout.js.map +1 -0
- package/dist/utils/image_utils.d.ts +5 -0
- package/dist/utils/image_utils.d.ts.map +1 -1
- package/dist/utils/image_utils.js +22 -0
- package/dist/utils/image_utils.js.map +1 -1
- package/package.json +121 -114
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { BaseModelProvider } from './base_provider.js';
|
|
2
|
+
import { costTracker } from '../utils/cost_tracker.js';
|
|
3
|
+
import { log_llm_error, log_llm_request, log_llm_response } from '../utils/llm_logger.js';
|
|
4
|
+
function mapImageSize(size) {
|
|
5
|
+
if (!size)
|
|
6
|
+
return undefined;
|
|
7
|
+
const s = String(size);
|
|
8
|
+
if (s === 'square')
|
|
9
|
+
return 'square_hd';
|
|
10
|
+
if (s === '1024x1024')
|
|
11
|
+
return 'square_hd';
|
|
12
|
+
if (s === 'landscape' || s === '1792x1024' || s === '1536x1024')
|
|
13
|
+
return 'landscape_16_9';
|
|
14
|
+
if (s === 'portrait' || s === '1024x1792' || s === '1024x1536')
|
|
15
|
+
return 'portrait_16_9';
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
export class FALProvider extends BaseModelProvider {
|
|
19
|
+
constructor() {
|
|
20
|
+
super('fal');
|
|
21
|
+
}
|
|
22
|
+
async *createResponseStream() {
|
|
23
|
+
throw new Error('FAL provider does not support text streaming');
|
|
24
|
+
}
|
|
25
|
+
endpointFor(model) {
|
|
26
|
+
const m = model.toLowerCase();
|
|
27
|
+
if (m.startsWith('recraft'))
|
|
28
|
+
return { path: 'fal-ai/recraft/v3/text-to-image', bodyMode: 'top' };
|
|
29
|
+
if (m.includes('runway') || m.includes('gen4'))
|
|
30
|
+
return { path: 'runwayml/gen4-image', bodyMode: 'input' };
|
|
31
|
+
if (m.includes('schnell'))
|
|
32
|
+
return { path: 'fal-ai/flux/schnell', bodyMode: 'top' };
|
|
33
|
+
if (m.includes('dev'))
|
|
34
|
+
return { path: 'fal-ai/flux/dev', bodyMode: 'top' };
|
|
35
|
+
if (m.includes('kontext') || m.includes('pro'))
|
|
36
|
+
return { path: 'fal-ai/flux-pro/kontext', bodyMode: 'top' };
|
|
37
|
+
return { path: 'fal-ai/flux/schnell', bodyMode: 'top' };
|
|
38
|
+
}
|
|
39
|
+
async createImage(prompt, model, agent, opts = {}) {
|
|
40
|
+
const falKey = process.env.FAL_KEY;
|
|
41
|
+
const requestId = log_llm_request(agent.agent_id || 'default', 'fal', model, { prompt, opts }, new Date());
|
|
42
|
+
try {
|
|
43
|
+
if (!falKey)
|
|
44
|
+
throw new Error('FAL_KEY is not set');
|
|
45
|
+
const { path, bodyMode } = this.endpointFor(model);
|
|
46
|
+
const size = mapImageSize(opts.size);
|
|
47
|
+
const bodyInput = bodyMode === 'top' ? { prompt } : { input: { prompt } };
|
|
48
|
+
if (size) {
|
|
49
|
+
if (bodyMode === 'top')
|
|
50
|
+
bodyInput.image_size = size;
|
|
51
|
+
else
|
|
52
|
+
bodyInput.input.image_size = size;
|
|
53
|
+
}
|
|
54
|
+
if (opts?.response_format === 'b64_json') {
|
|
55
|
+
if (bodyMode === 'top')
|
|
56
|
+
bodyInput.sync_mode = true;
|
|
57
|
+
else
|
|
58
|
+
bodyInput.input.sync_mode = true;
|
|
59
|
+
}
|
|
60
|
+
const res = await fetch(`https://fal.run/${path}`, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers: {
|
|
63
|
+
'Content-Type': 'application/json',
|
|
64
|
+
Authorization: `Key ${falKey}`,
|
|
65
|
+
},
|
|
66
|
+
body: JSON.stringify(bodyInput),
|
|
67
|
+
});
|
|
68
|
+
if (!res.ok)
|
|
69
|
+
throw new Error(`FAL request failed: ${res.status} ${await res.text()}`);
|
|
70
|
+
const data = await res.json();
|
|
71
|
+
const images = [];
|
|
72
|
+
const arr = data?.images || data?.output?.images || [];
|
|
73
|
+
for (const im of arr)
|
|
74
|
+
if (im?.url)
|
|
75
|
+
images.push(im.url);
|
|
76
|
+
if (!images.length && data?.url)
|
|
77
|
+
images.push(data.url);
|
|
78
|
+
if (!images.length)
|
|
79
|
+
throw new Error('FAL: no image url in response');
|
|
80
|
+
costTracker.addUsage({ model, image_count: images.length, request_id: opts?.request_id, metadata: { source: 'fal' } });
|
|
81
|
+
return images;
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
log_llm_error(requestId, err);
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
log_llm_response(requestId, { ok: true });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export const falProvider = new FALProvider();
|
|
93
|
+
//# sourceMappingURL=fal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fal.js","sourceRoot":"","sources":["../../model_providers/fal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseModelProvider } from './base_provider.js';
|
|
2
|
+
import type { AgentDefinition, ImageGenerationOpts, ProviderStreamEvent } from '../types/types.js';
|
|
3
|
+
export declare class FireworksProvider extends BaseModelProvider {
|
|
4
|
+
constructor();
|
|
5
|
+
createResponseStream(): AsyncGenerator<ProviderStreamEvent>;
|
|
6
|
+
private isKontext;
|
|
7
|
+
private fireworksModelId;
|
|
8
|
+
createImage(prompt: string, model: string, agent: AgentDefinition, opts?: ImageGenerationOpts): Promise<string[]>;
|
|
9
|
+
private fallbackToFAL;
|
|
10
|
+
}
|
|
11
|
+
export declare const fireworksProvider: FireworksProvider;
|
|
12
|
+
//# sourceMappingURL=fireworks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fireworks.d.ts","sourceRoot":"","sources":["../../model_providers/fireworks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAoBnG,qBAAa,iBAAkB,SAAQ,iBAAiB;;IAK7C,oBAAoB,IAAI,cAAc,CAAC,mBAAmB,CAAC;IAIlE,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,gBAAgB;IAUlB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAgH7G,aAAa;CA8B9B;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM1F,MAAM,OAAO,GAAG,0BAA0B,CAAC;AAE3C,SAAS,SAAS,CAAC,IAAkC;IACjD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5F,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC;IAC/E,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC;IAC9E,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,OAAO,iBAAkB,SAAQ,iBAAiB;IACpD;QACI,KAAK,CAAC,WAAkB,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,CAAC,oBAAoB;QACvB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC1E,CAAC;IAEO,SAAS,CAAC,KAAa;QAC3B,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,KAAa;QAElC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,kBAAkB,CAAC;QAC1E,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,kBAAkB,CAAC;QACrD,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,cAAc,CAAC;QAC7C,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,cAAc,CAAC;QACjD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,KAAa,EAAE,KAAsB,EAAE,OAA4B,EAAE;QACnG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACnC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAEjH,IAAI,CAAC;YACD,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAE7D,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAE7C,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAE1B,MAAM,SAAS,GAAG,GAAG,OAAO,qDAAqD,OAAO,EAAE,CAAC;gBAE3F,IAAI,WAA+B,CAAC;gBACpC,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;oBACtB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,aAAqB,CAAC;oBAClG,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;oBACnD,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,WAAW,GAAG,CAAC,CAAC;gBAC/C,CAAC;gBAED,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE;oBAC1C,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACL,cAAc,EAAE,kBAAkB;wBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;qBACpC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;iBAC9H,EAAE,KAAK,CAAC,CAAC;gBAEV,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBAEV,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;wBACvD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;oBACrD,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1F,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAGlE,MAAM,OAAO,GAAG,GAAG,OAAO,qDAAqD,OAAO,aAAa,CAAC;gBACpG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,MAAM,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;oBACV,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE;wBACtC,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE;4BACL,cAAc,EAAE,kBAAkB;4BAClC,aAAa,EAAE,UAAU,MAAM,EAAE;yBACpC;wBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;qBAC/B,EAAE,KAAK,CAAC,CAAC;oBACV,IAAI,CAAC,CAAC,CAAC,EAAE;wBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC3F,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;oBACtD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;wBAE/E,MAAM,IAAI,GAAa,EAAE,CAAC;wBAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;4BACpC,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM;gCAAE,IAAI,EAAE,EAAE,GAAG;oCAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;wBACvE,CAAC;wBACD,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG;4BAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC5D,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG;4BAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC/C,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM;4BAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBAErD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;4BAC3C,IAAI,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;wBAClE,CAAC;wBACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;4BACpF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAC1B,CAAC;wBACD,IAAI,CAAC,IAAI,CAAC,MAAM;4BAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;wBAE9E,WAAW,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;wBAC3I,OAAO,IAAI,CAAC;oBAChB,CAAC;oBACD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACxD,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;oBAC3D,CAAC;oBACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;oBACrF,MAAM,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBAClD,CAAC;YACL,CAAC;YAGD,IAAI,CAAC;gBACD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,MAAM;oBAAE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC3D,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAE9B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;oBAC3D,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC3D,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;gBAEb,CAAC;YACL,CAAC;YACD,MAAM,GAAG,CAAC;QACd,CAAC;gBAAS,CAAC;YACP,gBAAgB,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,KAAa,EAAE,OAA4B,EAAE;QAErF,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,QAAQ,GAAG,qBAAqB,CAAC;aAC3D,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,QAAQ,GAAG,iBAAiB,CAAC;aACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,QAAQ,GAAG,yBAAyB,CAAC;;YAC7F,QAAQ,GAAG,qBAAqB,CAAC;QAEtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mBAAmB,QAAQ,EAAE,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;aAC9C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB,MAAM;gBACN,KAAK,EAAE,EAAE,MAAM,EAAE;aACpB,CAAC;SACL,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;QACvD,KAAK,MAAM,EAAE,IAAI,GAAG;YAAE,IAAI,EAAE,EAAE,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClE,WAAW,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAChI,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
|
|
@@ -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;
|
|
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;IAkPpB,OAAO,CAAC,YAAY;IAwBd,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"}
|
|
@@ -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 || '
|
|
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')) {
|
|
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,9 @@ 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
|
+
}
|
|
840
971
|
if (model.includes('imagen-3')) {
|
|
841
972
|
return 0.04;
|
|
842
973
|
}
|