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.
- {keycycle-0.2.4 → keycycle-0.3.0}/PKG-INFO +44 -44
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/__init__.py +47 -47
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/adapters/generic_adapter.py +663 -618
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/adapters/openai_adapter.py +46 -3
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/__init__.py +25 -25
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/dataclasses.py +225 -212
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/enums.py +5 -5
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/log_config.py +52 -52
- keycycle-0.3.0/keycycle/config/models/cerebras.yaml +36 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/openrouter_models.yaml +96 -96
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/utils.py +41 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/key_rotation/__init__.py +6 -6
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/key_rotation/rotating_mixin.py +392 -347
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/key_rotation/rotation_manager.py +230 -230
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/usage/__init__.py +5 -5
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/usage/db_logic.py +98 -98
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/usage/usage_logger.py +89 -89
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/utils.py +27 -27
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/PKG-INFO +44 -44
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/SOURCES.txt +1 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/pyproject.toml +1 -1
- {keycycle-0.2.4 → keycycle-0.3.0}/setup.cfg +4 -4
- {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_api_key_pinning.py +114 -114
- {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_api_key_retrieval.py +260 -260
- {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_cerebras_direct.py +3 -3
- keycycle-0.3.0/tests/test_payment_required_rotation.py +253 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_streams_recording.py +1 -1
- keycycle-0.2.4/keycycle/config/models/cerebras.yaml +0 -55
- {keycycle-0.2.4 → keycycle-0.3.0}/MANIFEST.in +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/adapters/__init__.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/constants.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/loader.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/cohere.yaml +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/gemini.yaml +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/groq.yaml +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/moonshot.yaml +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models/openrouter.yaml +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/config/models.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/__init__.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/backoff.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/core/exceptions.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/legacy_multi_provider_wrapper.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/multi_client_wrapper.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle/py.typed +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/dependency_links.txt +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/requires.txt +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/keycycle.egg-info/top_level.txt +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_custom_key_limits.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_multi_client_wrapper.py +0 -0
- {keycycle-0.2.4 → keycycle-0.3.0}/tests/test_rate_limit_logic.py +0 -0
- {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.
|
|
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
|
]
|