> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abliteration.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenAI Responses API

> Tool calling on /v1/responses — flat function schema, function_call items in output[], function_call_output continuation.

`POST /v1/responses`

Tools are declared with a **flat** function schema (no nested `function` key). The model returns `function_call` items inside the `output` array.

## Define a tool

```python theme={"system"}
tools = [{
    "type": "function",
    "name": "get_weather",
    "description": "Get the weather for a city",
    "parameters": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"],
    },
}]
```

## Full loop

```python theme={"system"}
from openai import OpenAI
import json

client = OpenAI(base_url="https://api.abliteration.ai/v1", api_key=os.environ["ABLIT_KEY"])

resp = client.responses.create(
    model="abliterated-model",
    input="What's the weather in Lagos?",
    tools=tools,
)

next_input = []
for item in resp.output:
    if item.type == "function_call":
        args = json.loads(item.arguments)
        result = get_weather(args["city"])  # your function
        next_input.append({
            "type": "function_call_output",
            "call_id": item.call_id,
            "output": json.dumps(result),
        })

final = client.responses.create(
    model="abliterated-model",
    input=next_input,
    previous_response_id=resp.id,
    tools=tools,
)
print(final.output_text)
```

## Streaming

Stream with `stream=True`. Tool arguments arrive as `response.function_call.arguments.delta` events; a `response.function_call.done` event signals the call is complete.

## Forcing a tool

```python theme={"system"}
tool_choice={"type": "function", "name": "get_weather"}
```

## Parallel tool calls

Multiple `function_call` items can appear in a single `output` array. Produce one `function_call_output` per `call_id`.
