mirror of
https://github.com/codewhale-hq/Codewhale.git
synced 2026-11-11 10:01:30 -10:00
refactor(providers): delete setup-template picker stage and commands (#6289)
Removes the template-list stage from /provider (generic Custom form stays), the templates subcommand and setup-by-template-name path, the provider_templates settings row, and the ProviderTemplate* MessageIds in 16 locales. Custom routes label by their [providers.<id>] key and a custom route owns a catalog only on Baseten's endpoint. Verified: provider_picker 129/0, model_picker 24/0, provider cmd 37/0, setup cmd 12/0, localization 50/0, runtime_api 228/0, settings registry 1/0; clippy lib+tests -D warnings clean; fmt clean. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
cb5b6c8a8c
commit
f8d00a31ff
26 files changed
+103
-1400
No files matched your search
@@ -683,17 +683,6 @@ pub const SETTINGS_SCHEMA: &[SettingDef] = &[
|
||||
"ConfigHintProvider",
|
||||
),
|
||||
),
|
||||
def(
|
||||
"provider_templates",
|
||||
SettingKind::String,
|
||||
"",
|
||||
ui_action(
|
||||
TAB_MODELS,
|
||||
"provider",
|
||||
"ConfigLabelProviderTemplates",
|
||||
"ConfigHintProviderTemplates",
|
||||
),
|
||||
),
|
||||
def(
|
||||
"model",
|
||||
SettingKind::String,
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Capacitats anunciades: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Capacitats anunciades: no proporcionades; s'usa el descobriment antic",
|
||||
"McpCapabilitiesNotObserved": "Capacitats anunciades: no observades perquè el servidor no està connectat",
|
||||
"PickerActionTemplates": "plantilles",
|
||||
"PickerActionTestConnection": "provar la connexió",
|
||||
"ProviderTemplatesTitle": "Plantilles de configuració",
|
||||
"ProviderTemplateUnpublished": "Aquest repositori no té una URL compatible amb OpenAI publicada, així que no és un predefinit omplible.",
|
||||
"ProviderTemplateDocs": "Docs: {url}",
|
||||
"ProviderTemplateCredentials": "Claus: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "només clau",
|
||||
"ProviderTemplateKindCompatible": "compatible OpenAI",
|
||||
"ProviderTemplateKindUnpublished": "no publicat",
|
||||
"ProviderTemplateBaseUrl": "URL base: {url}",
|
||||
"ProviderTemplateModel": "Model per defecte: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Creeu o copieu una clau API d'OpenCode Zen des d'OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Creeu o copieu una clau de subscripció d'OpenCode Go des d'OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "Amfitrió OpenAI-compatible de SenseTime SenseNova. Deseu el nom de la variable d'entorn, no la clau crua.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes no té cap URL OpenAI-compatible publicada en aquest repositori, així que no té un predefinit omplible.",
|
||||
"ProviderCustomFormBaseUrl": "URL base",
|
||||
"ProviderCustomFormModel": "Model per defecte",
|
||||
"ProviderCustomFormHint": "Punt final compatible amb OpenAI. Deseu el nom de la variable d'entorn, no la clau crua.",
|
||||
"ConfigLabelProviderTemplates": "Plantilles de proveïdor per a principiants",
|
||||
"ConfigActionOpenProviderTemplates": "Enter obre la llista de plantilles",
|
||||
"ConfigHintProviderTemplates": "P a /provider; C-t prova /models sense tractar 2xx com a model a punt",
|
||||
"ProviderConnectionChecked": "Connexió comprovada (/models ha retornat 2xx). No s'ha comprovat la disponibilitat del model.",
|
||||
"ProviderConnectionCheckedPickModel": "Connexió comprovada (/models ha retornat 2xx). Trieu un model per defecte; no s'ha comprovat la disponibilitat del model.",
|
||||
"ProviderTestConnectionNeedKey": "No hi ha cap clau API desada per a {provider}. Introduïu la clau i premeu T per provar la connexió.",
|
||||
"ProviderTestConnectionFailed": "Ha fallat la comprovació de connexió de {provider}: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} no té un punt final /models; no s'ha sondejat l'accessibilitat.",
|
||||
"ProviderTemplateOpened": "S'ha obert la plantilla de proveïdor '{id}'. Introduïu només la clau API.",
|
||||
"ProviderTemplateUnknown": "Plantilla de proveïdor desconeguda '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "S'ha obert la plantilla integrada '{id}'. Introduïu el nom de la variable d'entorn de la clau API i deseu. No enganxeu la clau crua.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] ritme={pace} escriptors={writers}",
|
||||
"OperateBoardBurnObserved": "despesa ${actual}/h observats vs ${target}/h objectiu",
|
||||
"OperateBoardBurnNoCap": "despesa Sense límit",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Angekündigte Fähigkeiten: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Angekündigte Fähigkeiten: nicht angegeben; ältere Erkennung wird ersatzweise verwendet",
|
||||
"McpCapabilitiesNotObserved": "Angekündigte Fähigkeiten: nicht beobachtet, da der Server nicht verbunden ist",
|
||||
"PickerActionTemplates": "Vorlagen",
|
||||
"PickerActionTestConnection": "Verbindung testen",
|
||||
"ProviderTemplatesTitle": "Setup-Vorlagen",
|
||||
"ProviderTemplateUnpublished": "In diesem Repository gibt es keine veröffentlichte OpenAI-kompatible URL, daher ist das kein ausfüllbares Preset.",
|
||||
"ProviderTemplateDocs": "Docs: {url}",
|
||||
"ProviderTemplateCredentials": "Schlüssel: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "nur Schlüssel",
|
||||
"ProviderTemplateKindCompatible": "kompatibel",
|
||||
"ProviderTemplateKindUnpublished": "unveröffentlicht",
|
||||
"ProviderTemplateBaseUrl": "Basis-URL: {url}",
|
||||
"ProviderTemplateModel": "Modell: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Erstellen oder kopieren Sie einen OpenCode Zen API-Schlüssel von OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Erstellen oder kopieren Sie einen OpenCode Go-Abonnementschlüssel von OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI-kompatibler SenseTime SenseNova-Host. Speichern Sie den Umgebungsvariablennamen, nicht den Rohschlüssel.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes hat in diesem Repository keine veröffentlichte OpenAI-kompatible URL und daher kein ausfüllbares Preset.",
|
||||
"ProviderCustomFormBaseUrl": "Basis-URL",
|
||||
"ProviderCustomFormModel": "Standardmodell",
|
||||
"ProviderCustomFormHint": "OpenAI-kompatibler Endpunkt. Speichern Sie den Umgebungsvariablennamen, nicht den Rohschlüssel.",
|
||||
"ConfigLabelProviderTemplates": "Anfänger-Provider-Vorlagen",
|
||||
"ConfigActionOpenProviderTemplates": "Enter öffnet die Vorlagenliste",
|
||||
"ConfigHintProviderTemplates": "P in /provider; C-t prüft /models, ohne 2xx als modellbereit zu werten",
|
||||
"ProviderConnectionChecked": "Verbindung geprüft (/models lieferte 2xx). Die Modellverfügbarkeit wurde nicht geprüft.",
|
||||
"ProviderConnectionCheckedPickModel": "Verbindung geprüft (/models lieferte 2xx). Wählen Sie ein Standardmodell; die Modellverfügbarkeit wurde nicht geprüft.",
|
||||
"ProviderTestConnectionNeedKey": "Kein API-Schlüssel für {provider} gespeichert. Schlüssel eingeben, dann T zum Verbindungstest.",
|
||||
"ProviderTestConnectionFailed": "{provider}-Verbindungsprüfung fehlgeschlagen: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} hat keinen /models-Endpunkt; die Erreichbarkeit wurde nicht geprüft.",
|
||||
"ProviderTemplateOpened": "Provider-Vorlage '{id}' geöffnet. Nur den API-Schlüssel eingeben.",
|
||||
"ProviderTemplateUnknown": "Unbekannte Provider-Vorlage '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Eingebaute Vorlage '{id}' geöffnet. Geben Sie den Umgebungsvariablennamen des API-Schlüssels ein und speichern Sie. Keinen Rohschlüssel einfügen.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] Tempo={pace} Schreiber={writers}",
|
||||
"OperateBoardBurnObserved": "Verbrauch ${actual}/Std. beobachtet vs ${target}/Std. Ziel",
|
||||
"OperateBoardBurnNoCap": "Verbrauch Kein Limit",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Advertised capabilities: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Advertised capabilities: not provided; using legacy discovery fallback",
|
||||
"McpCapabilitiesNotObserved": "Advertised capabilities: not observed because the server is not connected",
|
||||
"PickerActionTemplates": "templates",
|
||||
"PickerActionTestConnection": "test connection",
|
||||
"ProviderTemplatesTitle": "Setup templates",
|
||||
"ProviderTemplateUnpublished": "No published OpenAI-compatible URL here, so this row isn't a fillable preset.",
|
||||
"ProviderTemplateDocs": "Docs: {url}",
|
||||
"ProviderTemplateCredentials": "Keys: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "key-only",
|
||||
"ProviderTemplateKindCompatible": "compatible",
|
||||
"ProviderTemplateKindUnpublished": "unpublished",
|
||||
"ProviderTemplateBaseUrl": "Base URL: {url}",
|
||||
"ProviderTemplateModel": "Model: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Grab an OpenCode Zen API key from OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Grab an OpenCode Go subscription key from OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "SenseTime SenseNova host (OpenAI-compatible). Store an env var name, not a raw key.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes has no published OpenAI-compatible URL, so no fillable preset.",
|
||||
"ProviderCustomFormBaseUrl": "Base URL",
|
||||
"ProviderCustomFormModel": "Default model",
|
||||
"ProviderCustomFormHint": "OpenAI-compatible endpoint. Store an env var name, not a raw key.",
|
||||
"ConfigLabelProviderTemplates": "Provider templates",
|
||||
"ConfigActionOpenProviderTemplates": "Enter opens template list",
|
||||
"ConfigHintProviderTemplates": "P in /provider; C-t tests /models without treating 2xx as model-ready",
|
||||
"ProviderConnectionChecked": "Connection checked (/models returned 2xx). Model availability is not checked.",
|
||||
"ProviderConnectionCheckedPickModel": "Connection checked (/models returned 2xx). Pick a default model; model availability is not checked.",
|
||||
"ProviderTestConnectionNeedKey": "No API key saved for {provider}. Add one first, then press T to test.",
|
||||
"ProviderTestConnectionFailed": "{provider} connection check failed: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} has no /models endpoint; reachability was not probed.",
|
||||
"ProviderTemplateOpened": "Template '{id}' opened — API key only.",
|
||||
"ProviderTemplateUnknown": "No template named '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Template '{id}' opened — enter the key's env var name and save. Never paste the raw key.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] pace={pace} writers={writers}",
|
||||
"OperateBoardBurnObserved": "burn ${actual}/hr observed vs ${target}/hr target",
|
||||
"OperateBoardBurnNoCap": "burn No cap",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Capacidades anunciadas: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Capacidades anunciadas: no proporcionadas; se usa el descubrimiento heredado",
|
||||
"McpCapabilitiesNotObserved": "Capacidades anunciadas: no observadas porque el servidor no está conectado",
|
||||
"PickerActionTemplates": "plantillas",
|
||||
"PickerActionTestConnection": "probar conexión",
|
||||
"ProviderTemplatesTitle": "Plantillas de configuración",
|
||||
"ProviderTemplateUnpublished": "Este repositorio no tiene una URL compatible con OpenAI publicada, así que no es un preset rellenable.",
|
||||
"ProviderTemplateDocs": "Docs: {url}",
|
||||
"ProviderTemplateCredentials": "Claves: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "solo clave",
|
||||
"ProviderTemplateKindCompatible": "compatible OpenAI",
|
||||
"ProviderTemplateKindUnpublished": "no publicado",
|
||||
"ProviderTemplateBaseUrl": "URL base: {url}",
|
||||
"ProviderTemplateModel": "Modelo: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Crea o copia una API key de OpenCode Zen desde OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Crea o copia una clave de suscripción de OpenCode Go desde OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "Host de SenseTime SenseNova compatible con OpenAI. Guarda el nombre de la variable de entorno, no la clave cruda.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes no tiene una URL compatible con OpenAI publicada en este repositorio, así que no tiene un preset rellenable.",
|
||||
"ProviderCustomFormBaseUrl": "URL base",
|
||||
"ProviderCustomFormModel": "Modelo predeterminado",
|
||||
"ProviderCustomFormHint": "Endpoint compatible con OpenAI. Guarda el nombre de la variable de entorno, no la clave cruda.",
|
||||
"ConfigLabelProviderTemplates": "Plantillas de proveedor para principiantes",
|
||||
"ConfigActionOpenProviderTemplates": "Enter abre la lista de plantillas",
|
||||
"ConfigHintProviderTemplates": "P en /provider; C-t prueba /models sin tratar 2xx como modelo listo",
|
||||
"ProviderConnectionChecked": "Conexión comprobada (/models devolvió 2xx). No se comprobó la disponibilidad del modelo.",
|
||||
"ProviderConnectionCheckedPickModel": "Conexión comprobada (/models devolvió 2xx). Elige un modelo predeterminado; no se comprobó la disponibilidad del modelo.",
|
||||
"ProviderTestConnectionNeedKey": "No hay API key guardada para {provider}. Introduce la clave y pulsa T para probar la conexión.",
|
||||
"ProviderTestConnectionFailed": "Falló la comprobación de conexión de {provider}: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} no tiene endpoint /models; no se sondeó la alcanzalidad.",
|
||||
"ProviderTemplateOpened": "Plantilla de proveedor '{id}' abierta. Introduce solo la API key.",
|
||||
"ProviderTemplateUnknown": "Plantilla de proveedor desconocida '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Plantilla integrada '{id}' abierta. Escribe el nombre de la variable de entorno de la API key y guarda. No pegues la clave cruda.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] ritmo={pace} escritores={writers}",
|
||||
"OperateBoardBurnObserved": "gasto ${actual}/h observado vs ${target}/h objetivo",
|
||||
"OperateBoardBurnNoCap": "gasto Sin límite",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Capacités annoncées : {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Capacités annoncées : non fournies ; utilisation de la détection héritée",
|
||||
"McpCapabilitiesNotObserved": "Capacités annoncées : non observées car le serveur n'est pas connecté",
|
||||
"PickerActionTemplates": "modèles",
|
||||
"PickerActionTestConnection": "tester la connexion",
|
||||
"ProviderTemplatesTitle": "Modèles de configuration",
|
||||
"ProviderTemplateUnpublished": "Ce dépôt n'a pas d'URL OpenAI-compatible publiée, donc ce n'est pas un préréglage remplissable.",
|
||||
"ProviderTemplateDocs": "Docs : {url}",
|
||||
"ProviderTemplateCredentials": "Clés : {url}",
|
||||
"ProviderTemplateKindKeyOnly": "clé seule",
|
||||
"ProviderTemplateKindCompatible": "compatible OpenAI",
|
||||
"ProviderTemplateKindUnpublished": "non publié",
|
||||
"ProviderTemplateBaseUrl": "URL de base : {url}",
|
||||
"ProviderTemplateModel": "Modèle : {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Créez ou copiez une clé API OpenCode Zen depuis OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Créez ou copiez une clé d'abonnement OpenCode Go depuis OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "Hôte SenseTime SenseNova compatible OpenAI. Enregistrez le nom de variable d'environnement, pas la clé brute.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes n'a pas d'URL OpenAI-compatible publiée dans ce dépôt, donc il n'y a pas de préréglage remplissable.",
|
||||
"ProviderCustomFormBaseUrl": "URL de base",
|
||||
"ProviderCustomFormModel": "Modèle par défaut",
|
||||
"ProviderCustomFormHint": "Point de terminaison compatible OpenAI. Enregistrez le nom de variable d'environnement, pas la clé brute.",
|
||||
"ConfigLabelProviderTemplates": "Modèles de fournisseur pour débutants",
|
||||
"ConfigActionOpenProviderTemplates": "Enter ouvre la liste des modèles",
|
||||
"ConfigHintProviderTemplates": "P dans /provider ; C-t teste /models sans traiter 2xx comme modèle prêt",
|
||||
"ProviderConnectionChecked": "Connexion vérifiée (/models a renvoyé 2xx). La disponibilité du modèle n'a pas été vérifiée.",
|
||||
"ProviderConnectionCheckedPickModel": "Connexion vérifiée (/models a renvoyé 2xx). Choisissez un modèle par défaut ; la disponibilité du modèle n'a pas été vérifiée.",
|
||||
"ProviderTestConnectionNeedKey": "Aucune clé API enregistrée pour {provider}. Saisissez une clé, puis appuyez sur T pour tester la connexion.",
|
||||
"ProviderTestConnectionFailed": "Échec de la vérification de connexion de {provider} : {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} n'a pas de point de terminaison /models ; l'accessibilité n'a pas été sondée.",
|
||||
"ProviderTemplateOpened": "Modèle de fournisseur '{id}' ouvert. Saisissez uniquement la clé API.",
|
||||
"ProviderTemplateUnknown": "Modèle de fournisseur inconnu '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Modèle intégré '{id}' ouvert. Saisissez le nom de la variable d'environnement de la clé API, puis enregistrez. Ne collez pas la clé brute.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] allure={pace} rédacteurs={writers}",
|
||||
"OperateBoardBurnObserved": "dépense ${actual}/h observée vs ${target}/h cible",
|
||||
"OperateBoardBurnNoCap": "dépense Sans plafond",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "घोषित क्षमताएँ: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "घोषित क्षमताएँ: उपलब्ध नहीं; पुराने खोज फ़ॉलबैक का उपयोग",
|
||||
"McpCapabilitiesNotObserved": "घोषित क्षमताएँ: सर्वर कनेक्ट न होने के कारण अभी नहीं देखी गईं",
|
||||
"PickerActionTemplates": "टेम्पलेट",
|
||||
"PickerActionTestConnection": "कनेक्शन जाँचें",
|
||||
"ProviderTemplatesTitle": "सेटअप टेम्पलेट",
|
||||
"ProviderTemplateUnpublished": "इस रिपॉजिटरी में कोई प्रकाशित OpenAI-संगत URL नहीं है, इसलिए यह भरने योग्य प्रीसेट नहीं है।",
|
||||
"ProviderTemplateDocs": "दस्तावेज़: {url}",
|
||||
"ProviderTemplateCredentials": "कुंजी: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "केवल कुंजी",
|
||||
"ProviderTemplateKindCompatible": "संगत",
|
||||
"ProviderTemplateKindUnpublished": "अप्रकाशित",
|
||||
"ProviderTemplateBaseUrl": "बेस URL: {url}",
|
||||
"ProviderTemplateModel": "मॉडल: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "OpenCode Zen से OpenCode Zen API कुंजी बनाएँ या कॉपी करें।",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "OpenCode Zen से OpenCode Go सदस्यता कुंजी बनाएँ या कॉपी करें।",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI-संगत SenseTime SenseNova होस्ट। कच्ची कुंजी नहीं, पर्यावरण चर का नाम सहेजें।",
|
||||
"ProviderTemplateGuidanceAgnes": "इस रिपॉजिटरी में Agnes का कोई प्रकाशित OpenAI-संगत URL नहीं है, इसलिए कोई भरने योग्य प्रीसेट नहीं है।",
|
||||
"ProviderCustomFormBaseUrl": "बेस URL",
|
||||
"ProviderCustomFormModel": "डिफ़ॉल्ट मॉडल",
|
||||
"ProviderCustomFormHint": "OpenAI-संगत एंडपॉइंट। कच्ची कुंजी नहीं, पर्यावरण चर का नाम सहेजें।",
|
||||
"ConfigLabelProviderTemplates": "शुरुआती प्रोवाइडर टेम्पलेट",
|
||||
"ConfigActionOpenProviderTemplates": "Enter टेम्पलेट सूची खोलता है",
|
||||
"ConfigHintProviderTemplates": "/provider में P; C-t /models जाँचता है और 2xx को मॉडल-तैयार नहीं मानता",
|
||||
"ProviderConnectionChecked": "कनेक्शन जाँचा गया (/models ने 2xx दिया)। मॉडल उपलब्धता नहीं जाँची गई।",
|
||||
"ProviderConnectionCheckedPickModel": "कनेक्शन जाँचा गया (/models ने 2xx दिया)। डिफ़ॉल्ट मॉडल चुनें; मॉडल उपलब्धता नहीं जाँची गई।",
|
||||
"ProviderTestConnectionNeedKey": "{provider} के लिए कोई API कुंजी सहेजी नहीं है। पहले कुंजी दर्ज करें, फिर कनेक्शन जाँचने के लिए T दबाएँ।",
|
||||
"ProviderTestConnectionFailed": "{provider} कनेक्शन जाँच विफल: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} के पास /models एंडपॉइंट नहीं है; पहुँच की जाँच नहीं हुई।",
|
||||
"ProviderTemplateOpened": "प्रोवाइडर टेम्पलेट '{id}' खुला। केवल API कुंजी दर्ज करें।",
|
||||
"ProviderTemplateUnknown": "अज्ञात प्रोवाइडर टेम्पलेट '{id}'।",
|
||||
"ProviderTemplateOpenedEnvOnly": "अंतर्निहित टेम्पलेट '{id}' खुला। API कुंजी का पर्यावरण चर नाम दर्ज कर सहेजें; कच्ची कुंजी न चिपकाएँ।",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] गति={pace} लेखक={writers}",
|
||||
"OperateBoardBurnObserved": "खर्च देखा गया ${actual}/घंटा बनाम लक्ष्य ${target}/घंटा",
|
||||
"OperateBoardBurnNoCap": "खर्च कोई सीमा नहीं",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Kemampuan yang diumumkan: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Kemampuan yang diumumkan: tidak disediakan; memakai penemuan lama sebagai cadangan",
|
||||
"McpCapabilitiesNotObserved": "Kemampuan yang diumumkan: belum diamati karena server belum terhubung",
|
||||
"PickerActionTemplates": "templat",
|
||||
"PickerActionTestConnection": "uji koneksi",
|
||||
"ProviderTemplatesTitle": "Templat penyiapan",
|
||||
"ProviderTemplateUnpublished": "Repositori ini tidak punya URL OpenAI-kompatibel yang diterbitkan, jadi ini bukan preset yang bisa diisi.",
|
||||
"ProviderTemplateDocs": "Docs: {url}",
|
||||
"ProviderTemplateCredentials": "Kunci: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "hanya kunci",
|
||||
"ProviderTemplateKindCompatible": "kompatibel",
|
||||
"ProviderTemplateKindUnpublished": "belum terbit",
|
||||
"ProviderTemplateBaseUrl": "URL dasar: {url}",
|
||||
"ProviderTemplateModel": "Model default: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Buat atau salin kunci API OpenCode Zen dari OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Buat atau salin kunci langganan OpenCode Go dari OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "Host SenseTime SenseNova yang kompatibel dengan OpenAI. Simpan nama variabel lingkungan, bukan kunci mentah.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes tidak memiliki URL kompatibel OpenAI yang diterbitkan di repositori ini, jadi tidak ada prasetel yang bisa diisi.",
|
||||
"ProviderCustomFormBaseUrl": "URL dasar",
|
||||
"ProviderCustomFormModel": "Model bawaan",
|
||||
"ProviderCustomFormHint": "Endpoint kompatibel OpenAI. Simpan nama variabel lingkungan, bukan kunci mentah.",
|
||||
"ConfigLabelProviderTemplates": "Templat penyedia untuk pemula",
|
||||
"ConfigActionOpenProviderTemplates": "Enter membuka daftar templat",
|
||||
"ConfigHintProviderTemplates": "P di /provider; C-t menguji /models tanpa menganggap 2xx sebagai model siap",
|
||||
"ProviderConnectionChecked": "Koneksi diperiksa (/models mengembalikan 2xx). Ketersediaan model belum diperiksa.",
|
||||
"ProviderConnectionCheckedPickModel": "Koneksi diperiksa (/models mengembalikan 2xx). Pilih model bawaan; ketersediaan model belum diperiksa.",
|
||||
"ProviderTestConnectionNeedKey": "Belum ada API key tersimpan untuk {provider}. Masukkan kunci, lalu tekan T untuk menguji koneksi.",
|
||||
"ProviderTestConnectionFailed": "Pemeriksaan koneksi {provider} gagal: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} tidak punya endpoint /models; keterjangkauan tidak diselidiki.",
|
||||
"ProviderTemplateOpened": "Templat penyedia '{id}' dibuka. Masukkan API key saja.",
|
||||
"ProviderTemplateUnknown": "Templat penyedia tidak dikenal '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Templat bawaan '{id}' dibuka. Masukkan nama variabel lingkungan API key, lalu simpan. Jangan tempel kunci mentah.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] laju={pace} penulis={writers}",
|
||||
"OperateBoardBurnObserved": "pembakaran teramati ${actual}/jam vs target ${target}/jam",
|
||||
"OperateBoardBurnNoCap": "pembakaran Tanpa batas",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "公開された機能: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "公開された機能: 未提供(従来の検出フォールバックを使用)",
|
||||
"McpCapabilitiesNotObserved": "公開された機能: サーバーが未接続のため未確認",
|
||||
"PickerActionTemplates": "テンプレート",
|
||||
"PickerActionTestConnection": "接続テスト",
|
||||
"ProviderTemplatesTitle": "セットアップテンプレート",
|
||||
"ProviderTemplateUnpublished": "このリポジトリに公開された OpenAI 互換 URL がないため、入力可能なプリセットにはできません。",
|
||||
"ProviderTemplateDocs": "ドキュメント: {url}",
|
||||
"ProviderTemplateCredentials": "キー: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "キーのみ",
|
||||
"ProviderTemplateKindCompatible": "互換",
|
||||
"ProviderTemplateKindUnpublished": "未公開",
|
||||
"ProviderTemplateBaseUrl": "ベースURL: {url}",
|
||||
"ProviderTemplateModel": "モデル: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "OpenCode Zen で OpenCode Zen の API キーを作成またはコピーします。",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "OpenCode Zen で OpenCode Go のサブスクリプションキーを作成またはコピーします。",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI 互換の SenseTime SenseNova ホストです。生のキーではなく環境変数名を保存します。",
|
||||
"ProviderTemplateGuidanceAgnes": "このリポジトリに Agnes の公開 OpenAI 互換 URL がないため、入力可能なプリセットはありません。",
|
||||
"ProviderCustomFormBaseUrl": "ベースURL",
|
||||
"ProviderCustomFormModel": "既定モデル",
|
||||
"ProviderCustomFormHint": "OpenAI 互換エンドポイント。生のキーではなく環境変数名を保存します。",
|
||||
"ConfigLabelProviderTemplates": "初心者向けプロバイダテンプレート",
|
||||
"ConfigActionOpenProviderTemplates": "Enter でテンプレート一覧を開く",
|
||||
"ConfigHintProviderTemplates": "/provider で P。C-t は /models を試し、2xx をモデル準備完了とは見なしません",
|
||||
"ProviderConnectionChecked": "接続を確認しました(/models が 2xx)。モデルの利用可否は未確認です。",
|
||||
"ProviderConnectionCheckedPickModel": "接続を確認しました(/models が 2xx)。既定モデルを選んでください。モデルの利用可否は未確認です。",
|
||||
"ProviderTestConnectionNeedKey": "{provider} の API キーが未保存です。先にキーを入力し、T で接続をテストしてください。",
|
||||
"ProviderTestConnectionFailed": "{provider} の接続確認に失敗しました: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} には /models エンドポイントがないため、到達性は調べていません。",
|
||||
"ProviderTemplateOpened": "プロバイダテンプレート '{id}' を開きました。API キーだけ入力してください。",
|
||||
"ProviderTemplateUnknown": "未知のプロバイダテンプレート '{id}'。",
|
||||
"ProviderTemplateOpenedEnvOnly": "組み込みテンプレート '{id}' を開きました。生のキーではなく API キーの環境変数名を入力して保存してください。",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] ペース={pace} ライター={writers}",
|
||||
"OperateBoardBurnObserved": "バーン 観測 ${actual}/時 vs 目標 ${target}/時",
|
||||
"OperateBoardBurnNoCap": "バーン 上限なし",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "공개된 기능: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "공개된 기능: 제공되지 않음; 레거시 검색 대체 경로 사용",
|
||||
"McpCapabilitiesNotObserved": "공개된 기능: 서버가 연결되지 않아 확인되지 않음",
|
||||
"PickerActionTemplates": "템플릿",
|
||||
"PickerActionTestConnection": "연결 테스트",
|
||||
"ProviderTemplatesTitle": "설정 템플릿",
|
||||
"ProviderTemplateUnpublished": "이 저장소에 게시된 OpenAI 호환 URL이 없어 입력 가능한 프리셋이 아닙니다.",
|
||||
"ProviderTemplateDocs": "문서: {url}",
|
||||
"ProviderTemplateCredentials": "키: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "키만",
|
||||
"ProviderTemplateKindCompatible": "호환",
|
||||
"ProviderTemplateKindUnpublished": "미공개",
|
||||
"ProviderTemplateBaseUrl": "기본 URL: {url}",
|
||||
"ProviderTemplateModel": "모델: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "OpenCode Zen에서 OpenCode Zen API 키를 만들거나 복사하세요.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "OpenCode Zen에서 OpenCode Go 구독 키를 만들거나 복사하세요.",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI 호환 SenseTime SenseNova 호스트입니다. 원시 키가 아니라 환경 변수 이름을 저장하세요.",
|
||||
"ProviderTemplateGuidanceAgnes": "이 저장소에 Agnes의 게시된 OpenAI 호환 URL이 없어 입력 가능한 프리셋이 없습니다.",
|
||||
"ProviderCustomFormBaseUrl": "기본 URL",
|
||||
"ProviderCustomFormModel": "기본 모델",
|
||||
"ProviderCustomFormHint": "OpenAI 호환 엔드포인트. 원시 키가 아니라 환경 변수 이름을 저장하세요.",
|
||||
"ConfigLabelProviderTemplates": "초보자 프로바이더 템플릿",
|
||||
"ConfigActionOpenProviderTemplates": "Enter로 템플릿 목록 열기",
|
||||
"ConfigHintProviderTemplates": "/provider에서 P; C-t는 /models를 시험하며 2xx를 모델 준비 완료로 보지 않습니다",
|
||||
"ProviderConnectionChecked": "연결을 확인했습니다(/models가 2xx). 모델 사용 가능 여부는 확인하지 않았습니다.",
|
||||
"ProviderConnectionCheckedPickModel": "연결을 확인했습니다(/models가 2xx). 기본 모델을 고르세요. 모델 사용 가능 여부는 확인하지 않았습니다.",
|
||||
"ProviderTestConnectionNeedKey": "{provider} API 키가 저장되어 있지 않습니다. 먼저 키를 입력한 뒤 T로 연결을 테스트하세요.",
|
||||
"ProviderTestConnectionFailed": "{provider} 연결 확인 실패: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider}에는 /models 엔드포인트가 없어 도달 여부를 조사하지 않았습니다.",
|
||||
"ProviderTemplateOpened": "프로바이더 템플릿 '{id}'을(를) 열었습니다. API 키만 입력하세요.",
|
||||
"ProviderTemplateUnknown": "알 수 없는 프로바이더 템플릿 '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "내장 템플릿 '{id}'을(를) 열었습니다. 원시 키가 아니라 API 키 환경 변수 이름을 입력한 뒤 저장하세요.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] 페이스={pace} 작성자={writers}",
|
||||
"OperateBoardBurnObserved": "소진 관측 ${actual}/시간 vs 목표 ${target}/시간",
|
||||
"OperateBoardBurnNoCap": "소진 상한 없음",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Recursos anunciados: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Recursos anunciados: não informados; usando descoberta legada como alternativa",
|
||||
"McpCapabilitiesNotObserved": "Recursos anunciados: não observados porque o servidor não está conectado",
|
||||
"PickerActionTemplates": "modelos",
|
||||
"PickerActionTestConnection": "testar conexão",
|
||||
"ProviderTemplatesTitle": "Modelos de configuração",
|
||||
"ProviderTemplateUnpublished": "Este repositório não tem uma URL OpenAI-compatível publicada, então isto não é um preset preenchível.",
|
||||
"ProviderTemplateDocs": "Docs: {url}",
|
||||
"ProviderTemplateCredentials": "Chaves: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "só chave",
|
||||
"ProviderTemplateKindCompatible": "compatível",
|
||||
"ProviderTemplateKindUnpublished": "não publicado",
|
||||
"ProviderTemplateBaseUrl": "URL base: {url}",
|
||||
"ProviderTemplateModel": "Modelo: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Crie ou copie uma API key do OpenCode Zen no OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Crie ou copie uma chave de assinatura do OpenCode Go no OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "Host SenseTime SenseNova compatível com OpenAI. Guarde o nome da variável de ambiente, não a chave crua.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes não tem uma URL OpenAI-compatível publicada neste repositório, então não há preset preenchível.",
|
||||
"ProviderCustomFormBaseUrl": "URL base",
|
||||
"ProviderCustomFormModel": "Modelo padrão",
|
||||
"ProviderCustomFormHint": "Endpoint compatível com OpenAI. Guarde o nome da variável de ambiente, não a chave crua.",
|
||||
"ConfigLabelProviderTemplates": "Modelos de provedor para iniciantes",
|
||||
"ConfigActionOpenProviderTemplates": "Enter abre a lista de modelos",
|
||||
"ConfigHintProviderTemplates": "P em /provider; C-t testa /models sem tratar 2xx como modelo pronto",
|
||||
"ProviderConnectionChecked": "Conexão verificada (/models retornou 2xx). A disponibilidade do modelo não foi verificada.",
|
||||
"ProviderConnectionCheckedPickModel": "Conexão verificada (/models retornou 2xx). Escolha um modelo padrão; a disponibilidade do modelo não foi verificada.",
|
||||
"ProviderTestConnectionNeedKey": "Nenhuma API key salva para {provider}. Informe a chave e pressione T para testar a conexão.",
|
||||
"ProviderTestConnectionFailed": "Falha na verificação de conexão de {provider}: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} não tem endpoint /models; a alcançabilidade não foi sondada.",
|
||||
"ProviderTemplateOpened": "Modelo de provedor '{id}' aberto. Informe só a API key.",
|
||||
"ProviderTemplateUnknown": "Modelo de provedor desconhecido '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Modelo embutido '{id}' aberto. Informe o nome da variável de ambiente da API key e salve. Não cole a chave crua.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] ritmo={pace} escritores={writers}",
|
||||
"OperateBoardBurnObserved": "gasto ${actual}/h observado vs ${target}/h alvo",
|
||||
"OperateBoardBurnNoCap": "gasto Sem limite",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Заявленные возможности: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Заявленные возможности: не указаны; используется резервное устаревшее обнаружение",
|
||||
"McpCapabilitiesNotObserved": "Заявленные возможности: не определены, так как сервер не подключён",
|
||||
"PickerActionTemplates": "шаблоны",
|
||||
"PickerActionTestConnection": "проверить соединение",
|
||||
"ProviderTemplatesTitle": "Шаблоны настройки",
|
||||
"ProviderTemplateUnpublished": "В этом репозитории нет опубликованного OpenAI-совместимого URL, поэтому это не заполняемый пресет.",
|
||||
"ProviderTemplateDocs": "Документация: {url}",
|
||||
"ProviderTemplateCredentials": "Ключи: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "только ключ",
|
||||
"ProviderTemplateKindCompatible": "совместимый",
|
||||
"ProviderTemplateKindUnpublished": "неопубликовано",
|
||||
"ProviderTemplateBaseUrl": "Базовый URL: {url}",
|
||||
"ProviderTemplateModel": "Модель: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Создайте или скопируйте API-ключ OpenCode Zen в OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Создайте или скопируйте ключ подписки OpenCode Go в OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI-совместимый хост SenseTime SenseNova. Сохраните имя переменной окружения, а не сам ключ.",
|
||||
"ProviderTemplateGuidanceAgnes": "У Agnes нет опубликованного OpenAI-совместимого URL в этом репозитории, поэтому заполняемого пресета нет.",
|
||||
"ProviderCustomFormBaseUrl": "Базовый URL",
|
||||
"ProviderCustomFormModel": "Модель по умолчанию",
|
||||
"ProviderCustomFormHint": "OpenAI-совместимая конечная точка. Сохраняйте имя переменной окружения, не сырой ключ.",
|
||||
"ConfigLabelProviderTemplates": "Шаблоны провайдера для новичков",
|
||||
"ConfigActionOpenProviderTemplates": "Enter открывает список шаблонов",
|
||||
"ConfigHintProviderTemplates": "P в /provider; C-t проверяет /models и не считает 2xx готовностью модели",
|
||||
"ProviderConnectionChecked": "Соединение проверено (/models вернул 2xx). Доступность модели не проверена.",
|
||||
"ProviderConnectionCheckedPickModel": "Соединение проверено (/models вернул 2xx). Выберите модель по умолчанию; доступность модели не проверена.",
|
||||
"ProviderTestConnectionNeedKey": "Для {provider} не сохранён API-ключ. Введите ключ, затем нажмите T, чтобы проверить соединение.",
|
||||
"ProviderTestConnectionFailed": "Проверка соединения {provider} не удалась: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "У {provider} нет конечной точки /models; доступность не зондировалась.",
|
||||
"ProviderTemplateOpened": "Открыт шаблон провайдера '{id}'. Введите только API-ключ.",
|
||||
"ProviderTemplateUnknown": "Неизвестный шаблон провайдера '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Открыт встроенный шаблон '{id}'. Введите имя переменной окружения API-ключа и сохраните. Не вставляйте сырой ключ.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] темп={pace} писателей={writers}",
|
||||
"OperateBoardBurnObserved": "расход наблюдается ${actual}/ч против цель ${target}/ч",
|
||||
"OperateBoardBurnNoCap": "расход Без лимита",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Заявлені можливості: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Заявлені можливості: не вказані; використовується резервне застаріле виявлення",
|
||||
"McpCapabilitiesNotObserved": "Заявлені можливості: не визначені, оскільки сервер не підключено",
|
||||
"PickerActionTemplates": "шаблони",
|
||||
"PickerActionTestConnection": "перевірити з’єднання",
|
||||
"ProviderTemplatesTitle": "Шаблони налаштування",
|
||||
"ProviderTemplateUnpublished": "У цьому репозиторії немає опублікованого OpenAI-сумісного URL, тож це не заповнюваний пресет.",
|
||||
"ProviderTemplateDocs": "Документація: {url}",
|
||||
"ProviderTemplateCredentials": "Ключі: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "лише ключ",
|
||||
"ProviderTemplateKindCompatible": "сумісний",
|
||||
"ProviderTemplateKindUnpublished": "неопубліковано",
|
||||
"ProviderTemplateBaseUrl": "Базовий URL: {url}",
|
||||
"ProviderTemplateModel": "Модель: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Створіть або скопіюйте API-ключ OpenCode Zen в OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Створіть або скопіюйте ключ підписки OpenCode Go в OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI-сумісний хост SenseTime SenseNova. Збережіть ім'я змінної середовища, а не сам ключ.",
|
||||
"ProviderTemplateGuidanceAgnes": "У Agnes немає опублікованого OpenAI-сумісного URL у цьому репозиторії, тому заповнюваного пресета немає.",
|
||||
"ProviderCustomFormBaseUrl": "Базовий URL",
|
||||
"ProviderCustomFormModel": "Типова модель",
|
||||
"ProviderCustomFormHint": "OpenAI-сумісна кінцева точка. Зберігайте ім’я змінної середовища, не сирий ключ.",
|
||||
"ConfigLabelProviderTemplates": "Шаблони провайдера для початківців",
|
||||
"ConfigActionOpenProviderTemplates": "Enter відкриває список шаблонів",
|
||||
"ConfigHintProviderTemplates": "P у /provider; C-t перевіряє /models і не вважає 2xx готовністю моделі",
|
||||
"ProviderConnectionChecked": "З’єднання перевірено (/models повернув 2xx). Доступність моделі не перевірена.",
|
||||
"ProviderConnectionCheckedPickModel": "З’єднання перевірено (/models повернув 2xx). Оберіть типову модель; доступність моделі не перевірена.",
|
||||
"ProviderTestConnectionNeedKey": "Для {provider} не збережено API-ключ. Введіть ключ, потім натисніть T, щоб перевірити з’єднання.",
|
||||
"ProviderTestConnectionFailed": "Перевірка з’єднання {provider} не вдалася: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "У {provider} немає кінцевої точки /models; досяжність не зондувалась.",
|
||||
"ProviderTemplateOpened": "Відкрито шаблон провайдера '{id}'. Введіть лише API-ключ.",
|
||||
"ProviderTemplateUnknown": "Невідомий шаблон провайдера '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Відкрито вбудований шаблон '{id}'. Введіть ім’я змінної середовища API-ключа і збережіть. Не вставляйте сирий ключ.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] темп={pace} авторів={writers}",
|
||||
"OperateBoardBurnObserved": "витрата спостерігається ${actual}/год проти ціль ${target}/год",
|
||||
"OperateBoardBurnNoCap": "витрата Без обмеження",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "Khả năng đã công bố: {capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "Khả năng đã công bố: không được cung cấp; dùng cơ chế khám phá cũ",
|
||||
"McpCapabilitiesNotObserved": "Khả năng đã công bố: chưa quan sát được vì máy chủ chưa kết nối",
|
||||
"PickerActionTemplates": "mẫu",
|
||||
"PickerActionTestConnection": "kiểm tra kết nối",
|
||||
"ProviderTemplatesTitle": "Mẫu thiết lập",
|
||||
"ProviderTemplateUnpublished": "Kho này không có URL OpenAI tương thích đã công bố, nên đây không phải preset điền được.",
|
||||
"ProviderTemplateDocs": "Tài liệu: {url}",
|
||||
"ProviderTemplateCredentials": "Khóa: {url}",
|
||||
"ProviderTemplateKindKeyOnly": "chỉ khóa",
|
||||
"ProviderTemplateKindCompatible": "tương thích",
|
||||
"ProviderTemplateKindUnpublished": "chưa công bố",
|
||||
"ProviderTemplateBaseUrl": "URL cơ sở: {url}",
|
||||
"ProviderTemplateModel": "Mô hình: {model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "Tạo hoặc sao chép khóa API OpenCode Zen từ OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "Tạo hoặc sao chép khóa đăng ký OpenCode Go từ OpenCode Zen.",
|
||||
"ProviderTemplateGuidanceSenseNova": "Máy chủ SenseTime SenseNova tương thích OpenAI. Lưu tên biến môi trường, không lưu khóa thô.",
|
||||
"ProviderTemplateGuidanceAgnes": "Agnes không có URL tương thích OpenAI đã công bố trong kho này, nên không có preset điền sẵn.",
|
||||
"ProviderCustomFormBaseUrl": "URL cơ sở",
|
||||
"ProviderCustomFormModel": "Mô hình mặc định",
|
||||
"ProviderCustomFormHint": "Điểm cuối tương thích OpenAI. Lưu tên biến môi trường, không lưu khóa thô.",
|
||||
"ConfigLabelProviderTemplates": "Mẫu nhà cung cấp cho người mới",
|
||||
"ConfigActionOpenProviderTemplates": "Enter mở danh sách mẫu",
|
||||
"ConfigHintProviderTemplates": "P trong /provider; C-t thử /models và không coi 2xx là mô hình sẵn sàng",
|
||||
"ProviderConnectionChecked": "Đã kiểm tra kết nối (/models trả 2xx). Chưa kiểm tra mô hình có dùng được hay không.",
|
||||
"ProviderConnectionCheckedPickModel": "Đã kiểm tra kết nối (/models trả 2xx). Chọn mô hình mặc định; chưa kiểm tra mô hình có dùng được hay không.",
|
||||
"ProviderTestConnectionNeedKey": "Chưa lưu API key cho {provider}. Nhập khóa trước, rồi nhấn T để kiểm tra kết nối.",
|
||||
"ProviderTestConnectionFailed": "{provider} kiểm tra kết nối thất bại: {error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} không có endpoint /models nên chưa dò khả năng tới được.",
|
||||
"ProviderTemplateOpened": "Đã mở mẫu nhà cung cấp '{id}'. Chỉ cần nhập API key.",
|
||||
"ProviderTemplateUnknown": "Mẫu nhà cung cấp không rõ '{id}'.",
|
||||
"ProviderTemplateOpenedEnvOnly": "Đã mở mẫu có sẵn '{id}'. Nhập tên biến môi trường API key rồi lưu; đừng dán khóa thô.",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] nhịp={pace} người viết={writers}",
|
||||
"OperateBoardBurnObserved": "tiêu hao quan sát ${actual}/giờ so với mục tiêu ${target}/giờ",
|
||||
"OperateBoardBurnNoCap": "tiêu hao Không giới hạn",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "已声明的能力:{capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "已声明的能力:未提供;使用旧版发现回退",
|
||||
"McpCapabilitiesNotObserved": "已声明的能力:服务器未连接,尚未观测",
|
||||
"PickerActionTemplates": "模板",
|
||||
"PickerActionTestConnection": "测试连接",
|
||||
"ProviderTemplatesTitle": "设置模板",
|
||||
"ProviderTemplateUnpublished": "本仓库没有已发布的 OpenAI 兼容 URL,因此不能做成可填写的预设。",
|
||||
"ProviderTemplateDocs": "文档:{url}",
|
||||
"ProviderTemplateCredentials": "密钥:{url}",
|
||||
"ProviderTemplateKindKeyOnly": "仅密钥",
|
||||
"ProviderTemplateKindCompatible": "兼容",
|
||||
"ProviderTemplateKindUnpublished": "未公布",
|
||||
"ProviderTemplateBaseUrl": "基础 URL:{url}",
|
||||
"ProviderTemplateModel": "模型:{model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "在 OpenCode Zen 创建或复制 OpenCode Zen API 密钥。",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "在 OpenCode Zen 创建或复制 OpenCode Go 订阅密钥。",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI 兼容的 SenseTime SenseNova 主机。请保存环境变量名,不要保存原始密钥。",
|
||||
"ProviderTemplateGuidanceAgnes": "本仓库没有 Agnes 已发布的 OpenAI 兼容 URL,因此没有可填写的预设。",
|
||||
"ProviderCustomFormBaseUrl": "基础 URL",
|
||||
"ProviderCustomFormModel": "默认模型",
|
||||
"ProviderCustomFormHint": "OpenAI 兼容端点。请保存环境变量名,不要保存原始密钥。",
|
||||
"ConfigLabelProviderTemplates": "新手提供商模板",
|
||||
"ConfigActionOpenProviderTemplates": "按 Enter 打开模板列表",
|
||||
"ConfigHintProviderTemplates": "在 /provider 按 P;C-t 测试 /models,2xx 只表示可达,不表示模型可用",
|
||||
"ProviderConnectionChecked": "连接已检查(/models 返回 2xx)。未检查模型是否可用。",
|
||||
"ProviderConnectionCheckedPickModel": "连接已检查(/models 返回 2xx)。请选择默认模型;未检查模型是否可用。",
|
||||
"ProviderTestConnectionNeedKey": "尚未保存 {provider} 的 API 密钥。请先输入密钥,再按 T 测试连接。",
|
||||
"ProviderTestConnectionFailed": "{provider} 连接检查失败:{error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} 没有 /models 端点,因此未探测可达性。",
|
||||
"ProviderTemplateOpened": "已打开提供商模板 '{id}'。只需输入 API 密钥。",
|
||||
"ProviderTemplateUnknown": "未知提供商模板 '{id}'。",
|
||||
"ProviderTemplateOpenedEnvOnly": "已打开内置模板 '{id}'。请填写 API 密钥环境变量名后保存,不要粘贴原始密钥。",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] 节奏={pace} 写手={writers}",
|
||||
"OperateBoardBurnObserved": "消耗 观测 ${actual}/时 vs 目标 ${target}/时",
|
||||
"OperateBoardBurnNoCap": "消耗 无上限",
|
||||
|
||||
@@ -1932,35 +1932,15 @@
|
||||
"McpCapabilitiesAdvertised": "已宣告的能力:{capabilities}",
|
||||
"McpCapabilitiesLegacyFallback": "已宣告的能力:未提供;使用舊版探索後援",
|
||||
"McpCapabilitiesNotObserved": "已宣告的能力:伺服器未連線,尚未觀測",
|
||||
"PickerActionTemplates": "範本",
|
||||
"PickerActionTestConnection": "測試連線",
|
||||
"ProviderTemplatesTitle": "設定範本",
|
||||
"ProviderTemplateUnpublished": "本倉庫沒有已發布的 OpenAI 相容 URL,因此不能做成可填寫的預設。",
|
||||
"ProviderTemplateDocs": "文件:{url}",
|
||||
"ProviderTemplateCredentials": "金鑰:{url}",
|
||||
"ProviderTemplateKindKeyOnly": "僅金鑰",
|
||||
"ProviderTemplateKindCompatible": "相容",
|
||||
"ProviderTemplateKindUnpublished": "未公布",
|
||||
"ProviderTemplateBaseUrl": "基礎 URL:{url}",
|
||||
"ProviderTemplateModel": "模型:{model}",
|
||||
"ProviderTemplateGuidanceOpencodeZen": "在 OpenCode Zen 建立或複製 OpenCode Zen API 金鑰。",
|
||||
"ProviderTemplateGuidanceOpencodeGo": "在 OpenCode Zen 建立或複製 OpenCode Go 訂閱金鑰。",
|
||||
"ProviderTemplateGuidanceSenseNova": "OpenAI 相容的 SenseTime SenseNova 主機。請儲存環境變數名,不要儲存原始金鑰。",
|
||||
"ProviderTemplateGuidanceAgnes": "本倉庫沒有 Agnes 已發布的 OpenAI 相容 URL,因此沒有可填寫的預設。",
|
||||
"ProviderCustomFormBaseUrl": "基礎 URL",
|
||||
"ProviderCustomFormModel": "預設模型",
|
||||
"ProviderCustomFormHint": "OpenAI 相容端點。請儲存環境變數名,不要儲存原始金鑰。",
|
||||
"ConfigLabelProviderTemplates": "新手提供商範本",
|
||||
"ConfigActionOpenProviderTemplates": "按 Enter 開啟範本清單",
|
||||
"ConfigHintProviderTemplates": "在 /provider 按 P;C-t 測試 /models,2xx 只表示可達,不表示模型可用",
|
||||
"ProviderConnectionChecked": "連線已檢查(/models 回傳 2xx)。未檢查模型是否可用。",
|
||||
"ProviderConnectionCheckedPickModel": "連線已檢查(/models 回傳 2xx)。請選擇預設模型;未檢查模型是否可用。",
|
||||
"ProviderTestConnectionNeedKey": "尚未儲存 {provider} 的 API 金鑰。請先輸入金鑰,再按 T 測試連線。",
|
||||
"ProviderTestConnectionFailed": "{provider} 連線檢查失敗:{error}",
|
||||
"ProviderTestConnectionNoEndpoint": "{provider} 沒有 /models 端點,因此未探測可達性。",
|
||||
"ProviderTemplateOpened": "已開啟提供商範本 '{id}'。只需輸入 API 金鑰。",
|
||||
"ProviderTemplateUnknown": "未知提供商範本 '{id}'。",
|
||||
"ProviderTemplateOpenedEnvOnly": "已開啟內建範本 '{id}'。請填入 API 金鑰環境變數名後儲存,不要貼上原始金鑰。",
|
||||
"OperateBoardHeader": "Operate {id} [{status}] 節奏={pace} 寫手={writers}",
|
||||
"OperateBoardBurnObserved": "消耗 觀測 ${actual}/時 vs 目標 ${target}/時",
|
||||
"OperateBoardBurnNoCap": "消耗 無上限",
|
||||
|
||||
@@ -2252,35 +2252,15 @@ pub enum MessageId {
|
||||
FooterHintForAgents,
|
||||
FooterHintToManage,
|
||||
AgentRailQueuedCount,
|
||||
PickerActionTemplates,
|
||||
PickerActionTestConnection,
|
||||
ProviderTemplatesTitle,
|
||||
ProviderTemplateUnpublished,
|
||||
ProviderTemplateDocs,
|
||||
ProviderTemplateCredentials,
|
||||
ProviderTemplateKindKeyOnly,
|
||||
ProviderTemplateKindCompatible,
|
||||
ProviderTemplateKindUnpublished,
|
||||
ProviderTemplateBaseUrl,
|
||||
ProviderTemplateModel,
|
||||
ProviderTemplateGuidanceOpencodeZen,
|
||||
ProviderTemplateGuidanceOpencodeGo,
|
||||
ProviderTemplateGuidanceSenseNova,
|
||||
ProviderTemplateGuidanceAgnes,
|
||||
ProviderCustomFormBaseUrl,
|
||||
ProviderCustomFormModel,
|
||||
ProviderCustomFormHint,
|
||||
ConfigLabelProviderTemplates,
|
||||
ConfigActionOpenProviderTemplates,
|
||||
ConfigHintProviderTemplates,
|
||||
ProviderConnectionChecked,
|
||||
ProviderConnectionCheckedPickModel,
|
||||
ProviderTestConnectionNeedKey,
|
||||
ProviderTestConnectionFailed,
|
||||
ProviderTestConnectionNoEndpoint,
|
||||
ProviderTemplateOpened,
|
||||
ProviderTemplateOpenedEnvOnly,
|
||||
ProviderTemplateUnknown,
|
||||
ComposerPlaceholderFollowUp,
|
||||
ComposerPlaceholderSendNow,
|
||||
ComposerHintSendWithQueue,
|
||||
@@ -4514,35 +4494,15 @@ pub const ALL_MESSAGE_IDS: &[MessageId] = &[
|
||||
MessageId::FooterHintForAgents,
|
||||
MessageId::FooterHintToManage,
|
||||
MessageId::AgentRailQueuedCount,
|
||||
MessageId::PickerActionTemplates,
|
||||
MessageId::PickerActionTestConnection,
|
||||
MessageId::ProviderTemplatesTitle,
|
||||
MessageId::ProviderTemplateUnpublished,
|
||||
MessageId::ProviderTemplateDocs,
|
||||
MessageId::ProviderTemplateCredentials,
|
||||
MessageId::ProviderTemplateKindKeyOnly,
|
||||
MessageId::ProviderTemplateKindCompatible,
|
||||
MessageId::ProviderTemplateKindUnpublished,
|
||||
MessageId::ProviderTemplateBaseUrl,
|
||||
MessageId::ProviderTemplateModel,
|
||||
MessageId::ProviderTemplateGuidanceOpencodeZen,
|
||||
MessageId::ProviderTemplateGuidanceOpencodeGo,
|
||||
MessageId::ProviderTemplateGuidanceSenseNova,
|
||||
MessageId::ProviderTemplateGuidanceAgnes,
|
||||
MessageId::ProviderCustomFormBaseUrl,
|
||||
MessageId::ProviderCustomFormModel,
|
||||
MessageId::ProviderCustomFormHint,
|
||||
MessageId::ConfigLabelProviderTemplates,
|
||||
MessageId::ConfigActionOpenProviderTemplates,
|
||||
MessageId::ConfigHintProviderTemplates,
|
||||
MessageId::ProviderConnectionChecked,
|
||||
MessageId::ProviderConnectionCheckedPickModel,
|
||||
MessageId::ProviderTestConnectionNeedKey,
|
||||
MessageId::ProviderTestConnectionFailed,
|
||||
MessageId::ProviderTestConnectionNoEndpoint,
|
||||
MessageId::ProviderTemplateOpened,
|
||||
MessageId::ProviderTemplateOpenedEnvOnly,
|
||||
MessageId::ProviderTemplateUnknown,
|
||||
MessageId::ComposerPlaceholderFollowUp,
|
||||
MessageId::ComposerPlaceholderSendNow,
|
||||
MessageId::ComposerHintSendWithQueue,
|
||||
@@ -5953,15 +5913,6 @@ mod tests {
|
||||
MessageId::ProviderNoConfiguredTitle,
|
||||
MessageId::ProviderNoConfiguredHint,
|
||||
MessageId::ProviderNoCatalogModels,
|
||||
MessageId::ProviderTemplateKindKeyOnly,
|
||||
MessageId::ProviderTemplateKindCompatible,
|
||||
MessageId::ProviderTemplateKindUnpublished,
|
||||
MessageId::ProviderTemplateBaseUrl,
|
||||
MessageId::ProviderTemplateModel,
|
||||
MessageId::ProviderTemplateGuidanceOpencodeZen,
|
||||
MessageId::ProviderTemplateGuidanceOpencodeGo,
|
||||
MessageId::ProviderTemplateGuidanceSenseNova,
|
||||
MessageId::ProviderTemplateGuidanceAgnes,
|
||||
MessageId::ProviderCustomFormBaseUrl,
|
||||
MessageId::ProviderCustomFormModel,
|
||||
MessageId::ConfigHintProviderUrl,
|
||||
@@ -5991,50 +5942,6 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn provider_template_strings_keep_product_names_and_placeholders() {
|
||||
for locale in Locale::shipped_complete() {
|
||||
let base_url = tr(*locale, MessageId::ProviderTemplateBaseUrl);
|
||||
let model = tr(*locale, MessageId::ProviderTemplateModel);
|
||||
assert!(
|
||||
base_url.contains("{url}"),
|
||||
"{} Base URL must keep {{url}}: {base_url}",
|
||||
locale.tag()
|
||||
);
|
||||
assert!(
|
||||
model.contains("{model}"),
|
||||
"{} Model must keep {{model}}: {model}",
|
||||
locale.tag()
|
||||
);
|
||||
let zen = tr(*locale, MessageId::ProviderTemplateGuidanceOpencodeZen);
|
||||
let go = tr(*locale, MessageId::ProviderTemplateGuidanceOpencodeGo);
|
||||
let sense = tr(*locale, MessageId::ProviderTemplateGuidanceSenseNova);
|
||||
let agnes = tr(*locale, MessageId::ProviderTemplateGuidanceAgnes);
|
||||
assert!(
|
||||
zen.contains("OpenCode Zen"),
|
||||
"{} Zen guidance must keep OpenCode Zen: {zen}",
|
||||
locale.tag()
|
||||
);
|
||||
assert!(
|
||||
go.contains("OpenCode Go") && go.contains("OpenCode Zen"),
|
||||
"{} Go guidance must keep OpenCode Go/Zen: {go}",
|
||||
locale.tag()
|
||||
);
|
||||
assert!(
|
||||
sense.contains("SenseNova")
|
||||
&& sense.contains("SenseTime")
|
||||
&& sense.contains("OpenAI"),
|
||||
"{} SenseNova guidance must keep product names: {sense}",
|
||||
locale.tag()
|
||||
);
|
||||
assert!(
|
||||
agnes.contains("Agnes") && agnes.contains("OpenAI"),
|
||||
"{} Agnes guidance must keep Agnes and OpenAI: {agnes}",
|
||||
locale.tag()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn launch_copy_is_translated_in_complete_locales() {
|
||||
let ids = [
|
||||
|
||||
@@ -14,7 +14,7 @@ use super::CommandResult;
|
||||
pub(in crate::commands) const COMMAND_INFO: CommandInfo = CommandInfo {
|
||||
name: "provider",
|
||||
aliases: &[],
|
||||
usage: "/provider [setup [name]|templates|name [model]]",
|
||||
usage: "/provider [setup [name]|name [model]]",
|
||||
description_id: MessageId::CmdProviderDescription,
|
||||
};
|
||||
|
||||
@@ -49,14 +49,6 @@ pub fn provider(app: &mut App, args: Option<&str>) -> CommandResult {
|
||||
if name.eq_ignore_ascii_case("fallback") {
|
||||
return provider_fallback(app, model_arg);
|
||||
}
|
||||
if name.eq_ignore_ascii_case("templates") || name.eq_ignore_ascii_case("template") {
|
||||
if model_arg.is_some() {
|
||||
return CommandResult::error(
|
||||
"Usage: /provider templates — open beginner setup templates.".to_string(),
|
||||
);
|
||||
}
|
||||
return CommandResult::action(AppAction::OpenProviderTemplateList);
|
||||
}
|
||||
if name.eq_ignore_ascii_case("setup") {
|
||||
return match model_arg {
|
||||
None => CommandResult::action(AppAction::OpenProviderSetup { provider: None }),
|
||||
@@ -128,27 +120,15 @@ pub(in crate::commands) fn provider_setup_action_for_name(raw: &str) -> Result<A
|
||||
if raw.eq_ignore_ascii_case("ds4") || raw.eq_ignore_ascii_case("dwarfstar") {
|
||||
return Ok(AppAction::OpenDs4Setup);
|
||||
}
|
||||
if let Some(template) = codewhale_config::provider_setup_template(raw) {
|
||||
match template.apply {
|
||||
codewhale_config::ProviderSetupApply::FirstClass(kind) => {
|
||||
return Ok(AppAction::OpenProviderSetup {
|
||||
provider: Some(ApiProvider::from_kind(kind)),
|
||||
});
|
||||
}
|
||||
codewhale_config::ProviderSetupApply::Compatible
|
||||
| codewhale_config::ProviderSetupApply::Unpublished => {
|
||||
return Ok(AppAction::OpenTemplateSetup {
|
||||
template_id: template.id.to_string(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
// First-class aliases (zen, opencode-zen, …) resolve through the provider
|
||||
// registry. There are no setup templates anymore: named custom hosts are
|
||||
// configured with `/provider setup` and the blank custom form (#6289).
|
||||
match ApiProvider::parse(raw) {
|
||||
Some(provider) => Ok(AppAction::OpenProviderSetup {
|
||||
provider: Some(provider),
|
||||
}),
|
||||
None => Err(format!(
|
||||
"Unknown provider '{raw}'. Expected: {}, or a template (agnes, sensenova, opencode-zen, opencode-go).",
|
||||
"Unknown provider '{raw}'. Expected: {}.",
|
||||
ApiProvider::names_hint()
|
||||
)),
|
||||
}
|
||||
@@ -323,36 +303,28 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn setup_subcommand_opens_agnes_unpublished_template() {
|
||||
fn setup_subcommand_rejects_retired_template_name() {
|
||||
let mut app = create_test_app();
|
||||
let result = provider(&mut app, Some("setup agnes"));
|
||||
assert_eq!(
|
||||
result.action,
|
||||
Some(AppAction::OpenTemplateSetup {
|
||||
template_id: "agnes".to_string(),
|
||||
})
|
||||
);
|
||||
assert!(result.message.is_none());
|
||||
assert!(result.action.is_none());
|
||||
let msg = result.message.expect("expected error message");
|
||||
assert!(msg.contains("Unknown provider 'agnes'"));
|
||||
assert!(result.is_error);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn setup_subcommand_opens_first_class_zen_template() {
|
||||
fn setup_subcommand_opens_first_class_zen_provider() {
|
||||
let mut app = create_test_app();
|
||||
let result = provider(&mut app, Some("setup opencode-zen"));
|
||||
assert_eq!(
|
||||
result.action,
|
||||
Some(AppAction::OpenProviderSetup {
|
||||
provider: Some(ApiProvider::OpencodeZen),
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn templates_subcommand_opens_template_list() {
|
||||
let mut app = create_test_app();
|
||||
let result = provider(&mut app, Some("templates"));
|
||||
assert_eq!(result.action, Some(AppAction::OpenProviderTemplateList));
|
||||
assert!(result.message.is_none());
|
||||
for name in ["setup opencode-zen", "setup zen"] {
|
||||
let result = provider(&mut app, Some(name));
|
||||
assert_eq!(
|
||||
result.action,
|
||||
Some(AppAction::OpenProviderSetup {
|
||||
provider: Some(ApiProvider::OpencodeZen),
|
||||
}),
|
||||
"{name} must resolve through the provider registry"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -261,18 +261,18 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn setup_provider_agnes_opens_unpublished_template() {
|
||||
fn setup_provider_agnes_rejects_retired_template_name() {
|
||||
let mut app = test_app();
|
||||
|
||||
let result = SetupCmd::execute(&mut app, Some("provider agnes"));
|
||||
|
||||
assert_eq!(
|
||||
result.action,
|
||||
Some(AppAction::OpenTemplateSetup {
|
||||
template_id: "agnes".to_string(),
|
||||
})
|
||||
assert!(result.action.is_none());
|
||||
assert!(
|
||||
result
|
||||
.message
|
||||
.as_deref()
|
||||
.is_some_and(|message| message.contains("Unknown provider 'agnes'"))
|
||||
);
|
||||
assert!(result.message.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -9233,7 +9233,7 @@ async fn settings_schema_serves_every_declared_row_with_runtime_state() -> Resul
|
||||
assert_eq!(row("approval_mode")["editable"], true);
|
||||
assert_eq!(row("provider_url")["editable"], false);
|
||||
assert_eq!(row("telemetry")["editable"], false);
|
||||
for action in ["provider_templates", "mcp_open", "plugins_open"] {
|
||||
for action in ["mcp_open", "plugins_open"] {
|
||||
assert_eq!(row(action)["row"], "action");
|
||||
assert_eq!(row(action)["editable"], false);
|
||||
}
|
||||
|
||||
@@ -539,12 +539,6 @@ pub enum AppAction {
|
||||
},
|
||||
/// Open the named, keyless DS4 local-runtime preset for review and save.
|
||||
OpenDs4Setup,
|
||||
/// Open a beginner provider setup template by catalog id (#5350).
|
||||
OpenTemplateSetup {
|
||||
template_id: String,
|
||||
},
|
||||
/// Open the beginner provider template list.
|
||||
OpenProviderTemplateList,
|
||||
/// Run the xAI/Grok device-code flow with the TUI temporarily suspended.
|
||||
StartXaiDeviceLogin,
|
||||
/// Run native ChatGPT PKCE sign-in with the TUI temporarily suspended.
|
||||
|
||||
@@ -3165,4 +3165,4 @@ pub(crate) fn apply_hot_tail_to_line(line: &mut Line<'static>, low_motion: bool)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
mod tests;
|
||||
@@ -2265,12 +2265,15 @@ fn provider_catalog_receipt_for_route(
|
||||
source: Option<&CatalogSource>,
|
||||
) -> Option<(CatalogStatus, bool)> {
|
||||
let identity = provider_identity.unwrap_or_else(|| provider.as_str());
|
||||
// A custom route owns its catalog only on Baseten's endpoint, whose
|
||||
// account-scoped roster no snapshot can serve (#6289).
|
||||
let owns_provider_catalog = matches!(
|
||||
provider,
|
||||
ApiProvider::Openrouter | ApiProvider::Telecomjs | ApiProvider::Edenai
|
||||
) || (provider == ApiProvider::Custom
|
||||
&& codewhale_config::provider_setup_template(identity)
|
||||
.is_some_and(|template| template.is_compatible()));
|
||||
&& codewhale_config::catalog::endpoint_is_baseten(
|
||||
&config.base_url_for_route_identity(provider, identity),
|
||||
));
|
||||
if !owns_provider_catalog {
|
||||
return None;
|
||||
}
|
||||
@@ -2633,10 +2636,11 @@ fn route_labels_for_rows(rows: &[&ModelPickerRow]) -> BTreeMap<String, String> {
|
||||
let Some(identity) = row_provider_identity(row) else {
|
||||
continue;
|
||||
};
|
||||
let label = codewhale_config::provider_setup_template(identity)
|
||||
.map(|template| template.display_name.to_string())
|
||||
.unwrap_or_else(|| identity.to_string());
|
||||
labels.entry(identity.to_string()).or_insert(label);
|
||||
// Custom tables are labeled by their `[providers.<id>]` key: there
|
||||
// are no compiled display names anymore (#6289).
|
||||
labels
|
||||
.entry(identity.to_string())
|
||||
.or_insert_with(|| identity.to_string());
|
||||
}
|
||||
labels
|
||||
}
|
||||
@@ -5062,9 +5066,44 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn baseten_picker_models_use_exact_identity_and_direct_provider_label() {
|
||||
let _env = crate::test_support::lock_test_env();
|
||||
let _live = crate::provider_lake::lock_live_snapshot();
|
||||
let home = tempfile::tempdir().expect("test home");
|
||||
let _home = crate::test_support::EnvVarGuard::set("CODEWHALE_HOME", home.path());
|
||||
crate::provider_catalog_live::reset_cache_for_test();
|
||||
crate::provider_lake::clear_live_snapshot();
|
||||
|
||||
// No compiled seeds: a custom route offers nothing until a live
|
||||
// listing lands for its exact endpoint (#6289).
|
||||
assert!(
|
||||
provider_catalog_model_ids(
|
||||
ApiProvider::Custom,
|
||||
codewhale_config::BASETEN_TEMPLATE_ID,
|
||||
codewhale_config::BASETEN_BASE_URL,
|
||||
)
|
||||
.is_empty()
|
||||
);
|
||||
|
||||
let fingerprint =
|
||||
codewhale_config::catalog::base_url_fingerprint(codewhale_config::BASETEN_BASE_URL);
|
||||
crate::provider_catalog_live::record_success(
|
||||
codewhale_config::catalog::ProviderCatalogDelta {
|
||||
provider: codewhale_config::BASETEN_TEMPLATE_ID.to_string(),
|
||||
base_url_fingerprint: fingerprint.clone(),
|
||||
fetched_at: 1,
|
||||
offerings: vec![codewhale_config::catalog::CatalogOffering {
|
||||
provider: codewhale_config::BASETEN_TEMPLATE_ID.to_string(),
|
||||
wire_model_id: codewhale_config::BASETEN_DEFAULT_MODEL.to_string(),
|
||||
endpoint_key: "chat".to_string(),
|
||||
source: CatalogSource::Live {
|
||||
base_url_fingerprint: fingerprint,
|
||||
fetched_at: 1,
|
||||
},
|
||||
..Default::default()
|
||||
}],
|
||||
},
|
||||
);
|
||||
|
||||
let models = provider_catalog_model_ids(
|
||||
ApiProvider::Custom,
|
||||
codewhale_config::BASETEN_TEMPLATE_ID,
|
||||
@@ -5074,7 +5113,6 @@ mod tests {
|
||||
models,
|
||||
vec![codewhale_config::BASETEN_DEFAULT_MODEL.to_string()]
|
||||
);
|
||||
assert!(models.contains(&codewhale_config::BASETEN_DEFAULT_MODEL.to_string()));
|
||||
|
||||
let row = ModelPickerRow {
|
||||
id: codewhale_config::BASETEN_DEFAULT_MODEL.to_string(),
|
||||
@@ -5087,7 +5125,8 @@ mod tests {
|
||||
enabled: true,
|
||||
};
|
||||
let labels = route_labels_for_rows(&[&row]);
|
||||
assert_eq!(labels.get("baseten").map(String::as_str), Some("Baseten"));
|
||||
// No compiled display names: the route label is the table key itself.
|
||||
assert_eq!(labels.get("baseten").map(String::as_str), Some("baseten"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -5373,14 +5412,14 @@ model = "deepseek/deepseek-v4-flash"
|
||||
{
|
||||
let projection = picker.projection.borrow();
|
||||
let rows = &projection.as_ref().unwrap().rows;
|
||||
assert!(rows.iter().any(|row| row.route == "Command Code"));
|
||||
assert!(rows.iter().any(|row| row.route == "command_code"));
|
||||
assert!(rows.iter().any(|row| row.route == "other_code"));
|
||||
let active: Vec<_> = rows.iter().filter(|row| row.active).collect();
|
||||
assert_eq!(active.len(), 1);
|
||||
assert_eq!(active[0].route, "other_code");
|
||||
}
|
||||
let rendered = render_text(&picker, 140, 40);
|
||||
assert!(rendered.contains("Command Code"), "{rendered}");
|
||||
assert!(rendered.contains("command_code"), "{rendered}");
|
||||
assert!(rendered.contains("other_code"), "{rendered}");
|
||||
|
||||
// Legacy memory has no route identity; ambiguity must preserve the
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -2070,64 +2070,6 @@ pub(crate) async fn apply_command_result(
|
||||
);
|
||||
}
|
||||
}
|
||||
AppAction::OpenProviderTemplateList => {
|
||||
if app.view_stack.top_kind() != Some(ModalKind::ProviderPicker) {
|
||||
let runtime_status = query_provider_runtime_status(engine_handle).await;
|
||||
app.view_stack.push(
|
||||
crate::tui::provider_picker::ProviderPickerView::new_for_template_list(
|
||||
app.api_provider,
|
||||
config,
|
||||
runtime_status,
|
||||
)
|
||||
.with_locale(app.ui_locale)
|
||||
.with_provider_health(&app.provider_health),
|
||||
);
|
||||
}
|
||||
}
|
||||
AppAction::OpenTemplateSetup { template_id } => {
|
||||
if app.view_stack.top_kind() != Some(ModalKind::ProviderPicker) {
|
||||
let runtime_status = query_provider_runtime_status(engine_handle).await;
|
||||
if let Some(picker) =
|
||||
crate::tui::provider_picker::ProviderPickerView::new_for_template_setup(
|
||||
app.api_provider,
|
||||
&template_id,
|
||||
config,
|
||||
runtime_status,
|
||||
)
|
||||
{
|
||||
app.view_stack.push(
|
||||
picker
|
||||
.with_locale(app.ui_locale)
|
||||
.with_provider_health(&app.provider_health),
|
||||
);
|
||||
let template = codewhale_config::provider_setup_template(&template_id);
|
||||
let message = match template {
|
||||
Some(template) if template.is_unpublished() => {
|
||||
app.tr(MessageId::ProviderTemplateUnpublished).into_owned()
|
||||
}
|
||||
Some(template) if template.is_compatible() => app
|
||||
.tr(MessageId::ProviderTemplateOpenedEnvOnly)
|
||||
.replace("{id}", &template_id),
|
||||
_ => app
|
||||
.tr(MessageId::ProviderTemplateOpened)
|
||||
.replace("{id}", &template_id),
|
||||
};
|
||||
let level = if template.is_some_and(|item| item.is_unpublished()) {
|
||||
StatusToastLevel::Warning
|
||||
} else {
|
||||
StatusToastLevel::Info
|
||||
};
|
||||
app.push_status_toast(message, level, Some(8_000));
|
||||
} else {
|
||||
app.push_status_toast(
|
||||
app.tr(MessageId::ProviderTemplateUnknown)
|
||||
.replace("{id}", &template_id),
|
||||
StatusToastLevel::Error,
|
||||
Some(8_000),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
AppAction::EditProjectHooks => {
|
||||
edit_project_hooks_from_tui(terminal, app, config);
|
||||
}
|
||||
|
||||
@@ -2075,16 +2075,6 @@ impl ConfigView {
|
||||
.snapshot(SnapshotLane::Provider)
|
||||
.opens("/provider", MessageId::ConfigActionOpenProvider),
|
||||
},
|
||||
ConfigRow {
|
||||
key: "provider_templates".to_string(),
|
||||
value: codewhale_config::ProviderSetupTemplate::settings_value(),
|
||||
editable: true,
|
||||
scope: ConfigScope::Saved,
|
||||
facts: ConfigRowFacts::action(
|
||||
"/provider templates",
|
||||
MessageId::ConfigActionOpenProviderTemplates,
|
||||
),
|
||||
},
|
||||
ConfigRow {
|
||||
key: config_base_url_row_key(active_route_provider).to_string(),
|
||||
value: config_base_url_row_value(app),
|
||||
@@ -7312,7 +7302,6 @@ mod tests {
|
||||
.map(|row| row.key.as_str())
|
||||
.collect::<Vec<_>>();
|
||||
assert!(keys.contains(&"provider"));
|
||||
assert!(keys.contains(&"provider_templates"));
|
||||
assert!(keys.contains(&"model"));
|
||||
assert!(keys.contains(&"reasoning_effort"));
|
||||
assert!(keys.contains(&"base_url"));
|
||||
@@ -8327,7 +8316,6 @@ base_url = "https://api.xiaomimimo.com/v1"
|
||||
// persisted to config.toml by `set_config_value`.
|
||||
const NOT_SETTINGS_TOML: &[&str] = &[
|
||||
"provider",
|
||||
"provider_templates",
|
||||
"model",
|
||||
"fleet.exec.max_spawn_depth",
|
||||
"goal_command",
|
||||
@@ -9262,7 +9250,6 @@ context_window = 262144
|
||||
};
|
||||
|
||||
assert_eq!(kind_for("provider"), SettingKind::Action);
|
||||
assert_eq!(kind_for("provider_templates"), SettingKind::Action);
|
||||
assert_eq!(kind_for("model"), SettingKind::Action);
|
||||
assert_eq!(kind_for("low_motion"), SettingKind::Boolean);
|
||||
assert_eq!(kind_for("default_mode"), SettingKind::Choice);
|
||||
|
||||
Reference in new issue
Block a user