client protocol checks · 21 Aug 2026

Configure your coding agent.

Five terminal coding agents and 2 live models. Copy the configuration for your client and model, then add your key.

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

Claude Code

paste in your shell

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

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

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

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"

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"

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

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" }
      }
    }
  }
}

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" }
      }
    }
  }
}

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

Hermes

~/.hermes/config.yaml

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

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

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

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.40,
            "output": 2.03,
            "cacheRead": 0.10,
            "cacheWrite": 0
          }
        }
      ]
    }
  }
}

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
          }
        }
      ]
    }
  }
}

Recorded check on Qwen3.8 27B: read a file and wrote a new one, first try. Run it as pi --provider tiyuvta --model qwen/qwen3.8-27b. 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 21 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.