# 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.3.1/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.3.1/guides/tools/read-only-tools.md)                                                                                                                                                                                                                                   | Yes        | Yes    | Yes  | Yes   |
| [Logging from a tool](https://docs.kindgi.com/v0.3.1/guides/tools/write-a-tool.md#log-from-a-tool)                                                                                                                                                                                                                  | Yes        | Yes    | Yes  | Yes   |
| [A side effect done once](https://docs.kindgi.com/v0.3.1/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.3.1/guides/tools/give-a-tool-a-secret.md) and [per-project values](https://docs.kindgi.com/v0.3.1/guides/tools/give-a-tool-env-values.md)                                                                                                                             | Yes        | Yes    | Yes  | Yes   |
| [Settings blocks](https://docs.kindgi.com/v0.3.1/guides/evals/change-a-prompt-or-setting.md) a tool reads                                                                                                                                                                                                           | Yes        | Yes    | Yes  | Yes   |
| [HTTP tools without code](https://docs.kindgi.com/v0.3.1/guides/tools/http-tools.md)                                                                                                                                                                                                                                | Yes        | Yes    | No   | No    |
| [Guardrails](https://docs.kindgi.com/v0.3.1/guides/guardrails/write-a-guardrail.md) with your own check                                                                                                                                                                                                             | Yes        | Yes    | Yes  | Yes   |
| [Agents](https://docs.kindgi.com/v0.3.1/guides/agents/write-an-agent.md), with [typed answers](https://docs.kindgi.com/v0.3.1/guides/agents/typed-answer.md), [memory](https://docs.kindgi.com/v0.3.1/guides/agents/give-an-agent-memory.md) and [budgets](https://docs.kindgi.com/v0.3.1/guides/agents/budgets.md) | Yes        | Yes    | Yes  | Yes   |
| [Flows](https://docs.kindgi.com/v0.3.1/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, its env values decided as a run decides them                                                                                                                                                                                                                            | Yes        | Yes    | Yes  | Yes   |

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.3.1/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.3.1/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   |
| [Trying an agent version on the test cases](https://docs.kindgi.com/v0.3.1/guides/evals/compare-an-agent-version.md): a helper that reads the result | Yes        | Yes    | Yes  | Yes   |
| [Verifying a webhook](https://docs.kindgi.com/v0.3.1/guides/webhooks/verify-a-webhook.md), reading its event, signing a test one                     | Yes        | Yes    | Yes  | Yes   |
| [Checking a signed export](https://docs.kindgi.com/v0.3.1/guides/observability/export-signed-evidence.md#check-an-export)                            | Yes        | Yes    | Yes  | Yes   |

## 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.3.1/guides/tools/http-tools.md#when-to-write-a-handler-instead)).

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.3.1/reference/sdks.md#in-a-pack) and [In your app](https://docs.kindgi.com/v0.3.1/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.3.1/reference/sdks.md#where-an-sdk-lacks-a-feature) says what to do instead.
