refactor(agents,core,frontends): typed kinds, prompts per kind, frontend agents as parameters

This commit is contained in:
hh
2026-08-28 16:36:44 +02:00
parent 827fa0977b
commit 70349e5ff4
11 changed files with 129 additions and 50 deletions
+2 -2
View File
@@ -24,7 +24,7 @@ from claude_agent_sdk import (
)
from beaver_gateway.agents.base import ExposedMcp
from beaver_gateway.agents.claude import ClaudeAgent, ClaudeOptions
from beaver_gateway.agents.claude import ClaudeAgent, ClaudeOptions, Prompts
from beaver_gateway.backends.claude_sdk import (
ClaudeSdkBackend,
RunnerConfig,
@@ -369,7 +369,7 @@ async def test_prompt_sources_are_assembled(cwd: Path) -> None:
backend = _backend(
cwd,
InMemorySessionStore(),
prompt_sources=(("role", cwd / "a.md"), cwd / "b.md"),
prompts=Prompts(deep=(("role", cwd / "a.md"), cwd / "b.md")),
)
await _drain(
backend.complete(
+21
View File
@@ -634,3 +634,24 @@ async def test_spawn_defaults_agent_and_materializes(world: World) -> None:
with pytest.raises(ValueError, match="no default agent for kind 'job'"):
await world.conversations.spawn(kind="job", seed="clean")
await world.settle(deep, 1)
def test_agent_kinds_follow_prompts(tmp_path: Path) -> None:
from beaver_gateway.agents.claude import Prompts
plain = ClaudeAgent(name="p", model="m", system_prompt="hi", cwd=tmp_path)
assert plain.kinds == ("deep",)
dispatcher = ClaudeAgent(
name="x", model="m", cwd=tmp_path, prompts=Prompts(master=("a.md",), fork=())
)
assert dispatcher.kinds == ("master", "fork")
assert dispatcher.prompt_for("master") == ("a.md",)
assert dispatcher.prompt_for("deep") is None
with pytest.raises(ValueError, match=r"serves \['deep'\] without a prompt"):
ClaudeAgent(
name="y",
model="m",
cwd=tmp_path,
kinds=("master", "deep"),
prompts=Prompts(master=()),
)
+1 -1
View File
@@ -23,7 +23,7 @@ class Stack:
def __init__(self, world: World) -> None:
self.world = world
self.vault = world.root / "vault"
self.api = ApiFrontend(default_agents={"master": "a"})
self.api = ApiFrontend(master_agent="a")
self.markdown = MarkdownFrontend(vault_path=self.vault, default_agent="d")
self.anthropic = AnthropicMessagesFrontend()
frontends = [self.api, self.anthropic, self.markdown]