Changelog#
All notable changes to the OpenIntent SDK will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.17.0] - 2026-03-24#
Added#
-
RFC-0026: Suspension Propagation & Retry — Closes three gaps left by RFC-0025.
-
Container propagation rules (5 normative rules) — Intent graph: suspended child blocks dependents; parent aggregate status becomes
suspended_awaiting_inputwhen any child is suspended. Portfolio: aggregate gainshas_suspended_members/suspended_member_count;portfolio.member_suspended/portfolio.member_resumedevents. Plan/Task: bidirectional mirror — when an intent suspends, its task transitions toblockedwithblocked_reason: "intent_suspended"andsuspended_intent_id; plan progress gainssuspended_tasks. Workflow: downstream phases receiveUpstreamIntentSuspendedErrorat claim time; workflow progress gainssuspended_phases. Deadline: suspension deadline governs expiry and MUST NOT exceed portfoliodue_beforeconstraint. HumanRetryPolicydataclass — Re-notification and escalation policy withmax_attempts,interval_seconds,strategy("fixed"/"linear"/"exponential"),escalation_ladder(list ofEscalationStep), andfinal_fallback_policy. Serialises to/from dict viato_dict()/from_dict().EscalationStepdataclass — A single escalation step:after_attempt,channel,notify. Triggersintent.suspension_escalatedevent.UpstreamIntentSuspendedError— Raised byWorkflowSpec.validate_claim_inputs()when a declared input references an upstream phase whose intent is currentlysuspended_awaiting_input. Carriestask_id,phase_name,suspended_intent_id,expected_resume_at. Subclass ofWorkflowError.BaseAgent.default_human_retry_policy— Class-level or instance-level attribute (Noneby default). Applied to allrequest_input()calls that do not supply an explicitretry_policyargument.request_input(retry_policy=…)parameter — Accepts aHumanRetryPolicy. When supplied, the SDK re-fires@on_input_requestedhooks on each attempt, emitsintent.suspension_renotifiedper attempt, emitsintent.suspension_escalatedfor escalation steps, and appliesfinal_fallback_policyafter all attempts are exhausted.- Three-level policy cascade — call-site policy →
default_human_retry_policyon the agent → server-configured platform default. - Four new
EventTypeconstants —intent.suspension_renotified,intent.suspension_escalated,portfolio.member_suspended,portfolio.member_resumed. retry_policyfield onSuspensionRecord— Optional; additive; existing single-attempt behaviour preserved when absent.- RFC-0026 protocol document —
docs/rfcs/0026-suspension-container-interaction.mdwith five container rules, HumanRetryPolicy schema, three-level cascade, coordinator policy, RFC-0010 relationship, end-to-end example, and cross-RFC patch summary. - Cross-RFC patches — RFC-0002 (aggregate
suspended_awaiting_inputstatus), RFC-0007 (portfolio suspension-aware aggregate), RFC-0010 (RFC-0026 relationship note), RFC-0012 (task/intent suspension mirror,suspended_tasks), RFC-0024 (UpstreamIntentSuspendedError,suspended_phases), RFC-0025 (retry_policyonSuspensionRecord,timeout_secondsper-attempt semantics,fallback_policyalias note, Cross-RFC table). - 41 new tests —
tests/test_hitl.py(HumanRetryPolicy, EscalationStep, SuspensionRecord.retry_policy, EventType, request_input signature, BaseAgent.default_human_retry_policy, package exports) andtests/test_workflow_io.py(UpstreamIntentSuspendedError construction, attributes, hierarchy, package export). - Package exports —
HumanRetryPolicy,EscalationStep,UpstreamIntentSuspendedErrorexported fromopenintenttop-level.
Updated#
SuspensionRecord.fallback_policydocumented as alias forretry_policy.final_fallback_policywhen retry_policy is set.SuspensionRecord.timeout_secondsdocumented as per-attempt window whenretry_policyis set.BaseAgent.request_input()docstring updated to describe retry_policy and default_human_retry_policy.
[0.16.0] - 2026-03-23#
Added#
-
RFC-0024: Workflow I/O Contracts — Typed input/output contracts at the task and phase level, with executor-owned wiring (resolves RFC-0012 Open Question #4).
-
outputsschema onPhaseConfig— Each phase can declareoutputsas a mapping from key name to type (string,number,boolean,object,array, a named type from thetypesblock, or an inline{type, required}dict for optional fields). Legacy list-of-strings form is normalised automatically. inputswiring onPhaseConfig— Each phase can declareinputsas a mapping from local key name to a mapping expression:phase_name.key,$trigger.key, or$initial_state.key. The executor resolves these before invoking the agent handler and places the resolved dict inctx.input.- Parse-time validation —
WorkflowSpec._validate_io_wiring()is called on everyfrom_yaml()/from_string(). Checks that everyphase_name.keyreference names a phase independs_on, that the phase exists, and that the key appears in the upstream phase's declared outputs (if it has any). RaisesInputWiringErroron failure. WorkflowSpec.resolve_task_inputs()— Executor pre-handoff step. Pre-populatesctx.inputfrom upstream phase outputs, trigger payload, or initial state. RaisesUnresolvableInputErrorif any declared input cannot be resolved.WorkflowSpec.validate_claim_inputs()— Executor claim-time gate. Rejects a task claim early if declared inputs are not yet resolvable from completed upstream phases.WorkflowSpec.validate_task_outputs()— Executor completion-time gate. Validates the agent's return dict against declaredoutputs. RaisesMissingOutputErrorfor absent required keys; raisesOutputTypeMismatchErrorfor type mismatches. Supports primitive types, named struct types (top-level key presence), and enum types ({enum: [...]}).MissingOutputError— Raised when one or more required output keys are absent. Carriestask_id,phase_name,missing_keys.OutputTypeMismatchError— Raised when an output value does not match its declared type. Carriestask_id,phase_name,key,expected_type,actual_type.UnresolvableInputError— Raised when one or more declared inputs cannot be resolved from available upstream outputs. Carriestask_id,phase_name,unresolvable_refs.InputWiringError— Raised at parse time when an input mapping expression is structurally invalid. Subclass ofWorkflowValidationError. Carriesphase_name,invalid_refs,suggestion.typesblock in YAML — Top-leveltypes:map defines named struct and enum types reusable across output schemas. Persisted intointent.state._io_typesso agent-side validation works without aWorkflowSpecreference at runtime.- Incremental adoption — Phases without
outputsorinputsare fully unaffected. Parse-time and runtime validation only applies to phases that declare contracts. - Package exports —
MissingOutputError,OutputTypeMismatchError,UnresolvableInputError,InputWiringErrorall exported fromopenintenttop-level. -
RFC-0024 protocol document —
docs/rfcs/0024-workflow-io-contracts.mdcovering output schema declaration, input wiring, executor semantics, named error types,TaskContextAPI, parse-time validation, incremental adoption, and a complete example. -
RFC-0025: Human-in-the-Loop Intent Suspension — First-class protocol primitive for suspending an intent mid-execution and awaiting operator input before proceeding.
-
suspended_awaiting_inputlifecycle state — NewIntentStatusvalue. Reaper and lease-expiry workers skip intents in this state; lease renewal succeeds for suspended intents so agents retain ownership across the suspension period. - Four new
EventTypeconstants —intent.suspended,intent.resumed,intent.suspension_expired,engagement.decision. All events are stored in the intent event log and emitted via the SSE bus. ResponseTypeenum —choice,confirm,text,form— specifies what kind of response is expected from the operator. Agents set this when callingrequest_input().SuspensionChoicedataclass — A single operator-facing option withvalue(machine-readable),label(human-readable), optionaldescription,stylehint ("primary"/"danger"/"default"), and arbitrarymetadata. Channels render these as buttons, dropdowns, or radio options.SuspensionRecorddataclass — Captures the full context of a suspension: question,response_type, list ofSuspensionChoiceobjects, structured context, channel hint, timeout, fallback policy, confidence at suspension time, and response metadata. Stored inintent.state._suspension. Includesvalid_values()helper that returns the allowed values forchoice/confirmtypes.EngagementSignalsdataclass — Carriesconfidence,risk, andreversibilityscores (all float [0, 1]) used by the engagement-decision engine.EngagementDecisiondataclass — Output ofshould_request_input(). Hasmode(one ofautonomous,request_input,require_input,defer),should_askbool,rationalestring, and embeddedEngagementSignals.InputResponsedataclass — Represents an operator's response:suspension_id,value,responded_by,responded_at, and optionalmetadata.InputTimeoutErrorexception — Raised whenfallback_policy="fail"and the suspension expires. Carriessuspension_idandfallback_policyattributes.InputCancelledErrorexception — Raised when a suspension is explicitly cancelled. Carriessuspension_id.BaseAgent.request_input()— Suspends the intent, fires@on_input_requestedhooks, pollsintent.state._suspension.resolutionevery 2 seconds, and returns the operator's response value. Acceptsresponse_typeandchoicesparameters; forconfirmtype auto-populates yes/no choices if none are supplied. Also supportstimeout_seconds,fallback_policy,fallback_value,channel_hint, andconfidence.BaseAgent.should_request_input()— Implements the default rule-based engagement-decision logic (high-confidence/low-risk → autonomous; moderate uncertainty → request_input; low confidence or high risk → require_input; extreme risk/irreversibility → defer). Emitsengagement.decisionevent and fires@on_engagement_decisionhooks.- Four new lifecycle decorators —
@on_input_requested,@on_input_received,@on_suspension_expired,@on_engagement_decision. Auto-discovered by_discover_handlers()and routed via_on_generic_event(). POST /api/v1/intents/{id}/suspend/respond— REST endpoint for operators (or bots) to submit a response. Validatessuspension_idmatches the active suspension, validates response value against defined choices (forchoice/confirmtypes — returns 422 withvalid_choiceson mismatch), patchesstate._suspensionwith the response, transitions the intent toactive, emitsintent.resumed, and broadcasts via SSE. Response includeschoice_labelandchoice_descriptionfor matched choices.- RFC-0025 protocol document —
docs/rfcs/0025-human-in-the-loop.mdcovering lifecycle state, event types, SuspensionRecord schema, fallback policies, engagement decision modes, REST endpoint, and security considerations. - HITL user guide —
docs/guide/human-in-the-loop.mdwith quick-start,request_input()reference, fallback policies, engagement decisions, decorator reference, operator response example, exception reference, and a full refund-agent example. - 62 new tests —
tests/test_hitl.pycovers all new models, exceptions, decorators, engagement-decision modes, and the suspend/respond endpoint.
Updated#
mkdocs.yml— RFC-0024 and RFC-0025 entries added to the RFCs nav; Human-in-the-Loop guide added to the User Guide nav; announcement bar updated to v0.16.0.- All version references updated to 0.16.0 across Python SDK and changelog.
[0.15.1] - 2026-03-06#
Changed#
- Gemini SDK Migration — Replaced deprecated
google-generativeaiSDK withgoogle-genai(v1.0+). TheGeminiAdapternow uses the moderngenai.Clientpattern (client.models.generate_content/client.models.generate_content_stream) instead of the legacygenai.configure()+GenerativeModel()approach. - GeminiAdapter Rewrite — Full protocol parity with OpenAI/Anthropic adapters: prompt/completion/total token counts from
usage_metadata, finish reason mapping from candidates, function call tracking with provider-native IDs, streaming usage metadata from final chunks, and multi-turnGeminiChatSessionwith proper history management (including during streaming). - LLMEngine Gemini Integration — Added
_messages_to_gemini_contents()for proper message conversion (system messages becomesystem_instruction, assistant messages usemodelrole),_tools_to_gemini_format()for tool schema conversion to Gemini function declarations, and raw provider fallback paths for Gemini in both_call_raw_providerand_stream_raw_provider. - Default model names updated from
gemini-1.5-pro/gemini-2.0-flashtogemini-3-flashacross SDK, docs, and frontend. - Dependency —
google-generativeai>=0.4.0replaced withgoogle-genai>=1.0.0ingeminiandall-adaptersoptional extras.
Updated#
- All version references updated to 0.15.1 across Python SDK, MCP server package, documentation, and changelog.
- Documentation and examples updated to reflect new SDK patterns and model names.
[0.15.0] - 2026-03-02#
Added#
- RFC-0010 Retry Policy MCP Tools — 4 new MCP tools:
set_retry_policy(admin),get_retry_policy(read),record_failure(write),get_failures(read). MCP tool surface expanded from 66 to 70 tools; RBAC counts: reader=25, operator=43, admin=70. build_retry_failure_tools()— New helper in the Python MCP bridge (openintent.mcp) that constructs retry policy and failure-tracking tool definitions for MCP integration, enabling agents to manage retry policies and record/query failures through MCP.
Changed#
- Native FastAPI SSE — Replaced
sse-starlettethird-party dependency with FastAPI's built-inEventSourceResponseandServerSentEvent(available since FastAPI 0.135.0). All four SSE subscription endpoints (/api/v1/subscribe/intents/{id},/api/v1/subscribe/portfolios/{id},/api/v1/subscribe/agents/{id},/api/v1/subscribe/channels/{id}) now use native async generator pattern withServerSentEventobjects instead of yielding raw dicts throughsse-starlette'sEventSourceResponse. Keep-alive pings now use SSE comment format (ServerSentEvent(comment="ping")) per the SSE spec recommendation.
Removed#
sse-starlettedependency — No longer required. Theserveroptional dependency group now requiresfastapi>=0.135.0(previously>=0.104.0) which includes native SSE support.
Updated#
- All version references updated to 0.15.0 across Python SDK, MCP server package, and changelog.
- FastAPI minimum version bumped from
>=0.104.0to>=0.135.0in server extras.
[0.14.1] - 2026-02-27#
Fixed#
- SDK/Server field format mismatches — Fixed three category of mismatches between the Python SDK client and the protocol server's Pydantic models:
constraintstype mismatch —create_intent(),create_child_intent(), andIntentSpecsentconstraintsas alist[str](e.g.,["rule1", "rule2"]), but the server expectsDict[str, Any](e.g.,{"rules": [...]}). All three methods (sync and async) now accept and senddict[str, Any].Intent.from_dict()retains backward compatibility for legacy list-format constraints.createdBy→created_byfor portfolios —create_portfolio()sentcreatedByandgovernancePolicy(camelCase) but the server'sPortfolioCreatemodel expectscreated_byandgovernance_policy(snake_case). Fixed in both sync and async clients.-
get_portfolio_intents()response parsing — The server returns a raw JSON array fromGET /api/v1/portfolios/{id}/intents, but the SDK expected a{"intents": [...]}wrapper dict, silently returning an empty list. -
Silent empty results from list endpoints — Seven additional list-returning methods used
data.get("key", [])which silently returned empty lists when the server sent raw JSON arrays. All now useisinstance(data, list)detection to handle both raw array and wrapped dict responses: list_portfolios()— expected{"portfolios": [...]}get_intent_portfolios()— expected{"portfolios": [...]}get_attachments()— expected{"attachments": [...]}get_costs()— expected{"costs": [], "summary": {}}get_failures()— expected{"failures": [...]}get_subscriptions()— expected{"subscriptions": [...]}-
federation_list_agents()— expected{"agents": [...]} -
IntentLease.from_dict()KeyError on server responses —acquire_lease()threwKeyError('status')because the server'sLeaseResponsemodel does not include astatusfield (it usesacquired_at,expires_at, andreleased_atto represent lease state).IntentLease.from_dict()now derives status from these fields:RELEASEDifreleased_atis set,EXPIREDifexpires_atis in the past, otherwiseACTIVE. Also handles the field name differenceacquired_at(server) vscreated_at(SDK). Backward compatible with the SDK's own serialization format. -
Stale database singleton after server restart —
get_database()cached theDatabaseinstance at module level and never checked whetherdatabase_urlchanged between calls. When the protocol server restarted on a different port (e.g.,openintent_server_8001.db→openintent_server_8002.db), the singleton kept pointing at the old file. Writes went to the old database; reads came from the new (empty) one — intents appeared created but were invisible tolist_intents. The singleton now tracks its URL and recreates the connection when the URL changes. -
Example and test updates — All examples (
basic_usage.py,openai_multi_agent.py,multi_agent/coordinator.py,compliance_review/coordinator.py) and tests updated to use dict-format constraints.
Changed#
- All version references updated to 0.14.1 across Python SDK, MCP server package, and changelog.
[0.14.0] - 2026-02-25#
Added#
- RFC-0022: Federation Protocol — Complete federation contract specification for cross-server agent coordination. Defines: federation envelope format, agent visibility (public/unlisted/private), peer relationships (peer/upstream/downstream), callbacks with at-least-once delivery, intent authority model, delegation scope with UCAN-style attenuation, governance propagation (strictest-wins), federation attestation (OpenTelemetry conventions), discovery via
/.well-known/openintent-federation.json, federation-aware leasing, and transport bindings (HTTP REST primary, NATS/gRPC alternatives). - RFC-0023: Federation Security — Authentication, authorization, and verification layer for federation. Defines: server identity via did:web, signed envelopes (HTTP Message Signatures, RFC 9421), delegation tokens (UCAN with attenuation), trust policies (open/allowlist/trustless), agent access policies, signed attestations, and cross-server event log reconciliation via RFC-0019 Merkle primitives.
- Python SDK Federation Implementation (RFC-0022 & RFC-0023) — Full 5-layer federation support:
- Layer 1 — Models (
openintent/federation/models.py):FederationEnvelope,FederationCallback,FederationPolicy,FederationAttestation,DelegationScope,FederationManifest,FederationStatus,DispatchResult,ReceiveResult,FederatedAgent,PeerInfo. Enums:AgentVisibility,PeerRelationship,TrustPolicy,CallbackEventType,DispatchStatus. All withto_dict()/from_dict()serialization. - Layer 2 — Client methods (
openintent/client.py):federation_status(),list_federated_agents(),federation_dispatch(),federation_receive(),send_federation_callback(),federation_discover(). Both sync (OpenIntentClient) and async (AsyncOpenIntentClient) variants. - Layer 3 — Server endpoints (
openintent/server/federation.py): FastAPI router withGET /api/v1/federation/status,GET /api/v1/federation/agents,POST /api/v1/federation/dispatch,POST /api/v1/federation/receive,GET /.well-known/openintent-federation.json,GET /.well-known/did.json. SSRF validation on outbound URLs, callback delivery with retry, governance enforcement, idempotency key handling. - Layer 4 — Security (
openintent/federation/security.py):ServerIdentity(Ed25519 key pairs, did:web identifiers, DID document generation),sign_envelope()/verify_envelope_signature(),MessageSignature(RFC 9421 HTTP Message Signatures),TrustEnforcer(open/allowlist/trustless policy enforcement),UCANToken(delegation token creation, encoding, decoding, attenuation, expiry checks),resolve_did_web(),validate_ssrf(). - Layer 5 — Decorators (
openintent/federation/decorators.py):@Federationclass decorator for server configuration (identity, trust_policy, peers, visibility_default).federation_visibilityparameter on@Agent.federation_policyparameter on@Coordinator. Lifecycle hooks:@on_federation_received,@on_federation_callback,@on_budget_warning. - Federation Dispatch (Express.js) — 4 REST endpoints for cross-server intent dispatch:
GET /api/v1/federation/status,GET /api/v1/federation/agents,POST /api/v1/federation/dispatch,POST /api/v1/federation/receive. Federation audit trail with dispatch IDs, provenance instate._federation, and RFC-0020 trace propagation. - Federation MCP Tools — 4 new MCP tools:
federation_status(read),list_federated_agents(read),federation_dispatch(admin),federation_receive(admin). MCP tool surface expanded from 62 to 66 tools; RBAC counts: reader=23, operator=40, admin=66. - Agent Lifecycle (RFC-0016) — Registration with atomic upsert, heartbeat protocol, graceful drain, and status management across 5 REST endpoints.
- Federation event types in
EventTypeenum:FEDERATION_DISPATCHED,FEDERATION_RECEIVED,FEDERATION_CALLBACK,FEDERATION_BUDGET_WARNING,FEDERATION_COMPLETED,FEDERATION_FAILED. - DelegationScope.attenuate() — Scope narrowing per hop: intersection of permissions, union of denied operations, minimum delegation depth.
- FederationPolicy.compose_strictest() — Strictest-wins governance composition: minimum for numerics, OR for booleans, merge for observability.
- Discovery endpoints updated:
/.well-known/openintent.jsonincludesfederationcapability and RFC-0022/0023 inrfcUrls./.well-known/openintent-compat.jsonincludes RFC-0022 (full) and RFC-0023 (partial) compliance. - Schema:
origin_server_url— New field onagent_recordstable marking federated agents. - 82 federation tests covering models serialization, security (sign/verify, UCAN, SSRF, trust enforcement), server endpoints, decorators, and integration flows.
Fixed#
- Agent Registration Race Condition — Replaced two-step check-then-insert with atomic
INSERT ... ON CONFLICT DO UPDATE. Version increments atomically via SQL expression. - Response Field Naming — All agent endpoints now return
metadata(notagent_metadata) for consistency with the Python SDK.
Security#
- SSRF Protection on Federation —
origin_server_urlvalidated at registration and dispatch. Blocks private IPs, metadata endpoints, internal hostnames, and non-HTTP schemes. - Federation Timeout — 10-second timeout on remote dispatch calls. Returns 502 on failure.
- Loop Prevention — Cannot dispatch to local agents or receive for federated agents.
Changed#
- RFC count increased from 22 to 23.
- All version references updated to 0.14.0 across Python SDK, MCP server, and documentation.
[0.13.5] - 2026-02-14#
Added#
- MCP Governance Tool Surface Complete — 4 governance enforcement tools now fully wired in the MCP server TypeScript implementation:
set_governance_policy— Set or update governance policy on an intent (admin tier, usesIf-Matchfor optimistic concurrency).get_governance_policy— Retrieve effective governance policy for an intent (reader tier).approve_approval— Approve a pending approval gate (admin tier).deny_approval— Deny a pending approval gate with optional reason (admin tier).- Full MCP Implementation Chain — Tool definitions, client methods, handler cases, and RBAC tier assignments all in sync for the complete 62-tool surface.
Fixed#
- Anthropic Streaming Usage (Round 2) — Fixed
_resolve_usage()in the Anthropic adapter which short-circuited viaif self._usage is not None: returnwhen_consume_eventscaptured partial usage (e.g.input_tokensfrommessage_startbutoutput_tokensstuck at 0 due to early generator exit beforemessage_delta). Now always callsget_final_message()on the underlying AnthropicMessageStreamas the primary authoritative source, falling back to event-captured data only ifget_final_message()fails. Also calls the raw SDK stream directly to avoid duplicate tool-block processing. - LLM Engine Streaming Usage — Added
_last_stream_usagetoLLMEngineand wired usage capture into both_iter_anthropic_streamand_stream_raw_providerfor Anthropic. After text iteration completes, callsget_final_message()on the underlying stream to populate usage data, making token counts available even when streaming without the adapter wrapper. - MCP Startup Tool Count — Fixed tool count mismatch where RBAC security tiers listed 62 tools but only 58 tool definitions existed. Startup log now correctly reports
tools=62/62for admin role. - RBAC Tier Correction —
operatorrole count corrected from 37 to 38 across changelog entries and documentation.
Changed#
- Version bumped to 0.13.5 (v0.13.3 and v0.13.4 were npm publish patch releases for the
@openintentai/mcp-serverpackage). - All version references updated across Python SDK, MCP server package, and documentation.
[0.13.2] - 2026-02-14#
Changed#
- npm Package Scope Rename — MCP server npm package renamed from
@openintent/mcp-serverto@openintentai/mcp-serverto match the secured npm organization name. All documentation, examples, YAML workflows,mcp://URI schemes, and Makefile targets updated accordingly.
[0.13.1] - 2026-02-14#
Added#
- OpenAI Codex Model Support — Automatic routing for codex-family models (
gpt-5.2-codex,o3-codex, etc.) that use the/v1/completionsendpoint instead of/v1/chat/completions. - New
codex_utilsmodule withis_codex_model(),messages_to_prompt(), andchat_kwargs_to_completions_kwargs()helpers. OpenAICompletionswrapper class for completions-API responses (mapschoices[0].textto the standard content interface).- LLM engine routing updated in
_call_llm,_stream_llm, and raw provider paths to auto-detect and redirect codex models.
Fixed#
- Anthropic Streaming Usage Reliability — Fixed two bugs causing token usage data (input/output token counts) to be silently lost during streaming:
- Wrapped event consumption loop in
try/finallyso usage is saved even when the stream consumer exits early (GeneratorExit). - Added
_resolve_usage()fallback that calls the SDK'sget_final_message()when event parsing misses usage data, ensuring accurate cost tracking for all Anthropic models including those with extended thinking.
[0.13.0] - 2026-02-14#
Added#
- Server-Enforced Governance (RFC-0013) — Declarative governance policies with server-side enforcement on all mutation endpoints. Returns 403 with structured error details when governance rules are violated.
GovernancePolicymodel withcompletion_mode(auto,require_approval,quorum),write_scope(any,assigned_only),max_cost,quorum_threshold,allowed_agents, andrequire_status_reason.governance_policyparameter on@Agentand@Coordinatordecorators for declarative policy attachment at creation time.- Fully backward compatible — intents without a governance policy behave exactly as before.
- Governance Policy Endpoints —
PUT /api/v1/intents/{id}/governance(set policy, requiresIf-Match),GET .../governance(read effective policy),DELETE .../governance(remove policy). - Governance Approval Resolution —
POST .../approvals/{id}/approveandPOST .../approvals/{id}/denyto resolve pending approval gates created by the v0.12.1request_approvalendpoint. - SSE Resume-After-Approval —
governance.approval_granted,governance.approval_denied,governance.policy_set, andgovernance.policy_removedevents broadcast via SSE, enabling agents to resume without polling. - Governance Lifecycle Decorators —
@on_governance_blocked,@on_approval_granted,@on_approval_deniedfor reactive agent behavior when governance gates fire. self.governanceProxy —set_policy(),get_policy(),remove_policy(),request_approval(),approve(),deny()convenience methods on agent instances.- MCP Governance Tools — 4 new tools:
set_governance_policy,get_governance_policy,approve_approval,deny_approval(62 total; reader=21, operator=38, admin=62). GOVERNANCE_APPROVAL_ENFORCEDEvent Type — Emitted when a governance gate is satisfied and the blocked action proceeds.
Changed#
- All documentation, READMEs, and examples updated from v0.12.1 to v0.13.0.
- MCP tool surface expanded from 58 to 62 tools with 4 governance enforcement tools.
- RBAC role counts updated: reader=21 (was 20), operator=38 (was 37), admin=62 (was 58).
- Governance guide and examples updated with server-enforced patterns, approval gate workflows, and SSE resume examples.
[0.12.1] - 2026-02-13#
Added#
- Human Escalation Tools (RFC-0013)
escalate_to_human: Agents escalate when blocked or uncertain, providing reason, priority, urgency, and context.list_escalations: List pending escalations filtered by intent ID or status.resolve_escalation: Humans resolve escalations with a recorded decision and optional notes.request_approval: Agents request human approval before proceeding with specific actions.get_approval_status: Check the current status of a pending approval request.- MCP Tool Surface Expansion
- MCP tool count expanded from 53 to 58 (16 participation + 42 advanced).
- RBAC role counts updated:
reader= 20,operator= 37,admin= 58. - Human escalation tools assigned to appropriate tiers:
list_escalationsandget_approval_status(read),escalate_to_humanandrequest_approval(write),resolve_escalation(admin).
[0.12.0] - 2026-02-13#
Added#
- MCP Integration (Model Context Protocol)
@openintentai/mcp-server: TypeScript MCP server exposing the full protocol API as 16 MCP tools and 5 MCP resources.openintent.mcpPython module:MCPBridge,MCPToolProvider, andMCPToolExporterfor bidirectional MCP integration.- YAML
mcp:block for declarative MCP server configuration in workflows. - Security controls: TLS enforcement, tool allowlists, credential isolation, and audit logging.
- MCP Role-Based Access Control (RBAC)
- Three permission tiers:
read(observe state),write(bounded mutations),admin(lifecycle and coordination). - Three named roles:
reader(4 tools),operator(10 tools),admin(16 tools). - Default role is
reader— unconfigured servers cannot modify protocol state. - Role gate enforced alongside existing tool allowlist (both must pass).
- Tools hidden from MCP tool listing when not permitted by role or allowlist.
- Configurable via
OPENINTENT_MCP_ROLEenv var orsecurity.rolein JSON config. - Startup warnings for
adminrole and unknown role values. - MCPTool — First-Class MCP Tools in @Agent/@Coordinator
MCPTooldataclass for declaring MCP servers as tool sources intools=[...].mcp://URI scheme for inline MCP tool references (e.g.,"mcp://npx/-y/@openintentai/mcp-server?role=operator").- Automatic MCP connection at agent startup, tool discovery, ToolDef registration, and clean disconnection on shutdown.
- RBAC
rolefield onMCPTooldefaults to"reader"(least privilege) and is set explicitly on each child process, isolating agents from ambientOPENINTENT_MCP_ROLEin the parent env. - Role validation with fallback to
"reader"on invalid values and startup warnings foradminrole. - Mixed tool lists: local
ToolDef,MCPTool,mcp://URIs, and plain strings all coexist. parse_mcp_uri()andresolve_mcp_tools()helpers exported fromopenintent.mcp.
[0.11.0] - 2026-02-13#
Added#
- Declarative Messaging (RFC-0021)
- YAML
channels:block for declarative agent-to-agent messaging configuration. @on_messagedecorator for zero-boilerplate, reactive message handling with auto-reply.- Channel proxy (
self.channels) withask(),notify(), andbroadcast()convenience methods. - Three messaging patterns: request/response, fire-and-forget, and broadcast.
[0.10.1] - 2026-02-13#
Added#
- Tool Execution Adapters — Pluggable adapter system for real external API execution through the Tool Proxy (
POST /api/v1/tools/invoke). Three built-in adapters: RestToolAdapter— API key (header/query), Bearer token, and Basic Auth for standard REST APIs.OAuth2ToolAdapter— OAuth2 with automatic token refresh on 401 responses usingrefresh_token+token_url.WebhookToolAdapter— HMAC-SHA256 signed dispatch for webhook receivers.- Adapter Registry —
AdapterRegistryresolves the correct adapter from credential metadata: explicitadapterkey,auth_typemapping, or placeholder fallback for backward compatibility. - Security Controls — All outbound tool execution requests enforce:
- URL validation blocking private IPs (RFC-1918, loopback, link-local), cloud metadata endpoints (
169.254.169.254), and non-HTTP schemes. - Timeout bounds clamped to 1–120 seconds (default 30s).
- Response size limit of 1 MB.
- Secret sanitization replacing API keys, tokens, and passwords with
[REDACTED]in all outputs. - Request fingerprinting via SHA-256 hash stored per invocation for audit correlation.
- HTTP redirect blocking to prevent SSRF via redirect chains.
- Custom Adapter Registration —
register_adapter(name, adapter)to add adapters for services with non-standard protocols (e.g., GraphQL). - OAuth2 Integration Guide — Comprehensive documentation for integrating OAuth2 services: platform handles the authorization code flow, stores tokens in the vault, SDK manages refresh and execution. Includes ready-to-use metadata templates for Salesforce, Google APIs, Microsoft Graph, and HubSpot.
Changed#
- Credential
metadatafield now supports execution config (base_url,endpoints,auth) to enable real API calls. Credentials without execution config continue to return placeholder responses (backward compatible). - 57 new tests covering security utilities, all three adapters, and the adapter registry.
- Documentation updated across guide, RFC-0014, examples, API reference, and website.
[0.10.0] - 2026-02-12#
Added#
- RFC-0018: Cryptographic Agent Identity
AgentIdentity,IdentityChallenge,IdentityVerificationdata models for key-based agent identity.- Ed25519 key pairs with
did:key:z6Mk...decentralized identifiers. - Challenge-response identity registration via
register_identity()andcomplete_identity_challenge(). - Key rotation with
rotate_key()preserving previous key history. - Signature verification with
verify_signature(). @Identitydecorator for zero-boilerplate identity setup on agents.@on_identity_registeredlifecycle hook.IdentityConfigfor YAML workflow configuration.AgentRecordextended withpublic_key,did,key_algorithm,key_registered_at,key_expires_at,previous_keysfields (all optional for backward compatibility).-
5 new server endpoints:
POST /api/v1/agents/{id}/identity,POST .../identity/challenge,GET .../identity,POST .../identity/verify,POST .../identity/rotate. -
RFC-0019: Verifiable Event Logs
LogCheckpoint,MerkleProof,MerkleProofEntry,ChainVerification,ConsistencyProof,TimestampAnchordata models.- SHA-256 hash chains linking each event to its predecessor.
- Merkle tree checkpoints with
MerkleProof.verify()for client-side inclusion verification. verify_event_chain()to validate an intent's full hash chain integrity.list_checkpoints(),get_checkpoint(),get_merkle_proof(),verify_consistency()client methods.VerificationConfigfor YAML workflow configuration.IntentEventextended with optionalproof,event_hash,previous_event_hash,sequencefields.-
8 new server endpoints for checkpoints, Merkle proofs, chain verification, and optional external anchoring.
-
RFC-0020: Distributed Tracing
TracingContextdataclass for propagating trace state through agent → tool → agent call chains.IntentEventextended with optionaltrace_id(128-bit hex) andparent_event_idfields.log_event()on both sync and async clients acceptstrace_idandparent_event_idparameters._emit_tool_event()automatically includes tracing context in tool invocation events._execute_tool()passestracingkeyword argument to local tool handlers that accept it.TracingContext.new_root()generates fresh 128-bit trace IDs (W3C-aligned format).TracingContext.child()creates child contexts with updated parent references.-
Cross-intent tracing via
trace_idin event payloads. -
Sync & Async Client Parity — All new RFC-0018/0019/0020 methods available on both
OpenIntentClientandAsyncOpenIntentClient.
Changed#
- Version bumped to 0.10.0.
__all__exports updated with all new public symbols includingTracingContext.- 690+ tests passing across all 20 RFCs (104 model tests + 26 server tests for RFC-0018/0019/0020).
[0.9.1] - 2026-02-12#
Fixed#
- Streaming token usage capture — All 7 LLM provider adapters (OpenAI, DeepSeek, Gemini, Anthropic, Azure OpenAI, OpenRouter, Grok) now capture actual
prompt_tokens,completion_tokens, andtotal_tokensduring streaming responses. Previously,tokens_streamedused character count instead of real token counts. - OpenAI-compatible adapters — OpenAI, DeepSeek, Azure OpenAI, OpenRouter, and Grok adapters now inject
stream_options={"include_usage": True}to receive usage data in the final stream chunk. Token counts are extracted and passed through tocomplete_stream()andlog_llm_request_completed(). - Gemini adapter — Captures
usage_metadatafrom stream chunks (prompt_token_count,candidates_token_count,total_token_count) and maps to standard fields. - Anthropic adapter — Extracts usage from the stream's internal message snapshot in
__exit__, removing the need for a manualget_final_message()call. tokens_streamedfield — Now reports actual completion token counts from provider APIs, falling back to character count only when usage data is unavailable.
[0.9.0] - 2026-02-11#
Added#
- Server-Side Tool Invocation —
POST /api/v1/tools/invokeendpoint enables agents to invoke tools through the server proxy without ever accessing raw credentials. The server resolves the appropriate grant, injects credentials from the vault, enforces rate limits, and records the invocation for audit. - 3-Tier Grant Resolution — Tool invocations are matched to grants using a three-tier resolution strategy: (1)
grant.scopescontains the tool name, (2)grant.context["tools"]contains the tool name, (3)credential.servicematches the tool name. This resolves the common mismatch where tool names differ from credential service names. - Client
invoke_tool()Methods —OpenIntentClient.invoke_tool(tool_name, agent_id, parameters)(sync) andAsyncOpenIntentClient.invoke_tool(tool_name, agent_id, parameters)(async) for programmatic server-side tool invocation. - Agent
self.tools.invoke()via Server Proxy —_ToolsProxyon agents delegates string tool names toclient.invoke_tool(), completing the chain:self.tools.invoke("web_search", {...})→ server resolves grant → injects credentials → executes → returns result. -
Invocation Audit Trail — Every server-side tool invocation is recorded with agent ID, tool name, parameters, result, duration, and timestamp for compliance and debugging.
-
@on_handoffDecorator — Lifecycle hook that fires when an agent receives work delegated from another agent. The handler receives the intent and the delegating agent's ID, allowing context-aware handoff processing distinct from fresh assignments. @on_retryDecorator — Lifecycle hook that fires when an intent is reassigned after a previous failure (RFC-0010). The handler receives the intent, attempt number, and last error, allowing agents to adapt retry strategy.@input_guardrail/@output_guardrailDecorators — Validation pipeline for agent processing. Input guardrails run before@on_assignmenthandlers and can reject intents. Output guardrails validate handler results before they are committed to state. Both supportGuardrailErrorfor rejection.- Built-in Coordinator Guardrails — The
guardrails=parameter on@Coordinatoris now active. Supported policies:"require_approval"(logs decision records before assignment),"budget_limit"(rejects intents exceeding cost constraints),"agent_allowlist"(rejects delegation to agents outside the managed list).
Fixed#
_ToolsProxyduplicate class — Removed duplicate_ToolsProxydefinition that caused agent tool proxy to silently fail. Single definition at top ofagents.py, constructor takesagentonly.- Dead proxy code — Removed shadowed
_MemoryProxyand_TasksProxydefinitions (originally at lines 47-79, shadowed by full implementations later in the file). - Grant matching for mismatched tool/service names —
find_agent_grant_for_tool()in Database class now correctly resolves grants where the tool name (e.g."web_search") differs from the credential service name (e.g."serpapi"). - Inert
guardrails=parameter — Theguardrails=parameter on@Coordinatorwas accepted but completely unused. Now wires into the input/output guardrail pipeline.
Changed#
- Tool execution priority clarified and enforced: protocol tools (remember, recall, clarify, escalate, update_status) > local
ToolDefhandlers > remote RFC-0014 server grants. - 556+ tests passing across test_llm, test_agents, test_server suites.
[0.8.1] - 2026-02-08#
Changed#
- Tool → ToolDef rename —
Toolis nowToolDef,@toolis now@define_toolfor clarity. The old names remain as backwards-compatible aliases and will not be removed. - Type annotations —
llm.pyis now fully type-annotated and passes mypy strict mode (previously suppressed via# mypy: disable-error-code).
Added#
- LLM-Powered Agents — Add
model=to@Agentor@Coordinatorto enable agentic tool loops withself.think(prompt), streaming viaself.think_stream(prompt), conversation reset viaself.reset_conversation(), and protocol-native tools (remember, recall, clarify, escalate, update_status, delegate, record_decision, create_plan). - Custom Tools with ToolDef —
ToolDef(name, description, parameters, handler)for rich tool definitions with local execution, and@define_tool(description=, parameters=)decorator to turn functions intoToolDefobjects. - Mixed tool sources —
tools=on@Agent/@Coordinatoraccepts bothToolDefobjects (local handlers with rich schemas) and plain strings (RFC-0014 protocol grants). - Automatic Tool Tracing — Every local
ToolDefhandler invocation is automatically traced as atool_invocationprotocol event when the agent is connected to an OpenIntent server. Each event records tool name, arguments, result, and execution duration. Tracing is best-effort and never blocks tool execution. - Backwards-compatible aliases —
Tool=ToolDef,@tool=@define_tool.
Fixed#
- Unified tool execution model documentation to clarify the three-tier priority: protocol tools > local handlers (
ToolDef) > remote protocol grants (RFC-0014 strings).
[0.8.0] - 2026-02-08#
Added#
- Decorator-First Agent Abstractions
@Agent("id", memory="episodic", tools=["web_search"], auto_heartbeat=True)— zero-boilerplate agent decorator with proxy access toself.memory,self.tasks,self.tools@Coordinator("id", agents=[...], strategy="parallel", guardrails=[...])— mirrors@Agentwith portfolio orchestration,self.delegate(),self.record_decision(),self.decisions-
Workerfor ultra-minimal single-handler agents -
Agent Lifecycle Decorators
@on_assignment— agent assigned to intent@on_complete— intent completed@on_state_change(keys)— specific state keys changed@on_event(event_type)— specific event type received@on_task(status)— task lifecycle event (RFC-0012)@on_trigger(name)— named trigger fires (RFC-0017)@on_drain— graceful shutdown signal (RFC-0016)@on_access_requested— access request received (RFC-0011)-
@on_all_complete— all portfolio intents complete -
Coordinator Lifecycle Decorators
@on_conflict— version conflict detected@on_escalation— agent escalation received-
@on_quorum(threshold)— voting threshold met -
First-Class Protocol Decorators (import from
openintent.agents) @Plan(strategy, checkpoints)— declarative task decomposition config (RFC-0012)@Vault(name, rotation_policy)— credential vault declaration (RFC-0014)@Memory(tier, capacity, eviction)— memory configuration (RFC-0015)-
@Trigger(type, cron)— reactive scheduling declaration (RFC-0017) -
Proxy Classes for Agent Self-Access
_MemoryProxy—self.memory.store(),self.memory.recall(),self.memory.pin()_TasksProxy—self.tasks.create()-
_ToolsProxy—self.tools.invoke() -
Server SDK Documentation
OpenIntentServer,ServerConfig,create_app()programmatic usage- CLI entry point
openintent-serverwith all options ServerConfigreference with all configuration fields-
Environment variable mapping
-
Built-in FastAPI Server (
openintent.server) - Implements all 17 RFCs
- SQLAlchemy + SQLite/PostgreSQL persistence
- API key authentication, CORS, OpenAPI docs
Changed#
- Handler discovery uses
__func__deduplication to prevent double-invocation of bound methods - Coordinator extends BaseAgent handler discovery with conflict/escalation/quorum types via
update() - Protocol decorators (
@Plan,@Vault,@Memory,@Trigger) exported only fromopenintent.agentsto avoid name collision with model classes inopenintent - All documentation updated to reflect 17 RFC coverage
- README rewritten for v0.8.0 with decorator-first examples
Fixed#
- Handler double-invocation bug in
BaseAgent._discover_handlers()when using decorator on bound methods - All ruff lint errors resolved (F821 undefined names, F401 unused imports, E501 line length)
[0.7.0] - 2026-02-07#
Added#
- RFC-0011: Access-Aware Coordination v1.0 (unified permissions model)
- Unified
permissionsfield replaces separate access/delegation/context fields - Shorthand forms:
permissions: open,permissions: private,permissions: [agent-a, agent-b] - Full object form:
policy,default,allow(agent grants),delegate(delegation rules),context(injection config) PermissionsConfig,PermissionLevel,AllowEntry,DelegateConfigtyped SDK classesWorkflowAccessPolicyexport alias to avoid collision withmodels.AccessPolicy- Legacy field auto-conversion: old
access/delegation/contextfields parsed and converted - Governance-level
access_reviewwith approvers, timeout, on_request policy -
Agent-level
default_permissionandapproval_required -
Access Control Server Endpoints
- ACL management: GET/PUT
/v1/intents/{id}/acl, POST/DELETE ACL entries - Access requests: POST/GET
/v1/intents/{id}/access-requests, approve/deny endpoints - IntentContext automatic population with permission-filtered fields
-
Capability declaration and matching for delegation
-
SDK Access Control Primitives
@on_access_requesteddecorator for policy-as-codeintent.ctxautomatic context injection (parent, dependencies, peers, delegated_by)intent.delegate()for agent delegation with payloadintent.temp_access()context manager for scoped temporary access-
auto_request_access=Trueclient option for automatic 403 handling -
Streaming Hooks Infrastructure
on_stream_start(stream_id, model, provider)callback inAdapterConfigon_token(token, stream_id)callback for real-time token processingon_stream_end(stream_id, content, chunks)callback on completionon_stream_error(error, stream_id)callback on failure- All hooks use fail-safe pattern (exceptions caught, never break main flow)
-
Helper methods on
BaseAdapter:_invoke_stream_start,_invoke_on_token,_invoke_stream_end,_invoke_stream_error -
Azure OpenAI Adapter (
AzureOpenAIAdapter) - Full support for Azure OpenAI deployments via
openaipackage - Azure-specific endpoint, API version, and authentication configuration
- Complete streaming, tool calling, and hooks support
-
Install:
pip install openintent[azure] -
OpenRouter Adapter (
OpenRouterAdapter) - Access 200+ models from multiple providers through unified API
- OpenAI-compatible interface via OpenRouter's endpoint
- Complete streaming, tool calling, and hooks support
-
Install:
pip install openintent[openrouter] -
RFC-0012: Task Decomposition & Planning (Proposed)
- Task as first-class protocol primitive with 9-state lifecycle
- Plan as evolution of Intent Graph with checkpoints, conditions, and ordering
- Portfolio clarified as organizational boundary (no execution semantics)
- Task state machine: pending → ready → claimed → running → completed/failed/blocked
@taskdecorator,.t()task signatures,.depends_on()chainingTaskContextwith progress reporting, delegation, escalation-
YAML workflow integration with
plan:block -
RFC-0013: Coordinator Governance & Meta-Coordination (Proposed)
- Coordinator formalized as governed agent with coordinator lease
- Supervisor hierarchies terminating at human authority
- Declarative guardrails: budget, scope, temporal, review constraints
- Decision records with rationale and alternatives considered
- Heartbeat-based failover and coordinator handoff
- Composite coordination modes: propose-approve, act-notify, act-audit
@coordinatordecorator,CoordinatorContextAPI-
New permission grants:
coordinate,approve,supervise -
RFC-0014: Credential Vaults & Tool Scoping (Proposed)
- Credential Vaults for encrypted storage of external service credentials
- Tool Grants with scoped permissions, constraints, and expiry
- Server-side Tool Proxy — agents never see raw credentials
- Grant delegation with depth limits and cascading revocation
- Tool requirements on tasks with lease-time grant validation
- Tool Registry for service/tool discovery and parameter validation
- Full audit trail: every tool invocation and grant lifecycle event logged
- Integration with RFC-0009 (cost tracking), RFC-0011 (access control), RFC-0013 (guardrails)
- Standalone agent direct grants (no coordinator required)
- YAML workflow
tools:block for declaring grants and requirements -
MCP compatibility: grants provide governance layer over MCP tool transport
-
RFC-0015: Agent Memory & Persistent State (Proposed)
- Three-tier memory model: working (task-scoped), episodic (agent-scoped), semantic (shared)
- Structured key-value entries with namespace, tags, versioning, and TTL
- Optimistic concurrency via version numbers and
If-Matchheaders - Tag-based filter queries (AND/OR logic) with semantic search as extension point
- Working memory auto-archival on task completion with event log snapshot
- Episodic memory with configurable capacity, LRU eviction, and pinning
- Semantic memory with namespace-level permissions following RFC-0011 model
- Agent resumability: replacement agents read previous agent's working memory
- Batch operations for atomic multi-entry updates
- Memory lifecycle events: created, updated, deleted, archived, evicted, expired
- Integration with RFC-0005 (attachments for large payloads), RFC-0008 (context packing), RFC-0012 (task memory policy), RFC-0013 (guardrails)
- SDK
client.memorynamespace with automatic version tracking -
YAML workflow
memory:block for declaring namespaces, capacity, and eviction -
RFC-0016: Agent Lifecycle & Health (Proposed)
- Formal agent registration with capabilities, capacity, and heartbeat configuration
- Agent record as protocol-level primitive with role_id and agent_id distinction
- Status lifecycle state machine: registering → active → draining → deregistered, active → unhealthy → dead
- Pull-based heartbeat protocol with jitter-tolerant thresholds and drift detection
- Two-threshold health detection: unhealthy (warning) then dead (action)
- Network partition behavior: heartbeats detect problems, leases (RFC-0003) prevent split-brain
- Graceful drain with configurable timeout and server-initiated drain via pending_commands
- Agent registry with capability-based discovery and capacity-aware querying
- Agent pools defined via shared role_id; assignment logic explicitly out of scope
- Instance identity (agent_id) vs. role identity (role_id) with memory continuity (RFC-0015)
- Lifecycle death explicitly triggers lease expiry (RFC-0003 integration)
- Uniform registration: @Agent decorator and imperative path produce identical protocol effects
- Registration optional for standalone agents with direct grants (RFC-0014)
- Capacity advisory, not enforced; guardrails (RFC-0013) can add hard limits
- YAML workflow
agents:block for declaring lifecycle configuration and pool hints -
API: POST/GET/DELETE /agents, PATCH /agents/{id}/status, POST /agents/{id}/heartbeat
-
RFC-0017: Triggers & Reactive Scheduling (Proposed)
- Trigger as intent factory: standing declarations that create intents when conditions are met
- Three trigger types: schedule (cron-based), event (protocol-reactive), webhook (external HTTP)
- Trigger record as first-class protocol object with version, fire_count, and lineage tracking
- Schedule triggers with cron expressions, timezone support, time windows, and one-time schedules
- Event triggers with 11 standard event types and glob-pattern filtering
- Webhook triggers with signature verification, payload transformation, and secure secret handling
- Intent templates with {{ }} expression syntax for dynamic value injection
- Trigger-to-intent lineage: created_by, trigger_id, trigger_depth, trigger_chain
- Deduplication semantics: allow, skip, queue — preventing the "fires faster than resolves" footgun
- Cascading namespace governance: global triggers cascade down, namespaces retain local authority
- Namespace trigger policies: allow/block global triggers, type whitelists, context injection
- Cascade depth limit (default: 10) prevents infinite trigger chains
- Trigger lifecycle: enabled, disabled, deleted (fire history retained for audit)
- Manual fire endpoint for testing and debugging
- YAML workflow
triggers:block with creates shorthand - SDK
client.triggersnamespace with create, list, fire, update, history, delete - API: POST/GET/PATCH/DELETE /triggers, POST /triggers/{id}/fire, GET /triggers/{id}/history
Changed#
- Updated all YAML workflow examples to use unified
permissionsfield - Updated all documentation to RFC-0011 v1.0 format
- Version bump to 0.7.0
[0.6.0] - 2026-02-05#
Added#
- Distributed Tracing & Full Observability
- Workflow tree structure showing orchestrator → intent flow
- LLM operations summary with tokens, duration, and cost per call
- Cost rollup totaling tokens and estimated cost across all operations
-
Event timeline for complete audit trail
-
LiteLLM Adapter
- Universal adapter supporting 100+ LLM providers via LiteLLM
- Automatic event logging for all supported providers
Changed#
- Adapter events now include
prompt_tokens,completion_tokens,total_tokens,duration_ms - Version bump to 0.6.0
[0.5.0] - 2026-02-03#
Added#
- YAML Workflow Specification
- Declarative multi-agent workflow definitions in YAML
WorkflowSpecclass withfrom_yaml(),from_string(),to_portfolio_spec()methods- CLI commands:
openintent run,openintent validate,openintent list,openintent new - Full feature support: dependencies, parallel execution, retry policies, cost tracking, governance
- LLM configuration block for provider/model settings
-
Leasing and attachment declarations per phase
-
Workflow Validation
validate_workflow()function withWorkflowValidationError- DAG cycle detection
- Agent and dependency reference validation
-
Warning system for best practices
-
Example Workflows
hello_world.yaml- Minimal single-phase workflowresearch_assistant.yaml- Two-phase research pipelinedata_pipeline.yaml- Four-phase ETL processingcontent_pipeline.yaml- Parallel content creationcompliance_review.yaml- Full RFC showcase with governance
Changed#
- Version bump to 0.5.0
[0.4.5] - 2026-02-02#
Fixed#
- IntentStatus Enum: Aligned SDK with protocol spec
- Now uses:
draft,active,blocked,completed,abandoned - Added missing
DRAFTandABANDONEDstatuses - Removed deprecated
CANCELLED(useABANDONEDinstead) -
Fixes "ValueError: 'draft' is not a valid IntentStatus" when using SDK with servers
-
EventType Enum: Aligned SDK with all server event types
- Renamed
CREATED→INTENT_CREATED(value:intent_created) - Renamed
STATE_UPDATED→STATE_PATCHED(value:state_patched) - Added:
DEPENDENCY_ADDED,DEPENDENCY_REMOVED(RFC-0002) - Added:
ATTACHMENT_ADDED(RFC-0005) - Added:
PORTFOLIO_CREATED,ADDED_TO_PORTFOLIO,REMOVED_FROM_PORTFOLIO(RFC-0004) - Added:
FAILURE_RECORDED(RFC-0010) -
Legacy aliases
CREATEDandSTATE_UPDATEDpreserved for backward compatibility -
LeaseStatus Enum: Added missing
REVOKEDstatus -
Intent Model:
- Changed
constraintsfromlist[str]todict[str, Any]to match server spec - Added
created_byandconfidencefields to match server response
[0.4.4] - 2026-02-02#
Fixed#
- Intent Creation: Client now sends
created_byfield (usingagent_id) when creating intents - Server Compatibility: Server now accepts optional
created_byfield, defaulting to API key - Demo Script: Fixed 422 validation errors in
/trydemo by ensuring proper authentication
[0.4.0] - 2026-02-01#
Added#
- Built-in OpenIntent Server (
server/module) - FastAPI-based server implementing all 17 RFCs
- SQLite by default (zero-config), PostgreSQL support
- CLI entry point:
openintent-server - Module entry point:
python -m openintent.server -
Programmatic access via
OpenIntentServerclass -
Server Features
- Complete Intent CRUD with optimistic concurrency
- Append-only event log
- Agent assignment and lease management
- Portfolio management with memberships
- Attachments, cost tracking, retry policies
- SSE subscriptions for real-time updates
- Governance (arbitration and decisions)
- OpenAPI documentation at
/docs -
Protocol discovery at
/.well-known/openintent.json -
Server Configuration
ServerConfigdataclass for all settings- Environment variable support
-
Configurable API keys, CORS, logging
-
New Installation Options
pip install openintent[server]- Server dependenciespip install openintent[all]- Everything included
Changed#
- Updated description to "Python SDK and Server for the OpenIntent Coordination Protocol"
- Development status upgraded to Beta
- Version bump to 0.4.0
[0.3.0] - 2026-02-01#
Added#
- High-Level Agent Abstractions (
agents.pymodule) @Agentdecorator for minimal-boilerplate agent creationCoordinatorclass for portfolio-based multi-agent orchestrationWorkerclass for ultra-minimal single-purpose agents-
BaseAgentclass for custom agent implementations -
Declarative Event Handlers
@on_assignment- Called when agent is assigned to an intent@on_complete- Called when an intent completes@on_lease_available(scope)- Called when a scope lease becomes available@on_state_change(keys)- Called when intent state changes@on_event(type)- Called for specific event types-
@on_all_complete- Called when all portfolio intents complete -
Portfolio DSL
PortfolioSpec- Declarative portfolio definitionIntentSpec- Intent specification withdepends_onfor dependencies- Automatic topological sorting of intent dependencies
-
Automatic intent creation and agent assignment
-
Agent Configuration
AgentConfigdataclass for configuration- Auto-subscribe to SSE events
- Auto-patch state from handler return values
-
Auto-complete intents after successful processing
-
New Examples
examples/agents/research_agent.py- Decorator-based agentexamples/agents/coordinator.py- Portfolio orchestrationexamples/agents/worker.py- Minimal worker patternexamples/agents/README.md- Comprehensive documentation
Changed#
- Version bump to 0.3.0
[0.2.0] - 2026-02-01#
Added#
- Real-Time SSE Streaming (
streaming.pymodule) SSEStream- Iterator-based SSE event streamingSSESubscription- Background thread event processingEventQueue- Queue-based non-blocking event consumptionSSEEventandSSEEventTypemodels-
Three subscription levels: intent, portfolio, agent
-
Provider Adapters (
adapters/directory) OpenAIAdapter- Wraps OpenAI clients with automatic event loggingAnthropicAdapter- Wraps Anthropic clients with automatic event loggingAdapterConfig- Configuration for adapter behavior-
Automatic LLM request, tool call, and stream logging
-
LLM Integration Events
TOOL_CALL_STARTED,TOOL_CALL_COMPLETED,TOOL_CALL_FAILEDLLM_REQUEST_STARTED,LLM_REQUEST_COMPLETED,LLM_REQUEST_FAILED-
STREAM_STARTED,STREAM_CHUNK,STREAM_COMPLETED,STREAM_CANCELLED -
New Models
ToolCallPayload- Tool call event dataLLMRequestPayload- LLM request event dataStreamState,StreamStatus- Streaming state tracking
[0.1.0] - 2026-02-01#
Added#
- Initial release of OpenIntent SDK for Python
- Synchronous client (
OpenIntentClient) - Asynchronous client (
AsyncOpenIntentClient) with full feature parity - Full Intent CRUD operations (RFC-0001)
- State management with optimistic concurrency control via
If-Matchheaders - Append-only event logging for audit trails (RFC-0002)
- Lease-based scope ownership with acquire, renew, and release (RFC-0003)
- Governance endpoints: arbitration requests and decisions (RFC-0003)
- File attachments with base64 encoding (RFC-0005)
- Webhook subscriptions for real-time updates (RFC-0006)
- Cost tracking with summaries by agent and type (RFC-0009)
- Retry policies and failure recording (RFC-0010)
- Portfolio management for grouping related intents
- Agent assignment and management
- Protocol discovery via
.well-known/openintent.json - Context manager support for automatic lease cleanup
- Comprehensive input validation module (
validation.py) - Type-safe models using dataclasses
- OpenAI multi-agent coordination example
- Streaming with background intent updates example
- Authentication patterns example
- Basic usage example
- Unit tests for models and validation
Models#
Intent- Core intent object with state, constraints, and versioningIntentState- Flexible key-value state containerIntentEvent- Immutable audit log entryIntentLease- Scope ownership lease with expirationArbitrationRequest- Governance arbitration requestDecision- Governance decision recordAttachment- File attachment with metadataSubscription- Webhook subscription configurationCostRecord- Cost tracking entryCostSummary- Aggregated cost statisticsRetryPolicy- Retry configurationFailure- Failure record for retry trackingPortfolio- Intent grouping containerPortfolioIntent- Portfolio membership with role and priority
Validation Helpers#
validate_required- Check for required fieldsvalidate_string_length- Enforce string length limitsvalidate_positive_int- Ensure positive integersvalidate_non_negative- Ensure non-negative numbersvalidate_uuid- UUID format validationvalidate_url- URL format validationvalidate_scope- Scope identifier validationvalidate_agent_id- Agent ID format validationvalidate_intent_create- Composite intent creation validatorvalidate_lease_acquire- Composite lease acquisition validatorvalidate_cost_record- Composite cost record validatorvalidate_subscription- Composite subscription validator
Exceptions#
OpenIntentError- Base exception for all SDK errorsConflictError- Version conflict (409)NotFoundError- Resource not found (404)LeaseConflictError- Lease collision (409)ValidationError- Request validation failure (400)InputValidationError- Client-side input validation (inherits from ValidationError)