Если вы раньше не создавали Plugin для OpenClaw, сначала прочитайте
Начало работы, чтобы разобраться с базовой
структурой пакета и настройкой манифеста.
Пошаговое руководство
Пакет и манифест
Шаг 1: Пакет и манифест
setup.providers[].envVars, чтобы OpenClaw мог обнаруживать
учетные данные без загрузки runtime вашего Plugin. Добавьте providerAuthAliases,
когда вариант провайдера должен повторно использовать аутентификацию id другого провайдера. modelSupport
необязателен и позволяет OpenClaw автоматически загрузить Plugin вашего провайдера по сокращенным
id моделей, таким как acme-large, еще до появления runtime-хуков. Если вы публикуете
провайдера в ClawHub, эти поля openclaw.compat и openclaw.build
обязательны в package.json.Зарегистрируйте провайдера
Минимальному текстовому провайдеру нужны Используйте
id, label, auth и catalog.
catalog — это runtime/config-хук, принадлежащий провайдеру; он может вызывать живые
API поставщика и возвращает записи models.providers.index.ts
registerModelCatalogProvider — это более новая поверхность каталога control-plane
для UI списков, справки и выбора. Используйте ее для строк text, image-generation,
video-generation и music-generation. Оставляйте вызовы endpoint поставщика и
сопоставление ответов в Plugin; OpenClaw владеет общей формой строк, метками
источников и отрисовкой справки.Это рабочий провайдер. Теперь пользователи могут выполнить
openclaw onboard --acme-ai-api-key <key> и выбрать
acme-ai/acme-large в качестве модели.Живое обнаружение моделей
Если ваш провайдер предоставляет API в стиле/models, оставьте специфичный для провайдера
endpoint и проекцию строк в вашем Plugin и используйте
openclaw/plugin-sdk/provider-catalog-live-runtime для общего lifecycle выборки.
Этот helper дает защищенные HTTP-запросы, заголовки аутентификации провайдера,
структурированные HTTP-ошибки, TTL-кэширование и поведение статического fallback без
помещения политики провайдера в ядро OpenClaw.Используйте buildLiveModelProviderConfig, когда live API сообщает только, какие
принадлежащие провайдеру строки статического каталога сейчас доступны:index.ts
getCachedLiveProviderModelRows, когда API провайдера возвращает более богатые
метаданные, а Plugin должен сам проецировать строки в определения моделей OpenClaw:index.ts
run должен оставаться закрытым аутентификацией и возвращать null, когда нет пригодных
учетных данных. Сохраняйте offline staticRun или статический fallback, чтобы setup, docs,
tests и поверхности выбора не зависели от живого доступа к сети. Используйте TTL,
подходящий для свежести списка моделей, избегайте опроса файловой системы во время запроса
и передавайте специфичные для провайдера readRows / readModelId только тогда, когда
ответ upstream не имеет OpenAI-совместимую форму { data: [{ id, object }] }.Если upstream-провайдер использует управляющие токены, отличные от OpenClaw, добавьте
небольшое двунаправленное текстовое преобразование вместо замены пути потока:input переписывает финальный системный prompt и содержимое текстовых сообщений перед
transport. output переписывает текстовые дельты assistant и финальный текст до того, как
OpenClaw разбирает собственные управляющие маркеры или доставку в канал.Для встроенных провайдеров, которые регистрируют только одного текстового провайдера с
аутентификацией по ключу API и единственным runtime на основе каталога, предпочитайте более узкий
helper defineSingleProviderPluginEntry(...):buildProvider — это путь живого каталога, используемый, когда OpenClaw может разрешить реальную
аутентификацию поставщика. Он может выполнять обнаружение, специфичное для поставщика. Используйте
buildStaticProvider только для офлайн-строк, которые безопасно показывать до настройки
аутентификации; он не должен требовать учетных данных или выполнять сетевые запросы.
Отображение models list --all в OpenClaw сейчас выполняет статические каталоги
только для встроенных Plugin поставщиков, с пустой конфигурацией, пустым окружением и без
путей агента/рабочей области.Если вашему потоку аутентификации также нужно изменять models.providers.*, псевдонимы и
модель агента по умолчанию во время onboarding, используйте готовые вспомогательные функции из
openclaw/plugin-sdk/provider-onboard. Самые узкие вспомогательные функции:
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) и
createModelCatalogPresetAppliers(...).Когда нативная конечная точка поставщика поддерживает потоковые блоки usage поверх
обычного транспорта openai-completions, предпочитайте общие вспомогательные функции каталога в
openclaw/plugin-sdk/provider-catalog-shared вместо жестко заданных
проверок id поставщика. supportsNativeStreamingUsageCompat(...) и
applyProviderNativeStreamingUsageCompat(...) определяют поддержку по карте
возможностей конечной точки, поэтому нативные конечные точки в стиле Moonshot/DashScope все равно
включаются, даже если Plugin использует пользовательский id поставщика.Примеры живого обнаружения выше покрывают API поставщиков в стиле /models. Держите
это обнаружение внутри catalog.run, с ограничением по пригодной аутентификации, и держите
staticRun без сетевых запросов для генерации офлайн-каталога.Add dynamic model resolution
Если ваш поставщик принимает произвольные ID моделей (например, прокси или маршрутизатор),
добавьте Если разрешение требует сетевого вызова, используйте
resolveDynamicModel:prepareDynamicModel для асинхронного
прогрева - resolveDynamicModel запустится снова после его завершения.Add runtime hooks (as needed)
Большинству поставщиков нужны только Доступные сегодня семейства replay:
Доступные сегодня семейства stream:
catalog + resolveDynamicModel. Добавляйте hooks
постепенно, по мере необходимости для вашего поставщика.Общие сборщики вспомогательных функций теперь покрывают самые распространенные семейства replay/tool-compat,
поэтому Plugin обычно не нужно вручную подключать каждый hook по одному:| Семейство | Что подключается | Встроенные примеры |
|---|---|---|
openai-compatible | Общая политика replay в стиле OpenAI для OpenAI-совместимых транспортов, включая очистку tool-call-id, исправления порядка с первым сообщением assistant и общую валидацию ходов Gemini там, где это нужно транспорту | moonshot, ollama, xai, zai |
anthropic-by-model | Политика replay с учетом Claude, выбираемая по modelId, чтобы транспорты Anthropic-message получали очистку thinking-block, специфичную для Claude, только когда разрешенная модель действительно имеет id Claude | amazon-bedrock, anthropic-vertex |
google-gemini | Нативная политика replay Gemini плюс очистка bootstrap replay. Общее семейство сохраняет текстовый вывод Gemini CLI на tagged reasoning; прямой поставщик google переопределяет resolveReasoningOutputMode на native, потому что thinking в Gemini API приходит как нативные thought parts. | google, google-gemini-cli |
passthrough-gemini | Очистка thought-signature Gemini для моделей Gemini, работающих через OpenAI-совместимые прокси-транспорты; не включает нативную валидацию replay Gemini или bootstrap-перезаписи | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | Гибридная политика для поставщиков, которые смешивают поверхности моделей Anthropic-message и OpenAI-совместимые поверхности моделей в одном Plugin; опциональное удаление thinking-block только для Claude остается ограниченным стороной Anthropic | minimax |
| Семейство | Что подключается | Встроенные примеры |
|---|---|---|
google-thinking | Нормализация thinking payload Gemini на общем stream-пути | google, google-gemini-cli |
kilocode-thinking | Обертка Kilo reasoning на общем stream-пути прокси, при этом kilo/auto и неподдерживаемые id reasoning прокси пропускают внедренный thinking | kilocode |
moonshot-thinking | Маппинг бинарного payload нативного thinking Moonshot из конфигурации + уровня /think | moonshot |
minimax-fast-mode | Перезапись модели MiniMax fast-mode на общем stream-пути | minimax, minimax-portal |
openai-responses-defaults | Общие обертки нативных OpenAI/Codex Responses: заголовки атрибуции, /fast/serviceTier, подробность текста, нативный веб-поиск Codex, формирование reasoning-compat payload и управление контекстом Responses | openai |
openrouter-thinking | Обертка reasoning OpenRouter для прокси-маршрутов, с централизованной обработкой пропусков unsupported-model/auto | openrouter |
tool-stream-default-on | Включенная по умолчанию обертка tool_stream для поставщиков вроде Z.AI, которым нужен tool streaming, если он явно не отключен | zai |
SDK seams powering the family builders
SDK seams powering the family builders
Каждый сборщик семейства составлен из низкоуровневых публичных вспомогательных функций, экспортируемых из того же пакета, к которым можно обратиться, когда поставщику нужно отойти от общего шаблона:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily,buildProviderReplayFamilyHooks(...)и необработанные сборщики replay (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Также экспортирует вспомогательные функции replay Gemini (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) и вспомогательные функции конечных точек/моделей (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), а также общие обертки OpenAI/Codex (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), OpenAI-совместимая обертка DeepSeek V4 (createDeepSeekV4OpenAICompatibleThinkingWrapper), очистка thinking prefill для Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), совместимость plain-text tool-call (createPlainTextToolCallCompatWrapper) и общие обертки прокси/поставщиков (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-stream-shared- легковесные обертки payload и событий для горячих путей поставщиков, включаяcreateOpenAICompatibleCompletionsThinkingOffWrapper,createPayloadPatchStreamWrapper,createPlainTextToolCallCompatWrapper,normalizeOpenAICompatibleReasoningPayload(...)иsetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")и базовые вспомогательные функции схем поставщиков.
native
reasoning output, чтобы OpenClaw потреблял нативные thought parts без добавления
prompt-директив <think> / <final>. Текстовые backends в стиле Gemini CLI,
которые разбирают финальный JSON/текстовый ответ, могут сохранять общий
tagged-контракт google-gemini.Некоторые stream-вспомогательные функции намеренно остаются локальными для поставщика. @openclaw/anthropic-provider держит wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier и низкоуровневые сборщики оберток Anthropic в собственном публичном шве api.ts / contract-api.ts, потому что они кодируют обработку Claude OAuth beta и gating context1m. Plugin xAI аналогично держит формирование нативных xAI Responses в собственном wrapStreamFn (псевдонимы /fast, tool_stream по умолчанию, очистка неподдерживаемого strict-tool, удаление reasoning-payload, специфичное для xAI).Тот же шаблон package-root также поддерживает @openclaw/openai-provider (сборщики поставщика, вспомогательные функции модели по умолчанию, сборщики realtime-поставщика) и @openclaw/openrouter-provider (сборщик поставщика плюс вспомогательные функции onboarding/config).- Token exchange
- Custom headers
- Native transport identity
- Usage and billing
Для поставщиков, которым нужен обмен токена перед каждым вызовом inference:
All available provider hooks
All available provider hooks
OpenClaw вызывает хуки в таком порядке. Большинство провайдеров используют только 2-3:
Поля провайдера только для совместимости, которые OpenClaw больше не вызывает, например
Примечания о резервном поведении runtime:
ProviderPlugin.capabilities и suppressBuiltInModel, здесь не перечислены.| # | Хук | Когда использовать |
|---|---|---|
| 1 | catalog | Каталог моделей или значения по умолчанию для базового URL |
| 2 | applyConfigDefaults | Глобальные значения по умолчанию, принадлежащие провайдеру, при материализации конфигурации |
| 3 | normalizeModelId | Очистка устаревших/предварительных псевдонимов ID модели перед поиском |
| 4 | normalizeTransport | Очистка api / baseUrl для семейства провайдера перед общей сборкой модели |
| 5 | normalizeConfig | Нормализация конфигурации models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Перезаписи совместимости нативного потокового учета использования для конфигурационных провайдеров |
| 7 | resolveConfigApiKey | Разрешение авторизации по env-маркерам, принадлежащее провайдеру |
| 8 | resolveSyntheticAuth | Локальная/самостоятельно размещенная или основанная на конфигурации синтетическая авторизация |
| 9 | shouldDeferSyntheticProfileAuth | Понижение приоритета синтетических заполнителей сохраненного профиля за env/config-авторизацией |
| 10 | resolveDynamicModel | Прием произвольных ID моделей upstream |
| 11 | prepareDynamicModel | Асинхронная загрузка метаданных перед разрешением |
| 12 | normalizeResolvedModel | Перезаписи транспорта перед runner |
| 13 | normalizeToolSchemas | Очистка схем инструментов, принадлежащая провайдеру, перед регистрацией |
| 14 | inspectToolSchemas | Диагностика схем инструментов, принадлежащая провайдеру |
| 15 | resolveReasoningOutputMode | Контракт tagged vs native reasoning-output |
| 16 | prepareExtraParams | Параметры запроса по умолчанию |
| 17 | createStreamFn | Полностью пользовательский транспорт StreamFn |
| 19 | wrapStreamFn | Пользовательские обертки headers/body на обычном пути потока |
| 20 | resolveTransportTurnState | Нативные headers/metadata для каждого turn |
| 21 | resolveWebSocketSessionPolicy | Нативные headers/cool-down для WS-сеанса |
| 22 | formatApiKey | Пользовательская форма runtime-токена |
| 23 | refreshOAuth | Пользовательское обновление OAuth |
| 24 | buildAuthDoctorHint | Подсказка по исправлению авторизации |
| 25 | matchesContextOverflowError | Обнаружение переполнения, принадлежащее провайдеру |
| 26 | classifyFailoverReason | Классификация rate-limit/overload, принадлежащая провайдеру |
| 27 | isCacheTtlEligible | Ограничение TTL кеша промптов |
| 28 | buildMissingAuthMessage | Пользовательская подсказка об отсутствующей авторизации |
| 29 | augmentModelCatalog | Синтетические строки forward-compat |
| 30 | resolveThinkingProfile | Набор параметров /think, специфичный для модели |
| 31 | isBinaryThinking | Совместимость бинарного включения/выключения thinking |
| 32 | supportsXHighThinking | Совместимость поддержки reasoning xhigh |
| 33 | resolveDefaultThinkingLevel | Совместимость политики /think по умолчанию |
| 34 | isModernModelRef | Сопоставление моделей live/smoke |
| 35 | prepareRuntimeAuth | Обмен токена перед inference |
| 36 | resolveUsageAuth | Пользовательский разбор учетных данных использования |
| 37 | fetchUsageSnapshot | Пользовательский endpoint использования |
| 38 | createEmbeddingProvider | Адаптер embedding, принадлежащий провайдеру, для memory/search |
| 39 | buildReplayPolicy | Пользовательская политика replay/compaction транскрипта |
| 40 | sanitizeReplayHistory | Специфичные для провайдера перезаписи replay после общей очистки |
| 41 | validateReplayTurns | Строгая валидация replay-turn перед встроенным runner |
| 42 | onModelSelected | Callback после выбора (например, telemetry) |
normalizeConfigсначала проверяет совпавшего провайдера, затем другие provider plugins с поддержкой хуков, пока один из них действительно не изменит конфигурацию. Если ни один хук провайдера не переписывает поддерживаемую запись конфигурации семейства Google, встроенный нормализатор конфигурации Google все равно применяется.resolveConfigApiKeyиспользует хук провайдера, когда он предоставлен. Amazon Bedrock держит разрешение AWS env-маркеров в своем provider plugin; сама runtime-авторизация все равно использует цепочку AWS SDK по умолчанию, когда настроена сauth: "aws-sdk".resolveThinkingProfile(ctx)получает выбранныеprovider,modelId, необязательную объединенную подсказку каталогаreasoningи необязательные объединенные фактыcompatмодели. Используйтеcompatтолько для выбора thinking UI/profile провайдера.resolveSystemPromptContributionпозволяет провайдеру внедрять cache-aware guidance для system-prompt для семейства моделей. Предпочитайте его вместоbefore_prompt_build, когда поведение принадлежит одному провайдеру/семейству моделей и должно сохранять разделение stable/dynamic cache.
Add extra capabilities (optional)
Шаг 5: Добавьте дополнительные возможности
Provider plugin может регистрировать embeddings, speech, realtime transcription, realtime voice, media understanding, image generation, video generation, web fetch и web search вместе с text inference. OpenClaw классифицирует это как плагин с гибридными возможностями - рекомендуемый шаблон для плагинов компаний (один плагин на поставщика). См. Внутреннее устройство: владение возможностями.Регистрируйте каждую возможность внутриregister(api) рядом с существующим
вызовом api.registerProvider(...). Выберите только нужные вкладки:- Speech (TTS)
- Realtime transcription
- Realtime voice
- Понимание медиа
- Embeddings
- Генерация изображений и видео
- Веб-загрузка и поиск
assertOkOrThrowProviderError(...) для HTTP-сбоев провайдера, чтобы
плагины совместно использовали ограниченное чтение тела ошибки, разбор JSON-ошибок и
suffixes request-id.Тестирование
Шаг 6: Тестирование
src/provider.test.ts
Публикация в ClawHub
Plugin провайдеров публикуются так же, как и любой другой внешний кодовый Plugin:clawhub package publish.
Структура файлов
Справочник порядка каталога
catalog.order управляет тем, когда ваш каталог объединяется относительно
встроенных провайдеров:
| Порядок | Когда | Сценарий использования |
|---|---|---|
simple | Первый проход | Обычные провайдеры с API-ключом |
profile | После simple | Провайдеры, зависящие от профилей аутентификации |
paired | После profile | Синтез нескольких связанных записей |
late | Последний проход | Переопределение существующих провайдеров (побеждает при конфликте) |
Следующие шаги
- Plugin каналов - если ваш Plugin также предоставляет канал
- Среда выполнения SDK - вспомогательные средства
api.runtime(TTS, поиск, subagent) - Обзор SDK - полный справочник импортов по подпутям
- Внутреннее устройство Plugin - подробности хуков и встроенные примеры