keycycle 0.2.4__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {keycycle-0.2.4 → keycycle-0.3.0}/PKG-INFO +44 -44
  2. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/__init__.py +47 -47
  3. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/adapters/generic_adapter.py +663 -618
  4. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/adapters/openai_adapter.py +46 -3
  5. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/__init__.py +25 -25
  6. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/dataclasses.py +225 -212
  7. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/enums.py +5 -5
  8. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/log_config.py +52 -52
  9. keycycle-0.3.0/keycycle/config/models/cerebras.yaml +36 -0
  10. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/openrouter_models.yaml +96 -96
  11. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/utils.py +41 -0
  12. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/key_rotation/__init__.py +6 -6
  13. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/key_rotation/rotating_mixin.py +392 -347
  14. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/key_rotation/rotation_manager.py +230 -230
  15. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/usage/__init__.py +5 -5
  16. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/usage/db_logic.py +98 -98
  17. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/usage/usage_logger.py +89 -89
  18. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/utils.py +27 -27
  19. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/PKG-INFO +44 -44
  20. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/SOURCES.txt +1 -0
  21. {keycycle-0.2.4 → keycycle-0.3.0}/pyproject.toml +1 -1
  22. {keycycle-0.2.4 → keycycle-0.3.0}/setup.cfg +4 -4
  23. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_api_key_pinning.py +114 -114
  24. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_api_key_retrieval.py +260 -260
  25. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_cerebras_direct.py +3 -3
  26. keycycle-0.3.0/tests/test_payment_required_rotation.py +253 -0
  27. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_streams_recording.py +1 -1
  28. keycycle-0.2.4/keycycle/config/models/cerebras.yaml +0 -55
  29. {keycycle-0.2.4 → keycycle-0.3.0}/MANIFEST.in +0 -0
  30. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/adapters/__init__.py +0 -0
  31. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/constants.py +0 -0
  32. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/loader.py +0 -0
  33. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/cohere.yaml +0 -0
  34. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/gemini.yaml +0 -0
  35. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/groq.yaml +0 -0
  36. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/moonshot.yaml +0 -0
  37. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/openrouter.yaml +0 -0
  38. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models.py +0 -0
  39. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/__init__.py +0 -0
  40. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/backoff.py +0 -0
  41. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/exceptions.py +0 -0
  42. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/legacy_multi_provider_wrapper.py +0 -0
  43. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/multi_client_wrapper.py +0 -0
  44. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/py.typed +0 -0
  45. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/dependency_links.txt +0 -0
  46. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/requires.txt +0 -0
  47. {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/top_level.txt +0 -0
  48. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_custom_key_limits.py +0 -0
  49. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_multi_client_wrapper.py +0 -0
  50. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_rate_limit_logic.py +0 -0
  51. {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_specific_key_retrieval.py +0 -0
@@ -1,44 +1,44 @@
1
- Metadata-Version: 2.4
2
- Name: keycycle
3
- Version: 0.2.4
4
- Summary: A thread-safe key rotation and rate limiting manager for API keys.
5
- Author-email: William Jin <jinwilliam.jin@gmail.com>
6
- Classifier: Programming Language :: Python :: 3
7
- Classifier: License :: OSI Approved :: MIT License
8
- Classifier: Operating System :: OS Independent
9
- Classifier: Development Status :: 3 - Alpha
10
- Requires-Python: >=3.9
11
- Description-Content-Type: text/markdown
12
- Requires-Dist: python-dotenv
13
- Requires-Dist: sqlalchemy
14
- Requires-Dist: pymysql
15
- Requires-Dist: rich
16
- Requires-Dist: PyYAML
17
- Provides-Extra: openai
18
- Requires-Dist: openai; extra == "openai"
19
- Provides-Extra: agno
20
- Requires-Dist: agno; extra == "agno"
21
- Provides-Extra: cohere
22
- Requires-Dist: cohere; extra == "cohere"
23
- Provides-Extra: cerebras
24
- Requires-Dist: cerebras-cloud-sdk; extra == "cerebras"
25
- Provides-Extra: groq
26
- Requires-Dist: groq; extra == "groq"
27
- Provides-Extra: openrouter
28
- Requires-Dist: openrouter; extra == "openrouter"
29
- Provides-Extra: all
30
- Requires-Dist: openai; extra == "all"
31
- Requires-Dist: agno; extra == "all"
32
- Requires-Dist: cohere; extra == "all"
33
- Requires-Dist: cerebras-cloud-sdk; extra == "all"
34
- Requires-Dist: groq; extra == "all"
35
- Requires-Dist: openrouter; extra == "all"
36
- Provides-Extra: test
37
- Requires-Dist: pytest>=7.4.0; extra == "test"
38
- Requires-Dist: pytest-cov>=4.1.0; extra == "test"
39
- Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
40
- Requires-Dist: pytest-timeout>=2.2.0; extra == "test"
41
- Provides-Extra: dev
42
- Requires-Dist: keycycle[test]; extra == "dev"
43
- Requires-Dist: mypy>=1.5.0; extra == "dev"
44
- Requires-Dist: types-PyYAML; extra == "dev"
1
+ Metadata-Version: 2.4
2
+ Name: keycycle
3
+ Version: 0.3.0
4
+ Summary: A thread-safe key rotation and rate limiting manager for API keys.
5
+ Author-email: William Jin <jinwilliam.jin@gmail.com>
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Operating System :: OS Independent
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Requires-Python: >=3.9
11
+ Description-Content-Type: text/markdown
12
+ Requires-Dist: python-dotenv
13
+ Requires-Dist: sqlalchemy
14
+ Requires-Dist: pymysql
15
+ Requires-Dist: rich
16
+ Requires-Dist: PyYAML
17
+ Provides-Extra: openai
18
+ Requires-Dist: openai; extra == "openai"
19
+ Provides-Extra: agno
20
+ Requires-Dist: agno; extra == "agno"
21
+ Provides-Extra: cohere
22
+ Requires-Dist: cohere; extra == "cohere"
23
+ Provides-Extra: cerebras
24
+ Requires-Dist: cerebras-cloud-sdk; extra == "cerebras"
25
+ Provides-Extra: groq
26
+ Requires-Dist: groq; extra == "groq"
27
+ Provides-Extra: openrouter
28
+ Requires-Dist: openrouter; extra == "openrouter"
29
+ Provides-Extra: all
30
+ Requires-Dist: openai; extra == "all"
31
+ Requires-Dist: agno; extra == "all"
32
+ Requires-Dist: cohere; extra == "all"
33
+ Requires-Dist: cerebras-cloud-sdk; extra == "all"
34
+ Requires-Dist: groq; extra == "all"
35
+ Requires-Dist: openrouter; extra == "all"
36
+ Provides-Extra: test
37
+ Requires-Dist: pytest>=7.4.0; extra == "test"
38
+ Requires-Dist: pytest-cov>=4.1.0; extra == "test"
39
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
40
+ Requires-Dist: pytest-timeout>=2.2.0; extra == "test"
41
+ Provides-Extra: dev
42
+ Requires-Dist: keycycle[test]; extra == "dev"
43
+ Requires-Dist: mypy>=1.5.0; extra == "dev"
44
+ Requires-Dist: types-PyYAML; extra == "dev"
@@ -1,48 +1,48 @@
1
- from .legacy_multi_provider_wrapper import MultiProviderWrapper
2
- from .multi_client_wrapper import MultiClientWrapper, ProviderEnvConfig
3
- from .key_rotation.rotation_manager import RotatingKeyManager
4
- from .config.dataclasses import RateLimits, KeyLimitOverride
5
- from .core.utils import KeyEntry
6
- from .core.exceptions import (
7
- KeycycleError,
8
- NoAvailableKeyError,
9
- KeyNotFoundError,
10
- InvalidKeyError,
11
- RateLimitError,
12
- ConfigurationError,
13
- )
14
- from .adapters.generic_adapter import (
15
- create_rotating_client,
16
- detect_async_client,
17
- get_valid_constructor_kwargs,
18
- GenericClientConfig,
19
- SyncGenericRotatingClient,
20
- AsyncGenericRotatingClient,
21
- )
22
-
23
- __all__ = [
24
- # New primary wrapper (multi-provider support)
25
- "MultiClientWrapper",
26
- "ProviderEnvConfig",
27
- # Legacy wrapper (single provider, backward compatible)
28
- "MultiProviderWrapper",
29
- # Main classes
30
- "RateLimits",
31
- "KeyLimitOverride",
32
- "KeyEntry",
33
- "RotatingKeyManager",
34
- # Generic rotating client
35
- "create_rotating_client",
36
- "detect_async_client",
37
- "get_valid_constructor_kwargs",
38
- "GenericClientConfig",
39
- "SyncGenericRotatingClient",
40
- "AsyncGenericRotatingClient",
41
- # Exceptions
42
- "KeycycleError",
43
- "NoAvailableKeyError",
44
- "KeyNotFoundError",
45
- "InvalidKeyError",
46
- "RateLimitError",
47
- "ConfigurationError",
1
+ from .legacy_multi_provider_wrapper import MultiProviderWrapper
2
+ from .multi_client_wrapper import MultiClientWrapper, ProviderEnvConfig
3
+ from .key_rotation.rotation_manager import RotatingKeyManager
4
+ from .config.dataclasses import RateLimits, KeyLimitOverride
5
+ from .core.utils import KeyEntry
6
+ from .core.exceptions import (
7
+ KeycycleError,
8
+ NoAvailableKeyError,
9
+ KeyNotFoundError,
10
+ InvalidKeyError,
11
+ RateLimitError,
12
+ ConfigurationError,
13
+ )
14
+ from .adapters.generic_adapter import (
15
+ create_rotating_client,
16
+ detect_async_client,
17
+ get_valid_constructor_kwargs,
18
+ GenericClientConfig,
19
+ SyncGenericRotatingClient,
20
+ AsyncGenericRotatingClient,
21
+ )
22
+
23
+ __all__ = [
24
+ # New primary wrapper (multi-provider support)
25
+ "MultiClientWrapper",
26
+ "ProviderEnvConfig",
27
+ # Legacy wrapper (single provider, backward compatible)
28
+ "MultiProviderWrapper",
29
+ # Main classes
30
+ "RateLimits",
31
+ "KeyLimitOverride",
32
+ "KeyEntry",
33
+ "RotatingKeyManager",
34
+ # Generic rotating client
35
+ "create_rotating_client",
36
+ "detect_async_client",
37
+ "get_valid_constructor_kwargs",
38
+ "GenericClientConfig",
39
+ "SyncGenericRotatingClient",
40
+ "AsyncGenericRotatingClient",
41
+ # Exceptions
42
+ "KeycycleError",
43
+ "NoAvailableKeyError",
44
+ "KeyNotFoundError",
45
+ "InvalidKeyError",
46
+ "RateLimitError",
47
+ "ConfigurationError",
48
48
  ]