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,204 @@
1
+ """custom_model.py — 自研私有视频模型引擎适配器。
2
+
3
+ 专为用户后续自研、微调或私有化部署的视频生成大模型(如自建 DiT 架构、ComfyUI 服务端、
4
+ vLLM / Triton 推理端点、Vertex AI Custom Prediction 或独立 GPU 云服务)打造。
5
+ 通过标准化的 HTTP/REST 接口规范与可配置的 Payload 模板,支持随时将底层生成驱动
6
+ 切换为自己的模型。
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import base64
12
+ import json
13
+ import logging
14
+ import os
15
+ import time
16
+ from pathlib import Path
17
+ from typing import Any, Dict, Optional
18
+
19
+ import requests
20
+
21
+ from .base import BaseVideoEngine, VideoShotRequest, VideoShotResult
22
+ from aria_code.artifacts import create_user_artifact
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+ DEFAULT_CUSTOM_ENDPOINT = "http://localhost:8000/v1/video/generate"
27
+
28
+
29
+ class CustomModelEngine(BaseVideoEngine):
30
+ """自研视频大模型适配引擎。"""
31
+
32
+ name: str = "custom"
33
+ display_name: str = "Custom Video Model (Self-Hosted / Private Cloud)"
34
+
35
+ def __init__(
36
+ self,
37
+ endpoint_url: Optional[str] = None,
38
+ auth_token: Optional[str] = None,
39
+ model_name: Optional[str] = None,
40
+ ):
41
+ self.endpoint_url = endpoint_url or os.getenv("ARIA_CUSTOM_VIDEO_ENDPOINT", DEFAULT_CUSTOM_ENDPOINT)
42
+ self.auth_token = auth_token or os.getenv("ARIA_CUSTOM_VIDEO_TOKEN", "")
43
+ self.model_name = model_name or os.getenv("ARIA_CUSTOM_VIDEO_MODEL", "aria-custom-dit-v1")
44
+
45
+ def health_check(self) -> Dict[str, Any]:
46
+ """检查自研模型端点的联通性。"""
47
+ is_reachable = False
48
+ error_msg = ""
49
+ try:
50
+ health_url = self.endpoint_url.rsplit("/", 1)[0] + "/health"
51
+ resp = requests.get(health_url, timeout=3)
52
+ is_reachable = resp.status_code == 200
53
+ except Exception as exc:
54
+ error_msg = str(exc)
55
+
56
+ return {
57
+ "engine": self.name,
58
+ "display_name": self.display_name,
59
+ "endpoint_url": self.endpoint_url,
60
+ "model_name": self.model_name,
61
+ "has_auth_token": bool(self.auth_token),
62
+ "reachable": is_reachable,
63
+ "status_message": "OK" if is_reachable else f"Not reachable ({error_msg or 'no health endpoint'})",
64
+ }
65
+
66
+ def generate_shot(self, request: VideoShotRequest) -> VideoShotResult:
67
+ """向自研模型服务提交生成请求,并保存结果。"""
68
+ headers = {"Content-Type": "application/json"}
69
+ if self.auth_token:
70
+ headers["Authorization"] = f"Bearer {self.auth_token}"
71
+
72
+ # 构造自研模型标准请求负载
73
+ payload: Dict[str, Any] = {
74
+ "model": self.model_name,
75
+ "prompt": request.prompt,
76
+ "negative_prompt": request.negative_prompt or "blurry, low quality, artifacts, distorted",
77
+ "duration": request.duration_seconds,
78
+ "aspect_ratio": request.aspect_ratio,
79
+ "cfg_scale": request.cfg_scale,
80
+ }
81
+
82
+ if request.seed is not None:
83
+ payload["seed"] = request.seed
84
+ if request.camera_motion:
85
+ payload["camera_motion"] = request.camera_motion
86
+
87
+ # 处理首帧图片输入 (图生视频 / I2V)
88
+ if request.image_path and Path(request.image_path).exists():
89
+ img_bytes = Path(request.image_path).read_bytes()
90
+ payload["image_base64"] = base64.b64encode(img_bytes).decode("ascii")
91
+
92
+ # 混入自定义扩展参数 (例如 lora_weights, sampling_steps, motion_scale)
93
+ if request.custom_parameters:
94
+ payload.update(request.custom_parameters)
95
+
96
+ logger.info(f"[CustomModelEngine] Dispatching to {self.endpoint_url} (model={self.model_name})...")
97
+
98
+ try:
99
+ resp = requests.post(self.endpoint_url, headers=headers, json=payload, timeout=120)
100
+ if resp.status_code != 200:
101
+ return VideoShotResult(
102
+ success=False,
103
+ engine_name=self.name,
104
+ model_version=self.model_name,
105
+ error=f"Custom model endpoint returned HTTP {resp.status_code}: {resp.text[:300]}",
106
+ )
107
+
108
+ data = resp.json()
109
+
110
+ # 1. 如果端点直接返回 base64 视频流
111
+ video_b64 = data.get("video_base64")
112
+ if video_b64:
113
+ artifact = create_user_artifact("video", "custom_model", "clip", ".mp4")
114
+ artifact.path.write_bytes(base64.b64decode(video_b64))
115
+ return VideoShotResult(
116
+ success=True,
117
+ path=str(artifact.path),
118
+ engine_name=self.name,
119
+ model_version=self.model_name,
120
+ duration=request.duration_seconds,
121
+ aspect_ratio=request.aspect_ratio,
122
+ metadata=data.get("metadata", {}),
123
+ )
124
+
125
+ # 2. 如果端点返回可下载视频 URL
126
+ video_url = data.get("video_url")
127
+ if video_url:
128
+ dl_resp = requests.get(video_url, timeout=120)
129
+ if dl_resp.status_code == 200:
130
+ artifact = create_user_artifact("video", "custom_model", "clip", ".mp4")
131
+ artifact.path.write_bytes(dl_resp.content)
132
+ return VideoShotResult(
133
+ success=True,
134
+ path=str(artifact.path),
135
+ video_url=video_url,
136
+ engine_name=self.name,
137
+ model_version=self.model_name,
138
+ duration=request.duration_seconds,
139
+ aspect_ratio=request.aspect_ratio,
140
+ metadata=data.get("metadata", {}),
141
+ )
142
+
143
+ # 3. 如果是异步任务 (task_id / poll_url)
144
+ task_id = data.get("task_id")
145
+ poll_url = data.get("poll_url") or f"{self.endpoint_url.rsplit('/', 1)[0]}/tasks/{task_id}"
146
+ if task_id:
147
+ return self._poll_task(poll_url, headers, request.duration_seconds, request.aspect_ratio)
148
+
149
+ return VideoShotResult(
150
+ success=False,
151
+ engine_name=self.name,
152
+ model_version=self.model_name,
153
+ error="Custom endpoint response contained neither video_base64, video_url nor task_id.",
154
+ )
155
+ except Exception as exc:
156
+ logger.exception(f"[CustomModelEngine] Error calling custom endpoint: {exc}")
157
+ return VideoShotResult(
158
+ success=False,
159
+ engine_name=self.name,
160
+ model_version=self.model_name,
161
+ error=str(exc),
162
+ )
163
+
164
+ def _poll_task(self, poll_url: str, headers: Dict[str, str], duration: int, aspect: str, max_wait: float = 300.0) -> VideoShotResult:
165
+ """异步轮询任务结果。"""
166
+ start = time.time()
167
+ while time.time() - start < max_wait:
168
+ time.sleep(3.0)
169
+ try:
170
+ res = requests.get(poll_url, headers=headers, timeout=20)
171
+ if res.status_code == 200:
172
+ pdata = res.json()
173
+ status = pdata.get("status")
174
+ if status in ("succeed", "completed", "success"):
175
+ video_url = pdata.get("video_url")
176
+ if video_url:
177
+ v_resp = requests.get(video_url, timeout=120)
178
+ artifact = create_user_artifact("video", "custom_model", "clip", ".mp4")
179
+ artifact.path.write_bytes(v_resp.content)
180
+ return VideoShotResult(
181
+ success=True,
182
+ path=str(artifact.path),
183
+ video_url=video_url,
184
+ engine_name=self.name,
185
+ model_version=self.model_name,
186
+ duration=duration,
187
+ aspect_ratio=aspect,
188
+ )
189
+ elif status in ("failed", "error"):
190
+ return VideoShotResult(
191
+ success=False,
192
+ engine_name=self.name,
193
+ model_version=self.model_name,
194
+ error=pdata.get("error", "Task execution failed on custom model."),
195
+ )
196
+ except Exception as exc:
197
+ logger.debug(f"[CustomModelEngine] Poll error: {exc}")
198
+
199
+ return VideoShotResult(
200
+ success=False,
201
+ engine_name=self.name,
202
+ model_version=self.model_name,
203
+ error="Custom model task polling timed out.",
204
+ )
@@ -0,0 +1,94 @@
1
+ """google_veo.py — Google Cloud Vertex AI & Gemini API Veo 视频引擎实现。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ from typing import Any, Dict
8
+
9
+ from .base import BaseVideoEngine, VideoShotRequest, VideoShotResult
10
+ from aria_code.providers.google_video_provider import has_google_video_config, generate_video_google, DEFAULT_VEO_MODEL
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class GoogleCloudVeoEngine(BaseVideoEngine):
16
+ """Google Cloud Veo 视频生成引擎(当前主要生产驱动)。"""
17
+
18
+ name: str = "google"
19
+ display_name: str = "Google Cloud Veo (Vertex AI / Gemini API)"
20
+
21
+ def __init__(self, model: str = DEFAULT_VEO_MODEL):
22
+ self.model = model
23
+
24
+ def health_check(self) -> Dict[str, Any]:
25
+ """检查 Google Cloud 凭证与配置状态。"""
26
+ vertex_project = os.getenv("VERTEX_PROJECT") or os.getenv("GOOGLE_CLOUD_PROJECT", "")
27
+ api_key = os.getenv("GEMINI_API_KEY", "") or os.getenv("GOOGLE_API_KEY", "")
28
+ configured = has_google_video_config()
29
+
30
+ mode = "Vertex AI (ADC)" if vertex_project else ("Gemini API Key" if api_key else "None")
31
+ return {
32
+ "engine": self.name,
33
+ "display_name": self.display_name,
34
+ "configured": configured,
35
+ "auth_mode": mode,
36
+ "model": self.model,
37
+ "project_id": vertex_project if vertex_project else "(using Gemini API Key)",
38
+ }
39
+
40
+ def generate_shot(self, request: VideoShotRequest) -> VideoShotResult:
41
+ """调用 Google Cloud Veo 生成单个视频片段。"""
42
+ logger.info(f"[GoogleVeoEngine] Submitting shot: {request.prompt[:60]}...")
43
+
44
+ # 丰富 Prompt:若有镜头运镜参数则显式融入 Prompt
45
+ enhanced_prompt = request.prompt
46
+ if request.camera_motion:
47
+ motions = []
48
+ if request.camera_motion.get("zoom", 0) > 0:
49
+ motions.append("camera slow zoom in")
50
+ elif request.camera_motion.get("zoom", 0) < 0:
51
+ motions.append("camera slow zoom out")
52
+ if request.camera_motion.get("pan", 0) > 0:
53
+ motions.append("camera pan right")
54
+ elif request.camera_motion.get("pan", 0) < 0:
55
+ motions.append("camera pan left")
56
+ if request.camera_motion.get("tilt", 0) > 0:
57
+ motions.append("camera tilt up")
58
+ elif request.camera_motion.get("tilt", 0) < 0:
59
+ motions.append("camera tilt down")
60
+ if motions:
61
+ enhanced_prompt = f"{enhanced_prompt}. {', '.join(motions)}."
62
+
63
+ try:
64
+ res = generate_video_google(
65
+ prompt=enhanced_prompt,
66
+ image_path=request.image_path,
67
+ model=self.model,
68
+ aspect_ratio=request.aspect_ratio,
69
+ duration_seconds=request.duration_seconds,
70
+ )
71
+ if res.get("success") and res.get("path"):
72
+ return VideoShotResult(
73
+ success=True,
74
+ path=res["path"],
75
+ engine_name=self.name,
76
+ model_version=res.get("model", self.model),
77
+ duration=float(res.get("duration", request.duration_seconds)),
78
+ aspect_ratio=res.get("aspect_ratio", request.aspect_ratio),
79
+ metadata={"provider": res.get("provider", "Google Cloud")},
80
+ )
81
+ return VideoShotResult(
82
+ success=False,
83
+ engine_name=self.name,
84
+ model_version=self.model,
85
+ error=res.get("error", "Google Veo failed to produce video."),
86
+ )
87
+ except Exception as exc:
88
+ logger.exception(f"[GoogleVeoEngine] Generation exception: {exc}")
89
+ return VideoShotResult(
90
+ success=False,
91
+ engine_name=self.name,
92
+ model_version=self.model,
93
+ error=str(exc),
94
+ )
@@ -0,0 +1,71 @@
1
+ """local_engine.py — 本地离线高质感运镜生成引擎(免网络、零成本兜底)。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from pathlib import Path
7
+ from typing import Any, Dict
8
+
9
+ from .base import BaseVideoEngine, VideoShotRequest, VideoShotResult
10
+ from aria_code.video_editor import create_ken_burns_clip
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class LocalFallbackEngine(BaseVideoEngine):
16
+ """本地运镜引擎,当云端与私有模型不可用或用户需要零成本预览时使用。"""
17
+
18
+ name: str = "local"
19
+ display_name: str = "Local Ken-Burns Motion Engine (Offline)"
20
+
21
+ def health_check(self) -> Dict[str, Any]:
22
+ import shutil
23
+ has_ffmpeg = shutil.which("ffmpeg") is not None
24
+ return {
25
+ "engine": self.name,
26
+ "display_name": self.display_name,
27
+ "configured": has_ffmpeg,
28
+ "ffmpeg_available": has_ffmpeg,
29
+ "status_message": "Ready (Offline)" if has_ffmpeg else "ffmpeg not found in PATH",
30
+ }
31
+
32
+ def generate_shot(self, request: VideoShotRequest) -> VideoShotResult:
33
+ """从图片素材本地渲染 Ken Burns 运镜视频。"""
34
+ if not request.image_path or not Path(request.image_path).exists():
35
+ return VideoShotResult(
36
+ success=False,
37
+ engine_name=self.name,
38
+ error="Local engine requires a valid source image (image_path).",
39
+ )
40
+
41
+ effect = "zoom_in"
42
+ if request.camera_motion:
43
+ if request.camera_motion.get("pan", 0) > 0:
44
+ effect = "pan_right"
45
+ elif request.camera_motion.get("pan", 0) < 0:
46
+ effect = "pan_left"
47
+ elif request.camera_motion.get("zoom", 0) < 0:
48
+ effect = "zoom_out"
49
+
50
+ res = create_ken_burns_clip(
51
+ request.image_path,
52
+ duration=float(request.duration_seconds),
53
+ effect=effect,
54
+ aspect_ratio=request.aspect_ratio,
55
+ )
56
+
57
+ if res.get("success") and res.get("clip_path"):
58
+ return VideoShotResult(
59
+ success=True,
60
+ path=res["clip_path"],
61
+ engine_name=self.name,
62
+ model_version="ken_burns_v2",
63
+ duration=float(request.duration_seconds),
64
+ aspect_ratio=request.aspect_ratio,
65
+ )
66
+
67
+ return VideoShotResult(
68
+ success=False,
69
+ engine_name=self.name,
70
+ error=res.get("error", "Local Ken Burns generation failed."),
71
+ )
@@ -0,0 +1,98 @@
1
+ """registry.py — 视频生成引擎注册表与生命周期管理器。
2
+
3
+ 支持全局统一管理 Google Cloud Veo、自研私有模型 (Custom) 与本地引擎 (Local),
4
+ 支持通过环境变量、代码显式配置或 MCP 接口随时切换当前生效的主视频引擎。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ import os
11
+ from typing import Any, Dict, List, Optional, Type
12
+
13
+ from .base import BaseVideoEngine
14
+ from .google_veo import GoogleCloudVeoEngine
15
+ from .custom_model import CustomModelEngine
16
+ from .local_engine import LocalFallbackEngine
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class VideoEngineRegistry:
22
+ """引擎注册表单例管理器。"""
23
+
24
+ _instance: Optional[VideoEngineRegistry] = None
25
+
26
+ def __init__(self):
27
+ self._engines: Dict[str, BaseVideoEngine] = {}
28
+ # 默认内置三大引擎
29
+ self.register_engine("google", GoogleCloudVeoEngine())
30
+ self.register_engine("custom", CustomModelEngine())
31
+ self.register_engine("local", LocalFallbackEngine())
32
+ self._active_engine_name: Optional[str] = None
33
+
34
+ @classmethod
35
+ def get_instance(cls) -> VideoEngineRegistry:
36
+ if cls._instance is None:
37
+ cls._instance = cls()
38
+ return cls._instance
39
+
40
+ @classmethod
41
+ def reset_instance(cls) -> None:
42
+ """Drop the singleton so the next caller builds a fresh registry.
43
+
44
+ The registry is process-wide and mutable: registering an engine or
45
+ setting the active one changes it for everything afterwards. In a test
46
+ run that leaks — configuring a custom engine in one test left another
47
+ patching "google" while the director resolved the active engine and
48
+ called something else, which failed only when both ran together.
49
+ """
50
+ cls._instance = None
51
+
52
+ def register_engine(self, name: str, engine: BaseVideoEngine) -> None:
53
+ """注册或更新一个视频引擎实例。"""
54
+ self._engines[name.lower()] = engine
55
+ logger.debug(f"[VideoEngineRegistry] Registered engine '{name}': {engine.display_name}")
56
+
57
+ def set_active_engine(self, name: str) -> None:
58
+ """设置当前全局默认视频引擎。"""
59
+ name_lower = name.lower()
60
+ if name_lower not in self._engines:
61
+ raise ValueError(f"Unknown engine '{name}'. Available: {list(self._engines.keys())}")
62
+ self._active_engine_name = name_lower
63
+ logger.info(f"[VideoEngineRegistry] Active video engine set to: {name_lower}")
64
+
65
+ def get_active_engine_name(self) -> str:
66
+ """获取当前活动引擎名称。优先按环境变量 ARIA_VIDEO_ENGINE,其次按配置,最后默认 google。"""
67
+ if self._active_engine_name:
68
+ return self._active_engine_name
69
+ env_choice = os.getenv("ARIA_VIDEO_ENGINE", "").strip().lower()
70
+ if env_choice in self._engines:
71
+ return env_choice
72
+ # 若自研模型端点被明确指定,可优先考虑
73
+ if os.getenv("ARIA_CUSTOM_VIDEO_ENDPOINT"):
74
+ return "custom"
75
+ return "google"
76
+
77
+ def get_engine(self, name: Optional[str] = None) -> BaseVideoEngine:
78
+ """获取指定或当前生效的视频引擎实例。"""
79
+ target = (name or self.get_active_engine_name()).lower()
80
+ if target not in self._engines:
81
+ logger.warning(f"Engine '{target}' not found, falling back to 'local'.")
82
+ target = "local"
83
+ return self._engines[target]
84
+
85
+ def list_engines_status(self) -> List[Dict[str, Any]]:
86
+ """获取所有已注册引擎的运行与配置健康度报告。"""
87
+ active_name = self.get_active_engine_name()
88
+ status_list = []
89
+ for name, engine in self._engines.items():
90
+ check = engine.health_check()
91
+ check["is_active"] = (name == active_name)
92
+ status_list.append(check)
93
+ return status_list
94
+
95
+
96
+ def get_video_engine(name: Optional[str] = None) -> BaseVideoEngine:
97
+ """快捷获取当前或指定的视频引擎。"""
98
+ return VideoEngineRegistry.get_instance().get_engine(name)