create-windy 0.6.12 → 0.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +572 -269
- package/package.json +1 -1
- package/template/.agents/skills/windy-business-module/SKILL.md +98 -70
- package/template/.windy-template.json +3 -3
- package/template/AGENTS.md +3 -6
- package/template/apps/agent-server/Dockerfile +2 -3
- package/template/apps/agent-server/README.md +38 -54
- package/template/apps/agent-server/pyproject.toml +0 -1
- package/template/apps/agent-server/src/southwind_agent_server/app.py +4 -2
- package/template/apps/agent-server/src/southwind_agent_server/attempt_context.py +191 -0
- package/template/apps/agent-server/src/southwind_agent_server/attempt_context_projection.py +203 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_contracts.py +61 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_governance.py +82 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_routes.py +121 -0
- package/template/apps/agent-server/src/southwind_agent_server/client_completion_runtime.py +158 -0
- package/template/apps/agent-server/src/southwind_agent_server/context_message_digest.py +24 -0
- package/template/apps/agent-server/src/southwind_agent_server/context_version_contracts.py +71 -0
- package/template/apps/agent-server/src/southwind_agent_server/context_version_port.py +307 -0
- package/template/apps/agent-server/src/southwind_agent_server/contracts.py +39 -0
- package/template/apps/agent-server/src/southwind_agent_server/deterministic.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/engine.py +9 -1
- package/template/apps/agent-server/src/southwind_agent_server/engine_identity.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/fingerprint.py +15 -0
- package/template/apps/agent-server/src/southwind_agent_server/health_routes.py +37 -3
- package/template/apps/agent-server/src/southwind_agent_server/openai_engine.py +46 -26
- package/template/apps/agent-server/src/southwind_agent_server/openai_engine_validation.py +32 -0
- package/template/apps/agent-server/src/southwind_agent_server/openai_provider.py +7 -0
- package/template/apps/agent-server/src/southwind_agent_server/postgres_report_insert.py +5 -2
- package/template/apps/agent-server/src/southwind_agent_server/postgres_report_queries.py +1 -0
- package/template/apps/agent-server/src/southwind_agent_server/postgres_report_store.py +6 -1
- package/template/apps/agent-server/src/southwind_agent_server/postgres_store.py +3 -2
- package/template/apps/agent-server/src/southwind_agent_server/postgres_store_backend.py +1 -0
- package/template/apps/agent-server/src/southwind_agent_server/provider_governance.py +21 -0
- package/template/apps/agent-server/src/southwind_agent_server/report_lifecycle.py +2 -1
- package/template/apps/agent-server/src/southwind_agent_server/report_presenter.py +1 -0
- package/template/apps/agent-server/src/southwind_agent_server/report_routes.py +7 -1
- package/template/apps/agent-server/src/southwind_agent_server/report_store.py +10 -56
- package/template/apps/agent-server/src/southwind_agent_server/report_store_protocol.py +75 -0
- package/template/apps/agent-server/src/southwind_agent_server/report_types.py +9 -2
- package/template/apps/agent-server/src/southwind_agent_server/runtime_budget.py +74 -0
- package/template/apps/agent-server/src/southwind_agent_server/runtime_factory.py +11 -3
- package/template/apps/agent-server/src/southwind_agent_server/service.py +41 -65
- package/template/apps/agent-server/src/southwind_agent_server/service_control.py +64 -0
- package/template/apps/agent-server/src/southwind_agent_server/service_execution.py +3 -0
- package/template/apps/agent-server/src/southwind_agent_server/sqlite_errors.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/sqlite_schema.py +9 -1
- package/template/apps/agent-server/src/southwind_agent_server/sqlite_store.py +6 -5
- package/template/apps/agent-server/src/southwind_agent_server/store.py +2 -0
- package/template/apps/agent-server/src/southwind_agent_server/trajectory.py +137 -0
- package/template/apps/agent-server/src/southwind_agent_server/unavailable_engine.py +58 -0
- package/template/apps/agent-server/tests/test_api.py +30 -11
- package/template/apps/agent-server/tests/test_client_completion.py +230 -0
- package/template/apps/agent-server/tests/test_provider_attempt_reporting.py +12 -24
- package/template/apps/agent-server/tests/test_report_resilience.py +2 -0
- package/template/apps/agent-server/tests/test_report_routes.py +58 -1
- package/template/apps/agent-server/tests/test_report_summary_parity.py +1 -0
- package/template/apps/agent-server/tests/test_run_capacity.py +2 -0
- package/template/apps/agent-server/tests/test_runtime_factory_readiness.py +18 -3
- package/template/apps/agent-server/tests/test_trajectory.py +91 -0
- package/template/apps/agent-server/uv.lock +0 -259
- package/template/apps/server/Dockerfile +9 -4
- package/template/apps/server/src/agent/actor-projection-audit.ts +6 -0
- package/template/apps/server/src/agent/agent-run-delegation-policy.ts +115 -0
- package/template/apps/server/src/agent/agent-session-bootstrap.ts +23 -0
- package/template/apps/server/src/agent/{debug-session-facade-provider-failure.test.ts → agent-session-facade-provider-failure.test.ts} +24 -33
- package/template/apps/server/src/agent/{debug-session-facade.test.ts → agent-session-facade.test.ts} +34 -45
- package/template/apps/server/src/agent/{debug-session-facade.ts → agent-session-facade.ts} +50 -57
- package/template/apps/server/src/agent/{debug-session-id.test.ts → agent-session-id.test.ts} +5 -5
- package/template/apps/server/src/agent/{debug-session-id.ts → agent-session-id.ts} +7 -7
- package/template/apps/server/src/agent/{debug-session-provider-reader.ts → agent-session-provider-reader.ts} +18 -15
- package/template/apps/server/src/agent/{debug-session-routes.test.ts → agent-session-routes.test.ts} +16 -16
- package/template/apps/server/src/agent/{debug-session-routes.ts → agent-session-routes.ts} +12 -12
- package/template/apps/server/src/agent/{debug-session-validation.ts → agent-session-validation.ts} +13 -11
- package/template/apps/server/src/agent/client-session/authorization.ts +47 -0
- package/template/apps/server/src/agent/client-session/bootstrap.ts +96 -0
- package/template/apps/server/src/agent/client-session/capabilities.ts +19 -0
- package/template/apps/server/src/agent/client-session/completion.ts +299 -0
- package/template/apps/server/src/agent/client-session/contracts.ts +136 -0
- package/template/apps/server/src/agent/client-session/digest.ts +39 -0
- package/template/apps/server/src/agent/client-session/drizzle-repository.integration.test.ts +170 -0
- package/template/apps/server/src/agent/client-session/drizzle-repository.ts +345 -0
- package/template/apps/server/src/agent/client-session/errors.ts +28 -0
- package/template/apps/server/src/agent/client-session/fixtures/page-agent-1.12.2-request.json +52 -0
- package/template/apps/server/src/agent/client-session/host-auth.test.ts +144 -0
- package/template/apps/server/src/agent/client-session/host-auth.ts +110 -0
- package/template/apps/server/src/agent/client-session/manifest-admission.ts +240 -0
- package/template/apps/server/src/agent/client-session/openai-stream.ts +123 -0
- package/template/apps/server/src/agent/client-session/presentation.ts +46 -0
- package/template/apps/server/src/agent/client-session/remote-provider.test.ts +144 -0
- package/template/apps/server/src/agent/client-session/remote-provider.ts +216 -0
- package/template/apps/server/src/agent/client-session/repository.ts +225 -0
- package/template/apps/server/src/agent/client-session/request.test.ts +69 -0
- package/template/apps/server/src/agent/client-session/request.ts +289 -0
- package/template/apps/server/src/agent/client-session/revocation.ts +23 -0
- package/template/apps/server/src/agent/client-session/routes.ts +315 -0
- package/template/apps/server/src/agent/client-session/runtime-audit.ts +42 -0
- package/template/apps/server/src/agent/client-session/service.test-support.ts +226 -0
- package/template/apps/server/src/agent/client-session/service.test.ts +268 -0
- package/template/apps/server/src/agent/client-session/service.ts +346 -0
- package/template/apps/server/src/agent/context-memory/attempt-context-contracts.ts +60 -0
- package/template/apps/server/src/agent/context-memory/authoritative-source-registry.ts +127 -0
- package/template/apps/server/src/agent/context-memory/context-builder.test.ts +160 -0
- package/template/apps/server/src/agent/context-memory/context-builder.ts +184 -0
- package/template/apps/server/src/agent/context-memory/contracts.ts +284 -0
- package/template/apps/server/src/agent/context-memory/digest.ts +22 -0
- package/template/apps/server/src/agent/context-memory/memory-authorization.ts +82 -0
- package/template/apps/server/src/agent/context-memory/memory-content.ts +69 -0
- package/template/apps/server/src/agent/context-memory/memory-object-registry.ts +87 -0
- package/template/apps/server/src/agent/context-memory/memory-projector-contracts.ts +121 -0
- package/template/apps/server/src/agent/context-memory/memory-projector-validation.ts +155 -0
- package/template/apps/server/src/agent/context-memory/memory-projector.test.ts +19 -0
- package/template/apps/server/src/agent/context-memory/memory-projector.ts +259 -0
- package/template/apps/server/src/agent/context-memory/memory-retrieval-policy.ts +195 -0
- package/template/apps/server/src/agent/context-memory/memory-retriever.test.ts +339 -0
- package/template/apps/server/src/agent/context-memory/memory-retriever.ts +184 -0
- package/template/apps/server/src/agent/context-memory/search-provider-port.test.ts +62 -0
- package/template/apps/server/src/agent/context-memory/search-provider-port.ts +75 -0
- package/template/apps/server/src/agent/context-memory/working-context-expiry.ts +95 -0
- package/template/apps/server/src/agent/context-message-recovery.ts +23 -0
- package/template/apps/server/src/agent/context-version-routes.ts +241 -0
- package/template/apps/server/src/agent/context-version-runtime.ts +332 -0
- package/template/apps/server/src/agent/context-version-support.ts +93 -0
- package/template/apps/server/src/agent/context-version-validation.ts +118 -0
- package/template/apps/server/src/agent/drizzle-run-binding-repository.ts +11 -0
- package/template/apps/server/src/agent/idempotency-key.ts +9 -1
- package/template/apps/server/src/agent/memory-runtime-adapters.ts +266 -0
- package/template/apps/server/src/agent/memory-scope-binding.ts +14 -0
- package/template/apps/server/src/agent/module-ai-port-factory.ts +41 -0
- package/template/apps/server/src/agent/provider-input-governance.ts +19 -0
- package/template/apps/server/src/agent/remote-runtime-response.ts +162 -0
- package/template/apps/server/src/agent/remote-runtime.ts +53 -153
- package/template/apps/server/src/agent/run-audit.ts +2 -2
- package/template/apps/server/src/agent/run-authorization.test.ts +27 -0
- package/template/apps/server/src/agent/run-authorization.ts +60 -1
- package/template/apps/server/src/agent/run-binding-repository.ts +9 -0
- package/template/apps/server/src/agent/run-browser-authorization.ts +79 -0
- package/template/apps/server/src/agent/run-contracts.ts +23 -0
- package/template/apps/server/src/agent/run-facade.ts +139 -139
- package/template/apps/server/src/agent/run-failure-cleanup.ts +58 -0
- package/template/apps/server/src/agent/run-operation-policy.ts +20 -0
- package/template/apps/server/src/agent/run-route-input.ts +19 -1
- package/template/apps/server/src/agent/run-routes.ts +133 -5
- package/template/apps/server/src/agent/run-runtime-request.ts +89 -0
- package/template/apps/server/src/agent/run-session-authorization.ts +95 -0
- package/template/apps/server/src/agent/run-start-preparation.ts +71 -0
- package/template/apps/server/src/agent/runtime-bootstrap-input.ts +42 -0
- package/template/apps/server/src/agent/runtime-bootstrap-report.test.ts +53 -1
- package/template/apps/server/src/agent/runtime-bootstrap.ts +114 -111
- package/template/apps/server/src/agent/runtime-tool-composition.ts +38 -0
- package/template/apps/server/src/agent/session-context-source-support.ts +38 -0
- package/template/apps/server/src/agent/session-context-source.ts +346 -0
- package/template/apps/server/src/agent/session-invalidation/contracts.ts +217 -0
- package/template/apps/server/src/agent/session-invalidation/dispatcher.contract.test.ts +333 -0
- package/template/apps/server/src/agent/session-invalidation/dispatcher.ts +205 -0
- package/template/apps/server/src/agent/session-invalidation/module-authoritative-producer.test.ts +127 -0
- package/template/apps/server/src/agent/session-invalidation/module-authoritative-producer.ts +202 -0
- package/template/apps/server/src/agent/session-invalidation/read-guard.ts +39 -0
- package/template/apps/server/src/agent/session-invalidation/runtime.ts +69 -0
- package/template/apps/server/src/agent/session-invalidation/test-envelopes.ts +24 -0
- package/template/apps/server/src/agent/session-invalidation/worker.contract.test.ts +135 -0
- package/template/apps/server/src/agent/session-invalidation/worker.ts +76 -0
- package/template/apps/server/src/agent/session-log/checkpoint-digest.ts +36 -0
- package/template/apps/server/src/agent/session-log/domain.ts +123 -0
- package/template/apps/server/src/agent/session-log/events.ts +229 -0
- package/template/apps/server/src/agent/session-log/history.ts +143 -0
- package/template/apps/server/src/agent/session-log/in-memory-repository.ts +340 -0
- package/template/apps/server/src/agent/session-log/lifecycle.ts +67 -0
- package/template/apps/server/src/agent/session-log/replay-policy.ts +76 -0
- package/template/apps/server/src/agent/session-log/repository.ts +103 -0
- package/template/apps/server/src/agent/session-log/service.ts +349 -0
- package/template/apps/server/src/agent/session-log/session-log.test.ts +282 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-context-memory.ts +348 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-governed-context.ts +328 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-invalidation-outbox.ts +260 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-memory-projection-deletion.ts +56 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-run-projection-receipt.ts +80 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-fork.ts +147 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-list.ts +24 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-mapping.ts +154 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-mutations.ts +64 -0
- package/template/apps/server/src/agent/session-persistence/drizzle-session-repository.ts +335 -0
- package/template/apps/server/src/agent/session-persistence/invalidation-projections.ts +229 -0
- package/template/apps/server/src/agent/session-persistence/payload-codec.ts +90 -0
- package/template/apps/server/src/agent/session-projection-access.ts +155 -0
- package/template/apps/server/src/agent/session-projection-bootstrap.ts +87 -0
- package/template/apps/server/src/agent/session-projection-errors.ts +22 -0
- package/template/apps/server/src/agent/session-projection-facade.ts +349 -0
- package/template/apps/server/src/agent/session-projection-routes.ts +215 -0
- package/template/apps/server/src/agent/session-projection-view.ts +137 -0
- package/template/apps/server/src/agent/session-result-memory.ts +228 -0
- package/template/apps/server/src/agent/session-run-lifecycle.ts +85 -0
- package/template/apps/server/src/agent/session-run-link-contracts.ts +56 -0
- package/template/apps/server/src/agent/session-run-link.ts +343 -0
- package/template/apps/server/src/agent/session-run-recovery.ts +16 -0
- package/template/apps/server/src/agent/session-runtime-composition.ts +265 -0
- package/template/apps/server/src/agent/session-source-chain-authorizer.ts +141 -0
- package/template/apps/server/src/agent/session-terminal-reconciler.ts +100 -0
- package/template/apps/server/src/agent/session-turn-state.ts +49 -0
- package/template/apps/server/src/agent/tool-audit.ts +3 -3
- package/template/apps/server/src/agent/tool-execution-receipt.ts +13 -0
- package/template/apps/server/src/agent/tool-host.ts +41 -4
- package/template/apps/server/src/agent/tool-registry-composition.ts +52 -0
- package/template/apps/server/src/agent/tool-registry.test.ts +5 -5
- package/template/apps/server/src/agent/tool-registry.ts +53 -59
- package/template/apps/server/src/agent/unavailable-routes.ts +49 -5
- package/template/apps/server/src/agent/workflow-durable-runtime-input.ts +32 -0
- package/template/apps/server/src/agent/workflow-runtime-bootstrap.ts +59 -0
- package/template/apps/server/src/agent-workflow/adapter-dispatch.ts +148 -0
- package/template/apps/server/src/agent-workflow/approval-node-adapter.ts +77 -0
- package/template/apps/server/src/agent-workflow/artifact-access-error.ts +9 -0
- package/template/apps/server/src/agent-workflow/artifact-node-adapter.ts +67 -0
- package/template/apps/server/src/agent-workflow/artifact-policy.ts +71 -0
- package/template/apps/server/src/agent-workflow/artifact-source-authorization.ts +85 -0
- package/template/apps/server/src/agent-workflow/authorization.ts +238 -0
- package/template/apps/server/src/agent-workflow/budget-ledger.ts +118 -0
- package/template/apps/server/src/agent-workflow/budget-validation.ts +305 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-binding.ts +17 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-evidence.ts +142 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-port.ts +304 -0
- package/template/apps/server/src/agent-workflow/canonical-agent-run-remote.ts +64 -0
- package/template/apps/server/src/agent-workflow/canonical-json.ts +16 -0
- package/template/apps/server/src/agent-workflow/command-drive.ts +195 -0
- package/template/apps/server/src/agent-workflow/command-error.ts +9 -0
- package/template/apps/server/src/agent-workflow/command-facade.ts +290 -0
- package/template/apps/server/src/agent-workflow/command-input.ts +133 -0
- package/template/apps/server/src/agent-workflow/condition-node-adapter.ts +69 -0
- package/template/apps/server/src/agent-workflow/definition-budget-validation.ts +41 -0
- package/template/apps/server/src/agent-workflow/definition-node-validation.ts +197 -0
- package/template/apps/server/src/agent-workflow/definition-validation.ts +198 -0
- package/template/apps/server/src/agent-workflow/delegated-tool-authorization.ts +15 -0
- package/template/apps/server/src/agent-workflow/delegation-child-delivery.ts +129 -0
- package/template/apps/server/src/agent-workflow/delegation-execution-authorization.ts +218 -0
- package/template/apps/server/src/agent-workflow/delegation-policy-validation.ts +253 -0
- package/template/apps/server/src/agent-workflow/delegation-policy.ts +179 -0
- package/template/apps/server/src/agent-workflow/drizzle-artifact-port.ts +211 -0
- package/template/apps/server/src/agent-workflow/drizzle-artifact-support.ts +152 -0
- package/template/apps/server/src/agent-workflow/drizzle-budget-ledger-settlement.ts +271 -0
- package/template/apps/server/src/agent-workflow/drizzle-budget-ledger-support.ts +226 -0
- package/template/apps/server/src/agent-workflow/drizzle-budget-ledger.ts +189 -0
- package/template/apps/server/src/agent-workflow/drizzle-cancellation-reconcile.ts +177 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegated-tool-authorization.ts +155 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegation-completion.ts +84 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegation-lifecycle.ts +139 -0
- package/template/apps/server/src/agent-workflow/drizzle-delegation-port.ts +288 -0
- package/template/apps/server/src/agent-workflow/drizzle-effect-command-fence.ts +333 -0
- package/template/apps/server/src/agent-workflow/drizzle-evaluation-repository.ts +214 -0
- package/template/apps/server/src/agent-workflow/drizzle-event-validation.ts +43 -0
- package/template/apps/server/src/agent-workflow/drizzle-recovery-admission.ts +115 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository-lineage.ts +103 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository-mappers.ts +317 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository-write.ts +311 -0
- package/template/apps/server/src/agent-workflow/drizzle-repository.ts +285 -0
- package/template/apps/server/src/agent-workflow/drizzle-side-effect-repository.ts +83 -0
- package/template/apps/server/src/agent-workflow/drizzle-write-support.ts +101 -0
- package/template/apps/server/src/agent-workflow/durable-continuation-authorization.ts +109 -0
- package/template/apps/server/src/agent-workflow/durable-continuation-driver.ts +97 -0
- package/template/apps/server/src/agent-workflow/durable-continuation-runtime.ts +173 -0
- package/template/apps/server/src/agent-workflow/durable-job-node-adapter.ts +106 -0
- package/template/apps/server/src/agent-workflow/effect-command-fence.ts +250 -0
- package/template/apps/server/src/agent-workflow/evaluation-evidence-coordinates.ts +225 -0
- package/template/apps/server/src/agent-workflow/evaluation-evidence-metrics.ts +280 -0
- package/template/apps/server/src/agent-workflow/evaluation-evidence-reader.ts +326 -0
- package/template/apps/server/src/agent-workflow/evaluation-metrics-validation.ts +85 -0
- package/template/apps/server/src/agent-workflow/evaluation-projection.ts +70 -0
- package/template/apps/server/src/agent-workflow/evaluation-repository.ts +134 -0
- package/template/apps/server/src/agent-workflow/evaluation-service.ts +292 -0
- package/template/apps/server/src/agent-workflow/evaluation-tool-registration.ts +95 -0
- package/template/apps/server/src/agent-workflow/evaluation-validation.ts +331 -0
- package/template/apps/server/src/agent-workflow/event-validation.ts +277 -0
- package/template/apps/server/src/agent-workflow/governed-tool-schema.ts +55 -0
- package/template/apps/server/src/agent-workflow/in-memory-evaluation-repository.ts +123 -0
- package/template/apps/server/src/agent-workflow/in-memory-mutation-validation.ts +154 -0
- package/template/apps/server/src/agent-workflow/in-memory-repository-support.ts +277 -0
- package/template/apps/server/src/agent-workflow/in-memory-repository.ts +339 -0
- package/template/apps/server/src/agent-workflow/in-memory-side-effect-store.ts +78 -0
- package/template/apps/server/src/agent-workflow/input-receipt.ts +55 -0
- package/template/apps/server/src/agent-workflow/model-node-adapter.ts +86 -0
- package/template/apps/server/src/agent-workflow/model-pricing-catalog.ts +215 -0
- package/template/apps/server/src/agent-workflow/node-adapter-factory.ts +83 -0
- package/template/apps/server/src/agent-workflow/node-adapters.ts +50 -0
- package/template/apps/server/src/agent-workflow/node-execution-ports.ts +185 -0
- package/template/apps/server/src/agent-workflow/node-input-receipt-port.ts +42 -0
- package/template/apps/server/src/agent-workflow/node-result-receipt.ts +50 -0
- package/template/apps/server/src/agent-workflow/platform-node-adapter-support.ts +185 -0
- package/template/apps/server/src/agent-workflow/platform-node-adapters.ts +256 -0
- package/template/apps/server/src/agent-workflow/platform-node-approval.ts +146 -0
- package/template/apps/server/src/agent-workflow/platform-node-direct-adapters.ts +65 -0
- package/template/apps/server/src/agent-workflow/production-delegation-scope.ts +58 -0
- package/template/apps/server/src/agent-workflow/production-node-policies.ts +62 -0
- package/template/apps/server/src/agent-workflow/query-service.ts +198 -0
- package/template/apps/server/src/agent-workflow/release.ts +96 -0
- package/template/apps/server/src/agent-workflow/repository.ts +157 -0
- package/template/apps/server/src/agent-workflow/routes.ts +307 -0
- package/template/apps/server/src/agent-workflow/runtime-composition.ts +308 -0
- package/template/apps/server/src/agent-workflow/scheduler-cancellation-reconcile.ts +253 -0
- package/template/apps/server/src/agent-workflow/scheduler-cancellation-support.ts +145 -0
- package/template/apps/server/src/agent-workflow/scheduler-cancellation.ts +2 -0
- package/template/apps/server/src/agent-workflow/scheduler-context.ts +85 -0
- package/template/apps/server/src/agent-workflow/scheduler-deadline.ts +65 -0
- package/template/apps/server/src/agent-workflow/scheduler-effect-result.ts +205 -0
- package/template/apps/server/src/agent-workflow/scheduler-execution-convergence.ts +174 -0
- package/template/apps/server/src/agent-workflow/scheduler-execution.ts +211 -0
- package/template/apps/server/src/agent-workflow/scheduler-failure.ts +102 -0
- package/template/apps/server/src/agent-workflow/scheduler-join-cancellation.ts +282 -0
- package/template/apps/server/src/agent-workflow/scheduler-mutation-queue.ts +13 -0
- package/template/apps/server/src/agent-workflow/scheduler-node-timeout.ts +139 -0
- package/template/apps/server/src/agent-workflow/scheduler-parallel-dispatch.ts +99 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-activation.ts +63 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-budget.ts +41 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-effect.ts +331 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-event-time.ts +26 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-failed-policy.ts +129 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-node.ts +208 -0
- package/template/apps/server/src/agent-workflow/scheduler-recovery-policy-convergence.ts +140 -0
- package/template/apps/server/src/agent-workflow/scheduler-reservation-convergence.ts +40 -0
- package/template/apps/server/src/agent-workflow/scheduler-side-effect-execution.ts +249 -0
- package/template/apps/server/src/agent-workflow/scheduler-support.ts +235 -0
- package/template/apps/server/src/agent-workflow/scheduler-workflow-cancellation.ts +296 -0
- package/template/apps/server/src/agent-workflow/scheduler.ts +289 -0
- package/template/apps/server/src/agent-workflow/service-completion.ts +102 -0
- package/template/apps/server/src/agent-workflow/service-mutation-identity.ts +94 -0
- package/template/apps/server/src/agent-workflow/service-node-admission.ts +36 -0
- package/template/apps/server/src/agent-workflow/service-node-run-update.ts +55 -0
- package/template/apps/server/src/agent-workflow/service-recovery-events.ts +38 -0
- package/template/apps/server/src/agent-workflow/service-recovery.ts +264 -0
- package/template/apps/server/src/agent-workflow/service-retry.ts +86 -0
- package/template/apps/server/src/agent-workflow/service-run-command.ts +131 -0
- package/template/apps/server/src/agent-workflow/service-state-error.ts +21 -0
- package/template/apps/server/src/agent-workflow/service-state-invariants.ts +44 -0
- package/template/apps/server/src/agent-workflow/service-support.ts +152 -0
- package/template/apps/server/src/agent-workflow/service.ts +307 -0
- package/template/apps/server/src/agent-workflow/side-effect-state.ts +226 -0
- package/template/apps/server/src/agent-workflow/state-machine.ts +321 -0
- package/template/apps/server/src/agent-workflow/subagent-node-adapter.ts +229 -0
- package/template/apps/server/src/agent-workflow/tool-node-adapter.ts +259 -0
- package/template/apps/server/src/agent-workflow/usage.ts +149 -0
- package/template/apps/server/src/agent-workflow/wait-signal-service.ts +147 -0
- package/template/apps/server/src/agent-workflow/workflow-artifact-token.ts +109 -0
- package/template/apps/server/src/agent-workflow/workflow-value-validation.ts +101 -0
- package/template/apps/server/src/agent-workflow/workspace-policy.ts +109 -0
- package/template/apps/server/src/ai-runtime-report/remote-parser.ts +41 -0
- package/template/apps/server/src/ai-runtime-report/service.test.ts +2 -0
- package/template/apps/server/src/app/agent-runtime-composition.ts +38 -0
- package/template/apps/server/src/app/client-agent-host-auth-binding.ts +10 -0
- package/template/apps/server/src/auth/actor-resolver.test.ts +33 -0
- package/template/apps/server/src/auth/actor-resolver.ts +6 -1
- package/template/apps/server/src/auth/composition.ts +36 -0
- package/template/apps/server/src/auth/routes.test-support.ts +2 -0
- package/template/apps/server/src/auth/routes.test.ts +18 -0
- package/template/apps/server/src/auth/runtime.ts +2 -0
- package/template/apps/server/src/auth/service-options.ts +16 -0
- package/template/apps/server/src/auth/service.ts +7 -12
- package/template/apps/server/src/index.ts +35 -37
- package/template/apps/server/src/license/pairing-service.test.ts +1 -1
- package/template/apps/server/src/module-host/agent-session-memory-port.ts +91 -0
- package/template/apps/server/src/module-host/{debug-session-provider-registration.test.ts → agent-session-provider-registration.test.ts} +42 -17
- package/template/apps/server/src/module-host/{debug-session-provider-registration.ts → agent-session-provider-registration.ts} +18 -18
- package/template/apps/server/src/module-host/agent-source-invalidation-port.ts +53 -0
- package/template/apps/server/src/module-host/http-runtime.ts +14 -0
- package/template/apps/server/src/module-host/initialize-contracts.ts +4 -5
- package/template/apps/server/src/module-host/initialize.ts +4 -4
- package/template/apps/server/src/module-host/request-context.test.ts +5 -5
- package/template/apps/server/src/module-host/request-context.ts +8 -0
- package/template/apps/server/src/module-host/route-install-context.ts +65 -0
- package/template/apps/server/src/module-host/route-installer.ts +11 -56
- package/template/apps/server/src/module-host/scoped-host.ts +17 -12
- package/template/apps/server/src/module-host/storage-authorization-binding.test.ts +3 -3
- package/template/apps/server/src/module-host.ts +3 -5
- package/template/apps/server/src/runtime.ts +3 -36
- package/template/apps/server/src/storage/routes-stream-cancellation.test.ts +19 -0
- package/template/apps/server/src/storage/routes.ts +3 -1
- package/template/apps/server/src/system/actor.ts +15 -2
- package/template/apps/server/src/system/authorization-invalidation-bridge.ts +30 -0
- package/template/apps/server/src/system/authorization-invalidation-composition.ts +36 -0
- package/template/apps/server/src/system/drizzle-system.ts +8 -1
- package/template/apps/server/src/system/identity-route-config.ts +9 -1
- package/template/apps/server/src/system/routes.ts +3 -0
- package/template/apps/server/src/system/seed.ts +3 -0
- package/template/apps/server/src/system/user-account-policy.ts +91 -0
- package/template/apps/web/package.json +1 -0
- package/template/apps/web/src/layout/AppSidebar.vue +2 -0
- package/template/apps/web/src/pages/system/AgentSessionPage.vue +73 -0
- package/template/apps/web/src/pages/system/AgentSessionPage.webtest.ts +66 -0
- package/template/apps/web/src/pages/system/AgentWorkflowPage.vue +69 -0
- package/template/apps/web/src/pages/system/components/agent-session/AgentSessionDetail.vue +114 -0
- package/template/apps/web/src/pages/system/components/agent-session/AgentSessionList.vue +84 -0
- package/template/apps/web/src/pages/system/components/agent-session/ContextVersionPanel.vue +119 -0
- package/template/apps/web/src/pages/system/components/agent-session/ContextVersionPanel.webtest.ts +46 -0
- package/template/apps/web/src/pages/system/components/agent-session/MemoryProjectionPanel.vue +163 -0
- package/template/apps/web/src/pages/system/components/agent-session/MemoryProjectionPanel.webtest.ts +62 -0
- package/template/apps/web/src/pages/system/components/agent-session/SessionTimeline.vue +71 -0
- package/template/apps/web/src/pages/system/components/agent-session/SessionTimeline.webtest.ts +34 -0
- package/template/apps/web/src/pages/system/components/agent-session/agent-session-presenter.ts +56 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowNodeCard.vue +39 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowNodeDetail.vue +172 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunDetail.vue +151 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunGraph.vue +96 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunList.vue +100 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/WorkflowRunSummary.vue +148 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/agent-workflow-presenter.ts +74 -0
- package/template/apps/web/src/pages/system/components/agent-workflow/workflow-graph-layout.ts +108 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunDetailDialog.vue +9 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunDetailDialog.webtest.ts +22 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeRunTable.webtest.ts +2 -0
- package/template/apps/web/src/pages/system/components/ai-runtime/AiRuntimeTrajectory.vue +118 -0
- package/template/apps/web/src/pages/system/composables/useAgentSessions.ts +209 -0
- package/template/apps/web/src/pages/system/composables/useAgentSessions.webtest.ts +138 -0
- package/template/apps/web/src/pages/system/composables/useAgentWorkflowRuns.ts +173 -0
- package/template/apps/web/src/router/index.ts +4 -0
- package/template/apps/web/src/router/platform-admin-route-bindings.ts +6 -0
- package/template/apps/web/src/services/agent-session-api.ts +159 -0
- package/template/apps/web/src/services/agent-session-api.webtest.ts +65 -0
- package/template/apps/web/src/services/agent-workflow-api.ts +181 -0
- package/template/apps/web/src/services/ai-runtime-api.ts +4 -0
- package/template/docker-compose.yml +11 -8
- package/template/docs/adr/0003-agent-session-event-source.md +3 -0
- package/template/docs/architecture/agent-harness.md +464 -0
- package/template/docs/architecture/agent-workflow.md +99 -0
- package/template/docs/architecture/ai-runtime.md +55 -47
- package/template/docs/architecture/module-host.md +4 -3
- package/template/docs/operations/adk-retirement.md +98 -0
- package/template/docs/operations/agent-session-memory.md +162 -0
- package/template/docs/operations/agent-session-troubleshooting.md +196 -0
- package/template/docs/operations/agent-workflow-recovery.md +74 -0
- package/template/docs/operations/incremental-delivery.md +1 -1
- package/template/docs/platform/agent-production-store.md +82 -0
- package/template/docs/platform/agent-run-reattachment.md +52 -0
- package/template/docs/platform/agent-runtime-observability.md +4 -3
- package/template/docs/platform/agent-runtime.md +116 -281
- package/template/docs/platform/agent-tool-approval.md +61 -0
- package/template/docs/platform/background-ai-operations.md +50 -0
- package/template/docs/platform/client-agent-session.md +173 -0
- package/template/docs/platform/embedding-ai-runtime.md +94 -0
- package/template/docs/platform/platform-authentication.md +5 -8
- package/template/package.json +0 -1
- package/template/packages/ai-client/index.ts +1 -0
- package/template/packages/ai-client/package.json +2 -1
- package/template/packages/ai-client/src/agent/client/client.ts +15 -2
- package/template/packages/ai-client/src/agent/client/run-protocol.test.ts +39 -25
- package/template/packages/ai-client/src/agent/client/types.ts +4 -0
- package/template/packages/ai-client/src/agent/contracts/contracts.test.ts +49 -7
- package/template/packages/ai-client/src/agent/contracts/events.ts +61 -0
- package/template/packages/ai-client/src/agent/contracts/runs.ts +1 -0
- package/template/packages/ai-client/src/client-agent/contracts.ts +131 -0
- package/template/packages/ai-client/src/client-agent/http.test.ts +60 -0
- package/template/packages/ai-client/src/client-agent/http.ts +66 -0
- package/template/packages/ai-client/src/client-agent/index.ts +3 -0
- package/template/packages/ai-client/src/client-agent/validation.test.ts +57 -0
- package/template/packages/ai-client/src/client-agent/validation.ts +152 -0
- package/template/packages/config/index.test.ts +18 -0
- package/template/packages/config/package.json +1 -1
- package/template/packages/config/src/platform-validation.ts +8 -0
- package/template/packages/config/src/platform.ts +22 -9
- package/template/packages/database/drizzle/0055_square_yellowjacket.sql +47 -0
- package/template/packages/database/drizzle/0056_tricky_living_mummy.sql +2 -0
- package/template/packages/database/drizzle/0057_mature_doomsday.sql +4 -0
- package/template/packages/database/drizzle/0058_agent_session_memory.sql +159 -0
- package/template/packages/database/drizzle/0059_agent_source_module_key.sql +16 -0
- package/template/packages/database/drizzle/0060_slimy_rocket_raccoon.sql +43 -0
- package/template/packages/database/drizzle/0061_agent_workflow.sql +303 -0
- package/template/packages/database/drizzle/meta/0055_snapshot.json +11071 -0
- package/template/packages/database/drizzle/meta/0056_snapshot.json +11098 -0
- package/template/packages/database/drizzle/meta/0057_snapshot.json +10878 -0
- package/template/packages/database/drizzle/meta/0058_snapshot.json +12294 -0
- package/template/packages/database/drizzle/meta/0059_snapshot.json +12344 -0
- package/template/packages/database/drizzle/meta/0060_snapshot.json +12326 -0
- package/template/packages/database/drizzle/meta/0061_snapshot.json +14395 -0
- package/template/packages/database/drizzle/meta/_journal.json +49 -0
- package/template/packages/database/package.json +1 -1
- package/template/packages/database/src/agent-runtime-schema.test.ts +26 -0
- package/template/packages/database/src/schema/agent-context-message.ts +38 -0
- package/template/packages/database/src/schema/agent-runtime.ts +7 -0
- package/template/packages/database/src/schema/agent-session-receipt.ts +36 -0
- package/template/packages/database/src/schema/agent-session.ts +344 -0
- package/template/packages/database/src/schema/agent-workflow-delegation.ts +126 -0
- package/template/packages/database/src/schema/agent-workflow-effects.ts +213 -0
- package/template/packages/database/src/schema/agent-workflow-evaluation.ts +67 -0
- package/template/packages/database/src/schema/agent-workflow.ts +270 -0
- package/template/packages/database/src/schema/client-agent.ts +95 -0
- package/template/packages/database/src/schema/index.ts +8 -0
- package/template/packages/jobs/package.json +1 -1
- package/template/packages/modules/index.ts +2 -0
- package/template/packages/modules/package.json +1 -1
- package/template/packages/modules/src/ai-client-execution-composition.test.ts +98 -0
- package/template/packages/modules/src/ai-client-execution-policy.ts +54 -0
- package/template/packages/modules/src/ai-operation-composition.ts +2 -0
- package/template/packages/modules/src/manifest.ts +15 -0
- package/template/packages/modules/src/system-admin-routes.ts +16 -0
- package/template/packages/modules/src/system-admin-ui-catalog.ts +4 -1
- package/template/packages/modules/src/system-agent-audit-actions.ts +26 -0
- package/template/packages/modules/src/system-ai-api-bindings.ts +262 -0
- package/template/packages/modules/src/system-api-control-plane.ts +4 -78
- package/template/packages/modules/src/system-audit-actions.ts +113 -0
- package/template/packages/modules/src/system-features.ts +17 -0
- package/template/packages/modules/src/system-module-catalog.ts +21 -11
- package/template/packages/modules/src/system-modules.ts +22 -0
- package/template/packages/modules/src/system-permissions.ts +8 -0
- package/template/packages/server-sdk/index.ts +43 -0
- package/template/packages/server-sdk/package.json +5 -1
- package/template/packages/server-sdk/src/agent-session-memory-port.ts +64 -0
- package/template/packages/server-sdk/src/agent-session-provider.ts +63 -0
- package/template/packages/server-sdk/src/agent-source-invalidation-port.ts +54 -0
- package/template/packages/server-sdk/src/ai-operation-registration.ts +2 -0
- package/template/packages/server-sdk/src/client-agent-session.ts +95 -0
- package/template/packages/server-sdk/src/debug-session-provider.ts +14 -63
- package/template/packages/server-sdk/src/module-host.ts +7 -3
- package/template/packages/server-sdk/src/request-context.ts +6 -0
- package/template/packages/shared/index.ts +3 -0
- package/template/packages/shared/package.json +1 -1
- package/template/packages/shared/src/agent-workflow-definition.ts +113 -0
- package/template/packages/shared/src/agent-workflow-delegation.ts +123 -0
- package/template/packages/shared/src/agent-workflow-evaluation.ts +159 -0
- package/template/packages/shared/src/agent-workflow-events.ts +99 -0
- package/template/packages/shared/src/agent-workflow-run.ts +259 -0
- package/template/packages/shared/src/agent-workflow.ts +3 -0
- package/template/packages/shared/src/ai-runtime-report.ts +25 -0
- package/template/packages/shared/src/rbac.ts +24 -0
- package/template/packages/storage/package.json +1 -1
- package/template/packages/storage/src/upload-streams.test.ts +31 -0
- package/template/packages/storage/src/upload-streams.ts +20 -6
- package/template/apps/agent-server/adk_web_agents/__init__.py +0 -1
- package/template/apps/agent-server/adk_web_agents/canonical_debug/__init__.py +0 -1
- package/template/apps/agent-server/adk_web_agents/canonical_debug/agent.py +0 -145
- package/template/apps/agent-server/adk_web_agents/safe_debug/__init__.py +0 -3
- package/template/apps/agent-server/adk_web_agents/safe_debug/agent.py +0 -40
- package/template/apps/agent-server/adk_web_agents/services.py +0 -25
- package/template/apps/agent-server/project/adk-web-debug.json +0 -4
- package/template/apps/agent-server/src/southwind_agent_server/adk_adapter.py +0 -333
- package/template/apps/agent-server/src/southwind_agent_server/adk_debug.py +0 -348
- package/template/apps/agent-server/src/southwind_agent_server/adk_debug_sessions.py +0 -325
- package/template/apps/agent-server/src/southwind_agent_server/adk_failure.py +0 -13
- package/template/apps/agent-server/src/southwind_agent_server/adk_model.py +0 -304
- package/template/apps/agent-server/src/southwind_agent_server/adk_tools.py +0 -143
- package/template/apps/agent-server/tests/test_adk_adapter.py +0 -307
- package/template/apps/agent-server/tests/test_adk_debug_result_polling.py +0 -139
- package/template/apps/agent-server/tests/test_adk_debug_sessions.py +0 -215
- package/template/apps/agent-server/tests/test_adk_web_agent.py +0 -12
- package/template/apps/agent-server/tests/test_adk_web_canonical_debug.py +0 -282
- package/template/apps/server/src/agent/run-debug-authorization.ts +0 -27
- package/template/apps/server/src/agent/run-facade-adk-debug.test.ts +0 -95
- package/template/apps/server/src/runtime-adk-debug.test.ts +0 -270
- package/template/apps/server/src/runtime-adk-debug.ts +0 -164
- package/template/apps/server/src/runtime-request-actor.test.ts +0 -55
- package/template/apps/server/src/runtime-request-actor.ts +0 -22
- package/template/docker-compose.agent-debug.yml +0 -58
- package/template/scripts/dev-adk-web.ts +0 -107
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from .contracts import RuntimeLimits
|
|
6
|
+
from .engine import SafeEngineError
|
|
7
|
+
from .report_types import UsageFacts
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class RuntimeBudgetAdmission:
|
|
12
|
+
limits: RuntimeLimits
|
|
13
|
+
input_tokens: int = 0
|
|
14
|
+
output_tokens: int = 0
|
|
15
|
+
tool_calls: int = 0
|
|
16
|
+
|
|
17
|
+
def before_attempt(self, attempt: int) -> int | None:
|
|
18
|
+
if (
|
|
19
|
+
self.limits.max_model_attempts is not None
|
|
20
|
+
and attempt > self.limits.max_model_attempts
|
|
21
|
+
):
|
|
22
|
+
self._denied("Agent 模型调用次数超过 Workflow 上限")
|
|
23
|
+
if self.limits.max_input_tokens is not None:
|
|
24
|
+
if self.input_tokens >= self.limits.max_input_tokens:
|
|
25
|
+
self._denied("Agent 输入 Token 已耗尽")
|
|
26
|
+
if self.limits.max_output_tokens is None:
|
|
27
|
+
return None
|
|
28
|
+
remaining = self.limits.max_output_tokens - self.output_tokens
|
|
29
|
+
if remaining <= 0:
|
|
30
|
+
self._denied("Agent 输出 Token 已耗尽")
|
|
31
|
+
return remaining
|
|
32
|
+
|
|
33
|
+
def record_usage(self, usage: UsageFacts) -> None:
|
|
34
|
+
if usage.input_tokens is None or usage.output_tokens is None:
|
|
35
|
+
if (
|
|
36
|
+
self.limits.max_input_tokens is not None
|
|
37
|
+
or self.limits.max_output_tokens is not None
|
|
38
|
+
):
|
|
39
|
+
self._denied("Provider 未返回 Workflow Token 计量")
|
|
40
|
+
return
|
|
41
|
+
self.input_tokens += usage.input_tokens
|
|
42
|
+
self.output_tokens += usage.output_tokens
|
|
43
|
+
if (
|
|
44
|
+
self.limits.max_input_tokens is not None
|
|
45
|
+
and self.input_tokens > self.limits.max_input_tokens
|
|
46
|
+
):
|
|
47
|
+
self._denied("Agent 输入 Token 超过 Workflow 上限")
|
|
48
|
+
if (
|
|
49
|
+
self.limits.max_output_tokens is not None
|
|
50
|
+
and self.output_tokens > self.limits.max_output_tokens
|
|
51
|
+
):
|
|
52
|
+
self._denied("Agent 输出 Token 超过 Workflow 上限")
|
|
53
|
+
|
|
54
|
+
def before_provider(self, conservative_input_tokens: int) -> None:
|
|
55
|
+
if conservative_input_tokens < 0:
|
|
56
|
+
self._denied("Agent 输入 Token 上界无效")
|
|
57
|
+
if (
|
|
58
|
+
self.limits.max_input_tokens is not None
|
|
59
|
+
and self.input_tokens + conservative_input_tokens
|
|
60
|
+
> self.limits.max_input_tokens
|
|
61
|
+
):
|
|
62
|
+
self._denied("Agent 本次输入可能超过 Workflow Token 上限")
|
|
63
|
+
|
|
64
|
+
def reserve_tools(self, count: int) -> None:
|
|
65
|
+
self.tool_calls += count
|
|
66
|
+
if (
|
|
67
|
+
self.limits.max_tool_calls is not None
|
|
68
|
+
and self.tool_calls > self.limits.max_tool_calls
|
|
69
|
+
):
|
|
70
|
+
self._denied("Agent Tool 调用次数超过 Workflow 上限")
|
|
71
|
+
|
|
72
|
+
@staticmethod
|
|
73
|
+
def _denied(message: str) -> None:
|
|
74
|
+
raise SafeEngineError("BUDGET_EXCEEDED", message, retryable=False)
|
|
@@ -2,9 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
|
|
5
|
-
from .adk_adapter import AdkEngineAdapter
|
|
6
5
|
from .config import EnvironmentSecretResolver, OpenAiCompatibleConfig
|
|
6
|
+
from .context_version_port import HttpContextVersionPort, UnavailableContextVersionPort
|
|
7
7
|
from .engine import AgentEngineAdapter
|
|
8
|
+
from .openai_engine import OpenAiCompatibleEngineAdapter
|
|
8
9
|
from .openai_provider import OpenAiCompatibleProvider
|
|
9
10
|
from .postgres_report_store import PostgresAgentRuntimeReportStore
|
|
10
11
|
from .postgres_store import PostgresRunStore
|
|
@@ -18,6 +19,7 @@ from .sqlite_store import SqliteRunStore
|
|
|
18
19
|
from .store import InMemoryRunStore, RunStore
|
|
19
20
|
from .store_cipher import RunStoreCipher
|
|
20
21
|
from .tool_host import ToolHostClient
|
|
22
|
+
from .unavailable_engine import UnavailableEngineAdapter
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
def default_engine(
|
|
@@ -25,11 +27,12 @@ def default_engine(
|
|
|
25
27
|
) -> AgentEngineAdapter:
|
|
26
28
|
config = OpenAiCompatibleConfig.from_environment()
|
|
27
29
|
if config is None:
|
|
28
|
-
return
|
|
30
|
+
return UnavailableEngineAdapter()
|
|
29
31
|
internal_token = os.environ.get("AGENT_SERVER_INTERNAL_TOKEN", "").strip()
|
|
30
32
|
if not internal_token:
|
|
31
33
|
raise ValueError("Agent Server Provider 已配置但内部 Token 缺失")
|
|
32
|
-
|
|
34
|
+
context_host_url = os.environ.get("AGENT_CONTEXT_HOST_URL", "").strip()
|
|
35
|
+
return OpenAiCompatibleEngineAdapter(
|
|
33
36
|
OpenAiCompatibleProvider(
|
|
34
37
|
config,
|
|
35
38
|
EnvironmentSecretResolver(os.environ),
|
|
@@ -42,6 +45,11 @@ def default_engine(
|
|
|
42
45
|
)
|
|
43
46
|
),
|
|
44
47
|
report_store,
|
|
48
|
+
(
|
|
49
|
+
HttpContextVersionPort(context_host_url, internal_token)
|
|
50
|
+
if context_host_url
|
|
51
|
+
else UnavailableContextVersionPort()
|
|
52
|
+
),
|
|
45
53
|
)
|
|
46
54
|
|
|
47
55
|
|
|
@@ -23,10 +23,11 @@ from .report_lifecycle import (
|
|
|
23
23
|
from .report_store import AgentRuntimeReportStore
|
|
24
24
|
from .run_admission import RunAdmission
|
|
25
25
|
from .run_capacity import RunCapacity, RunCapacityReservation
|
|
26
|
-
from .
|
|
26
|
+
from .service_control import AgentRunControlMixin
|
|
27
|
+
from .service_errors import OperationNotFoundError
|
|
27
28
|
from .service_execution import build_engine_run_request
|
|
28
29
|
from .service_tasks import complete_task, renew_lease, run_admitted
|
|
29
|
-
from .signal_events import
|
|
30
|
+
from .signal_events import canonical_signal_event
|
|
30
31
|
from .store import RunRecord, RunStore
|
|
31
32
|
from .telemetry import AgentRunTrace
|
|
32
33
|
from .vision_requirement import require_vision_readiness
|
|
@@ -34,7 +35,7 @@ from .vision_requirement import require_vision_readiness
|
|
|
34
35
|
logger = logging.getLogger(__name__)
|
|
35
36
|
|
|
36
37
|
|
|
37
|
-
class AgentRunService:
|
|
38
|
+
class AgentRunService(AgentRunControlMixin):
|
|
38
39
|
def __init__(
|
|
39
40
|
self,
|
|
40
41
|
engine: AgentEngineAdapter,
|
|
@@ -61,6 +62,12 @@ class AgentRunService:
|
|
|
61
62
|
request: StartRunRequest,
|
|
62
63
|
idempotency_key: str,
|
|
63
64
|
) -> RunRecord:
|
|
65
|
+
if not getattr(self.engine, "configured", True):
|
|
66
|
+
raise SafeEngineError(
|
|
67
|
+
"RUNTIME_UNAVAILABLE",
|
|
68
|
+
"Agent Provider 尚未配置",
|
|
69
|
+
retryable=False,
|
|
70
|
+
)
|
|
64
71
|
if not self.engine.supports(request.operation_key):
|
|
65
72
|
raise OperationNotFoundError
|
|
66
73
|
missing = set(request.required_capabilities) - set(self.engine.capabilities)
|
|
@@ -74,6 +81,7 @@ class AgentRunService:
|
|
|
74
81
|
fingerprint = request_fingerprint(request)
|
|
75
82
|
candidate = RunRecord(
|
|
76
83
|
run_id=f"run_{uuid.uuid4().hex}",
|
|
84
|
+
engine_id=self.engine.engine_id,
|
|
77
85
|
operation_key=request.operation_key,
|
|
78
86
|
input=request.input,
|
|
79
87
|
idempotency_key=idempotency_key,
|
|
@@ -86,7 +94,12 @@ class AgentRunService:
|
|
|
86
94
|
request.model_dump(by_alias=True),
|
|
87
95
|
)
|
|
88
96
|
record = admission.record
|
|
89
|
-
await ensure_run_report_safely(
|
|
97
|
+
await ensure_run_report_safely(
|
|
98
|
+
self.report_store,
|
|
99
|
+
record.run_id,
|
|
100
|
+
request,
|
|
101
|
+
self.engine.engine_id,
|
|
102
|
+
)
|
|
90
103
|
if admission.reservation:
|
|
91
104
|
await self._spawn(record, request, admission.reservation)
|
|
92
105
|
return record
|
|
@@ -121,7 +134,19 @@ class AgentRunService:
|
|
|
121
134
|
self.report_store,
|
|
122
135
|
record.run_id,
|
|
123
136
|
request,
|
|
137
|
+
record.engine_id,
|
|
124
138
|
)
|
|
139
|
+
if record.engine_id != self.engine.engine_id:
|
|
140
|
+
await self._fail(
|
|
141
|
+
record.run_id,
|
|
142
|
+
SafeEngineError(
|
|
143
|
+
"RUNTIME_UNAVAILABLE",
|
|
144
|
+
"Agent Engine 已升级,旧 Run 无法安全恢复",
|
|
145
|
+
retryable=False,
|
|
146
|
+
),
|
|
147
|
+
)
|
|
148
|
+
await self.store.clear_invocation(record.run_id)
|
|
149
|
+
continue
|
|
125
150
|
await self._spawn(
|
|
126
151
|
record,
|
|
127
152
|
request,
|
|
@@ -139,43 +164,6 @@ class AgentRunService:
|
|
|
139
164
|
except Exception:
|
|
140
165
|
logger.exception("Agent Run 恢复轮询失败,将继续重试")
|
|
141
166
|
|
|
142
|
-
async def record_evaluation(
|
|
143
|
-
self,
|
|
144
|
-
release_id: str,
|
|
145
|
-
evaluation_set_key: str,
|
|
146
|
-
evaluation_set_version: str,
|
|
147
|
-
metrics: dict[str, float],
|
|
148
|
-
) -> str:
|
|
149
|
-
return await self.store.record_evaluation(
|
|
150
|
-
release_id,
|
|
151
|
-
evaluation_set_key,
|
|
152
|
-
evaluation_set_version,
|
|
153
|
-
metrics,
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
async def get(self, run_id: str) -> RunRecord:
|
|
157
|
-
record = await self.store.get(run_id)
|
|
158
|
-
if record is None:
|
|
159
|
-
raise RunNotFoundError
|
|
160
|
-
return record
|
|
161
|
-
|
|
162
|
-
async def probe(self) -> None:
|
|
163
|
-
await self.store.probe()
|
|
164
|
-
|
|
165
|
-
async def cancel(self, run_id: str) -> RunRecord:
|
|
166
|
-
record = await self.get(run_id)
|
|
167
|
-
if record.terminal:
|
|
168
|
-
return record
|
|
169
|
-
await self.engine.cancel(run_id)
|
|
170
|
-
await resolve_pending_approval(self.store, record, "cancelled")
|
|
171
|
-
await append_and_sync_canonical_event(
|
|
172
|
-
self.report_store,
|
|
173
|
-
self.store,
|
|
174
|
-
run_id,
|
|
175
|
-
"run.cancelled",
|
|
176
|
-
)
|
|
177
|
-
return await self.get(run_id)
|
|
178
|
-
|
|
179
167
|
async def _execute(
|
|
180
168
|
self,
|
|
181
169
|
record: RunRecord,
|
|
@@ -220,21 +208,19 @@ class AgentRunService:
|
|
|
220
208
|
if self.artifact_loader
|
|
221
209
|
else ()
|
|
222
210
|
)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
async with asyncio.timeout(
|
|
233
|
-
max(
|
|
234
|
-
invocation.limits.max_duration_seconds,
|
|
235
|
-
approval_timeout + (5 if approval_timeout else 0),
|
|
236
|
-
)
|
|
211
|
+
if await append_and_sync_canonical_event(
|
|
212
|
+
self.report_store,
|
|
213
|
+
self.store,
|
|
214
|
+
record.run_id,
|
|
215
|
+
"input.prepared",
|
|
216
|
+
{
|
|
217
|
+
"artifactCount": len(prepared),
|
|
218
|
+
"inputModalities": list(invocation.input_modalities),
|
|
219
|
+
},
|
|
237
220
|
):
|
|
221
|
+
return
|
|
222
|
+
request = build_engine_run_request(record, invocation, prepared)
|
|
223
|
+
async with asyncio.timeout(invocation.limits.max_duration_seconds):
|
|
238
224
|
async for signal in self.engine.execute(request):
|
|
239
225
|
if isinstance(signal, EngineCompleted):
|
|
240
226
|
await self.store.complete(record.run_id, signal.output)
|
|
@@ -337,13 +323,3 @@ class AgentRunService:
|
|
|
337
323
|
completed,
|
|
338
324
|
)
|
|
339
325
|
)
|
|
340
|
-
|
|
341
|
-
async def _fail(self, run_id: str, failure: SafeEngineError) -> None:
|
|
342
|
-
await append_and_sync_canonical_event(
|
|
343
|
-
self.report_store,
|
|
344
|
-
self.store,
|
|
345
|
-
run_id,
|
|
346
|
-
"run.failed",
|
|
347
|
-
canonical_failure_fields(failure),
|
|
348
|
-
fallback_safe_error_code=failure.code,
|
|
349
|
-
)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from .approval_resolution import resolve_pending_approval
|
|
4
|
+
from .engine import AgentEngineAdapter, SafeEngineError
|
|
5
|
+
from .report_lifecycle import append_and_sync_canonical_event
|
|
6
|
+
from .report_store import AgentRuntimeReportStore
|
|
7
|
+
from .service_errors import RunNotFoundError
|
|
8
|
+
from .signal_events import canonical_failure_fields
|
|
9
|
+
from .store import RunRecord, RunStore
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AgentRunControlMixin:
|
|
13
|
+
"""Queries, cancellation and terminal control shared by run execution."""
|
|
14
|
+
|
|
15
|
+
engine: AgentEngineAdapter
|
|
16
|
+
store: RunStore
|
|
17
|
+
report_store: AgentRuntimeReportStore
|
|
18
|
+
|
|
19
|
+
async def record_evaluation(
|
|
20
|
+
self,
|
|
21
|
+
release_id: str,
|
|
22
|
+
evaluation_set_key: str,
|
|
23
|
+
evaluation_set_version: str,
|
|
24
|
+
metrics: dict[str, float],
|
|
25
|
+
) -> str:
|
|
26
|
+
return await self.store.record_evaluation(
|
|
27
|
+
release_id,
|
|
28
|
+
evaluation_set_key,
|
|
29
|
+
evaluation_set_version,
|
|
30
|
+
metrics,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
async def get(self, run_id: str) -> RunRecord:
|
|
34
|
+
record = await self.store.get(run_id)
|
|
35
|
+
if record is None:
|
|
36
|
+
raise RunNotFoundError
|
|
37
|
+
return record
|
|
38
|
+
|
|
39
|
+
async def probe(self) -> None:
|
|
40
|
+
await self.store.probe()
|
|
41
|
+
|
|
42
|
+
async def cancel(self, run_id: str) -> RunRecord:
|
|
43
|
+
record = await self.get(run_id)
|
|
44
|
+
if record.terminal:
|
|
45
|
+
return record
|
|
46
|
+
await self.engine.cancel(run_id)
|
|
47
|
+
await resolve_pending_approval(self.store, record, "cancelled")
|
|
48
|
+
await append_and_sync_canonical_event(
|
|
49
|
+
self.report_store,
|
|
50
|
+
self.store,
|
|
51
|
+
run_id,
|
|
52
|
+
"run.cancelled",
|
|
53
|
+
)
|
|
54
|
+
return await self.get(run_id)
|
|
55
|
+
|
|
56
|
+
async def _fail(self, run_id: str, failure: SafeEngineError) -> None:
|
|
57
|
+
await append_and_sync_canonical_event(
|
|
58
|
+
self.report_store,
|
|
59
|
+
self.store,
|
|
60
|
+
run_id,
|
|
61
|
+
"run.failed",
|
|
62
|
+
canonical_failure_fields(failure),
|
|
63
|
+
fallback_safe_error_code=failure.code,
|
|
64
|
+
)
|
|
@@ -26,6 +26,9 @@ def build_engine_run_request(
|
|
|
26
26
|
provider_egress=invocation.provider_egress,
|
|
27
27
|
provider_data_policy=invocation.provider_data_policy,
|
|
28
28
|
tool_network_policy=invocation.tool_network_policy,
|
|
29
|
+
model_pin=invocation.model_pin,
|
|
29
30
|
execution_grant=invocation.execution_grant,
|
|
30
31
|
tool_host_url=invocation.tool_host_url,
|
|
32
|
+
long_session=invocation.long_session,
|
|
33
|
+
prompt_version=invocation.release.prompt_version,
|
|
31
34
|
)
|
|
@@ -2,13 +2,16 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sqlite3
|
|
4
4
|
|
|
5
|
+
from .engine_identity import DIRECT_ENGINE_ID, HISTORICAL_ADK_ENGINE_ID
|
|
6
|
+
|
|
5
7
|
|
|
6
8
|
def initialize_database(database: sqlite3.Connection) -> None:
|
|
7
9
|
database.execute("pragma foreign_keys = on")
|
|
8
10
|
database.executescript(
|
|
9
|
-
"""
|
|
11
|
+
f"""
|
|
10
12
|
create table if not exists agent_runs (
|
|
11
13
|
run_id text primary key,
|
|
14
|
+
engine_id text not null default '{DIRECT_ENGINE_ID}',
|
|
12
15
|
operation_key text not null,
|
|
13
16
|
input_json text not null,
|
|
14
17
|
idempotency_key text not null unique,
|
|
@@ -43,6 +46,11 @@ def initialize_database(database: sqlite3.Connection) -> None:
|
|
|
43
46
|
database.execute(
|
|
44
47
|
"alter table agent_runs add column trace_id text not null default ''"
|
|
45
48
|
)
|
|
49
|
+
if "engine_id" not in columns:
|
|
50
|
+
database.execute(
|
|
51
|
+
"alter table agent_runs add column engine_id "
|
|
52
|
+
f"text not null default '{HISTORICAL_ADK_ENGINE_ID}'"
|
|
53
|
+
)
|
|
46
54
|
database.executescript(
|
|
47
55
|
"""
|
|
48
56
|
create table if not exists agent_releases (
|
|
@@ -9,6 +9,7 @@ from typing import cast
|
|
|
9
9
|
|
|
10
10
|
from .contracts import AgentError, AgentErrorCode, JsonValue, RunStatus
|
|
11
11
|
from .sqlite_catalog import SqliteCatalogMixin
|
|
12
|
+
from .sqlite_errors import RunStoreCapacityError as RunStoreCapacityError
|
|
12
13
|
from .sqlite_schema import initialize_database
|
|
13
14
|
from .sqlite_serialization import encode, sequence_of
|
|
14
15
|
from .store import (
|
|
@@ -19,9 +20,7 @@ from .store import (
|
|
|
19
20
|
)
|
|
20
21
|
from .store_cipher import RunStoreCipher
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
class RunStoreCapacityError(Exception):
|
|
24
|
-
pass
|
|
23
|
+
__all__ = ["RunStoreCapacityError", "SqliteRunStore"]
|
|
25
24
|
|
|
26
25
|
|
|
27
26
|
class SqliteRunStore(SqliteCatalogMixin):
|
|
@@ -75,13 +74,14 @@ class SqliteRunStore(SqliteCatalogMixin):
|
|
|
75
74
|
self._database.execute(
|
|
76
75
|
"""
|
|
77
76
|
insert into agent_runs (
|
|
78
|
-
run_id, operation_key, input_json, idempotency_key,
|
|
77
|
+
run_id, engine_id, operation_key, input_json, idempotency_key,
|
|
79
78
|
fingerprint, status, output_json, created_at, updated_at,
|
|
80
79
|
release_json, trace_id, invocation_cipher
|
|
81
|
-
) values (?, ?, ?, ?, ?, 'accepted', 'null', ?, ?, ?, ?, ?)
|
|
80
|
+
) values (?, ?, ?, ?, ?, ?, 'accepted', 'null', ?, ?, ?, ?, ?)
|
|
82
81
|
""",
|
|
83
82
|
(
|
|
84
83
|
record.run_id,
|
|
84
|
+
record.engine_id,
|
|
85
85
|
record.operation_key,
|
|
86
86
|
"null",
|
|
87
87
|
record.idempotency_key,
|
|
@@ -282,6 +282,7 @@ class SqliteRunStore(SqliteCatalogMixin):
|
|
|
282
282
|
]
|
|
283
283
|
return RunRecord(
|
|
284
284
|
run_id=str(row["run_id"]),
|
|
285
|
+
engine_id=str(row["engine_id"]),
|
|
285
286
|
operation_key=str(row["operation_key"]),
|
|
286
287
|
input=json.loads(str(row["input_json"])),
|
|
287
288
|
idempotency_key=str(row["idempotency_key"]),
|
|
@@ -5,6 +5,7 @@ from dataclasses import dataclass, field
|
|
|
5
5
|
from typing import Protocol
|
|
6
6
|
|
|
7
7
|
from .contracts import JsonValue, RunStatus
|
|
8
|
+
from .engine_identity import DIRECT_ENGINE_ID
|
|
8
9
|
|
|
9
10
|
CanonicalEvent = dict[str, object]
|
|
10
11
|
TERMINAL_STATUSES = frozenset({"completed", "failed", "cancelled"})
|
|
@@ -17,6 +18,7 @@ class RunRecord:
|
|
|
17
18
|
input: JsonValue
|
|
18
19
|
idempotency_key: str
|
|
19
20
|
fingerprint: str
|
|
21
|
+
engine_id: str = DIRECT_ENGINE_ID
|
|
20
22
|
release: JsonValue = None
|
|
21
23
|
trace_id: str = ""
|
|
22
24
|
status: RunStatus = "accepted"
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from .store import CanonicalEvent, RunRecord
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def project_run_trajectory(record: RunRecord | None) -> dict[str, object]:
|
|
7
|
+
if record is None:
|
|
8
|
+
return {"available": False, "events": []}
|
|
9
|
+
projected: list[dict[str, object]] = []
|
|
10
|
+
tool_keys: dict[str, str] = {}
|
|
11
|
+
output: dict[str, object] | None = None
|
|
12
|
+
for event in record.events:
|
|
13
|
+
event_type = text(event.get("type"))
|
|
14
|
+
sequence = integer(event.get("sequence"))
|
|
15
|
+
if not event_type or sequence is None:
|
|
16
|
+
continue
|
|
17
|
+
if event_type == "output.delta":
|
|
18
|
+
delta = event.get("text")
|
|
19
|
+
if not isinstance(delta, str):
|
|
20
|
+
continue
|
|
21
|
+
if output is None:
|
|
22
|
+
output = item(sequence, event_type, "模型生成输出")
|
|
23
|
+
output.update(
|
|
24
|
+
{
|
|
25
|
+
"sequenceEnd": sequence,
|
|
26
|
+
"deltaCount": 0,
|
|
27
|
+
"outputCharacters": 0,
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
projected.append(output)
|
|
31
|
+
output["sequenceEnd"] = sequence
|
|
32
|
+
delta_count = integer(output.get("deltaCount"), 0)
|
|
33
|
+
output_characters = integer(output.get("outputCharacters"), 0)
|
|
34
|
+
if delta_count is None or output_characters is None:
|
|
35
|
+
continue
|
|
36
|
+
output["deltaCount"] = delta_count + 1
|
|
37
|
+
output["outputCharacters"] = output_characters + len(delta)
|
|
38
|
+
continue
|
|
39
|
+
output = None
|
|
40
|
+
current = event_item(event_type, sequence, event, tool_keys)
|
|
41
|
+
if current is not None:
|
|
42
|
+
projected.append(current)
|
|
43
|
+
return {"available": True, "events": projected}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def event_item(
|
|
47
|
+
event_type: str,
|
|
48
|
+
sequence: int,
|
|
49
|
+
event: CanonicalEvent,
|
|
50
|
+
tool_keys: dict[str, str],
|
|
51
|
+
) -> dict[str, object] | None:
|
|
52
|
+
if event_type in {"run.started", "run.resumed"}:
|
|
53
|
+
return item(
|
|
54
|
+
sequence,
|
|
55
|
+
event_type,
|
|
56
|
+
"开始执行" if event_type == "run.started" else "恢复执行",
|
|
57
|
+
)
|
|
58
|
+
if event_type == "input.prepared":
|
|
59
|
+
result = item(sequence, event_type, "输入已准备")
|
|
60
|
+
result["artifactCount"] = integer(event.get("artifactCount"), 0)
|
|
61
|
+
modalities = event.get("inputModalities")
|
|
62
|
+
result["inputModalities"] = (
|
|
63
|
+
[value for value in modalities if isinstance(value, str)]
|
|
64
|
+
if isinstance(modalities, list)
|
|
65
|
+
else []
|
|
66
|
+
)
|
|
67
|
+
return result
|
|
68
|
+
if event_type == "tool.requested":
|
|
69
|
+
call_id = text(event.get("toolCallId"))
|
|
70
|
+
tool_key = text(event.get("toolKey"))
|
|
71
|
+
if call_id and tool_key:
|
|
72
|
+
tool_keys[call_id] = tool_key
|
|
73
|
+
result = item(sequence, event_type, "请求 Tool")
|
|
74
|
+
if tool_key:
|
|
75
|
+
result["toolKey"] = tool_key
|
|
76
|
+
return result
|
|
77
|
+
if event_type in {"tool.completed", "approval.required", "approval.resolved"}:
|
|
78
|
+
result = item(
|
|
79
|
+
sequence,
|
|
80
|
+
event_type,
|
|
81
|
+
{
|
|
82
|
+
"tool.completed": "Tool 已完成",
|
|
83
|
+
"approval.required": "等待审批",
|
|
84
|
+
"approval.resolved": "审批已处理",
|
|
85
|
+
}[event_type],
|
|
86
|
+
)
|
|
87
|
+
call_id = text(event.get("toolCallId"))
|
|
88
|
+
tool_key = tool_keys.get(call_id or "")
|
|
89
|
+
if tool_key:
|
|
90
|
+
result["toolKey"] = tool_key
|
|
91
|
+
outcome = text(event.get("outcome"))
|
|
92
|
+
if event_type == "approval.resolved" and outcome:
|
|
93
|
+
result["approvalOutcome"] = outcome
|
|
94
|
+
return result
|
|
95
|
+
if event_type == "usage.reported":
|
|
96
|
+
result = item(sequence, event_type, "Provider 用量已上报")
|
|
97
|
+
attempt = integer(event.get("attemptSequence"))
|
|
98
|
+
usage = event.get("usage")
|
|
99
|
+
total = integer(usage.get("totalTokens")) if isinstance(usage, dict) else None
|
|
100
|
+
if attempt is not None:
|
|
101
|
+
result["attemptSequence"] = attempt
|
|
102
|
+
if total is not None:
|
|
103
|
+
result["totalTokens"] = total
|
|
104
|
+
return result
|
|
105
|
+
if event_type in {"run.completed", "run.cancelled", "run.failed"}:
|
|
106
|
+
result = item(
|
|
107
|
+
sequence,
|
|
108
|
+
event_type,
|
|
109
|
+
{
|
|
110
|
+
"run.completed": "执行完成",
|
|
111
|
+
"run.cancelled": "执行已取消",
|
|
112
|
+
"run.failed": "执行失败",
|
|
113
|
+
}[event_type],
|
|
114
|
+
)
|
|
115
|
+
error = event.get("error")
|
|
116
|
+
code = text(error.get("code")) if isinstance(error, dict) else None
|
|
117
|
+
if code:
|
|
118
|
+
result["errorCode"] = code
|
|
119
|
+
return result
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def item(sequence: int, event_type: str, title: str) -> dict[str, object]:
|
|
124
|
+
return {
|
|
125
|
+
"sequence": sequence,
|
|
126
|
+
"sequenceEnd": sequence,
|
|
127
|
+
"type": event_type,
|
|
128
|
+
"title": title,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def text(value: object) -> str | None:
|
|
133
|
+
return value if isinstance(value, str) and value else None
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def integer(value: object, fallback: int | None = None) -> int | None:
|
|
137
|
+
return value if isinstance(value, int) and value >= 0 else fallback
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncIterator
|
|
4
|
+
|
|
5
|
+
from .engine import AgentEngineAdapter, EngineRunRequest, EngineSignal, SafeEngineError
|
|
6
|
+
from .vlm_readiness import unavailable_vlm_snapshot
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class UnavailableEngineAdapter(AgentEngineAdapter):
|
|
10
|
+
"""Explicit fail-closed runtime used when no Provider deployment is configured."""
|
|
11
|
+
|
|
12
|
+
ENGINE_ID = "windy.unavailable.v1"
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
def engine_id(self) -> str:
|
|
16
|
+
return self.ENGINE_ID
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def configured(self) -> bool:
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def capabilities(self) -> tuple[str, ...]:
|
|
24
|
+
return ()
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def input_modalities(self) -> tuple[str, ...]:
|
|
28
|
+
return ("text",)
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def max_concurrent_runs(self) -> int:
|
|
32
|
+
return 1
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def max_queue_depth(self) -> int:
|
|
36
|
+
return 0
|
|
37
|
+
|
|
38
|
+
def supports(self, operation_key: str) -> bool:
|
|
39
|
+
return bool(operation_key.strip())
|
|
40
|
+
|
|
41
|
+
async def execute(
|
|
42
|
+
self,
|
|
43
|
+
request: EngineRunRequest,
|
|
44
|
+
) -> AsyncIterator[EngineSignal]:
|
|
45
|
+
del request
|
|
46
|
+
raise SafeEngineError(
|
|
47
|
+
"RUNTIME_UNAVAILABLE",
|
|
48
|
+
"Agent Provider 尚未配置",
|
|
49
|
+
retryable=False,
|
|
50
|
+
)
|
|
51
|
+
if False:
|
|
52
|
+
yield
|
|
53
|
+
|
|
54
|
+
async def cancel(self, run_id: str) -> None:
|
|
55
|
+
del run_id
|
|
56
|
+
|
|
57
|
+
async def readiness(self) -> dict[str, object]:
|
|
58
|
+
return unavailable_vlm_snapshot(configured=False)
|