@juspay/neurolink 9.64.0 → 9.65.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/CHANGELOG.md +6 -0
- package/README.md +18 -17
- package/dist/adapters/providerImageAdapter.js +29 -1
- package/dist/adapters/replicate/auth.d.ts +19 -0
- package/dist/adapters/replicate/auth.js +32 -0
- package/dist/adapters/replicate/predictionLifecycle.d.ts +46 -0
- package/dist/adapters/replicate/predictionLifecycle.js +283 -0
- package/dist/adapters/video/klingVideoHandler.d.ts +37 -0
- package/dist/adapters/video/klingVideoHandler.js +305 -0
- package/dist/adapters/video/replicateVideoHandler.d.ts +29 -0
- package/dist/adapters/video/replicateVideoHandler.js +157 -0
- package/dist/adapters/video/runwayVideoHandler.d.ts +32 -0
- package/dist/adapters/video/runwayVideoHandler.js +316 -0
- package/dist/adapters/video/vertexVideoHandler.d.ts +19 -1
- package/dist/adapters/video/vertexVideoHandler.js +33 -9
- package/dist/autoresearch/runner.js +8 -2
- package/dist/avatar/index.d.ts +13 -0
- package/dist/avatar/index.js +13 -0
- package/dist/avatar/providers/DIDAvatar.d.ts +49 -0
- package/dist/avatar/providers/DIDAvatar.js +501 -0
- package/dist/avatar/providers/HeyGenAvatar.d.ts +30 -0
- package/dist/avatar/providers/HeyGenAvatar.js +337 -0
- package/dist/avatar/providers/ReplicateAvatar.d.ts +36 -0
- package/dist/avatar/providers/ReplicateAvatar.js +267 -0
- package/dist/browser/neurolink.min.js +633 -610
- package/dist/cli/commands/mcp.js +29 -0
- package/dist/cli/commands/proxy.js +24 -5
- package/dist/cli/factories/commandFactory.d.ts +11 -1
- package/dist/cli/factories/commandFactory.js +291 -38
- package/dist/constants/contextWindows.js +101 -0
- package/dist/constants/enums.d.ts +273 -2
- package/dist/constants/enums.js +290 -1
- package/dist/constants/videoErrors.d.ts +4 -0
- package/dist/constants/videoErrors.js +4 -0
- package/dist/core/baseProvider.d.ts +22 -2
- package/dist/core/baseProvider.js +217 -11
- package/dist/core/constants.d.ts +11 -0
- package/dist/core/constants.js +69 -1
- package/dist/core/redisConversationMemoryManager.js +6 -0
- package/dist/evaluation/index.d.ts +2 -0
- package/dist/evaluation/index.js +4 -0
- package/dist/factories/providerFactory.js +7 -1
- package/dist/factories/providerRegistry.js +202 -5
- package/dist/features/ppt/contentPlanner.js +42 -14
- package/dist/index.d.ts +9 -1
- package/dist/index.js +16 -1
- package/dist/lib/adapters/providerImageAdapter.js +29 -1
- package/dist/lib/adapters/replicate/auth.d.ts +19 -0
- package/dist/lib/adapters/replicate/auth.js +33 -0
- package/dist/lib/adapters/replicate/predictionLifecycle.d.ts +46 -0
- package/dist/lib/adapters/replicate/predictionLifecycle.js +284 -0
- package/dist/lib/adapters/video/klingVideoHandler.d.ts +37 -0
- package/dist/lib/adapters/video/klingVideoHandler.js +306 -0
- package/dist/lib/adapters/video/replicateVideoHandler.d.ts +29 -0
- package/dist/lib/adapters/video/replicateVideoHandler.js +158 -0
- package/dist/lib/adapters/video/runwayVideoHandler.d.ts +32 -0
- package/dist/lib/adapters/video/runwayVideoHandler.js +317 -0
- package/dist/lib/adapters/video/vertexVideoHandler.d.ts +19 -1
- package/dist/lib/adapters/video/vertexVideoHandler.js +33 -9
- package/dist/lib/autoresearch/runner.js +8 -2
- package/dist/lib/avatar/index.d.ts +13 -0
- package/dist/lib/avatar/index.js +14 -0
- package/dist/lib/avatar/providers/DIDAvatar.d.ts +49 -0
- package/dist/lib/avatar/providers/DIDAvatar.js +502 -0
- package/dist/lib/avatar/providers/HeyGenAvatar.d.ts +30 -0
- package/dist/lib/avatar/providers/HeyGenAvatar.js +338 -0
- package/dist/lib/avatar/providers/ReplicateAvatar.d.ts +36 -0
- package/dist/lib/avatar/providers/ReplicateAvatar.js +268 -0
- package/dist/lib/constants/contextWindows.js +101 -0
- package/dist/lib/constants/enums.d.ts +273 -2
- package/dist/lib/constants/enums.js +290 -1
- package/dist/lib/constants/videoErrors.d.ts +4 -0
- package/dist/lib/constants/videoErrors.js +4 -0
- package/dist/lib/core/baseProvider.d.ts +22 -2
- package/dist/lib/core/baseProvider.js +217 -11
- package/dist/lib/core/constants.d.ts +11 -0
- package/dist/lib/core/constants.js +69 -1
- package/dist/lib/core/redisConversationMemoryManager.js +6 -0
- package/dist/lib/evaluation/index.d.ts +2 -0
- package/dist/lib/evaluation/index.js +4 -0
- package/dist/lib/factories/providerFactory.js +7 -1
- package/dist/lib/factories/providerRegistry.js +202 -5
- package/dist/lib/features/ppt/contentPlanner.js +42 -14
- package/dist/lib/index.d.ts +9 -1
- package/dist/lib/index.js +16 -1
- package/dist/lib/middleware/builtin/lifecycle.js +39 -9
- package/dist/lib/music/index.d.ts +13 -0
- package/dist/lib/music/index.js +14 -0
- package/dist/lib/music/providers/BeatovenMusic.d.ts +31 -0
- package/dist/lib/music/providers/BeatovenMusic.js +334 -0
- package/dist/lib/music/providers/ElevenLabsMusic.d.ts +30 -0
- package/dist/lib/music/providers/ElevenLabsMusic.js +169 -0
- package/dist/lib/music/providers/LyriaMusic.d.ts +29 -0
- package/dist/lib/music/providers/LyriaMusic.js +173 -0
- package/dist/lib/music/providers/ReplicateMusic.d.ts +31 -0
- package/dist/lib/music/providers/ReplicateMusic.js +262 -0
- package/dist/lib/neurolink.d.ts +30 -0
- package/dist/lib/neurolink.js +323 -77
- package/dist/lib/providers/amazonBedrock.d.ts +10 -0
- package/dist/lib/providers/amazonBedrock.js +94 -39
- package/dist/lib/providers/anthropic.js +55 -7
- package/dist/lib/providers/anthropicBaseProvider.js +1 -1
- package/dist/lib/providers/azureOpenai.js +66 -17
- package/dist/lib/providers/cloudflare.d.ts +35 -0
- package/dist/lib/providers/cloudflare.js +174 -0
- package/dist/lib/providers/cohere.d.ts +52 -0
- package/dist/lib/providers/cohere.js +253 -0
- package/dist/lib/providers/deepseek.js +72 -17
- package/dist/lib/providers/fireworks.d.ts +33 -0
- package/dist/lib/providers/fireworks.js +164 -0
- package/dist/lib/providers/googleAiStudio.js +45 -6
- package/dist/lib/providers/googleNativeGemini3.d.ts +24 -1
- package/dist/lib/providers/googleNativeGemini3.js +173 -21
- package/dist/lib/providers/googleVertex.js +173 -17
- package/dist/lib/providers/groq.d.ts +33 -0
- package/dist/lib/providers/groq.js +181 -0
- package/dist/lib/providers/huggingFace.js +9 -8
- package/dist/lib/providers/ideogram.d.ts +34 -0
- package/dist/lib/providers/ideogram.js +184 -0
- package/dist/lib/providers/index.d.ts +13 -0
- package/dist/lib/providers/index.js +13 -0
- package/dist/lib/providers/jina.d.ts +59 -0
- package/dist/lib/providers/jina.js +218 -0
- package/dist/lib/providers/llamaCpp.js +14 -46
- package/dist/lib/providers/lmStudio.js +14 -47
- package/dist/lib/providers/mistral.js +7 -7
- package/dist/lib/providers/nvidiaNim.js +160 -19
- package/dist/lib/providers/ollama.js +7 -7
- package/dist/lib/providers/openAI.d.ts +22 -1
- package/dist/lib/providers/openAI.js +181 -0
- package/dist/lib/providers/openRouter.js +35 -23
- package/dist/lib/providers/openaiCompatible.js +9 -8
- package/dist/lib/providers/perplexity.d.ts +33 -0
- package/dist/lib/providers/perplexity.js +179 -0
- package/dist/lib/providers/recraft.d.ts +34 -0
- package/dist/lib/providers/recraft.js +197 -0
- package/dist/lib/providers/replicate.d.ts +75 -0
- package/dist/lib/providers/replicate.js +403 -0
- package/dist/lib/providers/stability.d.ts +37 -0
- package/dist/lib/providers/stability.js +191 -0
- package/dist/lib/providers/togetherAi.d.ts +33 -0
- package/dist/lib/providers/togetherAi.js +176 -0
- package/dist/lib/providers/voyage.d.ts +47 -0
- package/dist/lib/providers/voyage.js +177 -0
- package/dist/lib/providers/xai.d.ts +33 -0
- package/dist/lib/providers/xai.js +172 -0
- package/dist/lib/telemetry/index.d.ts +1 -1
- package/dist/lib/telemetry/index.js +1 -1
- package/dist/lib/telemetry/tracers.d.ts +19 -0
- package/dist/lib/telemetry/tracers.js +19 -0
- package/dist/lib/telemetry/withSpan.d.ts +35 -0
- package/dist/lib/telemetry/withSpan.js +103 -0
- package/dist/lib/types/avatar.d.ts +143 -0
- package/dist/lib/types/avatar.js +20 -0
- package/dist/lib/types/cli.d.ts +6 -0
- package/dist/lib/types/generate.d.ts +62 -5
- package/dist/lib/types/index.d.ts +5 -0
- package/dist/lib/types/index.js +7 -0
- package/dist/lib/types/middleware.d.ts +27 -0
- package/dist/lib/types/multimodal.d.ts +35 -2
- package/dist/lib/types/music.d.ts +165 -0
- package/dist/lib/types/music.js +21 -0
- package/dist/lib/types/providers.d.ts +144 -1
- package/dist/lib/types/replicate.d.ts +67 -0
- package/dist/lib/types/replicate.js +10 -0
- package/dist/lib/types/safeFetch.d.ts +15 -0
- package/dist/lib/types/safeFetch.js +7 -0
- package/dist/lib/types/stream.d.ts +2 -1
- package/dist/lib/types/tools.d.ts +13 -0
- package/dist/lib/types/video.d.ts +89 -0
- package/dist/lib/types/video.js +15 -0
- package/dist/lib/utils/avatarProcessor.d.ts +68 -0
- package/dist/lib/utils/avatarProcessor.js +172 -0
- package/dist/lib/utils/cloneOptions.d.ts +36 -0
- package/dist/lib/utils/cloneOptions.js +62 -0
- package/dist/lib/utils/lifecycleCallbacks.d.ts +51 -8
- package/dist/lib/utils/lifecycleCallbacks.js +82 -26
- package/dist/lib/utils/lifecycleTimeout.d.ts +25 -0
- package/dist/lib/utils/lifecycleTimeout.js +39 -0
- package/dist/lib/utils/logSanitize.d.ts +49 -0
- package/dist/lib/utils/logSanitize.js +170 -0
- package/dist/lib/utils/loggingFetch.d.ts +29 -0
- package/dist/lib/utils/loggingFetch.js +60 -0
- package/dist/lib/utils/messageBuilder.js +43 -25
- package/dist/lib/utils/modelChoices.js +236 -3
- package/dist/lib/utils/musicProcessor.d.ts +67 -0
- package/dist/lib/utils/musicProcessor.js +189 -0
- package/dist/lib/utils/optionsConversion.js +3 -2
- package/dist/lib/utils/parameterValidation.js +14 -4
- package/dist/lib/utils/pricing.js +193 -0
- package/dist/lib/utils/providerConfig.d.ts +55 -0
- package/dist/lib/utils/providerConfig.js +224 -0
- package/dist/lib/utils/safeFetch.d.ts +26 -0
- package/dist/lib/utils/safeFetch.js +83 -0
- package/dist/lib/utils/sizeGuard.d.ts +34 -0
- package/dist/lib/utils/sizeGuard.js +45 -0
- package/dist/lib/utils/ssrfGuard.d.ts +52 -0
- package/dist/lib/utils/ssrfGuard.js +411 -0
- package/dist/lib/utils/videoProcessor.d.ts +60 -0
- package/dist/lib/utils/videoProcessor.js +201 -0
- package/dist/lib/voice/providers/FishAudioTTS.d.ts +27 -0
- package/dist/lib/voice/providers/FishAudioTTS.js +183 -0
- package/dist/lib/workflow/core/ensembleExecutor.js +26 -9
- package/dist/middleware/builtin/lifecycle.js +39 -9
- package/dist/music/index.d.ts +13 -0
- package/dist/music/index.js +13 -0
- package/dist/music/providers/BeatovenMusic.d.ts +31 -0
- package/dist/music/providers/BeatovenMusic.js +333 -0
- package/dist/music/providers/ElevenLabsMusic.d.ts +30 -0
- package/dist/music/providers/ElevenLabsMusic.js +168 -0
- package/dist/music/providers/LyriaMusic.d.ts +29 -0
- package/dist/music/providers/LyriaMusic.js +172 -0
- package/dist/music/providers/ReplicateMusic.d.ts +31 -0
- package/dist/music/providers/ReplicateMusic.js +261 -0
- package/dist/neurolink.d.ts +30 -0
- package/dist/neurolink.js +323 -77
- package/dist/providers/amazonBedrock.d.ts +10 -0
- package/dist/providers/amazonBedrock.js +94 -39
- package/dist/providers/anthropic.js +55 -7
- package/dist/providers/anthropicBaseProvider.js +1 -1
- package/dist/providers/azureOpenai.js +66 -17
- package/dist/providers/cloudflare.d.ts +35 -0
- package/dist/providers/cloudflare.js +173 -0
- package/dist/providers/cohere.d.ts +52 -0
- package/dist/providers/cohere.js +252 -0
- package/dist/providers/deepseek.js +72 -17
- package/dist/providers/fireworks.d.ts +33 -0
- package/dist/providers/fireworks.js +163 -0
- package/dist/providers/googleAiStudio.js +45 -6
- package/dist/providers/googleNativeGemini3.d.ts +24 -1
- package/dist/providers/googleNativeGemini3.js +173 -21
- package/dist/providers/googleVertex.js +173 -17
- package/dist/providers/groq.d.ts +33 -0
- package/dist/providers/groq.js +180 -0
- package/dist/providers/huggingFace.js +9 -8
- package/dist/providers/ideogram.d.ts +34 -0
- package/dist/providers/ideogram.js +183 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/jina.d.ts +59 -0
- package/dist/providers/jina.js +217 -0
- package/dist/providers/llamaCpp.js +14 -46
- package/dist/providers/lmStudio.js +14 -47
- package/dist/providers/mistral.js +7 -7
- package/dist/providers/nvidiaNim.js +160 -19
- package/dist/providers/ollama.js +7 -7
- package/dist/providers/openAI.d.ts +22 -1
- package/dist/providers/openAI.js +181 -0
- package/dist/providers/openRouter.js +35 -23
- package/dist/providers/openaiCompatible.js +9 -8
- package/dist/providers/perplexity.d.ts +33 -0
- package/dist/providers/perplexity.js +178 -0
- package/dist/providers/recraft.d.ts +34 -0
- package/dist/providers/recraft.js +196 -0
- package/dist/providers/replicate.d.ts +75 -0
- package/dist/providers/replicate.js +402 -0
- package/dist/providers/stability.d.ts +37 -0
- package/dist/providers/stability.js +190 -0
- package/dist/providers/togetherAi.d.ts +33 -0
- package/dist/providers/togetherAi.js +175 -0
- package/dist/providers/voyage.d.ts +47 -0
- package/dist/providers/voyage.js +176 -0
- package/dist/providers/xai.d.ts +33 -0
- package/dist/providers/xai.js +171 -0
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/telemetry/tracers.d.ts +19 -0
- package/dist/telemetry/tracers.js +19 -0
- package/dist/telemetry/withSpan.d.ts +35 -0
- package/dist/telemetry/withSpan.js +103 -0
- package/dist/types/avatar.d.ts +143 -0
- package/dist/types/avatar.js +19 -0
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/generate.d.ts +62 -5
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +7 -0
- package/dist/types/middleware.d.ts +27 -0
- package/dist/types/multimodal.d.ts +35 -2
- package/dist/types/music.d.ts +165 -0
- package/dist/types/music.js +20 -0
- package/dist/types/providers.d.ts +144 -1
- package/dist/types/replicate.d.ts +67 -0
- package/dist/types/replicate.js +9 -0
- package/dist/types/safeFetch.d.ts +15 -0
- package/dist/types/safeFetch.js +6 -0
- package/dist/types/stream.d.ts +2 -1
- package/dist/types/tools.d.ts +13 -0
- package/dist/types/video.d.ts +89 -0
- package/dist/types/video.js +14 -0
- package/dist/utils/avatarProcessor.d.ts +68 -0
- package/dist/utils/avatarProcessor.js +171 -0
- package/dist/utils/cloneOptions.d.ts +36 -0
- package/dist/utils/cloneOptions.js +61 -0
- package/dist/utils/lifecycleCallbacks.d.ts +51 -8
- package/dist/utils/lifecycleCallbacks.js +82 -26
- package/dist/utils/lifecycleTimeout.d.ts +25 -0
- package/dist/utils/lifecycleTimeout.js +38 -0
- package/dist/utils/logSanitize.d.ts +49 -0
- package/dist/utils/logSanitize.js +169 -0
- package/dist/utils/loggingFetch.d.ts +29 -0
- package/dist/utils/loggingFetch.js +59 -0
- package/dist/utils/messageBuilder.js +43 -25
- package/dist/utils/modelChoices.js +236 -3
- package/dist/utils/musicProcessor.d.ts +67 -0
- package/dist/utils/musicProcessor.js +188 -0
- package/dist/utils/optionsConversion.js +3 -2
- package/dist/utils/parameterValidation.js +14 -4
- package/dist/utils/pricing.js +193 -0
- package/dist/utils/providerConfig.d.ts +55 -0
- package/dist/utils/providerConfig.js +224 -0
- package/dist/utils/safeFetch.d.ts +26 -0
- package/dist/utils/safeFetch.js +82 -0
- package/dist/utils/sizeGuard.d.ts +34 -0
- package/dist/utils/sizeGuard.js +44 -0
- package/dist/utils/ssrfGuard.d.ts +52 -0
- package/dist/utils/ssrfGuard.js +410 -0
- package/dist/utils/videoProcessor.d.ts +60 -0
- package/dist/utils/videoProcessor.js +200 -0
- package/dist/voice/providers/FishAudioTTS.d.ts +27 -0
- package/dist/voice/providers/FishAudioTTS.js +182 -0
- package/dist/workflow/core/ensembleExecutor.js +26 -9
- package/package.json +32 -5
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { LanguageModel } from "ai";
|
|
2
|
+
import type { AIProviderName } from "../constants/enums.js";
|
|
3
|
+
import { BaseProvider } from "../core/baseProvider.js";
|
|
4
|
+
import type { EnhancedGenerateResult, NeurolinkCredentials, StreamOptions, StreamResult, TextGenerationOptions, ValidationSchema } from "../types/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Replicate LLM Provider — predict-then-stream pattern.
|
|
7
|
+
*
|
|
8
|
+
* Replicate's prediction API is asynchronous: POST `/predictions`, poll
|
|
9
|
+
* until `succeeded`, fetch the output. Their streaming endpoint is SSE
|
|
10
|
+
* on a separate URL and not OpenAI-compatible.
|
|
11
|
+
*
|
|
12
|
+
* For a first pass we run the prediction synchronously (with the
|
|
13
|
+
* `Prefer: wait=60` hint baked into `predict()`) and synthesize a single-
|
|
14
|
+
* chunk stream. Future revisions can swap in true SSE streaming when
|
|
15
|
+
* the prediction lifecycle helper grows support for it.
|
|
16
|
+
*
|
|
17
|
+
* For image-gen models on Replicate (FLUX, SDXL, etc.) use Replicate via
|
|
18
|
+
* `output: { mode: "image" }` once the routing layer recognises the
|
|
19
|
+
* `flux` / `sdxl` prefixes (already in IMAGE_GENERATION_MODELS for
|
|
20
|
+
* direct Stability/Ideogram/Recraft; Replicate-hosted FLUX runs through
|
|
21
|
+
* `executeImageGeneration` overridden below when the model id matches).
|
|
22
|
+
*
|
|
23
|
+
* Tool calling is not supported (Replicate predictions are stateless and
|
|
24
|
+
* don't carry function-call metadata reliably).
|
|
25
|
+
*
|
|
26
|
+
* @see https://replicate.com/docs/reference/http
|
|
27
|
+
*/
|
|
28
|
+
export declare class ReplicateProvider extends BaseProvider {
|
|
29
|
+
private readonly apiToken;
|
|
30
|
+
private readonly baseURL?;
|
|
31
|
+
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["replicate"]);
|
|
32
|
+
protected getProviderName(): AIProviderName;
|
|
33
|
+
protected getDefaultModel(): string;
|
|
34
|
+
supportsTools(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Replicate doesn't expose a chat-completions endpoint we can wrap as
|
|
37
|
+
* an AI SDK `LanguageModel`. This getter is consulted by `streamText`
|
|
38
|
+
* (which we intentionally bypass) and by middleware injection (which
|
|
39
|
+
* also bypasses to executeStream below). Throwing here keeps the
|
|
40
|
+
* contract honest.
|
|
41
|
+
*/
|
|
42
|
+
protected getAISDKModel(): LanguageModel;
|
|
43
|
+
/**
|
|
44
|
+
* Override generate() to bypass BaseProvider's AI-SDK path entirely.
|
|
45
|
+
*
|
|
46
|
+
* BaseProvider.runGenerateInActiveContext() calls prepareGenerationContext()
|
|
47
|
+
* which unconditionally invokes getAISDKModelWithMiddleware() → getAISDKModel().
|
|
48
|
+
* For Replicate that throws, because Replicate uses the predictions API, not
|
|
49
|
+
* the Vercel AI SDK chat-completions contract.
|
|
50
|
+
*
|
|
51
|
+
* Special modes (image, video, avatar, music) are handled exactly as in the
|
|
52
|
+
* base class. Plain text generation is routed through executeStream() and
|
|
53
|
+
* unwrapped into an EnhancedGenerateResult so callers get a consistent shape.
|
|
54
|
+
*/
|
|
55
|
+
generate(optionsOrPrompt: import("../types/index.js").TextGenerationOptions | string, _analysisSchema?: import("../types/index.js").ValidationSchema): Promise<EnhancedGenerateResult | null>;
|
|
56
|
+
protected executeStream(options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Image-gen routing for Replicate-hosted image models (FLUX, SDXL, etc.).
|
|
59
|
+
*
|
|
60
|
+
* The dispatcher in baseProvider routes here when the `model` name
|
|
61
|
+
* matches an entry in `IMAGE_GENERATION_MODELS`. Replicate model ids
|
|
62
|
+
* use `owner/name(:version)?` format — image models route here as
|
|
63
|
+
* long as the caller passes the FQMN.
|
|
64
|
+
*/
|
|
65
|
+
protected executeImageGeneration(options: TextGenerationOptions): Promise<EnhancedGenerateResult>;
|
|
66
|
+
protected formatProviderError(error: unknown): Error;
|
|
67
|
+
validateConfiguration(): Promise<boolean>;
|
|
68
|
+
getConfiguration(): {
|
|
69
|
+
provider: AIProviderName;
|
|
70
|
+
model: string;
|
|
71
|
+
defaultModel: string;
|
|
72
|
+
baseURL: string | undefined;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export default ReplicateProvider;
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { ErrorCategory, ErrorSeverity, ReplicateModels, } from "../constants/enums.js";
|
|
2
|
+
import { BaseProvider } from "../core/baseProvider.js";
|
|
3
|
+
import { getReplicateAuth } from "../adapters/replicate/auth.js";
|
|
4
|
+
import { downloadPredictionOutput, predict, } from "../adapters/replicate/predictionLifecycle.js";
|
|
5
|
+
import { MAX_IMAGE_BYTES } from "../utils/sizeGuard.js";
|
|
6
|
+
import { isNeuroLink } from "../neurolink.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
import { ERROR_CODES, NeuroLinkError } from "../utils/errorHandling.js";
|
|
9
|
+
import { createReplicateConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
10
|
+
const getDefaultReplicateModel = () => getProviderModel("REPLICATE_MODEL", ReplicateModels.LLAMA_3_70B_INSTRUCT);
|
|
11
|
+
/**
|
|
12
|
+
* Render a chat-style options object as a single prompt string suitable
|
|
13
|
+
* for Replicate's prediction API. Replicate-hosted Llama / Mistral models
|
|
14
|
+
* expect a flat `prompt` (or model-specific `messages`) input — they don't
|
|
15
|
+
* implement OpenAI's chat-completions contract uniformly.
|
|
16
|
+
*/
|
|
17
|
+
function buildPromptFromOptions(options) {
|
|
18
|
+
const opts = options;
|
|
19
|
+
const userText = opts.prompt ?? opts.input?.text ?? "";
|
|
20
|
+
const system = opts.systemPrompt;
|
|
21
|
+
if (system) {
|
|
22
|
+
return `${system}\n\n${userText}`;
|
|
23
|
+
}
|
|
24
|
+
return userText;
|
|
25
|
+
}
|
|
26
|
+
function flattenReplicateOutput(output) {
|
|
27
|
+
if (typeof output === "string") {
|
|
28
|
+
return output;
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(output)) {
|
|
31
|
+
return output
|
|
32
|
+
.map((part) => (typeof part === "string" ? part : ""))
|
|
33
|
+
.join("");
|
|
34
|
+
}
|
|
35
|
+
return "";
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Replicate LLM Provider — predict-then-stream pattern.
|
|
39
|
+
*
|
|
40
|
+
* Replicate's prediction API is asynchronous: POST `/predictions`, poll
|
|
41
|
+
* until `succeeded`, fetch the output. Their streaming endpoint is SSE
|
|
42
|
+
* on a separate URL and not OpenAI-compatible.
|
|
43
|
+
*
|
|
44
|
+
* For a first pass we run the prediction synchronously (with the
|
|
45
|
+
* `Prefer: wait=60` hint baked into `predict()`) and synthesize a single-
|
|
46
|
+
* chunk stream. Future revisions can swap in true SSE streaming when
|
|
47
|
+
* the prediction lifecycle helper grows support for it.
|
|
48
|
+
*
|
|
49
|
+
* For image-gen models on Replicate (FLUX, SDXL, etc.) use Replicate via
|
|
50
|
+
* `output: { mode: "image" }` once the routing layer recognises the
|
|
51
|
+
* `flux` / `sdxl` prefixes (already in IMAGE_GENERATION_MODELS for
|
|
52
|
+
* direct Stability/Ideogram/Recraft; Replicate-hosted FLUX runs through
|
|
53
|
+
* `executeImageGeneration` overridden below when the model id matches).
|
|
54
|
+
*
|
|
55
|
+
* Tool calling is not supported (Replicate predictions are stateless and
|
|
56
|
+
* don't carry function-call metadata reliably).
|
|
57
|
+
*
|
|
58
|
+
* @see https://replicate.com/docs/reference/http
|
|
59
|
+
*/
|
|
60
|
+
export class ReplicateProvider extends BaseProvider {
|
|
61
|
+
apiToken;
|
|
62
|
+
baseURL;
|
|
63
|
+
constructor(modelName, sdk, _region, credentials) {
|
|
64
|
+
const validatedNeurolink = isNeuroLink(sdk) ? sdk : undefined;
|
|
65
|
+
super(modelName, "replicate", validatedNeurolink);
|
|
66
|
+
const overrideToken = credentials?.apiToken?.trim();
|
|
67
|
+
this.apiToken =
|
|
68
|
+
overrideToken && overrideToken.length > 0
|
|
69
|
+
? overrideToken
|
|
70
|
+
: validateApiKey(createReplicateConfig());
|
|
71
|
+
this.baseURL = credentials?.baseUrl;
|
|
72
|
+
logger.debug("Replicate Provider initialized", {
|
|
73
|
+
modelName: this.modelName,
|
|
74
|
+
baseURL: this.baseURL,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
getProviderName() {
|
|
78
|
+
return this.providerName;
|
|
79
|
+
}
|
|
80
|
+
getDefaultModel() {
|
|
81
|
+
return getDefaultReplicateModel();
|
|
82
|
+
}
|
|
83
|
+
supportsTools() {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Replicate doesn't expose a chat-completions endpoint we can wrap as
|
|
88
|
+
* an AI SDK `LanguageModel`. This getter is consulted by `streamText`
|
|
89
|
+
* (which we intentionally bypass) and by middleware injection (which
|
|
90
|
+
* also bypasses to executeStream below). Throwing here keeps the
|
|
91
|
+
* contract honest.
|
|
92
|
+
*/
|
|
93
|
+
getAISDKModel() {
|
|
94
|
+
throw new Error("Replicate routes through the predictions API, not the AI SDK chat models. Streaming uses the predict-then-stream path inside executeStream.");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Override generate() to bypass BaseProvider's AI-SDK path entirely.
|
|
98
|
+
*
|
|
99
|
+
* BaseProvider.runGenerateInActiveContext() calls prepareGenerationContext()
|
|
100
|
+
* which unconditionally invokes getAISDKModelWithMiddleware() → getAISDKModel().
|
|
101
|
+
* For Replicate that throws, because Replicate uses the predictions API, not
|
|
102
|
+
* the Vercel AI SDK chat-completions contract.
|
|
103
|
+
*
|
|
104
|
+
* Special modes (image, video, avatar, music) are handled exactly as in the
|
|
105
|
+
* base class. Plain text generation is routed through executeStream() and
|
|
106
|
+
* unwrapped into an EnhancedGenerateResult so callers get a consistent shape.
|
|
107
|
+
*/
|
|
108
|
+
async generate(optionsOrPrompt, _analysisSchema) {
|
|
109
|
+
const options = typeof optionsOrPrompt === "string"
|
|
110
|
+
? { prompt: optionsOrPrompt }
|
|
111
|
+
: optionsOrPrompt;
|
|
112
|
+
const { IMAGE_GENERATION_MODELS } = await import("../core/constants.js");
|
|
113
|
+
// Delegate special output modes to base class (which never calls getAISDKModel for these)
|
|
114
|
+
if (options.output?.mode === "video" ||
|
|
115
|
+
options.output?.mode === "avatar" ||
|
|
116
|
+
options.output?.mode === "music") {
|
|
117
|
+
return super.generate(options, _analysisSchema);
|
|
118
|
+
}
|
|
119
|
+
// Image-gen models: delegate to base which calls executeImageGeneration()
|
|
120
|
+
const isImageModel = IMAGE_GENERATION_MODELS.some((m) => this.modelName.includes(m));
|
|
121
|
+
const requestsNonImageOutput = options.output?.format === "json" ||
|
|
122
|
+
options.output?.format === "structured" ||
|
|
123
|
+
options.output?.format === "text";
|
|
124
|
+
if (isImageModel && !requestsNonImageOutput) {
|
|
125
|
+
return super.generate(options, _analysisSchema);
|
|
126
|
+
}
|
|
127
|
+
// Structured / JSON output is not natively supported by the Replicate
|
|
128
|
+
// predictions API. Surface a clear error instead of silently returning
|
|
129
|
+
// unvalidated plain text.
|
|
130
|
+
if (options.output?.format === "json" ||
|
|
131
|
+
options.output?.format === "structured" ||
|
|
132
|
+
(_analysisSchema !== null && _analysisSchema !== undefined)) {
|
|
133
|
+
throw new NeuroLinkError({
|
|
134
|
+
code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
|
|
135
|
+
message: "Replicate models do not support structured-output / JSON schema. " +
|
|
136
|
+
"Remove output.format or _analysisSchema, or use a provider that " +
|
|
137
|
+
"implements the OpenAI chat-completions contract (e.g. openai, anthropic).",
|
|
138
|
+
category: ErrorCategory.VALIDATION,
|
|
139
|
+
severity: ErrorSeverity.MEDIUM,
|
|
140
|
+
retriable: false,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// Plain text generation — use the predict-then-stream path directly.
|
|
144
|
+
// Pass `input.text` as the user text only; `systemPrompt` is forwarded
|
|
145
|
+
// separately so `buildPromptFromOptions` inside executeStream prepends it
|
|
146
|
+
// exactly once. Do NOT concatenate systemText here or the system prompt
|
|
147
|
+
// would appear twice in the final API request.
|
|
148
|
+
const userText = options.prompt ?? options.input?.text ?? "";
|
|
149
|
+
const startTime = Date.now();
|
|
150
|
+
const streamResult = await this.executeStream({
|
|
151
|
+
input: { text: userText },
|
|
152
|
+
systemPrompt: options.systemPrompt,
|
|
153
|
+
maxTokens: options.maxTokens,
|
|
154
|
+
temperature: options.temperature,
|
|
155
|
+
abortSignal: options.abortSignal,
|
|
156
|
+
timeout: options.timeout,
|
|
157
|
+
});
|
|
158
|
+
// Collect all chunks from the single-chunk stream
|
|
159
|
+
let content = "";
|
|
160
|
+
for await (const chunk of streamResult.stream) {
|
|
161
|
+
if ("content" in chunk && typeof chunk.content === "string") {
|
|
162
|
+
content += chunk.content;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const result = {
|
|
166
|
+
content,
|
|
167
|
+
provider: this.providerName,
|
|
168
|
+
model: this.modelName,
|
|
169
|
+
usage: { input: 0, output: 0, total: 0 },
|
|
170
|
+
};
|
|
171
|
+
logger.info(`[ReplicateProvider] generate() complete in ${Date.now() - startTime}ms — ${content.length} chars`);
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
async executeStream(options, _analysisSchema) {
|
|
175
|
+
const startTime = Date.now();
|
|
176
|
+
// Resolve per-call credentials first, then fall back to instance-level.
|
|
177
|
+
const perCallCreds = options.credentials?.replicate;
|
|
178
|
+
const effectiveToken = perCallCreds?.apiToken?.trim() || this.apiToken;
|
|
179
|
+
const effectiveBaseUrl = perCallCreds?.baseUrl || this.baseURL;
|
|
180
|
+
const auth = getReplicateAuth({
|
|
181
|
+
apiToken: effectiveToken,
|
|
182
|
+
baseUrl: effectiveBaseUrl,
|
|
183
|
+
});
|
|
184
|
+
if (!auth) {
|
|
185
|
+
throw new NeuroLinkError({
|
|
186
|
+
code: ERROR_CODES.MISSING_CONFIGURATION,
|
|
187
|
+
message: "Replicate auth could not be resolved (REPLICATE_API_TOKEN missing).",
|
|
188
|
+
category: ErrorCategory.CONFIGURATION,
|
|
189
|
+
severity: ErrorSeverity.HIGH,
|
|
190
|
+
retriable: false,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
const prompt = buildPromptFromOptions(options);
|
|
194
|
+
if (!prompt.trim()) {
|
|
195
|
+
throw new NeuroLinkError({
|
|
196
|
+
code: ERROR_CODES.INVALID_PARAMETERS,
|
|
197
|
+
message: "Replicate predictions require a prompt (input.text or prompt)",
|
|
198
|
+
category: ErrorCategory.VALIDATION,
|
|
199
|
+
severity: ErrorSeverity.MEDIUM,
|
|
200
|
+
retriable: false,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Replicate's chat schemas accept EITHER `max_tokens` OR `max_new_tokens`
|
|
204
|
+
// depending on the model. Newer Llama 3.x routes reject setting both with
|
|
205
|
+
// E1102 InvalidArgumentMaxTokens. We pass only `max_new_tokens` (the more
|
|
206
|
+
// widely supported field) and let the model defaults apply when unset.
|
|
207
|
+
const replicateInput = {
|
|
208
|
+
prompt,
|
|
209
|
+
...(options.maxTokens !== undefined && {
|
|
210
|
+
max_new_tokens: options.maxTokens,
|
|
211
|
+
}),
|
|
212
|
+
temperature: options.temperature,
|
|
213
|
+
top_p: 1,
|
|
214
|
+
};
|
|
215
|
+
let prediction;
|
|
216
|
+
try {
|
|
217
|
+
prediction = await predict(auth, {
|
|
218
|
+
model: this.modelName,
|
|
219
|
+
input: replicateInput,
|
|
220
|
+
}, { abortSignal: options.abortSignal });
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
throw this.handleProviderError(err);
|
|
224
|
+
}
|
|
225
|
+
const text = flattenReplicateOutput(prediction.output);
|
|
226
|
+
if (!text) {
|
|
227
|
+
throw new Error(`Replicate prediction ${prediction.id} returned empty output`);
|
|
228
|
+
}
|
|
229
|
+
const stream = {
|
|
230
|
+
async *[Symbol.asyncIterator]() {
|
|
231
|
+
yield { content: text };
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
logger.info(`[ReplicateProvider] Generated ${text.length} chars in ${Date.now() - startTime}ms — model ${this.modelName} (prediction ${prediction.id})`);
|
|
235
|
+
return {
|
|
236
|
+
stream,
|
|
237
|
+
provider: this.providerName,
|
|
238
|
+
model: this.modelName,
|
|
239
|
+
finishReason: "stop",
|
|
240
|
+
metadata: {
|
|
241
|
+
startTime,
|
|
242
|
+
streamId: `replicate-${prediction.id}`,
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Image-gen routing for Replicate-hosted image models (FLUX, SDXL, etc.).
|
|
248
|
+
*
|
|
249
|
+
* The dispatcher in baseProvider routes here when the `model` name
|
|
250
|
+
* matches an entry in `IMAGE_GENERATION_MODELS`. Replicate model ids
|
|
251
|
+
* use `owner/name(:version)?` format — image models route here as
|
|
252
|
+
* long as the caller passes the FQMN.
|
|
253
|
+
*/
|
|
254
|
+
async executeImageGeneration(options) {
|
|
255
|
+
const startTime = Date.now();
|
|
256
|
+
// Resolve per-call credentials first, then fall back to instance-level.
|
|
257
|
+
const perCallCreds = options.credentials?.replicate;
|
|
258
|
+
const effectiveToken = perCallCreds?.apiToken?.trim() || this.apiToken;
|
|
259
|
+
const effectiveBaseUrl = perCallCreds?.baseUrl || this.baseURL;
|
|
260
|
+
const auth = getReplicateAuth({
|
|
261
|
+
apiToken: effectiveToken,
|
|
262
|
+
baseUrl: effectiveBaseUrl,
|
|
263
|
+
});
|
|
264
|
+
if (!auth) {
|
|
265
|
+
throw new NeuroLinkError({
|
|
266
|
+
code: ERROR_CODES.MISSING_CONFIGURATION,
|
|
267
|
+
message: "Replicate auth could not be resolved (REPLICATE_API_TOKEN missing).",
|
|
268
|
+
category: ErrorCategory.CONFIGURATION,
|
|
269
|
+
severity: ErrorSeverity.HIGH,
|
|
270
|
+
retriable: false,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
const prompt = options.prompt ?? options.input?.text ?? "";
|
|
274
|
+
if (!prompt.trim()) {
|
|
275
|
+
throw new NeuroLinkError({
|
|
276
|
+
code: ERROR_CODES.INVALID_PARAMETERS,
|
|
277
|
+
message: "Replicate image-gen requires a prompt",
|
|
278
|
+
category: ErrorCategory.VALIDATION,
|
|
279
|
+
severity: ErrorSeverity.MEDIUM,
|
|
280
|
+
retriable: false,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
const extras = options;
|
|
284
|
+
const replicateInput = {
|
|
285
|
+
prompt,
|
|
286
|
+
output_format: "png",
|
|
287
|
+
};
|
|
288
|
+
if (extras.aspectRatio) {
|
|
289
|
+
replicateInput.aspect_ratio = extras.aspectRatio;
|
|
290
|
+
}
|
|
291
|
+
if (extras.negativePrompt) {
|
|
292
|
+
replicateInput.negative_prompt = extras.negativePrompt;
|
|
293
|
+
}
|
|
294
|
+
if (extras.seed !== undefined) {
|
|
295
|
+
replicateInput.seed = extras.seed;
|
|
296
|
+
}
|
|
297
|
+
let prediction;
|
|
298
|
+
try {
|
|
299
|
+
prediction = await predict(auth, {
|
|
300
|
+
model: this.modelName,
|
|
301
|
+
input: replicateInput,
|
|
302
|
+
}, { abortSignal: options.abortSignal });
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
throw this.handleProviderError(err);
|
|
306
|
+
}
|
|
307
|
+
let buffer;
|
|
308
|
+
try {
|
|
309
|
+
buffer = await downloadPredictionOutput(prediction, MAX_IMAGE_BYTES);
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
throw this.handleProviderError(err);
|
|
313
|
+
}
|
|
314
|
+
const base64 = buffer.toString("base64");
|
|
315
|
+
logger.info(`[ReplicateProvider] Generated image (${buffer.length} bytes) in ${Date.now() - startTime}ms — model ${this.modelName}`);
|
|
316
|
+
return {
|
|
317
|
+
content: prompt,
|
|
318
|
+
provider: this.providerName,
|
|
319
|
+
model: this.modelName,
|
|
320
|
+
usage: { input: 0, output: 0, total: 0 },
|
|
321
|
+
imageOutput: { base64 },
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
formatProviderError(error) {
|
|
325
|
+
const message = error instanceof Error
|
|
326
|
+
? error.message
|
|
327
|
+
: typeof error === "string"
|
|
328
|
+
? error
|
|
329
|
+
: "Unknown error";
|
|
330
|
+
const originalError = error instanceof Error ? error : undefined;
|
|
331
|
+
if (message.includes("401") ||
|
|
332
|
+
message.toLowerCase().includes("unauthorized") ||
|
|
333
|
+
message.toLowerCase().includes("invalid token")) {
|
|
334
|
+
return new NeuroLinkError({
|
|
335
|
+
code: ERROR_CODES.PROVIDER_AUTH_FAILED,
|
|
336
|
+
message: "Invalid Replicate API token. Get one at https://replicate.com/account/api-tokens",
|
|
337
|
+
category: ErrorCategory.CONFIGURATION,
|
|
338
|
+
severity: ErrorSeverity.HIGH,
|
|
339
|
+
retriable: false,
|
|
340
|
+
context: { provider: "replicate" },
|
|
341
|
+
originalError,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
if (message.includes("402") ||
|
|
345
|
+
message.toLowerCase().includes("insufficient credit")) {
|
|
346
|
+
return new NeuroLinkError({
|
|
347
|
+
code: ERROR_CODES.PROVIDER_QUOTA_EXCEEDED,
|
|
348
|
+
message: "Replicate insufficient credit. Top up at https://replicate.com/account/billing — most image/music models require a paid balance.",
|
|
349
|
+
category: ErrorCategory.RESOURCE,
|
|
350
|
+
severity: ErrorSeverity.HIGH,
|
|
351
|
+
retriable: false,
|
|
352
|
+
context: { provider: "replicate" },
|
|
353
|
+
originalError,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
if (message.includes("429") ||
|
|
357
|
+
message.toLowerCase().includes("rate limit")) {
|
|
358
|
+
return new NeuroLinkError({
|
|
359
|
+
code: ERROR_CODES.PROVIDER_QUOTA_EXCEEDED,
|
|
360
|
+
message: "Replicate rate limit exceeded. Back off and retry.",
|
|
361
|
+
category: ErrorCategory.RESOURCE,
|
|
362
|
+
severity: ErrorSeverity.HIGH,
|
|
363
|
+
retriable: true,
|
|
364
|
+
context: { provider: "replicate" },
|
|
365
|
+
originalError,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
if (message.toLowerCase().includes("not found") ||
|
|
369
|
+
message.includes("404")) {
|
|
370
|
+
return new NeuroLinkError({
|
|
371
|
+
code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
|
|
372
|
+
message: `Replicate model '${this.modelName}' not found. Use owner/name or owner/name:version format. Browse https://replicate.com/explore`,
|
|
373
|
+
category: ErrorCategory.VALIDATION,
|
|
374
|
+
severity: ErrorSeverity.MEDIUM,
|
|
375
|
+
retriable: false,
|
|
376
|
+
context: { provider: "replicate", model: this.modelName },
|
|
377
|
+
originalError,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
return new NeuroLinkError({
|
|
381
|
+
code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
|
|
382
|
+
message: `Replicate error: ${message}`,
|
|
383
|
+
category: ErrorCategory.EXECUTION,
|
|
384
|
+
severity: ErrorSeverity.HIGH,
|
|
385
|
+
retriable: false,
|
|
386
|
+
context: { provider: "replicate" },
|
|
387
|
+
originalError,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
async validateConfiguration() {
|
|
391
|
+
return typeof this.apiToken === "string" && this.apiToken.trim().length > 0;
|
|
392
|
+
}
|
|
393
|
+
getConfiguration() {
|
|
394
|
+
return {
|
|
395
|
+
provider: this.providerName,
|
|
396
|
+
model: this.modelName,
|
|
397
|
+
defaultModel: getDefaultReplicateModel(),
|
|
398
|
+
baseURL: this.baseURL,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
export default ReplicateProvider;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { LanguageModel } from "ai";
|
|
2
|
+
import type { AIProviderName } from "../constants/enums.js";
|
|
3
|
+
import { BaseProvider } from "../core/baseProvider.js";
|
|
4
|
+
import type { EnhancedGenerateResult, NeurolinkCredentials, StreamOptions, StreamResult, TextGenerationOptions, ValidationSchema } from "../types/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Stability AI Provider — direct image generation.
|
|
7
|
+
*
|
|
8
|
+
* Hits api.stability.ai/v2beta/stable-image/generate/{model}. Returns
|
|
9
|
+
* base64 PNG. No chat / streaming / tool calling.
|
|
10
|
+
*
|
|
11
|
+
* The constructor no longer throws when `STABILITY_API_KEY` is absent so
|
|
12
|
+
* that per-call credentials (passed via `options.credentials.stability`) can
|
|
13
|
+
* be used without requiring a global env var at startup.
|
|
14
|
+
*
|
|
15
|
+
* @see https://platform.stability.ai/docs/api-reference
|
|
16
|
+
*/
|
|
17
|
+
export declare class StabilityProvider extends BaseProvider {
|
|
18
|
+
private readonly apiKey;
|
|
19
|
+
private readonly baseURL;
|
|
20
|
+
private readonly proxyFetch;
|
|
21
|
+
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["stability"]);
|
|
22
|
+
protected getProviderName(): AIProviderName;
|
|
23
|
+
protected getDefaultModel(): string;
|
|
24
|
+
supportsTools(): boolean;
|
|
25
|
+
protected getAISDKModel(): LanguageModel;
|
|
26
|
+
protected executeStream(_options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
|
|
27
|
+
protected formatProviderError(error: unknown): Error;
|
|
28
|
+
protected executeImageGeneration(options: TextGenerationOptions): Promise<EnhancedGenerateResult>;
|
|
29
|
+
validateConfiguration(): Promise<boolean>;
|
|
30
|
+
getConfiguration(): {
|
|
31
|
+
provider: AIProviderName;
|
|
32
|
+
model: string;
|
|
33
|
+
defaultModel: string;
|
|
34
|
+
baseURL: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export default StabilityProvider;
|