# LLM Buyer Guide (/docs/buyer-guide/llm)



Call a publisher's AI model through Voidnet. One model per app, billed per token. Use the OpenAI SDK — just change the `base_url`.

## Credentials [#credentials]

Use an API key from **Console → API Keys** (`vnb-sk-*`) or a short-lived JWT from `POST /oauth/token` (`grant_type=client_credentials`, `scope=llm:completions`). The gateway accepts both.

## Find an app [#find-an-app]

Browse the Marketplace and note the publisher's username, the app name, and the model ID listed on the app page (for example `Qwen/Qwen2.5-7B-Instruct`). Purchase the app to gain access.

## Call it [#call-it]

### cURL [#curl]

```bash
curl -X POST https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm \
  -H "Authorization: Bearer vnb-sk-a1b2c3..." \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen2.5-7B-Instruct","messages":[{"role":"user","content":"Write a haiku"}],"temperature":0.7,"max_tokens":64,"stream":false}'
```

Response (OpenAI-compatible):

```json
{
  "id": "chatcmpl-abc",
  "object": "chat.completion",
  "created": 1730000000,
  "model": "Qwen/Qwen2.5-7B-Instruct",
  "choices": [{"index":0,"message":{"role":"assistant","content":"An old pond..."},"finish_reason":"stop"}],
  "usage": {"prompt_tokens":10,"completion_tokens":12,"total_tokens":22}
}
```

### OpenAI SDK [#openai-sdk]

```python
from openai import OpenAI
client = OpenAI(base_url="https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm", api_key="vnb-sk-a1b2c3...")
response = client.chat.completions.create(model="Qwen/Qwen2.5-7B-Instruct", messages=[{"role":"user","content":"hi"}])
print(response.choices[0].message.content, response.usage.total_tokens)
```

```ts
import OpenAI from "openai"
const openai = new OpenAI({ baseURL: "https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm", apiKey: "vnb-sk-..." })
const response = await openai.chat.completions.create({ model: "Qwen/Qwen2.5-7B-Instruct", messages: [{role:"user",content:"hi"}] })
```

The only changes from a standard OpenAI call are the `baseURL` (your app's gateway URL) and the `model` (must match the app's published model).

## Limits V1 [#limits-v1]

* TEXT only — `content` must be a string. `image_url`, `audio`, and `video` are not supported.
* `stream:true` supported (SSE, OpenAI shape) — the gateway injects `stream_options.include_usage:true` when missing; streams without a final usage chunk fail loudly instead of going unbilled.
* `chat/completions` for inference plus the read-only models listing (`GET` any path containing `models`) — no embeddings.
