Releases: tesserix/agent-development-kit
Releases · tesserix/agent-development-kit
Release list
v0.53.1
v0.53.0
0.53.0
Added
- promote Python 3.14 to the default runtime
- complete public ADK adoption workflows
- add portable agent export contract (#297)
Fixed
- harden public launch boundaries (#291)
- keep generated agent templates Ruff-clean
- align policy with mypy 2
- complete scaffold template contracts
- release: prevent release-tag alpha races (#296)
- harden public security and reporting
- install extras before strict typecheck
Public API surface
- Added:
tesserix_adk.TypedAgent - Added:
tesserix_adk.adapters.ExportDescriptorDriftError - Added:
tesserix_adk.adapters.ExportErrorCode - Added:
tesserix_adk.adapters.ExportErrorEnvelope - Added:
tesserix_adk.adapters.ExportInvocation - Added:
tesserix_adk.adapters.ExportedA2AAgent - Added:
tesserix_adk.adapters.ExportedAgentResult - Added:
tesserix_adk.adapters.ExportedAgentTool - Added:
tesserix_adk.adapters.ForeignAgentContext - Added:
tesserix_adk.adapters.ForeignAgentReply - Added:
tesserix_adk.adapters.ForeignTool - Added:
tesserix_adk.adapters.GOOGLE_ADK_CONTEXT_KEY - Added:
tesserix_adk.adapters.GoogleAdkAgentInvoker - Added:
tesserix_adk.adapters.PortableAgentManifest - Added:
tesserix_adk.adapters.PortableExportError - Added:
tesserix_adk.adapters.PortableExportOptions - Added:
tesserix_adk.adapters.PortableReference - Added:
tesserix_adk.adapters.PortableRuntime - Added:
tesserix_adk.adapters.ToolImportPolicy - Added:
tesserix_adk.adapters.ToolTranslationError - Added:
tesserix_adk.adapters.WrappedAgentPolicy - Added:
tesserix_adk.adapters.WrappedSubagent - Added:
tesserix_adk.adapters.agent_exports.ExportDescriptorDriftError - Added:
tesserix_adk.adapters.agent_exports.ExportErrorCode - Added:
tesserix_adk.adapters.agent_exports.ExportErrorEnvelope - Added:
tesserix_adk.adapters.agent_exports.ExportInvocation - Added:
tesserix_adk.adapters.agent_exports.ExportedA2AAgent - Added:
tesserix_adk.adapters.agent_exports.ExportedAgentResult - Added:
tesserix_adk.adapters.agent_exports.ExportedAgentTool - Added:
tesserix_adk.adapters.agent_exports.export_as_a2a - Added:
tesserix_adk.adapters.agent_exports.export_as_mcp_tool - Added:
tesserix_adk.adapters.agent_exports.export_as_tool - Added:
tesserix_adk.adapters.container_runtime - Added:
tesserix_adk.adapters.export_a2a_agent - Added:
tesserix_adk.adapters.export_as_a2a - Added:
tesserix_adk.adapters.export_as_mcp_tool - Added:
tesserix_adk.adapters.export_as_tool - Added:
tesserix_adk.adapters.export_google_adk_agent - Added:
tesserix_adk.adapters.export_langgraph_agent - Added:
tesserix_adk.adapters.export_oci_agent - Added:
tesserix_adk.adapters.export_openai_agent - Added:
tesserix_adk.adapters.export_tesserix_agent - Added:
tesserix_adk.adapters.foreign_agents.ForeignAgentContext - Added:
tesserix_adk.adapters.foreign_agents.ForeignAgentReply - Added:
tesserix_adk.adapters.foreign_agents.WrappedAgentPolicy - Added:
tesserix_adk.adapters.foreign_agents.WrappedSubagent - Added:
tesserix_adk.adapters.foreign_agents.wrap_agent_as_subagent - Added:
tesserix_adk.adapters.foreign_agents.wrap_agent_as_tool - Added:
tesserix_adk.adapters.google_adk.GOOGLE_ADK_CONTEXT_KEY - Added:
tesserix_adk.adapters.google_adk.GoogleAdkAgentInvoker - Added:
tesserix_adk.adapters.google_adk.import_google_adk_tool - Added:
tesserix_adk.adapters.google_adk.import_google_adk_toolset - Added:
tesserix_adk.adapters.google_adk.wrap_google_adk_agent - Added:
tesserix_adk.adapters.import_google_adk_tool - Added:
tesserix_adk.adapters.import_google_adk_toolset - Added:
tesserix_adk.adapters.import_tool - Added:
tesserix_adk.adapters.import_toolset - Added:
tesserix_adk.adapters.interop.ForeignTool - Added:
tesserix_adk.adapters.interop.ToolImportPolicy - Added:
tesserix_adk.adapters.interop.ToolTranslationError - Added:
tesserix_adk.adapters.interop.import_tool - Added:
tesserix_adk.adapters.interop.import_toolset - Added:
tesserix_adk.adapters.portable.PortableAgentManifest - Added:
tesserix_adk.adapters.portable.PortableExportError - Added:
tesserix_adk.adapters.portable.PortableExportOptions - Added:
tesserix_adk.adapters.portable.PortableReference - Added:
tesserix_adk.adapters.portable.PortableRuntime - Added:
tesserix_adk.adapters.portable.container_runtime - Added:
tesserix_adk.adapters.portable.export_a2a_agent - Added:
tesserix_adk.adapters.portable.export_google_adk_agent - Added:
tesserix_adk.adapters.portable.export_langgraph_agent - Added:
tesserix_adk.adapters.portable.export_oci_agent - Added:
tesserix_adk.adapters.portable.export_openai_agent - Added:
tesserix_adk.adapters.portable.export_tesserix_agent - Added:
tesserix_adk.adapters.portable.remote_runtime - Added:
tesserix_adk.adapters.remote_runtime - Added:
tesserix_adk.adapters.wrap_agent_as_subagent - Added:
tesserix_adk.adapters.wrap_agent_as_tool - Added:
tesserix_adk.adapters.wrap_google_adk_agent - Added:
tesserix_adk.cli.LocalAgent - Added:
tesserix_adk.cli.artifact_inspect.Resolve - Added:
tesserix_adk.cli.artifact_inspect.main - Added:
tesserix_adk.cli.artifact_inspect_main - Added:
tesserix_adk.cli.artifacts.ARTIFACT_VERSION - Added:
tesserix_adk.cli.artifacts.ArtifactHeader - Added:
tesserix_adk.cli.artifacts.ArtifactSummary - Added:
tesserix_adk.cli.artifacts.ArtifactTruncatedError - Added:
tesserix_adk.cli.artifacts.ArtifactVersionError - Added:
tesserix_adk.cli.artifacts.ArtifactWriter - Added:
tesserix_adk.cli.artifacts.redacted_json - Added:
tesserix_adk.cli.artifacts.scan_artifact - Added:
tesserix_adk.cli.config_command.main - Added:
tesserix_adk.cli.config_main - Added:
tesserix_adk.cli.doctor.CheckRegistry - Added:
tesserix_adk.cli.doctor.CheckResult - Added:
tesserix_adk.cli.doctor.CheckStatus - Added:
tesserix_adk.cli.doctor.CredentialPresenceCheck - Added:
tesserix_adk.cli.doctor.DiagnosticCheck - Added:
tesserix_adk.cli.doctor.DoctorCheck - Added:
tesserix_adk.cli.doctor.DoctorContext - Added:
tesserix_adk.cli.doctor.ExtraPresenceCheck - Added:
tesserix_adk.cli.doctor.ProbeObservation - Added:
tesserix_adk.cli.doctor.PythonVersionCheck - Added:
tesserix_adk.cli.doctor.main - Added:
tesserix_adk.cli.doctor_main - Added:
tesserix_adk.cli.eval_run.CASE_ERROR - Added:
tesserix_adk.cli.eval_run.CONFIGURATION_ERROR - Added:
tesserix_adk.cli.eval_run.EvalTarget - Added:
tesserix_adk.cli.eval_run.GATE_FAILED - Added:
tesserix_adk.cli.eval_run.Resolve - Added:
tesserix_adk.cli.eval_run.load_target - Added:
tesserix_adk.cli.eval_run.main - Added:
tesserix_adk.cli.eval_run_main - Added:
tesserix_adk.cli.run_agent.LocalAgent - Added:
tesserix_adk.cli.run_agent.Resolve - Added:
tesserix_adk.cli.run_agent.TargetLoadError - Added:
tesserix_adk.cli.run_agent.load_target - Added:
tesserix_adk.cli.run_agent.main - Added:
tesserix_adk.cli.run_main - Added:
tesserix_adk.cli.scaffold.main - Added:
tesserix_adk.cli.scaffold_main - Added:
tesserix_adk.core.ConfigOverrides - Added:
tesserix_adk.core.InputT - Added:
tesserix_adk.core.KnownTaskClass - Added:
tesserix_adk.core.ProviderName - Added:
tesserix_adk.core.TypedAgent - Added:
tesserix_adk.core.TypedAgentDefinition - Added:
tesserix_adk.core.agent.TypedAgent - Added:
tesserix_adk.core.config.ConfigOverrides - Added:
tesserix_adk.core.config.load_typed_config - Added:
tesserix_adk.core.config.resolve_typed_config - Added:
tesserix_adk.core.definition.TypedAgentDefinition - Added:
tesserix_adk.core.load_typed_config - Added:
tesserix_adk.core.models.InputT - Added:
tesserix_adk.core.provider.ProviderName - Added:
tesserix_adk.core.resolve_typed_config - Added:
tesserix_adk.core.routing.KnownTaskClass - Added:
tesserix_adk.runtime.AddressableSubagent - Added:
tesserix_adk.runtime.estimate.estimate_run_typed - Added:
tesserix_adk.runtime.estimate_run_typed - Added:
tesserix_adk.runtime.supervisor.AddressableSubagent - Changed:
tesserix_adk.AgentRunner - Changed:
tesserix_adk.core.PromptDefinition - Changed:
tesserix_adk.core.prompts.PromptDefinition - Changed:
tesserix_adk.runtime.AgentRunner - Changed:
tesserix_adk.runtime.loop.AgentRunner
Dependencies
92 components: 5 added, 2 removed, 3 updated.
+ httpcore2 2.12.0
+ httpx2 2.12.0
+ httpx2-jsfetch 1.0
+ mcp-types 2.1.0
+ truststore 0.10.4
- httpx-sse 0.4.3
- pydantic-settings 2.14.2
~ mcp 1.29.0 → 2.1.0
~ redis 6.4.0 → 8.1.0
~ temporalio 1.31.0 → 1.32.0
v0.52.0
0.52.0
Added
- tesserix_adk.adapters.McpClient:
McpClientadopts one MCP server's tools as native kit tools: arguments validated in
this process against the server's own schema, the kit's timeout and error taxonomy, and
every result sealed in the untrusted-data envelope. A tool whose schema the kit cannot
validate a call against is refused as anMcpSchemaErrornaming the server, the tool and
the construct, and the server's remaining tools still load. Servers are declared as
configuration through the newMcpConfigandMcpServerConfig, so adding one is an
environment variable rather than code. - tesserix_adk.adapters.McpTransport:
McpTransportis the one seam between an MCP server run as a subprocess and the same
server run as an HTTP endpoint:StdioTransport,HttpTransportandRecordingTransport
implement it,transport_forbuilds the one a declaration asks for, andTransportSession
speaks MCP over any of them. Moving a server between the two is nowtransportin
McpServerConfigand nothing else. Both transports keep the same message-size, read-timeout
and in-flight ceilings; a child inherits only the variables inenv_allowand is terminated
on close, cancellation and failure; a redirect or an HTML error page is a typed
McpTransportErrorrather than something parsed as protocol. - tesserix_adk.adapters.TenantAuthority: An MCP call now carries the caller rather than the platform.
TenantAuthorityassembles
one call's authority from the run — the bound tenant, the resolved identity, the trace —
mints a credential per tenant, subject and server through the configured
CredentialProvider, and replaces it ahead of expiry rather than after.CallerContext
reads the bound tenant instead of taking one as an argument, so no tool states a tenant
other than the one its run executes under.AuthorisingSessionputs the context in
_metaon every transport andHttpTransporttakes anauthority=that is resolved
before a message is built, so a call that cannot be attributed or authorised sends
nothing.arriving_callis the server half, refusing a call that names no tenant instead
of running it under the server's own, andredactedmasks credential material out of a
result before it can reach a transcript, a span or a memory. - tesserix_adk.adapters.ResilientSession: An MCP server that is slow, unavailable or wrong now degrades one capability rather than a
run.ResilientSessionwraps any session and applies the policy declared on
McpServerConfig: a connect and a discovery deadline, a call bounded by both its own
ceiling and whatever is left of the run's, bounded retries with jittered backoff for
transport faults only — never for a refusal, a validation failure or an effectful call
without an idempotency key — and a per-session circuit breaker that opens on consecutive
faults, refuses calls with a typedMcpServerUnavailableErrorrather than substituting
anything, and half-opens for a single probe.McpServerConfiggainsrequired,
connect_timeout_seconds,discovery_timeout_seconds,retry,breaker_failuresand
breaker_reset_seconds.assembledadopts a fleet of servers, raising for a required
server that cannot be reached and returning the absence of an optional one asDegraded,
whichMcpFleet.notice()states to the model inside the untrusted-data envelope. A result
is now held to the tool's own result schema: structured content that violates it, or a
promise of structured content the server did not keep, raisesMcpProtocolErrorcarrying
the raw payload rather than reaching a model as a partial answer.ServerHealthand a
per-operation span carry the outcome class, breaker state, retries and latency, and
FaultyMcpServerin the testing package injects unreachable, slow, flapping, malformed and
truncated servers with no network. - tesserix_adk.adapters.McpServer: Kit tools can now be published over MCP without being reimplemented.
McpServertakes a
registry view plus an explicit export allowlist and servesinitialize,tools/listand
tools/call;McpServer.connect()returns anExportedSession, which implements the same
session protocol the kit's MCP client consumes, so the published server can be driven in
process by the client that would otherwise reach it over a socket. Descriptors are
generated from the@tooldefinitions bypublished(), so a published schema cannot drift
from the body behind it. A remote caller cannot obtain weaker guarantees than a local one:
an unexported name is refused as not found in wording identical to a name nobody
registered, a call naming no tenant raisesMcpAuthErrorbefore the body is entered,
arguments are validated against the published schema and refused scrubbed, the registry's
own ceiling applies rather than the ceiling the request asked for, results are redacted
before serialisation, and per-tenant lanes stop one caller taking the process. An
approval-required tool answers with an error result whose refusal code is
approval_required, carrying anApprovalRecorddigest rather than the arguments, instead
of running because the caller is remote. A protocol revision the server does not speak is
refused atinitialize, andreload()publishes a new allowlist to later sessions without
widening an open one. - tesserix_adk.a2a.card_for: An agent now publishes a machine-readable card describing what a peer may call on it.
card_forgenerates anAgentCardfrom theAgentDefinitionand the tools deliberately
handed to it — identity and version, provider, oneAgentSkillper export with its input
and output schemas, required scopes, idempotence and approval gate, andAgentLimitstaken
from the agent's own declared concurrency and deadlines. Nothing on a card is hand
maintained, so a card cannot describe an agent that no longer exists. Export is
default-deny: a tool that is not handed in is neither published nor named, including in a
refusal. A card that could not be published honestly — an export the agent may not call, a
skill with no description, arguments that are not a JSON object, more skills than
MAX_SKILLS, or a rendering overMAX_CARD_BYTES— raisesAgentCardErrornaming the
skill at generation, so a deployment fails to start rather than serving a card peers then
call incorrectly.CardEndpointserves it at/.well-known/agent-card.jsonon any ASGI
application, with an ETag, a cache lifetime,304for an unchanged card,405for a write
and404elsewhere;serve()republishes, which is how a degraded agent reports
available=Falserather than advertising capability that will fail.adk cardrenders the
card andadk card --lintreports what a peer would receive.AgentCardgains its
identity, provider, skills, limits, task-class and availability fields; its delegation
fields are unchanged and it now lives intesserix_adk.a2a.card, re-exported from
tesserix_adk.a2aandtesserix_adk.a2a.delegationas before. - tesserix_adk.a2a.RegistryPeers: An agent can now find a peer by capability instead of by hard-coded endpoint.
PeerDiscovery
is the protocol,RegistryPeersresolves through whatever registry the org runs, and
StaticPeersresolves the same needs from configuration with the same matching rules, so
discovery is substitutable and a test never needs a registry. APeerNeednames an agent or
a skill, an optional version constraint ("","2","2.1","2.1.0",">=2.1.0") and
the tenant the work belongs to; where several peers satisfy it the newest wins with ties
broken by name, so the choice is reproducible, andPeerResolution.attributes()records
peer, version, source, digest and staleness for attribution. Every registry entry is
validated whole before it is used and rejected whole where it does not validate, with the
refusal kept inrejections. A peer outside the calling tenant's allowlist is never
returned and is not named in the refusal, and a pinned peer whose card has moved raises
fingerprint_mismatchrather than being followed. Answers are cached with a TTL and keyed
by tenant, an unmatched need is negatively cached, and an unreachable registry serves a
recent answer as stale rather than failing the call — but nothing beyondstale_secondsis
served, a registry that hangs raisestimed_outat discovery's own ceiling rather than
spending the run's deadline, and every other failure raises a typedPeerDiscoveryError
instead of guessing an endpoint.invalidate(need)drops an entry after a call to a
withdrawn peer fails. - tesserix_adk.a2a.PeerClient: Calling another agent is now a typed operation rather than a prompt over HTTP.
PeerClient.invoke(skill, payload)holds the payload to the input schema the peer
published before anything is sent and the answer to the output schema before anything is
returned, so a schema violation is aPeerInvocationErrornaming peer, skill, reason and
the raw payload rather than a coerced result. The delegation carries the original tenant
and subject with the caller's scope narrowed to what the skill declares — attenuation only,
never widening — and the hop joins the caller's trace as a child span, so both agents appear
in one trace. What the peer reports spending is charged to the calling run, a call the
remaining budget cannot cover is refused before it is made, and usage that is missing or
implausible is bounded atmax_reported_tokensand flaggedusage_trusted=Falsewhile the
run's own ceiling still bites.stream()yieldsPeerProgresswhile the peer works;
cancellation and deadlines reach the peer throughPeerTransport.cancel, and a late answer
to a cancelled call is discarded rather than injected into the run. A cycle across agents is
refused with the path before the call is made, an idempotency key travels with retried
effectful calls, andPeerResult.redacted()is what reaches telemetry or memory.
adapters.peer_tool(client, skill)offers a permitted peer skill to...
v0.51.0
0.51.0
No consumer-visible changes.
Dependencies
51 components, no dependency changes since the last release.
v0.50.0
0.50.0
No consumer-visible changes.
Dependencies
51 components, no dependency changes since the last release.
v0.49.0
0.49.0
No consumer-visible changes.
Dependencies
51 components, no dependency changes since the last release.
v0.48.0
0.48.0
No consumer-visible changes.
Dependencies
51 components, no dependency changes since the last release.
v0.47.0
0.47.0
No consumer-visible changes.
Dependencies
51 components, no dependency changes since the last release.
v0.46.0
0.46.0
No consumer-visible changes.
Dependencies
51 components, no dependency changes since the last release.
v0.45.0
0.45.0
No consumer-visible changes.
Dependencies
51 components, no dependency changes since the last release.