## typesafe_sdk.AsyncTypeSafeClient

```
AsyncTypeSafeClient(
    *,
    api_key: str | None = None,
    model: str | None = None,
    retry: RetryPolicy | None = None,
    timeout: float
    | httpx2.Timeout
    | None = None,
    headers: Mapping[str, str] | None = None,
    transport: httpx2.AsyncBaseTransport
    | None = None,
    http_client: httpx2.AsyncClient
    | None = None,
    base_url: str | None = None,
)
```

Create an asynchronous HTTP client for [TypeSafe AI API](/content/site-root.html). Explicit options take precedence over environment variables; empty or whitespace-only environment values are ignored.

**Logging setup** The SDK logs to the `typesafe_sdk` logger; configure it through standard logging, or set `TYPESAFE_LOG_LEVEL` (`debug`, `info`, …) for a quick default. Secret headers are redacted from log output; request and response bodies are not.

Parameters:

- **`api_key`** (`str | None`, default: `None` ) – Required API key; may be set via the `TYPESAFE_API_KEY` environment variable.
- **`model`** (`str | None`, default: `None` ) – Model name; may be set via the `TYPESAFE_DEFAULT_MODEL` environment variable.
- **`retry`** (`RetryPolicy | None`, default: `None` ) – A `RetryPolicy` controlling retry behavior; see `RetryPolicy` for the available options and their defaults. Pass `RetryPolicy(max_retries=0)` to disable retries.
- **`timeout`** (`float | httpx2.Timeout | None`, default: `None` ) – Timeout for HTTP operations. Inherits `http_client.timeout` when supplied, otherwise the SDK default.
- **`headers`** (`Mapping[str, str] | None`, default: `None` ) – Additional request headers to set.
- **`transport`** (`httpx2.AsyncBaseTransport | None`, default: `None` ) – Optional custom HTTP transport, closed when this SDK client closes.
- **`http_client`** (`httpx2.AsyncClient | None`, default: `None` ) – Optional `httpx2.AsyncClient`; mutually exclusive with `transport`. Closed when this SDK client closes.
- **`base_url`** (`str | None`, default: `None` ) – API root; may be set via the `TYPESAFE_BASE_URL` environment variable.

Raises:

- `TypeSafeError` – The API key is missing or the timeout is invalid.
- `ValueError` – Both `transport` and `http_client` are supplied.

Examples:

```
import asyncio

from typesafe_sdk import AsyncTypeSafeClient, Choice, Noul

async def main() -> None:
    async with AsyncTypeSafeClient() as client:
        result = await client.system_one(
            state="I was charged twice. Please help.",
            questions={
                "billing": Noul(instructions="Is this about billing?"),
                "tone": Choice(
                    instructions="What is the tone?",
                    criteria={"calm": None, "angry": None},
                ),
            },
        )
        assert 0 <= result.nouls["billing"].noul <= 1
        assert result.choices["tone"].choice in {"calm", "angry"}

asyncio.run(main())
```

### models

`cached` `property`

```
models: AsyncModels
```

An accessor for the Models API resource. Examples:

```
async def main() -> None:
    async with AsyncTypeSafeClient() as client:
        models = await client.models.list()
```

### system_one

`async`

```
system_one(
    state: JSONContent,
    questions: Mapping[str, Question],
    *,
    model: str | None = None,
    retry: RetryPolicy | None = None,
    timeout: float
    | httpx2.Timeout
    | None = None,
    extra_headers: Mapping[str, str]
    | None = None,
    extra_body: Mapping[str, JSONValue | None]
    | None = None,
    response_model: type[ResponseT]
    | None = None,
) -> SystemOneResponse | ResponseT
```

Answer named questions about text or structured state. See [System One](https://docs.typesafe.ai/concepts/system-one) for details.  Parameters:

- **`state`** (`JSONContent`) – Text, a JSON object, or an array to evaluate. See [state](https://docs.typesafe.ai/concepts/state) for details.
- **`questions`** (`Mapping[str, Question]`) – Nonempty mapping of names to question objects or raw dictionaries.
- **`model`** (`str | None`, default: `None` ) – Model override; `None` inherits the client default.
- **`retry`** (`RetryPolicy | None`, default: `None` ) – An optional retry policy to override the client-level value for this call only.
- **`timeout`** (`float | httpx2.Timeout | None`, default: `None` ) – An optional timeout for http operations to override the client-level value for this call only, in seconds.
- **`extra_headers`** (`Mapping[str, str] | None`, default: `None` ) – Additional request headers to set.
- **`extra_body`** (`Mapping[str, JSONValue | None] | None`, default: `None` ) – Additional top-level request-body fields, shallow-merged over the body after `state`, `model`, and `questions` are set. Merging is last-write-wins: a key that collides with `state`, `model`, or `questions` overrides it, and object values are replaced rather than deep-merged.
- **`response_model`** (`type[ResponseT] | None`, default: `None` ) – Optional Pydantic `BaseModel` type describing the JSON response body, including any nested answer models.

Returns:

- `SystemOneResponse | ResponseT` – An instance of `response_model`, or `SystemOneResponse` with answers keyed by question

Raises:

- `TypeSafeError` – Questions are empty or a score question’s criteria list is empty.
- `TypeSafeAPIError` – The server returns an unsuccessful HTTP response after any retries.
- `TypeSafeAPIConnectionError` – The request cannot connect or times out after any retries.
- `TypeSafeAPIResponseValidationError` – The response body does not match the response model.

Examples: Create questions with named arguments:

```
async def main() -> None:
    async with AsyncTypeSafeClient() as client:
        result = await client.system_one(
            state="I was charged twice. Please help.",
            questions={
                "billing": Noul(instructions="Is this about billing?"),
                "tone": Choice(
                    instructions="What is the tone?",
                    criteria={"calm": None, "angry": None},
                ),
            },
        )
        assert 0 <= result.nouls["billing"].noul <= 1
        assert result.choices["tone"].choice in {"calm", "angry"}
```

Pass questions as dictionaries:

```
async def main() -> None:
    async with AsyncTypeSafeClient() as client:
        result = await client.system_one(
            state={"message": "I was charged twice. Please help."},
            questions={
                "billing": {"type": "noul", "instructions": "Is this about billing?"},
                "tone": {
                    "type": "choice",
                    "instructions": "What is the tone?",
                    "criteria": {"calm": None, "angry": None},
                },
            },
        )
        assert 0 <= result.nouls["billing"].noul <= 1
        assert result.choices["tone"].choice in {"calm", "angry"}
```

### aclose

`async`

```
aclose() -> None
```

Release network resources and close the underlying HTTP client, including a supplied one.

## Models resource

Reached through [`AsyncTypeSafeClient.models`](https://docs.typesafe.ai/sdk/python/api/clients/async#typesafe_sdk.AsyncTypeSafeClient.models).

### typesafe_sdk.AsyncModels

Access to the models available to the account, reached through `AsyncTypeSafeClient.models`.

#### list

`async`

```
list(
    *,
    retry: RetryPolicy | None = None,
    timeout: float
    | httpx2.Timeout
    | None = None,
    extra_headers: Mapping[str, str]
    | None = None,
) -> ListModelsResponse
```

List the models available to the account. Parameters:

- **`retry`** (`RetryPolicy | None`, default: `None` ) – An optional retry policy to override the client-level value for this call only.
- **`timeout`** (`float | httpx2.Timeout | None`, default: `None` ) – Per-operation timeout override; `None` inherits the client setting.
- **`extra_headers`** (`Mapping[str, str] | None`, default: `None` ) – Overrides for additional request headers; authentication, SDK identification, and `Accept` remain protected.

Returns:

- `ListModelsResponse` – A `ListModelsResponse` whose `models` holds each model’s name, description, and release date.
