import { isNumber } from "./is-number"; import { VERIFIED_ANTHROPIC_MODELS, VERIFIED_OPENAI_MODELS, } from "./verified-models"; /** * Checks if the split array is actually a version number. * @param split The split array of the model string * @returns Boolean indicating if the split is actually a version number * * @example * const split = ["gpt-3", "5-turbo"] // incorrectly split from "gpt-3.5-turbo" * splitIsActuallyVersion(split) // returns true */ const splitIsActuallyVersion = (split: string[]) => split[1] && split[1][0] && isNumber(split[1][0]); /** * Given a model string, extract the provider and model name. Currently the supported separators are "/" and "." * @param model The model string * @returns An object containing the provider, model name, and separator * * @example * extractModelAndProvider("azure/ada") * // returns { provider: "azure", model: "ada", separator: "/" } * * extractModelAndProvider("cohere.command-r-v1:0") * // returns { provider: "cohere", model: "command-r-v1:0", separator: "." } */ export const extractModelAndProvider = (model: string) => { let separator = "/"; let split = model.split(separator); if (split.length === 1) { // no "/" separator found, try with "." separator = "."; split = model.split(separator); if (splitIsActuallyVersion(split)) { split = [split.join(separator)]; // undo the split } } if (split.length === 1) { // no "/" or "." separator found if (VERIFIED_OPENAI_MODELS.includes(split[0])) { return { provider: "openai", model: split[0], separator: "/" }; } if (VERIFIED_ANTHROPIC_MODELS.includes(split[0])) { return { provider: "anthropic", model: split[0], separator: "/" }; } // return as model only return { provider: "", model, separator: "" }; } const [provider, ...modelId] = split; return { provider, model: modelId.join(separator), separator }; };