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.
- aria_bots/__init__.py +7 -0
- aria_bots/channels/README.md +97 -0
- aria_bots/channels/__init__.py +1 -0
- aria_bots/channels/approvals.py +263 -0
- aria_bots/channels/conversation.py +280 -0
- aria_bots/channels/digest.py +186 -0
- aria_bots/channels/registry.py +95 -0
- aria_bots/engine.py +144 -0
- aria_bots/feishu_bot.py +1385 -0
- aria_bots/logistics/__init__.py +1 -0
- aria_bots/logistics/carriers.py +253 -0
- aria_bots/logistics/freight.py +154 -0
- aria_bots/logistics/inventory.py +242 -0
- aria_bots/logistics/mcp_server.py +156 -0
- aria_bots/logistics/records.py +119 -0
- aria_bots/logistics/tenancy.py +152 -0
- aria_bots/market.py +91 -0
- aria_bots/relay_client.py +326 -0
- aria_bots/telegram_bot.py +299 -0
- aria_code/__init__.py +111 -0
- aria_code/_bin/aria-native.exe +0 -0
- aria_code/_bin/aria-runtime.exe +0 -0
- aria_code/_version.py +20 -0
- aria_code/account_memory.py +296 -0
- aria_code/account_session.py +166 -0
- aria_code/adk_apps/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/agent.py +32 -0
- aria_code/adk_apps/aria_research/__init__.py +1 -0
- aria_code/adk_apps/aria_research/agent.py +31 -0
- aria_code/agents/__init__.py +49 -0
- aria_code/agents/base.py +329 -0
- aria_code/agents/code_review.py +200 -0
- aria_code/agents/deep/__init__.py +37 -0
- aria_code/agents/deep/calibration_loop.py +144 -0
- aria_code/agents/deep/critic.py +125 -0
- aria_code/agents/deep/deepen.py +193 -0
- aria_code/agents/deep/models.py +149 -0
- aria_code/agents/deep/pipeline.py +164 -0
- aria_code/agents/deep/quant_fusion.py +192 -0
- aria_code/agents/deep/themes.py +95 -0
- aria_code/agents/deep/tiers.py +106 -0
- aria_code/agents/engineering/__init__.py +14 -0
- aria_code/agents/engineering/coder.py +222 -0
- aria_code/agents/engineering/tester.py +145 -0
- aria_code/agents/financial/__init__.py +21 -0
- aria_code/agents/financial/cashflow_burn.py +119 -0
- aria_code/agents/financial/catalyst.py +279 -0
- aria_code/agents/financial/corporate_finance.py +175 -0
- aria_code/agents/financial/debate.py +224 -0
- aria_code/agents/financial/earnings.py +315 -0
- aria_code/agents/financial/fundamental.py +178 -0
- aria_code/agents/financial/macro.py +111 -0
- aria_code/agents/financial/news.py +231 -0
- aria_code/agents/financial/risk.py +146 -0
- aria_code/agents/financial/sector.py +279 -0
- aria_code/agents/financial/strategist.py +121 -0
- aria_code/agents/financial/stripe_revenue.py +127 -0
- aria_code/agents/financial/synthesis.py +274 -0
- aria_code/agents/financial/technical.py +277 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +392 -0
- aria_code/agents/realty/__init__.py +62 -0
- aria_code/agents/realty/asset_diagnosis.py +152 -0
- aria_code/agents/realty/business_match.py +166 -0
- aria_code/agents/realty/cashflow_verify.py +209 -0
- aria_code/agents/realty/contract_rules.py +210 -0
- aria_code/agents/realty/energy_anomaly.py +189 -0
- aria_code/agents/realty/exit_settlement.py +208 -0
- aria_code/agents/realty/fulfillment_risk.py +206 -0
- aria_code/agents/realty/ops_optimize.py +160 -0
- aria_code/agents/realty/revenue_share.py +215 -0
- aria_code/agents/registry.py +168 -0
- aria_code/agents/signal_scheme.py +111 -0
- aria_code/agents/sports/__init__.py +0 -0
- aria_code/agents/sports/football_agent.py +197 -0
- aria_code/agents/supervisor.py +113 -0
- aria_code/agents/team.py +500 -0
- aria_code/agents/video/__init__.py +16 -0
- aria_code/agents/video/director.py +376 -0
- aria_code/agents/video/qa_agent.py +143 -0
- aria_code/agents/video/script_doctor.py +112 -0
- aria_code/agents/warehouse/__init__.py +25 -0
- aria_code/agents/warehouse/contracts.py +26 -0
- aria_code/agents/warehouse/dashboard.py +155 -0
- aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
- aria_code/agents/warehouse/inbound_exceptions.py +25 -0
- aria_code/agents/warehouse/inventory_health.py +24 -0
- aria_code/agents/warehouse/local_run.py +71 -0
- aria_code/agents/warehouse/local_snapshot.py +132 -0
- aria_code/agents/warehouse/logistics_cost.py +84 -0
- aria_code/agents/warehouse/logistics_sync.py +21 -0
- aria_code/agents/warehouse/navigation.schema.json +110 -0
- aria_code/agents/warehouse/task_agent.py +172 -0
- aria_code/agents/warehouse/workflow.py +31 -0
- aria_code/aliyun_data_client.py +4 -0
- aria_code/apps/README.md +12 -0
- aria_code/apps/__init__.py +2 -0
- aria_code/apps/channels/README.md +9 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/approvals.py +11 -0
- aria_code/apps/channels/conversation.py +11 -0
- aria_code/apps/channels/digest.py +11 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +11 -0
- aria_code/apps/channels/tradingview.py +94 -0
- aria_code/apps/cli/README.md +13 -0
- aria_code/apps/cli/__init__.py +2 -0
- aria_code/apps/cli/_optional.py +120 -0
- aria_code/apps/cli/app_server.py +656 -0
- aria_code/apps/cli/auto_update.py +125 -0
- aria_code/apps/cli/bootstrap.py +206 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/chat_turn.py +1327 -0
- aria_code/apps/cli/cloud_models.py +231 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +34 -0
- aria_code/apps/cli/commands/_business_render.py +78 -0
- aria_code/apps/cli/commands/_ui.py +71 -0
- aria_code/apps/cli/commands/analysis_cmds.py +378 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +215 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
- aria_code/apps/cli/commands/broker_cmds.py +1236 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +189 -0
- aria_code/apps/cli/commands/core_cmds.py +2748 -0
- aria_code/apps/cli/commands/data_cmds.py +521 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/engineering_cmds.py +399 -0
- aria_code/apps/cli/commands/file_cmds.py +312 -0
- aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
- aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
- aria_code/apps/cli/commands/market.py +544 -0
- aria_code/apps/cli/commands/market_cmds.py +1419 -0
- aria_code/apps/cli/commands/market_context.py +432 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2374 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
- aria_code/apps/cli/commands/report.py +476 -0
- aria_code/apps/cli/commands/scaffold_templates.py +617 -0
- aria_code/apps/cli/commands/session_cmds.py +236 -0
- aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
- aria_code/apps/cli/commands/team.py +723 -0
- aria_code/apps/cli/commands/team_render.py +8 -0
- aria_code/apps/cli/commands/ui_cmds.py +401 -0
- aria_code/apps/cli/commands/warehouse_cmds.py +297 -0
- aria_code/apps/cli/commands/workflow_cmds.py +629 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +158 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/conversation_policy.py +53 -0
- aria_code/apps/cli/deterministic.py +200 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/earnings_view.py +172 -0
- aria_code/apps/cli/endpoint_migration.py +64 -0
- aria_code/apps/cli/exec_events.py +255 -0
- aria_code/apps/cli/file_references.py +155 -0
- aria_code/apps/cli/finance_service_catalog.py +111 -0
- aria_code/apps/cli/football_reports.py +231 -0
- aria_code/apps/cli/github_app_auth.py +135 -0
- aria_code/apps/cli/google_login.py +239 -0
- aria_code/apps/cli/handlers/__init__.py +11 -0
- aria_code/apps/cli/handlers/broker_handlers.py +122 -0
- aria_code/apps/cli/handlers/chart_handlers.py +1314 -0
- aria_code/apps/cli/handlers/market_handlers.py +2570 -0
- aria_code/apps/cli/handlers/realty_handlers.py +114 -0
- aria_code/apps/cli/handlers/sports_handlers.py +22 -0
- aria_code/apps/cli/handlers/strategy_advice.py +82 -0
- aria_code/apps/cli/headless.py +352 -0
- aria_code/apps/cli/helpers.py +326 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +310 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +305 -0
- aria_code/apps/cli/intent_shadow.py +72 -0
- aria_code/apps/cli/intent_signals.py +347 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +550 -0
- aria_code/apps/cli/main.py +39 -0
- aria_code/apps/cli/market_hours.py +100 -0
- aria_code/apps/cli/market_metadata.py +135 -0
- aria_code/apps/cli/market_universe.py +487 -0
- aria_code/apps/cli/message_processing.py +310 -0
- aria_code/apps/cli/mixin_binding.py +32 -0
- aria_code/apps/cli/model_catalog.py +652 -0
- aria_code/apps/cli/model_probe.py +169 -0
- aria_code/apps/cli/model_retirement.py +65 -0
- aria_code/apps/cli/native_branding.py +12 -0
- aria_code/apps/cli/native_bridge.py +118 -0
- aria_code/apps/cli/native_entry.py +58 -0
- aria_code/apps/cli/pdf_report.py +977 -0
- aria_code/apps/cli/plan_mode.py +139 -0
- aria_code/apps/cli/plotly_html.py +15 -0
- aria_code/apps/cli/prediction_feedback.py +202 -0
- aria_code/apps/cli/preflight.py +502 -0
- aria_code/apps/cli/project_aria.py +60 -0
- aria_code/apps/cli/prompt_assembly.py +78 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +71 -0
- aria_code/apps/cli/prompts/select.py +193 -0
- aria_code/apps/cli/prompts/system_prompts.py +562 -0
- aria_code/apps/cli/prompts/ui.py +436 -0
- aria_code/apps/cli/provider_endpoints.py +237 -0
- aria_code/apps/cli/provider_keys.py +73 -0
- aria_code/apps/cli/providers/__init__.py +1 -0
- aria_code/apps/cli/providers/base.py +775 -0
- aria_code/apps/cli/providers/chat_routing.py +139 -0
- aria_code/apps/cli/providers/collaboration.py +98 -0
- aria_code/apps/cli/providers/llm/__init__.py +1 -0
- aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
- aria_code/apps/cli/providers/llm/ollama_stream.py +1574 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
- aria_code/apps/cli/providers/runtime_bridge.py +586 -0
- aria_code/apps/cli/providers/vertexai_stream.py +592 -0
- aria_code/apps/cli/release_download.py +159 -0
- aria_code/apps/cli/review_runner.py +111 -0
- aria_code/apps/cli/runtime_consumer.py +769 -0
- aria_code/apps/cli/sandbox.py +32 -0
- aria_code/apps/cli/session_export.py +120 -0
- aria_code/apps/cli/session_jsonl.py +208 -0
- aria_code/apps/cli/session_refresh.py +123 -0
- aria_code/apps/cli/session_store.py +125 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/task_isolation.py +211 -0
- aria_code/apps/cli/terminal_chrome.py +412 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +932 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +113 -0
- aria_code/apps/cli/tools/__init__.py +40 -0
- aria_code/apps/cli/tools/context.py +46 -0
- aria_code/apps/cli/tools/file_tools.py +181 -0
- aria_code/apps/cli/tools/market_tools.py +626 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +656 -0
- aria_code/apps/cli/tools/write_tools.py +961 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/transactions.py +269 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +257 -0
- aria_code/apps/cli/updater.py +373 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1663 -0
- aria_code/apps/cli/web_login.py +136 -0
- aria_code/apps/cli/workflow_runner.py +127 -0
- aria_code/apps/cli/workspace_route.py +121 -0
- aria_code/apps/daemon/README.md +14 -0
- aria_code/apps/vscode/README.md +115 -0
- aria_code/apps/vscode/package.json +70 -0
- aria_code/aria_cli.py +5244 -0
- aria_code/aria_daemon.py +1372 -0
- aria_code/aria_feishu_bot.py +16 -0
- aria_code/aria_mcp_server.py +61 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_telegram_bot.py +11 -0
- aria_code/ariarc.py +385 -0
- aria_code/artifacts.py +581 -0
- aria_code/backtest_engine.py +4 -0
- aria_code/backtest_report.py +4 -0
- aria_code/brokers/__init__.py +78 -0
- aria_code/brokers/automation.py +193 -0
- aria_code/brokers/base.py +231 -0
- aria_code/brokers/capabilities.py +264 -0
- aria_code/brokers/cn/__init__.py +10 -0
- aria_code/brokers/cn/easytrader_broker.py +193 -0
- aria_code/brokers/cn/futu_broker.py +194 -0
- aria_code/brokers/cn/longbridge_broker.py +190 -0
- aria_code/brokers/cn/tiger_broker.py +196 -0
- aria_code/brokers/cn/xtquant_broker.py +225 -0
- aria_code/brokers/config.py +414 -0
- aria_code/brokers/intl/__init__.py +5 -0
- aria_code/brokers/intl/alpaca_broker.py +183 -0
- aria_code/brokers/intl/ibkr_broker.py +215 -0
- aria_code/brokers/intl/trading212_broker.py +183 -0
- aria_code/brokers/intl/webull_broker.py +156 -0
- aria_code/brokers/paper_broker.py +266 -0
- aria_code/brokers/planning.py +296 -0
- aria_code/brokers/registry.py +213 -0
- aria_code/brokers/trading.py +267 -0
- aria_code/canva_client.py +4 -0
- aria_code/change_store.py +127 -0
- aria_code/clients/__init__.py +0 -0
- aria_code/clients/aliyun_data_client.py +660 -0
- aria_code/clients/aria_relay_client.py +16 -0
- aria_code/clients/canva_client.py +284 -0
- aria_code/clients/figma_client.py +100 -0
- aria_code/clients/football_data_client.py +1671 -0
- aria_code/clients/kling_video_client.py +182 -0
- aria_code/clients/market_data_client.py +1985 -0
- aria_code/clients/openai_image_client.py +242 -0
- aria_code/clients/runway_video_client.py +157 -0
- aria_code/clients/warehouse_erp_client.py +105 -0
- aria_code/cloud_memory.py +190 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_server.py +276 -0
- aria_code/computer_use_tools.py +4 -0
- aria_code/dashboard_generator.py +579 -0
- aria_code/data_analysis_tools.py +4 -0
- aria_code/data_cleaner.py +483 -0
- aria_code/data_service.py +513 -0
- aria_code/datasources/__init__.py +23 -0
- aria_code/datasources/base.py +166 -0
- aria_code/datasources/router.py +253 -0
- aria_code/datasources/sec_statements.py +217 -0
- aria_code/datasources/sources/__init__.py +15 -0
- aria_code/datasources/sources/akshare_source.py +269 -0
- aria_code/datasources/sources/alpha_vantage_source.py +203 -0
- aria_code/datasources/sources/edgar_source.py +219 -0
- aria_code/datasources/sources/finnhub_source.py +198 -0
- aria_code/datasources/sources/fred_source.py +223 -0
- aria_code/datasources/sources/tushare_source.py +143 -0
- aria_code/datasources/sources/web_scraper_source.py +278 -0
- aria_code/datasources/sources/world_bank_source.py +206 -0
- aria_code/datasources/sources/yfinance_source.py +152 -0
- aria_code/doctor.py +860 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/_finance_core/__init__.py +5 -0
- aria_code/domain/_finance_core/backtest_engine.py +325 -0
- aria_code/domain/_finance_core/performance_stats.py +101 -0
- aria_code/domain/backtest_engine.py +75 -0
- aria_code/domain/backtest_report.py +488 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/performance_stats.py +6 -0
- aria_code/domain/portfolio_ledger.py +307 -0
- aria_code/domain/strategy_vault.py +421 -0
- aria_code/evals/__init__.py +37 -0
- aria_code/evals/behavior.py +113 -0
- aria_code/evals/gap.py +93 -0
- aria_code/evals/harness.py +949 -0
- aria_code/evals/review_probe.py +132 -0
- aria_code/evals/runner.py +425 -0
- aria_code/evals/scorecard.py +322 -0
- aria_code/evals/summary.py +125 -0
- aria_code/external_agent_runner.py +115 -0
- aria_code/figma_client.py +4 -0
- aria_code/file_analysis_tools.py +4 -0
- aria_code/finance_formulas.py +4 -0
- aria_code/football_data_client.py +4 -0
- aria_code/image_gen_tools.py +4 -0
- aria_code/intent_classifier.py +459 -0
- aria_code/kling_video_client.py +4 -0
- aria_code/licensing.py +151 -0
- aria_code/local_finance_tools.py +4 -0
- aria_code/local_image_provider.py +4 -0
- aria_code/local_llm_provider.py +4 -0
- aria_code/macro_tools.py +4 -0
- aria_code/markdown_pdf.py +289 -0
- aria_code/market_data_client.py +4 -0
- aria_code/mcp_client.py +744 -0
- aria_code/memory_manager.py +273 -0
- aria_code/model_capability.py +512 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +26 -0
- aria_code/packages/adk_bridge/__init__.py +11 -0
- aria_code/packages/adk_bridge/code_review_tools.py +49 -0
- aria_code/packages/adk_bridge/market_tools.py +125 -0
- aria_code/packages/aria_agents/__init__.py +5 -0
- aria_code/packages/aria_agents/manifest.py +78 -0
- aria_code/packages/aria_core/__init__.py +34 -0
- aria_code/packages/aria_core/architecture.py +269 -0
- aria_code/packages/aria_core/export.py +147 -0
- aria_code/packages/aria_core/manifest.py +65 -0
- aria_code/packages/aria_core/paths.py +57 -0
- aria_code/packages/aria_core/secure_file.py +68 -0
- aria_code/packages/aria_infra/__init__.py +15 -0
- aria_code/packages/aria_infra/arthera.py +58 -0
- aria_code/packages/aria_infra/doctor.py +246 -0
- aria_code/packages/aria_infra/product.py +40 -0
- aria_code/packages/aria_mcp/__init__.py +25 -0
- aria_code/packages/aria_mcp/bridge.py +232 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +162 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1705 -0
- aria_code/packages/aria_mcp/tools.py +81 -0
- aria_code/packages/aria_sdk/__init__.py +19 -0
- aria_code/packages/aria_sdk/client.py +393 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +75 -0
- aria_code/packages/aria_sdk/types.py +86 -0
- aria_code/packages/aria_services/__init__.py +92 -0
- aria_code/packages/aria_services/cache.py +60 -0
- aria_code/packages/aria_services/context.py +356 -0
- aria_code/packages/aria_services/context_checkpoints.py +157 -0
- aria_code/packages/aria_services/data.py +11 -0
- aria_code/packages/aria_services/provider_health.py +304 -0
- aria_code/packages/aria_services/references.py +247 -0
- aria_code/packages/aria_services/registry.py +249 -0
- aria_code/packages/aria_services/research_protocol.py +137 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +160 -0
- aria_code/packages/aria_services/usage.py +151 -0
- aria_code/packages/aria_skills/__init__.py +46 -0
- aria_code/packages/aria_skills/catalog.py +149 -0
- aria_code/packages/aria_skills/loader.py +455 -0
- aria_code/packages/aria_skills/registry.py +84 -0
- aria_code/packages/aria_tools/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/_paths.py +92 -0
- aria_code/packages/aria_tools/registry.py +129 -0
- aria_code/packages/quant_engine/__init__.py +33 -0
- aria_code/packages/quant_engine/_namespace.py +24 -0
- aria_code/packages/quant_engine/backtest/__init__.py +10 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +102 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +76 -0
- aria_code/packages/quant_engine/sports/calibrator.py +354 -0
- aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
- aria_code/packages/quant_engine/sports/elo.py +300 -0
- aria_code/packages/quant_engine/sports/form.py +188 -0
- aria_code/packages/quant_engine/sports/h2h.py +195 -0
- aria_code/packages/quant_engine/sports/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +31 -0
- aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
- aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
- aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- aria_code/packs/__init__.py +85 -0
- aria_code/packs/base.py +168 -0
- aria_code/packs/finance/__init__.py +250 -0
- aria_code/packs/healthcare/__init__.py +40 -0
- aria_code/packs/logistics/__init__.py +171 -0
- aria_code/packs/payments/__init__.py +139 -0
- aria_code/packs/realty/__init__.py +190 -0
- aria_code/packs/registry.py +202 -0
- aria_code/packs/rules.py +90 -0
- aria_code/plan_utils.py +194 -0
- aria_code/plugin_loader.py +328 -0
- aria_code/portfolio_ledger.py +4 -0
- aria_code/preview_server.py +449 -0
- aria_code/privacy/__init__.py +5 -0
- aria_code/privacy/feedback.py +123 -0
- aria_code/project_review.py +278 -0
- aria_code/project_review_api.py +235 -0
- aria_code/project_review_server.py +18 -0
- aria_code/project_tools.py +4 -0
- aria_code/providers/__init__.py +30 -0
- aria_code/providers/google_video_provider.py +256 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/arthera_gateway.py +90 -0
- aria_code/providers/llm/autoconfig.py +213 -0
- aria_code/providers/llm/base.py +139 -0
- aria_code/providers/llm/custom.py +158 -0
- aria_code/providers/llm/ollama.py +137 -0
- aria_code/providers/llm/openai_compat.py +350 -0
- aria_code/providers/llm/registry.py +457 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +549 -0
- aria_code/providers/ollama_models.py +79 -0
- aria_code/providers/openai_params.py +32 -0
- aria_code/providers/tool_messages.py +100 -0
- aria_code/realty_data_tools.py +4 -0
- aria_code/report_exporters.py +150 -0
- aria_code/report_generator.py +1764 -0
- aria_code/review_service.py +497 -0
- aria_code/runtime/__init__.py +176 -0
- aria_code/runtime/acceptance.py +632 -0
- aria_code/runtime/agent_loop.py +1851 -0
- aria_code/runtime/agent_profiles.py +75 -0
- aria_code/runtime/approval.py +71 -0
- aria_code/runtime/baseline.py +219 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +481 -0
- aria_code/runtime/consult.py +65 -0
- aria_code/runtime/contract.py +282 -0
- aria_code/runtime/delivery.py +432 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +167 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/native_index.py +153 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/processes.py +343 -0
- aria_code/runtime/project_graph.py +614 -0
- aria_code/runtime/repo_map.py +712 -0
- aria_code/runtime/research_bundle.py +105 -0
- aria_code/runtime/review.py +269 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +522 -0
- aria_code/runtime/scoped_runs.py +113 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/semantic_diff.py +171 -0
- aria_code/runtime/subagent.py +721 -0
- aria_code/runtime/symbol_edit.py +117 -0
- aria_code/runtime/task_brief.py +46 -0
- aria_code/runtime/task_context.py +145 -0
- aria_code/runtime/task_ledger.py +108 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/task_outcome.py +33 -0
- aria_code/runtime/task_verification.py +266 -0
- aria_code/runtime/task_worktree.py +448 -0
- aria_code/runtime/tool_executor.py +329 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/transactions.py +216 -0
- aria_code/runtime/windows_job.py +115 -0
- aria_code/runtime/workflows.py +222 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +27 -0
- aria_code/safety/client_isolation.py +178 -0
- aria_code/safety/permissions.py +339 -0
- aria_code/safety/risk.py +699 -0
- aria_code/safety/sandbox.py +148 -0
- aria_code/safety/service.py +102 -0
- aria_code/service_endpoints.py +14 -0
- aria_code/setup_wizard.py +684 -0
- aria_code/spreadsheet_tools.py +4 -0
- aria_code/strategy_vault.py +4 -0
- aria_code/tools/__init__.py +0 -0
- aria_code/tools/artifact_tools.py +252 -0
- aria_code/tools/broker_tools.py +92 -0
- aria_code/tools/build_quant_engine.py +97 -0
- aria_code/tools/code_audit_tools.py +192 -0
- aria_code/tools/computer_use_tools.py +509 -0
- aria_code/tools/data_analysis_tools.py +831 -0
- aria_code/tools/enterprise_finance_tools.py +202 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +880 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3488 -0
- aria_code/tools/logistics_carriers.py +11 -0
- aria_code/tools/logistics_inventory.py +11 -0
- aria_code/tools/logistics_io.py +11 -0
- aria_code/tools/logistics_tenancy.py +11 -0
- aria_code/tools/logistics_tools.py +11 -0
- aria_code/tools/macro_tools.py +412 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +662 -0
- aria_code/tools/spreadsheet_tools.py +399 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/tools/video_tools.py +500 -0
- aria_code/training/__init__.py +1 -0
- aria_code/training/compare.py +117 -0
- aria_code/training/prelude_commands.py +111 -0
- aria_code/training/prelude_eval.py +390 -0
- aria_code/training/prelude_real.py +183 -0
- aria_code/training/prelude_train.py +248 -0
- aria_code/training/sft_dataset.py +230 -0
- aria_code/training/trajectory_dataset.py +263 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +404 -0
- aria_code/ui/completer.py +571 -0
- aria_code/ui/console.py +285 -0
- aria_code/ui/input_box.py +505 -0
- aria_code/ui/mentions.py +206 -0
- aria_code/ui/picker.py +248 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/actions.py +297 -0
- aria_code/ui/render/finance.py +1732 -0
- aria_code/ui/render/market.py +253 -0
- aria_code/ui/render/output.py +954 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +367 -0
- aria_code/ui/robot.py +239 -0
- aria_code/ui/startup_dashboard.py +110 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +518 -0
- aria_code/video_workflow/__init__.py +8 -0
- aria_code/video_workflow/__main__.py +61 -0
- aria_code/video_workflow/engines/__init__.py +18 -0
- aria_code/video_workflow/engines/base.py +69 -0
- aria_code/video_workflow/engines/custom_model.py +204 -0
- aria_code/video_workflow/engines/google_veo.py +94 -0
- aria_code/video_workflow/engines/local_engine.py +71 -0
- aria_code/video_workflow/engines/registry.py +98 -0
- aria_code/video_workflow/google_models.py +278 -0
- aria_code/video_workflow/music/__init__.py +5 -0
- aria_code/video_workflow/music/foley_service.py +132 -0
- aria_code/video_workflow/music/service.py +212 -0
- aria_code/video_workflow/pipeline.py +620 -0
- aria_code/video_workflow/plan.py +202 -0
- aria_code/video_workflow/session.py +297 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +219 -0
- aria_code/workspace/verify.py +167 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.167.0.dist-info/METADATA +330 -0
- aria_code-0.167.0.dist-info/RECORD +601 -0
- aria_code-0.167.0.dist-info/WHEEL +5 -0
- aria_code-0.167.0.dist-info/entry_points.txt +5 -0
- aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.167.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Deep analysis orchestrator — ties P0–P3 into one layered pass.
|
|
2
|
+
|
|
3
|
+
team (parallel agents) ─▶ group by theme (P1a) ─▶ deepen gaps (P0)
|
|
4
|
+
─▶ quant fusion (P2) ─▶ vote ─▶ calibrate (P2) ─▶ critic (P1b)
|
|
5
|
+
─▶ synthesis ─▶ tiered result (P3)
|
|
6
|
+
|
|
7
|
+
``analyze()`` is the deterministic core (assembles a DeepAnalysisResult from given
|
|
8
|
+
agent results); it needs no LLM or network and is fully unit-tested. ``run()`` is
|
|
9
|
+
the async convenience that first runs the AgentTeam, then calls ``analyze()``.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import time
|
|
15
|
+
from typing import Callable, Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
from ..base import AgentResult
|
|
18
|
+
from .critic import critique, soften_signal
|
|
19
|
+
from .deepen import deepen
|
|
20
|
+
from .models import DeepAnalysisResult
|
|
21
|
+
from .quant_fusion import CalibrationStore, calibrate_confidence, gather_quant_evidence
|
|
22
|
+
from .themes import group_by_theme
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _vote_all(results: List[AgentResult]):
|
|
26
|
+
"""Confidence-weighted majority over every successful result."""
|
|
27
|
+
try:
|
|
28
|
+
from ..team import _vote_signal
|
|
29
|
+
return _vote_signal(results)
|
|
30
|
+
except Exception:
|
|
31
|
+
return "HOLD", 0.0
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _build_synthesis(themes, notes, team_synthesis, agree, quant) -> str:
|
|
35
|
+
parts: List[str] = []
|
|
36
|
+
if team_synthesis and team_synthesis.strip():
|
|
37
|
+
parts.append(team_synthesis.strip())
|
|
38
|
+
elif themes:
|
|
39
|
+
parts.append(";".join(t.summary for t in themes))
|
|
40
|
+
if notes:
|
|
41
|
+
parts.append("补充证据(深挖):" + ";".join(notes))
|
|
42
|
+
if quant and quant.available:
|
|
43
|
+
if agree == "disagree":
|
|
44
|
+
parts.append(f"⚠️ 量化信号为 {quant.verdict()},与定性方向相反,已下调置信度,建议人工复核。")
|
|
45
|
+
elif agree == "agree":
|
|
46
|
+
parts.append(f"量化信号({quant.verdict()})与定性方向一致,置信度已上调。")
|
|
47
|
+
return "\n\n".join(p for p in parts if p)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class DeepAnalysisPipeline:
|
|
51
|
+
def __init__(self, llm_provider=None, data_router=None,
|
|
52
|
+
store: Optional[CalibrationStore] = None, lang: str = "zh"):
|
|
53
|
+
self.llm = llm_provider
|
|
54
|
+
self.data = data_router
|
|
55
|
+
self.store = store if store is not None else CalibrationStore()
|
|
56
|
+
self.lang = lang
|
|
57
|
+
|
|
58
|
+
def analyze(
|
|
59
|
+
self,
|
|
60
|
+
symbol: str,
|
|
61
|
+
agent_results: List[AgentResult],
|
|
62
|
+
*,
|
|
63
|
+
team_synthesis: str = "",
|
|
64
|
+
quant_provider: Optional[Callable[[str], Dict[str, Dict]]] = None,
|
|
65
|
+
tool_runner: Optional[Callable[[str, Dict], Optional[Dict]]] = None,
|
|
66
|
+
deepen_result: Optional[tuple] = None,
|
|
67
|
+
) -> DeepAnalysisResult:
|
|
68
|
+
"""Deterministic assembly of the deep result (no LLM/network required).
|
|
69
|
+
|
|
70
|
+
``deepen_result`` lets ``run()`` inject the LLM-driven (agentic) deepening
|
|
71
|
+
output; when absent the deterministic gap planner runs instead.
|
|
72
|
+
"""
|
|
73
|
+
if not agent_results:
|
|
74
|
+
return DeepAnalysisResult(symbol=symbol, error="no_agent_results")
|
|
75
|
+
|
|
76
|
+
themes = group_by_theme(agent_results) # P1a
|
|
77
|
+
quant, qprov = gather_quant_evidence(symbol, quant_provider) # P2
|
|
78
|
+
if deepen_result is not None: # P0 (agentic, injected)
|
|
79
|
+
notes, dprov = deepen_result
|
|
80
|
+
else:
|
|
81
|
+
notes, dprov = deepen(symbol, themes, quant, tool_runner) # P0 (deterministic)
|
|
82
|
+
|
|
83
|
+
raw_signal, raw_conf = _vote_all(agent_results)
|
|
84
|
+
cal_conf, agree = calibrate_confidence(raw_conf, raw_signal, quant, self.store) # P2
|
|
85
|
+
|
|
86
|
+
kp_count = sum(len(t.key_points) for t in themes)
|
|
87
|
+
crit = critique(agent_results, raw_signal, cal_conf, quant, agree, # P1b
|
|
88
|
+
qprov + dprov, kp_count)
|
|
89
|
+
|
|
90
|
+
final_signal = raw_signal if crit.passed else soften_signal(raw_signal)
|
|
91
|
+
synthesis = _build_synthesis(themes, notes, team_synthesis, agree, quant)
|
|
92
|
+
|
|
93
|
+
return DeepAnalysisResult(
|
|
94
|
+
symbol=symbol,
|
|
95
|
+
final_signal=final_signal,
|
|
96
|
+
raw_confidence=raw_conf,
|
|
97
|
+
calibrated_confidence=cal_conf,
|
|
98
|
+
themes=themes,
|
|
99
|
+
quant=quant,
|
|
100
|
+
critique=crit,
|
|
101
|
+
provenance=qprov + dprov,
|
|
102
|
+
synthesis=synthesis,
|
|
103
|
+
agent_results=[r.to_dict() for r in agent_results],
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
async def run(
|
|
107
|
+
self,
|
|
108
|
+
symbol: str,
|
|
109
|
+
agents: Optional[List[str]] = None,
|
|
110
|
+
quant_provider: Optional[Callable] = None,
|
|
111
|
+
tool_runner: Optional[Callable] = None,
|
|
112
|
+
on_agent_done: Optional[Callable] = None,
|
|
113
|
+
) -> DeepAnalysisResult:
|
|
114
|
+
t0 = time.time()
|
|
115
|
+
from ..team import AgentTeam
|
|
116
|
+
team = AgentTeam(llm_provider=self.llm, data_router=self.data,
|
|
117
|
+
on_agent_done=on_agent_done, lang=self.lang)
|
|
118
|
+
tr = await team.run(symbol, agents=agents)
|
|
119
|
+
|
|
120
|
+
# P0 agentic deepening (LLM-driven tool loop) when an LLM is available.
|
|
121
|
+
deepen_result = None
|
|
122
|
+
if self.llm and tr.results:
|
|
123
|
+
try:
|
|
124
|
+
from .deepen import deepen_agentic
|
|
125
|
+
from .themes import group_by_theme as _grp
|
|
126
|
+
deepen_result = await deepen_agentic(
|
|
127
|
+
symbol, _grp(tr.results), None, self.llm, tool_runner)
|
|
128
|
+
except Exception:
|
|
129
|
+
deepen_result = None
|
|
130
|
+
|
|
131
|
+
res = self.analyze(symbol, tr.results, team_synthesis=tr.synthesis,
|
|
132
|
+
quant_provider=quant_provider, tool_runner=tool_runner,
|
|
133
|
+
deepen_result=deepen_result)
|
|
134
|
+
|
|
135
|
+
# P1b LLM self-check — augments the deterministic critic when an LLM is present.
|
|
136
|
+
if self.llm and res.critique is not None and res.synthesis:
|
|
137
|
+
try:
|
|
138
|
+
from .critic import llm_critique, soften_signal
|
|
139
|
+
theme_sum = ";".join(t.summary for t in res.themes)
|
|
140
|
+
extra = await llm_critique(symbol, res.synthesis, theme_sum, self.llm)
|
|
141
|
+
if extra:
|
|
142
|
+
had_high = bool(res.critique.high)
|
|
143
|
+
res.critique.issues.extend(extra)
|
|
144
|
+
new_high = any(i.severity == "high" for i in extra)
|
|
145
|
+
if new_high:
|
|
146
|
+
res.critique.passed = False
|
|
147
|
+
# soften once if the deterministic pass had cleared it
|
|
148
|
+
if not had_high:
|
|
149
|
+
res.final_signal = soften_signal(res.final_signal)
|
|
150
|
+
except Exception:
|
|
151
|
+
pass
|
|
152
|
+
|
|
153
|
+
res.elapsed_sec = round(time.time() - t0, 1)
|
|
154
|
+
if tr.error and not tr.results:
|
|
155
|
+
res.error = tr.error
|
|
156
|
+
return res
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
async def run_deep_analysis(symbol: str, llm_provider=None, data_router=None,
|
|
160
|
+
agents: Optional[List[str]] = None, lang: str = "zh",
|
|
161
|
+
**kw) -> DeepAnalysisResult:
|
|
162
|
+
"""Convenience: run the full team + deep pipeline for ``symbol``."""
|
|
163
|
+
pipe = DeepAnalysisPipeline(llm_provider=llm_provider, data_router=data_router, lang=lang)
|
|
164
|
+
return await pipe.run(symbol, agents=agents, **kw)
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""P2 — fuse quantitative ground truth and calibrate confidence.
|
|
2
|
+
|
|
3
|
+
The qualitative team votes a signal with a self-reported confidence. That number
|
|
4
|
+
is uncalibrated — an agent saying "80%" doesn't mean it's right 80% of the time.
|
|
5
|
+
This layer:
|
|
6
|
+
|
|
7
|
+
1. gathers quant signals (AI signal, risk metrics, backtest) as ground truth,
|
|
8
|
+
2. nudges confidence by whether quant *agrees* with the qualitative verdict,
|
|
9
|
+
3. scales by a *reliability* factor learned from realised outcomes (CalibrationStore),
|
|
10
|
+
|
|
11
|
+
so confidence drifts toward the historical hit-rate as outcomes accumulate.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
import os
|
|
18
|
+
import time
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Callable, Dict, Optional, Tuple
|
|
21
|
+
|
|
22
|
+
from .models import QuantEvidence, Provenance
|
|
23
|
+
|
|
24
|
+
_BULL = ("STRONG_BUY", "BUY")
|
|
25
|
+
_BEAR = ("STRONG_SELL", "SELL")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# ── gather quant evidence ─────────────────────────────────────────────────────
|
|
29
|
+
def _default_provider(symbol: str) -> Dict[str, Dict]:
|
|
30
|
+
"""Best-effort pull of quant signals from local_finance_tools (each optional)."""
|
|
31
|
+
out: Dict[str, Dict] = {}
|
|
32
|
+
try:
|
|
33
|
+
import local_finance_tools as lft
|
|
34
|
+
except Exception:
|
|
35
|
+
return out
|
|
36
|
+
for key, fn in (("ai", "_get_ai_signal"), ("risk", "_get_risk_metrics"),
|
|
37
|
+
("backtest", "_backtest_strategy"), ("factors", "_calculate_factors")):
|
|
38
|
+
f = getattr(lft, fn, None)
|
|
39
|
+
if not f:
|
|
40
|
+
continue
|
|
41
|
+
try:
|
|
42
|
+
res = f({"symbol": symbol})
|
|
43
|
+
if isinstance(res, dict) and res.get("success"):
|
|
44
|
+
out[key] = res
|
|
45
|
+
except Exception:
|
|
46
|
+
pass
|
|
47
|
+
return out
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _num(d: Dict, *keys) -> Optional[float]:
|
|
51
|
+
for k in keys:
|
|
52
|
+
v = d.get(k)
|
|
53
|
+
if isinstance(v, (int, float)):
|
|
54
|
+
return float(v)
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def gather_quant_evidence(
|
|
59
|
+
symbol: str,
|
|
60
|
+
provider: Optional[Callable[[str], Dict[str, Dict]]] = None,
|
|
61
|
+
) -> Tuple[QuantEvidence, list]:
|
|
62
|
+
"""Return (QuantEvidence, [Provenance]). Never raises."""
|
|
63
|
+
raw = {}
|
|
64
|
+
try:
|
|
65
|
+
raw = (provider or _default_provider)(symbol)
|
|
66
|
+
except Exception:
|
|
67
|
+
raw = {}
|
|
68
|
+
|
|
69
|
+
prov: list = []
|
|
70
|
+
ev = QuantEvidence()
|
|
71
|
+
if not raw:
|
|
72
|
+
ev.note = "no quant backend available"
|
|
73
|
+
return ev, prov
|
|
74
|
+
|
|
75
|
+
ai = raw.get("ai") or {}
|
|
76
|
+
if ai:
|
|
77
|
+
action = str(ai.get("action") or ai.get("signal") or "").upper()
|
|
78
|
+
ev.ai_signal = action or None
|
|
79
|
+
conf = _num(ai, "confidence") or 0.0
|
|
80
|
+
if action in _BULL:
|
|
81
|
+
ev.ai_score = conf
|
|
82
|
+
elif action in _BEAR:
|
|
83
|
+
ev.ai_score = -conf
|
|
84
|
+
else:
|
|
85
|
+
ev.ai_score = 0.0
|
|
86
|
+
prov.append(Provenance("ai_signal", str(ai.get("provider", "quant")), note=action))
|
|
87
|
+
|
|
88
|
+
risk = raw.get("risk") or {}
|
|
89
|
+
if risk:
|
|
90
|
+
ev.sharpe = _num(risk, "sharpe", "sharpe_ratio")
|
|
91
|
+
ev.max_drawdown = _num(risk, "max_drawdown", "max_dd")
|
|
92
|
+
prov.append(Provenance("risk_metrics", "local_finance", note="VaR/Sharpe"))
|
|
93
|
+
|
|
94
|
+
bt = raw.get("backtest") or {}
|
|
95
|
+
if bt:
|
|
96
|
+
ev.backtest_return = _num(bt, "total_return", "return", "cagr")
|
|
97
|
+
if ev.sharpe is None:
|
|
98
|
+
ev.sharpe = _num(bt, "sharpe", "sharpe_ratio")
|
|
99
|
+
if ev.max_drawdown is None:
|
|
100
|
+
ev.max_drawdown = _num(bt, "max_drawdown", "max_dd")
|
|
101
|
+
prov.append(Provenance("backtest", "local_finance", note=str(bt.get("strategy", ""))))
|
|
102
|
+
|
|
103
|
+
fac = raw.get("factors") or {}
|
|
104
|
+
if fac:
|
|
105
|
+
ev.ic = _num(fac, "ic", "information_coefficient")
|
|
106
|
+
ev.factors = {k: v for k, v in fac.items()
|
|
107
|
+
if k not in ("success", "symbol") and isinstance(v, (int, float))}
|
|
108
|
+
prov.append(Provenance("factors", "local_finance"))
|
|
109
|
+
|
|
110
|
+
ev.available = bool(ai or risk or bt or fac)
|
|
111
|
+
return ev, prov
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# ── confidence calibration ────────────────────────────────────────────────────
|
|
115
|
+
def _bucket(conf: float) -> str:
|
|
116
|
+
if conf < 0.4:
|
|
117
|
+
return "lo"
|
|
118
|
+
if conf < 0.7:
|
|
119
|
+
return "mid"
|
|
120
|
+
return "hi"
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _side(signal: str) -> str:
|
|
124
|
+
if signal in _BULL:
|
|
125
|
+
return "bull"
|
|
126
|
+
if signal in _BEAR:
|
|
127
|
+
return "bear"
|
|
128
|
+
return "neutral"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def agreement(agent_signal: str, quant_verdict: str) -> str:
|
|
132
|
+
a = _side(agent_signal)
|
|
133
|
+
q = {"BULLISH": "bull", "BEARISH": "bear", "NEUTRAL": "neutral"}.get(quant_verdict, "neutral")
|
|
134
|
+
if a == "neutral" or q == "neutral":
|
|
135
|
+
return "neutral"
|
|
136
|
+
return "agree" if a == q else "disagree"
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class CalibrationStore:
|
|
140
|
+
"""Tracks realised hit-rate per (signal-side, confidence-bucket) on disk.
|
|
141
|
+
|
|
142
|
+
``reliability(conf, signal)`` returns observed_hit_rate / nominal_confidence,
|
|
143
|
+
clamped to a sane band, so a chronically over-confident bucket gets damped and
|
|
144
|
+
an under-confident one gets a small boost. With no history it returns 1.0.
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
_NOMINAL = {"lo": 0.30, "mid": 0.55, "hi": 0.80}
|
|
148
|
+
|
|
149
|
+
def __init__(self, path: Optional[Path] = None):
|
|
150
|
+
self.path = Path(path or os.path.expanduser("~/.arthera/deep_calibration.json"))
|
|
151
|
+
self._data: Dict[str, Dict[str, int]] = {}
|
|
152
|
+
try:
|
|
153
|
+
if self.path.exists():
|
|
154
|
+
self._data = json.loads(self.path.read_text())
|
|
155
|
+
except Exception:
|
|
156
|
+
self._data = {}
|
|
157
|
+
|
|
158
|
+
def _key(self, side: str, bucket: str) -> str:
|
|
159
|
+
return f"{side}:{bucket}"
|
|
160
|
+
|
|
161
|
+
def reliability(self, conf: float, signal: str = "") -> float:
|
|
162
|
+
rec = self._data.get(self._key(_side(signal), _bucket(conf)))
|
|
163
|
+
if not rec or rec.get("n", 0) < 8:
|
|
164
|
+
return 1.0
|
|
165
|
+
hit = rec["hit"] / rec["n"]
|
|
166
|
+
nominal = self._NOMINAL[_bucket(conf)] or 1.0
|
|
167
|
+
return max(0.6, min(1.25, hit / nominal))
|
|
168
|
+
|
|
169
|
+
def record_outcome(self, signal: str, conf: float, correct: bool) -> None:
|
|
170
|
+
k = self._key(_side(signal), _bucket(conf))
|
|
171
|
+
rec = self._data.setdefault(k, {"n": 0, "hit": 0})
|
|
172
|
+
rec["n"] += 1
|
|
173
|
+
rec["hit"] += 1 if correct else 0
|
|
174
|
+
try:
|
|
175
|
+
self.path.parent.mkdir(parents=True, exist_ok=True)
|
|
176
|
+
self.path.write_text(json.dumps(self._data, indent=2))
|
|
177
|
+
except Exception:
|
|
178
|
+
pass
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def calibrate_confidence(
|
|
182
|
+
raw_conf: float,
|
|
183
|
+
agent_signal: str,
|
|
184
|
+
quant: QuantEvidence,
|
|
185
|
+
store: Optional[CalibrationStore] = None,
|
|
186
|
+
) -> Tuple[float, str]:
|
|
187
|
+
"""Return (calibrated_confidence, agreement_label)."""
|
|
188
|
+
agree = agreement(agent_signal, quant.verdict()) if quant and quant.available else "neutral"
|
|
189
|
+
factor = {"agree": 1.15, "neutral": 1.0, "disagree": 0.70}[agree]
|
|
190
|
+
rel = store.reliability(raw_conf, agent_signal) if store else 1.0
|
|
191
|
+
cal = max(0.0, min(1.0, raw_conf * factor * rel))
|
|
192
|
+
return cal, agree
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""P1a — group agent results by theme and build a per-theme sub-synthesis.
|
|
2
|
+
|
|
3
|
+
Flat synthesis ("here are 8 opinions, here's the average") loses structure. Real
|
|
4
|
+
research clusters evidence: what does *valuation* say, what does *momentum* say,
|
|
5
|
+
what does *risk* say — then reconciles across clusters. This module does the
|
|
6
|
+
clustering and a deterministic per-cluster roll-up (no LLM needed).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Dict, List, Tuple
|
|
12
|
+
|
|
13
|
+
from ..base import AgentResult
|
|
14
|
+
from .models import ThemeGroup
|
|
15
|
+
|
|
16
|
+
# Which theme each agent belongs to. Unknown agents fall into "other".
|
|
17
|
+
_AGENT_THEME = {
|
|
18
|
+
"fundamental": "valuation",
|
|
19
|
+
"earnings": "valuation",
|
|
20
|
+
"technical": "momentum",
|
|
21
|
+
"risk": "risk",
|
|
22
|
+
"news": "catalysts",
|
|
23
|
+
"catalyst": "catalysts",
|
|
24
|
+
"macro": "macro",
|
|
25
|
+
"sector": "macro",
|
|
26
|
+
"northbound": "macro",
|
|
27
|
+
"debate": "reconciliation",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Display order + human labels.
|
|
31
|
+
_THEME_ORDER = ["valuation", "momentum", "macro", "catalysts", "risk",
|
|
32
|
+
"reconciliation", "other"]
|
|
33
|
+
_THEME_LABEL = {
|
|
34
|
+
"valuation": "估值/基本面",
|
|
35
|
+
"momentum": "动量/技术",
|
|
36
|
+
"macro": "宏观/板块",
|
|
37
|
+
"catalysts": "催化/消息",
|
|
38
|
+
"risk": "风险",
|
|
39
|
+
"reconciliation": "分歧调解",
|
|
40
|
+
"other": "其他",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
_SCORE = {"STRONG_BUY": 2, "BUY": 1, "HOLD": 0, "SELL": -1, "STRONG_SELL": -2}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def theme_of(agent_name: str) -> str:
|
|
47
|
+
return _AGENT_THEME.get(agent_name, "other")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _vote(results: List[AgentResult]) -> Tuple[str, float]:
|
|
51
|
+
"""Confidence-weighted majority within a single theme."""
|
|
52
|
+
valid = [r for r in results if r.success and r.signal in _SCORE]
|
|
53
|
+
if not valid:
|
|
54
|
+
return "HOLD", 0.0
|
|
55
|
+
avg_score = sum(_SCORE[r.signal] * r.confidence for r in valid) / len(valid)
|
|
56
|
+
avg_conf = sum(r.confidence for r in valid) / len(valid)
|
|
57
|
+
if avg_score >= 1.5:
|
|
58
|
+
return "STRONG_BUY", avg_conf
|
|
59
|
+
if avg_score >= 0.5:
|
|
60
|
+
return "BUY", avg_conf
|
|
61
|
+
if avg_score <= -1.5:
|
|
62
|
+
return "STRONG_SELL", avg_conf
|
|
63
|
+
if avg_score <= -0.5:
|
|
64
|
+
return "SELL", avg_conf
|
|
65
|
+
return "HOLD", avg_conf
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def group_by_theme(results: List[AgentResult]) -> List[ThemeGroup]:
|
|
69
|
+
"""Cluster agent results into themes with a per-theme signal + summary."""
|
|
70
|
+
buckets: Dict[str, List[AgentResult]] = {}
|
|
71
|
+
for r in results:
|
|
72
|
+
buckets.setdefault(theme_of(r.agent), []).append(r)
|
|
73
|
+
|
|
74
|
+
groups: List[ThemeGroup] = []
|
|
75
|
+
for theme in _THEME_ORDER:
|
|
76
|
+
members = buckets.get(theme)
|
|
77
|
+
if not members:
|
|
78
|
+
continue
|
|
79
|
+
signal, conf = _vote(members)
|
|
80
|
+
points: List[str] = []
|
|
81
|
+
for r in members:
|
|
82
|
+
if r.success:
|
|
83
|
+
points.extend((r.key_points or [])[:2])
|
|
84
|
+
ok = sum(1 for r in members if r.success)
|
|
85
|
+
summary = (f"{_THEME_LABEL[theme]}: {signal}({ok}/{len(members)} agent 有效,"
|
|
86
|
+
f"置信度 {conf:.0%})")
|
|
87
|
+
groups.append(ThemeGroup(
|
|
88
|
+
theme=_THEME_LABEL[theme],
|
|
89
|
+
agents=[r.agent for r in members],
|
|
90
|
+
signal=signal,
|
|
91
|
+
confidence=conf,
|
|
92
|
+
summary=summary,
|
|
93
|
+
key_points=points[:5],
|
|
94
|
+
))
|
|
95
|
+
return groups
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""P3 — render the deep result at three depths, with data provenance.
|
|
2
|
+
|
|
3
|
+
brief — one glance: signal, calibrated confidence, headline
|
|
4
|
+
standard — + per-theme roll-up + synthesis
|
|
5
|
+
deep — + quant evidence + critique + provenance (data lineage) + agent points
|
|
6
|
+
|
|
7
|
+
Pure text/markdown so it renders in the terminal; the HTML report layer can reuse
|
|
8
|
+
the same DeepAnalysisResult.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from .models import DeepAnalysisResult
|
|
14
|
+
|
|
15
|
+
_SIGNAL_ICON = {
|
|
16
|
+
"STRONG_BUY": "🟢🟢", "BUY": "🟢", "HOLD": "⚪",
|
|
17
|
+
"SELL": "🔴", "STRONG_SELL": "🔴🔴",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _headline(r: DeepAnalysisResult) -> str:
|
|
22
|
+
icon = _SIGNAL_ICON.get(r.final_signal, "⚪")
|
|
23
|
+
conf = f"{r.calibrated_confidence:.0%}"
|
|
24
|
+
note = ""
|
|
25
|
+
if r.raw_confidence and abs(r.calibrated_confidence - r.raw_confidence) >= 0.05:
|
|
26
|
+
note = f"(原始 {r.raw_confidence:.0%} → 校准 {conf})"
|
|
27
|
+
else:
|
|
28
|
+
note = f"(置信度 {conf})"
|
|
29
|
+
return f"{icon} **{r.symbol} · {r.final_signal}** {note}"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def render_brief(r: DeepAnalysisResult) -> str:
|
|
33
|
+
lines = [_headline(r)]
|
|
34
|
+
if r.quant and r.quant.available:
|
|
35
|
+
lines.append(f" 量化: {r.quant.verdict()}"
|
|
36
|
+
+ (f" · IC {r.quant.ic:.2f}" if r.quant.ic is not None else "")
|
|
37
|
+
+ (f" · Sharpe {r.quant.sharpe:.2f}" if r.quant.sharpe is not None else ""))
|
|
38
|
+
if r.critique and r.critique.high:
|
|
39
|
+
lines.append(f" ⚠️ {r.critique.high[0].message}")
|
|
40
|
+
return "\n".join(lines)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def render_standard(r: DeepAnalysisResult) -> str:
|
|
44
|
+
parts = [render_brief(r), ""]
|
|
45
|
+
if r.themes:
|
|
46
|
+
parts.append("### 分主题")
|
|
47
|
+
for t in r.themes:
|
|
48
|
+
parts.append(f"- {t.summary}")
|
|
49
|
+
parts.append("")
|
|
50
|
+
if r.synthesis:
|
|
51
|
+
parts.append("### 综合")
|
|
52
|
+
parts.append(r.synthesis)
|
|
53
|
+
return "\n".join(parts).rstrip()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def render_deep(r: DeepAnalysisResult) -> str:
|
|
57
|
+
parts = [render_standard(r), ""]
|
|
58
|
+
|
|
59
|
+
if r.quant and r.quant.available:
|
|
60
|
+
q = r.quant
|
|
61
|
+
parts.append("### 量化地面真值")
|
|
62
|
+
row = []
|
|
63
|
+
if q.ai_signal: row.append(f"AI信号 {q.ai_signal}")
|
|
64
|
+
if q.ai_score is not None:row.append(f"分值 {q.ai_score:+.2f}")
|
|
65
|
+
if q.ic is not None: row.append(f"IC {q.ic:.3f}")
|
|
66
|
+
if q.sharpe is not None: row.append(f"Sharpe {q.sharpe:.2f}")
|
|
67
|
+
if q.max_drawdown is not None: row.append(f"MaxDD {q.max_drawdown:.1%}")
|
|
68
|
+
if q.backtest_return is not None: row.append(f"回测收益 {q.backtest_return:+.1%}")
|
|
69
|
+
parts.append("- " + " · ".join(row) if row else "- (无)")
|
|
70
|
+
parts.append("")
|
|
71
|
+
|
|
72
|
+
if r.critique is not None:
|
|
73
|
+
parts.append("### 自检 (Critic)")
|
|
74
|
+
mark = "✅ 通过" if r.critique.passed else "❌ 存在高危问题"
|
|
75
|
+
parts.append(f"结论: {mark}" + ("(无问题)" if not r.critique.issues else ""))
|
|
76
|
+
for i in r.critique.issues:
|
|
77
|
+
sev = {"high": "🔴", "medium": "🟡", "low": "⚪"}.get(i.severity, "·")
|
|
78
|
+
parts.append(f"- {sev} [{i.kind}] {i.message}")
|
|
79
|
+
parts.append("")
|
|
80
|
+
|
|
81
|
+
if r.provenance:
|
|
82
|
+
parts.append("### 数据血缘")
|
|
83
|
+
parts.append("| 字段 | 来源 | 时效 | 备注 |")
|
|
84
|
+
parts.append("|------|------|------|------|")
|
|
85
|
+
for p in r.provenance:
|
|
86
|
+
parts.append(f"| {p.field} | {p.source} | {p.freshness} | {p.note} |")
|
|
87
|
+
parts.append("")
|
|
88
|
+
|
|
89
|
+
if r.agent_results:
|
|
90
|
+
parts.append("### 各 Agent 要点")
|
|
91
|
+
for a in r.agent_results:
|
|
92
|
+
if a.get("error"):
|
|
93
|
+
parts.append(f"- **{a['agent']}** ⚠️ {a['error']}")
|
|
94
|
+
continue
|
|
95
|
+
pts = a.get("key_points") or []
|
|
96
|
+
head = f"- **{a['agent']}** ({a.get('signal','?')}, {a.get('confidence',0):.0%})"
|
|
97
|
+
parts.append(head)
|
|
98
|
+
for pt in pts[:3]:
|
|
99
|
+
parts.append(f" • {pt}")
|
|
100
|
+
|
|
101
|
+
return "\n".join(parts).rstrip()
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def render_tier(r: DeepAnalysisResult, tier: str = "standard") -> str:
|
|
105
|
+
return {"brief": render_brief, "standard": render_standard,
|
|
106
|
+
"deep": render_deep}.get(tier, render_standard)(r)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
agents/engineering/__init__.py — Engineering & Code Execution Agents
|
|
3
|
+
===================================================================
|
|
4
|
+
Provides Coder, Tester, and Self-Healing Debugger agents for Aria Code.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .coder import CoderAgent
|
|
8
|
+
from .tester import TesterAgent, TesterSelfHealingAgent
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"CoderAgent",
|
|
12
|
+
"TesterAgent",
|
|
13
|
+
"TesterSelfHealingAgent",
|
|
14
|
+
]
|