ccproxy-api 0.1.7__py3-none-any.whl → 0.2.0a4__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 (481) hide show
  1. ccproxy/api/__init__.py +1 -15
  2. ccproxy/api/app.py +434 -219
  3. ccproxy/api/bootstrap.py +30 -0
  4. ccproxy/api/decorators.py +85 -0
  5. ccproxy/api/dependencies.py +144 -168
  6. ccproxy/api/format_validation.py +54 -0
  7. ccproxy/api/middleware/cors.py +6 -3
  8. ccproxy/api/middleware/errors.py +388 -524
  9. ccproxy/api/middleware/hooks.py +563 -0
  10. ccproxy/api/middleware/normalize_headers.py +59 -0
  11. ccproxy/api/middleware/request_id.py +35 -16
  12. ccproxy/api/middleware/streaming_hooks.py +292 -0
  13. ccproxy/api/routes/__init__.py +5 -14
  14. ccproxy/api/routes/health.py +39 -672
  15. ccproxy/api/routes/plugins.py +277 -0
  16. ccproxy/auth/__init__.py +2 -19
  17. ccproxy/auth/bearer.py +25 -15
  18. ccproxy/auth/dependencies.py +123 -157
  19. ccproxy/auth/exceptions.py +0 -12
  20. ccproxy/auth/manager.py +35 -49
  21. ccproxy/auth/managers/__init__.py +10 -0
  22. ccproxy/auth/managers/base.py +523 -0
  23. ccproxy/auth/managers/base_enhanced.py +63 -0
  24. ccproxy/auth/managers/token_snapshot.py +77 -0
  25. ccproxy/auth/models/base.py +65 -0
  26. ccproxy/auth/models/credentials.py +40 -0
  27. ccproxy/auth/oauth/__init__.py +4 -18
  28. ccproxy/auth/oauth/base.py +533 -0
  29. ccproxy/auth/oauth/cli_errors.py +37 -0
  30. ccproxy/auth/oauth/flows.py +430 -0
  31. ccproxy/auth/oauth/protocol.py +366 -0
  32. ccproxy/auth/oauth/registry.py +408 -0
  33. ccproxy/auth/oauth/router.py +396 -0
  34. ccproxy/auth/oauth/routes.py +186 -113
  35. ccproxy/auth/oauth/session.py +151 -0
  36. ccproxy/auth/oauth/templates.py +342 -0
  37. ccproxy/auth/storage/__init__.py +2 -5
  38. ccproxy/auth/storage/base.py +279 -5
  39. ccproxy/auth/storage/generic.py +134 -0
  40. ccproxy/cli/__init__.py +1 -2
  41. ccproxy/cli/_settings_help.py +351 -0
  42. ccproxy/cli/commands/auth.py +1519 -793
  43. ccproxy/cli/commands/config/commands.py +209 -276
  44. ccproxy/cli/commands/plugins.py +669 -0
  45. ccproxy/cli/commands/serve.py +75 -810
  46. ccproxy/cli/commands/status.py +254 -0
  47. ccproxy/cli/decorators.py +83 -0
  48. ccproxy/cli/helpers.py +22 -60
  49. ccproxy/cli/main.py +359 -10
  50. ccproxy/cli/options/claude_options.py +0 -25
  51. ccproxy/config/__init__.py +7 -11
  52. ccproxy/config/core.py +227 -0
  53. ccproxy/config/env_generator.py +232 -0
  54. ccproxy/config/runtime.py +67 -0
  55. ccproxy/config/security.py +36 -3
  56. ccproxy/config/settings.py +382 -441
  57. ccproxy/config/toml_generator.py +299 -0
  58. ccproxy/config/utils.py +452 -0
  59. ccproxy/core/__init__.py +7 -271
  60. ccproxy/{_version.py → core/_version.py} +16 -3
  61. ccproxy/core/async_task_manager.py +516 -0
  62. ccproxy/core/async_utils.py +47 -14
  63. ccproxy/core/auth/__init__.py +6 -0
  64. ccproxy/core/constants.py +16 -50
  65. ccproxy/core/errors.py +53 -0
  66. ccproxy/core/id_utils.py +20 -0
  67. ccproxy/core/interfaces.py +16 -123
  68. ccproxy/core/logging.py +473 -18
  69. ccproxy/core/plugins/__init__.py +77 -0
  70. ccproxy/core/plugins/cli_discovery.py +211 -0
  71. ccproxy/core/plugins/declaration.py +455 -0
  72. ccproxy/core/plugins/discovery.py +604 -0
  73. ccproxy/core/plugins/factories.py +967 -0
  74. ccproxy/core/plugins/hooks/__init__.py +30 -0
  75. ccproxy/core/plugins/hooks/base.py +58 -0
  76. ccproxy/core/plugins/hooks/events.py +46 -0
  77. ccproxy/core/plugins/hooks/implementations/__init__.py +16 -0
  78. ccproxy/core/plugins/hooks/implementations/formatters/__init__.py +11 -0
  79. ccproxy/core/plugins/hooks/implementations/formatters/json.py +552 -0
  80. ccproxy/core/plugins/hooks/implementations/formatters/raw.py +370 -0
  81. ccproxy/core/plugins/hooks/implementations/http_tracer.py +431 -0
  82. ccproxy/core/plugins/hooks/layers.py +44 -0
  83. ccproxy/core/plugins/hooks/manager.py +186 -0
  84. ccproxy/core/plugins/hooks/registry.py +139 -0
  85. ccproxy/core/plugins/hooks/thread_manager.py +203 -0
  86. ccproxy/core/plugins/hooks/types.py +22 -0
  87. ccproxy/core/plugins/interfaces.py +416 -0
  88. ccproxy/core/plugins/loader.py +166 -0
  89. ccproxy/core/plugins/middleware.py +233 -0
  90. ccproxy/core/plugins/models.py +59 -0
  91. ccproxy/core/plugins/protocol.py +180 -0
  92. ccproxy/core/plugins/runtime.py +519 -0
  93. ccproxy/{observability/context.py → core/request_context.py} +137 -94
  94. ccproxy/core/status_report.py +211 -0
  95. ccproxy/core/transformers.py +13 -8
  96. ccproxy/data/claude_headers_fallback.json +540 -19
  97. ccproxy/data/codex_headers_fallback.json +114 -7
  98. ccproxy/http/__init__.py +30 -0
  99. ccproxy/http/base.py +95 -0
  100. ccproxy/http/client.py +323 -0
  101. ccproxy/http/hooks.py +642 -0
  102. ccproxy/http/pool.py +279 -0
  103. ccproxy/llms/formatters/__init__.py +7 -0
  104. ccproxy/llms/formatters/anthropic_to_openai/__init__.py +55 -0
  105. ccproxy/llms/formatters/anthropic_to_openai/errors.py +65 -0
  106. ccproxy/llms/formatters/anthropic_to_openai/requests.py +356 -0
  107. ccproxy/llms/formatters/anthropic_to_openai/responses.py +153 -0
  108. ccproxy/llms/formatters/anthropic_to_openai/streams.py +1546 -0
  109. ccproxy/llms/formatters/base.py +140 -0
  110. ccproxy/llms/formatters/base_model.py +33 -0
  111. ccproxy/llms/formatters/common/__init__.py +51 -0
  112. ccproxy/llms/formatters/common/identifiers.py +48 -0
  113. ccproxy/llms/formatters/common/streams.py +254 -0
  114. ccproxy/llms/formatters/common/thinking.py +74 -0
  115. ccproxy/llms/formatters/common/usage.py +135 -0
  116. ccproxy/llms/formatters/constants.py +55 -0
  117. ccproxy/llms/formatters/context.py +116 -0
  118. ccproxy/llms/formatters/mapping.py +33 -0
  119. ccproxy/llms/formatters/openai_to_anthropic/__init__.py +55 -0
  120. ccproxy/llms/formatters/openai_to_anthropic/_helpers.py +141 -0
  121. ccproxy/llms/formatters/openai_to_anthropic/errors.py +53 -0
  122. ccproxy/llms/formatters/openai_to_anthropic/requests.py +674 -0
  123. ccproxy/llms/formatters/openai_to_anthropic/responses.py +285 -0
  124. ccproxy/llms/formatters/openai_to_anthropic/streams.py +530 -0
  125. ccproxy/llms/formatters/openai_to_openai/__init__.py +53 -0
  126. ccproxy/llms/formatters/openai_to_openai/_helpers.py +325 -0
  127. ccproxy/llms/formatters/openai_to_openai/errors.py +6 -0
  128. ccproxy/llms/formatters/openai_to_openai/requests.py +388 -0
  129. ccproxy/llms/formatters/openai_to_openai/responses.py +594 -0
  130. ccproxy/llms/formatters/openai_to_openai/streams.py +1832 -0
  131. ccproxy/llms/formatters/utils.py +306 -0
  132. ccproxy/llms/models/__init__.py +9 -0
  133. ccproxy/llms/models/anthropic.py +619 -0
  134. ccproxy/llms/models/openai.py +844 -0
  135. ccproxy/llms/streaming/__init__.py +26 -0
  136. ccproxy/llms/streaming/accumulators.py +1074 -0
  137. ccproxy/llms/streaming/formatters.py +251 -0
  138. ccproxy/{adapters/openai/streaming.py → llms/streaming/processors.py} +193 -240
  139. ccproxy/models/__init__.py +8 -159
  140. ccproxy/models/detection.py +92 -193
  141. ccproxy/models/provider.py +75 -0
  142. ccproxy/plugins/access_log/README.md +32 -0
  143. ccproxy/plugins/access_log/__init__.py +20 -0
  144. ccproxy/plugins/access_log/config.py +33 -0
  145. ccproxy/plugins/access_log/formatter.py +126 -0
  146. ccproxy/plugins/access_log/hook.py +763 -0
  147. ccproxy/plugins/access_log/logger.py +254 -0
  148. ccproxy/plugins/access_log/plugin.py +137 -0
  149. ccproxy/plugins/access_log/writer.py +109 -0
  150. ccproxy/plugins/analytics/README.md +24 -0
  151. ccproxy/plugins/analytics/__init__.py +1 -0
  152. ccproxy/plugins/analytics/config.py +5 -0
  153. ccproxy/plugins/analytics/ingest.py +85 -0
  154. ccproxy/plugins/analytics/models.py +97 -0
  155. ccproxy/plugins/analytics/plugin.py +121 -0
  156. ccproxy/plugins/analytics/routes.py +163 -0
  157. ccproxy/plugins/analytics/service.py +284 -0
  158. ccproxy/plugins/claude_api/README.md +29 -0
  159. ccproxy/plugins/claude_api/__init__.py +10 -0
  160. ccproxy/plugins/claude_api/adapter.py +829 -0
  161. ccproxy/plugins/claude_api/config.py +52 -0
  162. ccproxy/plugins/claude_api/detection_service.py +461 -0
  163. ccproxy/plugins/claude_api/health.py +175 -0
  164. ccproxy/plugins/claude_api/hooks.py +284 -0
  165. ccproxy/plugins/claude_api/models.py +256 -0
  166. ccproxy/plugins/claude_api/plugin.py +298 -0
  167. ccproxy/plugins/claude_api/routes.py +118 -0
  168. ccproxy/plugins/claude_api/streaming_metrics.py +68 -0
  169. ccproxy/plugins/claude_api/tasks.py +84 -0
  170. ccproxy/plugins/claude_sdk/README.md +35 -0
  171. ccproxy/plugins/claude_sdk/__init__.py +80 -0
  172. ccproxy/plugins/claude_sdk/adapter.py +749 -0
  173. ccproxy/plugins/claude_sdk/auth.py +57 -0
  174. ccproxy/{claude_sdk → plugins/claude_sdk}/client.py +63 -39
  175. ccproxy/plugins/claude_sdk/config.py +210 -0
  176. ccproxy/{claude_sdk → plugins/claude_sdk}/converter.py +6 -6
  177. ccproxy/plugins/claude_sdk/detection_service.py +163 -0
  178. ccproxy/{services/claude_sdk_service.py → plugins/claude_sdk/handler.py} +123 -304
  179. ccproxy/plugins/claude_sdk/health.py +113 -0
  180. ccproxy/plugins/claude_sdk/hooks.py +115 -0
  181. ccproxy/{claude_sdk → plugins/claude_sdk}/manager.py +42 -32
  182. ccproxy/{claude_sdk → plugins/claude_sdk}/message_queue.py +8 -8
  183. ccproxy/{models/claude_sdk.py → plugins/claude_sdk/models.py} +64 -16
  184. ccproxy/plugins/claude_sdk/options.py +154 -0
  185. ccproxy/{claude_sdk → plugins/claude_sdk}/parser.py +23 -5
  186. ccproxy/plugins/claude_sdk/plugin.py +269 -0
  187. ccproxy/plugins/claude_sdk/routes.py +104 -0
  188. ccproxy/{claude_sdk → plugins/claude_sdk}/session_client.py +124 -12
  189. ccproxy/plugins/claude_sdk/session_pool.py +700 -0
  190. ccproxy/{claude_sdk → plugins/claude_sdk}/stream_handle.py +48 -43
  191. ccproxy/{claude_sdk → plugins/claude_sdk}/stream_worker.py +22 -18
  192. ccproxy/{claude_sdk → plugins/claude_sdk}/streaming.py +50 -16
  193. ccproxy/plugins/claude_sdk/tasks.py +97 -0
  194. ccproxy/plugins/claude_shared/README.md +18 -0
  195. ccproxy/plugins/claude_shared/__init__.py +12 -0
  196. ccproxy/plugins/claude_shared/model_defaults.py +171 -0
  197. ccproxy/plugins/codex/README.md +35 -0
  198. ccproxy/plugins/codex/__init__.py +6 -0
  199. ccproxy/plugins/codex/adapter.py +635 -0
  200. ccproxy/{config/codex.py → plugins/codex/config.py} +78 -12
  201. ccproxy/plugins/codex/detection_service.py +544 -0
  202. ccproxy/plugins/codex/health.py +162 -0
  203. ccproxy/plugins/codex/hooks.py +263 -0
  204. ccproxy/plugins/codex/model_defaults.py +39 -0
  205. ccproxy/plugins/codex/models.py +263 -0
  206. ccproxy/plugins/codex/plugin.py +275 -0
  207. ccproxy/plugins/codex/routes.py +129 -0
  208. ccproxy/plugins/codex/streaming_metrics.py +324 -0
  209. ccproxy/plugins/codex/tasks.py +106 -0
  210. ccproxy/plugins/codex/utils/__init__.py +1 -0
  211. ccproxy/plugins/codex/utils/sse_parser.py +106 -0
  212. ccproxy/plugins/command_replay/README.md +34 -0
  213. ccproxy/plugins/command_replay/__init__.py +17 -0
  214. ccproxy/plugins/command_replay/config.py +133 -0
  215. ccproxy/plugins/command_replay/formatter.py +432 -0
  216. ccproxy/plugins/command_replay/hook.py +294 -0
  217. ccproxy/plugins/command_replay/plugin.py +161 -0
  218. ccproxy/plugins/copilot/README.md +39 -0
  219. ccproxy/plugins/copilot/__init__.py +11 -0
  220. ccproxy/plugins/copilot/adapter.py +465 -0
  221. ccproxy/plugins/copilot/config.py +155 -0
  222. ccproxy/plugins/copilot/data/copilot_fallback.json +41 -0
  223. ccproxy/plugins/copilot/detection_service.py +255 -0
  224. ccproxy/plugins/copilot/manager.py +275 -0
  225. ccproxy/plugins/copilot/model_defaults.py +284 -0
  226. ccproxy/plugins/copilot/models.py +148 -0
  227. ccproxy/plugins/copilot/oauth/__init__.py +16 -0
  228. ccproxy/plugins/copilot/oauth/client.py +494 -0
  229. ccproxy/plugins/copilot/oauth/models.py +385 -0
  230. ccproxy/plugins/copilot/oauth/provider.py +602 -0
  231. ccproxy/plugins/copilot/oauth/storage.py +170 -0
  232. ccproxy/plugins/copilot/plugin.py +360 -0
  233. ccproxy/plugins/copilot/routes.py +294 -0
  234. ccproxy/plugins/credential_balancer/README.md +124 -0
  235. ccproxy/plugins/credential_balancer/__init__.py +6 -0
  236. ccproxy/plugins/credential_balancer/config.py +270 -0
  237. ccproxy/plugins/credential_balancer/factory.py +415 -0
  238. ccproxy/plugins/credential_balancer/hook.py +51 -0
  239. ccproxy/plugins/credential_balancer/manager.py +587 -0
  240. ccproxy/plugins/credential_balancer/plugin.py +146 -0
  241. ccproxy/plugins/dashboard/README.md +25 -0
  242. ccproxy/plugins/dashboard/__init__.py +1 -0
  243. ccproxy/plugins/dashboard/config.py +8 -0
  244. ccproxy/plugins/dashboard/plugin.py +71 -0
  245. ccproxy/plugins/dashboard/routes.py +67 -0
  246. ccproxy/plugins/docker/README.md +32 -0
  247. ccproxy/{docker → plugins/docker}/__init__.py +3 -0
  248. ccproxy/{docker → plugins/docker}/adapter.py +108 -10
  249. ccproxy/plugins/docker/config.py +82 -0
  250. ccproxy/{docker → plugins/docker}/docker_path.py +4 -3
  251. ccproxy/{docker → plugins/docker}/middleware.py +2 -2
  252. ccproxy/plugins/docker/plugin.py +198 -0
  253. ccproxy/{docker → plugins/docker}/stream_process.py +3 -3
  254. ccproxy/plugins/duckdb_storage/README.md +26 -0
  255. ccproxy/plugins/duckdb_storage/__init__.py +1 -0
  256. ccproxy/plugins/duckdb_storage/config.py +22 -0
  257. ccproxy/plugins/duckdb_storage/plugin.py +128 -0
  258. ccproxy/plugins/duckdb_storage/routes.py +51 -0
  259. ccproxy/plugins/duckdb_storage/storage.py +633 -0
  260. ccproxy/plugins/max_tokens/README.md +38 -0
  261. ccproxy/plugins/max_tokens/__init__.py +12 -0
  262. ccproxy/plugins/max_tokens/adapter.py +235 -0
  263. ccproxy/plugins/max_tokens/config.py +86 -0
  264. ccproxy/plugins/max_tokens/models.py +53 -0
  265. ccproxy/plugins/max_tokens/plugin.py +200 -0
  266. ccproxy/plugins/max_tokens/service.py +271 -0
  267. ccproxy/plugins/max_tokens/token_limits.json +54 -0
  268. ccproxy/plugins/metrics/README.md +35 -0
  269. ccproxy/plugins/metrics/__init__.py +10 -0
  270. ccproxy/{observability/metrics.py → plugins/metrics/collector.py} +20 -153
  271. ccproxy/plugins/metrics/config.py +85 -0
  272. ccproxy/plugins/metrics/grafana/dashboards/ccproxy-dashboard.json +1720 -0
  273. ccproxy/plugins/metrics/hook.py +403 -0
  274. ccproxy/plugins/metrics/plugin.py +268 -0
  275. ccproxy/{observability → plugins/metrics}/pushgateway.py +57 -59
  276. ccproxy/plugins/metrics/routes.py +107 -0
  277. ccproxy/plugins/metrics/tasks.py +117 -0
  278. ccproxy/plugins/oauth_claude/README.md +35 -0
  279. ccproxy/plugins/oauth_claude/__init__.py +14 -0
  280. ccproxy/plugins/oauth_claude/client.py +270 -0
  281. ccproxy/plugins/oauth_claude/config.py +84 -0
  282. ccproxy/plugins/oauth_claude/manager.py +482 -0
  283. ccproxy/plugins/oauth_claude/models.py +266 -0
  284. ccproxy/plugins/oauth_claude/plugin.py +149 -0
  285. ccproxy/plugins/oauth_claude/provider.py +571 -0
  286. ccproxy/plugins/oauth_claude/storage.py +212 -0
  287. ccproxy/plugins/oauth_codex/README.md +38 -0
  288. ccproxy/plugins/oauth_codex/__init__.py +14 -0
  289. ccproxy/plugins/oauth_codex/client.py +224 -0
  290. ccproxy/plugins/oauth_codex/config.py +95 -0
  291. ccproxy/plugins/oauth_codex/manager.py +256 -0
  292. ccproxy/plugins/oauth_codex/models.py +239 -0
  293. ccproxy/plugins/oauth_codex/plugin.py +146 -0
  294. ccproxy/plugins/oauth_codex/provider.py +574 -0
  295. ccproxy/plugins/oauth_codex/storage.py +92 -0
  296. ccproxy/plugins/permissions/README.md +28 -0
  297. ccproxy/plugins/permissions/__init__.py +22 -0
  298. ccproxy/plugins/permissions/config.py +28 -0
  299. ccproxy/{cli/commands/permission_handler.py → plugins/permissions/handlers/cli.py} +49 -25
  300. ccproxy/plugins/permissions/handlers/protocol.py +33 -0
  301. ccproxy/plugins/permissions/handlers/terminal.py +675 -0
  302. ccproxy/{api/routes → plugins/permissions}/mcp.py +34 -7
  303. ccproxy/{models/permissions.py → plugins/permissions/models.py} +65 -1
  304. ccproxy/plugins/permissions/plugin.py +153 -0
  305. ccproxy/{api/routes/permissions.py → plugins/permissions/routes.py} +20 -16
  306. ccproxy/{api/services/permission_service.py → plugins/permissions/service.py} +65 -11
  307. ccproxy/{api → plugins/permissions}/ui/permission_handler_protocol.py +1 -1
  308. ccproxy/{api → plugins/permissions}/ui/terminal_permission_handler.py +66 -10
  309. ccproxy/plugins/pricing/README.md +34 -0
  310. ccproxy/plugins/pricing/__init__.py +6 -0
  311. ccproxy/{pricing → plugins/pricing}/cache.py +7 -6
  312. ccproxy/{config/pricing.py → plugins/pricing/config.py} +32 -6
  313. ccproxy/plugins/pricing/exceptions.py +35 -0
  314. ccproxy/plugins/pricing/loader.py +440 -0
  315. ccproxy/{pricing → plugins/pricing}/models.py +13 -23
  316. ccproxy/plugins/pricing/plugin.py +169 -0
  317. ccproxy/plugins/pricing/service.py +191 -0
  318. ccproxy/plugins/pricing/tasks.py +300 -0
  319. ccproxy/{pricing → plugins/pricing}/updater.py +86 -72
  320. ccproxy/plugins/pricing/utils.py +99 -0
  321. ccproxy/plugins/request_tracer/README.md +40 -0
  322. ccproxy/plugins/request_tracer/__init__.py +7 -0
  323. ccproxy/plugins/request_tracer/config.py +120 -0
  324. ccproxy/plugins/request_tracer/hook.py +415 -0
  325. ccproxy/plugins/request_tracer/plugin.py +255 -0
  326. ccproxy/scheduler/__init__.py +2 -14
  327. ccproxy/scheduler/core.py +26 -41
  328. ccproxy/scheduler/manager.py +61 -105
  329. ccproxy/scheduler/registry.py +6 -32
  330. ccproxy/scheduler/tasks.py +268 -276
  331. ccproxy/services/__init__.py +0 -1
  332. ccproxy/services/adapters/__init__.py +11 -0
  333. ccproxy/services/adapters/base.py +123 -0
  334. ccproxy/services/adapters/chain_composer.py +88 -0
  335. ccproxy/services/adapters/chain_validation.py +44 -0
  336. ccproxy/services/adapters/chat_accumulator.py +200 -0
  337. ccproxy/services/adapters/delta_utils.py +142 -0
  338. ccproxy/services/adapters/format_adapter.py +136 -0
  339. ccproxy/services/adapters/format_context.py +11 -0
  340. ccproxy/services/adapters/format_registry.py +158 -0
  341. ccproxy/services/adapters/http_adapter.py +1045 -0
  342. ccproxy/services/adapters/mock_adapter.py +118 -0
  343. ccproxy/services/adapters/protocols.py +35 -0
  344. ccproxy/services/adapters/simple_converters.py +571 -0
  345. ccproxy/services/auth_registry.py +180 -0
  346. ccproxy/services/cache/__init__.py +6 -0
  347. ccproxy/services/cache/response_cache.py +261 -0
  348. ccproxy/services/cli_detection.py +437 -0
  349. ccproxy/services/config/__init__.py +6 -0
  350. ccproxy/services/config/proxy_configuration.py +111 -0
  351. ccproxy/services/container.py +256 -0
  352. ccproxy/services/factories.py +380 -0
  353. ccproxy/services/handler_config.py +76 -0
  354. ccproxy/services/interfaces.py +298 -0
  355. ccproxy/services/mocking/__init__.py +6 -0
  356. ccproxy/services/mocking/mock_handler.py +291 -0
  357. ccproxy/services/tracing/__init__.py +7 -0
  358. ccproxy/services/tracing/interfaces.py +61 -0
  359. ccproxy/services/tracing/null_tracer.py +57 -0
  360. ccproxy/streaming/__init__.py +23 -0
  361. ccproxy/streaming/buffer.py +1056 -0
  362. ccproxy/streaming/deferred.py +897 -0
  363. ccproxy/streaming/handler.py +117 -0
  364. ccproxy/streaming/interfaces.py +77 -0
  365. ccproxy/streaming/simple_adapter.py +39 -0
  366. ccproxy/streaming/sse.py +109 -0
  367. ccproxy/streaming/sse_parser.py +127 -0
  368. ccproxy/templates/__init__.py +6 -0
  369. ccproxy/templates/plugin_scaffold.py +695 -0
  370. ccproxy/testing/endpoints/__init__.py +33 -0
  371. ccproxy/testing/endpoints/cli.py +215 -0
  372. ccproxy/testing/endpoints/config.py +874 -0
  373. ccproxy/testing/endpoints/console.py +57 -0
  374. ccproxy/testing/endpoints/models.py +100 -0
  375. ccproxy/testing/endpoints/runner.py +1903 -0
  376. ccproxy/testing/endpoints/tools.py +308 -0
  377. ccproxy/testing/mock_responses.py +70 -1
  378. ccproxy/testing/response_handlers.py +20 -0
  379. ccproxy/utils/__init__.py +0 -6
  380. ccproxy/utils/binary_resolver.py +476 -0
  381. ccproxy/utils/caching.py +327 -0
  382. ccproxy/utils/cli_logging.py +101 -0
  383. ccproxy/utils/command_line.py +251 -0
  384. ccproxy/utils/headers.py +228 -0
  385. ccproxy/utils/model_mapper.py +120 -0
  386. ccproxy/utils/startup_helpers.py +68 -446
  387. ccproxy/utils/version_checker.py +273 -6
  388. ccproxy_api-0.2.0a4.dist-info/METADATA +212 -0
  389. ccproxy_api-0.2.0a4.dist-info/RECORD +417 -0
  390. {ccproxy_api-0.1.7.dist-info → ccproxy_api-0.2.0a4.dist-info}/WHEEL +1 -1
  391. ccproxy_api-0.2.0a4.dist-info/entry_points.txt +24 -0
  392. ccproxy/__init__.py +0 -4
  393. ccproxy/adapters/__init__.py +0 -11
  394. ccproxy/adapters/base.py +0 -80
  395. ccproxy/adapters/codex/__init__.py +0 -11
  396. ccproxy/adapters/openai/__init__.py +0 -42
  397. ccproxy/adapters/openai/adapter.py +0 -953
  398. ccproxy/adapters/openai/models.py +0 -412
  399. ccproxy/adapters/openai/response_adapter.py +0 -355
  400. ccproxy/adapters/openai/response_models.py +0 -178
  401. ccproxy/api/middleware/headers.py +0 -49
  402. ccproxy/api/middleware/logging.py +0 -180
  403. ccproxy/api/middleware/request_content_logging.py +0 -297
  404. ccproxy/api/middleware/server_header.py +0 -58
  405. ccproxy/api/responses.py +0 -89
  406. ccproxy/api/routes/claude.py +0 -371
  407. ccproxy/api/routes/codex.py +0 -1251
  408. ccproxy/api/routes/metrics.py +0 -1029
  409. ccproxy/api/routes/proxy.py +0 -211
  410. ccproxy/api/services/__init__.py +0 -6
  411. ccproxy/auth/conditional.py +0 -84
  412. ccproxy/auth/credentials_adapter.py +0 -93
  413. ccproxy/auth/models.py +0 -118
  414. ccproxy/auth/oauth/models.py +0 -48
  415. ccproxy/auth/openai/__init__.py +0 -13
  416. ccproxy/auth/openai/credentials.py +0 -166
  417. ccproxy/auth/openai/oauth_client.py +0 -334
  418. ccproxy/auth/openai/storage.py +0 -184
  419. ccproxy/auth/storage/json_file.py +0 -158
  420. ccproxy/auth/storage/keyring.py +0 -189
  421. ccproxy/claude_sdk/__init__.py +0 -18
  422. ccproxy/claude_sdk/options.py +0 -194
  423. ccproxy/claude_sdk/session_pool.py +0 -550
  424. ccproxy/cli/docker/__init__.py +0 -34
  425. ccproxy/cli/docker/adapter_factory.py +0 -157
  426. ccproxy/cli/docker/params.py +0 -274
  427. ccproxy/config/auth.py +0 -153
  428. ccproxy/config/claude.py +0 -348
  429. ccproxy/config/cors.py +0 -79
  430. ccproxy/config/discovery.py +0 -95
  431. ccproxy/config/docker_settings.py +0 -264
  432. ccproxy/config/observability.py +0 -158
  433. ccproxy/config/reverse_proxy.py +0 -31
  434. ccproxy/config/scheduler.py +0 -108
  435. ccproxy/config/server.py +0 -86
  436. ccproxy/config/validators.py +0 -231
  437. ccproxy/core/codex_transformers.py +0 -389
  438. ccproxy/core/http.py +0 -328
  439. ccproxy/core/http_transformers.py +0 -812
  440. ccproxy/core/proxy.py +0 -143
  441. ccproxy/core/validators.py +0 -288
  442. ccproxy/models/errors.py +0 -42
  443. ccproxy/models/messages.py +0 -269
  444. ccproxy/models/requests.py +0 -107
  445. ccproxy/models/responses.py +0 -270
  446. ccproxy/models/types.py +0 -102
  447. ccproxy/observability/__init__.py +0 -51
  448. ccproxy/observability/access_logger.py +0 -457
  449. ccproxy/observability/sse_events.py +0 -303
  450. ccproxy/observability/stats_printer.py +0 -753
  451. ccproxy/observability/storage/__init__.py +0 -1
  452. ccproxy/observability/storage/duckdb_simple.py +0 -677
  453. ccproxy/observability/storage/models.py +0 -70
  454. ccproxy/observability/streaming_response.py +0 -107
  455. ccproxy/pricing/__init__.py +0 -19
  456. ccproxy/pricing/loader.py +0 -251
  457. ccproxy/services/claude_detection_service.py +0 -243
  458. ccproxy/services/codex_detection_service.py +0 -252
  459. ccproxy/services/credentials/__init__.py +0 -55
  460. ccproxy/services/credentials/config.py +0 -105
  461. ccproxy/services/credentials/manager.py +0 -561
  462. ccproxy/services/credentials/oauth_client.py +0 -481
  463. ccproxy/services/proxy_service.py +0 -1827
  464. ccproxy/static/.keep +0 -0
  465. ccproxy/utils/cost_calculator.py +0 -210
  466. ccproxy/utils/disconnection_monitor.py +0 -83
  467. ccproxy/utils/model_mapping.py +0 -199
  468. ccproxy/utils/models_provider.py +0 -150
  469. ccproxy/utils/simple_request_logger.py +0 -284
  470. ccproxy/utils/streaming_metrics.py +0 -199
  471. ccproxy_api-0.1.7.dist-info/METADATA +0 -615
  472. ccproxy_api-0.1.7.dist-info/RECORD +0 -191
  473. ccproxy_api-0.1.7.dist-info/entry_points.txt +0 -4
  474. /ccproxy/{api/middleware/auth.py → auth/models/__init__.py} +0 -0
  475. /ccproxy/{claude_sdk → plugins/claude_sdk}/exceptions.py +0 -0
  476. /ccproxy/{docker → plugins/docker}/models.py +0 -0
  477. /ccproxy/{docker → plugins/docker}/protocol.py +0 -0
  478. /ccproxy/{docker → plugins/docker}/validators.py +0 -0
  479. /ccproxy/{auth/oauth/storage.py → plugins/permissions/handlers/__init__.py} +0 -0
  480. /ccproxy/{api → plugins/permissions}/ui/__init__.py +0 -0
  481. {ccproxy_api-0.1.7.dist-info → ccproxy_api-0.2.0a4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1720 @@
1
+ {
2
+ "annotations": {
3
+ "list": [
4
+ {
5
+ "builtIn": 1,
6
+ "datasource": {
7
+ "type": "grafana",
8
+ "uid": "-- Grafana --"
9
+ },
10
+ "enable": true,
11
+ "hide": true,
12
+ "iconColor": "rgba(0, 211, 255, 1)",
13
+ "name": "Annotations & Alerts",
14
+ "type": "dashboard"
15
+ }
16
+ ]
17
+ },
18
+ "description": "CCProxy API - Optimized for low-volume traffic (2-3 requests/minute)",
19
+ "editable": true,
20
+ "fiscalYearStartMonth": 0,
21
+ "graphTooltip": 1,
22
+ "id": null,
23
+ "links": [],
24
+ "liveNow": false,
25
+ "panels": [
26
+ {
27
+ "collapsed": false,
28
+ "gridPos": {
29
+ "h": 1,
30
+ "w": 24,
31
+ "x": 0,
32
+ "y": 0
33
+ },
34
+ "id": 1,
35
+ "panels": [],
36
+ "title": "System Overview",
37
+ "type": "row"
38
+ },
39
+ {
40
+ "datasource": {
41
+ "type": "prometheus",
42
+ "uid": "${DS_VICTORIAMETRICS}"
43
+ },
44
+ "fieldConfig": {
45
+ "defaults": {
46
+ "color": {
47
+ "mode": "thresholds"
48
+ },
49
+ "mappings": [
50
+ {
51
+ "options": {
52
+ "0": {
53
+ "color": "red",
54
+ "index": 0,
55
+ "text": "Down"
56
+ },
57
+ "1": {
58
+ "color": "green",
59
+ "index": 1,
60
+ "text": "Up"
61
+ }
62
+ },
63
+ "type": "value"
64
+ }
65
+ ],
66
+ "thresholds": {
67
+ "mode": "absolute",
68
+ "steps": [
69
+ {
70
+ "color": "red",
71
+ "value": null
72
+ },
73
+ {
74
+ "color": "green",
75
+ "value": 1
76
+ }
77
+ ]
78
+ },
79
+ "unit": "none"
80
+ },
81
+ "overrides": []
82
+ },
83
+ "gridPos": {
84
+ "h": 4,
85
+ "w": 6,
86
+ "x": 0,
87
+ "y": 1
88
+ },
89
+ "id": 2,
90
+ "options": {
91
+ "colorMode": "background",
92
+ "graphMode": "none",
93
+ "justifyMode": "auto",
94
+ "orientation": "auto",
95
+ "reduceOptions": {
96
+ "calcs": [
97
+ "lastNotNull"
98
+ ],
99
+ "fields": "",
100
+ "values": false
101
+ },
102
+ "textMode": "auto"
103
+ },
104
+ "pluginVersion": "9.0.0",
105
+ "targets": [
106
+ {
107
+ "expr": "up{job=\"ccproxy\"}",
108
+ "legendFormat": "Service Status",
109
+ "refId": "A"
110
+ }
111
+ ],
112
+ "title": "Service Health",
113
+ "type": "stat"
114
+ },
115
+ {
116
+ "datasource": {
117
+ "type": "prometheus",
118
+ "uid": "${DS_VICTORIAMETRICS}"
119
+ },
120
+ "fieldConfig": {
121
+ "defaults": {
122
+ "color": {
123
+ "mode": "thresholds"
124
+ },
125
+ "decimals": 0,
126
+ "mappings": [],
127
+ "noValue": "0",
128
+ "thresholds": {
129
+ "mode": "absolute",
130
+ "steps": [
131
+ {
132
+ "color": "green",
133
+ "value": null
134
+ },
135
+ {
136
+ "color": "blue",
137
+ "value": 100
138
+ },
139
+ {
140
+ "color": "purple",
141
+ "value": 1000
142
+ }
143
+ ]
144
+ },
145
+ "unit": "short"
146
+ },
147
+ "overrides": []
148
+ },
149
+ "gridPos": {
150
+ "h": 4,
151
+ "w": 6,
152
+ "x": 6,
153
+ "y": 1
154
+ },
155
+ "id": 3,
156
+ "options": {
157
+ "colorMode": "value",
158
+ "graphMode": "area",
159
+ "justifyMode": "auto",
160
+ "orientation": "auto",
161
+ "reduceOptions": {
162
+ "calcs": [
163
+ "lastNotNull"
164
+ ],
165
+ "fields": "",
166
+ "values": false
167
+ },
168
+ "textMode": "auto"
169
+ },
170
+ "pluginVersion": "9.0.0",
171
+ "targets": [
172
+ {
173
+ "expr": "sum(increase(ccproxy_requests_total[$__range])) or vector(0)",
174
+ "legendFormat": "Total Requests",
175
+ "refId": "A"
176
+ }
177
+ ],
178
+ "title": "Total Requests",
179
+ "type": "stat"
180
+ },
181
+ {
182
+ "datasource": {
183
+ "type": "prometheus",
184
+ "uid": "${DS_VICTORIAMETRICS}"
185
+ },
186
+ "fieldConfig": {
187
+ "defaults": {
188
+ "color": {
189
+ "mode": "thresholds"
190
+ },
191
+ "decimals": 0,
192
+ "mappings": [],
193
+ "noValue": "0",
194
+ "thresholds": {
195
+ "mode": "absolute",
196
+ "steps": [
197
+ {
198
+ "color": "green",
199
+ "value": null
200
+ },
201
+ {
202
+ "color": "blue",
203
+ "value": 10000
204
+ },
205
+ {
206
+ "color": "purple",
207
+ "value": 100000
208
+ }
209
+ ]
210
+ },
211
+ "unit": "short"
212
+ },
213
+ "overrides": []
214
+ },
215
+ "gridPos": {
216
+ "h": 4,
217
+ "w": 6,
218
+ "x": 12,
219
+ "y": 1
220
+ },
221
+ "id": 4,
222
+ "options": {
223
+ "colorMode": "value",
224
+ "graphMode": "area",
225
+ "justifyMode": "auto",
226
+ "orientation": "auto",
227
+ "reduceOptions": {
228
+ "calcs": [
229
+ "lastNotNull"
230
+ ],
231
+ "fields": "",
232
+ "values": false
233
+ },
234
+ "textMode": "auto"
235
+ },
236
+ "pluginVersion": "9.0.0",
237
+ "targets": [
238
+ {
239
+ "expr": "sum(increase(ccproxy_tokens_total{type=\"input\"}[$__range])) or vector(0)",
240
+ "legendFormat": "Total Input Tokens",
241
+ "refId": "A"
242
+ }
243
+ ],
244
+ "title": "Total Input Tokens",
245
+ "type": "stat"
246
+ },
247
+ {
248
+ "datasource": {
249
+ "type": "prometheus",
250
+ "uid": "${DS_VICTORIAMETRICS}"
251
+ },
252
+ "fieldConfig": {
253
+ "defaults": {
254
+ "color": {
255
+ "mode": "thresholds"
256
+ },
257
+ "decimals": 0,
258
+ "mappings": [],
259
+ "noValue": "0",
260
+ "thresholds": {
261
+ "mode": "absolute",
262
+ "steps": [
263
+ {
264
+ "color": "green",
265
+ "value": null
266
+ },
267
+ {
268
+ "color": "blue",
269
+ "value": 10000
270
+ },
271
+ {
272
+ "color": "purple",
273
+ "value": 100000
274
+ }
275
+ ]
276
+ },
277
+ "unit": "short"
278
+ },
279
+ "overrides": []
280
+ },
281
+ "gridPos": {
282
+ "h": 4,
283
+ "w": 6,
284
+ "x": 18,
285
+ "y": 1
286
+ },
287
+ "id": 5,
288
+ "options": {
289
+ "colorMode": "value",
290
+ "graphMode": "area",
291
+ "justifyMode": "auto",
292
+ "orientation": "auto",
293
+ "reduceOptions": {
294
+ "calcs": [
295
+ "lastNotNull"
296
+ ],
297
+ "fields": "",
298
+ "values": false
299
+ },
300
+ "textMode": "auto"
301
+ },
302
+ "pluginVersion": "9.0.0",
303
+ "targets": [
304
+ {
305
+ "expr": "sum(increase(ccproxy_tokens_total{type=\"output\"}[$__range])) or vector(0)",
306
+ "legendFormat": "Total Output Tokens",
307
+ "refId": "A"
308
+ }
309
+ ],
310
+ "title": "Total Output Tokens",
311
+ "type": "stat"
312
+ },
313
+ {
314
+ "datasource": {
315
+ "type": "prometheus",
316
+ "uid": "${DS_VICTORIAMETRICS}"
317
+ },
318
+ "fieldConfig": {
319
+ "defaults": {
320
+ "color": {
321
+ "mode": "thresholds"
322
+ },
323
+ "decimals": 0,
324
+ "mappings": [],
325
+ "noValue": "0",
326
+ "thresholds": {
327
+ "mode": "absolute",
328
+ "steps": [
329
+ {
330
+ "color": "green",
331
+ "value": null
332
+ },
333
+ {
334
+ "color": "blue",
335
+ "value": 10000
336
+ },
337
+ {
338
+ "color": "purple",
339
+ "value": 100000
340
+ }
341
+ ]
342
+ },
343
+ "unit": "short"
344
+ },
345
+ "overrides": []
346
+ },
347
+ "gridPos": {
348
+ "h": 4,
349
+ "w": 6,
350
+ "x": 0,
351
+ "y": 5
352
+ },
353
+ "id": 6,
354
+ "options": {
355
+ "colorMode": "value",
356
+ "graphMode": "area",
357
+ "justifyMode": "auto",
358
+ "orientation": "auto",
359
+ "reduceOptions": {
360
+ "calcs": [
361
+ "lastNotNull"
362
+ ],
363
+ "fields": "",
364
+ "values": false
365
+ },
366
+ "textMode": "auto"
367
+ },
368
+ "pluginVersion": "9.0.0",
369
+ "targets": [
370
+ {
371
+ "expr": "sum(increase(ccproxy_tokens_total{type=\"cache\"}[$__range])) or vector(0)",
372
+ "legendFormat": "Total Cache Tokens",
373
+ "refId": "A"
374
+ }
375
+ ],
376
+ "title": "Total Cache Tokens",
377
+ "type": "stat"
378
+ },
379
+ {
380
+ "datasource": {
381
+ "type": "prometheus",
382
+ "uid": "${DS_VICTORIAMETRICS}"
383
+ },
384
+ "fieldConfig": {
385
+ "defaults": {
386
+ "color": {
387
+ "mode": "thresholds"
388
+ },
389
+ "decimals": 2,
390
+ "mappings": [],
391
+ "noValue": "$0.00",
392
+ "thresholds": {
393
+ "mode": "absolute",
394
+ "steps": [
395
+ {
396
+ "color": "green",
397
+ "value": null
398
+ },
399
+ {
400
+ "color": "yellow",
401
+ "value": 1
402
+ },
403
+ {
404
+ "color": "red",
405
+ "value": 10
406
+ }
407
+ ]
408
+ },
409
+ "unit": "currencyUSD"
410
+ },
411
+ "overrides": []
412
+ },
413
+ "gridPos": {
414
+ "h": 4,
415
+ "w": 6,
416
+ "x": 6,
417
+ "y": 5
418
+ },
419
+ "id": 7,
420
+ "options": {
421
+ "colorMode": "value",
422
+ "graphMode": "area",
423
+ "justifyMode": "auto",
424
+ "orientation": "auto",
425
+ "reduceOptions": {
426
+ "calcs": [
427
+ "lastNotNull"
428
+ ],
429
+ "fields": "",
430
+ "values": false
431
+ },
432
+ "textMode": "auto"
433
+ },
434
+ "pluginVersion": "9.0.0",
435
+ "targets": [
436
+ {
437
+ "expr": "sum(increase(ccproxy_cost_usd_total[$__range])) or vector(0)",
438
+ "legendFormat": "Total Cost",
439
+ "refId": "A"
440
+ }
441
+ ],
442
+ "title": "Total Cost",
443
+ "type": "stat"
444
+ },
445
+ {
446
+ "datasource": {
447
+ "type": "prometheus",
448
+ "uid": "${DS_VICTORIAMETRICS}"
449
+ },
450
+ "fieldConfig": {
451
+ "defaults": {
452
+ "color": {
453
+ "mode": "thresholds"
454
+ },
455
+ "decimals": 0,
456
+ "mappings": [],
457
+ "noValue": "0",
458
+ "thresholds": {
459
+ "mode": "absolute",
460
+ "steps": [
461
+ {
462
+ "color": "green",
463
+ "value": null
464
+ },
465
+ {
466
+ "color": "yellow",
467
+ "value": 5
468
+ },
469
+ {
470
+ "color": "red",
471
+ "value": 10
472
+ }
473
+ ]
474
+ },
475
+ "unit": "short"
476
+ },
477
+ "overrides": []
478
+ },
479
+ "gridPos": {
480
+ "h": 4,
481
+ "w": 6,
482
+ "x": 12,
483
+ "y": 5
484
+ },
485
+ "id": 8,
486
+ "options": {
487
+ "colorMode": "value",
488
+ "graphMode": "area",
489
+ "justifyMode": "auto",
490
+ "orientation": "auto",
491
+ "reduceOptions": {
492
+ "calcs": [
493
+ "lastNotNull"
494
+ ],
495
+ "fields": "",
496
+ "values": false
497
+ },
498
+ "textMode": "auto"
499
+ },
500
+ "pluginVersion": "9.0.0",
501
+ "targets": [
502
+ {
503
+ "expr": "ccproxy_active_requests",
504
+ "legendFormat": "Active Requests",
505
+ "refId": "A"
506
+ }
507
+ ],
508
+ "title": "Active Requests",
509
+ "type": "stat"
510
+ },
511
+ {
512
+ "datasource": {
513
+ "type": "prometheus",
514
+ "uid": "${DS_VICTORIAMETRICS}"
515
+ },
516
+ "fieldConfig": {
517
+ "defaults": {
518
+ "color": {
519
+ "mode": "thresholds"
520
+ },
521
+ "decimals": 1,
522
+ "mappings": [],
523
+ "noValue": "0%",
524
+ "thresholds": {
525
+ "mode": "absolute",
526
+ "steps": [
527
+ {
528
+ "color": "green",
529
+ "value": null
530
+ },
531
+ {
532
+ "color": "yellow",
533
+ "value": 2
534
+ },
535
+ {
536
+ "color": "red",
537
+ "value": 5
538
+ }
539
+ ]
540
+ },
541
+ "unit": "percent"
542
+ },
543
+ "overrides": []
544
+ },
545
+ "gridPos": {
546
+ "h": 4,
547
+ "w": 6,
548
+ "x": 18,
549
+ "y": 5
550
+ },
551
+ "id": 9,
552
+ "options": {
553
+ "colorMode": "value",
554
+ "graphMode": "area",
555
+ "justifyMode": "auto",
556
+ "orientation": "auto",
557
+ "reduceOptions": {
558
+ "calcs": [
559
+ "lastNotNull"
560
+ ],
561
+ "fields": "",
562
+ "values": false
563
+ },
564
+ "textMode": "auto"
565
+ },
566
+ "pluginVersion": "9.0.0",
567
+ "targets": [
568
+ {
569
+ "expr": "(sum(increase(ccproxy_errors_total[15m])) / sum(increase(ccproxy_requests_total[15m]))) * 100 or vector(0)",
570
+ "legendFormat": "Error Rate",
571
+ "refId": "A"
572
+ }
573
+ ],
574
+ "title": "Error Rate (15m)",
575
+ "type": "stat"
576
+ },
577
+ {
578
+ "collapsed": false,
579
+ "gridPos": {
580
+ "h": 1,
581
+ "w": 24,
582
+ "x": 0,
583
+ "y": 9
584
+ },
585
+ "id": 10,
586
+ "panels": [],
587
+ "title": "Request Activity",
588
+ "type": "row"
589
+ },
590
+ {
591
+ "datasource": {
592
+ "type": "prometheus",
593
+ "uid": "${DS_VICTORIAMETRICS}"
594
+ },
595
+ "fieldConfig": {
596
+ "defaults": {
597
+ "color": {
598
+ "mode": "palette-classic"
599
+ },
600
+ "custom": {
601
+ "axisCenteredZero": false,
602
+ "axisColorMode": "text",
603
+ "axisLabel": "Requests",
604
+ "axisPlacement": "auto",
605
+ "barAlignment": 0,
606
+ "drawStyle": "line",
607
+ "fillOpacity": 10,
608
+ "gradientMode": "none",
609
+ "hideFrom": {
610
+ "legend": false,
611
+ "tooltip": false,
612
+ "vis": false
613
+ },
614
+ "insertNulls": false,
615
+ "lineInterpolation": "linear",
616
+ "lineWidth": 2,
617
+ "pointSize": 5,
618
+ "scaleDistribution": {
619
+ "type": "linear"
620
+ },
621
+ "showPoints": "auto",
622
+ "spanNulls": true,
623
+ "stacking": {
624
+ "group": "A",
625
+ "mode": "none"
626
+ },
627
+ "thresholdsStyle": {
628
+ "mode": "off"
629
+ }
630
+ },
631
+ "decimals": 0,
632
+ "mappings": [],
633
+ "min": 0,
634
+ "noValue": "0",
635
+ "thresholds": {
636
+ "mode": "absolute",
637
+ "steps": [
638
+ {
639
+ "color": "green",
640
+ "value": null
641
+ }
642
+ ]
643
+ },
644
+ "unit": "short"
645
+ },
646
+ "overrides": []
647
+ },
648
+ "gridPos": {
649
+ "h": 8,
650
+ "w": 12,
651
+ "x": 0,
652
+ "y": 10
653
+ },
654
+ "id": 11,
655
+ "options": {
656
+ "legend": {
657
+ "calcs": [
658
+ "last",
659
+ "mean",
660
+ "max"
661
+ ],
662
+ "displayMode": "table",
663
+ "placement": "bottom",
664
+ "showLegend": true
665
+ },
666
+ "tooltip": {
667
+ "mode": "multi",
668
+ "sort": "desc"
669
+ }
670
+ },
671
+ "targets": [
672
+ {
673
+ "expr": "sum(increase(ccproxy_requests_total[2m])) by (service_type) or on() vector(0)",
674
+ "legendFormat": "{{ service_type }}",
675
+ "refId": "A"
676
+ }
677
+ ],
678
+ "title": "Request Activity by Service (2-minute windows)",
679
+ "type": "timeseries"
680
+ },
681
+ {
682
+ "datasource": {
683
+ "type": "prometheus",
684
+ "uid": "${DS_VICTORIAMETRICS}"
685
+ },
686
+ "fieldConfig": {
687
+ "defaults": {
688
+ "color": {
689
+ "mode": "palette-classic"
690
+ },
691
+ "custom": {
692
+ "axisCenteredZero": false,
693
+ "axisColorMode": "text",
694
+ "axisLabel": "Requests",
695
+ "axisPlacement": "auto",
696
+ "barAlignment": 0,
697
+ "drawStyle": "line",
698
+ "fillOpacity": 10,
699
+ "gradientMode": "none",
700
+ "hideFrom": {
701
+ "legend": false,
702
+ "tooltip": false,
703
+ "vis": false
704
+ },
705
+ "insertNulls": false,
706
+ "lineInterpolation": "linear",
707
+ "lineWidth": 2,
708
+ "pointSize": 5,
709
+ "scaleDistribution": {
710
+ "type": "linear"
711
+ },
712
+ "showPoints": "auto",
713
+ "spanNulls": true,
714
+ "stacking": {
715
+ "group": "A",
716
+ "mode": "none"
717
+ },
718
+ "thresholdsStyle": {
719
+ "mode": "off"
720
+ }
721
+ },
722
+ "decimals": 0,
723
+ "mappings": [],
724
+ "min": 0,
725
+ "noValue": "0",
726
+ "thresholds": {
727
+ "mode": "absolute",
728
+ "steps": [
729
+ {
730
+ "color": "green",
731
+ "value": null
732
+ }
733
+ ]
734
+ },
735
+ "unit": "short"
736
+ },
737
+ "overrides": []
738
+ },
739
+ "gridPos": {
740
+ "h": 8,
741
+ "w": 12,
742
+ "x": 12,
743
+ "y": 10
744
+ },
745
+ "id": 12,
746
+ "options": {
747
+ "legend": {
748
+ "calcs": [
749
+ "last",
750
+ "mean",
751
+ "max"
752
+ ],
753
+ "displayMode": "table",
754
+ "placement": "bottom",
755
+ "showLegend": true
756
+ },
757
+ "tooltip": {
758
+ "mode": "multi",
759
+ "sort": "desc"
760
+ }
761
+ },
762
+ "targets": [
763
+ {
764
+ "expr": "sum(increase(ccproxy_requests_total[2m])) by (model, service_type) or on() vector(0)",
765
+ "legendFormat": "{{ model }} - {{ service_type }}",
766
+ "refId": "A"
767
+ }
768
+ ],
769
+ "title": "Request Activity by Model (2-minute windows)",
770
+ "type": "timeseries"
771
+ },
772
+ {
773
+ "datasource": {
774
+ "type": "prometheus",
775
+ "uid": "${DS_VICTORIAMETRICS}"
776
+ },
777
+ "fieldConfig": {
778
+ "defaults": {
779
+ "color": {
780
+ "mode": "palette-classic"
781
+ },
782
+ "custom": {
783
+ "axisCenteredZero": false,
784
+ "axisColorMode": "text",
785
+ "axisLabel": "Requests",
786
+ "axisPlacement": "auto",
787
+ "barAlignment": 0,
788
+ "drawStyle": "bars",
789
+ "fillOpacity": 100,
790
+ "gradientMode": "none",
791
+ "hideFrom": {
792
+ "legend": false,
793
+ "tooltip": false,
794
+ "vis": false
795
+ },
796
+ "insertNulls": false,
797
+ "lineInterpolation": "linear",
798
+ "lineWidth": 1,
799
+ "pointSize": 5,
800
+ "scaleDistribution": {
801
+ "type": "linear"
802
+ },
803
+ "showPoints": "never",
804
+ "spanNulls": false,
805
+ "stacking": {
806
+ "group": "A",
807
+ "mode": "normal"
808
+ },
809
+ "thresholdsStyle": {
810
+ "mode": "off"
811
+ }
812
+ },
813
+ "decimals": 0,
814
+ "mappings": [],
815
+ "min": 0,
816
+ "noValue": "0",
817
+ "thresholds": {
818
+ "mode": "absolute",
819
+ "steps": [
820
+ {
821
+ "color": "green",
822
+ "value": null
823
+ }
824
+ ]
825
+ },
826
+ "unit": "short"
827
+ },
828
+ "overrides": []
829
+ },
830
+ "gridPos": {
831
+ "h": 6,
832
+ "w": 24,
833
+ "x": 0,
834
+ "y": 18
835
+ },
836
+ "id": 13,
837
+ "options": {
838
+ "legend": {
839
+ "calcs": [
840
+ "last",
841
+ "sum"
842
+ ],
843
+ "displayMode": "table",
844
+ "placement": "bottom",
845
+ "showLegend": true
846
+ },
847
+ "tooltip": {
848
+ "mode": "multi",
849
+ "sort": "desc"
850
+ }
851
+ },
852
+ "targets": [
853
+ {
854
+ "expr": "sum(increase(ccproxy_requests_total[5m])) by (status, service_type) or on() vector(0)",
855
+ "legendFormat": "{{ status }} - {{ service_type }}",
856
+ "refId": "A"
857
+ }
858
+ ],
859
+ "title": "Request Status Distribution (5-minute windows)",
860
+ "type": "timeseries"
861
+ },
862
+ {
863
+ "collapsed": false,
864
+ "gridPos": {
865
+ "h": 1,
866
+ "w": 24,
867
+ "x": 0,
868
+ "y": 24
869
+ },
870
+ "id": 14,
871
+ "panels": [],
872
+ "title": "Response Times",
873
+ "type": "row"
874
+ },
875
+ {
876
+ "datasource": {
877
+ "type": "prometheus",
878
+ "uid": "${DS_VICTORIAMETRICS}"
879
+ },
880
+ "fieldConfig": {
881
+ "defaults": {
882
+ "color": {
883
+ "mode": "palette-classic"
884
+ },
885
+ "custom": {
886
+ "axisCenteredZero": false,
887
+ "axisColorMode": "text",
888
+ "axisLabel": "Response Time (s)",
889
+ "axisPlacement": "auto",
890
+ "barAlignment": 0,
891
+ "drawStyle": "line",
892
+ "fillOpacity": 10,
893
+ "gradientMode": "none",
894
+ "hideFrom": {
895
+ "legend": false,
896
+ "tooltip": false,
897
+ "vis": false
898
+ },
899
+ "insertNulls": false,
900
+ "lineInterpolation": "linear",
901
+ "lineWidth": 2,
902
+ "pointSize": 5,
903
+ "scaleDistribution": {
904
+ "type": "linear"
905
+ },
906
+ "showPoints": "auto",
907
+ "spanNulls": true,
908
+ "stacking": {
909
+ "group": "A",
910
+ "mode": "none"
911
+ },
912
+ "thresholdsStyle": {
913
+ "mode": "off"
914
+ }
915
+ },
916
+ "decimals": 2,
917
+ "mappings": [],
918
+ "min": 0,
919
+ "thresholds": {
920
+ "mode": "absolute",
921
+ "steps": [
922
+ {
923
+ "color": "green",
924
+ "value": null
925
+ }
926
+ ]
927
+ },
928
+ "unit": "s"
929
+ },
930
+ "overrides": []
931
+ },
932
+ "gridPos": {
933
+ "h": 8,
934
+ "w": 12,
935
+ "x": 0,
936
+ "y": 25
937
+ },
938
+ "id": 15,
939
+ "options": {
940
+ "legend": {
941
+ "calcs": [
942
+ "last",
943
+ "mean",
944
+ "max"
945
+ ],
946
+ "displayMode": "table",
947
+ "placement": "bottom",
948
+ "showLegend": true
949
+ },
950
+ "tooltip": {
951
+ "mode": "multi",
952
+ "sort": "desc"
953
+ }
954
+ },
955
+ "targets": [
956
+ {
957
+ "expr": "histogram_quantile(0.50, sum(rate(ccproxy_response_duration_seconds_bucket[15m])) by (le, service_type))",
958
+ "legendFormat": "p50 - {{ service_type }}",
959
+ "refId": "A"
960
+ },
961
+ {
962
+ "expr": "histogram_quantile(0.95, sum(rate(ccproxy_response_duration_seconds_bucket[15m])) by (le, service_type))",
963
+ "legendFormat": "p95 - {{ service_type }}",
964
+ "refId": "B"
965
+ },
966
+ {
967
+ "expr": "histogram_quantile(0.99, sum(rate(ccproxy_response_duration_seconds_bucket[15m])) by (le, service_type))",
968
+ "legendFormat": "p99 - {{ service_type }}",
969
+ "refId": "C"
970
+ }
971
+ ],
972
+ "title": "Response Time Percentiles by Service",
973
+ "type": "timeseries"
974
+ },
975
+ {
976
+ "datasource": {
977
+ "type": "prometheus",
978
+ "uid": "${DS_VICTORIAMETRICS}"
979
+ },
980
+ "fieldConfig": {
981
+ "defaults": {
982
+ "color": {
983
+ "mode": "palette-classic"
984
+ },
985
+ "custom": {
986
+ "axisCenteredZero": false,
987
+ "axisColorMode": "text",
988
+ "axisLabel": "Response Time (s)",
989
+ "axisPlacement": "auto",
990
+ "barAlignment": 0,
991
+ "drawStyle": "line",
992
+ "fillOpacity": 10,
993
+ "gradientMode": "none",
994
+ "hideFrom": {
995
+ "legend": false,
996
+ "tooltip": false,
997
+ "vis": false
998
+ },
999
+ "insertNulls": false,
1000
+ "lineInterpolation": "linear",
1001
+ "lineWidth": 2,
1002
+ "pointSize": 5,
1003
+ "scaleDistribution": {
1004
+ "type": "linear"
1005
+ },
1006
+ "showPoints": "auto",
1007
+ "spanNulls": true,
1008
+ "stacking": {
1009
+ "group": "A",
1010
+ "mode": "none"
1011
+ },
1012
+ "thresholdsStyle": {
1013
+ "mode": "off"
1014
+ }
1015
+ },
1016
+ "decimals": 2,
1017
+ "mappings": [],
1018
+ "min": 0,
1019
+ "thresholds": {
1020
+ "mode": "absolute",
1021
+ "steps": [
1022
+ {
1023
+ "color": "green",
1024
+ "value": null
1025
+ }
1026
+ ]
1027
+ },
1028
+ "unit": "s"
1029
+ },
1030
+ "overrides": []
1031
+ },
1032
+ "gridPos": {
1033
+ "h": 8,
1034
+ "w": 12,
1035
+ "x": 12,
1036
+ "y": 25
1037
+ },
1038
+ "id": 16,
1039
+ "options": {
1040
+ "legend": {
1041
+ "calcs": [
1042
+ "last",
1043
+ "mean",
1044
+ "max"
1045
+ ],
1046
+ "displayMode": "table",
1047
+ "placement": "bottom",
1048
+ "showLegend": true
1049
+ },
1050
+ "tooltip": {
1051
+ "mode": "multi",
1052
+ "sort": "desc"
1053
+ }
1054
+ },
1055
+ "targets": [
1056
+ {
1057
+ "expr": "avg by (model, service_type) (ccproxy_response_duration_seconds_sum / ccproxy_response_duration_seconds_count)",
1058
+ "legendFormat": "avg - {{ model }} - {{ service_type }}",
1059
+ "refId": "A"
1060
+ }
1061
+ ],
1062
+ "title": "Average Response Time by Model",
1063
+ "type": "timeseries"
1064
+ },
1065
+ {
1066
+ "collapsed": false,
1067
+ "gridPos": {
1068
+ "h": 1,
1069
+ "w": 24,
1070
+ "x": 0,
1071
+ "y": 33
1072
+ },
1073
+ "id": 17,
1074
+ "panels": [],
1075
+ "title": "Token Usage & Costs",
1076
+ "type": "row"
1077
+ },
1078
+ {
1079
+ "datasource": {
1080
+ "type": "prometheus",
1081
+ "uid": "${DS_VICTORIAMETRICS}"
1082
+ },
1083
+ "fieldConfig": {
1084
+ "defaults": {
1085
+ "color": {
1086
+ "mode": "palette-classic"
1087
+ },
1088
+ "custom": {
1089
+ "axisCenteredZero": false,
1090
+ "axisColorMode": "text",
1091
+ "axisLabel": "Tokens",
1092
+ "axisPlacement": "auto",
1093
+ "barAlignment": 0,
1094
+ "drawStyle": "bars",
1095
+ "fillOpacity": 100,
1096
+ "gradientMode": "none",
1097
+ "hideFrom": {
1098
+ "legend": false,
1099
+ "tooltip": false,
1100
+ "vis": false
1101
+ },
1102
+ "insertNulls": false,
1103
+ "lineInterpolation": "linear",
1104
+ "lineWidth": 1,
1105
+ "pointSize": 5,
1106
+ "scaleDistribution": {
1107
+ "type": "linear"
1108
+ },
1109
+ "showPoints": "never",
1110
+ "spanNulls": false,
1111
+ "stacking": {
1112
+ "group": "A",
1113
+ "mode": "normal"
1114
+ },
1115
+ "thresholdsStyle": {
1116
+ "mode": "off"
1117
+ }
1118
+ },
1119
+ "decimals": 0,
1120
+ "mappings": [],
1121
+ "min": 0,
1122
+ "noValue": "0",
1123
+ "thresholds": {
1124
+ "mode": "absolute",
1125
+ "steps": [
1126
+ {
1127
+ "color": "green",
1128
+ "value": null
1129
+ }
1130
+ ]
1131
+ },
1132
+ "unit": "short"
1133
+ },
1134
+ "overrides": []
1135
+ },
1136
+ "gridPos": {
1137
+ "h": 8,
1138
+ "w": 12,
1139
+ "x": 0,
1140
+ "y": 34
1141
+ },
1142
+ "id": 18,
1143
+ "options": {
1144
+ "legend": {
1145
+ "calcs": [
1146
+ "last",
1147
+ "sum"
1148
+ ],
1149
+ "displayMode": "table",
1150
+ "placement": "bottom",
1151
+ "showLegend": true
1152
+ },
1153
+ "tooltip": {
1154
+ "mode": "multi",
1155
+ "sort": "desc"
1156
+ }
1157
+ },
1158
+ "targets": [
1159
+ {
1160
+ "expr": "sum(increase(ccproxy_tokens_total[5m])) by (type, service_type) or on() vector(0)",
1161
+ "legendFormat": "{{ type }} - {{ service_type }}",
1162
+ "refId": "A"
1163
+ }
1164
+ ],
1165
+ "title": "Token Usage by Type (5-minute windows)",
1166
+ "type": "timeseries"
1167
+ },
1168
+ {
1169
+ "datasource": {
1170
+ "type": "prometheus",
1171
+ "uid": "${DS_VICTORIAMETRICS}"
1172
+ },
1173
+ "fieldConfig": {
1174
+ "defaults": {
1175
+ "color": {
1176
+ "mode": "palette-classic"
1177
+ },
1178
+ "custom": {
1179
+ "axisCenteredZero": false,
1180
+ "axisColorMode": "text",
1181
+ "axisLabel": "Cost ($)",
1182
+ "axisPlacement": "auto",
1183
+ "barAlignment": 0,
1184
+ "drawStyle": "line",
1185
+ "fillOpacity": 10,
1186
+ "gradientMode": "none",
1187
+ "hideFrom": {
1188
+ "legend": false,
1189
+ "tooltip": false,
1190
+ "vis": false
1191
+ },
1192
+ "insertNulls": false,
1193
+ "lineInterpolation": "linear",
1194
+ "lineWidth": 2,
1195
+ "pointSize": 5,
1196
+ "scaleDistribution": {
1197
+ "type": "linear"
1198
+ },
1199
+ "showPoints": "auto",
1200
+ "spanNulls": true,
1201
+ "stacking": {
1202
+ "group": "A",
1203
+ "mode": "none"
1204
+ },
1205
+ "thresholdsStyle": {
1206
+ "mode": "off"
1207
+ }
1208
+ },
1209
+ "decimals": 4,
1210
+ "mappings": [],
1211
+ "min": 0,
1212
+ "noValue": "0",
1213
+ "thresholds": {
1214
+ "mode": "absolute",
1215
+ "steps": [
1216
+ {
1217
+ "color": "green",
1218
+ "value": null
1219
+ }
1220
+ ]
1221
+ },
1222
+ "unit": "currencyUSD"
1223
+ },
1224
+ "overrides": []
1225
+ },
1226
+ "gridPos": {
1227
+ "h": 8,
1228
+ "w": 12,
1229
+ "x": 12,
1230
+ "y": 34
1231
+ },
1232
+ "id": 19,
1233
+ "options": {
1234
+ "legend": {
1235
+ "calcs": [
1236
+ "last",
1237
+ "sum"
1238
+ ],
1239
+ "displayMode": "table",
1240
+ "placement": "bottom",
1241
+ "showLegend": true
1242
+ },
1243
+ "tooltip": {
1244
+ "mode": "multi",
1245
+ "sort": "desc"
1246
+ }
1247
+ },
1248
+ "targets": [
1249
+ {
1250
+ "expr": "sum(increase(ccproxy_cost_usd_total[5m])) by (model, service_type) or on() vector(0)",
1251
+ "legendFormat": "{{ model }} - {{ service_type }}",
1252
+ "refId": "A"
1253
+ }
1254
+ ],
1255
+ "title": "Cost by Model and Service (5-minute windows)",
1256
+ "type": "timeseries"
1257
+ },
1258
+ {
1259
+ "datasource": {
1260
+ "type": "prometheus",
1261
+ "uid": "${DS_VICTORIAMETRICS}"
1262
+ },
1263
+ "fieldConfig": {
1264
+ "defaults": {
1265
+ "color": {
1266
+ "mode": "thresholds"
1267
+ },
1268
+ "decimals": 2,
1269
+ "mappings": [],
1270
+ "noValue": "$0.00",
1271
+ "thresholds": {
1272
+ "mode": "absolute",
1273
+ "steps": [
1274
+ {
1275
+ "color": "green",
1276
+ "value": null
1277
+ },
1278
+ {
1279
+ "color": "yellow",
1280
+ "value": 1
1281
+ },
1282
+ {
1283
+ "color": "red",
1284
+ "value": 10
1285
+ }
1286
+ ]
1287
+ },
1288
+ "unit": "currencyUSD"
1289
+ },
1290
+ "overrides": []
1291
+ },
1292
+ "gridPos": {
1293
+ "h": 4,
1294
+ "w": 6,
1295
+ "x": 0,
1296
+ "y": 42
1297
+ },
1298
+ "id": 20,
1299
+ "options": {
1300
+ "colorMode": "value",
1301
+ "graphMode": "area",
1302
+ "justifyMode": "auto",
1303
+ "orientation": "auto",
1304
+ "reduceOptions": {
1305
+ "calcs": [
1306
+ "last"
1307
+ ],
1308
+ "fields": "",
1309
+ "values": false
1310
+ },
1311
+ "textMode": "auto"
1312
+ },
1313
+ "pluginVersion": "9.0.0",
1314
+ "targets": [
1315
+ {
1316
+ "expr": "sum(increase(ccproxy_cost_usd_total[1h])) or vector(0)",
1317
+ "legendFormat": "Cost Last Hour",
1318
+ "refId": "A"
1319
+ }
1320
+ ],
1321
+ "title": "Cost Last Hour",
1322
+ "type": "stat"
1323
+ },
1324
+ {
1325
+ "datasource": {
1326
+ "type": "prometheus",
1327
+ "uid": "${DS_VICTORIAMETRICS}"
1328
+ },
1329
+ "fieldConfig": {
1330
+ "defaults": {
1331
+ "color": {
1332
+ "mode": "thresholds"
1333
+ },
1334
+ "decimals": 2,
1335
+ "mappings": [],
1336
+ "noValue": "$0.00",
1337
+ "thresholds": {
1338
+ "mode": "absolute",
1339
+ "steps": [
1340
+ {
1341
+ "color": "green",
1342
+ "value": null
1343
+ },
1344
+ {
1345
+ "color": "yellow",
1346
+ "value": 10
1347
+ },
1348
+ {
1349
+ "color": "red",
1350
+ "value": 50
1351
+ }
1352
+ ]
1353
+ },
1354
+ "unit": "currencyUSD"
1355
+ },
1356
+ "overrides": []
1357
+ },
1358
+ "gridPos": {
1359
+ "h": 4,
1360
+ "w": 6,
1361
+ "x": 6,
1362
+ "y": 42
1363
+ },
1364
+ "id": 21,
1365
+ "options": {
1366
+ "colorMode": "value",
1367
+ "graphMode": "area",
1368
+ "justifyMode": "auto",
1369
+ "orientation": "auto",
1370
+ "reduceOptions": {
1371
+ "calcs": [
1372
+ "last"
1373
+ ],
1374
+ "fields": "",
1375
+ "values": false
1376
+ },
1377
+ "textMode": "auto"
1378
+ },
1379
+ "pluginVersion": "9.0.0",
1380
+ "targets": [
1381
+ {
1382
+ "expr": "sum(increase(ccproxy_cost_usd_total[24h])) or vector(0)",
1383
+ "legendFormat": "Cost Last 24h",
1384
+ "refId": "A"
1385
+ }
1386
+ ],
1387
+ "title": "Cost Last 24 Hours",
1388
+ "type": "stat"
1389
+ },
1390
+ {
1391
+ "collapsed": false,
1392
+ "gridPos": {
1393
+ "h": 1,
1394
+ "w": 24,
1395
+ "x": 0,
1396
+ "y": 46
1397
+ },
1398
+ "id": 22,
1399
+ "panels": [],
1400
+ "title": "Error Analysis",
1401
+ "type": "row"
1402
+ },
1403
+ {
1404
+ "datasource": {
1405
+ "type": "prometheus",
1406
+ "uid": "${DS_VICTORIAMETRICS}"
1407
+ },
1408
+ "fieldConfig": {
1409
+ "defaults": {
1410
+ "color": {
1411
+ "mode": "palette-classic"
1412
+ },
1413
+ "custom": {
1414
+ "axisCenteredZero": false,
1415
+ "axisColorMode": "text",
1416
+ "axisLabel": "Errors",
1417
+ "axisPlacement": "auto",
1418
+ "barAlignment": 0,
1419
+ "drawStyle": "bars",
1420
+ "fillOpacity": 100,
1421
+ "gradientMode": "none",
1422
+ "hideFrom": {
1423
+ "legend": false,
1424
+ "tooltip": false,
1425
+ "vis": false
1426
+ },
1427
+ "insertNulls": false,
1428
+ "lineInterpolation": "linear",
1429
+ "lineWidth": 1,
1430
+ "pointSize": 5,
1431
+ "scaleDistribution": {
1432
+ "type": "linear"
1433
+ },
1434
+ "showPoints": "never",
1435
+ "spanNulls": false,
1436
+ "stacking": {
1437
+ "group": "A",
1438
+ "mode": "normal"
1439
+ },
1440
+ "thresholdsStyle": {
1441
+ "mode": "off"
1442
+ }
1443
+ },
1444
+ "decimals": 0,
1445
+ "mappings": [],
1446
+ "min": 0,
1447
+ "noValue": "0",
1448
+ "thresholds": {
1449
+ "mode": "absolute",
1450
+ "steps": [
1451
+ {
1452
+ "color": "green",
1453
+ "value": null
1454
+ },
1455
+ {
1456
+ "color": "yellow",
1457
+ "value": 1
1458
+ },
1459
+ {
1460
+ "color": "red",
1461
+ "value": 5
1462
+ }
1463
+ ]
1464
+ },
1465
+ "unit": "short"
1466
+ },
1467
+ "overrides": []
1468
+ },
1469
+ "gridPos": {
1470
+ "h": 8,
1471
+ "w": 12,
1472
+ "x": 0,
1473
+ "y": 47
1474
+ },
1475
+ "id": 23,
1476
+ "options": {
1477
+ "legend": {
1478
+ "calcs": [
1479
+ "last",
1480
+ "sum"
1481
+ ],
1482
+ "displayMode": "table",
1483
+ "placement": "bottom",
1484
+ "showLegend": true
1485
+ },
1486
+ "tooltip": {
1487
+ "mode": "multi",
1488
+ "sort": "desc"
1489
+ }
1490
+ },
1491
+ "targets": [
1492
+ {
1493
+ "expr": "sum(increase(ccproxy_errors_total[5m])) by (error_type, service_type) or on() vector(0)",
1494
+ "legendFormat": "{{ error_type }} - {{ service_type }}",
1495
+ "refId": "A"
1496
+ }
1497
+ ],
1498
+ "title": "Errors by Type (5-minute windows)",
1499
+ "type": "timeseries"
1500
+ },
1501
+ {
1502
+ "datasource": {
1503
+ "type": "prometheus",
1504
+ "uid": "${DS_VICTORIAMETRICS}"
1505
+ },
1506
+ "fieldConfig": {
1507
+ "defaults": {
1508
+ "color": {
1509
+ "mode": "palette-classic"
1510
+ },
1511
+ "custom": {
1512
+ "axisCenteredZero": false,
1513
+ "axisColorMode": "text",
1514
+ "axisLabel": "Error Rate (%)",
1515
+ "axisPlacement": "auto",
1516
+ "barAlignment": 0,
1517
+ "drawStyle": "line",
1518
+ "fillOpacity": 10,
1519
+ "gradientMode": "none",
1520
+ "hideFrom": {
1521
+ "legend": false,
1522
+ "tooltip": false,
1523
+ "vis": false
1524
+ },
1525
+ "insertNulls": false,
1526
+ "lineInterpolation": "linear",
1527
+ "lineWidth": 2,
1528
+ "pointSize": 5,
1529
+ "scaleDistribution": {
1530
+ "type": "linear"
1531
+ },
1532
+ "showPoints": "auto",
1533
+ "spanNulls": true,
1534
+ "stacking": {
1535
+ "group": "A",
1536
+ "mode": "none"
1537
+ },
1538
+ "thresholdsStyle": {
1539
+ "mode": "off"
1540
+ }
1541
+ },
1542
+ "decimals": 1,
1543
+ "mappings": [],
1544
+ "max": 100,
1545
+ "min": 0,
1546
+ "noValue": "0",
1547
+ "thresholds": {
1548
+ "mode": "absolute",
1549
+ "steps": [
1550
+ {
1551
+ "color": "green",
1552
+ "value": null
1553
+ },
1554
+ {
1555
+ "color": "yellow",
1556
+ "value": 2
1557
+ },
1558
+ {
1559
+ "color": "red",
1560
+ "value": 5
1561
+ }
1562
+ ]
1563
+ },
1564
+ "unit": "percent"
1565
+ },
1566
+ "overrides": []
1567
+ },
1568
+ "gridPos": {
1569
+ "h": 8,
1570
+ "w": 12,
1571
+ "x": 12,
1572
+ "y": 47
1573
+ },
1574
+ "id": 24,
1575
+ "options": {
1576
+ "legend": {
1577
+ "calcs": [
1578
+ "last",
1579
+ "mean",
1580
+ "max"
1581
+ ],
1582
+ "displayMode": "table",
1583
+ "placement": "bottom",
1584
+ "showLegend": true
1585
+ },
1586
+ "tooltip": {
1587
+ "mode": "multi",
1588
+ "sort": "desc"
1589
+ }
1590
+ },
1591
+ "targets": [
1592
+ {
1593
+ "expr": "(sum(increase(ccproxy_errors_total[15m])) by (service_type) / sum(increase(ccproxy_requests_total[15m])) by (service_type)) * 100 or on() vector(0)",
1594
+ "legendFormat": "{{ service_type }}",
1595
+ "refId": "A"
1596
+ }
1597
+ ],
1598
+ "title": "Error Rate by Service (15-minute windows)",
1599
+ "type": "timeseries"
1600
+ }
1601
+ ],
1602
+ "refresh": "30s",
1603
+ "schemaVersion": 39,
1604
+ "style": "dark",
1605
+ "tags": [
1606
+ "claude",
1607
+ "api",
1608
+ "proxy",
1609
+ "monitoring",
1610
+ "low-volume"
1611
+ ],
1612
+ "templating": {
1613
+ "list": [
1614
+ {
1615
+ "current": {
1616
+ "selected": false,
1617
+ "text": "Prometheus",
1618
+ "value": "prometheus"
1619
+ },
1620
+ "hide": 0,
1621
+ "includeAll": false,
1622
+ "label": "Datasource",
1623
+ "multi": false,
1624
+ "name": "DS_VICTORIAMETRICS",
1625
+ "options": [],
1626
+ "query": "prometheus",
1627
+ "queryValue": "",
1628
+ "refresh": 1,
1629
+ "regex": "",
1630
+ "skipUrlSync": false,
1631
+ "type": "datasource"
1632
+ },
1633
+ {
1634
+ "current": {
1635
+ "selected": true,
1636
+ "text": [
1637
+ "All"
1638
+ ],
1639
+ "value": [
1640
+ "$__all"
1641
+ ]
1642
+ },
1643
+ "datasource": {
1644
+ "type": "prometheus",
1645
+ "uid": "${DS_VICTORIAMETRICS}"
1646
+ },
1647
+ "definition": "label_values(ccproxy_requests_total, service_type)",
1648
+ "hide": 0,
1649
+ "includeAll": true,
1650
+ "label": "Service Type",
1651
+ "multi": true,
1652
+ "name": "service_type",
1653
+ "options": [],
1654
+ "query": {
1655
+ "query": "label_values(ccproxy_requests_total, service_type)",
1656
+ "refId": "StandardVariableQuery"
1657
+ },
1658
+ "refresh": 1,
1659
+ "regex": "",
1660
+ "skipUrlSync": false,
1661
+ "sort": 0,
1662
+ "type": "query"
1663
+ },
1664
+ {
1665
+ "current": {
1666
+ "selected": true,
1667
+ "text": [
1668
+ "All"
1669
+ ],
1670
+ "value": [
1671
+ "$__all"
1672
+ ]
1673
+ },
1674
+ "datasource": {
1675
+ "type": "prometheus",
1676
+ "uid": "${DS_VICTORIAMETRICS}"
1677
+ },
1678
+ "definition": "label_values(ccproxy_requests_total, model)",
1679
+ "hide": 0,
1680
+ "includeAll": true,
1681
+ "label": "Model",
1682
+ "multi": true,
1683
+ "name": "model",
1684
+ "options": [],
1685
+ "query": {
1686
+ "query": "label_values(ccproxy_requests_total, model)",
1687
+ "refId": "StandardVariableQuery"
1688
+ },
1689
+ "refresh": 1,
1690
+ "regex": "",
1691
+ "skipUrlSync": false,
1692
+ "sort": 0,
1693
+ "type": "query"
1694
+ }
1695
+ ]
1696
+ },
1697
+ "time": {
1698
+ "from": "now-3h",
1699
+ "to": "now"
1700
+ },
1701
+ "timepicker": {
1702
+ "refresh_intervals": [
1703
+ "5s",
1704
+ "10s",
1705
+ "30s",
1706
+ "1m",
1707
+ "5m",
1708
+ "15m",
1709
+ "30m",
1710
+ "1h",
1711
+ "2h",
1712
+ "1d"
1713
+ ]
1714
+ },
1715
+ "timezone": "",
1716
+ "title": "CCProxy API Dashboard",
1717
+ "uid": "ccproxy-dashboard",
1718
+ "version": 1,
1719
+ "weekStart": ""
1720
+ }