@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.
- package/LICENSE +201 -0
- package/README.md +51 -0
- package/dist/composio/bounded-data.d.ts +36 -0
- package/dist/composio/bounded-data.d.ts.map +1 -0
- package/dist/composio/bounded-data.js +181 -0
- package/dist/composio/bounded-data.js.map +1 -0
- package/dist/composio/catalog.d.ts +147 -0
- package/dist/composio/catalog.d.ts.map +1 -0
- package/dist/composio/catalog.js +126 -0
- package/dist/composio/catalog.js.map +1 -0
- package/dist/composio/composio-config.d.ts +42 -0
- package/dist/composio/composio-config.d.ts.map +1 -0
- package/dist/composio/composio-config.js +145 -0
- package/dist/composio/composio-config.js.map +1 -0
- package/dist/composio/composio-descriptions.d.ts +16 -0
- package/dist/composio/composio-descriptions.d.ts.map +1 -0
- package/dist/composio/composio-descriptions.js +766 -0
- package/dist/composio/composio-descriptions.js.map +1 -0
- package/dist/composio/composio.d.ts +364 -0
- package/dist/composio/composio.d.ts.map +1 -0
- package/dist/composio/composio.js +1902 -0
- package/dist/composio/composio.js.map +1 -0
- package/dist/composio/errors.d.ts +15 -0
- package/dist/composio/errors.d.ts.map +1 -0
- package/dist/composio/errors.js +16 -0
- package/dist/composio/errors.js.map +1 -0
- package/dist/composio/file-lock.d.ts +13 -0
- package/dist/composio/file-lock.d.ts.map +1 -0
- package/dist/composio/file-lock.js +92 -0
- package/dist/composio/file-lock.js.map +1 -0
- package/dist/composio/index.d.ts +18 -0
- package/dist/composio/index.d.ts.map +1 -0
- package/dist/composio/index.js +7 -0
- package/dist/composio/index.js.map +1 -0
- package/dist/composio/json-schema.d.ts +93 -0
- package/dist/composio/json-schema.d.ts.map +1 -0
- package/dist/composio/json-schema.js +498 -0
- package/dist/composio/json-schema.js.map +1 -0
- package/dist/composio/output-protection.d.ts +32 -0
- package/dist/composio/output-protection.d.ts.map +1 -0
- package/dist/composio/output-protection.js +105 -0
- package/dist/composio/output-protection.js.map +1 -0
- package/dist/composio/service.d.ts +181 -0
- package/dist/composio/service.d.ts.map +1 -0
- package/dist/composio/service.js +758 -0
- package/dist/composio/service.js.map +1 -0
- package/dist/media-providers/capability-registry.d.ts +28 -0
- package/dist/media-providers/capability-registry.d.ts.map +1 -0
- package/dist/media-providers/capability-registry.js +27 -0
- package/dist/media-providers/capability-registry.js.map +1 -0
- package/dist/media-providers/catalog.d.ts +20 -0
- package/dist/media-providers/catalog.d.ts.map +1 -0
- package/dist/media-providers/catalog.js +20 -0
- package/dist/media-providers/catalog.js.map +1 -0
- package/dist/media-providers/dispatch/context.d.ts +21 -0
- package/dist/media-providers/dispatch/context.d.ts.map +1 -0
- package/dist/media-providers/dispatch/context.js +36 -0
- package/dist/media-providers/dispatch/context.js.map +1 -0
- package/dist/media-providers/dispatch/credentials.d.ts +4 -0
- package/dist/media-providers/dispatch/credentials.d.ts.map +1 -0
- package/dist/media-providers/dispatch/credentials.js +25 -0
- package/dist/media-providers/dispatch/credentials.js.map +1 -0
- package/dist/media-providers/dispatch/engine.d.ts +30 -0
- package/dist/media-providers/dispatch/engine.d.ts.map +1 -0
- package/dist/media-providers/dispatch/engine.js +208 -0
- package/dist/media-providers/dispatch/engine.js.map +1 -0
- package/dist/media-providers/dispatch/index.d.ts +25 -0
- package/dist/media-providers/dispatch/index.d.ts.map +1 -0
- package/dist/media-providers/dispatch/index.js +24 -0
- package/dist/media-providers/dispatch/index.js.map +1 -0
- package/dist/media-providers/dispatch/openai-compatible.d.ts +44 -0
- package/dist/media-providers/dispatch/openai-compatible.d.ts.map +1 -0
- package/dist/media-providers/dispatch/openai-compatible.js +214 -0
- package/dist/media-providers/dispatch/openai-compatible.js.map +1 -0
- package/dist/media-providers/dispatch/providers/aihubmix-shared.d.ts +72 -0
- package/dist/media-providers/dispatch/providers/aihubmix-shared.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/aihubmix-shared.js +131 -0
- package/dist/media-providers/dispatch/providers/aihubmix-shared.js.map +1 -0
- package/dist/media-providers/dispatch/providers/aihubmix.d.ts +4 -0
- package/dist/media-providers/dispatch/providers/aihubmix.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/aihubmix.js +205 -0
- package/dist/media-providers/dispatch/providers/aihubmix.js.map +1 -0
- package/dist/media-providers/dispatch/providers/custom-image.d.ts +6 -0
- package/dist/media-providers/dispatch/providers/custom-image.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/custom-image.js +94 -0
- package/dist/media-providers/dispatch/providers/custom-image.js.map +1 -0
- package/dist/media-providers/dispatch/providers/elevenlabs.d.ts +4 -0
- package/dist/media-providers/dispatch/providers/elevenlabs.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/elevenlabs.js +163 -0
- package/dist/media-providers/dispatch/providers/elevenlabs.js.map +1 -0
- package/dist/media-providers/dispatch/providers/fishaudio.d.ts +3 -0
- package/dist/media-providers/dispatch/providers/fishaudio.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/fishaudio.js +83 -0
- package/dist/media-providers/dispatch/providers/fishaudio.js.map +1 -0
- package/dist/media-providers/dispatch/providers/grok.d.ts +15 -0
- package/dist/media-providers/dispatch/providers/grok.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/grok.js +150 -0
- package/dist/media-providers/dispatch/providers/grok.js.map +1 -0
- package/dist/media-providers/dispatch/providers/imagerouter.d.ts +6 -0
- package/dist/media-providers/dispatch/providers/imagerouter.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/imagerouter.js +131 -0
- package/dist/media-providers/dispatch/providers/imagerouter.js.map +1 -0
- package/dist/media-providers/dispatch/providers/minimax.d.ts +3 -0
- package/dist/media-providers/dispatch/providers/minimax.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/minimax.js +96 -0
- package/dist/media-providers/dispatch/providers/minimax.js.map +1 -0
- package/dist/media-providers/dispatch/providers/nanobanana.d.ts +3 -0
- package/dist/media-providers/dispatch/providers/nanobanana.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/nanobanana.js +142 -0
- package/dist/media-providers/dispatch/providers/nanobanana.js.map +1 -0
- package/dist/media-providers/dispatch/providers/openai.d.ts +4 -0
- package/dist/media-providers/dispatch/providers/openai.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/openai.js +231 -0
- package/dist/media-providers/dispatch/providers/openai.js.map +1 -0
- package/dist/media-providers/dispatch/providers/openrouter.d.ts +13 -0
- package/dist/media-providers/dispatch/providers/openrouter.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/openrouter.js +152 -0
- package/dist/media-providers/dispatch/providers/openrouter.js.map +1 -0
- package/dist/media-providers/dispatch/providers/senseaudio.d.ts +4 -0
- package/dist/media-providers/dispatch/providers/senseaudio.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/senseaudio.js +190 -0
- package/dist/media-providers/dispatch/providers/senseaudio.js.map +1 -0
- package/dist/media-providers/dispatch/providers/volcengine.d.ts +3 -0
- package/dist/media-providers/dispatch/providers/volcengine.d.ts.map +1 -0
- package/dist/media-providers/dispatch/providers/volcengine.js +95 -0
- package/dist/media-providers/dispatch/providers/volcengine.js.map +1 -0
- package/dist/media-providers/dispatch/response-parsers.d.ts +44 -0
- package/dist/media-providers/dispatch/response-parsers.d.ts.map +1 -0
- package/dist/media-providers/dispatch/response-parsers.js +103 -0
- package/dist/media-providers/dispatch/response-parsers.js.map +1 -0
- package/dist/media-providers/dispatch/ssrf-guard.d.ts +51 -0
- package/dist/media-providers/dispatch/ssrf-guard.d.ts.map +1 -0
- package/dist/media-providers/dispatch/ssrf-guard.js +215 -0
- package/dist/media-providers/dispatch/ssrf-guard.js.map +1 -0
- package/dist/media-providers/dispatch/stub.d.ts +5 -0
- package/dist/media-providers/dispatch/stub.d.ts.map +1 -0
- package/dist/media-providers/dispatch/stub.js +98 -0
- package/dist/media-providers/dispatch/stub.js.map +1 -0
- package/dist/media-providers/dispatch/types.d.ts +133 -0
- package/dist/media-providers/dispatch/types.d.ts.map +1 -0
- package/dist/media-providers/dispatch/types.js +2 -0
- package/dist/media-providers/dispatch/types.js.map +1 -0
- package/dist/media-providers/dispatch/vendor-adapter.d.ts +54 -0
- package/dist/media-providers/dispatch/vendor-adapter.d.ts.map +1 -0
- package/dist/media-providers/dispatch/vendor-adapter.js +68 -0
- package/dist/media-providers/dispatch/vendor-adapter.js.map +1 -0
- package/dist/media-providers/dispatch/vendor-registry.d.ts +36 -0
- package/dist/media-providers/dispatch/vendor-registry.d.ts.map +1 -0
- package/dist/media-providers/dispatch/vendor-registry.js +46 -0
- package/dist/media-providers/dispatch/vendor-registry.js.map +1 -0
- package/dist/media-providers/index.d.ts +22 -0
- package/dist/media-providers/index.d.ts.map +1 -0
- package/dist/media-providers/index.js +22 -0
- package/dist/media-providers/index.js.map +1 -0
- package/dist/media-providers/policy.d.ts +49 -0
- package/dist/media-providers/policy.d.ts.map +1 -0
- package/dist/media-providers/policy.js +39 -0
- package/dist/media-providers/policy.js.map +1 -0
- package/dist/media-providers/providers.d.ts +33 -0
- package/dist/media-providers/providers.d.ts.map +1 -0
- package/dist/media-providers/providers.js +200 -0
- package/dist/media-providers/providers.js.map +1 -0
- package/dist/media-providers/seed.d.ts +14 -0
- package/dist/media-providers/seed.d.ts.map +1 -0
- package/dist/media-providers/seed.js +109 -0
- package/dist/media-providers/seed.js.map +1 -0
- package/dist/media-providers/sqlite-task-store.d.ts +29 -0
- package/dist/media-providers/sqlite-task-store.d.ts.map +1 -0
- package/dist/media-providers/sqlite-task-store.js +234 -0
- package/dist/media-providers/sqlite-task-store.js.map +1 -0
- package/dist/media-providers/staging.d.ts +29 -0
- package/dist/media-providers/staging.d.ts.map +1 -0
- package/dist/media-providers/staging.js +141 -0
- package/dist/media-providers/staging.js.map +1 -0
- package/dist/media-providers/task-store.d.ts +94 -0
- package/dist/media-providers/task-store.d.ts.map +1 -0
- package/dist/media-providers/task-store.js +160 -0
- package/dist/media-providers/task-store.js.map +1 -0
- package/dist/media-providers/tokens.d.ts +7 -0
- package/dist/media-providers/tokens.d.ts.map +1 -0
- package/dist/media-providers/tokens.js +13 -0
- package/dist/media-providers/tokens.js.map +1 -0
- package/dist/media-providers/types.d.ts +123 -0
- package/dist/media-providers/types.d.ts.map +1 -0
- package/dist/media-providers/types.js +12 -0
- package/dist/media-providers/types.js.map +1 -0
- package/dist/media-providers/video-request.d.ts +62 -0
- package/dist/media-providers/video-request.d.ts.map +1 -0
- package/dist/media-providers/video-request.js +219 -0
- package/dist/media-providers/video-request.js.map +1 -0
- 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"}
|