aria-code 0.167.0__py3-none-win_amd64.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 (601) hide show
  1. aria_bots/__init__.py +7 -0
  2. aria_bots/channels/README.md +97 -0
  3. aria_bots/channels/__init__.py +1 -0
  4. aria_bots/channels/approvals.py +263 -0
  5. aria_bots/channels/conversation.py +280 -0
  6. aria_bots/channels/digest.py +186 -0
  7. aria_bots/channels/registry.py +95 -0
  8. aria_bots/engine.py +144 -0
  9. aria_bots/feishu_bot.py +1385 -0
  10. aria_bots/logistics/__init__.py +1 -0
  11. aria_bots/logistics/carriers.py +253 -0
  12. aria_bots/logistics/freight.py +154 -0
  13. aria_bots/logistics/inventory.py +242 -0
  14. aria_bots/logistics/mcp_server.py +156 -0
  15. aria_bots/logistics/records.py +119 -0
  16. aria_bots/logistics/tenancy.py +152 -0
  17. aria_bots/market.py +91 -0
  18. aria_bots/relay_client.py +326 -0
  19. aria_bots/telegram_bot.py +299 -0
  20. aria_code/__init__.py +111 -0
  21. aria_code/_bin/aria-native.exe +0 -0
  22. aria_code/_bin/aria-runtime.exe +0 -0
  23. aria_code/_version.py +20 -0
  24. aria_code/account_memory.py +296 -0
  25. aria_code/account_session.py +166 -0
  26. aria_code/adk_apps/__init__.py +1 -0
  27. aria_code/adk_apps/aria_code_review/__init__.py +1 -0
  28. aria_code/adk_apps/aria_code_review/agent.py +32 -0
  29. aria_code/adk_apps/aria_research/__init__.py +1 -0
  30. aria_code/adk_apps/aria_research/agent.py +31 -0
  31. aria_code/agents/__init__.py +49 -0
  32. aria_code/agents/base.py +329 -0
  33. aria_code/agents/code_review.py +200 -0
  34. aria_code/agents/deep/__init__.py +37 -0
  35. aria_code/agents/deep/calibration_loop.py +144 -0
  36. aria_code/agents/deep/critic.py +125 -0
  37. aria_code/agents/deep/deepen.py +193 -0
  38. aria_code/agents/deep/models.py +149 -0
  39. aria_code/agents/deep/pipeline.py +164 -0
  40. aria_code/agents/deep/quant_fusion.py +192 -0
  41. aria_code/agents/deep/themes.py +95 -0
  42. aria_code/agents/deep/tiers.py +106 -0
  43. aria_code/agents/engineering/__init__.py +14 -0
  44. aria_code/agents/engineering/coder.py +222 -0
  45. aria_code/agents/engineering/tester.py +145 -0
  46. aria_code/agents/financial/__init__.py +21 -0
  47. aria_code/agents/financial/cashflow_burn.py +119 -0
  48. aria_code/agents/financial/catalyst.py +279 -0
  49. aria_code/agents/financial/corporate_finance.py +175 -0
  50. aria_code/agents/financial/debate.py +224 -0
  51. aria_code/agents/financial/earnings.py +315 -0
  52. aria_code/agents/financial/fundamental.py +178 -0
  53. aria_code/agents/financial/macro.py +111 -0
  54. aria_code/agents/financial/news.py +231 -0
  55. aria_code/agents/financial/risk.py +146 -0
  56. aria_code/agents/financial/sector.py +279 -0
  57. aria_code/agents/financial/strategist.py +121 -0
  58. aria_code/agents/financial/stripe_revenue.py +127 -0
  59. aria_code/agents/financial/synthesis.py +274 -0
  60. aria_code/agents/financial/technical.py +277 -0
  61. aria_code/agents/orchestrator.py +44 -0
  62. aria_code/agents/portfolio_agent.py +392 -0
  63. aria_code/agents/realty/__init__.py +62 -0
  64. aria_code/agents/realty/asset_diagnosis.py +152 -0
  65. aria_code/agents/realty/business_match.py +166 -0
  66. aria_code/agents/realty/cashflow_verify.py +209 -0
  67. aria_code/agents/realty/contract_rules.py +210 -0
  68. aria_code/agents/realty/energy_anomaly.py +189 -0
  69. aria_code/agents/realty/exit_settlement.py +208 -0
  70. aria_code/agents/realty/fulfillment_risk.py +206 -0
  71. aria_code/agents/realty/ops_optimize.py +160 -0
  72. aria_code/agents/realty/revenue_share.py +215 -0
  73. aria_code/agents/registry.py +168 -0
  74. aria_code/agents/signal_scheme.py +111 -0
  75. aria_code/agents/sports/__init__.py +0 -0
  76. aria_code/agents/sports/football_agent.py +197 -0
  77. aria_code/agents/supervisor.py +113 -0
  78. aria_code/agents/team.py +500 -0
  79. aria_code/agents/video/__init__.py +16 -0
  80. aria_code/agents/video/director.py +376 -0
  81. aria_code/agents/video/qa_agent.py +143 -0
  82. aria_code/agents/video/script_doctor.py +112 -0
  83. aria_code/agents/warehouse/__init__.py +25 -0
  84. aria_code/agents/warehouse/contracts.py +26 -0
  85. aria_code/agents/warehouse/dashboard.py +155 -0
  86. aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
  87. aria_code/agents/warehouse/inbound_exceptions.py +25 -0
  88. aria_code/agents/warehouse/inventory_health.py +24 -0
  89. aria_code/agents/warehouse/local_run.py +71 -0
  90. aria_code/agents/warehouse/local_snapshot.py +132 -0
  91. aria_code/agents/warehouse/logistics_cost.py +84 -0
  92. aria_code/agents/warehouse/logistics_sync.py +21 -0
  93. aria_code/agents/warehouse/navigation.schema.json +110 -0
  94. aria_code/agents/warehouse/task_agent.py +172 -0
  95. aria_code/agents/warehouse/workflow.py +31 -0
  96. aria_code/aliyun_data_client.py +4 -0
  97. aria_code/apps/README.md +12 -0
  98. aria_code/apps/__init__.py +2 -0
  99. aria_code/apps/channels/README.md +9 -0
  100. aria_code/apps/channels/__init__.py +17 -0
  101. aria_code/apps/channels/approvals.py +11 -0
  102. aria_code/apps/channels/conversation.py +11 -0
  103. aria_code/apps/channels/digest.py +11 -0
  104. aria_code/apps/channels/intake.py +92 -0
  105. aria_code/apps/channels/registry.py +11 -0
  106. aria_code/apps/channels/tradingview.py +94 -0
  107. aria_code/apps/cli/README.md +13 -0
  108. aria_code/apps/cli/__init__.py +2 -0
  109. aria_code/apps/cli/_optional.py +120 -0
  110. aria_code/apps/cli/app_server.py +656 -0
  111. aria_code/apps/cli/auto_update.py +125 -0
  112. aria_code/apps/cli/bootstrap.py +206 -0
  113. aria_code/apps/cli/broker_render.py +206 -0
  114. aria_code/apps/cli/chat_turn.py +1327 -0
  115. aria_code/apps/cli/cloud_models.py +231 -0
  116. aria_code/apps/cli/codegen_paths.py +29 -0
  117. aria_code/apps/cli/commands/__init__.py +34 -0
  118. aria_code/apps/cli/commands/_business_render.py +78 -0
  119. aria_code/apps/cli/commands/_ui.py +71 -0
  120. aria_code/apps/cli/commands/analysis_cmds.py +378 -0
  121. aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
  122. aria_code/apps/cli/commands/auth_cmds.py +215 -0
  123. aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
  124. aria_code/apps/cli/commands/broker_cmds.py +1236 -0
  125. aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
  126. aria_code/apps/cli/commands/canvas_cmds.py +77 -0
  127. aria_code/apps/cli/commands/catalog.py +189 -0
  128. aria_code/apps/cli/commands/core_cmds.py +2748 -0
  129. aria_code/apps/cli/commands/data_cmds.py +521 -0
  130. aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
  131. aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
  132. aria_code/apps/cli/commands/engineering_cmds.py +399 -0
  133. aria_code/apps/cli/commands/file_cmds.py +312 -0
  134. aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
  135. aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
  136. aria_code/apps/cli/commands/market.py +544 -0
  137. aria_code/apps/cli/commands/market_cmds.py +1419 -0
  138. aria_code/apps/cli/commands/market_context.py +432 -0
  139. aria_code/apps/cli/commands/market_render.py +7 -0
  140. aria_code/apps/cli/commands/model_cmds.py +2374 -0
  141. aria_code/apps/cli/commands/ops_cmds.py +721 -0
  142. aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
  143. aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
  144. aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
  145. aria_code/apps/cli/commands/report.py +476 -0
  146. aria_code/apps/cli/commands/scaffold_templates.py +617 -0
  147. aria_code/apps/cli/commands/session_cmds.py +236 -0
  148. aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
  149. aria_code/apps/cli/commands/team.py +723 -0
  150. aria_code/apps/cli/commands/team_render.py +8 -0
  151. aria_code/apps/cli/commands/ui_cmds.py +401 -0
  152. aria_code/apps/cli/commands/warehouse_cmds.py +297 -0
  153. aria_code/apps/cli/commands/workflow_cmds.py +629 -0
  154. aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
  155. aria_code/apps/cli/config_paths.py +73 -0
  156. aria_code/apps/cli/config_store.py +158 -0
  157. aria_code/apps/cli/constants.py +88 -0
  158. aria_code/apps/cli/context.py +34 -0
  159. aria_code/apps/cli/conversation_policy.py +53 -0
  160. aria_code/apps/cli/deterministic.py +200 -0
  161. aria_code/apps/cli/direct.py +48 -0
  162. aria_code/apps/cli/earnings_view.py +172 -0
  163. aria_code/apps/cli/endpoint_migration.py +64 -0
  164. aria_code/apps/cli/exec_events.py +255 -0
  165. aria_code/apps/cli/file_references.py +155 -0
  166. aria_code/apps/cli/finance_service_catalog.py +111 -0
  167. aria_code/apps/cli/football_reports.py +231 -0
  168. aria_code/apps/cli/github_app_auth.py +135 -0
  169. aria_code/apps/cli/google_login.py +239 -0
  170. aria_code/apps/cli/handlers/__init__.py +11 -0
  171. aria_code/apps/cli/handlers/broker_handlers.py +122 -0
  172. aria_code/apps/cli/handlers/chart_handlers.py +1314 -0
  173. aria_code/apps/cli/handlers/market_handlers.py +2570 -0
  174. aria_code/apps/cli/handlers/realty_handlers.py +114 -0
  175. aria_code/apps/cli/handlers/sports_handlers.py +22 -0
  176. aria_code/apps/cli/handlers/strategy_advice.py +82 -0
  177. aria_code/apps/cli/headless.py +352 -0
  178. aria_code/apps/cli/helpers.py +326 -0
  179. aria_code/apps/cli/hooks.py +180 -0
  180. aria_code/apps/cli/i18n.py +310 -0
  181. aria_code/apps/cli/intent.py +136 -0
  182. aria_code/apps/cli/intent_router.py +305 -0
  183. aria_code/apps/cli/intent_shadow.py +72 -0
  184. aria_code/apps/cli/intent_signals.py +347 -0
  185. aria_code/apps/cli/lifecycle_hooks.py +48 -0
  186. aria_code/apps/cli/local_tool_schemas.py +550 -0
  187. aria_code/apps/cli/main.py +39 -0
  188. aria_code/apps/cli/market_hours.py +100 -0
  189. aria_code/apps/cli/market_metadata.py +135 -0
  190. aria_code/apps/cli/market_universe.py +487 -0
  191. aria_code/apps/cli/message_processing.py +310 -0
  192. aria_code/apps/cli/mixin_binding.py +32 -0
  193. aria_code/apps/cli/model_catalog.py +652 -0
  194. aria_code/apps/cli/model_probe.py +169 -0
  195. aria_code/apps/cli/model_retirement.py +65 -0
  196. aria_code/apps/cli/native_branding.py +12 -0
  197. aria_code/apps/cli/native_bridge.py +118 -0
  198. aria_code/apps/cli/native_entry.py +58 -0
  199. aria_code/apps/cli/pdf_report.py +977 -0
  200. aria_code/apps/cli/plan_mode.py +139 -0
  201. aria_code/apps/cli/plotly_html.py +15 -0
  202. aria_code/apps/cli/prediction_feedback.py +202 -0
  203. aria_code/apps/cli/preflight.py +502 -0
  204. aria_code/apps/cli/project_aria.py +60 -0
  205. aria_code/apps/cli/prompt_assembly.py +78 -0
  206. aria_code/apps/cli/prompts/__init__.py +0 -0
  207. aria_code/apps/cli/prompts/coding.py +71 -0
  208. aria_code/apps/cli/prompts/select.py +193 -0
  209. aria_code/apps/cli/prompts/system_prompts.py +562 -0
  210. aria_code/apps/cli/prompts/ui.py +436 -0
  211. aria_code/apps/cli/provider_endpoints.py +237 -0
  212. aria_code/apps/cli/provider_keys.py +73 -0
  213. aria_code/apps/cli/providers/__init__.py +1 -0
  214. aria_code/apps/cli/providers/base.py +775 -0
  215. aria_code/apps/cli/providers/chat_routing.py +139 -0
  216. aria_code/apps/cli/providers/collaboration.py +98 -0
  217. aria_code/apps/cli/providers/llm/__init__.py +1 -0
  218. aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
  219. aria_code/apps/cli/providers/llm/ollama_stream.py +1574 -0
  220. aria_code/apps/cli/providers/llm/response_cache.py +60 -0
  221. aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
  222. aria_code/apps/cli/providers/runtime_bridge.py +586 -0
  223. aria_code/apps/cli/providers/vertexai_stream.py +592 -0
  224. aria_code/apps/cli/release_download.py +159 -0
  225. aria_code/apps/cli/review_runner.py +111 -0
  226. aria_code/apps/cli/runtime_consumer.py +769 -0
  227. aria_code/apps/cli/sandbox.py +32 -0
  228. aria_code/apps/cli/session_export.py +120 -0
  229. aria_code/apps/cli/session_jsonl.py +208 -0
  230. aria_code/apps/cli/session_refresh.py +123 -0
  231. aria_code/apps/cli/session_store.py +125 -0
  232. aria_code/apps/cli/skills_catalog.py +273 -0
  233. aria_code/apps/cli/task_isolation.py +211 -0
  234. aria_code/apps/cli/terminal_chrome.py +412 -0
  235. aria_code/apps/cli/todo_tracker.py +190 -0
  236. aria_code/apps/cli/tool_executor.py +932 -0
  237. aria_code/apps/cli/tool_registry.py +34 -0
  238. aria_code/apps/cli/tool_scope.py +113 -0
  239. aria_code/apps/cli/tools/__init__.py +40 -0
  240. aria_code/apps/cli/tools/context.py +46 -0
  241. aria_code/apps/cli/tools/file_tools.py +181 -0
  242. aria_code/apps/cli/tools/market_tools.py +626 -0
  243. aria_code/apps/cli/tools/notebook_tools.py +111 -0
  244. aria_code/apps/cli/tools/system_tools.py +656 -0
  245. aria_code/apps/cli/tools/write_tools.py +961 -0
  246. aria_code/apps/cli/tradingview_bridge.py +529 -0
  247. aria_code/apps/cli/transactions.py +269 -0
  248. aria_code/apps/cli/turn_planning.py +137 -0
  249. aria_code/apps/cli/update_check.py +257 -0
  250. aria_code/apps/cli/updater.py +373 -0
  251. aria_code/apps/cli/utils/__init__.py +0 -0
  252. aria_code/apps/cli/utils/market_detect.py +1663 -0
  253. aria_code/apps/cli/web_login.py +136 -0
  254. aria_code/apps/cli/workflow_runner.py +127 -0
  255. aria_code/apps/cli/workspace_route.py +121 -0
  256. aria_code/apps/daemon/README.md +14 -0
  257. aria_code/apps/vscode/README.md +115 -0
  258. aria_code/apps/vscode/package.json +70 -0
  259. aria_code/aria_cli.py +5244 -0
  260. aria_code/aria_daemon.py +1372 -0
  261. aria_code/aria_feishu_bot.py +16 -0
  262. aria_code/aria_mcp_server.py +61 -0
  263. aria_code/aria_relay_client.py +4 -0
  264. aria_code/aria_telegram_bot.py +11 -0
  265. aria_code/ariarc.py +385 -0
  266. aria_code/artifacts.py +581 -0
  267. aria_code/backtest_engine.py +4 -0
  268. aria_code/backtest_report.py +4 -0
  269. aria_code/brokers/__init__.py +78 -0
  270. aria_code/brokers/automation.py +193 -0
  271. aria_code/brokers/base.py +231 -0
  272. aria_code/brokers/capabilities.py +264 -0
  273. aria_code/brokers/cn/__init__.py +10 -0
  274. aria_code/brokers/cn/easytrader_broker.py +193 -0
  275. aria_code/brokers/cn/futu_broker.py +194 -0
  276. aria_code/brokers/cn/longbridge_broker.py +190 -0
  277. aria_code/brokers/cn/tiger_broker.py +196 -0
  278. aria_code/brokers/cn/xtquant_broker.py +225 -0
  279. aria_code/brokers/config.py +414 -0
  280. aria_code/brokers/intl/__init__.py +5 -0
  281. aria_code/brokers/intl/alpaca_broker.py +183 -0
  282. aria_code/brokers/intl/ibkr_broker.py +215 -0
  283. aria_code/brokers/intl/trading212_broker.py +183 -0
  284. aria_code/brokers/intl/webull_broker.py +156 -0
  285. aria_code/brokers/paper_broker.py +266 -0
  286. aria_code/brokers/planning.py +296 -0
  287. aria_code/brokers/registry.py +213 -0
  288. aria_code/brokers/trading.py +267 -0
  289. aria_code/canva_client.py +4 -0
  290. aria_code/change_store.py +127 -0
  291. aria_code/clients/__init__.py +0 -0
  292. aria_code/clients/aliyun_data_client.py +660 -0
  293. aria_code/clients/aria_relay_client.py +16 -0
  294. aria_code/clients/canva_client.py +284 -0
  295. aria_code/clients/figma_client.py +100 -0
  296. aria_code/clients/football_data_client.py +1671 -0
  297. aria_code/clients/kling_video_client.py +182 -0
  298. aria_code/clients/market_data_client.py +1985 -0
  299. aria_code/clients/openai_image_client.py +242 -0
  300. aria_code/clients/runway_video_client.py +157 -0
  301. aria_code/clients/warehouse_erp_client.py +105 -0
  302. aria_code/cloud_memory.py +190 -0
  303. aria_code/command_safety.py +19 -0
  304. aria_code/computer_use_server.py +276 -0
  305. aria_code/computer_use_tools.py +4 -0
  306. aria_code/dashboard_generator.py +579 -0
  307. aria_code/data_analysis_tools.py +4 -0
  308. aria_code/data_cleaner.py +483 -0
  309. aria_code/data_service.py +513 -0
  310. aria_code/datasources/__init__.py +23 -0
  311. aria_code/datasources/base.py +166 -0
  312. aria_code/datasources/router.py +253 -0
  313. aria_code/datasources/sec_statements.py +217 -0
  314. aria_code/datasources/sources/__init__.py +15 -0
  315. aria_code/datasources/sources/akshare_source.py +269 -0
  316. aria_code/datasources/sources/alpha_vantage_source.py +203 -0
  317. aria_code/datasources/sources/edgar_source.py +219 -0
  318. aria_code/datasources/sources/finnhub_source.py +198 -0
  319. aria_code/datasources/sources/fred_source.py +223 -0
  320. aria_code/datasources/sources/tushare_source.py +143 -0
  321. aria_code/datasources/sources/web_scraper_source.py +278 -0
  322. aria_code/datasources/sources/world_bank_source.py +206 -0
  323. aria_code/datasources/sources/yfinance_source.py +152 -0
  324. aria_code/doctor.py +860 -0
  325. aria_code/domain/__init__.py +0 -0
  326. aria_code/domain/_finance_core/__init__.py +5 -0
  327. aria_code/domain/_finance_core/backtest_engine.py +325 -0
  328. aria_code/domain/_finance_core/performance_stats.py +101 -0
  329. aria_code/domain/backtest_engine.py +75 -0
  330. aria_code/domain/backtest_report.py +488 -0
  331. aria_code/domain/finance_formulas.py +389 -0
  332. aria_code/domain/performance_stats.py +6 -0
  333. aria_code/domain/portfolio_ledger.py +307 -0
  334. aria_code/domain/strategy_vault.py +421 -0
  335. aria_code/evals/__init__.py +37 -0
  336. aria_code/evals/behavior.py +113 -0
  337. aria_code/evals/gap.py +93 -0
  338. aria_code/evals/harness.py +949 -0
  339. aria_code/evals/review_probe.py +132 -0
  340. aria_code/evals/runner.py +425 -0
  341. aria_code/evals/scorecard.py +322 -0
  342. aria_code/evals/summary.py +125 -0
  343. aria_code/external_agent_runner.py +115 -0
  344. aria_code/figma_client.py +4 -0
  345. aria_code/file_analysis_tools.py +4 -0
  346. aria_code/finance_formulas.py +4 -0
  347. aria_code/football_data_client.py +4 -0
  348. aria_code/image_gen_tools.py +4 -0
  349. aria_code/intent_classifier.py +459 -0
  350. aria_code/kling_video_client.py +4 -0
  351. aria_code/licensing.py +151 -0
  352. aria_code/local_finance_tools.py +4 -0
  353. aria_code/local_image_provider.py +4 -0
  354. aria_code/local_llm_provider.py +4 -0
  355. aria_code/macro_tools.py +4 -0
  356. aria_code/markdown_pdf.py +289 -0
  357. aria_code/market_data_client.py +4 -0
  358. aria_code/mcp_client.py +744 -0
  359. aria_code/memory_manager.py +273 -0
  360. aria_code/model_capability.py +512 -0
  361. aria_code/notification_tools.py +4 -0
  362. aria_code/openai_image_client.py +4 -0
  363. aria_code/packages/__init__.py +26 -0
  364. aria_code/packages/adk_bridge/__init__.py +11 -0
  365. aria_code/packages/adk_bridge/code_review_tools.py +49 -0
  366. aria_code/packages/adk_bridge/market_tools.py +125 -0
  367. aria_code/packages/aria_agents/__init__.py +5 -0
  368. aria_code/packages/aria_agents/manifest.py +78 -0
  369. aria_code/packages/aria_core/__init__.py +34 -0
  370. aria_code/packages/aria_core/architecture.py +269 -0
  371. aria_code/packages/aria_core/export.py +147 -0
  372. aria_code/packages/aria_core/manifest.py +65 -0
  373. aria_code/packages/aria_core/paths.py +57 -0
  374. aria_code/packages/aria_core/secure_file.py +68 -0
  375. aria_code/packages/aria_infra/__init__.py +15 -0
  376. aria_code/packages/aria_infra/arthera.py +58 -0
  377. aria_code/packages/aria_infra/doctor.py +246 -0
  378. aria_code/packages/aria_infra/product.py +40 -0
  379. aria_code/packages/aria_mcp/__init__.py +25 -0
  380. aria_code/packages/aria_mcp/bridge.py +232 -0
  381. aria_code/packages/aria_mcp/circuit.py +82 -0
  382. aria_code/packages/aria_mcp/config.py +162 -0
  383. aria_code/packages/aria_mcp/installer.py +95 -0
  384. aria_code/packages/aria_mcp/server.py +1705 -0
  385. aria_code/packages/aria_mcp/tools.py +81 -0
  386. aria_code/packages/aria_sdk/__init__.py +19 -0
  387. aria_code/packages/aria_sdk/client.py +393 -0
  388. aria_code/packages/aria_sdk/providers.py +70 -0
  389. aria_code/packages/aria_sdk/streaming.py +75 -0
  390. aria_code/packages/aria_sdk/types.py +86 -0
  391. aria_code/packages/aria_services/__init__.py +92 -0
  392. aria_code/packages/aria_services/cache.py +60 -0
  393. aria_code/packages/aria_services/context.py +356 -0
  394. aria_code/packages/aria_services/context_checkpoints.py +157 -0
  395. aria_code/packages/aria_services/data.py +11 -0
  396. aria_code/packages/aria_services/provider_health.py +304 -0
  397. aria_code/packages/aria_services/references.py +247 -0
  398. aria_code/packages/aria_services/registry.py +249 -0
  399. aria_code/packages/aria_services/research_protocol.py +137 -0
  400. aria_code/packages/aria_services/research_quality.py +186 -0
  401. aria_code/packages/aria_services/settings.py +160 -0
  402. aria_code/packages/aria_services/usage.py +151 -0
  403. aria_code/packages/aria_skills/__init__.py +46 -0
  404. aria_code/packages/aria_skills/catalog.py +149 -0
  405. aria_code/packages/aria_skills/loader.py +455 -0
  406. aria_code/packages/aria_skills/registry.py +84 -0
  407. aria_code/packages/aria_tools/__init__.py +5 -0
  408. aria_code/packages/aria_tools/financial/__init__.py +5 -0
  409. aria_code/packages/aria_tools/financial/_paths.py +92 -0
  410. aria_code/packages/aria_tools/registry.py +129 -0
  411. aria_code/packages/quant_engine/__init__.py +33 -0
  412. aria_code/packages/quant_engine/_namespace.py +24 -0
  413. aria_code/packages/quant_engine/backtest/__init__.py +10 -0
  414. aria_code/packages/quant_engine/backtest/core.py +53 -0
  415. aria_code/packages/quant_engine/backtest/engine.py +102 -0
  416. aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
  417. aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
  418. aria_code/packages/quant_engine/sports/__init__.py +76 -0
  419. aria_code/packages/quant_engine/sports/calibrator.py +354 -0
  420. aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
  421. aria_code/packages/quant_engine/sports/elo.py +300 -0
  422. aria_code/packages/quant_engine/sports/form.py +188 -0
  423. aria_code/packages/quant_engine/sports/h2h.py +195 -0
  424. aria_code/packages/quant_engine/sports/predictor.py +312 -0
  425. aria_code/packages/quant_engine/sports/tracker.py +665 -0
  426. aria_code/packages/quant_engine/stochastic/__init__.py +31 -0
  427. aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  428. aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
  429. aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  430. aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  431. aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
  432. aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  433. aria_code/packs/__init__.py +85 -0
  434. aria_code/packs/base.py +168 -0
  435. aria_code/packs/finance/__init__.py +250 -0
  436. aria_code/packs/healthcare/__init__.py +40 -0
  437. aria_code/packs/logistics/__init__.py +171 -0
  438. aria_code/packs/payments/__init__.py +139 -0
  439. aria_code/packs/realty/__init__.py +190 -0
  440. aria_code/packs/registry.py +202 -0
  441. aria_code/packs/rules.py +90 -0
  442. aria_code/plan_utils.py +194 -0
  443. aria_code/plugin_loader.py +328 -0
  444. aria_code/portfolio_ledger.py +4 -0
  445. aria_code/preview_server.py +449 -0
  446. aria_code/privacy/__init__.py +5 -0
  447. aria_code/privacy/feedback.py +123 -0
  448. aria_code/project_review.py +278 -0
  449. aria_code/project_review_api.py +235 -0
  450. aria_code/project_review_server.py +18 -0
  451. aria_code/project_tools.py +4 -0
  452. aria_code/providers/__init__.py +30 -0
  453. aria_code/providers/google_video_provider.py +256 -0
  454. aria_code/providers/llm/__init__.py +19 -0
  455. aria_code/providers/llm/anthropic.py +184 -0
  456. aria_code/providers/llm/arthera_gateway.py +90 -0
  457. aria_code/providers/llm/autoconfig.py +213 -0
  458. aria_code/providers/llm/base.py +139 -0
  459. aria_code/providers/llm/custom.py +158 -0
  460. aria_code/providers/llm/ollama.py +137 -0
  461. aria_code/providers/llm/openai_compat.py +350 -0
  462. aria_code/providers/llm/registry.py +457 -0
  463. aria_code/providers/local_image_provider.py +202 -0
  464. aria_code/providers/local_llm_provider.py +549 -0
  465. aria_code/providers/ollama_models.py +79 -0
  466. aria_code/providers/openai_params.py +32 -0
  467. aria_code/providers/tool_messages.py +100 -0
  468. aria_code/realty_data_tools.py +4 -0
  469. aria_code/report_exporters.py +150 -0
  470. aria_code/report_generator.py +1764 -0
  471. aria_code/review_service.py +497 -0
  472. aria_code/runtime/__init__.py +176 -0
  473. aria_code/runtime/acceptance.py +632 -0
  474. aria_code/runtime/agent_loop.py +1851 -0
  475. aria_code/runtime/agent_profiles.py +75 -0
  476. aria_code/runtime/approval.py +71 -0
  477. aria_code/runtime/baseline.py +219 -0
  478. aria_code/runtime/budget.py +232 -0
  479. aria_code/runtime/checkpoints.py +481 -0
  480. aria_code/runtime/consult.py +65 -0
  481. aria_code/runtime/contract.py +282 -0
  482. aria_code/runtime/delivery.py +432 -0
  483. aria_code/runtime/events.py +113 -0
  484. aria_code/runtime/gateway.py +167 -0
  485. aria_code/runtime/lsp.py +484 -0
  486. aria_code/runtime/native_index.py +153 -0
  487. aria_code/runtime/orchestrator.py +55 -0
  488. aria_code/runtime/processes.py +343 -0
  489. aria_code/runtime/project_graph.py +614 -0
  490. aria_code/runtime/repo_map.py +712 -0
  491. aria_code/runtime/research_bundle.py +105 -0
  492. aria_code/runtime/review.py +269 -0
  493. aria_code/runtime/run_state.py +127 -0
  494. aria_code/runtime/run_store.py +522 -0
  495. aria_code/runtime/scoped_runs.py +113 -0
  496. aria_code/runtime/self_healing.py +422 -0
  497. aria_code/runtime/semantic_diff.py +171 -0
  498. aria_code/runtime/subagent.py +721 -0
  499. aria_code/runtime/symbol_edit.py +117 -0
  500. aria_code/runtime/task_brief.py +46 -0
  501. aria_code/runtime/task_context.py +145 -0
  502. aria_code/runtime/task_ledger.py +108 -0
  503. aria_code/runtime/task_orchestrator.py +90 -0
  504. aria_code/runtime/task_outcome.py +33 -0
  505. aria_code/runtime/task_verification.py +266 -0
  506. aria_code/runtime/task_worktree.py +448 -0
  507. aria_code/runtime/tool_executor.py +329 -0
  508. aria_code/runtime/tool_policy.py +107 -0
  509. aria_code/runtime/transactions.py +216 -0
  510. aria_code/runtime/windows_job.py +115 -0
  511. aria_code/runtime/workflows.py +222 -0
  512. aria_code/runtime/worktrees.py +215 -0
  513. aria_code/runway_video_client.py +4 -0
  514. aria_code/safety/__init__.py +27 -0
  515. aria_code/safety/client_isolation.py +178 -0
  516. aria_code/safety/permissions.py +339 -0
  517. aria_code/safety/risk.py +699 -0
  518. aria_code/safety/sandbox.py +148 -0
  519. aria_code/safety/service.py +102 -0
  520. aria_code/service_endpoints.py +14 -0
  521. aria_code/setup_wizard.py +684 -0
  522. aria_code/spreadsheet_tools.py +4 -0
  523. aria_code/strategy_vault.py +4 -0
  524. aria_code/tools/__init__.py +0 -0
  525. aria_code/tools/artifact_tools.py +252 -0
  526. aria_code/tools/broker_tools.py +92 -0
  527. aria_code/tools/build_quant_engine.py +97 -0
  528. aria_code/tools/code_audit_tools.py +192 -0
  529. aria_code/tools/computer_use_tools.py +509 -0
  530. aria_code/tools/data_analysis_tools.py +831 -0
  531. aria_code/tools/enterprise_finance_tools.py +202 -0
  532. aria_code/tools/extended_tools.py +240 -0
  533. aria_code/tools/file_analysis_tools.py +880 -0
  534. aria_code/tools/image_gen_tools.py +114 -0
  535. aria_code/tools/local_finance_tools.py +3488 -0
  536. aria_code/tools/logistics_carriers.py +11 -0
  537. aria_code/tools/logistics_inventory.py +11 -0
  538. aria_code/tools/logistics_io.py +11 -0
  539. aria_code/tools/logistics_tenancy.py +11 -0
  540. aria_code/tools/logistics_tools.py +11 -0
  541. aria_code/tools/macro_tools.py +412 -0
  542. aria_code/tools/notification_tools.py +249 -0
  543. aria_code/tools/project_tools.py +525 -0
  544. aria_code/tools/realty_data_tools.py +662 -0
  545. aria_code/tools/spreadsheet_tools.py +399 -0
  546. aria_code/tools/stripe_tools.py +115 -0
  547. aria_code/tools/video_tools.py +500 -0
  548. aria_code/training/__init__.py +1 -0
  549. aria_code/training/compare.py +117 -0
  550. aria_code/training/prelude_commands.py +111 -0
  551. aria_code/training/prelude_eval.py +390 -0
  552. aria_code/training/prelude_real.py +183 -0
  553. aria_code/training/prelude_train.py +248 -0
  554. aria_code/training/sft_dataset.py +230 -0
  555. aria_code/training/trajectory_dataset.py +263 -0
  556. aria_code/ui/__init__.py +105 -0
  557. aria_code/ui/banner.py +404 -0
  558. aria_code/ui/completer.py +571 -0
  559. aria_code/ui/console.py +285 -0
  560. aria_code/ui/input_box.py +505 -0
  561. aria_code/ui/mentions.py +206 -0
  562. aria_code/ui/picker.py +248 -0
  563. aria_code/ui/render/__init__.py +11 -0
  564. aria_code/ui/render/actions.py +297 -0
  565. aria_code/ui/render/finance.py +1732 -0
  566. aria_code/ui/render/market.py +253 -0
  567. aria_code/ui/render/output.py +954 -0
  568. aria_code/ui/render/responsive.py +75 -0
  569. aria_code/ui/render/team.py +367 -0
  570. aria_code/ui/robot.py +239 -0
  571. aria_code/ui/startup_dashboard.py +110 -0
  572. aria_code/video_analysis.py +147 -0
  573. aria_code/video_editor.py +518 -0
  574. aria_code/video_workflow/__init__.py +8 -0
  575. aria_code/video_workflow/__main__.py +61 -0
  576. aria_code/video_workflow/engines/__init__.py +18 -0
  577. aria_code/video_workflow/engines/base.py +69 -0
  578. aria_code/video_workflow/engines/custom_model.py +204 -0
  579. aria_code/video_workflow/engines/google_veo.py +94 -0
  580. aria_code/video_workflow/engines/local_engine.py +71 -0
  581. aria_code/video_workflow/engines/registry.py +98 -0
  582. aria_code/video_workflow/google_models.py +278 -0
  583. aria_code/video_workflow/music/__init__.py +5 -0
  584. aria_code/video_workflow/music/foley_service.py +132 -0
  585. aria_code/video_workflow/music/service.py +212 -0
  586. aria_code/video_workflow/pipeline.py +620 -0
  587. aria_code/video_workflow/plan.py +202 -0
  588. aria_code/video_workflow/session.py +297 -0
  589. aria_code/workspace/__init__.py +6 -0
  590. aria_code/workspace/files.py +219 -0
  591. aria_code/workspace/verify.py +167 -0
  592. aria_code/workspace_changes.py +199 -0
  593. aria_code/workspace_service.py +196 -0
  594. aria_code/workspace_tools.py +150 -0
  595. aria_code-0.167.0.dist-info/METADATA +330 -0
  596. aria_code-0.167.0.dist-info/RECORD +601 -0
  597. aria_code-0.167.0.dist-info/WHEEL +5 -0
  598. aria_code-0.167.0.dist-info/entry_points.txt +5 -0
  599. aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
  600. aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
  601. aria_code-0.167.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,256 @@
1
+ """google_video_provider.py — Google Cloud Vertex AI & Gemini API Veo Video provider.
2
+
3
+ Generates video clips via Google Cloud Veo 3.1:
4
+ - veo-3.1-fast-generate-001 (default: faster and cheaper per second)
5
+ - veo-3.1-generate-001 (higher quality)
6
+
7
+ Checked against our production project on 2026-09-15: only the Veo 3.1 GA models are
8
+ reachable; veo-3.0-* and veo-2.0-generate-001 return 404. Veo 3.1 accepts
9
+ durations of 4, 6 or 8 seconds and aspect ratios 16:9 / 9:16, is served from a
10
+ region (not "global"), and its long-running operation is read with
11
+ :fetchPredictOperation.
12
+
13
+ Dual authentication:
14
+ 1. Google Cloud Vertex AI: Uses ADC (Application Default Credentials) + VERTEX_PROJECT / GOOGLE_CLOUD_PROJECT
15
+ 2. Google AI Studio / Gemini API: Uses GEMINI_API_KEY or GOOGLE_API_KEY
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import base64
21
+ import logging
22
+ import os
23
+ import time
24
+ from pathlib import Path
25
+ from typing import Any, Dict, Optional
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+ DEFAULT_VEO_MODEL = "veo-3.1-fast-generate-001"
30
+ QUALITY_VEO_MODEL = "veo-3.1-generate-001"
31
+ VEO_DURATIONS = (4, 6, 8)
32
+
33
+
34
+ def veo_duration(seconds: Any) -> int:
35
+ """The shortest duration Veo 3.1 accepts (4, 6 or 8 s) that covers `seconds`.
36
+
37
+ Rounding up: the edit trims a clip to its beat, but cannot stretch one.
38
+ """
39
+ try:
40
+ wanted = float(seconds)
41
+ except (TypeError, ValueError):
42
+ wanted = 6.0
43
+ return next((allowed for allowed in VEO_DURATIONS if allowed >= wanted), VEO_DURATIONS[-1])
44
+
45
+
46
+ def veo_location() -> str:
47
+ """Veo runs in a region; the chat models' "global" location has no Veo endpoint."""
48
+ location = (os.getenv("VEO_LOCATION") or os.getenv("VERTEX_LOCATION") or "").strip()
49
+ return "us-central1" if not location or location == "global" else location
50
+
51
+
52
+ def _video_bytes(payload: Dict[str, Any]) -> Optional[bytes]:
53
+ """The first video's bytes from a finished operation, in any of the shapes Veo has used."""
54
+ response = payload.get("response") or {}
55
+ items = response.get("videos") or response.get("predictions") or response.get("generatedSamples") or []
56
+ for item in items:
57
+ encoded = item.get("bytesBase64Encoded") or (item.get("video") or {}).get("bytesBase64Encoded")
58
+ if encoded:
59
+ return base64.b64decode(encoded)
60
+ gcs_uri = item.get("gcsUri") or (item.get("video") or {}).get("uri")
61
+ if gcs_uri and gcs_uri.startswith("gs://"):
62
+ try:
63
+ from google.cloud import storage
64
+
65
+ bucket, _, name = gcs_uri[5:].partition("/")
66
+ return storage.Client().bucket(bucket).blob(name).download_as_bytes()
67
+ except Exception as exc: # noqa: BLE001
68
+ logger.warning(f"[GoogleVideo] Could not read {gcs_uri}: {exc}")
69
+ return None
70
+
71
+
72
+ def has_google_video_config() -> bool:
73
+ """Return True if Google Cloud Vertex AI or Gemini API is configured for Veo."""
74
+ vertex_project = os.getenv("VERTEX_PROJECT") or os.getenv("GOOGLE_CLOUD_PROJECT", "")
75
+ api_key = os.getenv("GEMINI_API_KEY", "") or os.getenv("GOOGLE_API_KEY", "")
76
+ return bool(vertex_project or api_key)
77
+
78
+
79
+ def _get_vertex_token() -> Optional[str]:
80
+ """Mint access token from Google Cloud ADC."""
81
+ try:
82
+ import google.auth
83
+ from google.auth.transport.requests import Request as GoogleAuthRequest
84
+
85
+ creds, _ = google.auth.default(
86
+ scopes=["https://www.googleapis.com/auth/cloud-platform"]
87
+ )
88
+ creds.refresh(GoogleAuthRequest())
89
+ return creds.token
90
+ except Exception as exc:
91
+ logger.debug(f"[GoogleVideo] ADC token unavailable: {exc}")
92
+ return None
93
+
94
+
95
+ def generate_video_google(
96
+ prompt: str,
97
+ *,
98
+ image_path: Optional[str] = None,
99
+ model: str = DEFAULT_VEO_MODEL,
100
+ aspect_ratio: str = "16:9",
101
+ duration_seconds: int = 5,
102
+ poll_interval: float = 3.0,
103
+ max_wait_seconds: float = 180.0,
104
+ ) -> Dict[str, Any]:
105
+ """Generate video via Google Cloud Veo (text-to-video or image-to-video).
106
+
107
+ Returns {"success": True, "path": str, "model": str, "duration": int, ...} on success.
108
+ """
109
+ prompt = (prompt or "").strip()
110
+ if not prompt and not image_path:
111
+ return {"success": False, "error": "Prompt or image_path is required for video generation"}
112
+
113
+ if aspect_ratio not in {"16:9", "9:16"}:
114
+ aspect_ratio = "9:16" if aspect_ratio in {"3:4", "4:5", "2:3"} else "16:9"
115
+
116
+ duration_seconds = veo_duration(duration_seconds)
117
+
118
+ vertex_project = os.getenv("VERTEX_PROJECT") or os.getenv("GOOGLE_CLOUD_PROJECT", "")
119
+ api_key = os.getenv("GEMINI_API_KEY", "") or os.getenv("GOOGLE_API_KEY", "")
120
+
121
+ if not vertex_project and not api_key:
122
+ return {
123
+ "success": False,
124
+ "error": "Google Cloud credentials not found (set VERTEX_PROJECT with ADC, or GEMINI_API_KEY/GOOGLE_API_KEY).",
125
+ }
126
+
127
+ instance: Dict[str, Any] = {"prompt": prompt}
128
+ if image_path and Path(image_path).exists():
129
+ try:
130
+ img_bytes = Path(image_path).read_bytes()
131
+ suffix = Path(image_path).suffix.lower()
132
+ mime = "image/png" if suffix == ".png" else "image/webp" if suffix == ".webp" else "image/jpeg"
133
+ instance["image"] = {"bytesBase64Encoded": base64.b64encode(img_bytes).decode("ascii"), "mimeType": mime}
134
+ except Exception as exc:
135
+ logger.warning(f"[GoogleVideo] Failed to read source image {image_path}: {exc}")
136
+
137
+ body = {
138
+ "instances": [instance],
139
+ "parameters": {
140
+ "aspectRatio": aspect_ratio,
141
+ "durationSeconds": duration_seconds,
142
+ "sampleCount": 1,
143
+ # Narration and music are laid over by the edit; Veo's own audio
144
+ # would only be muted, and generating it costs more.
145
+ "generateAudio": False,
146
+ },
147
+ }
148
+
149
+ import requests
150
+
151
+ token = _get_vertex_token() if vertex_project else None
152
+ display_model = f"Google Cloud Veo 3.1 ({model})"
153
+ last_error = ""
154
+
155
+ # 1. Vertex AI long-running prediction, read back with :fetchPredictOperation.
156
+ if token and vertex_project:
157
+ location = veo_location()
158
+ base = f"https://{location}-aiplatform.googleapis.com/v1/projects/{vertex_project}/locations/{location}/publishers/google/models/{model}"
159
+ headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
160
+ try:
161
+ resp = requests.post(f"{base}:predictLongRunning", headers=headers, json=body, timeout=30)
162
+ if resp.status_code in (200, 201, 202) and resp.json().get("name"):
163
+ op_name = resp.json()["name"]
164
+ start_time = time.time()
165
+ while time.time() - start_time < max_wait_seconds:
166
+ time.sleep(poll_interval)
167
+ poll = requests.post(f"{base}:fetchPredictOperation", headers=headers, json={"operationName": op_name}, timeout=30)
168
+ if poll.status_code != 200:
169
+ continue
170
+ payload = poll.json()
171
+ if not payload.get("done"):
172
+ continue
173
+ if payload.get("error"):
174
+ last_error = f"Veo operation failed: {payload['error']}"
175
+ break
176
+ video = _video_bytes(payload)
177
+ if video:
178
+ from aria_code.artifacts import create_user_artifact
179
+
180
+ artifact = create_user_artifact("video", "veo", "clip", ".mp4")
181
+ artifact.path.write_bytes(video)
182
+ return {
183
+ "success": True,
184
+ "path": str(artifact.path),
185
+ "model": display_model,
186
+ "model_id": model,
187
+ "provider": "Google Cloud Vertex AI",
188
+ "duration": duration_seconds,
189
+ "aspect_ratio": aspect_ratio,
190
+ }
191
+ filtered = (payload.get("response") or {}).get("raiMediaFilteredReasons")
192
+ last_error = f"Veo returned no video{f' (filtered: {filtered})' if filtered else ''}."
193
+ break
194
+ else:
195
+ last_error = f"Veo did not finish within {int(max_wait_seconds)} s."
196
+ else:
197
+ last_error = f"Vertex AI HTTP {resp.status_code}: {resp.text[:300]}"
198
+ except Exception as exc:
199
+ last_error = str(exc)
200
+
201
+ # 2. Try Gemini API if API key configured
202
+ if api_key:
203
+ gemini_endpoint = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:predictLongRunning"
204
+ try:
205
+ resp = requests.post(
206
+ gemini_endpoint,
207
+ headers={"x-goog-api-key": api_key, "Content-Type": "application/json"},
208
+ json=body,
209
+ timeout=30,
210
+ )
211
+ if resp.status_code in (200, 201, 202):
212
+ op_data = resp.json()
213
+ op_name = op_data.get("name")
214
+ if op_name:
215
+ poll_url = f"https://generativelanguage.googleapis.com/v1beta/{op_name}"
216
+ start_time = time.time()
217
+ while time.time() - start_time < max_wait_seconds:
218
+ time.sleep(poll_interval)
219
+ poll_resp = requests.get(
220
+ poll_url,
221
+ headers={"x-goog-api-key": api_key},
222
+ timeout=20,
223
+ )
224
+ if poll_resp.status_code == 200:
225
+ p_json = poll_resp.json()
226
+ if p_json.get("done"):
227
+ if "error" in p_json:
228
+ last_error = f"Gemini Veo error: {p_json['error']}"
229
+ break
230
+ response_payload = p_json.get("response", {})
231
+ predictions = response_payload.get("predictions") or response_payload.get("generatedSamples") or []
232
+ if predictions:
233
+ item = predictions[0]
234
+ video_b64 = item.get("bytesBase64Encoded") or (item.get("video", {})).get("bytesBase64Encoded")
235
+ if video_b64:
236
+ from aria_code.artifacts import create_user_artifact
237
+ artifact = create_user_artifact("video", "veo", "clip", ".mp4")
238
+ artifact.path.write_bytes(base64.b64decode(video_b64))
239
+ return {
240
+ "success": True,
241
+ "path": str(artifact.path),
242
+ "model": f"Gemini API {model}",
243
+ "provider": "Google Gemini API",
244
+ "duration": duration_seconds,
245
+ "aspect_ratio": aspect_ratio,
246
+ }
247
+ break
248
+ else:
249
+ last_error = f"Gemini API HTTP {resp.status_code}: {resp.text[:300]}"
250
+ except Exception as exc:
251
+ last_error = str(exc)
252
+
253
+ return {
254
+ "success": False,
255
+ "error": f"Google Veo video generation unavailable: {last_error or 'No response from API'}",
256
+ }
@@ -0,0 +1,19 @@
1
+ from .base import BaseLLMProvider, Message, ProviderConfig
2
+ from .ollama import OllamaProvider
3
+ from .openai_compat import (
4
+ DeepSeekProvider, OpenAIProvider, GroqProvider,
5
+ TogetherProvider, DashScopeProvider, LMStudioProvider,
6
+ SiliconFlowProvider, MoonshotProvider, ZhiPuProvider,
7
+ )
8
+ from .anthropic import AnthropicProvider
9
+ from .registry import get_provider, list_available_providers, stream_cloud_fallback, register_provider
10
+
11
+ __all__ = [
12
+ "BaseLLMProvider", "Message", "ProviderConfig",
13
+ "OllamaProvider", "DeepSeekProvider", "OpenAIProvider",
14
+ "AnthropicProvider", "GroqProvider", "TogetherProvider",
15
+ "DashScopeProvider", "LMStudioProvider",
16
+ "SiliconFlowProvider", "MoonshotProvider", "ZhiPuProvider",
17
+ "get_provider", "list_available_providers",
18
+ "stream_cloud_fallback", "register_provider",
19
+ ]
@@ -0,0 +1,184 @@
1
+ """
2
+ providers/llm/anthropic.py — Anthropic Claude Provider
3
+ =======================================================
4
+ 支持 claude-3-5-sonnet / claude-3-haiku / claude-3-opus 等。
5
+ 支持流式 thinking(扩展思考模式)。
6
+
7
+ 需要设置: ANTHROPIC_API_KEY=sk-ant-...
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ import logging
14
+ import os
15
+ from typing import Any, AsyncIterator, Dict, List, Optional
16
+
17
+ from .base import BaseLLMProvider, Message, ProviderConfig
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+ _ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages"
22
+ _ANTHROPIC_VERSION = "2023-06-01"
23
+
24
+
25
+ class AnthropicProvider(BaseLLMProvider):
26
+
27
+ provider_name = "anthropic"
28
+ supports_tools = True
29
+ supports_thinking = True # claude-3-5-sonnet 支持 extended thinking
30
+ local = False
31
+
32
+ DEFAULT_MODEL = "claude-3-5-haiku-latest"
33
+
34
+ def __init__(self, config: ProviderConfig):
35
+ super().__init__(config)
36
+ self.api_key = config.api_key or os.getenv("ANTHROPIC_API_KEY", "")
37
+ self.model = config.model or self.DEFAULT_MODEL
38
+
39
+ async def is_available(self) -> bool:
40
+ return bool(self.api_key)
41
+
42
+ # Minimum system-prompt length (chars) to bother caching.
43
+ # Prompts shorter than this don't benefit from prompt caching.
44
+ _CACHE_MIN_CHARS = 1024
45
+
46
+ def _build_cached_system(self, system_text: str) -> list:
47
+ """
48
+ Wrap a long system prompt in a cache_control block so Anthropic
49
+ caches it across calls. Returns the `system` field value (a list
50
+ of content blocks, or a plain string for short prompts).
51
+
52
+ Anthropic prompt caching docs:
53
+ https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
54
+ """
55
+ if len(system_text) < self._CACHE_MIN_CHARS:
56
+ return system_text # type: ignore[return-value]
57
+ return [
58
+ {
59
+ "type": "text",
60
+ "text": system_text,
61
+ "cache_control": {"type": "ephemeral"},
62
+ }
63
+ ]
64
+
65
+ async def stream(
66
+ self,
67
+ messages: List[Message],
68
+ tools: Optional[List[Dict]] = None,
69
+ temperature: Optional[float] = None,
70
+ max_tokens: Optional[int] = None,
71
+ cancel_event=None,
72
+ ) -> AsyncIterator[Dict[str, Any]]:
73
+ import aiohttp
74
+
75
+ temp = temperature if temperature is not None else self.config.temperature
76
+ n_tokens = max_tokens if max_tokens is not None else self.config.max_tokens
77
+
78
+ # Anthropic 格式:system 单独提取
79
+ system_parts = [m.content for m in messages if m.role == "system"]
80
+ system_text = "\n\n".join(system_parts) if system_parts else None
81
+ anthro_msgs = [
82
+ {"role": m.role, "content": m.content}
83
+ for m in messages if m.role != "system"
84
+ ]
85
+
86
+ payload: Dict[str, Any] = {
87
+ "model": self.model,
88
+ "max_tokens": n_tokens,
89
+ "messages": anthro_msgs,
90
+ "stream": True,
91
+ }
92
+ if system_text:
93
+ # Use prompt caching for long system prompts to reduce TTFT and cost
94
+ payload["system"] = self._build_cached_system(system_text)
95
+ if temp > 0:
96
+ payload["temperature"] = temp
97
+ if tools:
98
+ payload["tools"] = [
99
+ {
100
+ "name": t.get("name"),
101
+ "description": t.get("description", ""),
102
+ "input_schema": t.get("parameters", {"type": "object", "properties": {}}),
103
+ }
104
+ for t in tools
105
+ ]
106
+
107
+ headers = {
108
+ "x-api-key": self.api_key,
109
+ "anthropic-version": _ANTHROPIC_VERSION,
110
+ "anthropic-beta": "prompt-caching-2024-07-31",
111
+ "content-type": "application/json",
112
+ }
113
+
114
+ proxy = (os.getenv("HTTPS_PROXY") or os.getenv("https_proxy")
115
+ or os.getenv("HTTP_PROXY") or os.getenv("http_proxy"))
116
+ try:
117
+ async with aiohttp.ClientSession(trust_env=True) as sess:
118
+ async with sess.post(
119
+ _ANTHROPIC_API_URL, json=payload, headers=headers,
120
+ proxy=proxy,
121
+ timeout=aiohttp.ClientTimeout(total=self.config.timeout)
122
+ ) as resp:
123
+ if resp.status != 200:
124
+ body = await resp.text()
125
+ yield {"type": "error",
126
+ "message": f"Anthropic HTTP {resp.status}: {body[:300]}"}
127
+ return
128
+
129
+ _pending_tool_name = ""
130
+ _pending_tool_args = ""
131
+
132
+ async for raw in resp.content:
133
+ if cancel_event and cancel_event.is_set():
134
+ return
135
+ line = raw.decode("utf-8", errors="ignore").strip()
136
+ if not line or not line.startswith("data:"):
137
+ continue
138
+
139
+ try:
140
+ data = json.loads(line[5:].strip())
141
+ except json.JSONDecodeError:
142
+ continue
143
+
144
+ etype = data.get("type", "")
145
+
146
+ # 思考 token(扩展思考模式)
147
+ if etype == "content_block_start":
148
+ cb = data.get("content_block", {})
149
+ if cb.get("type") == "thinking":
150
+ yield {"type": "thinking", "text": cb.get("thinking", "")}
151
+ elif cb.get("type") == "tool_use":
152
+ _pending_tool_name = cb.get("name", "")
153
+ _pending_tool_args = ""
154
+
155
+ elif etype == "content_block_delta":
156
+ delta = data.get("delta", {})
157
+ dt = delta.get("type", "")
158
+ if dt == "text_delta":
159
+ yield {"type": "token", "text": delta.get("text", "")}
160
+ elif dt == "thinking_delta":
161
+ yield {"type": "thinking", "text": delta.get("thinking", "")}
162
+ elif dt == "input_json_delta":
163
+ _pending_tool_args += delta.get("partial_json", "")
164
+
165
+ elif etype == "content_block_stop":
166
+ if _pending_tool_name:
167
+ try:
168
+ args = json.loads(_pending_tool_args)
169
+ except Exception:
170
+ args = {"_raw": _pending_tool_args}
171
+ yield {"type": "tool_call",
172
+ "name": _pending_tool_name,
173
+ "arguments": args}
174
+ _pending_tool_name = ""
175
+ _pending_tool_args = ""
176
+
177
+ elif etype == "message_stop":
178
+ yield {"type": "done"}
179
+ return
180
+
181
+ except aiohttp.ClientConnectorError as e:
182
+ yield {"type": "error", "message": f"Anthropic 连接失败: {e}"}
183
+ except Exception as e:
184
+ yield {"type": "error", "message": f"Anthropic 错误: {e}"}
@@ -0,0 +1,90 @@
1
+ """Google models through the Arthera gateway, using the session you signed in with.
2
+
3
+ `/login` gave you an identity and nothing else: to reach a Google model you
4
+ still needed a Gemini API key from AI Studio, or gcloud and a billed Google
5
+ Cloud project of your own. That is setup this product exists to spare people,
6
+ and every layer of it is a place to get stuck — a missing dependency, gcloud
7
+ not on PATH, a suspended billing account.
8
+
9
+ The server holds a project and a service account with access to Vertex, and
10
+ exposes it in the OpenAI shape. So this provider is the ordinary
11
+ OpenAI-compatible one pointed at that endpoint, authorised with the Firebase
12
+ token `/login` already stored. There is nothing for the user to configure.
13
+
14
+ The token is read at call time rather than captured once, because it lasts an
15
+ hour and `/login` refreshes it in the same config file.
16
+ """
17
+ from __future__ import annotations
18
+
19
+ import json
20
+ import logging
21
+ import os
22
+ from pathlib import Path
23
+ from typing import Optional
24
+
25
+ from .base import ProviderConfig
26
+ from .openai_compat import OpenAICompatProvider
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+ DEFAULT_API_URL = "https://api.arthera.xyz"
31
+ DEFAULT_MODEL = "google/gemini-3.8-flash"
32
+
33
+
34
+ def _config_path() -> Path:
35
+ """Where /login saved the session: the same file, by the same rule.
36
+
37
+ This used to be ~/.arthera/config.json, or ARIA_CONFIG_DIR. /login writes
38
+ through aria_home(), which is ~/.arthera only when that legacy folder
39
+ already exists and ~/.aria-code otherwise, and is overridden by ARIA_HOME.
40
+ So on a new install — the people signing in to reach a model without a
41
+ key — the session was saved in one folder and looked for in another, and
42
+ signing in never gave them a model. Asking aria_home() is what the 38
43
+ files that once hardcoded ~/.arthera were moved over to for this reason.
44
+ """
45
+ from aria_code.packages.aria_core.paths import aria_home
46
+
47
+ return aria_home() / "config.json"
48
+
49
+
50
+ def session_token() -> Optional[str]:
51
+ """The Firebase token `/login` stored, or None when signed out."""
52
+ try:
53
+ config = json.loads(_config_path().read_text(encoding="utf-8"))
54
+ except (OSError, ValueError):
55
+ return None
56
+ from aria_code.account_session import account_id, get_account_token
57
+ if account_id(config):
58
+ return get_account_token(config)
59
+ from aria_code.apps.cli.session_refresh import refresh_config_file
60
+ return refresh_config_file(_config_path())
61
+
62
+
63
+ def gateway_base_url() -> str:
64
+ """Where the gateway lives. Overridable for staging and self-hosting."""
65
+ api = os.getenv("ARIA_API_URL", "").strip() or DEFAULT_API_URL
66
+ from aria_code.service_endpoints import current_url
67
+ return f"{current_url(api)}/api/v2/llm/v1"
68
+
69
+
70
+ class ArtheraGatewayProvider(OpenAICompatProvider):
71
+ """Google models billed to the Arthera project, for a signed-in user."""
72
+
73
+ provider_name = "arthera"
74
+ DEFAULT_BASE_URL = "" # resolved per instance; it is deployment state
75
+ DEFAULT_MODEL = DEFAULT_MODEL
76
+
77
+ def __init__(self, config: ProviderConfig):
78
+ if not config.base_url:
79
+ config.base_url = gateway_base_url()
80
+ # The bearer is the session, not a key the user pasted. Reading it
81
+ # here keeps a signed-out user from presenting an empty credential
82
+ # and getting a 401 they cannot act on.
83
+ if not config.api_key:
84
+ config.api_key = session_token() or ""
85
+ super().__init__(config)
86
+
87
+ @staticmethod
88
+ def available() -> bool:
89
+ """True when there is a session to authorise calls with."""
90
+ return bool(session_token())