ccproxy-api 0.1.6__py3-none-any.whl → 0.2.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.
- ccproxy/api/__init__.py +1 -15
- ccproxy/api/app.py +439 -212
- ccproxy/api/bootstrap.py +30 -0
- ccproxy/api/decorators.py +85 -0
- ccproxy/api/dependencies.py +145 -176
- ccproxy/api/format_validation.py +54 -0
- ccproxy/api/middleware/cors.py +6 -3
- ccproxy/api/middleware/errors.py +402 -530
- ccproxy/api/middleware/hooks.py +563 -0
- ccproxy/api/middleware/normalize_headers.py +59 -0
- ccproxy/api/middleware/request_id.py +35 -16
- ccproxy/api/middleware/streaming_hooks.py +292 -0
- ccproxy/api/routes/__init__.py +5 -14
- ccproxy/api/routes/health.py +39 -672
- ccproxy/api/routes/plugins.py +277 -0
- ccproxy/auth/__init__.py +2 -19
- ccproxy/auth/bearer.py +25 -15
- ccproxy/auth/dependencies.py +123 -157
- ccproxy/auth/exceptions.py +0 -12
- ccproxy/auth/manager.py +35 -49
- ccproxy/auth/managers/__init__.py +10 -0
- ccproxy/auth/managers/base.py +523 -0
- ccproxy/auth/managers/base_enhanced.py +63 -0
- ccproxy/auth/managers/token_snapshot.py +77 -0
- ccproxy/auth/models/base.py +65 -0
- ccproxy/auth/models/credentials.py +40 -0
- ccproxy/auth/oauth/__init__.py +4 -18
- ccproxy/auth/oauth/base.py +533 -0
- ccproxy/auth/oauth/cli_errors.py +37 -0
- ccproxy/auth/oauth/flows.py +430 -0
- ccproxy/auth/oauth/protocol.py +366 -0
- ccproxy/auth/oauth/registry.py +408 -0
- ccproxy/auth/oauth/router.py +396 -0
- ccproxy/auth/oauth/routes.py +186 -113
- ccproxy/auth/oauth/session.py +151 -0
- ccproxy/auth/oauth/templates.py +342 -0
- ccproxy/auth/storage/__init__.py +2 -5
- ccproxy/auth/storage/base.py +279 -5
- ccproxy/auth/storage/generic.py +134 -0
- ccproxy/cli/__init__.py +1 -2
- ccproxy/cli/_settings_help.py +351 -0
- ccproxy/cli/commands/auth.py +1519 -793
- ccproxy/cli/commands/config/commands.py +209 -276
- ccproxy/cli/commands/plugins.py +669 -0
- ccproxy/cli/commands/serve.py +75 -810
- ccproxy/cli/commands/status.py +254 -0
- ccproxy/cli/decorators.py +83 -0
- ccproxy/cli/helpers.py +22 -60
- ccproxy/cli/main.py +359 -10
- ccproxy/cli/options/claude_options.py +0 -25
- ccproxy/config/__init__.py +7 -11
- ccproxy/config/core.py +227 -0
- ccproxy/config/env_generator.py +232 -0
- ccproxy/config/runtime.py +67 -0
- ccproxy/config/security.py +36 -3
- ccproxy/config/settings.py +382 -441
- ccproxy/config/toml_generator.py +299 -0
- ccproxy/config/utils.py +452 -0
- ccproxy/core/__init__.py +7 -271
- ccproxy/{_version.py → core/_version.py} +16 -3
- ccproxy/core/async_task_manager.py +516 -0
- ccproxy/core/async_utils.py +47 -14
- ccproxy/core/auth/__init__.py +6 -0
- ccproxy/core/constants.py +16 -50
- ccproxy/core/errors.py +53 -0
- ccproxy/core/id_utils.py +20 -0
- ccproxy/core/interfaces.py +16 -123
- ccproxy/core/logging.py +473 -18
- ccproxy/core/plugins/__init__.py +77 -0
- ccproxy/core/plugins/cli_discovery.py +211 -0
- ccproxy/core/plugins/declaration.py +455 -0
- ccproxy/core/plugins/discovery.py +604 -0
- ccproxy/core/plugins/factories.py +967 -0
- ccproxy/core/plugins/hooks/__init__.py +30 -0
- ccproxy/core/plugins/hooks/base.py +58 -0
- ccproxy/core/plugins/hooks/events.py +46 -0
- ccproxy/core/plugins/hooks/implementations/__init__.py +16 -0
- ccproxy/core/plugins/hooks/implementations/formatters/__init__.py +11 -0
- ccproxy/core/plugins/hooks/implementations/formatters/json.py +552 -0
- ccproxy/core/plugins/hooks/implementations/formatters/raw.py +370 -0
- ccproxy/core/plugins/hooks/implementations/http_tracer.py +431 -0
- ccproxy/core/plugins/hooks/layers.py +44 -0
- ccproxy/core/plugins/hooks/manager.py +186 -0
- ccproxy/core/plugins/hooks/registry.py +139 -0
- ccproxy/core/plugins/hooks/thread_manager.py +203 -0
- ccproxy/core/plugins/hooks/types.py +22 -0
- ccproxy/core/plugins/interfaces.py +416 -0
- ccproxy/core/plugins/loader.py +166 -0
- ccproxy/core/plugins/middleware.py +233 -0
- ccproxy/core/plugins/models.py +59 -0
- ccproxy/core/plugins/protocol.py +180 -0
- ccproxy/core/plugins/runtime.py +519 -0
- ccproxy/{observability/context.py → core/request_context.py} +137 -94
- ccproxy/core/status_report.py +211 -0
- ccproxy/core/transformers.py +13 -8
- ccproxy/data/claude_headers_fallback.json +558 -0
- ccproxy/data/codex_headers_fallback.json +121 -0
- ccproxy/http/__init__.py +30 -0
- ccproxy/http/base.py +95 -0
- ccproxy/http/client.py +323 -0
- ccproxy/http/hooks.py +642 -0
- ccproxy/http/pool.py +279 -0
- ccproxy/llms/formatters/__init__.py +7 -0
- ccproxy/llms/formatters/anthropic_to_openai/__init__.py +55 -0
- ccproxy/llms/formatters/anthropic_to_openai/errors.py +65 -0
- ccproxy/llms/formatters/anthropic_to_openai/requests.py +356 -0
- ccproxy/llms/formatters/anthropic_to_openai/responses.py +153 -0
- ccproxy/llms/formatters/anthropic_to_openai/streams.py +1546 -0
- ccproxy/llms/formatters/base.py +140 -0
- ccproxy/llms/formatters/base_model.py +33 -0
- ccproxy/llms/formatters/common/__init__.py +51 -0
- ccproxy/llms/formatters/common/identifiers.py +48 -0
- ccproxy/llms/formatters/common/streams.py +254 -0
- ccproxy/llms/formatters/common/thinking.py +74 -0
- ccproxy/llms/formatters/common/usage.py +135 -0
- ccproxy/llms/formatters/constants.py +55 -0
- ccproxy/llms/formatters/context.py +116 -0
- ccproxy/llms/formatters/mapping.py +33 -0
- ccproxy/llms/formatters/openai_to_anthropic/__init__.py +55 -0
- ccproxy/llms/formatters/openai_to_anthropic/_helpers.py +141 -0
- ccproxy/llms/formatters/openai_to_anthropic/errors.py +53 -0
- ccproxy/llms/formatters/openai_to_anthropic/requests.py +674 -0
- ccproxy/llms/formatters/openai_to_anthropic/responses.py +285 -0
- ccproxy/llms/formatters/openai_to_anthropic/streams.py +530 -0
- ccproxy/llms/formatters/openai_to_openai/__init__.py +53 -0
- ccproxy/llms/formatters/openai_to_openai/_helpers.py +325 -0
- ccproxy/llms/formatters/openai_to_openai/errors.py +6 -0
- ccproxy/llms/formatters/openai_to_openai/requests.py +388 -0
- ccproxy/llms/formatters/openai_to_openai/responses.py +594 -0
- ccproxy/llms/formatters/openai_to_openai/streams.py +1832 -0
- ccproxy/llms/formatters/utils.py +306 -0
- ccproxy/llms/models/__init__.py +9 -0
- ccproxy/llms/models/anthropic.py +619 -0
- ccproxy/llms/models/openai.py +844 -0
- ccproxy/llms/streaming/__init__.py +26 -0
- ccproxy/llms/streaming/accumulators.py +1074 -0
- ccproxy/llms/streaming/formatters.py +251 -0
- ccproxy/{adapters/openai/streaming.py → llms/streaming/processors.py} +193 -240
- ccproxy/models/__init__.py +8 -159
- ccproxy/models/detection.py +92 -193
- ccproxy/models/provider.py +75 -0
- ccproxy/plugins/access_log/README.md +32 -0
- ccproxy/plugins/access_log/__init__.py +20 -0
- ccproxy/plugins/access_log/config.py +33 -0
- ccproxy/plugins/access_log/formatter.py +126 -0
- ccproxy/plugins/access_log/hook.py +763 -0
- ccproxy/plugins/access_log/logger.py +254 -0
- ccproxy/plugins/access_log/plugin.py +137 -0
- ccproxy/plugins/access_log/writer.py +109 -0
- ccproxy/plugins/analytics/README.md +24 -0
- ccproxy/plugins/analytics/__init__.py +1 -0
- ccproxy/plugins/analytics/config.py +5 -0
- ccproxy/plugins/analytics/ingest.py +85 -0
- ccproxy/plugins/analytics/models.py +97 -0
- ccproxy/plugins/analytics/plugin.py +121 -0
- ccproxy/plugins/analytics/routes.py +163 -0
- ccproxy/plugins/analytics/service.py +284 -0
- ccproxy/plugins/claude_api/README.md +29 -0
- ccproxy/plugins/claude_api/__init__.py +10 -0
- ccproxy/plugins/claude_api/adapter.py +829 -0
- ccproxy/plugins/claude_api/config.py +52 -0
- ccproxy/plugins/claude_api/detection_service.py +461 -0
- ccproxy/plugins/claude_api/health.py +175 -0
- ccproxy/plugins/claude_api/hooks.py +284 -0
- ccproxy/plugins/claude_api/models.py +256 -0
- ccproxy/plugins/claude_api/plugin.py +298 -0
- ccproxy/plugins/claude_api/routes.py +118 -0
- ccproxy/plugins/claude_api/streaming_metrics.py +68 -0
- ccproxy/plugins/claude_api/tasks.py +84 -0
- ccproxy/plugins/claude_sdk/README.md +35 -0
- ccproxy/plugins/claude_sdk/__init__.py +80 -0
- ccproxy/plugins/claude_sdk/adapter.py +749 -0
- ccproxy/plugins/claude_sdk/auth.py +57 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/client.py +63 -39
- ccproxy/plugins/claude_sdk/config.py +210 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/converter.py +6 -6
- ccproxy/plugins/claude_sdk/detection_service.py +163 -0
- ccproxy/{services/claude_sdk_service.py → plugins/claude_sdk/handler.py} +123 -304
- ccproxy/plugins/claude_sdk/health.py +113 -0
- ccproxy/plugins/claude_sdk/hooks.py +115 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/manager.py +42 -32
- ccproxy/{claude_sdk → plugins/claude_sdk}/message_queue.py +8 -8
- ccproxy/{models/claude_sdk.py → plugins/claude_sdk/models.py} +64 -16
- ccproxy/plugins/claude_sdk/options.py +154 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/parser.py +23 -5
- ccproxy/plugins/claude_sdk/plugin.py +269 -0
- ccproxy/plugins/claude_sdk/routes.py +104 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/session_client.py +124 -12
- ccproxy/plugins/claude_sdk/session_pool.py +700 -0
- ccproxy/{claude_sdk → plugins/claude_sdk}/stream_handle.py +48 -43
- ccproxy/{claude_sdk → plugins/claude_sdk}/stream_worker.py +22 -18
- ccproxy/{claude_sdk → plugins/claude_sdk}/streaming.py +50 -16
- ccproxy/plugins/claude_sdk/tasks.py +97 -0
- ccproxy/plugins/claude_shared/README.md +18 -0
- ccproxy/plugins/claude_shared/__init__.py +12 -0
- ccproxy/plugins/claude_shared/model_defaults.py +171 -0
- ccproxy/plugins/codex/README.md +35 -0
- ccproxy/plugins/codex/__init__.py +6 -0
- ccproxy/plugins/codex/adapter.py +635 -0
- ccproxy/{config/codex.py → plugins/codex/config.py} +78 -12
- ccproxy/plugins/codex/detection_service.py +544 -0
- ccproxy/plugins/codex/health.py +162 -0
- ccproxy/plugins/codex/hooks.py +263 -0
- ccproxy/plugins/codex/model_defaults.py +39 -0
- ccproxy/plugins/codex/models.py +263 -0
- ccproxy/plugins/codex/plugin.py +275 -0
- ccproxy/plugins/codex/routes.py +129 -0
- ccproxy/plugins/codex/streaming_metrics.py +324 -0
- ccproxy/plugins/codex/tasks.py +106 -0
- ccproxy/plugins/codex/utils/__init__.py +1 -0
- ccproxy/plugins/codex/utils/sse_parser.py +106 -0
- ccproxy/plugins/command_replay/README.md +34 -0
- ccproxy/plugins/command_replay/__init__.py +17 -0
- ccproxy/plugins/command_replay/config.py +133 -0
- ccproxy/plugins/command_replay/formatter.py +432 -0
- ccproxy/plugins/command_replay/hook.py +294 -0
- ccproxy/plugins/command_replay/plugin.py +161 -0
- ccproxy/plugins/copilot/README.md +39 -0
- ccproxy/plugins/copilot/__init__.py +11 -0
- ccproxy/plugins/copilot/adapter.py +465 -0
- ccproxy/plugins/copilot/config.py +155 -0
- ccproxy/plugins/copilot/data/copilot_fallback.json +41 -0
- ccproxy/plugins/copilot/detection_service.py +255 -0
- ccproxy/plugins/copilot/manager.py +275 -0
- ccproxy/plugins/copilot/model_defaults.py +284 -0
- ccproxy/plugins/copilot/models.py +148 -0
- ccproxy/plugins/copilot/oauth/__init__.py +16 -0
- ccproxy/plugins/copilot/oauth/client.py +494 -0
- ccproxy/plugins/copilot/oauth/models.py +385 -0
- ccproxy/plugins/copilot/oauth/provider.py +602 -0
- ccproxy/plugins/copilot/oauth/storage.py +170 -0
- ccproxy/plugins/copilot/plugin.py +360 -0
- ccproxy/plugins/copilot/routes.py +294 -0
- ccproxy/plugins/credential_balancer/README.md +124 -0
- ccproxy/plugins/credential_balancer/__init__.py +6 -0
- ccproxy/plugins/credential_balancer/config.py +270 -0
- ccproxy/plugins/credential_balancer/factory.py +415 -0
- ccproxy/plugins/credential_balancer/hook.py +51 -0
- ccproxy/plugins/credential_balancer/manager.py +587 -0
- ccproxy/plugins/credential_balancer/plugin.py +146 -0
- ccproxy/plugins/dashboard/README.md +25 -0
- ccproxy/plugins/dashboard/__init__.py +1 -0
- ccproxy/plugins/dashboard/config.py +8 -0
- ccproxy/plugins/dashboard/plugin.py +71 -0
- ccproxy/plugins/dashboard/routes.py +67 -0
- ccproxy/plugins/docker/README.md +32 -0
- ccproxy/{docker → plugins/docker}/__init__.py +3 -0
- ccproxy/{docker → plugins/docker}/adapter.py +108 -10
- ccproxy/plugins/docker/config.py +82 -0
- ccproxy/{docker → plugins/docker}/docker_path.py +4 -3
- ccproxy/{docker → plugins/docker}/middleware.py +2 -2
- ccproxy/plugins/docker/plugin.py +198 -0
- ccproxy/{docker → plugins/docker}/stream_process.py +3 -3
- ccproxy/plugins/duckdb_storage/README.md +26 -0
- ccproxy/plugins/duckdb_storage/__init__.py +1 -0
- ccproxy/plugins/duckdb_storage/config.py +22 -0
- ccproxy/plugins/duckdb_storage/plugin.py +128 -0
- ccproxy/plugins/duckdb_storage/routes.py +51 -0
- ccproxy/plugins/duckdb_storage/storage.py +633 -0
- ccproxy/plugins/max_tokens/README.md +38 -0
- ccproxy/plugins/max_tokens/__init__.py +12 -0
- ccproxy/plugins/max_tokens/adapter.py +235 -0
- ccproxy/plugins/max_tokens/config.py +86 -0
- ccproxy/plugins/max_tokens/models.py +53 -0
- ccproxy/plugins/max_tokens/plugin.py +200 -0
- ccproxy/plugins/max_tokens/service.py +271 -0
- ccproxy/plugins/max_tokens/token_limits.json +54 -0
- ccproxy/plugins/metrics/README.md +35 -0
- ccproxy/plugins/metrics/__init__.py +10 -0
- ccproxy/{observability/metrics.py → plugins/metrics/collector.py} +20 -153
- ccproxy/plugins/metrics/config.py +85 -0
- ccproxy/plugins/metrics/grafana/dashboards/ccproxy-dashboard.json +1720 -0
- ccproxy/plugins/metrics/hook.py +403 -0
- ccproxy/plugins/metrics/plugin.py +268 -0
- ccproxy/{observability → plugins/metrics}/pushgateway.py +57 -59
- ccproxy/plugins/metrics/routes.py +107 -0
- ccproxy/plugins/metrics/tasks.py +117 -0
- ccproxy/plugins/oauth_claude/README.md +35 -0
- ccproxy/plugins/oauth_claude/__init__.py +14 -0
- ccproxy/plugins/oauth_claude/client.py +270 -0
- ccproxy/plugins/oauth_claude/config.py +84 -0
- ccproxy/plugins/oauth_claude/manager.py +482 -0
- ccproxy/plugins/oauth_claude/models.py +266 -0
- ccproxy/plugins/oauth_claude/plugin.py +149 -0
- ccproxy/plugins/oauth_claude/provider.py +571 -0
- ccproxy/plugins/oauth_claude/storage.py +212 -0
- ccproxy/plugins/oauth_codex/README.md +38 -0
- ccproxy/plugins/oauth_codex/__init__.py +14 -0
- ccproxy/plugins/oauth_codex/client.py +224 -0
- ccproxy/plugins/oauth_codex/config.py +95 -0
- ccproxy/plugins/oauth_codex/manager.py +256 -0
- ccproxy/plugins/oauth_codex/models.py +239 -0
- ccproxy/plugins/oauth_codex/plugin.py +146 -0
- ccproxy/plugins/oauth_codex/provider.py +574 -0
- ccproxy/plugins/oauth_codex/storage.py +92 -0
- ccproxy/plugins/permissions/README.md +28 -0
- ccproxy/plugins/permissions/__init__.py +22 -0
- ccproxy/plugins/permissions/config.py +28 -0
- ccproxy/{cli/commands/permission_handler.py → plugins/permissions/handlers/cli.py} +49 -25
- ccproxy/plugins/permissions/handlers/protocol.py +33 -0
- ccproxy/plugins/permissions/handlers/terminal.py +675 -0
- ccproxy/{api/routes → plugins/permissions}/mcp.py +34 -7
- ccproxy/{models/permissions.py → plugins/permissions/models.py} +65 -1
- ccproxy/plugins/permissions/plugin.py +153 -0
- ccproxy/{api/routes/permissions.py → plugins/permissions/routes.py} +20 -16
- ccproxy/{api/services/permission_service.py → plugins/permissions/service.py} +65 -11
- ccproxy/{api → plugins/permissions}/ui/permission_handler_protocol.py +1 -1
- ccproxy/{api → plugins/permissions}/ui/terminal_permission_handler.py +66 -10
- ccproxy/plugins/pricing/README.md +34 -0
- ccproxy/plugins/pricing/__init__.py +6 -0
- ccproxy/{pricing → plugins/pricing}/cache.py +7 -6
- ccproxy/{config/pricing.py → plugins/pricing/config.py} +32 -6
- ccproxy/plugins/pricing/exceptions.py +35 -0
- ccproxy/plugins/pricing/loader.py +440 -0
- ccproxy/{pricing → plugins/pricing}/models.py +13 -23
- ccproxy/plugins/pricing/plugin.py +169 -0
- ccproxy/plugins/pricing/service.py +191 -0
- ccproxy/plugins/pricing/tasks.py +300 -0
- ccproxy/{pricing → plugins/pricing}/updater.py +86 -72
- ccproxy/plugins/pricing/utils.py +99 -0
- ccproxy/plugins/request_tracer/README.md +40 -0
- ccproxy/plugins/request_tracer/__init__.py +7 -0
- ccproxy/plugins/request_tracer/config.py +120 -0
- ccproxy/plugins/request_tracer/hook.py +415 -0
- ccproxy/plugins/request_tracer/plugin.py +255 -0
- ccproxy/scheduler/__init__.py +2 -14
- ccproxy/scheduler/core.py +26 -41
- ccproxy/scheduler/manager.py +63 -107
- ccproxy/scheduler/registry.py +6 -32
- ccproxy/scheduler/tasks.py +346 -314
- ccproxy/services/__init__.py +0 -1
- ccproxy/services/adapters/__init__.py +11 -0
- ccproxy/services/adapters/base.py +123 -0
- ccproxy/services/adapters/chain_composer.py +88 -0
- ccproxy/services/adapters/chain_validation.py +44 -0
- ccproxy/services/adapters/chat_accumulator.py +200 -0
- ccproxy/services/adapters/delta_utils.py +142 -0
- ccproxy/services/adapters/format_adapter.py +136 -0
- ccproxy/services/adapters/format_context.py +11 -0
- ccproxy/services/adapters/format_registry.py +158 -0
- ccproxy/services/adapters/http_adapter.py +1045 -0
- ccproxy/services/adapters/mock_adapter.py +118 -0
- ccproxy/services/adapters/protocols.py +35 -0
- ccproxy/services/adapters/simple_converters.py +571 -0
- ccproxy/services/auth_registry.py +180 -0
- ccproxy/services/cache/__init__.py +6 -0
- ccproxy/services/cache/response_cache.py +261 -0
- ccproxy/services/cli_detection.py +437 -0
- ccproxy/services/config/__init__.py +6 -0
- ccproxy/services/config/proxy_configuration.py +111 -0
- ccproxy/services/container.py +256 -0
- ccproxy/services/factories.py +380 -0
- ccproxy/services/handler_config.py +76 -0
- ccproxy/services/interfaces.py +298 -0
- ccproxy/services/mocking/__init__.py +6 -0
- ccproxy/services/mocking/mock_handler.py +291 -0
- ccproxy/services/tracing/__init__.py +7 -0
- ccproxy/services/tracing/interfaces.py +61 -0
- ccproxy/services/tracing/null_tracer.py +57 -0
- ccproxy/streaming/__init__.py +23 -0
- ccproxy/streaming/buffer.py +1056 -0
- ccproxy/streaming/deferred.py +897 -0
- ccproxy/streaming/handler.py +117 -0
- ccproxy/streaming/interfaces.py +77 -0
- ccproxy/streaming/simple_adapter.py +39 -0
- ccproxy/streaming/sse.py +109 -0
- ccproxy/streaming/sse_parser.py +127 -0
- ccproxy/templates/__init__.py +6 -0
- ccproxy/templates/plugin_scaffold.py +695 -0
- ccproxy/testing/endpoints/__init__.py +33 -0
- ccproxy/testing/endpoints/cli.py +215 -0
- ccproxy/testing/endpoints/config.py +874 -0
- ccproxy/testing/endpoints/console.py +57 -0
- ccproxy/testing/endpoints/models.py +100 -0
- ccproxy/testing/endpoints/runner.py +1903 -0
- ccproxy/testing/endpoints/tools.py +308 -0
- ccproxy/testing/mock_responses.py +70 -1
- ccproxy/testing/response_handlers.py +20 -0
- ccproxy/utils/__init__.py +0 -6
- ccproxy/utils/binary_resolver.py +476 -0
- ccproxy/utils/caching.py +327 -0
- ccproxy/utils/cli_logging.py +101 -0
- ccproxy/utils/command_line.py +251 -0
- ccproxy/utils/headers.py +228 -0
- ccproxy/utils/model_mapper.py +120 -0
- ccproxy/utils/startup_helpers.py +95 -342
- ccproxy/utils/version_checker.py +279 -6
- ccproxy_api-0.2.0.dist-info/METADATA +212 -0
- ccproxy_api-0.2.0.dist-info/RECORD +417 -0
- {ccproxy_api-0.1.6.dist-info → ccproxy_api-0.2.0.dist-info}/WHEEL +1 -1
- ccproxy_api-0.2.0.dist-info/entry_points.txt +24 -0
- ccproxy/__init__.py +0 -4
- ccproxy/adapters/__init__.py +0 -11
- ccproxy/adapters/base.py +0 -80
- ccproxy/adapters/codex/__init__.py +0 -11
- ccproxy/adapters/openai/__init__.py +0 -42
- ccproxy/adapters/openai/adapter.py +0 -953
- ccproxy/adapters/openai/models.py +0 -412
- ccproxy/adapters/openai/response_adapter.py +0 -355
- ccproxy/adapters/openai/response_models.py +0 -178
- ccproxy/api/middleware/headers.py +0 -49
- ccproxy/api/middleware/logging.py +0 -180
- ccproxy/api/middleware/request_content_logging.py +0 -297
- ccproxy/api/middleware/server_header.py +0 -58
- ccproxy/api/responses.py +0 -89
- ccproxy/api/routes/claude.py +0 -371
- ccproxy/api/routes/codex.py +0 -1231
- ccproxy/api/routes/metrics.py +0 -1029
- ccproxy/api/routes/proxy.py +0 -211
- ccproxy/api/services/__init__.py +0 -6
- ccproxy/auth/conditional.py +0 -84
- ccproxy/auth/credentials_adapter.py +0 -93
- ccproxy/auth/models.py +0 -118
- ccproxy/auth/oauth/models.py +0 -48
- ccproxy/auth/openai/__init__.py +0 -13
- ccproxy/auth/openai/credentials.py +0 -166
- ccproxy/auth/openai/oauth_client.py +0 -334
- ccproxy/auth/openai/storage.py +0 -184
- ccproxy/auth/storage/json_file.py +0 -158
- ccproxy/auth/storage/keyring.py +0 -189
- ccproxy/claude_sdk/__init__.py +0 -18
- ccproxy/claude_sdk/options.py +0 -194
- ccproxy/claude_sdk/session_pool.py +0 -550
- ccproxy/cli/docker/__init__.py +0 -34
- ccproxy/cli/docker/adapter_factory.py +0 -157
- ccproxy/cli/docker/params.py +0 -274
- ccproxy/config/auth.py +0 -153
- ccproxy/config/claude.py +0 -348
- ccproxy/config/cors.py +0 -79
- ccproxy/config/discovery.py +0 -95
- ccproxy/config/docker_settings.py +0 -264
- ccproxy/config/observability.py +0 -158
- ccproxy/config/reverse_proxy.py +0 -31
- ccproxy/config/scheduler.py +0 -108
- ccproxy/config/server.py +0 -86
- ccproxy/config/validators.py +0 -231
- ccproxy/core/codex_transformers.py +0 -389
- ccproxy/core/http.py +0 -328
- ccproxy/core/http_transformers.py +0 -812
- ccproxy/core/proxy.py +0 -143
- ccproxy/core/validators.py +0 -288
- ccproxy/models/errors.py +0 -42
- ccproxy/models/messages.py +0 -269
- ccproxy/models/requests.py +0 -107
- ccproxy/models/responses.py +0 -270
- ccproxy/models/types.py +0 -102
- ccproxy/observability/__init__.py +0 -51
- ccproxy/observability/access_logger.py +0 -457
- ccproxy/observability/sse_events.py +0 -303
- ccproxy/observability/stats_printer.py +0 -753
- ccproxy/observability/storage/__init__.py +0 -1
- ccproxy/observability/storage/duckdb_simple.py +0 -677
- ccproxy/observability/storage/models.py +0 -70
- ccproxy/observability/streaming_response.py +0 -107
- ccproxy/pricing/__init__.py +0 -19
- ccproxy/pricing/loader.py +0 -251
- ccproxy/services/claude_detection_service.py +0 -269
- ccproxy/services/codex_detection_service.py +0 -263
- ccproxy/services/credentials/__init__.py +0 -55
- ccproxy/services/credentials/config.py +0 -105
- ccproxy/services/credentials/manager.py +0 -561
- ccproxy/services/credentials/oauth_client.py +0 -481
- ccproxy/services/proxy_service.py +0 -1827
- ccproxy/static/.keep +0 -0
- ccproxy/utils/cost_calculator.py +0 -210
- ccproxy/utils/disconnection_monitor.py +0 -83
- ccproxy/utils/model_mapping.py +0 -199
- ccproxy/utils/models_provider.py +0 -150
- ccproxy/utils/simple_request_logger.py +0 -284
- ccproxy/utils/streaming_metrics.py +0 -199
- ccproxy_api-0.1.6.dist-info/METADATA +0 -615
- ccproxy_api-0.1.6.dist-info/RECORD +0 -189
- ccproxy_api-0.1.6.dist-info/entry_points.txt +0 -4
- /ccproxy/{api/middleware/auth.py → auth/models/__init__.py} +0 -0
- /ccproxy/{claude_sdk → plugins/claude_sdk}/exceptions.py +0 -0
- /ccproxy/{docker → plugins/docker}/models.py +0 -0
- /ccproxy/{docker → plugins/docker}/protocol.py +0 -0
- /ccproxy/{docker → plugins/docker}/validators.py +0 -0
- /ccproxy/{auth/oauth/storage.py → plugins/permissions/handlers/__init__.py} +0 -0
- /ccproxy/{api → plugins/permissions}/ui/__init__.py +0 -0
- {ccproxy_api-0.1.6.dist-info → ccproxy_api-0.2.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,412 +0,0 @@
|
|
|
1
|
-
"""OpenAI-specific models for the OpenAI adapter.
|
|
2
|
-
|
|
3
|
-
This module contains OpenAI-specific data models used by the OpenAI adapter
|
|
4
|
-
for handling format transformations and streaming.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import json
|
|
10
|
-
import uuid
|
|
11
|
-
from typing import Any, Literal
|
|
12
|
-
|
|
13
|
-
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
14
|
-
|
|
15
|
-
from ccproxy.models.types import ModalityType, ReasoningEffort
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class OpenAIMessageContent(BaseModel):
|
|
19
|
-
"""OpenAI message content block."""
|
|
20
|
-
|
|
21
|
-
type: Literal["text", "image_url"]
|
|
22
|
-
text: str | None = None
|
|
23
|
-
image_url: dict[str, Any] | None = None
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class OpenAIMessage(BaseModel):
|
|
27
|
-
"""OpenAI message model."""
|
|
28
|
-
|
|
29
|
-
role: Literal["system", "user", "assistant", "tool", "developer"]
|
|
30
|
-
content: str | list[OpenAIMessageContent] | None = None
|
|
31
|
-
name: str | None = None
|
|
32
|
-
tool_calls: list[dict[str, Any]] | None = None
|
|
33
|
-
tool_call_id: str | None = None
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class OpenAIFunction(BaseModel):
|
|
37
|
-
"""OpenAI function definition."""
|
|
38
|
-
|
|
39
|
-
name: str
|
|
40
|
-
description: str | None = None
|
|
41
|
-
parameters: dict[str, Any] = Field(default_factory=dict)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class OpenAITool(BaseModel):
|
|
45
|
-
"""OpenAI tool definition."""
|
|
46
|
-
|
|
47
|
-
type: Literal["function"] = "function"
|
|
48
|
-
function: OpenAIFunction
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
class OpenAIToolChoice(BaseModel):
|
|
52
|
-
"""OpenAI tool choice specification."""
|
|
53
|
-
|
|
54
|
-
type: Literal["function"]
|
|
55
|
-
function: dict[str, str]
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class OpenAIResponseFormat(BaseModel):
|
|
59
|
-
"""OpenAI response format specification."""
|
|
60
|
-
|
|
61
|
-
type: Literal["text", "json_object", "json_schema"] = "text"
|
|
62
|
-
json_schema: dict[str, Any] | None = None
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
class OpenAIStreamOptions(BaseModel):
|
|
66
|
-
"""OpenAI stream options."""
|
|
67
|
-
|
|
68
|
-
include_usage: bool = False
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
class OpenAIUsage(BaseModel):
|
|
72
|
-
"""OpenAI usage information."""
|
|
73
|
-
|
|
74
|
-
prompt_tokens: int
|
|
75
|
-
completion_tokens: int
|
|
76
|
-
total_tokens: int
|
|
77
|
-
prompt_tokens_details: dict[str, Any] | None = None
|
|
78
|
-
completion_tokens_details: dict[str, Any] | None = None
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class OpenAILogprobs(BaseModel):
|
|
82
|
-
"""OpenAI log probabilities."""
|
|
83
|
-
|
|
84
|
-
content: list[dict[str, Any]] | None = None
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
class OpenAIFunctionCall(BaseModel):
|
|
88
|
-
"""OpenAI function call."""
|
|
89
|
-
|
|
90
|
-
name: str
|
|
91
|
-
arguments: str
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
class OpenAIToolCall(BaseModel):
|
|
95
|
-
"""OpenAI tool call."""
|
|
96
|
-
|
|
97
|
-
id: str
|
|
98
|
-
type: Literal["function"] = "function"
|
|
99
|
-
function: OpenAIFunctionCall
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
class OpenAIResponseMessage(BaseModel):
|
|
103
|
-
"""OpenAI response message."""
|
|
104
|
-
|
|
105
|
-
role: Literal["assistant"]
|
|
106
|
-
content: str | None = None
|
|
107
|
-
tool_calls: list[OpenAIToolCall] | None = None
|
|
108
|
-
refusal: str | None = None
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
class OpenAIChoice(BaseModel):
|
|
112
|
-
"""OpenAI choice in response."""
|
|
113
|
-
|
|
114
|
-
index: int
|
|
115
|
-
message: OpenAIResponseMessage
|
|
116
|
-
finish_reason: Literal["stop", "length", "tool_calls", "content_filter"] | None
|
|
117
|
-
logprobs: OpenAILogprobs | None = None
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
class OpenAIChatCompletionRequest(BaseModel):
|
|
121
|
-
"""OpenAI-compatible chat completion request model."""
|
|
122
|
-
|
|
123
|
-
model: str = Field(..., description="ID of the model to use")
|
|
124
|
-
messages: list[OpenAIMessage] = Field(
|
|
125
|
-
...,
|
|
126
|
-
description="A list of messages comprising the conversation so far",
|
|
127
|
-
min_length=1,
|
|
128
|
-
)
|
|
129
|
-
max_tokens: int | None = Field(
|
|
130
|
-
None, description="The maximum number of tokens to generate", ge=1
|
|
131
|
-
)
|
|
132
|
-
temperature: float | None = Field(
|
|
133
|
-
None, description="Sampling temperature between 0 and 2", ge=0.0, le=2.0
|
|
134
|
-
)
|
|
135
|
-
top_p: float | None = Field(
|
|
136
|
-
None, description="Nucleus sampling parameter", ge=0.0, le=1.0
|
|
137
|
-
)
|
|
138
|
-
n: int | None = Field(
|
|
139
|
-
1, description="Number of chat completion choices to generate", ge=1, le=128
|
|
140
|
-
)
|
|
141
|
-
stream: bool | None = Field(
|
|
142
|
-
False, description="Whether to stream back partial progress"
|
|
143
|
-
)
|
|
144
|
-
stream_options: OpenAIStreamOptions | None = Field(
|
|
145
|
-
None, description="Options for streaming response"
|
|
146
|
-
)
|
|
147
|
-
stop: str | list[str] | None = Field(
|
|
148
|
-
None,
|
|
149
|
-
description="Up to 4 sequences where the API will stop generating further tokens",
|
|
150
|
-
)
|
|
151
|
-
presence_penalty: float | None = Field(
|
|
152
|
-
None,
|
|
153
|
-
description="Penalize new tokens based on whether they appear in the text so far",
|
|
154
|
-
ge=-2.0,
|
|
155
|
-
le=2.0,
|
|
156
|
-
)
|
|
157
|
-
frequency_penalty: float | None = Field(
|
|
158
|
-
None,
|
|
159
|
-
description="Penalize new tokens based on their existing frequency in the text so far",
|
|
160
|
-
ge=-2.0,
|
|
161
|
-
le=2.0,
|
|
162
|
-
)
|
|
163
|
-
logit_bias: dict[str, float] | None = Field(
|
|
164
|
-
None,
|
|
165
|
-
description="Modify likelihood of specified tokens appearing in the completion",
|
|
166
|
-
)
|
|
167
|
-
user: str | None = Field(
|
|
168
|
-
None, description="A unique identifier representing your end-user"
|
|
169
|
-
)
|
|
170
|
-
|
|
171
|
-
# Tool-related fields (new format)
|
|
172
|
-
tools: list[OpenAITool] | None = Field(
|
|
173
|
-
None, description="A list of tools the model may call"
|
|
174
|
-
)
|
|
175
|
-
tool_choice: str | OpenAIToolChoice | None = Field(
|
|
176
|
-
None, description="Controls which (if any) tool is called by the model"
|
|
177
|
-
)
|
|
178
|
-
parallel_tool_calls: bool | None = Field(
|
|
179
|
-
True, description="Whether to enable parallel function calling during tool use"
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
# Deprecated function calling fields (for backward compatibility)
|
|
183
|
-
functions: list[dict[str, Any]] | None = Field(
|
|
184
|
-
None,
|
|
185
|
-
description="Deprecated. Use 'tools' instead. List of functions the model may generate JSON inputs for",
|
|
186
|
-
deprecated=True,
|
|
187
|
-
)
|
|
188
|
-
function_call: str | dict[str, Any] | None = Field(
|
|
189
|
-
None,
|
|
190
|
-
description="Deprecated. Use 'tool_choice' instead. Controls how the model responds to function calls",
|
|
191
|
-
deprecated=True,
|
|
192
|
-
)
|
|
193
|
-
|
|
194
|
-
# Response format
|
|
195
|
-
response_format: OpenAIResponseFormat | None = Field(
|
|
196
|
-
None, description="An object specifying the format that the model must output"
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
# Deterministic sampling
|
|
200
|
-
seed: int | None = Field(
|
|
201
|
-
None,
|
|
202
|
-
description="This feature is in Beta. If specified, system will make a best effort to sample deterministically",
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
# Log probabilities
|
|
206
|
-
logprobs: bool | None = Field(
|
|
207
|
-
None, description="Whether to return log probabilities of the output tokens"
|
|
208
|
-
)
|
|
209
|
-
top_logprobs: int | None = Field(
|
|
210
|
-
None,
|
|
211
|
-
description="An integer between 0 and 20 specifying the number of most likely tokens to return at each token position",
|
|
212
|
-
ge=0,
|
|
213
|
-
le=20,
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
# Store/retrieval
|
|
217
|
-
store: bool | None = Field(
|
|
218
|
-
None,
|
|
219
|
-
description="Whether to store the output for use with the Assistants API or Threads API",
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
# Metadata
|
|
223
|
-
metadata: dict[str, Any] | None = Field(
|
|
224
|
-
None, description="Additional metadata about the request"
|
|
225
|
-
)
|
|
226
|
-
|
|
227
|
-
# Reasoning effort (for o1 models)
|
|
228
|
-
reasoning_effort: ReasoningEffort | None = Field(
|
|
229
|
-
None,
|
|
230
|
-
description="Controls how long o1 models spend thinking (only applicable to o1 models)",
|
|
231
|
-
)
|
|
232
|
-
|
|
233
|
-
# Multimodal fields
|
|
234
|
-
modalities: list[ModalityType] | None = Field(
|
|
235
|
-
None, description='List of modalities to use. Defaults to ["text"]'
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
# Audio configuration
|
|
239
|
-
audio: dict[str, Any] | None = Field(
|
|
240
|
-
None, description="Audio input/output configuration for multimodal models"
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
model_config = ConfigDict(extra="forbid")
|
|
244
|
-
|
|
245
|
-
@field_validator("model")
|
|
246
|
-
@classmethod
|
|
247
|
-
def validate_model(cls, v: str) -> str:
|
|
248
|
-
"""Validate model name - just return as-is like Anthropic endpoint."""
|
|
249
|
-
return v
|
|
250
|
-
|
|
251
|
-
@field_validator("messages")
|
|
252
|
-
@classmethod
|
|
253
|
-
def validate_messages(cls, v: list[OpenAIMessage]) -> list[OpenAIMessage]:
|
|
254
|
-
"""Validate message structure."""
|
|
255
|
-
if not v:
|
|
256
|
-
raise ValueError("At least one message is required")
|
|
257
|
-
return v
|
|
258
|
-
|
|
259
|
-
@field_validator("stop")
|
|
260
|
-
@classmethod
|
|
261
|
-
def validate_stop(cls, v: str | list[str] | None) -> str | list[str] | None:
|
|
262
|
-
"""Validate stop sequences."""
|
|
263
|
-
if v is not None:
|
|
264
|
-
if isinstance(v, str):
|
|
265
|
-
return v
|
|
266
|
-
elif isinstance(v, list):
|
|
267
|
-
if len(v) > 4:
|
|
268
|
-
raise ValueError("Maximum 4 stop sequences allowed")
|
|
269
|
-
return v
|
|
270
|
-
return v
|
|
271
|
-
|
|
272
|
-
@field_validator("tools")
|
|
273
|
-
@classmethod
|
|
274
|
-
def validate_tools(cls, v: list[OpenAITool] | None) -> list[OpenAITool] | None:
|
|
275
|
-
"""Validate tools array."""
|
|
276
|
-
if v is not None and len(v) > 128:
|
|
277
|
-
raise ValueError("Maximum 128 tools allowed")
|
|
278
|
-
return v
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
class OpenAIChatCompletionResponse(BaseModel):
|
|
282
|
-
"""OpenAI chat completion response."""
|
|
283
|
-
|
|
284
|
-
id: str
|
|
285
|
-
object: Literal["chat.completion"] = "chat.completion"
|
|
286
|
-
created: int
|
|
287
|
-
model: str
|
|
288
|
-
choices: list[OpenAIChoice]
|
|
289
|
-
usage: OpenAIUsage | None = None
|
|
290
|
-
system_fingerprint: str | None = None
|
|
291
|
-
|
|
292
|
-
model_config = ConfigDict(extra="forbid")
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
class OpenAIStreamingDelta(BaseModel):
|
|
296
|
-
"""OpenAI streaming delta."""
|
|
297
|
-
|
|
298
|
-
role: Literal["assistant"] | None = None
|
|
299
|
-
content: str | None = None
|
|
300
|
-
tool_calls: list[dict[str, Any]] | None = None
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
class OpenAIStreamingChoice(BaseModel):
|
|
304
|
-
"""OpenAI streaming choice."""
|
|
305
|
-
|
|
306
|
-
index: int
|
|
307
|
-
delta: OpenAIStreamingDelta
|
|
308
|
-
finish_reason: Literal["stop", "length", "tool_calls", "content_filter"] | None = (
|
|
309
|
-
None
|
|
310
|
-
)
|
|
311
|
-
logprobs: OpenAILogprobs | None = None
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
class OpenAIStreamingChatCompletionResponse(BaseModel):
|
|
315
|
-
"""OpenAI streaming chat completion response."""
|
|
316
|
-
|
|
317
|
-
id: str
|
|
318
|
-
object: Literal["chat.completion.chunk"] = "chat.completion.chunk"
|
|
319
|
-
created: int
|
|
320
|
-
model: str
|
|
321
|
-
choices: list[OpenAIStreamingChoice]
|
|
322
|
-
usage: OpenAIUsage | None = None
|
|
323
|
-
system_fingerprint: str | None = None
|
|
324
|
-
|
|
325
|
-
model_config = ConfigDict(extra="forbid")
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
class OpenAIModelInfo(BaseModel):
|
|
329
|
-
"""OpenAI model information."""
|
|
330
|
-
|
|
331
|
-
id: str
|
|
332
|
-
object: Literal["model"] = "model"
|
|
333
|
-
created: int
|
|
334
|
-
owned_by: str
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
class OpenAIModelsResponse(BaseModel):
|
|
338
|
-
"""OpenAI models list response."""
|
|
339
|
-
|
|
340
|
-
object: Literal["list"] = "list"
|
|
341
|
-
data: list[OpenAIModelInfo]
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
class OpenAIErrorDetail(BaseModel):
|
|
345
|
-
"""OpenAI error detail."""
|
|
346
|
-
|
|
347
|
-
message: str
|
|
348
|
-
type: str
|
|
349
|
-
param: str | None = None
|
|
350
|
-
code: str | None = None
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
class OpenAIErrorResponse(BaseModel):
|
|
354
|
-
"""OpenAI error response."""
|
|
355
|
-
|
|
356
|
-
error: OpenAIErrorDetail
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
def generate_openai_response_id() -> str:
|
|
360
|
-
"""Generate an OpenAI-compatible response ID."""
|
|
361
|
-
return f"chatcmpl-{uuid.uuid4().hex[:29]}"
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
def generate_openai_system_fingerprint() -> str:
|
|
365
|
-
"""Generate an OpenAI-compatible system fingerprint."""
|
|
366
|
-
return f"fp_{uuid.uuid4().hex[:8]}"
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
def format_openai_tool_call(tool_use: dict[str, Any]) -> OpenAIToolCall:
|
|
370
|
-
"""Convert Anthropic tool use to OpenAI tool call format."""
|
|
371
|
-
tool_input = tool_use.get("input", {})
|
|
372
|
-
if isinstance(tool_input, dict):
|
|
373
|
-
arguments_str = json.dumps(tool_input)
|
|
374
|
-
else:
|
|
375
|
-
arguments_str = str(tool_input)
|
|
376
|
-
|
|
377
|
-
return OpenAIToolCall(
|
|
378
|
-
id=tool_use.get("id", ""),
|
|
379
|
-
type="function",
|
|
380
|
-
function=OpenAIFunctionCall(
|
|
381
|
-
name=tool_use.get("name", ""),
|
|
382
|
-
arguments=arguments_str,
|
|
383
|
-
),
|
|
384
|
-
)
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
__all__ = [
|
|
388
|
-
"OpenAIMessageContent",
|
|
389
|
-
"OpenAIMessage",
|
|
390
|
-
"OpenAIFunction",
|
|
391
|
-
"OpenAITool",
|
|
392
|
-
"OpenAIToolChoice",
|
|
393
|
-
"OpenAIResponseFormat",
|
|
394
|
-
"OpenAIStreamOptions",
|
|
395
|
-
"OpenAIUsage",
|
|
396
|
-
"OpenAILogprobs",
|
|
397
|
-
"OpenAIFunctionCall",
|
|
398
|
-
"OpenAIToolCall",
|
|
399
|
-
"OpenAIResponseMessage",
|
|
400
|
-
"OpenAIChoice",
|
|
401
|
-
"OpenAIChatCompletionResponse",
|
|
402
|
-
"OpenAIStreamingDelta",
|
|
403
|
-
"OpenAIStreamingChoice",
|
|
404
|
-
"OpenAIStreamingChatCompletionResponse",
|
|
405
|
-
"OpenAIModelInfo",
|
|
406
|
-
"OpenAIModelsResponse",
|
|
407
|
-
"OpenAIErrorDetail",
|
|
408
|
-
"OpenAIErrorResponse",
|
|
409
|
-
"generate_openai_response_id",
|
|
410
|
-
"generate_openai_system_fingerprint",
|
|
411
|
-
"format_openai_tool_call",
|
|
412
|
-
]
|