ccproxy-api 0.1.4__py3-none-any.whl → 0.1.6__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 (72) hide show
  1. ccproxy/_version.py +2 -2
  2. ccproxy/adapters/codex/__init__.py +11 -0
  3. ccproxy/adapters/openai/adapter.py +1 -1
  4. ccproxy/adapters/openai/models.py +1 -1
  5. ccproxy/adapters/openai/response_adapter.py +355 -0
  6. ccproxy/adapters/openai/response_models.py +178 -0
  7. ccproxy/adapters/openai/streaming.py +1 -0
  8. ccproxy/api/app.py +150 -224
  9. ccproxy/api/dependencies.py +22 -2
  10. ccproxy/api/middleware/errors.py +27 -3
  11. ccproxy/api/middleware/logging.py +4 -0
  12. ccproxy/api/responses.py +6 -1
  13. ccproxy/api/routes/claude.py +222 -17
  14. ccproxy/api/routes/codex.py +1231 -0
  15. ccproxy/api/routes/health.py +228 -3
  16. ccproxy/api/routes/proxy.py +25 -6
  17. ccproxy/api/services/permission_service.py +2 -2
  18. ccproxy/auth/openai/__init__.py +13 -0
  19. ccproxy/auth/openai/credentials.py +166 -0
  20. ccproxy/auth/openai/oauth_client.py +334 -0
  21. ccproxy/auth/openai/storage.py +184 -0
  22. ccproxy/claude_sdk/__init__.py +4 -8
  23. ccproxy/claude_sdk/client.py +661 -131
  24. ccproxy/claude_sdk/exceptions.py +16 -0
  25. ccproxy/claude_sdk/manager.py +219 -0
  26. ccproxy/claude_sdk/message_queue.py +342 -0
  27. ccproxy/claude_sdk/options.py +6 -1
  28. ccproxy/claude_sdk/session_client.py +546 -0
  29. ccproxy/claude_sdk/session_pool.py +550 -0
  30. ccproxy/claude_sdk/stream_handle.py +538 -0
  31. ccproxy/claude_sdk/stream_worker.py +392 -0
  32. ccproxy/claude_sdk/streaming.py +53 -11
  33. ccproxy/cli/commands/auth.py +398 -1
  34. ccproxy/cli/commands/serve.py +99 -1
  35. ccproxy/cli/options/claude_options.py +47 -0
  36. ccproxy/config/__init__.py +0 -3
  37. ccproxy/config/claude.py +171 -23
  38. ccproxy/config/codex.py +100 -0
  39. ccproxy/config/discovery.py +10 -1
  40. ccproxy/config/scheduler.py +2 -2
  41. ccproxy/config/settings.py +38 -1
  42. ccproxy/core/codex_transformers.py +389 -0
  43. ccproxy/core/http_transformers.py +458 -75
  44. ccproxy/core/logging.py +108 -12
  45. ccproxy/core/transformers.py +5 -0
  46. ccproxy/models/claude_sdk.py +57 -0
  47. ccproxy/models/detection.py +208 -0
  48. ccproxy/models/requests.py +22 -0
  49. ccproxy/models/responses.py +16 -0
  50. ccproxy/observability/access_logger.py +72 -14
  51. ccproxy/observability/metrics.py +151 -0
  52. ccproxy/observability/storage/duckdb_simple.py +12 -0
  53. ccproxy/observability/storage/models.py +16 -0
  54. ccproxy/observability/streaming_response.py +107 -0
  55. ccproxy/scheduler/manager.py +31 -6
  56. ccproxy/scheduler/tasks.py +122 -0
  57. ccproxy/services/claude_detection_service.py +269 -0
  58. ccproxy/services/claude_sdk_service.py +333 -130
  59. ccproxy/services/codex_detection_service.py +263 -0
  60. ccproxy/services/proxy_service.py +618 -197
  61. ccproxy/utils/__init__.py +9 -1
  62. ccproxy/utils/disconnection_monitor.py +83 -0
  63. ccproxy/utils/id_generator.py +12 -0
  64. ccproxy/utils/model_mapping.py +7 -5
  65. ccproxy/utils/startup_helpers.py +470 -0
  66. ccproxy_api-0.1.6.dist-info/METADATA +615 -0
  67. {ccproxy_api-0.1.4.dist-info → ccproxy_api-0.1.6.dist-info}/RECORD +70 -47
  68. ccproxy/config/loader.py +0 -105
  69. ccproxy_api-0.1.4.dist-info/METADATA +0 -369
  70. {ccproxy_api-0.1.4.dist-info → ccproxy_api-0.1.6.dist-info}/WHEEL +0 -0
  71. {ccproxy_api-0.1.4.dist-info → ccproxy_api-0.1.6.dist-info}/entry_points.txt +0 -0
  72. {ccproxy_api-0.1.4.dist-info → ccproxy_api-0.1.6.dist-info}/licenses/LICENSE +0 -0
@@ -1,34 +1,38 @@
1
1
  ccproxy/__init__.py,sha256=VrtzUTUA8MwpYqFJAiwKLPxRdMRc7UOzFi2VB_1W9qw,62
2
2
  ccproxy/__main__.py,sha256=kcejcfzAaMnFiSxEiVtNl-_TwynpntkupRxqG5XR15s,116
3
- ccproxy/_version.py,sha256=hcPkC9vIGgfrKK6ft7ysLT7iOCjpFmCBmyKLmXiaZ1g,511
3
+ ccproxy/_version.py,sha256=ESbJO0YD7TYfOUv_WDIJJgWELGepEWsoyhqVifEcXPA,511
4
4
  ccproxy/adapters/__init__.py,sha256=CMr5MPIFigfazoXfhyD2eLqBrutzaSzBaEi8u2i9xJQ,206
5
5
  ccproxy/adapters/base.py,sha256=aufx8ho9LhF0kmTsCvw1a9K3lk5YyYymJV8h_wt5TpU,2191
6
+ ccproxy/adapters/codex/__init__.py,sha256=gwpdJeOfwthwnQWuoHmrOGEY-ntTOF5T6sRY97Si2ks,235
6
7
  ccproxy/adapters/openai/__init__.py,sha256=CEOtyALpgaq6XT6upZKt0u_ilvnXIyH9K2hFXZJ-hOY,1063
7
- ccproxy/adapters/openai/adapter.py,sha256=qjo3bbNIQKlzxLt8r51gv_Se1ShuJREisFyboOcLs-E,37958
8
- ccproxy/adapters/openai/models.py,sha256=tg5NLFmTAOjLd2-gjqRQPU3IkL9ATftXv4ZugGw-rwc,11645
9
- ccproxy/adapters/openai/streaming.py,sha256=9EcqK5XebN7JRpB3MddR_VYeejkIKlMVFaYxMCeiOko,23218
8
+ ccproxy/adapters/openai/adapter.py,sha256=8g9jBtEET_NEZKt27prw_Go9WMS_BJUoxyvhoMk74-g,37960
9
+ ccproxy/adapters/openai/models.py,sha256=He63JFWe_DZAYbGVy69b4EE9ihQ8j2DxNjr4dmz30N4,11659
10
+ ccproxy/adapters/openai/response_adapter.py,sha256=2X_sMpc03gQkz-ckGcPUKkldv3U9g9v5KFY7owncf1Y,14367
11
+ ccproxy/adapters/openai/response_models.py,sha256=NunShPmyHPhGrfU0az3k4dUQbYGMt1SfjwU0mRQAWpQ,4715
12
+ ccproxy/adapters/openai/streaming.py,sha256=-nhKVPqCfAlV8PDi5-q3dVyslCpAu5DHh0BCrBfb9GU,23219
10
13
  ccproxy/api/__init__.py,sha256=_u4wpzvN4Y0qS4CTaGp8nD8ZopB0HeFxnIIw9GYjvvk,527
11
- ccproxy/api/app.py,sha256=sfIBoDhRw17a40qsQ6vlCgAtcJG0IOQcIMEsQCwruwg,16157
12
- ccproxy/api/dependencies.py,sha256=e4vgUaRULPlOWUPF5ZcS5UJNCXdBORklfIw7-FFX4IE,6162
13
- ccproxy/api/responses.py,sha256=eipdbHLQcrUjBYJd-Q5bEWUoiFlmPiDB0wdySFNubx4,2905
14
+ ccproxy/api/app.py,sha256=aoQyl359AgyUvpx4BqcykLCCtnwDZ5MWNyCYWg6aWzI,12377
15
+ ccproxy/api/dependencies.py,sha256=-oGT8XSXpyyxenUMXTs5Ap3wJRbda4mfDagDW01pkoE,6989
16
+ ccproxy/api/responses.py,sha256=97TUQ8KF_eKLBRWgAnziGZBjBfJtY13cjgM_o0k_lDc,3062
14
17
  ccproxy/api/middleware/__init__.py,sha256=S887PXY40Tnb0IFGei4Sgs7sygkcoT0IEOciOO7IDBc,284
15
18
  ccproxy/api/middleware/auth.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
19
  ccproxy/api/middleware/cors.py,sha256=u8bnWmBXRG9J2etbQdNsQOTIQY6PFWawk2Oa0Ei1x3s,1666
17
- ccproxy/api/middleware/errors.py,sha256=WsFLkoe3TMD5hjmhKWWcMEJVX9NAWEudOcujciL22o4,21909
20
+ ccproxy/api/middleware/errors.py,sha256=YMfg5ovad7BMAiGK-66BCVacLveRX5ylJIRr1BFf3lE,22939
18
21
  ccproxy/api/middleware/headers.py,sha256=zGhF3F11TKeb3zY5qzblU3Sdwx1MSlqm2QSOqtVfpoY,1775
19
- ccproxy/api/middleware/logging.py,sha256=NDkIjIIQlAjr4m8nCXOe9na2Intc1Q_aYQZ2zWACeZw,7069
22
+ ccproxy/api/middleware/logging.py,sha256=fGHacI_vRtQs9LpKpCebVUpo7bSC6qy4hbqftmLe_Uk,7353
20
23
  ccproxy/api/middleware/request_content_logging.py,sha256=aIH1G9kjNr4-O5IFoisI9fO93rPePVWBQJM4wX1NCnY,10333
21
24
  ccproxy/api/middleware/request_id.py,sha256=OOZh63FYP_JY3olZNzgzVdPFZUJFT_KerZxYMxsPmyQ,2538
22
25
  ccproxy/api/middleware/server_header.py,sha256=9A3c7L12CFkQftMOZwB5JzqocGWymuV8AT_u_Y2s9RA,2329
23
26
  ccproxy/api/routes/__init__.py,sha256=xXoslArg915ZTmN2ITQ-i3iO7fu8ZkQAMrSgC41U5oA,664
24
- ccproxy/api/routes/claude.py,sha256=hA6SPyuZbkUq8JoSKnvceN1j211uGNuNdsye8dM_TXQ,6498
25
- ccproxy/api/routes/health.py,sha256=6eIoZ5oCBG8npDXqTnAU-rLWgO53b4E6SA0l12bAkjA,18932
27
+ ccproxy/api/routes/claude.py,sha256=lERvCRFiHfhfQC6uYaUSRwplSRvUbn3of0tACYib4x0,15079
28
+ ccproxy/api/routes/codex.py,sha256=j4_ykiRgEOm5YBUrTEg-vhL6rHeaXS8SKxMj0fXM3HQ,66743
29
+ ccproxy/api/routes/health.py,sha256=TWs7ipKDynwfG3Cj5X8BMoglyTP9zEPz5cDq1-vDiHQ,26518
26
30
  ccproxy/api/routes/mcp.py,sha256=-EVGid0uNOWeXP4w8F_hKUp1odkNnFXPHPmaOGC0UzQ,5389
27
31
  ccproxy/api/routes/metrics.py,sha256=MHG2nEGu3amrU6zJCuH2RktM8kg2EFxu4xNOFCzXMn4,40813
28
32
  ccproxy/api/routes/permissions.py,sha256=dvbWORmmAce7VZWlZPvchTCO9F6fauavmSbs8hUltKE,6231
29
- ccproxy/api/routes/proxy.py,sha256=sFOS62sEqlr_xkTr9fg-eSQMuUflnnDdkEvHj4Fx8es,7373
33
+ ccproxy/api/routes/proxy.py,sha256=flx4fyhYFsZvImLbwXy2qSEVVnlOA8xc0uR0T3-hUBI,8364
30
34
  ccproxy/api/services/__init__.py,sha256=_n4k1Ciao8BEbiMBSldq82nbs7N8qXu_1TcBwWLV8bE,167
31
- ccproxy/api/services/permission_service.py,sha256=x7YDTsxHKSbF8QoCEUwfemPIXXOQ4mJSjXBJSSu1pBg,12022
35
+ ccproxy/api/services/permission_service.py,sha256=mG6HGRQ5sly9rfA8ii601Rx5R-MunVAjOy3ky8Jqsoc,12024
32
36
  ccproxy/api/ui/__init__.py,sha256=oEgfWr8pgSO7uHYQBchJ2QspFrFsqTCO8mLPlfhHTfU,147
33
37
  ccproxy/api/ui/permission_handler_protocol.py,sha256=_jZAQ1KN5dK1Z28jqaW90Ggt8usVTR1P7pEKPWGN9SY,972
34
38
  ccproxy/api/ui/terminal_permission_handler.py,sha256=GuD_RyQCiuxJtFJI-SKsWPvw1brz1_IGz31YjLVQ9js,20195
@@ -44,23 +48,34 @@ ccproxy/auth/oauth/__init__.py,sha256=PEymCot9_oIj2mKFIyfmIlznoKwoBuSKqfRvH9k_QR
44
48
  ccproxy/auth/oauth/models.py,sha256=CIgzXpyf5PY8vnO8jkv3cfr1W9rkT5qtkz_u2xGabV4,2007
45
49
  ccproxy/auth/oauth/routes.py,sha256=9sWaib49v5MFv_FFsnlgTXqgwvGprWWwpJzrSihKaks,13598
46
50
  ccproxy/auth/oauth/storage.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ ccproxy/auth/openai/__init__.py,sha256=Af7h3n3xGmCKO7FsSA1sdNBWfjajd5l5ccMArn4U8E8,328
52
+ ccproxy/auth/openai/credentials.py,sha256=Jz8PA9OFfBZXh-DSARI-vM6buNtci5ObmFUNb5MqIko,6088
53
+ ccproxy/auth/openai/oauth_client.py,sha256=Wen_FTN0Lo2BMydQ23LipJZHDVl4RToXED5G4Vzcixc,12146
54
+ ccproxy/auth/openai/storage.py,sha256=8GwCnw29_zTVL7LMqfX2KsszcEFVo9nT9TCbGsBEexQ,6433
47
55
  ccproxy/auth/storage/__init__.py,sha256=5thfvXhc8HGJblQWMiG6ZPl594RpbTGdAgyAlpAe1TI,324
48
56
  ccproxy/auth/storage/base.py,sha256=Gw20tabOKTwey6YrOm09Bxu-MYJuMIrQULLJT6RQ07E,1357
49
57
  ccproxy/auth/storage/json_file.py,sha256=iZBFCJ5EsZeFtlT7ORTXcEdAvMADIaDTXUPEBSjMcr0,5027
50
58
  ccproxy/auth/storage/keyring.py,sha256=qg4q-O-Y6D7y4HQfgg5g9bhUpuD9DAec9npWne0VLwg,5950
51
- ccproxy/claude_sdk/__init__.py,sha256=4r3KBqL5dXo6NI6hu8RjIRMm18OkOLCVJoKgDaAZQ8A,487
52
- ccproxy/claude_sdk/client.py,sha256=KxUJ80WmBNlV6HgD3GNSDf0fDOJpuZfXjKf-S3IVo4s,9397
59
+ ccproxy/claude_sdk/__init__.py,sha256=b794sieTPU1HEH_CmtqFK1be_p-bMUopi4v8gxRET9M,482
60
+ ccproxy/claude_sdk/client.py,sha256=YPgi4Uql8YW_fKFA6TAAmy5aDA-T0F5T_HJf7o9bbLY,29799
53
61
  ccproxy/claude_sdk/converter.py,sha256=GeU7AzbzK1ltaiUEr60mG4VYaSup95Z6OxVSG9Pu0PY,19035
54
- ccproxy/claude_sdk/options.py,sha256=ClgmCHPS0nljYK3OiZx72Sq09mjUQMHS1hnOrUW7Hbs,6821
62
+ ccproxy/claude_sdk/exceptions.py,sha256=LYUmy4K4TnrOixINScswc-Xg31gZJbbFimZgw9hIfy4,428
63
+ ccproxy/claude_sdk/manager.py,sha256=UuUhFNSF6UTaonmllHzwORwrXjcv1k_DwkHmsYJUhqY,7319
64
+ ccproxy/claude_sdk/message_queue.py,sha256=V2BU2Wdsdfb-TyfvOzYMszeEcdcBmVkiqB52IjS_oM8,11136
65
+ ccproxy/claude_sdk/options.py,sha256=NVyQc7_CxhC2UsavNtrLZ6pFIVwHaHv6euyc44TFYj8,7097
55
66
  ccproxy/claude_sdk/parser.py,sha256=1LcZOTkaKLSxZO_iVIvpZq44vUjApvMIA8Wlv61V6Jo,7193
56
- ccproxy/claude_sdk/streaming.py,sha256=n-lUoihuTcanl8E_feuQPF2-dTCfNNsf5nevLc3si-4,12581
67
+ ccproxy/claude_sdk/session_client.py,sha256=ipKvWyFx7nCI4n1VHbCsqbSjo5HdMC1P2lrX8fkTy8g,20052
68
+ ccproxy/claude_sdk/session_pool.py,sha256=BX0I4TdtgfVDEJozjmoSQTls24s-3KfFNTSSAgmA9LM,23993
69
+ ccproxy/claude_sdk/stream_handle.py,sha256=bu2WjWZmhRFyzhjH4UeYe9NmFeAonR9zBfyDirJJ1XE,20576
70
+ ccproxy/claude_sdk/stream_worker.py,sha256=CjyzNDVIFvoPLMXfmF6juJlxRYpiRRBM-IS3oQuEPpc,13429
71
+ ccproxy/claude_sdk/streaming.py,sha256=FjyLKS1fbBLf3hXtBhwyZzmSvWvOMxOZqrIxQDul_ik,14765
57
72
  ccproxy/cli/__init__.py,sha256=_vISKEqzAsAYrTZ-j9ScxTUtFZp3RVRbIvGpCcu--SU,262
58
73
  ccproxy/cli/helpers.py,sha256=LHGh5ZSywPUY61XVaSD5mx2eaIF4bi8hzbdMCJ0YRrQ,3814
59
74
  ccproxy/cli/main.py,sha256=QLdSbSm3PjvwluL6WO7kpe8S7qrgsw2VjMR84aZ2fsg,2452
60
75
  ccproxy/cli/commands/__init__.py,sha256=eWugiC37ualVtsTazu7GBCV7kZ12xkAnTUztjV7kVao,200
61
- ccproxy/cli/commands/auth.py,sha256=crpPeJ5Xs5I-xl5BC27HUJxlTHgcjL7GeMH0e31DXQc,20716
76
+ ccproxy/cli/commands/auth.py,sha256=oAA37cGo6SgGtunDaqf5n8QgRtmvvEajF8bHtD8c-nI,34987
62
77
  ccproxy/cli/commands/permission_handler.py,sha256=rdPxXCZ3pK6a93eKED2XFNIwtnNcTW5XjM-X7edBcb0,18463
63
- ccproxy/cli/commands/serve.py,sha256=EZQCZiFWZixYA6_uY6Lthuktb50l-cx12lVn33S2rTU,29192
78
+ ccproxy/cli/commands/serve.py,sha256=ZNYrODXcJaHbrT8Vv7vi8bNKXKe7f81RSYveroD-Hh0,32951
64
79
  ccproxy/cli/commands/config/__init__.py,sha256=uX8VewtrMu5X8VAx5ym1slwNtlICDBEs3S1HfoFe5Qo,376
65
80
  ccproxy/cli/commands/config/commands.py,sha256=ukAr55NLFTg67f5czpjbuz_Ap_mwFIMIfMGHeXv_E5c,28917
66
81
  ccproxy/cli/commands/config/schema_commands.py,sha256=ZSuK_Q1bWp8WUOSbkuwKz_4TwrxkRsA6MOt_-y1eiVs,4218
@@ -68,37 +83,38 @@ ccproxy/cli/docker/__init__.py,sha256=4x9QO8SF9aloJFs4xrUEhGcSmoosIYmjcMTk4-GnHB
68
83
  ccproxy/cli/docker/adapter_factory.py,sha256=dbO_MGrrAsyF0DDZMKbrk4oMx2xAMZPihOAviF7D5zY,5022
69
84
  ccproxy/cli/docker/params.py,sha256=cAkszIkS6lztpXxRuHRGBseA0n6n-huwyydDRKUHjSM,7378
70
85
  ccproxy/cli/options/__init__.py,sha256=OiToWXDNOXnO-fuPz2H5qXYwp9ht7uB12-4wxqner1Q,340
71
- ccproxy/cli/options/claude_options.py,sha256=co3kyNxjH9brYcV7xRNU38Rd7BhqwQeRnXqRM4ZJKQQ,4222
86
+ ccproxy/cli/options/claude_options.py,sha256=zkH0YHf_KLmkgkpIQsO-0C9IKFri8wxqrgKk0c2UEB0,5885
72
87
  ccproxy/cli/options/core_options.py,sha256=80qVieUiUMYwjDKVeFfBDGjF1a8P1qB8Ppf-zSZ1eek,552
73
88
  ccproxy/cli/options/security_options.py,sha256=95TfENdeAsDMes7SH39mQJERgrqoL4jZEKvZL7NlzJQ,873
74
89
  ccproxy/cli/options/server_options.py,sha256=y37dtZGWuuYcDOn92zSzKwblnTgq65ZJJk2fWBA__s4,1935
75
- ccproxy/config/__init__.py,sha256=RVXg7sdADdX9-Z-67OYoNlQxby6UN9tThNtg_XzjZ1I,976
90
+ ccproxy/config/__init__.py,sha256=OGN54wL_XB-vP-g603NhqsSxYvKEXvBXVuEIxLV_tb4,891
76
91
  ccproxy/config/auth.py,sha256=CDc5qiexq4jH3Ve39tnL1Vn5c5bOUBWUdi7j4VLwewU,4653
77
- ccproxy/config/claude.py,sha256=2rOxpULXckJasTpeEUlUu0IAeVPAkH8XkEJRTZnmuS4,7139
92
+ ccproxy/config/claude.py,sha256=p_J9khK_aD6nQVQDeKUpU7JFaAqEduP_wemKgZqjpt4,12486
93
+ ccproxy/config/codex.py,sha256=zzYwZZeIZgcYSxyqv97oOUEGBf0Pqv_ZNQoMWoJ8lF8,3145
78
94
  ccproxy/config/cors.py,sha256=eNxrNuPN7Ujh9_2fIWu6kmOIeYNuqn0NTuCsBYvctFM,2505
79
- ccproxy/config/discovery.py,sha256=ZwByXmmSq14ScRwXe1slHWvg5pLWFxXWxvGNFkZxRik,2255
95
+ ccproxy/config/discovery.py,sha256=lz5L0YcyVruZnXOxEXOD_4zg0k4W-woOGML9zwpmexQ,2487
80
96
  ccproxy/config/docker_settings.py,sha256=5D8eBSyWActgBGE7cIb4HObqlvE-7jxylmUBn5UxLM4,8390
81
- ccproxy/config/loader.py,sha256=kgeShuaeNjTHI7lX2VWSFlE4ugOJW9HAT-FJesKLegE,3100
82
97
  ccproxy/config/observability.py,sha256=5AwQFEFxJLUStGP5gjL_5i8Hk8KdrXKY7ocITYg8jZQ,5466
83
98
  ccproxy/config/pricing.py,sha256=RzsNQHYmv5P-BcRDV4GSkSIDImFIFEEC7roFu5jeocE,2613
84
99
  ccproxy/config/reverse_proxy.py,sha256=hep4ubV7-4ZgdO1_WqY56b5yrYyHCdQgYayUHKH3tfo,866
85
- ccproxy/config/scheduler.py,sha256=RNexGYY2yUg7rt1jgmMAfLg-1dT3YejTl2qNIsp8w2U,3060
100
+ ccproxy/config/scheduler.py,sha256=Lee8g9tSimACRFk3rGBiutEYJcxvnu7KrSwTx2WsRZ8,3194
86
101
  ccproxy/config/security.py,sha256=luNy1J6xXSKPRjAVTmF1mqSpN4h0I_1CllBJfaYbq0Q,493
87
102
  ccproxy/config/server.py,sha256=71Ih6huVn52demV6jNrixM8jqXVqfFrBpIvWIlmhlww,2527
88
- ccproxy/config/settings.py,sha256=jTo3nXMaePKCJqAV4Ejv9-q39t4fKxAUHsssxSMOf6I,17798
103
+ ccproxy/config/settings.py,sha256=0yht-uCZdEfzG2I1YYJ_YiXCTO9yv0sh1iTe8N4GLBw,19052
89
104
  ccproxy/config/validators.py,sha256=EciRiEF7qGBcDp2Ms10VXyfAWXY_2uPPglvGh7EVLDs,5754
90
105
  ccproxy/core/__init__.py,sha256=ZreOdlUlCn7R5GlS3EdpvIj5fO9sySbQKnuR8o6vwXI,6400
91
106
  ccproxy/core/async_utils.py,sha256=slRQkIGctjZb6ZxridoJscFKVbyW2SYREieQjkpP_e8,19855
107
+ ccproxy/core/codex_transformers.py,sha256=4awSlBkefsF4ouMWIj3ZR8mbO6ccCddaGTyxOKXzEaQ,15182
92
108
  ccproxy/core/constants.py,sha256=mmkcOfKNnvu3h5paZ6GL72ecAK4XdBI4tXlmgImGyzI,2735
93
109
  ccproxy/core/errors.py,sha256=gP1rh-k-KpE5OcVbFcdMdZSmDshvcoXdbVynIx864gc,8459
94
110
  ccproxy/core/http.py,sha256=pj3UM9TDL13_sU0ULGuA2wvVg58uxOCy-ib3zugjelo,9317
95
- ccproxy/core/http_transformers.py,sha256=jx4mcK6mAw9-Y4IkQGlW_S6L2sg1230y2pchJwztlas,16324
111
+ ccproxy/core/http_transformers.py,sha256=LF8LZRwklJoGMtx9_JhxZkFAfNf-V6n0hL9bNcmmFmc,31216
96
112
  ccproxy/core/interfaces.py,sha256=zzucgNTvui7fGQ8vjLzCba-itJZh0Fs6GrDAZNJfGXo,6366
97
- ccproxy/core/logging.py,sha256=_KdCkabhJmPjapxenJcXNHsSybzPboSqASGem1bcKGY,6801
113
+ ccproxy/core/logging.py,sha256=xwWsFTqGLrGrjQzgV2MphrwHg4i8YDW591xlhUGl7l4,10171
98
114
  ccproxy/core/middleware.py,sha256=libv7wo-y9nni9hp7GCkYUKlIKihAwG0iHvjcv_RTs8,3355
99
115
  ccproxy/core/proxy.py,sha256=6lFqNiGFQFlh61q32imbUD-RJAK2RJHJNyYLwAmUYr0,4615
100
116
  ccproxy/core/system.py,sha256=91rMtlRtY4yxSsnPV5qZJaXHNFzvcrRZ1nQwS4CwG68,1019
101
- ccproxy/core/transformers.py,sha256=Ubv6Vcq_q1Myrn-mns06AkBRt4kiTid2Ww_cmv2DPVA,7699
117
+ ccproxy/core/transformers.py,sha256=BpOweWwpuUKEsLe32zqqTN0iNPRVXjyAoW1jBPSO0C8,7884
102
118
  ccproxy/core/types.py,sha256=kGRMzb6VI5KWa3aFKWgQ3gChqdHPrPoOyZ0QPT1m18E,3554
103
119
  ccproxy/core/validators.py,sha256=k2z71lz-zKhRdtx3tYgJllqFnEcQ-eivj1kf3aVej0s,7367
104
120
  ccproxy/docker/__init__.py,sha256=gO9FJepIWneXPANgsAJKx_VL9rt7pcX3hbRcwnSyzJk,1833
@@ -110,23 +126,25 @@ ccproxy/docker/protocol.py,sha256=uFJvKfTYhO8ROUo_tcMIuXYqhjK-eFIJV-U5Bora-jA,65
110
126
  ccproxy/docker/stream_process.py,sha256=XahXegGG6B-7RsZAb9J8OA7sz7xi8CmRzEI4vBJLwTI,9071
111
127
  ccproxy/docker/validators.py,sha256=OY-dkU88CLIeMBfv4P5QoVB7miQ8BD7kIgaMHxF7TsU,5764
112
128
  ccproxy/models/__init__.py,sha256=yaz9lC0roh0u7C33rHrGW46lrwbyyAa_evpAlA5BzYw,3548
113
- ccproxy/models/claude_sdk.py,sha256=iUACoZQS_29OjjG-A6FNslL_J_IKFtJdgabxs3FIhNk,13893
129
+ ccproxy/models/claude_sdk.py,sha256=T-6HpAPe2a17sd27HE7ttFENh2JxwrFrnGBwMwDwovs,15522
130
+ ccproxy/models/detection.py,sha256=LRlimMQwPjrxczER7liospxkcskhLS5QiJS7EStEaHU,7082
114
131
  ccproxy/models/errors.py,sha256=B2rbL-17ZI9emDOca2A2fLOcH1-_77t_xqDmiPf6fgY,1329
115
132
  ccproxy/models/messages.py,sha256=halc96Yxx3R5Xa9F5Q53iFZs0MJMDRfAA0fSxaij51U,8013
116
133
  ccproxy/models/permissions.py,sha256=uhlzHc56rDzekjQMN8ITPCrh-0lamcgzTwx1OA2y67w,3612
117
- ccproxy/models/requests.py,sha256=k4oeGbSCsbm3E5_3JT4h7hjrkSsgNgLIlb99BypSoHk,2738
118
- ccproxy/models/responses.py,sha256=4rJNCbCoQtjiRzwoQLwK-sVJT2HFsZ2U6Vw63CZ1ztw,7820
134
+ ccproxy/models/requests.py,sha256=iUVHNMs5tCnEBENFmM0nxA9_-b-k8pSDwpLgJU0ce_8,3532
135
+ ccproxy/models/responses.py,sha256=Z0JABm5BaoW0AEM-wriGqWIikY8cJ9ZW9lZPRHX_Zx4,8410
119
136
  ccproxy/models/types.py,sha256=27MUg7pVGrK5oWzcrtG_IAoScEcrF20thO94bxZXQww,2729
120
137
  ccproxy/observability/__init__.py,sha256=5n9yQBbMLAQVAEJZD-2t4CKfI0Wx2aoDH7d2ynPM4bg,1503
121
- ccproxy/observability/access_logger.py,sha256=q6-5pdzZzW-jAZPIaiAeqoYXp8HrCw93F80OoM0XJZU,13095
138
+ ccproxy/observability/access_logger.py,sha256=h23GbxRYhPz26-z3rQfFSg12lqwssiXEkJRNmyBJspQ,15755
122
139
  ccproxy/observability/context.py,sha256=sfOdhgLY6LxLzOkJuzjqBsZV2e8ozAiYp79bhE2oqG4,14581
123
- ccproxy/observability/metrics.py,sha256=4D4cz9Ns8JjAX9_RHo7Z7bQA9xfeEZkUL7T9HMy4OTg,16150
140
+ ccproxy/observability/metrics.py,sha256=460SDpwQEpIpHPgg7vA6BhZPcYVhyQEpP20k_qZhUvI,21017
124
141
  ccproxy/observability/pushgateway.py,sha256=t7jGCP7dQirBjQyX-nz4S6MKKIHErU9yQMqgfCiP0BQ,12708
125
142
  ccproxy/observability/sse_events.py,sha256=CVumUxVlXV5tpqVozymaLW4pBTEM90KBYWS9jAJ6Dzk,10697
126
143
  ccproxy/observability/stats_printer.py,sha256=-QSiAMiurQlMzdMQcS0bNcswm5dDaIzTeS1bUqMeVQY,30110
144
+ ccproxy/observability/streaming_response.py,sha256=I9YsCdOMFR6gEkAoDkaGJO0kF1mdZHMrHYvbn45mzyo,4157
127
145
  ccproxy/observability/storage/__init__.py,sha256=iAnhODA2PD3PxheoRgJv5KFCTUK_QwxxFa2Ne230RTg,47
128
- ccproxy/observability/storage/duckdb_simple.py,sha256=lnENvs8p1OMaicsYLn8U5lPeCd0pOhjvNUN_HFqRekA,24789
129
- ccproxy/observability/storage/models.py,sha256=6q5yuVwHXZZfXdT9VDYOevgi8psLBMJnuCVHKBc4TTk,1423
146
+ ccproxy/observability/storage/duckdb_simple.py,sha256=pHcz8D7fJ0Qrhj4W0iN1TGTOIHxF_HKpyTHruTCTlUQ,25441
147
+ ccproxy/observability/storage/models.py,sha256=Xca4z6rCRB3HjCm50Wwge96MFAUoUKF9f6S_lGdBzHE,2307
130
148
  ccproxy/pricing/__init__.py,sha256=8EKUTusWT_URBO8_jzHQ2JWIv11JYZxiyk1WoA_slHE,450
131
149
  ccproxy/pricing/cache.py,sha256=j0X0VWICAV2WPWSY8TQTsRZ04fX0_tuegJRp9Lw7Dgk,6506
132
150
  ccproxy/pricing/loader.py,sha256=F7Ciu39xBdY6QqUbDNNM2FmX0zqFhrMCed_-YLkLdvI,8633
@@ -135,12 +153,14 @@ ccproxy/pricing/updater.py,sha256=OKbozb2SIe4yrwWVsQd5ryopZrJ06mIDP6y166-l_tg,10
135
153
  ccproxy/scheduler/__init__.py,sha256=qVe6NeKPn6NgMqEaG4_K4cYZBCpbFM7g6ptNPEzhi8c,1160
136
154
  ccproxy/scheduler/core.py,sha256=Lvhc3i2bfbEnX-2n8lgDBM7YG7TKEnZC3tf8KC5u67M,10344
137
155
  ccproxy/scheduler/errors.py,sha256=k7dcid0_te7IwwQaad-Jkj7MWFBgIOdgD_y_n5joio0,817
138
- ccproxy/scheduler/manager.py,sha256=-A6y9ANFHcQeGIlb9ABY4jGBxwPZbdxLPQDpLvKuQew,6879
156
+ ccproxy/scheduler/manager.py,sha256=C6nS7PB9_YHfWiqhXnsHeYsTZKeJ1ZZKSD53JOQfuBY,7811
139
157
  ccproxy/scheduler/registry.py,sha256=MaCuOEiJiYjlKS2Yqp3PxeWXpf8AqNPCQ_qeWbWtBCw,4058
140
- ccproxy/scheduler/tasks.py,sha256=JJoG9zfdI8jg53xy-9iUaFdM5pD1E1Z-j8S6OHXl0BI,20595
158
+ ccproxy/scheduler/tasks.py,sha256=ROIRQcrB3zntZDJ53pabK53a18bPaHYJI1TvS9wwRAI,24944
141
159
  ccproxy/services/__init__.py,sha256=ZvnelD15eFLlWHsucYXBFGNrdT7ncdP1KLnqzJNGOCs,251
142
- ccproxy/services/claude_sdk_service.py,sha256=CL29KwAVPhogimB-Z7lwSkl32m-6kLv3xD84t603MuI,17727
143
- ccproxy/services/proxy_service.py,sha256=2QSQ92uag5j2NFxgcHVuxFVK3SlmiufqVWaWpyK5VaM,55650
160
+ ccproxy/services/claude_detection_service.py,sha256=aRg_aSucpi07DLzIKfDbLGYzjCLUXSpVScYcjLgSKbM,9941
161
+ ccproxy/services/claude_sdk_service.py,sha256=IuT4XP116fXzk20SUiYhKiKRoOxeeo7jlGzKVLH2NEo,25954
162
+ ccproxy/services/codex_detection_service.py,sha256=eQQF9defiGfPtSpaOwXHojtFzKeQdc3DafR0oG9bNrE,10265
163
+ ccproxy/services/proxy_service.py,sha256=qhVccFnnT2uz3VrVN2ZDBtkRFeL5qR3pgZSsIvLI3co,72656
144
164
  ccproxy/services/credentials/__init__.py,sha256=fkCWqxlUyGVA1mxGicn4cvdbYJQo09SG9NoGKzUun3s,1394
145
165
  ccproxy/services/credentials/config.py,sha256=97W3GqtxZlBv45oDHJ-plsHiSeFvNI-FTMZEw4CsPes,3221
146
166
  ccproxy/services/credentials/manager.py,sha256=AnRvl1_v-eSbAEcmHMcUMmo7UpvTnAHe9QO5caL1JMY,19905
@@ -152,15 +172,18 @@ ccproxy/testing/content_generation.py,sha256=in2F_W1RSnQYKXYCavMrYXPLBrqVn_Bogx8
152
172
  ccproxy/testing/mock_responses.py,sha256=GaegneKCVJSxoptLCUseriZ_wV_TfRnpD-vB0t60N3M,9200
153
173
  ccproxy/testing/response_handlers.py,sha256=TSfBHzHLw8d3Y95zJ8wYewU9f5Wh89bl7DRfa-49ze0,6311
154
174
  ccproxy/testing/scenarios.py,sha256=lVTkf1TbqPnWAfY2VbXez6dSFHsohuXerDmh37iC5VU,9200
155
- ccproxy/utils/__init__.py,sha256=MBEWNgdZh4Ev-LcltUhkMBboR1QHYNeri3oOy1KQeDo,213
175
+ ccproxy/utils/__init__.py,sha256=klTwpS5lbhi0Bg6QXIbX01-7oXaLoGjhHf1MKq_4aQQ,431
156
176
  ccproxy/utils/cost_calculator.py,sha256=mHquyA_1vnPVZ2smjdPwThCJtGu-rF9n8ZvIrAwTF78,7276
157
- ccproxy/utils/model_mapping.py,sha256=7TA3Jew_lg4IqMvoOvalDo1Vzozjb_Zq4749hPgPZGA,6602
177
+ ccproxy/utils/disconnection_monitor.py,sha256=EOKJoTD_wDZ-l-yoOqx6Z488NZm2fFKW3KOwKlTELkE,3128
178
+ ccproxy/utils/id_generator.py,sha256=k6R_W40lJSPi_it4M99EVg9eRD138oC4bv_8Ua3X8ms,301
179
+ ccproxy/utils/model_mapping.py,sha256=RYhUXViV8ElqdURKVsOXzggPFORVmQ6Mb3b3_FpN4Cs,6621
158
180
  ccproxy/utils/models_provider.py,sha256=F0_nwNsx-gGhobdTnPQh9zfrhOfw7cBrW2RR09SYY3Q,4434
159
181
  ccproxy/utils/simple_request_logger.py,sha256=d54aXW_0P7zewGRzjwDu7QfJ-DGn4zJXu2R5hGXh-rU,8223
182
+ ccproxy/utils/startup_helpers.py,sha256=U_2cXrGjqsJeFKFvbWv1PLyAsqsIBFRvdZtqQx8NuBs,17529
160
183
  ccproxy/utils/streaming_metrics.py,sha256=JkvmWJ9s1fuKi7x1NoSoderUuT-mU6MQfbnN5GmziYE,7761
161
184
  ccproxy/utils/version_checker.py,sha256=D-6a5qV9sPTqkTZHucHZ-xCd8Wdy29lxnVgcvdBs10w,4839
162
- ccproxy_api-0.1.4.dist-info/METADATA,sha256=cTANN5y2tXKtPtQ_VMGs29EDiSBjoLT_8htnN9tVv70,12170
163
- ccproxy_api-0.1.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
164
- ccproxy_api-0.1.4.dist-info/entry_points.txt,sha256=XLke7uRmx6c1G3Ejnvm74x_eTKKtCgRRSk1dXIBFyg4,128
165
- ccproxy_api-0.1.4.dist-info/licenses/LICENSE,sha256=httxSCpTrEOkipisMeGXSrZhTB-4MRIorQU0hS1B6eQ,1066
166
- ccproxy_api-0.1.4.dist-info/RECORD,,
185
+ ccproxy_api-0.1.6.dist-info/METADATA,sha256=uR2plX41kRBhteFipv5lAn9V9jG_iLxAUxEKFmvEfgg,21136
186
+ ccproxy_api-0.1.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
187
+ ccproxy_api-0.1.6.dist-info/entry_points.txt,sha256=XLke7uRmx6c1G3Ejnvm74x_eTKKtCgRRSk1dXIBFyg4,128
188
+ ccproxy_api-0.1.6.dist-info/licenses/LICENSE,sha256=httxSCpTrEOkipisMeGXSrZhTB-4MRIorQU0hS1B6eQ,1066
189
+ ccproxy_api-0.1.6.dist-info/RECORD,,
ccproxy/config/loader.py DELETED
@@ -1,105 +0,0 @@
1
- """Configuration file loader for ccproxy."""
2
-
3
- from pathlib import Path
4
- from typing import Any
5
-
6
- from ccproxy.config.discovery import find_toml_config_file
7
- from ccproxy.config.settings import Settings
8
-
9
-
10
- class ConfigurationError(Exception):
11
- """Configuration loading error."""
12
-
13
- pass
14
-
15
-
16
- class ConfigLoader:
17
- """Load configuration from multiple sources."""
18
-
19
- def __init__(self) -> None:
20
- self._cached_config: dict[str, Any] | None = None
21
-
22
- def load(self, config_file: Path | None = None) -> Settings:
23
- """Load configuration from multiple sources.
24
-
25
- Priority: ENV > config file > defaults
26
-
27
- Args:
28
- config_file: Optional path to config file
29
-
30
- Returns:
31
- Settings instance with loaded configuration
32
-
33
- Raises:
34
- ConfigurationError: If config file is invalid or cannot be loaded
35
- """
36
- config_data = self._load_config_file(config_file)
37
-
38
- # Environment variables take precedence over config file
39
- return Settings(**config_data) if config_data else Settings()
40
-
41
- def _load_config_file(self, config_file: Path | None = None) -> dict[str, Any]:
42
- """Load configuration from file.
43
-
44
- Args:
45
- config_file: Optional path to config file
46
-
47
- Returns:
48
- Configuration dictionary
49
-
50
- Raises:
51
- ConfigurationError: If config file is invalid
52
- """
53
- if config_file is None:
54
- config_file = find_toml_config_file()
55
-
56
- if config_file is None or not config_file.exists():
57
- return {}
58
-
59
- try:
60
- if config_file.suffix.lower() in [".toml", ".tml"]:
61
- return self._load_toml_config(config_file)
62
- else:
63
- raise ConfigurationError(
64
- f"Unsupported config file format: {config_file.suffix}. Only TOML (.toml) files are supported."
65
- )
66
- except Exception as e:
67
- raise ConfigurationError(
68
- f"Failed to load config file {config_file}: {e}"
69
- ) from e
70
-
71
- def _load_toml_config(self, config_file: Path) -> dict[str, Any]:
72
- """Load TOML configuration file."""
73
- try:
74
- import tomllib
75
- except ImportError:
76
- try:
77
- import tomli as tomllib # type: ignore
78
- except ImportError:
79
- raise ConfigurationError(
80
- "TOML support not available. Install 'tomli' for Python < 3.11"
81
- ) from None
82
-
83
- with config_file.open("rb") as f:
84
- data = tomllib.load(f)
85
- return data if isinstance(data, dict) else {}
86
-
87
- def clear_cache(self) -> None:
88
- """Clear cached configuration."""
89
- self._cached_config = None
90
-
91
-
92
- # Global config loader instance
93
- config_loader = ConfigLoader()
94
-
95
-
96
- def load_config(config_file: Path | None = None) -> Settings:
97
- """Load configuration using the global loader.
98
-
99
- Args:
100
- config_file: Optional path to config file
101
-
102
- Returns:
103
- Settings instance with loaded configuration
104
- """
105
- return config_loader.load(config_file)