Pydantic v2 schemas, OpenAPI for free, mature async
Successor with same Pydantic + async story (Litestar)
Validation
Pydantic v2
De facto FastAPI schema standard
Coupled to HTTP framework
Settings
pydantic-settings
Env-var Settings class with Pydantic validation
Coupled to Validation
Runtime JSON Schema
jsonschema-rs
Rust-backed validator for schema-validated values (Capability / Method / Asset settings) at request time; distinct from Pydantic, which validates the HTTP envelope
Validator semantics or Draft support outgrowing the Rust binding
Backs the LLM port through the AnthropicLLM adapter; powers the RunDebriefer and CautionDrafter subscribers (reasoning generation is shipped). Subscribers, deciders, and tests use the port + FakeLLM, never the SDK
Provider change; a future OpenAILLM / local-model adapter slots behind the same port without subscriber changes
The ControlPort behind the Operation BC speaks EPICS. Production reads and writes go through the asyncio EPICS clients; tests drive a real softIOC subprocess rather than the production clients.
Role
Pick
Why
Swap trigger
EPICS Channel Access
aioca
Production asyncio CA client behind EpicsCaControlPort; Diamond Light Source-maintained
CA workload outgrowing the client
EPICS pvAccess
p4p
Production asyncio PVA client behind EpicsPvaControlPort; carries Normative Types (NTNDArray image streams CA cannot)
PVA workload outgrowing the client
EPICS test IOC
caproto + epicscorelibs
Test-only: epicscorelibs.ioc spawns a real softIOC subprocess; caproto backs the test-only CaprotoControlPort. caproto's own README warns against production use
Stays test-only; production CA/PVA go through aioca / p4p