@llumiverse/common
Version:
Public types, enums and options used by Llumiverse API.
243 lines • 9.46 kB
JavaScript
import { OptionType, SharedOptions } from "../types.js";
import { textOptionsFallback } from "./fallback.js";
export function getOpenAiOptions(model, _option) {
const visionOptions = isVisionModel(model) ? [
{
name: "image_detail", type: OptionType.enum, enum: { "Low": "low", "High": "high", "Auto": "auto" },
default: "auto", description: "Controls how the model processes an input image."
},
] : [];
// Image generation models
if (isImageModel(model)) {
const isGPTImage = model.includes("gpt-image") || model.includes("chatgpt-image");
const isDallE2 = model.includes("dall-e-2");
const isDallE3 = model.includes("dall-e-3");
const sizeOptions = {};
if (isGPTImage) {
sizeOptions["1024x1024"] = "1024x1024";
sizeOptions["1024x1536"] = "1024x1536";
sizeOptions["1536x1024"] = "1536x1024";
sizeOptions["Auto"] = "auto";
}
else if (isDallE2) {
sizeOptions["256x256"] = "256x256";
sizeOptions["512x512"] = "512x512";
sizeOptions["1024x1024"] = "1024x1024";
}
else if (isDallE3) {
sizeOptions["1024x1024"] = "1024x1024";
sizeOptions["1792x1024"] = "1792x1024";
sizeOptions["1024x1792"] = "1024x1792";
}
const baseImageOptions = [
{
name: "size",
type: OptionType.enum,
enum: sizeOptions,
default: "1024x1024",
description: "The size of the generated image"
}
];
const gptImageOptions = isGPTImage ? [
{
name: "image_quality",
type: OptionType.enum,
enum: { "Low": "low", "Medium": "medium", "High": "high", "Auto": "auto" },
default: "auto",
description: "The quality of the generated image"
},
{
name: "background",
type: OptionType.enum,
enum: { "Transparent": "transparent", "Opaque": "opaque", "Auto": "auto" },
default: "auto",
description: "The background setting for the image"
},
{
name: "output_format",
type: OptionType.enum,
enum: { "PNG": "png", "WebP": "webp", "JPEG": "jpeg" },
default: "png",
description: "The output format for the image"
}
] : [];
const dalleOptions = (isDallE2 || isDallE3) ? [
{
name: "image_quality",
type: OptionType.enum,
enum: isDallE3 ? { "Standard": "standard", "HD": "hd" } : { "Standard": "standard" },
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 (DALL-E 3 only)"
},
{
name: "response_format",
type: OptionType.enum,
enum: { "URL": "url", "Base64 JSON": "b64_json" },
default: "b64_json",
description: "The format of the response"
}
] : [];
const nImagesOption = isDallE2 ? [
{
name: "n",
type: OptionType.numeric,
min: 1,
max: 10,
default: 1,
integer: true,
description: "Number of images to generate (DALL-E 2 only)"
}
] : [];
return {
_option_id: isGPTImage ? "openai-gpt-image" : "openai-dalle",
options: [
...baseImageOptions,
...gptImageOptions,
...dalleOptions,
...nImagesOption,
]
};
}
if (isReasoningModel(model)) {
//Is thinking text model
let max_tokens_limit = 4096;
if (model.includes("o1")) {
if (model.includes("preview")) {
max_tokens_limit = 32768;
}
else if (model.includes("mini")) {
max_tokens_limit = 65536;
}
else {
max_tokens_limit = 100000;
}
}
else if (model.includes("o3")) {
max_tokens_limit = 100000;
}
else if (model.includes("o4") || model.includes("gpt-5")) {
max_tokens_limit = 128000;
}
const commonOptions = [
{
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.stop_sequence, type: OptionType.string_list, value: [],
description: "The stop sequence of the generated image",
},
];
const reasoningOptions = isGpt5ProModel(model) ? [
{
name: SharedOptions.effort, type: OptionType.enum, enum: { "High": "high" },
default: "high", description: "GPT-5 Pro only supports high reasoning effort."
},
] : model.includes("o3") || model.includes("o4") || model.includes("gpt-5") || isO1Full(model) ? [
{
name: SharedOptions.effort, type: OptionType.enum, enum: { "Low": "low", "Medium": "medium", "High": "high" },
default: "medium", description: "How much effort the model should put into reasoning, lower values result in faster responses and less tokens used."
},
] : [];
return {
_option_id: "openai-thinking",
options: [
...commonOptions,
...reasoningOptions,
...visionOptions,
],
};
}
else {
let max_tokens_limit = 4096;
if (model.includes("gpt-4o")) {
max_tokens_limit = 16384;
if (model.includes("gpt-4o-2024-05-13") || model.includes("realtime")) {
max_tokens_limit = 4096;
}
}
else if (model.includes("gpt-4")) {
if (model.includes("turbo")) {
max_tokens_limit = 4096;
}
else {
max_tokens_limit = 8192;
}
}
else if (model.includes("gpt-3-5")) {
max_tokens_limit = 4096;
}
else if (model.includes("gpt-5")) {
max_tokens_limit = 128000;
}
//Is non-thinking text model
const commonOptions = [
{
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: "temperature", type: OptionType.numeric, min: 0.0, max: 2.0, default: 0.7,
integer: false, step: 0.1, description: "A higher temperature biases toward less likely tokens, making the model more creative"
},
{
name: "top_p", type: OptionType.numeric, min: 0, max: 1,
integer: false, step: 0.1, description: "Limits token sampling to the cumulative probability of the top p tokens"
},
{
name: "presence_penalty", type: OptionType.numeric, min: -2.0, max: 2.0,
integer: false, step: 0.1, description: "Penalise tokens if they appear at least once in the text"
},
{
name: "frequency_penalty", type: OptionType.numeric, min: -2.0, max: 2.0,
integer: false, step: 0.1, description: "Penalise tokens based on their frequency in the text"
},
{
name: SharedOptions.stop_sequence, type: OptionType.string_list, value: [],
description: "The generation will halt if one of the stop sequences is output",
}
];
return {
_option_id: "openai-text",
options: [
...commonOptions,
...visionOptions,
],
};
}
return textOptionsFallback;
}
function isO1Full(model) {
if (model.includes("o1")) {
if (model.includes("mini") || model.includes("preview")) {
return false;
}
return true;
}
return false;
}
function isReasoningModel(model) {
const normalized = model.toLowerCase();
return normalized.includes("o1")
|| normalized.includes("o3")
|| normalized.includes("o4")
|| normalized.includes("gpt-5");
}
function isGpt5ProModel(model) {
const modelName = model.toLowerCase().split('/').pop() ?? model.toLowerCase();
return /^gpt-5(?:\.\d+)?-pro/.test(modelName);
}
function isVisionModel(model) {
return model.includes("gpt-4o") || isO1Full(model) || model.includes("gpt-4-turbo");
}
function isImageModel(model) {
return model.includes("dall-e") || model.includes("gpt-image") || model.includes("chatgpt-image");
}
//# sourceMappingURL=openai.js.map