aria-code 0.167.0__py3-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aria_bots/__init__.py +7 -0
- aria_bots/channels/README.md +97 -0
- aria_bots/channels/__init__.py +1 -0
- aria_bots/channels/approvals.py +263 -0
- aria_bots/channels/conversation.py +280 -0
- aria_bots/channels/digest.py +186 -0
- aria_bots/channels/registry.py +95 -0
- aria_bots/engine.py +144 -0
- aria_bots/feishu_bot.py +1385 -0
- aria_bots/logistics/__init__.py +1 -0
- aria_bots/logistics/carriers.py +253 -0
- aria_bots/logistics/freight.py +154 -0
- aria_bots/logistics/inventory.py +242 -0
- aria_bots/logistics/mcp_server.py +156 -0
- aria_bots/logistics/records.py +119 -0
- aria_bots/logistics/tenancy.py +152 -0
- aria_bots/market.py +91 -0
- aria_bots/relay_client.py +326 -0
- aria_bots/telegram_bot.py +299 -0
- aria_code/__init__.py +111 -0
- aria_code/_bin/aria-native.exe +0 -0
- aria_code/_bin/aria-runtime.exe +0 -0
- aria_code/_version.py +20 -0
- aria_code/account_memory.py +296 -0
- aria_code/account_session.py +166 -0
- aria_code/adk_apps/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/agent.py +32 -0
- aria_code/adk_apps/aria_research/__init__.py +1 -0
- aria_code/adk_apps/aria_research/agent.py +31 -0
- aria_code/agents/__init__.py +49 -0
- aria_code/agents/base.py +329 -0
- aria_code/agents/code_review.py +200 -0
- aria_code/agents/deep/__init__.py +37 -0
- aria_code/agents/deep/calibration_loop.py +144 -0
- aria_code/agents/deep/critic.py +125 -0
- aria_code/agents/deep/deepen.py +193 -0
- aria_code/agents/deep/models.py +149 -0
- aria_code/agents/deep/pipeline.py +164 -0
- aria_code/agents/deep/quant_fusion.py +192 -0
- aria_code/agents/deep/themes.py +95 -0
- aria_code/agents/deep/tiers.py +106 -0
- aria_code/agents/engineering/__init__.py +14 -0
- aria_code/agents/engineering/coder.py +222 -0
- aria_code/agents/engineering/tester.py +145 -0
- aria_code/agents/financial/__init__.py +21 -0
- aria_code/agents/financial/cashflow_burn.py +119 -0
- aria_code/agents/financial/catalyst.py +279 -0
- aria_code/agents/financial/corporate_finance.py +175 -0
- aria_code/agents/financial/debate.py +224 -0
- aria_code/agents/financial/earnings.py +315 -0
- aria_code/agents/financial/fundamental.py +178 -0
- aria_code/agents/financial/macro.py +111 -0
- aria_code/agents/financial/news.py +231 -0
- aria_code/agents/financial/risk.py +146 -0
- aria_code/agents/financial/sector.py +279 -0
- aria_code/agents/financial/strategist.py +121 -0
- aria_code/agents/financial/stripe_revenue.py +127 -0
- aria_code/agents/financial/synthesis.py +274 -0
- aria_code/agents/financial/technical.py +277 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +392 -0
- aria_code/agents/realty/__init__.py +62 -0
- aria_code/agents/realty/asset_diagnosis.py +152 -0
- aria_code/agents/realty/business_match.py +166 -0
- aria_code/agents/realty/cashflow_verify.py +209 -0
- aria_code/agents/realty/contract_rules.py +210 -0
- aria_code/agents/realty/energy_anomaly.py +189 -0
- aria_code/agents/realty/exit_settlement.py +208 -0
- aria_code/agents/realty/fulfillment_risk.py +206 -0
- aria_code/agents/realty/ops_optimize.py +160 -0
- aria_code/agents/realty/revenue_share.py +215 -0
- aria_code/agents/registry.py +168 -0
- aria_code/agents/signal_scheme.py +111 -0
- aria_code/agents/sports/__init__.py +0 -0
- aria_code/agents/sports/football_agent.py +197 -0
- aria_code/agents/supervisor.py +113 -0
- aria_code/agents/team.py +500 -0
- aria_code/agents/video/__init__.py +16 -0
- aria_code/agents/video/director.py +376 -0
- aria_code/agents/video/qa_agent.py +143 -0
- aria_code/agents/video/script_doctor.py +112 -0
- aria_code/agents/warehouse/__init__.py +25 -0
- aria_code/agents/warehouse/contracts.py +26 -0
- aria_code/agents/warehouse/dashboard.py +155 -0
- aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
- aria_code/agents/warehouse/inbound_exceptions.py +25 -0
- aria_code/agents/warehouse/inventory_health.py +24 -0
- aria_code/agents/warehouse/local_run.py +71 -0
- aria_code/agents/warehouse/local_snapshot.py +132 -0
- aria_code/agents/warehouse/logistics_cost.py +84 -0
- aria_code/agents/warehouse/logistics_sync.py +21 -0
- aria_code/agents/warehouse/navigation.schema.json +110 -0
- aria_code/agents/warehouse/task_agent.py +172 -0
- aria_code/agents/warehouse/workflow.py +31 -0
- aria_code/aliyun_data_client.py +4 -0
- aria_code/apps/README.md +12 -0
- aria_code/apps/__init__.py +2 -0
- aria_code/apps/channels/README.md +9 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/approvals.py +11 -0
- aria_code/apps/channels/conversation.py +11 -0
- aria_code/apps/channels/digest.py +11 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +11 -0
- aria_code/apps/channels/tradingview.py +94 -0
- aria_code/apps/cli/README.md +13 -0
- aria_code/apps/cli/__init__.py +2 -0
- aria_code/apps/cli/_optional.py +120 -0
- aria_code/apps/cli/app_server.py +656 -0
- aria_code/apps/cli/auto_update.py +125 -0
- aria_code/apps/cli/bootstrap.py +206 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/chat_turn.py +1327 -0
- aria_code/apps/cli/cloud_models.py +231 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +34 -0
- aria_code/apps/cli/commands/_business_render.py +78 -0
- aria_code/apps/cli/commands/_ui.py +71 -0
- aria_code/apps/cli/commands/analysis_cmds.py +378 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +215 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
- aria_code/apps/cli/commands/broker_cmds.py +1236 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +189 -0
- aria_code/apps/cli/commands/core_cmds.py +2748 -0
- aria_code/apps/cli/commands/data_cmds.py +521 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/engineering_cmds.py +399 -0
- aria_code/apps/cli/commands/file_cmds.py +312 -0
- aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
- aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
- aria_code/apps/cli/commands/market.py +544 -0
- aria_code/apps/cli/commands/market_cmds.py +1419 -0
- aria_code/apps/cli/commands/market_context.py +432 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2374 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
- aria_code/apps/cli/commands/report.py +476 -0
- aria_code/apps/cli/commands/scaffold_templates.py +617 -0
- aria_code/apps/cli/commands/session_cmds.py +236 -0
- aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
- aria_code/apps/cli/commands/team.py +723 -0
- aria_code/apps/cli/commands/team_render.py +8 -0
- aria_code/apps/cli/commands/ui_cmds.py +401 -0
- aria_code/apps/cli/commands/warehouse_cmds.py +297 -0
- aria_code/apps/cli/commands/workflow_cmds.py +629 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +158 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/conversation_policy.py +53 -0
- aria_code/apps/cli/deterministic.py +200 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/earnings_view.py +172 -0
- aria_code/apps/cli/endpoint_migration.py +64 -0
- aria_code/apps/cli/exec_events.py +255 -0
- aria_code/apps/cli/file_references.py +155 -0
- aria_code/apps/cli/finance_service_catalog.py +111 -0
- aria_code/apps/cli/football_reports.py +231 -0
- aria_code/apps/cli/github_app_auth.py +135 -0
- aria_code/apps/cli/google_login.py +239 -0
- aria_code/apps/cli/handlers/__init__.py +11 -0
- aria_code/apps/cli/handlers/broker_handlers.py +122 -0
- aria_code/apps/cli/handlers/chart_handlers.py +1314 -0
- aria_code/apps/cli/handlers/market_handlers.py +2570 -0
- aria_code/apps/cli/handlers/realty_handlers.py +114 -0
- aria_code/apps/cli/handlers/sports_handlers.py +22 -0
- aria_code/apps/cli/handlers/strategy_advice.py +82 -0
- aria_code/apps/cli/headless.py +352 -0
- aria_code/apps/cli/helpers.py +326 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +310 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +305 -0
- aria_code/apps/cli/intent_shadow.py +72 -0
- aria_code/apps/cli/intent_signals.py +347 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +550 -0
- aria_code/apps/cli/main.py +39 -0
- aria_code/apps/cli/market_hours.py +100 -0
- aria_code/apps/cli/market_metadata.py +135 -0
- aria_code/apps/cli/market_universe.py +487 -0
- aria_code/apps/cli/message_processing.py +310 -0
- aria_code/apps/cli/mixin_binding.py +32 -0
- aria_code/apps/cli/model_catalog.py +652 -0
- aria_code/apps/cli/model_probe.py +169 -0
- aria_code/apps/cli/model_retirement.py +65 -0
- aria_code/apps/cli/native_branding.py +12 -0
- aria_code/apps/cli/native_bridge.py +118 -0
- aria_code/apps/cli/native_entry.py +58 -0
- aria_code/apps/cli/pdf_report.py +977 -0
- aria_code/apps/cli/plan_mode.py +139 -0
- aria_code/apps/cli/plotly_html.py +15 -0
- aria_code/apps/cli/prediction_feedback.py +202 -0
- aria_code/apps/cli/preflight.py +502 -0
- aria_code/apps/cli/project_aria.py +60 -0
- aria_code/apps/cli/prompt_assembly.py +78 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +71 -0
- aria_code/apps/cli/prompts/select.py +193 -0
- aria_code/apps/cli/prompts/system_prompts.py +562 -0
- aria_code/apps/cli/prompts/ui.py +436 -0
- aria_code/apps/cli/provider_endpoints.py +237 -0
- aria_code/apps/cli/provider_keys.py +73 -0
- aria_code/apps/cli/providers/__init__.py +1 -0
- aria_code/apps/cli/providers/base.py +775 -0
- aria_code/apps/cli/providers/chat_routing.py +139 -0
- aria_code/apps/cli/providers/collaboration.py +98 -0
- aria_code/apps/cli/providers/llm/__init__.py +1 -0
- aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
- aria_code/apps/cli/providers/llm/ollama_stream.py +1574 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
- aria_code/apps/cli/providers/runtime_bridge.py +586 -0
- aria_code/apps/cli/providers/vertexai_stream.py +592 -0
- aria_code/apps/cli/release_download.py +159 -0
- aria_code/apps/cli/review_runner.py +111 -0
- aria_code/apps/cli/runtime_consumer.py +769 -0
- aria_code/apps/cli/sandbox.py +32 -0
- aria_code/apps/cli/session_export.py +120 -0
- aria_code/apps/cli/session_jsonl.py +208 -0
- aria_code/apps/cli/session_refresh.py +123 -0
- aria_code/apps/cli/session_store.py +125 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/task_isolation.py +211 -0
- aria_code/apps/cli/terminal_chrome.py +412 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +932 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +113 -0
- aria_code/apps/cli/tools/__init__.py +40 -0
- aria_code/apps/cli/tools/context.py +46 -0
- aria_code/apps/cli/tools/file_tools.py +181 -0
- aria_code/apps/cli/tools/market_tools.py +626 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +656 -0
- aria_code/apps/cli/tools/write_tools.py +961 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/transactions.py +269 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +257 -0
- aria_code/apps/cli/updater.py +373 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1663 -0
- aria_code/apps/cli/web_login.py +136 -0
- aria_code/apps/cli/workflow_runner.py +127 -0
- aria_code/apps/cli/workspace_route.py +121 -0
- aria_code/apps/daemon/README.md +14 -0
- aria_code/apps/vscode/README.md +115 -0
- aria_code/apps/vscode/package.json +70 -0
- aria_code/aria_cli.py +5244 -0
- aria_code/aria_daemon.py +1372 -0
- aria_code/aria_feishu_bot.py +16 -0
- aria_code/aria_mcp_server.py +61 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_telegram_bot.py +11 -0
- aria_code/ariarc.py +385 -0
- aria_code/artifacts.py +581 -0
- aria_code/backtest_engine.py +4 -0
- aria_code/backtest_report.py +4 -0
- aria_code/brokers/__init__.py +78 -0
- aria_code/brokers/automation.py +193 -0
- aria_code/brokers/base.py +231 -0
- aria_code/brokers/capabilities.py +264 -0
- aria_code/brokers/cn/__init__.py +10 -0
- aria_code/brokers/cn/easytrader_broker.py +193 -0
- aria_code/brokers/cn/futu_broker.py +194 -0
- aria_code/brokers/cn/longbridge_broker.py +190 -0
- aria_code/brokers/cn/tiger_broker.py +196 -0
- aria_code/brokers/cn/xtquant_broker.py +225 -0
- aria_code/brokers/config.py +414 -0
- aria_code/brokers/intl/__init__.py +5 -0
- aria_code/brokers/intl/alpaca_broker.py +183 -0
- aria_code/brokers/intl/ibkr_broker.py +215 -0
- aria_code/brokers/intl/trading212_broker.py +183 -0
- aria_code/brokers/intl/webull_broker.py +156 -0
- aria_code/brokers/paper_broker.py +266 -0
- aria_code/brokers/planning.py +296 -0
- aria_code/brokers/registry.py +213 -0
- aria_code/brokers/trading.py +267 -0
- aria_code/canva_client.py +4 -0
- aria_code/change_store.py +127 -0
- aria_code/clients/__init__.py +0 -0
- aria_code/clients/aliyun_data_client.py +660 -0
- aria_code/clients/aria_relay_client.py +16 -0
- aria_code/clients/canva_client.py +284 -0
- aria_code/clients/figma_client.py +100 -0
- aria_code/clients/football_data_client.py +1671 -0
- aria_code/clients/kling_video_client.py +182 -0
- aria_code/clients/market_data_client.py +1985 -0
- aria_code/clients/openai_image_client.py +242 -0
- aria_code/clients/runway_video_client.py +157 -0
- aria_code/clients/warehouse_erp_client.py +105 -0
- aria_code/cloud_memory.py +190 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_server.py +276 -0
- aria_code/computer_use_tools.py +4 -0
- aria_code/dashboard_generator.py +579 -0
- aria_code/data_analysis_tools.py +4 -0
- aria_code/data_cleaner.py +483 -0
- aria_code/data_service.py +513 -0
- aria_code/datasources/__init__.py +23 -0
- aria_code/datasources/base.py +166 -0
- aria_code/datasources/router.py +253 -0
- aria_code/datasources/sec_statements.py +217 -0
- aria_code/datasources/sources/__init__.py +15 -0
- aria_code/datasources/sources/akshare_source.py +269 -0
- aria_code/datasources/sources/alpha_vantage_source.py +203 -0
- aria_code/datasources/sources/edgar_source.py +219 -0
- aria_code/datasources/sources/finnhub_source.py +198 -0
- aria_code/datasources/sources/fred_source.py +223 -0
- aria_code/datasources/sources/tushare_source.py +143 -0
- aria_code/datasources/sources/web_scraper_source.py +278 -0
- aria_code/datasources/sources/world_bank_source.py +206 -0
- aria_code/datasources/sources/yfinance_source.py +152 -0
- aria_code/doctor.py +860 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/_finance_core/__init__.py +5 -0
- aria_code/domain/_finance_core/backtest_engine.py +325 -0
- aria_code/domain/_finance_core/performance_stats.py +101 -0
- aria_code/domain/backtest_engine.py +75 -0
- aria_code/domain/backtest_report.py +488 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/performance_stats.py +6 -0
- aria_code/domain/portfolio_ledger.py +307 -0
- aria_code/domain/strategy_vault.py +421 -0
- aria_code/evals/__init__.py +37 -0
- aria_code/evals/behavior.py +113 -0
- aria_code/evals/gap.py +93 -0
- aria_code/evals/harness.py +949 -0
- aria_code/evals/review_probe.py +132 -0
- aria_code/evals/runner.py +425 -0
- aria_code/evals/scorecard.py +322 -0
- aria_code/evals/summary.py +125 -0
- aria_code/external_agent_runner.py +115 -0
- aria_code/figma_client.py +4 -0
- aria_code/file_analysis_tools.py +4 -0
- aria_code/finance_formulas.py +4 -0
- aria_code/football_data_client.py +4 -0
- aria_code/image_gen_tools.py +4 -0
- aria_code/intent_classifier.py +459 -0
- aria_code/kling_video_client.py +4 -0
- aria_code/licensing.py +151 -0
- aria_code/local_finance_tools.py +4 -0
- aria_code/local_image_provider.py +4 -0
- aria_code/local_llm_provider.py +4 -0
- aria_code/macro_tools.py +4 -0
- aria_code/markdown_pdf.py +289 -0
- aria_code/market_data_client.py +4 -0
- aria_code/mcp_client.py +744 -0
- aria_code/memory_manager.py +273 -0
- aria_code/model_capability.py +512 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +26 -0
- aria_code/packages/adk_bridge/__init__.py +11 -0
- aria_code/packages/adk_bridge/code_review_tools.py +49 -0
- aria_code/packages/adk_bridge/market_tools.py +125 -0
- aria_code/packages/aria_agents/__init__.py +5 -0
- aria_code/packages/aria_agents/manifest.py +78 -0
- aria_code/packages/aria_core/__init__.py +34 -0
- aria_code/packages/aria_core/architecture.py +269 -0
- aria_code/packages/aria_core/export.py +147 -0
- aria_code/packages/aria_core/manifest.py +65 -0
- aria_code/packages/aria_core/paths.py +57 -0
- aria_code/packages/aria_core/secure_file.py +68 -0
- aria_code/packages/aria_infra/__init__.py +15 -0
- aria_code/packages/aria_infra/arthera.py +58 -0
- aria_code/packages/aria_infra/doctor.py +246 -0
- aria_code/packages/aria_infra/product.py +40 -0
- aria_code/packages/aria_mcp/__init__.py +25 -0
- aria_code/packages/aria_mcp/bridge.py +232 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +162 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1705 -0
- aria_code/packages/aria_mcp/tools.py +81 -0
- aria_code/packages/aria_sdk/__init__.py +19 -0
- aria_code/packages/aria_sdk/client.py +393 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +75 -0
- aria_code/packages/aria_sdk/types.py +86 -0
- aria_code/packages/aria_services/__init__.py +92 -0
- aria_code/packages/aria_services/cache.py +60 -0
- aria_code/packages/aria_services/context.py +356 -0
- aria_code/packages/aria_services/context_checkpoints.py +157 -0
- aria_code/packages/aria_services/data.py +11 -0
- aria_code/packages/aria_services/provider_health.py +304 -0
- aria_code/packages/aria_services/references.py +247 -0
- aria_code/packages/aria_services/registry.py +249 -0
- aria_code/packages/aria_services/research_protocol.py +137 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +160 -0
- aria_code/packages/aria_services/usage.py +151 -0
- aria_code/packages/aria_skills/__init__.py +46 -0
- aria_code/packages/aria_skills/catalog.py +149 -0
- aria_code/packages/aria_skills/loader.py +455 -0
- aria_code/packages/aria_skills/registry.py +84 -0
- aria_code/packages/aria_tools/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/_paths.py +92 -0
- aria_code/packages/aria_tools/registry.py +129 -0
- aria_code/packages/quant_engine/__init__.py +33 -0
- aria_code/packages/quant_engine/_namespace.py +24 -0
- aria_code/packages/quant_engine/backtest/__init__.py +10 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +102 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +76 -0
- aria_code/packages/quant_engine/sports/calibrator.py +354 -0
- aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
- aria_code/packages/quant_engine/sports/elo.py +300 -0
- aria_code/packages/quant_engine/sports/form.py +188 -0
- aria_code/packages/quant_engine/sports/h2h.py +195 -0
- aria_code/packages/quant_engine/sports/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +31 -0
- aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
- aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
- aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- aria_code/packs/__init__.py +85 -0
- aria_code/packs/base.py +168 -0
- aria_code/packs/finance/__init__.py +250 -0
- aria_code/packs/healthcare/__init__.py +40 -0
- aria_code/packs/logistics/__init__.py +171 -0
- aria_code/packs/payments/__init__.py +139 -0
- aria_code/packs/realty/__init__.py +190 -0
- aria_code/packs/registry.py +202 -0
- aria_code/packs/rules.py +90 -0
- aria_code/plan_utils.py +194 -0
- aria_code/plugin_loader.py +328 -0
- aria_code/portfolio_ledger.py +4 -0
- aria_code/preview_server.py +449 -0
- aria_code/privacy/__init__.py +5 -0
- aria_code/privacy/feedback.py +123 -0
- aria_code/project_review.py +278 -0
- aria_code/project_review_api.py +235 -0
- aria_code/project_review_server.py +18 -0
- aria_code/project_tools.py +4 -0
- aria_code/providers/__init__.py +30 -0
- aria_code/providers/google_video_provider.py +256 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/arthera_gateway.py +90 -0
- aria_code/providers/llm/autoconfig.py +213 -0
- aria_code/providers/llm/base.py +139 -0
- aria_code/providers/llm/custom.py +158 -0
- aria_code/providers/llm/ollama.py +137 -0
- aria_code/providers/llm/openai_compat.py +350 -0
- aria_code/providers/llm/registry.py +457 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +549 -0
- aria_code/providers/ollama_models.py +79 -0
- aria_code/providers/openai_params.py +32 -0
- aria_code/providers/tool_messages.py +100 -0
- aria_code/realty_data_tools.py +4 -0
- aria_code/report_exporters.py +150 -0
- aria_code/report_generator.py +1764 -0
- aria_code/review_service.py +497 -0
- aria_code/runtime/__init__.py +176 -0
- aria_code/runtime/acceptance.py +632 -0
- aria_code/runtime/agent_loop.py +1851 -0
- aria_code/runtime/agent_profiles.py +75 -0
- aria_code/runtime/approval.py +71 -0
- aria_code/runtime/baseline.py +219 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +481 -0
- aria_code/runtime/consult.py +65 -0
- aria_code/runtime/contract.py +282 -0
- aria_code/runtime/delivery.py +432 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +167 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/native_index.py +153 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/processes.py +343 -0
- aria_code/runtime/project_graph.py +614 -0
- aria_code/runtime/repo_map.py +712 -0
- aria_code/runtime/research_bundle.py +105 -0
- aria_code/runtime/review.py +269 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +522 -0
- aria_code/runtime/scoped_runs.py +113 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/semantic_diff.py +171 -0
- aria_code/runtime/subagent.py +721 -0
- aria_code/runtime/symbol_edit.py +117 -0
- aria_code/runtime/task_brief.py +46 -0
- aria_code/runtime/task_context.py +145 -0
- aria_code/runtime/task_ledger.py +108 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/task_outcome.py +33 -0
- aria_code/runtime/task_verification.py +266 -0
- aria_code/runtime/task_worktree.py +448 -0
- aria_code/runtime/tool_executor.py +329 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/transactions.py +216 -0
- aria_code/runtime/windows_job.py +115 -0
- aria_code/runtime/workflows.py +222 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +27 -0
- aria_code/safety/client_isolation.py +178 -0
- aria_code/safety/permissions.py +339 -0
- aria_code/safety/risk.py +699 -0
- aria_code/safety/sandbox.py +148 -0
- aria_code/safety/service.py +102 -0
- aria_code/service_endpoints.py +14 -0
- aria_code/setup_wizard.py +684 -0
- aria_code/spreadsheet_tools.py +4 -0
- aria_code/strategy_vault.py +4 -0
- aria_code/tools/__init__.py +0 -0
- aria_code/tools/artifact_tools.py +252 -0
- aria_code/tools/broker_tools.py +92 -0
- aria_code/tools/build_quant_engine.py +97 -0
- aria_code/tools/code_audit_tools.py +192 -0
- aria_code/tools/computer_use_tools.py +509 -0
- aria_code/tools/data_analysis_tools.py +831 -0
- aria_code/tools/enterprise_finance_tools.py +202 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +880 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3488 -0
- aria_code/tools/logistics_carriers.py +11 -0
- aria_code/tools/logistics_inventory.py +11 -0
- aria_code/tools/logistics_io.py +11 -0
- aria_code/tools/logistics_tenancy.py +11 -0
- aria_code/tools/logistics_tools.py +11 -0
- aria_code/tools/macro_tools.py +412 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +662 -0
- aria_code/tools/spreadsheet_tools.py +399 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/tools/video_tools.py +500 -0
- aria_code/training/__init__.py +1 -0
- aria_code/training/compare.py +117 -0
- aria_code/training/prelude_commands.py +111 -0
- aria_code/training/prelude_eval.py +390 -0
- aria_code/training/prelude_real.py +183 -0
- aria_code/training/prelude_train.py +248 -0
- aria_code/training/sft_dataset.py +230 -0
- aria_code/training/trajectory_dataset.py +263 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +404 -0
- aria_code/ui/completer.py +571 -0
- aria_code/ui/console.py +285 -0
- aria_code/ui/input_box.py +505 -0
- aria_code/ui/mentions.py +206 -0
- aria_code/ui/picker.py +248 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/actions.py +297 -0
- aria_code/ui/render/finance.py +1732 -0
- aria_code/ui/render/market.py +253 -0
- aria_code/ui/render/output.py +954 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +367 -0
- aria_code/ui/robot.py +239 -0
- aria_code/ui/startup_dashboard.py +110 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +518 -0
- aria_code/video_workflow/__init__.py +8 -0
- aria_code/video_workflow/__main__.py +61 -0
- aria_code/video_workflow/engines/__init__.py +18 -0
- aria_code/video_workflow/engines/base.py +69 -0
- aria_code/video_workflow/engines/custom_model.py +204 -0
- aria_code/video_workflow/engines/google_veo.py +94 -0
- aria_code/video_workflow/engines/local_engine.py +71 -0
- aria_code/video_workflow/engines/registry.py +98 -0
- aria_code/video_workflow/google_models.py +278 -0
- aria_code/video_workflow/music/__init__.py +5 -0
- aria_code/video_workflow/music/foley_service.py +132 -0
- aria_code/video_workflow/music/service.py +212 -0
- aria_code/video_workflow/pipeline.py +620 -0
- aria_code/video_workflow/plan.py +202 -0
- aria_code/video_workflow/session.py +297 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +219 -0
- aria_code/workspace/verify.py +167 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.167.0.dist-info/METADATA +330 -0
- aria_code-0.167.0.dist-info/RECORD +601 -0
- aria_code-0.167.0.dist-info/WHEEL +5 -0
- aria_code-0.167.0.dist-info/entry_points.txt +5 -0
- aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.167.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"""google_video_provider.py — Google Cloud Vertex AI & Gemini API Veo Video provider.
|
|
2
|
+
|
|
3
|
+
Generates video clips via Google Cloud Veo 3.1:
|
|
4
|
+
- veo-3.1-fast-generate-001 (default: faster and cheaper per second)
|
|
5
|
+
- veo-3.1-generate-001 (higher quality)
|
|
6
|
+
|
|
7
|
+
Checked against our production project on 2026-09-15: only the Veo 3.1 GA models are
|
|
8
|
+
reachable; veo-3.0-* and veo-2.0-generate-001 return 404. Veo 3.1 accepts
|
|
9
|
+
durations of 4, 6 or 8 seconds and aspect ratios 16:9 / 9:16, is served from a
|
|
10
|
+
region (not "global"), and its long-running operation is read with
|
|
11
|
+
:fetchPredictOperation.
|
|
12
|
+
|
|
13
|
+
Dual authentication:
|
|
14
|
+
1. Google Cloud Vertex AI: Uses ADC (Application Default Credentials) + VERTEX_PROJECT / GOOGLE_CLOUD_PROJECT
|
|
15
|
+
2. Google AI Studio / Gemini API: Uses GEMINI_API_KEY or GOOGLE_API_KEY
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import base64
|
|
21
|
+
import logging
|
|
22
|
+
import os
|
|
23
|
+
import time
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any, Dict, Optional
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
DEFAULT_VEO_MODEL = "veo-3.1-fast-generate-001"
|
|
30
|
+
QUALITY_VEO_MODEL = "veo-3.1-generate-001"
|
|
31
|
+
VEO_DURATIONS = (4, 6, 8)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def veo_duration(seconds: Any) -> int:
|
|
35
|
+
"""The shortest duration Veo 3.1 accepts (4, 6 or 8 s) that covers `seconds`.
|
|
36
|
+
|
|
37
|
+
Rounding up: the edit trims a clip to its beat, but cannot stretch one.
|
|
38
|
+
"""
|
|
39
|
+
try:
|
|
40
|
+
wanted = float(seconds)
|
|
41
|
+
except (TypeError, ValueError):
|
|
42
|
+
wanted = 6.0
|
|
43
|
+
return next((allowed for allowed in VEO_DURATIONS if allowed >= wanted), VEO_DURATIONS[-1])
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def veo_location() -> str:
|
|
47
|
+
"""Veo runs in a region; the chat models' "global" location has no Veo endpoint."""
|
|
48
|
+
location = (os.getenv("VEO_LOCATION") or os.getenv("VERTEX_LOCATION") or "").strip()
|
|
49
|
+
return "us-central1" if not location or location == "global" else location
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _video_bytes(payload: Dict[str, Any]) -> Optional[bytes]:
|
|
53
|
+
"""The first video's bytes from a finished operation, in any of the shapes Veo has used."""
|
|
54
|
+
response = payload.get("response") or {}
|
|
55
|
+
items = response.get("videos") or response.get("predictions") or response.get("generatedSamples") or []
|
|
56
|
+
for item in items:
|
|
57
|
+
encoded = item.get("bytesBase64Encoded") or (item.get("video") or {}).get("bytesBase64Encoded")
|
|
58
|
+
if encoded:
|
|
59
|
+
return base64.b64decode(encoded)
|
|
60
|
+
gcs_uri = item.get("gcsUri") or (item.get("video") or {}).get("uri")
|
|
61
|
+
if gcs_uri and gcs_uri.startswith("gs://"):
|
|
62
|
+
try:
|
|
63
|
+
from google.cloud import storage
|
|
64
|
+
|
|
65
|
+
bucket, _, name = gcs_uri[5:].partition("/")
|
|
66
|
+
return storage.Client().bucket(bucket).blob(name).download_as_bytes()
|
|
67
|
+
except Exception as exc: # noqa: BLE001
|
|
68
|
+
logger.warning(f"[GoogleVideo] Could not read {gcs_uri}: {exc}")
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def has_google_video_config() -> bool:
|
|
73
|
+
"""Return True if Google Cloud Vertex AI or Gemini API is configured for Veo."""
|
|
74
|
+
vertex_project = os.getenv("VERTEX_PROJECT") or os.getenv("GOOGLE_CLOUD_PROJECT", "")
|
|
75
|
+
api_key = os.getenv("GEMINI_API_KEY", "") or os.getenv("GOOGLE_API_KEY", "")
|
|
76
|
+
return bool(vertex_project or api_key)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _get_vertex_token() -> Optional[str]:
|
|
80
|
+
"""Mint access token from Google Cloud ADC."""
|
|
81
|
+
try:
|
|
82
|
+
import google.auth
|
|
83
|
+
from google.auth.transport.requests import Request as GoogleAuthRequest
|
|
84
|
+
|
|
85
|
+
creds, _ = google.auth.default(
|
|
86
|
+
scopes=["https://www.googleapis.com/auth/cloud-platform"]
|
|
87
|
+
)
|
|
88
|
+
creds.refresh(GoogleAuthRequest())
|
|
89
|
+
return creds.token
|
|
90
|
+
except Exception as exc:
|
|
91
|
+
logger.debug(f"[GoogleVideo] ADC token unavailable: {exc}")
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def generate_video_google(
|
|
96
|
+
prompt: str,
|
|
97
|
+
*,
|
|
98
|
+
image_path: Optional[str] = None,
|
|
99
|
+
model: str = DEFAULT_VEO_MODEL,
|
|
100
|
+
aspect_ratio: str = "16:9",
|
|
101
|
+
duration_seconds: int = 5,
|
|
102
|
+
poll_interval: float = 3.0,
|
|
103
|
+
max_wait_seconds: float = 180.0,
|
|
104
|
+
) -> Dict[str, Any]:
|
|
105
|
+
"""Generate video via Google Cloud Veo (text-to-video or image-to-video).
|
|
106
|
+
|
|
107
|
+
Returns {"success": True, "path": str, "model": str, "duration": int, ...} on success.
|
|
108
|
+
"""
|
|
109
|
+
prompt = (prompt or "").strip()
|
|
110
|
+
if not prompt and not image_path:
|
|
111
|
+
return {"success": False, "error": "Prompt or image_path is required for video generation"}
|
|
112
|
+
|
|
113
|
+
if aspect_ratio not in {"16:9", "9:16"}:
|
|
114
|
+
aspect_ratio = "9:16" if aspect_ratio in {"3:4", "4:5", "2:3"} else "16:9"
|
|
115
|
+
|
|
116
|
+
duration_seconds = veo_duration(duration_seconds)
|
|
117
|
+
|
|
118
|
+
vertex_project = os.getenv("VERTEX_PROJECT") or os.getenv("GOOGLE_CLOUD_PROJECT", "")
|
|
119
|
+
api_key = os.getenv("GEMINI_API_KEY", "") or os.getenv("GOOGLE_API_KEY", "")
|
|
120
|
+
|
|
121
|
+
if not vertex_project and not api_key:
|
|
122
|
+
return {
|
|
123
|
+
"success": False,
|
|
124
|
+
"error": "Google Cloud credentials not found (set VERTEX_PROJECT with ADC, or GEMINI_API_KEY/GOOGLE_API_KEY).",
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
instance: Dict[str, Any] = {"prompt": prompt}
|
|
128
|
+
if image_path and Path(image_path).exists():
|
|
129
|
+
try:
|
|
130
|
+
img_bytes = Path(image_path).read_bytes()
|
|
131
|
+
suffix = Path(image_path).suffix.lower()
|
|
132
|
+
mime = "image/png" if suffix == ".png" else "image/webp" if suffix == ".webp" else "image/jpeg"
|
|
133
|
+
instance["image"] = {"bytesBase64Encoded": base64.b64encode(img_bytes).decode("ascii"), "mimeType": mime}
|
|
134
|
+
except Exception as exc:
|
|
135
|
+
logger.warning(f"[GoogleVideo] Failed to read source image {image_path}: {exc}")
|
|
136
|
+
|
|
137
|
+
body = {
|
|
138
|
+
"instances": [instance],
|
|
139
|
+
"parameters": {
|
|
140
|
+
"aspectRatio": aspect_ratio,
|
|
141
|
+
"durationSeconds": duration_seconds,
|
|
142
|
+
"sampleCount": 1,
|
|
143
|
+
# Narration and music are laid over by the edit; Veo's own audio
|
|
144
|
+
# would only be muted, and generating it costs more.
|
|
145
|
+
"generateAudio": False,
|
|
146
|
+
},
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
import requests
|
|
150
|
+
|
|
151
|
+
token = _get_vertex_token() if vertex_project else None
|
|
152
|
+
display_model = f"Google Cloud Veo 3.1 ({model})"
|
|
153
|
+
last_error = ""
|
|
154
|
+
|
|
155
|
+
# 1. Vertex AI long-running prediction, read back with :fetchPredictOperation.
|
|
156
|
+
if token and vertex_project:
|
|
157
|
+
location = veo_location()
|
|
158
|
+
base = f"https://{location}-aiplatform.googleapis.com/v1/projects/{vertex_project}/locations/{location}/publishers/google/models/{model}"
|
|
159
|
+
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
|
|
160
|
+
try:
|
|
161
|
+
resp = requests.post(f"{base}:predictLongRunning", headers=headers, json=body, timeout=30)
|
|
162
|
+
if resp.status_code in (200, 201, 202) and resp.json().get("name"):
|
|
163
|
+
op_name = resp.json()["name"]
|
|
164
|
+
start_time = time.time()
|
|
165
|
+
while time.time() - start_time < max_wait_seconds:
|
|
166
|
+
time.sleep(poll_interval)
|
|
167
|
+
poll = requests.post(f"{base}:fetchPredictOperation", headers=headers, json={"operationName": op_name}, timeout=30)
|
|
168
|
+
if poll.status_code != 200:
|
|
169
|
+
continue
|
|
170
|
+
payload = poll.json()
|
|
171
|
+
if not payload.get("done"):
|
|
172
|
+
continue
|
|
173
|
+
if payload.get("error"):
|
|
174
|
+
last_error = f"Veo operation failed: {payload['error']}"
|
|
175
|
+
break
|
|
176
|
+
video = _video_bytes(payload)
|
|
177
|
+
if video:
|
|
178
|
+
from aria_code.artifacts import create_user_artifact
|
|
179
|
+
|
|
180
|
+
artifact = create_user_artifact("video", "veo", "clip", ".mp4")
|
|
181
|
+
artifact.path.write_bytes(video)
|
|
182
|
+
return {
|
|
183
|
+
"success": True,
|
|
184
|
+
"path": str(artifact.path),
|
|
185
|
+
"model": display_model,
|
|
186
|
+
"model_id": model,
|
|
187
|
+
"provider": "Google Cloud Vertex AI",
|
|
188
|
+
"duration": duration_seconds,
|
|
189
|
+
"aspect_ratio": aspect_ratio,
|
|
190
|
+
}
|
|
191
|
+
filtered = (payload.get("response") or {}).get("raiMediaFilteredReasons")
|
|
192
|
+
last_error = f"Veo returned no video{f' (filtered: {filtered})' if filtered else ''}."
|
|
193
|
+
break
|
|
194
|
+
else:
|
|
195
|
+
last_error = f"Veo did not finish within {int(max_wait_seconds)} s."
|
|
196
|
+
else:
|
|
197
|
+
last_error = f"Vertex AI HTTP {resp.status_code}: {resp.text[:300]}"
|
|
198
|
+
except Exception as exc:
|
|
199
|
+
last_error = str(exc)
|
|
200
|
+
|
|
201
|
+
# 2. Try Gemini API if API key configured
|
|
202
|
+
if api_key:
|
|
203
|
+
gemini_endpoint = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:predictLongRunning"
|
|
204
|
+
try:
|
|
205
|
+
resp = requests.post(
|
|
206
|
+
gemini_endpoint,
|
|
207
|
+
headers={"x-goog-api-key": api_key, "Content-Type": "application/json"},
|
|
208
|
+
json=body,
|
|
209
|
+
timeout=30,
|
|
210
|
+
)
|
|
211
|
+
if resp.status_code in (200, 201, 202):
|
|
212
|
+
op_data = resp.json()
|
|
213
|
+
op_name = op_data.get("name")
|
|
214
|
+
if op_name:
|
|
215
|
+
poll_url = f"https://generativelanguage.googleapis.com/v1beta/{op_name}"
|
|
216
|
+
start_time = time.time()
|
|
217
|
+
while time.time() - start_time < max_wait_seconds:
|
|
218
|
+
time.sleep(poll_interval)
|
|
219
|
+
poll_resp = requests.get(
|
|
220
|
+
poll_url,
|
|
221
|
+
headers={"x-goog-api-key": api_key},
|
|
222
|
+
timeout=20,
|
|
223
|
+
)
|
|
224
|
+
if poll_resp.status_code == 200:
|
|
225
|
+
p_json = poll_resp.json()
|
|
226
|
+
if p_json.get("done"):
|
|
227
|
+
if "error" in p_json:
|
|
228
|
+
last_error = f"Gemini Veo error: {p_json['error']}"
|
|
229
|
+
break
|
|
230
|
+
response_payload = p_json.get("response", {})
|
|
231
|
+
predictions = response_payload.get("predictions") or response_payload.get("generatedSamples") or []
|
|
232
|
+
if predictions:
|
|
233
|
+
item = predictions[0]
|
|
234
|
+
video_b64 = item.get("bytesBase64Encoded") or (item.get("video", {})).get("bytesBase64Encoded")
|
|
235
|
+
if video_b64:
|
|
236
|
+
from aria_code.artifacts import create_user_artifact
|
|
237
|
+
artifact = create_user_artifact("video", "veo", "clip", ".mp4")
|
|
238
|
+
artifact.path.write_bytes(base64.b64decode(video_b64))
|
|
239
|
+
return {
|
|
240
|
+
"success": True,
|
|
241
|
+
"path": str(artifact.path),
|
|
242
|
+
"model": f"Gemini API {model}",
|
|
243
|
+
"provider": "Google Gemini API",
|
|
244
|
+
"duration": duration_seconds,
|
|
245
|
+
"aspect_ratio": aspect_ratio,
|
|
246
|
+
}
|
|
247
|
+
break
|
|
248
|
+
else:
|
|
249
|
+
last_error = f"Gemini API HTTP {resp.status_code}: {resp.text[:300]}"
|
|
250
|
+
except Exception as exc:
|
|
251
|
+
last_error = str(exc)
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
"success": False,
|
|
255
|
+
"error": f"Google Veo video generation unavailable: {last_error or 'No response from API'}",
|
|
256
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from .base import BaseLLMProvider, Message, ProviderConfig
|
|
2
|
+
from .ollama import OllamaProvider
|
|
3
|
+
from .openai_compat import (
|
|
4
|
+
DeepSeekProvider, OpenAIProvider, GroqProvider,
|
|
5
|
+
TogetherProvider, DashScopeProvider, LMStudioProvider,
|
|
6
|
+
SiliconFlowProvider, MoonshotProvider, ZhiPuProvider,
|
|
7
|
+
)
|
|
8
|
+
from .anthropic import AnthropicProvider
|
|
9
|
+
from .registry import get_provider, list_available_providers, stream_cloud_fallback, register_provider
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"BaseLLMProvider", "Message", "ProviderConfig",
|
|
13
|
+
"OllamaProvider", "DeepSeekProvider", "OpenAIProvider",
|
|
14
|
+
"AnthropicProvider", "GroqProvider", "TogetherProvider",
|
|
15
|
+
"DashScopeProvider", "LMStudioProvider",
|
|
16
|
+
"SiliconFlowProvider", "MoonshotProvider", "ZhiPuProvider",
|
|
17
|
+
"get_provider", "list_available_providers",
|
|
18
|
+
"stream_cloud_fallback", "register_provider",
|
|
19
|
+
]
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""
|
|
2
|
+
providers/llm/anthropic.py — Anthropic Claude Provider
|
|
3
|
+
=======================================================
|
|
4
|
+
支持 claude-3-5-sonnet / claude-3-haiku / claude-3-opus 等。
|
|
5
|
+
支持流式 thinking(扩展思考模式)。
|
|
6
|
+
|
|
7
|
+
需要设置: ANTHROPIC_API_KEY=sk-ant-...
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import logging
|
|
14
|
+
import os
|
|
15
|
+
from typing import Any, AsyncIterator, Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
from .base import BaseLLMProvider, Message, ProviderConfig
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
_ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages"
|
|
22
|
+
_ANTHROPIC_VERSION = "2023-06-01"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AnthropicProvider(BaseLLMProvider):
|
|
26
|
+
|
|
27
|
+
provider_name = "anthropic"
|
|
28
|
+
supports_tools = True
|
|
29
|
+
supports_thinking = True # claude-3-5-sonnet 支持 extended thinking
|
|
30
|
+
local = False
|
|
31
|
+
|
|
32
|
+
DEFAULT_MODEL = "claude-3-5-haiku-latest"
|
|
33
|
+
|
|
34
|
+
def __init__(self, config: ProviderConfig):
|
|
35
|
+
super().__init__(config)
|
|
36
|
+
self.api_key = config.api_key or os.getenv("ANTHROPIC_API_KEY", "")
|
|
37
|
+
self.model = config.model or self.DEFAULT_MODEL
|
|
38
|
+
|
|
39
|
+
async def is_available(self) -> bool:
|
|
40
|
+
return bool(self.api_key)
|
|
41
|
+
|
|
42
|
+
# Minimum system-prompt length (chars) to bother caching.
|
|
43
|
+
# Prompts shorter than this don't benefit from prompt caching.
|
|
44
|
+
_CACHE_MIN_CHARS = 1024
|
|
45
|
+
|
|
46
|
+
def _build_cached_system(self, system_text: str) -> list:
|
|
47
|
+
"""
|
|
48
|
+
Wrap a long system prompt in a cache_control block so Anthropic
|
|
49
|
+
caches it across calls. Returns the `system` field value (a list
|
|
50
|
+
of content blocks, or a plain string for short prompts).
|
|
51
|
+
|
|
52
|
+
Anthropic prompt caching docs:
|
|
53
|
+
https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
|
|
54
|
+
"""
|
|
55
|
+
if len(system_text) < self._CACHE_MIN_CHARS:
|
|
56
|
+
return system_text # type: ignore[return-value]
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
"type": "text",
|
|
60
|
+
"text": system_text,
|
|
61
|
+
"cache_control": {"type": "ephemeral"},
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
async def stream(
|
|
66
|
+
self,
|
|
67
|
+
messages: List[Message],
|
|
68
|
+
tools: Optional[List[Dict]] = None,
|
|
69
|
+
temperature: Optional[float] = None,
|
|
70
|
+
max_tokens: Optional[int] = None,
|
|
71
|
+
cancel_event=None,
|
|
72
|
+
) -> AsyncIterator[Dict[str, Any]]:
|
|
73
|
+
import aiohttp
|
|
74
|
+
|
|
75
|
+
temp = temperature if temperature is not None else self.config.temperature
|
|
76
|
+
n_tokens = max_tokens if max_tokens is not None else self.config.max_tokens
|
|
77
|
+
|
|
78
|
+
# Anthropic 格式:system 单独提取
|
|
79
|
+
system_parts = [m.content for m in messages if m.role == "system"]
|
|
80
|
+
system_text = "\n\n".join(system_parts) if system_parts else None
|
|
81
|
+
anthro_msgs = [
|
|
82
|
+
{"role": m.role, "content": m.content}
|
|
83
|
+
for m in messages if m.role != "system"
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
payload: Dict[str, Any] = {
|
|
87
|
+
"model": self.model,
|
|
88
|
+
"max_tokens": n_tokens,
|
|
89
|
+
"messages": anthro_msgs,
|
|
90
|
+
"stream": True,
|
|
91
|
+
}
|
|
92
|
+
if system_text:
|
|
93
|
+
# Use prompt caching for long system prompts to reduce TTFT and cost
|
|
94
|
+
payload["system"] = self._build_cached_system(system_text)
|
|
95
|
+
if temp > 0:
|
|
96
|
+
payload["temperature"] = temp
|
|
97
|
+
if tools:
|
|
98
|
+
payload["tools"] = [
|
|
99
|
+
{
|
|
100
|
+
"name": t.get("name"),
|
|
101
|
+
"description": t.get("description", ""),
|
|
102
|
+
"input_schema": t.get("parameters", {"type": "object", "properties": {}}),
|
|
103
|
+
}
|
|
104
|
+
for t in tools
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
headers = {
|
|
108
|
+
"x-api-key": self.api_key,
|
|
109
|
+
"anthropic-version": _ANTHROPIC_VERSION,
|
|
110
|
+
"anthropic-beta": "prompt-caching-2024-07-31",
|
|
111
|
+
"content-type": "application/json",
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
proxy = (os.getenv("HTTPS_PROXY") or os.getenv("https_proxy")
|
|
115
|
+
or os.getenv("HTTP_PROXY") or os.getenv("http_proxy"))
|
|
116
|
+
try:
|
|
117
|
+
async with aiohttp.ClientSession(trust_env=True) as sess:
|
|
118
|
+
async with sess.post(
|
|
119
|
+
_ANTHROPIC_API_URL, json=payload, headers=headers,
|
|
120
|
+
proxy=proxy,
|
|
121
|
+
timeout=aiohttp.ClientTimeout(total=self.config.timeout)
|
|
122
|
+
) as resp:
|
|
123
|
+
if resp.status != 200:
|
|
124
|
+
body = await resp.text()
|
|
125
|
+
yield {"type": "error",
|
|
126
|
+
"message": f"Anthropic HTTP {resp.status}: {body[:300]}"}
|
|
127
|
+
return
|
|
128
|
+
|
|
129
|
+
_pending_tool_name = ""
|
|
130
|
+
_pending_tool_args = ""
|
|
131
|
+
|
|
132
|
+
async for raw in resp.content:
|
|
133
|
+
if cancel_event and cancel_event.is_set():
|
|
134
|
+
return
|
|
135
|
+
line = raw.decode("utf-8", errors="ignore").strip()
|
|
136
|
+
if not line or not line.startswith("data:"):
|
|
137
|
+
continue
|
|
138
|
+
|
|
139
|
+
try:
|
|
140
|
+
data = json.loads(line[5:].strip())
|
|
141
|
+
except json.JSONDecodeError:
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
etype = data.get("type", "")
|
|
145
|
+
|
|
146
|
+
# 思考 token(扩展思考模式)
|
|
147
|
+
if etype == "content_block_start":
|
|
148
|
+
cb = data.get("content_block", {})
|
|
149
|
+
if cb.get("type") == "thinking":
|
|
150
|
+
yield {"type": "thinking", "text": cb.get("thinking", "")}
|
|
151
|
+
elif cb.get("type") == "tool_use":
|
|
152
|
+
_pending_tool_name = cb.get("name", "")
|
|
153
|
+
_pending_tool_args = ""
|
|
154
|
+
|
|
155
|
+
elif etype == "content_block_delta":
|
|
156
|
+
delta = data.get("delta", {})
|
|
157
|
+
dt = delta.get("type", "")
|
|
158
|
+
if dt == "text_delta":
|
|
159
|
+
yield {"type": "token", "text": delta.get("text", "")}
|
|
160
|
+
elif dt == "thinking_delta":
|
|
161
|
+
yield {"type": "thinking", "text": delta.get("thinking", "")}
|
|
162
|
+
elif dt == "input_json_delta":
|
|
163
|
+
_pending_tool_args += delta.get("partial_json", "")
|
|
164
|
+
|
|
165
|
+
elif etype == "content_block_stop":
|
|
166
|
+
if _pending_tool_name:
|
|
167
|
+
try:
|
|
168
|
+
args = json.loads(_pending_tool_args)
|
|
169
|
+
except Exception:
|
|
170
|
+
args = {"_raw": _pending_tool_args}
|
|
171
|
+
yield {"type": "tool_call",
|
|
172
|
+
"name": _pending_tool_name,
|
|
173
|
+
"arguments": args}
|
|
174
|
+
_pending_tool_name = ""
|
|
175
|
+
_pending_tool_args = ""
|
|
176
|
+
|
|
177
|
+
elif etype == "message_stop":
|
|
178
|
+
yield {"type": "done"}
|
|
179
|
+
return
|
|
180
|
+
|
|
181
|
+
except aiohttp.ClientConnectorError as e:
|
|
182
|
+
yield {"type": "error", "message": f"Anthropic 连接失败: {e}"}
|
|
183
|
+
except Exception as e:
|
|
184
|
+
yield {"type": "error", "message": f"Anthropic 错误: {e}"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Google models through the Arthera gateway, using the session you signed in with.
|
|
2
|
+
|
|
3
|
+
`/login` gave you an identity and nothing else: to reach a Google model you
|
|
4
|
+
still needed a Gemini API key from AI Studio, or gcloud and a billed Google
|
|
5
|
+
Cloud project of your own. That is setup this product exists to spare people,
|
|
6
|
+
and every layer of it is a place to get stuck — a missing dependency, gcloud
|
|
7
|
+
not on PATH, a suspended billing account.
|
|
8
|
+
|
|
9
|
+
The server holds a project and a service account with access to Vertex, and
|
|
10
|
+
exposes it in the OpenAI shape. So this provider is the ordinary
|
|
11
|
+
OpenAI-compatible one pointed at that endpoint, authorised with the Firebase
|
|
12
|
+
token `/login` already stored. There is nothing for the user to configure.
|
|
13
|
+
|
|
14
|
+
The token is read at call time rather than captured once, because it lasts an
|
|
15
|
+
hour and `/login` refreshes it in the same config file.
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import logging
|
|
21
|
+
import os
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from typing import Optional
|
|
24
|
+
|
|
25
|
+
from .base import ProviderConfig
|
|
26
|
+
from .openai_compat import OpenAICompatProvider
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
DEFAULT_API_URL = "https://api.arthera.xyz"
|
|
31
|
+
DEFAULT_MODEL = "google/gemini-3.8-flash"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _config_path() -> Path:
|
|
35
|
+
"""Where /login saved the session: the same file, by the same rule.
|
|
36
|
+
|
|
37
|
+
This used to be ~/.arthera/config.json, or ARIA_CONFIG_DIR. /login writes
|
|
38
|
+
through aria_home(), which is ~/.arthera only when that legacy folder
|
|
39
|
+
already exists and ~/.aria-code otherwise, and is overridden by ARIA_HOME.
|
|
40
|
+
So on a new install — the people signing in to reach a model without a
|
|
41
|
+
key — the session was saved in one folder and looked for in another, and
|
|
42
|
+
signing in never gave them a model. Asking aria_home() is what the 38
|
|
43
|
+
files that once hardcoded ~/.arthera were moved over to for this reason.
|
|
44
|
+
"""
|
|
45
|
+
from aria_code.packages.aria_core.paths import aria_home
|
|
46
|
+
|
|
47
|
+
return aria_home() / "config.json"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def session_token() -> Optional[str]:
|
|
51
|
+
"""The Firebase token `/login` stored, or None when signed out."""
|
|
52
|
+
try:
|
|
53
|
+
config = json.loads(_config_path().read_text(encoding="utf-8"))
|
|
54
|
+
except (OSError, ValueError):
|
|
55
|
+
return None
|
|
56
|
+
from aria_code.account_session import account_id, get_account_token
|
|
57
|
+
if account_id(config):
|
|
58
|
+
return get_account_token(config)
|
|
59
|
+
from aria_code.apps.cli.session_refresh import refresh_config_file
|
|
60
|
+
return refresh_config_file(_config_path())
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def gateway_base_url() -> str:
|
|
64
|
+
"""Where the gateway lives. Overridable for staging and self-hosting."""
|
|
65
|
+
api = os.getenv("ARIA_API_URL", "").strip() or DEFAULT_API_URL
|
|
66
|
+
from aria_code.service_endpoints import current_url
|
|
67
|
+
return f"{current_url(api)}/api/v2/llm/v1"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ArtheraGatewayProvider(OpenAICompatProvider):
|
|
71
|
+
"""Google models billed to the Arthera project, for a signed-in user."""
|
|
72
|
+
|
|
73
|
+
provider_name = "arthera"
|
|
74
|
+
DEFAULT_BASE_URL = "" # resolved per instance; it is deployment state
|
|
75
|
+
DEFAULT_MODEL = DEFAULT_MODEL
|
|
76
|
+
|
|
77
|
+
def __init__(self, config: ProviderConfig):
|
|
78
|
+
if not config.base_url:
|
|
79
|
+
config.base_url = gateway_base_url()
|
|
80
|
+
# The bearer is the session, not a key the user pasted. Reading it
|
|
81
|
+
# here keeps a signed-out user from presenting an empty credential
|
|
82
|
+
# and getting a 401 they cannot act on.
|
|
83
|
+
if not config.api_key:
|
|
84
|
+
config.api_key = session_token() or ""
|
|
85
|
+
super().__init__(config)
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def available() -> bool:
|
|
89
|
+
"""True when there is a session to authorise calls with."""
|
|
90
|
+
return bool(session_token())
|