ccproxy-api 0.1.0__py3-none-any.whl

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 (148) hide show
  1. ccproxy/__init__.py +4 -0
  2. ccproxy/__main__.py +7 -0
  3. ccproxy/_version.py +21 -0
  4. ccproxy/adapters/__init__.py +11 -0
  5. ccproxy/adapters/base.py +80 -0
  6. ccproxy/adapters/openai/__init__.py +43 -0
  7. ccproxy/adapters/openai/adapter.py +915 -0
  8. ccproxy/adapters/openai/models.py +412 -0
  9. ccproxy/adapters/openai/streaming.py +449 -0
  10. ccproxy/api/__init__.py +28 -0
  11. ccproxy/api/app.py +225 -0
  12. ccproxy/api/dependencies.py +140 -0
  13. ccproxy/api/middleware/__init__.py +11 -0
  14. ccproxy/api/middleware/auth.py +0 -0
  15. ccproxy/api/middleware/cors.py +55 -0
  16. ccproxy/api/middleware/errors.py +703 -0
  17. ccproxy/api/middleware/headers.py +51 -0
  18. ccproxy/api/middleware/logging.py +175 -0
  19. ccproxy/api/middleware/request_id.py +69 -0
  20. ccproxy/api/middleware/server_header.py +62 -0
  21. ccproxy/api/responses.py +84 -0
  22. ccproxy/api/routes/__init__.py +16 -0
  23. ccproxy/api/routes/claude.py +181 -0
  24. ccproxy/api/routes/health.py +489 -0
  25. ccproxy/api/routes/metrics.py +1033 -0
  26. ccproxy/api/routes/proxy.py +238 -0
  27. ccproxy/auth/__init__.py +75 -0
  28. ccproxy/auth/bearer.py +68 -0
  29. ccproxy/auth/credentials_adapter.py +93 -0
  30. ccproxy/auth/dependencies.py +229 -0
  31. ccproxy/auth/exceptions.py +79 -0
  32. ccproxy/auth/manager.py +102 -0
  33. ccproxy/auth/models.py +118 -0
  34. ccproxy/auth/oauth/__init__.py +26 -0
  35. ccproxy/auth/oauth/models.py +49 -0
  36. ccproxy/auth/oauth/routes.py +396 -0
  37. ccproxy/auth/oauth/storage.py +0 -0
  38. ccproxy/auth/storage/__init__.py +12 -0
  39. ccproxy/auth/storage/base.py +57 -0
  40. ccproxy/auth/storage/json_file.py +159 -0
  41. ccproxy/auth/storage/keyring.py +192 -0
  42. ccproxy/claude_sdk/__init__.py +20 -0
  43. ccproxy/claude_sdk/client.py +169 -0
  44. ccproxy/claude_sdk/converter.py +331 -0
  45. ccproxy/claude_sdk/options.py +120 -0
  46. ccproxy/cli/__init__.py +14 -0
  47. ccproxy/cli/commands/__init__.py +8 -0
  48. ccproxy/cli/commands/auth.py +553 -0
  49. ccproxy/cli/commands/config/__init__.py +14 -0
  50. ccproxy/cli/commands/config/commands.py +766 -0
  51. ccproxy/cli/commands/config/schema_commands.py +119 -0
  52. ccproxy/cli/commands/serve.py +630 -0
  53. ccproxy/cli/docker/__init__.py +34 -0
  54. ccproxy/cli/docker/adapter_factory.py +157 -0
  55. ccproxy/cli/docker/params.py +278 -0
  56. ccproxy/cli/helpers.py +144 -0
  57. ccproxy/cli/main.py +193 -0
  58. ccproxy/cli/options/__init__.py +14 -0
  59. ccproxy/cli/options/claude_options.py +216 -0
  60. ccproxy/cli/options/core_options.py +40 -0
  61. ccproxy/cli/options/security_options.py +48 -0
  62. ccproxy/cli/options/server_options.py +117 -0
  63. ccproxy/config/__init__.py +40 -0
  64. ccproxy/config/auth.py +154 -0
  65. ccproxy/config/claude.py +124 -0
  66. ccproxy/config/cors.py +79 -0
  67. ccproxy/config/discovery.py +87 -0
  68. ccproxy/config/docker_settings.py +265 -0
  69. ccproxy/config/loader.py +108 -0
  70. ccproxy/config/observability.py +158 -0
  71. ccproxy/config/pricing.py +88 -0
  72. ccproxy/config/reverse_proxy.py +31 -0
  73. ccproxy/config/scheduler.py +89 -0
  74. ccproxy/config/security.py +14 -0
  75. ccproxy/config/server.py +81 -0
  76. ccproxy/config/settings.py +534 -0
  77. ccproxy/config/validators.py +231 -0
  78. ccproxy/core/__init__.py +274 -0
  79. ccproxy/core/async_utils.py +675 -0
  80. ccproxy/core/constants.py +97 -0
  81. ccproxy/core/errors.py +256 -0
  82. ccproxy/core/http.py +328 -0
  83. ccproxy/core/http_transformers.py +428 -0
  84. ccproxy/core/interfaces.py +247 -0
  85. ccproxy/core/logging.py +189 -0
  86. ccproxy/core/middleware.py +114 -0
  87. ccproxy/core/proxy.py +143 -0
  88. ccproxy/core/system.py +38 -0
  89. ccproxy/core/transformers.py +259 -0
  90. ccproxy/core/types.py +129 -0
  91. ccproxy/core/validators.py +288 -0
  92. ccproxy/docker/__init__.py +67 -0
  93. ccproxy/docker/adapter.py +588 -0
  94. ccproxy/docker/docker_path.py +207 -0
  95. ccproxy/docker/middleware.py +103 -0
  96. ccproxy/docker/models.py +228 -0
  97. ccproxy/docker/protocol.py +192 -0
  98. ccproxy/docker/stream_process.py +264 -0
  99. ccproxy/docker/validators.py +173 -0
  100. ccproxy/models/__init__.py +123 -0
  101. ccproxy/models/errors.py +42 -0
  102. ccproxy/models/messages.py +243 -0
  103. ccproxy/models/requests.py +85 -0
  104. ccproxy/models/responses.py +227 -0
  105. ccproxy/models/types.py +102 -0
  106. ccproxy/observability/__init__.py +51 -0
  107. ccproxy/observability/access_logger.py +400 -0
  108. ccproxy/observability/context.py +447 -0
  109. ccproxy/observability/metrics.py +539 -0
  110. ccproxy/observability/pushgateway.py +366 -0
  111. ccproxy/observability/sse_events.py +303 -0
  112. ccproxy/observability/stats_printer.py +755 -0
  113. ccproxy/observability/storage/__init__.py +1 -0
  114. ccproxy/observability/storage/duckdb_simple.py +665 -0
  115. ccproxy/observability/storage/models.py +55 -0
  116. ccproxy/pricing/__init__.py +19 -0
  117. ccproxy/pricing/cache.py +212 -0
  118. ccproxy/pricing/loader.py +267 -0
  119. ccproxy/pricing/models.py +106 -0
  120. ccproxy/pricing/updater.py +309 -0
  121. ccproxy/scheduler/__init__.py +39 -0
  122. ccproxy/scheduler/core.py +335 -0
  123. ccproxy/scheduler/exceptions.py +34 -0
  124. ccproxy/scheduler/manager.py +186 -0
  125. ccproxy/scheduler/registry.py +150 -0
  126. ccproxy/scheduler/tasks.py +484 -0
  127. ccproxy/services/__init__.py +10 -0
  128. ccproxy/services/claude_sdk_service.py +614 -0
  129. ccproxy/services/credentials/__init__.py +55 -0
  130. ccproxy/services/credentials/config.py +105 -0
  131. ccproxy/services/credentials/manager.py +562 -0
  132. ccproxy/services/credentials/oauth_client.py +482 -0
  133. ccproxy/services/proxy_service.py +1536 -0
  134. ccproxy/static/.keep +0 -0
  135. ccproxy/testing/__init__.py +34 -0
  136. ccproxy/testing/config.py +148 -0
  137. ccproxy/testing/content_generation.py +197 -0
  138. ccproxy/testing/mock_responses.py +262 -0
  139. ccproxy/testing/response_handlers.py +161 -0
  140. ccproxy/testing/scenarios.py +241 -0
  141. ccproxy/utils/__init__.py +6 -0
  142. ccproxy/utils/cost_calculator.py +210 -0
  143. ccproxy/utils/streaming_metrics.py +199 -0
  144. ccproxy_api-0.1.0.dist-info/METADATA +253 -0
  145. ccproxy_api-0.1.0.dist-info/RECORD +148 -0
  146. ccproxy_api-0.1.0.dist-info/WHEEL +4 -0
  147. ccproxy_api-0.1.0.dist-info/entry_points.txt +2 -0
  148. ccproxy_api-0.1.0.dist-info/licenses/LICENSE +21 -0
ccproxy/__init__.py ADDED
@@ -0,0 +1,4 @@
1
+ from ._version import __version__
2
+
3
+
4
+ __all__ = ["__version__"]
ccproxy/__main__.py ADDED
@@ -0,0 +1,7 @@
1
+ """Entry point for python -m ccproxy."""
2
+
3
+ from ccproxy.cli.main import main
4
+
5
+
6
+ if __name__ == "__main__":
7
+ main()
ccproxy/_version.py ADDED
@@ -0,0 +1,21 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
5
+
6
+ TYPE_CHECKING = False
7
+ if TYPE_CHECKING:
8
+ from typing import Tuple
9
+ from typing import Union
10
+
11
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
12
+ else:
13
+ VERSION_TUPLE = object
14
+
15
+ version: str
16
+ __version__: str
17
+ __version_tuple__: VERSION_TUPLE
18
+ version_tuple: VERSION_TUPLE
19
+
20
+ __version__ = version = '0.1.0'
21
+ __version_tuple__ = version_tuple = (0, 1, 0)
@@ -0,0 +1,11 @@
1
+ """Adapter modules for API format conversion."""
2
+
3
+ from .base import APIAdapter, BaseAPIAdapter
4
+ from .openai import OpenAIAdapter
5
+
6
+
7
+ __all__ = [
8
+ "APIAdapter",
9
+ "BaseAPIAdapter",
10
+ "OpenAIAdapter",
11
+ ]
@@ -0,0 +1,80 @@
1
+ """Base adapter interface for API format conversion."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from collections.abc import AsyncIterator
5
+ from typing import Any
6
+
7
+
8
+ class APIAdapter(ABC):
9
+ """Abstract base class for API format adapters.
10
+
11
+ Combines all transformation interfaces to provide a complete adapter
12
+ for converting between different API formats.
13
+ """
14
+
15
+ @abstractmethod
16
+ async def adapt_request(self, request: dict[str, Any]) -> dict[str, Any]:
17
+ """Convert a request from one API format to another.
18
+
19
+ Args:
20
+ request: The request data to convert
21
+
22
+ Returns:
23
+ The converted request data
24
+
25
+ Raises:
26
+ ValueError: If the request format is invalid or unsupported
27
+ """
28
+ pass
29
+
30
+ @abstractmethod
31
+ async def adapt_response(self, response: dict[str, Any]) -> dict[str, Any]:
32
+ """Convert a response from one API format to another.
33
+
34
+ Args:
35
+ response: The response data to convert
36
+
37
+ Returns:
38
+ The converted response data
39
+
40
+ Raises:
41
+ ValueError: If the response format is invalid or unsupported
42
+ """
43
+ pass
44
+
45
+ @abstractmethod
46
+ async def adapt_stream(
47
+ self, stream: AsyncIterator[dict[str, Any]]
48
+ ) -> AsyncIterator[dict[str, Any]]:
49
+ """Convert a streaming response from one API format to another.
50
+
51
+ Args:
52
+ stream: The streaming response data to convert
53
+
54
+ Yields:
55
+ The converted streaming response chunks
56
+
57
+ Raises:
58
+ ValueError: If the stream format is invalid or unsupported
59
+ """
60
+ # This should be implemented as an async generator
61
+ # async def adapt_stream(self, stream):
62
+ # async for item in stream:
63
+ # yield transformed_item
64
+ raise NotImplementedError
65
+
66
+
67
+ class BaseAPIAdapter(APIAdapter):
68
+ """Base implementation with common functionality."""
69
+
70
+ def __init__(self, name: str):
71
+ self.name = name
72
+
73
+ def __str__(self) -> str:
74
+ return f"{self.__class__.__name__}({self.name})"
75
+
76
+ def __repr__(self) -> str:
77
+ return self.__str__()
78
+
79
+
80
+ __all__ = ["APIAdapter", "BaseAPIAdapter"]
@@ -0,0 +1,43 @@
1
+ """OpenAI adapter module for API format conversion.
2
+
3
+ This module provides the OpenAI adapter implementation for converting
4
+ between OpenAI and Anthropic API formats.
5
+ """
6
+
7
+ from .adapter import OpenAIAdapter, map_openai_model_to_claude
8
+ from .models import (
9
+ OpenAIChatCompletionResponse,
10
+ OpenAIChoice,
11
+ OpenAIMessage,
12
+ OpenAIMessageContent,
13
+ OpenAIResponseMessage,
14
+ OpenAIStreamingChatCompletionResponse,
15
+ OpenAIToolCall,
16
+ OpenAIUsage,
17
+ format_openai_tool_call,
18
+ generate_openai_response_id,
19
+ generate_openai_system_fingerprint,
20
+ )
21
+ from .streaming import OpenAISSEFormatter, OpenAIStreamProcessor
22
+
23
+
24
+ __all__ = [
25
+ # Adapter
26
+ "OpenAIAdapter",
27
+ "map_openai_model_to_claude",
28
+ # Models
29
+ "OpenAIMessage",
30
+ "OpenAIMessageContent",
31
+ "OpenAIResponseMessage",
32
+ "OpenAIChoice",
33
+ "OpenAIChatCompletionResponse",
34
+ "OpenAIStreamingChatCompletionResponse",
35
+ "OpenAIToolCall",
36
+ "OpenAIUsage",
37
+ "format_openai_tool_call",
38
+ "generate_openai_response_id",
39
+ "generate_openai_system_fingerprint",
40
+ # Streaming
41
+ "OpenAISSEFormatter",
42
+ "OpenAIStreamProcessor",
43
+ ]