Skip to content

Releases: tesserix/agent-development-kit

v0.53.1

Choose a tag to compare

@github-actions github-actions released this 29 Aug 08:40
abdd2df

0.53.1

No consumer-visible changes.

Dependencies

92 components, no dependency changes since the last release.

v0.53.0

Choose a tag to compare

@github-actions github-actions released this 29 Aug 04:30
5897dde

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

Choose a tag to compare

@github-actions github-actions released this 28 Aug 11:12
3343db3

0.52.0

Added

  • tesserix_adk.adapters.McpClient: McpClient adopts 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 an McpSchemaError naming the server, the tool and
    the construct, and the server's remaining tools still load. Servers are declared as
    configuration through the new McpConfig and McpServerConfig, so adding one is an
    environment variable rather than code.
  • tesserix_adk.adapters.McpTransport: McpTransport is the one seam between an MCP server run as a subprocess and the same
    server run as an HTTP endpoint: StdioTransport, HttpTransport and RecordingTransport
    implement it, transport_for builds the one a declaration asks for, and TransportSession
    speaks MCP over any of them. Moving a server between the two is now transport in
    McpServerConfig and nothing else. Both transports keep the same message-size, read-timeout
    and in-flight ceilings; a child inherits only the variables in env_allow and is terminated
    on close, cancellation and failure; a redirect or an HTML error page is a typed
    McpTransportError rather than something parsed as protocol.
  • tesserix_adk.adapters.TenantAuthority: An MCP call now carries the caller rather than the platform. TenantAuthority assembles
    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. AuthorisingSession puts the context in
    _meta on every transport and HttpTransport takes an authority= that is resolved
    before a message is built, so a call that cannot be attributed or authorised sends
    nothing. arriving_call is the server half, refusing a call that names no tenant instead
    of running it under the server's own, and redacted masks 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. ResilientSession wraps 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 typed McpServerUnavailableError rather than substituting
    anything, and half-opens for a single probe. McpServerConfig gains required,
    connect_timeout_seconds, discovery_timeout_seconds, retry, breaker_failures and
    breaker_reset_seconds. assembled adopts a fleet of servers, raising for a required
    server that cannot be reached and returning the absence of an optional one as Degraded,
    which McpFleet.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, raises McpProtocolError carrying
    the raw payload rather than reaching a model as a partial answer. ServerHealth and a
    per-operation span carry the outcome class, breaker state, retries and latency, and
    FaultyMcpServer in 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. McpServer takes a
    registry view plus an explicit export allowlist and serves initialize, tools/list and
    tools/call; McpServer.connect() returns an ExportedSession, 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 @tool definitions by published(), 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 raises McpAuthError before 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 an ApprovalRecord digest rather than the arguments, instead
    of running because the caller is remote. A protocol revision the server does not speak is
    refused at initialize, and reload() 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_for generates an AgentCard from the AgentDefinition and the tools deliberately
    handed to it — identity and version, provider, one AgentSkill per export with its input
    and output schemas, required scopes, idempotence and approval gate, and AgentLimits taken
    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 over MAX_CARD_BYTES — raises AgentCardError naming the
    skill at generation, so a deployment fails to start rather than serving a card peers then
    call incorrectly. CardEndpoint serves it at /.well-known/agent-card.json on any ASGI
    application, with an ETag, a cache lifetime, 304 for an unchanged card, 405 for a write
    and 404 elsewhere; serve() republishes, which is how a degraded agent reports
    available=False rather than advertising capability that will fail. adk card renders the
    card and adk card --lint reports what a peer would receive. AgentCard gains its
    identity, provider, skills, limits, task-class and availability fields; its delegation
    fields are unchanged and it now lives in tesserix_adk.a2a.card, re-exported from
    tesserix_adk.a2a and tesserix_adk.a2a.delegation as before.
  • tesserix_adk.a2a.RegistryPeers: An agent can now find a peer by capability instead of by hard-coded endpoint. PeerDiscovery
    is the protocol, RegistryPeers resolves through whatever registry the org runs, and
    StaticPeers resolves the same needs from configuration with the same matching rules, so
    discovery is substitutable and a test never needs a registry. A PeerNeed names 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, and PeerResolution.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 in rejections. 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_mismatch rather 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 beyond stale_seconds is
    served, a registry that hangs raises timed_out at discovery's own ceiling rather than
    spending the run's deadline, and every other failure raises a typed PeerDiscoveryError
    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 a PeerInvocationError naming 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 at max_reported_tokens and flagged usage_trusted=False while the
    run's own ceiling still bites. stream() yields PeerProgress while the peer works;
    cancellation and deadlines reach the peer through PeerTransport.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, and PeerResult.redacted() is what reaches telemetry or memory.
    adapters.peer_tool(client, skill) offers a permitted peer skill to...
Read more

v0.51.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 09:54
dec2efe

0.51.0

No consumer-visible changes.

Dependencies

51 components, no dependency changes since the last release.

v0.50.0

Choose a tag to compare

@github-actions github-actions released this 18 Aug 23:58
323ddee

0.50.0

No consumer-visible changes.

Dependencies

51 components, no dependency changes since the last release.

v0.49.0

Choose a tag to compare

@github-actions github-actions released this 18 Aug 16:40
c042d23

0.49.0

No consumer-visible changes.

Dependencies

51 components, no dependency changes since the last release.

v0.48.0

Choose a tag to compare

@github-actions github-actions released this 18 Aug 11:53
6d1c6d1

0.48.0

No consumer-visible changes.

Dependencies

51 components, no dependency changes since the last release.

v0.47.0

Choose a tag to compare

@github-actions github-actions released this 16 Aug 02:20

0.47.0

No consumer-visible changes.

Dependencies

51 components, no dependency changes since the last release.

v0.46.0

Choose a tag to compare

@github-actions github-actions released this 16 Aug 02:01

0.46.0

No consumer-visible changes.

Dependencies

51 components, no dependency changes since the last release.

v0.45.0

Choose a tag to compare

@github-actions github-actions released this 16 Aug 01:44

0.45.0

No consumer-visible changes.

Dependencies

51 components, no dependency changes since the last release.