client protocol checks · 27 Aug 2026

Use your API key.

Call the API directly, or configure one of five terminal coding agents. Pick a language or tool below; the live base URL and model ids are already filled in.

one base url · choose a model id https://api.tiyuvta.ai/v1 ornith-ai/ornith-1.5-35b-a3b qwen/qwen3.8-27b Get an API key at the console.

Direct API

OpenAI-compatible
shell
export TIYUVTA_KEY="YOUR_KEY"

curl https://api.tiyuvta.ai/v1/chat/completions \
  -H "Authorization: Bearer $TIYUVTA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ornith-ai/ornith-1.5-35b-a3b",
    "messages": [{"role": "user", "content": "Say hello."}]
  }'
python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.tiyuvta.ai/v1",
    api_key=os.environ["TIYUVTA_KEY"],
)
response = client.chat.completions.create(
    model="ornith-ai/ornith-1.5-35b-a3b",
    messages=[{"role": "user", "content": "Say hello."}],
)
print(response.choices[0].message.content)
javascript
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.tiyuvta.ai/v1",
  apiKey: process.env.TIYUVTA_KEY,
});
const response = await client.chat.completions.create({
  model: "ornith-ai/ornith-1.5-35b-a3b",
  messages: [{ role: "user", content: "Say hello." }],
});
console.log(response.choices[0].message.content);

Python and JavaScript use the OpenAI SDK. Keep the key in TIYUVTA_KEY; do not put it in source control. For streaming, tools, images, schemas and errors, continue to the API docs.

Claude Code

paste in your shell

Ornith-1.5 35B-A3B ornith-ai/ornith-1.5-35b-a3b

shell
export ANTHROPIC_BASE_URL=https://api.tiyuvta.ai
export ANTHROPIC_AUTH_TOKEN=YOUR_KEY
export ANTHROPIC_MODEL=ornith-ai/ornith-1.5-35b-a3b
export ANTHROPIC_SMALL_FAST_MODEL=ornith-ai/ornith-1.5-35b-a3b
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=262144

claude

Qwen3.8 27B qwen/qwen3.8-27b

shell
export ANTHROPIC_BASE_URL=https://api.tiyuvta.ai
export ANTHROPIC_AUTH_TOKEN=YOUR_KEY
export ANTHROPIC_MODEL=qwen/qwen3.8-27b
export ANTHROPIC_SMALL_FAST_MODEL=qwen/qwen3.8-27b
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=262144

claude

Recorded check on Qwen3.8 27B: read a file and wrote a new one, first try. Prints one unrecognized_model line at startup, then works. It is Claude Code labelling an id it does not ship metadata for, not an error from the gateway.

Codex CLI

~/.codex/config.toml

Ornith-1.5 35B-A3B ornith-ai/ornith-1.5-35b-a3b

~/.codex/config.toml
model_provider = "tiyuvta"
model = "ornith-ai/ornith-1.5-35b-a3b"

[model_providers.tiyuvta]
name = "tiyuvta"
base_url = "https://api.tiyuvta.ai/v1"
env_key = "TIYUVTA_API_KEY"
wire_api = "responses"

Qwen3.8 27B qwen/qwen3.8-27b

~/.codex/config.toml
model_provider = "tiyuvta"
model = "qwen/qwen3.8-27b"

[model_providers.tiyuvta]
name = "tiyuvta"
base_url = "https://api.tiyuvta.ai/v1"
env_key = "TIYUVTA_API_KEY"
wire_api = "responses"

Recorded check on Qwen3.8 27B: read a file and wrote a new one, first try. Warns once that it has no metadata for this model id, then runs the Responses route normally. Export TIYUVTA_API_KEY in the same shell.

opencode

~/.config/opencode/opencode.json

Ornith-1.5 35B-A3B ornith-ai/ornith-1.5-35b-a3b

~/.config/opencode/opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "tiyuvta": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "tiyuvta",
      "options": {
        "baseURL": "https://api.tiyuvta.ai/v1",
        "apiKey": "{env:TIYUVTA_API_KEY}"
      },
      "models": {
        "ornith-ai/ornith-1.5-35b-a3b": { "name": "Ornith-1.5 35B-A3B" }
      }
    }
  }
}

Qwen3.8 27B qwen/qwen3.8-27b

~/.config/opencode/opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "tiyuvta": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "tiyuvta",
      "options": {
        "baseURL": "https://api.tiyuvta.ai/v1",
        "apiKey": "{env:TIYUVTA_API_KEY}"
      },
      "models": {
        "qwen/qwen3.8-27b": { "name": "Qwen3.8 27B" }
      }
    }
  }
}

Recorded check on Qwen3.8 27B: read a file and wrote a new one, first try. Select the model as tiyuvta/ornith-ai/ornith-1.5-35b-a3b. No startup warning; the provider name in the config is the prefix you type.

Hermes

~/.hermes/config.yaml

Ornith-1.5 35B-A3B ornith-ai/ornith-1.5-35b-a3b

~/.hermes/config.yaml
provider: tiyuvta
model: ornith-ai/ornith-1.5-35b-a3b

custom_providers:
  - name: tiyuvta
    base_url: https://api.tiyuvta.ai/v1
    api_mode: openai_chat
    key_env: TIYUVTA_API_KEY
    models:
      - ornith-ai/ornith-1.5-35b-a3b
    context_length: 262144

Qwen3.8 27B qwen/qwen3.8-27b

~/.hermes/config.yaml
provider: tiyuvta
model: qwen/qwen3.8-27b

custom_providers:
  - name: tiyuvta
    base_url: https://api.tiyuvta.ai/v1
    api_mode: openai_chat
    key_env: TIYUVTA_API_KEY
    models:
      - qwen/qwen3.8-27b
    context_length: 262144

Recorded check on Qwen3.8 27B: read a file and wrote a new one, then verified the copy byte for byte. Export TIYUVTA_API_KEY in the same shell. key_env names the variable rather than holding the key, so the config itself stays safe to commit.

Pi

~/.pi/agent/models.json

Ornith-1.5 35B-A3B ornith-ai/ornith-1.5-35b-a3b

~/.pi/agent/models.json
{
  "providers": {
    "tiyuvta": {
      "baseUrl": "https://api.tiyuvta.ai/v1",
      "api": "openai-completions",
      "apiKey": "$TIYUVTA_API_KEY",
      "models": [
        {
          "id": "ornith-ai/ornith-1.5-35b-a3b",
          "name": "Ornith-1.5 35B-A3B",
          "reasoning": true,
          "input": ["text", "image"],
          "contextWindow": 262144,
          "maxTokens": 32768,
          "cost": {
            "input": 0.25,
            "output": 1.20,
            "cacheRead": 0.09,
            "cacheWrite": 0
          }
        }
      ]
    }
  }
}

Qwen3.8 27B qwen/qwen3.8-27b

~/.pi/agent/models.json
{
  "providers": {
    "tiyuvta": {
      "baseUrl": "https://api.tiyuvta.ai/v1",
      "api": "openai-completions",
      "apiKey": "$TIYUVTA_API_KEY",
      "models": [
        {
          "id": "qwen/qwen3.8-27b",
          "name": "Qwen3.8 27B",
          "reasoning": true,
          "input": ["text", "image"],
          "contextWindow": 262144,
          "maxTokens": 32768,
          "cost": {
            "input": 0.30,
            "output": 2.03,
            "cacheRead": 0.10,
            "cacheWrite": 0
          }
        }
      ]
    }
  }
}

Recorded check on Qwen3.8 27B: read a file and wrote a new one, first try. Run it as pi --provider tiyuvta --model ornith-ai/ornith-1.5-35b-a3b. The cost block is what makes Pi report spend correctly, so it is worth keeping accurate.

If the first request fails

common causes

Each client protocol was run end to end against Qwen3.8 27B on 27 Aug 2026, using a read-file then write-file tool loop. Configurations for other live models use the same protocol path with model ids and prices generated from the current roster. Editor clients such as Cursor and Cline, plus the protocol coverage table, are on integrations. Endpoint details are in the API docs.