Features by SDK
This page shows which features each SDK has, and what to do where your language's SDK lacks one.
Kindgi has an SDK for TypeScript, Python, Java and Scala. Each one does two jobs:
- In a pack: your tools, guardrails, agents and flows.
- In your app: calling Kindgi's API to start runs, follow them, decide approvals, and so on.
| TypeScript | Python | Java | Scala | |
|---|---|---|---|---|
| Package | @kindgi/sdk |
kindgi |
com.kindgi:kindgi-pack, com.kindgi:kindgi-client |
"com.kindgi" %% "kindgi-pack-scala", with the Java client |
| A pack's config | kindgi.config.ts |
pyproject.toml ([tool.kindgi]) |
kindgi.config.json |
kindgi.config.json |
| The CLI, in a pack | pnpm exec kindgi |
uv run kindgi |
./kindgiw |
./kindgiw |
Every SDK's version is the Kindgi release's. Scala apps call the API with the Java client.
In a pack
Section titled “In a pack”| Feature | TypeScript | Python | Java | Scala |
|---|---|---|---|---|
| Tools, with typed input and output | Yes | Yes | Yes | Yes |
| A handler that answers later (async) | Yes | Yes | Yes | Yes |
| Read-only tools | Yes | Yes | Yes | Yes |
| Logging from a tool | Yes | Yes | Yes | Yes |
| A side effect done once (the idempotency key) | Yes | Yes | Yes | Yes |
| Cancellation | Yes | Yes | Yes | Yes |
| A tool's secrets and per-project values | Yes | Yes | Yes | Yes |
| Settings blocks a tool reads | Yes | Yes | Yes | Yes |
| HTTP tools without code | Yes | Yes | No | No |
| Guardrails with your own check | Yes | Yes | Yes | Yes |
| Agents, with typed answers, memory and budgets | Yes | Yes | Yes | Yes |
| Flows: branches, loops, parallel steps, retries, approvals | Yes | Yes | Yes | Yes |
| Unit-testing a tool | Yes | Yes | Yes | Yes |
| A test context with env values and secrets, checked as a run checks them | Yes | Partly | Partly | Partly |
In Java and Scala, an agent's or a flow's fields beyond the builder's own go
in as data, as the API names them: set("budget", …), node(Map.of(…)),
edge(Map.of(…)). So every agent and flow feature is there.
In your app
Section titled “In your app”| Feature | TypeScript | Python | Java | Scala |
|---|---|---|---|---|
| Every API operation | Yes | Yes | Yes | Yes |
| Start a run, and wait for it or not | Yes | Yes | Yes | Yes |
| Follow a run's events, reconnecting until it ends | Yes | Yes | Yes | Yes |
| Typed errors, and retries a call can take | Yes | Yes | Yes | Yes |
| Comparing an agent version: a helper that reads the comparison | Yes | Yes | No | No |
| Verifying a webhook, reading its event, signing a test one | Yes | Yes | No | No |
| Checking a signed export | Yes | Yes | No | No |
Where an SDK lacks a feature
Section titled “Where an SDK lacks a feature”- HTTP tools without code: in a Java or Scala pack, write a tool whose handler makes the request (When to write a handler instead).
- A test context with env values and secrets: in Python,
ToolContext.for_test(env=…, secrets=…)sets them. In Java and Scala, build the context withnew ToolContext(…), which takes them. In those three, nothing fills in the defaults a tool declares for its env values or checks them, as TypeScript'sinvokeToolForTestdoes. - The comparison helper: an eval run's
result(), fromclient.evalRuns().get(runId), is a map; for a comparison, read it as the client'sJudgedComparisonResult:KindgiJson.read(KindgiJson.write(run.result()), JudgedComparisonResult.class). Check first that the run is a comparison (kindjudged) and has ended. - Webhooks: Kindgi's deliveries are
Standard Webhooks, so a Standard
Webhooks library verifies them with the same secret.
client.webhookEndpoints().generateSecret()gives a new secret. - Signed exports: check one with the CLI,
./kindgiw exports verify <file> --from-runtime.<file>is the export's path.--from-runtimetrusts the keys your runtime signs exports with.
The guides show each language in its own tab. Where a guide has no tab for your language, the In a pack and In your app tables say whether its SDK has the feature. Where an SDK lacks a feature says what to do instead.