Skip to content

Python and TypeScript: what differs

The two SDKs are not the same size, and the gap is not obvious from either package. This page says what is missing on the TypeScript side so that a team can choose with the facts in front of them rather than discover them halfway through an integration.

Python is the reference implementation. Governance features land there first.

Not available in TypeScript

Feature Python TypeScript What it means for you
Gateway guard — guard_tool_call, decide_policy, GuardResult ✅ ❌ An in-process policy gate for tool calls. In TypeScript, govern through the MCP Gateway proxy instead.
from_task ✅ ❌ Building a Decision Request from a held MCP task, rather than from an escalation.
LegibleComposer ✅ ❌ TypeScript has the composer seam and the identity composer, but not the document-aware one.
console_auth / console_jwks ✅ ❌ Verifying a call came from the Coalex Console. Only needed if you build your own approval surface.
genai_semconv ✅ ❌ Helpers for the OpenTelemetry GenAI semantic conventions.
resolver on evaluate() ✅ ❌ Who may resolve the escalation — self, or role:<name>. Without it the platform default applies.
ttl_business_hours on evaluate() ✅ ❌ How long an approval may wait before expiring, counted in business hours (08:00 to 18:00 UTC, Monday to Friday). Without it the approval waits the platform default of 120 consecutive hours.

The last two are the ones that bite quietly: an escalation created from TypeScript takes the platform's default resolver and TTL, and nothing in your code says so. Passing them from plain JavaScript warns at runtime rather than being silently dropped; from TypeScript they are a compile error, which is the earlier and better failure.

The same in both

Tracing and auto-instrumentation, declare_agent / declareAgent, get_prompt / getPrompt, evaluate / resolve, the Decision Request model and its §6 de-biasing filter, the extension spans, and the safe exporter's behaviour under failure.

Recording an action that ran while Coalex was unreachable — record_ungoverned / recordUngoverned — is in both as of Python 1.27 and TypeScript 1.18. It was in neither this table nor the list above for a release, which was the worse of the two: a page that exists to stop a team discovering a gap halfway through an integration was silently keeping one. If you are on an earlier TypeScript release, an outage leaves nothing in your compliance report at all — the calls are absent, not mislabelled.

Versions

The two version numbers move independently and do not indicate parity: Python 1.26.x and TypeScript 1.16.x are contemporaries, not a two-release gap.