agentops-rpc
Shared Pydantic wire types for the AgentOps SDK and controlplane.
Both the SDK (komodor-agentops) and the controlplane import models from this
package, giving build-time (mypy) and runtime (Pydantic v2) type safety across
the wire boundary.
Install
pip install agentops-rpc
Quick Start
from agentops_rpc import RunEventIn, IngestRunEventsRequest, HOOK_EVENT_TYPE_MAP
event = RunEventIn(
event_type="span.started",
span_id="span_abc",
kind="tool",
name="Bash",
hook_event_type="tool.start",
)
event.model_dump() # JSON-safe dict
request = IngestRunEventsRequest(worker_id="wrk_1", events=[event])
Exported Models
types.py -- Literal type aliases
| Type | Values |
|---|---|
EventType |
run.started, run.completed, run.failed, span.started, span.ended, message.created, log.created, token.created, custom.created, output.updated |
RunStatus |
queued, claimed, running, succeeded, failed |
SpanKind |
agent, llm, tool, chain, generation |
HookEventName |
SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, SubagentStart, SubagentStop, Notification, Stop, SessionEnd, PermissionRequest, PreCompact, PostCompact |
HookEventType |
session.start, prompt.submit, tool.start, tool.end, tool.error, subagent.start, subagent.end, notification, session.stop, compaction.start, compaction.end |
AgentStatus |
online, offline |
RunTransport |
polling, api_sync, api_sse, a2a |
events.py -- Event ingest models
RunEventIn-- unified event sent SDK -> controlplaneTraceEventIn,LogEventIn-- structured events for DB tablesIngestRunEventsRequest/IngestRunEventsResponseBatchEventsRequestTraceEventResponse,LogEventResponse,RunMessageResponse
runs.py -- Run lifecycle models
CreateRunRequest,RunSummary,RunDetail,RunJobPollNextRunRequest,ClaimRunResponseStartRunRequest,StartRunDirectRequestCompleteRunRequest,FailRunRequest,UpdateRunOutputRequestInvokeAgentRequest/InvokeAgentResponseWorkerInvokeRequest/WorkerInvokeResponse
agents.py -- Agent registration models
AgentManifest,HeartbeatRequest,HeartbeatResponseAgentInstanceResponse
hook_types.py -- Hook event mapping
HOOK_EVENT_TYPE_MAP-- maps Claude CodeHookEventNametoHookEventType
a2a.py -- A2A protocol wire types
A2AMessage,A2AMessagePartA2AMessageRequest,A2ATaskResponse
Type Safety Guarantees
| Layer | Protection |
|---|---|
| Build-time (mypy) | SDK and controlplane import the same Pydantic models -- field mismatches caught at type-check |
| Runtime (Pydantic) | Every event validated at construction and at API boundary |
| Wire (JSON) | model_dump() / model_validate() guarantee JSON matches schema |
| Hook events | HookEventType literal -- typos fail both type-check and runtime |
Adding a CP↔worker frame type
Four steps, none of them a Python edit. schemas/frames.schema.json is the hand-authored
source of truth; Python, Go and TypeScript are all generated from it, and no language is
privileged.
- Add the payload to
$defs, and bind it inx-agentops-frames("my_frame": "MyFramePayload"). LeaveadditionalPropertiesout rather than setting ittrue— the schema's own description explains why the two differ in generated Go. - Declare how it travels in
x-agentops-delivery—control(send now or fail now) orat-least-once(buffered, retried, may deliver twice, ordered perstream). There is no default and the generator refuses to run without one, because either default is wrong for half the types. - Add a fixture under
schemas/fixtures/(andfixtures/invalid/if the type has a constraint worth proving). A per-type coverage guard fails without one. - Run
make generate-frames. This writes the Python models and registry, the Go wire types, and the TypeScript bindings together — plus theMY_FRAMEconstant and the package's__all__, sofrom agentops_rpc.wire import MY_FRAME, MyFramePayloadworks with no further edit.make check-framesis the CI guard that the committed artifacts match the schema.
The one thing that does still cost a Python line is a payload with an inline sub-schema:
the registry binds top-level payload schemas, so a shape nested inside one is invisible to the
generator and each language names it differently. wire/__init__.py aliases it once (see
Event as RunEvent). A payload built only from $defs and scalars needs nothing.
Everything after that is feature code: a Router.on(MY_FRAME) handler on the worker side, a
caller on the control-plane side. See docs/reference/cp-worker-protocol.md
for how frames reach a worker and how a reply is correlated.
Dependencies
Only pydantic>=2.0. Zero internal dependencies.
Release files for agentops-rpc 0.3.23
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agentops_rpc-0.3.23.tar.gz | 166.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agentops_rpc-0.3.23-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 331.3 kB
Release files / agentops_rpc-0.3.23.tar.gz
| Download URL | agentops_rpc-0.3.23.tar.gz |
|---|---|
| Size | 166.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1adc378598d6054079bee47f7a704276d94d7c75df966a0c1385c23a88dbd6fa
|
|
BLAKE2b-256 checksum How to use checksums |
e8874ff85ea58359fa4496cc893a2b266c56def7fab317e8dbdfb4c4d1d475f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / agentops_rpc-0.3.23-py3-none-any.whl
| Download URL | agentops_rpc-0.3.23-py3-none-any.whl |
|---|---|
| Size | 164.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
210e22736d9bb29efb2a6a52e68bb66a2019712be87fe37ede1a563474772387
|
|
BLAKE2b-256 checksum How to use checksums |
c9fa5ff65011213c26e4d7b208169cf2b07380403e3982fd1c601ac1e4a7a81e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|