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.
- aria_code/__init__.py +42 -0
- aria_code/_version.py +20 -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 +34 -0
- aria_code/agents/base.py +318 -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 +303 -0
- aria_code/agents/financial/fundamental.py +191 -0
- aria_code/agents/financial/macro.py +99 -0
- aria_code/agents/financial/news.py +207 -0
- aria_code/agents/financial/risk.py +165 -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 +258 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +363 -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 +158 -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 +492 -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/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 +15 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +95 -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/bootstrap.py +145 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +16 -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 +369 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +239 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2543 -0
- aria_code/apps/cli/commands/broker_cmds.py +1234 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +319 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +87 -0
- aria_code/apps/cli/commands/core_cmds.py +2520 -0
- aria_code/apps/cli/commands/data_cmds.py +457 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +230 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -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 +434 -0
- aria_code/apps/cli/commands/market_cmds.py +1381 -0
- aria_code/apps/cli/commands/market_context.py +425 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2153 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +179 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1278 -0
- aria_code/apps/cli/commands/report.py +437 -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 +669 -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 +79 -0
- aria_code/apps/cli/commands/workflow_cmds.py +480 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1494 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +78 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/deterministic.py +191 -0
- aria_code/apps/cli/direct.py +48 -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 +196 -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 +1309 -0
- aria_code/apps/cli/handlers/market_handlers.py +2513 -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/helpers.py +302 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +297 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +276 -0
- aria_code/apps/cli/intent_signals.py +344 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +536 -0
- aria_code/apps/cli/main.py +29 -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/model_catalog.py +620 -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 +59 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +53 -0
- aria_code/apps/cli/prompts/select.py +142 -0
- aria_code/apps/cli/prompts/system_prompts.py +552 -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 +521 -0
- aria_code/apps/cli/providers/chat_routing.py +128 -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 +1594 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +257 -0
- aria_code/apps/cli/providers/runtime_bridge.py +353 -0
- aria_code/apps/cli/providers/vertexai_stream.py +316 -0
- aria_code/apps/cli/runtime_consumer.py +657 -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_store.py +112 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +823 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +106 -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 +180 -0
- aria_code/apps/cli/tools/market_tools.py +620 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +726 -0
- aria_code/apps/cli/tools/write_tools.py +845 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +153 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1597 -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 +6743 -0
- aria_code/aria_daemon.py +1398 -0
- aria_code/aria_feishu_bot.py +1423 -0
- aria_code/aria_mcp_server.py +7 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_relay_server.py +490 -0
- aria_code/aria_telegram_bot.py +202 -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 +182 -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 +1976 -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 +181 -0
- aria_code/command_safety.py +19 -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/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/demo_player.py +207 -0
- aria_code/doctor.py +813 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/backtest_engine.py +354 -0
- aria_code/domain/backtest_report.py +472 -0
- aria_code/domain/finance_formulas.py +389 -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/harness.py +598 -0
- aria_code/evals/runner.py +238 -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 +386 -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 +639 -0
- aria_code/memory_manager.py +246 -0
- aria_code/model_capability.py +486 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +23 -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 +52 -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 +201 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +111 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1550 -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 +396 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +79 -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 +268 -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 +57 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +157 -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 +8 -0
- aria_code/packages/aria_tools/financial/_paths.py +130 -0
- aria_code/packages/aria_tools/financial/compliance.py +31 -0
- aria_code/packages/aria_tools/financial/factors.py +33 -0
- aria_code/packages/aria_tools/financial/risk_tools.py +33 -0
- aria_code/packages/aria_tools/financial/strategy.py +31 -0
- aria_code/packages/aria_tools/registry.py +128 -0
- aria_code/packages/quant_engine/__init__.py +34 -0
- aria_code/packages/quant_engine/_namespace.py +62 -0
- aria_code/packages/quant_engine/backtest/__init__.py +14 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +96 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +13 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +80 -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/ml_model.py +377 -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 +35 -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/logistics/__init__.py +169 -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/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -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 +129 -0
- aria_code/providers/llm/openai_compat.py +313 -0
- aria_code/providers/llm/registry.py +444 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +589 -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/runtime/__init__.py +169 -0
- aria_code/runtime/acceptance.py +481 -0
- aria_code/runtime/agent_loop.py +1520 -0
- aria_code/runtime/approval.py +57 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +432 -0
- aria_code/runtime/crash_report.py +174 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +150 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/repo_map.py +700 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +450 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/subagent.py +547 -0
- aria_code/runtime/task_ledger.py +86 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/tool_executor.py +217 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +23 -0
- aria_code/safety/permissions.py +306 -0
- aria_code/safety/service.py +102 -0
- aria_code/setup_wizard.py +673 -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 +504 -0
- aria_code/tools/data_analysis_tools.py +809 -0
- aria_code/tools/enterprise_finance_tools.py +156 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +885 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3417 -0
- aria_code/tools/logistics_tools.py +135 -0
- aria_code/tools/macro_tools.py +369 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +659 -0
- aria_code/tools/spreadsheet_tools.py +388 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +508 -0
- aria_code/ui/completer.py +501 -0
- aria_code/ui/console.py +281 -0
- aria_code/ui/image_render.py +243 -0
- aria_code/ui/input_box.py +488 -0
- aria_code/ui/picker.py +201 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/finance.py +1705 -0
- aria_code/ui/render/market.py +225 -0
- aria_code/ui/render/output.py +775 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +354 -0
- aria_code/ui/robot.py +235 -0
- aria_code/ui/startup_dashboard.py +109 -0
- aria_code/utils/vscode_uri.py +37 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +271 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +193 -0
- aria_code/workspace/verify.py +113 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_context.py +233 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.52.0.dist-info/METADATA +237 -0
- aria_code-0.52.0.dist-info/RECORD +478 -0
- aria_code-0.52.0.dist-info/WHEEL +5 -0
- aria_code-0.52.0.dist-info/entry_points.txt +3 -0
- aria_code-0.52.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.52.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.52.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
"""
|
|
2
|
+
model_capability.py — Aria Code model capability registry & tool-call adapter.
|
|
3
|
+
|
|
4
|
+
Responsibilities:
|
|
5
|
+
- Know which local models support native tool calling vs text-based <tool_call>
|
|
6
|
+
- Normalise tool call output across Ollama-native / XML-tag / JSON-fenced formats
|
|
7
|
+
- Inject the correct tool schema format into the Ollama payload
|
|
8
|
+
- Detect capability dynamically when a model is not in the registry
|
|
9
|
+
|
|
10
|
+
Usage::
|
|
11
|
+
|
|
12
|
+
from aria_code.model_capability import get_model_capability, build_ollama_tool_payload
|
|
13
|
+
|
|
14
|
+
caps = get_model_capability("qwen2.5-coder:7b")
|
|
15
|
+
# {"tool_calls": True, "format": "ollama_native", "context_window": 32768, ...}
|
|
16
|
+
|
|
17
|
+
calls = parse_tool_calls_from_response(full_text, native_tool_calls)
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import json
|
|
23
|
+
import re
|
|
24
|
+
from dataclasses import dataclass, field
|
|
25
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# Capability catalogue
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
@dataclass
|
|
32
|
+
class ModelCapability:
|
|
33
|
+
# Whether the model reliably produces structured tool calls
|
|
34
|
+
tool_calls: bool = False
|
|
35
|
+
# "ollama_native" → Ollama's message.tool_calls list
|
|
36
|
+
# "xml_tags" → <tool_call>{"name":…,"arguments":{…}}</tool_call>
|
|
37
|
+
# "json_fence" → ```json\n{"tool":…,"arguments":{…}}\n```
|
|
38
|
+
# "anthropic_native" → tool calling via the Anthropic SDK
|
|
39
|
+
# "openai_native" → tool calling via an OpenAI-compatible / Vertex endpoint
|
|
40
|
+
# (OpenAI, Gemini, Grok) — structured `tool_calls` in the
|
|
41
|
+
# response, not parsed out of the text stream
|
|
42
|
+
# "text_only" → no tool calling; prompt must ask for plain-text answers
|
|
43
|
+
# "router_only" → model is only suitable for intent classification / routing;
|
|
44
|
+
# MUST NOT handle coding, analysis, or multi-step tasks
|
|
45
|
+
format: str = "text_only"
|
|
46
|
+
context_window: int = 8192
|
|
47
|
+
thinking: bool = False # extended-reasoning / <think> tokens
|
|
48
|
+
vision: bool = False # supports image / multimodal input
|
|
49
|
+
finance_tuned: bool = False # model has finance-domain fine-tuning
|
|
50
|
+
# Recommended sampling params
|
|
51
|
+
temperature: float = 0.3
|
|
52
|
+
top_p: float = 0.9
|
|
53
|
+
# Maximum simultaneous tool calls per round (safety limit)
|
|
54
|
+
max_parallel_tools: int = 1
|
|
55
|
+
# Minimum model size class: "nano" <1B / "small" 1-4B / "medium" 4-14B / "large" >14B
|
|
56
|
+
size_class: str = "medium"
|
|
57
|
+
# Extra notes shown in /models list
|
|
58
|
+
notes: str = ""
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def is_router_only(cap: "ModelCapability") -> bool:
|
|
62
|
+
"""Return True if this model must NOT handle complex tasks (coding/analysis)."""
|
|
63
|
+
return cap.format == "router_only"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def can_handle_coding(cap: "ModelCapability") -> bool:
|
|
67
|
+
"""Return True if the model is large/capable enough for code generation tasks."""
|
|
68
|
+
return (
|
|
69
|
+
cap.format in ("ollama_native", "xml_tags", "anthropic_native", "openai_native")
|
|
70
|
+
and cap.context_window >= 8192
|
|
71
|
+
and cap.size_class not in ("nano",)
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def can_handle_analysis(cap: "ModelCapability") -> bool:
|
|
76
|
+
"""Return True if the model can handle multi-step financial analysis."""
|
|
77
|
+
return (
|
|
78
|
+
cap.format not in ("router_only",)
|
|
79
|
+
and cap.context_window >= 4096
|
|
80
|
+
and cap.size_class not in ("nano",)
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# Prefix → capability mapping. Longest prefix wins.
|
|
85
|
+
_CAPABILITY_TABLE: Dict[str, ModelCapability] = {
|
|
86
|
+
# ── Qwen family ────────────────────────────────────────────────────────
|
|
87
|
+
"qwen2.5-coder:32b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, size_class="large", notes="Best local code+finance model"),
|
|
88
|
+
"qwen2.5-coder:14b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, size_class="large"),
|
|
89
|
+
"qwen2.5-coder:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, size_class="medium"),
|
|
90
|
+
"qwen2.5-coder:3b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, size_class="small"),
|
|
91
|
+
# 1.5B — too small for reliable tool calls; use text_only to prevent JSON hallucination
|
|
92
|
+
"qwen2.5-coder:1.5b": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.4, size_class="small", notes="1.5B — no tools; simple Q&A only"),
|
|
93
|
+
# 0.5B — nano class; only suitable for routing/classification, never complex tasks
|
|
94
|
+
"qwen2.5-coder:0.5b": ModelCapability(tool_calls=False, format="router_only", context_window=4096, temperature=0.5, size_class="nano", notes="0.5B nano — routing/intent only"),
|
|
95
|
+
"qwen2.5-coder": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.2, size_class="medium"),
|
|
96
|
+
"qwen2.5:72b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, notes="Strongest Qwen general model"),
|
|
97
|
+
"qwen2.5:32b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2),
|
|
98
|
+
"qwen2.5:14b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2),
|
|
99
|
+
"qwen2.5:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
100
|
+
"qwen2.5": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
|
|
101
|
+
"qwen3": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True),
|
|
102
|
+
"qwq": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True, notes="Math/reasoning focused"),
|
|
103
|
+
# ── DeepSeek family ────────────────────────────────────────────────────
|
|
104
|
+
"deepseek-r1:671b": ModelCapability(tool_calls=False, format="xml_tags", context_window=131072, temperature=0.3, thinking=True, notes="State-of-the-art reasoning"),
|
|
105
|
+
"deepseek-r1:70b": ModelCapability(tool_calls=False, format="xml_tags", context_window=131072, temperature=0.3, thinking=True),
|
|
106
|
+
"deepseek-r1:32b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
|
|
107
|
+
"deepseek-r1:14b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
|
|
108
|
+
"deepseek-r1:8b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
|
|
109
|
+
"deepseek-r1:7b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
|
|
110
|
+
"deepseek-r1": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
|
|
111
|
+
"deepseek-v3.1": ModelCapability(tool_calls=True, format="ollama_native", context_window=163840, temperature=0.3, thinking=True, notes="DeepSeek V3.1 671B"),
|
|
112
|
+
"deepseek-v3": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
113
|
+
"deepseek-v2.5": ModelCapability(tool_calls=True, format="ollama_native", context_window=65536, temperature=0.3),
|
|
114
|
+
"deepseek-coder-v2": ModelCapability(tool_calls=True, format="ollama_native", context_window=65536, temperature=0.2),
|
|
115
|
+
# ── LLaMA family ───────────────────────────────────────────────────────
|
|
116
|
+
"llama3.3:70b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, notes="Meta flagship 2024"),
|
|
117
|
+
"llama3.2:90b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Multimodal, image+text"),
|
|
118
|
+
"llama3.2:11b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Multimodal, image+text"),
|
|
119
|
+
"llama3.2:3b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
120
|
+
"llama3.2": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
121
|
+
"llama3.1:405b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
122
|
+
"llama3.1:70b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
123
|
+
"llama3.1:8b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
124
|
+
"llama3.1": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
125
|
+
"llama3": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3),
|
|
126
|
+
# ── Mistral family ─────────────────────────────────────────────────────
|
|
127
|
+
"mistral-nemo": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
128
|
+
"mistral-large": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
|
|
129
|
+
"mistral-small": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
|
|
130
|
+
"mistral:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
|
|
131
|
+
"mistral": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
|
|
132
|
+
"mixtral": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
|
|
133
|
+
# ── Phi family ─────────────────────────────────────────────────────────
|
|
134
|
+
"phi4:14b": ModelCapability(tool_calls=True, format="ollama_native", context_window=16384, temperature=0.3, notes="Microsoft Phi4, compact+capable"),
|
|
135
|
+
"phi4": ModelCapability(tool_calls=True, format="ollama_native", context_window=16384, temperature=0.3),
|
|
136
|
+
"phi3.5": ModelCapability(tool_calls=True, format="ollama_native", context_window=16384, temperature=0.3),
|
|
137
|
+
"phi3": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3),
|
|
138
|
+
# ── Google Gemma ───────────────────────────────────────────────────────
|
|
139
|
+
"gemma3:27b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
|
|
140
|
+
"gemma3:12b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
|
|
141
|
+
"gemma3:4b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
|
|
142
|
+
"gemma3": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
|
|
143
|
+
"gemma2": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3),
|
|
144
|
+
# ── Vision / multimodal models ─────────────────────────────────────────────
|
|
145
|
+
"llava:34b": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True, notes="LLaVA 34B vision-language"),
|
|
146
|
+
"llava:13b": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
|
|
147
|
+
"llava:7b": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
|
|
148
|
+
"llava": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
|
|
149
|
+
"bakllava": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
|
|
150
|
+
"moondream": ModelCapability(tool_calls=False, format="text_only", context_window=2048, temperature=0.3, vision=True, size_class="small", notes="Tiny vision model"),
|
|
151
|
+
"minicpm-v": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3, vision=True, size_class="small"),
|
|
152
|
+
"qwen2-vl:72b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Qwen2-VL 72B multimodal"),
|
|
153
|
+
"qwen2-vl:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
|
|
154
|
+
"qwen2-vl": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
|
|
155
|
+
"qwen2.5vl:72b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Qwen2.5-VL 72B"),
|
|
156
|
+
"qwen2.5vl:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
|
|
157
|
+
"qwen2.5vl": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
|
|
158
|
+
# ── Finance-specific ───────────────────────────────────────────────────
|
|
159
|
+
"finma": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, finance_tuned=True),
|
|
160
|
+
"fingpt": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, finance_tuned=True),
|
|
161
|
+
"bloomberggpt": ModelCapability(tool_calls=False, format="text_only", context_window=2048, temperature=0.2, finance_tuned=True),
|
|
162
|
+
# ── Aria own models ────────────────────────────────────────────────────
|
|
163
|
+
# aria-sonata-3b: primary local production model — 3B, good for finance Q&A + tool calls
|
|
164
|
+
"aria-sonata-3b": ModelCapability(tool_calls=False, format="xml_tags", context_window=16384, temperature=0.3, size_class="small", finance_tuned=True, notes="3B local production model"),
|
|
165
|
+
# aria-sonata 1.x/0.5B series — GGUF Ollama models; xml_tags for text-based tool parsing
|
|
166
|
+
"aria-sonata:4.5-thinking": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", thinking=True, finance_tuned=True),
|
|
167
|
+
"aria-sonata:4.5-verbose": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", finance_tuned=True),
|
|
168
|
+
"aria-sonata:4.6-thinking": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", thinking=True, finance_tuned=True),
|
|
169
|
+
"aria-sonata": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", finance_tuned=True),
|
|
170
|
+
# aria-prelude: nano router model — ONLY for intent classification and routing
|
|
171
|
+
"aria-prelude": ModelCapability(tool_calls=False, format="router_only", context_window=4096, temperature=0.2, size_class="nano", finance_tuned=True, notes="Nano router — intent classification only"),
|
|
172
|
+
# ── Anthropic Claude (cloud API via providers/llm/anthropic.py) ───────
|
|
173
|
+
# format="anthropic_native" → tool calling via Anthropic SDK, not Ollama
|
|
174
|
+
# All Claude 3+ models share 200K context and native vision support.
|
|
175
|
+
"claude-opus-4-8": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True, notes="Claude Opus 4.8 — most capable"),
|
|
176
|
+
"claude-opus-4": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True),
|
|
177
|
+
"claude-sonnet-4-6": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
|
|
178
|
+
"claude-sonnet-4": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
|
|
179
|
+
"claude-haiku-4-5": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True, notes="Claude Haiku 4.5 — fast/cheap"),
|
|
180
|
+
"claude-haiku-4": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True),
|
|
181
|
+
# Claude 3.x legacy — still widely used
|
|
182
|
+
"claude-3-7-sonnet": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True),
|
|
183
|
+
"claude-3-5-sonnet": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
|
|
184
|
+
"claude-3-5-haiku": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True),
|
|
185
|
+
"claude-3-opus": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True),
|
|
186
|
+
"claude-3-sonnet": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
|
|
187
|
+
"claude-3-haiku": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True),
|
|
188
|
+
# Generic prefix catch-all for future Claude versions (longest-prefix matching ensures
|
|
189
|
+
# specific entries above still win over this fallback)
|
|
190
|
+
"claude": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
|
|
191
|
+
# ── Arthera cloud-routed models (large, run via cloud API) ────────────
|
|
192
|
+
"gpt-oss:120b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True, notes="GPT-OSS 120B via Ollama Cloud"),
|
|
193
|
+
"gpt-oss": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True, notes="GPT-OSS via Ollama Cloud"),
|
|
194
|
+
"deepseek-v3.1:671b-cloud": ModelCapability(tool_calls=True, format="ollama_native", context_window=163840, temperature=0.3, thinking=True, notes="DeepSeek V3.1 671B via Ollama Cloud"),
|
|
195
|
+
# ── Google Gemini (cloud, via apps/cli/providers/vertexai_stream.py) ──
|
|
196
|
+
# Registered here as well as in the MODELS catalogue: callers such as the
|
|
197
|
+
# tool-routing check in aria_cli use get_model_capability() directly, and a
|
|
198
|
+
# missing entry silently degrades the model to text_only / 4K context.
|
|
199
|
+
"gemini-2.5-pro": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="large", vision=True, thinking=True, notes="Gemini 2.5 Pro — 1M context"),
|
|
200
|
+
"gemini-2.5-flash": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="medium", vision=True, notes="Gemini 2.5 Flash — 1M context"),
|
|
201
|
+
"gemini-2.0-flash": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="medium", vision=True),
|
|
202
|
+
"gemini-1.5-pro": ModelCapability(tool_calls=True, format="openai_native", context_window=2097152, temperature=0.2, size_class="large", vision=True),
|
|
203
|
+
"gemini-1.5-flash": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="medium", vision=True),
|
|
204
|
+
"gemini": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="large", vision=True),
|
|
205
|
+
# ── OpenAI (cloud, via providers/llm/openai_compat.py) ────────────────
|
|
206
|
+
"gpt-5": ModelCapability(tool_calls=True, format="openai_native", context_window=400000, temperature=0.2, size_class="large", vision=True, thinking=True),
|
|
207
|
+
"gpt-4.1": ModelCapability(tool_calls=True, format="openai_native", context_window=1047576, temperature=0.2, size_class="large", vision=True),
|
|
208
|
+
"gpt-4o-mini": ModelCapability(tool_calls=True, format="openai_native", context_window=128000, temperature=0.2, size_class="medium", vision=True),
|
|
209
|
+
"gpt-4o": ModelCapability(tool_calls=True, format="openai_native", context_window=128000, temperature=0.2, size_class="large", vision=True),
|
|
210
|
+
"gpt-4-turbo": ModelCapability(tool_calls=True, format="openai_native", context_window=128000, temperature=0.2, size_class="large", vision=True),
|
|
211
|
+
"gpt-4": ModelCapability(tool_calls=True, format="openai_native", context_window=8192, temperature=0.2, size_class="large"),
|
|
212
|
+
"o4-mini": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="medium", thinking=True),
|
|
213
|
+
"o3-mini": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="medium", thinking=True),
|
|
214
|
+
"o3": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="large", thinking=True),
|
|
215
|
+
"o1": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="large", thinking=True),
|
|
216
|
+
# ── xAI Grok (cloud, OpenAI-compatible endpoint) ──────────────────────
|
|
217
|
+
"grok-4": ModelCapability(tool_calls=True, format="openai_native", context_window=256000, temperature=0.3, size_class="large", vision=True),
|
|
218
|
+
"grok": ModelCapability(tool_calls=True, format="openai_native", context_window=131072, temperature=0.3, size_class="large"),
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
# Provider-qualified ids ("google/gemini-2.5-pro", "openai/gpt-4o") are stripped
|
|
222
|
+
# down to the bare model name before prefix matching. The CLI stores the fully
|
|
223
|
+
# qualified id in its config, so without this every cloud model looked unknown.
|
|
224
|
+
_VENDOR_PREFIXES = (
|
|
225
|
+
"google/", "openai/", "anthropic/", "x-ai/", "xai/", "meta-llama/",
|
|
226
|
+
"mistralai/", "deepseek/", "qwen/", "alibaba/", "vertex_ai/", "vertexai/",
|
|
227
|
+
"azure/", "bedrock/", "openrouter/", "together/", "groq/",
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Default fallback when model is unknown. Deliberately conservative: guessing
|
|
231
|
+
# tool support wrong breaks every turn. ``UNKNOWN_MODEL_NOTE`` lets callers
|
|
232
|
+
# detect this case and warn the user instead of degrading in silence.
|
|
233
|
+
UNKNOWN_MODEL_NOTE = "Unknown model — conservative settings applied"
|
|
234
|
+
|
|
235
|
+
_DEFAULT_CAPABILITY = ModelCapability(
|
|
236
|
+
tool_calls=False, format="text_only", context_window=4096, temperature=0.5,
|
|
237
|
+
notes=UNKNOWN_MODEL_NOTE,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def is_unknown_model(cap: "ModelCapability") -> bool:
|
|
242
|
+
"""Return True if *cap* is the unregistered-model fallback.
|
|
243
|
+
|
|
244
|
+
A model that is missing from the registry runs without tools and with a 4K
|
|
245
|
+
context budget. For a cloud model that is a severe, invisible downgrade —
|
|
246
|
+
it cannot read files and the context gauge is computed against the wrong
|
|
247
|
+
denominator — so callers should surface it rather than absorb it.
|
|
248
|
+
"""
|
|
249
|
+
return cap.notes == UNKNOWN_MODEL_NOTE
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def strip_vendor_prefix(model_name: str) -> str:
|
|
253
|
+
"""Strip a provider prefix ("google/gemini-2.5-pro" → "gemini-2.5-pro")."""
|
|
254
|
+
name = (model_name or "").strip().lower()
|
|
255
|
+
for prefix in _VENDOR_PREFIXES:
|
|
256
|
+
if name.startswith(prefix):
|
|
257
|
+
return name[len(prefix):]
|
|
258
|
+
return name
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def get_model_capability(model_name: str) -> ModelCapability:
|
|
262
|
+
"""
|
|
263
|
+
Return capability for *model_name* using longest-prefix matching.
|
|
264
|
+
|
|
265
|
+
Provider-qualified ids are normalised first, so the fully qualified id the
|
|
266
|
+
CLI stores in its config resolves to the same entry as the bare name.
|
|
267
|
+
|
|
268
|
+
Examples::
|
|
269
|
+
|
|
270
|
+
get_model_capability("qwen2.5-coder:7b-instruct-q4_K_M")
|
|
271
|
+
# → same as "qwen2.5-coder:7b" entry
|
|
272
|
+
|
|
273
|
+
get_model_capability("google/gemini-2.5-pro")
|
|
274
|
+
# → same as "gemini-2.5-pro" entry
|
|
275
|
+
"""
|
|
276
|
+
name = strip_vendor_prefix(model_name)
|
|
277
|
+
# Strip GGUF quantisation suffixes like :q4_k_m, :f16, etc.
|
|
278
|
+
clean = re.sub(r":[qfQ][0-9].*$", "", name)
|
|
279
|
+
# Also strip common instruct/chat/gguf tags appended after the size
|
|
280
|
+
clean = re.sub(r"-(instruct|chat|gguf|base|it)$", "", clean)
|
|
281
|
+
# Cloud ids carry a dated or "-latest" suffix ("gemini-2.5-pro-preview-06-05",
|
|
282
|
+
# "claude-3-5-sonnet-20241022") that must not defeat prefix matching.
|
|
283
|
+
clean = re.sub(r"-(latest|preview|exp)(-[0-9-]+)?$", "", clean)
|
|
284
|
+
|
|
285
|
+
best_prefix = ""
|
|
286
|
+
best_cap = _DEFAULT_CAPABILITY
|
|
287
|
+
for prefix, cap in _CAPABILITY_TABLE.items():
|
|
288
|
+
if clean.startswith(prefix.lower()) and len(prefix) > len(best_prefix):
|
|
289
|
+
best_prefix = prefix
|
|
290
|
+
best_cap = cap
|
|
291
|
+
|
|
292
|
+
return best_cap
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
# ---------------------------------------------------------------------------
|
|
296
|
+
# Tool schema injection helpers
|
|
297
|
+
# ---------------------------------------------------------------------------
|
|
298
|
+
|
|
299
|
+
def build_ollama_tool_payload(
|
|
300
|
+
tools_schema: List[Dict],
|
|
301
|
+
model_name: str,
|
|
302
|
+
) -> Optional[List[Dict]]:
|
|
303
|
+
"""
|
|
304
|
+
Return the `tools` field for an Ollama /api/chat request, or None when the
|
|
305
|
+
model does not support native tool calling.
|
|
306
|
+
|
|
307
|
+
When format == "ollama_native" the schema is passed as-is.
|
|
308
|
+
When format == "xml_tags" we skip the field and rely on prompt injection.
|
|
309
|
+
"""
|
|
310
|
+
cap = get_model_capability(model_name)
|
|
311
|
+
if not cap.tool_calls or cap.format != "ollama_native":
|
|
312
|
+
return None
|
|
313
|
+
return tools_schema
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def build_tool_system_prompt(
|
|
317
|
+
tools_schema: List[Dict],
|
|
318
|
+
model_name: str,
|
|
319
|
+
) -> str:
|
|
320
|
+
"""
|
|
321
|
+
For models that do NOT support native tool calls (xml_tags / text_only),
|
|
322
|
+
return a system-prompt block that instructs the model to emit
|
|
323
|
+
``<tool_call>{"name":…,"arguments":{…}}</tool_call>`` tags.
|
|
324
|
+
"""
|
|
325
|
+
cap = get_model_capability(model_name)
|
|
326
|
+
if cap.tool_calls and cap.format == "ollama_native":
|
|
327
|
+
return "" # handled by native API
|
|
328
|
+
|
|
329
|
+
tool_list = []
|
|
330
|
+
for t in tools_schema:
|
|
331
|
+
fn = t.get("function", t)
|
|
332
|
+
params = fn.get("parameters", {}).get("properties", {})
|
|
333
|
+
required = fn.get("parameters", {}).get("required", [])
|
|
334
|
+
param_str = ", ".join(
|
|
335
|
+
f"{k}: {v.get('type','any')}{'*' if k in required else ''}"
|
|
336
|
+
for k, v in params.items()
|
|
337
|
+
)
|
|
338
|
+
tool_list.append(f" - {fn['name']}({param_str}): {fn.get('description','')}")
|
|
339
|
+
|
|
340
|
+
tools_block = "\n".join(tool_list)
|
|
341
|
+
return (
|
|
342
|
+
"\n\n## Available Tools\n\n"
|
|
343
|
+
"When you need to call a tool, output EXACTLY this format (nothing else on the line):\n\n"
|
|
344
|
+
'<tool_call>{"name": "tool_name", "arguments": {"param": "value"}}</tool_call>\n\n'
|
|
345
|
+
"Tools available:\n"
|
|
346
|
+
f"{tools_block}\n\n"
|
|
347
|
+
"Rules:\n"
|
|
348
|
+
"1. Call ONE tool at a time. Wait for the result before calling the next.\n"
|
|
349
|
+
"2. After receiving a tool result, continue your analysis or call another tool.\n"
|
|
350
|
+
"3. When done with all tools, write your final answer in plain text.\n"
|
|
351
|
+
"4. Never make up tool results — always call the tool.\n"
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
# ---------------------------------------------------------------------------
|
|
356
|
+
# Tool call parsers
|
|
357
|
+
# ---------------------------------------------------------------------------
|
|
358
|
+
|
|
359
|
+
def parse_tool_calls_from_response(
|
|
360
|
+
text: str,
|
|
361
|
+
native_calls: Optional[List[Dict]] = None,
|
|
362
|
+
model_name: str = "",
|
|
363
|
+
) -> List[Dict[str, Any]]:
|
|
364
|
+
"""
|
|
365
|
+
Unified parser. Returns list of {"tool": str, "params": dict}.
|
|
366
|
+
|
|
367
|
+
Priority:
|
|
368
|
+
1. native_calls (Ollama tool_calls list) — most reliable
|
|
369
|
+
2. XML tags <tool_call>…</tool_call>
|
|
370
|
+
3. JSON code fences ```json … ```
|
|
371
|
+
4. Raw JSON object containing "name"/"arguments" keys
|
|
372
|
+
"""
|
|
373
|
+
# 1. Native Ollama tool calls
|
|
374
|
+
if native_calls:
|
|
375
|
+
result = []
|
|
376
|
+
for tc in native_calls:
|
|
377
|
+
fn = tc.get("function", tc)
|
|
378
|
+
name = fn.get("name", "")
|
|
379
|
+
args = fn.get("arguments", {})
|
|
380
|
+
if isinstance(args, str):
|
|
381
|
+
try:
|
|
382
|
+
args = json.loads(args)
|
|
383
|
+
except json.JSONDecodeError:
|
|
384
|
+
args = {}
|
|
385
|
+
if name:
|
|
386
|
+
result.append({"tool": name, "params": args})
|
|
387
|
+
if result:
|
|
388
|
+
return result
|
|
389
|
+
|
|
390
|
+
if not text:
|
|
391
|
+
return []
|
|
392
|
+
|
|
393
|
+
results: List[Dict[str, Any]] = []
|
|
394
|
+
|
|
395
|
+
# 2. XML tag format: <tool_call>…</tool_call>
|
|
396
|
+
xml_pattern = re.compile(
|
|
397
|
+
r"<tool_call>\s*(.*?)\s*</tool_call>", re.DOTALL | re.IGNORECASE
|
|
398
|
+
)
|
|
399
|
+
for m in xml_pattern.finditer(text):
|
|
400
|
+
tc = _try_parse_json(m.group(1))
|
|
401
|
+
if tc:
|
|
402
|
+
results.append(_normalise_call(tc))
|
|
403
|
+
|
|
404
|
+
if results:
|
|
405
|
+
return results
|
|
406
|
+
|
|
407
|
+
# 3. JSON fence: ```json … ``` or ``` … ```
|
|
408
|
+
fence_pattern = re.compile(
|
|
409
|
+
r"```(?:json)?\s*(\{.*?\})\s*```", re.DOTALL | re.IGNORECASE
|
|
410
|
+
)
|
|
411
|
+
for m in fence_pattern.finditer(text):
|
|
412
|
+
tc = _try_parse_json(m.group(1))
|
|
413
|
+
if tc and ("name" in tc or "tool" in tc):
|
|
414
|
+
results.append(_normalise_call(tc))
|
|
415
|
+
|
|
416
|
+
if results:
|
|
417
|
+
return results
|
|
418
|
+
|
|
419
|
+
# 4. Bare JSON object anywhere in text
|
|
420
|
+
json_pattern = re.compile(r"\{[^{}]*\"(?:name|tool)\"[^{}]*\}", re.DOTALL)
|
|
421
|
+
for m in json_pattern.finditer(text):
|
|
422
|
+
tc = _try_parse_json(m.group(0))
|
|
423
|
+
if tc and ("name" in tc or "tool" in tc):
|
|
424
|
+
results.append(_normalise_call(tc))
|
|
425
|
+
|
|
426
|
+
return results
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
def _try_parse_json(s: str) -> Optional[Dict]:
|
|
430
|
+
try:
|
|
431
|
+
return json.loads(s.strip())
|
|
432
|
+
except (json.JSONDecodeError, TypeError):
|
|
433
|
+
return None
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def _normalise_call(tc: Dict) -> Dict[str, Any]:
|
|
437
|
+
"""Normalise various key naming conventions → {"tool": …, "params": …}."""
|
|
438
|
+
name = tc.get("name") or tc.get("tool") or tc.get("function", {}).get("name", "")
|
|
439
|
+
args = (
|
|
440
|
+
tc.get("arguments")
|
|
441
|
+
or tc.get("params")
|
|
442
|
+
or tc.get("parameters")
|
|
443
|
+
or tc.get("function", {}).get("arguments", {})
|
|
444
|
+
or {}
|
|
445
|
+
)
|
|
446
|
+
if isinstance(args, str):
|
|
447
|
+
args = _try_parse_json(args) or {}
|
|
448
|
+
return {"tool": name, "params": args}
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
# ---------------------------------------------------------------------------
|
|
452
|
+
# Recommended local models for finance work
|
|
453
|
+
# ---------------------------------------------------------------------------
|
|
454
|
+
|
|
455
|
+
RECOMMENDED_FINANCE_MODELS: List[Dict[str, str]] = [
|
|
456
|
+
{
|
|
457
|
+
"model": "qwen2.5-coder:7b",
|
|
458
|
+
"reason": "Best balance of tool calling + code generation for finance scripts",
|
|
459
|
+
"install": "ollama pull qwen2.5-coder:7b",
|
|
460
|
+
"vram_gb": "5",
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
"model": "qwen2.5:14b",
|
|
464
|
+
"reason": "Strong quantitative reasoning, multi-turn strategy analysis",
|
|
465
|
+
"install": "ollama pull qwen2.5:14b",
|
|
466
|
+
"vram_gb": "10",
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"model": "deepseek-r1:14b",
|
|
470
|
+
"reason": "Deep reasoning for complex factor models (slow but thorough)",
|
|
471
|
+
"install": "ollama pull deepseek-r1:14b",
|
|
472
|
+
"vram_gb": "10",
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
"model": "llama3.2:3b",
|
|
476
|
+
"reason": "Ultra-fast for quick quotes and simple questions",
|
|
477
|
+
"install": "ollama pull llama3.2:3b",
|
|
478
|
+
"vram_gb": "2",
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"model": "phi4:14b",
|
|
482
|
+
"reason": "Math-strong, good for Greeks / derivative pricing",
|
|
483
|
+
"install": "ollama pull phi4",
|
|
484
|
+
"vram_gb": "9",
|
|
485
|
+
},
|
|
486
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Aria Code package facade layer.
|
|
2
|
+
|
|
3
|
+
This namespace is intentionally thin. It exposes stable package boundaries
|
|
4
|
+
without forcing the existing single-file CLI to move all implementation code at
|
|
5
|
+
once.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import pathlib as _pathlib
|
|
9
|
+
|
|
10
|
+
# Extend __path__ to include Arthera/packages/ so that
|
|
11
|
+
# `from packages.quant_engine.*` resolves transparently.
|
|
12
|
+
_arthera_pkgs = _pathlib.Path(__file__).parents[2] / "Arthera" / "packages"
|
|
13
|
+
if _arthera_pkgs.exists() and str(_arthera_pkgs) not in __path__:
|
|
14
|
+
__path__.append(str(_arthera_pkgs))
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"aria_agents",
|
|
18
|
+
"aria_core",
|
|
19
|
+
"aria_infra",
|
|
20
|
+
"aria_mcp",
|
|
21
|
+
"aria_skills",
|
|
22
|
+
"aria_tools",
|
|
23
|
+
]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Safe integration points between Aria Code services and Google ADK.
|
|
2
|
+
|
|
3
|
+
The bridge deliberately exports only read-only, bounded market-data tools.
|
|
4
|
+
Trading, broker credentials, shell access, and filesystem mutation stay outside
|
|
5
|
+
the ADK tool surface and continue to be governed by Aria's existing runtime.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .code_review_tools import CodeReviewTools
|
|
9
|
+
from .market_tools import MarketResearchTools
|
|
10
|
+
|
|
11
|
+
__all__ = ["CodeReviewTools", "MarketResearchTools"]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Read-only code-review tool surface for Google ADK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import PurePath
|
|
6
|
+
from typing import Any, Dict
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CodeReviewTools:
|
|
10
|
+
"""Review submitted source text without filesystem or shell capabilities."""
|
|
11
|
+
|
|
12
|
+
def review_code(self, source: str, filename: str = "snippet.py", language: str = "python") -> Dict[str, Any]:
|
|
13
|
+
"""Return deterministic review findings for caller-provided code only.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
source: Source code pasted by the user. File paths are never read.
|
|
17
|
+
filename: Display name used to infer language; directory components are ignored.
|
|
18
|
+
language: Source language, currently with additional syntax checks for Python.
|
|
19
|
+
"""
|
|
20
|
+
# 惰性导入:agents/__init__.py 会连带拉起 registry 和各 financial agent,
|
|
21
|
+
# 122 个模块、numpy 在内,约 260ms。放在模块级会让 packages.adk_bridge 整体
|
|
22
|
+
# 变重,也会让 agents/ 侧的任何导入故障连累 MarketResearchTools——两个工具面
|
|
23
|
+
# 本该互不影响。market_tools.py 对 DataService 用的是同一套惰性做法。
|
|
24
|
+
from agents.code_review import CodeReviewAgent
|
|
25
|
+
|
|
26
|
+
if not isinstance(source, str) or not source.strip():
|
|
27
|
+
return {"success": False, "error": "Non-empty source text is required."}
|
|
28
|
+
if len(source) > CodeReviewAgent.MAX_SOURCE_CHARS:
|
|
29
|
+
return {
|
|
30
|
+
"success": False,
|
|
31
|
+
"error": f"Source exceeds the {CodeReviewAgent.MAX_SOURCE_CHARS}-character review limit; split it by file.",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
safe_filename = PurePath(str(filename or "snippet.py")).name[:160] or "snippet.py"
|
|
35
|
+
findings = CodeReviewAgent.review_source(source, filename=safe_filename, language=str(language or "python"))
|
|
36
|
+
counts = {severity: 0 for severity in ("critical", "high", "medium", "low")}
|
|
37
|
+
for finding in findings:
|
|
38
|
+
counts[finding.severity] += 1
|
|
39
|
+
return {
|
|
40
|
+
"success": True,
|
|
41
|
+
"filename": safe_filename,
|
|
42
|
+
"language": str(language or "python")[:32],
|
|
43
|
+
"findings": [finding.to_dict() for finding in findings],
|
|
44
|
+
"counts": counts,
|
|
45
|
+
"limitations": [
|
|
46
|
+
"Static checks only; it did not read a file, execute code, run tests, or inspect dependencies.",
|
|
47
|
+
"Review findings are not a security certification.",
|
|
48
|
+
],
|
|
49
|
+
}
|