qm
Корпоративный мультиплеер-агент (yc-software/qm, пакет `@yc-software/qm`): Slack, веб, песочницы, админка. Сам qm не является OpenAI-клиентом: ход делает выбран
Что нужно
- Развёрнутый qm (
qm init→qm up) — Getting started - Ключ
sk-… - Slug из каталога — все id, которые админ разрешит в пикере
- В кабинете LLM Mart включены эти модели
Протокол
| Куда смотрит harness | Адрес | Заголовок ключа |
|---|---|---|
| OpenAI-compatible (Pi, OpenCode; Codex — Responses) | https://www.llmmart.ru/api/v1 | Authorization: Bearer |
| Anthropic Messages (Pi / OpenCode с protocol Anthropic; Claude Code) | https://www.llmmart.ru/api без /v1 | Bearer или x-api-key |
Секреты — в .env / secretEnv, не в qm.config.jsonc.
Предпочтительный путь: Custom providers в админке
С qm 0.1.5 в Admin есть блок Custom providers: любой OpenAI- или Anthropic-совместимый шлюз, ключ write-only, модели попадают в пикер.
- Admin → Custom providers.
- Provider id (slug):
llmmart(латиница, строчные, неopenai/anthropic/openrouter/mock). - Display name:
LLM Mart. - Protocol: OpenAI-compatible.
- Base URL:
https://www.llmmart.ru/api/v1. - API key:
sk-…. - Models (one per line: id | name | context | maxTokens) — без списка провайдер не сохранится:
gpt-4o-mini | GPT-4o mini | 128000 | 16384
anthropic/claude-sonnet-5 | Claude Sonnet 5 | 200000 | 16384
anthropic/claude-opus-4.6 | Claude Opus 4.6 | 200000 | 16384
anthropic/claude-haiku-4.5 | Claude Haiku 4.5 | 200000 | 8192Id в первой колонке — точный slug каталога. Для id со слэшем (anthropic/claude-sonnet-5) регистрация в custom provider обязательна: иначе OpenCode разрежет строку по первому / и уйдёт в фантомный провайдер anthropic.
- Галка Validate key against the endpoint — для OpenAI-протокола оставьте: проверка это
GET {baseUrl}/models. - Save provider. В статусе: модели в пикере.
Для native Messages — второй провайдер:
- id:
llmmart-anthropic - Protocol: Anthropic-compatible
- Base URL:
https://www.llmmart.ru/apiбез/v1 - Те же native-slug
- Галка Validate может остаться включённой: проверка зовёт
GET /v1/modelsс заголовком Anthropic, и шлюз отвечает его формой списка.
Custom provider доходит до Pi и OpenCode. Codex — если у модели есть responses (Codex с февраля 2026 говорит только с Responses). Claude Code custom provider не использует — см. ниже.
В qm.config.jsonc базовую модель организации укажите slug из списка:
{
"model": "anthropic/claude-sonnet-5",
"env": {
"core": {
"HARNESS": "pi"
}
}
}HARNESS=mock модели не вызывает.
Альтернатива: подмена встроенного вендора
Если custom provider недоступен, qm читает из окружения core:
| Переменная | Куда |
|---|---|
OPENAI_BASE_URL | встроенный openai |
ANTHROPIC_BASE_URL | встроенный anthropic |
OPENROUTER_BASE_URL | встроенный openrouter |
{
"modelProvider": "openai",
"model": "gpt-4o-mini",
"env": {
"core": {
"HARNESS": "pi",
"OPENAI_BASE_URL": "https://www.llmmart.ru/api/v1"
}
}
}Ключ — OPENAI_API_KEY=sk-… в .env. Id моделей тогда должны быть теми, что шлёт встроенный openai/anthropic, а не произвольный каталог со слэшем. Для полного каталога LLM Mart оставайтесь на Custom providers.
qm doctor по умолчанию стучится в api.openai.com / api.anthropic.com / openrouter.ai. После подмены URL проверка doctor может не совпасть с реальным трафиком агента.
Harness Claude Code
В env.core:
{
"modelProvider": "anthropic",
"model": "anthropic/claude-sonnet-5",
"env": {
"core": {
"HARNESS": "claude",
"ANTHROPIC_BASE_URL": "https://www.llmmart.ru/api"
}
}
}Ключ в .env: лучше ANTHROPIC_AUTH_TOKEN=sk-… и пустой ANTHROPIC_API_KEY — как в Claude Code. qm прокидывает в процесс claude только ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL (и OAuth). Слоты ANTHROPIC_DEFAULT_HAIKU_MODEL / SONNET / OPUS в whitelist нет: основную модель задаёт поле model в конфиге qm и пикер админки, не ~/.claude/settings.json на хосте.
Сочетания provider × harness (qm откажется деплоить несовместимую пару):
modelProvider | Допустимый HARNESS |
|---|---|
anthropic | pi, opencode, claude, mock |
openai | pi, opencode, codex, mock |
openrouter | pi, mock |
Custom provider llmmart эту таблицу не заменяет: он добавляет модели в пикер поверх.
Песочница и выход в сеть
Агент ходит в LLM Mart с хоста core / из sandbox. Если включён allowlist исходящих — добавьте llmmart.ru. Не коммитьте ключ в qm.config.jsonc (config.no-secret-values).
Типичные ошибки
| Симптом | Что проверить |
|---|---|
at least one model is required | в Custom providers непустой список id |
provider id is reserved | не называйте провайдера openai / anthropic / openrouter |
invalid_api_key при Save | URL со /v1 для OpenAI; для Anthropic снимите Validate |
Пикер режет anthropic/claude-… | id зарегистрирован в custom provider целиком |
| Ходы на api.openai.com | Custom endpoint/provider сохранён, не пустой OPENAI_BASE_URL при ключе Mart |
HARNESS=mock | в env.core.HARNESS стоит pi / opencode / codex / claude |
Codex 400 / нет responses | модель с Responses; см. Codex CLI |
Claude 404 /v1/v1/messages | ANTHROPIC_BASE_URL без /v1 |
| Custom provider есть, Claude не видит | Claude Code не читает custom providers — нужен ANTHROPIC_BASE_URL |
Проверено: 2026-09-01 по исходникам qm (src/model/custom-providers.ts, Admin Custom providers, ANTHROPIC_BASE_URL / OPENAI_BASE_URL в provider-endpoints.ts) и релизу 0.1.5.