@oneciel-ai/ciel-runtime 0.1.1 → 0.2.0

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 (287) hide show
  1. package/README.md +132 -0
  2. package/ciel-runtime-menu.py +56 -6
  3. package/ciel_runtime.py +9379 -35909
  4. package/ciel_runtime_support/advisor_client.py +193 -0
  5. package/ciel_runtime_support/advisor_policy.py +320 -0
  6. package/ciel_runtime_support/advisor_refinement.py +160 -0
  7. package/ciel_runtime_support/advisor_request_builder.py +261 -0
  8. package/ciel_runtime_support/agy_installer.py +169 -0
  9. package/ciel_runtime_support/agy_mcp_restore.py +182 -0
  10. package/ciel_runtime_support/anthropic_model_policy.py +186 -0
  11. package/ciel_runtime_support/anthropic_response_writer.py +255 -0
  12. package/ciel_runtime_support/anthropic_tool_turns.py +130 -0
  13. package/ciel_runtime_support/api_key_cooldown.py +159 -0
  14. package/ciel_runtime_support/architecture.py +488 -1
  15. package/ciel_runtime_support/architecture_budget.py +42 -0
  16. package/ciel_runtime_support/channel_backlog.py +90 -0
  17. package/ciel_runtime_support/channel_cli.py +119 -0
  18. package/ciel_runtime_support/channel_compact_injection.py +82 -0
  19. package/ciel_runtime_support/channel_compact_poll.py +67 -0
  20. package/ciel_runtime_support/channel_compact_request_repository.py +113 -0
  21. package/ciel_runtime_support/channel_config_service.py +281 -0
  22. package/ciel_runtime_support/channel_connection_lifecycle.py +180 -0
  23. package/ciel_runtime_support/channel_connection_registry.py +128 -0
  24. package/ciel_runtime_support/channel_connection_worker.py +284 -0
  25. package/ciel_runtime_support/channel_cursor_recovery.py +92 -0
  26. package/ciel_runtime_support/channel_cursor_repository.py +89 -0
  27. package/ciel_runtime_support/channel_cursor_service.py +178 -0
  28. package/ciel_runtime_support/channel_event_identity.py +212 -0
  29. package/ciel_runtime_support/channel_event_projection.py +315 -0
  30. package/ciel_runtime_support/channel_inflight.py +127 -0
  31. package/ciel_runtime_support/channel_injection.py +115 -0
  32. package/ciel_runtime_support/channel_launch_guard_repository.py +58 -0
  33. package/ciel_runtime_support/channel_launch_policy.py +180 -0
  34. package/ciel_runtime_support/channel_llm_context.py +156 -0
  35. package/ciel_runtime_support/channel_mcp_discovery.py +186 -0
  36. package/ciel_runtime_support/channel_mcp_http_controller.py +239 -0
  37. package/ciel_runtime_support/channel_mcp_ownership.py +148 -0
  38. package/ciel_runtime_support/channel_mcp_tools.py +240 -0
  39. package/ciel_runtime_support/channel_mcp_transport.py +394 -0
  40. package/ciel_runtime_support/channel_message_dedupe.py +65 -0
  41. package/ciel_runtime_support/channel_message_policy.py +256 -0
  42. package/ciel_runtime_support/channel_message_prompt.py +305 -0
  43. package/ciel_runtime_support/channel_message_repository.py +234 -0
  44. package/ciel_runtime_support/channel_notification_projection.py +217 -0
  45. package/ciel_runtime_support/channel_panel.py +162 -0
  46. package/ciel_runtime_support/channel_pending_injection.py +209 -0
  47. package/ciel_runtime_support/channel_pending_poll.py +109 -0
  48. package/ciel_runtime_support/channel_probe_cache.py +433 -0
  49. package/ciel_runtime_support/channel_probe_report.py +101 -0
  50. package/ciel_runtime_support/channel_runtime_environment.py +181 -0
  51. package/ciel_runtime_support/channel_session_lifecycle.py +114 -0
  52. package/ciel_runtime_support/channel_session_repository.py +90 -0
  53. package/ciel_runtime_support/channel_terminal_dispatch.py +115 -0
  54. package/ciel_runtime_support/channel_terminal_input.py +277 -0
  55. package/ciel_runtime_support/channel_terminal_proxy.py +447 -0
  56. package/ciel_runtime_support/channel_tool_context.py +166 -0
  57. package/ciel_runtime_support/channel_transcript.py +414 -0
  58. package/ciel_runtime_support/channel_transcript_repository.py +96 -0
  59. package/ciel_runtime_support/channel_wake_claim_repository.py +126 -0
  60. package/ciel_runtime_support/channel_wake_delivery_repository.py +88 -0
  61. package/ciel_runtime_support/chat_files.py +138 -0
  62. package/ciel_runtime_support/chat_http_controller.py +235 -0
  63. package/ciel_runtime_support/claude_environment.py +375 -0
  64. package/ciel_runtime_support/claude_router.py +247 -193
  65. package/ciel_runtime_support/cli_dispatch.py +792 -0
  66. package/ciel_runtime_support/cli_parser.py +165 -0
  67. package/ciel_runtime_support/cli_usage.py +100 -0
  68. package/ciel_runtime_support/codex_app_server.py +20 -5
  69. package/ciel_runtime_support/codex_channel_sse_launch.py +87 -0
  70. package/ciel_runtime_support/codex_cli.py +42 -6
  71. package/ciel_runtime_support/codex_config.py +323 -0
  72. package/ciel_runtime_support/codex_launch_configuration.py +240 -0
  73. package/ciel_runtime_support/codex_launch_policy.py +66 -0
  74. package/ciel_runtime_support/codex_mcp_integration.py +195 -0
  75. package/ciel_runtime_support/codex_mcp_restore.py +304 -0
  76. package/ciel_runtime_support/codex_model_catalog.py +133 -0
  77. package/ciel_runtime_support/codex_process_lifecycle.py +271 -0
  78. package/ciel_runtime_support/codex_router.py +147 -1
  79. package/ciel_runtime_support/codex_session_repository.py +115 -0
  80. package/ciel_runtime_support/codex_session_selection.py +114 -0
  81. package/ciel_runtime_support/command_asset_installer.py +103 -0
  82. package/ciel_runtime_support/compatibility_probe.py +295 -0
  83. package/ciel_runtime_support/compatibility_protocol.py +251 -0
  84. package/ciel_runtime_support/compatibility_runtime.py +166 -0
  85. package/ciel_runtime_support/compatibility_test.py +370 -0
  86. package/ciel_runtime_support/config_migrations.py +307 -0
  87. package/ciel_runtime_support/config_repository.py +175 -0
  88. package/ciel_runtime_support/config_value_codec.py +64 -0
  89. package/ciel_runtime_support/configuration_cli.py +374 -0
  90. package/ciel_runtime_support/context_compaction.py +280 -0
  91. package/ciel_runtime_support/context_setup.py +208 -0
  92. package/ciel_runtime_support/context_summary_policy.py +392 -0
  93. package/ciel_runtime_support/credential_cli.py +104 -0
  94. package/ciel_runtime_support/credential_management.py +261 -0
  95. package/ciel_runtime_support/credentials.py +269 -0
  96. package/ciel_runtime_support/executable_discovery.py +141 -0
  97. package/ciel_runtime_support/github_copilot_oauth.py +335 -0
  98. package/ciel_runtime_support/github_copilot_oauth_runtime.py +213 -0
  99. package/ciel_runtime_support/header_forwarding.py +73 -0
  100. package/ciel_runtime_support/headless_config.py +221 -0
  101. package/ciel_runtime_support/http_response.py +129 -0
  102. package/ciel_runtime_support/install_diagnostics.py +149 -0
  103. package/ciel_runtime_support/kimi_identity.py +123 -0
  104. package/ciel_runtime_support/launch_diagnostics.py +204 -0
  105. package/ciel_runtime_support/launch_state.py +127 -0
  106. package/ciel_runtime_support/live_api_key_controller.py +58 -0
  107. package/ciel_runtime_support/llm_config_http.py +148 -0
  108. package/ciel_runtime_support/llm_option_config.py +259 -0
  109. package/ciel_runtime_support/llm_presentation_data.py +447 -0
  110. package/ciel_runtime_support/llm_presets.py +773 -0
  111. package/ciel_runtime_support/lm_studio_runtime.py +401 -0
  112. package/ciel_runtime_support/managed_mcp_config.py +144 -0
  113. package/ciel_runtime_support/managed_mcp_discovery.py +151 -0
  114. package/ciel_runtime_support/managed_service_cleanup.py +89 -0
  115. package/ciel_runtime_support/mcp_config_reader.py +230 -0
  116. package/ciel_runtime_support/mcp_http_proxy.py +607 -0
  117. package/ciel_runtime_support/mcp_inventory.py +59 -0
  118. package/ciel_runtime_support/mcp_notification_wait_policy.py +159 -0
  119. package/ciel_runtime_support/mcp_probe_codec.py +136 -0
  120. package/ciel_runtime_support/mcp_probe_transport.py +328 -0
  121. package/ciel_runtime_support/mcp_proxy_codec.py +345 -0
  122. package/ciel_runtime_support/mcp_proxy_config.py +107 -0
  123. package/ciel_runtime_support/mcp_proxy_notifications.py +261 -0
  124. package/ciel_runtime_support/mcp_proxy_process.py +560 -0
  125. package/ciel_runtime_support/mcp_split_proxy_http.py +165 -0
  126. package/ciel_runtime_support/mcp_stdio_probe.py +240 -0
  127. package/ciel_runtime_support/mcp_transport.py +146 -0
  128. package/ciel_runtime_support/model_cache_lifecycle.py +78 -0
  129. package/ciel_runtime_support/model_catalog_projection.py +61 -0
  130. package/ciel_runtime_support/model_context_hints.py +109 -0
  131. package/ciel_runtime_support/model_panel.py +147 -0
  132. package/ciel_runtime_support/model_registry_repository.py +231 -0
  133. package/ciel_runtime_support/npm_runtime.py +191 -0
  134. package/ciel_runtime_support/ollama_catalog.py +462 -0
  135. package/ciel_runtime_support/ollama_catalog_cli.py +41 -0
  136. package/ciel_runtime_support/ollama_catalog_repository.py +75 -0
  137. package/ciel_runtime_support/ollama_context_sync.py +87 -0
  138. package/ciel_runtime_support/ollama_forwarding.py +449 -0
  139. package/ciel_runtime_support/openai_chat_passthrough.py +67 -0
  140. package/ciel_runtime_support/openai_chat_router.py +64 -0
  141. package/ciel_runtime_support/openai_forwarding.py +194 -0
  142. package/ciel_runtime_support/openai_responses_router.py +291 -0
  143. package/ciel_runtime_support/openai_responses_stream.py +135 -0
  144. package/ciel_runtime_support/output_budget.py +89 -0
  145. package/ciel_runtime_support/package_lifecycle.py +217 -0
  146. package/ciel_runtime_support/plan_artifact_controller.py +104 -0
  147. package/ciel_runtime_support/prelaunch.py +959 -0
  148. package/ciel_runtime_support/prelaunch_launch_preference.py +75 -0
  149. package/ciel_runtime_support/prelaunch_panel_projection.py +396 -0
  150. package/ciel_runtime_support/prelaunch_terminal.py +764 -0
  151. package/ciel_runtime_support/process_control.py +708 -0
  152. package/ciel_runtime_support/prompt_compaction.py +322 -0
  153. package/ciel_runtime_support/prompt_injection.py +176 -0
  154. package/ciel_runtime_support/protocols/__init__.py +24 -0
  155. package/ciel_runtime_support/protocols/anthropic_content.py +29 -0
  156. package/ciel_runtime_support/protocols/anthropic_thinking_policy.py +336 -0
  157. package/ciel_runtime_support/protocols/chat_projection.py +315 -0
  158. package/ciel_runtime_support/protocols/conversation_policy.py +217 -0
  159. package/ciel_runtime_support/protocols/conversation_turn_policy.py +972 -0
  160. package/ciel_runtime_support/protocols/ollama_chat.py +111 -0
  161. package/ciel_runtime_support/protocols/ollama_response.py +231 -0
  162. package/ciel_runtime_support/protocols/openai_reasoning.py +75 -0
  163. package/ciel_runtime_support/protocols/openai_responses.py +271 -0
  164. package/ciel_runtime_support/protocols/pseudo_tool_history.py +248 -0
  165. package/ciel_runtime_support/protocols/tool_result_projection.py +112 -0
  166. package/ciel_runtime_support/provider_adapters.py +160 -0
  167. package/ciel_runtime_support/provider_catalog_sources.py +316 -0
  168. package/ciel_runtime_support/provider_choice.py +201 -0
  169. package/ciel_runtime_support/provider_compatibility.py +165 -0
  170. package/ciel_runtime_support/provider_config_mutations.py +361 -0
  171. package/ciel_runtime_support/provider_configuration_service.py +162 -0
  172. package/ciel_runtime_support/provider_context.py +308 -0
  173. package/ciel_runtime_support/provider_contract_projection.py +73 -0
  174. package/ciel_runtime_support/provider_descriptor.py +82 -0
  175. package/ciel_runtime_support/provider_endpoint_policy.py +130 -0
  176. package/ciel_runtime_support/provider_endpoint_probe.py +165 -0
  177. package/ciel_runtime_support/provider_launch_endpoint.py +109 -0
  178. package/ciel_runtime_support/provider_limits.py +457 -0
  179. package/ciel_runtime_support/provider_model_identity.py +139 -0
  180. package/ciel_runtime_support/provider_model_selection.py +431 -0
  181. package/ciel_runtime_support/provider_model_specs.py +142 -0
  182. package/ciel_runtime_support/provider_models.py +263 -0
  183. package/ciel_runtime_support/provider_network.py +176 -0
  184. package/ciel_runtime_support/provider_option_cli.py +238 -0
  185. package/ciel_runtime_support/provider_option_panel.py +275 -0
  186. package/ciel_runtime_support/provider_option_status.py +192 -0
  187. package/ciel_runtime_support/provider_policy.py +101 -0
  188. package/ciel_runtime_support/provider_query_policy.py +67 -0
  189. package/ciel_runtime_support/provider_readiness.py +112 -0
  190. package/ciel_runtime_support/provider_request_access.py +131 -0
  191. package/ciel_runtime_support/provider_request_builder.py +250 -0
  192. package/ciel_runtime_support/provider_responses_passthrough.py +81 -0
  193. package/ciel_runtime_support/provider_runtime_info.py +113 -0
  194. package/ciel_runtime_support/provider_runtime_modes.py +150 -0
  195. package/ciel_runtime_support/provider_sampling_policy.py +46 -0
  196. package/ciel_runtime_support/provider_status.py +145 -0
  197. package/ciel_runtime_support/provider_timeout_policy.py +184 -0
  198. package/ciel_runtime_support/provider_tool_policy.py +145 -0
  199. package/ciel_runtime_support/providers/__init__.py +65 -0
  200. package/ciel_runtime_support/providers/anthropic.py +160 -0
  201. package/ciel_runtime_support/providers/anthropic_catalog.py +119 -0
  202. package/ciel_runtime_support/providers/base.py +232 -0
  203. package/ciel_runtime_support/providers/catalog.py +326 -0
  204. package/ciel_runtime_support/providers/cloud.py +194 -0
  205. package/ciel_runtime_support/providers/constants.py +54 -0
  206. package/ciel_runtime_support/providers/deepseek.py +115 -0
  207. package/ciel_runtime_support/providers/fireworks.py +158 -0
  208. package/ciel_runtime_support/providers/github_copilot_oauth.py +199 -0
  209. package/ciel_runtime_support/providers/kimi.py +297 -0
  210. package/ciel_runtime_support/providers/lm_studio.py +76 -0
  211. package/ciel_runtime_support/providers/meta.py +257 -0
  212. package/ciel_runtime_support/providers/native.py +194 -0
  213. package/ciel_runtime_support/providers/nim.py +69 -0
  214. package/ciel_runtime_support/providers/nvidia.py +158 -0
  215. package/ciel_runtime_support/providers/nvidia_runtime.py +285 -0
  216. package/ciel_runtime_support/providers/ollama.py +181 -0
  217. package/ciel_runtime_support/providers/ollama_context.py +195 -0
  218. package/ciel_runtime_support/providers/ollama_runtime.py +213 -0
  219. package/ciel_runtime_support/providers/opencode.py +220 -0
  220. package/ciel_runtime_support/providers/opencode_go.py +37 -0
  221. package/ciel_runtime_support/providers/openrouter.py +57 -0
  222. package/ciel_runtime_support/providers/vllm.py +65 -0
  223. package/ciel_runtime_support/providers/zai.py +119 -0
  224. package/ciel_runtime_support/pseudo_tool_parser.py +115 -0
  225. package/ciel_runtime_support/rate_limit_policy.py +117 -0
  226. package/ciel_runtime_support/rate_limit_repository.py +154 -0
  227. package/ciel_runtime_support/registry.py +46 -0
  228. package/ciel_runtime_support/request_shortcuts.py +253 -0
  229. package/ciel_runtime_support/request_trace.py +323 -0
  230. package/ciel_runtime_support/response_collection.py +209 -0
  231. package/ciel_runtime_support/router_access.py +238 -0
  232. package/ciel_runtime_support/router_client_lifecycle.py +366 -0
  233. package/ciel_runtime_support/router_health_policy.py +101 -0
  234. package/ciel_runtime_support/router_http.py +513 -0
  235. package/ciel_runtime_support/router_process_lifecycle.py +401 -0
  236. package/ciel_runtime_support/router_rate_limit_service.py +285 -0
  237. package/ciel_runtime_support/router_server_runtime.py +103 -0
  238. package/ciel_runtime_support/router_shortcuts.py +201 -0
  239. package/ciel_runtime_support/routing_fallback.py +73 -0
  240. package/ciel_runtime_support/runtime_activity_repository.py +143 -0
  241. package/ciel_runtime_support/runtime_adapters.py +104 -0
  242. package/ciel_runtime_support/runtime_command_factory.py +73 -0
  243. package/ciel_runtime_support/runtime_compatibility.py +50 -0
  244. package/ciel_runtime_support/runtime_constants.py +178 -0
  245. package/ciel_runtime_support/runtime_launch.py +1602 -0
  246. package/ciel_runtime_support/runtime_llm_options.py +312 -0
  247. package/ciel_runtime_support/runtime_logging.py +161 -0
  248. package/ciel_runtime_support/runtime_paths.py +157 -0
  249. package/ciel_runtime_support/runtime_restart.py +84 -0
  250. package/ciel_runtime_support/runtime_upgrade.py +149 -0
  251. package/ciel_runtime_support/secure_json_repository.py +55 -0
  252. package/ciel_runtime_support/session_import.py +356 -0
  253. package/ciel_runtime_support/settings_repository.py +8 -0
  254. package/ciel_runtime_support/slash_command_assets.py +211 -0
  255. package/ciel_runtime_support/sse_stream.py +57 -0
  256. package/ciel_runtime_support/sse_trace.py +225 -0
  257. package/ciel_runtime_support/statusline_script.py +593 -0
  258. package/ciel_runtime_support/statusline_settings.py +53 -0
  259. package/ciel_runtime_support/stream_chunk_policy.py +18 -0
  260. package/ciel_runtime_support/streaming_anthropic.py +1955 -0
  261. package/ciel_runtime_support/synthetic_tool_policy.py +105 -0
  262. package/ciel_runtime_support/terminal_platform_io.py +127 -0
  263. package/ciel_runtime_support/timeout_profile.py +196 -0
  264. package/ciel_runtime_support/tool_dialects.py +85 -0
  265. package/ciel_runtime_support/tool_exposure_policy.py +63 -0
  266. package/ciel_runtime_support/tool_guard_hooks.py +218 -0
  267. package/ciel_runtime_support/tool_request_projection.py +96 -0
  268. package/ciel_runtime_support/tool_schema.py +483 -0
  269. package/ciel_runtime_support/tool_side_effect_dedupe.py +95 -0
  270. package/ciel_runtime_support/ui_text.py +266 -0
  271. package/ciel_runtime_support/upstream_error_policy.py +104 -0
  272. package/ciel_runtime_support/upstream_retry.py +419 -0
  273. package/ciel_runtime_support/upstream_stream_io.py +106 -0
  274. package/ciel_runtime_support/usage_events.py +96 -0
  275. package/ciel_runtime_support/visible_stream_filters.py +130 -0
  276. package/ciel_runtime_support/web_endpoints.py +447 -0
  277. package/ciel_runtime_support/web_ui.py +915 -0
  278. package/ciel_runtime_support/web_ui_controller.py +189 -0
  279. package/ciel_runtime_support/windows_console_input.py +137 -0
  280. package/ciel_runtime_support/windows_console_mode.py +112 -0
  281. package/docs/Architecture.md +54 -0
  282. package/docs/Configuration.md +17 -0
  283. package/docs/Module-Map.md +1093 -26
  284. package/docs/Providers.md +46 -1
  285. package/docs/adr/0001-runtime-bounded-contexts.md +295 -0
  286. package/npm-bin/run-ciel-runtime.js +22 -2
  287. package/package.json +9 -2
@@ -0,0 +1,266 @@
1
+ """Localized prelaunch labels and provider guidance data."""
2
+
3
+ from __future__ import annotations
4
+
5
+ UI_TEXT = {
6
+ "en": {
7
+ "language": "Language",
8
+ "provider": "Provider",
9
+ "api_key": "API key",
10
+ "base_url": "Base URL",
11
+ "model": "Model",
12
+ "advisor_model": "Advisor Model",
13
+ "test": "Test compatibility",
14
+ "options": "LLM options",
15
+ "channel_delivery": "Channel delivery",
16
+ "channels": "Channels",
17
+ "log_level": "Log level",
18
+ "web_backend": "Web backend",
19
+ "presets": "LLM presets",
20
+ "context_setup": "Context setup",
21
+ "timeout_preset": "Timeout preset",
22
+ "apply_preset": "Apply preset",
23
+ "model_family": "Model family",
24
+ "recommended_preset_is": "recommended preset is",
25
+ "back": "Back",
26
+ "launch": "Launch Claude Code",
27
+ "launch_agy": "Launch AGY",
28
+ "launch_codex_app_server": "Launch Codex App Server",
29
+ "launch_codex": "Launch Codex",
30
+ "quit": "Quit",
31
+ "title": "ciel-runtime pre-launch",
32
+ },
33
+ "ko": {
34
+ "language": "언어",
35
+ "provider": "프로바이더",
36
+ "api_key": "API 키",
37
+ "base_url": "Base URL",
38
+ "model": "모델",
39
+ "advisor_model": "Advisor Model",
40
+ "test": "호환성 테스트",
41
+ "options": "LLM 옵션",
42
+ "channel_delivery": "채널 전달 방식",
43
+ "channels": "채널",
44
+ "log_level": "로그 레벨",
45
+ "web_backend": "웹 백엔드",
46
+ "presets": "LLM 프리셋",
47
+ "context_setup": "컨텍스트 설정",
48
+ "timeout_preset": "타임아웃 프리셋",
49
+ "apply_preset": "프리셋 적용",
50
+ "model_family": "모델 계열",
51
+ "recommended_preset_is": "추천 프리셋",
52
+ "back": "뒤로",
53
+ "launch": "Claude Code 실행",
54
+ "launch_agy": "AGY 실행",
55
+ "launch_codex_app_server": "Codex App Server 실행",
56
+ "launch_codex": "Codex 실행",
57
+ "quit": "종료",
58
+ "title": "ciel-runtime 실행 전 설정",
59
+ },
60
+ "ja": {
61
+ "language": "言語",
62
+ "provider": "プロバイダー",
63
+ "api_key": "APIキー",
64
+ "base_url": "Base URL",
65
+ "model": "モデル",
66
+ "advisor_model": "Advisor Model",
67
+ "test": "互換性テスト",
68
+ "options": "LLMオプション",
69
+ "channel_delivery": "チャンネル配信方式",
70
+ "channels": "チャンネル",
71
+ "log_level": "ログレベル",
72
+ "web_backend": "Webバックエンド",
73
+ "presets": "LLMプリセット",
74
+ "context_setup": "コンテキスト設定",
75
+ "timeout_preset": "timeout プリセット",
76
+ "apply_preset": "プリセットを適用",
77
+ "model_family": "モデル系統",
78
+ "recommended_preset_is": "推奨プリセット",
79
+ "back": "戻る",
80
+ "launch": "Claude Codeを起動",
81
+ "launch_agy": "AGYを起動",
82
+ "launch_codex_app_server": "Codex App Serverを起動",
83
+ "launch_codex": "Codexを起動",
84
+ "quit": "終了",
85
+ "title": "ciel-runtime 起動前設定",
86
+ },
87
+ "zh": {
88
+ "language": "语言",
89
+ "provider": "提供商",
90
+ "api_key": "API 密钥",
91
+ "base_url": "Base URL",
92
+ "model": "模型",
93
+ "advisor_model": "Advisor Model",
94
+ "test": "兼容性测试",
95
+ "options": "LLM 选项",
96
+ "channel_delivery": "频道投递方式",
97
+ "channels": "频道",
98
+ "log_level": "日志级别",
99
+ "web_backend": "Web 后端",
100
+ "presets": "LLM 预设",
101
+ "context_setup": "上下文设置",
102
+ "timeout_preset": "Timeout 预设",
103
+ "apply_preset": "应用预设",
104
+ "model_family": "模型类型",
105
+ "recommended_preset_is": "推荐预设",
106
+ "back": "返回",
107
+ "launch": "启动 Claude Code",
108
+ "launch_agy": "启动 AGY",
109
+ "launch_codex_app_server": "启动 Codex App Server",
110
+ "launch_codex": "启动 Codex",
111
+ "quit": "退出",
112
+ "title": "ciel-runtime 启动前设置",
113
+ },
114
+ }
115
+
116
+
117
+
118
+ PROVIDER_NOTES = {
119
+ "en": {
120
+ "anthropic": [
121
+ "Anthropic: uses Claude Code's native Anthropic connection.",
122
+ "Set an Anthropic API key here, or run `claude /login` separately to use your Claude account login.",
123
+ ],
124
+ "agy": [
125
+ "AGY: uses Google Antigravity CLI's native sign-in and settings.",
126
+ "AGY routed currently adds Ciel Runtime channel/PTY wake support; it does not override AGY model upstream traffic.",
127
+ ],
128
+ "ollama": [
129
+ "Ollama: uses your local Ollama daemon; API key is normally not required.",
130
+ "To use :cloud models through local Ollama, sign in on the Ollama host with `ollama signin`.",
131
+ ],
132
+ "ollama-cloud": [
133
+ "Ollama Cloud: calls https://ollama.com/api directly; an Ollama API key is required.",
134
+ "Use this when you want cloud models without relying on the local Ollama daemon's sign-in state.",
135
+ ],
136
+ "vllm": [
137
+ "vLLM: Anthropic Messages API is the default; OpenAI-only chat completions endpoints are auto-detected.",
138
+ "If auto-detection finds only /v1/chat/completions, ciel-runtime disables Native compatibility and routes through the local converter.",
139
+ ],
140
+ "lm-studio": [
141
+ "LM Studio: uses the local Anthropic-compatible /v1/messages server by default.",
142
+ "Start LM Studio's Local Server and use http://127.0.0.1:1234/v1 as the base URL; set native=false only for router fallback.",
143
+ ],
144
+ "self-hosted-nim": [
145
+ "Self-hosted NIM: enter the NIM server root that exposes Anthropic-compatible /v1/messages.",
146
+ "This native path does not use the NVIDIA hosted API Catalog proxy.",
147
+ ],
148
+ "nvidia-hosted": [
149
+ "NVIDIA hosted: uses NVIDIA API Catalog at https://integrate.api.nvidia.com/v1.",
150
+ "Hosted API Catalog currently uses the ciel-runtime router path; self-hosted NIM uses native Messages.",
151
+ ],
152
+ },
153
+ "ko": {
154
+ "anthropic": [
155
+ "Anthropic: Claude Code의 기본 Anthropic 연결을 사용합니다.",
156
+ "여기에 Anthropic API key를 넣거나, 별도로 `claude /login`을 실행해 Claude 계정 로그인을 사용하세요.",
157
+ ],
158
+ "agy": [
159
+ "AGY: Google Antigravity CLI의 기본 로그인과 설정을 사용합니다.",
160
+ "AGY routed는 현재 Ciel Runtime channel/PTY wake 보조 기능을 붙이는 모드이며 AGY 모델 upstream 트래픽을 바꾸지는 않습니다.",
161
+ ],
162
+ "ollama": [
163
+ "Ollama: 로컬 Ollama 데몬을 사용합니다. 일반 로컬 모델은 API key가 필요 없습니다.",
164
+ "로컬 Ollama로 :cloud 모델을 쓰려면 Ollama가 실행되는 호스트에서 `ollama signin`이 필요합니다.",
165
+ ],
166
+ "ollama-cloud": [
167
+ "Ollama Cloud: https://ollama.com/api를 직접 호출합니다. Ollama API key가 필요합니다.",
168
+ "로컬 Ollama 데몬의 로그인 상태와 무관하게 클라우드 모델을 쓰고 싶을 때 사용합니다.",
169
+ ],
170
+ "vllm": [
171
+ "vLLM: Anthropic Messages API를 기본값으로 사용합니다. OpenAI 전용 chat completions endpoint는 자동 감지합니다.",
172
+ "자동 감지가 /v1/chat/completions만 찾으면 Native compatibility를 끄고 로컬 변환 라우터를 사용합니다.",
173
+ ],
174
+ "lm-studio": [
175
+ "LM Studio: 기본적으로 로컬 Anthropic 호환 /v1/messages 서버를 직접 사용합니다.",
176
+ "LM Studio의 Local Server를 켜고 base URL은 http://127.0.0.1:1234/v1 을 사용하세요. 라우터 fallback이 필요할 때만 native=false를 쓰세요.",
177
+ ],
178
+ "self-hosted-nim": [
179
+ "Self-hosted NIM: Anthropic 호환 /v1/messages를 노출하는 NIM 서버 root를 넣으세요.",
180
+ "이 native 경로는 NVIDIA hosted API Catalog 프록시를 사용하지 않습니다.",
181
+ ],
182
+ "nvidia-hosted": [
183
+ "NVIDIA hosted: https://integrate.api.nvidia.com/v1 의 NVIDIA API Catalog를 사용합니다.",
184
+ "Hosted API Catalog는 ciel-runtime router 경로를 기본 사용합니다. self-hosted NIM은 native Messages를 사용합니다.",
185
+ ],
186
+ },
187
+ "ja": {
188
+ "anthropic": [
189
+ "Anthropic: Claude CodeのネイティブAnthropic接続を使います。",
190
+ "ここでAnthropic API keyを設定するか、別途`claude /login`を実行してClaudeアカウントログインを使ってください。",
191
+ ],
192
+ "agy": [
193
+ "AGY: Google Antigravity CLIのネイティブサインインと設定を使います。",
194
+ "AGY routedは現時点でCiel Runtime channel/PTY wake補助を追加し、AGYのモデルupstream trafficは上書きしません。",
195
+ ],
196
+ "ollama": [
197
+ "Ollama: ローカルのOllama daemonを使います。通常のローカルモデルではAPI keyは不要です。",
198
+ "ローカルOllama経由で:cloudモデルを使うには、Ollamaホストで`ollama signin`が必要です。",
199
+ ],
200
+ "ollama-cloud": [
201
+ "Ollama Cloud: https://ollama.com/api を直接呼び出します。Ollama API keyが必要です。",
202
+ "ローカルOllama daemonのサインイン状態に依存せずクラウドモデルを使う場合に選びます。",
203
+ ],
204
+ "vllm": [
205
+ "vLLM: Anthropic Messages APIを既定にします。OpenAI専用chat completions endpointは自動検出します。",
206
+ "自動検出で/v1/chat/completionsのみ見つかった場合、Native compatibilityを無効にしてローカル変換routerを使います。",
207
+ ],
208
+ "lm-studio": [
209
+ "LM Studio: 既定ではローカルのAnthropic互換 /v1/messages サーバーを直接使います。",
210
+ "LM StudioのLocal Serverを起動し、base URLは http://127.0.0.1:1234/v1 を使ってください。router fallbackが必要な時だけnative=falseにします。",
211
+ ],
212
+ "self-hosted-nim": [
213
+ "Self-hosted NIM: Anthropic互換/v1/messagesを公開するNIMサーバーrootを入力してください。",
214
+ "このnative経路はNVIDIA hosted API Catalog proxyを使いません。",
215
+ ],
216
+ "nvidia-hosted": [
217
+ "NVIDIA hosted: https://integrate.api.nvidia.com/v1 のNVIDIA API Catalogを使います。",
218
+ "Hosted API Catalogはciel-runtime router経路を既定で使います。self-hosted NIMはnative Messagesを使います。",
219
+ ],
220
+ },
221
+ "zh": {
222
+ "anthropic": [
223
+ "Anthropic: 使用Claude Code原生Anthropic连接。",
224
+ "可在此设置Anthropic API key,或另行运行`claude /login`使用Claude账号登录。",
225
+ ],
226
+ "agy": [
227
+ "AGY: 使用 Google Antigravity CLI 原生登录和设置。",
228
+ "AGY routed 当前添加 Ciel Runtime channel/PTY wake 辅助,不覆盖 AGY 模型 upstream 流量。",
229
+ ],
230
+ "ollama": [
231
+ "Ollama: 使用本地Ollama daemon;普通本地模型通常不需要API key。",
232
+ "若通过本地Ollama使用:cloud模型,需要在运行Ollama的主机上执行`ollama signin`。",
233
+ ],
234
+ "ollama-cloud": [
235
+ "Ollama Cloud: 直接调用 https://ollama.com/api;需要Ollama API key。",
236
+ "当你想不依赖本地Ollama daemon登录状态使用云端模型时选择它。",
237
+ ],
238
+ "vllm": [
239
+ "vLLM: 默认使用 Anthropic Messages API。仅 OpenAI chat completions 的端点会自动检测。",
240
+ "如果自动检测只发现 /v1/chat/completions,ciel-runtime 会关闭 Native compatibility 并使用本地转换路由。",
241
+ ],
242
+ "lm-studio": [
243
+ "LM Studio: 默认直接使用本地 Anthropic-compatible /v1/messages 服务器。",
244
+ "启动 LM Studio 的 Local Server,并使用 http://127.0.0.1:1234/v1 作为 base URL;仅在需要路由 fallback 时设置 native=false。",
245
+ ],
246
+ "self-hosted-nim": [
247
+ "Self-hosted NIM: 请输入暴露 Anthropic-compatible /v1/messages 的 NIM 服务器 root。",
248
+ "此 native 路径不使用 NVIDIA hosted API Catalog 代理。",
249
+ ],
250
+ "nvidia-hosted": [
251
+ "NVIDIA hosted: 使用 https://integrate.api.nvidia.com/v1 的 NVIDIA API Catalog。",
252
+ "Hosted API Catalog 默认使用 ciel-runtime router 路径;self-hosted NIM 使用 native Messages。",
253
+ ],
254
+ },
255
+ }
256
+
257
+ DEFAULT_ADVISOR_MODELS: tuple[str, ...] = (
258
+ "",
259
+ "claude-fable-5",
260
+ "claude-opus-5",
261
+ "claude-opus-4-8",
262
+ "deepseek-v4-pro",
263
+ "claude-opus-4-6",
264
+ "claude-sonnet-4-6",
265
+ "glm-5.1",
266
+ )
@@ -0,0 +1,104 @@
1
+ """Pure classification and presentation policy for upstream failures."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import re
7
+ from collections.abc import Callable, Mapping
8
+ from typing import Any
9
+
10
+
11
+ def http_error_message(
12
+ error: Any,
13
+ raw: str | None,
14
+ *,
15
+ first_header: Callable[[Mapping[str, str], list[str]], str | None],
16
+ parse_retry_after: Callable[[str], float | None],
17
+ format_duration: Callable[[float], str],
18
+ ) -> str:
19
+ if raw is None:
20
+ raw = error.read().decode("utf-8", errors="ignore")
21
+ message = raw.strip() or str(error)
22
+ error_type = ""
23
+ try:
24
+ payload = json.loads(raw)
25
+ if isinstance(payload, dict):
26
+ if isinstance(payload.get("error"), dict):
27
+ error_object = payload["error"]
28
+ error_type = str(error_object.get("type") or "").strip()
29
+ message = str(error_object.get("message") or error_object)
30
+ elif payload.get("error"):
31
+ message = str(payload["error"])
32
+ elif payload.get("message"):
33
+ message = str(payload["message"])
34
+ error_type = str(payload.get("type") or "").strip()
35
+ except (TypeError, ValueError):
36
+ pass
37
+ if error_type and error_type not in message:
38
+ message = f"{error_type}: {message}"
39
+ retry_after = first_header(error.headers, ["Retry-After", "retry-after"])
40
+ if not retry_after:
41
+ return message
42
+ retry_text = retry_after.strip()
43
+ seconds = parse_retry_after(retry_text)
44
+ if seconds is None:
45
+ return f"{message} Retry-After: {retry_text}"
46
+ display = format_duration(seconds)
47
+ if retry_text and re.fullmatch(r"\d+(?:\.\d+)?", retry_text):
48
+ return f"{message} Retry-After: {display} ({retry_text}s)"
49
+ return f"{message} Retry-After: {display}"
50
+
51
+
52
+ def retry_message(language: str, attempt: int, total: int, *, rate_limit: bool = False) -> str:
53
+ language = str(language or "en")
54
+ if rate_limit:
55
+ messages = {
56
+ "ko": f"Upstream rate limit에 도달해 대기 후 재시도합니다 ({attempt}/{total}).",
57
+ "ja": f"Upstream rate limit に達したため、待機して再試行します ({attempt}/{total})。",
58
+ "zh": f"已达到 upstream rate limit,等待后重试 ({attempt}/{total})。",
59
+ "en": f"Upstream rate limit reached; waiting before retry ({attempt}/{total}).",
60
+ }
61
+ else:
62
+ messages = {
63
+ "ko": f"서버가 응답하지 않아 재시도합니다 ({attempt}/{total}).",
64
+ "ja": f"サーバーが応答しないため再試行します ({attempt}/{total})。",
65
+ "zh": f"服务器未响应,正在重试 ({attempt}/{total})。",
66
+ "en": f"Upstream server did not respond; retrying ({attempt}/{total}).",
67
+ }
68
+ return messages.get(language, messages["en"])
69
+
70
+
71
+ def retry_wait_seconds(attempt: int) -> float:
72
+ return min(20.0, 2.0 * max(1, attempt))
73
+
74
+
75
+ def retryable_exception(error: BaseException) -> bool:
76
+ text = f"{type(error).__name__}: {error}".lower()
77
+ markers = (
78
+ "timed out",
79
+ "timeout",
80
+ "connection aborted",
81
+ "connection was aborted",
82
+ "connection reset",
83
+ "connection refused",
84
+ "remote end closed connection",
85
+ "remote disconnected",
86
+ "eof occurred in violation of protocol",
87
+ "temporarily unavailable",
88
+ "broken pipe",
89
+ )
90
+ return any(marker in text for marker in markers)
91
+
92
+
93
+ def configured_gateway_retries(config: dict[str, Any]) -> int:
94
+ value = config.get("gateway_retries")
95
+ if value is None:
96
+ # Generation requests are not idempotent. If an upstream completed a
97
+ # request but its response was lost, an automatic retry spends the
98
+ # entire prompt again. Providers/clients may still apply their own
99
+ # retry policy, and users can opt in here explicitly when desired.
100
+ return 0
101
+ try:
102
+ return max(0, int(value))
103
+ except (TypeError, ValueError, OverflowError):
104
+ return 0