@llumiverse/drivers 0.22.0-dev.1 → 0.22.1

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 (140) hide show
  1. package/lib/cjs/adobe/firefly.js +2 -2
  2. package/lib/cjs/adobe/firefly.js.map +1 -1
  3. package/lib/cjs/azure/azure_foundry.js +11 -11
  4. package/lib/cjs/azure/azure_foundry.js.map +1 -1
  5. package/lib/cjs/bedrock/index.js +154 -11
  6. package/lib/cjs/bedrock/index.js.map +1 -1
  7. package/lib/cjs/bedrock/twelvelabs.js +87 -0
  8. package/lib/cjs/bedrock/twelvelabs.js.map +1 -0
  9. package/lib/cjs/groq/index.js +3 -3
  10. package/lib/cjs/groq/index.js.map +1 -1
  11. package/lib/cjs/huggingface_ie.js +2 -2
  12. package/lib/cjs/huggingface_ie.js.map +1 -1
  13. package/lib/cjs/mistral/index.js +2 -2
  14. package/lib/cjs/mistral/index.js.map +1 -1
  15. package/lib/cjs/openai/azure_openai.js +1 -1
  16. package/lib/cjs/openai/azure_openai.js.map +1 -1
  17. package/lib/cjs/openai/index.js +9 -5
  18. package/lib/cjs/openai/index.js.map +1 -1
  19. package/lib/cjs/replicate.js +3 -3
  20. package/lib/cjs/replicate.js.map +1 -1
  21. package/lib/cjs/togetherai/index.js +2 -2
  22. package/lib/cjs/togetherai/index.js.map +1 -1
  23. package/lib/cjs/vertexai/index.js +81 -30
  24. package/lib/cjs/vertexai/index.js.map +1 -1
  25. package/lib/cjs/vertexai/models/claude.js +29 -7
  26. package/lib/cjs/vertexai/models/claude.js.map +1 -1
  27. package/lib/cjs/vertexai/models/gemini.js +13 -2
  28. package/lib/cjs/vertexai/models/gemini.js.map +1 -1
  29. package/lib/cjs/vertexai/models/imagen.js +2 -2
  30. package/lib/cjs/vertexai/models/imagen.js.map +1 -1
  31. package/lib/cjs/vertexai/models.js +13 -2
  32. package/lib/cjs/vertexai/models.js.map +1 -1
  33. package/lib/cjs/watsonx/index.js +3 -3
  34. package/lib/cjs/watsonx/index.js.map +1 -1
  35. package/lib/esm/adobe/firefly.js +2 -2
  36. package/lib/esm/adobe/firefly.js.map +1 -1
  37. package/lib/esm/azure/azure_foundry.js +11 -11
  38. package/lib/esm/azure/azure_foundry.js.map +1 -1
  39. package/lib/esm/bedrock/index.js +154 -11
  40. package/lib/esm/bedrock/index.js.map +1 -1
  41. package/lib/esm/bedrock/twelvelabs.js +84 -0
  42. package/lib/esm/bedrock/twelvelabs.js.map +1 -0
  43. package/lib/esm/groq/index.js +3 -3
  44. package/lib/esm/groq/index.js.map +1 -1
  45. package/lib/esm/huggingface_ie.js +2 -2
  46. package/lib/esm/huggingface_ie.js.map +1 -1
  47. package/lib/esm/mistral/index.js +2 -2
  48. package/lib/esm/mistral/index.js.map +1 -1
  49. package/lib/esm/openai/azure_openai.js +1 -1
  50. package/lib/esm/openai/azure_openai.js.map +1 -1
  51. package/lib/esm/openai/index.js +9 -5
  52. package/lib/esm/openai/index.js.map +1 -1
  53. package/lib/esm/replicate.js +3 -3
  54. package/lib/esm/replicate.js.map +1 -1
  55. package/lib/esm/src/bedrock/index.js +150 -7
  56. package/lib/esm/src/bedrock/index.js.map +1 -1
  57. package/lib/esm/src/bedrock/twelvelabs.js +84 -0
  58. package/lib/esm/src/bedrock/twelvelabs.js.map +1 -0
  59. package/lib/esm/src/groq/index.js +1 -1
  60. package/lib/esm/src/groq/index.js.map +1 -1
  61. package/lib/esm/src/huggingface_ie.js +3 -2
  62. package/lib/esm/src/huggingface_ie.js.map +1 -1
  63. package/lib/esm/src/index.js +2 -2
  64. package/lib/esm/src/index.js.map +1 -1
  65. package/lib/esm/src/openai/index.js +6 -2
  66. package/lib/esm/src/openai/index.js.map +1 -1
  67. package/lib/esm/src/replicate.js +1 -1
  68. package/lib/esm/src/replicate.js.map +1 -1
  69. package/lib/esm/src/test-driver/TestErrorCompletionStream.js +16 -0
  70. package/lib/esm/src/test-driver/TestErrorCompletionStream.js.map +1 -0
  71. package/lib/esm/src/test-driver/TestValidationErrorCompletionStream.js +20 -0
  72. package/lib/esm/src/test-driver/TestValidationErrorCompletionStream.js.map +1 -0
  73. package/lib/esm/src/test-driver/index.js +91 -0
  74. package/lib/esm/src/test-driver/index.js.map +1 -0
  75. package/lib/esm/src/test-driver/utils.js +25 -0
  76. package/lib/esm/src/test-driver/utils.js.map +1 -0
  77. package/lib/esm/src/vertexai/index.js +81 -30
  78. package/lib/esm/src/vertexai/index.js.map +1 -1
  79. package/lib/esm/src/vertexai/models/claude.js +26 -4
  80. package/lib/esm/src/vertexai/models/claude.js.map +1 -1
  81. package/lib/esm/src/vertexai/models/gemini.js +14 -3
  82. package/lib/esm/src/vertexai/models/gemini.js.map +1 -1
  83. package/lib/esm/src/vertexai/models/imagen.js +1 -1
  84. package/lib/esm/src/vertexai/models/imagen.js.map +1 -1
  85. package/lib/esm/src/vertexai/models.js +13 -2
  86. package/lib/esm/src/vertexai/models.js.map +1 -1
  87. package/lib/esm/togetherai/index.js +2 -2
  88. package/lib/esm/togetherai/index.js.map +1 -1
  89. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  90. package/lib/esm/vertexai/index.js +81 -30
  91. package/lib/esm/vertexai/index.js.map +1 -1
  92. package/lib/esm/vertexai/models/claude.js +28 -6
  93. package/lib/esm/vertexai/models/claude.js.map +1 -1
  94. package/lib/esm/vertexai/models/gemini.js +14 -3
  95. package/lib/esm/vertexai/models/gemini.js.map +1 -1
  96. package/lib/esm/vertexai/models/imagen.js +2 -2
  97. package/lib/esm/vertexai/models/imagen.js.map +1 -1
  98. package/lib/esm/vertexai/models.js +13 -2
  99. package/lib/esm/vertexai/models.js.map +1 -1
  100. package/lib/esm/watsonx/index.js +3 -3
  101. package/lib/esm/watsonx/index.js.map +1 -1
  102. package/lib/types/bedrock/index.d.ts +7 -3
  103. package/lib/types/bedrock/index.d.ts.map +1 -1
  104. package/lib/types/bedrock/twelvelabs.d.ts +50 -0
  105. package/lib/types/bedrock/twelvelabs.d.ts.map +1 -0
  106. package/lib/types/groq/index.d.ts.map +1 -1
  107. package/lib/types/openai/index.d.ts.map +1 -1
  108. package/lib/types/replicate.d.ts.map +1 -1
  109. package/lib/types/src/bedrock/index.d.ts +7 -3
  110. package/lib/types/src/bedrock/twelvelabs.d.ts +49 -0
  111. package/lib/types/src/huggingface_ie.d.ts +6 -6
  112. package/lib/types/src/index.d.ts +2 -2
  113. package/lib/types/src/test-driver/TestErrorCompletionStream.d.ts +8 -0
  114. package/lib/types/src/test-driver/TestValidationErrorCompletionStream.d.ts +8 -0
  115. package/lib/types/src/test-driver/index.d.ts +23 -0
  116. package/lib/types/src/test-driver/utils.d.ts +4 -0
  117. package/lib/types/src/vertexai/index.d.ts +11 -11
  118. package/lib/types/src/vertexai/models/claude.d.ts +2 -0
  119. package/lib/types/vertexai/index.d.ts +11 -11
  120. package/lib/types/vertexai/index.d.ts.map +1 -1
  121. package/lib/types/vertexai/models/claude.d.ts +2 -0
  122. package/lib/types/vertexai/models/claude.d.ts.map +1 -1
  123. package/lib/types/vertexai/models/gemini.d.ts.map +1 -1
  124. package/lib/types/vertexai/models.d.ts.map +1 -1
  125. package/package.json +85 -85
  126. package/src/bedrock/index.ts +183 -10
  127. package/src/bedrock/twelvelabs.ts +150 -0
  128. package/src/groq/index.ts +4 -3
  129. package/src/huggingface_ie.ts +8 -7
  130. package/src/index.ts +2 -2
  131. package/src/openai/index.ts +6 -2
  132. package/src/replicate.ts +1 -1
  133. package/src/vertexai/index.ts +56 -3
  134. package/src/vertexai/models/claude.ts +30 -4
  135. package/src/vertexai/models/gemini.ts +16 -5
  136. package/src/vertexai/models.ts +14 -2
  137. /package/src/{test-driver → test}/TestErrorCompletionStream.ts +0 -0
  138. /package/src/{test-driver → test}/TestValidationErrorCompletionStream.ts +0 -0
  139. /package/src/{test-driver → test}/index.ts +0 -0
  140. /package/src/{test-driver → test}/utils.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import {
2
- InferenceClient,
3
- TextGenerationStreamOutput,
2
+ HfInference,
3
+ HfInferenceEndpoint,
4
+ TextGenerationStreamOutput
4
5
  } from "@huggingface/inference";
5
6
  import {
6
7
  AIModel,
@@ -24,7 +25,7 @@ export class HuggingFaceIEDriver extends AbstractDriver<HuggingFaceIEDriverOptio
24
25
  static PROVIDER = "huggingface_ie";
25
26
  provider = HuggingFaceIEDriver.PROVIDER;
26
27
  service: FetchClient;
27
- _executor?: InferenceClient;
28
+ _executor?: HfInferenceEndpoint;
28
29
 
29
30
  constructor(
30
31
  options: HuggingFaceIEDriverOptions
@@ -59,8 +60,7 @@ export class HuggingFaceIEDriver extends AbstractDriver<HuggingFaceIEDriverOptio
59
60
  `Endpoint ${model} is not running - current status: ${endpoint.status}`
60
61
  );
61
62
 
62
- // Use the new InferenceClient and bind it to the endpoint URL
63
- this._executor = new InferenceClient(this.options.apiKey).endpoint(
63
+ this._executor = new HfInference(this.options.apiKey).endpoint(
64
64
  endpoint.url
65
65
  );
66
66
  }
@@ -82,7 +82,8 @@ export class HuggingFaceIEDriver extends AbstractDriver<HuggingFaceIEDriverOptio
82
82
  },
83
83
  });
84
84
 
85
- return transformAsyncIterator(req, (val: TextGenerationStreamOutput) : CompletionChunkObject => {
85
+
86
+ return transformAsyncIterator(req, (val: TextGenerationStreamOutput) => {
86
87
  //special like <s> are not part of the result
87
88
  if (val.token.special) return { result: [] };
88
89
  let finish_reason = val.details?.finish_reason as string;
@@ -95,7 +96,7 @@ export class HuggingFaceIEDriver extends AbstractDriver<HuggingFaceIEDriverOptio
95
96
  token_usage: {
96
97
  result: val.details?.generated_tokens ?? 0,
97
98
  }
98
- };
99
+ } as CompletionChunkObject;
99
100
  });
100
101
  }
101
102
 
package/src/index.ts CHANGED
@@ -1,12 +1,12 @@
1
- export * from "./azure/azure_foundry.js";
2
1
  export * from "./bedrock/index.js";
3
2
  export * from "./groq/index.js";
4
3
  export * from "./huggingface_ie.js";
5
4
  export * from "./mistral/index.js";
6
5
  export * from "./openai/azure_openai.js";
6
+ export * from "./azure/azure_foundry.js";
7
7
  export * from "./openai/openai.js";
8
8
  export * from "./replicate.js";
9
- export * from "./test-driver/index.js";
9
+ export * from "./test/index.js";
10
10
  export * from "./togetherai/index.js";
11
11
  export * from "./vertexai/index.js";
12
12
  export * from "./watsonx/index.js";
@@ -293,7 +293,7 @@ export abstract class BaseOpenAIDriver extends AbstractDriver<
293
293
  //Some of these use the completions API instead of the chat completions API.
294
294
  //Others are for non-text input modalities. Therefore common to both.
295
295
  const wordBlacklist = ["embed", "whisper", "transcribe", "audio", "moderation", "tts",
296
- "realtime", "dall-e", "babbage", "davinci", "codex", "o1-pro"];
296
+ "realtime", "dall-e", "babbage", "davinci", "codex", "o1-pro", "computer-use", "sora"];
297
297
 
298
298
 
299
299
  //OpenAI has very little information, filtering based on name.
@@ -304,11 +304,15 @@ export abstract class BaseOpenAIDriver extends AbstractDriver<
304
304
  const models = filter ? result.filter(filter) : result;
305
305
  const aiModels = models.map((m) => {
306
306
  const modelCapability = getModelCapabilities(m.id, "openai");
307
+ let owner = m.owned_by;
308
+ if (owner == "system") {
309
+ owner = "openai";
310
+ }
307
311
  return {
308
312
  id: m.id,
309
313
  name: m.id,
310
314
  provider: this.provider,
311
- owner: m.owned_by,
315
+ owner: owner,
312
316
  type: m.object === "model" ? ModelType.Text : ModelType.Unknown,
313
317
  can_stream: true,
314
318
  is_multimodal: m.id.includes("gpt-4"),
package/src/replicate.ts CHANGED
@@ -236,7 +236,7 @@ export class ReplicateDriver extends AbstractDriver<DriverOptions, string> {
236
236
  this.service.models.versions.list(owner, model),
237
237
  ]);
238
238
 
239
- if (!rModel || !versions || (versions as any).results?.length === 0) {
239
+ if (!rModel || !versions || versions.length === 0) {
240
240
  throw new Error("Model not found or no versions available");
241
241
  }
242
242
 
@@ -23,6 +23,7 @@ import { PredictionServiceClient, v1beta1 } from "@google-cloud/aiplatform";
23
23
  import { AnthropicVertex } from "@anthropic-ai/vertex-sdk";
24
24
  import { ImagenModelDefinition, ImagenPrompt } from "./models/imagen.js";
25
25
  import { GoogleGenAI, Content, Model } from "@google/genai";
26
+ import { NON_GLOBAL_ANTHROPIC_MODELS, ANTHROPIC_REGIONS } from "./models/claude.js";
26
27
 
27
28
  export interface VertexAIDriverOptions extends DriverOptions {
28
29
  project: string;
@@ -130,12 +131,34 @@ export class VertexAIDriver extends AbstractDriver<VertexAIDriverOptions, Vertex
130
131
  return this.llamaClient;
131
132
  }
132
133
 
133
- public getAnthropicClient(): AnthropicVertex {
134
- //Lazy initialization
134
+ public getAnthropicClient(region: string = this.options.region): AnthropicVertex {
135
+ // Extract region prefix and map if it exists in ANTHROPIC_REGIONS, otherwise use as-is
136
+ const getRegionPrefix = (r: string) => r.split('-')[0];
137
+ const regionPrefix = getRegionPrefix(region);
138
+ const mappedRegion = ANTHROPIC_REGIONS[regionPrefix] || region;
139
+
140
+ const defaultRegionPrefix = getRegionPrefix(this.options.region);
141
+ const defaultMappedRegion = ANTHROPIC_REGIONS[defaultRegionPrefix] || this.options.region;
142
+
143
+ // If mapped region is different from default mapped region, create one-off client
144
+ if (mappedRegion !== defaultMappedRegion) {
145
+ return new AnthropicVertex({
146
+ timeout: 20 * 60 * 10000, // Set to 20 minutes, 10 minute default, setting this disables long request error: https://github.com/anthropics/anthropic-sdk-typescript?#long-requests
147
+ region: mappedRegion,
148
+ projectId: this.options.project,
149
+ googleAuth: new GoogleAuth({
150
+ scopes: ["https://www.googleapis.com/auth/cloud-platform"],
151
+ authClient: this.authClient as JSONClient,
152
+ projectId: this.options.project,
153
+ }),
154
+ });
155
+ }
156
+
157
+ //Lazy initialization for default region
135
158
  if (!this.anthropicClient) {
136
159
  this.anthropicClient = new AnthropicVertex({
137
160
  timeout: 20 * 60 * 10000, // Set to 20 minutes, 10 minute default, setting this disables long request error: https://github.com/anthropics/anthropic-sdk-typescript?#long-requests
138
- region: "us-east5",
161
+ region: mappedRegion,
139
162
  projectId: this.options.project,
140
163
  googleAuth: new GoogleAuth({
141
164
  scopes: ["https://www.googleapis.com/auth/cloud-platform"],
@@ -353,6 +376,36 @@ export class VertexAIDriver extends AbstractDriver<VertexAIDriverOptions, Vertex
353
376
  } satisfies AIModel<string>;
354
377
  }));
355
378
 
379
+ // Create global anthropic models for those not in NON_GLOBAL_ANTHROPIC_MODELS
380
+ if (publisher === 'anthropic') {
381
+ const globalAnthropicModels = response.filter((model) => {
382
+ const modelName = model.name ?? "";
383
+ if (retiredModels.some(retiredModel => modelName.includes(retiredModel))) {
384
+ return false;
385
+ }
386
+ if (modelFamily.some(family => modelName.includes(family))) {
387
+ if (modelName.includes("claude-3-7")) {
388
+ return true;
389
+ }
390
+ return !NON_GLOBAL_ANTHROPIC_MODELS.some(nonGlobalModel => modelName.includes(nonGlobalModel));
391
+ }
392
+ return false;
393
+ }).map(model => {
394
+ const modelCapability = getModelCapabilities(model.name ?? '', "vertexai");
395
+ return {
396
+ id: "locations/global/" + model.name,
397
+ name: "Global " + model.name?.split('/').pop(),
398
+ provider: 'vertexai',
399
+ owner: publisher,
400
+ input_modalities: modelModalitiesToArray(modelCapability.input),
401
+ output_modalities: modelModalitiesToArray(modelCapability.output),
402
+ tool_support: modelCapability.tool_support,
403
+ } satisfies AIModel<string>;
404
+ });
405
+
406
+ models = models.concat(globalAnthropicModels);
407
+ }
408
+
356
409
  // Add additional models that are not in the listing
357
410
  for (const additionalModel of additionalModels[publisher as keyof typeof additionalModels]) {
358
411
  const publisherModelName = `publishers/${publisher}/models/${additionalModel}`;
@@ -9,6 +9,17 @@ import { ModelDefinition } from "../models.js";
9
9
  import { MessageCreateParamsBase, MessageCreateParamsNonStreaming, RawMessageStreamEvent } from "@anthropic-ai/sdk/resources/messages.js";
10
10
  import { MessageStreamParams } from "@anthropic-ai/sdk/resources/index.mjs";
11
11
 
12
+ export const ANTHROPIC_REGIONS: Record<string, string> = {
13
+ us: "us-east5",
14
+ europe: "europe-west1",
15
+ global: "global",
16
+ }
17
+
18
+ export const NON_GLOBAL_ANTHROPIC_MODELS = [
19
+ "claude-3-5",
20
+ "claude-3",
21
+ ];
22
+
12
23
  interface ClaudePrompt {
13
24
  messages: MessageParam[];
14
25
  system?: TextBlockParam[];
@@ -250,7 +261,15 @@ export class ClaudeModelDefinition implements ModelDefinition<ClaudePrompt> {
250
261
  }
251
262
 
252
263
  async requestTextCompletion(driver: VertexAIDriver, prompt: ClaudePrompt, options: ExecutionOptions): Promise<Completion> {
253
- const client = driver.getAnthropicClient();
264
+ const splits = options.model.split("/");
265
+ let region: string | undefined = undefined;
266
+ if (splits[0] === "locations" && splits.length >= 2) {
267
+ region = splits[1];
268
+ }
269
+ const modelName = splits[splits.length - 1];
270
+ options = { ...options, model: modelName };
271
+
272
+ const client = driver.getAnthropicClient(region);
254
273
  options.model_options = options.model_options as VertexAIClaudeOptions;
255
274
 
256
275
  if (options.model_options?._option_id !== "vertexai-claude") {
@@ -287,7 +306,15 @@ export class ClaudeModelDefinition implements ModelDefinition<ClaudePrompt> {
287
306
  }
288
307
 
289
308
  async requestTextCompletionStream(driver: VertexAIDriver, prompt: ClaudePrompt, options: ExecutionOptions): Promise<AsyncIterable<CompletionChunkObject>> {
290
- const client = driver.getAnthropicClient();
309
+ const splits = options.model.split("/");
310
+ let region: string | undefined = undefined;
311
+ if (splits[0] === "locations" && splits.length >= 2) {
312
+ region = splits[1];
313
+ }
314
+ const modelName = splits[splits.length - 1];
315
+ options = { ...options, model: modelName };
316
+
317
+ const client = driver.getAnthropicClient(region);
291
318
  const model_options = options.model_options as VertexAIClaudeOptions | undefined;
292
319
 
293
320
  if (model_options?._option_id !== "vertexai-claude") {
@@ -399,8 +426,7 @@ interface RequestOptions {
399
426
  }
400
427
 
401
428
  function getClaudePayload(options: ExecutionOptions, prompt: ClaudePrompt): { payload: MessageCreateParamsBase, requestOptions: RequestOptions | undefined } {
402
- const splits = options.model.split("/");
403
- const modelName = splits[splits.length - 1];
429
+ const modelName = options.model; // Model name is already extracted in the calling methods
404
430
  const model_options = options.model_options as VertexAIClaudeOptions;
405
431
 
406
432
  // Add beta header for Claude 3.7 models to enable 128k output tokens
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Content, FinishReason, FunctionCallingConfigMode, FunctionDeclaration, GenerateContentConfig, GenerateContentParameters,
3
3
  GenerateContentResponseUsageMetadata,
4
- HarmBlockThreshold, HarmCategory, Part, SafetySetting, Schema, Tool, Type
4
+ HarmBlockThreshold, HarmCategory, Modality, Part, SafetySetting, Schema, Tool, Type
5
5
  } from "@google/genai";
6
6
  import {
7
7
  AIModel, Completion, CompletionChunkObject, CompletionResult, ExecutionOptions,
@@ -56,7 +56,18 @@ function getGeminiPayload(options: ExecutionOptions, prompt: GenerateContentProm
56
56
  || options.model.includes("gemini-2.5");
57
57
 
58
58
  const configNanoBanana: GenerateContentConfig = {
59
- responseModalities: ["TEXT", "IMAGE"]
59
+ systemInstruction: prompt.system,
60
+ safetySettings: geminiSafetySettings,
61
+ responseModalities: [Modality.TEXT, Modality.IMAGE], // This is an error if only Text, and Only Image just gets blank responses.
62
+ candidateCount: 1,
63
+ //Model options
64
+ temperature: model_options?.temperature,
65
+ topP: model_options?.top_p,
66
+ maxOutputTokens: geminiMaxTokens(options),
67
+ stopSequences: model_options?.stop_sequence,
68
+ imageConfig: {
69
+ aspectRatio: model_options?.image_aspect_ratio,
70
+ }
60
71
  }
61
72
 
62
73
  const config: GenerateContentConfig = {
@@ -502,7 +513,7 @@ export function mergeConsecutiveRole(contents: Content[] | undefined): Content[]
502
513
  const supportedFinishReasons: FinishReason[] = [
503
514
  FinishReason.MAX_TOKENS,
504
515
  FinishReason.STOP,
505
- FinishReason.FINISH_REASON_UNSPECIFIED
516
+ FinishReason.FINISH_REASON_UNSPECIFIED,
506
517
  ]
507
518
 
508
519
  function geminiMaxTokens(option: StatelessExecutionOptions) {
@@ -716,7 +727,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
716
727
  let region: string | undefined = undefined;
717
728
  if (splits[0] === "locations" && splits.length >= 2) {
718
729
  region = splits[1];
719
- }
730
+ }
720
731
  const modelName = splits[splits.length - 1];
721
732
  options = { ...options, model: modelName };
722
733
 
@@ -784,7 +795,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
784
795
  let region: string | undefined = undefined;
785
796
  if (splits[0] === "locations" && splits.length >= 2) {
786
797
  region = splits[1];
787
- }
798
+ }
788
799
  const modelName = splits[splits.length - 1];
789
800
  options = { ...options, model: modelName };
790
801
 
@@ -15,8 +15,20 @@ export interface ModelDefinition<PromptT = any> {
15
15
 
16
16
  export function getModelDefinition(model: string): ModelDefinition {
17
17
  const splits = model.split("/");
18
- const publisher = splits[1];
19
- const modelName = trimModelName(splits[splits.length - 1]);
18
+
19
+ // Handle both formats: "publishers/anthropic/models/..." and "locations/.../publishers/anthropic/models/..."
20
+ let publisher: string | undefined;
21
+ let modelName: string;
22
+
23
+ const publisherIndex = splits.indexOf("publishers");
24
+ if (publisherIndex !== -1 && publisherIndex + 1 < splits.length) {
25
+ publisher = splits[publisherIndex + 1];
26
+ modelName = trimModelName(splits[splits.length - 1]);
27
+ } else {
28
+ // Fallback to old logic for backward compatibility
29
+ publisher = splits[1];
30
+ modelName = trimModelName(splits[splits.length - 1]);
31
+ }
20
32
 
21
33
  if (publisher?.includes("anthropic")) {
22
34
  return new ClaudeModelDefinition(modelName);
File without changes
File without changes