@jini-ai/integrations 0.1.0

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 (191) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +51 -0
  3. package/dist/composio/bounded-data.d.ts +36 -0
  4. package/dist/composio/bounded-data.d.ts.map +1 -0
  5. package/dist/composio/bounded-data.js +181 -0
  6. package/dist/composio/bounded-data.js.map +1 -0
  7. package/dist/composio/catalog.d.ts +147 -0
  8. package/dist/composio/catalog.d.ts.map +1 -0
  9. package/dist/composio/catalog.js +126 -0
  10. package/dist/composio/catalog.js.map +1 -0
  11. package/dist/composio/composio-config.d.ts +42 -0
  12. package/dist/composio/composio-config.d.ts.map +1 -0
  13. package/dist/composio/composio-config.js +145 -0
  14. package/dist/composio/composio-config.js.map +1 -0
  15. package/dist/composio/composio-descriptions.d.ts +16 -0
  16. package/dist/composio/composio-descriptions.d.ts.map +1 -0
  17. package/dist/composio/composio-descriptions.js +766 -0
  18. package/dist/composio/composio-descriptions.js.map +1 -0
  19. package/dist/composio/composio.d.ts +364 -0
  20. package/dist/composio/composio.d.ts.map +1 -0
  21. package/dist/composio/composio.js +1902 -0
  22. package/dist/composio/composio.js.map +1 -0
  23. package/dist/composio/errors.d.ts +15 -0
  24. package/dist/composio/errors.d.ts.map +1 -0
  25. package/dist/composio/errors.js +16 -0
  26. package/dist/composio/errors.js.map +1 -0
  27. package/dist/composio/file-lock.d.ts +13 -0
  28. package/dist/composio/file-lock.d.ts.map +1 -0
  29. package/dist/composio/file-lock.js +92 -0
  30. package/dist/composio/file-lock.js.map +1 -0
  31. package/dist/composio/index.d.ts +18 -0
  32. package/dist/composio/index.d.ts.map +1 -0
  33. package/dist/composio/index.js +7 -0
  34. package/dist/composio/index.js.map +1 -0
  35. package/dist/composio/json-schema.d.ts +93 -0
  36. package/dist/composio/json-schema.d.ts.map +1 -0
  37. package/dist/composio/json-schema.js +498 -0
  38. package/dist/composio/json-schema.js.map +1 -0
  39. package/dist/composio/output-protection.d.ts +32 -0
  40. package/dist/composio/output-protection.d.ts.map +1 -0
  41. package/dist/composio/output-protection.js +105 -0
  42. package/dist/composio/output-protection.js.map +1 -0
  43. package/dist/composio/service.d.ts +181 -0
  44. package/dist/composio/service.d.ts.map +1 -0
  45. package/dist/composio/service.js +758 -0
  46. package/dist/composio/service.js.map +1 -0
  47. package/dist/media-providers/capability-registry.d.ts +28 -0
  48. package/dist/media-providers/capability-registry.d.ts.map +1 -0
  49. package/dist/media-providers/capability-registry.js +27 -0
  50. package/dist/media-providers/capability-registry.js.map +1 -0
  51. package/dist/media-providers/catalog.d.ts +20 -0
  52. package/dist/media-providers/catalog.d.ts.map +1 -0
  53. package/dist/media-providers/catalog.js +20 -0
  54. package/dist/media-providers/catalog.js.map +1 -0
  55. package/dist/media-providers/dispatch/context.d.ts +21 -0
  56. package/dist/media-providers/dispatch/context.d.ts.map +1 -0
  57. package/dist/media-providers/dispatch/context.js +36 -0
  58. package/dist/media-providers/dispatch/context.js.map +1 -0
  59. package/dist/media-providers/dispatch/credentials.d.ts +4 -0
  60. package/dist/media-providers/dispatch/credentials.d.ts.map +1 -0
  61. package/dist/media-providers/dispatch/credentials.js +25 -0
  62. package/dist/media-providers/dispatch/credentials.js.map +1 -0
  63. package/dist/media-providers/dispatch/engine.d.ts +30 -0
  64. package/dist/media-providers/dispatch/engine.d.ts.map +1 -0
  65. package/dist/media-providers/dispatch/engine.js +208 -0
  66. package/dist/media-providers/dispatch/engine.js.map +1 -0
  67. package/dist/media-providers/dispatch/index.d.ts +25 -0
  68. package/dist/media-providers/dispatch/index.d.ts.map +1 -0
  69. package/dist/media-providers/dispatch/index.js +24 -0
  70. package/dist/media-providers/dispatch/index.js.map +1 -0
  71. package/dist/media-providers/dispatch/openai-compatible.d.ts +44 -0
  72. package/dist/media-providers/dispatch/openai-compatible.d.ts.map +1 -0
  73. package/dist/media-providers/dispatch/openai-compatible.js +214 -0
  74. package/dist/media-providers/dispatch/openai-compatible.js.map +1 -0
  75. package/dist/media-providers/dispatch/providers/aihubmix-shared.d.ts +72 -0
  76. package/dist/media-providers/dispatch/providers/aihubmix-shared.d.ts.map +1 -0
  77. package/dist/media-providers/dispatch/providers/aihubmix-shared.js +131 -0
  78. package/dist/media-providers/dispatch/providers/aihubmix-shared.js.map +1 -0
  79. package/dist/media-providers/dispatch/providers/aihubmix.d.ts +4 -0
  80. package/dist/media-providers/dispatch/providers/aihubmix.d.ts.map +1 -0
  81. package/dist/media-providers/dispatch/providers/aihubmix.js +205 -0
  82. package/dist/media-providers/dispatch/providers/aihubmix.js.map +1 -0
  83. package/dist/media-providers/dispatch/providers/custom-image.d.ts +6 -0
  84. package/dist/media-providers/dispatch/providers/custom-image.d.ts.map +1 -0
  85. package/dist/media-providers/dispatch/providers/custom-image.js +94 -0
  86. package/dist/media-providers/dispatch/providers/custom-image.js.map +1 -0
  87. package/dist/media-providers/dispatch/providers/elevenlabs.d.ts +4 -0
  88. package/dist/media-providers/dispatch/providers/elevenlabs.d.ts.map +1 -0
  89. package/dist/media-providers/dispatch/providers/elevenlabs.js +163 -0
  90. package/dist/media-providers/dispatch/providers/elevenlabs.js.map +1 -0
  91. package/dist/media-providers/dispatch/providers/fishaudio.d.ts +3 -0
  92. package/dist/media-providers/dispatch/providers/fishaudio.d.ts.map +1 -0
  93. package/dist/media-providers/dispatch/providers/fishaudio.js +83 -0
  94. package/dist/media-providers/dispatch/providers/fishaudio.js.map +1 -0
  95. package/dist/media-providers/dispatch/providers/grok.d.ts +15 -0
  96. package/dist/media-providers/dispatch/providers/grok.d.ts.map +1 -0
  97. package/dist/media-providers/dispatch/providers/grok.js +150 -0
  98. package/dist/media-providers/dispatch/providers/grok.js.map +1 -0
  99. package/dist/media-providers/dispatch/providers/imagerouter.d.ts +6 -0
  100. package/dist/media-providers/dispatch/providers/imagerouter.d.ts.map +1 -0
  101. package/dist/media-providers/dispatch/providers/imagerouter.js +131 -0
  102. package/dist/media-providers/dispatch/providers/imagerouter.js.map +1 -0
  103. package/dist/media-providers/dispatch/providers/minimax.d.ts +3 -0
  104. package/dist/media-providers/dispatch/providers/minimax.d.ts.map +1 -0
  105. package/dist/media-providers/dispatch/providers/minimax.js +96 -0
  106. package/dist/media-providers/dispatch/providers/minimax.js.map +1 -0
  107. package/dist/media-providers/dispatch/providers/nanobanana.d.ts +3 -0
  108. package/dist/media-providers/dispatch/providers/nanobanana.d.ts.map +1 -0
  109. package/dist/media-providers/dispatch/providers/nanobanana.js +142 -0
  110. package/dist/media-providers/dispatch/providers/nanobanana.js.map +1 -0
  111. package/dist/media-providers/dispatch/providers/openai.d.ts +4 -0
  112. package/dist/media-providers/dispatch/providers/openai.d.ts.map +1 -0
  113. package/dist/media-providers/dispatch/providers/openai.js +231 -0
  114. package/dist/media-providers/dispatch/providers/openai.js.map +1 -0
  115. package/dist/media-providers/dispatch/providers/openrouter.d.ts +13 -0
  116. package/dist/media-providers/dispatch/providers/openrouter.d.ts.map +1 -0
  117. package/dist/media-providers/dispatch/providers/openrouter.js +152 -0
  118. package/dist/media-providers/dispatch/providers/openrouter.js.map +1 -0
  119. package/dist/media-providers/dispatch/providers/senseaudio.d.ts +4 -0
  120. package/dist/media-providers/dispatch/providers/senseaudio.d.ts.map +1 -0
  121. package/dist/media-providers/dispatch/providers/senseaudio.js +190 -0
  122. package/dist/media-providers/dispatch/providers/senseaudio.js.map +1 -0
  123. package/dist/media-providers/dispatch/providers/volcengine.d.ts +3 -0
  124. package/dist/media-providers/dispatch/providers/volcengine.d.ts.map +1 -0
  125. package/dist/media-providers/dispatch/providers/volcengine.js +95 -0
  126. package/dist/media-providers/dispatch/providers/volcengine.js.map +1 -0
  127. package/dist/media-providers/dispatch/response-parsers.d.ts +44 -0
  128. package/dist/media-providers/dispatch/response-parsers.d.ts.map +1 -0
  129. package/dist/media-providers/dispatch/response-parsers.js +103 -0
  130. package/dist/media-providers/dispatch/response-parsers.js.map +1 -0
  131. package/dist/media-providers/dispatch/ssrf-guard.d.ts +51 -0
  132. package/dist/media-providers/dispatch/ssrf-guard.d.ts.map +1 -0
  133. package/dist/media-providers/dispatch/ssrf-guard.js +215 -0
  134. package/dist/media-providers/dispatch/ssrf-guard.js.map +1 -0
  135. package/dist/media-providers/dispatch/stub.d.ts +5 -0
  136. package/dist/media-providers/dispatch/stub.d.ts.map +1 -0
  137. package/dist/media-providers/dispatch/stub.js +98 -0
  138. package/dist/media-providers/dispatch/stub.js.map +1 -0
  139. package/dist/media-providers/dispatch/types.d.ts +133 -0
  140. package/dist/media-providers/dispatch/types.d.ts.map +1 -0
  141. package/dist/media-providers/dispatch/types.js +2 -0
  142. package/dist/media-providers/dispatch/types.js.map +1 -0
  143. package/dist/media-providers/dispatch/vendor-adapter.d.ts +54 -0
  144. package/dist/media-providers/dispatch/vendor-adapter.d.ts.map +1 -0
  145. package/dist/media-providers/dispatch/vendor-adapter.js +68 -0
  146. package/dist/media-providers/dispatch/vendor-adapter.js.map +1 -0
  147. package/dist/media-providers/dispatch/vendor-registry.d.ts +36 -0
  148. package/dist/media-providers/dispatch/vendor-registry.d.ts.map +1 -0
  149. package/dist/media-providers/dispatch/vendor-registry.js +46 -0
  150. package/dist/media-providers/dispatch/vendor-registry.js.map +1 -0
  151. package/dist/media-providers/index.d.ts +22 -0
  152. package/dist/media-providers/index.d.ts.map +1 -0
  153. package/dist/media-providers/index.js +22 -0
  154. package/dist/media-providers/index.js.map +1 -0
  155. package/dist/media-providers/policy.d.ts +49 -0
  156. package/dist/media-providers/policy.d.ts.map +1 -0
  157. package/dist/media-providers/policy.js +39 -0
  158. package/dist/media-providers/policy.js.map +1 -0
  159. package/dist/media-providers/providers.d.ts +33 -0
  160. package/dist/media-providers/providers.d.ts.map +1 -0
  161. package/dist/media-providers/providers.js +200 -0
  162. package/dist/media-providers/providers.js.map +1 -0
  163. package/dist/media-providers/seed.d.ts +14 -0
  164. package/dist/media-providers/seed.d.ts.map +1 -0
  165. package/dist/media-providers/seed.js +109 -0
  166. package/dist/media-providers/seed.js.map +1 -0
  167. package/dist/media-providers/sqlite-task-store.d.ts +29 -0
  168. package/dist/media-providers/sqlite-task-store.d.ts.map +1 -0
  169. package/dist/media-providers/sqlite-task-store.js +234 -0
  170. package/dist/media-providers/sqlite-task-store.js.map +1 -0
  171. package/dist/media-providers/staging.d.ts +29 -0
  172. package/dist/media-providers/staging.d.ts.map +1 -0
  173. package/dist/media-providers/staging.js +141 -0
  174. package/dist/media-providers/staging.js.map +1 -0
  175. package/dist/media-providers/task-store.d.ts +94 -0
  176. package/dist/media-providers/task-store.d.ts.map +1 -0
  177. package/dist/media-providers/task-store.js +160 -0
  178. package/dist/media-providers/task-store.js.map +1 -0
  179. package/dist/media-providers/tokens.d.ts +7 -0
  180. package/dist/media-providers/tokens.d.ts.map +1 -0
  181. package/dist/media-providers/tokens.js +13 -0
  182. package/dist/media-providers/tokens.js.map +1 -0
  183. package/dist/media-providers/types.d.ts +123 -0
  184. package/dist/media-providers/types.d.ts.map +1 -0
  185. package/dist/media-providers/types.js +12 -0
  186. package/dist/media-providers/types.js.map +1 -0
  187. package/dist/media-providers/video-request.d.ts +62 -0
  188. package/dist/media-providers/video-request.d.ts.map +1 -0
  189. package/dist/media-providers/video-request.js +219 -0
  190. package/dist/media-providers/video-request.js.map +1 -0
  191. package/package.json +93 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/media-providers/dispatch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC9H,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAYhK,sEAAsE;AACtE,0EAA0E;AAC1E,wCAAwC;AACxC,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { MediaGenerationRequestInit, MediaSpeechFormat, RenderContext } from './types.js';
2
+ /** OpenAI's recognized `/audio/speech` voice ids — shared by every vendor whose TTS wire shape matches OpenAI's (OpenAI itself, AIHubMix). A requested voice outside this set is treated by callers as free-form speaking-style instructions rather than a voice id (see `openai.ts`'s `renderOpenAISpeech`). */
3
+ export declare const OPENAI_TTS_VOICES: ReadonlySet<string>;
4
+ /** Validates a caller-requested speech format, defaulting to `'mp3'` for anything unrecognized. */
5
+ export declare function resolveSpeechFormat(requested: MediaSpeechFormat | undefined): MediaSpeechFormat;
6
+ /** Truncates a string for inclusion in an error message, appending an ellipsis when truncated. */
7
+ export declare function truncate(s: unknown, n: number): string;
8
+ /** Merges a per-request `requestInit` (e.g. a caller-supplied `dispatcher`) under an explicit `init`, so per-call overrides win. */
9
+ export declare function withRequestInit(ctx: Pick<RenderContext, 'requestInit'>, init?: RequestInit): RequestInit;
10
+ /** Sniffs an image byte buffer's format from its magic bytes (jpg/png/webp), defaulting to `.png`. */
11
+ export declare function sniffImageExt(bytes: Buffer): string;
12
+ export declare const AZURE_DEFAULT_API_VERSION = "2024-02-01";
13
+ /**
14
+ * Heuristic: does this base URL point at an Azure OpenAI deployment rather
15
+ * than the public OpenAI API?
16
+ *
17
+ * true examples
18
+ * https://x.cognitiveservices.azure.com/openai/deployments/gpt-image-2
19
+ * https://x.openai.azure.com/openai/deployments/foo
20
+ * /openai/deployments/foo?api-version=2024-02-01
21
+ * false examples
22
+ * https://api.openai.com/v1
23
+ * http://localhost:8080/v1
24
+ */
25
+ export declare function detectAzureEndpoint(baseUrl: string): boolean;
26
+ /** Rewrites a pathname to end in `/{endpoint}/generations` or (images only) `/images/edits`, preserving any other path prefix. */
27
+ export declare function normalizeOpenAICompatiblePath(pathname: string, endpoint: 'images' | 'videos', mode: 'generations' | 'edits'): string;
28
+ /** Builds the full `/{endpoint}/generations` URL, preserving any user-supplied query string. */
29
+ export declare function buildOpenAICompatibleGenerationUrl(baseUrl: string, endpoint: 'images' | 'videos'): string;
30
+ /** Builds the `/images/generations` URL, appending the default Azure `api-version` when the caller didn't supply one. */
31
+ export declare function buildOpenAIImageUrl(baseUrl: string, isAzure: boolean): string;
32
+ /** Builds the `/images/edits` URL (used when a reference image is present). */
33
+ export declare function buildOpenAIImageEditUrl(baseUrl: string): string;
34
+ /** Builds the `/videos/generations` URL. */
35
+ export declare function buildOpenAIVideoUrl(baseUrl: string): string;
36
+ /** Picks an image `size` string tuned to the model family + requested aspect ratio. */
37
+ export declare function openaiSizeFor(model: string, aspect?: string): string;
38
+ /** Builds the `/audio/speech` URL, appending the default Azure `api-version` when the caller didn't supply one. */
39
+ export declare function buildOpenAISpeechUrl(baseUrl: string, isAzure: boolean): string;
40
+ /** Parses an OpenAI-compatible JSON response, throwing a clear, provider-tagged error on a non-OK status or non-JSON body. */
41
+ export declare function parseOpenAICompatibleJson(resp: Response, providerTag: string): Promise<unknown>;
42
+ /** Extracts generated bytes from an OpenAI-compatible `{ data: [{ b64_json | url }] }` response. */
43
+ export declare function bytesFromOpenAICompatibleData(data: unknown, providerTag: string, requestInit?: MediaGenerationRequestInit): Promise<Buffer>;
44
+ //# sourceMappingURL=openai-compatible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../../src/media-providers/dispatch/openai-compatible.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI/F,iTAAiT;AACjT,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAA6G,CAAC;AAEhK,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,GAAG,SAAS,GAAG,iBAAiB,CAE/F;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,oIAAoI;AACpI,wBAAgB,eAAe,CAC7B,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EACvC,IAAI,GAAE,WAAgB,GACrB,WAAW,CAKb;AAED,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBnD;AAED,eAAO,MAAM,yBAAyB,eAAe,CAAC;AAEtD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAK5D;AAED,kIAAkI;AAClI,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAC7B,IAAI,EAAE,aAAa,GAAG,OAAO,GAC5B,MAAM,CAaR;AAED,gGAAgG;AAChG,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAUzG;AAED,yHAAyH;AACzH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAa7E;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAU/D;AAED,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAkBpE;AAED,mHAAmH;AACnH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAa9E;AAED,8HAA8H;AAC9H,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUrG;AAED,oGAAoG;AACpG,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,0BAA+B,GAC3C,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Shared plumbing for every OpenAI-wire-compatible vendor (OpenAI itself,
3
+ * ImageRouter, custom-image, and — in a later pass — AIHubMix): URL
4
+ * building (including Azure OpenAI deployment detection), response
5
+ * parsing, and byte extraction. Ported near-verbatim from the shared
6
+ * helpers inside Open Design's `apps/daemon/src/media/index.ts` — see
7
+ * `source-map.md`.
8
+ */
9
+ import { FETCH_TIMEOUT_MS, fetchWithTimeout } from '@jini-ai/platform';
10
+ const VALID_SPEECH_FORMATS = new Set(['mp3', 'wav', 'flac', 'aac', 'opus']);
11
+ /** OpenAI's recognized `/audio/speech` voice ids — shared by every vendor whose TTS wire shape matches OpenAI's (OpenAI itself, AIHubMix). A requested voice outside this set is treated by callers as free-form speaking-style instructions rather than a voice id (see `openai.ts`'s `renderOpenAISpeech`). */
12
+ export const OPENAI_TTS_VOICES = new Set(['alloy', 'ash', 'ballad', 'coral', 'echo', 'fable', 'onyx', 'nova', 'sage', 'shimmer', 'verse']);
13
+ /** Validates a caller-requested speech format, defaulting to `'mp3'` for anything unrecognized. */
14
+ export function resolveSpeechFormat(requested) {
15
+ return requested && VALID_SPEECH_FORMATS.has(requested) ? requested : 'mp3';
16
+ }
17
+ /** Truncates a string for inclusion in an error message, appending an ellipsis when truncated. */
18
+ export function truncate(s, n) {
19
+ const v = String(s || '');
20
+ if (v.length <= n)
21
+ return v;
22
+ return v.slice(0, n - 1) + '…';
23
+ }
24
+ /** Merges a per-request `requestInit` (e.g. a caller-supplied `dispatcher`) under an explicit `init`, so per-call overrides win. */
25
+ export function withRequestInit(ctx, init = {}) {
26
+ return {
27
+ ...ctx.requestInit,
28
+ ...init,
29
+ };
30
+ }
31
+ /** Sniffs an image byte buffer's format from its magic bytes (jpg/png/webp), defaulting to `.png`. */
32
+ export function sniffImageExt(bytes) {
33
+ if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {
34
+ return '.jpg';
35
+ }
36
+ if (bytes.length >= 8 && bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {
37
+ return '.png';
38
+ }
39
+ if (bytes.length >= 12 &&
40
+ bytes[0] === 0x52 &&
41
+ bytes[1] === 0x49 &&
42
+ bytes[2] === 0x46 &&
43
+ bytes[3] === 0x46 &&
44
+ bytes[8] === 0x57 &&
45
+ bytes[9] === 0x45 &&
46
+ bytes[10] === 0x42 &&
47
+ bytes[11] === 0x50) {
48
+ return '.webp';
49
+ }
50
+ return '.png';
51
+ }
52
+ export const AZURE_DEFAULT_API_VERSION = '2024-02-01';
53
+ /**
54
+ * Heuristic: does this base URL point at an Azure OpenAI deployment rather
55
+ * than the public OpenAI API?
56
+ *
57
+ * true examples
58
+ * https://x.cognitiveservices.azure.com/openai/deployments/gpt-image-2
59
+ * https://x.openai.azure.com/openai/deployments/foo
60
+ * /openai/deployments/foo?api-version=2024-02-01
61
+ * false examples
62
+ * https://api.openai.com/v1
63
+ * http://localhost:8080/v1
64
+ */
65
+ export function detectAzureEndpoint(baseUrl) {
66
+ if (typeof baseUrl !== 'string' || !baseUrl)
67
+ return false;
68
+ if (/\.azure\.com\b/i.test(baseUrl))
69
+ return true;
70
+ if (/\/openai\/deployments\//i.test(baseUrl))
71
+ return true;
72
+ return false;
73
+ }
74
+ /** Rewrites a pathname to end in `/{endpoint}/generations` or (images only) `/images/edits`, preserving any other path prefix. */
75
+ export function normalizeOpenAICompatiblePath(pathname, endpoint, mode) {
76
+ const strippedPath = pathname.replace(/\/+$/, '');
77
+ const generationsSuffix = `/${endpoint}/generations`;
78
+ const editsSuffix = endpoint === 'images' ? '/images/edits' : null;
79
+ if (strippedPath.endsWith(generationsSuffix)) {
80
+ if (mode === 'generations')
81
+ return strippedPath;
82
+ return endpoint === 'images' ? `${strippedPath.slice(0, -generationsSuffix.length)}${editsSuffix}` : strippedPath;
83
+ }
84
+ if (editsSuffix && strippedPath.endsWith(editsSuffix)) {
85
+ if (mode === 'edits')
86
+ return strippedPath;
87
+ return `${strippedPath.slice(0, -editsSuffix.length)}${generationsSuffix}`;
88
+ }
89
+ return mode === 'edits' && editsSuffix ? `${strippedPath}${editsSuffix}` : `${strippedPath}${generationsSuffix}`;
90
+ }
91
+ /** Builds the full `/{endpoint}/generations` URL, preserving any user-supplied query string. */
92
+ export function buildOpenAICompatibleGenerationUrl(baseUrl, endpoint) {
93
+ let parsed;
94
+ try {
95
+ parsed = new URL(baseUrl);
96
+ }
97
+ catch {
98
+ const stripped = baseUrl.replace(/\/$/, '');
99
+ return normalizeOpenAICompatiblePath(stripped, endpoint, 'generations');
100
+ }
101
+ parsed.pathname = normalizeOpenAICompatiblePath(parsed.pathname, endpoint, 'generations');
102
+ return parsed.toString();
103
+ }
104
+ /** Builds the `/images/generations` URL, appending the default Azure `api-version` when the caller didn't supply one. */
105
+ export function buildOpenAIImageUrl(baseUrl, isAzure) {
106
+ let parsed;
107
+ try {
108
+ parsed = new URL(buildOpenAICompatibleGenerationUrl(baseUrl, 'images'));
109
+ }
110
+ catch {
111
+ // Bad URL — fall back to naive concat so the upstream error is
112
+ // surfaced through the normal HTTP path rather than a parse crash.
113
+ return buildOpenAICompatibleGenerationUrl(baseUrl, 'images');
114
+ }
115
+ if (isAzure && !parsed.searchParams.has('api-version')) {
116
+ parsed.searchParams.set('api-version', AZURE_DEFAULT_API_VERSION);
117
+ }
118
+ return parsed.toString();
119
+ }
120
+ /** Builds the `/images/edits` URL (used when a reference image is present). */
121
+ export function buildOpenAIImageEditUrl(baseUrl) {
122
+ let parsed;
123
+ try {
124
+ parsed = new URL(baseUrl);
125
+ }
126
+ catch {
127
+ const stripped = baseUrl.replace(/\/$/, '');
128
+ return normalizeOpenAICompatiblePath(stripped, 'images', 'edits');
129
+ }
130
+ parsed.pathname = normalizeOpenAICompatiblePath(parsed.pathname, 'images', 'edits');
131
+ return parsed.toString();
132
+ }
133
+ /** Builds the `/videos/generations` URL. */
134
+ export function buildOpenAIVideoUrl(baseUrl) {
135
+ return buildOpenAICompatibleGenerationUrl(baseUrl, 'videos');
136
+ }
137
+ /** Picks an image `size` string tuned to the model family + requested aspect ratio. */
138
+ export function openaiSizeFor(model, aspect) {
139
+ // gpt-image-1.5 / gpt-image-2 accept arbitrary sizes up to 4096; concrete
140
+ // sizes tuned to common aspects are picked so the API never negotiates
141
+ // them down silently.
142
+ if (model.startsWith('gpt-image-')) {
143
+ if (aspect === '16:9')
144
+ return '1792x1024';
145
+ if (aspect === '9:16')
146
+ return '1024x1792';
147
+ if (aspect === '4:3')
148
+ return '1408x1056';
149
+ if (aspect === '3:4')
150
+ return '1056x1408';
151
+ return '1024x1024';
152
+ }
153
+ if (model === 'dall-e-3') {
154
+ if (aspect === '16:9')
155
+ return '1792x1024';
156
+ if (aspect === '9:16')
157
+ return '1024x1792';
158
+ return '1024x1024';
159
+ }
160
+ // dall-e-2 only supports 256/512/1024 squares.
161
+ return '1024x1024';
162
+ }
163
+ /** Builds the `/audio/speech` URL, appending the default Azure `api-version` when the caller didn't supply one. */
164
+ export function buildOpenAISpeechUrl(baseUrl, isAzure) {
165
+ let parsed;
166
+ try {
167
+ parsed = new URL(baseUrl);
168
+ }
169
+ catch {
170
+ const stripped = baseUrl.replace(/\/$/, '');
171
+ return `${stripped}/audio/speech`;
172
+ }
173
+ parsed.pathname = parsed.pathname.replace(/\/+$/, '') + '/audio/speech';
174
+ if (isAzure && !parsed.searchParams.has('api-version')) {
175
+ parsed.searchParams.set('api-version', AZURE_DEFAULT_API_VERSION);
176
+ }
177
+ return parsed.toString();
178
+ }
179
+ /** Parses an OpenAI-compatible JSON response, throwing a clear, provider-tagged error on a non-OK status or non-JSON body. */
180
+ export async function parseOpenAICompatibleJson(resp, providerTag) {
181
+ const text = await resp.text();
182
+ if (!resp.ok) {
183
+ throw new Error(`${providerTag} ${resp.status}: ${truncate(text, 240)}`);
184
+ }
185
+ try {
186
+ return JSON.parse(text);
187
+ }
188
+ catch {
189
+ throw new Error(`${providerTag} non-JSON response: ${truncate(text, 200)}`);
190
+ }
191
+ }
192
+ /** Extracts generated bytes from an OpenAI-compatible `{ data: [{ b64_json | url }] }` response. */
193
+ export async function bytesFromOpenAICompatibleData(data, providerTag, requestInit = {}) {
194
+ const record = data;
195
+ const entry = record && Array.isArray(record.data) ? record.data[0] : undefined;
196
+ if (!entry)
197
+ throw new Error(`${providerTag} response had no data[0]`);
198
+ if (typeof entry.b64_json === 'string' && entry.b64_json) {
199
+ const raw = entry.b64_json.includes(',') ? entry.b64_json.slice(entry.b64_json.indexOf(',') + 1) : entry.b64_json;
200
+ return Buffer.from(raw, 'base64');
201
+ }
202
+ if (typeof entry.url === 'string' && entry.url) {
203
+ // Downloading already-generated bytes from the vendor's CDN, not waiting on generation itself
204
+ // — UPLOAD-class (2min), not GENERATE-class (10min): see FETCH_TIMEOUT_MS's own doc.
205
+ const mediaResp = await fetchWithTimeout(entry.url, requestInit, { timeoutMs: FETCH_TIMEOUT_MS.UPLOAD });
206
+ if (!mediaResp.ok) {
207
+ throw new Error(`${providerTag} media fetch ${mediaResp.status}`);
208
+ }
209
+ const arr = await mediaResp.arrayBuffer();
210
+ return Buffer.from(arr);
211
+ }
212
+ throw new Error(`${providerTag} response had neither b64_json nor url`);
213
+ }
214
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../../src/media-providers/dispatch/openai-compatible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Shared plumbing for the AIHubMix aggregator gateway (an OpenAI-wire-
3
+ * compatible aggregator: one API key fronts OpenAI/Anthropic/Gemini
4
+ * models, routed by model name). Ported near-verbatim from Open Design's
5
+ * `apps/daemon/src/integrations/aihubmix.ts` — see `source-map.md`. Only
6
+ * the pieces `providers/aihubmix.ts`'s image/TTS renderers need are
7
+ * ported; see "Not ported" below for what's deliberately left out.
8
+ *
9
+ * The distinctive AIHubMix detail is the `APP-Code` attribution header — a
10
+ * fixed per-integration code that grants a usage discount (the same
11
+ * mechanism cherry-studio and the dify plugin use) — funneled through
12
+ * `aihubmixHeaders()`/`aihubmixAppCodeHeader()` rather than re-derived at
13
+ * each call site.
14
+ *
15
+ * Simplified from the origin: `aihubmixAppCodeHeader()` (and
16
+ * `aihubmixHeaders()`, which spreads it) dropped the origin's
17
+ * `AIHUBMIX_APP_CODE ? { 'APP-Code': ... } : {}` conditional.
18
+ * `AIHUBMIX_APP_CODE` is a fixed non-empty literal with no configuration
19
+ * surface in either the origin or this port, so the `: {}` branch is
20
+ * provably unreachable through any real call — proven, not assumed, the
21
+ * same way `engine.ts`'s dead-branch removals are — and was simplified to
22
+ * an unconditional header rather than left as an untestable branch or
23
+ * covered with a contrived test that fakes an empty app code.
24
+ *
25
+ * Not ported: `aihubmixVideoSeconds` (video is deferred — see
26
+ * `source-map.md`'s async-polling bucket), `aihubmixCatalogUrl`/
27
+ * `parseAIHubMixCatalog`/`AIHubMixCatalogModel` (a model-catalogue-
28
+ * discovery HTTP call, not part of the render path), and
29
+ * `AIHUBMIX_IMAGE_ASPECT_TO_SIZE` (used by OD's in-chat `generate_image`
30
+ * tool, not the media renderer — which uses `openai-compatible.ts`'s
31
+ * already-ported `openaiSizeFor` instead).
32
+ */
33
+ /** Fixed App Code for this integration (from https://aihubmix.com/appstore) — sent as the `APP-Code` attribution header on every AIHubMix request to grant the integration's usage discount. */
34
+ export declare const AIHUBMIX_APP_CODE = "DMCY9912";
35
+ /** Default base URL assumed when a caller leaves `baseUrl` unset. */
36
+ export declare const AIHUBMIX_DEFAULT_BASE_URL = "https://aihubmix.com/v1";
37
+ /** Outbound header set for an AIHubMix Bearer-authenticated request: `Authorization` plus the `APP-Code` attribution header. */
38
+ export declare function aihubmixHeaders(apiKey: string): Record<string, string>;
39
+ /** The `APP-Code` attribution header on its own (no auth) — for routes that carry their own auth header (e.g. Gemini-native's `x-goog-api-key`), spread alongside it so every AIHubMix request still carries `APP-Code`. */
40
+ export declare function aihubmixAppCodeHeader(): Record<string, string>;
41
+ export type AIHubMixProtocol = 'openai' | 'anthropic' | 'gemini';
42
+ /**
43
+ * Model-name -> upstream-protocol routing (AIHubMix integration guide
44
+ * §4.3). AIHubMix dispatches by model name on its side, but for native
45
+ * fidelity the recommended client pattern is to call each family on its
46
+ * native wire/endpoint rather than the unified OpenAI endpoint.
47
+ */
48
+ export declare function classifyAIHubMixModel(model: string): AIHubMixProtocol;
49
+ /** Origin of the configured AIHubMix base URL, falling back to the canonical AIHubMix host on an unparseable input. */
50
+ export declare function aihubmixOriginFromBase(baseUrl: string): string;
51
+ /** Gemini-native `generateContent` endpoint for an AIHubMix image model. */
52
+ export declare function aihubmixGeminiImageUrl(baseUrl: string, wireModel: string): string;
53
+ export interface AIHubMixGeminiImageRequest {
54
+ readonly baseUrl: string;
55
+ readonly apiKey: string;
56
+ readonly wireModel: string;
57
+ readonly prompt: string;
58
+ /** Gemini aspectRatio string, e.g. "1:1" / "16:9". */
59
+ readonly aspect: string;
60
+ }
61
+ /**
62
+ * Generates an image through AIHubMix's Gemini-native `generateContent`
63
+ * wire and returns the decoded image bytes. Gemini/Imagen-family image
64
+ * models reject the OpenAI `/images/generations` shape ("Unknown name
65
+ * prompt/n/size"), so `providers/aihubmix.ts` routes those models here
66
+ * instead. `doFetch` lets the caller apply its own request-init wrapper
67
+ * (proxy dispatcher, abort signal); throws on a non-OK status or a
68
+ * response without inline image data.
69
+ */
70
+ export declare function aihubmixGeminiImageBytes(req: AIHubMixGeminiImageRequest, doFetch: (url: string, init: RequestInit) => Promise<Response>): Promise<Buffer>;
71
+ export declare function aihubmixWireModel(catalogId: string): string;
72
+ //# sourceMappingURL=aihubmix-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aihubmix-shared.d.ts","sourceRoot":"","sources":["../../../../src/media-providers/dispatch/providers/aihubmix-shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,gMAAgM;AAChM,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C,qEAAqE;AACrE,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AAEnE,gIAAgI;AAChI,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKtE;AAED,4NAA4N;AAC5N,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE9D;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEjE;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CASrE;AAED,uHAAuH;AACvH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B/J;AAcD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Shared plumbing for the AIHubMix aggregator gateway (an OpenAI-wire-
3
+ * compatible aggregator: one API key fronts OpenAI/Anthropic/Gemini
4
+ * models, routed by model name). Ported near-verbatim from Open Design's
5
+ * `apps/daemon/src/integrations/aihubmix.ts` — see `source-map.md`. Only
6
+ * the pieces `providers/aihubmix.ts`'s image/TTS renderers need are
7
+ * ported; see "Not ported" below for what's deliberately left out.
8
+ *
9
+ * The distinctive AIHubMix detail is the `APP-Code` attribution header — a
10
+ * fixed per-integration code that grants a usage discount (the same
11
+ * mechanism cherry-studio and the dify plugin use) — funneled through
12
+ * `aihubmixHeaders()`/`aihubmixAppCodeHeader()` rather than re-derived at
13
+ * each call site.
14
+ *
15
+ * Simplified from the origin: `aihubmixAppCodeHeader()` (and
16
+ * `aihubmixHeaders()`, which spreads it) dropped the origin's
17
+ * `AIHUBMIX_APP_CODE ? { 'APP-Code': ... } : {}` conditional.
18
+ * `AIHUBMIX_APP_CODE` is a fixed non-empty literal with no configuration
19
+ * surface in either the origin or this port, so the `: {}` branch is
20
+ * provably unreachable through any real call — proven, not assumed, the
21
+ * same way `engine.ts`'s dead-branch removals are — and was simplified to
22
+ * an unconditional header rather than left as an untestable branch or
23
+ * covered with a contrived test that fakes an empty app code.
24
+ *
25
+ * Not ported: `aihubmixVideoSeconds` (video is deferred — see
26
+ * `source-map.md`'s async-polling bucket), `aihubmixCatalogUrl`/
27
+ * `parseAIHubMixCatalog`/`AIHubMixCatalogModel` (a model-catalogue-
28
+ * discovery HTTP call, not part of the render path), and
29
+ * `AIHUBMIX_IMAGE_ASPECT_TO_SIZE` (used by OD's in-chat `generate_image`
30
+ * tool, not the media renderer — which uses `openai-compatible.ts`'s
31
+ * already-ported `openaiSizeFor` instead).
32
+ */
33
+ /** Fixed App Code for this integration (from https://aihubmix.com/appstore) — sent as the `APP-Code` attribution header on every AIHubMix request to grant the integration's usage discount. */
34
+ export const AIHUBMIX_APP_CODE = 'DMCY9912';
35
+ /** Default base URL assumed when a caller leaves `baseUrl` unset. */
36
+ export const AIHUBMIX_DEFAULT_BASE_URL = 'https://aihubmix.com/v1';
37
+ /** Outbound header set for an AIHubMix Bearer-authenticated request: `Authorization` plus the `APP-Code` attribution header. */
38
+ export function aihubmixHeaders(apiKey) {
39
+ return {
40
+ authorization: `Bearer ${apiKey}`,
41
+ 'APP-Code': AIHUBMIX_APP_CODE,
42
+ };
43
+ }
44
+ /** The `APP-Code` attribution header on its own (no auth) — for routes that carry their own auth header (e.g. Gemini-native's `x-goog-api-key`), spread alongside it so every AIHubMix request still carries `APP-Code`. */
45
+ export function aihubmixAppCodeHeader() {
46
+ return { 'APP-Code': AIHUBMIX_APP_CODE };
47
+ }
48
+ /**
49
+ * Model-name -> upstream-protocol routing (AIHubMix integration guide
50
+ * §4.3). AIHubMix dispatches by model name on its side, but for native
51
+ * fidelity the recommended client pattern is to call each family on its
52
+ * native wire/endpoint rather than the unified OpenAI endpoint.
53
+ */
54
+ export function classifyAIHubMixModel(model) {
55
+ const m = (model || '').trim().toLowerCase();
56
+ // Gemini: gemini*/imagen*, excluding -nothink/-search suffixes and any
57
+ // embedding model (those stay on the OpenAI-compatible path).
58
+ if ((m.startsWith('gemini') || m.startsWith('imagen')) && !/-(nothink|search)$/.test(m) && !m.includes('embedding')) {
59
+ return 'gemini';
60
+ }
61
+ if (m.startsWith('claude'))
62
+ return 'anthropic';
63
+ return 'openai';
64
+ }
65
+ /** Origin of the configured AIHubMix base URL, falling back to the canonical AIHubMix host on an unparseable input. */
66
+ export function aihubmixOriginFromBase(baseUrl) {
67
+ try {
68
+ return new URL(baseUrl || AIHUBMIX_DEFAULT_BASE_URL).origin;
69
+ }
70
+ catch {
71
+ return 'https://aihubmix.com';
72
+ }
73
+ }
74
+ /** Gemini-native `generateContent` endpoint for an AIHubMix image model. */
75
+ export function aihubmixGeminiImageUrl(baseUrl, wireModel) {
76
+ return `${aihubmixOriginFromBase(baseUrl)}/gemini/v1beta/models/${encodeURIComponent(wireModel)}:generateContent`;
77
+ }
78
+ /**
79
+ * Generates an image through AIHubMix's Gemini-native `generateContent`
80
+ * wire and returns the decoded image bytes. Gemini/Imagen-family image
81
+ * models reject the OpenAI `/images/generations` shape ("Unknown name
82
+ * prompt/n/size"), so `providers/aihubmix.ts` routes those models here
83
+ * instead. `doFetch` lets the caller apply its own request-init wrapper
84
+ * (proxy dispatcher, abort signal); throws on a non-OK status or a
85
+ * response without inline image data.
86
+ */
87
+ export async function aihubmixGeminiImageBytes(req, doFetch) {
88
+ const url = aihubmixGeminiImageUrl(req.baseUrl, req.wireModel);
89
+ const resp = await doFetch(url, {
90
+ method: 'POST',
91
+ redirect: 'error',
92
+ headers: {
93
+ 'content-type': 'application/json',
94
+ 'x-goog-api-key': req.apiKey,
95
+ ...aihubmixAppCodeHeader(),
96
+ },
97
+ body: JSON.stringify({
98
+ contents: [{ role: 'user', parts: [{ text: req.prompt }] }],
99
+ generationConfig: {
100
+ responseModalities: ['TEXT', 'IMAGE'],
101
+ imageConfig: { aspectRatio: req.aspect },
102
+ },
103
+ }),
104
+ });
105
+ if (!resp.ok) {
106
+ const text = await resp.text().catch(() => '');
107
+ throw new Error(`aihubmix image (gemini) ${resp.status}: ${text.slice(0, 240)}`);
108
+ }
109
+ const data = (await resp.json());
110
+ const parts = data.candidates?.[0]?.content?.parts ?? [];
111
+ const b64 = parts.map((p) => p.inlineData?.data ?? p.inline_data?.data).find((d) => typeof d === 'string' && d.length > 0);
112
+ if (!b64) {
113
+ throw new Error(`aihubmix gemini image response had no inline image data: ${JSON.stringify(data).slice(0, 200)}`);
114
+ }
115
+ return Buffer.from(b64, 'base64');
116
+ }
117
+ // Catalogue ids vs wire names. The media registry requires globally-unique
118
+ // model ids, but `gpt-image-1`/`dall-e-3`/`tts-1` are already owned by the
119
+ // `openai` provider, so AIHubMix's models are registered with an
120
+ // `aihubmix-` prefix and mapped back to the real upstream name here. A
121
+ // plain prefix strip is the fallback so adding a new `aihubmix-<wire>`
122
+ // catalogue entry needs no edit here.
123
+ const AIHUBMIX_WIRE_MODELS = {
124
+ 'aihubmix-gpt-image-1': 'gpt-image-1',
125
+ 'aihubmix-dall-e-3': 'dall-e-3',
126
+ 'aihubmix-tts-1': 'tts-1',
127
+ };
128
+ export function aihubmixWireModel(catalogId) {
129
+ return AIHUBMIX_WIRE_MODELS[catalogId] ?? catalogId.replace(/^aihubmix-/, '');
130
+ }
131
+ //# sourceMappingURL=aihubmix-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aihubmix-shared.js","sourceRoot":"","sources":["../../../../src/media-providers/dispatch/providers/aihubmix-shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ProviderCredentials, RenderContext, RenderResult } from '../types.js';
2
+ export declare function renderAIHubMixImage(ctx: RenderContext, credentials: ProviderCredentials): Promise<RenderResult>;
3
+ export declare function renderAIHubMixTTS(ctx: RenderContext, credentials: ProviderCredentials): Promise<RenderResult>;
4
+ //# sourceMappingURL=aihubmix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aihubmix.d.ts","sourceRoot":"","sources":["../../../../src/media-providers/dispatch/providers/aihubmix.ts"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0HvG,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAErH;AAyCD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAEnH"}