Интеграции

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/v1Authorization: Bearer
Anthropic Messages (Pi / OpenCode с protocol Anthropic; Claude Code)https://www.llmmart.ru/api без /v1Bearer или x-api-key

Секреты — в .env / secretEnv, не в qm.config.jsonc.

Предпочтительный путь: Custom providers в админке

С qm 0.1.5 в Admin есть блок Custom providers: любой OpenAI- или Anthropic-совместимый шлюз, ключ write-only, модели попадают в пикер.

  1. Admin → Custom providers.
  2. Provider id (slug): llmmart (латиница, строчные, не openai / anthropic / openrouter / mock).
  3. Display name: LLM Mart.
  4. Protocol: OpenAI-compatible.
  5. Base URL: https://www.llmmart.ru/api/v1.
  6. API key: sk-….
  7. 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 | 8192

Id в первой колонке — точный slug каталога. Для id со слэшем (anthropic/claude-sonnet-5) регистрация в custom provider обязательна: иначе OpenCode разрежет строку по первому / и уйдёт в фантомный провайдер anthropic.

  1. Галка Validate key against the endpoint — для OpenAI-протокола оставьте: проверка это GET {baseUrl}/models.
  2. 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
anthropicpi, opencode, claude, mock
openaipi, opencode, codex, mock
openrouterpi, 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 при SaveURL со /v1 для OpenAI; для Anthropic снимите Validate
Пикер режет anthropic/claude-…id зарегистрирован в custom provider целиком
Ходы на api.openai.comCustom 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/messagesANTHROPIC_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.

Что дальше