mirror of
https://github.com/decolua/9router.git
synced 2026-05-08 12:01:28 +00:00
- Added new image models for GPT 5.2, 5.3, and 5.4, including capabilities for text-to-image and editing. - Updated embedding handling to include optional dimensions in requests. - Introduced support for custom embedding providers, allowing dynamic fetching and validation of custom nodes. - Improved image generation handling with Codex integration, including progress tracking and error handling. - Enhanced UI components to support adding custom embeddings and displaying their status.
76 lines
2.6 KiB
JavaScript
76 lines
2.6 KiB
JavaScript
// Re-export from open-sse with localDb integration
|
|
import { getModelAliases, getComboByName, getProviderNodes } from "@/lib/localDb";
|
|
import { parseModel, resolveModelAliasFromMap, getModelInfoCore } from "open-sse/services/model.js";
|
|
|
|
export { parseModel };
|
|
|
|
/**
|
|
* Resolve model alias from localDb
|
|
*/
|
|
export async function resolveModelAlias(alias) {
|
|
const aliases = await getModelAliases();
|
|
return resolveModelAliasFromMap(alias, aliases);
|
|
}
|
|
|
|
/**
|
|
* Get full model info (parse or resolve)
|
|
*/
|
|
export async function getModelInfo(modelStr) {
|
|
const parsed = parseModel(modelStr);
|
|
|
|
if (!parsed.isAlias) {
|
|
if (parsed.provider === parsed.providerAlias) {
|
|
// Check OpenAI Compatible nodes
|
|
const openaiNodes = await getProviderNodes({ type: "openai-compatible" });
|
|
const matchedOpenAI = openaiNodes.find((node) => node.prefix === parsed.providerAlias);
|
|
if (matchedOpenAI) {
|
|
return { provider: matchedOpenAI.id, model: parsed.model };
|
|
}
|
|
|
|
// Check Anthropic Compatible nodes
|
|
const anthropicNodes = await getProviderNodes({ type: "anthropic-compatible" });
|
|
const matchedAnthropic = anthropicNodes.find((node) => node.prefix === parsed.providerAlias);
|
|
if (matchedAnthropic) {
|
|
return { provider: matchedAnthropic.id, model: parsed.model };
|
|
}
|
|
|
|
// Check Custom Embedding nodes
|
|
const embeddingNodes = await getProviderNodes({ type: "custom-embedding" });
|
|
const matchedEmbedding = embeddingNodes.find((node) => node.prefix === parsed.providerAlias);
|
|
if (matchedEmbedding) {
|
|
return { provider: matchedEmbedding.id, model: parsed.model };
|
|
}
|
|
}
|
|
return {
|
|
provider: parsed.provider,
|
|
model: parsed.model
|
|
};
|
|
}
|
|
|
|
// Check if this is a combo name before resolving as alias
|
|
// This prevents combo names from being incorrectly routed to providers
|
|
const combo = await getComboByName(parsed.model);
|
|
if (combo) {
|
|
// Return null provider to signal this should be handled as combo
|
|
// The caller (handleChat) will detect this and handle it as combo
|
|
return { provider: null, model: parsed.model };
|
|
}
|
|
|
|
return getModelInfoCore(modelStr, getModelAliases);
|
|
}
|
|
|
|
/**
|
|
* Check if model is a combo and get models list
|
|
* @returns {Promise<string[]|null>} Array of models or null if not a combo
|
|
*/
|
|
export async function getComboModels(modelStr) {
|
|
// Only check if it's not in provider/model format
|
|
if (modelStr.includes("/")) return null;
|
|
|
|
const combo = await getComboByName(modelStr);
|
|
if (combo && combo.models && combo.models.length > 0) {
|
|
return combo.models;
|
|
}
|
|
return null;
|
|
}
|