aria-code 0.52.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. aria_code/__init__.py +42 -0
  2. aria_code/_version.py +20 -0
  3. aria_code/adk_apps/__init__.py +1 -0
  4. aria_code/adk_apps/aria_code_review/__init__.py +1 -0
  5. aria_code/adk_apps/aria_code_review/agent.py +32 -0
  6. aria_code/adk_apps/aria_research/__init__.py +1 -0
  7. aria_code/adk_apps/aria_research/agent.py +31 -0
  8. aria_code/agents/__init__.py +34 -0
  9. aria_code/agents/base.py +318 -0
  10. aria_code/agents/code_review.py +200 -0
  11. aria_code/agents/deep/__init__.py +37 -0
  12. aria_code/agents/deep/calibration_loop.py +144 -0
  13. aria_code/agents/deep/critic.py +125 -0
  14. aria_code/agents/deep/deepen.py +193 -0
  15. aria_code/agents/deep/models.py +149 -0
  16. aria_code/agents/deep/pipeline.py +164 -0
  17. aria_code/agents/deep/quant_fusion.py +192 -0
  18. aria_code/agents/deep/themes.py +95 -0
  19. aria_code/agents/deep/tiers.py +106 -0
  20. aria_code/agents/engineering/__init__.py +14 -0
  21. aria_code/agents/engineering/coder.py +222 -0
  22. aria_code/agents/engineering/tester.py +145 -0
  23. aria_code/agents/financial/__init__.py +21 -0
  24. aria_code/agents/financial/cashflow_burn.py +119 -0
  25. aria_code/agents/financial/catalyst.py +279 -0
  26. aria_code/agents/financial/corporate_finance.py +175 -0
  27. aria_code/agents/financial/debate.py +224 -0
  28. aria_code/agents/financial/earnings.py +303 -0
  29. aria_code/agents/financial/fundamental.py +191 -0
  30. aria_code/agents/financial/macro.py +99 -0
  31. aria_code/agents/financial/news.py +207 -0
  32. aria_code/agents/financial/risk.py +165 -0
  33. aria_code/agents/financial/sector.py +279 -0
  34. aria_code/agents/financial/strategist.py +121 -0
  35. aria_code/agents/financial/stripe_revenue.py +127 -0
  36. aria_code/agents/financial/synthesis.py +274 -0
  37. aria_code/agents/financial/technical.py +258 -0
  38. aria_code/agents/orchestrator.py +44 -0
  39. aria_code/agents/portfolio_agent.py +363 -0
  40. aria_code/agents/realty/__init__.py +62 -0
  41. aria_code/agents/realty/asset_diagnosis.py +152 -0
  42. aria_code/agents/realty/business_match.py +166 -0
  43. aria_code/agents/realty/cashflow_verify.py +209 -0
  44. aria_code/agents/realty/contract_rules.py +210 -0
  45. aria_code/agents/realty/energy_anomaly.py +189 -0
  46. aria_code/agents/realty/exit_settlement.py +208 -0
  47. aria_code/agents/realty/fulfillment_risk.py +206 -0
  48. aria_code/agents/realty/ops_optimize.py +160 -0
  49. aria_code/agents/realty/revenue_share.py +215 -0
  50. aria_code/agents/registry.py +158 -0
  51. aria_code/agents/signal_scheme.py +111 -0
  52. aria_code/agents/sports/__init__.py +0 -0
  53. aria_code/agents/sports/football_agent.py +197 -0
  54. aria_code/agents/supervisor.py +113 -0
  55. aria_code/agents/team.py +492 -0
  56. aria_code/agents/warehouse/__init__.py +25 -0
  57. aria_code/agents/warehouse/contracts.py +26 -0
  58. aria_code/agents/warehouse/dashboard.py +155 -0
  59. aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
  60. aria_code/agents/warehouse/inbound_exceptions.py +25 -0
  61. aria_code/agents/warehouse/inventory_health.py +24 -0
  62. aria_code/agents/warehouse/local_run.py +71 -0
  63. aria_code/agents/warehouse/local_snapshot.py +132 -0
  64. aria_code/agents/warehouse/logistics_cost.py +84 -0
  65. aria_code/agents/warehouse/logistics_sync.py +21 -0
  66. aria_code/agents/warehouse/workflow.py +31 -0
  67. aria_code/aliyun_data_client.py +4 -0
  68. aria_code/apps/README.md +12 -0
  69. aria_code/apps/__init__.py +2 -0
  70. aria_code/apps/channels/README.md +15 -0
  71. aria_code/apps/channels/__init__.py +17 -0
  72. aria_code/apps/channels/intake.py +92 -0
  73. aria_code/apps/channels/registry.py +95 -0
  74. aria_code/apps/channels/tradingview.py +94 -0
  75. aria_code/apps/cli/README.md +13 -0
  76. aria_code/apps/cli/__init__.py +2 -0
  77. aria_code/apps/cli/_optional.py +120 -0
  78. aria_code/apps/cli/bootstrap.py +145 -0
  79. aria_code/apps/cli/broker_render.py +206 -0
  80. aria_code/apps/cli/codegen_paths.py +29 -0
  81. aria_code/apps/cli/commands/__init__.py +16 -0
  82. aria_code/apps/cli/commands/_business_render.py +78 -0
  83. aria_code/apps/cli/commands/_ui.py +71 -0
  84. aria_code/apps/cli/commands/analysis_cmds.py +369 -0
  85. aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
  86. aria_code/apps/cli/commands/auth_cmds.py +239 -0
  87. aria_code/apps/cli/commands/backtest_cmds.py +2543 -0
  88. aria_code/apps/cli/commands/broker_cmds.py +1234 -0
  89. aria_code/apps/cli/commands/business_workflow_cmds.py +319 -0
  90. aria_code/apps/cli/commands/canvas_cmds.py +77 -0
  91. aria_code/apps/cli/commands/catalog.py +87 -0
  92. aria_code/apps/cli/commands/core_cmds.py +2520 -0
  93. aria_code/apps/cli/commands/data_cmds.py +457 -0
  94. aria_code/apps/cli/commands/diagnostic_cmds.py +230 -0
  95. aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
  96. aria_code/apps/cli/commands/file_cmds.py +312 -0
  97. aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
  98. aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
  99. aria_code/apps/cli/commands/market.py +434 -0
  100. aria_code/apps/cli/commands/market_cmds.py +1381 -0
  101. aria_code/apps/cli/commands/market_context.py +425 -0
  102. aria_code/apps/cli/commands/market_render.py +7 -0
  103. aria_code/apps/cli/commands/model_cmds.py +2153 -0
  104. aria_code/apps/cli/commands/ops_cmds.py +721 -0
  105. aria_code/apps/cli/commands/orchestrator_cmds.py +179 -0
  106. aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
  107. aria_code/apps/cli/commands/portfolio_cmds.py +1278 -0
  108. aria_code/apps/cli/commands/report.py +437 -0
  109. aria_code/apps/cli/commands/scaffold_templates.py +617 -0
  110. aria_code/apps/cli/commands/session_cmds.py +236 -0
  111. aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
  112. aria_code/apps/cli/commands/team.py +669 -0
  113. aria_code/apps/cli/commands/team_render.py +8 -0
  114. aria_code/apps/cli/commands/ui_cmds.py +401 -0
  115. aria_code/apps/cli/commands/warehouse_cmds.py +79 -0
  116. aria_code/apps/cli/commands/workflow_cmds.py +480 -0
  117. aria_code/apps/cli/commands/workspace_cmds.py +1494 -0
  118. aria_code/apps/cli/config_paths.py +73 -0
  119. aria_code/apps/cli/config_store.py +78 -0
  120. aria_code/apps/cli/constants.py +88 -0
  121. aria_code/apps/cli/context.py +34 -0
  122. aria_code/apps/cli/deterministic.py +191 -0
  123. aria_code/apps/cli/direct.py +48 -0
  124. aria_code/apps/cli/finance_service_catalog.py +111 -0
  125. aria_code/apps/cli/football_reports.py +231 -0
  126. aria_code/apps/cli/github_app_auth.py +135 -0
  127. aria_code/apps/cli/google_login.py +196 -0
  128. aria_code/apps/cli/handlers/__init__.py +11 -0
  129. aria_code/apps/cli/handlers/broker_handlers.py +122 -0
  130. aria_code/apps/cli/handlers/chart_handlers.py +1309 -0
  131. aria_code/apps/cli/handlers/market_handlers.py +2513 -0
  132. aria_code/apps/cli/handlers/realty_handlers.py +114 -0
  133. aria_code/apps/cli/handlers/sports_handlers.py +22 -0
  134. aria_code/apps/cli/handlers/strategy_advice.py +82 -0
  135. aria_code/apps/cli/helpers.py +302 -0
  136. aria_code/apps/cli/hooks.py +180 -0
  137. aria_code/apps/cli/i18n.py +297 -0
  138. aria_code/apps/cli/intent.py +136 -0
  139. aria_code/apps/cli/intent_router.py +276 -0
  140. aria_code/apps/cli/intent_signals.py +344 -0
  141. aria_code/apps/cli/lifecycle_hooks.py +48 -0
  142. aria_code/apps/cli/local_tool_schemas.py +536 -0
  143. aria_code/apps/cli/main.py +29 -0
  144. aria_code/apps/cli/market_metadata.py +135 -0
  145. aria_code/apps/cli/market_universe.py +487 -0
  146. aria_code/apps/cli/message_processing.py +310 -0
  147. aria_code/apps/cli/model_catalog.py +620 -0
  148. aria_code/apps/cli/pdf_report.py +977 -0
  149. aria_code/apps/cli/plan_mode.py +139 -0
  150. aria_code/apps/cli/plotly_html.py +15 -0
  151. aria_code/apps/cli/prediction_feedback.py +202 -0
  152. aria_code/apps/cli/preflight.py +502 -0
  153. aria_code/apps/cli/project_aria.py +60 -0
  154. aria_code/apps/cli/prompt_assembly.py +59 -0
  155. aria_code/apps/cli/prompts/__init__.py +0 -0
  156. aria_code/apps/cli/prompts/coding.py +53 -0
  157. aria_code/apps/cli/prompts/select.py +142 -0
  158. aria_code/apps/cli/prompts/system_prompts.py +552 -0
  159. aria_code/apps/cli/prompts/ui.py +436 -0
  160. aria_code/apps/cli/provider_endpoints.py +237 -0
  161. aria_code/apps/cli/provider_keys.py +73 -0
  162. aria_code/apps/cli/providers/__init__.py +1 -0
  163. aria_code/apps/cli/providers/base.py +521 -0
  164. aria_code/apps/cli/providers/chat_routing.py +128 -0
  165. aria_code/apps/cli/providers/collaboration.py +98 -0
  166. aria_code/apps/cli/providers/llm/__init__.py +1 -0
  167. aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
  168. aria_code/apps/cli/providers/llm/ollama_stream.py +1594 -0
  169. aria_code/apps/cli/providers/llm/response_cache.py +60 -0
  170. aria_code/apps/cli/providers/llm/sse_stream.py +257 -0
  171. aria_code/apps/cli/providers/runtime_bridge.py +353 -0
  172. aria_code/apps/cli/providers/vertexai_stream.py +316 -0
  173. aria_code/apps/cli/runtime_consumer.py +657 -0
  174. aria_code/apps/cli/sandbox.py +32 -0
  175. aria_code/apps/cli/session_export.py +120 -0
  176. aria_code/apps/cli/session_jsonl.py +208 -0
  177. aria_code/apps/cli/session_store.py +112 -0
  178. aria_code/apps/cli/skills_catalog.py +273 -0
  179. aria_code/apps/cli/todo_tracker.py +190 -0
  180. aria_code/apps/cli/tool_executor.py +823 -0
  181. aria_code/apps/cli/tool_registry.py +34 -0
  182. aria_code/apps/cli/tool_scope.py +106 -0
  183. aria_code/apps/cli/tools/__init__.py +40 -0
  184. aria_code/apps/cli/tools/context.py +46 -0
  185. aria_code/apps/cli/tools/file_tools.py +180 -0
  186. aria_code/apps/cli/tools/market_tools.py +620 -0
  187. aria_code/apps/cli/tools/notebook_tools.py +111 -0
  188. aria_code/apps/cli/tools/system_tools.py +726 -0
  189. aria_code/apps/cli/tools/write_tools.py +845 -0
  190. aria_code/apps/cli/tradingview_bridge.py +529 -0
  191. aria_code/apps/cli/turn_planning.py +137 -0
  192. aria_code/apps/cli/update_check.py +153 -0
  193. aria_code/apps/cli/utils/__init__.py +0 -0
  194. aria_code/apps/cli/utils/market_detect.py +1597 -0
  195. aria_code/apps/daemon/README.md +14 -0
  196. aria_code/apps/vscode/README.md +115 -0
  197. aria_code/apps/vscode/package.json +70 -0
  198. aria_code/aria_cli.py +6743 -0
  199. aria_code/aria_daemon.py +1398 -0
  200. aria_code/aria_feishu_bot.py +1423 -0
  201. aria_code/aria_mcp_server.py +7 -0
  202. aria_code/aria_relay_client.py +4 -0
  203. aria_code/aria_relay_server.py +490 -0
  204. aria_code/aria_telegram_bot.py +202 -0
  205. aria_code/ariarc.py +385 -0
  206. aria_code/artifacts.py +581 -0
  207. aria_code/backtest_engine.py +4 -0
  208. aria_code/backtest_report.py +4 -0
  209. aria_code/brokers/__init__.py +78 -0
  210. aria_code/brokers/automation.py +193 -0
  211. aria_code/brokers/base.py +231 -0
  212. aria_code/brokers/capabilities.py +264 -0
  213. aria_code/brokers/cn/__init__.py +10 -0
  214. aria_code/brokers/cn/easytrader_broker.py +193 -0
  215. aria_code/brokers/cn/futu_broker.py +194 -0
  216. aria_code/brokers/cn/longbridge_broker.py +190 -0
  217. aria_code/brokers/cn/tiger_broker.py +196 -0
  218. aria_code/brokers/cn/xtquant_broker.py +225 -0
  219. aria_code/brokers/config.py +414 -0
  220. aria_code/brokers/intl/__init__.py +5 -0
  221. aria_code/brokers/intl/alpaca_broker.py +183 -0
  222. aria_code/brokers/intl/ibkr_broker.py +215 -0
  223. aria_code/brokers/intl/trading212_broker.py +183 -0
  224. aria_code/brokers/intl/webull_broker.py +156 -0
  225. aria_code/brokers/paper_broker.py +266 -0
  226. aria_code/brokers/planning.py +296 -0
  227. aria_code/brokers/registry.py +213 -0
  228. aria_code/brokers/trading.py +267 -0
  229. aria_code/canva_client.py +4 -0
  230. aria_code/change_store.py +127 -0
  231. aria_code/clients/__init__.py +0 -0
  232. aria_code/clients/aliyun_data_client.py +660 -0
  233. aria_code/clients/aria_relay_client.py +182 -0
  234. aria_code/clients/canva_client.py +284 -0
  235. aria_code/clients/figma_client.py +100 -0
  236. aria_code/clients/football_data_client.py +1671 -0
  237. aria_code/clients/kling_video_client.py +182 -0
  238. aria_code/clients/market_data_client.py +1976 -0
  239. aria_code/clients/openai_image_client.py +242 -0
  240. aria_code/clients/runway_video_client.py +157 -0
  241. aria_code/clients/warehouse_erp_client.py +105 -0
  242. aria_code/cloud_memory.py +181 -0
  243. aria_code/command_safety.py +19 -0
  244. aria_code/computer_use_tools.py +4 -0
  245. aria_code/dashboard_generator.py +579 -0
  246. aria_code/data_analysis_tools.py +4 -0
  247. aria_code/data_cleaner.py +483 -0
  248. aria_code/data_service.py +513 -0
  249. aria_code/datasources/__init__.py +23 -0
  250. aria_code/datasources/base.py +166 -0
  251. aria_code/datasources/router.py +253 -0
  252. aria_code/datasources/sources/__init__.py +15 -0
  253. aria_code/datasources/sources/akshare_source.py +269 -0
  254. aria_code/datasources/sources/alpha_vantage_source.py +203 -0
  255. aria_code/datasources/sources/edgar_source.py +219 -0
  256. aria_code/datasources/sources/finnhub_source.py +198 -0
  257. aria_code/datasources/sources/fred_source.py +223 -0
  258. aria_code/datasources/sources/tushare_source.py +143 -0
  259. aria_code/datasources/sources/web_scraper_source.py +278 -0
  260. aria_code/datasources/sources/world_bank_source.py +206 -0
  261. aria_code/datasources/sources/yfinance_source.py +152 -0
  262. aria_code/demo_player.py +207 -0
  263. aria_code/doctor.py +813 -0
  264. aria_code/domain/__init__.py +0 -0
  265. aria_code/domain/backtest_engine.py +354 -0
  266. aria_code/domain/backtest_report.py +472 -0
  267. aria_code/domain/finance_formulas.py +389 -0
  268. aria_code/domain/portfolio_ledger.py +307 -0
  269. aria_code/domain/strategy_vault.py +421 -0
  270. aria_code/evals/__init__.py +37 -0
  271. aria_code/evals/harness.py +598 -0
  272. aria_code/evals/runner.py +238 -0
  273. aria_code/external_agent_runner.py +115 -0
  274. aria_code/figma_client.py +4 -0
  275. aria_code/file_analysis_tools.py +4 -0
  276. aria_code/finance_formulas.py +4 -0
  277. aria_code/football_data_client.py +4 -0
  278. aria_code/image_gen_tools.py +4 -0
  279. aria_code/intent_classifier.py +386 -0
  280. aria_code/kling_video_client.py +4 -0
  281. aria_code/licensing.py +151 -0
  282. aria_code/local_finance_tools.py +4 -0
  283. aria_code/local_image_provider.py +4 -0
  284. aria_code/local_llm_provider.py +4 -0
  285. aria_code/macro_tools.py +4 -0
  286. aria_code/markdown_pdf.py +289 -0
  287. aria_code/market_data_client.py +4 -0
  288. aria_code/mcp_client.py +639 -0
  289. aria_code/memory_manager.py +246 -0
  290. aria_code/model_capability.py +486 -0
  291. aria_code/notification_tools.py +4 -0
  292. aria_code/openai_image_client.py +4 -0
  293. aria_code/packages/__init__.py +23 -0
  294. aria_code/packages/adk_bridge/__init__.py +11 -0
  295. aria_code/packages/adk_bridge/code_review_tools.py +49 -0
  296. aria_code/packages/adk_bridge/market_tools.py +125 -0
  297. aria_code/packages/aria_agents/__init__.py +5 -0
  298. aria_code/packages/aria_agents/manifest.py +78 -0
  299. aria_code/packages/aria_core/__init__.py +34 -0
  300. aria_code/packages/aria_core/architecture.py +269 -0
  301. aria_code/packages/aria_core/export.py +147 -0
  302. aria_code/packages/aria_core/manifest.py +65 -0
  303. aria_code/packages/aria_core/paths.py +57 -0
  304. aria_code/packages/aria_core/secure_file.py +68 -0
  305. aria_code/packages/aria_infra/__init__.py +15 -0
  306. aria_code/packages/aria_infra/arthera.py +52 -0
  307. aria_code/packages/aria_infra/doctor.py +246 -0
  308. aria_code/packages/aria_infra/product.py +40 -0
  309. aria_code/packages/aria_mcp/__init__.py +25 -0
  310. aria_code/packages/aria_mcp/bridge.py +201 -0
  311. aria_code/packages/aria_mcp/circuit.py +82 -0
  312. aria_code/packages/aria_mcp/config.py +111 -0
  313. aria_code/packages/aria_mcp/installer.py +95 -0
  314. aria_code/packages/aria_mcp/server.py +1550 -0
  315. aria_code/packages/aria_mcp/tools.py +81 -0
  316. aria_code/packages/aria_sdk/__init__.py +19 -0
  317. aria_code/packages/aria_sdk/client.py +396 -0
  318. aria_code/packages/aria_sdk/providers.py +70 -0
  319. aria_code/packages/aria_sdk/streaming.py +79 -0
  320. aria_code/packages/aria_sdk/types.py +86 -0
  321. aria_code/packages/aria_services/__init__.py +92 -0
  322. aria_code/packages/aria_services/cache.py +60 -0
  323. aria_code/packages/aria_services/context.py +356 -0
  324. aria_code/packages/aria_services/context_checkpoints.py +157 -0
  325. aria_code/packages/aria_services/data.py +11 -0
  326. aria_code/packages/aria_services/provider_health.py +268 -0
  327. aria_code/packages/aria_services/references.py +247 -0
  328. aria_code/packages/aria_services/registry.py +249 -0
  329. aria_code/packages/aria_services/research_protocol.py +57 -0
  330. aria_code/packages/aria_services/research_quality.py +186 -0
  331. aria_code/packages/aria_services/settings.py +157 -0
  332. aria_code/packages/aria_services/usage.py +151 -0
  333. aria_code/packages/aria_skills/__init__.py +46 -0
  334. aria_code/packages/aria_skills/catalog.py +149 -0
  335. aria_code/packages/aria_skills/loader.py +455 -0
  336. aria_code/packages/aria_skills/registry.py +84 -0
  337. aria_code/packages/aria_tools/__init__.py +5 -0
  338. aria_code/packages/aria_tools/financial/__init__.py +8 -0
  339. aria_code/packages/aria_tools/financial/_paths.py +130 -0
  340. aria_code/packages/aria_tools/financial/compliance.py +31 -0
  341. aria_code/packages/aria_tools/financial/factors.py +33 -0
  342. aria_code/packages/aria_tools/financial/risk_tools.py +33 -0
  343. aria_code/packages/aria_tools/financial/strategy.py +31 -0
  344. aria_code/packages/aria_tools/registry.py +128 -0
  345. aria_code/packages/quant_engine/__init__.py +34 -0
  346. aria_code/packages/quant_engine/_namespace.py +62 -0
  347. aria_code/packages/quant_engine/backtest/__init__.py +14 -0
  348. aria_code/packages/quant_engine/backtest/core.py +53 -0
  349. aria_code/packages/quant_engine/backtest/engine.py +96 -0
  350. aria_code/packages/quant_engine/portfolio/__init__.py +13 -0
  351. aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
  352. aria_code/packages/quant_engine/sports/__init__.py +80 -0
  353. aria_code/packages/quant_engine/sports/calibrator.py +354 -0
  354. aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
  355. aria_code/packages/quant_engine/sports/elo.py +300 -0
  356. aria_code/packages/quant_engine/sports/form.py +188 -0
  357. aria_code/packages/quant_engine/sports/h2h.py +195 -0
  358. aria_code/packages/quant_engine/sports/ml_model.py +377 -0
  359. aria_code/packages/quant_engine/sports/predictor.py +312 -0
  360. aria_code/packages/quant_engine/sports/tracker.py +665 -0
  361. aria_code/packages/quant_engine/stochastic/__init__.py +35 -0
  362. aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  363. aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
  364. aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  365. aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  366. aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
  367. aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  368. aria_code/packs/__init__.py +85 -0
  369. aria_code/packs/base.py +168 -0
  370. aria_code/packs/finance/__init__.py +250 -0
  371. aria_code/packs/logistics/__init__.py +169 -0
  372. aria_code/packs/payments/__init__.py +139 -0
  373. aria_code/packs/realty/__init__.py +190 -0
  374. aria_code/packs/registry.py +202 -0
  375. aria_code/packs/rules.py +90 -0
  376. aria_code/plan_utils.py +194 -0
  377. aria_code/plugin_loader.py +328 -0
  378. aria_code/portfolio_ledger.py +4 -0
  379. aria_code/preview_server.py +449 -0
  380. aria_code/privacy/__init__.py +5 -0
  381. aria_code/privacy/feedback.py +123 -0
  382. aria_code/project_review.py +278 -0
  383. aria_code/project_review_api.py +235 -0
  384. aria_code/project_review_server.py +18 -0
  385. aria_code/project_tools.py +4 -0
  386. aria_code/providers/__init__.py +30 -0
  387. aria_code/providers/llm/__init__.py +19 -0
  388. aria_code/providers/llm/anthropic.py +184 -0
  389. aria_code/providers/llm/autoconfig.py +213 -0
  390. aria_code/providers/llm/base.py +139 -0
  391. aria_code/providers/llm/custom.py +158 -0
  392. aria_code/providers/llm/ollama.py +129 -0
  393. aria_code/providers/llm/openai_compat.py +313 -0
  394. aria_code/providers/llm/registry.py +444 -0
  395. aria_code/providers/local_image_provider.py +202 -0
  396. aria_code/providers/local_llm_provider.py +589 -0
  397. aria_code/realty_data_tools.py +4 -0
  398. aria_code/report_exporters.py +150 -0
  399. aria_code/report_generator.py +1764 -0
  400. aria_code/runtime/__init__.py +169 -0
  401. aria_code/runtime/acceptance.py +481 -0
  402. aria_code/runtime/agent_loop.py +1520 -0
  403. aria_code/runtime/approval.py +57 -0
  404. aria_code/runtime/budget.py +232 -0
  405. aria_code/runtime/checkpoints.py +432 -0
  406. aria_code/runtime/crash_report.py +174 -0
  407. aria_code/runtime/events.py +113 -0
  408. aria_code/runtime/gateway.py +150 -0
  409. aria_code/runtime/lsp.py +484 -0
  410. aria_code/runtime/orchestrator.py +55 -0
  411. aria_code/runtime/repo_map.py +700 -0
  412. aria_code/runtime/run_state.py +127 -0
  413. aria_code/runtime/run_store.py +450 -0
  414. aria_code/runtime/self_healing.py +422 -0
  415. aria_code/runtime/subagent.py +547 -0
  416. aria_code/runtime/task_ledger.py +86 -0
  417. aria_code/runtime/task_orchestrator.py +90 -0
  418. aria_code/runtime/tool_executor.py +217 -0
  419. aria_code/runtime/tool_policy.py +107 -0
  420. aria_code/runtime/worktrees.py +215 -0
  421. aria_code/runway_video_client.py +4 -0
  422. aria_code/safety/__init__.py +23 -0
  423. aria_code/safety/permissions.py +306 -0
  424. aria_code/safety/service.py +102 -0
  425. aria_code/setup_wizard.py +673 -0
  426. aria_code/spreadsheet_tools.py +4 -0
  427. aria_code/strategy_vault.py +4 -0
  428. aria_code/tools/__init__.py +0 -0
  429. aria_code/tools/artifact_tools.py +252 -0
  430. aria_code/tools/broker_tools.py +92 -0
  431. aria_code/tools/build_quant_engine.py +97 -0
  432. aria_code/tools/code_audit_tools.py +192 -0
  433. aria_code/tools/computer_use_tools.py +504 -0
  434. aria_code/tools/data_analysis_tools.py +809 -0
  435. aria_code/tools/enterprise_finance_tools.py +156 -0
  436. aria_code/tools/extended_tools.py +240 -0
  437. aria_code/tools/file_analysis_tools.py +885 -0
  438. aria_code/tools/image_gen_tools.py +114 -0
  439. aria_code/tools/local_finance_tools.py +3417 -0
  440. aria_code/tools/logistics_tools.py +135 -0
  441. aria_code/tools/macro_tools.py +369 -0
  442. aria_code/tools/notification_tools.py +249 -0
  443. aria_code/tools/project_tools.py +525 -0
  444. aria_code/tools/realty_data_tools.py +659 -0
  445. aria_code/tools/spreadsheet_tools.py +388 -0
  446. aria_code/tools/stripe_tools.py +115 -0
  447. aria_code/ui/__init__.py +105 -0
  448. aria_code/ui/banner.py +508 -0
  449. aria_code/ui/completer.py +501 -0
  450. aria_code/ui/console.py +281 -0
  451. aria_code/ui/image_render.py +243 -0
  452. aria_code/ui/input_box.py +488 -0
  453. aria_code/ui/picker.py +201 -0
  454. aria_code/ui/render/__init__.py +11 -0
  455. aria_code/ui/render/finance.py +1705 -0
  456. aria_code/ui/render/market.py +225 -0
  457. aria_code/ui/render/output.py +775 -0
  458. aria_code/ui/render/responsive.py +75 -0
  459. aria_code/ui/render/team.py +354 -0
  460. aria_code/ui/robot.py +235 -0
  461. aria_code/ui/startup_dashboard.py +109 -0
  462. aria_code/utils/vscode_uri.py +37 -0
  463. aria_code/video_analysis.py +147 -0
  464. aria_code/video_editor.py +271 -0
  465. aria_code/workspace/__init__.py +6 -0
  466. aria_code/workspace/files.py +193 -0
  467. aria_code/workspace/verify.py +113 -0
  468. aria_code/workspace_changes.py +199 -0
  469. aria_code/workspace_context.py +233 -0
  470. aria_code/workspace_service.py +196 -0
  471. aria_code/workspace_tools.py +150 -0
  472. aria_code-0.52.0.dist-info/METADATA +237 -0
  473. aria_code-0.52.0.dist-info/RECORD +478 -0
  474. aria_code-0.52.0.dist-info/WHEEL +5 -0
  475. aria_code-0.52.0.dist-info/entry_points.txt +3 -0
  476. aria_code-0.52.0.dist-info/licenses/LICENSE +201 -0
  477. aria_code-0.52.0.dist-info/licenses/NOTICE +49 -0
  478. aria_code-0.52.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,492 @@
1
+ """
2
+ agents/team.py — 多 Agent 并行执行与结果汇总
3
+ =============================================
4
+ /team AAPL → 运行默认4个内置 agent
5
+ /team AAPL --agents macro,technical → 只运行指定 agent
6
+ /team AAPL --agents macro,my_agent → 内置 + 自定义混合
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import asyncio
12
+ import logging
13
+ import time
14
+ from dataclasses import dataclass, field
15
+ from typing import Any, Callable, Dict, List, Optional
16
+
17
+ from .base import BaseAgent, AgentResult
18
+ from .registry import get_registry
19
+ from .signal_scheme import SignalScheme, FINANCIAL_SCHEME
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ # 默认 team 构成(金融场景;其他领域调用方应显式传 agents= 而不是依赖这个)
24
+ DEFAULT_TEAM = ["macro", "fundamental", "technical", "risk"]
25
+
26
+
27
+ @dataclass
28
+ class TeamResult:
29
+ symbol: str
30
+ agents_run: List[str]
31
+ results: List[AgentResult]
32
+ synthesis: str = "" # 综合结论(synthesis agent 输出)
33
+ final_signal: str = "HOLD" # 多数表决
34
+ confidence: float = 0.0
35
+ elapsed_sec: float = 0.0
36
+ error: Optional[str] = None
37
+
38
+
39
+ class AgentTeam:
40
+ """
41
+ 并行运行多个 Agent,汇总结果。
42
+
43
+ 用法:
44
+ team = AgentTeam(llm_provider=provider, data_router=router)
45
+ result = await team.run("NVDA", agents=["macro","technical","risk"])
46
+ """
47
+
48
+ def __init__(
49
+ self,
50
+ llm_provider=None,
51
+ data_router=None,
52
+ on_token: Optional[Callable[[str], None]] = None,
53
+ on_thought: Optional[Callable[[str], None]] = None,
54
+ on_tool_start: Optional[Callable[[str, Dict], None]] = None,
55
+ on_tool_end: Optional[Callable[[str, Any], None]] = None,
56
+ on_agent_done: Optional[Callable[[str, AgentResult], None]] = None,
57
+ on_synthesis_start: Optional[Callable[[List["AgentResult"]], None]] = None,
58
+ timeout_per_agent: float = 60.0,
59
+ synthesis_timeout: float | None = None,
60
+ lang: str = "zh",
61
+ signal_scheme: SignalScheme = FINANCIAL_SCHEME,
62
+ ):
63
+ self.llm = llm_provider
64
+ self.data = data_router
65
+ self.on_token = on_token
66
+ self.on_thought = on_thought
67
+ self.on_tool_start = on_tool_start
68
+ self.on_tool_end = on_tool_end
69
+ self.on_agent_done = on_agent_done
70
+ self.on_synthesis_start = on_synthesis_start
71
+ self.timeout = timeout_per_agent
72
+ self.synthesis_timeout = (
73
+ float(synthesis_timeout)
74
+ if synthesis_timeout is not None
75
+ else min(float(timeout_per_agent), 30.0)
76
+ )
77
+ self.lang = lang
78
+ # 领域可插拔的信号词汇表/表决规则;默认金融词汇,对现有调用方零行为
79
+ # 变化。realty/sports 等领域应传各自的 SignalScheme(见 signal_scheme.py),
80
+ # 而不是让自己的 agent 借用金融的 BUY/SELL 语义表达完全不同的含义。
81
+ self.signal_scheme = signal_scheme
82
+
83
+ def _build_agent(self, name: str) -> Optional[BaseAgent]:
84
+ registry = get_registry()
85
+ cls = registry.get(name)
86
+ if not cls:
87
+ logger.warning(f"未知 Agent: {name},跳过")
88
+ return None
89
+ return cls(
90
+ llm_provider=self.llm,
91
+ data_router=self.data,
92
+ on_token=self.on_token,
93
+ on_thought=self.on_thought,
94
+ on_tool_start=self.on_tool_start,
95
+ on_tool_end=self.on_tool_end,
96
+ lang=self.lang,
97
+ )
98
+
99
+ @staticmethod
100
+ def _available_default_team() -> List[str]:
101
+ """Return only default agents that are registered in this installation."""
102
+ registry = get_registry()
103
+ return [name for name in DEFAULT_TEAM if registry.get(name)]
104
+
105
+ def _emit_agent_done(self, name: str, result: AgentResult) -> None:
106
+ """Notify UI adapters without allowing rendering errors to fail agents."""
107
+ if not self.on_agent_done:
108
+ return
109
+ try:
110
+ self.on_agent_done(name, result)
111
+ except Exception as exc:
112
+ logger.debug("[%s] completion callback failed: %s", name, exc)
113
+
114
+ @staticmethod
115
+ def _fallback_data_is_usable(agent_name: str, data: Dict[str, Any]) -> bool:
116
+ if agent_name == "technical":
117
+ return bool(data.get("quote", {}).get("price") and data.get("history"))
118
+ if agent_name == "fundamental":
119
+ fundamentals = data.get("fundamentals") or {}
120
+ return any(
121
+ fundamentals.get(key) not in (None, "", 0)
122
+ for key in ("pe_ttm", "pe_ratio", "pb", "pb_ratio", "roe", "revenue_growth")
123
+ )
124
+ if agent_name == "risk":
125
+ return bool(data.get("risk_metrics"))
126
+ return False
127
+
128
+ async def _deterministic_fallback(
129
+ self,
130
+ agent: BaseAgent,
131
+ symbol: str,
132
+ data: Optional[Dict[str, Any]],
133
+ reason: str,
134
+ ) -> Optional[AgentResult]:
135
+ if not data or not self._fallback_data_is_usable(agent.name, data):
136
+ return None
137
+ try:
138
+ fallback_agent = agent.__class__(
139
+ llm_provider=None,
140
+ data_router=None,
141
+ on_token=None,
142
+ lang=self.lang,
143
+ )
144
+ result = await fallback_agent.analyze(symbol, data)
145
+ result.degraded = True
146
+ result.confidence = min(float(result.confidence or 0), 0.45)
147
+ result.provenance = list(dict.fromkeys([
148
+ *result.provenance,
149
+ "prefetched_market_bundle",
150
+ "deterministic_template",
151
+ ]))
152
+ result.limitations = list(dict.fromkeys([
153
+ *result.limitations,
154
+ f"LLM agent unavailable: {reason}",
155
+ ]))
156
+ result.data_used = dict(result.data_used or {})
157
+ result.data_used["fallback_reason"] = reason
158
+ return result
159
+ except Exception as exc:
160
+ logger.warning("[%s] deterministic fallback failed: %s", agent.name, exc)
161
+ return None
162
+
163
+ async def _run_one(
164
+ self,
165
+ agent: BaseAgent,
166
+ symbol: str,
167
+ prefetched_data: Optional[Dict[str, Any]] = None,
168
+ ) -> AgentResult:
169
+ try:
170
+ agent._current_data = prefetched_data or {}
171
+ operation = (
172
+ agent.analyze(symbol, prefetched_data)
173
+ if prefetched_data is not None
174
+ else agent.run(symbol)
175
+ )
176
+ result = await asyncio.wait_for(
177
+ operation, timeout=self.timeout
178
+ )
179
+ self._emit_agent_done(agent.name, result)
180
+ return result
181
+ except asyncio.TimeoutError:
182
+ logger.warning(f"[{agent.name}] 超时 ({self.timeout}s)")
183
+ fallback = await self._deterministic_fallback(
184
+ agent, symbol, prefetched_data, "timeout"
185
+ )
186
+ if fallback is not None:
187
+ self._emit_agent_done(agent.name, fallback)
188
+ return fallback
189
+ _timeout_result = AgentResult(
190
+ agent=agent.name, symbol=symbol,
191
+ analysis="", confidence=0.0, error="timeout",
192
+ )
193
+ # Still emit the leaf so the streaming tree shows ⎿ ⏺ <agent> 超时
194
+ self._emit_agent_done(agent.name, _timeout_result)
195
+ return _timeout_result
196
+ except Exception as exc:
197
+ reason = f"{type(exc).__name__}: {exc}"
198
+ logger.warning("[%s] failed: %s", agent.name, reason)
199
+ fallback = await self._deterministic_fallback(
200
+ agent, symbol, prefetched_data, reason
201
+ )
202
+ if fallback is not None:
203
+ self._emit_agent_done(agent.name, fallback)
204
+ return fallback
205
+ failed = AgentResult(
206
+ agent=agent.name,
207
+ symbol=symbol,
208
+ analysis="",
209
+ confidence=0.0,
210
+ error=reason,
211
+ )
212
+ self._emit_agent_done(agent.name, failed)
213
+ return failed
214
+
215
+ async def run(
216
+ self,
217
+ symbol: str,
218
+ agents: Optional[List[str]] = None,
219
+ market_context: Optional[Dict[str, Any]] = None,
220
+ agent_data: Optional[Dict[str, Dict[str, Any]]] = None,
221
+ ) -> TeamResult:
222
+ """并行运行所有 agent,等待全部完成后汇总。"""
223
+ names_to_run = agents
224
+ t0 = time.time()
225
+
226
+ if not names_to_run or names_to_run == ["auto"]:
227
+ supervisor = self._build_agent("supervisor")
228
+ if supervisor:
229
+ try:
230
+ sup_result = await asyncio.wait_for(
231
+ supervisor.analyze(symbol, market_context or {}),
232
+ timeout=self.timeout
233
+ )
234
+ import json
235
+ resolved = json.loads(sup_result.analysis)
236
+ names_to_run = (
237
+ resolved
238
+ if isinstance(resolved, list) and resolved
239
+ else self._available_default_team()
240
+ )
241
+ logger.info(f"[supervisor] dynamically selected agents: {names_to_run}")
242
+ except Exception as e:
243
+ logger.warning(f"[supervisor] failed to resolve dynamic agents: {e}, falling back to default.")
244
+ names_to_run = self._available_default_team()
245
+ else:
246
+ names_to_run = self._available_default_team()
247
+
248
+ # 过滤掉 synthesis 和 debate(各自在并行批次后单独运行)
249
+ regular = [n for n in names_to_run if n not in ("synthesis", "debate")]
250
+ agent_objects = [a for n in regular if (a := self._build_agent(n))]
251
+
252
+ if not agent_objects:
253
+ return TeamResult(
254
+ symbol=symbol, agents_run=[], results=[],
255
+ error="no_agents_available"
256
+ )
257
+
258
+ # 并行执行 — return_exceptions=True 确保单个 agent 异常不取消其余 agent
259
+ prefetched = agent_data or {}
260
+ tasks = [self._run_one(a, symbol, prefetched.get(a.name)) for a in agent_objects]
261
+ _raw = await asyncio.gather(*tasks, return_exceptions=True)
262
+ results: List[AgentResult] = []
263
+ for _item, _agent in zip(_raw, agent_objects):
264
+ if isinstance(_item, BaseException):
265
+ logger.warning("[%s] 意外异常: %s", _agent.name, _item)
266
+ results.append(AgentResult(
267
+ agent=_agent.name, symbol=symbol,
268
+ analysis="", confidence=0.0,
269
+ error=f"exception: {type(_item).__name__}: {_item}",
270
+ ))
271
+ else:
272
+ results.append(_item)
273
+
274
+ # DebateAgent — 显式请求 OR 信号冲突时自动触发
275
+ explicit_debate = "debate" in names_to_run
276
+ if explicit_debate or self.signal_scheme.needs_debate(results):
277
+ debate_agent = self._build_agent("debate")
278
+ if debate_agent:
279
+ debate_data = {
280
+ "conflicting": [r.to_dict() for r in results if r.success],
281
+ # 领域词汇表要一起传:DebateAgent 默认说金融的 BUY/HOLD/SELL,
282
+ # 不告诉它当前领域用什么词,它产出的信号会被 vote() 过滤掉
283
+ # (不在 scores 里),等于裁判意见完全不参与最终结论。
284
+ "signal_scheme": self.signal_scheme,
285
+ }
286
+ try:
287
+ debate_result = await asyncio.wait_for(
288
+ debate_agent.analyze(symbol, debate_data),
289
+ timeout=self.timeout,
290
+ )
291
+ results.append(debate_result)
292
+ logger.info("[debate] %s 信号冲突已调解", symbol)
293
+ except Exception as e:
294
+ logger.warning("[debate] 调解失败: %s", e)
295
+
296
+ # Fire on_synthesis_start callback so callers can print the agent table
297
+ # before synthesis begins streaming tokens.
298
+ if self.on_synthesis_start:
299
+ try:
300
+ self.on_synthesis_start(list(results))
301
+ except Exception:
302
+ pass
303
+
304
+ final_signal, confidence = self.signal_scheme.vote(results)
305
+
306
+ # synthesis — 把 agent 结果打包进 data,直接调 analyze() 而非 run()
307
+ synthesis_text = ""
308
+ successful_results = [result for result in results if result.success]
309
+ should_synthesize = bool(successful_results) and (
310
+ "synthesis" in names_to_run or len(successful_results) >= 2
311
+ )
312
+ if should_synthesize:
313
+ synth_cls = get_registry().get("synthesis")
314
+ if synth_cls:
315
+ synth_agent = synth_cls(
316
+ llm_provider=self.llm,
317
+ data_router=self.data,
318
+ on_token=self.on_token,
319
+ )
320
+ synth_data = {
321
+ "agent_results": [r.to_dict() for r in results],
322
+ "consensus_signal": final_signal,
323
+ "consensus_confidence": confidence,
324
+ }
325
+ if market_context:
326
+ synth_data.update(market_context)
327
+ try:
328
+ synth_result = await asyncio.wait_for(
329
+ synth_agent.analyze(symbol, synth_data),
330
+ timeout=self.synthesis_timeout,
331
+ )
332
+ synthesis_text = synth_result.analysis
333
+ except Exception as e:
334
+ logger.warning(f"[synthesis] 失败: {e}")
335
+ synthesis_text = _template_synthesis(results, self.signal_scheme)
336
+ else:
337
+ synthesis_text = _template_synthesis(results, self.signal_scheme)
338
+ else:
339
+ synthesis_text = _template_synthesis(results, self.signal_scheme)
340
+
341
+ return TeamResult(
342
+ symbol = symbol,
343
+ agents_run = [a.name for a in agent_objects],
344
+ results = list(results),
345
+ synthesis = synthesis_text,
346
+ final_signal = final_signal,
347
+ confidence = confidence,
348
+ elapsed_sec = round(time.time() - t0, 1),
349
+ )
350
+
351
+ async def run_sequential(
352
+ self,
353
+ symbol: str,
354
+ agents: List[str],
355
+ market_context: Optional[Dict[str, Any]] = None,
356
+ agent_data: Optional[Dict[str, Dict[str, Any]]] = None,
357
+ ) -> TeamResult:
358
+ """
359
+ DAG / Pipeline 顺序工作流。
360
+ 按给定顺序依次执行 Agent,上一个 Agent 的核心结论(key_points)会自动
361
+ 注入到下一个 Agent 的上下文中。适合需要因果推理的场景(如 Macro -> Fundamental)。
362
+ """
363
+ t0 = time.time()
364
+ results: List[AgentResult] = []
365
+ accumulated_context = dict(market_context or {})
366
+
367
+ agent_objects = [a for n in agents if (a := self._build_agent(n))]
368
+ if not agent_objects:
369
+ return TeamResult(symbol=symbol, agents_run=[], results=[], error="no_agents_available")
370
+
371
+ prefetched = agent_data or {}
372
+
373
+ for agent in agent_objects:
374
+ # 注入前面累积的上下文(如果有 prefetched_data 则混合进去)
375
+ current_data = dict(prefetched.get(agent.name, {}))
376
+ current_data["upstream_context"] = accumulated_context.get("upstream_insights", [])
377
+
378
+ result = await self._run_one(agent, symbol, current_data)
379
+ results.append(result)
380
+
381
+ # 将当前结论提取,传递给下一个 Agent
382
+ if result.success and result.key_points:
383
+ insights = accumulated_context.get("upstream_insights", [])
384
+ insights.extend([f"[{agent.name.upper()}]: {pt}" for pt in result.key_points])
385
+ accumulated_context["upstream_insights"] = insights
386
+
387
+ # 执行最终的信号表决与综合
388
+ final_signal, confidence = self.signal_scheme.vote(results)
389
+ synthesis_text = _template_synthesis(results, self.signal_scheme)
390
+
391
+ return TeamResult(
392
+ symbol = symbol,
393
+ agents_run = [a.name for a in agent_objects],
394
+ results = list(results),
395
+ synthesis = synthesis_text,
396
+ final_signal = final_signal,
397
+ confidence = confidence,
398
+ elapsed_sec = round(time.time() - t0, 1),
399
+ )
400
+
401
+
402
+ # ── 独立函数(兼容旧 financial_agents.py 调用方式)──────────────────────────
403
+
404
+ async def run_team(
405
+ symbol: str,
406
+ agents: Optional[List[str]] = None,
407
+ llm_provider=None,
408
+ data_router=None,
409
+ on_token: Optional[Callable] = None,
410
+ on_thought: Optional[Callable] = None,
411
+ on_tool_start: Optional[Callable] = None,
412
+ on_tool_end: Optional[Callable] = None,
413
+ on_agent_done: Optional[Callable] = None,
414
+ on_synthesis_start: Optional[Callable] = None,
415
+ lang: str = "zh",
416
+ market_context: Optional[Dict[str, Any]] = None,
417
+ agent_data: Optional[Dict[str, Dict[str, Any]]] = None,
418
+ timeout_per_agent: float = 60.0,
419
+ synthesis_timeout: float | None = None,
420
+ use_pipeline: bool = False,
421
+ ) -> TeamResult:
422
+ """
423
+ 便捷函数,替代原 financial_agents.run_team_analysis()。
424
+
425
+ 旧签名兼容:
426
+ result = await run_team_analysis("NVDA", ollama_url, model, on_token)
427
+ 新签名:
428
+ result = await run_team("NVDA", llm_provider=provider, on_token=cb)
429
+ """
430
+ team = AgentTeam(
431
+ llm_provider=llm_provider,
432
+ data_router=data_router,
433
+ on_token=on_token,
434
+ on_thought=on_thought,
435
+ on_tool_start=on_tool_start,
436
+ on_tool_end=on_tool_end,
437
+ on_agent_done=on_agent_done,
438
+ on_synthesis_start=on_synthesis_start,
439
+ timeout_per_agent=timeout_per_agent,
440
+ synthesis_timeout=synthesis_timeout,
441
+ lang=lang,
442
+ )
443
+ if use_pipeline:
444
+ return await team.run_sequential(
445
+ symbol,
446
+ agents=agents,
447
+ market_context=market_context,
448
+ agent_data=agent_data,
449
+ )
450
+ else:
451
+ return await team.run(
452
+ symbol,
453
+ agents=agents,
454
+ market_context=market_context,
455
+ agent_data=agent_data,
456
+ )
457
+
458
+
459
+ # ── 内部工具 ──────────────────────────────────────────────────────────────────
460
+
461
+ def _needs_debate(results: List[AgentResult], scheme: SignalScheme = FINANCIAL_SCHEME) -> bool:
462
+ """当出现真实的正/负信号分歧时返回 True(默认金融 BUY/SELL 词汇,向后兼容)。"""
463
+ return scheme.needs_debate(results)
464
+
465
+
466
+ def _vote_signal(results: List[AgentResult], scheme: SignalScheme = FINANCIAL_SCHEME) -> tuple:
467
+ """按置信度加权表决最终信号(默认金融词汇,向后兼容 agents/deep/pipeline.py 的直接调用)。"""
468
+ return scheme.vote(results)
469
+
470
+
471
+ def _template_synthesis(results: List[AgentResult], scheme: SignalScheme = FINANCIAL_SCHEME) -> str:
472
+ """无 synthesis agent 时的模板汇总"""
473
+ if not results:
474
+ return "分析完成,无结果。"
475
+ lines = ["## 团队分析汇总\n"]
476
+ failed_count = sum(1 for r in results if not r.success)
477
+ if failed_count:
478
+ lines.append(f"> ⚠️ {failed_count}/{len(results)} 个 agent 未能完成分析"
479
+ f"(超时或 LLM 不可用),以下结论仅基于成功的 agent。\n")
480
+ for r in results:
481
+ if r.success:
482
+ lines.append(f"**{r.agent.upper()}** ({r.signal}, 置信度 {r.confidence:.0%})")
483
+ for pt in (r.key_points or [])[:3]:
484
+ lines.append(f" • {pt}")
485
+ else:
486
+ err_label = "超时" if r.error == "timeout" else (r.error or "分析失败")
487
+ lines.append(f"**{r.agent.upper()}** ⚠️ {err_label}")
488
+ signal, conf = scheme.vote(results)
489
+ lines.append(f"\n**综合结论**: {signal}(置信度 {conf:.0%})")
490
+ if failed_count == len(results):
491
+ lines.append("\n> ⚠️ 所有 agent 均未成功,此结论仅为默认值,不具参考意义。请确认 LLM 服务正常后重试。")
492
+ return "\n".join(lines)
@@ -0,0 +1,25 @@
1
+ """海外仓与物流供应链领域 Agent:物流同步、运费成本优化、履约时效、入库异常和库存健康度。"""
2
+ from ..signal_scheme import WAREHOUSE_SCHEME
3
+ from .logistics_sync import LogisticsSyncAgent
4
+ from .inbound_exceptions import InboundExceptionAgent
5
+ from .inventory_health import InventoryHealthAgent
6
+ from .logistics_cost import LogisticsCostOptimizerAgent
7
+ from .fulfillment_leadtime import FulfillmentLeadTimeAgent
8
+
9
+ WAREHOUSE_TEAM = [
10
+ "warehouse_logistics_cost",
11
+ "warehouse_fulfillment_leadtime",
12
+ "warehouse_inventory_health",
13
+ "warehouse_inbound_exceptions",
14
+ "warehouse_logistics_sync",
15
+ ]
16
+
17
+ __all__ = [
18
+ "LogisticsSyncAgent",
19
+ "InboundExceptionAgent",
20
+ "InventoryHealthAgent",
21
+ "LogisticsCostOptimizerAgent",
22
+ "FulfillmentLeadTimeAgent",
23
+ "WAREHOUSE_TEAM",
24
+ "WAREHOUSE_SCHEME",
25
+ ]
@@ -0,0 +1,26 @@
1
+ """Small, dependency-free input helpers for read-only warehouse agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping
6
+ from typing import Any
7
+
8
+
9
+ def records(payload: Mapping[str, Any] | None, key: str) -> list[Mapping[str, Any]]:
10
+ """Return only mapping records from an optional ERP response payload."""
11
+ value = payload.get(key, []) if isinstance(payload, Mapping) else []
12
+ return [item for item in value if isinstance(item, Mapping)] if isinstance(value, list) else []
13
+
14
+
15
+ def number(value: Any, default: float = 0.0) -> float:
16
+ try:
17
+ return float(value)
18
+ except (TypeError, ValueError):
19
+ return default
20
+
21
+
22
+ def integer(value: Any, default: int = 0) -> int:
23
+ try:
24
+ return int(value)
25
+ except (TypeError, ValueError):
26
+ return default