@llumiverse/common 0.23.0-dev.20251201 → 0.24.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/lib/cjs/capability/azure_foundry.js +160 -0
- package/lib/cjs/capability/azure_foundry.js.map +1 -0
- package/lib/cjs/capability/bedrock.js +158 -0
- package/lib/cjs/capability/bedrock.js.map +1 -0
- package/lib/cjs/capability/openai.js +95 -0
- package/lib/cjs/capability/openai.js.map +1 -0
- package/lib/cjs/capability/vertexai.js +80 -0
- package/lib/cjs/capability/vertexai.js.map +1 -0
- package/lib/cjs/capability.js +82 -0
- package/lib/cjs/capability.js.map +1 -0
- package/lib/cjs/index.js +25 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/options/azure_foundry.js +428 -0
- package/lib/cjs/options/azure_foundry.js.map +1 -0
- package/lib/cjs/options/bedrock.js +462 -0
- package/lib/cjs/options/bedrock.js.map +1 -0
- package/lib/cjs/options/fallback.js +35 -0
- package/lib/cjs/options/fallback.js.map +1 -0
- package/lib/cjs/options/groq.js +37 -0
- package/lib/cjs/options/groq.js.map +1 -0
- package/lib/cjs/options/openai.js +126 -0
- package/lib/cjs/options/openai.js.map +1 -0
- package/lib/cjs/options/vertexai.js +503 -0
- package/lib/cjs/options/vertexai.js.map +1 -0
- package/lib/cjs/options.js +30 -0
- package/lib/cjs/options.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/types.js +195 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/esm/capability/azure_foundry.js +157 -0
- package/lib/esm/capability/azure_foundry.js.map +1 -0
- package/lib/esm/capability/bedrock.js +155 -0
- package/lib/esm/capability/bedrock.js.map +1 -0
- package/lib/esm/capability/openai.js +92 -0
- package/lib/esm/capability/openai.js.map +1 -0
- package/lib/esm/capability/vertexai.js +77 -0
- package/lib/esm/capability/vertexai.js.map +1 -0
- package/lib/esm/capability.js +77 -0
- package/lib/esm/capability.js.map +1 -0
- package/lib/esm/index.js +9 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/options/azure_foundry.js +424 -0
- package/lib/esm/options/azure_foundry.js.map +1 -0
- package/lib/esm/options/bedrock.js +458 -0
- package/lib/esm/options/bedrock.js.map +1 -0
- package/lib/esm/options/fallback.js +32 -0
- package/lib/esm/options/fallback.js.map +1 -0
- package/lib/esm/options/groq.js +34 -0
- package/lib/esm/options/groq.js.map +1 -0
- package/lib/esm/options/openai.js +123 -0
- package/lib/esm/options/openai.js.map +1 -0
- package/lib/esm/options/vertexai.js +498 -0
- package/lib/esm/options/vertexai.js.map +1 -0
- package/lib/esm/options.js +27 -0
- package/lib/esm/options.js.map +1 -0
- package/lib/esm/types.js +192 -0
- package/lib/esm/types.js.map +1 -0
- package/lib/types/capability/azure_foundry.d.ts +7 -0
- package/lib/types/capability/azure_foundry.d.ts.map +1 -0
- package/lib/types/capability/bedrock.d.ts +7 -0
- package/lib/types/capability/bedrock.d.ts.map +1 -0
- package/lib/types/capability/openai.d.ts +13 -0
- package/lib/types/capability/openai.d.ts.map +1 -0
- package/lib/types/capability/vertexai.d.ts +11 -0
- package/lib/types/capability/vertexai.d.ts.map +1 -0
- package/lib/types/capability.d.ts +5 -0
- package/lib/types/capability.d.ts.map +1 -0
- package/lib/types/index.d.ts +9 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/options/azure_foundry.d.ts +52 -0
- package/lib/types/options/azure_foundry.d.ts.map +1 -0
- package/lib/types/options/bedrock.d.ts +52 -0
- package/lib/types/options/bedrock.d.ts.map +1 -0
- package/lib/types/options/fallback.d.ts +13 -0
- package/lib/types/options/fallback.d.ts.map +1 -0
- package/lib/types/options/groq.d.ts +12 -0
- package/lib/types/options/groq.d.ts.map +1 -0
- package/lib/types/options/openai.d.ts +21 -0
- package/lib/types/options/openai.d.ts.map +1 -0
- package/lib/types/options/vertexai.d.ts +74 -0
- package/lib/types/options/vertexai.d.ts.map +1 -0
- package/lib/types/options.d.ts +3 -0
- package/lib/types/options.d.ts.map +1 -0
- package/lib/types/types.d.ts +442 -0
- package/lib/types/types.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/capability/azure_foundry.ts +1 -0
- package/src/capability/bedrock.ts +98 -128
- package/src/capability/openai.ts +43 -68
- package/src/capability/vertexai.ts +15 -36
- package/src/capability.ts +19 -2
- package/src/types.ts +52 -2
|
@@ -1,101 +1,72 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ModelCapabilities, ModelModalities } from "../types.js";
|
|
2
2
|
|
|
3
|
-
//
|
|
3
|
+
// Explicit exception lists keyed by the model identifier (last segment after the prefix)
|
|
4
|
+
const RECORD_FOUNDATION_EXCEPTIONS: Record<string, ModelCapabilities> = {};
|
|
5
|
+
const RECORD_PROFILE_EXCEPTIONS: Record<string, ModelCapabilities> = {
|
|
6
|
+
"meta.llama3-1-70b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
7
|
+
"meta.llama3-1-8b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// Record of Bedrock model capabilities keyed by model identifier.
|
|
11
|
+
// Only include models that differ from their family defaults
|
|
4
12
|
const RECORD_MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {
|
|
5
|
-
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"foundation-model/amazon.titan-text-express-v1": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
13
|
-
"foundation-model/amazon.titan-text-lite-v1": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
14
|
-
"foundation-model/amazon.titan-text-premier-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
15
|
-
"foundation-model/amazon.titan-tg1-large": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
16
|
-
"foundation-model/anthropic.claude-3-5-haiku-20241022-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
17
|
-
"foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
18
|
-
"foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
19
|
-
"foundation-model/anthropic.claude-3-haiku-20240307-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
20
|
-
"foundation-model/anthropic.claude-3-opus-20240229-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
21
|
-
"foundation-model/anthropic.claude-3-sonnet-20240229-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
22
|
-
"foundation-model/anthropic.claude-instant-v1": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
23
|
-
"foundation-model/anthropic.claude-v2": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
24
|
-
"foundation-model/anthropic.claude-v2:1": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
25
|
-
"foundation-model/cohere.command-light-text-v14": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
26
|
-
"foundation-model/cohere.command-r-plus-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
27
|
-
"foundation-model/cohere.command-r-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
28
|
-
"foundation-model/cohere.command-text-v14": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
29
|
-
"foundation-model/meta.llama3-1-405b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
30
|
-
"foundation-model/meta.llama3-1-70b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
31
|
-
"foundation-model/meta.llama3-1-8b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
32
|
-
"foundation-model/meta.llama3-70b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
33
|
-
"foundation-model/meta.llama3-8b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
34
|
-
"foundation-model/mistral.mixtral-8x7b-instruct-v0:1": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
35
|
-
"foundation-model/mistral.mistral-7b-instruct-v0:2": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
36
|
-
"foundation-model/mistral.mistral-large-2402-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
37
|
-
"foundation-model/mistral.mistral-large-2407-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
38
|
-
"foundation-model/mistral.mistral-small-2402-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
39
|
-
"foundation-model/openai.gpt-oss-20b-1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
40
|
-
"foundation-model/openai.gpt-oss-120b-1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
41
|
-
"inference-profile/us.amazon.nova-lite-v1:0": { input: { text: true, image: true, video: true, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
42
|
-
"inference-profile/us.amazon.nova-micro-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
43
|
-
"inference-profile/us.amazon.nova-premier-v1:0": { input: { text: true, image: true, video: true, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
44
|
-
"inference-profile/us.amazon.nova-pro-v1:0": { input: { text: true, image: true, video: true, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
45
|
-
"inference-profile/us.anthropic.claude-3-5-haiku-20241022-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
46
|
-
"inference-profile/us.anthropic.claude-3-5-sonnet-20240620-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
47
|
-
"inference-profile/us.anthropic.claude-3-5-sonnet-20241022-v2:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
48
|
-
"inference-profile/us.anthropic.claude-3-7-sonnet-20250219-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
49
|
-
"inference-profile/us.anthropic.claude-3-haiku-20240307-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
50
|
-
"inference-profile/us.anthropic.claude-3-opus-20240229-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
51
|
-
"inference-profile/us.anthropic.claude-3-sonnet-20240229-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
52
|
-
"inference-profile/us.anthropic.claude-opus-4-20250514-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
53
|
-
"inference-profile/us.anthropic.claude-sonnet-4-20250514-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
54
|
-
"inference-profile/us.deepseek.r1-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
55
|
-
"inference-profile/us.meta.llama3-1-70b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
56
|
-
"inference-profile/us.meta.llama3-1-8b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
57
|
-
"inference-profile/us.meta.llama3-2-1b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
58
|
-
"inference-profile/us.meta.llama3-2-11b-instruct-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
59
|
-
"inference-profile/us.meta.llama3-2-3b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
60
|
-
"inference-profile/us.meta.llama3-2-90b-instruct-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
61
|
-
"inference-profile/us.meta.llama3-3-70b-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
62
|
-
"inference-profile/us.meta.llama4-maverick-17b-instruct-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
63
|
-
"inference-profile/us.meta.llama4-scout-17b-instruct-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
64
|
-
"inference-profile/us.mistral.pixtral-large-2502-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
65
|
-
"inference-profile/us.writer.palmyra-x4-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
66
|
-
"inference-profile/us.writer.palmyra-x5-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
13
|
+
// Models with specific exceptions that differ from family
|
|
14
|
+
"ai21.jamba-instruct-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
15
|
+
"amazon.nova-canvas-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { image: true, text: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
16
|
+
"amazon.nova-micro-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
17
|
+
"anthropic.claude-3-5-haiku-20241022-v1:0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
18
|
+
"meta.llama3-2-11b-instruct-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
19
|
+
"meta.llama3-2-90b-instruct-v1:0": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
67
20
|
};
|
|
68
21
|
|
|
69
|
-
//
|
|
22
|
+
// Family capabilities (longest prefix match)
|
|
70
23
|
const RECORD_FAMILY_CAPABILITIES: Record<string, ModelCapabilities> = {
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"inference-profile/us.meta.llama4-maverick-17b": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
93
|
-
"inference-profile/us.meta.llama4-scout-17b": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
94
|
-
"inference-profile/us.mistral.pixtral": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
95
|
-
"inference-profile/us.writer.palmyra": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
96
|
-
"inference-profile/us.twelvelabs.": { input: { text: true, image: false, video: true, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
24
|
+
"ai21.jamba": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
25
|
+
"amazon.nova": { input: { text: true, image: true, video: true, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
26
|
+
"amazon.titan": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
27
|
+
"anthropic.claude-3-5-haiku": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
28
|
+
"anthropic.claude": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
29
|
+
"cohere.command-r": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: true },
|
|
30
|
+
"cohere.command": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
31
|
+
"deepseek.r1": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
32
|
+
"meta.llama3-1": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
33
|
+
"meta.llama3-2": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
34
|
+
"meta.llama3-3": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
35
|
+
"meta.llama3": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
36
|
+
"meta.llama4": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
37
|
+
"mistral.mistral-large": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
38
|
+
"mistral.mistral": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
39
|
+
"mistral.mixtral": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
40
|
+
"mistral.pixtral": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
41
|
+
"openai.gpt-oss": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
42
|
+
"qwen.": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false, tool_support_streaming: false },
|
|
43
|
+
"twelvelabs.": { input: { text: true, image: false, video: true, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
44
|
+
"writer.palmyra": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true, tool_support_streaming: false },
|
|
97
45
|
};
|
|
98
46
|
|
|
47
|
+
function extractModelLookupKey(modelName: string): string {
|
|
48
|
+
const lower = modelName.toLowerCase();
|
|
49
|
+
const lastSlashIdx = lower.lastIndexOf("/");
|
|
50
|
+
let key = lastSlashIdx === -1 ? lower : lower.slice(lastSlashIdx + 1);
|
|
51
|
+
if (lower.includes("inference-profile/")) {
|
|
52
|
+
key = key.replace(/^[^.]+\./, "");
|
|
53
|
+
}
|
|
54
|
+
return key;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function findFamilyCapability(
|
|
58
|
+
lookupKey: string,
|
|
59
|
+
families: Record<string, ModelCapabilities>
|
|
60
|
+
): ModelCapabilities | undefined {
|
|
61
|
+
let bestKey: string | undefined;
|
|
62
|
+
for (const key of Object.keys(families)) {
|
|
63
|
+
if (lookupKey.startsWith(key) && (!bestKey || key.length > bestKey.length)) {
|
|
64
|
+
bestKey = key;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return bestKey ? families[bestKey] : undefined;
|
|
68
|
+
}
|
|
69
|
+
|
|
99
70
|
/**
|
|
100
71
|
* Extract the model identifier from an ARN or inference profile
|
|
101
72
|
* @param modelName The full model ARN or name
|
|
@@ -139,57 +110,56 @@ function modelMatches(modelName: string, patterns: string[]): boolean {
|
|
|
139
110
|
*/
|
|
140
111
|
export function getModelCapabilitiesBedrock(model: string): ModelCapabilities {
|
|
141
112
|
// Normalize ARN or inference-profile to model ID
|
|
142
|
-
|
|
113
|
+
const modelLower = model.toLowerCase();
|
|
114
|
+
let normalized = modelLower;
|
|
143
115
|
const arnPattern = /^arn:aws:bedrock:[^:]+:[^:]*:(inference-profile|foundation-model)\/.+/i;
|
|
144
|
-
if (arnPattern.test(
|
|
116
|
+
if (arnPattern.test(modelLower)) {
|
|
145
117
|
// Extract after last occurrence of 'foundation-model/' or 'inference-profile/'
|
|
146
|
-
const foundationIdx =
|
|
147
|
-
const inferenceIdx =
|
|
118
|
+
const foundationIdx = modelLower.lastIndexOf('foundation-model/');
|
|
119
|
+
const inferenceIdx = modelLower.lastIndexOf('inference-profile/');
|
|
148
120
|
if (foundationIdx !== -1) {
|
|
149
|
-
normalized =
|
|
121
|
+
normalized = modelLower.substring(foundationIdx);
|
|
150
122
|
} else if (inferenceIdx !== -1) {
|
|
151
|
-
normalized =
|
|
123
|
+
normalized = modelLower.substring(inferenceIdx);
|
|
152
124
|
}
|
|
153
125
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
126
|
+
const isInferenceProfile = normalized.startsWith("inference-profile/");
|
|
127
|
+
const isFoundationModel = normalized.startsWith("foundation-model/");
|
|
128
|
+
const lookupKey = extractModelLookupKey(normalized);
|
|
129
|
+
|
|
130
|
+
// 1. Check exceptions
|
|
131
|
+
if (isFoundationModel) {
|
|
132
|
+
const exception = RECORD_FOUNDATION_EXCEPTIONS[lookupKey];
|
|
133
|
+
if (exception) return exception;
|
|
134
|
+
} else if (isInferenceProfile) {
|
|
135
|
+
const exception = RECORD_PROFILE_EXCEPTIONS[lookupKey];
|
|
136
|
+
if (exception) return exception;
|
|
158
137
|
}
|
|
159
138
|
|
|
160
|
-
//
|
|
161
|
-
const
|
|
162
|
-
if (
|
|
139
|
+
// 2. Check recorded capabilities by model
|
|
140
|
+
const modelCapability = RECORD_MODEL_CAPABILITIES[lookupKey];
|
|
141
|
+
if (modelCapability) return modelCapability;
|
|
163
142
|
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
for (const key of Object.keys(RECORD_FAMILY_CAPABILITIES)) {
|
|
168
|
-
if (normalized.startsWith(key) && key.length > bestFamilyLength) {
|
|
169
|
-
bestFamilyKey = key;
|
|
170
|
-
bestFamilyLength = key.length;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (bestFamilyKey) {
|
|
174
|
-
return RECORD_FAMILY_CAPABILITIES[bestFamilyKey];
|
|
175
|
-
}
|
|
143
|
+
// 3. Check recorded capabilities by family
|
|
144
|
+
const familyCapability = findFamilyCapability(lookupKey, RECORD_FAMILY_CAPABILITIES);
|
|
145
|
+
if (familyCapability) return familyCapability;
|
|
176
146
|
|
|
177
|
-
//
|
|
178
|
-
|
|
147
|
+
// 4. Fallback: infer from normalized name
|
|
148
|
+
const inferredName = normalizeModelName(lookupKey);
|
|
179
149
|
const input: ModelModalities = {
|
|
180
|
-
text: modelMatches(
|
|
181
|
-
image: modelMatches(
|
|
182
|
-
video: modelMatches(
|
|
183
|
-
audio: modelMatches(
|
|
150
|
+
text: modelMatches(inferredName, TEXT_INPUT_MODELS) || undefined,
|
|
151
|
+
image: modelMatches(inferredName, IMAGE_INPUT_MODELS) || undefined,
|
|
152
|
+
video: modelMatches(inferredName, VIDEO_INPUT_MODELS) || undefined,
|
|
153
|
+
audio: modelMatches(inferredName, AUDIO_INPUT_MODELS) || undefined,
|
|
184
154
|
embed: false
|
|
185
155
|
};
|
|
186
156
|
const output: ModelModalities = {
|
|
187
|
-
text: modelMatches(
|
|
188
|
-
image: modelMatches(
|
|
189
|
-
video: modelMatches(
|
|
190
|
-
audio: modelMatches(
|
|
191
|
-
embed: modelMatches(
|
|
157
|
+
text: modelMatches(inferredName, TEXT_OUTPUT_MODELS) || undefined,
|
|
158
|
+
image: modelMatches(inferredName, IMAGE_OUTPUT_MODELS) || undefined,
|
|
159
|
+
video: modelMatches(inferredName, VIDEO_OUTPUT_MODELS) || undefined,
|
|
160
|
+
audio: modelMatches(inferredName, AUDIO_OUTPUT_MODELS) || undefined,
|
|
161
|
+
embed: modelMatches(inferredName, EMBEDDING_OUTPUT_MODELS) || undefined
|
|
192
162
|
};
|
|
193
|
-
const tool_support = modelMatches(
|
|
163
|
+
const tool_support = modelMatches(inferredName, TOOL_SUPPORT_MODELS) || undefined;
|
|
194
164
|
return { input, output, tool_support };
|
|
195
165
|
}
|
package/src/capability/openai.ts
CHANGED
|
@@ -1,71 +1,33 @@
|
|
|
1
|
-
import { ModelModalities } from "../types.js";
|
|
1
|
+
import { ModelModalities } from "../types.js";
|
|
2
|
+
|
|
3
|
+
// OpenAI model capability type - tool_support_streaming defaults to tool_support for OpenAI models
|
|
4
|
+
type OpenAIModelCapability = { input: ModelModalities; output: ModelModalities; tool_support?: boolean; tool_support_streaming?: boolean };
|
|
2
5
|
|
|
3
6
|
// Record of OpenAI model capabilities keyed by model ID (lowercased)
|
|
4
|
-
const RECORD_MODEL_CAPABILITIES: Record<string,
|
|
5
|
-
"chatgpt-4o-latest": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support:
|
|
6
|
-
"gpt-3.5-turbo": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
7
|
-
"gpt-3.5-turbo-0125": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
8
|
-
"gpt-3.5-turbo-1106": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
9
|
-
"gpt-3.5-turbo-16k": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
10
|
-
"gpt-3.5-turbo-instruct": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
11
|
-
"gpt-3.5-turbo-instruct-0914": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
12
|
-
"gpt-4": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
13
|
-
"gpt-4-0125-preview": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
14
|
-
"gpt-4-0613": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
15
|
-
"gpt-4-1106-preview": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
16
|
-
"gpt-4-turbo": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
17
|
-
"gpt-4-turbo-2024-04-09": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
18
|
-
"gpt-4-turbo-preview": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
19
|
-
"gpt-4.1": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
20
|
-
"gpt-4.1-2025-04-14": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
21
|
-
"gpt-4.1-mini": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
22
|
-
"gpt-4.1-mini-2025-04-14": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
23
|
-
"gpt-4.1-nano": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
24
|
-
"gpt-4.1-nano-2025-04-14": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
25
|
-
"gpt-4.5-preview": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
26
|
-
"gpt-4.5-preview-2025-02-27": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
27
|
-
"gpt-4o": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
28
|
-
"gpt-4o-2024-05-13": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
29
|
-
"gpt-4o-2024-08-06": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
30
|
-
"gpt-4o-2024-11-20": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
31
|
-
"gpt-4o-mini": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
32
|
-
"gpt-4o-mini-2024-07-18": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
33
|
-
"gpt-4o-mini-search-preview": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
34
|
-
"gpt-4o-mini-search-preview-2025-03-11": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
35
|
-
"gpt-4o-search-preview": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
36
|
-
"gpt-4o-search-preview-2025-03-11": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
37
|
-
"gpt-image-1": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
38
|
-
"o1": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
39
|
-
"o1-2024-12-17": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
40
|
-
"o1-mini": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
41
|
-
"o1-mini-2024-09-12": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
42
|
-
"o1-preview": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
43
|
-
"o1-preview-2024-09-12": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
44
|
-
"o1-pro": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
45
|
-
"o1-pro-2025-03-19": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
46
|
-
"o3": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
47
|
-
"o3-2025-04-16": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
48
|
-
"o3-mini": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
49
|
-
"o3-mini-2025-01-31": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
50
|
-
"o4-mini": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
51
|
-
"o4-mini-2025-04-16": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true }
|
|
7
|
+
const RECORD_MODEL_CAPABILITIES: Record<string, OpenAIModelCapability> = {
|
|
8
|
+
"chatgpt-4o-latest": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true }
|
|
52
9
|
};
|
|
53
10
|
|
|
54
11
|
// Populate RECORD_FAMILY_CAPABILITIES as a const record (lowest common denominator for each family)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"gpt
|
|
58
|
-
"gpt-3.5
|
|
59
|
-
"gpt-4":
|
|
60
|
-
"gpt-4
|
|
61
|
-
"gpt-
|
|
62
|
-
"gpt-
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
12
|
+
// For OpenAI, tool_support_streaming matches tool_support since the API supports tools while streaming
|
|
13
|
+
const RECORD_FAMILY_CAPABILITIES: Record<string, OpenAIModelCapability> = {
|
|
14
|
+
"gpt": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
15
|
+
"gpt-3.5": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
16
|
+
"gpt-4": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
17
|
+
"gpt-4-turbo": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
18
|
+
"gpt-4o": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
19
|
+
"gpt-4.1": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
20
|
+
"gpt-4.5": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
21
|
+
"gpt-image": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
22
|
+
"gpt-oss": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
23
|
+
"o": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
24
|
+
"o1-mini": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
25
|
+
"o1-preview": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
26
|
+
"omni-moderation": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
27
|
+
"sora": { input: { text: true, image: true, video: true, audio: false, embed: false }, output: { text: false, image: false, video: true, audio: true, embed: false }, tool_support: false },
|
|
28
|
+
"text-embedding": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: false, image: false, video: false, audio: false, embed: true }, tool_support: false },
|
|
29
|
+
"text-moderation": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
30
|
+
"whisper": { input: { text: false, image: false, video: false, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false }
|
|
69
31
|
};
|
|
70
32
|
|
|
71
33
|
// Fallback pattern lists for inferring modalities and tool support
|
|
@@ -78,7 +40,7 @@ const VIDEO_OUTPUT_MODELS = ["video"];
|
|
|
78
40
|
const AUDIO_OUTPUT_MODELS = ["audio"];
|
|
79
41
|
const TEXT_OUTPUT_MODELS = ["text"];
|
|
80
42
|
const EMBEDDING_OUTPUT_MODELS = ["embed"];
|
|
81
|
-
const TOOL_SUPPORT_MODELS = ["tool", "
|
|
43
|
+
const TOOL_SUPPORT_MODELS = ["tool", "gpt", "o1", "o3", "o4"];
|
|
82
44
|
|
|
83
45
|
function modelMatches(modelName: string, patterns: string[]): boolean {
|
|
84
46
|
return patterns.some(pattern => modelName.includes(pattern));
|
|
@@ -91,11 +53,18 @@ function normalizeOpenAIModelName(modelName: string): string {
|
|
|
91
53
|
/**
|
|
92
54
|
* Get the full ModelCapabilities for an OpenAI model.
|
|
93
55
|
* Checks RECORD_MODEL_CAPABILITIES first, then falls back to pattern-based inference.
|
|
56
|
+
* For OpenAI models, tool_support_streaming defaults to tool_support since the API supports tools while streaming.
|
|
94
57
|
*/
|
|
95
|
-
export function getModelCapabilitiesOpenAI(model: string): { input: ModelModalities; output: ModelModalities; tool_support?: boolean } {
|
|
58
|
+
export function getModelCapabilitiesOpenAI(model: string): { input: ModelModalities; output: ModelModalities; tool_support?: boolean; tool_support_streaming?: boolean } {
|
|
96
59
|
const normalized = normalizeOpenAIModelName(model);
|
|
97
60
|
const record = RECORD_MODEL_CAPABILITIES[normalized];
|
|
98
|
-
if (record)
|
|
61
|
+
if (record) {
|
|
62
|
+
// Default tool_support_streaming to tool_support for OpenAI models
|
|
63
|
+
return {
|
|
64
|
+
...record,
|
|
65
|
+
tool_support_streaming: record.tool_support_streaming ?? record.tool_support
|
|
66
|
+
};
|
|
67
|
+
}
|
|
99
68
|
let bestFamilyKey = undefined;
|
|
100
69
|
let bestFamilyLength = 0;
|
|
101
70
|
for (const key of Object.keys(RECORD_FAMILY_CAPABILITIES)) {
|
|
@@ -105,7 +74,12 @@ export function getModelCapabilitiesOpenAI(model: string): { input: ModelModalit
|
|
|
105
74
|
}
|
|
106
75
|
}
|
|
107
76
|
if (bestFamilyKey) {
|
|
108
|
-
|
|
77
|
+
const family = RECORD_FAMILY_CAPABILITIES[bestFamilyKey];
|
|
78
|
+
// Default tool_support_streaming to tool_support for OpenAI models
|
|
79
|
+
return {
|
|
80
|
+
...family,
|
|
81
|
+
tool_support_streaming: family.tool_support_streaming ?? family.tool_support
|
|
82
|
+
};
|
|
109
83
|
}
|
|
110
84
|
const input: ModelModalities = {
|
|
111
85
|
text: modelMatches(normalized, TEXT_INPUT_MODELS) || undefined,
|
|
@@ -122,5 +96,6 @@ export function getModelCapabilitiesOpenAI(model: string): { input: ModelModalit
|
|
|
122
96
|
embed: modelMatches(normalized, EMBEDDING_OUTPUT_MODELS) || undefined
|
|
123
97
|
};
|
|
124
98
|
const tool_support = modelMatches(normalized, TOOL_SUPPORT_MODELS) || undefined;
|
|
125
|
-
|
|
99
|
+
// Default tool_support_streaming to tool_support for OpenAI models
|
|
100
|
+
return { input, output, tool_support, tool_support_streaming: tool_support };
|
|
126
101
|
}
|
|
@@ -2,46 +2,25 @@ import { ModelModalities } from "../types.js";
|
|
|
2
2
|
|
|
3
3
|
// Record of Vertex AI model capabilities keyed by model ID (last path segment, lowercased)
|
|
4
4
|
const RECORD_MODEL_CAPABILITIES: Record<string, { input: ModelModalities; output: ModelModalities; tool_support?: boolean }> = {
|
|
5
|
-
"gemini-1.5-flash-002": { input: { text: true, image: true, video: true, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
6
|
-
"gemini-1.5-pro-002": { input: { text: true, image: true, video: true, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
7
|
-
"gemini-2.0-flash-001": { input: { text: true, image: true, video: true, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
8
5
|
"gemini-2.0-flash-lite-001": { input: { text: true, image: true, video: true, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
9
|
-
"gemini-2.5-flash-preview-04-17": { input: { text: true, image: true, video: true, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
10
|
-
"gemini-2.5-pro-preview-05-06": { input: { text: true, image: true, video: true, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
11
|
-
"imagen-3.0-generate-002": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
12
|
-
"imagen-3.0-capability-001": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
13
|
-
"imagen-4.0-generate-preview-05-20": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
14
|
-
"claude-3-opus": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
15
|
-
"claude-3-haiku": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
16
|
-
"claude-3-5-sonnet": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
17
|
-
"claude-3-5-haiku": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
18
|
-
"claude-3-5-sonnet-v2": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
19
|
-
"claude-3-7-sonnet": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
20
|
-
"claude-opus-4": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
21
|
-
"claude-sonnet-4": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
22
6
|
};
|
|
23
7
|
|
|
24
8
|
// Populate RECORD_FAMILY_CAPABILITIES as a const record (lowest common denominator for each family)
|
|
25
9
|
const RECORD_FAMILY_CAPABILITIES: Record<string, { input: ModelModalities; output: ModelModalities; tool_support?: boolean }> = {
|
|
26
|
-
"gemini":
|
|
27
|
-
"gemini-
|
|
28
|
-
"gemini-
|
|
29
|
-
"gemini-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"imagen-
|
|
34
|
-
"imagen-
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"claude-3-5": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
41
|
-
"claude-3-7": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
42
|
-
"claude-3": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
43
|
-
"claude": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
44
|
-
"llama": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
10
|
+
"gemini": { input: { text: true, image: true, video: true, audio: true, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
11
|
+
"gemini-2.5-flash-image": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
12
|
+
"gemini-3.0-pro-image": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
13
|
+
"gemini-3.0-flash-image": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
14
|
+
'imagen': { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
15
|
+
"imagen-3.0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
16
|
+
"imagen-3.0-capability": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
17
|
+
"imagen-4.0": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
18
|
+
"imagen-4.0-capability": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: false, image: true, video: false, audio: false, embed: false }, tool_support: false },
|
|
19
|
+
"claude": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
20
|
+
"llama": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
21
|
+
"llama-2": { input: { text: true, image: false, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: false },
|
|
22
|
+
"llama-3.2": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
23
|
+
"llama-4": { input: { text: true, image: true, video: false, audio: false, embed: false }, output: { text: true, image: false, video: false, audio: false, embed: false }, tool_support: true },
|
|
45
24
|
};
|
|
46
25
|
|
|
47
26
|
// Fallback pattern lists for inferring modalities and tool support
|
|
@@ -54,7 +33,7 @@ const VIDEO_OUTPUT_MODELS = ["video"];
|
|
|
54
33
|
const AUDIO_OUTPUT_MODELS = ["audio"];
|
|
55
34
|
const TEXT_OUTPUT_MODELS = ["text"];
|
|
56
35
|
const EMBEDDING_OUTPUT_MODELS = ["embed"];
|
|
57
|
-
const TOOL_SUPPORT_MODELS = ["tool", "sonnet", "opus", "gemini", "claude
|
|
36
|
+
const TOOL_SUPPORT_MODELS = ["tool", "sonnet", "opus", "gemini", "claude"];
|
|
58
37
|
|
|
59
38
|
function modelMatches(modelName: string, patterns: string[]): boolean {
|
|
60
39
|
return patterns.some(pattern => modelName.includes(pattern));
|
package/src/capability.ts
CHANGED
|
@@ -14,12 +14,12 @@ export function getModelCapabilities(model: string, provider?: string | Provider
|
|
|
14
14
|
}
|
|
15
15
|
const capabilities = _getModelCapabilities(model, provider);
|
|
16
16
|
// Globally disable audio and video for all models, as we don't support them yet
|
|
17
|
-
// We also do not support tool use while streaming
|
|
18
17
|
// TODO: Remove this when we add support.
|
|
19
18
|
capabilities.input.audio = false;
|
|
20
19
|
capabilities.output.audio = false;
|
|
21
20
|
capabilities.output.video = false;
|
|
22
|
-
|
|
21
|
+
// Preserve tool_support_streaming from provider-specific capabilities if set,
|
|
22
|
+
// otherwise default to false for providers that haven't been verified
|
|
23
23
|
return capabilities;
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -28,16 +28,33 @@ function _getModelCapabilities(model: string, provider?: string | Providers): Mo
|
|
|
28
28
|
case Providers.vertexai:
|
|
29
29
|
return getModelCapabilitiesVertexAI(model);
|
|
30
30
|
case Providers.openai:
|
|
31
|
+
case Providers.openai_compatible:
|
|
31
32
|
return getModelCapabilitiesOpenAI(model);
|
|
32
33
|
case Providers.bedrock:
|
|
33
34
|
return getModelCapabilitiesBedrock(model);
|
|
34
35
|
case Providers.azure_foundry:
|
|
35
36
|
// Azure Foundry uses OpenAI capabilities
|
|
36
37
|
return getModelCapabilitiesAzureFoundry(model);
|
|
38
|
+
case Providers.xai:
|
|
39
|
+
// xAI (Grok) models support tool use and are text-based
|
|
40
|
+
return {
|
|
41
|
+
input: { text: true, image: model.includes("vision") },
|
|
42
|
+
output: { text: true },
|
|
43
|
+
tool_support: true,
|
|
44
|
+
tool_support_streaming: false, // Conservative - may work but not tested
|
|
45
|
+
};
|
|
37
46
|
default:
|
|
38
47
|
// Guess the provider based on the model name
|
|
39
48
|
if (model.startsWith("gpt")) {
|
|
40
49
|
return getModelCapabilitiesOpenAI(model);
|
|
50
|
+
} else if (model.startsWith("grok")) {
|
|
51
|
+
// xAI Grok models
|
|
52
|
+
return {
|
|
53
|
+
input: { text: true, image: model.includes("vision") },
|
|
54
|
+
output: { text: true },
|
|
55
|
+
tool_support: true,
|
|
56
|
+
tool_support_streaming: false,
|
|
57
|
+
};
|
|
41
58
|
} else if (model.startsWith("publishers/")) {
|
|
42
59
|
return getModelCapabilitiesVertexAI(model);
|
|
43
60
|
} else if (model.startsWith("arn:aws")) {
|