mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-27 21:08:00 +00:00
fix(i18n,inference): repath stale "Settings → AI" nav copy (#4694)
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
This commit is contained in:
co-authored by
Steven Enamakel
parent
531119d825
commit
c71dac4ee9
@@ -280,7 +280,7 @@ describe('AIPanel', () => {
|
||||
provider: 'openrouter',
|
||||
status: 401,
|
||||
message:
|
||||
'openrouter rejected the API key (HTTP 401). Update your openrouter API key in Settings → AI to restore it.',
|
||||
'openrouter rejected the API key (HTTP 401). Update your openrouter API key in Connections → API keys → LLM to restore it.',
|
||||
timestamp_ms: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
@@ -1035,7 +1035,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': 'تعذّر إتمام الإعداد. يُرجى المحاولة مجددًا.',
|
||||
'onboarding.apiKeys.title': 'لنضف مفاتيح API الخاصة بك',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'يمكنك لصقها الآن أو تخطيها وإضافتها لاحقًا من الإعدادات › الذكاء الاصطناعي. تُحفظ المفاتيح على هذا الجهاز مشفرةً.',
|
||||
'يمكنك لصقها الآن أو تخطيها وإضافتها لاحقًا من الاتصالات › مفاتيح API. تُحفظ المفاتيح على هذا الجهاز مشفرةً.',
|
||||
'onboarding.apiKeys.openaiLabel': 'مفتاح OpenAI API',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6504,21 +6504,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'بنية الويكي غير مكتملة',
|
||||
'memoryTree.status.extractionCoverage': 'تغطية الاستخراج: {pct}% من الأجزاء لها بنية',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'استنفدت تضمينات الذاكرة الميزانية المُدارة. أعدّ تضمينات Ollama المحلية (الإعدادات → الذكاء الاصطناعي → التضمينات) أو أضف مفتاح API الخاص بك للتضمينات لمواصلة بناء الذاكرة.',
|
||||
'استنفدت تضمينات الذاكرة الميزانية المُدارة. أعدّ تضمينات Ollama المحلية (الاتصالات → مفاتيح API → التضمينات) أو أضف مفتاح API الخاص بك للتضمينات لمواصلة بناء الذاكرة.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'لم يتم العثور على بيانات اعتماد التضمينات. سجّل الدخول إلى OpenHuman، أو أعدّ تضمينات Ollama المحلية في الإعدادات → الذكاء الاصطناعي → التضمينات.',
|
||||
'لم يتم العثور على بيانات اعتماد التضمينات. سجّل الدخول إلى OpenHuman، أو أعدّ تضمينات Ollama المحلية في الاتصالات → مفاتيح API → التضمينات.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'تم رفض بيانات اعتماد التضمينات الخاصة بك. أعد المصادقة، أو بدّل إلى تضمينات Ollama المحلية في الإعدادات → الذكاء الاصطناعي → التضمينات.',
|
||||
'تم رفض بيانات اعتماد التضمينات الخاصة بك. أعد المصادقة، أو بدّل إلى تضمينات Ollama المحلية في الاتصالات → مفاتيح API → التضمينات.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'لم يتم تكوين أي مزوّد تضمينات، لذا فإن الاسترجاع الدلالي معطّل. أعدّ تضمينات Ollama المحلية (موصى به) أو أضف مفتاح تضمينات في الإعدادات → الذكاء الاصطناعي → التضمينات.',
|
||||
'لم يتم تكوين أي مزوّد تضمينات، لذا فإن الاسترجاع الدلالي معطّل. أعدّ تضمينات Ollama المحلية (موصى به) أو أضف مفتاح تضمينات في الاتصالات → مفاتيح API → التضمينات.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'يعيد نموذج التضمين حجم متجه خاطئًا (تتوقع الذاكرة 1024 بُعدًا). اختر نموذجًا بـ 1024 بُعدًا، أو اطلب 1024 بُعدًا من مزوّدك.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'نموذج محلي مطلوب غير متوفر. ثبّت/شغّل Ollama ونزّل النموذج، أو بدّل هذا الحِمل إلى مزوّد سحابي في الإعدادات → الذكاء الاصطناعي.',
|
||||
'نموذج محلي مطلوب غير متوفر. ثبّت/شغّل Ollama ونزّل النموذج، أو بدّل هذا الحِمل إلى مزوّد سحابي في الاتصالات → مفاتيح API.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'يتجاوز نموذج استخراج الذاكرة المهلة الزمنية، لذا فإن بنية الويكي قليلة. بدّل نموذج استخراج الذاكرة إلى نموذج أسرع في الإعدادات → الذكاء الاصطناعي.',
|
||||
'يتجاوز نموذج استخراج الذاكرة المهلة الزمنية، لذا فإن بنية الويكي قليلة. بدّل نموذج استخراج الذاكرة إلى نموذج أسرع في الاتصالات → مفاتيح API → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'لا يتوفر مزوّد تلخيص لميزة إنشاء أشجار التلخيص. فعّل الذكاء الاصطناعي المحلي (Ollama)، أو فعّل تلخيص السحابة في الإعدادات → الذكاء الاصطناعي → الذاكرة.',
|
||||
'لا يتوفر مزوّد تلخيص لميزة إنشاء أشجار التلخيص. فعّل الذكاء الاصطناعي المحلي (Ollama)، أو اضبط memory_tree.cloud_summarization_opt_in=true وهيّئ مزوّد LLM في الاتصالات → مفاتيح API → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'تم تخطي عنصر ذاكرة لأن نصه كان فارغًا. لا حاجة لأي إجراء — تستمر العناصر الجديدة في التضمين بشكل طبيعي.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6526,7 +6526,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'حدث خطأ مؤقت أدى إلى مقاطعة معالجة الذاكرة. ستتم إعادة المحاولة تلقائيًا.',
|
||||
'memory.health.remediation.unknown':
|
||||
'واجهت معالجة الذاكرة مشكلة. تحقق من الإعدادات → الذكاء الاصطناعي للتكوين.',
|
||||
'واجهت معالجة الذاكرة مشكلة. تحقق من الاتصالات → مفاتيح API للتكوين.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1059,7 +1059,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': 'অনবোর্ডিং শেষ করা যায়নি। আবার চেষ্টা করুন।',
|
||||
'onboarding.apiKeys.title': 'আপনার API কী যোগ করুন',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'এখনই পেস্ট করুন বা এড়িয়ে গিয়ে পরে Settings › AI-এ যোগ করুন। কীগুলো এই ডিভাইসে এনক্রিপ্ট করে সংরক্ষিত থাকে।',
|
||||
'এখনই পেস্ট করুন বা এড়িয়ে গিয়ে পরে সংযোগ › API কী-তে যোগ করুন। কীগুলো এই ডিভাইসে এনক্রিপ্ট করে সংরক্ষিত থাকে।',
|
||||
'onboarding.apiKeys.openaiLabel': 'OpenAI API কী',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6651,21 +6651,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'উইকি কাঠামো অসম্পূর্ণ',
|
||||
'memoryTree.status.extractionCoverage': 'এক্সট্র্যাকশন কভারেজ: {pct}% অংশের কাঠামো আছে',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'মেমরি এমবেডিং পরিচালিত বাজেটে পৌঁছেছে। স্থানীয় Ollama এমবেডিং সেট আপ করুন (সেটিংস → AI → এমবেডিংস) অথবা মেমরি তৈরি চালিয়ে যেতে আপনার নিজস্ব এমবেডিং API কী যোগ করুন।',
|
||||
'মেমরি এমবেডিং পরিচালিত বাজেটে পৌঁছেছে। স্থানীয় Ollama এমবেডিং সেট আপ করুন (সংযোগ → API কী → এমবেডিংস) অথবা মেমরি তৈরি চালিয়ে যেতে আপনার নিজস্ব এমবেডিং API কী যোগ করুন।',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'কোনও এমবেডিং শংসাপত্র পাওয়া যায়নি। OpenHuman-এ লগ ইন করুন, অথবা সেটিংস → AI → এমবেডিংস-এ স্থানীয় Ollama এমবেডিং সেট আপ করুন।',
|
||||
'কোনও এমবেডিং শংসাপত্র পাওয়া যায়নি। OpenHuman-এ লগ ইন করুন, অথবা সংযোগ → API কী → এমবেডিংস-এ স্থানীয় Ollama এমবেডিং সেট আপ করুন।',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'আপনার এমবেডিং শংসাপত্র প্রত্যাখ্যাত হয়েছে। পুনরায় প্রমাণীকরণ করুন, অথবা সেটিংস → AI → এমবেডিংস-এ স্থানীয় Ollama এমবেডিং-এ স্যুইচ করুন।',
|
||||
'আপনার এমবেডিং শংসাপত্র প্রত্যাখ্যাত হয়েছে। পুনরায় প্রমাণীকরণ করুন, অথবা সংযোগ → API কী → এমবেডিংস-এ স্থানীয় Ollama এমবেডিং-এ স্যুইচ করুন।',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'কোনও এমবেডিং প্রদানকারী কনফিগার করা নেই, তাই সিম্যান্টিক রিকল বন্ধ। স্থানীয় Ollama এমবেডিং সেট আপ করুন (প্রস্তাবিত) অথবা সেটিংস → AI → এমবেডিংস-এ একটি এমবেডিং কী যোগ করুন।',
|
||||
'কোনও এমবেডিং প্রদানকারী কনফিগার করা নেই, তাই সিম্যান্টিক রিকল বন্ধ। স্থানীয় Ollama এমবেডিং সেট আপ করুন (প্রস্তাবিত) অথবা সংযোগ → API কী → এমবেডিংস-এ একটি এমবেডিং কী যোগ করুন।',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'এমবেডিং মডেল ভুল ভেক্টর আকার ফেরত দেয় (মেমরি 1024 মাত্রা প্রত্যাশা করে)। 1024-মাত্রার একটি মডেল বেছে নিন, অথবা আপনার প্রদানকারীর কাছে 1024 মাত্রা অনুরোধ করুন।',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'একটি প্রয়োজনীয় স্থানীয় মডেল উপলব্ধ নেই। Ollama ইনস্টল/চালু করুন এবং মডেলটি ডাউনলোড করুন, অথবা সেটিংস → AI-তে এই কাজের চাপ একটি ক্লাউড প্রদানকারীতে স্যুইচ করুন।',
|
||||
'একটি প্রয়োজনীয় স্থানীয় মডেল উপলব্ধ নেই। Ollama ইনস্টল/চালু করুন এবং মডেলটি ডাউনলোড করুন, অথবা সংযোগ → API কী-তে এই কাজের চাপ একটি ক্লাউড প্রদানকারীতে স্যুইচ করুন।',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'মেমরি এক্সট্র্যাকশন মডেল টাইম আউট হচ্ছে, তাই উইকিতে সামান্য কাঠামো আছে। সেটিংস → AI-তে মেমরি এক্সট্র্যাকশন মডেল একটি দ্রুততর মডেলে পরিবর্তন করুন।',
|
||||
'মেমরি এক্সট্র্যাকশন মডেল টাইম আউট হচ্ছে, তাই উইকিতে সামান্য কাঠামো আছে। সংযোগ → API কী → LLM-তে মেমরি এক্সট্র্যাকশন মডেল একটি দ্রুততর মডেলে পরিবর্তন করুন।',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'সারাংশ ট্রি তৈরির জন্য কোনও সারাংশ প্রদানকারী উপলব্ধ নেই। স্থানীয় AI (Ollama) সক্ষম করুন, অথবা সেটিংস → AI → মেমরিতে ক্লাউড সারাংশ সক্ষম করুন।',
|
||||
'সারাংশ ট্রি তৈরির জন্য কোনও সারাংশ প্রদানকারী উপলব্ধ নেই। স্থানীয় AI (Ollama) সক্ষম করুন, অথবা memory_tree.cloud_summarization_opt_in=true সেট করে সংযোগ → API কী → LLM-তে একটি LLM প্রদানকারী কনফিগার করুন।',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'একটি মেমরি আইটেম এড়িয়ে যাওয়া হয়েছে কারণ এর পাঠ্য খালি ছিল। কোনো পদক্ষেপের প্রয়োজন নেই — নতুন আইটেমগুলি স্বাভাবিকভাবে এমবেড করতে থাকে।',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6673,7 +6673,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'একটি অস্থায়ী ত্রুটি মেমরি প্রক্রিয়াকরণে বাধা দিয়েছে। স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা করা হবে।',
|
||||
'memory.health.remediation.unknown':
|
||||
'মেমরি প্রক্রিয়াকরণে একটি সমস্যা হয়েছে। কনফিগারেশনের জন্য সেটিংস → AI পরীক্ষা করুন।',
|
||||
'মেমরি প্রক্রিয়াকরণে একটি সমস্যা হয়েছে। কনফিগারেশনের জন্য সংযোগ → API কী পরীক্ষা করুন।',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
+11
-11
@@ -1089,7 +1089,7 @@ const messages: TranslationMap = {
|
||||
'Onboarding konnte nicht abgeschlossen werden. Bitte versuchen Sie es erneut.',
|
||||
'onboarding.apiKeys.title': 'Fügen wir deine API-Schlüssel hinzu',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Du kannst sie jetzt einfügen oder überspringen und später unter „Einstellungen“ > „KI“ hinzufügen. Schlüssel werden auf diesem Gerät gespeichert und im Ruhezustand verschlüsselt.',
|
||||
'Du kannst sie jetzt einfügen oder überspringen und später unter „Verbindungen“ > „API-Schlüssel“ hinzufügen. Schlüssel werden auf diesem Gerät gespeichert und im Ruhezustand verschlüsselt.',
|
||||
'onboarding.apiKeys.openaiLabel': 'OpenAI API Schlüssel',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -4235,8 +4235,8 @@ const messages: TranslationMap = {
|
||||
'pages.settings.accountSection.description':
|
||||
'Wiederherstellungsphrase, Team, Verbindungen und Datenschutzeinstellungen.',
|
||||
'pages.settings.accountSection.title': 'Konto',
|
||||
'pages.settings.ai.llm': 'Llm',
|
||||
'pages.settings.ai.llmDesc': 'Llm absch',
|
||||
'pages.settings.ai.llm': 'LLM',
|
||||
'pages.settings.ai.llmDesc': 'Sprachmodell-Anbieter und Routing',
|
||||
'pages.settings.ai.voice': 'Stimme',
|
||||
'pages.settings.ai.voiceDesc': 'Sprachbeschreibung',
|
||||
'pages.settings.aiSection.description':
|
||||
@@ -6828,21 +6828,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.extractionCoverage':
|
||||
'Extraktionsabdeckung: {pct}% der Abschnitte haben Struktur',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Die Speicher-Embeddings haben das verwaltete Budget erreicht. Richte lokale Ollama-Embeddings ein (Einstellungen → KI → Einbettungen) oder füge deinen eigenen Embeddings-API-Schlüssel hinzu, um den Speicher weiter aufzubauen.',
|
||||
'Die Speicher-Embeddings haben das verwaltete Budget erreicht. Richte lokale Ollama-Embeddings ein (Verbindungen → API-Schlüssel → Einbettungen) oder füge deinen eigenen Embeddings-API-Schlüssel hinzu, um den Speicher weiter aufzubauen.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'Keine Embeddings-Anmeldedaten gefunden. Melde dich bei OpenHuman an oder richte lokale Ollama-Embeddings unter Einstellungen → KI → Einbettungen ein.',
|
||||
'Keine Embeddings-Anmeldedaten gefunden. Melde dich bei OpenHuman an oder richte lokale Ollama-Embeddings unter Verbindungen → API-Schlüssel → Einbettungen ein.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Deine Embeddings-Anmeldedaten wurden abgelehnt. Authentifiziere dich erneut oder wechsle unter Einstellungen → KI → Einbettungen zu lokalen Ollama-Embeddings.',
|
||||
'Deine Embeddings-Anmeldedaten wurden abgelehnt. Authentifiziere dich erneut oder wechsle unter Verbindungen → API-Schlüssel → Einbettungen zu lokalen Ollama-Embeddings.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'Es ist kein Embeddings-Anbieter konfiguriert, daher ist die semantische Suche deaktiviert. Richte lokale Ollama-Embeddings ein (empfohlen) oder füge unter Einstellungen → KI → Einbettungen einen Embeddings-Schlüssel hinzu.',
|
||||
'Es ist kein Embeddings-Anbieter konfiguriert, daher ist die semantische Suche deaktiviert. Richte lokale Ollama-Embeddings ein (empfohlen) oder füge unter Verbindungen → API-Schlüssel → Einbettungen einen Embeddings-Schlüssel hinzu.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'Das Embedding-Modell liefert die falsche Vektorgröße (der Speicher erwartet 1024 Dimensionen). Wähle ein Modell mit 1024 Dimensionen oder fordere 1024 Dimensionen von deinem Anbieter an.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'Ein erforderliches lokales Modell ist nicht verfügbar. Installiere/starte Ollama und lade das Modell herunter, oder wechsle diese Arbeitslast unter Einstellungen → KI zu einem Cloud-Anbieter.',
|
||||
'Ein erforderliches lokales Modell ist nicht verfügbar. Installiere/starte Ollama und lade das Modell herunter, oder wechsle diese Arbeitslast unter Verbindungen → API-Schlüssel zu einem Cloud-Anbieter.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'Das Modell zur Speicherextraktion überschreitet die Zeit, daher hat das Wiki wenig Struktur. Wechsle das Modell für die Speicherextraktion unter Einstellungen → KI zu einem schnelleren.',
|
||||
'Das Modell zur Speicherextraktion überschreitet die Zeit, daher hat das Wiki wenig Struktur. Wechsle das Modell für die Speicherextraktion unter Verbindungen → API-Schlüssel → LLM zu einem schnelleren.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'Für „Zusammenfassungsbäume erstellen” ist kein Zusammenfassungsanbieter verfügbar. Aktiviere die lokale KI (Ollama) oder aktiviere die Cloud-Zusammenfassung unter Einstellungen → KI → Speicher.',
|
||||
'Für „Zusammenfassungsbäume erstellen” ist kein Zusammenfassungsanbieter verfügbar. Aktiviere die lokale KI (Ollama) oder setze memory_tree.cloud_summarization_opt_in=true und konfiguriere einen LLM-Anbieter unter Verbindungen → API-Schlüssel → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'Ein Speicherelement wurde übersprungen, weil sein Text leer war. Keine Aktion erforderlich — neue Einträge werden weiterhin normal eingebettet.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6850,7 +6850,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'Ein vorübergehender Fehler hat die Speicherverarbeitung unterbrochen. Es wird automatisch erneut versucht.',
|
||||
'memory.health.remediation.unknown':
|
||||
'Bei der Speicherverarbeitung ist ein Problem aufgetreten. Überprüfe Einstellungen → KI für die Konfiguration.',
|
||||
'Bei der Speicherverarbeitung ist ein Problem aufgetreten. Überprüfe Verbindungen → API-Schlüssel für die Konfiguration.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1079,21 +1079,21 @@ const en: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'Wiki structure incomplete',
|
||||
'memoryTree.status.extractionCoverage': 'Extraction coverage: {pct}% of chunks have structure',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Memory embeddings hit the managed budget. Set up local Ollama embeddings (Settings → AI → Embeddings) or add your own embeddings API key to keep building memory.',
|
||||
'Memory embeddings hit the managed budget. Set up local Ollama embeddings (Connections → API keys → Embeddings) or add your own embeddings API key to keep building memory.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'No embeddings credentials found. Log in to OpenHuman, or set up local Ollama embeddings in Settings → AI → Embeddings.',
|
||||
'No embeddings credentials found. Log in to OpenHuman, or set up local Ollama embeddings in Connections → API keys → Embeddings.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Your embeddings credentials were rejected. Re-authenticate, or switch to local Ollama embeddings in Settings → AI → Embeddings.',
|
||||
'Your embeddings credentials were rejected. Re-authenticate, or switch to local Ollama embeddings in Connections → API keys → Embeddings.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'No embeddings provider is configured, so semantic recall is off. Set up local Ollama embeddings (recommended) or add an embeddings key in Settings → AI → Embeddings.',
|
||||
'No embeddings provider is configured, so semantic recall is off. Set up local Ollama embeddings (recommended) or add an embeddings key in Connections → API keys → Embeddings.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'The embedding model returns the wrong vector size (memory expects 1024 dimensions). Pick a 1024-dim model, or request 1024 dimensions for your provider.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'A required local model is not available. Install/run Ollama and pull the model, or switch this workload to a cloud provider in Settings → AI.',
|
||||
'A required local model is not available. Install/run Ollama and pull the model, or switch this workload to a cloud provider in Connections → API keys.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'The memory extraction model is timing out, so the wiki has little structure. Switch the Memory extraction model to a faster one in Settings → AI.',
|
||||
'The memory extraction model is timing out, so the wiki has little structure. Switch the Memory extraction model to a faster one in Connections → API keys → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'No summarization provider is available for Build Summary Trees. Enable local AI (Ollama), or enable cloud summarization in Settings → AI → Memory.',
|
||||
'No summarization provider is available for Build Summary Trees. Enable local AI (Ollama), or set memory_tree.cloud_summarization_opt_in=true and configure an LLM provider in Connections → API keys → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'A memory item was skipped because its text was empty. No action needed — newer items continue to embed normally.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -1101,7 +1101,7 @@ const en: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'A temporary error interrupted memory processing. It will retry automatically.',
|
||||
'memory.health.remediation.unknown':
|
||||
'Memory processing encountered an issue. Check Settings → AI for configuration.',
|
||||
'Memory processing encountered an issue. Check Connections → API keys for configuration.',
|
||||
'memoryTree.status.fetchError': "Couldn't fetch Memory Tree status",
|
||||
'memoryTree.status.retry': 'Retry',
|
||||
'memoryTree.status.toggleFailed': "Couldn't toggle auto-sync",
|
||||
@@ -1188,7 +1188,7 @@ const en: TranslationMap = {
|
||||
// Onboarding: API keys step (only when Custom is picked)
|
||||
'onboarding.apiKeys.title': "Let's Add Your API Keys",
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'You can paste them now or skip and add them later in Settings › AI. Keys are stored on this device, encrypted at rest.',
|
||||
'You can paste them now or skip and add them later in Connections › API keys. Keys are stored on this device, encrypted at rest.',
|
||||
'onboarding.apiKeys.openaiLabel': 'OpenAI API key',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
|
||||
@@ -1080,7 +1080,7 @@ const messages: TranslationMap = {
|
||||
'No se pudo completar el proceso de incorporación. Por favor, inténtalo de nuevo.',
|
||||
'onboarding.apiKeys.title': 'Agreguemos tus claves API',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Puedes pegarlas ahora u omitir y agregarlas luego en Configuración › IA. Las claves se guardan en este dispositivo, cifradas en reposo.',
|
||||
'Puedes pegarlas ahora u omitir y agregarlas luego en Conexiones › claves API. Las claves se guardan en este dispositivo, cifradas en reposo.',
|
||||
'onboarding.apiKeys.openaiLabel': 'Clave API de OpenAI',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6777,21 +6777,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.extractionCoverage':
|
||||
'Cobertura de extracción: {pct}% de los fragmentos tienen estructura',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Los embeddings de memoria agotaron el presupuesto gestionado. Configura embeddings locales de Ollama (Configuración → IA → Incrustaciones) o añade tu propia clave de API de embeddings para seguir construyendo la memoria.',
|
||||
'Los embeddings de memoria agotaron el presupuesto gestionado. Configura embeddings locales de Ollama (Conexiones → Claves de API → Incrustaciones) o añade tu propia clave de API de embeddings para seguir construyendo la memoria.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'No se encontraron credenciales de embeddings. Inicia sesión en OpenHuman o configura embeddings locales de Ollama en Configuración → IA → Incrustaciones.',
|
||||
'No se encontraron credenciales de embeddings. Inicia sesión en OpenHuman o configura embeddings locales de Ollama en Conexiones → Claves de API → Incrustaciones.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Tus credenciales de embeddings fueron rechazadas. Vuelve a autenticarte o cambia a embeddings locales de Ollama en Configuración → IA → Incrustaciones.',
|
||||
'Tus credenciales de embeddings fueron rechazadas. Vuelve a autenticarte o cambia a embeddings locales de Ollama en Conexiones → Claves de API → Incrustaciones.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'No hay ningún proveedor de embeddings configurado, por lo que la recuperación semántica está desactivada. Configura embeddings locales de Ollama (recomendado) o añade una clave de embeddings en Configuración → IA → Incrustaciones.',
|
||||
'No hay ningún proveedor de embeddings configurado, por lo que la recuperación semántica está desactivada. Configura embeddings locales de Ollama (recomendado) o añade una clave de embeddings en Conexiones → Claves de API → Incrustaciones.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'El modelo de embeddings devuelve un tamaño de vector incorrecto (la memoria espera 1024 dimensiones). Elige un modelo de 1024 dimensiones o solicita 1024 dimensiones a tu proveedor.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'No hay disponible un modelo local requerido. Instala/ejecuta Ollama y descarga el modelo, o cambia esta carga de trabajo a un proveedor en la nube en Configuración → IA.',
|
||||
'No hay disponible un modelo local requerido. Instala/ejecuta Ollama y descarga el modelo, o cambia esta carga de trabajo a un proveedor en la nube en Conexiones → Claves de API.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'El modelo de extracción de memoria está agotando el tiempo de espera, por lo que la wiki tiene poca estructura. Cambia el modelo de extracción de memoria por uno más rápido en Configuración → IA.',
|
||||
'El modelo de extracción de memoria está agotando el tiempo de espera, por lo que la wiki tiene poca estructura. Cambia el modelo de extracción de memoria por uno más rápido en Conexiones → Claves de API → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'No hay ningún proveedor de resúmenes disponible para Crear árboles de resumen. Activa la IA local (Ollama) o activa el resumen en la nube en Configuración → IA → Memoria.',
|
||||
'No hay ningún proveedor de resúmenes disponible para Crear árboles de resumen. Activa la IA local (Ollama), o configura memory_tree.cloud_summarization_opt_in=true y un proveedor LLM en Conexiones → Claves de API → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'Se omitió un elemento de memoria porque su texto estaba vacío. No se requiere ninguna acción — los elementos nuevos siguen incrustándose con normalidad.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6799,7 +6799,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'Un error temporal interrumpió el procesamiento de la memoria. Se reintentará automáticamente.',
|
||||
'memory.health.remediation.unknown':
|
||||
'El procesamiento de la memoria encontró un problema. Comprueba Configuración → IA para la configuración.',
|
||||
'El procesamiento de la memoria encontró un problema. Comprueba Conexiones → Claves de API para la configuración.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1084,7 +1084,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': "Impossible de terminer l'intégration. Veuillez réessayer.",
|
||||
'onboarding.apiKeys.title': 'Ajoutons tes clés API',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Tu peux les coller maintenant ou passer et les ajouter plus tard dans Paramètres › IA. Les clés sont stockées sur cet appareil, chiffrées au repos.',
|
||||
'Tu peux les coller maintenant ou passer et les ajouter plus tard dans Connexions › clés API. Les clés sont stockées sur cet appareil, chiffrées au repos.',
|
||||
'onboarding.apiKeys.openaiLabel': 'Clé API OpenAI',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6800,21 +6800,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.extractionCoverage':
|
||||
"Couverture d'extraction : {pct}% des fragments ont une structure",
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
"Les embeddings de mémoire ont atteint le budget géré. Configurez des embeddings Ollama locaux (Paramètres → IA → Encastrements) ou ajoutez votre propre clé d'API d'embeddings pour continuer à construire la mémoire.",
|
||||
"Les embeddings de mémoire ont atteint le budget géré. Configurez des embeddings Ollama locaux (Connexions → Clés API → Intégrations) ou ajoutez votre propre clé d'API d'embeddings pour continuer à construire la mémoire.",
|
||||
'memory.health.remediation.auth_missing':
|
||||
"Aucune information d'identification d'embeddings trouvée. Connectez-vous à OpenHuman ou configurez des embeddings Ollama locaux dans Paramètres → IA → Encastrements.",
|
||||
"Aucune information d'identification d'embeddings trouvée. Connectez-vous à OpenHuman ou configurez des embeddings Ollama locaux dans Connexions → Clés API → Intégrations.",
|
||||
'memory.health.remediation.auth_invalid':
|
||||
"Vos informations d'identification d'embeddings ont été rejetées. Authentifiez-vous à nouveau ou passez aux embeddings Ollama locaux dans Paramètres → IA → Encastrements.",
|
||||
"Vos informations d'identification d'embeddings ont été rejetées. Authentifiez-vous à nouveau ou passez aux embeddings Ollama locaux dans Connexions → Clés API → Intégrations.",
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
"Aucun fournisseur d'embeddings n'est configuré, le rappel sémantique est donc désactivé. Configurez des embeddings Ollama locaux (recommandé) ou ajoutez une clé d'embeddings dans Paramètres → IA → Encastrements.",
|
||||
"Aucun fournisseur d'embeddings n'est configuré, le rappel sémantique est donc désactivé. Configurez des embeddings Ollama locaux (recommandé) ou ajoutez une clé d'embeddings dans Connexions → Clés API → Intégrations.",
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
"Le modèle d'embeddings renvoie une taille de vecteur incorrecte (la mémoire attend 1024 dimensions). Choisissez un modèle à 1024 dimensions ou demandez 1024 dimensions à votre fournisseur.",
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
"Un modèle local requis n'est pas disponible. Installez/lancez Ollama et téléchargez le modèle, ou basculez cette charge de travail vers un fournisseur cloud dans Paramètres → IA.",
|
||||
"Un modèle local requis n'est pas disponible. Installez/lancez Ollama et téléchargez le modèle, ou basculez cette charge de travail vers un fournisseur cloud dans Connexions → Clés API.",
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
"Le modèle d'extraction de mémoire dépasse le délai imparti, le wiki a donc peu de structure. Choisissez un modèle d'extraction de mémoire plus rapide dans Paramètres → IA.",
|
||||
"Le modèle d'extraction de mémoire dépasse le délai imparti, le wiki a donc peu de structure. Choisissez un modèle d'extraction de mémoire plus rapide dans Connexions → Clés API → LLM.",
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
"Aucun fournisseur de résumé n'est disponible pour Créer des arbres de résumé. Activez l'IA locale (Ollama) ou activez la synthèse cloud dans Paramètres → IA → Mémoire.",
|
||||
"Aucun fournisseur de résumé n'est disponible pour Créer des arbres de résumé. Activez l'IA locale (Ollama), ou définissez memory_tree.cloud_summarization_opt_in=true et configurez un fournisseur LLM dans Connexions → Clés API → LLM.",
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
"Un élément de mémoire a été ignoré car son texte était vide. Aucune action requise — les nouveaux éléments continuent de s'intégrer normalement.",
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6822,7 +6822,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'Une erreur temporaire a interrompu le traitement de la mémoire. Une nouvelle tentative aura lieu automatiquement.',
|
||||
'memory.health.remediation.unknown':
|
||||
'Le traitement de la mémoire a rencontré un problème. Vérifiez Paramètres → IA pour la configuration.',
|
||||
'Le traitement de la mémoire a rencontré un problème. Vérifiez Connexions → Clés API pour la configuration.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1056,7 +1056,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': 'ऑनबोर्डिंग पूरी नहीं हो सकी। कृपया पुनः प्रयास करें।',
|
||||
'onboarding.apiKeys.title': 'अपनी API Keys जोड़ें',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'अभी पेस्ट करें या बाद में Settings › AI में जोड़ें। Keys इस डिवाइस पर एन्क्रिप्टेड रहती हैं।',
|
||||
'अभी पेस्ट करें या बाद में कनेक्शन › API कुंजियाँ में जोड़ें। Keys इस डिवाइस पर एन्क्रिप्टेड रहती हैं।',
|
||||
'onboarding.apiKeys.openaiLabel': 'OpenAI API कुंजी',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6648,21 +6648,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'विकी संरचना अधूरी',
|
||||
'memoryTree.status.extractionCoverage': 'एक्सट्रैक्शन कवरेज: {pct}% खंडों में संरचना है',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'मेमोरी एम्बेडिंग प्रबंधित बजट तक पहुँच गई। स्थानीय Ollama एम्बेडिंग सेट करें (सेटिंग्स → AI → एम्बेडिंग्स) या मेमोरी बनाना जारी रखने के लिए अपनी स्वयं की एम्बेडिंग API कुंजी जोड़ें।',
|
||||
'मेमोरी एम्बेडिंग प्रबंधित बजट तक पहुँच गई। स्थानीय Ollama एम्बेडिंग सेट करें (कनेक्शन → API कुंजियाँ → एम्बेडिंग्स) या मेमोरी बनाना जारी रखने के लिए अपनी स्वयं की एम्बेडिंग API कुंजी जोड़ें।',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'कोई एम्बेडिंग क्रेडेंशियल नहीं मिला। OpenHuman में लॉग इन करें, या सेटिंग्स → AI → एम्बेडिंग्स में स्थानीय Ollama एम्बेडिंग सेट करें।',
|
||||
'कोई एम्बेडिंग क्रेडेंशियल नहीं मिला। OpenHuman में लॉग इन करें, या कनेक्शन → API कुंजियाँ → एम्बेडिंग्स में स्थानीय Ollama एम्बेडिंग सेट करें।',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'आपके एम्बेडिंग क्रेडेंशियल अस्वीकार कर दिए गए। फिर से प्रमाणित करें, या सेटिंग्स → AI → एम्बेडिंग्स में स्थानीय Ollama एम्बेडिंग पर स्विच करें।',
|
||||
'आपके एम्बेडिंग क्रेडेंशियल अस्वीकार कर दिए गए। फिर से प्रमाणित करें, या कनेक्शन → API कुंजियाँ → एम्बेडिंग्स में स्थानीय Ollama एम्बेडिंग पर स्विच करें।',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'कोई एम्बेडिंग प्रदाता कॉन्फ़िगर नहीं किया गया है, इसलिए सिमेंटिक रिकॉल बंद है। स्थानीय Ollama एम्बेडिंग सेट करें (अनुशंसित) या सेटिंग्स → AI → एम्बेडिंग्स में एम्बेडिंग कुंजी जोड़ें।',
|
||||
'कोई एम्बेडिंग प्रदाता कॉन्फ़िगर नहीं किया गया है, इसलिए सिमेंटिक रिकॉल बंद है। स्थानीय Ollama एम्बेडिंग सेट करें (अनुशंसित) या कनेक्शन → API कुंजियाँ → एम्बेडिंग्स में एम्बेडिंग कुंजी जोड़ें।',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'एम्बेडिंग मॉडल गलत वेक्टर आकार लौटाता है (मेमोरी को 1024 आयाम अपेक्षित हैं)। 1024-आयाम वाला मॉडल चुनें, या अपने प्रदाता से 1024 आयाम का अनुरोध करें।',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'एक आवश्यक स्थानीय मॉडल उपलब्ध नहीं है। Ollama इंस्टॉल/चलाएँ और मॉडल डाउनलोड करें, या सेटिंग्स → AI में इस वर्कलोड को क्लाउड प्रदाता पर स्विच करें।',
|
||||
'एक आवश्यक स्थानीय मॉडल उपलब्ध नहीं है। Ollama इंस्टॉल/चलाएँ और मॉडल डाउनलोड करें, या कनेक्शन → API कुंजियाँ में इस वर्कलोड को क्लाउड प्रदाता पर स्विच करें।',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'मेमोरी एक्सट्रैक्शन मॉडल टाइम आउट हो रहा है, इसलिए विकी में बहुत कम संरचना है। सेटिंग्स → AI में मेमोरी एक्सट्रैक्शन मॉडल को तेज़ मॉडल में बदलें।',
|
||||
'मेमोरी एक्सट्रैक्शन मॉडल टाइम आउट हो रहा है, इसलिए विकी में बहुत कम संरचना है। कनेक्शन → API कुंजियाँ → LLM में मेमोरी एक्सट्रैक्शन मॉडल को तेज़ मॉडल में बदलें।',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'सारांश ट्री बनाएँ के लिए कोई सारांश प्रदाता उपलब्ध नहीं है। स्थानीय AI (Ollama) सक्षम करें, या सेटिंग्स → AI → मेमोरी में क्लाउड सारांश सक्षम करें।',
|
||||
'सारांश ट्री बनाएँ के लिए कोई सारांश प्रदाता उपलब्ध नहीं है। स्थानीय AI (Ollama) सक्षम करें, या memory_tree.cloud_summarization_opt_in=true सेट करके कनेक्शन → API कुंजियाँ → LLM में LLM provider कॉन्फ़िगर करें।',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'एक मेमोरी आइटम छोड़ दिया गया क्योंकि उसका टेक्स्ट खाली था। कोई कार्रवाई आवश्यक नहीं — नए आइटम सामान्य रूप से एम्बेड होते रहेंगे।',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6670,7 +6670,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'एक अस्थायी त्रुटि ने मेमोरी प्रोसेसिंग को बाधित किया। स्वचालित रूप से पुनः प्रयास किया जाएगा।',
|
||||
'memory.health.remediation.unknown':
|
||||
'मेमोरी प्रोसेसिंग में एक समस्या आई। कॉन्फ़िगरेशन के लिए सेटिंग्स → AI जाँचें।',
|
||||
'मेमोरी प्रोसेसिंग में एक समस्या आई। कॉन्फ़िगरेशन के लिए कनेक्शन → API कुंजियाँ जाँचें।',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1066,7 +1066,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': 'Tidak dapat menyelesaikan orientasi. Silakan coba lagi.',
|
||||
'onboarding.apiKeys.title': 'Mari Tambahkan API Key Anda',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Anda dapat menempelkannya sekarang atau lewati dan tambahkan nanti di Pengaturan › AI. Key disimpan di perangkat ini, dienkripsi saat penyimpanan.',
|
||||
'Anda dapat menempelkannya sekarang atau lewati dan tambahkan nanti di Koneksi › API key. Key disimpan di perangkat ini, dienkripsi saat penyimpanan.',
|
||||
'onboarding.apiKeys.openaiLabel': 'API key OpenAI',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6671,21 +6671,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'Struktur wiki tidak lengkap',
|
||||
'memoryTree.status.extractionCoverage': 'Cakupan ekstraksi: {pct}% bagian memiliki struktur',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Embedding memori mencapai batas anggaran terkelola. Siapkan embedding Ollama lokal (Pengaturan → AI → Sematan) atau tambahkan kunci API embedding Anda sendiri untuk terus membangun memori.',
|
||||
'Embedding memori mencapai batas anggaran terkelola. Siapkan embedding Ollama lokal (Koneksi → Kunci API → Penyematan) atau tambahkan kunci API embedding Anda sendiri untuk terus membangun memori.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'Kredensial embedding tidak ditemukan. Masuk ke OpenHuman, atau siapkan embedding Ollama lokal di Pengaturan → AI → Sematan.',
|
||||
'Kredensial embedding tidak ditemukan. Masuk ke OpenHuman, atau siapkan embedding Ollama lokal di Koneksi → Kunci API → Penyematan.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Kredensial embedding Anda ditolak. Autentikasi ulang, atau beralih ke embedding Ollama lokal di Pengaturan → AI → Sematan.',
|
||||
'Kredensial embedding Anda ditolak. Autentikasi ulang, atau beralih ke embedding Ollama lokal di Koneksi → Kunci API → Penyematan.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'Tidak ada penyedia embedding yang dikonfigurasi, sehingga recall semantik nonaktif. Siapkan embedding Ollama lokal (disarankan) atau tambahkan kunci embedding di Pengaturan → AI → Sematan.',
|
||||
'Tidak ada penyedia embedding yang dikonfigurasi, sehingga recall semantik nonaktif. Siapkan embedding Ollama lokal (disarankan) atau tambahkan kunci embedding di Koneksi → Kunci API → Penyematan.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'Model embedding mengembalikan ukuran vektor yang salah (memori mengharapkan 1024 dimensi). Pilih model 1024 dimensi, atau minta 1024 dimensi dari penyedia Anda.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'Model lokal yang diperlukan tidak tersedia. Instal/jalankan Ollama dan unduh model, atau alihkan beban kerja ini ke penyedia cloud di Pengaturan → AI.',
|
||||
'Model lokal yang diperlukan tidak tersedia. Instal/jalankan Ollama dan unduh model, atau alihkan beban kerja ini ke penyedia cloud di Koneksi → Kunci API.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'Model ekstraksi memori kehabisan waktu, sehingga wiki memiliki sedikit struktur. Ganti model ekstraksi memori ke yang lebih cepat di Pengaturan → AI.',
|
||||
'Model ekstraksi memori kehabisan waktu, sehingga wiki memiliki sedikit struktur. Ganti model ekstraksi memori ke yang lebih cepat di Koneksi → Kunci API → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'Tidak ada penyedia ringkasan yang tersedia untuk Buat Pohon Ringkasan. Aktifkan AI lokal (Ollama), atau aktifkan ringkasan cloud di Pengaturan → AI → Memori.',
|
||||
'Tidak ada penyedia ringkasan yang tersedia untuk Buat Pohon Ringkasan. Aktifkan AI lokal (Ollama), atau setel memory_tree.cloud_summarization_opt_in=true dan konfigurasikan penyedia LLM di Koneksi → Kunci API → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'Item memori dilewati karena teksnya kosong. Tidak diperlukan tindakan — item baru tetap disematkan seperti biasa.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6693,7 +6693,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'Kesalahan sementara mengganggu pemrosesan memori. Akan dicoba lagi secara otomatis.',
|
||||
'memory.health.remediation.unknown':
|
||||
'Pemrosesan memori mengalami masalah. Periksa Pengaturan → AI untuk konfigurasi.',
|
||||
'Pemrosesan memori mengalami masalah. Periksa Koneksi → Kunci API untuk konfigurasi.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1080,7 +1080,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': "Impossibile completare l'onboarding. Riprova.",
|
||||
'onboarding.apiKeys.title': 'Aggiungiamo le tue chiavi API',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Puoi incollarle ora o saltare e aggiungerle dopo in Impostazioni › AI. Le chiavi sono memorizzate su questo dispositivo, crittografate a riposo.',
|
||||
'Puoi incollarle ora o saltare e aggiungerle dopo in Connessioni › chiavi API. Le chiavi sono memorizzate su questo dispositivo, crittografate a riposo.',
|
||||
'onboarding.apiKeys.openaiLabel': 'Chiave API OpenAI',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6763,21 +6763,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.extractionCoverage':
|
||||
'Copertura di estrazione: {pct}% dei frammenti ha una struttura',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Gli embedding della memoria hanno raggiunto il budget gestito. Configura embedding Ollama locali (Impostazioni → IA → Incorporamenti) o aggiungi la tua chiave API per gli embedding per continuare a costruire la memoria.',
|
||||
'Gli embedding della memoria hanno raggiunto il budget gestito. Configura embedding Ollama locali (Connessioni → Chiavi API → Incorporamenti) o aggiungi la tua chiave API per gli embedding per continuare a costruire la memoria.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'Nessuna credenziale per gli embedding trovata. Accedi a OpenHuman o configura embedding Ollama locali in Impostazioni → IA → Incorporamenti.',
|
||||
'Nessuna credenziale per gli embedding trovata. Accedi a OpenHuman o configura embedding Ollama locali in Connessioni → Chiavi API → Incorporamenti.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Le tue credenziali per gli embedding sono state rifiutate. Autenticati di nuovo o passa agli embedding Ollama locali in Impostazioni → IA → Incorporamenti.',
|
||||
'Le tue credenziali per gli embedding sono state rifiutate. Autenticati di nuovo o passa agli embedding Ollama locali in Connessioni → Chiavi API → Incorporamenti.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'Nessun provider di embedding è configurato, quindi il richiamo semantico è disattivato. Configura embedding Ollama locali (consigliato) o aggiungi una chiave per gli embedding in Impostazioni → IA → Incorporamenti.',
|
||||
'Nessun provider di embedding è configurato, quindi il richiamo semantico è disattivato. Configura embedding Ollama locali (consigliato) o aggiungi una chiave per gli embedding in Connessioni → Chiavi API → Incorporamenti.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'Il modello di embedding restituisce una dimensione del vettore errata (la memoria prevede 1024 dimensioni). Scegli un modello a 1024 dimensioni o richiedi 1024 dimensioni al tuo provider.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'Un modello locale richiesto non è disponibile. Installa/avvia Ollama e scarica il modello, oppure passa questo carico di lavoro a un provider cloud in Impostazioni → IA.',
|
||||
'Un modello locale richiesto non è disponibile. Installa/avvia Ollama e scarica il modello, oppure passa questo carico di lavoro a un provider cloud in Connessioni → Chiavi API.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'Il modello di estrazione della memoria sta andando in timeout, quindi il wiki ha poca struttura. Passa a un modello di estrazione della memoria più veloce in Impostazioni → IA.',
|
||||
'Il modello di estrazione della memoria sta andando in timeout, quindi il wiki ha poca struttura. Passa a un modello di estrazione della memoria più veloce in Connessioni → Chiavi API → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
"Nessun provider di riepilogo è disponibile per Crea alberi di riepilogo. Abilita l'IA locale (Ollama) o abilita il riepilogo cloud in Impostazioni → IA → Memoria.",
|
||||
"Nessun provider di riepilogo è disponibile per Crea alberi di riepilogo. Abilita l'IA locale (Ollama), oppure imposta memory_tree.cloud_summarization_opt_in=true e configura un provider LLM in Connessioni → Chiavi API → LLM.",
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'Un elemento di memoria è stato saltato perché il suo testo era vuoto. Nessuna azione necessaria — i nuovi elementi continuano a essere incorporati normalmente.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6785,7 +6785,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
"Un errore temporaneo ha interrotto l'elaborazione della memoria. Verrà riprovato automaticamente.",
|
||||
'memory.health.remediation.unknown':
|
||||
"L'elaborazione della memoria ha riscontrato un problema. Controlla Impostazioni → IA per la configurazione.",
|
||||
"L'elaborazione della memoria ha riscontrato un problema. Controlla Connessioni → Chiavi API per la configurazione.",
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1050,7 +1050,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': '온보딩을 완료할 수 없습니다. 다시 시도해 주세요.',
|
||||
'onboarding.apiKeys.title': 'API 키를 추가해 봅시다',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'지금 붙여넣거나 건너뛰고 나중에 설정 › AI에서 추가할 수 있습니다. 키는 이 기기에 저장되며 저장 시 암호화됩니다.',
|
||||
'지금 붙여넣거나 건너뛰고 나중에 연결 › API 키에서 추가할 수 있습니다. 키는 이 기기에 저장되며 저장 시 암호화됩니다.',
|
||||
'onboarding.apiKeys.openaiLabel': 'OpenAI API 키',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6574,21 +6574,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': '위키 구조 불완전',
|
||||
'memoryTree.status.extractionCoverage': '추출 범위: 청크의 {pct}%에 구조가 있음',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'메모리 임베딩이 관리형 예산에 도달했습니다. 로컬 Ollama 임베딩을 설정하거나(설정 → AI → 임베딩) 메모리를 계속 구축하려면 자체 임베딩 API 키를 추가하세요.',
|
||||
'메모리 임베딩이 관리형 예산에 도달했습니다. 로컬 Ollama 임베딩을 설정하거나(연결 → API 키 → 임베딩) 메모리를 계속 구축하려면 자체 임베딩 API 키를 추가하세요.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'임베딩 자격 증명을 찾을 수 없습니다. OpenHuman에 로그인하거나 설정 → AI → 임베딩에서 로컬 Ollama 임베딩을 설정하세요.',
|
||||
'임베딩 자격 증명을 찾을 수 없습니다. OpenHuman에 로그인하거나 연결 → API 키 → 임베딩에서 로컬 Ollama 임베딩을 설정하세요.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'임베딩 자격 증명이 거부되었습니다. 다시 인증하거나 설정 → AI → 임베딩에서 로컬 Ollama 임베딩으로 전환하세요.',
|
||||
'임베딩 자격 증명이 거부되었습니다. 다시 인증하거나 연결 → API 키 → 임베딩에서 로컬 Ollama 임베딩으로 전환하세요.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'구성된 임베딩 제공자가 없어 의미 기반 검색이 꺼져 있습니다. 로컬 Ollama 임베딩을 설정하거나(권장) 설정 → AI → 임베딩에서 임베딩 키를 추가하세요.',
|
||||
'구성된 임베딩 제공자가 없어 의미 기반 검색이 꺼져 있습니다. 로컬 Ollama 임베딩을 설정하거나(권장) 연결 → API 키 → 임베딩에서 임베딩 키를 추가하세요.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'임베딩 모델이 잘못된 벡터 크기를 반환합니다(메모리는 1024차원을 예상함). 1024차원 모델을 선택하거나 제공자에게 1024차원을 요청하세요.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'필요한 로컬 모델을 사용할 수 없습니다. Ollama를 설치/실행하고 모델을 다운로드하거나, 설정 → AI에서 이 작업을 클라우드 제공자로 전환하세요.',
|
||||
'필요한 로컬 모델을 사용할 수 없습니다. Ollama를 설치/실행하고 모델을 다운로드하거나, 연결 → API 키에서 이 작업을 클라우드 제공자로 전환하세요.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'메모리 추출 모델이 시간 초과되어 위키 구조가 거의 없습니다. 설정 → AI에서 메모리 추출 모델을 더 빠른 것으로 변경하세요.',
|
||||
'메모리 추출 모델이 시간 초과되어 위키 구조가 거의 없습니다. 연결 → API 키 → LLM에서 메모리 추출 모델을 더 빠른 것으로 변경하세요.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'요약 트리 만들기에 사용할 수 있는 요약 제공자가 없습니다. 로컬 AI(Ollama)를 활성화하거나, 설정 → AI → 메모리에서 클라우드 요약을 활성화하세요.',
|
||||
'요약 트리 만들기에 사용할 수 있는 요약 제공자가 없습니다. 로컬 AI(Ollama)를 활성화하거나, memory_tree.cloud_summarization_opt_in=true를 설정하고 연결 → API 키 → LLM에서 LLM 제공자를 구성하세요.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'텍스트가 비어 있어 메모리 항목이 건너뛰어졌습니다. 조치가 필요하지 않습니다 — 새 항목은 정상적으로 임베딩됩니다.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6596,7 +6596,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'일시적인 오류로 메모리 처리가 중단되었습니다. 자동으로 다시 시도됩니다.',
|
||||
'memory.health.remediation.unknown':
|
||||
'메모리 처리 중 문제가 발생했습니다. 설정 → AI에서 구성을 확인하세요.',
|
||||
'메모리 처리 중 문제가 발생했습니다. 연결 → API 키에서 구성을 확인하세요.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1073,7 +1073,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': 'Nie udało się zakończyć wdrożenia. Spróbuj ponownie.',
|
||||
'onboarding.apiKeys.title': 'Dodajmy Twoje klucze API',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Możesz wkleić je teraz lub pominąć i dodać później w Ustawieniach › AI. Klucze są przechowywane na tym urządzeniu, zaszyfrowane w spoczynku.',
|
||||
'Możesz wkleić je teraz lub pominąć i dodać później w Połączenia › klucze API. Klucze są przechowywane na tym urządzeniu, zaszyfrowane w spoczynku.',
|
||||
'onboarding.apiKeys.openaiLabel': 'Klucz API OpenAI',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6749,21 +6749,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'Struktura wiki niekompletna',
|
||||
'memoryTree.status.extractionCoverage': 'Pokrycie ekstrakcji: {pct}% fragmentów ma strukturę',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Osadzenia pamięci wyczerpały zarządzany budżet. Skonfiguruj lokalne osadzenia Ollama (Ustawienia → AI → Embeddings) lub dodaj własny klucz API osadzeń, aby kontynuować budowanie pamięci.',
|
||||
'Osadzenia pamięci wyczerpały zarządzany budżet. Skonfiguruj lokalne osadzenia Ollama (Połączenia → Klucze API → Embeddingi) lub dodaj własny klucz API osadzeń, aby kontynuować budowanie pamięci.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'Nie znaleziono poświadczeń osadzeń. Zaloguj się do OpenHuman lub skonfiguruj lokalne osadzenia Ollama w Ustawienia → AI → Embeddings.',
|
||||
'Nie znaleziono poświadczeń osadzeń. Zaloguj się do OpenHuman lub skonfiguruj lokalne osadzenia Ollama w Połączenia → Klucze API → Embeddingi.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Twoje poświadczenia osadzeń zostały odrzucone. Uwierzytelnij się ponownie lub przełącz na lokalne osadzenia Ollama w Ustawienia → AI → Embeddings.',
|
||||
'Twoje poświadczenia osadzeń zostały odrzucone. Uwierzytelnij się ponownie lub przełącz na lokalne osadzenia Ollama w Połączenia → Klucze API → Embeddingi.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'Nie skonfigurowano dostawcy osadzeń, więc wyszukiwanie semantyczne jest wyłączone. Skonfiguruj lokalne osadzenia Ollama (zalecane) lub dodaj klucz osadzeń w Ustawienia → AI → Embeddings.',
|
||||
'Nie skonfigurowano dostawcy osadzeń, więc wyszukiwanie semantyczne jest wyłączone. Skonfiguruj lokalne osadzenia Ollama (zalecane) lub dodaj klucz osadzeń w Połączenia → Klucze API → Embeddingi.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'Model osadzeń zwraca nieprawidłowy rozmiar wektora (pamięć oczekuje 1024 wymiarów). Wybierz model o 1024 wymiarach lub poproś dostawcę o 1024 wymiary.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'Wymagany model lokalny jest niedostępny. Zainstaluj/uruchom Ollama i pobierz model albo przełącz to zadanie na dostawcę chmurowego w Ustawienia → AI.',
|
||||
'Wymagany model lokalny jest niedostępny. Zainstaluj/uruchom Ollama i pobierz model albo przełącz to zadanie na dostawcę chmurowego w Połączenia → Klucze API.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'Model ekstrakcji pamięci przekracza limit czasu, więc wiki ma niewielką strukturę. Zmień model ekstrakcji pamięci na szybszy w Ustawienia → AI.',
|
||||
'Model ekstrakcji pamięci przekracza limit czasu, więc wiki ma niewielką strukturę. Zmień model ekstrakcji pamięci na szybszy w Połączenia → Klucze API → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'Brak dostępnego dostawcy podsumowań dla funkcji Twórz drzewa podsumowań. Włącz lokalną AI (Ollama) lub włącz podsumowywanie w chmurze w Ustawienia → AI → Pamięć.',
|
||||
'Brak dostępnego dostawcy podsumowań dla funkcji Twórz drzewa podsumowań. Włącz lokalną AI (Ollama) albo ustaw memory_tree.cloud_summarization_opt_in=true i skonfiguruj dostawcę LLM w Połączenia → Klucze API → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'Pominięto element pamięci, ponieważ jego tekst był pusty. Żadne działanie nie jest wymagane — nowe elementy są nadal osadzane normalnie.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6771,7 +6771,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'Tymczasowy błąd przerwał przetwarzanie pamięci. Ponowna próba nastąpi automatycznie.',
|
||||
'memory.health.remediation.unknown':
|
||||
'Przetwarzanie pamięci napotkało problem. Sprawdź Ustawienia → AI w celu konfiguracji.',
|
||||
'Przetwarzanie pamięci napotkało problem. Sprawdź Połączenia → Klucze API w celu konfiguracji.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1081,7 +1081,7 @@ const messages: TranslationMap = {
|
||||
'Não foi possível concluir o processo de integração. Por favor, tente novamente.',
|
||||
'onboarding.apiKeys.title': 'Vamos Adicionar Suas Chaves de API',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Você pode colá-las agora ou pular e adicioná-las depois em Configurações › IA. As chaves são armazenadas neste dispositivo, criptografadas em repouso.',
|
||||
'Você pode colá-las agora ou pular e adicioná-las depois em Conexões › chaves de API. As chaves são armazenadas neste dispositivo, criptografadas em repouso.',
|
||||
'onboarding.apiKeys.openaiLabel': 'Chave de API OpenAI',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6755,21 +6755,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.extractionCoverage':
|
||||
'Cobertura de extração: {pct}% dos fragmentos têm estrutura',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Os embeddings de memória atingiram o orçamento gerenciado. Configure embeddings locais do Ollama (Configurações → IA → Incorporações) ou adicione sua própria chave de API de embeddings para continuar construindo a memória.',
|
||||
'Os embeddings de memória atingiram o orçamento gerenciado. Configure embeddings locais do Ollama (Conexões → Chaves de API → Incorporações) ou adicione sua própria chave de API de embeddings para continuar construindo a memória.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'Nenhuma credencial de embeddings encontrada. Faça login no OpenHuman ou configure embeddings locais do Ollama em Configurações → IA → Incorporações.',
|
||||
'Nenhuma credencial de embeddings encontrada. Faça login no OpenHuman ou configure embeddings locais do Ollama em Conexões → Chaves de API → Incorporações.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Suas credenciais de embeddings foram rejeitadas. Autentique-se novamente ou mude para embeddings locais do Ollama em Configurações → IA → Incorporações.',
|
||||
'Suas credenciais de embeddings foram rejeitadas. Autentique-se novamente ou mude para embeddings locais do Ollama em Conexões → Chaves de API → Incorporações.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'Nenhum provedor de embeddings está configurado, então a recuperação semântica está desativada. Configure embeddings locais do Ollama (recomendado) ou adicione uma chave de embeddings em Configurações → IA → Incorporações.',
|
||||
'Nenhum provedor de embeddings está configurado, então a recuperação semântica está desativada. Configure embeddings locais do Ollama (recomendado) ou adicione uma chave de embeddings em Conexões → Chaves de API → Incorporações.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'O modelo de embeddings retorna o tamanho de vetor errado (a memória espera 1024 dimensões). Escolha um modelo de 1024 dimensões ou solicite 1024 dimensões ao seu provedor.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'Um modelo local necessário não está disponível. Instale/execute o Ollama e baixe o modelo, ou mude esta carga de trabalho para um provedor de nuvem em Configurações → IA.',
|
||||
'Um modelo local necessário não está disponível. Instale/execute o Ollama e baixe o modelo, ou mude esta carga de trabalho para um provedor de nuvem em Conexões → Chaves de API.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'O modelo de extração de memória está expirando o tempo limite, então o wiki tem pouca estrutura. Mude o modelo de extração de memória para um mais rápido em Configurações → IA.',
|
||||
'O modelo de extração de memória está expirando o tempo limite, então o wiki tem pouca estrutura. Mude o modelo de extração de memória para um mais rápido em Conexões → Chaves de API → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'Nenhum provedor de resumo está disponível para Criar árvores de resumo. Ative a IA local (Ollama) ou ative o resumo na nuvem em Configurações → IA → Memória.',
|
||||
'Nenhum provedor de resumo está disponível para Criar árvores de resumo. Ative a IA local (Ollama), ou defina memory_tree.cloud_summarization_opt_in=true e configure um provedor LLM em Conexões → Chaves de API → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'Um item de memória foi ignorado porque o texto estava vazio. Nenhuma ação necessária — itens novos continuam a ser incorporados normalmente.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6777,7 +6777,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'Um erro temporário interrompeu o processamento da memória. Será repetido automaticamente.',
|
||||
'memory.health.remediation.unknown':
|
||||
'O processamento da memória encontrou um problema. Verifique Configurações → IA para a configuração.',
|
||||
'O processamento da memória encontrou um problema. Verifique Conexões → Chaves de API para a configuração.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1072,7 +1072,7 @@ const messages: TranslationMap = {
|
||||
'Не удалось завершить настройку. Пожалуйста, попробуйте ещё раз.',
|
||||
'onboarding.apiKeys.title': 'Добавь свои API-ключи',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'Вставь их сейчас или пропусти и добавь позже в Настройки › AI. Ключи хранятся на этом устройстве в зашифрованном виде.',
|
||||
'Вставь их сейчас или пропусти и добавь позже в Подключения › API-ключи. Ключи хранятся на этом устройстве в зашифрованном виде.',
|
||||
'onboarding.apiKeys.openaiLabel': 'API-ключ OpenAI',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6720,21 +6720,21 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'Структура вики неполная',
|
||||
'memoryTree.status.extractionCoverage': 'Охват извлечения: {pct}% фрагментов имеют структуру',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'Эмбеддинги памяти исчерпали управляемый бюджет. Настройте локальные эмбеддинги Ollama (Настройки → ИИ → Эмбеддинги) или добавьте свой ключ API для эмбеддингов, чтобы продолжить построение памяти.',
|
||||
'Эмбеддинги памяти исчерпали управляемый бюджет. Настройте локальные эмбеддинги Ollama (Подключения → API-ключи → Эмбеддинги) или добавьте свой ключ API для эмбеддингов, чтобы продолжить построение памяти.',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'Учётные данные для эмбеддингов не найдены. Войдите в OpenHuman или настройте локальные эмбеддинги Ollama в разделе Настройки → ИИ → Эмбеддинги.',
|
||||
'Учётные данные для эмбеддингов не найдены. Войдите в OpenHuman или настройте локальные эмбеддинги Ollama в разделе Подключения → API-ключи → Эмбеддинги.',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'Ваши учётные данные для эмбеддингов отклонены. Пройдите аутентификацию заново или переключитесь на локальные эмбеддинги Ollama в разделе Настройки → ИИ → Эмбеддинги.',
|
||||
'Ваши учётные данные для эмбеддингов отклонены. Пройдите аутентификацию заново или переключитесь на локальные эмбеддинги Ollama в разделе Подключения → API-ключи → Эмбеддинги.',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'Поставщик эмбеддингов не настроен, поэтому семантический поиск отключён. Настройте локальные эмбеддинги Ollama (рекомендуется) или добавьте ключ эмбеддингов в разделе Настройки → ИИ → Эмбеддинги.',
|
||||
'Поставщик эмбеддингов не настроен, поэтому семантический поиск отключён. Настройте локальные эмбеддинги Ollama (рекомендуется) или добавьте ключ эмбеддингов в разделе Подключения → API-ключи → Эмбеддинги.',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'Модель эмбеддингов возвращает неверный размер вектора (память ожидает 1024 измерения). Выберите модель с 1024 измерениями или запросите 1024 измерения у своего поставщика.',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'Требуемая локальная модель недоступна. Установите/запустите Ollama и загрузите модель либо переключите эту задачу на облачного поставщика в разделе Настройки → ИИ.',
|
||||
'Требуемая локальная модель недоступна. Установите/запустите Ollama и загрузите модель либо переключите эту задачу на облачного поставщика в разделе Подключения → API-ключи.',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'Модель извлечения памяти превышает время ожидания, поэтому в вики мало структуры. Выберите более быструю модель извлечения памяти в разделе Настройки → ИИ.',
|
||||
'Модель извлечения памяти превышает время ожидания, поэтому в вики мало структуры. Выберите более быструю модель извлечения памяти в разделе Подключения → API-ключи → LLM.',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'Нет доступного поставщика суммаризации для «Построить деревья сводок». Включите локальный ИИ (Ollama) или включите облачную суммаризацию в разделе Настройки → ИИ → Память.',
|
||||
'Нет доступного поставщика суммаризации для «Построить деревья сводок». Включите локальный ИИ (Ollama) или установите memory_tree.cloud_summarization_opt_in=true и настройте провайдера LLM в Подключения → API-ключи → LLM.',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'Элемент памяти пропущен, так как его текст был пуст. Действия не требуются — новые элементы продолжают встраиваться как обычно.',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
@@ -6742,7 +6742,7 @@ const messages: TranslationMap = {
|
||||
'memory.health.remediation.transient':
|
||||
'Временная ошибка прервала обработку памяти. Повтор произойдёт автоматически.',
|
||||
'memory.health.remediation.unknown':
|
||||
'При обработке памяти возникла проблема. Проверьте конфигурацию в разделе Настройки → ИИ.',
|
||||
'При обработке памяти возникла проблема. Проверьте конфигурацию в разделе Подключения → API-ключи.',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -1005,7 +1005,7 @@ const messages: TranslationMap = {
|
||||
'onboarding.runtimeChoice.exitError': '无法完成引导流程,请重试。',
|
||||
'onboarding.apiKeys.title': '添加你的 API 密钥',
|
||||
'onboarding.apiKeys.subtitle':
|
||||
'你可以现在粘贴,也可以跳过并稍后在设置 › AI 中添加。密钥会加密存储在此设备上。',
|
||||
'你可以现在粘贴,也可以跳过并稍后在连接 › API 密钥中添加。密钥会加密存储在此设备上。',
|
||||
'onboarding.apiKeys.openaiLabel': 'OpenAI API 密钥',
|
||||
'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
|
||||
'onboarding.apiKeys.openaiOauthHint':
|
||||
@@ -6292,27 +6292,27 @@ const messages: TranslationMap = {
|
||||
'memoryTree.status.degradedStructure': 'Wiki 结构不完整',
|
||||
'memoryTree.status.extractionCoverage': '提取覆盖率:{pct}% 的片段具有结构',
|
||||
'memory.health.remediation.budget_exhausted':
|
||||
'记忆嵌入已达到托管预算上限。请设置本地 Ollama 嵌入(设置 → AI → 向量嵌入),或添加你自己的嵌入 API 密钥以继续构建记忆。',
|
||||
'记忆嵌入已达到托管预算上限。请设置本地 Ollama 嵌入(连接 → API 密钥 → 向量嵌入),或添加你自己的嵌入 API 密钥以继续构建记忆。',
|
||||
'memory.health.remediation.auth_missing':
|
||||
'未找到嵌入凭据。请登录 OpenHuman,或在设置 → AI → 向量嵌入 中设置本地 Ollama 嵌入。',
|
||||
'未找到嵌入凭据。请登录 OpenHuman,或在连接 → API 密钥 → 向量嵌入 中设置本地 Ollama 嵌入。',
|
||||
'memory.health.remediation.auth_invalid':
|
||||
'你的嵌入凭据被拒绝。请重新进行身份验证,或在设置 → AI → 向量嵌入 中切换到本地 Ollama 嵌入。',
|
||||
'你的嵌入凭据被拒绝。请重新进行身份验证,或在连接 → API 密钥 → 向量嵌入 中切换到本地 Ollama 嵌入。',
|
||||
'memory.health.remediation.embeddings_unconfigured':
|
||||
'未配置嵌入提供方,因此语义召回已关闭。请设置本地 Ollama 嵌入(推荐),或在设置 → AI → 向量嵌入 中添加嵌入密钥。',
|
||||
'未配置嵌入提供方,因此语义召回已关闭。请设置本地 Ollama 嵌入(推荐),或在连接 → API 密钥 → 向量嵌入 中添加嵌入密钥。',
|
||||
'memory.health.remediation.embedding_dim_mismatch':
|
||||
'嵌入模型返回的向量大小不正确(记忆需要 1024 维)。请选择 1024 维的模型,或向你的提供方请求 1024 维。',
|
||||
'memory.health.remediation.local_model_unavailable':
|
||||
'所需的本地模型不可用。请安装/运行 Ollama 并拉取模型,或在设置 → AI 中将此工作负载切换到云提供方。',
|
||||
'所需的本地模型不可用。请安装/运行 Ollama 并拉取模型,或在连接 → API 密钥 中将此工作负载切换到云提供方。',
|
||||
'memory.health.remediation.extraction_timeout':
|
||||
'记忆提取模型超时,因此 Wiki 结构很少。请在设置 → AI 中将记忆提取模型更换为更快的模型。',
|
||||
'记忆提取模型超时,因此 Wiki 结构很少。请在连接 → API 密钥 → 语言模型 中将记忆提取模型更换为更快的模型。',
|
||||
'memory.health.remediation.summarizer_unavailable':
|
||||
'没有可用于构建摘要树的摘要提供方。请启用本地 AI(Ollama),或在设置 → AI → 记忆中启用云端摘要。',
|
||||
'没有可用于构建摘要树的摘要提供方。请启用本地 AI(Ollama),或设置 memory_tree.cloud_summarization_opt_in=true,并在连接 → API 密钥 → 语言模型中配置语言模型提供商。',
|
||||
'memory.health.remediation.empty_input_refused':
|
||||
'由于文本为空,一项记忆已被跳过。无需操作 — 新条目继续正常嵌入。',
|
||||
'memory.health.remediation.storage_unavailable':
|
||||
'OpenHuman 无法写入其记忆存储 — 磁盘或 SD 卡似乎已损坏、已满或为只读。请检查驱动器并释放空间;存储恢复可写后,记忆处理将自动继续。',
|
||||
'memory.health.remediation.transient': '临时错误中断了记忆处理。将自动重试。',
|
||||
'memory.health.remediation.unknown': '记忆处理遇到问题。请在设置 → AI 中检查配置。',
|
||||
'memory.health.remediation.unknown': '记忆处理遇到问题。请在连接 → API 密钥 中检查配置。',
|
||||
// Chat — agent-generated artifacts (#2779)
|
||||
|
||||
// Chat composer toolbar
|
||||
|
||||
@@ -946,7 +946,8 @@ describe('loadProviderAuthErrors', () => {
|
||||
{
|
||||
provider: 'openrouter',
|
||||
status: 401,
|
||||
message: 'openrouter rejected the API key (HTTP 401). Update it in Settings → AI.',
|
||||
message:
|
||||
'openrouter rejected the API key (HTTP 401). Update it in Connections → API keys → LLM.',
|
||||
timestamp_ms: 1000,
|
||||
},
|
||||
],
|
||||
|
||||
@@ -251,7 +251,7 @@ pub enum DomainEvent {
|
||||
/// Provider slug, e.g. `"openrouter"`.
|
||||
provider: String,
|
||||
/// Human-readable, actionable explanation (update the key in
|
||||
/// Settings → AI). See `auth_error_registry::auth_error_message`.
|
||||
/// Connections → API keys → LLM). See `auth_error_registry::auth_error_message`.
|
||||
message: String,
|
||||
},
|
||||
|
||||
|
||||
@@ -258,7 +258,7 @@ pub enum ExpectedErrorKind {
|
||||
/// contention (handled by the store's busy-retry loop) and unrelated DB
|
||||
/// failures in other domains still reach Sentry.
|
||||
SubconsciousSchemaUnavailable,
|
||||
/// The user invoked "Import Codex CLI login" (Settings → AI → Codex auth)
|
||||
/// The user invoked "Import Codex CLI login" (Connections → API keys → LLM → Codex auth)
|
||||
/// but the Codex CLI auth at `~/.codex/auth.json` is absent or unusable:
|
||||
/// the file doesn't exist (the user never ran `codex login`), can't be
|
||||
/// parsed, or carries no tokens / no access token. The import RPC already
|
||||
|
||||
@@ -539,7 +539,7 @@ pub(super) const CAPABILITIES: &[Capability] = &[
|
||||
model name and embedding dimensions are tunable per provider. The \
|
||||
legacy `inference_embed` RPC is aliased to `embeddings_embed` so \
|
||||
existing callers continue to work.",
|
||||
how_to: "Settings > AI > Embeddings",
|
||||
how_to: "Connections → API keys → Embeddings",
|
||||
status: CapabilityStatus::Beta,
|
||||
// Privacy depends on the selected provider — see
|
||||
// `intelligence.embedding_provider_test` for the per-provider data
|
||||
@@ -560,7 +560,7 @@ pub(super) const CAPABILITIES: &[Capability] = &[
|
||||
the model, dimensions, and any auth/error surface so a \
|
||||
misconfigured key doesn't get discovered halfway through a 50k \
|
||||
chunk backfill.",
|
||||
how_to: "Settings > AI > Embeddings > Test Connection",
|
||||
how_to: "Connections → API keys → Embeddings → Test Connection",
|
||||
// The probe payload routes to whichever provider the user has
|
||||
// selected — managed cloud (default), OpenAI, Cohere, or a custom
|
||||
// OpenAI-compatible endpoint. Using `DERIVED_TO_BACKEND` here would
|
||||
@@ -934,7 +934,7 @@ pub(super) const CAPABILITIES: &[Capability] = &[
|
||||
domain: "local_ai",
|
||||
category: CapabilityCategory::LocalAI,
|
||||
description: "Select Ollama, LM Studio, MLX, or a generic local OpenAI-compatible server as the local model provider and configure the endpoint.",
|
||||
how_to: "Settings > AI > providers, or use provider strings: ollama:<model>, lmstudio:<model>, mlx:<model>, local-openai:<model>",
|
||||
how_to: "Connections → API keys → LLM, or use provider strings: ollama:<model>, lmstudio:<model>, mlx:<model>, local-openai:<model>",
|
||||
status: CapabilityStatus::Beta,
|
||||
privacy: None,
|
||||
},
|
||||
@@ -1362,7 +1362,7 @@ pub(super) const CAPABILITIES: &[Capability] = &[
|
||||
domain: "settings",
|
||||
category: CapabilityCategory::Settings,
|
||||
description: "Configure managed, local, custom, and built-in BYOK LLM providers, including SumoPod and other OpenAI-compatible gateways, plus per-workload routing preferences.",
|
||||
how_to: "Settings > AI",
|
||||
how_to: "Connections → API keys → LLM",
|
||||
status: CapabilityStatus::Stable,
|
||||
privacy: None,
|
||||
},
|
||||
|
||||
@@ -187,16 +187,16 @@ fn embedding_provider_capabilities_share_domain_and_category() {
|
||||
"both embedding capabilities must land in the same UI category"
|
||||
);
|
||||
|
||||
// The Settings panel they describe is the same one — make sure the
|
||||
// The settings surface they describe is the same one — make sure the
|
||||
// `how_to` strings point at it, not at an out-of-date breadcrumb.
|
||||
assert!(
|
||||
config.how_to.contains("Settings") && config.how_to.contains("Embeddings"),
|
||||
"config how_to must mention Settings > … > Embeddings, got: {}",
|
||||
config.how_to.contains("Connections") && config.how_to.contains("Embeddings"),
|
||||
"config how_to must mention Connections → … → Embeddings, got: {}",
|
||||
config.how_to
|
||||
);
|
||||
assert!(
|
||||
test.how_to.contains("Settings") && test.how_to.contains("Embeddings"),
|
||||
"test how_to must mention Settings > … > Embeddings, got: {}",
|
||||
test.how_to.contains("Connections") && test.how_to.contains("Embeddings"),
|
||||
"test how_to must mention Connections → … → Embeddings, got: {}",
|
||||
test.how_to
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1262,7 +1262,7 @@ fn resolve_dispatcher_kind(
|
||||
///
|
||||
/// Routing on `agent_id == "subconscious"` covers the second case (Codex P2:
|
||||
/// otherwise promoted background turns fall through to `chat_provider` and ignore
|
||||
/// Settings → AI "Subconscious"). Other explicit `hint:<role>` markers route to
|
||||
/// Connections → API keys → LLM "Subconscious"). Other explicit `hint:<role>` markers route to
|
||||
/// their workload; everything else (incl. the legacy `default_model` tier the
|
||||
/// bootstrap pinned) falls through to `chat` so `chat_provider` drives the
|
||||
/// user-facing turn.
|
||||
|
||||
@@ -152,7 +152,7 @@ fn is_local_cli_route(provider_string: &str) -> bool {
|
||||
// ── Provider builder ────────────────────────────────────────────────────
|
||||
|
||||
/// Build the remote provider for a triage turn, routed through the
|
||||
/// **`subconscious`** background workload so the Settings → AI → Advanced
|
||||
/// **`subconscious`** background workload so the Connections → API keys → LLM
|
||||
/// "Subconscious" provider control governs triage classification.
|
||||
///
|
||||
/// The managed model id comes from `make_openhuman_backend` →
|
||||
|
||||
@@ -43,7 +43,7 @@ pub(crate) fn inference_budget_exceeded_user_message() -> &'static str {
|
||||
// routing choice in Settings is respected.
|
||||
"You're out of credits, so I can't run the managed (cloud) model right now. \
|
||||
You can top up your credits or pick a plan to continue — or, if you've enabled a \
|
||||
local model like Ollama, switch routing to \"Use Your Own Models\" in Settings → AI Configuration."
|
||||
local model like Ollama, switch routing to \"Use Your Own Models\" in Connections → API keys → LLM."
|
||||
}
|
||||
|
||||
pub(crate) fn generic_inference_error_user_message() -> &'static str {
|
||||
@@ -445,7 +445,7 @@ fn classify_by_backend_error_code(
|
||||
ClassifiedError {
|
||||
error_type: "provider_request_rejected",
|
||||
message: "The request was rejected — usually a model or parameter \
|
||||
mismatch. Try a different model in Settings → AI → LLM."
|
||||
mismatch. Try a different model in Connections → API keys → LLM."
|
||||
.to_string(),
|
||||
source: "provider",
|
||||
retryable: false,
|
||||
@@ -581,7 +581,7 @@ pub(crate) fn classify_inference_error(err: &str) -> ClassifiedError {
|
||||
// to quote.
|
||||
//
|
||||
// Issue #3335: the prior copy ("Try a different model or check your
|
||||
// local provider in Settings → AI → LLM") sent Managed users in
|
||||
// local provider in Connections → API keys → LLM") sent Managed users in
|
||||
// exactly the wrong direction — there is no local provider on the
|
||||
// Managed route, and the common underlying cause is credit
|
||||
// exhaustion (see #3386). The provider name is not available here
|
||||
@@ -602,7 +602,7 @@ pub(crate) fn classify_inference_error(err: &str) -> ClassifiedError {
|
||||
message: "The model returned an empty response. This usually means your inference \
|
||||
credits are exhausted (Settings → Billing), the upstream model is temporarily \
|
||||
unhealthy, or your provider configuration is rejecting the request \
|
||||
(Settings → AI → LLM). Try one of those, or pick a different model."
|
||||
(Connections → API keys → LLM). Try one of those, or pick a different model."
|
||||
.to_string(),
|
||||
source: "agent_loop",
|
||||
retryable: true,
|
||||
@@ -779,7 +779,7 @@ pub(crate) fn classify_inference_error(err: &str) -> ClassifiedError {
|
||||
ClassifiedError {
|
||||
error_type: "capability_unsupported",
|
||||
message: "This model can't process images. Remove the attachment or switch to a \
|
||||
vision-capable model in Settings → AI → LLM."
|
||||
vision-capable model in Connections → API keys → LLM."
|
||||
.to_string(),
|
||||
source: "config",
|
||||
retryable: false,
|
||||
@@ -817,7 +817,7 @@ pub(crate) fn classify_inference_error(err: &str) -> ClassifiedError {
|
||||
error_type: "provider_request_rejected",
|
||||
message: with_provider_detail(
|
||||
"The AI provider rejected the request — this is usually a model or \
|
||||
parameter incompatibility. Try a different model in Settings → AI → LLM.",
|
||||
parameter incompatibility. Try a different model in Connections → API keys → LLM.",
|
||||
err,
|
||||
),
|
||||
source: "provider",
|
||||
|
||||
@@ -201,7 +201,7 @@ fn budget_exceeded_copy_mentions_top_up() {
|
||||
// switching routing to their own local model — so an Ollama user with
|
||||
// no credits can self-diagnose. We guide, never auto-switch.
|
||||
assert!(message.contains("Use Your Own Models"));
|
||||
assert!(message.contains("Settings"));
|
||||
assert!(message.contains("Connections → API keys → LLM"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -995,7 +995,7 @@ fn classify_inference_error_empty_response_is_actionable_and_retryable() {
|
||||
);
|
||||
assert_eq!(classified.source, "agent_loop");
|
||||
assert!(
|
||||
classified.message.contains("Settings → AI → LLM"),
|
||||
classified.message.contains("Connections → API keys → LLM"),
|
||||
"must give the actionable model-switch remedy: {}",
|
||||
classified.message
|
||||
);
|
||||
@@ -1010,7 +1010,7 @@ fn classify_inference_error_empty_response_is_actionable_and_retryable() {
|
||||
fn classify_inference_error_empty_response_copy_names_billing_remedy_and_drops_local_provider_misdirect(
|
||||
) {
|
||||
// Issue #3335: the prior copy ("Try a different model or check your
|
||||
// local provider in Settings → AI → LLM") sent Managed-route users
|
||||
// local provider in Connections → API keys → LLM") sent Managed-route users
|
||||
// toward a remedy that does not exist for them. The common underlying
|
||||
// cause is credit exhaustion (issue #3386), so the revised copy must
|
||||
// name the credits / billing path explicitly, must NOT claim a "local
|
||||
@@ -1045,7 +1045,7 @@ fn classify_inference_error_empty_response_copy_names_billing_remedy_and_drops_l
|
||||
classified.message
|
||||
);
|
||||
assert!(
|
||||
classified.message.contains("Settings → AI → LLM"),
|
||||
classified.message.contains("Connections → API keys → LLM"),
|
||||
"must keep the provider-config deep link: {}",
|
||||
classified.message
|
||||
);
|
||||
@@ -1302,7 +1302,7 @@ fn classify_inference_error_user_param_bad_request_is_actionable() {
|
||||
assert_eq!(classified.error_type, "provider_request_rejected");
|
||||
assert!(!classified.retryable);
|
||||
assert!(
|
||||
classified.message.contains("Settings → AI → LLM"),
|
||||
classified.message.contains("Connections → API keys → LLM"),
|
||||
"user-param rejection points at Settings: {}",
|
||||
classified.message
|
||||
);
|
||||
@@ -1606,7 +1606,7 @@ fn fingerprint_identical_inputs_are_cache_hit() {
|
||||
#[test]
|
||||
fn fingerprint_provider_binding_change_forces_rebuild() {
|
||||
// The whole point of adding provider_binding to the fingerprint:
|
||||
// changing the workload routing in Settings → AI → LLM mid-thread
|
||||
// changing the workload routing in Connections → API keys → LLM mid-thread
|
||||
// must invalidate the cached agent so the next turn rebuilds with
|
||||
// the new provider.
|
||||
let warm = fp(None, None, "orchestrator", "cloud");
|
||||
|
||||
@@ -359,9 +359,9 @@ pub struct MemoryTreeConfig {
|
||||
///
|
||||
/// Default `false` — "Build Summary Trees" was local-only before #002.
|
||||
/// Enabling this routes workspace memory summaries to the configured cloud
|
||||
/// provider. Set to `true` via Settings → AI → Memory or the env var
|
||||
/// `OPENHUMAN_MEMORY_TREE_CLOUD_SUMMARIZATION=true` to acknowledge that
|
||||
/// memory content will be sent to an external service.
|
||||
/// provider. Set `memory_tree.cloud_summarization_opt_in = true` or
|
||||
/// `OPENHUMAN_MEMORY_TREE_CLOUD_SUMMARIZATION=true` to acknowledge that memory
|
||||
/// content will be sent to an external service.
|
||||
#[serde(default)]
|
||||
pub cloud_summarization_opt_in: bool,
|
||||
|
||||
|
||||
@@ -25,9 +25,9 @@ const AGENT_JOB_USER_FAILURE_MESSAGE: &str = "Something went wrong. Please try a
|
||||
// instead of "Something went wrong". Static `&'static str` only — they carry no
|
||||
// `err` fields, honouring the no-leak contract on `agent_error_to_user_message`.
|
||||
const CRON_HALT_API_KEY_UNSET_MESSAGE: &str =
|
||||
"No API key is set for your AI provider. Add one in Settings \u{2192} AI \u{2192} LLM, then re-run.";
|
||||
"No API key is set for your AI provider. Add it in Connections \u{2192} API keys \u{2192} LLM, then re-run.";
|
||||
const CRON_HALT_INSUFFICIENT_CREDITS_MESSAGE: &str =
|
||||
"Your AI provider is out of credits. Top it up or update its key in Settings \u{2192} AI \u{2192} LLM.";
|
||||
"Your AI provider is out of credits. Top it up or update its key in Connections \u{2192} API keys \u{2192} LLM.";
|
||||
const CRON_HALT_BUDGET_EXHAUSTED_MESSAGE: &str =
|
||||
"You've reached your managed AI budget. Raise it in Settings \u{2192} Billing.";
|
||||
const MORNING_BRIEFING_AGENT_ID: &str = "morning_briefing";
|
||||
@@ -57,7 +57,7 @@ fn agent_error_to_user_message(err: &AgentError) -> &'static str {
|
||||
"The model provider is temporarily unavailable. The next run will retry automatically."
|
||||
}
|
||||
AgentError::ProviderError { retryable: false, .. } => {
|
||||
"The model provider rejected the request. Check your provider credentials in Settings \u{2192} AI \u{2192} LLM."
|
||||
"The model provider rejected the request. Check provider credentials in Connections \u{2192} API keys \u{2192} LLM."
|
||||
}
|
||||
AgentError::ContextLimitExceeded { .. } => {
|
||||
"The conversation grew too long for the model. Start a new session or pick a model with a larger context window."
|
||||
@@ -66,7 +66,7 @@ fn agent_error_to_user_message(err: &AgentError) -> &'static str {
|
||||
"You've reached the daily cost budget for this agent. Raise it in Settings \u{2192} Billing or wait for the next budget window."
|
||||
}
|
||||
AgentError::MaxIterationsExceeded { .. } => {
|
||||
"The agent stopped after too many tool iterations. Raise the iteration cap in Settings \u{2192} AI \u{2192} LLM or simplify the task."
|
||||
"Too many tool iterations. Raise the iteration cap in Connections \u{2192} API keys \u{2192} LLM or simplify the task."
|
||||
}
|
||||
AgentError::EmptyProviderResponse { .. } => {
|
||||
// Issue #3335: the prior copy named a "local provider"
|
||||
@@ -78,7 +78,7 @@ fn agent_error_to_user_message(err: &AgentError) -> &'static str {
|
||||
// configuration. The richer three-remedy copy lives on the
|
||||
// chat-surface side (`channels/providers/web_errors.rs`'s
|
||||
// empty_response arm) where there's no drawer-width limit.
|
||||
"Empty model response. Out of credits (Settings \u{2192} Billing) or try a different model in Settings \u{2192} AI \u{2192} LLM."
|
||||
"Empty model response. Out of credits (Settings \u{2192} Billing) or try another model in Connections \u{2192} API keys \u{2192} LLM."
|
||||
}
|
||||
AgentError::CompactionFailed { .. } => {
|
||||
"Automatic history compaction failed. The next run will start with a fresh context."
|
||||
|
||||
@@ -1205,7 +1205,7 @@ fn agent_error_to_user_message_classifies_provider_non_retryable() {
|
||||
let msg = agent_error_to_user_message(&err);
|
||||
assert!(msg.contains("provider"));
|
||||
assert!(msg.contains("credentials"));
|
||||
assert!(msg.contains("Settings"));
|
||||
assert!(msg.contains("Connections \u{2192} API keys \u{2192} LLM"));
|
||||
assert_ne!(msg, AGENT_JOB_USER_FAILURE_MESSAGE);
|
||||
}
|
||||
|
||||
@@ -1237,7 +1237,7 @@ fn agent_error_to_user_message_classifies_max_iterations() {
|
||||
let err = AgentError::MaxIterationsExceeded { max: 10 };
|
||||
let msg = agent_error_to_user_message(&err);
|
||||
assert!(msg.contains("tool iterations"));
|
||||
assert!(msg.contains("Settings"));
|
||||
assert!(msg.contains("Connections \u{2192} API keys \u{2192} LLM"));
|
||||
assert_ne!(msg, AGENT_JOB_USER_FAILURE_MESSAGE);
|
||||
}
|
||||
|
||||
@@ -1258,11 +1258,11 @@ fn agent_error_to_user_message_classifies_empty_provider_response_for_3335() {
|
||||
"must not claim a local provider exists: {msg}"
|
||||
);
|
||||
assert!(
|
||||
msg.contains("different model"),
|
||||
msg.contains("another model"),
|
||||
"must keep the model-switch remedy: {msg}"
|
||||
);
|
||||
assert!(
|
||||
msg.contains("Settings \u{2192} AI \u{2192} LLM"),
|
||||
msg.contains("Connections \u{2192} API keys \u{2192} LLM"),
|
||||
"must keep the provider-config deep link: {msg}"
|
||||
);
|
||||
assert_ne!(msg, AGENT_JOB_USER_FAILURE_MESSAGE);
|
||||
|
||||
@@ -12,7 +12,7 @@ Unified inference domain: the canonical home for everything LLM/STT/TTS/embeddin
|
||||
- Run ChatGPT/Codex OAuth (PKCE) for the `openai` cloud slug and persist tokens in the encrypted auth-profile store.
|
||||
- Expose an OpenAI-compatible `/v1/*` HTTP endpoint guarded by a stable user-managed external bearer.
|
||||
- Detect device hardware profile and recommend/apply local model presets/tiers.
|
||||
- Maintain the built-in BYOK provider preset catalog used by Settings > AI.
|
||||
- Maintain the built-in BYOK provider preset catalog used by Connections → API keys → LLM.
|
||||
The current matrix lives in `docs/inference-provider-catalog.md`; credentials
|
||||
are stored under `provider:<slug>` in the auth-profile store.
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ fn now_ms() -> u64 {
|
||||
pub fn auth_error_message(provider: &str, status: u16) -> String {
|
||||
format!(
|
||||
"{provider} rejected the API key (HTTP {status}). Update your {provider} \
|
||||
API key in Settings → AI to restore it."
|
||||
API key in Connections → API keys → LLM to restore it."
|
||||
)
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ mod tests {
|
||||
assert_eq!(snap[0].provider, "anthropic");
|
||||
assert_eq!(snap[1].provider, "openrouter");
|
||||
assert!(snap[1].message.contains("openrouter"));
|
||||
assert!(snap[1].message.contains("Settings"));
|
||||
assert!(snap[1].message.contains("Connections → API keys → LLM"));
|
||||
reset_for_tests();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -783,7 +783,7 @@ impl OpenAiCompatibleProvider {
|
||||
"{name} API error (404): model '{model}' does not support the \
|
||||
chat-completions API that OpenHuman uses — it appears to be a \
|
||||
completion-only / base model. Assign a chat-capable model to this \
|
||||
provider (e.g. in Settings → AI), or pick a different model. \
|
||||
provider (e.g. in Connections → API keys → LLM), or pick a different model. \
|
||||
Provider detail: {sanitized}",
|
||||
name = self.name,
|
||||
)
|
||||
@@ -809,7 +809,7 @@ impl OpenAiCompatibleProvider {
|
||||
format!(
|
||||
"{name} API error: model '{model}' does not support chat — it \
|
||||
appears to be an embedding or non-chat model. Assign a \
|
||||
chat-capable model to this provider (e.g. in Settings → AI), or \
|
||||
chat-capable model to this provider (e.g. in Connections → API keys → LLM), or \
|
||||
pick a different model. Provider detail: {sanitized}",
|
||||
name = self.name,
|
||||
)
|
||||
|
||||
@@ -213,7 +213,7 @@ pub fn is_provider_config_rejection_message(body: &str) -> bool {
|
||||
// "The model `<name>` may not be available on your provider.
|
||||
// Configure a fallback chain via `reliability.model_fallbacks`
|
||||
// in your OpenHuman config, or change your default model in
|
||||
// Settings → AI.\n\nAll providers/models failed. Attempts:\n…"
|
||||
// Connections → API keys → LLM.\n\nAll providers/models failed. Attempts:\n…"
|
||||
//
|
||||
// The aggregate fires once per turn regardless of the underlying
|
||||
// per-attempt cause (auth wall, unknown model, region block,
|
||||
@@ -418,7 +418,7 @@ mod tests {
|
||||
// the re-reported error stays demoted.
|
||||
(
|
||||
"TAURI-RUST-4P6-enriched",
|
||||
"ollama API error: model 'bge-m3:latest' does not support chat — it appears to be an embedding or non-chat model. Assign a chat-capable model to this provider (e.g. in Settings → AI), or pick a different model.",
|
||||
"ollama API error: model 'bge-m3:latest' does not support chat — it appears to be an embedding or non-chat model. Assign a chat-capable model to this provider (e.g. in Connections → API keys → LLM), or pick a different model.",
|
||||
),
|
||||
] {
|
||||
assert!(
|
||||
@@ -478,28 +478,28 @@ mod tests {
|
||||
// 1) Verbatim 4JS payload.
|
||||
"The model `reasoning-quick-v1` may not be available on your provider. \
|
||||
Configure a fallback chain via `reliability.model_fallbacks` in your \
|
||||
OpenHuman config, or change your default model in Settings → AI.\n\n\
|
||||
OpenHuman config, or change your default model in Connections → API keys → LLM.\n\n\
|
||||
All providers/models failed. Attempts:\n\
|
||||
provider=openhuman model=reasoning-quick-v1 attempt 1/3: non_retryable; \
|
||||
error=OpenHuman API error (401 Unauthorized): {\"success\":false,\"error\":\"Invalid token\"}",
|
||||
// 2) Unknown-model upstream cause.
|
||||
"The model `gpt-5.5` may not be available on your provider. \
|
||||
Configure a fallback chain via `reliability.model_fallbacks` in your \
|
||||
OpenHuman config, or change your default model in Settings → AI.\n\n\
|
||||
OpenHuman config, or change your default model in Connections → API keys → LLM.\n\n\
|
||||
All providers/models failed. Attempts:\n\
|
||||
provider=custom_openai model=gpt-5.5 attempt 1/3: non_retryable; \
|
||||
error=custom_openai API error (404 Not Found): {\"error\":\"model not found\"}",
|
||||
// 3) Region-block (R1-sibling) per-attempt cause.
|
||||
"The model `gpt-4o` may not be available on your provider. \
|
||||
Configure a fallback chain via `reliability.model_fallbacks` in your \
|
||||
OpenHuman config, or change your default model in Settings → AI.\n\n\
|
||||
OpenHuman config, or change your default model in Connections → API keys → LLM.\n\n\
|
||||
All providers/models failed. Attempts:\n\
|
||||
provider=custom_openai model=gpt-4o attempt 1/3: non_retryable; \
|
||||
error=custom_openai API error (403 Forbidden): {\"error\":{\"message\":\"This model is not available in your region.\"}}",
|
||||
// 4) Bare aggregate — minimal anchor surface.
|
||||
"The model `x` may not be available on your provider. \
|
||||
Configure a fallback chain via `reliability.model_fallbacks` in your \
|
||||
OpenHuman config, or change your default model in Settings → AI.\n\n\
|
||||
OpenHuman config, or change your default model in Connections → API keys → LLM.\n\n\
|
||||
All providers/models failed. Attempts:\n",
|
||||
] {
|
||||
assert!(
|
||||
|
||||
@@ -353,7 +353,7 @@ pub(crate) fn format_failure_aggregate(
|
||||
format!(
|
||||
"The model `{model}` may not be available on your provider. \
|
||||
Configure a fallback chain via `reliability.model_fallbacks` in your \
|
||||
OpenHuman config, or change your default model in Settings → AI.\n\n{attempts}"
|
||||
OpenHuman config, or change your default model in Connections → API keys → LLM.\n\n{attempts}"
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -739,7 +739,7 @@ mod tests {
|
||||
"config key reference missing: {msg}"
|
||||
);
|
||||
assert!(
|
||||
msg.contains("Settings → AI"),
|
||||
msg.contains("Connections → API keys → LLM"),
|
||||
"settings pointer missing: {msg}"
|
||||
);
|
||||
assert!(
|
||||
|
||||
@@ -1204,7 +1204,7 @@ fn create_chat_provider_subconscious_managed_resolves_chat_v1() {
|
||||
#[test]
|
||||
fn create_chat_provider_subconscious_honours_byok_route() {
|
||||
// When the user pins a concrete cloud provider for the subconscious workload
|
||||
// in Settings → AI → Advanced, the factory builds that provider and returns
|
||||
// in Connections → API keys → LLM, the factory builds that provider and returns
|
||||
// its exact model id.
|
||||
let mut config = Config::default();
|
||||
config.cloud_providers.push(openai_entry("p_oai", "openai"));
|
||||
|
||||
@@ -937,7 +937,7 @@ async fn invoke_config_assist_agent(
|
||||
Err(e) => {
|
||||
return Ok(json!({
|
||||
"reply": format!(
|
||||
"Couldn't start the assistant: {e}. Make sure AI/inference is configured (Settings → AI)."
|
||||
"Couldn't start the assistant: {e}. Make sure AI/inference is configured (Connections → API keys → LLM)."
|
||||
),
|
||||
"suggested_env": null
|
||||
}));
|
||||
@@ -966,7 +966,7 @@ async fn invoke_config_assist_agent(
|
||||
Ok(reply) => Ok(json!({ "reply": reply, "suggested_env": null })),
|
||||
Err(e) => Ok(json!({
|
||||
"reply": format!(
|
||||
"I couldn't research that right now: {e}. Make sure AI/inference is configured (Settings → AI)."
|
||||
"I couldn't research that right now: {e}. Make sure AI/inference is configured (Connections → API keys → LLM)."
|
||||
),
|
||||
"suggested_env": null
|
||||
})),
|
||||
|
||||
@@ -126,7 +126,7 @@ fn format_embedding_status_error(
|
||||
return format!(
|
||||
"Ollama embedding model `{model}` is not installed at {endpoint}. \
|
||||
Run `ollama pull {model}` or choose an installed embedding model in \
|
||||
Settings -> AI & Skills -> Local AI. status={status} body={trimmed_body}"
|
||||
Connections → API keys → Embeddings. status={status} body={trimmed_body}"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
//! The memory-tree embedder factory historically resolved only: explicit
|
||||
//! Ollama override → `ollama:` workload prefix → managed `CloudEmbedder`
|
||||
//! (backend→Voyage) → skip. So a user who configured **OpenAI** (or any
|
||||
//! custom OpenAI-compatible endpoint) in Settings → AI → Embeddings was
|
||||
//! custom OpenAI-compatible endpoint) in Connections → API keys → Embeddings was
|
||||
//! silently ignored: their `embeddings_provider = "openai"` matched no branch
|
||||
//! and fell through to the managed backend, which then hit "managed budget"
|
||||
//! while the user's own key sat unused. This adapter closes that gap.
|
||||
|
||||
@@ -599,7 +599,7 @@ mod tests {
|
||||
// With no local AI and no cloud opt-in (default), `run` returns a clean
|
||||
// actionable error rather than panicking or giving an opaque failure.
|
||||
// Users must enable local AI (Ollama) or set cloud_summarization_opt_in
|
||||
// in Settings → AI → Memory (or via OPENHUMAN_MEMORY_TREE_CLOUD_SUMMARIZATION=true).
|
||||
// in config (or via OPENHUMAN_MEMORY_TREE_CLOUD_SUMMARIZATION=true).
|
||||
let tmp = TempDir::new().unwrap();
|
||||
let _workspace = WorkspaceEnvGuard::set(tmp.path());
|
||||
|
||||
|
||||
@@ -161,7 +161,8 @@ pub async fn tree_summarizer_rebuild(
|
||||
/// explicitly acknowledged that memory summaries will be sent to an
|
||||
/// external provider.
|
||||
/// 3. Error otherwise — "Build Summary Trees" is local-only by default;
|
||||
/// the user must opt in to cloud summarization in Settings → AI → Memory.
|
||||
/// the user must opt in to cloud summarization via the
|
||||
/// `memory_tree.cloud_summarization_opt_in` setting.
|
||||
fn create_provider(
|
||||
config: &Config,
|
||||
) -> Result<
|
||||
@@ -187,8 +188,8 @@ fn create_provider(
|
||||
}
|
||||
|
||||
if !config.memory_tree.cloud_summarization_opt_in {
|
||||
return Err("no summarization provider — enable local AI, or enable \
|
||||
cloud summarization in Settings → AI → Memory"
|
||||
return Err("no summarization provider — enable local AI, or opt in to \
|
||||
cloud summarization via the memory_tree.cloud_summarization_opt_in setting"
|
||||
.to_string());
|
||||
}
|
||||
|
||||
@@ -212,7 +213,7 @@ fn create_provider(
|
||||
/// available iff the configured summarization-role provider resolves.
|
||||
/// - local AI off + opt-in `false` (default) ⇒ unavailable — explicit
|
||||
/// consent required before routing workspace memory summaries to a cloud
|
||||
/// provider. Enable in Settings → AI → Memory.
|
||||
/// provider. Enable via the `memory_tree.cloud_summarization_opt_in` setting.
|
||||
///
|
||||
/// The provider built for the `Ok` check is dropped — construction is cheap
|
||||
/// (no network) and confirming by build beats guessing.
|
||||
@@ -229,7 +230,7 @@ pub fn summarizer_available(config: &Config) -> (bool, &'static str) {
|
||||
),
|
||||
Err(_) => (
|
||||
false,
|
||||
"no summarization provider available — enable local AI or configure a cloud provider in Settings → AI",
|
||||
"no summarization provider available — enable local AI, or opt in to cloud summarization (memory_tree.cloud_summarization_opt_in) with a provider set in Connections → API keys → LLM",
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -291,14 +291,14 @@ mod tests {
|
||||
let ev = DomainEvent::ProviderApiKeyRejected {
|
||||
provider: "openrouter".into(),
|
||||
message: "openrouter rejected the API key (HTTP 401). Update your openrouter \
|
||||
API key in Settings → AI to restore it."
|
||||
API key in Connections → API keys → LLM to restore it."
|
||||
.into(),
|
||||
};
|
||||
let n = event_to_notification(&ev).expect("should produce notification");
|
||||
assert_eq!(n.category, CoreNotificationCategory::System);
|
||||
assert_eq!(n.title, "API key rejected");
|
||||
assert!(n.body.contains("openrouter"));
|
||||
assert!(n.body.contains("Settings"));
|
||||
assert!(n.body.contains("Connections"));
|
||||
assert_eq!(n.deep_link.as_deref(), Some("/connections?tab=llm"));
|
||||
assert!(n.id.starts_with("provider-key-rejected:openrouter:"));
|
||||
}
|
||||
|
||||
@@ -137,7 +137,7 @@ impl MemoryProfile {
|
||||
let mut effective = config.clone();
|
||||
effective.agent.agent_timeout_secs = TOOL_CALL_TIMEOUT_SECS;
|
||||
// Route the tick build through the `subconscious` background workload so
|
||||
// Settings → AI → Advanced "Subconscious" governs the cloud tick
|
||||
// Connections → API keys → LLM "Subconscious" governs the cloud tick
|
||||
// provider, instead of riding the `chat` role.
|
||||
effective.default_model = Some("hint:subconscious".to_string());
|
||||
debug!(
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//!
|
||||
//! Both subconscious worlds (the `memory` decision agent and the `tinyplace`
|
||||
//! steering synthesis) run on the same **`subconscious`** provider route —
|
||||
//! Settings → AI → Advanced "Subconscious" governs the cloud/local tick model.
|
||||
//! Connections → API keys → LLM "Subconscious" governs the cloud/local tick model.
|
||||
//! The route resolution, the rate-cap circuit-breaker signature, and the two
|
||||
//! permanent-error classifiers (tool-capability, per-minute token cap) are
|
||||
//! therefore world-agnostic and live here, shared by the generic
|
||||
@@ -16,13 +16,13 @@ use crate::openhuman::credentials::{AuthService, APP_SESSION_PROVIDER};
|
||||
/// tool-use endpoint. The memory decision turn is inherently tool-bearing (it
|
||||
/// acts through tools), so a tool-incapable model can never satisfy such a tick
|
||||
/// — this tells the user how to recover. See TAURI-RUST-ADC.
|
||||
pub(crate) const TOOL_UNSUPPORTED_REASON: &str = "The selected chat model has no tool-use endpoint, so Subconscious can't run. Pick a tool-capable model in Settings > AI.";
|
||||
pub(crate) const TOOL_UNSUPPORTED_REASON: &str = "The selected chat model has no tool-use endpoint, so Subconscious can't run. Pick a tool-capable model in Connections → API keys → LLM.";
|
||||
|
||||
/// Surfaced in `SubconsciousStatus` when the circuit breaker has halted ticks
|
||||
/// because the configured Subconscious model keeps rejecting requests with a
|
||||
/// permanent per-minute token cap (413/TPM). Actionable: the fix is the user's
|
||||
/// to make (a bigger model/tier), so the message points there.
|
||||
pub(crate) const RATE_CAP_HALT_REASON: &str = "Subconscious is paused: the selected model rejected the request because it exceeds your provider's per-minute token limit. Pick a higher-tier model or provider for Subconscious in Settings > AI > Advanced.";
|
||||
pub(crate) const RATE_CAP_HALT_REASON: &str = "Subconscious is paused: the selected model rejected the request because it exceeds your provider's per-minute token limit. Pick a higher-tier model or provider for Subconscious in Connections → API keys → LLM.";
|
||||
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
enum SubconsciousProviderRoute {
|
||||
@@ -53,7 +53,7 @@ pub(crate) fn subconscious_provider_unavailable_reason(config: &Config) -> Optio
|
||||
match auth.get_provider_bearer_token(APP_SESSION_PROVIDER, None) {
|
||||
Ok(Some(token)) if !token.trim().is_empty() => None,
|
||||
Ok(_) => Some(
|
||||
"Sign in or configure a local Subconscious provider in Settings > AI."
|
||||
"Sign in or configure a local Subconscious provider in Connections → API keys → LLM."
|
||||
.to_string(),
|
||||
),
|
||||
Err(e) => Some(format!("Unable to read the OpenHuman session: {e}")),
|
||||
@@ -85,7 +85,7 @@ fn resolve_subconscious_route(config: &Config) -> SubconsciousProviderRoute {
|
||||
}
|
||||
|
||||
/// Stable identity of the Subconscious provider routing — the exact knobs a
|
||||
/// user changes in Settings > AI > Advanced to switch the tick model/provider.
|
||||
/// user changes in Connections → API keys → LLM to switch the tick model/provider.
|
||||
/// The rate-cap circuit breaker keys its halt on this so a permanent per-minute
|
||||
/// token-cap rejection stops re-firing while the SAME config is set, and
|
||||
/// auto-clears the moment the user picks a different model/provider/tier.
|
||||
|
||||
@@ -2616,7 +2616,7 @@ fn terminal_inference_halt_summary(
|
||||
TerminalInferenceFailure::ProviderConfig => format!(
|
||||
"Stopping: the `{tool}` step failed because the configured model/provider rejected the \
|
||||
request (e.g. an unknown model, a non-chat/embedding model, a missing credential, or \
|
||||
a region block) — retrying will not help. Fix the model or API key in Settings → AI. \
|
||||
a region block) — retrying will not help. Fix the model or API key in Connections → API keys → LLM. \
|
||||
Details:\n{}",
|
||||
truncate_for_halt(result),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user