@plasius/ai 1.1.6 → 1.1.8

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 (34) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +17 -2
  3. package/dist/platform/grok-adapter.d.ts +13 -0
  4. package/dist/platform/grok-adapter.d.ts.map +1 -0
  5. package/dist/platform/grok-adapter.js +21 -0
  6. package/dist/platform/index.d.ts +6 -0
  7. package/dist/platform/index.d.ts.map +1 -1
  8. package/dist/platform/index.js +3 -0
  9. package/dist/platform/meta-ai-adapter.d.ts +12 -0
  10. package/dist/platform/meta-ai-adapter.d.ts.map +1 -0
  11. package/dist/platform/meta-ai-adapter.js +19 -0
  12. package/dist/platform/pixelverse-adapter.d.ts +27 -0
  13. package/dist/platform/pixelverse-adapter.d.ts.map +1 -0
  14. package/dist/platform/pixelverse-adapter.js +108 -0
  15. package/dist-cjs/platform/grok-adapter.d.ts +13 -0
  16. package/dist-cjs/platform/grok-adapter.d.ts.map +1 -0
  17. package/dist-cjs/platform/grok-adapter.js +24 -0
  18. package/dist-cjs/platform/index.d.ts +6 -0
  19. package/dist-cjs/platform/index.d.ts.map +1 -1
  20. package/dist-cjs/platform/index.js +7 -1
  21. package/dist-cjs/platform/meta-ai-adapter.d.ts +12 -0
  22. package/dist-cjs/platform/meta-ai-adapter.d.ts.map +1 -0
  23. package/dist-cjs/platform/meta-ai-adapter.js +22 -0
  24. package/dist-cjs/platform/pixelverse-adapter.d.ts +27 -0
  25. package/dist-cjs/platform/pixelverse-adapter.d.ts.map +1 -0
  26. package/dist-cjs/platform/pixelverse-adapter.js +111 -0
  27. package/docs/api-reference.md +22 -0
  28. package/docs/architecture.md +1 -1
  29. package/docs/providers.md +9 -0
  30. package/package.json +5 -5
  31. package/src/platform/grok-adapter.ts +39 -0
  32. package/src/platform/index.ts +6 -0
  33. package/src/platform/meta-ai-adapter.ts +36 -0
  34. package/src/platform/pixelverse-adapter.ts +211 -0
package/CHANGELOG.md CHANGED
@@ -12,6 +12,9 @@ The format is based on **[Keep a Changelog](https://keepachangelog.com/en/1.1.0/
12
12
  - Added built-in provider adapter factories:
13
13
  - `createOpenAIAdapter` for chat, speech synthesis, transcription, image generation, and model generation.
14
14
  - `createGeminiAdapter` for chat, image generation, and model generation.
15
+ - `createGrokAdapter` for xAI Grok chat/image/model generation.
16
+ - `createMetaAIAdapter` for Meta AI (Llama-compatible) chat/model generation.
17
+ - `createPixelverseAdapter` for Pixelverse video generation and balance.
15
18
  - Added shared HTTP resilience policy contracts (`HttpClientPolicy`) and transport helper for consistent retry/timeout behavior across adapters.
16
19
  - Added generic multi-capability adapter contracts (`AICapabilityAdapter`, request context/request types) and `createAdapterPlatform` for routing chat/voice/image/video/model operations.
17
20
  - Added `AICapability.Model`, `ModelCompletion`, `modelCompletionSchema`, and `AIPlatform.generateModel(...)`.
package/README.md CHANGED
@@ -95,6 +95,9 @@ void platform;
95
95
  - `createAdapterPlatform`
96
96
  - `createOpenAIAdapter`
97
97
  - `createGeminiAdapter`
98
+ - `createGrokAdapter`
99
+ - `createMetaAIAdapter`
100
+ - `createPixelverseAdapter`
98
101
  - Generic video-provider adapter contracts and helpers:
99
102
  - `VideoProviderAdapter`
100
103
  - `VideoGenerationRequest`
@@ -137,7 +140,10 @@ import {
137
140
  AICapability,
138
141
  createAdapterPlatform,
139
142
  createGeminiAdapter,
143
+ createGrokAdapter,
144
+ createMetaAIAdapter,
140
145
  createOpenAIAdapter,
146
+ createPixelverseAdapter,
141
147
  } from "@plasius/ai";
142
148
 
143
149
  const openAIAdapter = createOpenAIAdapter({
@@ -171,17 +177,26 @@ const geminiAdapter = createGeminiAdapter({
171
177
  },
172
178
  });
173
179
 
180
+ const grokAdapter = createGrokAdapter();
181
+ const metaAdapter = createMetaAIAdapter();
182
+ const pixelverseAdapter = createPixelverseAdapter();
183
+
174
184
  const platform = await createAdapterPlatform("user-1", {
175
- adapters: [openAIAdapter, geminiAdapter],
185
+ adapters: [openAIAdapter, geminiAdapter, grokAdapter, metaAdapter, pixelverseAdapter],
176
186
  apiKeys: {
177
187
  openai: process.env.OPENAI_API_KEY ?? "",
178
188
  gemini: process.env.GEMINI_API_KEY ?? "",
189
+ grok: process.env.XAI_API_KEY ?? "",
190
+ "meta-ai": process.env.META_AI_API_KEY ?? "",
191
+ pixelverse: process.env.PIXELVERSE_API_KEY ?? "",
179
192
  },
180
193
  defaultAdapterByCapability: {
181
- [AICapability.Chat]: "openai",
194
+ [AICapability.Chat]: "grok",
182
195
  [AICapability.Speech]: "openai",
183
196
  [AICapability.Image]: "gemini",
184
197
  [AICapability.Model]: "gemini",
198
+ [AICapability.Video]: "pixelverse",
199
+ [AICapability.Balance]: "pixelverse",
185
200
  },
186
201
  });
187
202
 
@@ -0,0 +1,13 @@
1
+ import { type AICapabilityAdapter } from "./index.js";
2
+ import { type OpenAIAdapterOptions } from "./openai-adapter.js";
3
+ export interface GrokAdapterOptions extends Omit<OpenAIAdapterOptions, "id" | "baseUrl" | "defaultModels"> {
4
+ id?: string;
5
+ baseUrl?: string;
6
+ defaultModels?: {
7
+ chat?: string;
8
+ image?: string;
9
+ model?: string;
10
+ };
11
+ }
12
+ export declare function createGrokAdapter(options?: GrokAdapterOptions): AICapabilityAdapter;
13
+ //# sourceMappingURL=grok-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-adapter.d.ts","sourceRoot":"","sources":["../../src/platform/grok-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErF,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,SAAS,GAAG,eAAe,CAAC;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,kBAAuB,GAC/B,mBAAmB,CAmBrB"}
@@ -0,0 +1,21 @@
1
+ import { AICapability, } from "./index.js";
2
+ import { createOpenAIAdapter } from "./openai-adapter.js";
3
+ export function createGrokAdapter(options = {}) {
4
+ const base = createOpenAIAdapter({
5
+ ...options,
6
+ id: options.id ?? "grok",
7
+ baseUrl: options.baseUrl ?? "https://api.x.ai/v1",
8
+ defaultModels: {
9
+ chat: options.defaultModels?.chat ?? "grok-3-mini",
10
+ image: options.defaultModels?.image ?? "grok-2-image-1212",
11
+ model: options.defaultModels?.model ?? "grok-3-mini",
12
+ },
13
+ });
14
+ return {
15
+ id: base.id,
16
+ capabilities: [AICapability.Chat, AICapability.Image, AICapability.Model],
17
+ chatWithAI: base.chatWithAI,
18
+ generateImage: base.generateImage,
19
+ generateModel: base.generateModel,
20
+ };
21
+ }
@@ -94,4 +94,10 @@ export type { OpenAIAdapterOptions } from "./openai-adapter.js";
94
94
  export { createOpenAIAdapter } from "./openai-adapter.js";
95
95
  export type { GeminiAdapterOptions } from "./gemini-adapter.js";
96
96
  export { createGeminiAdapter } from "./gemini-adapter.js";
97
+ export type { GrokAdapterOptions } from "./grok-adapter.js";
98
+ export { createGrokAdapter } from "./grok-adapter.js";
99
+ export type { MetaAIAdapterOptions } from "./meta-ai-adapter.js";
100
+ export { createMetaAIAdapter } from "./meta-ai-adapter.js";
101
+ export type { PixelverseAdapterOptions } from "./pixelverse-adapter.js";
102
+ export { createPixelverseAdapter } from "./pixelverse-adapter.js";
97
103
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAEjE,eAAO,MAAM,gBAAgB;;;;;;;;EA0C5B,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,oBAAoB;;;EAmBhC,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,oBAAoB;;EAehC,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB;;EAgBjC,CAAC;AAEF,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,GAAG,EAAE,GAAG,CAAC;CACV;AAED,eAAO,MAAM,sBAAsB;;EAgBlC,CAAC;AAEF,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,GAAG,EAAE,GAAG,CAAC;CACV;AAED,eAAO,MAAM,qBAAqB;;EAgBjC,CAAC;AAEF,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,GAAG,EAAE,GAAG,CAAC;CACV;AAED,eAAO,MAAM,qBAAqB;;;EAqBjC,CAAC;AAEF,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB;AAED,eAAO,MAAM,uBAAuB;;EAYnC,CAAC;AAEF,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oBAAY,YAAY;IACtB,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,KAAK,IAAA;IACL,KAAK,IAAA;IACL,OAAO,IAAA;IACP,KAAK,IAAA;CACN;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,CACV,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAAE,KACzB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,UAAU,EAAE,CACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,gBAAgB,EAAE,CAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/B,gBAAgB,EAAE,CAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,aAAa,EAAE,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,YAAY,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,GAAG,EACV,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,aAAa,EAAE,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,YAAY,EACV,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAC7E,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,YAAY,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -147,3 +147,6 @@ export { createAdapterPlatform } from "./adapter-platform.js";
147
147
  export { createVideoProviderPlatform } from "./video-provider-platform.js";
148
148
  export { createOpenAIAdapter } from "./openai-adapter.js";
149
149
  export { createGeminiAdapter } from "./gemini-adapter.js";
150
+ export { createGrokAdapter } from "./grok-adapter.js";
151
+ export { createMetaAIAdapter } from "./meta-ai-adapter.js";
152
+ export { createPixelverseAdapter } from "./pixelverse-adapter.js";
@@ -0,0 +1,12 @@
1
+ import { type AICapabilityAdapter } from "./index.js";
2
+ import { type OpenAIAdapterOptions } from "./openai-adapter.js";
3
+ export interface MetaAIAdapterOptions extends Omit<OpenAIAdapterOptions, "id" | "baseUrl" | "defaultModels"> {
4
+ id?: string;
5
+ baseUrl?: string;
6
+ defaultModels?: {
7
+ chat?: string;
8
+ model?: string;
9
+ };
10
+ }
11
+ export declare function createMetaAIAdapter(options?: MetaAIAdapterOptions): AICapabilityAdapter;
12
+ //# sourceMappingURL=meta-ai-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-ai-adapter.d.ts","sourceRoot":"","sources":["../../src/platform/meta-ai-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErF,MAAM,WAAW,oBACf,SAAQ,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,SAAS,GAAG,eAAe,CAAC;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAiBrB"}
@@ -0,0 +1,19 @@
1
+ import { AICapability, } from "./index.js";
2
+ import { createOpenAIAdapter } from "./openai-adapter.js";
3
+ export function createMetaAIAdapter(options = {}) {
4
+ const base = createOpenAIAdapter({
5
+ ...options,
6
+ id: options.id ?? "meta-ai",
7
+ baseUrl: options.baseUrl ?? "https://api.llama.com/compat/v1",
8
+ defaultModels: {
9
+ chat: options.defaultModels?.chat ?? "Llama-3.3-70B-Instruct",
10
+ model: options.defaultModels?.model ?? "Llama-3.3-70B-Instruct",
11
+ },
12
+ });
13
+ return {
14
+ id: base.id,
15
+ capabilities: [AICapability.Chat, AICapability.Model],
16
+ chatWithAI: base.chatWithAI,
17
+ generateModel: base.generateModel,
18
+ };
19
+ }
@@ -0,0 +1,27 @@
1
+ import { type AICapabilityAdapter } from "./index.js";
2
+ import type { HttpVideoProviderAdapterConfig, VideoGenerationRequest } from "./video-provider-adapter.js";
3
+ export interface PixelverseAdapterOptions {
4
+ id?: string;
5
+ apiBaseUrl?: string;
6
+ fetchFn?: typeof fetch;
7
+ httpPolicy?: HttpVideoProviderAdapterConfig["httpPolicy"];
8
+ polling?: {
9
+ maxRetries?: number;
10
+ delayMs?: number;
11
+ };
12
+ defaultVideoRequest?: Partial<Omit<VideoGenerationRequest, "imageId" | "prompt">>;
13
+ paths?: {
14
+ uploadImagePath?: string;
15
+ generateVideoPath?: string;
16
+ getVideoResultPath?: (videoId: number) => string;
17
+ getBalancePath?: string;
18
+ };
19
+ mapUploadImageId?: HttpVideoProviderAdapterConfig["mapUploadImageId"];
20
+ mapGeneratedVideoId?: HttpVideoProviderAdapterConfig["mapGeneratedVideoId"];
21
+ mapVideoResult?: HttpVideoProviderAdapterConfig["mapVideoResult"];
22
+ mapBalance?: HttpVideoProviderAdapterConfig["mapBalance"];
23
+ mapGenerateRequestBody?: HttpVideoProviderAdapterConfig["mapGenerateRequestBody"];
24
+ additionalHeaders?: HttpVideoProviderAdapterConfig["additionalHeaders"];
25
+ }
26
+ export declare function createPixelverseAdapter(options?: PixelverseAdapterOptions): AICapabilityAdapter;
27
+ //# sourceMappingURL=pixelverse-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixelverse-adapter.d.ts","sourceRoot":"","sources":["../../src/platform/pixelverse-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,mBAAmB,EAGzB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,8BAA8B,EAE9B,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,WAAW,wBAAwB;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,UAAU,CAAC,EAAE,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,mBAAmB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;IAClF,KAAK,CAAC,EAAE;QACN,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;QACjD,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,gBAAgB,CAAC,EAAE,8BAA8B,CAAC,kBAAkB,CAAC,CAAC;IACtE,mBAAmB,CAAC,EAAE,8BAA8B,CAAC,qBAAqB,CAAC,CAAC;IAC5E,cAAc,CAAC,EAAE,8BAA8B,CAAC,gBAAgB,CAAC,CAAC;IAClE,UAAU,CAAC,EAAE,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC1D,sBAAsB,CAAC,EAAE,8BAA8B,CAAC,wBAAwB,CAAC,CAAC;IAClF,iBAAiB,CAAC,EAAE,8BAA8B,CAAC,mBAAmB,CAAC,CAAC;CACzE;AAyDD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,mBAAmB,CA+GrB"}
@@ -0,0 +1,108 @@
1
+ import { performance } from "node:perf_hooks";
2
+ import { AICapability, } from "./index.js";
3
+ import { createHttpVideoProviderAdapter } from "./video-provider-adapter.js";
4
+ function normalizeBaseUrl(baseUrl) {
5
+ const normalized = (baseUrl ?? "https://api.pixelverse.ai").trim();
6
+ return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
7
+ }
8
+ function createCompletionBase(type, model, requestor, durationMs, usage) {
9
+ return {
10
+ partitionKey: requestor,
11
+ id: crypto.randomUUID(),
12
+ type,
13
+ model,
14
+ createdAt: new Date().toISOString(),
15
+ durationMs,
16
+ usage: usage ?? {},
17
+ };
18
+ }
19
+ async function waitForCompletion(getVideoResult, videoId, apiKey, maxRetries, delayMs, fetchFn) {
20
+ for (let attempt = 0; attempt < maxRetries; attempt += 1) {
21
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
22
+ const result = await getVideoResult(videoId, {
23
+ apiKey,
24
+ traceId: crypto.randomUUID(),
25
+ fetchFn,
26
+ });
27
+ if (result.state === "completed" && result.videoUrl) {
28
+ return result.videoUrl;
29
+ }
30
+ if (result.state === "failed") {
31
+ throw new Error("Pixelverse video generation failed.");
32
+ }
33
+ }
34
+ throw new Error("Timed out waiting for Pixelverse video completion.");
35
+ }
36
+ export function createPixelverseAdapter(options = {}) {
37
+ const providerId = (options.id ?? "pixelverse").trim() || "pixelverse";
38
+ const baseUrl = normalizeBaseUrl(options.apiBaseUrl);
39
+ const httpAdapter = createHttpVideoProviderAdapter({
40
+ uploadImagePath: options.paths?.uploadImagePath ?? `${baseUrl}/openapi/v1/image/upload`,
41
+ generateVideoPath: options.paths?.generateVideoPath ?? `${baseUrl}/openapi/v1/video/generate`,
42
+ getVideoResultPath: options.paths?.getVideoResultPath ??
43
+ ((videoId) => `${baseUrl}/openapi/v1/video/result/${videoId}`),
44
+ getBalancePath: options.paths?.getBalancePath ?? `${baseUrl}/openapi/v1/account/balance`,
45
+ httpPolicy: options.httpPolicy,
46
+ mapUploadImageId: options.mapUploadImageId,
47
+ mapGeneratedVideoId: options.mapGeneratedVideoId,
48
+ mapVideoResult: options.mapVideoResult,
49
+ mapBalance: options.mapBalance,
50
+ mapGenerateRequestBody: options.mapGenerateRequestBody,
51
+ additionalHeaders: options.additionalHeaders,
52
+ });
53
+ const maxRetries = options.polling?.maxRetries ?? 20;
54
+ const delayMs = options.polling?.delayMs ?? 3000;
55
+ const produceVideo = async (request) => {
56
+ const startedAt = performance.now();
57
+ const combinedPrompt = request.context
58
+ ? `${request.context}\n\n${request.input}`
59
+ : request.input;
60
+ const uploaded = await httpAdapter.uploadImage(request.image, {
61
+ apiKey: request.apiKey,
62
+ traceId: request.traceId,
63
+ fetchFn: options.fetchFn,
64
+ });
65
+ const generated = await httpAdapter.generateVideo({
66
+ imageId: uploaded.imageId,
67
+ prompt: combinedPrompt,
68
+ model: request.model,
69
+ ...options.defaultVideoRequest,
70
+ }, {
71
+ apiKey: request.apiKey,
72
+ traceId: crypto.randomUUID(),
73
+ fetchFn: options.fetchFn,
74
+ });
75
+ const videoUrl = await waitForCompletion(httpAdapter.getVideoResult, generated.videoId, request.apiKey, maxRetries, delayMs, options.fetchFn);
76
+ const durationMs = performance.now() - startedAt;
77
+ const base = createCompletionBase("video", request.model, request.userId, durationMs, { providerVideoId: generated.videoId });
78
+ return {
79
+ ...base,
80
+ url: new URL(videoUrl),
81
+ };
82
+ };
83
+ const checkBalance = async (request) => {
84
+ const startedAt = performance.now();
85
+ const providerBalance = httpAdapter.getBalance
86
+ ? await httpAdapter.getBalance({
87
+ apiKey: request.apiKey,
88
+ traceId: request.traceId,
89
+ fetchFn: options.fetchFn,
90
+ })
91
+ : {
92
+ monthlyCredit: 0,
93
+ packageCredit: 0,
94
+ };
95
+ const durationMs = performance.now() - startedAt;
96
+ const base = createCompletionBase("balanceCompletion", "", request.userId, durationMs);
97
+ return {
98
+ ...base,
99
+ balance: providerBalance.monthlyCredit + providerBalance.packageCredit,
100
+ };
101
+ };
102
+ return {
103
+ id: providerId,
104
+ capabilities: [AICapability.Video, AICapability.Balance],
105
+ produceVideo,
106
+ checkBalance,
107
+ };
108
+ }
@@ -0,0 +1,13 @@
1
+ import { type AICapabilityAdapter } from "./index.js";
2
+ import { type OpenAIAdapterOptions } from "./openai-adapter.js";
3
+ export interface GrokAdapterOptions extends Omit<OpenAIAdapterOptions, "id" | "baseUrl" | "defaultModels"> {
4
+ id?: string;
5
+ baseUrl?: string;
6
+ defaultModels?: {
7
+ chat?: string;
8
+ image?: string;
9
+ model?: string;
10
+ };
11
+ }
12
+ export declare function createGrokAdapter(options?: GrokAdapterOptions): AICapabilityAdapter;
13
+ //# sourceMappingURL=grok-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-adapter.d.ts","sourceRoot":"","sources":["../../src/platform/grok-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErF,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,SAAS,GAAG,eAAe,CAAC;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,kBAAuB,GAC/B,mBAAmB,CAmBrB"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGrokAdapter = createGrokAdapter;
4
+ const index_js_1 = require("./index.js");
5
+ const openai_adapter_js_1 = require("./openai-adapter.js");
6
+ function createGrokAdapter(options = {}) {
7
+ const base = (0, openai_adapter_js_1.createOpenAIAdapter)({
8
+ ...options,
9
+ id: options.id ?? "grok",
10
+ baseUrl: options.baseUrl ?? "https://api.x.ai/v1",
11
+ defaultModels: {
12
+ chat: options.defaultModels?.chat ?? "grok-3-mini",
13
+ image: options.defaultModels?.image ?? "grok-2-image-1212",
14
+ model: options.defaultModels?.model ?? "grok-3-mini",
15
+ },
16
+ });
17
+ return {
18
+ id: base.id,
19
+ capabilities: [index_js_1.AICapability.Chat, index_js_1.AICapability.Image, index_js_1.AICapability.Model],
20
+ chatWithAI: base.chatWithAI,
21
+ generateImage: base.generateImage,
22
+ generateModel: base.generateModel,
23
+ };
24
+ }
@@ -94,4 +94,10 @@ export type { OpenAIAdapterOptions } from "./openai-adapter.js";
94
94
  export { createOpenAIAdapter } from "./openai-adapter.js";
95
95
  export type { GeminiAdapterOptions } from "./gemini-adapter.js";
96
96
  export { createGeminiAdapter } from "./gemini-adapter.js";
97
+ export type { GrokAdapterOptions } from "./grok-adapter.js";
98
+ export { createGrokAdapter } from "./grok-adapter.js";
99
+ export type { MetaAIAdapterOptions } from "./meta-ai-adapter.js";
100
+ export { createMetaAIAdapter } from "./meta-ai-adapter.js";
101
+ export type { PixelverseAdapterOptions } from "./pixelverse-adapter.js";
102
+ export { createPixelverseAdapter } from "./pixelverse-adapter.js";
97
103
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createGeminiAdapter = exports.createOpenAIAdapter = exports.createVideoProviderPlatform = exports.createAdapterPlatform = exports.createHttpVideoProviderAdapter = exports.AICapability = exports.balanceCompletionSchema = exports.modelCompletionSchema = exports.videoCompletionSchema = exports.speechCompletionSchema = exports.imageCompletionSchema = exports.textCompletionSchema = exports.chatCompletionSchema = exports.completionSchema = void 0;
3
+ exports.createPixelverseAdapter = exports.createMetaAIAdapter = exports.createGrokAdapter = exports.createGeminiAdapter = exports.createOpenAIAdapter = exports.createVideoProviderPlatform = exports.createAdapterPlatform = exports.createHttpVideoProviderAdapter = exports.AICapability = exports.balanceCompletionSchema = exports.modelCompletionSchema = exports.videoCompletionSchema = exports.speechCompletionSchema = exports.imageCompletionSchema = exports.textCompletionSchema = exports.chatCompletionSchema = exports.completionSchema = void 0;
4
4
  const schema_1 = require("@plasius/schema");
5
5
  exports.completionSchema = (0, schema_1.createSchema)({
6
6
  id: schema_1.field
@@ -155,3 +155,9 @@ var openai_adapter_js_1 = require("./openai-adapter.js");
155
155
  Object.defineProperty(exports, "createOpenAIAdapter", { enumerable: true, get: function () { return openai_adapter_js_1.createOpenAIAdapter; } });
156
156
  var gemini_adapter_js_1 = require("./gemini-adapter.js");
157
157
  Object.defineProperty(exports, "createGeminiAdapter", { enumerable: true, get: function () { return gemini_adapter_js_1.createGeminiAdapter; } });
158
+ var grok_adapter_js_1 = require("./grok-adapter.js");
159
+ Object.defineProperty(exports, "createGrokAdapter", { enumerable: true, get: function () { return grok_adapter_js_1.createGrokAdapter; } });
160
+ var meta_ai_adapter_js_1 = require("./meta-ai-adapter.js");
161
+ Object.defineProperty(exports, "createMetaAIAdapter", { enumerable: true, get: function () { return meta_ai_adapter_js_1.createMetaAIAdapter; } });
162
+ var pixelverse_adapter_js_1 = require("./pixelverse-adapter.js");
163
+ Object.defineProperty(exports, "createPixelverseAdapter", { enumerable: true, get: function () { return pixelverse_adapter_js_1.createPixelverseAdapter; } });
@@ -0,0 +1,12 @@
1
+ import { type AICapabilityAdapter } from "./index.js";
2
+ import { type OpenAIAdapterOptions } from "./openai-adapter.js";
3
+ export interface MetaAIAdapterOptions extends Omit<OpenAIAdapterOptions, "id" | "baseUrl" | "defaultModels"> {
4
+ id?: string;
5
+ baseUrl?: string;
6
+ defaultModels?: {
7
+ chat?: string;
8
+ model?: string;
9
+ };
10
+ }
11
+ export declare function createMetaAIAdapter(options?: MetaAIAdapterOptions): AICapabilityAdapter;
12
+ //# sourceMappingURL=meta-ai-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-ai-adapter.d.ts","sourceRoot":"","sources":["../../src/platform/meta-ai-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErF,MAAM,WAAW,oBACf,SAAQ,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,SAAS,GAAG,eAAe,CAAC;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAiBrB"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMetaAIAdapter = createMetaAIAdapter;
4
+ const index_js_1 = require("./index.js");
5
+ const openai_adapter_js_1 = require("./openai-adapter.js");
6
+ function createMetaAIAdapter(options = {}) {
7
+ const base = (0, openai_adapter_js_1.createOpenAIAdapter)({
8
+ ...options,
9
+ id: options.id ?? "meta-ai",
10
+ baseUrl: options.baseUrl ?? "https://api.llama.com/compat/v1",
11
+ defaultModels: {
12
+ chat: options.defaultModels?.chat ?? "Llama-3.3-70B-Instruct",
13
+ model: options.defaultModels?.model ?? "Llama-3.3-70B-Instruct",
14
+ },
15
+ });
16
+ return {
17
+ id: base.id,
18
+ capabilities: [index_js_1.AICapability.Chat, index_js_1.AICapability.Model],
19
+ chatWithAI: base.chatWithAI,
20
+ generateModel: base.generateModel,
21
+ };
22
+ }
@@ -0,0 +1,27 @@
1
+ import { type AICapabilityAdapter } from "./index.js";
2
+ import type { HttpVideoProviderAdapterConfig, VideoGenerationRequest } from "./video-provider-adapter.js";
3
+ export interface PixelverseAdapterOptions {
4
+ id?: string;
5
+ apiBaseUrl?: string;
6
+ fetchFn?: typeof fetch;
7
+ httpPolicy?: HttpVideoProviderAdapterConfig["httpPolicy"];
8
+ polling?: {
9
+ maxRetries?: number;
10
+ delayMs?: number;
11
+ };
12
+ defaultVideoRequest?: Partial<Omit<VideoGenerationRequest, "imageId" | "prompt">>;
13
+ paths?: {
14
+ uploadImagePath?: string;
15
+ generateVideoPath?: string;
16
+ getVideoResultPath?: (videoId: number) => string;
17
+ getBalancePath?: string;
18
+ };
19
+ mapUploadImageId?: HttpVideoProviderAdapterConfig["mapUploadImageId"];
20
+ mapGeneratedVideoId?: HttpVideoProviderAdapterConfig["mapGeneratedVideoId"];
21
+ mapVideoResult?: HttpVideoProviderAdapterConfig["mapVideoResult"];
22
+ mapBalance?: HttpVideoProviderAdapterConfig["mapBalance"];
23
+ mapGenerateRequestBody?: HttpVideoProviderAdapterConfig["mapGenerateRequestBody"];
24
+ additionalHeaders?: HttpVideoProviderAdapterConfig["additionalHeaders"];
25
+ }
26
+ export declare function createPixelverseAdapter(options?: PixelverseAdapterOptions): AICapabilityAdapter;
27
+ //# sourceMappingURL=pixelverse-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixelverse-adapter.d.ts","sourceRoot":"","sources":["../../src/platform/pixelverse-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,mBAAmB,EAGzB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,8BAA8B,EAE9B,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,WAAW,wBAAwB;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,UAAU,CAAC,EAAE,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,mBAAmB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;IAClF,KAAK,CAAC,EAAE;QACN,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;QACjD,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,gBAAgB,CAAC,EAAE,8BAA8B,CAAC,kBAAkB,CAAC,CAAC;IACtE,mBAAmB,CAAC,EAAE,8BAA8B,CAAC,qBAAqB,CAAC,CAAC;IAC5E,cAAc,CAAC,EAAE,8BAA8B,CAAC,gBAAgB,CAAC,CAAC;IAClE,UAAU,CAAC,EAAE,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC1D,sBAAsB,CAAC,EAAE,8BAA8B,CAAC,wBAAwB,CAAC,CAAC;IAClF,iBAAiB,CAAC,EAAE,8BAA8B,CAAC,mBAAmB,CAAC,CAAC;CACzE;AAyDD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,mBAAmB,CA+GrB"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPixelverseAdapter = createPixelverseAdapter;
4
+ const node_perf_hooks_1 = require("node:perf_hooks");
5
+ const index_js_1 = require("./index.js");
6
+ const video_provider_adapter_js_1 = require("./video-provider-adapter.js");
7
+ function normalizeBaseUrl(baseUrl) {
8
+ const normalized = (baseUrl ?? "https://api.pixelverse.ai").trim();
9
+ return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
10
+ }
11
+ function createCompletionBase(type, model, requestor, durationMs, usage) {
12
+ return {
13
+ partitionKey: requestor,
14
+ id: crypto.randomUUID(),
15
+ type,
16
+ model,
17
+ createdAt: new Date().toISOString(),
18
+ durationMs,
19
+ usage: usage ?? {},
20
+ };
21
+ }
22
+ async function waitForCompletion(getVideoResult, videoId, apiKey, maxRetries, delayMs, fetchFn) {
23
+ for (let attempt = 0; attempt < maxRetries; attempt += 1) {
24
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
25
+ const result = await getVideoResult(videoId, {
26
+ apiKey,
27
+ traceId: crypto.randomUUID(),
28
+ fetchFn,
29
+ });
30
+ if (result.state === "completed" && result.videoUrl) {
31
+ return result.videoUrl;
32
+ }
33
+ if (result.state === "failed") {
34
+ throw new Error("Pixelverse video generation failed.");
35
+ }
36
+ }
37
+ throw new Error("Timed out waiting for Pixelverse video completion.");
38
+ }
39
+ function createPixelverseAdapter(options = {}) {
40
+ const providerId = (options.id ?? "pixelverse").trim() || "pixelverse";
41
+ const baseUrl = normalizeBaseUrl(options.apiBaseUrl);
42
+ const httpAdapter = (0, video_provider_adapter_js_1.createHttpVideoProviderAdapter)({
43
+ uploadImagePath: options.paths?.uploadImagePath ?? `${baseUrl}/openapi/v1/image/upload`,
44
+ generateVideoPath: options.paths?.generateVideoPath ?? `${baseUrl}/openapi/v1/video/generate`,
45
+ getVideoResultPath: options.paths?.getVideoResultPath ??
46
+ ((videoId) => `${baseUrl}/openapi/v1/video/result/${videoId}`),
47
+ getBalancePath: options.paths?.getBalancePath ?? `${baseUrl}/openapi/v1/account/balance`,
48
+ httpPolicy: options.httpPolicy,
49
+ mapUploadImageId: options.mapUploadImageId,
50
+ mapGeneratedVideoId: options.mapGeneratedVideoId,
51
+ mapVideoResult: options.mapVideoResult,
52
+ mapBalance: options.mapBalance,
53
+ mapGenerateRequestBody: options.mapGenerateRequestBody,
54
+ additionalHeaders: options.additionalHeaders,
55
+ });
56
+ const maxRetries = options.polling?.maxRetries ?? 20;
57
+ const delayMs = options.polling?.delayMs ?? 3000;
58
+ const produceVideo = async (request) => {
59
+ const startedAt = node_perf_hooks_1.performance.now();
60
+ const combinedPrompt = request.context
61
+ ? `${request.context}\n\n${request.input}`
62
+ : request.input;
63
+ const uploaded = await httpAdapter.uploadImage(request.image, {
64
+ apiKey: request.apiKey,
65
+ traceId: request.traceId,
66
+ fetchFn: options.fetchFn,
67
+ });
68
+ const generated = await httpAdapter.generateVideo({
69
+ imageId: uploaded.imageId,
70
+ prompt: combinedPrompt,
71
+ model: request.model,
72
+ ...options.defaultVideoRequest,
73
+ }, {
74
+ apiKey: request.apiKey,
75
+ traceId: crypto.randomUUID(),
76
+ fetchFn: options.fetchFn,
77
+ });
78
+ const videoUrl = await waitForCompletion(httpAdapter.getVideoResult, generated.videoId, request.apiKey, maxRetries, delayMs, options.fetchFn);
79
+ const durationMs = node_perf_hooks_1.performance.now() - startedAt;
80
+ const base = createCompletionBase("video", request.model, request.userId, durationMs, { providerVideoId: generated.videoId });
81
+ return {
82
+ ...base,
83
+ url: new URL(videoUrl),
84
+ };
85
+ };
86
+ const checkBalance = async (request) => {
87
+ const startedAt = node_perf_hooks_1.performance.now();
88
+ const providerBalance = httpAdapter.getBalance
89
+ ? await httpAdapter.getBalance({
90
+ apiKey: request.apiKey,
91
+ traceId: request.traceId,
92
+ fetchFn: options.fetchFn,
93
+ })
94
+ : {
95
+ monthlyCredit: 0,
96
+ packageCredit: 0,
97
+ };
98
+ const durationMs = node_perf_hooks_1.performance.now() - startedAt;
99
+ const base = createCompletionBase("balanceCompletion", "", request.userId, durationMs);
100
+ return {
101
+ ...base,
102
+ balance: providerBalance.monthlyCredit + providerBalance.packageCredit,
103
+ };
104
+ };
105
+ return {
106
+ id: providerId,
107
+ capabilities: [index_js_1.AICapability.Video, index_js_1.AICapability.Balance],
108
+ produceVideo,
109
+ checkBalance,
110
+ };
111
+ }
@@ -111,6 +111,28 @@ Creates a built-in Gemini adapter implementing:
111
111
 
112
112
  `options.httpPolicy` applies retry/timeout behavior to all Gemini adapter HTTP requests.
113
113
 
114
+ ### `createGrokAdapter(options?)`
115
+
116
+ Creates an xAI Grok adapter (OpenAI-compatible transport) implementing:
117
+
118
+ - `chatWithAI`
119
+ - `generateImage`
120
+ - `generateModel`
121
+
122
+ ### `createMetaAIAdapter(options?)`
123
+
124
+ Creates a Meta AI adapter (Llama-compatible transport) implementing:
125
+
126
+ - `chatWithAI`
127
+ - `generateModel`
128
+
129
+ ### `createPixelverseAdapter(options?)`
130
+
131
+ Creates a Pixelverse adapter implementing:
132
+
133
+ - `produceVideo`
134
+ - `checkBalance`
135
+
114
136
  ## Exported Schemas
115
137
 
116
138
  - `completionSchema`
@@ -7,7 +7,7 @@
7
7
  - **Completion contracts**: typed completion outputs normalize chat/text/image/speech/video/model/balance results.
8
8
  - **Schema layer**: schema definitions ensure consistent metadata and persistence shape across runtimes.
9
9
  - **Adapter composition**: `createAdapterPlatform` routes capabilities across multiple adapters and injects API keys supplied by the package consumer.
10
- - **Built-in providers**: OpenAI and Gemini adapters are included for out-of-the-box capability wiring.
10
+ - **Built-in providers**: OpenAI, Gemini, Grok, Meta AI, and Pixelverse adapters are included for out-of-the-box capability wiring.
11
11
  - **Resilient transport**: adapters use a shared HTTP resilience policy (timeouts, exponential backoff + jitter, and `Retry-After` handling).
12
12
 
13
13
  ## Design Intention
package/docs/providers.md CHANGED
@@ -18,6 +18,15 @@ specific provider implementation.
18
18
  - `createGeminiAdapter(options?)`
19
19
  - Default adapter id: `gemini`
20
20
  - Capabilities: chat, image generation, model generation
21
+ - `createGrokAdapter(options?)`
22
+ - Default adapter id: `grok`
23
+ - Capabilities: chat, image generation, model generation
24
+ - `createMetaAIAdapter(options?)`
25
+ - Default adapter id: `meta-ai`
26
+ - Capabilities: chat, model generation
27
+ - `createPixelverseAdapter(options?)`
28
+ - Default adapter id: `pixelverse`
29
+ - Capabilities: video generation, balance
21
30
 
22
31
  ## Network Citizenship Defaults
23
32
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasius/ai",
3
- "version": "1.1.6",
3
+ "version": "1.1.8",
4
4
  "description": "Plasius AI functions providing chatbot, text-to-speech, speech-to-text, and AI-generated images and videos",
5
5
  "keywords": [
6
6
  "chatbot",
@@ -38,10 +38,10 @@
38
38
  "author": "Plasius LTD <development@plasius.co.uk>",
39
39
  "license": "MIT",
40
40
  "dependencies": {
41
- "@plasius/entity-manager": "^1.0.5",
42
- "@plasius/error": "^1.0.3",
43
- "@plasius/profile": "^1.0.6",
44
- "@plasius/schema": "^1.2.1"
41
+ "@plasius/entity-manager": "^1.0.6",
42
+ "@plasius/error": "^1.0.5",
43
+ "@plasius/profile": "^1.0.7",
44
+ "@plasius/schema": "^1.2.2"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "react": "^19.1.0"
@@ -0,0 +1,39 @@
1
+ import {
2
+ AICapability,
3
+ type AICapabilityAdapter,
4
+ } from "./index.js";
5
+ import { createOpenAIAdapter, type OpenAIAdapterOptions } from "./openai-adapter.js";
6
+
7
+ export interface GrokAdapterOptions
8
+ extends Omit<OpenAIAdapterOptions, "id" | "baseUrl" | "defaultModels"> {
9
+ id?: string;
10
+ baseUrl?: string;
11
+ defaultModels?: {
12
+ chat?: string;
13
+ image?: string;
14
+ model?: string;
15
+ };
16
+ }
17
+
18
+ export function createGrokAdapter(
19
+ options: GrokAdapterOptions = {}
20
+ ): AICapabilityAdapter {
21
+ const base = createOpenAIAdapter({
22
+ ...options,
23
+ id: options.id ?? "grok",
24
+ baseUrl: options.baseUrl ?? "https://api.x.ai/v1",
25
+ defaultModels: {
26
+ chat: options.defaultModels?.chat ?? "grok-3-mini",
27
+ image: options.defaultModels?.image ?? "grok-2-image-1212",
28
+ model: options.defaultModels?.model ?? "grok-3-mini",
29
+ },
30
+ });
31
+
32
+ return {
33
+ id: base.id,
34
+ capabilities: [AICapability.Chat, AICapability.Image, AICapability.Model],
35
+ chatWithAI: base.chatWithAI,
36
+ generateImage: base.generateImage,
37
+ generateModel: base.generateModel,
38
+ };
39
+ }
@@ -303,3 +303,9 @@ export type { OpenAIAdapterOptions } from "./openai-adapter.js";
303
303
  export { createOpenAIAdapter } from "./openai-adapter.js";
304
304
  export type { GeminiAdapterOptions } from "./gemini-adapter.js";
305
305
  export { createGeminiAdapter } from "./gemini-adapter.js";
306
+ export type { GrokAdapterOptions } from "./grok-adapter.js";
307
+ export { createGrokAdapter } from "./grok-adapter.js";
308
+ export type { MetaAIAdapterOptions } from "./meta-ai-adapter.js";
309
+ export { createMetaAIAdapter } from "./meta-ai-adapter.js";
310
+ export type { PixelverseAdapterOptions } from "./pixelverse-adapter.js";
311
+ export { createPixelverseAdapter } from "./pixelverse-adapter.js";
@@ -0,0 +1,36 @@
1
+ import {
2
+ AICapability,
3
+ type AICapabilityAdapter,
4
+ } from "./index.js";
5
+ import { createOpenAIAdapter, type OpenAIAdapterOptions } from "./openai-adapter.js";
6
+
7
+ export interface MetaAIAdapterOptions
8
+ extends Omit<OpenAIAdapterOptions, "id" | "baseUrl" | "defaultModels"> {
9
+ id?: string;
10
+ baseUrl?: string;
11
+ defaultModels?: {
12
+ chat?: string;
13
+ model?: string;
14
+ };
15
+ }
16
+
17
+ export function createMetaAIAdapter(
18
+ options: MetaAIAdapterOptions = {}
19
+ ): AICapabilityAdapter {
20
+ const base = createOpenAIAdapter({
21
+ ...options,
22
+ id: options.id ?? "meta-ai",
23
+ baseUrl: options.baseUrl ?? "https://api.llama.com/compat/v1",
24
+ defaultModels: {
25
+ chat: options.defaultModels?.chat ?? "Llama-3.3-70B-Instruct",
26
+ model: options.defaultModels?.model ?? "Llama-3.3-70B-Instruct",
27
+ },
28
+ });
29
+
30
+ return {
31
+ id: base.id,
32
+ capabilities: [AICapability.Chat, AICapability.Model],
33
+ chatWithAI: base.chatWithAI,
34
+ generateModel: base.generateModel,
35
+ };
36
+ }
@@ -0,0 +1,211 @@
1
+ import { performance } from "node:perf_hooks";
2
+
3
+ import {
4
+ AICapability,
5
+ type AdapterBalanceRequest,
6
+ type AdapterVideoRequest,
7
+ type AICapabilityAdapter,
8
+ type BalanceCompletion,
9
+ type Completion,
10
+ } from "./index.js";
11
+ import type {
12
+ HttpVideoProviderAdapterConfig,
13
+ ProviderBalance,
14
+ VideoGenerationRequest,
15
+ VideoJobResult,
16
+ } from "./video-provider-adapter.js";
17
+ import { createHttpVideoProviderAdapter } from "./video-provider-adapter.js";
18
+
19
+ export interface PixelverseAdapterOptions {
20
+ id?: string;
21
+ apiBaseUrl?: string;
22
+ fetchFn?: typeof fetch;
23
+ httpPolicy?: HttpVideoProviderAdapterConfig["httpPolicy"];
24
+ polling?: {
25
+ maxRetries?: number;
26
+ delayMs?: number;
27
+ };
28
+ defaultVideoRequest?: Partial<Omit<VideoGenerationRequest, "imageId" | "prompt">>;
29
+ paths?: {
30
+ uploadImagePath?: string;
31
+ generateVideoPath?: string;
32
+ getVideoResultPath?: (videoId: number) => string;
33
+ getBalancePath?: string;
34
+ };
35
+ mapUploadImageId?: HttpVideoProviderAdapterConfig["mapUploadImageId"];
36
+ mapGeneratedVideoId?: HttpVideoProviderAdapterConfig["mapGeneratedVideoId"];
37
+ mapVideoResult?: HttpVideoProviderAdapterConfig["mapVideoResult"];
38
+ mapBalance?: HttpVideoProviderAdapterConfig["mapBalance"];
39
+ mapGenerateRequestBody?: HttpVideoProviderAdapterConfig["mapGenerateRequestBody"];
40
+ additionalHeaders?: HttpVideoProviderAdapterConfig["additionalHeaders"];
41
+ }
42
+
43
+ function normalizeBaseUrl(baseUrl: string | undefined): string {
44
+ const normalized = (baseUrl ?? "https://api.pixelverse.ai").trim();
45
+ return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
46
+ }
47
+
48
+ function createCompletionBase(
49
+ type: string,
50
+ model: string,
51
+ requestor: string,
52
+ durationMs: number,
53
+ usage?: Record<string, number>
54
+ ): Completion {
55
+ return {
56
+ partitionKey: requestor,
57
+ id: crypto.randomUUID(),
58
+ type,
59
+ model,
60
+ createdAt: new Date().toISOString(),
61
+ durationMs,
62
+ usage: usage ?? {},
63
+ };
64
+ }
65
+
66
+ async function waitForCompletion(
67
+ getVideoResult: (
68
+ videoId: number,
69
+ context: { apiKey: string; traceId: string; fetchFn?: typeof fetch }
70
+ ) => Promise<VideoJobResult>,
71
+ videoId: number,
72
+ apiKey: string,
73
+ maxRetries: number,
74
+ delayMs: number,
75
+ fetchFn: typeof fetch | undefined
76
+ ): Promise<string> {
77
+ for (let attempt = 0; attempt < maxRetries; attempt += 1) {
78
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
79
+
80
+ const result = await getVideoResult(videoId, {
81
+ apiKey,
82
+ traceId: crypto.randomUUID(),
83
+ fetchFn,
84
+ });
85
+
86
+ if (result.state === "completed" && result.videoUrl) {
87
+ return result.videoUrl;
88
+ }
89
+
90
+ if (result.state === "failed") {
91
+ throw new Error("Pixelverse video generation failed.");
92
+ }
93
+ }
94
+
95
+ throw new Error("Timed out waiting for Pixelverse video completion.");
96
+ }
97
+
98
+ export function createPixelverseAdapter(
99
+ options: PixelverseAdapterOptions = {}
100
+ ): AICapabilityAdapter {
101
+ const providerId = (options.id ?? "pixelverse").trim() || "pixelverse";
102
+ const baseUrl = normalizeBaseUrl(options.apiBaseUrl);
103
+
104
+ const httpAdapter = createHttpVideoProviderAdapter({
105
+ uploadImagePath:
106
+ options.paths?.uploadImagePath ?? `${baseUrl}/openapi/v1/image/upload`,
107
+ generateVideoPath:
108
+ options.paths?.generateVideoPath ?? `${baseUrl}/openapi/v1/video/generate`,
109
+ getVideoResultPath:
110
+ options.paths?.getVideoResultPath ??
111
+ ((videoId: number) => `${baseUrl}/openapi/v1/video/result/${videoId}`),
112
+ getBalancePath:
113
+ options.paths?.getBalancePath ?? `${baseUrl}/openapi/v1/account/balance`,
114
+ httpPolicy: options.httpPolicy,
115
+ mapUploadImageId: options.mapUploadImageId,
116
+ mapGeneratedVideoId: options.mapGeneratedVideoId,
117
+ mapVideoResult: options.mapVideoResult,
118
+ mapBalance: options.mapBalance,
119
+ mapGenerateRequestBody: options.mapGenerateRequestBody,
120
+ additionalHeaders: options.additionalHeaders,
121
+ });
122
+
123
+ const maxRetries = options.polling?.maxRetries ?? 20;
124
+ const delayMs = options.polling?.delayMs ?? 3000;
125
+
126
+ const produceVideo = async (request: AdapterVideoRequest) => {
127
+ const startedAt = performance.now();
128
+ const combinedPrompt = request.context
129
+ ? `${request.context}\n\n${request.input}`
130
+ : request.input;
131
+
132
+ const uploaded = await httpAdapter.uploadImage(request.image, {
133
+ apiKey: request.apiKey,
134
+ traceId: request.traceId,
135
+ fetchFn: options.fetchFn,
136
+ });
137
+
138
+ const generated = await httpAdapter.generateVideo(
139
+ {
140
+ imageId: uploaded.imageId,
141
+ prompt: combinedPrompt,
142
+ model: request.model,
143
+ ...options.defaultVideoRequest,
144
+ },
145
+ {
146
+ apiKey: request.apiKey,
147
+ traceId: crypto.randomUUID(),
148
+ fetchFn: options.fetchFn,
149
+ }
150
+ );
151
+
152
+ const videoUrl = await waitForCompletion(
153
+ httpAdapter.getVideoResult,
154
+ generated.videoId,
155
+ request.apiKey,
156
+ maxRetries,
157
+ delayMs,
158
+ options.fetchFn
159
+ );
160
+
161
+ const durationMs = performance.now() - startedAt;
162
+ const base = createCompletionBase(
163
+ "video",
164
+ request.model,
165
+ request.userId,
166
+ durationMs,
167
+ { providerVideoId: generated.videoId }
168
+ );
169
+
170
+ return {
171
+ ...base,
172
+ url: new URL(videoUrl),
173
+ };
174
+ };
175
+
176
+ const checkBalance = async (
177
+ request: AdapterBalanceRequest
178
+ ): Promise<BalanceCompletion> => {
179
+ const startedAt = performance.now();
180
+ const providerBalance: ProviderBalance = httpAdapter.getBalance
181
+ ? await httpAdapter.getBalance({
182
+ apiKey: request.apiKey,
183
+ traceId: request.traceId,
184
+ fetchFn: options.fetchFn,
185
+ })
186
+ : {
187
+ monthlyCredit: 0,
188
+ packageCredit: 0,
189
+ };
190
+
191
+ const durationMs = performance.now() - startedAt;
192
+ const base = createCompletionBase(
193
+ "balanceCompletion",
194
+ "",
195
+ request.userId,
196
+ durationMs
197
+ );
198
+
199
+ return {
200
+ ...base,
201
+ balance: providerBalance.monthlyCredit + providerBalance.packageCredit,
202
+ };
203
+ };
204
+
205
+ return {
206
+ id: providerId,
207
+ capabilities: [AICapability.Video, AICapability.Balance],
208
+ produceVideo,
209
+ checkBalance,
210
+ };
211
+ }