Skip to main content
This guide is for developers running open weight models, either on a vendor API or on their own hardware. Cycls treats both the same way: a vendor/model string, a base URL, and a key.

Vendor APIs for open weight models

The vendor prefix picks the reasoning dialect. DeepSeek receives a thinking toggle plus an effort level, Kimi receives effort tiers, GLM receives a binary toggle. See Models for the full mapping.
Model identifiers change between releases. Confirm the current name in the vendor’s documentation before pinning it.

Your own vLLM or SGLang server

local has no reasoning dialect, so .thinking() sends nothing and prints one warning. Pass the parameter your server expects directly:
http://localhost:8000 resolves inside the container, not on your laptop. When cycls run builds a container, point it at a reachable host such as http://host.docker.internal:8000/v1 on macOS, or at the server’s network address.

Endpoints behind proxy authentication

Some hosts authenticate with headers rather than a bearer token.
.headers() is sent on every model request. Clients are cached per configuration, so changing headers creates a new client rather than mutating a shared one.

Text-only models

Models without vision reject base64 media and fail the whole request. Turn vision off and attachments stay in the workspace, with a note naming the file so the model can open it with a tool.

Set the context window

Compaction starts when the conversation approaches the window, and the default assumes 1M tokens. Set it to the real value or long chats will overflow before compaction triggers.

Web search on any model

Native server-side search is Anthropic only. The portable pair works everywhere and needs BRAVE_API_KEY in the container.

MCP on any model

The harness speaks MCP itself, so remote MCP servers work regardless of provider. .server_side() is the exception: it hands the server to Anthropic’s connector and is Anthropic only.

Complete example

oss_agent.py
Set prices from the vendor’s published rates so cycls cost reports real spend.

Troubleshooting

A reasoning parameter may not exist on that endpoint. Use .thinking(None) and add what the server supports with .extra_body().
Confirm the endpoint implements OpenAI tool calling. Some community servers accept the field and ignore it. Test with a single simple tool first.
Set .context() to the model’s real window. The loop compacts based on that number, and the default is 1M.
Pass .vision(False) for text-only models.

Next

Python reference

Every exported name in one table.