From 566da9ea879578189c4dd6ffc2b237a345b2a684 Mon Sep 17 00:00:00 2001 From: Alessio Colombo Date: Fri, 4 Sep 2026 14:35:22 +0200 Subject: [PATCH 1/2] fix: cleaning repo and remove old and unused scripts --- .env.example | 1691 +++++++++-------- .gitignore | 3 - AGENTS.md | 6 - CLAUDE.md | 7 +- admin-ui/README.md | 5 +- admin-ui/app/agent-db/[userId]/page.tsx | 403 ---- admin-ui/app/agent-db/page.tsx | 154 -- admin-ui/app/approvals/page.tsx | 49 - admin-ui/app/hub/page.tsx | 124 +- admin-ui/app/metrics/page.tsx | 910 ++++++++- admin-ui/app/plugins/page.tsx | 124 -- admin-ui/app/profile-memory/page.tsx | 479 ----- admin-ui/app/profiles/page.tsx | 2 +- admin-ui/app/settings/page.tsx | 45 + admin-ui/components/AppShell.tsx | 7 - .../components/CredentialSchemaEditor.tsx | 35 +- admin-ui/lib/mcpIntegrationPolicy.ts | 32 +- chat-ui/README.md | 44 +- chat-ui/app/api/agent-db-embed/route.ts | 34 - .../components/chat/AgentModeSelectChip.tsx | 11 +- chat-ui/components/chat/ChatWorkspace.tsx | 9 +- chat-ui/components/chat/WebSearchChip.tsx | 84 - chat-ui/components/layout/ChatHeader.tsx | 2 +- .../NavigationMemoryPanel.tsx | 601 ------ chat-ui/components/ui/logo.js | 83 - chat-ui/components/ui/logo.tsx | 124 ++ chat-ui/lib/api/navigation-memory.ts | 174 -- chat-ui/lib/api/plan-execution.ts | 2 +- chat-ui/lib/i18n/locales/de.json | 12 +- chat-ui/lib/i18n/locales/en.json | 4 +- chat-ui/lib/i18n/locales/es.json | 10 +- chat-ui/lib/i18n/locales/fr.json | 10 +- chat-ui/lib/i18n/locales/it.json | 8 +- chat-ui/lib/merge-chat-history.test.ts | 50 - chat-ui/lib/plan-execution-view.test.ts | 128 -- chat-ui/lib/sse/coalesceTurnSegments.test.ts | 37 - chat-ui/lib/sse/planDisplay.test.ts | 59 - chat-ui/lib/sse/reducer.ts | 15 +- chat-ui/lib/sse/webToolParse.test.ts | 91 - chat-ui/lib/sse/webToolParse.ts | 2 +- chat-ui/public/file.svg | 1 - chat-ui/public/globe.svg | 1 - chat-ui/public/images/logo_aion_white.svg | 1 - chat-ui/public/logo.svg | 3 - chat-ui/public/next.svg | 1 - chat-ui/public/vercel.svg | 1 - chat-ui/public/window.svg | 1 - config_std/fs_policy.dev.yaml | 3 - config_std/fs_policy.example.yaml | 3 - config_std/mcp_registry.yaml | 20 +- config_std/profiles/aion_std.yaml | 7 +- config_std/profiles/coding_workspace.yaml | 2 +- config_std/profiles/data_agent.yaml | 9 +- config_std/profiles/generic_assistant.yaml | 2 +- config_std/profiles/infra_sre.yaml | 2 +- .../profiles/mcp_integration_advisor.yaml | 2 +- .../profiles/mysql_metadata_assistant.yaml | 2 +- config_std/profiles/orchestrator.yaml | 2 +- .../profiles/postgres_metadata_assistant.yaml | 15 +- config_std/profiles/research_docs.yaml | 2 +- config_std/skills/agent_db_ingestion.md | 15 - config_std/skills/agent_db_protocol.md | 37 - config_std/skills/agent_db_schema_design.md | 14 - .../skills/agent_db_workflow_accounting.md | 39 - .../skills/datasource_memory_protocol.md | 2 +- config_std/skills/db_navigation_map.md | 2 +- config_std/skills/ltm_extraction.md | 104 +- .../skills/sql_query_memory_protocol.md | 2 +- config_std/skills/wren.md | 64 - docker-compose.yml | 32 +- docker/Dockerfile.backend | 3 +- docker/Dockerfile.pi-worker | 26 - .../aion-vs-longrun-assessment.md | 450 +---- docs/architecture/context-offloading.md | 7 +- docs/architecture/long-run-pi-mode.md | 82 +- docs/architecture/observability.md | 79 + docs/clients/admin-ui.md | 30 +- docs/clients/chat-ui.md | 2 +- docs/configuration/environment.md | 3 - .../filesystem-policy-and-promo.md | 4 +- docs/configuration/soul-memory-user.md | 13 +- docs/memory/structured-memory.md | 118 +- docs/security/identity-and-chat-auth.md | 9 +- eval_test/eval_results.json | 49 - eval_test/evaluate_profile.py | 503 ----- mcp_servers_std/agent_db/__init__.py | 0 mcp_servers_std/agent_db/db_manager.py | 108 -- mcp_servers_std/agent_db/export_engine.py | 36 - .../agent_db/ingestion/__init__.py | 0 .../agent_db/ingestion/auto_schema.py | 77 - .../agent_db/ingestion/csv_ingestor.py | 11 - .../agent_db/ingestion/json_ingestor.py | 14 - .../agent_db/ingestion/normalizers.py | 88 - .../agent_db/ingestion/xlsx_ingestor.py | 36 - mcp_servers_std/agent_db/ltm_notifier.py | 56 - mcp_servers_std/agent_db/ltm_sync.py | 50 - mcp_servers_std/agent_db/query_engine.py | 80 - mcp_servers_std/agent_db/safety.py | 88 - mcp_servers_std/agent_db/schema_registry.py | 146 -- mcp_servers_std/agent_db/server.py | 1074 ----------- mcp_servers_std/agent_db/type_mapper.py | 26 - mcp_servers_std/memory/mem0_server.py | 71 - mcp_servers_std/orchestration/server.py | 2 +- mcp_servers_std/query_memory/server.py | 7 +- pnpm-workspace.yaml | 1 - requirements.txt | 2 - scripts/agent_db_acceptance_check.py | 94 - scripts/apply_optimal_aion_env.py | 5 +- scripts/debug/debug_agent_prompt.py | 38 - scripts/dev-api.sh | 2 +- scripts/env_tuning_profiles.py | 4 +- scripts/generate-env-docs.py | 1 - scripts/generate_test_excel.py | 45 - scripts/i18n_agent_strings_en.py | 53 - scripts/init_unified_db.py | 2 +- .../backfill_message_timelines.py | 0 .../cleanup_resume_role_leakage.py | 0 .../migrate_alibr_project_memory.py | 2 +- .../migrate_email_credential_keys.py | 0 .../{ => migration}/migrate_fs_to_storage.py | 0 .../migrate_mempalace_to_mnemos_env.py | 6 +- scripts/{ => migration}/migrate_to_aion_db.py | 0 scripts/{ => migration}/migrate_v3.py | 0 scripts/{ => migration}/migrate_v3_eval.py | 0 .../patch_sql_query_memory_config.py | 1 - scripts/{ => migration}/unify_memory.py | 1 - scripts/prepare-oss-release.sh | 36 - scripts/reconcile_runtime_from_std.sh | 31 - scripts/runtime_extras_setup.py | 56 - scripts/seed_agent_db.py | 106 -- scripts/seed_agent_db_approvals.py | 84 - scripts/setup_aion_env.py | 102 +- scripts/setup_core.py | 14 - scripts/sync_local_skill_packages_to_std.py | 1 - scripts/sync_proprietary_config.py | 1 - scripts/test_aion_chat_sse.py | 136 -- scripts/test_aion_chat_sse.sh | 15 - scripts/upgrade_core.py | 79 +- .../pi-long-run/extensions/aion-bridge.ts | 105 - .../pi-long-run/extensions/aion-compaction.ts | 73 - .../pi-long-run/extensions/aion-ledger.ts | 45 - services/pi-long-run/package.json | 25 - services/pi-long-run/src/event-mapper.ts | 199 -- services/pi-long-run/src/server.ts | 156 -- services/pi-long-run/src/session-factory.ts | 150 -- services/pi-long-run/src/stream-sanitize.ts | 34 - services/pi-long-run/test/aion-bridge.test.ts | 85 - .../pi-long-run/test/aion-compaction.test.ts | 103 - .../pi-long-run/test/event-mapper.test.ts | 115 -- .../pi-long-run/test/session-factory.test.ts | 92 - .../pi-long-run/test/stream-sanitize.test.ts | 36 - services/pi-long-run/tsconfig.json | 14 - src/agent_pipeline.py | 49 +- src/agent_profile.py | 8 +- src/aion_env.py | 6 +- src/api/a2a_server.py | 1 - src/api/admin.py | 33 +- src/api/admin_agent_db.py | 906 --------- src/api/admin_profile_memory.py | 95 +- src/api/agent_db_internal.py | 65 - src/api/auth/api_key.py | 4 - src/api/auth/dependencies.py | 2 +- src/api/auth_login.py | 2 +- src/api/cron_admin.py | 2 - src/api/history.py | 2 - src/api/internal/__init__.py | 6 +- src/api/internal/pi_tools.py | 143 -- src/api/ltm_admin.py | 3 +- src/api/main.py | 25 +- src/api/metrics_api.py | 411 +++- src/api/orchestration.py | 1 - src/api/plan_execution.py | 2 - src/api/research.py | 1 - src/api/settings_api.py | 23 + src/api/v1/chat.py | 26 - src/api/v1/files.py | 1 - src/api/v1/mcp_integrations.py | 2 +- src/api/v1/steps.py | 1 - src/benchmarks/general_agent.py | 3 +- src/benchmarks/run_log.py | 2 +- src/chart_payload.py | 2 +- src/chat_auth.py | 19 +- src/chat_memory.py | 1 - src/config.py | 2 +- src/eval/judge.py | 1 - src/gateway/plane/main.py | 2 +- src/init_db.py | 80 - src/init_unified_db.py | 1 - src/learning/dedup.py | 3 +- src/main.py | 43 +- src/mcp_credential_discovery.py | 2 +- src/mcp_manager.py | 13 +- src/mcp_registry_io.py | 2 +- src/mcp_registry_normalize.py | 3 +- src/mcp_remote_install.py | 1 - src/memory/__init__.py | 2 +- src/memory/llm_extract.py | 2 +- src/memory/ltm_orchestrator.py | 8 +- src/memory/mnemos/backfill_embeddings.py | 1 - src/memory/mnemos/compress.py | 2 +- src/memory/mnemos/orchestrator.py | 7 +- src/memory/mnemos/zoom.py | 2 +- src/memory/project_memory_service.py | 1 - src/memory/sql_query_memory/models.py | 2 +- src/memory/sql_query_memory/service.py | 4 +- src/memory/user_memory_service.py | 1 - src/observability/hooks_emitter.py | 8 +- src/observability/logging.py | 1 - src/observability/opik_telemetry.py | 2 +- src/observability/otel_setup.py | 1 - src/optimizer/objective.py | 1 - src/profiling/bottleneck.py | 6 +- src/query_memory.py | 6 +- src/runtime/a2a_client.py | 1 - src/runtime/agent_mode_resolve.py | 12 - src/runtime/aion_agent.py | 2 - src/runtime/apply_patch/apply.py | 2 - src/runtime/compaction/cut_point.py | 4 +- src/runtime/compaction/policy.py | 2 +- src/runtime/context_builder.py | 4 - src/runtime/context_recovery.py | 1 - src/runtime/cron_db.py | 2 +- src/runtime/cron_runner.py | 2 +- src/runtime/datasource_memory_mode.py | 58 +- src/runtime/datasource_turn_reminders.py | 4 +- src/runtime/doom_loop.py | 2 +- src/runtime/env_sync.py | 2 +- src/runtime/exploration_tracker.py | 5 +- src/runtime/llm_adapter.py | 36 +- src/runtime/llm_call_audit.py | 1 - src/runtime/llm_health.py | 2 +- src/runtime/llm_limits.py | 58 +- src/runtime/long_run_mode.py | 92 - src/runtime/mcp_integration_helpers.py | 1 - src/runtime/mcp_integration_integrity.py | 1 - src/runtime/messages/adapters.py | 2 +- src/runtime/messages/types.py | 2 +- src/runtime/native_tools/loader.py | 2 +- src/runtime/native_tools/research_tools.py | 1 - src/runtime/orchestration_tools.py | 3 - src/runtime/pi_runtime/__init__.py | 6 - src/runtime/pi_runtime/pi_client.py | 122 -- src/runtime/pi_runtime/pi_compaction.py | 127 -- src/runtime/pi_runtime/pi_turn_runner.py | 426 ----- src/runtime/pi_runtime/session_config.py | 235 --- src/runtime/pi_runtime/skill_sync.py | 53 - src/runtime/pi_runtime/tool_invoke.py | 211 -- src/runtime/pi_runtime/tool_manifest.py | 168 -- src/runtime/plan_coercion.py | 2 +- src/runtime/plugin_loader.py | 3 +- src/runtime/profile_schema.py | 2 - src/runtime/prompt_budget.py | 4 +- src/runtime/query_memory_hooks.py | 6 +- src/runtime/redis_client.py | 3 +- src/runtime/session_cleanup.py | 167 ++ src/runtime/skill_discovery_nudge.py | 5 +- src/runtime/skill_profile_gate.py | 2 +- src/runtime/sql_query_memory_context.py | 11 +- src/runtime/sql_query_memory_gate.py | 3 +- src/runtime/sql_query_memory_tools.py | 1 - src/runtime/stream/demux.py | 2 +- src/runtime/stream/loop.py | 16 - src/runtime/subagent_orchestrator.py | 4 +- src/runtime/system_prompt.py | 1 - src/runtime/timeline_reconstruct.py | 2 +- src/runtime/tool_circuit.py | 6 +- src/runtime/tool_ledger.py | 1 - src/runtime/turn/event_log.py | 2 +- src/runtime/turn/turn_context.py | 3 +- src/runtime/turn_budget.py | 18 - src/runtime/turn_compaction.py | 2 +- src/runtime/wizard_generator.py | 12 +- src/security/checker.py | 2 +- src/security/session_confinement.py | 2 +- src/security/session_env.py | 17 +- src/security/trust_manager.py | 3 - src/settings.py | 24 +- src/storage/backend.py | 1 - .../integration/test_chat_sse_fake_llm.py | 6 +- src/test/integration/test_long_run_sse.py | 23 - src/test/test_agent_mode_resolve.py | 14 - src/test/test_agent_modes.py | 2 - .../test_agent_profile_critical_skills.py | 6 +- src/test/test_api_endpoints.py | 1 - src/test/test_artifact_manager.py | 1 - src/test/test_builtin_orchestration_tools.py | 2 +- src/test/test_chart_payload.py | 5 - src/test/test_chat_ui_history_contract.py | 1 - src/test/test_compaction_policy.py | 1 - src/test/test_context_breakdown.py | 1 - src/test/test_cors_config.py | 2 - src/test/test_current_date_context.py | 1 - src/test/test_data_root.py | 2 - .../test_datasource_memory_mode_prompt.py | 19 +- .../test_datasource_memory_orchestrator.py | 4 +- ...t_datasource_protocol_persist_mandatory.py | 10 +- src/test/test_doc_auto_ingest.py | 4 +- src/test/test_draft_execution_plan.py | 2 - src/test/test_env_sync.py | 1 - src/test/test_exploration_tracker_reminder.py | 2 +- src/test/test_full_prompt_audit.py | 8 +- src/test/test_llm_limits.py | 66 +- src/test/test_lme_v2_fts.py | 3 - src/test/test_lme_v2_smoke.py | 1 - src/test/test_long_run_mode.py | 22 - src/test/test_mcp_config_import.py | 4 +- src/test/test_mcp_integration_pipeline.py | 1 - src/test/test_mcp_oauth_callback.py | 1 - src/test/test_mcp_oauth_refresh.py | 1 - src/test/test_mcp_oauth_start.py | 2 - src/test/test_mcp_registry_normalize.py | 1 - src/test/test_mcp_stdio_args.py | 1 - src/test/test_mcp_tool_result_exec.py | 2 +- src/test/test_mcp_user_pool.py | 15 - src/test/test_mcp_warm_fastpath.py | 6 +- src/test/test_mnemos_bench.py | 12 +- src/test/test_mnemos_dataset.py | 2 +- src/test/test_mnemos_fts.py | 28 +- src/test/test_mnemos_hybrid_recall.py | 4 +- src/test/test_mnemos_known_gaps.py | 4 +- src/test/test_mnemos_store.py | 8 +- src/test/test_mysql_profile_index_prompt.py | 1 - src/test/test_native_web_tool_events.py | 1 - src/test/test_observability.py | 97 +- src/test/test_orchestration_auth.py | 1 - src/test/test_p2_skills.py | 1 - src/test/test_pdf_evidence.py | 1 - src/test/test_pi_compaction.py | 54 - src/test/test_pi_history_hydrate.py | 33 - src/test/test_pi_session_config.py | 54 - src/test/test_pi_tool_circuit.py | 2 +- src/test/test_pi_tool_invoke.py | 26 - src/test/test_pi_tool_manifest.py | 95 - src/test/test_pi_tools_api.py | 10 - src/test/test_plan_execution_loop.py | 2 +- src/test/test_plan_mode_fixes.py | 2 - src/test/test_plane_gateway.py | 1 - src/test/test_pptxgenjs_lint.py | 1 - src/test/test_profile_overlay.py | 1 - src/test/test_profiles_mnemos.py | 1 + src/test/test_run_preflight.py | 1 - src/test/test_sandbox_run_node_file.py | 2 - src/test/test_session_cleanup.py | 143 ++ src/test/test_session_content_roots.py | 1 - src/test/test_session_exec_policy.py | 23 +- src/test/test_session_exec_python_venv.py | 1 - src/test/test_session_exec_wren_env.py | 51 - src/test/test_session_venv_bootstrap.py | 1 - src/test/test_session_venv_defaults.py | 1 - src/test/test_settings.py | 5 +- src/test/test_setup_podman_sandbox.py | 2 - src/test/test_skill_profile_gate_inprocess.py | 2 +- src/test/test_skills_hub_write.py | 2 - src/test/test_sql_query_memory_gate.py | 8 +- src/test/test_sse_artifacts.py | 1 - src/test/test_tool_offload.py | 3 - src/test/test_tool_protocol.py | 2 - src/test/test_toon_encode.py | 1 - src/test/test_turn_diagnostics.py | 2 +- src/test/test_update_me.py | 1 - src/test/test_use_pool.py | 6 +- src/test/test_user_language.py | 2 - src/test/test_user_profile_access.py | 2 +- src/test/test_wizard_generator.py | 2 +- src/tools/grafana_tools.py | 1 - src/tools/prometheus_tools.py | 2 +- src/tools/promo_capture.py | 1 - src/tools/session_exec.py | 61 +- src/tools/session_venv.py | 1 - src/visibility_manager.py | 3 +- website/docs/architecture/agent-db.md | 35 - .../src/components/HomepageFeatures/index.tsx | 2 +- 372 files changed, 3460 insertions(+), 13192 deletions(-) delete mode 100644 admin-ui/app/agent-db/[userId]/page.tsx delete mode 100644 admin-ui/app/agent-db/page.tsx delete mode 100644 admin-ui/app/approvals/page.tsx delete mode 100644 admin-ui/app/plugins/page.tsx delete mode 100644 admin-ui/app/profile-memory/page.tsx delete mode 100644 chat-ui/app/api/agent-db-embed/route.ts delete mode 100644 chat-ui/components/chat/WebSearchChip.tsx delete mode 100644 chat-ui/components/navigation-memory/NavigationMemoryPanel.tsx delete mode 100644 chat-ui/components/ui/logo.js create mode 100644 chat-ui/components/ui/logo.tsx delete mode 100644 chat-ui/lib/api/navigation-memory.ts delete mode 100644 chat-ui/lib/merge-chat-history.test.ts delete mode 100644 chat-ui/lib/plan-execution-view.test.ts delete mode 100644 chat-ui/lib/sse/coalesceTurnSegments.test.ts delete mode 100644 chat-ui/lib/sse/planDisplay.test.ts delete mode 100644 chat-ui/lib/sse/webToolParse.test.ts delete mode 100644 chat-ui/public/file.svg delete mode 100644 chat-ui/public/globe.svg delete mode 100644 chat-ui/public/images/logo_aion_white.svg delete mode 100644 chat-ui/public/logo.svg delete mode 100644 chat-ui/public/next.svg delete mode 100644 chat-ui/public/vercel.svg delete mode 100644 chat-ui/public/window.svg delete mode 100644 config_std/skills/agent_db_ingestion.md delete mode 100644 config_std/skills/agent_db_protocol.md delete mode 100644 config_std/skills/agent_db_schema_design.md delete mode 100644 config_std/skills/agent_db_workflow_accounting.md delete mode 100644 config_std/skills/wren.md delete mode 100644 docker/Dockerfile.pi-worker delete mode 100644 eval_test/eval_results.json delete mode 100644 eval_test/evaluate_profile.py delete mode 100644 mcp_servers_std/agent_db/__init__.py delete mode 100644 mcp_servers_std/agent_db/db_manager.py delete mode 100644 mcp_servers_std/agent_db/export_engine.py delete mode 100644 mcp_servers_std/agent_db/ingestion/__init__.py delete mode 100644 mcp_servers_std/agent_db/ingestion/auto_schema.py delete mode 100644 mcp_servers_std/agent_db/ingestion/csv_ingestor.py delete mode 100644 mcp_servers_std/agent_db/ingestion/json_ingestor.py delete mode 100644 mcp_servers_std/agent_db/ingestion/normalizers.py delete mode 100644 mcp_servers_std/agent_db/ingestion/xlsx_ingestor.py delete mode 100644 mcp_servers_std/agent_db/ltm_notifier.py delete mode 100644 mcp_servers_std/agent_db/ltm_sync.py delete mode 100644 mcp_servers_std/agent_db/query_engine.py delete mode 100644 mcp_servers_std/agent_db/safety.py delete mode 100644 mcp_servers_std/agent_db/schema_registry.py delete mode 100644 mcp_servers_std/agent_db/server.py delete mode 100644 mcp_servers_std/agent_db/type_mapper.py delete mode 100644 mcp_servers_std/memory/mem0_server.py delete mode 100644 scripts/agent_db_acceptance_check.py delete mode 100644 scripts/debug/debug_agent_prompt.py delete mode 100644 scripts/generate_test_excel.py rename scripts/{ => migration}/backfill_message_timelines.py (100%) rename scripts/{ => migration}/cleanup_resume_role_leakage.py (100%) rename scripts/{ => migration}/migrate_alibr_project_memory.py (99%) rename scripts/{ => migration}/migrate_email_credential_keys.py (100%) rename scripts/{ => migration}/migrate_fs_to_storage.py (100%) rename scripts/{ => migration}/migrate_mempalace_to_mnemos_env.py (95%) mode change 100755 => 100644 rename scripts/{ => migration}/migrate_to_aion_db.py (100%) rename scripts/{ => migration}/migrate_v3.py (100%) rename scripts/{ => migration}/migrate_v3_eval.py (100%) rename scripts/{ => migration}/patch_sql_query_memory_config.py (99%) rename scripts/{ => migration}/unify_memory.py (99%) delete mode 100755 scripts/prepare-oss-release.sh delete mode 100755 scripts/reconcile_runtime_from_std.sh delete mode 100644 scripts/seed_agent_db.py delete mode 100644 scripts/seed_agent_db_approvals.py delete mode 100755 scripts/test_aion_chat_sse.py delete mode 100755 scripts/test_aion_chat_sse.sh delete mode 100644 services/pi-long-run/extensions/aion-bridge.ts delete mode 100644 services/pi-long-run/extensions/aion-compaction.ts delete mode 100644 services/pi-long-run/extensions/aion-ledger.ts delete mode 100644 services/pi-long-run/package.json delete mode 100644 services/pi-long-run/src/event-mapper.ts delete mode 100644 services/pi-long-run/src/server.ts delete mode 100644 services/pi-long-run/src/session-factory.ts delete mode 100644 services/pi-long-run/src/stream-sanitize.ts delete mode 100644 services/pi-long-run/test/aion-bridge.test.ts delete mode 100644 services/pi-long-run/test/aion-compaction.test.ts delete mode 100644 services/pi-long-run/test/event-mapper.test.ts delete mode 100644 services/pi-long-run/test/session-factory.test.ts delete mode 100644 services/pi-long-run/test/stream-sanitize.test.ts delete mode 100644 services/pi-long-run/tsconfig.json delete mode 100644 src/api/admin_agent_db.py delete mode 100644 src/api/agent_db_internal.py delete mode 100644 src/api/internal/pi_tools.py delete mode 100644 src/init_db.py delete mode 100644 src/runtime/long_run_mode.py delete mode 100644 src/runtime/pi_runtime/__init__.py delete mode 100644 src/runtime/pi_runtime/pi_client.py delete mode 100644 src/runtime/pi_runtime/pi_compaction.py delete mode 100644 src/runtime/pi_runtime/pi_turn_runner.py delete mode 100644 src/runtime/pi_runtime/session_config.py delete mode 100644 src/runtime/pi_runtime/skill_sync.py delete mode 100644 src/runtime/pi_runtime/tool_invoke.py delete mode 100644 src/runtime/pi_runtime/tool_manifest.py create mode 100644 src/runtime/session_cleanup.py delete mode 100644 src/test/integration/test_long_run_sse.py delete mode 100644 src/test/test_long_run_mode.py delete mode 100644 src/test/test_pi_compaction.py delete mode 100644 src/test/test_pi_history_hydrate.py delete mode 100644 src/test/test_pi_session_config.py delete mode 100644 src/test/test_pi_tool_invoke.py delete mode 100644 src/test/test_pi_tool_manifest.py delete mode 100644 src/test/test_pi_tools_api.py create mode 100644 src/test/test_session_cleanup.py delete mode 100644 src/test/test_session_exec_wren_env.py delete mode 100644 website/docs/architecture/agent-db.md diff --git a/.env.example b/.env.example index df9e3d64..34cd8f8c 100644 --- a/.env.example +++ b/.env.example @@ -1,506 +1,671 @@ # ============================================================================= -# AION Agent — variabili d'ambiente (copia in `.env` e adatta i valori) -# Setup guidato: ./scripts/setup-aion-env.sh oppure python scripts/setup_aion_env.py -# Copertura chiavi vs src: python scripts/check_env_example_coverage.py +# AION Agent — Variabili d'ambiente di configurazione (.env.example) +# ============================================================================= +# Questo file e' il modello di riferimento per tutte le variabili d'ambiente. +# Per configurare il tuo ambiente: +# 1. Copia questo file in `.env`: cp .env.example .env +# 2. Modifica i valori in `.env` in base al tuo setup locale o di produzione. +# +# Setup guidato automatico: +# - Linux/macOS: ./scripts/setup-aion-env.sh +# - Cross-platform: python scripts/setup_aion_env.py +# +# Verifica la copertura delle chiavi: +# python scripts/check_env_example_coverage.py # ============================================================================= -# Il file `config/default.yaml` supporta sostituzioni `${NOME_VAR}` (vedi src/config.py). -# I segreti non vanno committati: `.env` è in .gitignore. -# Docker: `data/runtime.env` conserva solo override Admin UI; al boot viene -# riconciliato con `.env` (vedi scripts/sync_runtime_env.py). - -# ----------------------------------------------------------------------------- -# Runtime locale (setup-aion-env.sh, upgrade-aion.sh, scripts/dev-api.sh) -# Se `uv` è nel PATH, venv + requirements.txt usano uv (come docker/Dockerfile.backend). -# Installazione: https://docs.astral.sh/uv/getting-started/installation/ -# ----------------------------------------------------------------------------- -# ----------------------------------------------------------------------------- -# API HTTP (FastAPI / uvicorn) — src/api/main.py -# ----------------------------------------------------------------------------- +# ============================================================================= +# 01. API HTTP & CONFIGURAZIONE SERVER (Server & Networking) +# ============================================================================= +# Etichetta dell'ambiente di esecuzione: dev | staging | prod (usata da observability/otel_setup) +AION_ENV=dev +# Host di ascolto del server FastAPI/Uvicorn (es. 0.0.0.0 per ascoltare su tutte le interfacce) AION_API_HOST=0.0.0.0 +# Porta HTTP del backend FastAPI AION_API_PORT=8001 -# Solo per `python -m src.api.main`: abilita --reload ed esclude `data/sessions` dal watch (sandbox .py). +# Attiva il ricaricamento automatico del codice in dev (solo per `python -m src.api.main`) # Da CLI usa invece: uvicorn src.api.main:app --reload --reload-exclude data/sessions AION_API_RELOAD=0 -# Event loop uvicorn: auto | asyncio | uvloop. In dev, asyncio riduce warning su Ctrl+C con richieste lunghe. +# Tipo di event loop per Uvicorn: auto | asyncio | uvloop AION_API_LOOP=auto -# Graceful shutdown timeout uvicorn (secondi) +# Tempo massimo in secondi per lo spegnimento controllato del server (graceful shutdown) AION_API_GRACEFUL_SHUTDOWN_SEC=8 -# Origini CORS (lista separata da virgola). In dev: "*" abilita regex aperta; in prod -# senza AION_CORS_ALLOW_WILDCARD=1 il backend usa origini localhost + AION_PUBLIC_*. -# Lista esplicita es.: http://localhost:8003,http://localhost:3870 +# Origini CORS consentite per chiamate da frontend/browser (separate da virgola) AION_CORS_ORIGINS=http://localhost:8003,http://localhost:3870 -# 1 = consente AION_CORS_ORIGINS=* anche con AION_ENV=prod (sconsigliato) +# Impostare a 1 per consentire CORS wildcard (*) anche in ambiente prod (sconsigliato) # AION_CORS_ALLOW_WILDCARD=0 -# Root path per il reverse proxy (es. "/api" quando il backend è servito dietro -# Caddy che strippa il prefisso). Vuoto in sviluppo diretto. Necessario per la -# generazione corretta dello schema OpenAPI e della UI Swagger. +# Prefisso di root per reverse proxy (es. "/api" se servito dietro Caddy che strippa il prefisso) AION_ROOT_PATH= -# Disabilita la documentazione interattiva FastAPI (/docs, /openapi.json, /redoc). -# Impostare a 0 in produzione per sicurezza (information disclosure). -# Default 1 in sviluppo locale. +# Abilita la documentazione interattiva OpenAPI/Swagger (/docs, /openapi.json, /redoc) AION_API_DOCS_ENABLED=1 -# Segreto opzionale per /chat-ui/conversations (header X-AION-Chat-Ui-Secret dal browser se impostato). -AION_CHAT_UI_INTERNAL_SECRET= -# Token login chat-ui (POST /auth/login). Genera con: openssl rand -hex 32 +# URL interno del backend FastAPI per comunicazioni tra i servizi AION +AION_FASTAPI_URL=http://localhost:8001 +# URL pubblico del backend esposto verso i browser/client esterni +AION_PUBLIC_API_URL=http://localhost:8001 +# URL pubblico della Chat UI +AION_CHAT_URL=http://localhost:8003 +# URL pubblico del chat-ui per redirect OAuth integrati (es. integratore/browser) +AION_PUBLIC_CHAT_URL= +# URL pubblico dell'Admin UI per i collegamenti e i banner +AION_ADMIN_UI_URL=http://localhost:3870 +# URL del backend FastAPI utilizzato da Next.js lato browser (deve iniziare con NEXT_PUBLIC_) +NEXT_PUBLIC_AION_API_URL=http://localhost:8001 + +# ============================================================================= +# 02. AUTENTICAZIONE, AUTORIZZAZIONE & SICUREZZA (Auth & Security) +# ============================================================================= +# Secret HMAC per generare i token JWT di login della Chat (Genera con: openssl rand -hex 32) AION_CHAT_AUTH_SECRET= -# Directory assoluta per i report audit sicurezza (default: admin-ui/public/reports se vuoto) +# Durata di validita' dei token JWT di autenticazione chat in secondi (default: 7 giorni) +AION_CHAT_AUTH_TOKEN_TTL_SEC=604800 +# Abilita la schermata di login obbligatoria con password per accedere alla Chat UI (1 = attivo) +AION_CHAT_PASSWORD_AUTH=1 +# Secret opzionale per proteggere le chiamate interne da Chat UI (/chat-ui/conversations) +AION_CHAT_UI_INTERNAL_SECRET= +# Abilita la protezione con autenticazione e ruoli sul pannello Admin (/admin) +AION_ADMIN_PASSWORD_AUTH=1 +# Token Bearer opzionale per la protezione delle API Admin memory (/admin/profile-memory/*) +AION_ADMIN_MEMORY_TOKEN= +# Chiave API bootstrap per l'autenticazione iniziale delle chiamate API +AION_API_KEY_BOOTSTRAP= +# Attiva la creazione automatica dell'utente Admin al primo setup se non sono presenti admin +AION_SETUP_ADMIN_BOOTSTRAP=1 +# Username predefinito per l'utente Admin di bootstrap +AION_SETUP_ADMIN_DEFAULT_IDENTIFIER=admin +# Password predefinita per l'utente Admin di bootstrap +AION_SETUP_ADMIN_DEFAULT_PASSWORD=admin +# Utente predefinito per il setup automatico senza prompt della Chat +AION_SETUP_CHAT_IDENTIFIER= +# Password predefinita per il setup automatico senza prompt della Chat +AION_SETUP_CHAT_PASSWORD= +# Directory per i report dell'audit di sicurezza (default: admin-ui/public/reports) AION_SECURITY_REPORTS_DIR= +# Chiave AES-256 (64 caratteri hex) per la cifratura delle credenziali utente memorizzate +AION_CREDENTIAL_ENCRYPTION_KEY= +# Abilita il mascheramento automatico dei dati personali (PII) nei log +AION_PII_REDACT=1 -# ----------------------------------------------------------------------------- -# LLM OpenAI-compat (vLLM / endpoint chat) — src/main.py, agent_pipeline, llm_extract -# ----------------------------------------------------------------------------- -# Base URL del modello (OpenAI-compat, es. .../qwen3/v1). Solo processo API/agente (Haystack). -# REQUIRED — must be set to your LLM endpoint URL (e.g. localhostv1) +# ============================================================================= +# 03. MODELLI LLM & ENDPOINT INFERENCE (LLM & Provider Settings) +# ============================================================================= +# URL dell'endpoint di infezenza LLM OpenAI-compatibile (es. vLLM, Ollama, LM Studio) AION_API_URL=localhost:11434 -# Nome modello passato all'endpoint LLM. -# REQUIRED — must be set to your model name (e.g. qwen3-235b-a22b) +# Nome del modello di linguaggio primario da utilizzare nelle chiamate di chat AION_MODEL=AIONQ35-35-Q8B -# LLM adapter identifier (default: vllm_qwen). Used to isolate vLLM/Qwen-specific behavior. +# Adattatore per comportamenti specifici del server LLM (default: vllm_qwen) AION_LLM_ADAPTER=vllm_qwen -# Timeout secondi richiesta HTTP verso il modello (streaming) +# Token Bearer per l'intestazione Authorization verso l'endpoint LLM +AION_LLM_API_KEY=placeholder-token +# Timeout massimo in secondi per le risposte in streaming dal server LLM AION_LLM_TIMEOUT=600 -# Limite token per risposta chat agente (evita troncamenti tipo finish_reason=length) +# Limite massimo di token generabili dal modello per singola risposta dell'agente AION_CHAT_MAX_TOKENS=16384 -# Finestra contesto modello in token (compaction, budget bar, Pi long-run) +# Dimensione totale della finestra di contesto del modello in token (input + output) AION_CONTEXT_WINDOW=131072 -# Default `reasoning_effort` se il client omette il campo (POST /chat, POST /v1/chat/stream). Valori: min | medium | max +# Livello di sforzo di ragionamento predefinito se non specificato dal client: min | medium | max AION_DEFAULT_REASONING_EFFORT=medium -# File delivery: tool-first (sandbox_write_workspace_file / edit / apply_patch). Phantom tools blocked. -# Legacy XML stream parser: AION_ARTIFACT_STREAM_LEGACY=1 (default off). -# Agent execution: 0=default wrapper (async-ready); 1=force legacy thread path label -AION_AGENT_EXEC_LEGACY_THREAD=0 -# Modalità di default dell'agente. Valori: normal (default) | plan | ask | debug +# Abilita l'emissione dei blocchi di pensiero ("thinking") del modello (1 = attivo) +AION_THINKING_ENABLED=1 +# Budget di token riservati al blocco "thinking" (vLLM Qwen3 extra_body). Lasciare vuoto se non supportato +AION_THINKING_TOKEN_BUDGET= +# Budget token specifico per effort medio (medium) +AION_THINKING_TOKEN_BUDGET_MEDIUM= +# Budget token specifico per effort massimo (max) +AION_THINKING_TOKEN_BUDGET_MAX= +# Override del budget token per il ragionamento quando reasoning_effort=max +AION_REASONING_EFFORT_MAX_BUDGET= +# Oggetto JSON inviato come extra_body nelle chiamate vLLM (es. chat_template_kwargs) +AION_VLLM_EXTRA_BODY= +# Abilita lo schema strict sui tool per server vLLM locali (0 = disabilitato per evitare errori su JSON parziali) +AION_VLLM_TOOLS_STRICT=0 +# Token floor minimo riservato al modello quando i payload dei tool sono di grandi dimensioni +AION_VLLM_TOOL_ARG_TOKEN_FLOOR=8192 +# Abilita il log delle chiamate quando scatta un fallback verso un LLM alternativo +AION_LLM_FALLBACK_LOG=1 +# Tempo di cache (secondi) per il controllo di salute del LLM (GET /models) prima del turno +AION_LLM_HEALTH_CACHE_SEC=45 + +# ============================================================================= +# 04. AGENTE, ESECUZIONE & GUARD RAILS (Agent Execution & Limits) +# ============================================================================= +# Modalita' di default dell'agente: normal | plan | ask | debug AION_DEFAULT_AGENT_MODE=normal -# Tool bloccati in Plan Mode: lista separata da virgola di nome tool (MCP o nativi) che NON possono essere -# chiamati dall'agente quando agent_mode=plan. Garantisce che il blocco sia reale a livello di protocollo -# (il tool viene rimosso dalla lista passata al LLM) e non solo per direttiva nel prompt. -# Aggiungi qui qualsiasi tool MCP operativo che non deve essere eseguibile durante la pianificazione. -# NON includere draft_execution_plan quando AION_PLAN_MODE_TOOL_FIRST=1 (il runtime lo forza comunque, -# ma tenerlo fuori evita confusione): è il tool con cui si crea il piano nella sidebar. +# Timeout massimo in secondi per l'esecuzione di un singolo turno dell'agente +AION_AGENT_TURN_TIMEOUT=600 +# Limite massimo globale di passaggi (step/tool call) compiuti dall'agente in un singolo turno +AION_MAX_AGENT_STEPS=15 +# Hard cap chiamate strumenti per turno (oltre il quale l'agente si interrompe) +AION_TOOL_CALLS_MAX_PER_TURN=80 +# Hard cap eventi tool per turno +AION_TOOL_EVENTS_MAX_PER_TURN=60 +# Forza la gestione dell'agente nel threadpool legacy anziche' nel loop async (0 = default async) +AION_AGENT_EXEC_LEGACY_THREAD=0 +# Soglia di chiamate a tool identiche e consecutive prima di attivare la guardia anti-loop +AION_DOOM_LOOP_THRESHOLD=3 +# Azione da eseguire al raggiungimento del doom loop: reminder | stop +AION_DOOM_LOOP_ACTION=reminder +# Mappatura di recupero per output JSON vuoti restituiti dai tool +AION_JSON_RECOVERY_ALLOW_EMPTY=0 + +# --- Reasoning limits per turno --- +# Max caratteri del blocco reasoning streammato (0 = nessun cap) +AION_REASONING_MAX_CHARS=20000 +# Max eventi del blocco reasoning streammato +AION_REASONING_MAX_EVENTS=240 +# Caratteri minimi di ragionamento per turno +# AION_REASONING_MIN_CHARS=2000 +# Eventi minimi di ragionamento per turno +# AION_REASONING_MIN_EVENTS=30 +# Cap di livello massimo per caratteri di ragionamento +# AION_REASONING_MAX_LEVEL_CHARS=40000 +# Cap di livello massimo per eventi di ragionamento +# AION_REASONING_MAX_LEVEL_EVENTS=480 +# Hard-stop del turno se supera entrambi i cap di ragionamento (0 = disabilitato) +AION_REASONING_HARD_STOP=0 + +# --- Circuit Breaker, Deduplicazione & Tool Guards --- +# Abilita il Circuit Breaker per sospendere l'uso di tool che falliscono ripetutamente +AION_TOOL_CIRCUIT_BREAKER_ENABLED=1 +# Numero massimo di fallimenti consecutivi per un tool prima di attivare il Circuit Breaker +# AION_TOOL_CIRCUIT_BREAKER_MAX=3 +# Haystack tools_strict globale (1 = attivo) +# AION_TOOLS_STRICT=1 +# Fallimenti consecutivi del tool prima di inviare un prompt di recupero +# AION_TOOL_ERROR_THRESHOLD=2 +# Tentativi massimi di recupero da errore del tool +# AION_TOOL_ERROR_MAX_RECOVERY=2 +# Tempo di attesa del thread agente dopo l'hard-stop (secondi) +# AION_AGENT_DRAIN_TIMEOUT_SEC=90 +# Deduplica chiamate a tool identiche e ravvicinate (LLM loop guard) +AION_TOOL_DEDUPE_ENABLED=1 +# Tempo di vita in secondi per la deduplicazione delle chiamate a tool +AION_TOOL_DEDUPE_TTL_SEC=20 +# Soglia di caratteri di ragionamento senza chiamate a tool oltre la quale mostrare un suggerimento +AION_AGENT_MIN_REASONING_CHARS_WITHOUT_TOOL=0 +# Cap massimo di chunk di ragionamento emessi senza l'uso di strumenti +AION_AGENT_MAX_REASONING_WITHOUT_TOOL=0 +# Abilita la cache dell'istanza agente per sessione/profilo per ridurre latenza e log +AION_AGENT_CACHE=1 +# Numero massimo di istanze di agenti mantenute nella cache in memoria +AION_AGENT_CACHE_MAX=256 + +# ============================================================================= +# 05. MODALITÀ SPECIALIZZATE (Plan Mode & Deep Research) +# ============================================================================= +# --- Plan Mode (Pianificazione guidata prima dell'esecuzione) --- +# Lista dei nomi dei tool disabilitati durante la fase di pianificazione (Plan Mode) AION_PLAN_MODE_BLOCKED_TOOLS=sandbox_write_workspace_file,sandbox_edit_workspace_file,sandbox_exec_allowlisted,sandbox_run_python_file,sandbox_run_node_file,sandbox_install_python_packages,sandbox_install_npm_packages,mark_task_completed,delegate_to_subagent,skill_view -# Max read-only exploration tool calls in one Plan Mode turn before emitting (Cursor-style: defer web_search to tasks). +# Numero massimo di chiamate a tool di esplorazione/ricerca nel turno di pianificazione AION_PLAN_MODE_MAX_RESEARCH_TOOLS=2 -# Tool names that count toward that budget (comma-separated). Extend when adding search MCP integrations. +# Nomi dei tool che contano nel budget di ricerca della Plan Mode (separati da virgola) AION_PLAN_MODE_RESEARCH_TOOLS=list_dir,sandbox_list_files,view_file,sandbox_read_text_file,grep_search,web_search,skill_search,skill_list -# LLM timeout (seconds) for PlanFinalizer when the model did not emit a structured plan (default 20). +# Timeout in secondi per il finalizzatore del piano se il modello non emette uno schema valido AION_PLAN_FINALIZER_TIMEOUT_SEC=20 -# Plan Mode tool-first: model calls draft_execution_plan instead of tags (default on). +# Abilita la creazione del piano tramite chiamata al tool draft_execution_plan (default 1) AION_PLAN_MODE_TOOL_FIRST=1 -# Legacy text plan parsing ( tags, coercion). Off when tool-first is on. +# Disabilita il parser legacy basato su tag quando il tool-first e' attivo AION_PLAN_TEXT_PARSER=0 -# Plan execution handler (post-approve tasks) — src/plan_execution/ +# Abilita il modulo di esecuzione automatica dei task post-approvazione del piano # AION_PLAN_EXECUTION_ENABLED=1 +# Directory di conservazione dei piani di esecuzione # AION_PLAN_EXECUTION_DATA_DIR=data/plan_execution +# Chiamate a tool massime consentite per l'esecuzione completa di un piano # AION_PLAN_EXEC_MAX_TOOL_CALLS=24 +# Abilita la sintesi finale del piano tramite LLM # AION_PLAN_FINALIZE_LLM=1 +# Caratteri minimi per considerare valido l'avanzamento nella scrittura del piano # AION_PLAN_PROGRESS_MIN_CHARS=120 -# Deep Research (IterResearch-style, Odysseus-inspired) +# --- Deep Research (Ricerca approfondita iterativa multi-step) --- +# Abilita la modalita' di ricerca approfondita (1 = attivo) AION_DEEP_RESEARCH_ENABLED=1 +# Numero massimo di round di ricerca consecutivi AION_DEEP_RESEARCH_MAX_ROUNDS=8 +# Tempo massimo totale in secondi per il completamento della ricerca approfondita AION_DEEP_RESEARCH_MAX_TIME=600 +# Cartella di salvataggio delle sessioni e dei report di ricerca approfondita AION_DEEP_RESEARCH_DATA_DIR=data/deep_research +# Budget token per i passaggi di estrazione della ricerca approfondita AION_DEEP_RESEARCH_MAX_TOKENS=16384 +# Timeout in secondi per l'estrazione da singola pagina web durante la ricerca AION_DEEP_RESEARCH_EXTRACTION_TIMEOUT=90 +# Numero massimo di estrazioni web eseguite in parallelo AION_DEEP_RESEARCH_EXTRACTION_CONCURRENCY=3 +# Timeout globale di esecuzione per la ricerca approfondita AION_DEEP_RESEARCH_RUN_TIMEOUT=1800 +# Numero massimo di ricerche approfondite eseguibili simultaneamente AION_DEEP_RESEARCH_MAX_CONCURRENT=2 -# AION_DEEP_RESEARCH_BLOCKED_TOOLS=web_search,web_fetch_page,... -# Se AION_DEFAULT_REASONING_EFFORT non è impostato: 0/false/off → min, 1/true/on → medium (solo fallback per client senza campo). -AION_THINKING_ENABLED=1 -# vLLM Qwen3 reasoning: massimo token nel blocco "thinking" (extra_body). Lasciare unset se il server -# non ha --reasoning-config (altrimenti errore API). Con budget attivo serve anche --reasoning-parser qwen3. -# Default 2048 quando reasoning è attivo (medium/max) se unset; richiede vLLM --reasoning-config + parser. -# Esempio: AION_THINKING_TOKEN_BUDGET=2048 -AION_THINKING_TOKEN_BUDGET= -# Con `reasoning_effort=max` nel body di /chat, se impostato (intero) sovrascrive/aggiunge thinking_token_budget nel turno. -# Stessi vincoli vLLM di AION_THINKING_TOKEN_BUDGET (--reasoning-parser / --reasoning-config). -AION_REASONING_EFFORT_MAX_BUDGET= -# Budget specifici per livello di effort (in token) se non definiti a livello globale: -# AION_THINKING_TOKEN_BUDGET_MEDIUM=1024 -# AION_THINKING_TOKEN_BUDGET_MAX=2048 -AION_THINKING_TOKEN_BUDGET_MEDIUM= -AION_THINKING_TOKEN_BUDGET_MAX= -# JSON oggetto, merge in extra_body dopo il budget (es. chat_template_kwargs). Chiavi qui vincono sui default. -AION_VLLM_EXTRA_BODY= -# Token Bearer per header Authorization (molti vLLM accettano un placeholder) -AION_LLM_API_KEY=placeholder-token -# Healthcheck opzionale all’avvio turno: timeout secondi per HEAD verso la base LLM -AION_LLM_HEALTHCHECK_TIMEOUT=2 -# Timeout massimo turno agente (asyncio), secondi --> Max execution time per turno (richiesta e loop tools) -AION_AGENT_TURN_TIMEOUT=600 -# Max agent steps per turn (global cap; profiles may override with lower value) -AION_MAX_AGENT_STEPS=15 -# Timeout secondi per ``sandbox_run_python_file`` / ``sandbox_run_node_file`` (subprocess workspace script) -# AION_NODE_PATH=/usr/local/bin/node # opzionale se `node` non è sul PATH (docx-js) -AION_SANDBOX_RUN_TIMEOUT_SEC=600 -# Troncamento output stdout+stderr (byte) per run file / messaggi molto lunghi -AION_SANDBOX_MAX_OUTPUT_BYTES=500000 -# Whole-file sandbox_read_text_file cap (default 2MB); tiny model max_bytes are ignored -# AION_SANDBOX_READ_TEXT_MAX_BYTES=2097152 -# Treat model max_bytes below this as "use default" (stops 3000-byte read failures) -# AION_SANDBOX_READ_TEXT_IGNORE_BELOW=65536 -# Ruff block mode su codice sessione (0/disabilitato) -AION_SANDBOX_RUFF_BLOCK=0 -# --- Venv + pip per sessione (MCP session_sandbox) — src/tools/session_venv.py -# Crea automaticamente .venv sotto data/sessions// al primo run_file (1) o solo dopo install (0) -AION_SANDBOX_AUTO_VENV=1 -# Preinstall office skill Python deps (docx/pdf/pptx/xlsx) into new session .venv in dev; -# in container mode the sandbox image uses --system-site-packages from /opt/venv instead. -AION_SANDBOX_VENV_BOOTSTRAP_SKILLS=1 -# Enable sandbox_install_python_packages (PyPI / index network; default on) -AION_SANDBOX_ALLOW_PACKAGE_INSTALL=1 -# Enable sandbox_install_npm_packages (npm in workspace/; default on — does not use exec allowlist) -AION_SANDBOX_ALLOW_NPM_INSTALL=1 +# Nomi dei tool disabilitati durante la ricerca approfondita (es. web_search, web_fetch_page) +# AION_DEEP_RESEARCH_BLOCKED_TOOLS=web_search,web_fetch_page -# Promo graphics MCP (React/HTML → PNG via Playwright) -# setup-aion-env.sh / upgrade-aion.sh appendono AION_PROMO_CAPTURE_ENABLED e installano Chromium -# (salvo --skip-promo-playwright). Manuale: ./scripts/setup_promo_playwright.sh -AION_PROMO_CAPTURE_ENABLED=0 -# AION_PROMO_CAPTURE_TIMEOUT_MS=90000 -# npm install timeout (seconds; if unset, uses AION_SANDBOX_RUN_TIMEOUT_SEC) -# AION_SANDBOX_NPM_TIMEOUT_SEC=600 -# Timeout pip/venv (se unset, riusa AION_SANDBOX_RUN_TIMEOUT_SEC) -AION_SANDBOX_PIP_TIMEOUT_SEC=600 -# Max pacchetti per singola chiamata install -AION_SANDBOX_PIP_MAX_PACKAGES=32 -# Usa ``uv pip install`` invece di pip (richiede uv sul PATH; in Docker runtime usare 0 se uv non è nell'immagine) -AION_SANDBOX_PIP_USE_UV=1 -# Indice PyPI alternativo (opzionale) -AION_SANDBOX_PIP_INDEX_URL= -# --- Session sandbox security / isolation --- -# Backend: subprocess (dev/macOS), container (Podman/Docker prod Linux) -AION_SANDBOX_BACKEND=subprocess -# Blocca esecuzione se il backend richiesto non è disponibile (no fallback silenzioso) -AION_SANDBOX_FAIL_CLOSED=1 -# Env allowlist/deny per subprocess sandbox (virgola-separati) -AION_SANDBOX_ENV_ALLOWLIST=LANG,LC_ALL,PATH,HOME,VIRTUAL_ENV,PIP_DISABLE_PIP_VERSION_CHECK -AION_SANDBOX_ENV_DENY_PREFIX=AION_API_,AION_DB_,AION_CHAT_AUTH_,AION_ADMIN_,AION_REDIS_,AION_SETUP_ -# FS confinement for subprocess backend (Landlock on Linux + Python guards). 0 = disable (tests only). -AION_SANDBOX_SUBPROCESS_CONFINE=1 -# Abort sandbox exec on Linux when Landlock cannot apply (strict; default off — Node/Python hooks still apply) -# AION_SANDBOX_LANDLOCK_REQUIRED=0 -# Container runtime (Podman rootless primary; docker fallback) -# Quick setup: ./scripts/setup-podman-sandbox.sh -# AION_SANDBOX_BACKEND=container -# AION_PODMAN_SOCKET_HOST=/run/user/1000/podman/podman.sock -# AION_SANDBOX_HOST_DATA_DIR=/path/to/AION_Agent/data -# Repo root on host for container bind-mount of live src/ (default: parent of HOST_DATA_DIR) -# AION_SANDBOX_HOST_REPO=/path/to/AION_Agent -# Required when AION_SANDBOX_BACKEND=container (Podman bind-mounts sessions + live src/). -# Run once: python scripts/setup_podman_sandbox.py -# AION_SANDBOX_HOST_UID=1000 -# AION_SANDBOX_HOST_GID=1000 -# AION_CONTAINER_RUNTIME=podman -# AION_SANDBOX_CONTAINER_IMAGE=aion/sandbox:latest -# AION_PODMAN_SOCKET=/run/podman/podman.sock -# AION_SANDBOX_CONTAINER_MEMORY=512m -# AION_SANDBOX_CONTAINER_CPUS=1.0 -# AION_SANDBOX_CONTAINER_PIDS_LIMIT=256 -# AION_SANDBOX_MCP_JAIL=1 -# AION_SANDBOX_CONTAINER_SELINUX=0 -# AION_SANDBOX_CONTAINER_NETWORK=slirp4netns -# AION_SANDBOX_SESSION_ROOT= # injected per subprocess; set by session confinement -# AION_SANDBOX_FLAT_SESSION_ROOT=0 -# AION_SANDBOX_IN_CONTAINER=0 -# AION_SANDBOX_NPM_MAX_PACKAGES=16 -# Import HTTP in SessionSandboxExecutor.execute(): disabilitato di default (requests/httpx) -AION_SANDBOX_ALLOW_HTTP_IMPORTS=0 +# ============================================================================= +# 06. GESTIONE DEL CONTESTO, COMPATTAZIONE & OFFLOADING (Context & Harness v2) +# ============================================================================= +# --- AION Harness v2 (Architettura di gestione contesto e turni) --- +AION_HARNESS_V2_MESSAGES=1 +AION_HARNESS_V2_INJECTIONS=1 +AION_HARNESS_V2_COMPACTION=1 +AION_HARNESS_V2_PROVIDER=1 +AION_HARNESS_V2_TOOLS=1 +AION_HARNESS_V2_TURN=1 -# Filesystem policy (opzionale) — template: config_std/fs_policy.example.yaml -# setup/upgrade copiano i template in config/; --enable-fs-policy-dev attiva exec in dev. -AION_FS_POLICY_PATH=config/fs_policy.yaml -# Dev locale (exec on): AION_FS_POLICY_PATH=config/fs_policy.dev.yaml -# Limiti operazioni filesystem MCP session_sandbox / session_fs_tools -AION_EDIT_MAX_FILE_BYTES=2097152 -AION_GREP_MAX_FILE_BYTES=524288 -AION_GREP_MAX_MATCHES=200 -AION_GLOB_MAX_PATHS=500 -AION_CHUNK_MAX_LINES=500 -# Riutilizza agente Haystack + tool MCP già costruiti per stessa sessione/profilo/utente (meno log e latenza) -AION_AGENT_CACHE=1 -AION_AGENT_CACHE_MAX=256 +# Dimensione della finestra di contesto del modello per la compattazione (deve allinearsi al LLM) +AION_MODEL_MAX_CONTEXT=131072 +# Alias di fallback per la dimensione finestra contesto +AION_CONTEXT_COMPRESS_MODEL_WINDOW=131072 +# Abilita la compattazione automatica della cronologia quando il contesto si riempie +AION_CONTEXT_COMPRESS_ENABLED=1 +# Soglia di innesco della compattazione (es. 0.80 = compatta al raggiungimento dell'80% della finestra) +AION_CONTEXT_COMPRESS_THRESHOLD=0.80 +# Numero di messaggi recenti da preservare intatti durante la compattazione +AION_CONTEXT_COMPRESS_KEEP_LAST=12 +# Numero massimo di cicli di compressione consecutivi se il contesto rimane sopra soglia +AION_CONTEXT_COMPRESS_MAX_ROUNDS=2 +# Riserva il budget di token di output dal limite di input per evitare errori 400 context length +AION_CONTEXT_COMPRESS_RESERVE_OUTPUT=1 +# Stima in token dell'overhead fisso (system prompt, schemi dei tool, formattazione) +AION_CONTEXT_COMPRESS_FIXED_OVERHEAD=8192 +# Token massimi per il testo di sintesi generato durante la compattazione +AION_CONTEXT_COMPRESS_SUMMARY_MAX_TOKENS=4096 +# Abilita la compattazione automatica intra-turno (dopo l'esecuzione dei tool) +AION_CONTEXT_COMPRESS_MID_TURN=1 +# Soglia rispetto al limite max_prompt per la compattazione intra-turno (0.92 = 92%) +AION_CONTEXT_COMPRESS_MID_TURN_RATIO=0.92 +# Intervallo minimo in secondi tra due compattazioni nello stesso turno +AION_CONTEXT_COMPRESS_MID_TURN_MIN_SEC=15 +# Timeout per il completamento della compattazione intra-turno +# AION_CONTEXT_COMPRESS_MID_TURN_TIMEOUT=90 +# Persiste i blocchi sintetizzati della compattazione nel database della cronologia +# AION_CONTEXT_COMPRESS_PERSIST=1 +# Token di output riservati durante la compattazione intra-turno +# AION_CONTEXT_COMPRESS_RESERVE_OUTPUT_TOKENS=0 +# Timeout per la generazione del sommario di compattazione +# AION_CONTEXT_COMPRESS_SUMMARY_TIMEOUT=120 +# Caratteri massimi del trascritto inviati al LLM per la sintesi della compattazione +# AION_CONTEXT_COMPRESS_TRANSCRIPT_CHARS=120000 +# Output di tool recenti da mantenere integri durante il compact meccanico +# AION_MECHANICAL_COMPACT_KEEP_TOOLS=2 +# Recupero automatico su errore di overflow del contesto: compatta e riprova l'ultimo turno +# AION_CONTEXT_RECOVERY=1 +# Numero massimo di tentativi di recupero automatico da context overflow +# AION_CONTEXT_RECOVERY_MAX=2 +# Compattazione intra-turno sui chunk di pensiero (0 = disabilitato per non bloccare lo streaming) +# AION_CONTEXT_COMPRESS_MID_TURN_REASONING=0 +# Forza la sintesi sincrona durante il turno +# AION_CONTEXT_COMPRESS_MID_TURN_SYNC=0 -# Estrazione LTM (JSON) — src/memory/llm_extract.py -AION_LTM_EXTRACT_MAX_TOKENS=1024 -# 1/true/yes abilita response_format json_object se supportato -AION_LTM_JSON_RESPONSE_FORMAT=0 -# Timeout HTTP per singola richiesta extract (secondi) -AION_LTM_EXTRACT_HTTP_TIMEOUT=45 +# --- Context Offloading (Spostamento risultati voluminosi dei tool su file) --- +# Abilita l'offloading automatico dei risultati dei tool su file nella cartella derived/tool_results/ +AION_TOOL_OFFLOAD_ENABLED=1 +# Soglia minima di caratteri nell'output di un tool per attivare lo spostamento su file +AION_TOOL_OFFLOAD_MIN_CHARS=8000 +# Caratteri di anteprima mantenuti nella memoria del modello prima del puntatore al file +AION_TOOL_OFFLOAD_PREVIEW_CHARS=1500 +# Nomi dei tool esclusi dall'offloading (separate da virgola) +AION_TOOL_OFFLOAD_EXCLUDE=web_search,sandbox_read_file_chunk +# Limite totale in MB per i file di offload salvati in una singola sessione +AION_TOOL_OFFLOAD_MAX_TOTAL_MB=64 +# Abilita la cancellazione dei file di offload relativi a sessioni archiviate +AION_TOOL_OFFLOAD_CLEANUP_ENABLED=1 +# Giorni di grazia prima di eliminare i file di offload delle sessioni archiviate +AION_TOOL_OFFLOAD_CLEANUP_GRACE_DAYS=7 +# Frequenza in secondi del controllo di pulizia dei file di offload +AION_TOOL_OFFLOAD_CLEANUP_INTERVAL_SEC=3600 -# ----------------------------------------------------------------------------- -# Memoria a breve termine (STM) — agent_pipeline, stm_consolidator -# ----------------------------------------------------------------------------- +# --- Tool Ledger (Registro di tracciamento tool in-session) --- +# Abilita l'iniezione della tabella di registro dei tool eseguiti nel contesto della sessione +AION_TOOL_LEDGER_ENABLED=1 +# Numero massimo di righe di storico mantenute nel registro dei tool +AION_TOOL_LEDGER_MAX_ROWS=60 +# Caratteri massimi occupati dalla tabella del registro dei tool +AION_TOOL_LEDGER_MAX_CHARS=3000 + +# ============================================================================= +# 07. GESTIONE DELLA MEMORIA (STM, LTM, Mnemos, Embeddings & SQL) +# ============================================================================= +# --- Memoria a Breve Termine (STM - Short Term Memory) --- +# Numero massimo di turni recenti mantenuti nella memoria a breve termine AION_STM_MAX_TURNS=10 -# Budget token STM (opzionale, stringa numerica o vuoto) +# Budget di token per la memoria STM (lasciare vuoto per calcolo automatico) AION_STM_TOKEN_BUDGET= +# Attiva la potatura della memoria STM dopo il consolidamento AION_STM_PRUNE_AFTER_CONSOLIDATE= +# Messaggi da conservare intatti durante la potatura della memoria STM AION_STM_PRUNE_KEEP=50 +# Frequenza in turni per l'esecuzione del consolidamento STM AION_STM_CONSOLIDATE_EVERY=10 -# ----------------------------------------------------------------------------- -# Memoria a lungo termine (LTM) — src/memory/ltm_orchestrator.py -# ----------------------------------------------------------------------------- +# --- Memoria a Lungo Termine (LTM Orchestrator) --- +# Nome identificativo dell'agente associato alle memorie salvate AION_LTM_AGENT_NAME=AION_Agent -AION_LTM_WAKE_TTL=300 -# Max caratteri per il wake-up LTM (snippet iniettato nel prompt) +# Caratteri massimi dello snippet LTM iniettato al wake-up della chat AION_LTM_WAKE_MAX_CHARS=1000 +# Abilita il recupero (recall) delle memorie pertinenti all'avvio di ogni turno AION_LTM_RETRIEVAL=1 -AION_LTM_SEARCH_LIMIT=5 +# Abilita l'estrazione automatica di nuove memorie al termine di ogni turno AION_LTM_EXTRACT=1 +# Inietta il blocco di memoria LTM come prefisso al messaggio dell'utente AION_LTM_PREFIX_IN_USER=1 -# Troncamento contesto utente/LTM in caratteri (circa) +# Caratteri massimi riservati al blocco di contesto LTM AION_LTM_CONTEXT_MAX_CHARS=12000 +# Caratteri massimi dell'assistente analizzati durante l'estrazione di memorie AION_LTM_EXTRACT_ASSISTANT_MAX_CHARS=24000 +# Caratteri massimi del trascritto inviati per l'estrazione memorie in batch AION_LTM_BATCH_TRANSCRIPT_MAX_CHARS=36000 +# Token massimi per la risposta JSON del processo di estrazione LTM +AION_LTM_EXTRACT_MAX_TOKENS=1024 +# Forza il formato JSON strutturato per le chiamate di estrazione LTM +AION_LTM_JSON_RESPONSE_FORMAT=0 +# Timeout HTTP in secondi per la richiesta di estrazione LTM +AION_LTM_EXTRACT_HTTP_TIMEOUT=45 +# Livello minimo di importanza (1-5) per archiviare una nota nella memoria LTM +AION_LTM_MIN_IMPORTANCE=2 + +# --- Mnemos LTM Engine (Motore nativo in-process di memoria permanente) --- +# Numero massimo di note restituite al wake-up +AION_LTM_WAKE_MAX_ROWS=20 +# Limite di memorie estratte durante le ricerche di recall +AION_MNEMOS_RECALL_LIMIT=10 +# Timeout in secondi per l'esecuzione di un singolo tool Mnemos +AION_MNEMOS_TOOL_TIMEOUT_SEC=60 +# Include anche le note globali nel blocco di wake-up (0 = disabilitato) +AION_MNEMOS_WAKE_GLOBAL=0 +# Abilita i tool nativi in-process di Mnemos +AION_MNEMOS_NATIVE_TOOLS=1 +# Imposta i tool Mnemos in sola lettura +AION_MNEMOS_READONLY_TOOLS=0 +# Espone il parametro di recall limit nell'interfaccia dei tool Mnemos +AION_MNEMOS_RECALL_LIMIT_EXPOSED=1 +# Giorni di mezza vita per il decadimento temporale delle memorie (ranking) +AION_MNEMOS_RANK_HALF_LIFE_DAYS=90 +# Peso della recentezza nel calcolo del punteggio delle memorie (0.0 - 1.0) +AION_MNEMOS_RANK_W_RECENCY=0.3 +# Peso dell'importanza nel calcolo del punteggio delle memorie (0.0 - 1.0) +AION_MNEMOS_RANK_W_IMPORTANCE=0.2 +# Abilita la ricerca ibrida (FTS + Embedding RRF merge) +AION_MNEMOS_EMBEDDING_RECALL=1 +# Genera i vettori embedding durante l'importazione massiva di note +AION_MNEMOS_EMBED_ON_BULK=1 +# Punteggio minimo di similarita' vettoriale per includere la nota nel recall +AION_MNEMOS_EMBEDDING_MIN_SCORE=0.25 +# Numero massimo di candidati analizzati durante lo scan degli embedding +AION_MNEMOS_EMBEDDING_SCAN_LIMIT=300 +# Moltiplicatore dei candidati per la fusione ibrida RRF +AION_MNEMOS_HYBRID_CANDIDATE_MULT=3 +# Abilita il ciclo notturno ("dream") per consolidamento, pulizia e decadimento confidenza +AION_MNEMOS_DREAM_ENABLED=1 +# Ora del giorno (0-23) in cui eseguire il ciclo di dream notturno +AION_MNEMOS_DREAM_HOUR=3 +# Intervallo tra i cicli di dream in secondi (86400 = 24 ore) +AION_MNEMOS_DREAM_INTERVAL_SEC=86400 +# Abilita la ricerca basata sugli alias delle entita' (opzionale) +# AION_MNEMOS_ENTITY_RECALL=0 +# Giorni per il decadimento della confidenza delle note +# AION_MNEMOS_CONFIDENCE_DECAY_DAYS=90 +# Fattore di decadimento della confidenza +# AION_MNEMOS_CONFIDENCE_DECAY_FACTOR=0.9 +# Soglia minima di confidenza prima dell'archiviazione +# AION_MNEMOS_CONFIDENCE_MIN=0.2 -# ----------------------------------------------------------------------------- -# Query memory / embedding — src/query_memory.py -# ----------------------------------------------------------------------------- -AION_QUERY_MEMORY_DB_PATH= +# --- Model Embeddings & Vector Search --- +# Provider dei modelli di embedding (es. openai, vllm) AION_EMBEDDINGS_PROVIDER=openai +# URL dell'endpoint di infezenza per la generazione degli embedding AION_EMBEDDING_URL=localhost:11434/v1/embeddings +# Nome del modello di embedding da utilizzare AION_EMBEDDING_MODEL=qwen3-embedding +# Timeout per le richieste di generazione embedding in secondi AION_EMBEDDING_REQUEST_TIMEOUT=5 +# API Key opzionale per il servizio di embedding AION_EMBEDDINGS_API_KEY= +# Soglia per la verifica automatica delle corrispondenze AION_AUTO_VERIFY_THRESHOLD=3 -# ----------------------------------------------------------------------------- -# SQL QueryMemory (Postgres SELECT cache, separato da PromQL) — src/memory/sql_query_memory/ -# ----------------------------------------------------------------------------- +# --- SQL Query Memory & Datasource Memory (Cache query SQL Postgres/MySQL) --- +# Abilita la memoria di salvataggio e riutilizzo delle query SQL AION_SQL_QM_ENABLED=1 +# Nome del progetto SQL predefinito AION_SQL_QM_DEFAULT_PROJECT=default +# Ambito predefinito di visibilita' delle query: per_user | global AION_SQL_QM_DEFAULT_SCOPE=per_user +# Soglia di similarita' per la ricerca delle query salvate AION_SQL_QM_SEARCH_THRESHOLD=0.78 +# Soglia per la deduplicazione ed evitare il salvataggio di query identiche AION_SQL_QM_DEDUP_THRESHOLD=0.90 +# Soglia di punteggio per richiedere la revisione della query AION_SQL_QM_REVIEW_THRESHOLD=0.82 +# Soglia per l'iniezione automatica di una query trovata nel contesto AION_SQL_QM_INJECT_THRESHOLD=0.80 -# 0 = inject anche query draft/suggested ad alto score (consigliato) +# Inietta nel contesto solo query contrassegnate come verificate con successo AION_SQL_QM_INJECT_VERIFIED_ONLY=0 -# Blocca list_tables / memory search finché non esegui execute_sql (cache server) +# Blocca l'esplorazione delle tabelle finche' non si esegue una query valida AION_SQL_QM_GATE_EXPLORATION=1 -# 0 = only agent calls sql_memory_save / save_successful_sql (recommended) +# Apprendimento ed estrazione automatica delle query SQL SENZA chiamata manuale dei tool AION_SQL_QM_AUTO_LEARN=0 -AION_SQL_QM_SEARCH_BEFORE_RUN=1 +# Abilita i tool nativi per la gestione di SQL Query Memory AION_SQL_QM_NATIVE_TOOLS=1 +# Numero di esecuzioni riuscite necessarie per considerare verificata una query AION_SQL_QM_AUTO_VERIFY_THRESHOLD=3 +# Timeout in secondi per l'esecuzione dei tool di SQL Query Memory AION_SQL_QM_TOOL_TIMEOUT_SEC=60 +# Progetto corrente selezionato per le query SQL # AION_SQL_QM_CURRENT_PROJECT=default +# Caratteri massimi per la query SQL iniettata nel contesto # AION_SQL_QM_INJECT_MAX_SQL_CHARS=2000 +# Stringa di connessione PostgreSQL per il database di destinazione # AION_POSTGRES_URL=postgresql://user:pass@localhost:5432/dbname - -See also `datasource_memory_protocol` for Mnemos note format. - -# Mnemos LTM (native, in-process) -AION_LTM_WAKE_MAX_ROWS=20 -AION_MNEMOS_RECALL_LIMIT=10 -AION_MNEMOS_NATIVE_TOOLS=1 -AION_MNEMOS_READONLY_TOOLS=0 -AION_MNEMOS_RECALL_LIMIT_EXPOSED=1 -AION_MNEMOS_RANK_HALF_LIFE_DAYS=90 -AION_MNEMOS_RANK_W_RECENCY=0.3 -AION_MNEMOS_RANK_W_IMPORTANCE=0.2 -# Hybrid recall: FTS + embedding RRF merge (falls back to FTS if service unavailable) -AION_MNEMOS_EMBEDDING_RECALL=1 -# Embed notes during bulk ingest (set 0 only for very large one-shot imports) -AION_MNEMOS_EMBED_ON_BULK=1 -AION_MNEMOS_EMBEDDING_MIN_SCORE=0.25 -AION_MNEMOS_EMBEDDING_SCAN_LIMIT=300 -AION_MNEMOS_HYBRID_CANDIDATE_MULT=3 -# Nightly dream cycle (compress, contradictions, confidence decay, embedding backfill) -AION_MNEMOS_DREAM_ENABLED=1 -AION_MNEMOS_DREAM_HOUR=3 -AION_MNEMOS_DREAM_INTERVAL_SEC=86400 -# Optional: entity-alias RRF (off by default; see docs/memory/mnemos-hardening.md) -# AION_MNEMOS_ENTITY_RECALL=0 -# Dream confidence decay (defaults shown) -# AION_MNEMOS_CONFIDENCE_DECAY_DAYS=90 -# AION_MNEMOS_CONFIDENCE_DECAY_FACTOR=0.9 -# AION_MNEMOS_CONFIDENCE_MIN=0.2 -# LTM post-turn extractor: skip notes below this importance (1–5) -AION_LTM_MIN_IMPORTANCE=2 -# Nudge in UI after much reasoning with zero tool calls (0=disable char gate) -AION_AGENT_MIN_REASONING_CHARS_WITHOUT_TOOL=0 -# Legacy: optional extra gate on raw SSE reasoning chunk count (0=ignore; prefer chars above) -AION_AGENT_MAX_REASONING_WITHOUT_TOOL=0 -# Parameterize SQL literals before sql_query_memory auto-learn save +# Parametrizza automaticamente i valori letterali nelle query salvate AION_SQL_QM_PARAMETERIZE=1 -# Intent + SQL structure composite search (cross-question reuse, e.g. same template different name) +# Soglia di corrispondenza per la ricerca strutturale AST delle query AION_SQL_QM_STRUCT_MATCH_THRESHOLD=0.85 - -# Datasource Memory Workflow (SQL metadata profiles — agent-driven persist, no auto-save hooks) +# Abilita il workflow di gestione dei metadata dei datasource SQL AION_DATASOURCE_MEMORY_WORKFLOW=1 +# Abilita l'orchestrazione automatica dei metadata dei datasource AION_DATASOURCE_MEMORY_ORCHESTRATOR=1 +# Inietta la mappa di navigazione delle tabelle prima dell'avvio del turno AION_DATASOURCE_NAV_PRE_TURN_INJECT=1 +# Numero massimo di tabelle elencabili in un singolo passaggio dal tool AION_DATASOURCE_MAX_LIST_TABLES=3 +# Mostra un promemoria per persistere i metadata appena scoperti AION_DATASOURCE_PERSIST_REMINDER=1 -# Bind SQL/MemPalace memory tools to chat-ui project; block agent project override (default on) +# Vincola i tool SQL al progetto selezionato nella chat UI ed evita override AION_SQL_QM_PROJECT_SCOPE_ENFORCE=1 -# Comma-separated PromQL memory tools hidden on SQL profiles (defaults cover search_known_query, save_successful_query, …) +# Nomi dei tool PromQL disabilitati sui profili SQL (separati da virgola) # AION_DATASOURCE_BLOCKED_PROMQL_TOOLS= -# skills_hub: skill_view / skill_list rispettano profile.skills (gate anche in-process in src/main.py) -AION_SKILL_VIEW_ENFORCE_PROFILE=1 - -# ----------------------------------------------------------------------------- -# Sessioni, upload, dati — session_workspace, API -# ----------------------------------------------------------------------------- -# Cartella dati (sessions/, db, …). In Docker spesso `/app/data`; in dev sulla macchina usare `data` -# o un path assoluto scrivibile — **non** lasciare `/app/data` se l’API non gira nel container. -AION_DATA_DIR=data -AION_UPLOAD_MAX_BYTES=52428800 -# Legacy Word (.doc Word 97–2003): convert to .docx on upload via LibreOffice (soffice). -# Docker: libreoffice-writer-nogui in Dockerfile.backend. Dev Mac: brew install --cask libreoffice -AION_OFFICE_AUTO_CONVERT_LEGACY_WORD=1 -# Path to soffice if not on PATH (macOS: /Applications/LibreOffice.app/Contents/MacOS/soffice) +# ============================================================================= +# 08. SANDBOX DI ESECUZIONE & ISOLAMENTO SICUREZZA (Sandbox, Podman & Policy) +# ============================================================================= +# Backend di esecuzione codice: subprocess (dev locale) | container (Podman/Docker prod) +AION_SANDBOX_BACKEND=subprocess +# Blocca l'esecuzione ed emette un errore se il backend richiesto non e' disponibile +AION_SANDBOX_FAIL_CLOSED=1 +# Timeout in secondi per l'esecuzione di script Python/Node nella sandbox +AION_SANDBOX_RUN_TIMEOUT_SEC=600 +# Limite di byte catturati dallo stdout/stderr di uno script prima del troncamento +AION_SANDBOX_MAX_OUTPUT_BYTES=500000 +# Dimensione massima in byte per la lettura di un file di testo intero +# AION_SANDBOX_READ_TEXT_MAX_BYTES=2097152 +# Soglia sotto la quale applicare la dimensione di lettura predefinita +# AION_SANDBOX_READ_TEXT_IGNORE_BELOW=65536 +# Abilita l'analisi linter con Ruff sul codice Python prima dell'esecuzione (0 = disabilitato) +AION_SANDBOX_RUFF_BLOCK=0 +# Path dell'eseguibile Node.js personalizzato se non presente sul PATH +# AION_NODE_PATH=/usr/local/bin/node +# Path dell'eseguibile LibreOffice (soffice) se non presente sul PATH # AION_SOFFICE_PATH= -# AION_OFFICE_CONVERT_TIMEOUT_SEC=90 -# 1 = embed session images as Haystack ImageContent on the user turn (vision-capable LLM). -# 0 = legacy: only the text list from _format_attachments_block (default). -AION_CHAT_MULTIMODAL_ATTACHMENTS=1 -# 1 = also embed PDFs as Haystack FileContent (native “file” parts). Default 0: vLLM and many -# OpenAI-compatible servers return 501 ``Unknown part type: file``. Enable only if your provider -# documents PDF-in-chat. PDFs remain listed in text for OCR/tools either way. -AION_CHAT_MULTIMODAL_PDF=1 -# 1 = rasterizza le pagine PDF in PNG (PyMuPDF) e le invia come ImageContent — utile con vLLM / API -# che non supportano le parti native ``file``. Richiede AION_CHAT_MULTIMODAL_ATTACHMENTS=1. Se attivo, -# ha priorità su AION_CHAT_MULTIMODAL_PDF (FileContent). -AION_CHAT_MULTIMODAL_PDF_COMPATIBILITY_MODE=1 -# Pagina massime da rasterizzare per ogni PDF (ogni pagina = una parte immagine nel messaggio). -AION_CHAT_MULTIMODAL_PDF_MAX_PAGES=5 -# Lato lungo massimo della pagina rasterizzata (px) prima dell’encode PNG. -AION_CHAT_MULTIMODAL_PDF_RASTER_MAX_SIDE=2048 -# Per-file size cap for native embedding (bytes). Larger files stay text-listed only. -AION_CHAT_MULTIMODAL_MAX_BYTES=26214400 -# Max number of native parts (images + optional PDFs) per user message (binaries then text). -AION_CHAT_MULTIMODAL_MAX_FILES=8 -# Tenant SQL default (Chainlit data layer, storage) -AION_DEFAULT_TENANT_ID=default -# Log fallback LLM (1 = attivo) — src/runtime/llm_router.py -AION_LLM_FALLBACK_LOG=1 -# TTL secondi coda grafici in Redis (fallback locale se Redis assente) -AION_CHART_QUEUE_TTL_SEC=3600 -# 1 = tipi grafico sessione (line/area/bar) da tool MCP; 0 = solo linea (comportamento legacy) -AION_CHART_KIND_ENABLED=1 -# SQLAlchemy echo (0/disabilitato) -AION_SQL_ECHO=0 -# Plugin: liste CSV opzionali (vuoto = nessun filtro oltre deny) -AION_PLUGINS_ALLOWLIST= -AION_PLUGINS_DENYLIST= -# ----------------------------------------------------------------------------- -# MCP — src/mcp_manager.py -# ----------------------------------------------------------------------------- -# 1/true/yes = pool stdio persistente (non spawn a ogni messaggio) +# --- Permessi e Confinamento Subprocess --- +# Variabili d'ambiente ereditate dai processi in esecuzione nella sandbox (allowlist) +AION_SANDBOX_ENV_ALLOWLIST=LANG,LC_ALL,PATH,HOME,VIRTUAL_ENV,PIP_DISABLE_PIP_VERSION_CHECK +# Prefissi di variabili d'ambiente il cui accesso e' vietato all'interno della sandbox +AION_SANDBOX_ENV_DENY_PREFIX=AION_API_,AION_DB_,AION_CHAT_AUTH_,AION_ADMIN_,AION_REDIS_,AION_SETUP_ +# Abilita il confinamento del filesystem (Landlock su Linux + guardie Python) +AION_SANDBOX_SUBPROCESS_CONFINE=1 +# Abortisce l'esecuzione sandbox su Linux se Landlock non e' applicabile +# AION_SANDBOX_LANDLOCK_REQUIRED=0 +# Consente l'importazione e l'uso di moduli HTTP (requests, httpx) negli script sandbox +AION_SANDBOX_ALLOW_HTTP_IMPORTS=0 +# Radice della sessione nel filesystem Sandbox +# AION_SANDBOX_SESSION_ROOT= +# Abilita la radice piatta per le sessioni della sandbox +# AION_SANDBOX_FLAT_SESSION_ROOT=0 +# Indica se l'esecuzione corrente e' gia' all'interno di un container +# AION_SANDBOX_IN_CONTAINER=0 + +# --- Sandbox in Container (Podman / Docker Integration) --- +# Runtime dei container: podman (scelta primaria rootless) | docker +# AION_CONTAINER_RUNTIME=podman +# Immagine container usata per l'isolamento della sandbox +# AION_SANDBOX_CONTAINER_IMAGE=aion/sandbox:latest +# Socket di comunicazione Podman all'interno del container +# AION_PODMAN_SOCKET=/run/podman/podman.sock +# Socket Podman presente sull'host Linux per bind-mount +# AION_PODMAN_SOCKET_HOST=/run/user/1000/podman/podman.sock +# Percorso assoluto della cartella data/ sull'host per i bind-mount dei container +# AION_SANDBOX_HOST_DATA_DIR=/path/to/AION_Agent/data +# Percorso della radice del repository sull'host +# AION_SANDBOX_HOST_REPO=/path/to/AION_Agent +# UID dell'utente sull'host per la gestione dei permessi dei volumi +# AION_SANDBOX_HOST_UID=1000 +# GID del gruppo sull'host per la gestione dei permessi dei volumi +# AION_SANDBOX_HOST_GID=1000 +# Limite di memoria RAM assegnato a ciascun container sandbox (es. 512m) +# AION_SANDBOX_CONTAINER_MEMORY=512m +# Limite di risorse CPU per il container sandbox (es. 1.0 = 1 core) +# AION_SANDBOX_CONTAINER_CPUS=1.0 +# Limite massimo di processi (PIDs) eseguibili all'interno del container +# AION_SANDBOX_CONTAINER_PIDS_LIMIT=256 +# Abilita il confinamento aggiuntivo dei server MCP nei container +# AION_SANDBOX_MCP_JAIL=1 +# Abilita le etichette di sicurezza SELinux sui container +# AION_SANDBOX_CONTAINER_SELINUX=0 +# Driver di rete per il container sandbox (es. slirp4netns) +# AION_SANDBOX_CONTAINER_NETWORK=slirp4netns + +# --- Gestione Pacchetti & Dipendenze (Python venv / pip / npm) --- +# Crea automaticamente un ambiente virtuale .venv per ciascuna sessione al primo run +AION_SANDBOX_AUTO_VENV=1 +# Pre-installa le dipendenze per le skill office (docx, pdf, pptx, xlsx) nel venv di sessione +AION_SANDBOX_VENV_BOOTSTRAP_SKILLS=1 +# Consente l'installazione dinamica di pacchetti Python tramite sandbox_install_python_packages +AION_SANDBOX_ALLOW_PACKAGE_INSTALL=1 +# Consente l'installazione dinamica di pacchetti npm tramite sandbox_install_npm_packages +AION_SANDBOX_ALLOW_NPM_INSTALL=1 +# Timeout in secondi per l'installazione di pacchetti via pip +AION_SANDBOX_PIP_TIMEOUT_SEC=600 +# Numero massimo di pacchetti Python installabili in una singola richiesta +AION_SANDBOX_PIP_MAX_PACKAGES=32 +# Usa "uv pip" anziche' pip per accelerare l'installazione delle dipendenze (richiede uv) +AION_SANDBOX_PIP_USE_UV=1 +# Indice PyPI personalizzato o mirror aziendale per pip +AION_SANDBOX_PIP_INDEX_URL= +# Timeout per l'installazione di pacchetti via npm +# AION_SANDBOX_NPM_TIMEOUT_SEC=600 +# Numero massimo di pacchetti npm installabili in un singolo comando +# AION_SANDBOX_NPM_MAX_PACKAGES=16 + +# --- Filesystem Policy (Politiche di accesso ai file e limiti) --- +# Percorso del file YAML di configurazione delle politiche filesystem +AION_FS_POLICY_PATH=config/fs_policy.yaml +# Dimensione massima in byte per i file modificabili dall'agente +AION_EDIT_MAX_FILE_BYTES=2097152 +# Dimensione massima dei file analizzabili tramite ricerca grep +AION_GREP_MAX_FILE_BYTES=524288 +# Numero massimo di corrispondenze restituite da una ricerca grep +AION_GREP_MAX_MATCHES=200 +# Numero massimo di percorsi restituiti dalle ricerche di file con glob +AION_GLOB_MAX_PATHS=500 +# Righe massime restituite per ciascun blocco di lettura dei file +AION_CHUNK_MAX_LINES=500 + +# ============================================================================= +# 09. SERVER MCP & INTEGRAZIONI ESTERNE (Model Context Protocol & Services) +# ============================================================================= +# --- Gestione Pool e Lifecycle Server MCP --- +# Mantiene un pool di connessioni stdio persistenti ai server MCP (1 = attivo) AION_MCP_POOL=1 -# 1 = worker stdio condivisi per (user, tenant) tra tutte le chat; session id iniettato a ogni tool call +# Condivide i worker MCP stdio tra sessioni dello stesso utente/tenant AION_MCP_USER_POOL=1 -# 1 = muta os.environ nel parent prima di ogni call_tool (legacy; preferire session-scoped pool + args) +# Inietta le variabili d'ambiente di sessione nel processo prima di ogni chiamata tool AION_MCP_SESSION_ENV_INJECT=1 -# Warm MCP al boot API (prima della prima chat). 0 = solo warm on-demand (/v1/chat/prepare o primo messaggio) +# Avvia il pre-riscaldamento (warm-up) dei server MCP al boot dell'API AION_MCP_STARTUP_WARM=1 -# 1 = warm in background (API pronta subito); 0 = lifespan attende fine warm (default consigliato dev) +# Esegue il pre-riscaldamento MCP in background senza bloccare l'avvio dell'API AION_MCP_STARTUP_WARM_ASYNC=0 -# Profili YAML (slug o name, CSV) di cui unire mcp_servers al warm boot. * = tutti i profili (pesante) +# Elenco di profili YAML (separati da virgola) di cui avviare i server MCP al boot AION_MCP_STARTUP_WARM_PROFILES=aion_std,generic_assistant -# Alias singolo profilo warm (legacy; preferire AION_MCP_STARTUP_WARM_PROFILES) +# Profilo singolo per il pre-riscaldamento (legacy) # AION_MCP_STARTUP_WARM_PROFILE=aion_std -# 1 = warm tutti gli stdio nel registry (ignora profili). Pesante se molti MCP custom +# Pre-riscalda tutti i server del registro MCP (1 = ignora i profili) AION_MCP_STARTUP_WARM_ALL=0 -# user_id usato per credenziali/HOME MCP al boot (legacy singolo utente) +# Utente predefinito utilizzato per le credenziali al boot AION_MCP_STARTUP_WARM_USER_ID=default -# CSV: pre-riscalda il pool per più utenti (es. demo,default). Se vuoto: USER_ID poi AION_SETUP_CHAT_IDENTIFIER poi default +# Elenco di utenti (CSV) per cui pre-riscaldare i pool MCP all'avvio # AION_MCP_STARTUP_WARM_USER_IDS=demo,default -# Secondi di inattività prima di kill worker pool (0 = mai; default 1800 = 30 min) +# Tempo di inattivita' in secondi prima di chiudere un worker inattivo del pool (0 = mai) AION_MCP_POOL_IDLE_SEC=1800 -# Log warning quando il pool supera questa soglia (file descriptor exhaustion guard) +# Soglia di avviso per il numero di connessioni aperte nel pool MCP # AION_MCP_POOL_WARN_SIZE=400 -# 1 = applica idle cleanup anche ai worker user-pool (default 0 = sempre caldi) +# Applica la chiusura per inattivita' anche ai worker del pool utente AION_MCP_USER_POOL_IDLE_CLEANUP=0 -# Timeout warm per singolo server in warm_session (secondi) +# Timeout in secondi per il pre-riscaldamento di un singolo server MCP AION_MCP_WARM_TIMEOUT_SEC=20 -# Dopo un warm fallito, non ritentare per N secondi (evita 20s di attesa a ogni chat) +# Tempo di attesa in secondi prima di ritentare il warm-up di un server fallito AION_MCP_WARM_FAIL_COOLDOWN_SEC=600 -# Timeout breve sui retry dopo il primo fallimento +# Timeout sui tentativi di retry dopo il primo fallimento di warm-up AION_MCP_WARM_RETRY_TIMEOUT_SEC=3 -# Timeout list_tools in build_mcp_tools (secondi) +# Timeout per il recupero della lista dei tool da un server MCP AION_MCP_LIST_TOOLS_TIMEOUT_SEC=30 -# Server con pool per chat session (sandbox isolati anche con AION_MCP_USER_POOL=1) +# Nomi dei server MCP da isolare con un pool dedicato per ciascuna sessione AION_MCP_SESSION_SCOPED_SERVERS=session_sandbox,promo_render,ocr_mcp,skills_hub,memory,aion_subagents -# Registry base (commit nel repo): definizioni predefinite +# Percorso del file del registro base dei server MCP AION_MCP_REGISTRY_PATH=config/mcp_registry.yaml -# Overlay locale (merge sopra il base; tipicamente non committato — vedi .gitignore) -AION_MCP_REGISTRY_LOCAL_PATH= -# Nei YAML MCP, `env: { API_KEY: "${MY_API_KEY}" }` viene risolto da queste variabili OS/.env -# Import da Claude Desktop JSON → YAML locale: -# python -m src.mcp_import -i /path/to/claude_desktop_config.json -# Timeout attesa risultato tool MCP da thread (secondi) -AION_MCP_TOOL_RESULT_TIMEOUT=120 -# toolbox-postgres: timeout asyncio per singola query (dopo questo il worker MCP viene riciclato) -AION_PG_QUERY_TIMEOUT_SEC=60 -# Wizard MCP Hub: timeout e cap token per POST advise (separato dalla chat) -AION_MCP_ADVISE_TIMEOUT=120 -AION_MCP_ADVISE_MAX_TOKENS=16480 -AION_MCP_ADVISE_DISABLE_REASONING=1 -# Token GitHub opzionale: aumenta il rate limit della ricerca marketplace (topic + nome repo) -# GITHUB_TOKEN= -AION_GITHUB_TOKEN= -# Timeout shutdown worker stdio (secondi) +# Percorso del file di override locale per il registro MCP +AION_MCP_REGISTRY_LOCAL_PATH= +# Timeout massimo in secondi per l'attesa dell'esito di un tool MCP +AION_MCP_TOOL_RESULT_TIMEOUT=120 +# Timeout per le query PostgreSQL gestite dal server toolbox-postgres +AION_PG_QUERY_TIMEOUT_SEC=60 +# Timeout per lo spegnimento di un worker stdio MCP AION_MCP_WORKER_SHUTDOWN_TIMEOUT=15 -# Handshake initialize() MCP stdio (primo avvio uv può richiedere >15s) +# Timeout per la fase di handshake iniziale initialize() dei server MCP AION_MCP_INIT_TIMEOUT=60 +# Passato ai processi MCP stdio per identificarne la sessione +# AION_CHAT_SESSION_ID= -# --- MCP per-user isolation (enterprise) --- -# Chiave AES-256-GCM (32 byte = 64 hex chars). Generare: python -c "import secrets; print(secrets.token_hex(32))" -AION_CREDENTIAL_ENCRYPTION_KEY= -# Abilita credential store per-utente (${AION_USER_*}) e API /v1/integrations +# --- Integrazioni Utente, Credenziali & OAuth MCP --- +# Abilita la gestione delle credenziali MCP per-utente (/v1/integrations) AION_MCP_USER_CREDENTIALS=1 +# TTL di cache per la lista delle integrazioni utente # AION_INTEGRATIONS_LIST_TTL=30 +# TTL di cache per i probe di stato delle integrazioni # AION_INTEGRATIONS_PROBE_TTL=60 +# Timeout per i probe delle integrazioni # AION_INTEGRATIONS_PROBE_TIMEOUT=5 -# Isola HOME/XDG per processo MCP (consigliato in multi-utente) +# Isola le directory HOME/XDG per ciascun processo MCP utente AION_MCP_USER_HOME_ISOLATION=1 -# OAuth MCP: registrazione dinamica client RFC 7591 (1=abilitata, default). 0 = richiede client_id manuale in Hub. +# Abilita la registrazione dinamica dei client OAuth MCP (RFC 7591) AION_MCP_OAUTH_DYNAMIC_REGISTRATION=1 -# Margine (secondi) prima della scadenza per refresh automatico del token OAuth (default 60) +# Margine di secondi prima della scadenza per effettuare il refresh del token OAuth AION_OAUTH_TOKEN_EXPIRY_BUFFER_SECONDS=60 -# URL base assoluto per OAuth MCP (obbligatorio in Docker con NEXT_PUBLIC_AION_API_URL=/api). -# Deve essere l'URL browser-facing dietro Caddy (…/api), NON la porta interna uvicorn :8001. -# Esempio produzione: https://cliente.example.com/api -# Esempio locale Caddy :8066: http://thinkstation:8066/api +# URL pubblico di callback per l'autenticazione OAuth MCP dietro reverse proxy # AION_OAUTH_REDIRECT_BASE_URL=https://cliente.example.com/api -# ----------------------------------------------------------------------------- -# Agent DB MCP (SQLite per utente) — mcp_servers/agent_db/server.py, ltm_notifier.py, -# sync HTTP → src/api/agent_db_internal.py (stesso AION_AGENT_DB_INTERNAL_SECRET sul processo API) -# ----------------------------------------------------------------------------- -# Directory dei file /.db (override anche in config/mcp_registry.yaml → agent_db.env) -AION_AGENT_DB_ROOT=data/agent_dbs -# Notifica drawer MemPalace dopo insert batch se righe >= soglia (create_table notifica sempre se sync attiva) -AION_AGENT_DB_LTM_SYNC_THRESHOLD=10 -# URL completo POST /internal/agent-db/sync-drawer (vuoto = nessuna sync HTTP dal subprocess MCP) -AION_AGENT_DB_LTM_SYNC_URL=http://localhost:8001/internal/agent-db/sync-drawer -# Segreto header X-AION-Agent-DB-Secret: deve coincidere tra FastAPI e variabile d’ambiente vista dal worker MCP -AION_AGENT_DB_INTERNAL_SECRET= -# Timeout secondi richiesta HTTP verso l’API interna (ltm_notifier) -AION_AGENT_DB_LTM_HTTP_TIMEOUT=8 -# Limiti/controlli runtime Agent DB (PROJECTv4 §12) -AION_AGENT_DB_MAX_SIZE_MB=2048 -AION_AGENT_DB_MAX_TABLES_PER_USER=50 -AION_AGENT_DB_MAX_ROWS_PER_TABLE=500000 -AION_AGENT_DB_DATE_LOCALE=it_IT -AION_AGENT_DB_DECIMAL_LOCALE=IT -AION_AGENT_DB_BACKUP_ON_DROP=1 -AION_AGENT_DB_QUERY_TIMEOUT_MS=5000 -AION_AGENT_DB_MAX_EXPORT_ROWS=100000 - -# Passato ai processi MCP stdio (sandbox file per sessione) -# AION_CHAT_SESSION_ID= # di solito impostato dal runtime, non in .env statico +# --- Wizard MCP Hub Advising & Token GitHub --- +# Timeout per il servizio di consulenza e raccomandazione tool dell'MCP Hub +AION_MCP_ADVISE_TIMEOUT=120 +# Token massimi generabili dalla risposta del wizard MCP Hub +AION_MCP_ADVISE_MAX_TOKENS=16480 +# Disabilita i blocchi di pensiero durante la generazione delle raccomandazioni +AION_MCP_ADVISE_DISABLE_REASONING=1 +# Token massimi per la generazione di nuovi profili/skill via wizard +AION_WIZARD_MAX_TOKENS=8192 +# Token personale GitHub per aumentare i rate limit nella ricerca dell'MCP Marketplace +AION_GITHUB_TOKEN= +# GITHUB_TOKEN= -# ----------------------------------------------------------------------------- -# OCR MCP — mcp_servers/ocr_mcp/server.py -# ----------------------------------------------------------------------------- +# OCR MCP (Estrazione testo e tabelle da immagini ed elementi grafici) AION_OCR_BASE_URL=localhostocr/v1 AION_OCR_MODEL=zai-org/GLM-OCR AION_OCR_API_KEY=EMPTY @@ -508,511 +673,401 @@ AION_OCR_MAX_TOKENS=8192 AION_OCR_TIMEOUT=120 AION_OCR_MAX_IMAGE_BYTES=20971520 -# ----------------------------------------------------------------------------- -# Ricerca web in-process (Tavily / Brave / SearXNG) + fetch pagine — src/runtime/native_tools/ -# Abilita i provider desiderati (1/on/true). Chiavi API da admin o qui. I profili abilitano i tool con native_tool_groups. -# ----------------------------------------------------------------------------- +# Promo Capture MCP (Generazione immagini promozionali da HTML/React via Playwright) +AION_PROMO_CAPTURE_ENABLED=0 +# AION_PROMO_CAPTURE_TIMEOUT_MS=90000 + +# ============================================================================= +# 10. RICERCA WEB & STRUMENTI NATIVI (Web Search, Fetch & Scraping) +# ============================================================================= +# Percorso del file di configurazione per il registro dei tool nativi AION_NATIVE_TOOL_REGISTRY_PATH=config/native_tool_registry.yaml +# Percorso dell'overlay locale per il registro dei tool nativi AION_NATIVE_TOOL_REGISTRY_LOCAL_PATH= + +# --- Provider di Ricerca Web (Tavily, Brave, SearXNG) --- +# Abilita il motore di ricerca web Tavily (1 = attivo) AION_WEB_SEARCH_TAVILY_ENABLED=1 +# Abilita il motore di ricerca web Brave Search (0 = disabilitato) AION_WEB_SEARCH_BRAVE_ENABLED=0 +# Abilita il motore di ricerca web SearXNG (0 = disabilitato) AION_WEB_SEARCH_SEARXNG_ENABLED=0 +# Chiave API per l'autenticazione al servizio Tavily Search AION_TAVILY_API_KEY= +# Chiave API per l'autenticazione al servizio Brave Search AION_BRAVE_SEARCH_API_KEY= -# Base URL istanza SearXNG (senza slash finale), es. https://search.example.org +# URL base dell'istanza SearXNG (es. https://search.example.org) AION_SEARXNG_BASE_URL= -# Provider usato per primo: tavily | brave | searxng +# Provider di ricerca primario da utilizzare: tavily | brave | searxng AION_WEB_SEARCH_DEFAULT_PROVIDER=tavily -# Fallback CSV se il default fallisce o è disabilitato, es. brave,searxng +# Ordine di fallback dei provider se il primario non risponde (separati da virgola) AION_WEB_SEARCH_FALLBACK_ORDER=brave,searxng +# Numero massimo di risultati di ricerca da restituire per ciascuna query AION_WEB_SEARCH_MAX_RESULTS=8 +# Timeout massimo in secondi per l'esecuzione di una ricerca web AION_WEB_SEARCH_TIMEOUT_SEC=30 -# Opzionale: codice lingua hint (molti backend ignorano se non supportato) +# Codice lingua consigliato per filtrare i risultati delle ricerche web (opzionale) AION_WEB_SEARCH_LANGUAGE= -# CSV host (virgola o ;), es. docs.python.org,wikipedia.org,*.gov.it — vedi doc ricerca web +# Profondita' della ricerca Tavily: basic | advanced | fast | ultra-fast +AION_TAVILY_SEARCH_DEPTH=basic +# Domini consentiti per la ricerca e il fetch (es. docs.python.org,wikipedia.org) AION_WEB_SEARCH_ALLOWED_HOSTS= -# 1 = con lista precedente non vuota, tutte le ricerche/fetch rispettano solo quei domini (merge con filtro utente chat) +# Applica la lista domini precedente in modo restrittivo su tutte le ricerche web AION_WEB_SEARCH_ENFORCE_GLOBAL_ALLOWLIST=0 -# 1 = web_search disabilitata finché il client non invia web_search_enabled=true (sicurezza ambienti restrittivi) +# Disabilita la ricerca web finche' il client non invia web_search_enabled=true AION_WEB_SEARCH_REQUIRE_CLIENT_OPT_IN=0 + +# --- Scaricamento ed Estrazione Pagine Web (Web Fetch & Scraping) --- +# Timeout in secondi per lo scaricamento di una pagina web tramite web_fetch AION_WEB_FETCH_TIMEOUT_SEC=25 +# Dimensione massima in byte del contenuto HTML scaricabile per singola pagina AION_WEB_FETCH_MAX_BYTES=1500000 -# Estrazione pagina (trafilatura/bs4) prima dell'offload — default 24k inline; con offload vedi sotto +# Caratteri massimi di testo estratto mantenuti direttamente nel contesto dell'agente AION_WEB_FETCH_MAX_CHARS=24000 -# Geocoding MCP (OpenStreetMap Nominatim) — geocode_place / reverse_geocode -# AION_GEOCODING_NOMINATIM_URL=https://nominatim.openstreetmap.org -# AION_GEOCODING_USER_AGENT=AION-Agent/1.0 (your-contact@example.com) -# AION_GEOCODING_MIN_INTERVAL_SEC=1.1 -# PDF evidence crop (MCP pdf_evidence_crop on ocr server) — Word report screenshots -# AION_PDF_EVIDENCE_DPI=200 -# AION_PDF_EVIDENCE_MAX_WHITE_RATIO=0.90 -# Formato risultati tool web nel contesto LLM: toon (default, -30/60% token) | json -AION_TOOL_RESULT_FORMAT=toon -# Regex su URL completo; vuoto = nessun filtro (usa solo in ambienti controllati) +# Caratteri massimi salvati su file quando l'offloading e' attivo +AION_WEB_FETCH_OFFLOAD_MAX_CHARS=200000 +# Espressione regolare per consentire il fetch solo da URL che corrispondono al pattern AION_WEB_FETCH_ALLOWLIST_REGEX= -# 1 = tenta StealthyFetcher Scrapling dopo Fetcher/httpx (richiede scrapling[fetchers] + browser) +# Abilita l'uso di Scrapling per lo scraping stealth e l'aggiramento dei blocchi bot AION_SCRAPLING_STEALTH_ENABLED=0 -# Profondità Tavily: basic | advanced | fast | ultra-fast -AION_TAVILY_SEARCH_DEPTH=basic -# Cap tool result in agent context (NOT page extract — see AION_WEB_FETCH_MAX_CHARS) +# Cap di caratteri per i risultati del tool web_fetch nel contesto LLM AION_TOOL_WEB_FETCH_MAX_CHARS=48000 +# Cap di caratteri per i risultati del tool web_search nel contesto LLM AION_TOOL_WEB_SEARCH_MAX_CHARS=12000 -# Snippet length in TOON web_search rows (single-line; default 1200) +# Lunghezza massima dello snippet per riga nelle ricerche in formato TOON AION_TOON_WEB_SEARCH_SNIPPET_CHARS=1200 -# Compact anticipato dopo N web_search/web_fetch (prima del 92% globale) +# Esegue una compattazione anticipata dopo N chiamate consecutive a tool web AION_WEB_TOOL_COMPACT_AFTER=4 -# Con AION_TOOL_OFFLOAD_ENABLED=1: cap estrazione pagina su disco -AION_WEB_FETCH_OFFLOAD_MAX_CHARS=200000 -AION_TOOL_CIRCUIT_BREAKER_ENABLED=1 -AION_WIKIPEDIA_EXTRACT_FALLBACK_MIN_CHARS=2000 -AION_WIKIPEDIA_FETCH_MODE=article -AION_CHROMA_SHARED_EMBEDDING_CACHE=1 -# Set by migrate_mempalace_to_mnemos_env.py after legacy MemPalace removal -# AION_MEMORY_STACK=mnemos - -# ----------------------------------------------------------------------------- -# API client URLs (chat-ui SSR, upload, download) -# ----------------------------------------------------------------------------- -# Server FastAPI AION (/chat, /profiles, sessioni). Obbligatorio coerente con AION_API_PORT (default 8001). -# Non usare qui l’URL del LLM (AION_API_URL): altrimenti GET /profiles e POST /chat vanno in 404 sul vLLM. -AION_FASTAPI_URL=http://localhost:8001 -# URL pubblico se il browser deve risolvere download diversamente dall’host interno -AION_PUBLIC_API_URL=http://localhost:8001 - -# ----------------------------------------------------------------------------- -# Login chat (chat-ui) — src/chat_auth.py -# ----------------------------------------------------------------------------- -# 1 = schermata di login obbligatoria (password + bcrypt). Utenti nella tabella -# ``users`` di AION_DB_URL. Crea utenti: wizard setup, l'Admin UI o l’API POST /admin/users. -# o POST /admin/users. Hash manuale: python -m src.chat_auth hash -AION_CHAT_PASSWORD_AUTH=1 -# Deprecated alias (upgrade-aion migra → AION_CHAT_PASSWORD_AUTH) -# AION_CHAINLIT_PASSWORD_AUTH=0 -# Opzionale: solo automazione (es. setup con -y / --import-state senza prompt). Lasciare vuoto in uso normale. -AION_SETUP_CHAT_IDENTIFIER= -AION_SETUP_CHAT_PASSWORD= +# Rapporto di compattazione anticipata per tool web +# AION_WEB_TOOL_COMPACT_RATIO=0.55 +# Formato di rappresentazione dei risultati dei tool nel contesto: toon | json +AION_TOOL_RESULT_FORMAT=toon +# Limite massimo di caratteri per il risultato di un generico tool nel contesto +AION_TOOL_RESULT_MAX_CHARS=24000 -# ----------------------------------------------------------------------------- -# Admin panel (/admin) — SEMPRE protetto (stile Grafana) -# ----------------------------------------------------------------------------- -# 1 = pannello /admin richiede login + ruolo admin (default; raccomandato). -# 0 = escape hatch dev: gli endpoint /admin/* sono aperti. Non usare in prod. -AION_ADMIN_PASSWORD_AUTH=1 -# Bootstrap dell'admin di default al primo setup quando il tenant non ha -# ancora alcun utente con ruolo "admin". L'utente viene creato con -# must_change_password=1 e mostrera' un banner non-bloccante al primo login. -AION_SETUP_ADMIN_BOOTSTRAP=1 -AION_SETUP_ADMIN_DEFAULT_IDENTIFIER=admin -AION_SETUP_ADMIN_DEFAULT_PASSWORD=admin +# ============================================================================= +# 11. FILE, UPLOAD, DOCUMENTI & ALLEGATI MULTIMODALI (Storage, Uploads & Vision) +# ============================================================================= +# Cartella principale per la conservazione dei dati di sessione e database (default: data) +AION_DATA_DIR=data +# Dimensione massima in byte consentita per il caricamento di file di allegato (50MB) +AION_UPLOAD_MAX_BYTES=52428800 +# Abilita l'ingestion ed estrazione automatica del testo dai documenti caricati +AION_DOC_AUTO_INGEST=1 +# Pagina massime analizzate automaticamente per ogni documento caricato +AION_DOC_AUTO_INGEST_MAX_PAGES=500 +# Budget di tempo massimo in secondi riservato all'ingestion del documento +AION_DOC_AUTO_INGEST_BUDGET_SEC=120 +# Converte automaticamente i vecchi documenti Word (.doc) in formato .docx via LibreOffice +AION_OFFICE_AUTO_CONVERT_LEGACY_WORD=1 +# Timeout in secondi per la conversione dei file Word tramite LibreOffice +# AION_OFFICE_CONVERT_TIMEOUT_SEC=90 +# Path dell'eseguibile soffice se non presente nel PATH di sistema +# AION_SOFFICE_PATH= -# ----------------------------------------------------------------------------- -# Prometheus / Grafana — config/default.yaml (o ${VAR} nel YAML) -# ----------------------------------------------------------------------------- -# Esempio: in default.yaml usa api_url: "${PROMETHEUS_API_URL}" -# PROMETHEUS_API_URL=http://localhost:9090/api/v1 -# PROMETHEUS_TIMEOUT_SEC=5 -# GRAFANA_URL=http://localhost:3000 -# GRAFANA_API_KEY= +# --- Gestione Allegati Multimodali e Vision --- +# Invia le immagini caricate come oggetti ImageContent ai modelli multimodali (vision) +AION_CHAT_MULTIMODAL_ATTACHMENTS=1 +# Invia i file PDF come parti native FileContent ai modelli che supportano PDF nativi +AION_CHAT_MULTIMODAL_PDF=1 +# Rasterizza le pagine dei PDF in immagini PNG per garantire la compatibilita' con vLLM +AION_CHAT_MULTIMODAL_PDF_COMPATIBILITY_MODE=1 +# Pagina massime da convertire in immagine per ciascun file PDF caricato +AION_CHAT_MULTIMODAL_PDF_MAX_PAGES=5 +# Risoluzione massima in pixel per il lato lungo delle immagini rasterizzate da PDF +AION_CHAT_MULTIMODAL_PDF_RASTER_MAX_SIDE=2048 +# Dimensione massima del file in byte per l'invio nativo ai modelli multimodali +AION_CHAT_MULTIMODAL_MAX_BYTES=26214400 +# Numero massimo di allegati nativi (immagini/PDF) inviabili per singolo messaggio +AION_CHAT_MULTIMODAL_MAX_FILES=8 -# ----------------------------------------------------------------------------- -# Altri path memoria (YAML memory.*) -# ----------------------------------------------------------------------------- -# MEMORY_CHAT_DB_PATH=data/chat_memory.db -# MEMORY_QUERY_DB_PATH=data/query_memory.db +# --- Pulizia Sessioni & Sincronizzazione Sub-agenti --- +# Giorni di inattivita' prima di sottoporre una sessione a pulizia automatica (0 = disabilitato) +AION_SESSION_CLEANUP_MAX_AGE_DAYS=15 +# Intervallo tra i controlli di pulizia delle sessioni in secondi (86400 = 24 ore) +AION_SESSION_CLEANUP_INTERVAL_SEC=86400 +# Modalita' pulizia: 0 = archiviazione (soft-delete), 1 = cancellazione fisica file e DB +AION_SESSION_CLEANUP_HARD_DELETE=0 +# Limite totale in MB per la sincronizzazione dei file verso le sessioni dei sub-agenti +AION_SUBAGENT_UPLOAD_SYNC_MAX_TOTAL_MB=50 +# Limite per singolo file durante la sincronizzazione dei file verso i sub-agenti +AION_SUBAGENT_UPLOAD_SYNC_MAX_FILE_MB=25 +# ID del tenant predefinito per l'isolamento dei dati nei sistemi multi-tenant +AION_DEFAULT_TENANT_ID=default -# ----------------------------------------------------------------------------- -# Admin UI (Next.js) — admin-ui/ -# ----------------------------------------------------------------------------- -# URL del backend FastAPI per il browser (deve iniziare con NEXT_PUBLIC_ per Next.js) -NEXT_PUBLIC_AION_API_URL=http://localhost:8001 +# --- Backend di Storage (Locale vs AWS S3 / MinIO) --- +# Backend di archiviazione dei file: local | s3 +AION_STORAGE_BACKEND=local +# Percorso radice locale per l'archiviazione dei dati quando AION_STORAGE_BACKEND=local +AION_STORAGE_LOCAL_ROOT=data +# Nome del bucket S3 per il salvataggio dei file quando AION_STORAGE_BACKEND=s3 +AION_STORAGE_S3_BUCKET=aion-sessions +# URL dell'endpoint S3 (opzionale per MinIO o provider compatibili S3) +AION_STORAGE_S3_ENDPOINT_URL= +# Regione geografica del bucket S3 +AION_STORAGE_S3_REGION=us-east-1 +# Access Key per l'autenticazione all'infrastruttura S3 +AION_STORAGE_S3_ACCESS_KEY= +# Secret Key per l'autenticazione all'infrastruttura S3 +AION_STORAGE_S3_SECRET_KEY= +# Utilizza lo stile path-style per le richieste S3 (consigliato con MinIO) +AION_STORAGE_S3_USE_PATH_STYLE=0 +# Durata in secondi per la validita' degli URL presigned generati da S3 +AION_STORAGE_S3_PRESIGNED_EXPIRES=3600 -# Hermes / roadmap — skill, contesto, learning, approval, cron # ============================================================================= -# FASE A — Progressive disclosure -AION_SKILL_SYSTEM_PROMPT_MODE=index -# Model-specific prompt fragments (config_std/prompts/*.txt) merged into system prompt -AION_MODEL_PROMPT_FRAGMENTS=1 -# AION_PROMPTS_DIR=config_std/prompts -# AION_TOOL_DESCRIPTIONS_DIR=config_std/tool_descriptions -# AION_PROMPT_LAYER_TOTAL_BUDGET=6000 -# Tool-first file delivery (OpenCode-style). Legacy artifact XML stream when 1: -AION_ARTIFACT_STREAM_LEGACY=0 -AION_STREAM_LOOP_V2=1 -# Per-model tool exposure: GPT → sandbox_apply_patch; others → write+edit -AION_MODEL_TOOL_POLICY=1 -# Doom loop: identical tool+args repeated N times → reminder or stop -AION_DOOM_LOOP_THRESHOLD=3 -AION_DOOM_LOOP_ACTION=reminder -# JSON recovery: 0 = do not map "" to {} for tools with required fields; "{" still -> {} for settlement -AION_JSON_RECOVERY_ALLOW_EMPTY=0 -# Force tools_strict on local vLLM (0=off default — truncated tool JSON is common on vLLM) -AION_VLLM_TOOLS_STRICT=0 -# Minimum max_tokens floor for vLLM + thinking when tool-call JSON payloads are large -AION_VLLM_TOOL_ARG_TOKEN_FLOOR=8192 -# FASE G — SOUL / MEMORY / USER (file in data/profiles//) -# 1 = includi SOUL + MEMORY + USER nel system prompt (vedi ProfileMemoryBundle) +# 12. PROFILI, SKILL, APPRENDIMENTO & APPROVALS (System Prompts, Skills & HITL) +# ============================================================================= +# --- Gestione Profili Agente e Prompt di Sistema --- +# Profilo di default da utilizzare se non specificato nella richiesta di chat +AION_DEFAULT_PROFILE=aion_std +# Lingua di fallback per l'interfaccia utente se non rilevata dal browser +AION_DEFAULT_UI_LANGUAGE=en +# Include i moduli SOUL, MEMORY e USER nel system prompt dell'agente AION_SOUL_MEMORY_USER_SPLIT=1 +# Caratteri massimi estratti dal file SOUL.md del profilo +AION_SOUL_FILE_MAX_CHARS=12000 +# Caratteri massimi estratti dal file MEMORY.md del profilo +AION_MEMORY_FILE_MAX_CHARS=2200 +# Caratteri massimi estratti dal file USER.md dell'utente +AION_USER_FILE_MAX_CHARS=1400 +# Inserisce il sommario operativo della memoria nel prompt # AION_MEMORY_OPERATIONAL_SUMMARY=1 +# Inserisce il manifesto dello workspace nel prompt # AION_MEMORY_WORKSPACE_MANIFEST=1 +# Inserisce il contesto dell'orchestrazione nel prompt # AION_ORCHESTRATION_CONTEXT=1 -# Data corrente nel runtime context a ogni turno (default on; evita anno da training cutoff) +# Data corrente nel runtime context a ogni turno (default on) # AION_RUNTIME_DATE_CONTEXT=1 -AION_MEMORY_FILE_MAX_CHARS=2200 -AION_USER_FILE_MAX_CHARS=1400 -# SOUL in config/profiles//SOUL.md se esiste la cartella profilo, altrimenti data/profiles//SOUL.md -AION_SOUL_FILE_MAX_CHARS=12000 +# Cartella contenente i file di stato dei profili utente AION_PROFILE_STATE_DIR=data/profiles -# Profili YAML: config/profiles/ (dev e Docker). sync_config --force salta i file customizzati -# (stato in config/profiles/.aion-sync-state.json). Overlay opzionale su volume separato: +# Cartella di scrittura per la personalizzazione dei profili # AION_PROFILES_WRITE_DIR=/app/data/profiles +# Directory dei profili standard di sistema # AION_PROFILES_STD_DIR=config/profiles +# Directory dei file modello per la generazione dei profili # AION_PROFILES_TEMPLATE_DIR=config_std/profiles -# Profilo default se la richiesta chat non specifica uno slug valido -AION_DEFAULT_PROFILE=aion_std -# Lingua UI di fallback server-side (se metadata utente assente); il client usa il browser -AION_DEFAULT_UI_LANGUAGE=en -# 1 = fallisce l'avvio API se un profilo YAML è invalido (P2.1) +# Blocca l'avvio del server se un profilo YAML presenta errori di sintassi AION_PROFILE_VALIDATE_STRICT=0 -# 1 = ricontrolla mtime config/profiles/ ad ogni get_agent (dev) +# Ricarica automaticamente i profili modificati senza riavviare il server (dev) AION_PROFILE_HOT_RELOAD=0 -# 1 = lookup profilo anche per display name (legacy; chat-ui dovrebbe passare slug) +# Consente la ricerca dei profili anche tramite nome descrittivo oltre allo slug AION_PROFILE_LEGACY_NAME_LOOKUP=0 -# Opzionale: se impostato, le API /admin/profile-memory/* richiedono Authorization: Bearer -AION_ADMIN_MEMORY_TOKEN= -# FASE H — Context compressor (agent_pipeline → ContextCompressor prima di agent.run) -AION_CONTEXT_COMPRESS_ENABLED=1 -# Limite contesto modello (input+output). Preferire AION_MODEL_MAX_CONTEXT; deve allinearsi al server LLM. -AION_MODEL_MAX_CONTEXT=131072 -# Legacy alias se AION_MODEL_MAX_CONTEXT non è impostato -AION_CONTEXT_COMPRESS_MODEL_WINDOW=131072 -# Soglia trigger: frazione della finestra (0.80 ≈ 105k su 132k). Evitare 0.5 con modelli grandi. -AION_CONTEXT_COMPRESS_THRESHOLD=0.80 -# Messaggi recenti lasciati intatti dopo la sintesi (workflow attivo) -AION_CONTEXT_COMPRESS_KEEP_LAST=12 -# Round di compressione LLM se ancora sopra soglia -AION_CONTEXT_COMPRESS_MAX_ROUNDS=2 -# 1 = riserva AION_CHAT_MAX_TOKENS dal budget input (evita 400 context length) -AION_CONTEXT_COMPRESS_RESERVE_OUTPUT=1 -# Stima token system prompt + tool schema (sommata al conteggio messaggi) -AION_CONTEXT_COMPRESS_FIXED_OVERHEAD=8192 -# Compattazione intra-turno (dopo ogni tool / blocco reasoning) — src/runtime/turn_compaction.py -AION_CONTEXT_COMPRESS_MID_TURN=1 -# Soglia rispetto a max_prompt (0.92 = compatta solo vicino al limite reale) -AION_CONTEXT_COMPRESS_MID_TURN_RATIO=0.92 -# Min secondi tra due compaction mid-turn nello stesso turno -AION_CONTEXT_COMPRESS_MID_TURN_MIN_SEC=15 -# AION_CONTEXT_COMPRESS_MID_TURN_TIMEOUT=90 -# AION_CONTEXT_COMPRESS_PERSIST=1 -# AION_CONTEXT_COMPRESS_RESERVE_OUTPUT_TOKENS=0 -# Token massimi per il riassunto post-compattazione (preserva stato workflow) -AION_CONTEXT_COMPRESS_SUMMARY_MAX_TOKENS=4096 -# AION_CONTEXT_COMPRESS_SUMMARY_TIMEOUT=120 -# AION_CONTEXT_COMPRESS_TRANSCRIPT_CHARS=120000 -# Tronca output tool MCP prima che entrino nel contesto Haystack (caratteri) -AION_TOOL_RESULT_MAX_CHARS=24000 -# Cap tool result in agent context (NOT page extract — see AION_WEB_FETCH_MAX_CHARS in web_providers) -# AION_TOOL_WEB_FETCH_MAX_CHARS=12000 -# AION_TOOL_WEB_SEARCH_MAX_CHARS=12000 -# Snippet length in TOON web_search rows (single-line; default 1200) -# AION_TOON_WEB_SEARCH_SNIPPET_CHARS=1200 -# Tool results recenti da tenere interi durante compact meccanico mid-turn -# AION_MECHANICAL_COMPACT_KEEP_TOOLS=2 -# Compact anticipato dopo N web_search/web_fetch (prima del 92% globale) -# AION_WEB_TOOL_COMPACT_AFTER=4 -# AION_WEB_TOOL_COMPACT_RATIO=0.55 -# Autocorrezione su context overflow: compact + retry senza nuovo messaggio utente -# AION_CONTEXT_RECOVERY=1 -# AION_CONTEXT_RECOVERY_MAX=2 -# Mid-turn compaction su chunk reasoning (default off — non blocca il thread agent) -# AION_CONTEXT_COMPRESS_MID_TURN_REASONING=0 -# LLM sync summarization durante il turno (default off; ratio/min_sec sopra) -# AION_CONTEXT_COMPRESS_MID_TURN_SYNC=0 -# Stream loop v2 (default on); legacy: AION_STREAM_LOOP_LEGACY=1 - -# Context budget bar (chat-ui): log ogni emit SSE a INFO -# AION_CONTEXT_BUDGET_DEBUG=1 -# Turn stop / interruption diagnostics (WARNING sempre; JSONL con flag sotto) -# AION_TURN_DEBUG_VERBOSE=1 -# AION_TURN_DIAGNOSTICS=1 -# AION_TURN_DIAGNOSTICS_LOG=data/diagnostics/turns.jsonl -# AION_AGENT_DEBUG_LOG=data/diagnostics/agent-debug.jsonl - -# Harness v2 (Pi-inspired patterns) — default on for new installs -AION_HARNESS_V2_MESSAGES=1 -AION_HARNESS_V2_INJECTIONS=1 -AION_HARNESS_V2_COMPACTION=1 -AION_HARNESS_V2_PROVIDER=1 -AION_HARNESS_V2_TOOLS=1 -AION_HARNESS_V2_TURN=1 - -# Long Run mode (Pi agent runtime via services/pi-long-run worker) -# AION_LONG_RUN_ENABLED=0 -# AION_LONG_RUN_BLOCKED_TOOLS= -# AION_PI_WORKER_URL=http://127.0.0.1:8791 -# AION_PI_WORKER_SECRET= -# AION_LONG_RUN_TURN_TIMEOUT=3600 -# AION_LONG_RUN_TOOL_CALLS_MAX=200 -# AION_LONG_RUN_TOOL_EVENTS_MAX=300 -# AION_LONG_RUN_NO_PROGRESS_TIMEOUT_SEC=600 -# Max output tokens for Pi (default: same as AION_CHAT_MAX_TOKENS) -# AION_LONG_RUN_MAX_TOKENS=16384 -# AION_PI_COMPACTION_RESERVE_TOKENS=49152 -# AION_PI_COMPACTION_KEEP_RECENT_TOKENS=12000 -# AION_PI_HISTORY_PREFIX_MAX_CHARS=12000 -# Pi worker LLM key (fallback: OPENAI_API_KEY) -# AION_API_KEY= -# Stop repeated identical sandbox write preflight failures per session (default 3) -# AION_TOOL_CIRCUIT_BREAKER_ENABLED=0 -# AION_TOOL_CIRCUIT_BREAKER_MAX=3 -# Legacy alias for Pi long-run: AION_PI_TOOL_CIRCUIT_BREAKER_MAX=3 - -# Context offloading — docs/architecture/context-offloading.md (default on) -AION_TOOL_OFFLOAD_ENABLED=1 -AION_TOOL_OFFLOAD_MIN_CHARS=8000 -AION_TOOL_OFFLOAD_PREVIEW_CHARS=1500 -AION_TOOL_OFFLOAD_EXCLUDE=web_search,sandbox_read_file_chunk -AION_TOOL_OFFLOAD_MAX_TOTAL_MB=64 -AION_TOOL_LEDGER_ENABLED=1 -AION_TOOL_LEDGER_MAX_ROWS=60 -AION_TOOL_LEDGER_MAX_CHARS=3000 -# Deferred cleanup of offloads for archived conversations (default on) -AION_TOOL_OFFLOAD_CLEANUP_ENABLED=1 -AION_TOOL_OFFLOAD_CLEANUP_GRACE_DAYS=7 -AION_TOOL_OFFLOAD_CLEANUP_INTERVAL_SEC=3600 -# AION_PI_CUSTOM_COMPACTION=0 -# AION_PI_COMPACTION_HTTP_TIMEOUT=120 +# Override manuale del profilo per scopi di test +# AION_CURRENT_PROFILE_SLUG= +# Modalita' di caricamento delle skill nel prompt di sistema: index | full +AION_SKILL_SYSTEM_PROMPT_MODE=index +# Inietta frammenti di prompt personalizzati in base al modello in uso +AION_MODEL_PROMPT_FRAGMENTS=1 +# Cartella contenente i frammenti dei prompt +# AION_PROMPTS_DIR=config_std/prompts +# Cartella contenente le descrizioni personalizzate dei tool +# AION_TOOL_DESCRIPTIONS_DIR=config_std/tool_descriptions +# Budget di token massimo allocato per i layer di prompt +# AION_PROMPT_LAYER_TOTAL_BUDGET=6000 +# Politica di esposizione dei tool in base al modello (es. GPT vs Qwen) +AION_MODEL_TOOL_POLICY=1 +# Rispetta le skill definite nel profilo bloccando l'accesso a quelle non autorizzate +AION_SKILL_VIEW_ENFORCE_PROFILE=1 +# Modalita' di streaming legacy per gli artifact +AION_ARTIFACT_STREAM_LEGACY=0 +# Abilita la versione 2 del loop di streaming delle risposte +AION_STREAM_LOOP_V2=1 -# FASE B — Skill distill (default off) — src/learning/skill_distiller.py +# --- Distillazione, Patching e Nudge delle Skill (Apprendimento continuo) --- +# Abilita la distillazione automatica di nuove skill dall'analisi delle sessioni AION_SKILL_DISTILL_ENABLED=1 +# Chiamate a tool consecutive minime per considerare una sessione candidata alla distillazione AION_SKILL_DISTILL_MIN_TOOLS=5 +# Numero massimo di nuove skill distillabili automaticamente al giorno AION_SKILL_DISTILL_MAX_PER_DAY=20 +# Soglia di similarita' per evitare la creazione di skill duplicate AION_SKILL_DISTILL_DEDUP_THRESHOLD=0.88 +# Caratteri massimi dello storico dei tool analizzato per la distillazione AION_SKILL_DISTILL_TOOL_LOG_MAX_CHARS=8000 +# Raccoglie le metriche sull'uso e l'efficacia delle skill AION_SKILL_VIEW_METRICS=1 +# Directory per il salvataggio delle skill generate automaticamente AION_SKILL_GENERATED_DIR=data/skills/generated -# NOTA: L'abilitazione alla scrittura/cancellazione dinamica di skill (AION_SKILL_WRITE_ENABLED) -# è gestita a livello di registry MCP in config/mcp_registry.yaml sotto l'env del server skills_hub. -# AION_SKILL_VIEW_ENFORCE_PROFILE (vedi blocco MemPalace navigazione sopra) blocca skill_view su skill -# non elencate nel profilo YAML (es. db_navigation_map rimossa da postgres_metadata_assistant). - -# FASE C / E — patch skill e nudge — src/learning/skill_patcher.py, nudge.py +# Abilita il patching e l'auto-correzione delle skill in caso di errori di esecuzione AION_SKILL_PATCH_ENABLED=1 +# Abilita i suggerimenti dinamici ("nudge") per orientare l'agente durante il turno AION_NUDGE_ENABLED=1 +# Frequenza dei turni per l'invio dei suggerimenti nudge AION_NUDGE_EVERY=15 +# Intervallo minimo in secondi tra due suggerimenti nudge AION_NUDGE_MIN_INTERVAL_SEC=300 -# FASE M — Approval (stub DB opzionale) +# --- Human-In-The-Loop & Approvals (Approvazione preventiva tool critici) --- +# Abilita l'obbligo di approvazione utente prima di eseguire tool ad alto rischio +AION_APPROVAL_ENABLED=1 +# Nomi dei tool considerati critici che richiedono approvazione manuale AION_APPROVAL_CRITICAL_TOOLS=sandbox_execute_python,sandbox_run_python_file,shell_execute -AION_APPROVAL_DB_PATH= -# ----------------------------------------------------------------------------- -# Piano v2 — DB unificato, Redis, storage, API /v1, Chainlit adapter (default ON in code) -# ----------------------------------------------------------------------------- -AION_DB_URL=sqlite+aiosqlite:///data/aion.db +# ============================================================================= +# 13. DATABASE UNIFICATO, REDIS, CRON & ORCHESTRAZIONE (Database & Operations) +# ============================================================================= +# Abilita l'utilizzo del database unico di AION (1 = attivo) AION_UNIFIED_DB=1 -# Opzionale in dev/prod: senza URL si usa fallback in-process (OK single-worker). -# Solo Redis in Docker: docker compose -f docker-compose.redis.yml up -d +# Stringa di connessione SQLAlchemy per il database SQLite unificato +AION_DB_URL=sqlite+aiosqlite:///data/aion.db +# URL per la connessione al server Redis (lasciare vuoto per usare il fallback locale) AION_REDIS_URL=redis://127.0.0.1:6379/0 +# Prefisso per il namespace delle chiavi memorizzate in Redis AION_REDIS_NAMESPACE=aion +# Abilita un fallback in memoria se il server Redis non e' raggiungibile AION_REDIS_FALLBACK_LOCAL=1 -# Orchestration HITL: server-only secret for legacy jobs (Chainlit). chat-ui uses chat JWT. -# Do NOT set NEXT_PUBLIC_AION_ORCHESTRATION_INTERNAL_SECRET in the browser. + +# --- Orchestrazione, Task & Eventi di Streaming --- +# Secret interno per le comunicazioni dell'orchestrazione dei sub-agenti AION_ORCHESTRATION_INTERNAL_SECRET= +# Abilita l'autenticazione tramite secret sulle API di orchestrazione AION_ORCHESTRATION_SECRET_AUTH=1 -# Timeout attesa approvazione piano (secondi) e polling wait-registry +# Timeout in secondi per l'attesa dell'approvazione di un piano orchestrato AION_ORCH_PLAN_WAIT_TIMEOUT_SEC=600 -AION_ORCH_PLAN_POLL_SEC=0.35 -# Distillazione output sub-agent usata da dispatch_task +# Caratteri massimi per la sintesi dei risultati restituiti dai sub-agenti AION_ORCH_DISTILL_MAX_CHARS=8000 -# Guard rail runtime turn (control-plane vs data-plane) -# 0 = disabilitato +# Numero massimo di eventi di controllo emettibili in un singolo turno AION_CONTROL_EVENTS_MAX_PER_TURN=300 +# Limite di eventi di output generabili in un turno (0 = nessun limite) AION_OUTPUT_EVENTS_MAX_PER_TURN=0 +# Caratteri massimi di output generabili in un turno (0 = nessun limite) AION_OUTPUT_CHARS_MAX_PER_TURN=0 -# Hard stop se non arriva progresso utile (token/artifact/reasoning/tool) entro N secondi. +# Interrompe il turno se non viene emesso alcun progresso utile entro N secondi AION_NO_PROGRESS_TIMEOUT_SEC=180 -# Diagnostica turni agente (JSONL): esiti vuoti, tool senza risposta, contesto enorme. -# Log: data/diagnostics/turns.jsonl e data/diagnostics/agent-debug.jsonl -AION_TURN_DIAGNOSTICS=0 -# Livello log root / logger aion.* (DEBUG, INFO, WARNING) -AION_LOG_LEVEL=INFO -# Cache secondi per ping GET /models prima di ogni turno chat (0 = sempre ping) -AION_LLM_HEALTH_CACHE_SEC=45 -# Snapshot prompt completo inviato all'agente (SSE type: prompt_snapshot + GET /debug/prompt-snapshots). -# Abilitare per baseline reasoning: confrontare system_prompt, inject_layers, generation_kwargs. -AION_PROMPT_DEBUG=1 -# Audit OGNI chiamata LiteLLM/vLLM (request+response JSON per step agente). -# Directory: data/diagnostics/llm_calls//step_NNN_.json + index.jsonl -# Analisi: python scripts/audit_llm_calls.py list|show|latest|analyze -AION_LLM_CALL_AUDIT=0 -# AION_LLM_CALL_AUDIT_DIR= # override directory (default data/diagnostics/llm_calls) -# AION_TURN_DIAGNOSTICS_LOG= # override path turns.jsonl -# AION_AGENT_DEBUG_LOG= # override path agent-debug.jsonl -# Ping interno SSE ogni N secondi durante tool lunghi (0 = disabilitato) +# Intervallo in secondi per l'invio di pacchetti keep-alive sulla connessione SSE AION_SSE_KEEPALIVE_SEC=15 -# Rollout: se 1 invia eventi orchestration solo sul canale canonico top-level +# Invia gli eventi di orchestrazione su un singolo canale principale AION_ORCH_EVENT_SINGLE_CHANNEL=1 -# Legacy hard cap complessivo eventi turno (consigliato 0, usare i guard sopra) +# Cap massimo complessivo sugli eventi di streaming (0 = disabilitato) AION_STREAM_EVENTS_MAX_PER_TURN=0 -# Batch flush messaggi assistant su DB durante SSE (secondi, 0 = solo a fine turno) +# Intervallo di scrittura in batch dei messaggi su DB durante lo streaming (secondi) # AION_STREAM_DB_FLUSH_SEC=0.75 -# Sync uploads parent -> child session per sub-agent (MB) -AION_SUBAGENT_UPLOAD_SYNC_MAX_TOTAL_MB=50 -AION_SUBAGENT_UPLOAD_SYNC_MAX_FILE_MB=25 -# Storage sessioni / allegati — src/storage/factory.py -AION_STORAGE_BACKEND=local -AION_STORAGE_LOCAL_ROOT=data -AION_STORAGE_S3_BUCKET=aion-sessions -AION_STORAGE_S3_ENDPOINT_URL= -AION_STORAGE_S3_REGION=us-east-1 -AION_STORAGE_S3_ACCESS_KEY= -AION_STORAGE_S3_SECRET_KEY= -AION_STORAGE_S3_USE_PATH_STYLE=0 -AION_STORAGE_S3_PRESIGNED_EXPIRES=3600 -AION_API_KEY_BOOTSTRAP= -AION_PII_REDACT=1 +# Durata (TTL) in secondi della coda dei grafici in Redis +AION_CHART_QUEUE_TTL_SEC=3600 +# Abilita la generazione di grafici di diverso tipo (line, bar, area) nei tool +AION_CHART_KIND_ENABLED=1 +# Abilita il log dettagliato delle query SQL generate da SQLAlchemy +AION_SQL_ECHO=0 + +# --- Gestione Plugin --- +# Abilita il sistema di caricamento dei plugin esterni AION_PLUGINS_ENABLED=1 +# Directory contenente i plugin installati AION_PLUGINS_DIR=data/plugins -# Approvals tool critici (default se variabile vuota: sandbox_execute_python,sandbox_run_python_file,shell_execute) -AION_APPROVAL_ENABLED=1 - -# FASE N - Changelog e rollback system --> Da valutare per permettere di fare rollback delle skill generate +# Lista bianca di plugin autorizzati ad essere caricati (separati da virgola) +AION_PLUGINS_ALLOWLIST= +# Lista nera di plugin di cui e' vietato il caricamento +AION_PLUGINS_DENYLIST= -# Scheduled jobs (per-user cron; unified DB via Alembic; requires --workers 1) +# --- Attivita' Pianificate (Scheduled Cron Jobs) --- +# Abilita il motore di esecuzione dei task pianificati (cron jobs per utente) AION_CRON_ENABLED=1 +# Fuso orario di riferimento per la pianificazione dei cron job AION_CRON_DEFAULT_TIMEZONE=Europe/Rome +# Numero massimo di cron job pianificabili da un singolo utente AION_CRON_MAX_JOBS_PER_USER=50 +# Tempo di tolleranza in secondi per l'esecuzione di un cron job in ritardo AION_CRON_MISFIRE_GRACE_SEC=300 +# Caratteri massimi per l'anteprima dell'esito del cron job # AION_CRON_PREVIEW_MAX_CHARS=500 +# Timeout per l'esecuzione di tool invocati all'interno di un cron job # AION_CRON_TOOL_TIMEOUT_SEC=120 -# AION_CRON_DB_PATH — deprecated; jobs live in AION_DB_URL (aion.db) - +# ============================================================================= +# 14. TELEMETRIA, DIAGNOSTICA & PROFILING (Observability, OTel, Auditing & Debug) +# ============================================================================= +# Livello generale di logging dell'applicazione: DEBUG | INFO | WARNING | ERROR +AION_LOG_LEVEL=INFO +# Formato dei log emessi dall'applicazione: json (per Docker/prod) | text (per dev locale) +AION_LOG_FORMAT=json -# ----------------------------------------------------------------------------- -# Runtime / environment -# ----------------------------------------------------------------------------- -# Etichetta ambiente (dev | staging | prod). Usata da observability/otel_setup. -AION_ENV=dev -# 1 = OpenLit instrumentation attiva (impostato anche da otel_setup se OTel ok) -# AION_OPENLIT_ACTIVE=0 -# 1 = env_or_settings() legge fallback da AionSettings quando env vuoto -# AION_SETTINGS_LEGACY_FALLBACK=1 -# Override profilo corrente (test/gate skill_view); lasciare vuoto in produzione -# AION_CURRENT_PROFILE_SLUG= -# URL pubblico admin-ui per i banner Chainlit; vuoto = usa default in-code. -AION_ADMIN_UI_URL=http://localhost:3870 -# URL pubblico del chat-ui (per redirect OAuth dopo autenticazione utente). -# In Docker/prod usare il dominio browser-facing, NON localhost:8003: -# AION_CHAT_URL=https://cliente.example.com -AION_CHAT_URL=http://localhost:8003 -# Override base URL OAuth MCP integrations (default: derivato da AION_CHAT_URL) -# AION_OAUTH_REDIRECT_BASE_URL= - -# ----------------------------------------------------------------------------- -# Observability / OpenTelemetry / metrics / OpenLit — src/observability/ -# ----------------------------------------------------------------------------- -# Abilita il tracciamento OTel (0=disabilitato, 1=attivo). Quando attivo, invia: -# - Log strutturati (via OTLP) -> Grafana Loki -# - Tracce applicative e LLM (via OpenLit) -> Grafana Tempo -# - Metriche -> Prometheus +# --- OpenTelemetry & Metrike (OTel / Prometheus / OpenLit) --- +# Abilita l'esportazione delle tracce e delle metriche OpenTelemetry (1 = attivo) AION_OTEL_ENABLED=0 -# L'endpoint dove il tuo OTel collector (sul server centrale .55) accetta dati OTLP (gRPC) +# Endpoint del collector OTel per la ricezione dei dati gRPC/HTTP AION_OTEL_ENDPOINT=http://localhost:4317 -# Protocollo collector: grpc | http +# Protocollo di rete usato verso l'OTel collector: grpc | http AION_OTEL_PROTOCOL=grpc -# Nome del servizio per distinguere questo specifico client nelle dashboard +# Nome del servizio registrato nei sistemi di osservabilita' (Loki, Tempo, Grafana) AION_OTEL_SERVICE_NAME=aion-agent -# Abilita la cattura del contenuto di prompt e risposte LLM nei trace (0=disabilitato, 1=attivo) +# Cattura il testo completo di prompt e risposte nelle tracce OTel AION_OTEL_TRACE_CONTENT=1 -# Intervallo di invio delle metriche ad OTel in millisecondi (default: 5000) +# Frequenza di esportazione delle metriche ad OTel in millisecondi AION_OTEL_METRIC_EXPORT_INTERVAL=5000 -# Endpoint Prometheus /metrics +# Abilita la strumentazione OpenLit per il tracciamento specifico delle chiamate LLM +# AION_OPENLIT_ACTIVE=0 +# Abilita l'endpoint /metrics per lo scraping di metriche da parte di Prometheus AION_METRICS_ENABLED=1 +# Percorso dell'endpoint delle metriche AION_METRICS_PATH=/metrics -# Formato log: json (Loki/ELK) | text/console (leggibile in terminale). -# Se omesso: text su TTY interattivo, json altrimenti (Docker/CI). -# AION_LOG_FORMAT=text +# URL dell'istanza Prometheus +AION_PROMETHEUS_URL=http://localhost:9090 +# Identificativo opzionale dell'istanza o dell'host per le metriche +AION_INSTANCE_ID= +AION_HOST_ID= + +# --- Tracciamento Opik --- +# Abilita l'integrazione con la piattaforma di osservabilita' LLM Opik +AION_OPIK_ENABLED=0 +# Chiave API per l'autenticazione verso la piattaforma Opik +OPIK_API_KEY=placeholder-key +# Nome del progetto di tracciamento registrato su Opik +OPIK_PROJECT_NAME=AION-Agent +# URL personalizzato per l'endpoint API di Opik +OPIK_URL_OVERRIDE=http://localhost:5173/api -# ----------------------------------------------------------------------------- -# Profiling (turn-level breakdown) — src/profiling/profiler.py -# ----------------------------------------------------------------------------- +# --- Diagnostica, Audit & Profiling --- +# Abilita la registrazione dettagliata delle fasi di esecuzione del turno (profiling) AION_PROFILING_ENABLED=1 -# Storage backend per i record di profiling: jsonl | sqlite | redis +# Storage backend per i report di profiling: jsonl | sqlite | redis AION_PROFILING_STORAGE=jsonl +# Cartella di conservazione dei file JSONL di profilazione AION_PROFILING_JSONL_DIR=data/profiling +# Invia uno snapshot completo del prompt inviato al LLM (GET /debug/prompt-snapshots) +AION_PROMPT_DEBUG=1 +# Salva su disco un audit dettagliato di ogni chiamata effettuata verso il LLM +AION_LLM_CALL_AUDIT=0 +# Directory per gli audit delle chiamate LLM (default: data/diagnostics/llm_calls) +# AION_LLM_CALL_AUDIT_DIR= +# Abilita la diagnostica sui turni dell'agente +AION_TURN_DIAGNOSTICS=0 +# Percorso del file per la diagnostica dei turni +# AION_TURN_DIAGNOSTICS_LOG=data/diagnostics/turns.jsonl +# Percorso del file per i log di debug dell'agente +# AION_AGENT_DEBUG_LOG=data/diagnostics/agent-debug.jsonl +# Log verboso per la diagnostica di arresto e interrupt dei turni +# AION_TURN_DEBUG_VERBOSE=1 +# Log di debug per il calcolo del budget di token nella Chat UI +# AION_CONTEXT_BUDGET_DEBUG=1 +# Mostra il pannello di debug del prompt nella Chat UI +NEXT_PUBLIC_AION_PROMPT_DEBUG=0 -# ----------------------------------------------------------------------------- -# Reasoning / tool guard rails per-turno — src/agent_pipeline.py, src/main.py -# ----------------------------------------------------------------------------- -# Max caratteri/eventi del blocco reasoning streammato (0 = nessun cap) -AION_REASONING_MAX_CHARS=20000 -AION_REASONING_MAX_EVENTS=240 -# AION_REASONING_MIN_CHARS=2000 -# AION_REASONING_MIN_EVENTS=30 -# AION_REASONING_MAX_LEVEL_CHARS=40000 -# AION_REASONING_MAX_LEVEL_EVENTS=480 -# Hard-stop del turno se supera ENTRAMBI i cap sopra (0=disabilitato) -AION_REASONING_HARD_STOP=0 -# Hard cap chiamate strumenti / eventi tool per turno (oltre il quale l'agente stoppa) -AION_TOOL_CALLS_MAX_PER_TURN=80 -# Haystack tools_strict globale (1=on). Distinto da AION_VLLM_TOOLS_STRICT (solo vLLM locale). -# AION_TOOLS_STRICT=1 -# Import MemPalace strutturato (decine di mempalace_add_drawer): alzare a 80–120 o usare bootstrap script. -AION_TOOL_EVENTS_MAX_PER_TURN=60 -# Consecutive tool failures before recovery prompt (src/runtime/tool_error_recovery.py) -# AION_TOOL_ERROR_THRESHOLD=2 -# AION_TOOL_ERROR_MAX_RECOVERY=2 -# Dopo hard-stop (tool limit / no progress), attendi al massimo N secondi il thread agente (0 = attendi sempre). -# AION_AGENT_DRAIN_TIMEOUT_SEC=90 -# Deduplica chiamate identiche ravvicinate (LLM loop guard) -AION_TOOL_DEDUPE_ENABLED=1 -AION_TOOL_DEDUPE_TTL_SEC=20 - -# ----------------------------------------------------------------------------- -# Test-Time Compute (TTC) — src/ttc/budget.py -# ----------------------------------------------------------------------------- +# --- Test-Time Compute & Framework di Benchmark (Eval) --- +# Tentativi massimi di generazione per il Test-Time Compute (TTC) AION_TTC_MAX_ATTEMPTS=3 +# Token massimi per ciascun tentativo di Test-Time Compute AION_TTC_MAX_TOKENS=10000 - -# ----------------------------------------------------------------------------- -# Filesystem policy / Orchestration timeout -# ----------------------------------------------------------------------------- -# Path YAML policy: vedi AION_FS_POLICY_PATH nel blocco sandbox sopra. -# Wren Engine — semantic SQL project for postgres_metadata_assistant (relative to repo root) -AION_WREN_PROJECT_PATH=wren/example_project -# Optional override for Wren profiles (default: $HOME/.wren). Required when sandbox HOME is isolated. -AION_WREN_HOME=${HOME}/.wren -# Default timeout (seconds) for sandbox_exec_allowlisted when argv[0] is wren -AION_WREN_EXEC_TIMEOUT_SEC=180 -# Timeout secondi per esecuzione singolo tool da orchestration +# Timeout in secondi per l'esecuzione di tool lanciati dall'orchestrazione AION_ORCH_TOOL_TIMEOUT_SEC=900 - -# ----------------------------------------------------------------------------- -# Auth chat-ui / admin agent-db -# ----------------------------------------------------------------------------- -# TTL token JWT chat-ui (secondi). Default: 7 giorni -AION_CHAT_AUTH_TOKEN_TTL_SEC=604800 -# Admin agent-db: 1 = consente SQL write (CREATE/INSERT/UPDATE/DELETE), 0 = read-only -AION_AGENT_DB_ADMIN_SQL_WRITE=0 -# Admin agent-db: 1 = richiede X-AION-Identity coerente con sessione/utente -AION_AGENT_DB_ADMIN_STRICT_IDENTITY=1 -# Secret HMAC per token embedded /agent-db (Chainlit/chat-ui). Lasciare vuoto se non usato. -AION_AGENT_DB_EMBED_SECRET= - -# ----------------------------------------------------------------------------- -# Optimizer (dataset di valutazione) — src/optimizer/ -# ----------------------------------------------------------------------------- -# --- Benchmark harness (eval + LongMemEval-V2) — not written to prod .env by setup --- +# Cartella contenente i dataset e i report di benchmark AION_BENCHMARK_DATA_DIR=data/benchmarks +# Abilita il log verboso durante la valutazione dei benchmark AION_BENCHMARK_VERBOSE=1 -AION_BENCHMARK_SUBPROCESS_PYTHON=python +# Abilita i test live contro il servizio Nominatim per il geocoding +AION_GEOCODING_LIVE=0 +# Path al file PDF di test per l'eval di estrazione da documenti lunghi +AION_EVAL_ALTOMONTE_PDF= +# Abilita il giudizio da parte di un LLM per la valutazione dei benchmark +AION_EVAL_LLM=0 +# Dataset di valutazione predefinito per l'ottimizzatore +AION_OPTIMIZER_DATASET=data/eval_datasets/optimization_base.json + +# Configurazioni avanzate per il benchmark LongMemEval-V2 # AION_LME_V2_TIER=small # AION_LME_V2_TEXT_ONLY=1 # AION_LME_V2_JUDGE_PROFILE=aion_std -# AION_LME_V2_DOWNLOAD_SCREENSHOTS=0 # AION_LME_V2_MAX_TRAJECTORIES=100 -# 0 = unlimited (full retention — benchmark default via apply_benchmark_isolation_env) # AION_LME_V2_MAX_STATES_PER_TRAJ=0 # AION_LME_V2_MAX_TREE_CHARS=0 # AION_LME_V2_MAX_CHUNKS_PER_TRAJ=0 @@ -1021,88 +1076,80 @@ AION_BENCHMARK_SUBPROCESS_PYTHON=python # AION_LME_V2_COMPRESS_SCOPE=0 # AION_LME_V2_AGENT_PROFILE=benchmark_memory # AION_LME_V2_SKIP_IMAGE_QUESTIONS=1 -# Max non-menuitem UI labels per state (menuitems are always kept — answers hide in dropdowns) # AION_LME_V2_UI_LABEL_LIMIT=80 -# Max chars per Mnemos note at ingest (Mnemos CONTENT_MAX_CHARS is 500) # AION_LME_V2_NOTE_MAX_CHARS=480 -# FTS recall rows merged per benchmark question (boosted query + full text) # AION_LME_V2_RECALL_LIMIT=20 -# Skip Mnemos wake block during QA (reduces noise from unrelated early trajectories) # AION_LME_V2_SKIP_WAKE=1 # AION_LME_V2_QA_MAX_TOKENS=512 # AION_LME_V2_QA_TIMEOUT=120 -# Qwen3/vLLM: MUST stay 1 for benchmark judge (0 => thinking on => content=null) -# AION_LME_V2_QA_DISABLE_REASONING=1 -# Official scoring: 156/451 questions carry eval_function=llm_*_checker and need -# an LLM grader. Set 0 to score them 0.0 without any LLM call (offline runs). # AION_LME_V2_LLM_JUDGE=1 # AION_LME_V2_JUDGE_MAX_TOKENS=16 # AION_LME_V2_JUDGE_TIMEOUT=60 -# Benchmark agent + Mnemos (set automatically by apply_benchmark_isolation_env) -# AION_MNEMOS_READONLY_TOOLS=1 -AION_MNEMOS_RECALL_LIMIT_EXPOSED=1 -AION_OPTUNA_STORAGE=sqlite:///data/optuna.db - -AION_OPTIMIZER_DATASET=data/eval_datasets/optimization_base.json # ============================================================================= -# DEPLOY DOCKER (opzionale) — usate da docker-compose.yml e docker/Caddyfile -# Per il setup container-based: cp .env.example .env (la sezione DEPLOY DOCKER in fondo -# con i valori coerenti per il contesto compose). Le chiavi qui sotto NON vengono -# rilette dal codice Python: servono solo a docker-compose/Caddy. +# 15. DEPLOYMENT DOCKER, CADDY & INFRALAYER (Docker Compose & Reverse Proxy) # ============================================================================= -# Dominio pubblico cliente (es. cliente.example.com); ":80" per dev HTTP locale. +# Dominio pubblico di produzione (es. cliente.example.com) oppure ":80" per sviluppo locale DOMAIN=:80 -# Porte host pubblicate da Caddy (docker-compose: ${CADDY_*:-80/443}). Se 80/443 sono occupate, usa es. 8066 e 44366 solo nel .env locale. +# Porta HTTP esposta dall'host e gestita da Caddy CADDY_HTTP_PORT=80 +# Porta HTTPS esposta dall'host e gestita da Caddy CADDY_HTTPS_PORT=443 -# Contatto ACME per Let's Encrypt (Caddy) +# Indirizzo e-mail per le notifiche e la registrazione dei certificati ACME Let's Encrypt LETS_ENCRYPT_EMAIL= -# Password Redis opzionale (vuoto = nessun auth) +# Password di sicurezza per l'istanza Redis (lasciare vuoto se non richiesta) REDIS_PASSWORD= -# Docker backend entrypoint: sync config_std/ + mcp_servers_std/ → runtime dirs at start (1=on, 0=skip) +# Sincronizza i file di configurazione std/ all'avvio del container Docker (1 = attivo) AION_SYNC_ON_BOOT=1 -# BuildKit (client Docker; accelera layer cache del Dockerfile backend con uv) +# Abilita BuildKit per velocizzare la creazione delle immagini Docker DOCKER_BUILDKIT=1 -# Build args backend (uv + Python in docker/Dockerfile.backend) +# Versione dell'immagine base Python utilizzata nel Dockerfile del backend PYTHON_VERSION=3.13-slim -# `latest` = uv aggiornato a ogni rebuild; per prod deterministico: es. 0.6.17 +# Versione del gestore pacchetti "uv" installata nel container UV_VERSION=latest -# Build args frontend Next.js (baked at build time) -NEXT_PUBLIC_AION_API_URL=http://localhost:8001 -NEXT_PUBLIC_AION_ADMIN_UI_URL=http://localhost:8002 -# Tab dock "Prompt" in chat-ui (richiede anche AION_PROMPT_DEBUG=1 sul backend) -NEXT_PUBLIC_AION_PROMPT_DEBUG=0 -# Docusaurus baseUrl (in prod docker compose: /docs/) +# URL del pannello Admin UI per Next.js +NEXT_PUBLIC_AION_ADMIN_UI_URL=http://localhost:3870 +# URL base per la documentazione Docusaurus DOCUSAURUS_BASE_URL=/ -#Admin first setup — after wizard completes, value is stored in data/runtime.env (Docker) -# and must not be reset by reconcile with this template default. +# Indica se la procedura guidata di primo setup e' stata completata AION_FIRST_SETUP_COMPLETE=0 +# ============================================================================= +# 16. CREDENZIALI INTEGRAZIONI TERZE (Third-Party Integrations & Misc) +# ============================================================================= +# URL del server Nominatim di OpenStreetMap per il geocoding +# AION_GEOCODING_NOMINATIM_URL=https://nominatim.openstreetmap.org +# User Agent inviato nelle richieste di geocoding a Nominatim +# AION_GEOCODING_USER_AGENT=AION-Agent/1.0 (your-contact@example.com) +# Intervallo minimo in secondi tra due chiamate a Nominatim per rispettare i limiti +# AION_GEOCODING_MIN_INTERVAL_SEC=1.1 +# Risoluzione DPI per l'estrazione delle evidenze grafiche da file PDF +# AION_PDF_EVIDENCE_DPI=200 +# Soglia massima di superficie bianca per il ritaglio automatico di tabelle/grafici da PDF +# AION_PDF_EVIDENCE_MAX_WHITE_RATIO=0.90 -# ----------------------------------------------------------------------------- -# Optional local integrations (fill secrets in your local .env only) -# ----------------------------------------------------------------------------- +# --- Credenziali per Integrazioni di Terze Parti --- +# Token API per l'integrazione con ClickUp CLICKUP_API_TOKEN= +# ID del Workspace / Team ClickUp CLICKUP_TEAM_ID= +# URL dell'istanza OpenMetadata +URL_OPENMETADATA= +# Token JWT per l'autenticazione su OpenMetadata JWT_OPENMETADATA= -MYSQL_DB= +# Host di connessione al database MySQL MYSQL_HOST=127.0.0.1 -MYSQL_PASSWORD= +# Porta di connessione al database MySQL MYSQL_PORT=3306 +# Utente per l'autenticazione al database MySQL MYSQL_USER= -NEXT_PUBLIC_AION_CHAT_UI_DEBUG=0 -POSTGRES_DB= -POSTGRES_HOST=127.0.0.1 +# Password per l'autenticazione al database MySQL +MYSQL_PASSWORD= +# Nome del database MySQL +MYSQL_DB= +# Password per l'autenticazione al database PostgreSQL POSTGRES_PASSWORD= -POSTGRES_PORT=5432 +# URL completo di connessione al database PostgreSQL POSTGRES_URL= -POSTGRES_USER= -URL_OPENMETADATA= - - - -AION_OPIK_ENABLED=0 -OPIK_API_KEY=placeholder-key -OPIK_PROJECT_NAME=AION-Agent -OPIK_URL_OVERRIDE=http://localhost:5173/api \ No newline at end of file +# Abilita la modalita' di fallback legacy per le impostazioni +# AION_SETTINGS_LEGACY_FALLBACK=1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5bec3d37..8880ac30 100644 --- a/.gitignore +++ b/.gitignore @@ -47,9 +47,6 @@ data/users/*/mcp_home/ data/elements/ # MemPalace LTM vector store (ChromaDB runtime per tenant/user) data/mempalace/ -# Wren Engine local credentials (synced from AION .env) -wren/**/.env -wren/ # Runtime diagnostics (turn/agent debug JSONL — merge noise if tracked) data/diagnostics/ data/diagnostics/agent-debug.jsonl diff --git a/AGENTS.md b/AGENTS.md index 909257fa..9b9ffbfb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -60,10 +60,6 @@ fan-out. If horizontal scaling is needed, use sticky sessions at the reverse pro - **Admin auth** (`AION_ADMIN_PASSWORD_AUTH`): always on by default (Grafana-style). Controls `/admin/*` endpoints. Separate from chat auth. -Legacy env aliases (`AION_CHAINLIT_*`, `CHAINLIT_AUTH_SECRET`) are deprecated; -new names (`AION_CHAT_*`) take precedence. The upgrade script -(`scripts/upgrade-aion.sh`) auto-migrates them. - ## MCP tool registration MCP tools are serialized via Haystack `Tool.to_dict()` → **must be top-level @@ -79,8 +75,6 @@ Single database at `data/aion.db` (SQLite via aiosqlite + SQLAlchemy). Migrations in `migrations/versions/`. Run them with Alembic (configured in `alembic.ini`). Redis is optional (`AION_REDIS_URL`), with an in-process fallback. -Agent DB is a separate per-user SQLite under `data/agent_dbs//.db`. - ## Session management Sessions are indexed by `(session_id, profile_name, user_id)`. MCP tools are diff --git a/CLAUDE.md b/CLAUDE.md index d947cbaa..567948e7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -307,13 +307,8 @@ Password auth for chat-ui uses the unified `users` table and HMAC tokens (`src/c | `AION_SETUP_CHAT_IDENTIFIER` | First admin username (only `-y` / `--import-state`) | | `AION_SETUP_CHAT_PASSWORD` | First admin password (only `-y` / `--import-state`) | -**Legacy aliases (deprecated, read as fallback):** -`AION_CHAINLIT_PASSWORD_AUTH`, `CHAINLIT_AUTH_SECRET`, `AION_SETUP_CHAINLIT_IDENTIFIER`, -`AION_SETUP_CHAINLIT_PASSWORD`. The new names take precedence; the old names -will be removed in a future release. **Automatic migration** of a legacy `.env`: - ```bash -./scripts/upgrade-aion.sh # invoca _migrate_env_legacy_keys() +./scripts/upgrade-aion.sh # invoca upgrade-aion ./scripts/upgrade-aion.sh --docker # idem in flusso Docker ./scripts/upgrade-aion.sh --dry-run # mostra cosa cambierebbe senza scrivere ``` diff --git a/admin-ui/README.md b/admin-ui/README.md index 2abd99aa..d4866268 100644 --- a/admin-ui/README.md +++ b/admin-ui/README.md @@ -40,13 +40,10 @@ Apri [http://localhost:3870](http://localhost:3870) (in dev locale senza prefiss | `/profiles` | Profili agente | | `/skills` | Skill Markdown | | `/hub` | Registry MCP | -| `/memory` | Query memory + LTM MemPalace | -| `/profile-memory` | File **SOUL / MEMORY / USER** per profilo (`/admin/profile-memory/*`) | +| `/memory` | Query memory + LTM Mnemos | | `/security` | Audit sicurezza | | `/settings` | Impostazioni | -Per le route **profile-memory**, se nel backend è impostato `AION_ADMIN_MEMORY_TOKEN`, inserisci lo stesso token nella pagina (salvato in `sessionStorage`). - ## Build produzione ```bash diff --git a/admin-ui/app/agent-db/[userId]/page.tsx b/admin-ui/app/agent-db/[userId]/page.tsx deleted file mode 100644 index 145eaa18..00000000 --- a/admin-ui/app/agent-db/[userId]/page.tsx +++ /dev/null @@ -1,403 +0,0 @@ -"use client"; - -import React from "react"; - -export default function UserDBDetail() { - return ( -
Visualizzazione Dettaglio Agent DB non disponibile.
- ); -} - -/* -import { useEffect, useMemo, useState } from "react"; -import { apiFetch } from "@/lib/api/headers" -import { useParams } from "next/navigation"; -import Link from "next/link"; -import { apiBase } from "@/lib/api"; -import { - ChevronLeft, - RefreshCw, - Play, - Plus, - Trash2, - FileDown, - FileUp, -} from "lucide-react"; - -export default function OriginalUserDBDetail() { - const params = useParams(); - const userId = params.userId as string; - const [selectedSchema, setSelectedSchema] = useState(""); - const [selectedTable, setSelectedTable] = useState(""); - const [data, setData] = useState(null); - const [rowsData, setRowsData] = useState(null); - const [loading, setLoading] = useState(true); - const [rowsLoading, setRowsLoading] = useState(false); - const [error, setError] = useState(null); - const [tab, setTab] = useState<"browse" | "schema" | "sql" | "io">("browse"); - const [page, setPage] = useState(1); - const [q, setQ] = useState(""); - const [sortBy, setSortBy] = useState("_id"); - const [sortDir, setSortDir] = useState<"asc" | "desc">("asc"); - const [sql, setSql] = useState("SELECT 1 as ok"); - const [sqlResult, setSqlResult] = useState(null); - const [editingCell, setEditingCell] = useState<{ rowId: any; column: string } | null>(null); - const [editCellValue, setEditCellValue] = useState(""); - const [newTableName, setNewTableName] = useState("new_table"); - const [createPayload, setCreatePayload] = useState( - JSON.stringify([{ name: "name", type: "TEXT", nullable: true, description: "Field" }], null, 2) - ); - const [renameTableName, setRenameTableName] = useState(""); - const [newColumnName, setNewColumnName] = useState("new_col"); - const [newColumnType, setNewColumnType] = useState("TEXT"); - const [importContent, setImportContent] = useState("[]"); - const embedded = useMemo(() => { - if (typeof window === "undefined") return false; - return new URLSearchParams(window.location.search).get("embedded") === "1"; - }, []); - const embedToken = useMemo(() => { - if (typeof window === "undefined") return ""; - return new URLSearchParams(window.location.search).get("token") || ""; - }, []); - - const authHeaders = useMemo(() => { - const h: Record = { "X-AION-User-Id": userId }; - if (embedToken) h["X-AION-Embed-Token"] = embedToken; - return h; - }, [userId, embedToken]); - - const postJson = async (url: string, method: string, body?: any) => { - const resp = await apiFetch(url, { - method, - headers: { "Content-Type": "application/json", ...authHeaders }, - body: body ? JSON.stringify(body) : undefined, - }); - const text = await resp.text(); - if (!resp.ok) throw new Error(text || `HTTP ${resp.status}`); - try { - return JSON.parse(text); - } catch { - return {}; - } - }; - - const fetchDetail = async () => { - setLoading(true); - try { - const resp = await apiFetch(`${apiBase()}/admin/agent-db/${userId}/detail`, { headers: authHeaders }); - if (!resp.ok) throw new Error("Failed to fetch user DB detail"); - const json = await resp.json(); - setData(json); - if (!selectedSchema || !selectedTable) { - const s = json?.schemas?.[0]; - const t = s?.tables?.[0]; - if (s?.schema_name && t?.table_name) { - setSelectedSchema(s.schema_name); - setSelectedTable(t.table_name); - } - } - setError(null); - } catch (err: any) { - setError(err.message); - } finally { - setLoading(false); - } - }; - - const fetchRows = async () => { - if (!selectedSchema || !selectedTable) return; - setRowsLoading(true); - try { - const resp = await apiFetch( - `${apiBase()}/admin/agent-db/${userId}/${selectedSchema}/${selectedTable}/rows?page=${page}&page_size=25&q=${encodeURIComponent( - q - )}&sort_by=${encodeURIComponent(sortBy)}&sort_dir=${sortDir}` - , { headers: authHeaders }); - if (!resp.ok) throw new Error("Failed to fetch rows"); - setRowsData(await resp.json()); - setError(null); - } catch (err: any) { - setError(err.message); - } finally { - setRowsLoading(false); - } - }; - - const runAction = async (fn: () => Promise) => { - try { - await fn(); - await fetchDetail(); - await fetchRows(); - setError(null); - } catch (err: any) { - setError(err?.message || "Operation failed"); - } - }; - - const handleSaveCell = async (row: any, column: string) => { - if (!editingCell || editingCell.rowId !== row._id || editingCell.column !== column) return; - - const originalValue = String(row[column] ?? ""); - if (editCellValue === originalValue) { - setEditingCell(null); - return; - } - - setEditingCell(null); - - await runAction(async () => { - const obj = { ...row }; - delete obj._id; - - let finalValue: any = editCellValue; - if (row[column] !== null && row[column] !== undefined) { - if (typeof row[column] === "number") { - const num = Number(editCellValue); - if (!isNaN(num)) { - finalValue = num; - } - } else if (typeof row[column] === "boolean") { - if (editCellValue.toLowerCase() === "true") finalValue = true; - else if (editCellValue.toLowerCase() === "false") finalValue = false; - } - } else { - const num = Number(editCellValue); - if (editCellValue !== "" && !isNaN(num)) { - finalValue = num; - } - } - - obj[column] = finalValue; - - await postJson( - `${apiBase()}/admin/agent-db/${userId}/${selectedSchema}/${selectedTable}/rows/${row._id}`, - "PATCH", - { row: obj, tenant_id: "default" } - ); - }); - }; - - useEffect(() => { - if (userId) fetchDetail(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [userId, authHeaders]); - - useEffect(() => { - fetchRows(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedSchema, selectedTable, page, q, sortBy, sortDir]); - - if (loading && !data) return
Loading DB editor...
; - - return ( -
-
- {!embedded && ( -
-
- - - Agent DB Explorer - - / - {userId} -
-

DB Editor

-
- )} - - {error &&
{error}
} - -
- - - - -
- -
-
-
-

Schemas

- -
- {(data?.schemas || []).map((s: any) => ( -
-
{s.schema_name}
-
- {(s.tables || []).map((t: any) => { - const active = selectedSchema === s.schema_name && selectedTable === t.table_name; - return ( - - ); - })} -
-
- ))} -
- -
-
-
{selectedSchema}.{selectedTable}
- setQ(e.target.value)} placeholder="Search" className="bg-black/30 border border-white/10 rounded px-2 py-1 text-xs" /> - - - - -
- - {tab === "browse" && ( -
- - - - {(rowsData?.columns || []).map((c: string) => )} - - - - - {rowsLoading && } - {!rowsLoading && (rowsData?.rows || []).map((r: any) => ( - - {(rowsData?.columns || []).map((c: string) => { - const isEditing = editingCell?.rowId === r._id && editingCell?.column === c; - const isId = c === "_id"; - - return ( - - ); - })} - - - ))} - -
{c}actions
Loading...
{ - if (isId) return; - setEditingCell({ rowId: r._id, column: c }); - setEditCellValue(String(r[c] ?? "")); - }} - > - {isEditing ? ( - setEditCellValue(e.target.value)} - onKeyDown={(e) => { - if (e.key === "Enter") { - handleSaveCell(r, c); - } else if (e.key === "Escape") { - setEditingCell(null); - } - }} - onBlur={() => handleSaveCell(r, c)} - className="bg-black/50 text-white border border-blue-500 rounded px-1.5 py-0.5 text-xs w-full focus:outline-none focus:ring-1 focus:ring-blue-500" - autoFocus - /> - ) : r[c] === null || r[c] === undefined || String(r[c]) === "" ? ( - (null) - ) : ( - String(r[c]) - )} - - -
-
- Page {rowsData?.page || 1}/{rowsData?.total_pages || 1} (total {rowsData?.total || 0}) -
- - -
-
-
- )} - - {tab === "schema" && ( -
-
-

Create Table

- setNewTableName(e.target.value)} className="w-full mb-2 bg-black/30 border border-white/10 rounded px-2 py-1 text-xs" /> -