models.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import type { Argv } from "yargs"
  2. import { Instance } from "../../project/instance"
  3. import { Provider } from "../../provider/provider"
  4. import { ModelsDev } from "../../provider/models"
  5. import { cmd } from "./cmd"
  6. import { UI } from "../ui"
  7. import { EOL } from "os"
  8. export const ModelsCommand = cmd({
  9. command: "models [provider]",
  10. describe: "list all available models",
  11. builder: (yargs: Argv) => {
  12. return yargs
  13. .positional("provider", {
  14. describe: "provider ID to filter models by",
  15. type: "string",
  16. array: false,
  17. })
  18. .option("verbose", {
  19. describe: "use more verbose model output (includes metadata like costs)",
  20. type: "boolean",
  21. })
  22. .option("refresh", {
  23. describe: "refresh the models cache from models.dev",
  24. type: "boolean",
  25. })
  26. },
  27. handler: async (args) => {
  28. if (args.refresh) {
  29. await ModelsDev.refresh()
  30. UI.println(UI.Style.TEXT_SUCCESS_BOLD + "Models cache refreshed" + UI.Style.TEXT_NORMAL)
  31. }
  32. await Instance.provide({
  33. directory: process.cwd(),
  34. async fn() {
  35. const providers = await Provider.list()
  36. function printModels(providerID: string, verbose?: boolean) {
  37. const provider = providers[providerID]
  38. const sortedModels = Object.entries(provider.models).sort(([a], [b]) => a.localeCompare(b))
  39. for (const [modelID, model] of sortedModels) {
  40. process.stdout.write(`${providerID}/${modelID}`)
  41. process.stdout.write(EOL)
  42. if (verbose) {
  43. process.stdout.write(JSON.stringify(model, null, 2))
  44. process.stdout.write(EOL)
  45. }
  46. }
  47. }
  48. if (args.provider) {
  49. const provider = providers[args.provider]
  50. if (!provider) {
  51. UI.error(`Provider not found: ${args.provider}`)
  52. return
  53. }
  54. printModels(args.provider, args.verbose)
  55. return
  56. }
  57. const providerIDs = Object.keys(providers).sort((a, b) => {
  58. const aIsOpencode = a.startsWith("opencode")
  59. const bIsOpencode = b.startsWith("opencode")
  60. if (aIsOpencode && !bIsOpencode) return -1
  61. if (!aIsOpencode && bIsOpencode) return 1
  62. return a.localeCompare(b)
  63. })
  64. for (const providerID of providerIDs) {
  65. printModels(providerID, args.verbose)
  66. }
  67. },
  68. })
  69. },
  70. })