@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
package/README.md CHANGED
@@ -34,6 +34,14 @@ See the [demo README](demo/README.md) for detailed information about each demo.
34
34
  - 📊 **Cost & Quota Tracking** - Built-in usage monitoring and cost calculation
35
35
  - 🎯 **Smart Result Processing** - Automatic summarization and truncation for long outputs
36
36
 
37
+ ## Model Updates (Nov 2025)
38
+ - OpenAI: GPT-5.1 (base + Codex, Codex-Mini, Codex-Max*), GPT-5/4.1/4o lines retained
39
+ - Anthropic: Claude 4.5 (Sonnet/Haiku, incl. 1M context) and Claude Opus 4.1
40
+ - Google: Gemini 3 (Pro/Flash/Ultra) and refreshed Gemini 2.5 pricing incl. image/TTS/native-audio
41
+ - xAI: Grok 4.1 Fast and Grok 4 Fast with tiered pricing; updated Grok 4/3/mini variants
42
+
43
+ *Codex-Max pricing reflects current published rates and may change when OpenAI finalizes API pricing.
44
+
37
45
  ## Installation
38
46
 
39
47
  ```bash
@@ -218,6 +226,16 @@ for await (const event of ensembleVoice('Long text...', {
218
226
  **Supported Voice Models:**
219
227
  - OpenAI: `tts-1`, `tts-1-hd`
220
228
  - Google Gemini: `gemini-2.5-flash-preview-tts`, `gemini-2.5-pro-preview-tts`
229
+
230
+ ### Image generation
231
+
232
+ Use OpenAI GPT-Image-1 or Google Gemini 2.5 Flash Image (Preview):
233
+
234
+ ```ts
235
+ import { ensembleImage } from '@just-every/ensemble';
236
+
237
+ const images = await ensembleImage('A serene lake at dawn', { model: 'gemini-2.5-flash-image-preview' }, { size: 'portrait' });
238
+ ```
221
239
  - ElevenLabs: `eleven_multilingual_v2`, `eleven_turbo_v2_5`
222
240
 
223
241
  ## Development
@@ -239,6 +257,32 @@ npm run docs
239
257
  npm run lint
240
258
  ```
241
259
 
260
+ Additional image providers
261
+
262
+ New providers added
263
+ - Fireworks AI (FLUX family: Kontext/Pro/Schnell) – async APIs with result polling. Docs: Fireworks Image API.
264
+ - Stability AI (Stable Image Ultra/SDXL) – REST v2beta endpoints supporting text-to-image and image-to-image.
265
+ - Runway Gen-4 Image – via FAL.ai.
266
+ - Recraft v3 – via FAL.ai (supports text-to-vector and vector-style outputs).
267
+
268
+ Environment
269
+ ```
270
+ FIREWORKS_API_KEY=your_key
271
+ STABILITY_API_KEY=your_key
272
+ FAL_KEY=your_key
273
+ ```
274
+
275
+ Fallbacks
276
+ - If Fireworks returns 401/403 or is not configured, requests for Flux-family models automatically fall back to FAL.ai equivalents when `FAL_KEY` is set.
277
+
278
+ - Luma Photon (official): set `LUMA_API_KEY` and use `luma-photon-1` or `luma-photon-flash-1`.
279
+ - Ideogram 3.0 (official): set `IDEOGRAM_API_KEY` and use `ideogram-3.0`.
280
+ - Midjourney v7 (3rd-party): set `MIDJOURNEY_API_KEY` (or `KIE_API_KEY`) and optional `MJ_API_BASE`; use `midjourney-v7`.
281
+
282
+ Notes
283
+ - Gemini Flash Image does not expose hard size/AR controls; we add soft prompt hints and return the image unchanged.
284
+ - Luma Photon and Ideogram return URLs; we pass them through without altering pixels.
285
+
242
286
  ## Architecture
243
287
 
244
288
  Ensemble provides a unified interface across multiple LLM providers:
@@ -277,4 +321,4 @@ Contributions are welcome! Please:
277
321
 
278
322
  ## License
279
323
 
280
- MIT
324
+ MIT
@@ -1,13 +1,99 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.ensembleImage = ensembleImage;
37
+ const node_crypto_1 = require("node:crypto");
4
38
  const model_provider_js_1 = require("../model_providers/model_provider.cjs");
5
- async function ensembleImage(prompt, agent, options = {}) {
6
- const model = await (0, model_provider_js_1.getModelFromAgent)(agent, 'image_generation');
7
- const provider = (0, model_provider_js_1.getModelProvider)(model);
8
- if (!provider.createImage) {
9
- throw new Error(`Provider for model ${model} does not support image generation`);
39
+ function ensembleImage(prompt, agent, options = {}) {
40
+ const run = async () => {
41
+ const model = await (0, model_provider_js_1.getModelFromAgent)(agent, 'image_generation');
42
+ const provider = (0, model_provider_js_1.getModelProvider)(model);
43
+ if (!provider.createImage)
44
+ throw new Error(`Provider for model ${model} does not support image generation`);
45
+ return provider.createImage(prompt, model, agent, options);
46
+ };
47
+ if (!options.stream) {
48
+ return run();
10
49
  }
11
- return provider.createImage(prompt, model, agent, options);
50
+ const self = async function* () {
51
+ const request_id = options.request_id || (0, node_crypto_1.randomUUID)();
52
+ options = { ...options, request_id };
53
+ const { costTracker } = await Promise.resolve().then(() => __importStar(require("../utils/cost_tracker.cjs")));
54
+ yield { type: 'image_start', request_id, timestamp: new Date().toISOString() };
55
+ const handler = (usage) => {
56
+ if (usage?.request_id === request_id) {
57
+ const ev = { type: 'cost_update', usage, request_id, timestamp: new Date().toISOString() };
58
+ iterator.push(ev);
59
+ }
60
+ };
61
+ const iterator = {
62
+ queue: [],
63
+ push(e) { this.queue.push(e); },
64
+ };
65
+ costTracker.onAddUsage(handler);
66
+ try {
67
+ const images = await run();
68
+ while (iterator.queue.length)
69
+ yield iterator.queue.shift();
70
+ let idx = 0;
71
+ for (const img of images) {
72
+ const isUrl = typeof img === 'string' && /^https?:\/\//i.test(img);
73
+ const ev = {
74
+ type: 'file_complete',
75
+ request_id,
76
+ message_id: `${request_id}_img_${idx}`,
77
+ data_format: isUrl ? 'url' : 'base64',
78
+ data: img,
79
+ timestamp: new Date().toISOString(),
80
+ };
81
+ yield ev;
82
+ while (iterator.queue.length)
83
+ yield iterator.queue.shift();
84
+ idx++;
85
+ }
86
+ yield { type: 'image_complete', request_id, timestamp: new Date().toISOString() };
87
+ while (iterator.queue.length)
88
+ yield iterator.queue.shift();
89
+ }
90
+ catch (error) {
91
+ yield { type: 'error', request_id, error: String(error?.message || error) };
92
+ }
93
+ finally {
94
+ costTracker.offAddUsage(handler);
95
+ }
96
+ };
97
+ return self();
12
98
  }
13
99
  //# sourceMappingURL=ensemble_image.js.map
@@ -1,3 +1,3 @@
1
- import type { AgentDefinition, ImageGenerationOpts } from "../types/types.cjs";
2
- export declare function ensembleImage(prompt: string, agent: AgentDefinition, options?: ImageGenerationOpts): Promise<string[]>;
1
+ import type { AgentDefinition, ImageGenerationOpts, ProviderStreamEvent } from "../types/types.cjs";
2
+ export declare function ensembleImage(prompt: string, agent: AgentDefinition, options?: ImageGenerationOpts): Promise<string[]> | AsyncGenerator<ProviderStreamEvent>;
3
3
  //# sourceMappingURL=ensemble_image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ensemble_image.d.ts","sourceRoot":"","sources":["../../../core/ensemble_image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAwB9E,wBAAsB,aAAa,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB"}
1
+ {"version":3,"file":"ensemble_image.d.ts","sourceRoot":"","sources":["../../../core/ensemble_image.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAwBnG,wBAAgB,aAAa,CACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAwEzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensemble_image.js","sourceRoot":"","sources":["../../../core/ensemble_image.ts"],"names":[],"mappings":";;AAwBA,sCAaC;AApCD,4EAA2F;AAuBpF,KAAK,UAAU,aAAa,CAC/B,MAAc,EACd,KAAsB,EACtB,UAA+B,EAAE;IAEjC,MAAM,KAAK,GAAG,MAAM,IAAA,qCAAiB,EAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAA,oCAAgB,EAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,oCAAoC,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"ensemble_image.js","sourceRoot":"","sources":["../../../core/ensemble_image.ts"],"names":[],"mappings":"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"}