UNPKG

@llumiverse/common

Version:

Public types, enums and options used by Llumiverse API.

488 lines (475 loc) 16.3 kB
import { ModelOptionsInfo, ModelOptionInfoItem, ModelOptions, OptionType, SharedOptions } from "../types.js"; // Helper function to parse composite model IDs function parseAzureFoundryModelId(compositeId: string): { deploymentName: string; baseModel: string } { const parts = compositeId.split('::'); if (parts.length === 2) { return { deploymentName: parts[0], baseModel: parts[1] }; } // Backwards compatibility: if no delimiter found, treat as deployment name return { deploymentName: compositeId, baseModel: compositeId }; } // Union type of all Azure Foundry options export type AzureFoundryOptions = AzureFoundryOpenAIOptions | AzureFoundryDeepSeekOptions | AzureFoundryThinkingOptions | AzureFoundryTextOptions | AzureFoundryImageOptions; export interface AzureFoundryOpenAIOptions { _option_id: "azure-foundry-openai"; max_tokens?: number; temperature?: number; top_p?: number; presence_penalty?: number; frequency_penalty?: number; stop_sequence?: string[]; image_detail?: "low" | "high" | "auto"; reasoning_effort?: "low" | "medium" | "high"; } export interface AzureFoundryDeepSeekOptions { _option_id: "azure-foundry-deepseek"; max_tokens?: number; temperature?: number; top_p?: number; stop_sequence?: string[]; } export interface AzureFoundryThinkingOptions { _option_id: "azure-foundry-thinking"; max_tokens?: number; temperature?: number; top_p?: number; stop_sequence?: string[]; reasoning_effort?: "low" | "medium" | "high"; image_detail?: "low" | "high" | "auto"; } export interface AzureFoundryTextOptions { _option_id: "azure-foundry-text"; max_tokens?: number; temperature?: number; top_p?: number; top_k?: number; presence_penalty?: number; frequency_penalty?: number; stop_sequence?: string[]; seed?: number; } export interface AzureFoundryImageOptions { _option_id: "azure-foundry-image"; width?: number; height?: number; quality?: "standard" | "hd"; style?: "vivid" | "natural"; response_format?: "url" | "b64_json"; size?: "256x256" | "512x512" | "1024x1024" | "1792x1024" | "1024x1792"; } export function getMaxTokensLimitAzureFoundry(model: string): number | undefined { // Extract base model from composite ID (deployment::baseModel) const { baseModel } = parseAzureFoundryModelId(model); const modelLower = baseModel.toLowerCase(); // GPT models if (modelLower.includes("gpt-4o")) { if (modelLower.includes("mini")) { return 16384; } return 16384; } if (modelLower.includes("gpt-4")) { if (modelLower.includes("turbo")) { return 4096; } if (modelLower.includes("32k")) { return 32768; } return 8192; } if (modelLower.includes("gpt-35") || modelLower.includes("gpt-3.5")) { return 4096; } if (model.includes("gpt-5")) { return 128000; } // O-series models if (modelLower.includes("o1")) { if (modelLower.includes("preview")) { return 32768; } if (modelLower.includes("mini")) { return 65536; } return 100000; } if (modelLower.includes("o3")) { if (modelLower.includes("mini")) { return 100000; } return 100000; } if (modelLower.includes("o4")) { return 100000; } // DeepSeek models if (modelLower.includes("deepseek")) { if (modelLower.includes("r1")) { return 163840; } if (modelLower.includes("v3")) { return 131072; } } // Claude models if (modelLower.includes("claude")) { if (modelLower.includes("3-5") || modelLower.includes("3-7")) { return 8192; } if (modelLower.includes("3")) { return 4096; } return 4096; } // Llama models if (modelLower.includes("llama")) { if (modelLower.includes("3.1") || modelLower.includes("3.3")) { return 8192; } if (modelLower.includes("4")) { return 1000000; // 1M context } return 8192; } // Mistral models if (modelLower.includes("mistral")) { if (modelLower.includes("large")) { return 4096; } if (modelLower.includes("small")) { return 4096; } return 4096; } // Phi models if (modelLower.includes("phi")) { return 4096; } // AI21 Jamba models if (modelLower.includes("jamba")) { return 4096; } // Cohere models if (modelLower.includes("cohere")) { if (modelLower.includes("command-a")) { return 8000; } return 4096; } // Grok models if (modelLower.includes("grok")) { return 131072; } return undefined; } export function getAzureFoundryOptions(model: string, _option?: ModelOptions): ModelOptionsInfo { // Extract base model from composite ID (deployment::baseModel) const { baseModel } = parseAzureFoundryModelId(model); const modelLower = baseModel.toLowerCase(); const max_tokens_limit = getMaxTokensLimitAzureFoundry(model); // Image generation models if (modelLower.includes("dall-e") || modelLower.includes("gpt-image")) { return { _option_id: "azure-foundry-image", options: [ { name: "size", type: OptionType.enum, enum: { "256x256": "256x256", "512x512": "512x512", "1024x1024": "1024x1024", "1792x1024": "1792x1024", "1024x1792": "1024x1792" }, default: "1024x1024", description: "The size of the generated image" }, { name: "quality", type: OptionType.enum, enum: { "Standard": "standard", "HD": "hd" }, default: "standard", description: "The quality of the generated image" }, { name: "style", type: OptionType.enum, enum: { "Vivid": "vivid", "Natural": "natural" }, default: "vivid", description: "The style of the generated image" }, { name: "response_format", type: OptionType.enum, enum: { "URL": "url", "Base64 JSON": "b64_json" }, default: "url", description: "The format of the response" } ] }; } // Vision model options const visionOptions: ModelOptionInfoItem[] = isVisionModel(modelLower) ? [ { name: "image_detail", type: OptionType.enum, enum: { "Low": "low", "High": "high", "Auto": "auto" }, default: "auto", description: "Controls how the model processes input images" } ] : []; // O-series and thinking models if (modelLower.includes("o1") || modelLower.includes("o3") || modelLower.includes("o4")) { const reasoningOptions: ModelOptionInfoItem[] = (modelLower.includes("o3") || isO1Full(modelLower)) ? [ { name: "reasoning_effort", type: OptionType.enum, enum: { "Low": "low", "Medium": "medium", "High": "high" }, default: "medium", description: "How much effort the model should put into reasoning" } ] : []; return { _option_id: "azure-foundry-thinking", options: [ { name: SharedOptions.max_tokens, type: OptionType.numeric, min: 1, max: max_tokens_limit, integer: true, description: "The maximum number of tokens to generate" }, { name: SharedOptions.temperature, type: OptionType.numeric, min: 0.0, max: 2.0, default: 1.0, step: 0.1, description: "Controls randomness in the output" }, { name: SharedOptions.top_p, type: OptionType.numeric, min: 0, max: 1, step: 0.1, description: "Nucleus sampling parameter" }, { name: SharedOptions.stop_sequence, type: OptionType.string_list, value: [], description: "Sequences where the model will stop generating" }, ...reasoningOptions, ...visionOptions ] }; } // DeepSeek R1 models if (modelLower.includes("deepseek") && modelLower.includes("r1")) { return { _option_id: "azure-foundry-deepseek", options: [ { name: SharedOptions.max_tokens, type: OptionType.numeric, min: 1, max: max_tokens_limit, integer: true, description: "The maximum number of tokens to generate" }, { name: SharedOptions.temperature, type: OptionType.numeric, min: 0.0, max: 2.0, default: 0.7, step: 0.1, description: "Lower temperatures recommended for DeepSeek R1 (0.3-0.7)" }, { name: SharedOptions.top_p, type: OptionType.numeric, min: 0, max: 1, step: 0.1, description: "Nucleus sampling parameter" }, { name: SharedOptions.stop_sequence, type: OptionType.string_list, value: [], description: "Sequences where the model will stop generating" } ] }; } // OpenAI models (GPT-4, GPT-4o, GPT-3.5) if (modelLower.includes("gpt-")) { return { _option_id: "azure-foundry-openai", options: [ { name: SharedOptions.max_tokens, type: OptionType.numeric, min: 1, max: max_tokens_limit, integer: true, step: 200, description: "The maximum number of tokens to generate" }, { name: SharedOptions.temperature, type: OptionType.numeric, min: 0.0, max: 2.0, default: 0.7, step: 0.1, description: "Controls randomness in the output" }, { name: SharedOptions.top_p, type: OptionType.numeric, min: 0, max: 1, step: 0.1, description: "Nucleus sampling parameter" }, { name: SharedOptions.presence_penalty, type: OptionType.numeric, min: -2.0, max: 2.0, step: 0.1, description: "Penalize new tokens based on their presence in the text" }, { name: SharedOptions.frequency_penalty, type: OptionType.numeric, min: -2.0, max: 2.0, step: 0.1, description: "Penalize new tokens based on their frequency in the text" }, { name: SharedOptions.stop_sequence, type: OptionType.string_list, value: [], description: "Sequences where the model will stop generating" }, ...visionOptions ] }; } // General text models (Claude, Llama, Mistral, Phi, etc.) const baseOptions: ModelOptionInfoItem[] = [ { name: SharedOptions.max_tokens, type: OptionType.numeric, min: 1, max: max_tokens_limit, integer: true, step: 200, description: "The maximum number of tokens to generate" }, { name: SharedOptions.temperature, type: OptionType.numeric, min: 0.0, max: 2.0, default: 0.7, step: 0.1, description: "Controls randomness in the output" }, { name: SharedOptions.top_p, type: OptionType.numeric, min: 0, max: 1, step: 0.1, description: "Nucleus sampling parameter" }, { name: SharedOptions.stop_sequence, type: OptionType.string_list, value: [], description: "Sequences where the model will stop generating" } ]; // Add model-specific options const additionalOptions: ModelOptionInfoItem[] = []; // Add top_k for certain models if (modelLower.includes("claude") || modelLower.includes("mistral") || modelLower.includes("phi")) { additionalOptions.push({ name: SharedOptions.top_k, type: OptionType.numeric, min: 1, integer: true, step: 1, description: "Limits token sampling to the top k tokens" }); } // Add penalty options for certain models if (modelLower.includes("claude") || modelLower.includes("jamba") || modelLower.includes("cohere")) { additionalOptions.push( { name: SharedOptions.presence_penalty, type: OptionType.numeric, min: -2.0, max: 2.0, step: 0.1, description: "Penalize new tokens based on their presence in the text" }, { name: SharedOptions.frequency_penalty, type: OptionType.numeric, min: -2.0, max: 2.0, step: 0.1, description: "Penalize new tokens based on their frequency in the text" } ); } // Add seed option for certain models if (modelLower.includes("mistral") || modelLower.includes("phi") || modelLower.includes("gemini")) { additionalOptions.push({ name: SharedOptions.seed, type: OptionType.numeric, integer: true, description: "Random seed for reproducible generation" }); } return { _option_id: "azure-foundry-text", options: [ ...baseOptions, ...additionalOptions, ...visionOptions ] }; } function isVisionModel(modelLower: string): boolean { return modelLower.includes("gpt-4o") || modelLower.includes("gpt-4-turbo") || modelLower.includes("claude-3") || modelLower.includes("llama-3.2") || modelLower.includes("llama-4") || modelLower.includes("gemini") || isO1Full(modelLower); } function isO1Full(modelLower: string): boolean { if (modelLower.includes("o1")) { return !modelLower.includes("mini") && !modelLower.includes("preview"); } return false; }