Part of the Agent Substrate epic ⬆️. Depends on #D.
Goal
Route a DevAI pipeline run/stage to a Substrate Actor when the agent targets Substrate, and to an ephemeral Job otherwise — on demand, with clean fallback.
Today (grounded)
JobRunnerStage.execute checks _maybe_dispatch_kagent (A2A over {kagent_url}/api/a2a/{ns}/{agent}) BEFORE the Job path; unlabelled agents fall through to a K8s Job. There's an operator kill-switch (DEVAI_KAGENT_ENABLED, default off) and per-user passthrough (forwards the user's key as the A2A bearer). We also just landed a NATS WorkQueue run-dispatch backend (separate, off by default).
Tasks
Acceptance
A labelled agent run dispatches to its Substrate Actor and returns; killing the switch or a Substrate error transparently falls back to a Job.
Refs: src/devai/pipeline/stages/job_runner.py, src/devai/agentic/kagent_client.py; memory: Agent Harness + kagent, Model Policy + Boardroom, NATS WorkQueue Dispatch.
— Part of #69
Part of the Agent Substrate epic ⬆️. Depends on #D.
Goal
Route a DevAI pipeline run/stage to a Substrate Actor when the agent targets Substrate, and to an ephemeral Job otherwise — on demand, with clean fallback.
Today (grounded)
JobRunnerStage.executechecks_maybe_dispatch_kagent(A2A over{kagent_url}/api/a2a/{ns}/{agent}) BEFORE the Job path; unlabelled agents fall through to a K8s Job. There's an operator kill-switch (DEVAI_KAGENT_ENABLED, default off) and per-user passthrough (forwards the user's key as the A2A bearer). We also just landed a NATS WorkQueue run-dispatch backend (separate, off by default).Tasks
_maybe_dispatch_kagentto address a Substrate Actor (A2A endpoint may differ; confirm the SandboxAgent A2A surface).Acceptance
A labelled agent run dispatches to its Substrate Actor and returns; killing the switch or a Substrate error transparently falls back to a Job.
Refs:
src/devai/pipeline/stages/job_runner.py,src/devai/agentic/kagent_client.py; memory: Agent Harness + kagent, Model Policy + Boardroom, NATS WorkQueue Dispatch.— Part of #69