mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-01 10:22:08 +00:00
Merge pull request #532 from MaEscalanteHe/feature/update-openai-models
fix: update OpenAI models and send supported reasoning parameters
This commit is contained in:
@@ -38,31 +38,24 @@
|
||||
},
|
||||
"openai": {
|
||||
"models": [
|
||||
"gpt-4.1-nano-2025-04-14",
|
||||
"gpt-4.1-nano",
|
||||
"gpt-4.1-2025-04-14",
|
||||
"gpt-4.1",
|
||||
"gpt-4o-2024-11-20",
|
||||
"gpt-4o-2024-05-13",
|
||||
"gpt-4o-mini",
|
||||
"gpt-3.5-turbo-16k",
|
||||
"gpt-4o-mini-2024-07-18",
|
||||
"gpt-5-nano",
|
||||
"gpt-3.5-turbo-1106",
|
||||
"gpt-3.5-turbo-0125",
|
||||
"gpt-5-nano-2025-08-07",
|
||||
"gpt-4.1-mini",
|
||||
"gpt-4.1-mini-2025-04-14",
|
||||
"gpt-3.5-turbo",
|
||||
"gpt-4o",
|
||||
"gpt-4o-2024-08-06",
|
||||
"gpt-4",
|
||||
"gpt-4-turbo",
|
||||
"gpt-4-turbo-2024-04-09",
|
||||
"gpt-4-0613"
|
||||
"gpt-6-luna",
|
||||
"gpt-5.6-luna",
|
||||
"gpt-5.4-mini",
|
||||
"gpt-5.4-mini-2026-03-17",
|
||||
"gpt-6-sol",
|
||||
"gpt-6.1-sol",
|
||||
"gpt-5.6-terra",
|
||||
"gpt-5.2",
|
||||
"gpt-5.2-2025-12-11",
|
||||
"gpt-5.4",
|
||||
"gpt-5.4-2026-03-05",
|
||||
"gpt-5.6-sol",
|
||||
"gpt-5.5",
|
||||
"gpt-5.5-2026-04-23",
|
||||
"gpt-6-astra"
|
||||
],
|
||||
"recommended": "gpt-4.1-nano",
|
||||
"_note": "Verified 2026-09-02 with the OpenAI API — 22 of 74 tested pass. Includes stable aliases (gpt-4.1-nano, gpt-4o-mini, ...), dated snapshots for pinning (gpt-4o-2024-11-20, gpt-4.1-nano-2025-04-14) and legacy families (gpt-3.5-turbo, gpt-4) for cost-optimised use cases. Recommended kept as `gpt-4.1-nano` (stable alias, 1.39s)."
|
||||
"recommended": "gpt-6-luna",
|
||||
"_note": "Verified 2026-10-26 against the live API. Recommended `gpt-6-luna` (cheapest current model). Dropped every model that is retired (gpt-4.1-nano, gpt-3.5-turbo, gpt-4, gpt-4-turbo, ...) or has a shutdown date (gpt-4.1, gpt-4o, gpt-4o-mini, gpt-5-nano, gpt-5.1, gpt-5.4-nano)."
|
||||
},
|
||||
"anthropic": {
|
||||
"models": [
|
||||
|
||||
@@ -5,6 +5,7 @@ Models are loaded dynamically from the API.
|
||||
"""
|
||||
from typing import Optional, List
|
||||
import json
|
||||
import re
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
from .base import AIProvider, AIProviderError
|
||||
@@ -36,11 +37,11 @@ class OpenAIProvider(AIProvider):
|
||||
]
|
||||
|
||||
# Recommended models for chat (in priority order)
|
||||
RECOMMENDED_PREFIXES = ['gpt-4o-mini', 'gpt-4o', 'gpt-4-turbo', 'gpt-4', 'gpt-3.5-turbo']
|
||||
RECOMMENDED_PREFIXES = ['gpt-6-luna', 'gpt-5.6-luna', 'gpt-5.4-mini', 'gpt-6-sol']
|
||||
|
||||
@staticmethod
|
||||
def _is_reasoning_model(model: str) -> bool:
|
||||
"""True for OpenAI reasoning models (o-series + non-chat gpt-5+).
|
||||
"""True for OpenAI reasoning models (o-series + non-chat gpt-5 and later).
|
||||
|
||||
These use a stricter API contract than chat models:
|
||||
- Must use ``max_completion_tokens`` instead of ``max_tokens``
|
||||
@@ -54,11 +55,24 @@ class OpenAIProvider(AIProvider):
|
||||
# o1, o3, o4, o5 ... (o<digit>...)
|
||||
if len(m) >= 2 and m[0] == 'o' and m[1].isdigit():
|
||||
return True
|
||||
# gpt-5, gpt-5-mini, gpt-5.1, gpt-5.2-pro ... EXCEPT *-chat-latest
|
||||
if m.startswith('gpt-5') and '-chat' not in m:
|
||||
return True
|
||||
return False
|
||||
|
||||
# gpt-5, gpt-5-mini, gpt-5.1, gpt-6-luna, gpt-6.1-sol ... EXCEPT *-chat-latest
|
||||
major = re.match(r'gpt-(\d+)', m)
|
||||
return bool(major) and int(major.group(1)) >= 5 and '-chat' not in m
|
||||
|
||||
@staticmethod
|
||||
def _reasoning_effort(model: str) -> str:
|
||||
"""Lowest reasoning_effort the model accepts.
|
||||
|
||||
gpt-5 / gpt-5-mini / gpt-5-nano (and the o-series) accept 'minimal'.
|
||||
gpt-5.1 and later reject 'minimal' with HTTP 400, and gpt-6-astra /
|
||||
gpt-6.1-sol also reject 'none', so 'low' is the value all of them
|
||||
accept. In tests it spent 0-5 reasoning tokens on a notification.
|
||||
"""
|
||||
m = model.lower()
|
||||
if re.match(r'gpt-5(?!\.)', m) or m.startswith('o'):
|
||||
return 'minimal'
|
||||
return 'low'
|
||||
|
||||
def list_models(self) -> List[str]:
|
||||
"""List available models for chat completions.
|
||||
|
||||
@@ -189,22 +203,19 @@ class OpenAIProvider(AIProvider):
|
||||
# apply model-specific defaults.
|
||||
if self.base_url:
|
||||
payload['max_tokens'] = max_tokens
|
||||
# Reasoning models (o1/o3/o4/gpt-5*, excluding *-chat-latest) use a
|
||||
# Reasoning models (o1/o3/o4/gpt-5+, excluding *-chat-latest) use a
|
||||
# different parameter contract: max_completion_tokens instead of
|
||||
# max_tokens, and no temperature field. Sending the classic chat
|
||||
# parameters to them produces HTTP 400 Bad Request.
|
||||
#
|
||||
# They also spend output budget on internal reasoning by default,
|
||||
# which empties the user-visible reply when max_tokens is small
|
||||
# (like the ~200 we use for notifications). reasoning_effort
|
||||
# 'minimal' keeps that internal reasoning to a minimum so the
|
||||
# entire budget is available for the translation, which is
|
||||
# exactly what this pipeline wants. OpenAI documents 'minimal',
|
||||
# 'low', 'medium', 'high' — 'minimal' is the right setting for a
|
||||
# straightforward translate+explain task.
|
||||
# (like the ~200 we use for notifications). The lowest
|
||||
# reasoning_effort the model accepts keeps that internal reasoning
|
||||
# to a minimum so the budget goes to the translation.
|
||||
elif self._is_reasoning_model(self.model):
|
||||
payload['max_completion_tokens'] = max_tokens
|
||||
payload['reasoning_effort'] = 'minimal'
|
||||
payload['reasoning_effort'] = self._reasoning_effort(self.model)
|
||||
else:
|
||||
payload['max_tokens'] = max_tokens
|
||||
payload['temperature'] = 0.3
|
||||
|
||||
@@ -98,6 +98,31 @@ class OpenAICompatibleModelTests(unittest.TestCase):
|
||||
self.assertNotIn("temperature", provider.captured_payload)
|
||||
self.assertNotIn("max_tokens", provider.captured_payload)
|
||||
|
||||
def test_newer_reasoning_models_use_low_effort(self):
|
||||
# gpt-5.1+ reject 'minimal'; gpt-6* were sent chat parameters before.
|
||||
for model in ("gpt-5.6-luna", "gpt-6-luna", "gpt-6.1-sol"):
|
||||
with self.subTest(model=model):
|
||||
provider = CapturingOpenAIProvider(api_key="token", model=model)
|
||||
|
||||
self.assertEqual(provider.generate("system", "user", max_tokens=123), "ok")
|
||||
|
||||
self.assertEqual(provider.captured_payload["max_completion_tokens"], 123)
|
||||
self.assertEqual(provider.captured_payload["reasoning_effort"], "low")
|
||||
self.assertNotIn("temperature", provider.captured_payload)
|
||||
self.assertNotIn("max_tokens", provider.captured_payload)
|
||||
|
||||
def test_classic_chat_models_keep_chat_contract(self):
|
||||
for model in ("gpt-4.1", "gpt-4o-mini"):
|
||||
with self.subTest(model=model):
|
||||
provider = CapturingOpenAIProvider(api_key="token", model=model)
|
||||
|
||||
self.assertEqual(provider.generate("system", "user", max_tokens=123), "ok")
|
||||
|
||||
self.assertEqual(provider.captured_payload["max_tokens"], 123)
|
||||
self.assertEqual(provider.captured_payload["temperature"], 0.3)
|
||||
self.assertNotIn("reasoning_effort", provider.captured_payload)
|
||||
self.assertNotIn("max_completion_tokens", provider.captured_payload)
|
||||
|
||||
def test_runtime_ai_config_prefers_provider_specific_model(self):
|
||||
manager = self._manager({
|
||||
"ai_enabled": "true",
|
||||
|
||||
@@ -814,7 +814,7 @@ curl -H "Authorization: Bearer <api-token>" \\
|
||||
curl -X POST http://<host>:8008/api/notifications/test-ai \\
|
||||
-H "Authorization: Bearer <api-token>" \\
|
||||
-H "Content-Type: application/json" \\
|
||||
-d '{"provider":"openai","api_key":"sk-...","model":"gpt-4o-mini"}'`}
|
||||
-d '{"provider":"openai","api_key":"sk-...","model":"gpt-6-luna"}'`}
|
||||
className="my-4"
|
||||
/>
|
||||
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Industriestandard. Sehr genau und weit verbreitet.",
|
||||
"items": [
|
||||
"API-Schlüssel: <a>platform.openai.com/api-keys</a>",
|
||||
"Beispiele aus der mitgelieferten Modellliste: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Mitgelieferte Empfehlung: <strong><code>gpt-4.1-nano</code></strong>. Der Adapter unterstützt auch besondere Anforderungen von Reasoning-Modellen; die Liste enthält gpt-5-nano. Diese Modelle sind daher nicht pauschal ausgeschlossen."
|
||||
"Beispiele aus der mitgelieferten Modellliste: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Mitgelieferte Empfehlung: <strong><code>gpt-6-luna</code></strong>, das günstigste aktuelle Modell. Alle Modelle der Liste sind Reasoning-Modelle; der Adapter sendet jedem die Parameter, die es akzeptiert."
|
||||
],
|
||||
"baseUrlTitle": "OpenAI-kompatible Basis URL",
|
||||
"baseUrlBody": "Der OpenAI-Anbieter akzeptiert eine eigene <em>Basis-URL</em> für OpenAI-kompatible Endpunkte, etwa <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> und <strong>Fireworks AI</strong>, die das Format <code>/v1/chat/completions</code> unterstützen. Tragen Sie die URL im OpenAI-Bereich neben dem API-Schlüssel ein."
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Industry standard. Very accurate and widely used.",
|
||||
"items": [
|
||||
"API key: <a>platform.openai.com/api-keys</a>",
|
||||
"Examples from the bundled model list: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Bundled recommendation: <strong><code>gpt-4.1-nano</code></strong>. The adapter also handles model-specific requirements for reasoning models; the bundled list includes gpt-5-nano, so reasoning models are not universally excluded."
|
||||
"Examples from the bundled model list: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Bundled recommendation: <strong><code>gpt-6-luna</code></strong>, the most economical current model. Every model in the bundled list is a reasoning model; the adapter sends each one the parameters it accepts."
|
||||
],
|
||||
"baseUrlTitle": "OpenAI-compatible base URL",
|
||||
"baseUrlBody": "The OpenAI provider also accepts a custom <em>Base URL</em>, which lets you point the Monitor at any OpenAI-compatible endpoint. Confirmed to work with <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong>, <strong>Fireworks AI</strong>, and any other service that speaks the OpenAI <code>/v1/chat/completions</code> dialect. Set the URL in the OpenAI tab next to the API key field."
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Estándar de la industria. Muy preciso y ampliamente usado.",
|
||||
"items": [
|
||||
"Clave API: <a>platform.openai.com/api-keys</a>",
|
||||
"Ejemplos de la lista de modelos incluida: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Recomendación incluida: <strong><code>gpt-4.1-nano</code></strong>. El adaptador también gestiona requisitos específicos de los modelos de razonamiento; la lista incluye gpt-5-nano, por lo que no se excluyen todos esos modelos."
|
||||
"Ejemplos de la lista de modelos incluida: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Recomendación incluida: <strong><code>gpt-6-luna</code></strong>, el modelo actual más económico. Todos los modelos de la lista son de razonamiento; el adaptador envía a cada uno los parámetros que acepta."
|
||||
],
|
||||
"baseUrlTitle": "Base URL compatible con OpenAI",
|
||||
"baseUrlBody": "El proveedor OpenAI también acepta una <em>Base URL</em> personalizada, que te permite apuntar el Monitor a cualquier endpoint compatible con OpenAI. Confirmado que funciona con <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong>, <strong>Fireworks AI</strong> y cualquier otro servicio que hable el dialecto OpenAI <code>/v1/chat/completions</code>. Configura la URL en la pestaña OpenAI junto al campo de API key."
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Norme de l'industrie. Très précis et largement utilisé.",
|
||||
"items": [
|
||||
"Clé API : <a>platform.openai.com/api-keys</a>",
|
||||
"Exemples de la liste de modèles fournie : <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Recommandation fournie : <strong><code>gpt-4.1-nano</code></strong>. L’adaptateur gère aussi les exigences des modèles de raisonnement ; la liste inclut gpt-5-nano, ils ne sont donc pas tous exclus."
|
||||
"Exemples de la liste de modèles fournie : <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Recommandation fournie : <strong><code>gpt-6-luna</code></strong>, le modèle actuel le plus économique. Tous les modèles de la liste sont des modèles de raisonnement ; l’adaptateur envoie à chacun les paramètres qu’il accepte."
|
||||
],
|
||||
"baseUrlTitle": "URL de base compatible OpenAI",
|
||||
"baseUrlBody": "Le fournisseur OpenAI accepte une <em>URL de base</em> personnalisée pour les points d’accès compatibles : <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong>, <strong>Fireworks AI</strong> et les services utilisant le format <code>/v1/chat/completions</code>. Saisissez l’URL dans l’onglet OpenAI près de la clé API."
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Standard di settore. Molto accurato e ampiamente usato.",
|
||||
"items": [
|
||||
"Chiave API: <a>platform.openai.com/api-keys</a>",
|
||||
"Esempi dall’elenco di modelli incluso: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Raccomandazione inclusa: <strong><code>gpt-4.1-nano</code></strong>. L’adattatore gestisce anche i requisiti dei modelli di ragionamento; la lista include gpt-5-nano, quindi questi modelli non sono esclusi in generale."
|
||||
"Esempi dall’elenco di modelli incluso: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Raccomandazione inclusa: <strong><code>gpt-6-luna</code></strong>, il modello attuale più economico. Tutti i modelli dell’elenco sono modelli di ragionamento; l’adattatore invia a ciascuno i parametri che accetta."
|
||||
],
|
||||
"baseUrlTitle": "URL di base compatibile con OpenAI",
|
||||
"baseUrlBody": "Il provider OpenAI accetta un <em>URL di base</em> personalizzato per endpoint compatibili, come <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> e <strong>Fireworks AI</strong>, che usano il formato <code>/v1/chat/completions</code>. Imposta l’URL nella scheda OpenAI accanto alla chiave API."
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Padrão industrial. Muito preciso e amplamente utilizado.",
|
||||
"items": [
|
||||
"Chave API: <a>platform.openai.com/api-keys</a>",
|
||||
"Exemplos da lista de modelos incluída: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Recomendação incluída: <strong><code>gpt-4.1-nano</code></strong>. O adaptador também trata requisitos dos modelos de raciocínio; a lista inclui gpt-5-nano, pelo que esses modelos não são excluídos em geral."
|
||||
"Exemplos da lista de modelos incluída: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Recomendação incluída: <strong><code>gpt-6-luna</code></strong>, o modelo atual mais económico. Todos os modelos da lista são de raciocínio; o adaptador envia a cada um os parâmetros que aceita."
|
||||
],
|
||||
"baseUrlTitle": "URL base compatível com OpenAI",
|
||||
"baseUrlBody": "O fornecedor OpenAI aceita um <em>URL base</em> personalizado para serviços compatíveis, como <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> e <strong>Fireworks AI</strong>, que utilizam o formato <code>/v1/chat/completions</code>. Defina o URL no separador OpenAI junto à chave API."
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Priemyselná norma. Veľmi presné a široko používané.",
|
||||
"items": [
|
||||
"Kľúč API: <a>platform.openai.com/api-keys</a>",
|
||||
"Príklady z dodaného zoznamu modelov: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Dodané odporúčanie: <strong><code>gpt-4.1-nano</code></strong>. Adaptér spracúva aj osobitné požiadavky modelov uvažovania; zoznam obsahuje gpt-5-nano, takže tieto modely nie sú všeobecne vylúčené."
|
||||
"Príklady z dodaného zoznamu modelov: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Dodané odporúčanie: <strong><code>gpt-6-luna</code></strong>, najúspornejší aktuálny model. Všetky modely v zozname sú modely uvažovania; adaptér každému posiela parametre, ktoré prijíma."
|
||||
],
|
||||
"baseUrlTitle": "Základné URL kompatibilné s OpenAI",
|
||||
"baseUrlBody": "Poskytovateľ OpenAI prijíma vlastnú <em>Základnú URL</em> pre kompatibilné služby, napríklad <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> a <strong>Fireworks AI</strong>, ktoré používajú formát <code>/v1/chat/completions</code>. URL nastavte na karte OpenAI vedľa kľúča API."
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
"tagline": "Industristandard. Mycket exakt och allmänt används.",
|
||||
"items": [
|
||||
"API-nyckel: <a>platform.openai.com/api-keys</a>",
|
||||
"Exempel från den medföljande modellistan: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
|
||||
"Medföljande rekommendation: <strong><code>gpt-4.1-nano</code></strong>. Adaptern hanterar även särskilda krav för resonemangsmodeller; listan innehåller gpt-5-nano, så sådana modeller är inte generellt uteslutna."
|
||||
"Exempel från den medföljande modellistan: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
|
||||
"Medföljande rekommendation: <strong><code>gpt-6-luna</code></strong>, den mest ekonomiska aktuella modellen. Alla modeller i listan är resonemangsmodeller; adaptern skickar varje modell de parametrar den accepterar."
|
||||
],
|
||||
"baseUrlTitle": "OpenAI-kompatibel bas URL",
|
||||
"baseUrlBody": "OpenAI-leverantören accepterar en egen <em>Bas-URL</em> för kompatibla tjänster som <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> och <strong>Fireworks AI</strong>, som stöder formatet <code>/v1/chat/completions</code>. Ange URL:en på OpenAI-fliken bredvid API-nyckeln."
|
||||
|
||||
Reference in New Issue
Block a user