@just-every/ensemble 0.2.226 → 0.2.228
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 +4 -1
- package/dist/cjs/data/model_data.cjs +9 -0
- 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/claude.cjs +4 -6
- package/dist/cjs/model_providers/claude.d.ts.map +1 -1
- package/dist/cjs/model_providers/claude.js.map +1 -1
- package/dist/cjs/model_providers/fal.cjs +75 -22
- package/dist/cjs/model_providers/fal.d.ts +3 -0
- package/dist/cjs/model_providers/fal.d.ts.map +1 -1
- package/dist/cjs/model_providers/fal.js.map +1 -1
- package/dist/cjs/model_providers/gemini.cjs +20 -21
- 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/openai.cjs +21 -53
- 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/openai_chat.cjs +21 -52
- package/dist/cjs/model_providers/openai_chat.d.ts.map +1 -1
- package/dist/cjs/model_providers/openai_chat.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types/api_types.d.ts +1 -1
- package/dist/cjs/types/api_types.d.ts.map +1 -1
- package/dist/cjs/types/types.d.ts +4 -2
- package/dist/cjs/types/types.d.ts.map +1 -1
- package/dist/cjs/utils/image_detail.cjs +77 -0
- package/dist/cjs/utils/image_detail.d.ts +12 -0
- package/dist/cjs/utils/image_detail.d.ts.map +1 -0
- package/dist/cjs/utils/image_detail.js.map +1 -0
- package/dist/cjs/utils/image_utils.cjs +0 -219
- package/dist/cjs/utils/image_utils.d.ts +0 -16
- package/dist/cjs/utils/image_utils.d.ts.map +1 -1
- package/dist/cjs/utils/image_utils.js.map +1 -1
- package/dist/data/model_data.d.ts.map +1 -1
- package/dist/data/model_data.js +9 -0
- package/dist/data/model_data.js.map +1 -1
- package/dist/model_providers/claude.d.ts.map +1 -1
- package/dist/model_providers/claude.js +5 -7
- package/dist/model_providers/claude.js.map +1 -1
- package/dist/model_providers/fal.d.ts +3 -0
- package/dist/model_providers/fal.d.ts.map +1 -1
- package/dist/model_providers/fal.js +75 -22
- package/dist/model_providers/fal.js.map +1 -1
- package/dist/model_providers/gemini.d.ts.map +1 -1
- package/dist/model_providers/gemini.js +21 -22
- package/dist/model_providers/gemini.js.map +1 -1
- package/dist/model_providers/openai.d.ts.map +1 -1
- package/dist/model_providers/openai.js +22 -54
- package/dist/model_providers/openai.js.map +1 -1
- package/dist/model_providers/openai_chat.d.ts.map +1 -1
- package/dist/model_providers/openai_chat.js +22 -53
- package/dist/model_providers/openai_chat.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/api_types.d.ts +1 -1
- package/dist/types/api_types.d.ts.map +1 -1
- package/dist/types/types.d.ts +4 -2
- package/dist/types/types.d.ts.map +1 -1
- package/dist/utils/image_detail.d.ts +12 -0
- package/dist/utils/image_detail.d.ts.map +1 -0
- package/dist/utils/image_detail.js +69 -0
- package/dist/utils/image_detail.js.map +1 -0
- package/dist/utils/image_utils.d.ts +0 -16
- package/dist/utils/image_utils.d.ts.map +1 -1
- package/dist/utils/image_utils.js +0 -181
- package/dist/utils/image_utils.js.map +1 -1
- package/package.json +2 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseModelProvider } from './base_provider.js';
|
|
2
2
|
import { costTracker } from '../utils/cost_tracker.js';
|
|
3
|
+
import { normalizeImageDataUrl } from '../utils/image_utils.js';
|
|
3
4
|
import { log_llm_error, log_llm_request, log_llm_response } from '../utils/llm_logger.js';
|
|
4
5
|
function mapImageSize(size) {
|
|
5
6
|
if (!size)
|
|
@@ -24,6 +25,9 @@ export class FALProvider extends BaseModelProvider {
|
|
|
24
25
|
}
|
|
25
26
|
endpointFor(model) {
|
|
26
27
|
const m = model.toLowerCase();
|
|
28
|
+
if (m === 'fal-ai/ideogram/remove-background' || m === 'ideogram-remove-background') {
|
|
29
|
+
return { path: 'fal-ai/ideogram/remove-background', bodyMode: 'remove-background' };
|
|
30
|
+
}
|
|
27
31
|
if (m.startsWith('recraft'))
|
|
28
32
|
return { path: 'fal-ai/recraft/v3/text-to-image', bodyMode: 'top' };
|
|
29
33
|
if (m.includes('runway') || m.includes('gen4'))
|
|
@@ -36,6 +40,69 @@ export class FALProvider extends BaseModelProvider {
|
|
|
36
40
|
return { path: 'fal-ai/flux-pro/kontext', bodyMode: 'top' };
|
|
37
41
|
return { path: 'fal-ai/flux/schnell', bodyMode: 'top' };
|
|
38
42
|
}
|
|
43
|
+
imageUrlForRemoveBackground(opts) {
|
|
44
|
+
const sourceImages = opts.source_images;
|
|
45
|
+
if (!sourceImages) {
|
|
46
|
+
throw new Error('fal-ai/ideogram/remove-background requires exactly one source image.');
|
|
47
|
+
}
|
|
48
|
+
const rawImages = Array.isArray(sourceImages) ? sourceImages : [sourceImages];
|
|
49
|
+
if (rawImages.length !== 1) {
|
|
50
|
+
throw new Error('fal-ai/ideogram/remove-background supports exactly one source image per request.');
|
|
51
|
+
}
|
|
52
|
+
const rawImage = rawImages[0];
|
|
53
|
+
const normalized = typeof rawImage === 'string'
|
|
54
|
+
? normalizeImageDataUrl({ data: rawImage })
|
|
55
|
+
: normalizeImageDataUrl({ data: rawImage.data });
|
|
56
|
+
const imageUrl = normalized.url || normalized.dataUrl;
|
|
57
|
+
if (!imageUrl ||
|
|
58
|
+
(!imageUrl.startsWith('http://') && !imageUrl.startsWith('https://') && !imageUrl.startsWith('data:image/'))) {
|
|
59
|
+
throw new Error('fal-ai/ideogram/remove-background expects the source image to be a public URL or a data:image/... base64 URI.');
|
|
60
|
+
}
|
|
61
|
+
return imageUrl;
|
|
62
|
+
}
|
|
63
|
+
buildBody(prompt, bodyMode, opts) {
|
|
64
|
+
if (bodyMode === 'remove-background') {
|
|
65
|
+
const body = {
|
|
66
|
+
image_url: this.imageUrlForRemoveBackground(opts),
|
|
67
|
+
};
|
|
68
|
+
if (opts?.response_format === 'b64_json') {
|
|
69
|
+
body.sync_mode = true;
|
|
70
|
+
}
|
|
71
|
+
return body;
|
|
72
|
+
}
|
|
73
|
+
const size = mapImageSize(opts.size);
|
|
74
|
+
const bodyInput = bodyMode === 'top' ? { prompt } : { input: { prompt } };
|
|
75
|
+
if (size) {
|
|
76
|
+
if (bodyMode === 'top')
|
|
77
|
+
bodyInput.image_size = size;
|
|
78
|
+
else
|
|
79
|
+
bodyInput.input.image_size = size;
|
|
80
|
+
}
|
|
81
|
+
if (opts?.response_format === 'b64_json') {
|
|
82
|
+
if (bodyMode === 'top')
|
|
83
|
+
bodyInput.sync_mode = true;
|
|
84
|
+
else
|
|
85
|
+
bodyInput.input.sync_mode = true;
|
|
86
|
+
}
|
|
87
|
+
return bodyInput;
|
|
88
|
+
}
|
|
89
|
+
extractImages(data) {
|
|
90
|
+
const images = [];
|
|
91
|
+
const addImage = (candidate) => {
|
|
92
|
+
if (typeof candidate === 'string' && candidate.length > 0) {
|
|
93
|
+
images.push(candidate);
|
|
94
|
+
}
|
|
95
|
+
else if (candidate?.url) {
|
|
96
|
+
images.push(candidate.url);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const arr = data?.images || data?.output?.images || [];
|
|
100
|
+
for (const im of arr)
|
|
101
|
+
addImage(im);
|
|
102
|
+
addImage(data?.image);
|
|
103
|
+
addImage(data?.url);
|
|
104
|
+
return images;
|
|
105
|
+
}
|
|
39
106
|
async createImage(prompt, model, agent, opts = {}) {
|
|
40
107
|
const falKey = process.env.FAL_KEY;
|
|
41
108
|
const requestId = log_llm_request(agent.agent_id || 'default', 'fal', model, { prompt, opts }, new Date());
|
|
@@ -43,20 +110,7 @@ export class FALProvider extends BaseModelProvider {
|
|
|
43
110
|
if (!falKey)
|
|
44
111
|
throw new Error('FAL_KEY is not set');
|
|
45
112
|
const { path, bodyMode } = this.endpointFor(model);
|
|
46
|
-
const
|
|
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
|
-
}
|
|
113
|
+
const bodyInput = this.buildBody(prompt, bodyMode, opts);
|
|
60
114
|
const res = await fetch(`https://fal.run/${path}`, {
|
|
61
115
|
method: 'POST',
|
|
62
116
|
headers: {
|
|
@@ -68,16 +122,15 @@ export class FALProvider extends BaseModelProvider {
|
|
|
68
122
|
if (!res.ok)
|
|
69
123
|
throw new Error(`FAL request failed: ${res.status} ${await res.text()}`);
|
|
70
124
|
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);
|
|
125
|
+
const images = this.extractImages(data);
|
|
78
126
|
if (!images.length)
|
|
79
127
|
throw new Error('FAL: no image url in response');
|
|
80
|
-
costTracker.addUsage({
|
|
128
|
+
costTracker.addUsage({
|
|
129
|
+
model,
|
|
130
|
+
image_count: images.length,
|
|
131
|
+
request_id: opts?.request_id,
|
|
132
|
+
metadata: { source: 'fal' },
|
|
133
|
+
});
|
|
81
134
|
return images;
|
|
82
135
|
}
|
|
83
136
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fal.js","sourceRoot":"","sources":["../../model_providers/fal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"fal.js","sourceRoot":"","sources":["../../model_providers/fal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../model_providers/gemini.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAGH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EAInB,mBAAmB,EAEnB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EAOd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA6NvD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AAmCD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;
|
|
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;AAyZD,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;IAsgBhC,WAAW,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IAohBpB,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"}
|
|
@@ -4,7 +4,8 @@ import { BaseModelProvider } from './base_provider.js';
|
|
|
4
4
|
import { costTracker } from '../utils/cost_tracker.js';
|
|
5
5
|
import { log_llm_error, log_llm_request, log_llm_response } from '../utils/llm_logger.js';
|
|
6
6
|
import { isPaused } from '../utils/pause_controller.js';
|
|
7
|
-
import { appendMessageWithImage, normalizeImageDataUrl,
|
|
7
|
+
import { appendMessageWithImage, normalizeImageDataUrl, } from '../utils/image_utils.js';
|
|
8
|
+
import { chooseImageDetailFromInput, mapGeminiMediaResolution } from '../utils/image_detail.js';
|
|
8
9
|
import { hasEventHandler } from '../utils/event_controller.js';
|
|
9
10
|
import { truncateLargeValues } from '../utils/truncate_utils.js';
|
|
10
11
|
function convertParameterToGeminiFormat(param) {
|
|
@@ -277,9 +278,8 @@ function mergeImageMetadata(target, source) {
|
|
|
277
278
|
}
|
|
278
279
|
async function addImagesToInput(input, images, source) {
|
|
279
280
|
for (const [image_id, imageData] of Object.entries(images)) {
|
|
280
|
-
const
|
|
281
|
-
const
|
|
282
|
-
const cleanedImageData = cleanBase64Data(processedImageData);
|
|
281
|
+
const mimeType = getImageMimeType(imageData);
|
|
282
|
+
const cleanedImageData = cleanBase64Data(imageData);
|
|
283
283
|
input.push({
|
|
284
284
|
role: 'user',
|
|
285
285
|
parts: [
|
|
@@ -443,24 +443,12 @@ async function convertToGeminiContents(model, messages) {
|
|
|
443
443
|
if (match) {
|
|
444
444
|
const mimeType = match[1];
|
|
445
445
|
const base64Data = match[2];
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
data: processedMatch[2],
|
|
453
|
-
},
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
else {
|
|
457
|
-
parts.push({
|
|
458
|
-
inlineData: {
|
|
459
|
-
mimeType: mimeType,
|
|
460
|
-
data: base64Data,
|
|
461
|
-
},
|
|
462
|
-
});
|
|
463
|
-
}
|
|
446
|
+
parts.push({
|
|
447
|
+
inlineData: {
|
|
448
|
+
mimeType: mimeType,
|
|
449
|
+
data: base64Data,
|
|
450
|
+
},
|
|
451
|
+
});
|
|
464
452
|
}
|
|
465
453
|
}
|
|
466
454
|
else if (imageUrl.startsWith('http://') || imageUrl.startsWith('https://')) {
|
|
@@ -559,6 +547,10 @@ const GEMINI_3_PRO_IMAGE_DIMENSION_PRESETS = {
|
|
|
559
547
|
'5504x3072': { ar: '16:9', imageSize: '4K' },
|
|
560
548
|
'6336x2688': { ar: '21:9', imageSize: '4K' },
|
|
561
549
|
};
|
|
550
|
+
function toGeminiMediaResolution(detail) {
|
|
551
|
+
const mapped = mapGeminiMediaResolution(detail);
|
|
552
|
+
return mapped ? MediaResolution[mapped] : undefined;
|
|
553
|
+
}
|
|
562
554
|
export class GeminiProvider extends BaseModelProvider {
|
|
563
555
|
_client;
|
|
564
556
|
apiKey;
|
|
@@ -712,6 +704,7 @@ export class GeminiProvider extends BaseModelProvider {
|
|
|
712
704
|
};
|
|
713
705
|
const chunks = [];
|
|
714
706
|
try {
|
|
707
|
+
const requestedImageDetail = chooseImageDetailFromInput(messages);
|
|
715
708
|
const contents = await convertToGeminiContents(model, messages);
|
|
716
709
|
if (contents.length === 0) {
|
|
717
710
|
console.warn('Gemini API Warning: No valid content found in messages after conversion. Adding default message.');
|
|
@@ -796,6 +789,10 @@ export class GeminiProvider extends BaseModelProvider {
|
|
|
796
789
|
if (agent.abortSignal) {
|
|
797
790
|
config.abortSignal = agent.abortSignal;
|
|
798
791
|
}
|
|
792
|
+
const mediaResolution = toGeminiMediaResolution(requestedImageDetail);
|
|
793
|
+
if (mediaResolution) {
|
|
794
|
+
config.mediaResolution = mediaResolution;
|
|
795
|
+
}
|
|
799
796
|
let hasGoogleWebSearch = false;
|
|
800
797
|
let hasCodeExecutionTool = false;
|
|
801
798
|
let functionDeclarations = [];
|
|
@@ -1220,6 +1217,7 @@ export class GeminiProvider extends BaseModelProvider {
|
|
|
1220
1217
|
}
|
|
1221
1218
|
: undefined;
|
|
1222
1219
|
const perImageCost = this.getImageCost(model, imageSize);
|
|
1220
|
+
const sourceImageMediaResolution = toGeminiMediaResolution(opts?.detail);
|
|
1223
1221
|
const makeOne = async () => {
|
|
1224
1222
|
const requestParams = {
|
|
1225
1223
|
model,
|
|
@@ -1279,6 +1277,7 @@ export class GeminiProvider extends BaseModelProvider {
|
|
|
1279
1277
|
config: {
|
|
1280
1278
|
responseModalities: [Modality.IMAGE],
|
|
1281
1279
|
...(Object.keys(imageConfig).length ? { imageConfig } : {}),
|
|
1280
|
+
...(sourceImageMediaResolution ? { mediaResolution: sourceImageMediaResolution } : {}),
|
|
1282
1281
|
...(googleSearchTool ? { tools: [googleSearchTool] } : {}),
|
|
1283
1282
|
...(Object.keys(thinkingConfig).length ? { thinkingConfig: thinkingConfig } : {}),
|
|
1284
1283
|
},
|