You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Restore per-NPC LLM backend selection, which regressed when openrange-pack-sdk was extracted (#225).
Before the extraction, cyber webapp NPC factories took a model: config key and constructed a concrete agent backend. That couldn't survive the strict pack-cannot-import-openrange boundary (it needed to build a concrete StrandsAgentBackend), so it was removed. Today every NPC in an episode shares the single RunConfig.npc_agent_backend.
Proposed shape
Mirror the entry-point pattern so pack code stays free of openrange imports:
Add a backend_id: config key on NPC factories (a plain string the pack can carry).
Add RunConfig.npc_backend_factory: Callable[[str], AgentBackend] | None that the runtime resolves at NPC start, mapping backend_id → concrete AgentBackend.
The pack never imports openrange; the host wires the factory.
Where
NPC base / AgentNPC in openrange_pack_sdk (packages/openrange-pack-sdk/src/openrange_pack_sdk/_protocols.py).
NPC factories in packs/cyber_webapp/cyber_webapp/npcs/.
RunConfig / NPC start in src/openrange/core/.
Acceptance
A single episode can run two NPCs on two different backends, selected by backend_id.
No openrange import appears in pack code.
Integration test exercising two distinct backends in one episode.
This is the 🚧 Core item in ROADMAP.md that had no tracking issue.
Activity
larstalian commentedon Oct 12, 2026
No longer involved with this project, so closing my open issues. Feel free to reopen anything you still want to track.