ProfileValidator.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import type { ProviderSettings, OrganizationAllowList } from "@roo-code/types"
  2. export class ProfileValidator {
  3. public static isProfileAllowed(profile: ProviderSettings, allowList: OrganizationAllowList): boolean {
  4. if (allowList.allowAll) {
  5. return true
  6. }
  7. if (!profile.apiProvider) {
  8. return false
  9. }
  10. if (!this.isProviderAllowed(profile.apiProvider, allowList)) {
  11. return false
  12. }
  13. if (profile.apiProvider === "human-relay") {
  14. return true
  15. }
  16. const modelId = this.getModelIdFromProfile(profile)
  17. if (!modelId) {
  18. return allowList.providers[profile.apiProvider]?.allowAll === true
  19. }
  20. return this.isModelAllowed(profile.apiProvider, modelId, allowList)
  21. }
  22. private static isProviderAllowed(providerName: string, allowList: OrganizationAllowList): boolean {
  23. if (allowList.allowAll) {
  24. return true
  25. }
  26. return providerName in allowList.providers
  27. }
  28. private static isModelAllowed(providerName: string, modelId: string, allowList: OrganizationAllowList): boolean {
  29. if (allowList.allowAll) {
  30. return true
  31. }
  32. const providerAllowList = allowList.providers[providerName]
  33. if (!providerAllowList) {
  34. return false
  35. }
  36. if (providerAllowList.allowAll) {
  37. return true
  38. }
  39. return providerAllowList.models?.includes(modelId) ?? false
  40. }
  41. private static getModelIdFromProfile(profile: ProviderSettings): string | undefined {
  42. switch (profile.apiProvider) {
  43. case "openai":
  44. return profile.openAiModelId
  45. case "anthropic":
  46. case "openai-native":
  47. case "bedrock":
  48. case "vertex":
  49. case "gemini":
  50. case "mistral":
  51. case "deepseek":
  52. case "xai":
  53. case "groq":
  54. case "sambanova":
  55. case "chutes":
  56. case "fireworks":
  57. case "featherless":
  58. return profile.apiModelId
  59. case "litellm":
  60. return profile.litellmModelId
  61. case "unbound":
  62. return profile.unboundModelId
  63. case "lmstudio":
  64. return profile.lmStudioModelId
  65. case "vscode-lm":
  66. // We probably need something more flexible for this one, if we need to really support it here.
  67. return profile.vsCodeLmModelSelector?.id
  68. case "openrouter":
  69. return profile.openRouterModelId
  70. case "glama":
  71. return profile.glamaModelId
  72. case "ollama":
  73. return profile.ollamaModelId
  74. case "requesty":
  75. return profile.requestyModelId
  76. case "io-intelligence":
  77. return profile.ioIntelligenceModelId
  78. case "deepinfra":
  79. return profile.deepInfraModelId
  80. case "human-relay":
  81. case "fake-ai":
  82. default:
  83. return undefined
  84. }
  85. }
  86. }