94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
import { models } from 'token.js'
|
|
import { ModelCapabilities } from '@/types/models'
|
|
|
|
export const defaultModel = (provider?: string) => {
|
|
if (!provider || !Object.keys(models).includes(provider)) {
|
|
return models.openai.models[0]
|
|
}
|
|
return (
|
|
models[provider as unknown as keyof typeof models]
|
|
.models as unknown as string[]
|
|
)[0]
|
|
}
|
|
|
|
/**
|
|
* Determines model capabilities based on provider configuration from token.js
|
|
* @param providerName - The provider name (e.g., 'openai', 'anthropic', 'openrouter')
|
|
* @param modelId - The model ID to check capabilities for
|
|
* @returns Array of model capabilities
|
|
*/
|
|
export const getModelCapabilities = (
|
|
providerName: string,
|
|
modelId: string
|
|
): string[] => {
|
|
const providerConfig =
|
|
models[providerName as unknown as keyof typeof models]
|
|
|
|
const supportsToolCalls = Array.isArray(
|
|
providerConfig?.supportsToolCalls as unknown
|
|
)
|
|
? (providerConfig.supportsToolCalls as unknown as string[])
|
|
: []
|
|
|
|
const supportsImages = Array.isArray(
|
|
providerConfig?.supportsImages as unknown
|
|
)
|
|
? (providerConfig.supportsImages as unknown as string[])
|
|
: []
|
|
|
|
return [
|
|
ModelCapabilities.COMPLETION,
|
|
supportsToolCalls.includes(modelId) ? ModelCapabilities.TOOLS : undefined,
|
|
supportsImages.includes(modelId) ? ModelCapabilities.VISION : undefined,
|
|
].filter(Boolean) as string[]
|
|
}
|
|
|
|
/**
|
|
* This utility is to extract cortexso model description from README.md file
|
|
* @returns
|
|
*/
|
|
export const extractDescription = (text?: string) => {
|
|
if (!text) return text
|
|
const normalizedText = removeYamlFrontMatter(text)
|
|
const overviewPattern = /(?:##\s*Overview\s*\n)([\s\S]*?)(?=\n\s*##|$)/
|
|
const matches = normalizedText?.match(overviewPattern)
|
|
let extractedText =
|
|
matches && matches[1]
|
|
? matches[1].trim()
|
|
: normalizedText?.slice(0, 500).trim()
|
|
|
|
// Remove image markdown syntax 
|
|
extractedText = extractedText?.replace(/!\[.*?\]\(.*?\)/g, '')
|
|
|
|
// Remove <img> HTML tags
|
|
extractedText = extractedText?.replace(/<img[^>]*>/g, '')
|
|
|
|
return extractedText
|
|
}
|
|
/**
|
|
* Remove YAML (HF metadata) front matter from content
|
|
* @param content
|
|
* @returns
|
|
*/
|
|
export const removeYamlFrontMatter = (content: string): string => {
|
|
return content.replace(/^---\n([\s\S]*?)\n---\n/, '')
|
|
}
|
|
|
|
/**
|
|
* Extract model name from repo path, e.g. cortexso/tinyllama -> tinyllama
|
|
* @param modelId
|
|
* @returns
|
|
*/
|
|
export const extractModelName = (model?: string) => {
|
|
return model?.split('/')[1] ?? model
|
|
}
|
|
|
|
/**
|
|
* Extract model name from repo path, e.g. https://huggingface.co/cortexso/tinyllama -> cortexso/tinyllama
|
|
* @param modelId
|
|
* @returns
|
|
*/
|
|
export const extractModelRepo = (model?: string) => {
|
|
return model?.replace('https://huggingface.co/', '')
|
|
}
|