@llumiverse/common
Version:
Public types, enums and options used by Llumiverse API.
155 lines • 12.4 kB
JavaScript
// Explicit exception lists keyed by the model identifier (last segment after the prefix)
const RECORD_FOUNDATION_EXCEPTIONS = {};
const RECORD_PROFILE_EXCEPTIONS = {
"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 },
"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 },
};
// Record of Bedrock model capabilities keyed by model identifier.
// Only include models that differ from their family defaults
const RECORD_MODEL_CAPABILITIES = {
// Models with specific exceptions that differ from family
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
};
// Family capabilities (longest prefix match)
const RECORD_FAMILY_CAPABILITIES = {
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
"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 },
};
function extractModelLookupKey(modelName) {
const lower = modelName.toLowerCase();
const lastSlashIdx = lower.lastIndexOf("/");
let key = lastSlashIdx === -1 ? lower : lower.slice(lastSlashIdx + 1);
if (lower.includes("inference-profile/")) {
key = key.replace(/^[^.]+\./, "");
}
return key;
}
function findFamilyCapability(lookupKey, families) {
let bestKey;
for (const key of Object.keys(families)) {
if (lookupKey.startsWith(key) && (!bestKey || key.length > bestKey.length)) {
bestKey = key;
}
}
return bestKey ? families[bestKey] : undefined;
}
/**
* Extract the model identifier from an ARN or inference profile
* @param modelName The full model ARN or name
* @returns The normalized model identifier
*/
function normalizeModelName(modelName) {
const modelLower = modelName.toLowerCase();
if (modelLower.includes("inference-profile")) {
const parts = modelLower.split("/");
if (parts.length > 1) {
const providerModel = parts[parts.length - 1];
const modelParts = providerModel.split(".");
if (modelParts.length > 1 && modelParts[1] === "deepseek") {
return `deepseek-${modelParts.slice(2).join(".")}`;
}
return modelParts.length > 2 ? modelParts.slice(2).join(".") : providerModel;
}
}
return modelLower;
}
// Fallback pattern lists for inferring modalities and tool support
const IMAGE_INPUT_MODELS = ["image"]; // fallback: if model id contains 'image', supports image input
const VIDEO_INPUT_MODELS = ["video"];
const AUDIO_INPUT_MODELS = ["audio"];
const TEXT_INPUT_MODELS = ["text"];
const IMAGE_OUTPUT_MODELS = ["image"];
const VIDEO_OUTPUT_MODELS = ["video"];
const AUDIO_OUTPUT_MODELS = ["audio"];
const TEXT_OUTPUT_MODELS = ["text"];
const EMBEDDING_OUTPUT_MODELS = ["embed"];
const TOOL_SUPPORT_MODELS = ["tool", "sonnet", "opus", "nova", "palmyra", "command-r", "mistral-large", "pixtral"];
function modelMatches(modelName, patterns) {
return patterns.some(pattern => modelName.includes(pattern));
}
/**
* Get the full ModelCapabilities for a Bedrock model.
* Checks RECORD_MODEL_CAPABILITIES first, then falls back to pattern-based inference.
*/
export function getModelCapabilitiesBedrock(model) {
// Normalize ARN or inference-profile to model ID
const modelLower = model.toLowerCase();
let normalized = modelLower;
const arnPattern = /^arn:aws:bedrock:[^:]+:[^:]*:(inference-profile|foundation-model)\/.+/i;
if (arnPattern.test(modelLower)) {
// Extract after last occurrence of 'foundation-model/' or 'inference-profile/'
const foundationIdx = modelLower.lastIndexOf('foundation-model/');
const inferenceIdx = modelLower.lastIndexOf('inference-profile/');
if (foundationIdx !== -1) {
normalized = modelLower.substring(foundationIdx);
}
else if (inferenceIdx !== -1) {
normalized = modelLower.substring(inferenceIdx);
}
}
const isInferenceProfile = normalized.startsWith("inference-profile/");
const isFoundationModel = normalized.startsWith("foundation-model/");
const lookupKey = extractModelLookupKey(normalized);
// 1. Check exceptions
if (isFoundationModel) {
const exception = RECORD_FOUNDATION_EXCEPTIONS[lookupKey];
if (exception)
return exception;
}
else if (isInferenceProfile) {
const exception = RECORD_PROFILE_EXCEPTIONS[lookupKey];
if (exception)
return exception;
}
// 2. Check recorded capabilities by model
const modelCapability = RECORD_MODEL_CAPABILITIES[lookupKey];
if (modelCapability)
return modelCapability;
// 3. Check recorded capabilities by family
const familyCapability = findFamilyCapability(lookupKey, RECORD_FAMILY_CAPABILITIES);
if (familyCapability)
return familyCapability;
// 4. Fallback: infer from normalized name
const inferredName = normalizeModelName(lookupKey);
const input = {
text: modelMatches(inferredName, TEXT_INPUT_MODELS) || undefined,
image: modelMatches(inferredName, IMAGE_INPUT_MODELS) || undefined,
video: modelMatches(inferredName, VIDEO_INPUT_MODELS) || undefined,
audio: modelMatches(inferredName, AUDIO_INPUT_MODELS) || undefined,
embed: false
};
const output = {
text: modelMatches(inferredName, TEXT_OUTPUT_MODELS) || undefined,
image: modelMatches(inferredName, IMAGE_OUTPUT_MODELS) || undefined,
video: modelMatches(inferredName, VIDEO_OUTPUT_MODELS) || undefined,
audio: modelMatches(inferredName, AUDIO_OUTPUT_MODELS) || undefined,
embed: modelMatches(inferredName, EMBEDDING_OUTPUT_MODELS) || undefined
};
const tool_support = modelMatches(inferredName, TOOL_SUPPORT_MODELS) || undefined;
return { input, output, tool_support };
}
//# sourceMappingURL=bedrock.js.map