Catalog PyPI
PACKAGE EXPLORERView in registry

agentops-rpc

PyPI

Shared Pydantic wire types for AgentOps SDK ↔ controlplane RPC.

Versions collected1
Direct dependencies1From release 0.4.10
Last observed20 Oct, 22:49 UTC

README

Version 0.4.10 documentation

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

TypeValues
EventTyperun.started, run.completed, run.failed, span.started, span.ended, message.created, log.created, token.created, custom.created, output.updated
RunStatusqueued, claimed, running, succeeded, failed
SpanKindagent, llm, tool, chain, generation
HookEventNameSessionStart, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, SubagentStart, SubagentStop, Notification, Stop, SessionEnd, PermissionRequest, PreCompact, PostCompact
HookEventTypesession.start, prompt.submit, tool.start, tool.end, tool.error, subagent.start, subagent.end, notification, session.stop, compaction.start, compaction.end
AgentStatusonline, offline
RunTransportpolling, api_sync, api_sse, a2a

events.py -- Event ingest models

  • RunEventIn -- unified event sent SDK -> controlplane
  • TraceEventIn, LogEventIn -- structured events for DB tables
  • IngestRunEventsRequest / IngestRunEventsResponse
  • BatchEventsRequest
  • TraceEventResponse, LogEventResponse, RunMessageResponse

runs.py -- Run lifecycle models

  • CreateRunRequest, RunSummary, RunDetail, RunJob
  • PollNextRunRequest, ClaimRunResponse
  • StartRunRequest, StartRunDirectRequest
  • CompleteRunRequest, FailRunRequest, UpdateRunOutputRequest
  • InvokeAgentRequest / InvokeAgentResponse
  • WorkerInvokeRequest / WorkerInvokeResponse

agents.py -- Agent registration models

  • AgentManifest, HeartbeatRequest, HeartbeatResponse
  • AgentInstanceResponse

hook_types.py -- Hook event mapping

  • HOOK_EVENT_TYPE_MAP -- maps Claude Code HookEventName to HookEventType

a2a.py -- A2A protocol wire types

  • A2AMessage, A2AMessagePart
  • A2AMessageRequest, A2ATaskResponse

Type Safety Guarantees

LayerProtection
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 eventsHookEventType 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.

  1. Add the payload to $defs, and bind it in x-agentops-frames ("my_frame": "MyFramePayload"). Leave additionalProperties out rather than setting it true — the schema's own description explains why the two differ in generated Go.
  2. Declare how it travels in x-agentops-delivery — control (send now or fail now) or at-least-once (buffered, retried, may deliver twice, ordered per stream). There is no default and the generator refuses to run without one, because either default is wrong for half the types.
  3. Add a fixture under schemas/fixtures/ (and fixtures/invalid/ if the type has a constraint worth proving). A per-type coverage guard fails without one.
  4. Run make generate-frames. This writes the Python models and registry, the Go wire types, and the TypeScript bindings together — plus the MY_FRAME constant and the package's __all__, so from agentops_rpc.wire import MY_FRAME, MyFramePayload works with no further edit. make check-frames is 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.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.4.1020 Oct 20261

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 22:49 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:d9f73809fb8e6e008a17616db1daf0bb9aae5a90036cfb00b300ec331dc68122