FreeCFBTKimiAPI — небольшой локальный compatibility proxy. Он не хранит model weights локально. Прокси принимает распространённые API-диалекты для AI-агентов и пересылает обычные chat-запросы в keyless CFBT Kimi upstream.
Agent / SDK client
├─ OpenAI Chat Completions: /v1/chat/completions
├─ Anthropic Messages: /v1/messages
└─ OpenAI Responses: /v1/responses
↓
FreeCFBTKimiAPI local server
↓
Tool-call simulation / protocol normalization
↓
CFBT upstream client with retry/backoff/circuit breaker
↓
https://cfbt.ccwu.cc/v1/chat/completions
Отвечает за локальный HTTP server и все публичные compatibility routes:
GET /,/health,/api/statusGET /api/diagnosticsGET /v1/models,/modelsPOST /v1/chat/completions,/chat/completionsPOST /v1/messages,/messagesPOST /v1/responses,/responses
Файл намеренно не требует внешних dependencies: только встроенный Node http server и fetch.
Отвечает за upstream-запросы и controls надёжности:
- нормализация model aliases;
- request timeout через
AbortController; - retry с jitter;
- circuit breaker после повторяющихся capacity/rate failures;
- browser-compatible normal headers/profile selection;
- классификация ошибок.
Классы ошибок:
capacity_exceededblocked_by_upstreamrate_limitedupstream_5xxupstream_timeout_or_network
Отвечает за proxy-layer tool-call simulation для upstream, у которого нет native tools:
- вставляет компактный tool adapter prompt;
- парсит XML / fenced JSON / raw JSON tool-call output;
- даёт deterministic file/shell tool fallback для smoke-тестов;
- определяет tool-result messages;
- перестаёт форсировать tools после tool result;
- возвращает финальный
DONE/Done., если задача этого просит.
Загружает .env и отдаёт runtime config:
- port;
- upstream base URL и model;
- max-token default;
- retry/circuit-breaker settings;
- client profile mode и profiles.
Используется многими SDK, Hermes custom providers и OpenCode-compatible путями.
Для streaming-запросов сервер сейчас вызывает upstream в non-streaming режиме и переизлучает чистый локальный SSE stream. Это помогает обойти CFBT/Kimi reasoning-first streaming quirks, когда agent-клиенты слишком долго не видят delta.content.
Tool calls возвращаются как обычные OpenAI tool_calls с finish_reason: "tool_calls".
Используется Claude Code. Shim мапит Anthropic messages/tools во внутренний OpenAI-like tool simulation path и возвращает Anthropic content blocks:
- text answer:
{ type: "text", text: "..." } - tool call:
{ type: "tool_use", id, name, input }
Используется Codex-style клиентами. Важные детали совместимости:
- file/shell tasks с tools возвращают структурный
output[].type == "function_call"; - tool arguments включают и
cmd, иcommandдля совместимости command-tools; - streaming branches отдают полный Responses event lifecycle;
- streaming-продолжение после tool call возвращает
response.completed, иначе Codex может упасть уже после выполнения команды.
Free/keyless models часто ломают agent tool use одним из трёх способов:
- пишут malformed tool JSON/XML;
- используют неправильный argument key;
- описывают команду текстом вместо запроса tool call.
Для публичных agent smoke-тестов прокси включает deterministic fallback для явных file-create/tool-name задач. Это не замена model intelligence; это способ сделать protocol compatibility проверяемой и не ловить false failures из-за слабого formatting tools.
OpenClaw custom catalog видит openai/cfbt-kimi через:
~/.openclaw-<profile>/agents/main/agent/models.json
primary model можно задать через:
agents.defaults.model.primary
В локальном тестировании openclaw models list видел модель, но openclaw agent --local всё ещё отвечал Unknown model: openai/cfbt-kimi. Считай это проблемой alignment OpenClaw runtime/profile registry, а не failure endpoint FreeCFBTKimiAPI, пока дальнейший debugging не докажет обратное.
Не называй проект agent-ready после одних plain chat тестов. Нужная матрица:
/v1/models- plain chat
- OpenAI tool loop
- Anthropic Messages
- Responses API
- реальные downstream clients, которые создают sentinel-файлы