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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentops_rpc-0.3.3.tar.gz.
File metadata
- Download URL: agentops_rpc-0.3.3.tar.gz
- Upload date:
- Size: 88.2 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23086c2e27d302698849c921c657494837453b6deabaaf1e5d6c0a8bd4033720
|
|
| MD5 |
7ae8b0e59b26418f0dc4632014d58f6d
|
|
| BLAKE2b-256 |
ff30498057fbb8f4b8a14aa9de1d6696668f32c359accc2e805ccdad569bcf06
|
File details
Details for the file agentops_rpc-0.3.3-py3-none-any.whl.
File metadata
- Download URL: agentops_rpc-0.3.3-py3-none-any.whl
- Upload date:
- Size: 88.8 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66989492d592258cefcde425c4155e7580b27d22164f2c9ff7f0617ca137a7aa
|
|
| MD5 |
d6e21d78fc28a4c85a62119800350776
|
|
| BLAKE2b-256 |
c3cbaef730d4d4550d00af43015c3c9f1d6ad7ad40d094074734d6968d3bc81b
|