@juspay/neurolink 11.26.2 → 11.28.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 +3 -3
- package/dist/adapters/providerImageAdapter.js +20 -0
- package/dist/adapters/video/index.d.ts +30 -0
- package/dist/adapters/video/index.js +74 -0
- package/dist/avatar/index.d.ts +6 -3
- package/dist/avatar/index.js +21 -16
- package/dist/browser/neurolink.min.js +393 -393
- package/dist/cli/factories/commandFactory.d.ts +6 -0
- package/dist/cli/factories/commandFactory.js +6 -2
- package/dist/constants/contextWindows.d.ts +18 -4
- package/dist/constants/contextWindows.js +35 -4
- package/dist/core/baseProvider.js +5 -3
- package/dist/core/constants.js +59 -1
- package/dist/factories/mediaHandlerCatalog.d.ts +18 -0
- package/dist/factories/mediaHandlerCatalog.js +65 -0
- package/dist/factories/providerRegistry.js +50 -207
- package/dist/index.d.ts +1 -4
- package/dist/index.js +2 -5
- package/dist/models/anthropicModels.d.ts +3 -6
- package/dist/models/anthropicModels.js +97 -123
- package/dist/models/manifestRegistry.d.ts +9 -0
- package/dist/models/manifestRegistry.js +23 -0
- package/dist/models/manifests/anthropic.js +5 -3
- package/dist/models/manifests/azure.js +6 -1
- package/dist/models/modelRegistry.d.ts +22 -2
- package/dist/models/modelRegistry.js +143 -8
- package/dist/music/index.d.ts +6 -3
- package/dist/music/index.js +22 -21
- package/dist/neurolink.js +12 -0
- package/dist/providers/amazonSagemaker.d.ts +1 -1
- package/dist/providers/sagemaker/language-model.d.ts +2 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/mediaCatalog.d.ts +12 -0
- package/dist/types/mediaCatalog.js +7 -0
- package/dist/utils/pricing.js +51 -0
- package/dist/voice/index.d.ts +7 -3
- package/dist/voice/index.js +50 -40
- package/package.json +2 -1
|
@@ -3,6 +3,7 @@ import { logger } from "../utils/logger.js";
|
|
|
3
3
|
import { AIProviderName, GoogleAIModels, OpenAIModels, AnthropicModels, VertexModels, OllamaModels, LiteLLMModels, HuggingFaceModels, DeepSeekModels, NvidiaNimModels, OpenRouterModels, CohereModels, VoyageModels, JinaModels, StabilityModels, IdeogramModels, RecraftModels, ReplicateModels, } from "../constants/enums.js";
|
|
4
4
|
import { PROVIDER_DESCRIPTORS_BY_NAME } from "./providerDescriptors.js";
|
|
5
5
|
import { OPENAI_COMPAT_CATALOG } from "../providers/openaiCompatCatalog.js";
|
|
6
|
+
import { providerChoicesFor } from "./mediaHandlerCatalog.js";
|
|
6
7
|
/**
|
|
7
8
|
* Provider Registry - registers all providers with the factory
|
|
8
9
|
* This is where we migrate providers one by one to the new pattern
|
|
@@ -229,16 +230,23 @@ export class ProviderRegistry {
|
|
|
229
230
|
return new RecraftProvider(modelName, sdk, undefined, recraftCreds);
|
|
230
231
|
}, process.env.RECRAFT_MODEL || RecraftModels.RECRAFT_V3, ["recraft"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.RECRAFT));
|
|
231
232
|
logger.debug("All AI providers registered successfully");
|
|
233
|
+
// ===== MEDIA HANDLER REGISTRATION =====
|
|
234
|
+
// Single registration path (Task 11): each ecosystem barrel (voice,
|
|
235
|
+
// adapters/video, avatar, music) owns its own provider-name catalog
|
|
236
|
+
// wiring (MEDIA_HANDLER_CATALOG, Task 8) and exposes an idempotent
|
|
237
|
+
// registerDefault*Handlers() function (Task 10) that constructs and
|
|
238
|
+
// registers every shipped handler whose backing credentials are
|
|
239
|
+
// present in process.env. This block's only job is to invoke each of
|
|
240
|
+
// the six functions via dynamic import — no hand-rolled
|
|
241
|
+
// `new XHandler()` + `registerHandler()` calls live here anymore.
|
|
242
|
+
// Each ecosystem keeps its own try/catch so one broken import can't
|
|
243
|
+
// take down the other five (matches the previous block's isolation).
|
|
232
244
|
// ===== TTS HANDLER REGISTRATION =====
|
|
233
245
|
try {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
TTSProcessor.registerHandler("google-ai", googleHandler);
|
|
239
|
-
TTSProcessor.registerHandler("vertex", googleHandler);
|
|
240
|
-
logger.debug("TTS handlers registered successfully", {
|
|
241
|
-
providers: ["google-ai", "vertex"],
|
|
246
|
+
const { registerDefaultTTSHandlers } = await import("../voice/index.js");
|
|
247
|
+
registerDefaultTTSHandlers();
|
|
248
|
+
logger.debug("TTS handler registration attempted", {
|
|
249
|
+
providers: providerChoicesFor("tts"),
|
|
242
250
|
});
|
|
243
251
|
}
|
|
244
252
|
catch (ttsError) {
|
|
@@ -247,91 +255,12 @@ export class ProviderRegistry {
|
|
|
247
255
|
});
|
|
248
256
|
// Don't throw - TTS is optional functionality
|
|
249
257
|
}
|
|
250
|
-
// New TTS providers
|
|
251
|
-
try {
|
|
252
|
-
const { TTSProcessor } = await import("../utils/ttsProcessor.js");
|
|
253
|
-
const { OpenAITTS } = await import("../voice/providers/OpenAITTS.js");
|
|
254
|
-
TTSProcessor.registerHandler("openai-tts", new OpenAITTS());
|
|
255
|
-
}
|
|
256
|
-
catch (err) {
|
|
257
|
-
logger.debug(`[ProviderRegistry] openai-tts registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
258
|
-
}
|
|
259
|
-
try {
|
|
260
|
-
const { TTSProcessor } = await import("../utils/ttsProcessor.js");
|
|
261
|
-
const { ElevenLabsTTS } = await import("../voice/providers/ElevenLabsTTS.js");
|
|
262
|
-
const elevenLabsHandler = new ElevenLabsTTS();
|
|
263
|
-
TTSProcessor.registerHandler("elevenlabs", elevenLabsHandler);
|
|
264
|
-
TTSProcessor.registerHandler("elevenlabs-tts", elevenLabsHandler);
|
|
265
|
-
}
|
|
266
|
-
catch (err) {
|
|
267
|
-
logger.debug(`[ProviderRegistry] elevenlabs registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
268
|
-
}
|
|
269
|
-
try {
|
|
270
|
-
const { TTSProcessor } = await import("../utils/ttsProcessor.js");
|
|
271
|
-
const { AzureTTS } = await import("../voice/providers/AzureTTS.js");
|
|
272
|
-
TTSProcessor.registerHandler("azure-tts", new AzureTTS());
|
|
273
|
-
}
|
|
274
|
-
catch (err) {
|
|
275
|
-
logger.debug(`[ProviderRegistry] azure-tts registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
276
|
-
}
|
|
277
|
-
// Fish Audio and Cartesia also auto-register via the voice/index.ts
|
|
278
|
-
// barrel side-effect. The supports() guard here keeps registration
|
|
279
|
-
// idempotent across entry points — same handler, no overwrite warning.
|
|
280
|
-
try {
|
|
281
|
-
const { TTSProcessor } = await import("../utils/ttsProcessor.js");
|
|
282
|
-
if (!TTSProcessor.supports("fish-audio")) {
|
|
283
|
-
const { FishAudioTTS } = await import("../voice/providers/FishAudioTTS.js");
|
|
284
|
-
TTSProcessor.registerHandler("fish-audio", new FishAudioTTS());
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
catch (err) {
|
|
288
|
-
logger.debug(`[ProviderRegistry] fish-audio registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
289
|
-
}
|
|
290
|
-
try {
|
|
291
|
-
const { TTSProcessor } = await import("../utils/ttsProcessor.js");
|
|
292
|
-
if (!TTSProcessor.supports("cartesia")) {
|
|
293
|
-
const { CartesiaTTS } = await import("../voice/providers/CartesiaTTS.js");
|
|
294
|
-
TTSProcessor.registerHandler("cartesia", new CartesiaTTS());
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
catch (err) {
|
|
298
|
-
logger.debug(`[ProviderRegistry] cartesia registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
299
|
-
}
|
|
300
258
|
// ===== STT HANDLER REGISTRATION =====
|
|
301
259
|
try {
|
|
302
|
-
const {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
STTProcessor.registerHandler("whisper", openAISTT);
|
|
307
|
-
STTProcessor.registerHandler("openai-stt", openAISTT);
|
|
308
|
-
}
|
|
309
|
-
catch (err) {
|
|
310
|
-
logger.debug(`[ProviderRegistry] whisper/openai-stt registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
311
|
-
}
|
|
312
|
-
try {
|
|
313
|
-
const { DeepgramSTT } = await import("../voice/providers/DeepgramSTT.js");
|
|
314
|
-
STTProcessor.registerHandler("deepgram", new DeepgramSTT());
|
|
315
|
-
}
|
|
316
|
-
catch (err) {
|
|
317
|
-
logger.debug(`[ProviderRegistry] deepgram registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
318
|
-
}
|
|
319
|
-
try {
|
|
320
|
-
const { GoogleSTT } = await import("../voice/providers/GoogleSTT.js");
|
|
321
|
-
STTProcessor.registerHandler("google-stt", new GoogleSTT());
|
|
322
|
-
}
|
|
323
|
-
catch (err) {
|
|
324
|
-
logger.debug(`[ProviderRegistry] google-stt registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
325
|
-
}
|
|
326
|
-
try {
|
|
327
|
-
const { AzureSTT } = await import("../voice/providers/AzureSTT.js");
|
|
328
|
-
STTProcessor.registerHandler("azure-stt", new AzureSTT());
|
|
329
|
-
}
|
|
330
|
-
catch (err) {
|
|
331
|
-
logger.debug(`[ProviderRegistry] azure-stt registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
332
|
-
}
|
|
333
|
-
logger.debug("STT handlers registered successfully", {
|
|
334
|
-
providers: ["whisper", "deepgram", "google-stt", "azure-stt"],
|
|
260
|
+
const { registerDefaultSTTHandlers } = await import("../voice/index.js");
|
|
261
|
+
registerDefaultSTTHandlers();
|
|
262
|
+
logger.debug("STT handler registration attempted", {
|
|
263
|
+
providers: providerChoicesFor("stt"),
|
|
335
264
|
});
|
|
336
265
|
}
|
|
337
266
|
catch (sttError) {
|
|
@@ -341,33 +270,21 @@ export class ProviderRegistry {
|
|
|
341
270
|
}
|
|
342
271
|
// ===== REALTIME HANDLER REGISTRATION =====
|
|
343
272
|
try {
|
|
344
|
-
const { RealtimeProcessor } = await import("../voice/
|
|
345
|
-
|
|
346
|
-
//
|
|
347
|
-
//
|
|
348
|
-
//
|
|
273
|
+
const { registerDefaultRealtimeHandlers, RealtimeProcessor } = await import("../voice/index.js");
|
|
274
|
+
registerDefaultRealtimeHandlers();
|
|
275
|
+
// M9 + NEW4: registerDefaultRealtimeHandlers() swallows per-handler
|
|
276
|
+
// construction failures internally (it's a shared, idempotent
|
|
277
|
+
// barrel function used by every entry point — see voice/index.ts),
|
|
278
|
+
// so the exact per-handler exception text the old inline block
|
|
279
|
+
// captured is no longer available here. Recover per-name pass/fail
|
|
280
|
+
// via supports() instead so getRegistrationReport() stays truthful
|
|
281
|
+
// for callers that poll it.
|
|
282
|
+
const realtimeNames = providerChoicesFor("realtime");
|
|
349
283
|
const realtimeOutcomes = {};
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
}
|
|
355
|
-
catch (err) {
|
|
356
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
357
|
-
realtimeOutcomes["openai-realtime"] = msg;
|
|
358
|
-
// M9: promote per-handler failures to error level so users can
|
|
359
|
-
// see which shipped voice provider failed to register at startup.
|
|
360
|
-
logger.error(`[ProviderRegistry] openai-realtime registration failed: ${msg}`);
|
|
361
|
-
}
|
|
362
|
-
try {
|
|
363
|
-
const { GeminiLive } = await import("../voice/providers/GeminiLive.js");
|
|
364
|
-
RealtimeProcessor.registerHandler("gemini-live", new GeminiLive());
|
|
365
|
-
realtimeOutcomes["gemini-live"] = "ok";
|
|
366
|
-
}
|
|
367
|
-
catch (err) {
|
|
368
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
369
|
-
realtimeOutcomes["gemini-live"] = msg;
|
|
370
|
-
logger.error(`[ProviderRegistry] gemini-live registration failed: ${msg}`);
|
|
284
|
+
for (const name of realtimeNames) {
|
|
285
|
+
realtimeOutcomes[name] = RealtimeProcessor.supports(name)
|
|
286
|
+
? "ok"
|
|
287
|
+
: "registration failed or handler unavailable";
|
|
371
288
|
}
|
|
372
289
|
// NEW4: report the actual per-handler outcomes instead of an
|
|
373
290
|
// unconditional success log. Stored on the registry so callers can
|
|
@@ -375,7 +292,7 @@ export class ProviderRegistry {
|
|
|
375
292
|
ProviderRegistry.realtimeRegistration = realtimeOutcomes;
|
|
376
293
|
const skipped = Object.entries(realtimeOutcomes).filter(([, v]) => v !== "ok");
|
|
377
294
|
if (skipped.length === 0) {
|
|
378
|
-
logger.info(
|
|
295
|
+
logger.info(`[ProviderRegistry] Realtime handlers registered: ${realtimeNames.join(", ")}`);
|
|
379
296
|
}
|
|
380
297
|
else {
|
|
381
298
|
logger.warn(`[ProviderRegistry] Realtime handlers partial: ${skipped.length} skipped`, { outcomes: realtimeOutcomes });
|
|
@@ -390,67 +307,22 @@ export class ProviderRegistry {
|
|
|
390
307
|
}
|
|
391
308
|
// ===== VIDEO HANDLER REGISTRATION =====
|
|
392
309
|
try {
|
|
393
|
-
const {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
}
|
|
398
|
-
catch (err) {
|
|
399
|
-
logger.debug(`[ProviderRegistry] vertex video registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
400
|
-
}
|
|
401
|
-
try {
|
|
402
|
-
const { KlingVideoHandler } = await import("../adapters/video/klingVideoHandler.js");
|
|
403
|
-
VideoProcessor.registerHandler("kling", new KlingVideoHandler());
|
|
404
|
-
}
|
|
405
|
-
catch (err) {
|
|
406
|
-
logger.debug(`[ProviderRegistry] kling video registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
407
|
-
}
|
|
408
|
-
try {
|
|
409
|
-
const { RunwayVideoHandler } = await import("../adapters/video/runwayVideoHandler.js");
|
|
410
|
-
VideoProcessor.registerHandler("runway", new RunwayVideoHandler());
|
|
411
|
-
}
|
|
412
|
-
catch (err) {
|
|
413
|
-
logger.debug(`[ProviderRegistry] runway video registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
414
|
-
}
|
|
415
|
-
try {
|
|
416
|
-
const { ReplicateVideoHandler } = await import("../adapters/video/replicateVideoHandler.js");
|
|
417
|
-
VideoProcessor.registerHandler("replicate", new ReplicateVideoHandler());
|
|
418
|
-
}
|
|
419
|
-
catch (err) {
|
|
420
|
-
logger.debug(`[ProviderRegistry] replicate video registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
421
|
-
}
|
|
422
|
-
logger.debug("Video handlers registered");
|
|
310
|
+
const { registerDefaultVideoHandlers } = await import("../adapters/video/index.js");
|
|
311
|
+
registerDefaultVideoHandlers();
|
|
312
|
+
logger.debug("Video handler registration attempted", {
|
|
313
|
+
providers: providerChoicesFor("video"),
|
|
314
|
+
});
|
|
423
315
|
}
|
|
424
316
|
catch (err) {
|
|
425
317
|
logger.warn(`[ProviderRegistry] video registration block failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
426
318
|
}
|
|
427
319
|
// ===== AVATAR HANDLER REGISTRATION =====
|
|
428
320
|
try {
|
|
429
|
-
const {
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
}
|
|
434
|
-
catch (err) {
|
|
435
|
-
logger.debug(`[ProviderRegistry] d-id avatar registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
436
|
-
}
|
|
437
|
-
try {
|
|
438
|
-
const { ReplicateAvatar } = await import("../avatar/providers/ReplicateAvatar.js");
|
|
439
|
-
const replicateAvatar = new ReplicateAvatar();
|
|
440
|
-
AvatarProcessor.registerHandler("replicate", replicateAvatar);
|
|
441
|
-
AvatarProcessor.registerHandler("musetalk", replicateAvatar);
|
|
442
|
-
}
|
|
443
|
-
catch (err) {
|
|
444
|
-
logger.debug(`[ProviderRegistry] replicate avatar registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
445
|
-
}
|
|
446
|
-
try {
|
|
447
|
-
const { HeyGenAvatar } = await import("../avatar/providers/HeyGenAvatar.js");
|
|
448
|
-
AvatarProcessor.registerHandler("heygen", new HeyGenAvatar());
|
|
449
|
-
}
|
|
450
|
-
catch (err) {
|
|
451
|
-
logger.debug(`[ProviderRegistry] heygen avatar registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
452
|
-
}
|
|
453
|
-
logger.debug("Avatar handlers registered");
|
|
321
|
+
const { registerDefaultAvatarHandlers } = await import("../avatar/index.js");
|
|
322
|
+
registerDefaultAvatarHandlers();
|
|
323
|
+
logger.debug("Avatar handler registration attempted", {
|
|
324
|
+
providers: providerChoicesFor("avatar"),
|
|
325
|
+
});
|
|
454
326
|
}
|
|
455
327
|
catch (avatarError) {
|
|
456
328
|
logger.warn("Failed to register Avatar handlers - Avatar functionality will be unavailable", {
|
|
@@ -461,40 +333,11 @@ export class ProviderRegistry {
|
|
|
461
333
|
}
|
|
462
334
|
// ===== MUSIC HANDLER REGISTRATION =====
|
|
463
335
|
try {
|
|
464
|
-
const {
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
}
|
|
469
|
-
catch (err) {
|
|
470
|
-
logger.debug(`[ProviderRegistry] beatoven music registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
471
|
-
}
|
|
472
|
-
try {
|
|
473
|
-
const { ReplicateMusic } = await import("../music/providers/ReplicateMusic.js");
|
|
474
|
-
const replicateMusic = new ReplicateMusic();
|
|
475
|
-
MusicProcessor.registerHandler("replicate", replicateMusic);
|
|
476
|
-
MusicProcessor.registerHandler("musicgen", replicateMusic);
|
|
477
|
-
}
|
|
478
|
-
catch (err) {
|
|
479
|
-
logger.debug(`[ProviderRegistry] replicate music registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
480
|
-
}
|
|
481
|
-
try {
|
|
482
|
-
const { ElevenLabsMusic } = await import("../music/providers/ElevenLabsMusic.js");
|
|
483
|
-
const elevenLabsMusic = new ElevenLabsMusic();
|
|
484
|
-
MusicProcessor.registerHandler("elevenlabs-music", elevenLabsMusic);
|
|
485
|
-
MusicProcessor.registerHandler("elevenlabs-sound", elevenLabsMusic);
|
|
486
|
-
}
|
|
487
|
-
catch (err) {
|
|
488
|
-
logger.debug(`[ProviderRegistry] elevenlabs-music registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
489
|
-
}
|
|
490
|
-
try {
|
|
491
|
-
const { LyriaMusic } = await import("../music/providers/LyriaMusic.js");
|
|
492
|
-
MusicProcessor.registerHandler("lyria", new LyriaMusic());
|
|
493
|
-
}
|
|
494
|
-
catch (err) {
|
|
495
|
-
logger.debug(`[ProviderRegistry] lyria music registration skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
496
|
-
}
|
|
497
|
-
logger.debug("Music handlers registered");
|
|
336
|
+
const { registerDefaultMusicHandlers } = await import("../music/index.js");
|
|
337
|
+
registerDefaultMusicHandlers();
|
|
338
|
+
logger.debug("Music handler registration attempted", {
|
|
339
|
+
providers: providerChoicesFor("music"),
|
|
340
|
+
});
|
|
498
341
|
}
|
|
499
342
|
catch (musicError) {
|
|
500
343
|
logger.warn("Failed to register Music handlers - Music functionality will be unavailable", {
|
package/dist/index.d.ts
CHANGED
|
@@ -67,10 +67,7 @@ export { STTProcessor } from "./utils/sttProcessor.js";
|
|
|
67
67
|
export { AzureTTS, AzureTTSHandler, CartesiaTTS, CartesiaTTSHandler, ElevenLabsTTS, ElevenLabsTTSHandler, FishAudioTTS, FishAudioTTSHandler, GoogleTTSHandler, OpenAITTS, OpenAITTSHandler, AzureSTT, AzureSTTHandler, DeepgramSTT, DeepgramSTTHandler, GoogleSTT, GoogleSTTHandler, OpenAISTT, OpenAISTTHandler, WhisperSTT, WhisperSTTHandler, BaseRealtimeHandler, GeminiLive, GeminiLiveHandler, OpenAIRealtime, OpenAIRealtimeHandler, RealtimeProcessor, RealtimeError, STTError, VoiceError, registerDefaultRealtimeHandlers, registerDefaultSTTHandlers, registerDefaultTTSHandlers, } from "./voice/index.js";
|
|
68
68
|
export { BeatovenMusic, BeatovenMusicHandler, ElevenLabsMusic, ElevenLabsMusicHandler, LyriaMusic, LyriaMusicHandler, registerDefaultMusicHandlers, ReplicateMusic, ReplicateMusicHandler, } from "./music/index.js";
|
|
69
69
|
export { DIDAvatar, DIDAvatarHandler, HeyGenAvatar, HeyGenAvatarHandler, registerDefaultAvatarHandlers, ReplicateAvatar, ReplicateAvatarHandler, } from "./avatar/index.js";
|
|
70
|
-
export { KlingVideoHandler } from "./adapters/video/
|
|
71
|
-
export { ReplicateVideoHandler } from "./adapters/video/replicateVideoHandler.js";
|
|
72
|
-
export { RunwayVideoHandler } from "./adapters/video/runwayVideoHandler.js";
|
|
73
|
-
export { VertexVideoHandler, isVertexVideoConfigured, } from "./adapters/video/vertexVideoHandler.js";
|
|
70
|
+
export { isVertexVideoConfigured, KlingVideoHandler, registerDefaultVideoHandlers, ReplicateVideoHandler, RunwayVideoHandler, VertexVideoHandler, } from "./adapters/video/index.js";
|
|
74
71
|
export { ImageGenService } from "./image-gen/ImageGenService.js";
|
|
75
72
|
export { HITLManager } from "./hitl/hitlManager.js";
|
|
76
73
|
export { ProviderRegistry } from "./factories/providerRegistry.js";
|
package/dist/index.js
CHANGED
|
@@ -125,11 +125,8 @@ registerDefaultRealtimeHandlers, registerDefaultSTTHandlers, registerDefaultTTSH
|
|
|
125
125
|
export { BeatovenMusic, BeatovenMusicHandler, ElevenLabsMusic, ElevenLabsMusicHandler, LyriaMusic, LyriaMusicHandler, registerDefaultMusicHandlers, ReplicateMusic, ReplicateMusicHandler, } from "./music/index.js";
|
|
126
126
|
// Avatar handlers
|
|
127
127
|
export { DIDAvatar, DIDAvatarHandler, HeyGenAvatar, HeyGenAvatarHandler, registerDefaultAvatarHandlers, ReplicateAvatar, ReplicateAvatarHandler, } from "./avatar/index.js";
|
|
128
|
-
// Video handlers
|
|
129
|
-
export { KlingVideoHandler } from "./adapters/video/
|
|
130
|
-
export { ReplicateVideoHandler } from "./adapters/video/replicateVideoHandler.js";
|
|
131
|
-
export { RunwayVideoHandler } from "./adapters/video/runwayVideoHandler.js";
|
|
132
|
-
export { VertexVideoHandler, isVertexVideoConfigured, } from "./adapters/video/vertexVideoHandler.js";
|
|
128
|
+
// Video handlers
|
|
129
|
+
export { isVertexVideoConfigured, KlingVideoHandler, registerDefaultVideoHandlers, ReplicateVideoHandler, RunwayVideoHandler, VertexVideoHandler, } from "./adapters/video/index.js";
|
|
133
130
|
// Image generation + HITL — surfaced from their dedicated barrels
|
|
134
131
|
export { ImageGenService } from "./image-gen/ImageGenService.js";
|
|
135
132
|
export { HITLManager } from "./hitl/hitlManager.js";
|
|
@@ -20,6 +20,9 @@ export declare enum AnthropicModel {
|
|
|
20
20
|
CLAUDE_3_5_SONNET_V2 = "claude-3-5-sonnet-v2-20241022",
|
|
21
21
|
CLAUDE_SONNET_4 = "claude-sonnet-4-20250514",
|
|
22
22
|
CLAUDE_SONNET_4_6 = "claude-sonnet-4-6",
|
|
23
|
+
CLAUDE_OPUS_4_5 = "claude-opus-4-5-20251101",
|
|
24
|
+
CLAUDE_SONNET_4_5 = "claude-sonnet-4-5-20250929",
|
|
25
|
+
CLAUDE_HAIKU_4_5 = "claude-haiku-4-5-20251001",
|
|
23
26
|
CLAUDE_3_OPUS = "claude-3-opus-20240229",
|
|
24
27
|
CLAUDE_OPUS_4 = "claude-opus-4-20250514",
|
|
25
28
|
CLAUDE_OPUS_4_6 = "claude-opus-4-6"
|
|
@@ -34,12 +37,6 @@ export declare enum AnthropicModel {
|
|
|
34
37
|
* - api: Full API access to all models (based on API access)
|
|
35
38
|
*/
|
|
36
39
|
export declare const MODEL_TIER_ACCESS: Record<ClaudeSubscriptionTier, string[]>;
|
|
37
|
-
/**
|
|
38
|
-
* Model metadata by model ID
|
|
39
|
-
*
|
|
40
|
-
* Comprehensive mapping of each Anthropic model's metadata,
|
|
41
|
-
* including display names, context windows, vision support, and extended thinking.
|
|
42
|
-
*/
|
|
43
40
|
export declare const MODEL_METADATA: Record<string, AnthropicModelMetadata>;
|
|
44
41
|
/**
|
|
45
42
|
* Default model for each subscription tier
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* model capabilities, and provides helper functions for tier-based access control.
|
|
6
6
|
*/
|
|
7
7
|
import { ModelAccessError } from "../types/index.js";
|
|
8
|
+
import { anthropicManifest } from "./manifests/anthropic.js";
|
|
8
9
|
// Re-export runtime value for convenience
|
|
9
10
|
export { ModelAccessError };
|
|
10
11
|
// ============================================================================
|
|
@@ -30,6 +31,12 @@ export var AnthropicModel;
|
|
|
30
31
|
AnthropicModel["CLAUDE_SONNET_4"] = "claude-sonnet-4-20250514";
|
|
31
32
|
// Claude Sonnet 4.6
|
|
32
33
|
AnthropicModel["CLAUDE_SONNET_4_6"] = "claude-sonnet-4-6";
|
|
34
|
+
// Claude Opus 4.5
|
|
35
|
+
AnthropicModel["CLAUDE_OPUS_4_5"] = "claude-opus-4-5-20251101";
|
|
36
|
+
// Claude Sonnet 4.5
|
|
37
|
+
AnthropicModel["CLAUDE_SONNET_4_5"] = "claude-sonnet-4-5-20250929";
|
|
38
|
+
// Claude 4.5 Haiku
|
|
39
|
+
AnthropicModel["CLAUDE_HAIKU_4_5"] = "claude-haiku-4-5-20251001";
|
|
33
40
|
// Claude 3 Opus (Legacy flagship)
|
|
34
41
|
AnthropicModel["CLAUDE_3_OPUS"] = "claude-3-opus-20240229";
|
|
35
42
|
// Claude Opus 4 (Latest flagship)
|
|
@@ -76,130 +83,91 @@ export const MODEL_TIER_ACCESS = {
|
|
|
76
83
|
// MODEL METADATA
|
|
77
84
|
// ============================================================================
|
|
78
85
|
/**
|
|
79
|
-
* Model metadata by model ID
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
86
|
+
* Model metadata by model ID, derived from the anthropic manifest
|
|
87
|
+
* (src/lib/models/manifests/anthropic.ts) so this catalog can no longer
|
|
88
|
+
* silently drift from the canonical source. Family/description fields —
|
|
89
|
+
* not tracked by the manifest — are supplied by the small per-id lookups
|
|
90
|
+
* below, unchanged from their pre-migration values.
|
|
83
91
|
*/
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
[AnthropicModel.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
},
|
|
98
|
-
// Claude 3.5 Haiku
|
|
99
|
-
[AnthropicModel.CLAUDE_3_5_HAIKU]: {
|
|
100
|
-
displayName: "Claude 3.5 Haiku",
|
|
101
|
-
contextWindow: 200000,
|
|
102
|
-
maxOutputTokens: 8192,
|
|
103
|
-
supportsVision: false,
|
|
104
|
-
supportsExtendedThinking: false,
|
|
105
|
-
supportsToolUse: true,
|
|
106
|
-
supportsStreaming: true,
|
|
107
|
-
deprecated: false,
|
|
108
|
-
family: "haiku",
|
|
109
|
-
description: "Improved fast model with better performance",
|
|
110
|
-
},
|
|
111
|
-
// Claude 3.5 Sonnet
|
|
112
|
-
[AnthropicModel.CLAUDE_3_5_SONNET]: {
|
|
113
|
-
displayName: "Claude 3.5 Sonnet",
|
|
114
|
-
contextWindow: 200000,
|
|
115
|
-
maxOutputTokens: 8192,
|
|
116
|
-
supportsVision: true,
|
|
117
|
-
supportsExtendedThinking: false,
|
|
118
|
-
supportsToolUse: true,
|
|
119
|
-
supportsStreaming: true,
|
|
120
|
-
deprecated: false,
|
|
121
|
-
family: "sonnet",
|
|
122
|
-
description: "Balanced model for most tasks",
|
|
123
|
-
},
|
|
124
|
-
// Claude 3.5 Sonnet V2
|
|
125
|
-
[AnthropicModel.CLAUDE_3_5_SONNET_V2]: {
|
|
126
|
-
displayName: "Claude 3.5 Sonnet V2",
|
|
127
|
-
contextWindow: 200000,
|
|
128
|
-
maxOutputTokens: 8192,
|
|
129
|
-
supportsVision: true,
|
|
130
|
-
supportsExtendedThinking: false,
|
|
131
|
-
supportsToolUse: true,
|
|
132
|
-
supportsStreaming: true,
|
|
133
|
-
deprecated: false,
|
|
134
|
-
family: "sonnet",
|
|
135
|
-
description: "Updated Sonnet with improved capabilities",
|
|
136
|
-
},
|
|
137
|
-
// Claude Sonnet 4
|
|
138
|
-
[AnthropicModel.CLAUDE_SONNET_4]: {
|
|
139
|
-
displayName: "Claude Sonnet 4",
|
|
140
|
-
contextWindow: 200000,
|
|
141
|
-
maxOutputTokens: 64000,
|
|
142
|
-
supportsVision: true,
|
|
143
|
-
supportsExtendedThinking: true,
|
|
144
|
-
supportsToolUse: true,
|
|
145
|
-
supportsStreaming: true,
|
|
146
|
-
deprecated: false,
|
|
147
|
-
family: "sonnet",
|
|
148
|
-
description: "Latest Sonnet with extended thinking support",
|
|
149
|
-
},
|
|
150
|
-
// Claude 3 Opus (Legacy)
|
|
151
|
-
[AnthropicModel.CLAUDE_3_OPUS]: {
|
|
152
|
-
displayName: "Claude 3 Opus",
|
|
153
|
-
contextWindow: 200000,
|
|
154
|
-
maxOutputTokens: 4096,
|
|
155
|
-
supportsVision: true,
|
|
156
|
-
supportsExtendedThinking: false,
|
|
157
|
-
supportsToolUse: true,
|
|
158
|
-
supportsStreaming: true,
|
|
159
|
-
deprecated: true,
|
|
160
|
-
family: "opus",
|
|
161
|
-
description: "Legacy flagship model for complex tasks",
|
|
162
|
-
},
|
|
163
|
-
// Claude Opus 4
|
|
164
|
-
[AnthropicModel.CLAUDE_OPUS_4]: {
|
|
165
|
-
displayName: "Claude Opus 4",
|
|
166
|
-
contextWindow: 200000,
|
|
167
|
-
maxOutputTokens: 64000,
|
|
168
|
-
supportsVision: true,
|
|
169
|
-
supportsExtendedThinking: true,
|
|
170
|
-
supportsToolUse: true,
|
|
171
|
-
supportsStreaming: true,
|
|
172
|
-
deprecated: false,
|
|
173
|
-
family: "opus",
|
|
174
|
-
description: "Latest flagship model with advanced reasoning",
|
|
175
|
-
},
|
|
176
|
-
// Claude Sonnet 4.6
|
|
177
|
-
[AnthropicModel.CLAUDE_SONNET_4_6]: {
|
|
178
|
-
displayName: "Claude Sonnet 4.6",
|
|
179
|
-
contextWindow: 1000000,
|
|
180
|
-
maxOutputTokens: 64000,
|
|
181
|
-
supportsVision: true,
|
|
182
|
-
supportsExtendedThinking: true,
|
|
183
|
-
supportsToolUse: true,
|
|
184
|
-
supportsStreaming: true,
|
|
185
|
-
deprecated: false,
|
|
186
|
-
family: "sonnet",
|
|
187
|
-
description: "Claude 4.6 Sonnet with 1M context window",
|
|
188
|
-
},
|
|
189
|
-
// Claude Opus 4.6
|
|
190
|
-
[AnthropicModel.CLAUDE_OPUS_4_6]: {
|
|
191
|
-
displayName: "Claude Opus 4.6",
|
|
192
|
-
contextWindow: 1000000,
|
|
193
|
-
maxOutputTokens: 64000,
|
|
194
|
-
supportsVision: true,
|
|
195
|
-
supportsExtendedThinking: true,
|
|
196
|
-
supportsToolUse: true,
|
|
197
|
-
supportsStreaming: true,
|
|
198
|
-
deprecated: false,
|
|
199
|
-
family: "opus",
|
|
200
|
-
description: "Claude 4.6 Opus flagship with 1M context window",
|
|
201
|
-
},
|
|
92
|
+
const FAMILY_BY_MODEL = {
|
|
93
|
+
[AnthropicModel.CLAUDE_3_HAIKU]: "haiku",
|
|
94
|
+
[AnthropicModel.CLAUDE_3_5_HAIKU]: "haiku",
|
|
95
|
+
[AnthropicModel.CLAUDE_3_5_SONNET]: "sonnet",
|
|
96
|
+
[AnthropicModel.CLAUDE_3_5_SONNET_V2]: "sonnet",
|
|
97
|
+
[AnthropicModel.CLAUDE_SONNET_4]: "sonnet",
|
|
98
|
+
[AnthropicModel.CLAUDE_SONNET_4_6]: "sonnet",
|
|
99
|
+
[AnthropicModel.CLAUDE_3_OPUS]: "opus",
|
|
100
|
+
[AnthropicModel.CLAUDE_OPUS_4]: "opus",
|
|
101
|
+
[AnthropicModel.CLAUDE_OPUS_4_6]: "opus",
|
|
102
|
+
[AnthropicModel.CLAUDE_OPUS_4_5]: "opus",
|
|
103
|
+
[AnthropicModel.CLAUDE_SONNET_4_5]: "sonnet",
|
|
104
|
+
[AnthropicModel.CLAUDE_HAIKU_4_5]: "haiku",
|
|
202
105
|
};
|
|
106
|
+
const DESCRIPTION_BY_MODEL = {
|
|
107
|
+
[AnthropicModel.CLAUDE_3_HAIKU]: "Fast and efficient model for simple tasks",
|
|
108
|
+
[AnthropicModel.CLAUDE_3_5_HAIKU]: "Improved fast model with better performance",
|
|
109
|
+
[AnthropicModel.CLAUDE_3_5_SONNET]: "Balanced model for most tasks",
|
|
110
|
+
[AnthropicModel.CLAUDE_3_5_SONNET_V2]: "Updated Sonnet with improved capabilities",
|
|
111
|
+
[AnthropicModel.CLAUDE_SONNET_4]: "Latest Sonnet with extended thinking support",
|
|
112
|
+
[AnthropicModel.CLAUDE_3_OPUS]: "Legacy flagship model for complex tasks",
|
|
113
|
+
[AnthropicModel.CLAUDE_OPUS_4]: "Latest flagship model with advanced reasoning",
|
|
114
|
+
[AnthropicModel.CLAUDE_SONNET_4_6]: "Claude 4.6 Sonnet with 1M context window",
|
|
115
|
+
[AnthropicModel.CLAUDE_OPUS_4_6]: "Claude 4.6 Opus flagship with 1M context window",
|
|
116
|
+
[AnthropicModel.CLAUDE_OPUS_4_5]: "Claude 4.5 Opus flagship model",
|
|
117
|
+
[AnthropicModel.CLAUDE_SONNET_4_5]: "Claude 4.5 Sonnet balanced model",
|
|
118
|
+
[AnthropicModel.CLAUDE_HAIKU_4_5]: "Claude 4.5 Haiku fast model",
|
|
119
|
+
};
|
|
120
|
+
const DEPRECATED_MODELS = new Set([
|
|
121
|
+
AnthropicModel.CLAUDE_3_HAIKU,
|
|
122
|
+
AnthropicModel.CLAUDE_3_OPUS,
|
|
123
|
+
]);
|
|
124
|
+
/**
|
|
125
|
+
* CLAUDE_3_5_SONNET_V2's enum value ("claude-3-5-sonnet-v2-20241022") is a
|
|
126
|
+
* synthetic id minted only inside this file, pre-dating the manifest — it
|
|
127
|
+
* never was a real Anthropic wire id and has no row anywhere else in the
|
|
128
|
+
* codebase (pricing.ts, contextWindows.ts, VISION_CAPABILITIES all key off
|
|
129
|
+
* "claude-3-5-sonnet-20241022" for both v1 and v2). Route the manifest
|
|
130
|
+
* lookup to the real entry instead of inventing a duplicate manifest row
|
|
131
|
+
* for the same model; the enum member's name and exported value are left
|
|
132
|
+
* untouched.
|
|
133
|
+
*/
|
|
134
|
+
const MANIFEST_ID_OVERRIDES = {
|
|
135
|
+
[AnthropicModel.CLAUDE_3_5_SONNET_V2]: AnthropicModel.CLAUDE_3_5_SONNET,
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* displayName override applied only where routing through
|
|
139
|
+
* MANIFEST_ID_OVERRIDES would otherwise silently rename a model the caller
|
|
140
|
+
* already knows by its pre-migration display name (avoids user-visible
|
|
141
|
+
* naming churn, same principle the manifest itself documents for its
|
|
142
|
+
* pre-existing MODEL_REGISTRY-derived ids).
|
|
143
|
+
*/
|
|
144
|
+
const DISPLAY_NAME_OVERRIDES = {
|
|
145
|
+
[AnthropicModel.CLAUDE_3_5_SONNET_V2]: "Claude 3.5 Sonnet V2",
|
|
146
|
+
};
|
|
147
|
+
function metadataFromManifest(model) {
|
|
148
|
+
const manifestId = MANIFEST_ID_OVERRIDES[model] ?? model;
|
|
149
|
+
const entry = anthropicManifest.models[manifestId];
|
|
150
|
+
if (!entry) {
|
|
151
|
+
throw new Error(`metadataFromManifest: no manifest entry for "${model}" — add it to ` +
|
|
152
|
+
`src/lib/models/manifests/anthropic.ts before referencing it here`);
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
displayName: DISPLAY_NAME_OVERRIDES[model] ?? entry.displayName ?? model,
|
|
156
|
+
contextWindow: entry.contextWindow,
|
|
157
|
+
maxOutputTokens: entry.maxOutputTokens,
|
|
158
|
+
supportsVision: entry.vision,
|
|
159
|
+
supportsExtendedThinking: entry.reasoning ?? false,
|
|
160
|
+
supportsToolUse: entry.functionCalling,
|
|
161
|
+
supportsStreaming: true,
|
|
162
|
+
deprecated: DEPRECATED_MODELS.has(model),
|
|
163
|
+
family: FAMILY_BY_MODEL[model] ?? "sonnet",
|
|
164
|
+
description: DESCRIPTION_BY_MODEL[model] ?? entry.displayName ?? model,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export const MODEL_METADATA = Object.fromEntries(Object.values(AnthropicModel).map((model) => [
|
|
168
|
+
model,
|
|
169
|
+
metadataFromManifest(model),
|
|
170
|
+
]));
|
|
203
171
|
// ============================================================================
|
|
204
172
|
// DEFAULT MODELS BY TIER
|
|
205
173
|
// ============================================================================
|
|
@@ -447,15 +415,21 @@ export function getLatestModelsByFamily() {
|
|
|
447
415
|
};
|
|
448
416
|
// Priority order for each family (latest first based on model version)
|
|
449
417
|
const familyPriority = {
|
|
450
|
-
haiku: [
|
|
418
|
+
haiku: [
|
|
419
|
+
AnthropicModel.CLAUDE_HAIKU_4_5,
|
|
420
|
+
AnthropicModel.CLAUDE_3_5_HAIKU,
|
|
421
|
+
AnthropicModel.CLAUDE_3_HAIKU,
|
|
422
|
+
],
|
|
451
423
|
sonnet: [
|
|
452
424
|
AnthropicModel.CLAUDE_SONNET_4_6,
|
|
425
|
+
AnthropicModel.CLAUDE_SONNET_4_5,
|
|
453
426
|
AnthropicModel.CLAUDE_SONNET_4,
|
|
454
427
|
AnthropicModel.CLAUDE_3_5_SONNET_V2,
|
|
455
428
|
AnthropicModel.CLAUDE_3_5_SONNET,
|
|
456
429
|
],
|
|
457
430
|
opus: [
|
|
458
431
|
AnthropicModel.CLAUDE_OPUS_4_6,
|
|
432
|
+
AnthropicModel.CLAUDE_OPUS_4_5,
|
|
459
433
|
AnthropicModel.CLAUDE_OPUS_4,
|
|
460
434
|
AnthropicModel.CLAUDE_3_OPUS,
|
|
461
435
|
],
|
|
@@ -21,6 +21,15 @@ export declare function getAllManifestProviders(): string[];
|
|
|
21
21
|
* "llama3.2:latest" or OpenRouter's "openai/gpt-4o"), then undefined.
|
|
22
22
|
* Family rules are applied on top of whichever entry matched.
|
|
23
23
|
*/
|
|
24
|
+
/**
|
|
25
|
+
* Like resolveManifestEntryExact but WITHOUT the longest-prefix fallback:
|
|
26
|
+
* exact canonical id or declared alias only. For consumers where a prefix
|
|
27
|
+
* hit can steal precedence from a more-specific legacy row — boolean
|
|
28
|
+
* capability checks above all (a manifest "gpt-4" prefix match must never
|
|
29
|
+
* shadow the legacy table's explicit "gpt-4-vision-preview" vision row).
|
|
30
|
+
* Family rules still apply to a real match.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveManifestEntryStrict(provider: string, model: string): ProviderModelManifestEntry | undefined;
|
|
24
33
|
export declare function resolveManifestEntryExact(provider: string, model: string): ProviderModelManifestEntry | undefined;
|
|
25
34
|
/**
|
|
26
35
|
* Resolve a model against a provider's manifest, falling back to the
|