service.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from __future__ import annotations
  2. from typing import Union
  3. from .. import debug, version
  4. from ..errors import ProviderNotFoundError, ModelNotFoundError, ProviderNotWorkingError, StreamNotSupportedError
  5. from ..models import Model, ModelUtils, default, default_vision
  6. from ..Provider import ProviderUtils
  7. from ..providers.types import BaseRetryProvider, ProviderType
  8. from ..providers.retry_provider import IterListProvider
  9. def convert_to_provider(provider: str) -> ProviderType:
  10. if " " in provider:
  11. provider_list = [ProviderUtils.convert[p] for p in provider.split() if p in ProviderUtils.convert]
  12. if not provider_list:
  13. raise ProviderNotFoundError(f'Providers not found: {provider}')
  14. provider = IterListProvider(provider_list, False)
  15. elif provider in ProviderUtils.convert:
  16. provider = ProviderUtils.convert[provider]
  17. elif provider:
  18. raise ProviderNotFoundError(f'Provider not found: {provider}')
  19. return provider
  20. def get_model_and_provider(model : Union[Model, str],
  21. provider : Union[ProviderType, str, None],
  22. stream : bool,
  23. ignore_working: bool = False,
  24. ignore_stream: bool = False,
  25. logging: bool = True,
  26. has_images: bool = False) -> tuple[str, ProviderType]:
  27. """
  28. Retrieves the model and provider based on input parameters.
  29. Args:
  30. model (Union[Model, str]): The model to use, either as an object or a string identifier.
  31. provider (Union[ProviderType, str, None]): The provider to use, either as an object, a string identifier, or None.
  32. stream (bool): Indicates if the operation should be performed as a stream.
  33. ignored (list[str], optional): List of provider names to be ignored.
  34. ignore_working (bool, optional): If True, ignores the working status of the provider.
  35. ignore_stream (bool, optional): If True, ignores the streaming capability of the provider.
  36. Returns:
  37. tuple[str, ProviderType]: A tuple containing the model name and the provider type.
  38. Raises:
  39. ProviderNotFoundError: If the provider is not found.
  40. ModelNotFoundError: If the model is not found.
  41. ProviderNotWorkingError: If the provider is not working.
  42. StreamNotSupportedError: If streaming is not supported by the provider.
  43. """
  44. if debug.version_check:
  45. debug.version_check = False
  46. version.utils.check_version()
  47. if isinstance(provider, str):
  48. provider = convert_to_provider(provider)
  49. if isinstance(model, str):
  50. if model in ModelUtils.convert:
  51. model = ModelUtils.convert[model]
  52. if not provider:
  53. if not model:
  54. if has_images:
  55. model = default_vision
  56. provider = default_vision.best_provider
  57. else:
  58. model = default
  59. provider = model.best_provider
  60. elif isinstance(model, str):
  61. if model in ProviderUtils.convert:
  62. provider = ProviderUtils.convert[model]
  63. model = getattr(provider, "default_model", "")
  64. else:
  65. raise ModelNotFoundError(f'Model not found: {model}')
  66. elif isinstance(model, Model):
  67. provider = model.best_provider
  68. else:
  69. raise ValueError(f"Unexpected type: {type(model)}")
  70. if not provider:
  71. raise ProviderNotFoundError(f'No provider found for model: {model}')
  72. provider_name = provider.__name__ if hasattr(provider, "__name__") else type(provider).__name__
  73. if isinstance(model, Model):
  74. model = model.name
  75. if not ignore_working and not provider.working:
  76. raise ProviderNotWorkingError(f"{provider_name} is not working")
  77. if isinstance(provider, BaseRetryProvider):
  78. if not ignore_working:
  79. provider.providers = [p for p in provider.providers if p.working]
  80. if not ignore_stream and not provider.supports_stream and stream:
  81. raise StreamNotSupportedError(f'{provider_name} does not support "stream" argument')
  82. if logging:
  83. if model:
  84. debug.log(f'Using {provider_name} provider and {model} model')
  85. else:
  86. debug.log(f'Using {provider_name} provider')
  87. debug.last_provider = provider
  88. debug.last_model = model
  89. return model, provider
  90. def get_last_provider(as_dict: bool = False) -> Union[ProviderType, dict[str, str], None]:
  91. """
  92. Retrieves the last used provider.
  93. Args:
  94. as_dict (bool, optional): If True, returns the provider information as a dictionary.
  95. Returns:
  96. Union[ProviderType, dict[str, str]]: The last used provider, either as an object or a dictionary.
  97. """
  98. last = debug.last_provider
  99. if isinstance(last, BaseRetryProvider):
  100. last = last.last_provider
  101. if as_dict:
  102. if last:
  103. return {
  104. "name": last.__name__ if hasattr(last, "__name__") else type(last).__name__,
  105. "url": last.url,
  106. "model": debug.last_model,
  107. "label": getattr(last, "label", None) if hasattr(last, "label") else None
  108. }
  109. else:
  110. return {}
  111. return last