UNPKG

@llumiverse/common

Version:

Public types, enums and options used by Llumiverse API.

98 lines 7.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getModelCapabilitiesOpenAI = getModelCapabilitiesOpenAI; // Record of OpenAI model capabilities keyed by model ID (lowercased) const RECORD_MODEL_CAPABILITIES = { "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 } }; // Populate RECORD_FAMILY_CAPABILITIES as a const record (lowest common denominator for each family) // For OpenAI, tool_support_streaming matches tool_support since the API supports tools while streaming const RECORD_FAMILY_CAPABILITIES = { "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 }, "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 }, "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 }, "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 }, "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 }, "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 }, "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 }, "gpt-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 }, "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 }, "chatgpt-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 }, "dall-e": { 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 }, "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 }, "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 }, "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 }, "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 }, "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 }, "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 }, "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 }, "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 }, "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 } }; // Fallback pattern lists for inferring modalities and tool support const IMAGE_INPUT_MODELS = ["image"]; 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", "gpt", "gpt-5", "o1", "o3", "o4"]; function modelMatches(modelName, patterns) { return patterns.some(pattern => modelName.includes(pattern)); } function normalizeOpenAIModelName(modelName) { return modelName.toLowerCase(); } /** * Get the full ModelCapabilities for an OpenAI model. * Checks RECORD_MODEL_CAPABILITIES first, then falls back to pattern-based inference. * For OpenAI models, tool_support_streaming defaults to tool_support since the API supports tools while streaming. */ function getModelCapabilitiesOpenAI(model) { const normalized = normalizeOpenAIModelName(model); const record = RECORD_MODEL_CAPABILITIES[normalized]; if (record) { // Default tool_support_streaming to tool_support for OpenAI models return { ...record, tool_support_streaming: record.tool_support_streaming ?? record.tool_support }; } let bestFamilyKey = undefined; let bestFamilyLength = 0; for (const key of Object.keys(RECORD_FAMILY_CAPABILITIES)) { if (normalized.startsWith(key) && key.length > bestFamilyLength) { bestFamilyKey = key; bestFamilyLength = key.length; } } if (bestFamilyKey) { const family = RECORD_FAMILY_CAPABILITIES[bestFamilyKey]; // Default tool_support_streaming to tool_support for OpenAI models return { ...family, tool_support_streaming: family.tool_support_streaming ?? family.tool_support }; } const input = { text: modelMatches(normalized, TEXT_INPUT_MODELS) || undefined, image: modelMatches(normalized, IMAGE_INPUT_MODELS) || undefined, video: modelMatches(normalized, VIDEO_INPUT_MODELS) || undefined, audio: modelMatches(normalized, AUDIO_INPUT_MODELS) || undefined, embed: false }; const output = { text: modelMatches(normalized, TEXT_OUTPUT_MODELS) || undefined, image: modelMatches(normalized, IMAGE_OUTPUT_MODELS) || undefined, video: modelMatches(normalized, VIDEO_OUTPUT_MODELS) || undefined, audio: modelMatches(normalized, AUDIO_OUTPUT_MODELS) || undefined, embed: modelMatches(normalized, EMBEDDING_OUTPUT_MODELS) || undefined }; const tool_support = modelMatches(normalized, TOOL_SUPPORT_MODELS) || undefined; // Default tool_support_streaming to tool_support for OpenAI models return { input, output, tool_support, tool_support_streaming: tool_support }; } //# sourceMappingURL=openai.js.map