Documentation
¶
Overview ¶
Package ai — единый LLM-слой (типы, стриминг, auth, каталог моделей).
Роль: leaf-модуль `github.com/stelmakhdigital/stell-ai` (готов к отдельному репо). Его используют `stell/agent` и `stell/coding-agent`; сам ai не импортирует соседние пакеты.
Основные импорты:
- github.com/stelmakhdigital/stell-ai — типы сообщений, Auth, compat/thinking helpers, BuiltinModels
- github.com/stelmakhdigital/stell-ai/provider — реестр фабрик
- github.com/stelmakhdigital/stell-ai/provider/all — blank-import регистрации всех провайдеров
- github.com/stelmakhdigital/stell-ai/auth/oauth — OAuth-потоки логина
Корень пакета (публичный API, без подпакетов — в Go один каталог = один package):
- сообщения / стрим: types.go, blocks.go, stop_reason.go
- конфиг модели: modelconfig.go, compat.go, thinking_helpers.go
- wire-хелперы: convert.go, content_wire.go, replay.go
- auth store: auth.go (Auth, LoadAuth) — рядом с типами, не с OAuth
- каталог: models.generated.go, models.seed.json
Поддиректории (отдельные import-пути):
- api/ — общие HTTP wire-транспорты (OpenAI Completions/Responses, Anthropic)
- auth/oauth/ — PKCE и OAuth для провайдеров
- images/ — генерация изображений (OpenRouter)
- provider/ — реестр + StreamDelta; provider/<name>/ — фабрики
- provider/all/ — регистрация шлюзов и first-class провайдеров
- scripts/ — генерация/синхронизация каталога моделей
Index ¶
- Constants
- Variables
- func AnthropicAssistantBlocks(msg Message, opts ReplayOptions) []map[string]any
- func BlocksToRPCContent(blocks []ContentBlock) []map[string]any
- func ClearPendingOAuthState(globalDir string)
- func CloneCompatMap(m map[string]any) map[string]any
- func DefaultThinkingBudget(level string) int
- func ErrUnknownProvider(id string) error
- func HasAssistantOutput(blocks []ContentBlock) bool
- func HasAuthConfigured(auth *Auth, mc ModelConfig) bool
- func IsThinkingOff(level string) bool
- func IsToolRole(r Role) bool
- func LoadPendingOAuthState(globalDir string) (oauth.PendingState, bool, error)
- func MapThinkingLevel(mc ModelConfig, level string) (mapped string, ok bool)
- func MessageStopReason(providerReason string, hasToolCalls bool) string
- func ModelMaxTokens(mc ModelConfig) int
- func NormalizeMessage(msg *Message)
- func NormalizeStopReason(reason string) string
- func OAuthBetaHeader() string
- func OllamaAssistantWire(msg Message) (content, thinking string)
- func OpenAIAssistantWire(msg Message, opts ReplayOptions) (content any, reasoningContent string)
- func ResolveAPIKey(auth *Auth, mc ModelConfig) (string, error)
- func ResolveChatTemplateKwargs(raw map[string]any, level string, thinkMap map[string]*string) map[string]any
- func SavePendingOAuthState(globalDir string, state oauth.PendingState) error
- func TextFromBlocks(blocks []ContentBlock) string
- func ThinkingFromBlocks(blocks []ContentBlock) string
- type Auth
- func (a *Auth) Entry(provider string) (AuthEntry, bool)
- func (a *Auth) IsOAuth(provider string) bool
- func (a *Auth) Logout(provider string) error
- func (a *Auth) Providers() []string
- func (a *Auth) Resolve(provider string) (string, error)
- func (a *Auth) Save() error
- func (a *Auth) SetCLIOverride(key string)
- func (a *Auth) SetOAuthCredentials(provider, access, refresh string, expiresUnix int64)
- func (a *Auth) SetOAuthFromTokenSet(provider string, tokens oauth.TokenSet)
- func (a *Auth) SetOAuthToken(provider, token string)
- func (a *Auth) SetProviderKey(provider, key string)
- type AuthEntry
- type BlockBuilder
- func (b *BlockBuilder) AppendText(delta string)
- func (b *BlockBuilder) AppendThinking(delta string)
- func (b *BlockBuilder) AppendThinkingSignature(delta string)
- func (b *BlockBuilder) AppendToolCall(tc ToolCall)
- func (b *BlockBuilder) Blocks() []ContentBlock
- func (b *BlockBuilder) HasText() bool
- func (b *BlockBuilder) HasThinking() bool
- func (b *BlockBuilder) Reset()
- type BlockType
- type BuiltinModel
- type ChatEvent
- type ChatRequest
- type CompatSettings
- func (c CompatSettings) AllowEmptySignatureEnabled() bool
- func (c CompatSettings) CacheControlFormatAnthropic() bool
- func (c CompatSettings) DeveloperRoleEnabled() bool
- func (c CompatSettings) ForceAdaptiveThinkingEnabled() bool
- func (c CompatSettings) MaxTokensFieldName() string
- func (c CompatSettings) ReasoningAsContentEnabled() bool
- func (c CompatSettings) ReasoningEffortEnabled() bool
- func (c CompatSettings) RequiresAssistantAfterToolResultEnabled() bool
- func (c CompatSettings) RequiresReasoningContentOnAssistantMessagesEnabled() bool
- func (c CompatSettings) RequiresThinkingAsTextEnabled() bool
- func (c CompatSettings) RequiresToolResultNameEnabled() bool
- func (c CompatSettings) ResolvedSessionAffinityFormat() string
- func (c CompatSettings) ResolvedThinkingFormat() string
- func (c CompatSettings) SendSessionAffinityHeadersEnabled() bool
- func (c CompatSettings) SupportsCacheControlOnToolsEnabled() bool
- func (c CompatSettings) SupportsEagerToolInputStreamingEnabled() bool
- func (c CompatSettings) SupportsLongCacheRetentionEnabled() bool
- func (c CompatSettings) SupportsStoreEnabled() bool
- func (c CompatSettings) SupportsStrictModeEnabled() bool
- func (c CompatSettings) SupportsUsageInStreamingEnabled() bool
- type ContentBlock
- type CostTier
- type EventType
- type HTTPHooks
- type HTTPHooksSetter
- type ImageContent
- type InferenceParams
- type Message
- type ModelConfig
- type Provider
- type ReplayOptions
- type Role
- type ToolCall
- type ToolDef
- type Usage
Constants ¶
const ( // DefaultMaxTokens — лимит выходных токенов модели по умолчанию. DefaultMaxTokens = 16384 MaxModelTokensCap = 32000 )
Variables ¶
var BuiltinModels = []BuiltinModel{}/* 936 elements not displayed */
BuiltinModels — сгенерированный статический каталог моделей.
Functions ¶
func AnthropicAssistantBlocks ¶
func AnthropicAssistantBlocks(msg Message, opts ReplayOptions) []map[string]any
AnthropicAssistantBlocks собирает content-блоки Anthropic для replay.
func BlocksToRPCContent ¶
func BlocksToRPCContent(blocks []ContentBlock) []map[string]any
BlocksToRPCContent преобразует блоки assistant в форму массива content для RPC.
func ClearPendingOAuthState ¶
func ClearPendingOAuthState(globalDir string)
func CloneCompatMap ¶
CloneCompatMap делает поверхностную копию JSON-объекта для merge.
func DefaultThinkingBudget ¶
DefaultThinkingBudget возвращает встроенный бюджет токенов для уровня thinking.
func ErrUnknownProvider ¶
ErrUnknownProvider возвращается, если id фабрики провайдера не зарегистрирован.
func HasAssistantOutput ¶
func HasAssistantOutput(blocks []ContentBlock) bool
HasAssistantOutput сообщает, содержат ли blocks непустой вывод ассистента.
func HasAuthConfigured ¶
func HasAuthConfigured(auth *Auth, mc ModelConfig) bool
HasAuthConfigured проверяет, вероятно ли настроена auth, без выполнения shell-команд.
func IsThinkingOff ¶
IsThinkingOff сообщает, отключает ли уровень thinking.
func IsToolRole ¶
IsToolRole сообщает, является ли r ролью результата инструмента (канонической или legacy).
func LoadPendingOAuthState ¶
func LoadPendingOAuthState(globalDir string) (oauth.PendingState, bool, error)
LoadPendingOAuthState читает незавершённое PKCE-состояние.
func MapThinkingLevel ¶
func MapThinkingLevel(mc ModelConfig, level string) (mapped string, ok bool)
MapThinkingLevel применяет thinkingLevelMap модели, если настроен. При пустой карте уровень передаётся как есть (ok=true).
func MessageStopReason ¶
MessageStopReason возвращает канонический stopReason для сохранённого assistant-сообщения.
func ModelMaxTokens ¶
func ModelMaxTokens(mc ModelConfig) int
ModelMaxTokens возвращает настроенный лимит выходных токенов модели.
func NormalizeMessage ¶
func NormalizeMessage(msg *Message)
NormalizeMessage заполняет Blocks из legacy Content/ToolCalls и синхронизирует Content.
func NormalizeStopReason ¶
NormalizeStopReason приводит stop reason провайдера/сессии к enum assistant stopReason.
func OAuthBetaHeader ¶
func OAuthBetaHeader() string
OAuthBetaHeader возвращает значение заголовка anthropic-beta для OAuth-токенов.
func OllamaAssistantWire ¶
OllamaAssistantWire возвращает поля content и thinking для Ollama replay.
func OpenAIAssistantWire ¶
func OpenAIAssistantWire(msg Message, opts ReplayOptions) (content any, reasoningContent string)
OpenAIAssistantWire собирает OpenAI wire-контент для assistant-сообщения, включая replay reasoning при необходимости по compat.
func ResolveAPIKey ¶
func ResolveAPIKey(auth *Auth, mc ModelConfig) (string, error)
func ResolveChatTemplateKwargs ¶
func ResolveChatTemplateKwargs(raw map[string]any, level string, thinkMap map[string]*string) map[string]any
ResolveChatTemplateKwargs разрешает плейсхолдеры $var в chatTemplateKwargs.
func SavePendingOAuthState ¶
func SavePendingOAuthState(globalDir string, state oauth.PendingState) error
SavePendingOAuthState записывает незавершённое PKCE-состояние.
func TextFromBlocks ¶
func TextFromBlocks(blocks []ContentBlock) string
TextFromBlocks объединяет текстовые blocks для legacy-поля Content.
func ThinkingFromBlocks ¶
func ThinkingFromBlocks(blocks []ContentBlock) string
ThinkingFromBlocks возвращает склеенный текст blocks thinking.
Types ¶
type Auth ¶
type Auth struct {
// contains filtered or unexported fields
}
Auth хранит credentials (обычно ~/.stell/agent/auth.json).
func NewAuthForTest ¶
func NewAuthForTest() *Auth
NewAuthForTest создаёт in-memory Auth для unit-тестов.
func (*Auth) SetCLIOverride ¶
func (*Auth) SetOAuthCredentials ¶
func (*Auth) SetOAuthFromTokenSet ¶
func (*Auth) SetOAuthToken ¶
func (*Auth) SetProviderKey ¶
type BlockBuilder ¶
type BlockBuilder struct {
// contains filtered or unexported fields
}
BlockBuilder накапливает блоки ассистента при стриминге в порядке появления.
func (*BlockBuilder) AppendText ¶
func (b *BlockBuilder) AppendText(delta string)
func (*BlockBuilder) AppendThinking ¶
func (b *BlockBuilder) AppendThinking(delta string)
func (*BlockBuilder) AppendThinkingSignature ¶
func (b *BlockBuilder) AppendThinkingSignature(delta string)
func (*BlockBuilder) AppendToolCall ¶
func (b *BlockBuilder) AppendToolCall(tc ToolCall)
func (*BlockBuilder) Blocks ¶
func (b *BlockBuilder) Blocks() []ContentBlock
func (*BlockBuilder) HasText ¶
func (b *BlockBuilder) HasText() bool
HasText сообщает, есть ли у builder непустой текстовый блок.
func (*BlockBuilder) HasThinking ¶
func (b *BlockBuilder) HasThinking() bool
HasThinking сообщает, начат ли у builder блок thinking.
func (*BlockBuilder) Reset ¶
func (b *BlockBuilder) Reset()
type BuiltinModel ¶
type BuiltinModel struct {
Provider string
ID string
Name string
APIType string
ContextWindow int
MaxTokens int
Reasoning bool
Input []string
}
BuiltinModel — запись каталога для модели с поддержкой tools.
type ChatEvent ¶
type ChatEvent struct {
Type EventType
Token string
ThinkingSignature string
ToolCall *ToolCall
ToolCallDelta string
ToolCallIndex int
ToolCallID string
ToolCallName string
Usage *Usage
// StopReason на EventDone: "" (норма), "length" (лимит вывода),
// "incomplete" (стрим оборвался без finish-сигнала).
StopReason string
Err error
}
type ChatRequest ¶
type CompatSettings ¶
type CompatSettings struct {
SupportsDeveloperRole *bool `json:"supportsDeveloperRole,omitempty"`
SupportsReasoningEffort *bool `json:"supportsReasoningEffort,omitempty"`
// ReasoningAsContent — legacy Stell; предпочтительнее requiresThinkingAsText.
ReasoningAsContent *bool `json:"reasoningAsContent,omitempty"`
// флаги compat
ThinkingFormat *string `json:"thinkingFormat,omitempty"`
ChatTemplateKwargs map[string]any `json:"chatTemplateKwargs,omitempty"`
RequiresThinkingAsText *bool `json:"requiresThinkingAsText,omitempty"`
RequiresReasoningContentOnAssistantMessages *bool `json:"requiresReasoningContentOnAssistantMessages,omitempty"`
SupportsUsageInStreaming *bool `json:"supportsUsageInStreaming,omitempty"`
MaxTokensField *string `json:"maxTokensField,omitempty"`
AllowEmptySignature *bool `json:"allowEmptySignature,omitempty"`
// совместимость OpenAI wire
SupportsStore *bool `json:"supportsStore,omitempty"`
RequiresToolResultName *bool `json:"requiresToolResultName,omitempty"`
RequiresAssistantAfterToolResult *bool `json:"requiresAssistantAfterToolResult,omitempty"`
SupportsStrictMode *bool `json:"supportsStrictMode,omitempty"`
CacheControlFormat *string `json:"cacheControlFormat,omitempty"`
SendSessionAffinityHeaders *bool `json:"sendSessionAffinityHeaders,omitempty"`
SessionAffinityFormat *string `json:"sessionAffinityFormat,omitempty"`
SupportsLongCacheRetention *bool `json:"supportsLongCacheRetention,omitempty"`
OpenRouterRouting map[string]any `json:"openRouterRouting,omitempty"`
VercelGatewayRouting map[string]any `json:"vercelGatewayRouting,omitempty"`
// совместимость Anthropic wire
SupportsEagerToolInputStreaming *bool `json:"supportsEagerToolInputStreaming,omitempty"`
ForceAdaptiveThinking *bool `json:"forceAdaptiveThinking,omitempty"`
SupportsCacheControlOnTools *bool `json:"supportsCacheControlOnTools,omitempty"`
}
CompatSettings — флаги совместимости провайдера (блок compat).
func (CompatSettings) AllowEmptySignatureEnabled ¶
func (c CompatSettings) AllowEmptySignatureEnabled() bool
func (CompatSettings) CacheControlFormatAnthropic ¶
func (c CompatSettings) CacheControlFormatAnthropic() bool
func (CompatSettings) DeveloperRoleEnabled ¶
func (c CompatSettings) DeveloperRoleEnabled() bool
func (CompatSettings) ForceAdaptiveThinkingEnabled ¶
func (c CompatSettings) ForceAdaptiveThinkingEnabled() bool
func (CompatSettings) MaxTokensFieldName ¶
func (c CompatSettings) MaxTokensFieldName() string
func (CompatSettings) ReasoningAsContentEnabled ¶
func (c CompatSettings) ReasoningAsContentEnabled() bool
func (CompatSettings) ReasoningEffortEnabled ¶
func (c CompatSettings) ReasoningEffortEnabled() bool
func (CompatSettings) RequiresAssistantAfterToolResultEnabled ¶
func (c CompatSettings) RequiresAssistantAfterToolResultEnabled() bool
func (CompatSettings) RequiresReasoningContentOnAssistantMessagesEnabled ¶
func (c CompatSettings) RequiresReasoningContentOnAssistantMessagesEnabled() bool
func (CompatSettings) RequiresThinkingAsTextEnabled ¶
func (c CompatSettings) RequiresThinkingAsTextEnabled() bool
func (CompatSettings) RequiresToolResultNameEnabled ¶
func (c CompatSettings) RequiresToolResultNameEnabled() bool
func (CompatSettings) ResolvedSessionAffinityFormat ¶
func (c CompatSettings) ResolvedSessionAffinityFormat() string
func (CompatSettings) ResolvedThinkingFormat ¶
func (c CompatSettings) ResolvedThinkingFormat() string
func (CompatSettings) SendSessionAffinityHeadersEnabled ¶
func (c CompatSettings) SendSessionAffinityHeadersEnabled() bool
func (CompatSettings) SupportsCacheControlOnToolsEnabled ¶
func (c CompatSettings) SupportsCacheControlOnToolsEnabled() bool
func (CompatSettings) SupportsEagerToolInputStreamingEnabled ¶
func (c CompatSettings) SupportsEagerToolInputStreamingEnabled() bool
func (CompatSettings) SupportsLongCacheRetentionEnabled ¶
func (c CompatSettings) SupportsLongCacheRetentionEnabled() bool
func (CompatSettings) SupportsStoreEnabled ¶
func (c CompatSettings) SupportsStoreEnabled() bool
func (CompatSettings) SupportsStrictModeEnabled ¶
func (c CompatSettings) SupportsStrictModeEnabled() bool
func (CompatSettings) SupportsUsageInStreamingEnabled ¶
func (c CompatSettings) SupportsUsageInStreamingEnabled() bool
type ContentBlock ¶
type ContentBlock struct {
Type BlockType `json:"type"`
Text string `json:"text,omitempty"`
ToolCall *ToolCall `json:"toolCall,omitempty"`
Signature string `json:"signature,omitempty"`
}
ContentBlock — блок контента ассистента.
type CostTier ¶
type CostTier struct {
InputTokensAbove int
InputPerM float64
OutputPerM float64
CacheReadPerM float64
CacheWritePerM float64
}
CostTier — runtime-тариф из models.json cost.tiers.
type HTTPHooks ¶
type HTTPHooks interface {
BeforeHeaders(ctx context.Context, provider, model string, h http.Header)
BeforeRequest(ctx context.Context, provider, model string, body []byte)
AfterResponse(ctx context.Context, provider, model string, status int, h http.Header)
}
HTTPHooks перехватывает HTTP-трафик провайдера. Обработчики только in-process (шина хуков): запрос не сериализуется в subprocess-расширения. BeforeHeaders может менять заголовки до отправки.
type HTTPHooksSetter ¶
type HTTPHooksSetter interface {
SetHTTPHooks(HTTPHooks)
}
HTTPHooksSetter реализуется провайдерами с поддержкой HTTP-хуков.
type ImageContent ¶
type InferenceParams ¶
type Message ¶
type Message struct {
Role Role `json:"role"`
Content string `json:"content"`
Blocks []ContentBlock `json:"blocks,omitempty"`
StopReason string `json:"stopReason,omitempty"`
ErrorMessage string `json:"errorMessage,omitempty"`
Images []ImageContent `json:"images,omitempty"`
ToolCalls []ToolCall `json:"toolCalls,omitempty"`
ToolCallID string `json:"toolCallId,omitempty"`
ToolName string `json:"toolName,omitempty"`
}
func AssistantMessage ¶
func AssistantMessage(blocks []ContentBlock, toolCalls []ToolCall, stopReason, errMsg string) Message
AssistantMessage собирает нормализованное сообщение ассистента из blocks.
func PrepareOpenAIMessages ¶
func PrepareOpenAIMessages(msgs []Message, compat CompatSettings) []Message
PrepareOpenAIMessages применяет compat-трансформы replay перед wire-кодированием.
type ModelConfig ¶
type ModelConfig struct {
Name string `json:"name"`
Provider string `json:"provider"`
ProviderID string `json:"providerId,omitempty"`
Model string `json:"model"`
APIBase string `json:"apiBase,omitempty"`
APIType string `json:"apiType,omitempty"`
APIKeyRef string `json:"apiKeyRef,omitempty"`
ContextWindow int `json:"contextWindow,omitempty"`
DefaultParams InferenceParams `json:"defaultParams,omitempty"`
InputCostPerM float64 `json:"inputCostPerM,omitempty"`
OutputCostPerM float64 `json:"outputCostPerM,omitempty"`
Compat CompatSettings `json:"compat,omitempty"`
Reasoning bool `json:"reasoning,omitempty"`
Local bool `json:"local,omitempty"`
ThinkingLevelMap map[string]*string `json:"thinkingLevelMap,omitempty"`
Input []string `json:"input,omitempty"`
Headers map[string]string `json:"headers,omitempty"`
AuthHeader bool `json:"authHeader,omitempty"`
CostTiers []CostTier `json:"-"`
}
func (ModelConfig) SupportsImage ¶
func (m ModelConfig) SupportsImage() bool
SupportsImage сообщает, принимает ли модель изображения на вход.
type Provider ¶
type Provider interface {
Name() string
Chat(ctx context.Context, req ChatRequest) (<-chan ChatEvent, error)
}
Provider — единый интерфейс LLM.
type ReplayOptions ¶
type ReplayOptions struct {
Compat CompatSettings
}
ReplayOptions управляет тем, как assistant-сообщения переигрываются провайдеру.
type Role ¶
type Role string
const ( RoleSystem Role = "system" RoleUser Role = "user" RoleAssistant Role = "assistant" // RoleTool — wire-роль результата инструмента в сессии (toolResult). RoleTool Role = "toolResult" // RoleToolLegacy — устаревшая OpenAI-роль, принимаемая при загрузке. RoleToolLegacy Role = "tool" // RoleBashExecution — запись bash пользователя в контексте сессии. RoleBashExecution Role = "bashExecution" // RoleCustom — сообщение контекста, внедрённое расширением. RoleCustom Role = "custom" )
func NormalizeRole ¶
NormalizeRole приводит legacy-роли к wire-ролям сессии.
type ToolCall ¶
type ToolCall struct {
ID string `json:"id"`
Name string `json:"name"`
Args map[string]any `json:"args"`
}
func ToolCallsFromBlocks ¶
func ToolCallsFromBlocks(blocks []ContentBlock, legacy []ToolCall) []ToolCall
ToolCallsFromBlocks возвращает tool calls из blocks toolCall с fallback на legacy ToolCalls.
type ToolDef ¶
type ToolDef struct {
Name string `json:"name"`
Description string `json:"description"`
Parameters map[string]any `json:"parameters"`
// PromptSnippet — однострочное описание в секции «Available tools» system prompt.
// Без сниппета инструмент туда не попадает.
PromptSnippet string `json:"promptSnippet,omitempty"`
// PromptGuidelines — правила использования, попадающие в секцию «Guidelines»
// (дедупликация между инструментами).
PromptGuidelines []string `json:"promptGuidelines,omitempty"`
}
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package api — общие HTTP wire-транспорты LLM для github.com/stelmakhdigital/stell-ai.
|
Package api — общие HTTP wire-транспорты LLM для github.com/stelmakhdigital/stell-ai. |
|
auth
|
|
|
Package images — генерация изображений через OpenRouter chat+modalities (провайдер openrouter-images).
|
Package images — генерация изображений через OpenRouter chat+modalities (провайдер openrouter-images). |
|
all
Package all регистрирует все first-class фабрики провайдеров github.com/stelmakhdigital/stell-ai.
|
Package all регистрирует все first-class фабрики провайдеров github.com/stelmakhdigital/stell-ai. |
|
anthropic
Package anthropic — транспорт Anthropic Messages API (SSE).
|
Package anthropic — транспорт Anthropic Messages API (SSE). |
|
discover
Package discover — зондирование локальных и удалённых endpoint'ов моделей.
|
Package discover — зондирование локальных и удалённых endpoint'ов моделей. |
|
faux
Package faux — тестовый провайдер со сценариями для e2e и unit-тестов.
|
Package faux — тестовый провайдер со сценариями для e2e и unit-тестов. |
|
mock
Package mock — тестовый провайдер со скриптованными ответами.
|
Package mock — тестовый провайдер со скриптованными ответами. |
|
ollama
Package ollama — локальный провайдер Ollama (/api/chat).
|
Package ollama — локальный провайдер Ollama (/api/chat). |
|
openai
Package openai — провайдер chat/completions, совместимый с OpenAI.
|
Package openai — провайдер chat/completions, совместимый с OpenAI. |
|
radius
Package radius — провайдер шлюза Radius (messages API).
|
Package radius — провайдер шлюза Radius (messages API). |
|
scripts
|
|
|
sync-models-dev
command
Команда sync-models-dev загружает https://models.dev/api.json, пишет overlay и опционально сливает известных провайдеров в models.seed.json (приоритет models.dev).
|
Команда sync-models-dev загружает https://models.dev/api.json, пишет overlay и опционально сливает известных провайдеров в models.seed.json (приоритет models.dev). |