diff --git a/README.md b/README.md index 30ac67d8f..ecb750442 100644 --- a/README.md +++ b/README.md @@ -404,6 +404,7 @@ PicoClaw supports 30+ LLM providers through the `model_list` configuration. Use | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | Required | MiMo models | | [Ollama](https://ollama.com/) | `ollama/` | Not needed | Local models, self-hosted | | [vLLM](https://docs.vllm.ai/) | `vllm/` | Not needed | Local deployment, OpenAI-compatible | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | Not needed | Intel OpenVINO Model Server, OpenAI-compatible | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | Varies | Proxy for 100+ providers | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | Required | Enterprise Azure deployment | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | Device code login | @@ -413,7 +414,7 @@ PicoClaw supports 30+ LLM providers through the `model_list` configuration. Use > \* AWS Bedrock requires build tag: `go build -tags bedrock`. Set `api_base` to a region name (e.g., `us-east-1`) for automatic endpoint resolution across all AWS partitions (aws, aws-cn, aws-us-gov). When using a full endpoint URL instead, you must also configure `AWS_REGION` via environment variable or AWS config/profile.
-Local deployment (Ollama, vLLM, etc.) +Local deployment (Ollama, vLLM, OVMS, etc.) **Ollama:** ```json @@ -441,6 +442,19 @@ PicoClaw supports 30+ LLM providers through the `model_list` configuration. Use } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + For full provider configuration details, see [Providers & Models](docs/guides/providers.md).
diff --git a/ROADMAP.md b/ROADMAP.md index 8c5c0e252..4e34a62ab 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -43,7 +43,7 @@ * **Provider** * [**Architecture Upgrade**](https://github.com/sipeed/picoclaw/issues/283): Refactor from "Vendor-based" to "Protocol-based" classification (e.g., OpenAI-compatible, Ollama-compatible). *(Status: In progress by @Daming, ETA 5 days)* - * **Local Models**: Deep integration with **Ollama**, **vLLM**, **LM Studio**, and **Mistral** (local inference). + * **Local Models**: Deep integration with **Ollama**, **vLLM**, **OVMS**, **LM Studio**, and **Mistral** (local inference). * **Online Models**: Continued support for frontier closed-source models. diff --git a/cmd/picoclaw/internal/model/command.go b/cmd/picoclaw/internal/model/command.go index c412993a0..4de76951b 100644 --- a/cmd/picoclaw/internal/model/command.go +++ b/cmd/picoclaw/internal/model/command.go @@ -30,11 +30,13 @@ Examples: picoclaw model # Show current default model picoclaw model gpt-5.2 # Set gpt-5.2 as default picoclaw model claude-sonnet-4.6 # Set claude-sonnet-4.6 as default - picoclaw model local-model # Set local VLLM server as default + picoclaw model local-model # Set local vLLM server as default + picoclaw model local-ovms # Set local OVMS server as default picoclaw model add -b URL -k KEY # Add a model from a custom endpoint -Note: 'local-model' is a special value for using a local VLLM server -(running at localhost:8000 by default) which does not require an API key.`, +Note: 'local-model' is a built-in entry for a local vLLM server (localhost:8000/v1). + 'local-ovms' is a built-in entry for a local OVMS server (localhost:8000/v3). + Neither requires an API key.`, Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { configPath := internal.GetConfigPath() diff --git a/docs/guides/configuration.fr.md b/docs/guides/configuration.fr.md index 786a0c28f..5923a82ed 100644 --- a/docs/guides/configuration.fr.md +++ b/docs/guides/configuration.fr.md @@ -368,7 +368,7 @@ L'ancienne configuration `providers` est **dépréciée** et a été supprimée PicoClaw route les providers par famille de protocole : -- **Compatible OpenAI** : OpenRouter, Groq, Zhipu, endpoints vLLM et la plupart des autres. +- **Compatible OpenAI** : OpenRouter, Groq, Zhipu, endpoints vLLM, OVMS et la plupart des autres. - **Gemini natif** : Google Gemini via les endpoints natifs `models/*:generateContent` et `models/*:streamGenerateContent`. - **Anthropic** : Comportement natif de l'API Claude. - **Codex/OAuth** : Route d'authentification OAuth/token OpenAI. diff --git a/docs/guides/configuration.ja.md b/docs/guides/configuration.ja.md index 0234edbd7..decd2f0c5 100644 --- a/docs/guides/configuration.ja.md +++ b/docs/guides/configuration.ja.md @@ -369,7 +369,7 @@ HEARTBEAT_OK を返信 ユーザーが直接結果を受信 PicoClaw はプロトコルファミリーで Provider をルーティングします: -- **OpenAI 互換**:OpenRouter、Groq、Zhipu、vLLM スタイルのエンドポイントなど。 +- **OpenAI 互換**:OpenRouter、Groq、Zhipu、vLLM スタイルのエンドポイント、OVMSなど。 - **Gemini ネイティブ**:Google Gemini のネイティブ `models/*:generateContent` / `models/*:streamGenerateContent` エンドポイント。 - **Anthropic**:Claude ネイティブ API の動作。 - **Codex/OAuth**:OpenAI OAuth/トークン認証ルート。 diff --git a/docs/guides/configuration.md b/docs/guides/configuration.md index 28fc7b775..5722feb8d 100644 --- a/docs/guides/configuration.md +++ b/docs/guides/configuration.md @@ -592,6 +592,7 @@ For complete documentation, see [`../security/security_configuration.md`](../sec | **OpenRouter** | `openrouter` | `https://openrouter.ai/api/v1` | OpenAI | [Get Key](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm` | `http://localhost:4000/v1` | OpenAI | Your LiteLLM proxy key | | **VLLM** | `vllm` | `http://localhost:8000/v1` | OpenAI | Local | +| **OVMS** | `ovms` | `http://localhost:8000/v3` | OpenAI | Local (no key needed) | | **Cerebras** | `cerebras` | `https://api.cerebras.ai/v1` | OpenAI | [Get Key](https://cerebras.ai) | | **VolcEngine (Doubao)** | `volcengine` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Get Key](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun` | `https://router.shengsuanyun.com/api/v1` | OpenAI | — | @@ -848,7 +849,7 @@ The old `providers` configuration is **deprecated** and has been removed in V2. PicoClaw routes providers by protocol family: -- **OpenAI-compatible**: OpenRouter, Groq, Zhipu, vLLM-style endpoints, and most others. +- **OpenAI-compatible**: OpenRouter, Groq, Zhipu, vLLM-style endpoints, OVMS, and most others. - **Gemini native**: Google Gemini via the native `models/*:generateContent` and `models/*:streamGenerateContent` endpoints. - **Anthropic**: Claude-native API behavior. - **Codex/OAuth**: OpenAI OAuth/token authentication route. diff --git a/docs/guides/configuration.pt-br.md b/docs/guides/configuration.pt-br.md index e5d904e29..6450d2298 100644 --- a/docs/guides/configuration.pt-br.md +++ b/docs/guides/configuration.pt-br.md @@ -369,7 +369,7 @@ A configuração antiga `providers` está **depreciada** e foi removida no V2. C PicoClaw roteia providers por família de protocolo: -- **Compatível com OpenAI**: OpenRouter, Groq, Zhipu, endpoints vLLM e a maioria dos outros. +- **Compatível com OpenAI**: OpenRouter, Groq, Zhipu, endpoints vLLM, OVMS e a maioria dos outros. - **Gemini nativo**: Google Gemini via endpoints nativos `models/*:generateContent` e `models/*:streamGenerateContent`. - **Anthropic**: Comportamento nativo da API Claude. - **Codex/OAuth**: Rota de autenticação OAuth/token OpenAI. diff --git a/docs/guides/configuration.vi.md b/docs/guides/configuration.vi.md index d905b6d2b..89d0bd34a 100644 --- a/docs/guides/configuration.vi.md +++ b/docs/guides/configuration.vi.md @@ -369,7 +369,7 @@ Cấu hình `providers` cũ đã **bị deprecated** và đã được loại b PicoClaw định tuyến provider theo họ giao thức: -- **Tương thích OpenAI**: OpenRouter, Groq, Zhipu, endpoint kiểu vLLM và hầu hết các provider khác. +- **Tương thích OpenAI**: OpenRouter, Groq, Zhipu, endpoint kiểu vLLM, OVMS và hầu hết các provider khác. - **Gemini native**: Google Gemini qua các endpoint native `models/*:generateContent` và `models/*:streamGenerateContent`. - **Anthropic**: Hành vi API Claude gốc. - **Codex/OAuth**: Tuyến xác thực OAuth/token OpenAI. diff --git a/docs/guides/configuration.zh.md b/docs/guides/configuration.zh.md index c41c3dae0..c0b185345 100644 --- a/docs/guides/configuration.zh.md +++ b/docs/guides/configuration.zh.md @@ -452,6 +452,7 @@ Agent 读取 HEARTBEAT.md | **OpenRouter** | `openrouter` | `https://openrouter.ai/api/v1` | OpenAI | [获取](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm` | `http://localhost:4000/v1` | OpenAI | 你的 LiteLLM 代理 Key | | **VLLM** | `vllm` | `http://localhost:8000/v1` | OpenAI | 本地 | +| **OVMS** | `ovms` | `http://localhost:8000/v3` | OpenAI | 本地(无需密钥) | | **Cerebras** | `cerebras` | `https://api.cerebras.ai/v1` | OpenAI | [获取](https://cerebras.ai) | | **火山引擎 (豆包)** | `volcengine` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [获取](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun` | `https://router.shengsuanyun.com/api/v1` | OpenAI | — | @@ -674,7 +675,7 @@ Agent 读取 HEARTBEAT.md PicoClaw 按协议族路由提供商: -- **OpenAI 兼容**:OpenRouter、Groq、智谱、vLLM 风格端点及大多数其他提供商。 +- **OpenAI 兼容**:OpenRouter、Groq、智谱、vLLM 风格端点、OVMS 及大多数其他提供商。 - **Gemini 原生**:Google Gemini 通过原生 `models/*:generateContent` 和 `models/*:streamGenerateContent` 端点接入。 - **Anthropic**:Claude 原生 API 行为。 - **Codex/OAuth**:OpenAI OAuth/Token 认证路由。 diff --git a/docs/guides/providers.fr.md b/docs/guides/providers.fr.md index aff600351..3ff122a1f 100644 --- a/docs/guides/providers.fr.md +++ b/docs/guides/providers.fr.md @@ -55,6 +55,7 @@ Cette conception permet également le **support multi-agents** avec une sélecti | **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Get Key](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm/` | `http://localhost:4000/v1` | OpenAI | Your LiteLLM proxy key | | **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local | +| **OVMS** | `ovms/` | `http://localhost:8000/v3` | OpenAI | Local (no key needed) | | **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Get Key](https://cerebras.ai) | | **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Get Key](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - | @@ -105,7 +106,7 @@ Cette conception permet également le **support multi-agents** avec une sélecti |-------|------|--------|-------------| | `model_name` | string | Oui | Nom unique pour référencer ce modèle dans la config agent | | `model` | string | Oui | Identifiant fournisseur/modèle (ex : `openai/gpt-5.4`, `azure/gpt-5.4`, `anthropic/claude-sonnet-4.6`) | -| `api_keys` | string[] | Oui* | Clé(s) API pour l'authentification. Plusieurs clés permettent la rotation par requête. Non requis pour les fournisseurs locaux (Ollama, LM Studio, VLLM) | +| `api_keys` | string[] | Oui* | Clé(s) API pour l'authentification. Plusieurs clés permettent la rotation par requête. Non requis pour les fournisseurs locaux (Ollama, LM Studio, VLLM, OVMS) | | `api_base` | string | Non | Remplace l'URL de base API par défaut | | `proxy` | string | Non | URL du proxy HTTP pour cette entrée de modèle | | `user_agent` | string | Non | En-tête `User-Agent` personnalisé pour les requêtes API (supporté par les providers compatibles OpenAI, Gemini, Anthropic et Azure) | @@ -298,7 +299,7 @@ Pour un guide de migration détaillé, voir [migration/model-list-migration.md]( PicoClaw route les fournisseurs par famille de protocoles : -- Protocole compatible OpenAI : OpenRouter, passerelles compatibles OpenAI, Groq, Zhipu et endpoints de type vLLM. +- Protocole compatible OpenAI : OpenRouter, passerelles compatibles OpenAI, Groq, Zhipu et endpoints de type vLLM et OVMS. - Protocole Gemini natif : Google Gemini via les endpoints natifs `models/*:generateContent` et `models/*:streamGenerateContent`. - Protocole Anthropic : Comportement natif de l'API Claude. - Chemin Codex/OAuth : Route d'authentification OAuth/token OpenAI. diff --git a/docs/guides/providers.ja.md b/docs/guides/providers.ja.md index fecc74519..1e6bbe346 100644 --- a/docs/guides/providers.ja.md +++ b/docs/guides/providers.ja.md @@ -56,6 +56,7 @@ | **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [キーを取得](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm/` | `http://localhost:4000/v1` | OpenAI | LiteLLM プロキシキー | | **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | ローカル | +| **OVMS** | `ovms/` | `http://localhost:8000/v3` | OpenAI | ローカル(キー不要) | | **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [キーを取得](https://cerebras.ai) | | **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [キーを取得](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - | @@ -106,7 +107,7 @@ |-----------|------|------|------| | `model_name` | string | はい | agent 設定でこのモデルを参照するための一意の名前 | | `model` | string | はい | ベンダー/モデル識別子(例:`openai/gpt-5.4`、`azure/gpt-5.4`、`anthropic/claude-sonnet-4.6`) | -| `api_keys` | string[] | はい* | 認証キー。複数キーでリクエストごとのローテーションが可能。ローカル provider(Ollama、LM Studio、VLLM)には不要 | +| `api_keys` | string[] | はい* | 認証キー。複数キーでリクエストごとのローテーションが可能。ローカル provider(Ollama、LM Studio、VLLM、OVMS)には不要 | | `api_base` | string | いいえ | デフォルトの API エンドポイント URL を上書き | | `proxy` | string | いいえ | このモデルエントリの HTTP プロキシ URL | | `user_agent` | string | いいえ | カスタム `User-Agent` リクエストヘッダー(OpenAI 互換、Gemini、Anthropic、Azure provider で対応) | @@ -310,7 +311,7 @@ PicoClaw はリクエスト送信前に外側の `litellm/` プレフィック PicoClaw はプロトコルファミリーごとに Provider をルーティングします: -- OpenAI 互換プロトコル:OpenRouter、OpenAI 互換ゲートウェイ、Groq、Zhipu、vLLM スタイルのエンドポイント。 +- OpenAI 互換プロトコル:OpenRouter、OpenAI 互換ゲートウェイ、Groq、Zhipu、vLLM スタイルのエンドポイント、OVMS。 - Gemini ネイティブプロトコル:Google Gemini のネイティブ `models/*:generateContent` / `models/*:streamGenerateContent` エンドポイント。 - Anthropic プロトコル:Claude ネイティブ API 動作。 - Codex/OAuth パス:OpenAI OAuth/Token 認証ルート。 diff --git a/docs/guides/providers.md b/docs/guides/providers.md index 7b078373d..678fd32fb 100644 --- a/docs/guides/providers.md +++ b/docs/guides/providers.md @@ -64,6 +64,7 @@ This design also enables **multi-agent support** with flexible provider selectio | **OpenRouter** | `openrouter` | `https://openrouter.ai/api/v1` | OpenAI | [Get Key](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm` | `http://localhost:4000/v1` | OpenAI | Your LiteLLM proxy key | | **VLLM** | `vllm` | `http://localhost:8000/v1` | OpenAI | Local | +| **OVMS** | `ovms` | `http://localhost:8000/v3` | OpenAI | Local (no key needed) | | **Cerebras** | `cerebras` | `https://api.cerebras.ai/v1` | OpenAI | [Get Key](https://cerebras.ai) | | **VolcEngine (Doubao)** | `volcengine` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Get Key](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - | @@ -121,7 +122,7 @@ This design also enables **multi-agent support** with flexible provider selectio | `model_name` | string | Yes | Unique name used to reference this model in agent config | | `provider` | string | No | Preferred provider identifier. When present, PicoClaw sends `model` unchanged to that provider | | `model` | string | Yes | Native model ID when `provider` is set. If `provider` is omitted, the legacy `provider/model` form is still supported | -| `api_keys` | string[] | Yes* | API key(s) for authentication. Multiple keys enable per-request rotation. Not required for local providers (Ollama, LM Studio, VLLM) | +| `api_keys` | string[] | Yes* | API key(s) for authentication. Multiple keys enable per-request rotation. Not required for local providers (Ollama, LM Studio, VLLM, OVMS) | | `api_base` | string | No | Override the default API endpoint URL | | `proxy` | string | No | HTTP proxy URL for this model entry | | `user_agent` | string | No | Custom `User-Agent` header sent with API requests (supported by OpenAI-compatible, Gemini, Anthropic, and Azure providers) | @@ -476,7 +477,7 @@ For detailed migration guide, see [migration/model-list-migration.md](../migrati PicoClaw routes providers by protocol family: -- OpenAI-compatible protocol: OpenRouter, OpenAI-compatible gateways, Groq, Zhipu, and vLLM-style endpoints. +- OpenAI-compatible protocol: OpenRouter, OpenAI-compatible gateways, Groq, Zhipu, OVMS, and vLLM-style endpoints. - Gemini native protocol: Google Gemini via the native `models/*:generateContent` and `models/*:streamGenerateContent` endpoints. - Anthropic protocol: Claude-native API behavior. - Codex/OAuth path: OpenAI OAuth/token authentication route. diff --git a/docs/guides/providers.pt-br.md b/docs/guides/providers.pt-br.md index 0d45dc309..3294e0a9c 100644 --- a/docs/guides/providers.pt-br.md +++ b/docs/guides/providers.pt-br.md @@ -55,6 +55,7 @@ Este design também permite **suporte multi-agente** com seleção flexível de | **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Get Key](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm/` | `http://localhost:4000/v1` | OpenAI | Your LiteLLM proxy key | | **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local | +| **OVMS** | `ovms/` | `http://localhost:8000/v3` | OpenAI | Local | | **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Get Key](https://cerebras.ai) | | **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Get Key](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - | @@ -105,7 +106,7 @@ Este design também permite **suporte multi-agente** com seleção flexível de |-------|------|-------------|-----------| | `model_name` | string | Sim | Nome único para referenciar este modelo na config do agent | | `model` | string | Sim | Identificador fornecedor/modelo (ex: `openai/gpt-5.4`, `azure/gpt-5.4`, `anthropic/claude-sonnet-4.6`) | -| `api_keys` | string[] | Sim* | Chave(s) API para autenticação. Múltiplas chaves permitem rotação por requisição. Não necessário para providers locais (Ollama, LM Studio, VLLM) | +| `api_keys` | string[] | Sim* | Chave(s) API para autenticação. Múltiplas chaves permitem rotação por requisição. Não necessário para providers locais (Ollama, LM Studio, VLLM, OVMS) | | `api_base` | string | Não | Substitui a URL base da API padrão | | `proxy` | string | Não | URL do proxy HTTP para esta entrada de modelo | | `user_agent` | string | Não | Cabeçalho `User-Agent` personalizado enviado com requisições API (suportado por providers OpenAI-compatible, Gemini, Anthropic e Azure) | @@ -298,7 +299,7 @@ Para guia de migração detalhado, veja [migration/model-list-migration.md](../m O PicoClaw roteia provedores por família de protocolo: -- Protocolo compatível com OpenAI: OpenRouter, gateways compatíveis com OpenAI, Groq, Zhipu e endpoints estilo vLLM. +- Protocolo compatível com OpenAI: OpenRouter, gateways compatíveis com OpenAI, Groq, Zhipu, endpoints estilo vLLM e OVMS. - Protocolo Gemini nativo: Google Gemini via endpoints nativos `models/*:generateContent` e `models/*:streamGenerateContent`. - Protocolo Anthropic: Comportamento nativo da API Claude. - Caminho Codex/OAuth: Rota de autenticação OAuth/token da OpenAI. diff --git a/docs/guides/providers.vi.md b/docs/guides/providers.vi.md index c354461cf..2881b7b9a 100644 --- a/docs/guides/providers.vi.md +++ b/docs/guides/providers.vi.md @@ -55,6 +55,7 @@ Thiết kế này cũng cho phép **hỗ trợ đa agent** với lựa chọn pr | **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Get Key](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm/` | `http://localhost:4000/v1` | OpenAI | Your LiteLLM proxy key | | **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local | +| **OVMS** | `ovms/` | `http://localhost:8000/v3` | OpenAI | Local | | **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Get Key](https://cerebras.ai) | | **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Get Key](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - | @@ -105,7 +106,7 @@ Thiết kế này cũng cho phép **hỗ trợ đa agent** với lựa chọn pr |--------|------|----------|------| | `model_name` | string | Có | Tên duy nhất để tham chiếu model này trong cấu hình agent | | `model` | string | Có | Định danh nhà cung cấp/model (ví dụ: `openai/gpt-5.4`, `azure/gpt-5.4`, `anthropic/claude-sonnet-4.6`) | -| `api_keys` | string[] | Có* | Khóa API xác thực. Nhiều khóa cho phép xoay vòng theo yêu cầu. Không cần thiết cho provider nội bộ (Ollama, LM Studio, VLLM) | +| `api_keys` | string[] | Có* | Khóa API xác thực. Nhiều khóa cho phép xoay vòng theo yêu cầu. Không cần thiết cho provider nội bộ (Ollama, LM Studio, VLLM, OVMS) | | `api_base` | string | Không | Ghi đè URL endpoint API mặc định | | `proxy` | string | Không | URL proxy HTTP cho entry model này | | `user_agent` | string | Không | Header `User-Agent` tùy chỉnh gửi với yêu cầu API (được hỗ trợ bởi provider OpenAI-compatible, Gemini, Anthropic và Azure) | @@ -298,7 +299,7 @@ Cấu hình `providers` cũ đã **bị deprecated** và đã được loại b PicoClaw định tuyến provider theo họ giao thức: -- Giao thức tương thích OpenAI: OpenRouter, gateway tương thích OpenAI, Groq, Zhipu, và endpoint kiểu vLLM. +- Giao thức tương thích OpenAI: OpenRouter, gateway tương thích OpenAI, Groq, Zhipu, endpoint kiểu vLLM và OVMS. - Giao thức Gemini native: Google Gemini qua các endpoint native `models/*:generateContent` và `models/*:streamGenerateContent`. - Giao thức Anthropic: Hành vi API native của Claude. - Đường dẫn Codex/OAuth: Tuyến xác thực OAuth/token của OpenAI. diff --git a/docs/guides/providers.zh.md b/docs/guides/providers.zh.md index 4bab65f6b..bfe5a595a 100644 --- a/docs/guides/providers.zh.md +++ b/docs/guides/providers.zh.md @@ -62,6 +62,7 @@ | **OpenRouter** | `openrouter` | `https://openrouter.ai/api/v1` | OpenAI | [获取密钥](https://openrouter.ai/keys) | | **LiteLLM Proxy** | `litellm` | `http://localhost:4000/v1` | OpenAI | 你的 LiteLLM 代理密钥 | | **VLLM** | `vllm` | `http://localhost:8000/v1` | OpenAI | 本地 | +| **OVMS** | `ovms` | `http://localhost:8000/v3` | OpenAI | 本地(无需密钥) | | **Cerebras** | `cerebras` | `https://api.cerebras.ai/v1` | OpenAI | [获取密钥](https://cerebras.ai) | | **火山引擎(Doubao)** | `volcengine` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [获取密钥](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) | | **神算云** | `shengsuanyun` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - | @@ -118,7 +119,7 @@ | `model_name` | string | 是 | 在 agent 配置中引用此模型的唯一名称 | | `provider` | string | 否 | 推荐的 provider 标识。设置后,PicoClaw 会将 `model` 原样发送给该 provider | | `model` | string | 是 | 当设置 `provider` 时,这里填写 provider 原生模型 ID。若未设置 `provider`,仍兼容旧的 `provider/model` 写法 | -| `api_keys` | string[] | 是* | 认证密钥。多个密钥可按请求轮换。本地 provider(Ollama、LM Studio、VLLM)不需要 | +| `api_keys` | string[] | 是* | 认证密钥。多个密钥可按请求轮换。本地 provider(Ollama、LM Studio、VLLM、OVMS)不需要 | | `api_base` | string | 否 | 覆盖默认的 API 端点 URL | | `proxy` | string | 否 | 此模型条目的 HTTP 代理 URL | | `user_agent` | string | 否 | 自定义 `User-Agent` 请求头(支持 OpenAI 兼容、Gemini、Anthropic 和 Azure provider) | @@ -421,7 +422,7 @@ PicoClaw 按下面的规则解析 `provider` 和最终发给上游的模型 ID PicoClaw 按协议族路由 Provider: -- OpenAI 兼容协议:OpenRouter、OpenAI 兼容网关、Groq、智谱、vLLM 风格端点。 +- OpenAI 兼容协议:OpenRouter、OpenAI 兼容网关、Groq、智谱、vLLM 风格端点和 OVMS。 - Gemini 原生协议:Google Gemini 通过原生 `models/*:generateContent` 和 `models/*:streamGenerateContent` 端点接入。 - Anthropic 协议:Claude 原生 API 行为。 - Codex/OAuth 路径:OpenAI OAuth/Token 认证路由。 diff --git a/docs/project/README.fr.md b/docs/project/README.fr.md index b02067d2a..444b18f40 100644 --- a/docs/project/README.fr.md +++ b/docs/project/README.fr.md @@ -403,13 +403,14 @@ PicoClaw supporte plus de 30 providers LLM via la configuration `model_list`. Ut | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | Requise | Modèles MiMo | | [Ollama](https://ollama.com/) | `ollama/` | Non requise | Modèles locaux, auto-hébergé | | [vLLM](https://docs.vllm.ai/) | `vllm/` | Non requise | Déploiement local, compatible OpenAI | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | Non requise | Intel OpenVINO Model Server, compatible OpenAI | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | Variable | Proxy pour 100+ providers | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | Requise | Déploiement Azure entreprise | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | Connexion par code appareil | | [Antigravity](https://console.cloud.google.com/) | `antigravity/` | OAuth | Google Cloud AI |
-Déploiement local (Ollama, vLLM, etc.) +Déploiement local (Ollama, vLLM, OVMS, etc.) **Ollama :** ```json @@ -437,6 +438,19 @@ PicoClaw supporte plus de 30 providers LLM via la configuration `model_list`. Ut } ``` +**OVMS (OpenVINO Model Server) :** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + Pour les détails complets de configuration des providers, voir [Providers & Models](../guides/providers.fr.md).
diff --git a/docs/project/README.id.md b/docs/project/README.id.md index 49c64e74c..6a5246f48 100644 --- a/docs/project/README.id.md +++ b/docs/project/README.id.md @@ -398,13 +398,14 @@ PicoClaw mendukung 30+ provider LLM melalui konfigurasi `model_list`. Gunakan fo | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | Diperlukan | Model MiMo | | [Ollama](https://ollama.com/) | `ollama/` | Tidak perlu | Model lokal, self-hosted | | [vLLM](https://docs.vllm.ai/) | `vllm/` | Tidak perlu | Deploy lokal, kompatibel OpenAI | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | Tidak perlu | Intel OpenVINO Model Server, kompatibel OpenAI | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | Bervariasi | Proxy untuk 100+ provider | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | Diperlukan | Deploy Azure enterprise | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | Login dengan device code | | [Antigravity](https://console.cloud.google.com/) | `antigravity/` | OAuth | Google Cloud AI |
-Deploy lokal (Ollama, vLLM, dll.) +Deploy lokal (Ollama, vLLM, OVMS, dll.) **Ollama:** ```json @@ -432,6 +433,19 @@ PicoClaw mendukung 30+ provider LLM melalui konfigurasi `model_list`. Gunakan fo } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + Untuk detail konfigurasi provider lengkap, lihat [Providers & Models](../guides/providers.md).
diff --git a/docs/project/README.it.md b/docs/project/README.it.md index 0cf6cf8db..a21dc3524 100644 --- a/docs/project/README.it.md +++ b/docs/project/README.it.md @@ -398,13 +398,14 @@ PicoClaw supporta 30+ provider LLM tramite la configurazione `model_list`. Usa i | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | Richiesta | Modelli MiMo | | [Ollama](https://ollama.com/) | `ollama/` | Non necessaria | Modelli locali, self-hosted | | [vLLM](https://docs.vllm.ai/) | `vllm/` | Non necessaria | Deploy locale, compatibile OpenAI | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | Non necessaria | Intel OpenVINO Model Server, compatibile OpenAI | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | Variabile | Proxy per 100+ provider | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | Richiesta | Deploy Azure enterprise | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | Login con device code | | [Antigravity](https://console.cloud.google.com/) | `antigravity/` | OAuth | Google Cloud AI |
-Deploy locale (Ollama, vLLM, ecc.) +Deploy locale (Ollama, vLLM, OVMS, ecc.) **Ollama:** ```json @@ -432,6 +433,19 @@ PicoClaw supporta 30+ provider LLM tramite la configurazione `model_list`. Usa i } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + Per i dettagli completi sulla configurazione dei provider, vedi [Provider & Modelli](../guides/providers.md).
diff --git a/docs/project/README.ja.md b/docs/project/README.ja.md index 6e3060688..8283698e2 100644 --- a/docs/project/README.ja.md +++ b/docs/project/README.ja.md @@ -399,13 +399,14 @@ PicoClaw は `model_list` 設定を通じて 30 以上の LLM Provider をサポ | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | 必須 | MiMo モデル | | [Ollama](https://ollama.com/) | `ollama/` | 不要 | ローカルモデル、セルフホスト | | [vLLM](https://docs.vllm.ai/) | `vllm/` | 不要 | ローカルデプロイ、OpenAI 互換 | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | 不要 | Intel OpenVINO Model Server、OpenAI 互換 | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | 場合による | 100 以上の Provider のプロキシ | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | 必須 | エンタープライズ Azure デプロイ | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | デバイスコードログイン | | [Antigravity](https://console.cloud.google.com/) | `antigravity/` | OAuth | Google Cloud AI |
-ローカルデプロイ(Ollama、vLLM など) +ローカルデプロイ(Ollama、vLLM、OVMS など) **Ollama:** ```json @@ -433,6 +434,19 @@ PicoClaw は `model_list` 設定を通じて 30 以上の LLM Provider をサポ } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + Provider の完全な設定詳細は [Provider とモデル](../guides/providers.ja.md) を参照してください。
diff --git a/docs/project/README.ms.md b/docs/project/README.ms.md index 73c428f11..16ca486bf 100644 --- a/docs/project/README.ms.md +++ b/docs/project/README.ms.md @@ -394,6 +394,7 @@ PicoClaw menyokong 30+ penyedia LLM melalui konfigurasi `model_list`. Gunakan fo | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | Diperlukan | Model MiMo | | [Ollama](https://ollama.com/) | `ollama/` | Tidak perlu | Model tempatan, self-hosted | | [vLLM](https://docs.vllm.ai/) | `vllm/` | Tidak perlu | Deployment tempatan, serasi OpenAI | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | Tidak perlu | Intel OpenVINO Model Server, serasi OpenAI | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | Berbeza | Proksi untuk 100+ penyedia | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | Diperlukan | Deployment Azure perusahaan | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | Log masuk kod peranti | @@ -403,7 +404,7 @@ PicoClaw menyokong 30+ penyedia LLM melalui konfigurasi `model_list`. Gunakan fo > \* AWS Bedrock memerlukan tag binaan: `go build -tags bedrock`. Tetapkan `api_base` kepada nama rantau (cth. `us-east-1`) untuk resolusi endpoint automatik merentasi semua partition AWS. Apabila menggunakan URL endpoint penuh, anda juga perlu mengkonfigurasi `AWS_REGION` melalui pemboleh ubah persekitaran.
-Deployment tempatan (Ollama, vLLM, dll.) +Deployment tempatan (Ollama, vLLM, OVMS, dll.) **Ollama:** ```json @@ -431,6 +432,19 @@ PicoClaw menyokong 30+ penyedia LLM melalui konfigurasi `model_list`. Gunakan fo } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + Untuk butiran konfigurasi penyedia penuh, lihat [Penyedia & Model](../guides/providers.md).
diff --git a/docs/project/README.pt-br.md b/docs/project/README.pt-br.md index 74cb967de..c81100a98 100644 --- a/docs/project/README.pt-br.md +++ b/docs/project/README.pt-br.md @@ -399,13 +399,14 @@ O PicoClaw suporta mais de 30 providers de LLM através da configuração `model | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | Obrigatória | Modelos MiMo | | [Ollama](https://ollama.com/) | `ollama/` | Não necessária | Modelos locais, self-hosted | | [vLLM](https://docs.vllm.ai/) | `vllm/` | Não necessária | Implantação local, compatível com OpenAI | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | Não necessária | Intel OpenVINO Model Server, compatível com OpenAI | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | Varia | Proxy para 100+ providers | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | Obrigatória | Implantação Azure Enterprise | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | Login por código de dispositivo | | [Antigravity](https://console.cloud.google.com/) | `antigravity/` | OAuth | Google Cloud AI |
-Implantação local (Ollama, vLLM, etc.) +Implantação local (Ollama, vLLM, OVMS, etc.) **Ollama:** ```json @@ -433,6 +434,19 @@ O PicoClaw suporta mais de 30 providers de LLM através da configuração `model } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + Para detalhes completos de configuração de providers, veja [Providers & Models](../guides/providers.pt-br.md).
diff --git a/docs/project/README.vi.md b/docs/project/README.vi.md index 743069021..1bdfd3207 100644 --- a/docs/project/README.vi.md +++ b/docs/project/README.vi.md @@ -399,13 +399,14 @@ PicoClaw hỗ trợ 30+ Provider LLM thông qua cấu hình `model_list`. Sử d | [Xiaomi MiMo](https://platform.xiaomimimo.com/) | `mimo/` | Bắt buộc | Mô hình MiMo | | [Ollama](https://ollama.com/) | `ollama/` | Không cần | Mô hình cục bộ, tự lưu trữ | | [vLLM](https://docs.vllm.ai/) | `vllm/` | Không cần | Triển khai cục bộ, tương thích OpenAI | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | Không cần | Intel OpenVINO Model Server, tương thích OpenAI | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | Tùy | Proxy cho 100+ provider | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | Bắt buộc | Triển khai Azure doanh nghiệp | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | Đăng nhập bằng device code | | [Antigravity](https://console.cloud.google.com/) | `antigravity/` | OAuth | Google Cloud AI |
-Triển khai cục bộ (Ollama, vLLM, v.v.) +Triển khai cục bộ (Ollama, vLLM, OVMS, v.v.) **Ollama:** ```json @@ -433,6 +434,19 @@ PicoClaw hỗ trợ 30+ Provider LLM thông qua cấu hình `model_list`. Sử d } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + Để biết chi tiết cấu hình provider đầy đủ, xem [Providers & Models](../guides/providers.vi.md).
diff --git a/docs/project/README.zh.md b/docs/project/README.zh.md index 253bb84ed..88c134a29 100644 --- a/docs/project/README.zh.md +++ b/docs/project/README.zh.md @@ -399,13 +399,14 @@ PicoClaw 通过 `model_list` 配置支持 30+ LLM Provider,使用 `协议/模 | [小米 MiMo](https://platform.xiaomimimo.com/) | `mimo/` | 必填 | MiMo 系列模型 | | [Ollama](https://ollama.com/) | `ollama/` | 无需 | 本地模型,自托管 | | [vLLM](https://docs.vllm.ai/) | `vllm/` | 无需 | 本地部署,兼容 OpenAI | +| [OVMS](https://docs.openvino.ai/2026/model-server/ovms_docs_llm_quickstart.html) | `ovms/` | 无需 | Intel OpenVINO Model Server,兼容 OpenAI | | [LiteLLM](https://docs.litellm.ai/) | `litellm/` | 视情况 | 100+ Provider 代理 | | [Azure OpenAI](https://portal.azure.com/) | `azure/` | 必填 | 企业级 Azure 部署 | | [GitHub Copilot](https://github.com/features/copilot) | `github-copilot/` | OAuth | 设备码登录 | | [Antigravity](https://console.cloud.google.com/) | `antigravity/` | OAuth | Google Cloud AI |
-本地部署(Ollama、vLLM 等) +本地部署(Ollama、vLLM、OVMS 等) **Ollama:** ```json @@ -433,6 +434,19 @@ PicoClaw 通过 `model_list` 配置支持 30+ LLM Provider,使用 `协议/模 } ``` +**OVMS (OpenVINO Model Server):** +```json +{ + "model_list": [ + { + "model_name": "local-ovms", + "model": "ovms/your-model", + "api_base": "http://localhost:8000/v3" + } + ] +} +``` + 完整 Provider 配置详情请参阅 [Providers & Models](../guides/providers.zh.md)。
diff --git a/pkg/audio/asr/asr.go b/pkg/audio/asr/asr.go index 1482f40bb..ae0a94c37 100644 --- a/pkg/audio/asr/asr.go +++ b/pkg/audio/asr/asr.go @@ -26,7 +26,7 @@ func supportsAudioTranscription(modelCfg *config.ModelConfig) bool { case "openai", "azure", "azure-openai", "litellm", "openrouter", "groq", "zhipu", "gemini", "nvidia", "ollama", "moonshot", "shengsuanyun", "deepseek", "cerebras", - "vivgrid", "volcengine", "vllm", "qwen", "qwen-portal", "qwen-intl", "qwen-international", "dashscope-intl", + "vivgrid", "volcengine", "vllm", "ovms", "qwen", "qwen-portal", "qwen-intl", "qwen-international", "dashscope-intl", "qwen-us", "dashscope-us", "mistral", "avian", "minimax", "longcat", "modelscope", "novita", "coding-plan", "alibaba-coding", "qwen-coding", "zai": // These protocols all go through the OpenAI-compatible or Azure provider path in @@ -47,7 +47,7 @@ func supportsWhisperTranscription(modelCfg *config.ModelConfig) bool { switch protocol { case "openai", "litellm", "openrouter", "groq", "zhipu", "gemini", "nvidia", "ollama", "moonshot", "shengsuanyun", "deepseek", "cerebras", - "vivgrid", "volcengine", "vllm", "qwen", "qwen-portal", "qwen-intl", "qwen-international", "dashscope-intl", + "vivgrid", "volcengine", "vllm", "ovms", "qwen", "qwen-portal", "qwen-intl", "qwen-international", "dashscope-intl", "qwen-us", "dashscope-us", "mistral", "avian", "minimax", "longcat", "modelscope", "novita", "coding-plan", "alibaba-coding", "qwen-coding", "zai", "mimo": return true diff --git a/pkg/audio/asr/asr_test.go b/pkg/audio/asr/asr_test.go index 0970d69f4..42e150e4e 100644 --- a/pkg/audio/asr/asr_test.go +++ b/pkg/audio/asr/asr_test.go @@ -206,6 +206,35 @@ func TestDetectTranscriber(t *testing.T) { }, wantName: "audio-model", }, + { + name: "ovms voice model name selects audio model transcriber", + cfg: &config.Config{ + Voice: config.VoiceConfig{ModelName: "local-ovms"}, + ModelList: []*config.ModelConfig{ + { + ModelName: "local-ovms", + Model: "ovms/custom-model", + APIBase: "http://localhost:8000/v3", + }, + }, + }, + wantName: "audio-model", + }, + { + name: "ovms voice model name with whisper model selects whisper transcriber", + cfg: &config.Config{ + Voice: config.VoiceConfig{ModelName: "local-ovms"}, + ModelList: []*config.ModelConfig{ + { + ModelName: "local-ovms", + Model: "ovms/whisper-large-v3", + APIBase: "http://localhost:8000/v3", + APIKeys: config.SimpleSecureStrings("sk-ovms-test"), + }, + }, + }, + wantName: "whisper", + }, } for _, tc := range tests { diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 8e2494ae5..ac4161a07 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -273,6 +273,14 @@ func DefaultConfig() *Config { APIBase: "http://localhost:8000/v1", }, + // OVMS (local) - http://localhost:8000 + { + ModelName: "local-ovms", + Provider: "ovms", + Model: "custom-model", + APIBase: "http://localhost:8000/v3", + }, + // LM Studio (local) - http://localhost:1234 { ModelName: "lmstudio-local", diff --git a/pkg/providers/factory_provider.go b/pkg/providers/factory_provider.go index a59e2de25..ddb755bef 100644 --- a/pkg/providers/factory_provider.go +++ b/pkg/providers/factory_provider.go @@ -54,6 +54,7 @@ var protocolMetaByName = map[string]protocolMeta{ "alibaba-coding-anthropic": {defaultAPIBase: "https://coding-intl.dashscope.aliyuncs.com/apps/anthropic"}, "zai": {defaultAPIBase: "https://api.z.ai/api/coding/paas/v4"}, "vllm": {defaultAPIBase: "http://localhost:8000/v1", emptyAPIKeyAllowed: true}, + "ovms": {defaultAPIBase: "http://localhost:8000/v3", emptyAPIKeyAllowed: true}, "mistral": {defaultAPIBase: "https://api.mistral.ai/v1"}, "avian": {defaultAPIBase: "https://api.avian.io/v1"}, "minimax": {defaultAPIBase: "https://api.minimaxi.com/v1"}, @@ -248,7 +249,7 @@ func CreateProviderFromConfig(cfg *config.ModelConfig) (LLMProvider, string, err case "litellm", "lmstudio", "openrouter", "groq", "zhipu", "nvidia", "venice", "ollama", "moonshot", "shengsuanyun", "deepseek", "cerebras", - "vivgrid", "volcengine", "vllm", "qwen", "qwen-portal", "qwen-intl", "qwen-international", "dashscope-intl", + "vivgrid", "volcengine", "vllm", "ovms", "qwen", "qwen-portal", "qwen-intl", "qwen-international", "dashscope-intl", "qwen-us", "dashscope-us", "mistral", "avian", "longcat", "modelscope", "novita", "coding-plan", "alibaba-coding", "qwen-coding", "zai", "mimo": // All other OpenAI-compatible HTTP providers diff --git a/pkg/providers/factory_provider_test.go b/pkg/providers/factory_provider_test.go index 3d3c30ce0..72632e37f 100644 --- a/pkg/providers/factory_provider_test.go +++ b/pkg/providers/factory_provider_test.go @@ -199,6 +199,7 @@ func TestCreateProviderFromConfig_DefaultAPIBase(t *testing.T) { {"vivgrid", "vivgrid"}, {"qwen", "qwen"}, {"vllm", "vllm"}, + {"ovms", "ovms"}, {"deepseek", "deepseek"}, {"ollama", "ollama"}, {"lmstudio", "lmstudio"}, @@ -316,6 +317,20 @@ func TestCreateProviderFromConfig_LocalProviders(t *testing.T) { apiKey: "", wantModelID: "Qwen/Qwen3-8B", }, + { + name: "OVMS with API key", + modelName: "test-ovms", + model: "ovms/llama3", + apiKey: "test-key", + wantModelID: "llama3", + }, + { + name: "OVMS without API key", + modelName: "test-ovms", + model: "ovms/llama3", + apiKey: "", + wantModelID: "llama3", + }, } for _, tt := range tests { diff --git a/web/README.md b/web/README.md index 2a57524e0..b584794ca 100644 --- a/web/README.md +++ b/web/README.md @@ -341,7 +341,7 @@ Check these in the dashboard: - a default model is selected - the model has credentials or OAuth state -- local models such as Ollama or vLLM are reachable +- local models such as Ollama, vLLM, or OVMS are reachable ### The launcher cannot find `picoclaw` diff --git a/web/backend/api/model_status.go b/web/backend/api/model_status.go index d262cf124..da8110466 100644 --- a/web/backend/api/model_status.go +++ b/web/backend/api/model_status.go @@ -176,7 +176,7 @@ func runLocalModelProbe(m *config.ModelConfig) bool { switch protocol { case "ollama": return probeOllamaModelFunc(apiBase, modelID) - case "vllm", "lmstudio": + case "vllm", "ovms", "lmstudio": return probeOpenAICompatibleModelFunc(apiBase, modelID, m.APIKey()) case "github-copilot", "copilot": return probeTCPServiceFunc(apiBase) diff --git a/web/backend/api/model_status_test.go b/web/backend/api/model_status_test.go index d5463a856..2c1056657 100644 --- a/web/backend/api/model_status_test.go +++ b/web/backend/api/model_status_test.go @@ -89,6 +89,56 @@ func TestProbeLocalModelAvailability_LMStudioUsesOpenAICompatibleProbe(t *testin } } +func TestRequiresRuntimeProbe_OVMS(t *testing.T) { + if !requiresRuntimeProbe(&config.ModelConfig{ + Model: "ovms/llama3", + }) { + t.Fatal("requiresRuntimeProbe(ovms with default base) = false, want true") + } + + if requiresRuntimeProbe(&config.ModelConfig{ + Model: "ovms/llama3", + APIBase: "https://api.example.com/v3", + }) { + t.Fatal("requiresRuntimeProbe(ovms with remote base) = true, want false") + } +} + +func TestModelProbeAPIBase_OVMSDefault(t *testing.T) { + got := modelProbeAPIBase(&config.ModelConfig{Model: "ovms/llama3"}) + if got != "http://localhost:8000/v3" { + t.Fatalf("modelProbeAPIBase(ovms) = %q, want %q", got, "http://localhost:8000/v3") + } +} + +func TestProbeLocalModelAvailability_OVMSUsesOpenAICompatibleProbe(t *testing.T) { + originalProbe := probeOpenAICompatibleModelFunc + defer func() { probeOpenAICompatibleModelFunc = originalProbe }() + + called := false + probeOpenAICompatibleModelFunc = func(apiBase, modelID, apiKey string) bool { + called = true + if apiBase != "http://localhost:8000/v3" { + t.Fatalf("apiBase = %q, want %q", apiBase, "http://localhost:8000/v3") + } + if modelID != "llama3" { + t.Fatalf("modelID = %q, want %q", modelID, "llama3") + } + if apiKey != "" { + t.Fatalf("apiKey = %q, want empty", apiKey) + } + return true + } + + model := &config.ModelConfig{Model: "ovms/llama3"} + if !probeLocalModelAvailability(model) { + t.Fatal("probeLocalModelAvailability(ovms) = false, want true") + } + if !called { + t.Fatal("probeOpenAICompatibleModelFunc was not called for ovms") + } +} + func TestModelProbeCacheKey_DifferentAPIKeysProduceDifferentKeys(t *testing.T) { base := &config.ModelConfig{ ModelName: "local-vllm", diff --git a/web/frontend/src/components/models/models-page.tsx b/web/frontend/src/components/models/models-page.tsx index 152c47585..df1655320 100644 --- a/web/frontend/src/components/models/models-page.tsx +++ b/web/frontend/src/components/models/models-page.tsx @@ -42,9 +42,10 @@ const PROVIDER_PRIORITY: Record = { azure: 23, ollama: 24, vllm: 25, - lmstudio: 26, - zai: 27, - mimo: 28, + ovms: 26, + lmstudio: 27, + zai: 28, + mimo: 29, } interface ProviderGroup { diff --git a/web/frontend/src/components/models/provider-icon.tsx b/web/frontend/src/components/models/provider-icon.tsx index 8d1cfe2c9..1e5250855 100644 --- a/web/frontend/src/components/models/provider-icon.tsx +++ b/web/frontend/src/components/models/provider-icon.tsx @@ -41,6 +41,7 @@ const PROVIDER_DOMAINS: Record = { mistral: "mistral.ai", avian: "avian.io", vllm: "vllm.ai", + ovms: "docs.openvino.ai", zhipu: "zhipuai.cn", zai: "z.ai", mimo: "xiaomi.com", diff --git a/web/frontend/src/components/models/provider-label.ts b/web/frontend/src/components/models/provider-label.ts index 123640fe5..d72eebfc0 100644 --- a/web/frontend/src/components/models/provider-label.ts +++ b/web/frontend/src/components/models/provider-label.ts @@ -20,6 +20,7 @@ const PROVIDER_LABELS: Record = { mistral: "Mistral AI", avian: "Avian", vllm: "VLLM (local)", + ovms: "OVMS (local)", zhipu: "Zhipu AI (智谱)", zai: "Z.ai", mimo: "Xiaomi MiMo",