extractModelAndProvider.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { isNumber } from "./isNumber";
  2. import {
  3. VERIFIED_ANTHROPIC_MODELS,
  4. VERIFIED_OPENAI_MODELS,
  5. } from "./verified-models";
  6. /**
  7. * Checks if the split array is actually a version number.
  8. * @param split The split array of the model string
  9. * @returns Boolean indicating if the split is actually a version number
  10. *
  11. * @example
  12. * const split = ["gpt-3", "5-turbo"] // incorrectly split from "gpt-3.5-turbo"
  13. * splitIsActuallyVersion(split) // returns true
  14. */
  15. const splitIsActuallyVersion = (split: string[]) =>
  16. split[1] && split[1][0] && isNumber(split[1][0]);
  17. /**
  18. * Given a model string, extract the provider and model name. Currently the supported separators are "/" and "."
  19. * @param model The model string
  20. * @returns An object containing the provider, model name, and separator
  21. *
  22. * @example
  23. * extractModelAndProvider("azure/ada")
  24. * // returns { provider: "azure", model: "ada", separator: "/" }
  25. *
  26. * extractModelAndProvider("cohere.command-r-v1:0")
  27. * // returns { provider: "cohere", model: "command-r-v1:0", separator: "." }
  28. */
  29. export const extractModelAndProvider = (model: string) => {
  30. let separator = "/";
  31. let split = model.split(separator);
  32. if (split.length === 1) {
  33. // no "/" separator found, try with "."
  34. separator = ".";
  35. split = model.split(separator);
  36. if (splitIsActuallyVersion(split)) {
  37. split = [split.join(separator)]; // undo the split
  38. }
  39. }
  40. if (split.length === 1) {
  41. // no "/" or "." separator found
  42. if (VERIFIED_OPENAI_MODELS.includes(split[0])) {
  43. return { provider: "openai", model: split[0], separator: "/" };
  44. }
  45. if (VERIFIED_ANTHROPIC_MODELS.includes(split[0])) {
  46. return { provider: "anthropic", model: split[0], separator: "/" };
  47. }
  48. // return as model only
  49. return { provider: "", model, separator: "" };
  50. }
  51. const [provider, ...modelId] = split;
  52. return { provider, model: modelId.join(separator), separator };
  53. };