Skip to main content
Создайте плагин провайдера, чтобы добавить провайдера моделей (LLM) в OpenClaw: каталог моделей, аутентификацию по API-ключу и динамическое разрешение моделей.
Впервые работаете с плагинами OpenClaw? Сначала прочитайте Начало работы, чтобы узнать о структуре пакета и настройке манифеста.
Плагины провайдеров добавляют модели в стандартный цикл инференса OpenClaw. Если модель должна запускаться через нативный демон агента, который управляет потоками, Compaction или событиями инструментов, объедините провайдер с обвязкой агента, а не помещайте детали протокола демона в ядро.

Пошаговое руководство

1

Пакет и манифест

Шаг 1. Пакет и манифест

setup.providers[].envVars позволяет OpenClaw обнаруживать учетные данные без загрузки среды выполнения вашего плагина. Добавьте providerAuthAliases, когда вариант провайдера должен повторно использовать аутентификацию идентификатора другого провайдера. modelSupport необязателен и позволяет OpenClaw автоматически загружать ваш плагин провайдера по сокращенным идентификаторам моделей, таким как acme-large, до появления обработчиков среды выполнения. openclaw.compat и openclaw.build в package.json обязательны для публикации в ClawHub (openclaw.compat.pluginApi и openclaw.build.openclawVersion — два обязательных поля; при отсутствии minGatewayVersion используется openclaw.install.minHostVersion).
2

Регистрация провайдера

Минимальному текстовому провайдеру требуются id, label, auth и catalog. catalog — принадлежащий провайдеру обработчик среды выполнения и конфигурации; он может вызывать действующие API поставщика и возвращает записи models.providers.
index.ts
registerModelCatalogProvider — новый интерфейс каталога плоскости управления для пользовательского интерфейса списков, справки и выбора, охватывающий строки text, voice, image_generation, video_generation и music_generation. Оставляйте вызовы конечных точек поставщика и преобразование ответов в плагине; OpenClaw отвечает за общую форму строк, метки источников и отображение справки.Теперь провайдер готов к работе. Пользователи могут выполнить openclaw onboard --acme-ai-api-key <key> и выбрать acme-ai/acme-large в качестве модели.

Динамическое обнаружение моделей

Если ваш провайдер предоставляет API в стиле /models, оставьте специфичные для провайдера конечную точку и преобразование строк в своем плагине и используйте openclaw/plugin-sdk/provider-catalog-live-runtime для общего жизненного цикла получения данных. Вспомогательная функция предоставляет защищенные HTTP-запросы, заголовки аутентификации провайдера, структурированные HTTP-ошибки, кэширование с TTL и статическое резервное поведение, не помещая политику провайдера в ядро OpenClaw.Используйте buildLiveModelProviderConfig, когда динамический API сообщает только о том, какие принадлежащие провайдеру строки статического каталога доступны в данный момент:
index.ts
Используйте getCachedLiveProviderModelRows, когда API провайдера возвращает более подробные метаданные и плагину необходимо самостоятельно преобразовывать строки в определения моделей OpenClaw:
index.ts
run должен оставаться защищенным аутентификацией и возвращать null, если подходящие учетные данные недоступны. Предоставьте автономный staticRun или статический резервный вариант, чтобы настройка, документация, тесты и интерфейсы выбора не зависели от доступа к сети. Используйте TTL, соответствующий требованиям к актуальности списка моделей, избегайте опроса файловой системы во время обработки запросов и передавайте специфичные для провайдера readRows / readModelId только тогда, когда ответ вышестоящего сервиса не соответствует совместимой с OpenAI структуре { data: [{ id, object }] }.Если вышестоящий провайдер использует управляющие токены, отличные от OpenClaw, добавьте небольшое двунаправленное преобразование текста вместо замены потокового пути:
input преобразует итоговую системную инструкцию и текстовое содержимое сообщений перед передачей. output преобразует фрагменты текста ассистента и итоговый текст до того, как OpenClaw обработает собственные управляющие маркеры или доставку в канал.Для встроенных провайдеров, которые регистрируют только один текстовый провайдер с аутентификацией по API-ключу и единственной средой выполнения на основе каталога, предпочтительнее использовать более узкую вспомогательную функцию defineSingleProviderPluginEntry(...):
buildProvider — это путь к актуальному каталогу, используемый, когда OpenClaw может определить реальные данные аутентификации провайдера. Он может выполнять обнаружение с учётом особенностей провайдера. Используйте buildStaticProvider только для офлайн-записей, которые можно безопасно показывать до настройки аутентификации; он не должен требовать учётных данных или выполнять сетевые запросы. В настоящее время представление models list --all в OpenClaw обрабатывает статические каталоги только для встроенных плагинов провайдеров, с пустой конфигурацией, пустым окружением и без путей агента или рабочего пространства.Если вашему процессу аутентификации также требуется изменять models.providers.*, псевдонимы и модель агента по умолчанию во время первоначальной настройки, используйте вспомогательные функции предустановок из openclaw/plugin-sdk/provider-onboard. Наиболее узкие вспомогательные функции: createDefaultModelPresetAppliers(...), createDefaultModelsPresetAppliers(...) и createModelCatalogPresetAppliers(...).Если нативная конечная точка провайдера поддерживает потоковые блоки использования при обычном транспорте openai-completions, предпочитайте общие вспомогательные функции каталога из openclaw/plugin-sdk/provider-catalog-shared вместо жёстко заданных проверок идентификатора провайдера. supportsNativeStreamingUsageCompat(...) и applyProviderNativeStreamingUsageCompat(...) определяют поддержку по карте возможностей конечной точки, поэтому нативные конечные точки в стиле Moonshot/DashScope по-прежнему могут включить эту возможность, даже если плагин использует пользовательский идентификатор провайдера.Приведённые выше примеры динамического обнаружения охватывают API провайдеров в стиле /models. Выполняйте такое обнаружение внутри catalog.run только при наличии пригодных данных аутентификации, а staticRun оставляйте без сетевых операций для автономного формирования каталога.
3

Добавьте динамическое разрешение моделей

Если ваш провайдер принимает произвольные идентификаторы моделей (например, прокси или маршрутизатор), добавьте resolveDynamicModel:
Если для разрешения требуется сетевой вызов, используйте prepareDynamicModel для асинхронного предварительного прогрева — resolveDynamicModel будет запущена снова после его завершения.
4

Добавьте хуки среды выполнения (при необходимости)

Большинству провайдеров требуются только catalog и resolveDynamicModel. Добавляйте хуки постепенно, по мере возникновения требований у вашего провайдера.Общие конструкторы вспомогательных функций теперь охватывают самые распространённые семейства совместимости воспроизведения и инструментов, поэтому плагинам обычно не требуется вручную подключать каждый хук по отдельности:
Доступные на сегодняшний день семейства воспроизведения:Доступные на сегодняшний день семейства потоковой передачи:
Каждый конструктор семейства состоит из общедоступных низкоуровневых вспомогательных функций, экспортируемых из того же пакета; их можно использовать, когда провайдеру требуется отклониться от общего шаблона:
  • openclaw/plugin-sdk/provider-model-sharedProviderReplayFamily, buildProviderReplayFamilyHooks(...) и низкоуровневые конструкторы воспроизведения (buildOpenAICompatibleReplayPolicy, buildAnthropicReplayPolicyForModel, buildGoogleGeminiReplayPolicy, buildHybridAnthropicOrOpenAIReplayPolicy). Также экспортирует вспомогательные функции воспроизведения Gemini (sanitizeGoogleGeminiReplayHistory, resolveTaggedReasoningOutputMode) и вспомогательные функции конечных точек и моделей (resolveProviderEndpoint, normalizeProviderId, normalizeGooglePreviewModelId).
  • openclaw/plugin-sdk/provider-streamProviderStreamFamily, buildProviderStreamFamilyHooks(...), composeProviderStreamWrappers(...), а также общие обёртки OpenAI/Codex (createOpenAIAttributionHeadersWrapper, createOpenAIFastModeWrapper, createOpenAIServiceTierWrapper, createOpenAIResponsesContextManagementWrapper, createCodexNativeWebSearchWrapper), OpenAI-совместимая обёртка DeepSeek V4 (createDeepSeekV4OpenAICompatibleThinkingWrapper), очистка предварительного заполнения рассуждений Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), совместимость вызовов инструментов в виде обычного текста (createPlainTextToolCallCompatWrapper) и общие обёртки прокси и провайдеров (createOpenRouterWrapper, createToolStreamWrapper, createMinimaxFastModeWrapper).
  • openclaw/plugin-sdk/provider-stream-shared — лёгкие обёртки полезной нагрузки и событий для интенсивно используемых путей провайдеров, включая createOpenAICompatibleCompletionsThinkingOffWrapper, createPayloadPatchStreamWrapper, createPlainTextToolCallCompatWrapper, normalizeOpenAICompatibleReasoningPayload(...) и setQwenChatTemplateThinking(...).
  • openclaw/plugin-sdk/provider-toolsProviderToolCompatFamily, buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai") и базовые вспомогательные функции схем провайдеров.
Для провайдеров семейства Gemini согласуйте режим вывода рассуждений с транспортом. Провайдеры прямого Google Gemini API должны использовать вывод рассуждений native, чтобы OpenClaw обрабатывал нативные части мыслей без добавления директив запросов <think> / <final>. Текстовые серверные части в стиле Gemini CLI, которые анализируют итоговый ответ в формате JSON или текста, могут сохранять общий контракт с тегами google-gemini.Некоторые потоковые вспомогательные функции намеренно остаются локальными для провайдера. @openclaw/anthropic-provider сохраняет wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier и низкоуровневые конструкторы обёрток Anthropic в собственной общедоступной точке расширения api.ts / contract-api.ts, поскольку они кодируют обработку бета-версии OAuth Claude и ограничение context1m. Плагин xAI аналогичным образом сохраняет формирование нативных Responses xAI в собственном wrapStreamFn (псевдонимы /fast, значение tool_stream по умолчанию, очистка неподдерживаемых строгих инструментов, специфичное для xAI удаление полезной нагрузки рассуждений).Тот же шаблон корня пакета также лежит в основе @openclaw/openai-provider (конструкторы провайдеров, вспомогательные функции модели по умолчанию, конструкторы провайдеров реального времени) и @openclaw/openrouter-provider (конструктор провайдера вместе со вспомогательными функциями первоначальной настройки и конфигурации).
Для провайдеров, которым требуется обмен токенами перед каждым вызовом логического вывода:
OpenClaw вызывает хуки плагинов моделей и провайдеров примерно в следующем порядке. Большинство провайдеров используют только 2–3 из них. Это не полный контракт ProviderPlugin — полный актуальный список хуков и примечания о резервных механизмах см. в разделе Внутреннее устройство: хуки среды выполнения провайдера. Поля провайдера, предназначенные только для совместимости и больше не вызываемые OpenClaw, например ProviderPlugin.capabilities и suppressBuiltInModel, здесь не перечислены.Примечания о резервных механизмах среды выполнения:
  • normalizeConfig разрешает один владеющий плагин для каждого идентификатора провайдера (сначала встроенные провайдеры, затем соответствующий плагин среды выполнения) и вызывает только этот хук — сканирование других провайдеров не выполняется. Собственный хук Google normalizeConfig нормализует записи конфигурации google / google-vertex / google-antigravity; это не отдельный резервный механизм ядра.
  • resolveConfigApiKey использует хук провайдера, если тот предоставлен. Amazon Bedrock сохраняет разрешение маркеров переменных окружения AWS в своём плагине провайдера; сама аутентификация среды выполнения по-прежнему использует стандартную цепочку AWS SDK при настройке с auth: "aws-sdk".
  • resolveThinkingProfile(ctx) получает выбранные provider, modelId, необязательную объединённую подсказку каталога reasoning и необязательные объединённые сведения о модели compat. Используйте compat только для выбора пользовательского интерфейса или профиля размышления провайдера.
  • resolveSystemPromptContribution позволяет провайдеру внедрять учитывающие кэш рекомендации для системного промпта семейства моделей. Предпочитайте его устаревшему общему для всего плагина хуку before_prompt_build, когда поведение относится к одному провайдеру или семейству моделей и должно сохранять разделение кэша на стабильную и динамическую части.
5

Добавьте дополнительные возможности (необязательно)

Шаг 5. Добавьте дополнительные возможности

Плагин провайдера может регистрировать векторные представления, синтез речи, транскрибирование в реальном времени, голосовую связь в реальном времени, анализ мультимедиа, генерацию изображений, генерацию видео, получение веб-страниц и веб-поиск наряду с текстовым логическим выводом. OpenClaw классифицирует его как плагин с гибридными возможностями — это рекомендуемый шаблон для плагинов компаний (один плагин на поставщика). См. Внутреннее устройство: владение возможностями.Зарегистрируйте каждую возможность внутри register(api) рядом с существующим вызовом api.registerProvider(...). Выберите только нужные вкладки:
Используйте assertOkOrThrowProviderError(...) для сбоев HTTP-запросов провайдера, чтобы плагины совместно использовали чтение тела ошибки с ограничением размера, разбор ошибок JSON и суффиксы идентификаторов запросов.
6

Тестирование

Шаг 6: Тестирование

src/provider.test.ts

Публикация в ClawHub

Плагины провайдеров публикуются так же, как и любые другие внешние плагины с кодом:
clawhub skill publish <path> — это другая команда для публикации папки навыка, а не пакета плагина — не используйте её здесь.

Структура файлов

Справочник по порядку каталогов

catalog.order определяет, когда ваш каталог объединяется относительно встроенных провайдеров:

Дальнейшие действия

Связанные материалы