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,316 @@
|
|
|
1
|
+
"""Native Google Cloud Vertex AI LLM Provider using google-genai.
|
|
2
|
+
|
|
3
|
+
google-genai is an optional dependency: most users run Ollama or an
|
|
4
|
+
OpenAI-compatible endpoint and should not have to install a Google SDK. That
|
|
5
|
+
makes the "it is not installed" path a normal one to land on, so it has to say
|
|
6
|
+
what to do rather than leaking a ModuleNotFoundError.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
from typing import AsyncGenerator, Optional
|
|
13
|
+
|
|
14
|
+
from aria_code.apps.cli.providers.base import (
|
|
15
|
+
LLMDone,
|
|
16
|
+
LLMEvent,
|
|
17
|
+
LLMProvider,
|
|
18
|
+
LLMThinking,
|
|
19
|
+
LLMToken,
|
|
20
|
+
LLMToolCall,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
_MISSING_SDK_MESSAGE = (
|
|
24
|
+
"Gemini/Vertex AI 需要 google-genai,当前未安装。\n"
|
|
25
|
+
" 安装:pip install google-genai\n"
|
|
26
|
+
" 或改用其他模型:/model (Ollama 本地模型无需额外依赖)"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class VertexAIProvider(LLMProvider):
|
|
31
|
+
"""Native Vertex AI provider using google-genai."""
|
|
32
|
+
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
model: str,
|
|
36
|
+
config: Optional[dict] = None,
|
|
37
|
+
system_override: Optional[str] = None,
|
|
38
|
+
):
|
|
39
|
+
self.model = model
|
|
40
|
+
self.config = config or {}
|
|
41
|
+
self.system_override = system_override
|
|
42
|
+
self._client = None
|
|
43
|
+
|
|
44
|
+
def _api_key(self) -> str:
|
|
45
|
+
"""Gemini API key from config, falling back to the standard env vars."""
|
|
46
|
+
for value in (
|
|
47
|
+
self.config.get("api_key"),
|
|
48
|
+
self.config.get("gemini_key"),
|
|
49
|
+
os.getenv("GEMINI_API_KEY"),
|
|
50
|
+
os.getenv("GOOGLE_API_KEY"),
|
|
51
|
+
):
|
|
52
|
+
key = str(value or "").strip()
|
|
53
|
+
if key:
|
|
54
|
+
return key
|
|
55
|
+
return ""
|
|
56
|
+
|
|
57
|
+
def _use_vertex(self) -> bool:
|
|
58
|
+
"""Decide between Vertex AI (ADC) and the Gemini API-key endpoint.
|
|
59
|
+
|
|
60
|
+
``use_vertexai`` used to default to True unconditionally, so a developer
|
|
61
|
+
holding only a GEMINI_API_KEY got ``genai.Client(vertexai=True)`` and a
|
|
62
|
+
credentials error — Vertex needs application-default credentials and a
|
|
63
|
+
project. An explicit config value still wins; otherwise pick whichever
|
|
64
|
+
set of credentials is actually present.
|
|
65
|
+
"""
|
|
66
|
+
configured = self.config.get("use_vertexai")
|
|
67
|
+
if configured is not None:
|
|
68
|
+
return bool(configured)
|
|
69
|
+
env_flag = os.getenv("GOOGLE_GENAI_USE_VERTEXAI", "").strip().lower()
|
|
70
|
+
if env_flag in {"1", "true", "yes", "on"}:
|
|
71
|
+
return True
|
|
72
|
+
if env_flag in {"0", "false", "no", "off"}:
|
|
73
|
+
return False
|
|
74
|
+
has_vertex_creds = bool(
|
|
75
|
+
os.getenv("GOOGLE_CLOUD_PROJECT")
|
|
76
|
+
or os.getenv("GOOGLE_APPLICATION_CREDENTIALS")
|
|
77
|
+
)
|
|
78
|
+
if has_vertex_creds:
|
|
79
|
+
return True
|
|
80
|
+
# No project/ADC configured: an API key is the only usable path.
|
|
81
|
+
return not self._api_key()
|
|
82
|
+
|
|
83
|
+
def _get_client(self):
|
|
84
|
+
if self._client is None:
|
|
85
|
+
from google import genai
|
|
86
|
+
|
|
87
|
+
if self._use_vertex():
|
|
88
|
+
project = os.getenv("GOOGLE_CLOUD_PROJECT") or self.config.get("gcp_project")
|
|
89
|
+
location = (
|
|
90
|
+
os.getenv("GOOGLE_CLOUD_LOCATION")
|
|
91
|
+
or self.config.get("gcp_location")
|
|
92
|
+
or "us-central1"
|
|
93
|
+
)
|
|
94
|
+
kwargs = {"vertexai": True, "location": location}
|
|
95
|
+
if project:
|
|
96
|
+
kwargs["project"] = str(project)
|
|
97
|
+
self._client = genai.Client(**kwargs)
|
|
98
|
+
else:
|
|
99
|
+
api_key = self._api_key()
|
|
100
|
+
if not api_key:
|
|
101
|
+
raise RuntimeError(
|
|
102
|
+
"Gemini 需要凭据:设置 GEMINI_API_KEY,或配置 Vertex AI "
|
|
103
|
+
"(GOOGLE_CLOUD_PROJECT + gcloud auth application-default login)。"
|
|
104
|
+
)
|
|
105
|
+
self._client = genai.Client(api_key=api_key)
|
|
106
|
+
return self._client
|
|
107
|
+
|
|
108
|
+
def _messages_to_contents(self, messages: list):
|
|
109
|
+
# Convert aria chat messages to genai Content objects
|
|
110
|
+
from google.genai import types
|
|
111
|
+
|
|
112
|
+
system_instruction = self.system_override or ""
|
|
113
|
+
contents = []
|
|
114
|
+
|
|
115
|
+
for msg in messages:
|
|
116
|
+
role = msg.get("role", "user")
|
|
117
|
+
content_str = msg.get("content", "")
|
|
118
|
+
|
|
119
|
+
if role == "system":
|
|
120
|
+
if system_instruction:
|
|
121
|
+
system_instruction += "\n\n" + content_str
|
|
122
|
+
else:
|
|
123
|
+
system_instruction = content_str
|
|
124
|
+
continue
|
|
125
|
+
|
|
126
|
+
genai_role = "user" if role == "user" else "model"
|
|
127
|
+
|
|
128
|
+
if role == "tool":
|
|
129
|
+
# Rendered as text, not as a FunctionResponse part.
|
|
130
|
+
#
|
|
131
|
+
# Gemini only accepts a function_response that answers a
|
|
132
|
+
# function_call it can see in the preceding model turn, and the
|
|
133
|
+
# agent loop does not preserve those: it records the assistant
|
|
134
|
+
# turn as plain text. Sending an unanswered function_response
|
|
135
|
+
# made the conversation malformed, and Gemini replied with a
|
|
136
|
+
# single whitespace character and no tool call — the turn died
|
|
137
|
+
# as "empty_response" a round or two in, every time.
|
|
138
|
+
#
|
|
139
|
+
# The information is not lost by doing this: the loop already
|
|
140
|
+
# puts the same results in the follow-up user message that
|
|
141
|
+
# comes next, in a form written to be read.
|
|
142
|
+
tool_name = msg.get("name") or "tool"
|
|
143
|
+
text = f"[{tool_name}] {content_str}".strip()
|
|
144
|
+
if not text:
|
|
145
|
+
continue
|
|
146
|
+
if contents and contents[-1].role == "user":
|
|
147
|
+
contents[-1].parts.append(types.Part.from_text(text=text))
|
|
148
|
+
else:
|
|
149
|
+
contents.append(types.Content(
|
|
150
|
+
role="user", parts=[types.Part.from_text(text=text)]))
|
|
151
|
+
continue
|
|
152
|
+
|
|
153
|
+
# An empty part is worse than no part. When a model answers a turn
|
|
154
|
+
# with nothing but a function call — which Gemini does routinely,
|
|
155
|
+
# and which the agent loop records as an assistant message whose
|
|
156
|
+
# text is "" — this used to send Content(role="model", parts=[""]).
|
|
157
|
+
# Gemini responds to that with a single whitespace character and no
|
|
158
|
+
# tool call, so the second round of every tool-using turn came back
|
|
159
|
+
# as "empty_response" and the task died after one step.
|
|
160
|
+
if not str(content_str or "").strip():
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
# Check if previous message has same role
|
|
164
|
+
# (Gemini requires alternating roles: user, model, user, model)
|
|
165
|
+
if contents and contents[-1].role == genai_role:
|
|
166
|
+
contents[-1].parts.append(types.Part.from_text(text=content_str))
|
|
167
|
+
else:
|
|
168
|
+
contents.append(types.Content(role=genai_role, parts=[types.Part.from_text(text=content_str)]))
|
|
169
|
+
|
|
170
|
+
return contents, system_instruction
|
|
171
|
+
|
|
172
|
+
def _schema_from_dict(self, d: dict, types):
|
|
173
|
+
if not d:
|
|
174
|
+
return None
|
|
175
|
+
t = d.get("type", "string").upper()
|
|
176
|
+
if t == "ARRAY":
|
|
177
|
+
items = d.get("items", {})
|
|
178
|
+
return types.Schema(
|
|
179
|
+
type="ARRAY",
|
|
180
|
+
description=d.get("description", ""),
|
|
181
|
+
items=self._schema_from_dict(items, types) if items else types.Schema(type="STRING")
|
|
182
|
+
)
|
|
183
|
+
elif t == "OBJECT":
|
|
184
|
+
props = d.get("properties", {})
|
|
185
|
+
req = d.get("required", [])
|
|
186
|
+
schema_props = {k: self._schema_from_dict(v, types) for k, v in props.items()}
|
|
187
|
+
return types.Schema(
|
|
188
|
+
type="OBJECT",
|
|
189
|
+
description=d.get("description", ""),
|
|
190
|
+
properties=schema_props if schema_props else None,
|
|
191
|
+
required=req if req else None
|
|
192
|
+
)
|
|
193
|
+
else:
|
|
194
|
+
return types.Schema(
|
|
195
|
+
type=t,
|
|
196
|
+
description=d.get("description", "")
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
def _tools_to_genai(self, tools: list):
|
|
200
|
+
if not tools:
|
|
201
|
+
return None
|
|
202
|
+
from google.genai import types
|
|
203
|
+
genai_tools = []
|
|
204
|
+
# Vertex rejects the entire request when two declarations share a name
|
|
205
|
+
# ("Duplicate function declaration found: web_fetch"), where
|
|
206
|
+
# OpenAI-compatible backends just take the last one. The registries
|
|
207
|
+
# upstream should not produce duplicates, but this is the boundary
|
|
208
|
+
# where a duplicate becomes a hard 400 for the whole turn, so it is
|
|
209
|
+
# also the boundary that has to be certain.
|
|
210
|
+
seen: set = set()
|
|
211
|
+
for tool in tools:
|
|
212
|
+
func = tool.get("function", tool)
|
|
213
|
+
name = func.get("name")
|
|
214
|
+
if not name or name in seen:
|
|
215
|
+
continue
|
|
216
|
+
seen.add(name)
|
|
217
|
+
desc = func.get("description", "")
|
|
218
|
+
|
|
219
|
+
# Map parameters recursively
|
|
220
|
+
params = func.get("parameters", {})
|
|
221
|
+
schema = self._schema_from_dict(params, types) if params else None
|
|
222
|
+
|
|
223
|
+
tool_declaration = types.FunctionDeclaration(
|
|
224
|
+
name=name,
|
|
225
|
+
description=desc,
|
|
226
|
+
parameters=schema
|
|
227
|
+
)
|
|
228
|
+
genai_tools.append(types.Tool(function_declarations=[tool_declaration]))
|
|
229
|
+
|
|
230
|
+
return genai_tools
|
|
231
|
+
|
|
232
|
+
async def stream(
|
|
233
|
+
self,
|
|
234
|
+
messages: list,
|
|
235
|
+
tools: list,
|
|
236
|
+
*,
|
|
237
|
+
cancel_event: Optional[asyncio.Event] = None,
|
|
238
|
+
) -> AsyncGenerator[LLMEvent, None]:
|
|
239
|
+
# These imports must sit INSIDE the try. They were above it, so when
|
|
240
|
+
# google-genai was not installed they raised first and the handler
|
|
241
|
+
# below — the one that explains how to fix it — was unreachable. The
|
|
242
|
+
# user saw a bare "No module named 'google.genai'" and no way forward.
|
|
243
|
+
try:
|
|
244
|
+
from google.genai import types
|
|
245
|
+
from google.genai.errors import APIError
|
|
246
|
+
|
|
247
|
+
client = self._get_client()
|
|
248
|
+
except ImportError:
|
|
249
|
+
yield LLMDone(
|
|
250
|
+
response="", provider="vertexai", success=False,
|
|
251
|
+
error=_MISSING_SDK_MESSAGE,
|
|
252
|
+
)
|
|
253
|
+
return
|
|
254
|
+
except Exception as e:
|
|
255
|
+
yield LLMDone(response="", provider="vertexai", success=False, error=str(e))
|
|
256
|
+
return
|
|
257
|
+
|
|
258
|
+
contents, system_instruction = self._messages_to_contents(messages)
|
|
259
|
+
genai_tools = self._tools_to_genai(tools)
|
|
260
|
+
|
|
261
|
+
config = types.GenerateContentConfig(
|
|
262
|
+
system_instruction=system_instruction if system_instruction else None,
|
|
263
|
+
tools=genai_tools if genai_tools else None,
|
|
264
|
+
temperature=self.config.get("temperature", 0.7),
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
try:
|
|
268
|
+
# We must use asyncio.to_thread because the google-genai async client might not be used here
|
|
269
|
+
# Or we can just use the sync stream generator wrapped in an async generator.
|
|
270
|
+
# google-genai provides AsyncClient as well:
|
|
271
|
+
# async_client = genai.Client(vertexai=True).aio
|
|
272
|
+
response_stream = await client.aio.models.generate_content_stream(
|
|
273
|
+
model=self.model,
|
|
274
|
+
contents=contents,
|
|
275
|
+
config=config,
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
full_response = ""
|
|
279
|
+
usage = {}
|
|
280
|
+
tool_calls = []
|
|
281
|
+
|
|
282
|
+
async for chunk in response_stream:
|
|
283
|
+
if cancel_event and cancel_event.is_set():
|
|
284
|
+
yield LLMDone(response=full_response, provider="vertexai", success=True, cancelled=True)
|
|
285
|
+
return
|
|
286
|
+
|
|
287
|
+
if chunk.text:
|
|
288
|
+
full_response += chunk.text
|
|
289
|
+
yield LLMToken(text=chunk.text)
|
|
290
|
+
|
|
291
|
+
if chunk.function_calls:
|
|
292
|
+
for fc in chunk.function_calls:
|
|
293
|
+
args = {k: v for k, v in fc.args.items()} if fc.args else {}
|
|
294
|
+
yield LLMToolCall(tool=fc.name, params=args)
|
|
295
|
+
tool_calls.append({"tool": fc.name, "params": args})
|
|
296
|
+
|
|
297
|
+
if chunk.usage_metadata:
|
|
298
|
+
usage = {
|
|
299
|
+
"prompt_tokens": chunk.usage_metadata.prompt_token_count,
|
|
300
|
+
"completion_tokens": chunk.usage_metadata.candidates_token_count,
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
yield LLMDone(
|
|
304
|
+
response=full_response,
|
|
305
|
+
tool_calls_pending=tool_calls,
|
|
306
|
+
usage=usage,
|
|
307
|
+
provider="vertexai",
|
|
308
|
+
success=True,
|
|
309
|
+
cancelled=False,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
except APIError as e:
|
|
313
|
+
yield LLMDone(response="", provider="vertexai", success=False, error=f"Vertex AI API Error: {e.message}")
|
|
314
|
+
except Exception as e:
|
|
315
|
+
yield LLMDone(response="", provider="vertexai", success=False, error=f"Vertex AI Error: {str(e)}")
|
|
316
|
+
|