# Features by SDK

> Which features the TypeScript, Python, Java and Scala SDKs have, and what to do where one lacks a feature.

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

| Feature                                                                                                                                                                                                                                                                                                                 | TypeScript | Python | Java   | Scala  |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------ | ------ | ------ |
| [Tools](https://docs.kindgi.com/v0.1.10/guides/tools/write-a-tool.md), with typed input and output                                                                                                                                                                                                                      | Yes        | Yes    | Yes    | Yes    |
| A handler that answers later (async)                                                                                                                                                                                                                                                                                    | Yes        | Yes    | Yes    | Yes    |
| [Read-only tools](https://docs.kindgi.com/v0.1.10/guides/tools/read-only-tools.md)                                                                                                                                                                                                                                      | Yes        | Yes    | Yes    | Yes    |
| [Logging from a tool](https://docs.kindgi.com/v0.1.10/guides/tools/write-a-tool.md#log-from-a-tool)                                                                                                                                                                                                                     | Yes        | Yes    | Yes    | Yes    |
| [A side effect done once](https://docs.kindgi.com/v0.1.10/guides/tools/write-a-tool.md#make-a-side-effect-happen-once) (the idempotency key)                                                                                                                                                                            | Yes        | Yes    | Yes    | Yes    |
| Cancellation                                                                                                                                                                                                                                                                                                            | Yes        | Yes    | Yes    | Yes    |
| [A tool's secrets](https://docs.kindgi.com/v0.1.10/guides/tools/give-a-tool-a-secret.md) and [per-project values](https://docs.kindgi.com/v0.1.10/guides/tools/give-a-tool-env-values.md)                                                                                                                               | Yes        | Yes    | Yes    | Yes    |
| [Settings blocks](https://docs.kindgi.com/v0.1.10/guides/evals/change-a-prompt-or-setting.md) a tool reads                                                                                                                                                                                                              | Yes        | Yes    | Yes    | Yes    |
| [HTTP tools without code](https://docs.kindgi.com/v0.1.10/guides/tools/http-tools.md)                                                                                                                                                                                                                                   | Yes        | Yes    | No     | No     |
| [Guardrails](https://docs.kindgi.com/v0.1.10/guides/guardrails/write-a-guardrail.md) with your own check                                                                                                                                                                                                                | Yes        | Yes    | Yes    | Yes    |
| [Agents](https://docs.kindgi.com/v0.1.10/guides/agents/write-an-agent.md), with [typed answers](https://docs.kindgi.com/v0.1.10/guides/agents/typed-answer.md), [memory](https://docs.kindgi.com/v0.1.10/guides/agents/give-an-agent-memory.md) and [budgets](https://docs.kindgi.com/v0.1.10/guides/agents/budgets.md) | Yes        | Yes    | Yes    | Yes    |
| [Flows](https://docs.kindgi.com/v0.1.10/guides/flows/write-a-flow.md): 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

| Feature                                                                                                                                    | TypeScript | Python | Java | Scala |
| ------------------------------------------------------------------------------------------------------------------------------------------ | ---------- | ------ | ---- | ----- |
| Every API operation                                                                                                                        | Yes        | Yes    | Yes  | Yes   |
| [Start a run](https://docs.kindgi.com/v0.1.10/guides/runs/start-a-run.md), and wait for it or not                                          | Yes        | Yes    | Yes  | Yes   |
| [Follow a run's events](https://docs.kindgi.com/v0.1.10/guides/runs/follow-a-run.md), reconnecting until it ends                           | Yes        | Yes    | Yes  | Yes   |
| Typed errors, and retries a call can take                                                                                                  | Yes        | Yes    | Yes  | Yes   |
| [Comparing an agent version](https://docs.kindgi.com/v0.1.10/guides/evals/compare-an-agent-version.md): a helper that reads the comparison | Yes        | Yes    | No   | No    |
| [Verifying a webhook](https://docs.kindgi.com/v0.1.10/guides/webhooks/verify-a-webhook.md), reading its event, signing a test one          | Yes        | Yes    | No   | No    |
| [Checking a signed export](https://docs.kindgi.com/v0.1.10/guides/observability/export-signed-evidence.md#check-an-export)                 | Yes        | Yes    | No   | No    |

## 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](https://docs.kindgi.com/v0.1.10/guides/tools/http-tools.md#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 with `new ToolContext(…)`, which takes them. In those three, nothing fills in the defaults a tool declares for its env values or checks them, as TypeScript's `invokeToolForTest` does.
- **The comparison helper:** an eval run's `result()`, from `client.evalRuns().get(runId)`, is a map; for a comparison, read it as the client's `JudgedComparisonResult`: `KindgiJson.read(KindgiJson.write(run.result()), JudgedComparisonResult.class)`. Check first that the run is a comparison (`kind` `judged`) and has ended.
- **Webhooks:** Kindgi's deliveries are [Standard Webhooks](https://www.standardwebhooks.com/), 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-runtime` trusts 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](https://docs.kindgi.com/v0.1.10/reference/sdks.md#in-a-pack) and [In your app](https://docs.kindgi.com/v0.1.10/reference/sdks.md#in-your-app) tables say whether its SDK has the feature. [Where an SDK lacks a feature](https://docs.kindgi.com/v0.1.10/reference/sdks.md#where-an-sdk-lacks-a-feature) says what to do instead.
