openai_provider.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import logging
  2. from typing import Optional, Union
  3. import openai
  4. from openai.error import AuthenticationError, OpenAIError
  5. from core import hosted_llm_credentials
  6. from core.llm.error import ProviderTokenNotInitError
  7. from core.llm.moderation import Moderation
  8. from core.llm.provider.base import BaseProvider
  9. from core.llm.provider.errors import ValidateFailedError
  10. from models.provider import ProviderName
  11. class OpenAIProvider(BaseProvider):
  12. def get_models(self, model_id: Optional[str] = None) -> list[dict]:
  13. credentials = self.get_credentials(model_id)
  14. response = openai.Model.list(**credentials)
  15. return [{
  16. 'id': model['id'],
  17. 'name': model['id'],
  18. } for model in response['data']]
  19. def get_credentials(self, model_id: Optional[str] = None) -> dict:
  20. """
  21. Returns the credentials for the given tenant_id and provider_name.
  22. """
  23. return {
  24. 'openai_api_key': self.get_provider_api_key(model_id=model_id)
  25. }
  26. def get_provider_name(self):
  27. return ProviderName.OPENAI
  28. def config_validate(self, config: Union[dict | str]):
  29. """
  30. Validates the given config.
  31. """
  32. try:
  33. Moderation(self.get_provider_name().value, config).moderate('test')
  34. except (AuthenticationError, OpenAIError) as ex:
  35. raise ValidateFailedError(str(ex))
  36. except Exception as ex:
  37. logging.exception('OpenAI config validation failed')
  38. raise ex
  39. def get_hosted_credentials(self) -> Union[str | dict]:
  40. if not hosted_llm_credentials.openai or not hosted_llm_credentials.openai.api_key:
  41. raise ProviderTokenNotInitError(
  42. f"No valid {self.get_provider_name().value} model provider credentials found. "
  43. f"Please go to Settings -> Model Provider to complete your provider credentials."
  44. )
  45. return hosted_llm_credentials.openai.api_key