mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-14 03:30:19 +00:00
Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e9f10ecb15 | |||
| d0d7cc7b16 | |||
| fe1be212ad | |||
| 09f1504f9f | |||
| 75c8ad6c9a | |||
| 979e6248af | |||
| 17ce0abf45 | |||
| 4adc332371 | |||
| 3365aeb75e | |||
| 07882ae9fb | |||
| b359ad1958 | |||
| e4305cf2ac | |||
| 2c22aa324e | |||
| a8194866c9 | |||
| 49d5a4193b | |||
| 2761a62123 | |||
| c08e37f447 | |||
| 252f19a134 | |||
| 58e43cba48 | |||
| d14a4a2eae | |||
| 7662a3ac98 | |||
| be0289daa1 | |||
| fd18655e2c | |||
| 91aa68f205 | |||
| a4341a7fd3 | |||
| 0d9bc82ee7 | |||
| 61e886c85d | |||
| f3519e0b9e | |||
| 45683a7ba3 | |||
| 4337d22368 | |||
| b06ecd7fe2 | |||
| 609c037ef3 | |||
| a1e02eaa10 | |||
| b2912deff3 | |||
| 36b6d5eec0 | |||
| 8c4ccc27e6 | |||
| 05c521a78b | |||
| 32e17410c4 | |||
| 26b4927d25 | |||
| ee2702e4ae | |||
| 5feae971a5 | |||
| ab34f4aed6 | |||
| e5c42fbbc2 | |||
| 1c16322707 |
+1
-1
@@ -24,7 +24,7 @@ Desktop.ini
|
||||
.windsurfrules
|
||||
*.code-workspace
|
||||
.vscode/sessions.json
|
||||
|
||||
prd
|
||||
# Temporary files
|
||||
.temp/
|
||||
temp/
|
||||
|
||||
@@ -55,6 +55,44 @@ see @.cursor/rules/typescript.mdc
|
||||
- **Dev**: Translate `locales/zh-CN/namespace.json` and `locales/en-US/namespace.json` locales file only for dev preview
|
||||
- DON'T run `pnpm i18n`, let CI auto handle it
|
||||
|
||||
## Linear Issue Management
|
||||
|
||||
When working with Linear issues:
|
||||
|
||||
1. **Retrieve issue details** before starting work using `mcp__linear-server__get_issue`
|
||||
2. **Check for sub-issues**: If the issue has sub-issues, retrieve and review ALL sub-issues using `mcp__linear-server__list_issues` with `parentId` filter before starting work
|
||||
3. **Update issue status** when completing tasks using `mcp__linear-server__update_issue`
|
||||
4. **MUST add completion comment** using `mcp__linear-server__create_comment`
|
||||
|
||||
### Completion Comment (REQUIRED)
|
||||
|
||||
**Every time you complete an issue, you MUST add a comment summarizing the work done.** This is critical for:
|
||||
|
||||
- Team visibility and knowledge sharing
|
||||
- Code review context
|
||||
- Future reference and debugging
|
||||
|
||||
### IMPORTANT: Per-Issue Completion Rule
|
||||
|
||||
**When working on multiple issues (e.g., parent issue with sub-issues), you MUST update status and add comment for EACH issue IMMEDIATELY after completing it.** Do NOT wait until all issues are done to update them in batch.
|
||||
|
||||
**Workflow for EACH individual issue:**
|
||||
|
||||
1. Complete the implementation for this specific issue
|
||||
2. Run type check: `bun run type-check`
|
||||
3. Run related tests if applicable
|
||||
4. **IMMEDIATELY** update issue status to "Done": `mcp__linear-server__update_issue`
|
||||
5. **IMMEDIATELY** add completion comment: `mcp__linear-server__create_comment`
|
||||
6. Only then move on to the next issue
|
||||
|
||||
**❌ Wrong approach:**
|
||||
|
||||
- Complete Issue A → Complete Issue B → Complete Issue C → Update all statuses → Add all comments
|
||||
|
||||
**✅ Correct approach:**
|
||||
|
||||
- Complete Issue A → Update A status → Add A comment → Complete Issue B → Update B status → Add B comment → ...
|
||||
|
||||
## Rules Index
|
||||
|
||||
Some useful project rules are listed in @.cursor/rules/rules-index.mdc
|
||||
|
||||
@@ -12,7 +12,7 @@ export const appBrowsers = {
|
||||
identifier: 'chat',
|
||||
keepAlive: true,
|
||||
minWidth: 400,
|
||||
path: '/chat',
|
||||
path: '/agent',
|
||||
showOnInit: true,
|
||||
titleBarStyle: 'hidden',
|
||||
vibrancy: 'under-window',
|
||||
@@ -72,7 +72,7 @@ export const windowTemplates = {
|
||||
allowMultipleInstances: true,
|
||||
autoHideMenuBar: true,
|
||||
baseIdentifier: 'chatSingle',
|
||||
basePath: '/chat',
|
||||
basePath: '/agent',
|
||||
height: 600,
|
||||
keepAlive: false, // Multi-instance windows don't need to stay alive
|
||||
minWidth: 400,
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "جارٍ التحضير...",
|
||||
"deleteSuccess": "تم حذف الملف بنجاح",
|
||||
"downloading": "جارٍ تحميل الملف...",
|
||||
"goBack": "العودة إلى الصفحة السابقة",
|
||||
"goForward": "الانتقال إلى الصفحة التالية",
|
||||
"goToParent": "الانتقال إلى المجلد الرئيسي",
|
||||
"moveError": "فشل في نقل الملف",
|
||||
"moveHere": "نقل إلى هنا",
|
||||
"moveSuccess": "تم نقل الملف بنجاح",
|
||||
"moveToFolder": "نقل إلى...",
|
||||
"moveToRoot": "نقل إلى الدليل الجذري",
|
||||
"removeFromKnowledgeBase": "إزالة من قاعدة المعرفة",
|
||||
"removeFromKnowledgeBaseSuccess": "تمت إزالة الملف بنجاح"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "أو",
|
||||
"title": "قم بسحب الملف أو المجلد هنا"
|
||||
},
|
||||
"noFolders": "لا توجد مجلدات حالياً",
|
||||
"sort": {
|
||||
"dateAdded": "تاريخ الإضافة",
|
||||
"name": "الاسم",
|
||||
"size": "الحجم"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "تاريخ الإنشاء",
|
||||
"size": "الحجم",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "سيتم حذف هذه المكتبة المعرفية، ولن يتم حذف الملفات الموجودة بها، بل ستنتقل إلى جميع الملفات. بعد حذف المكتبة المعرفية، لن يمكن استعادتها، يرجى توخي الحذر.",
|
||||
"empty": "انقر على <1>+</1> لبدء إنشاء مكتبة معرفية"
|
||||
},
|
||||
"new": "إنشاء مكتبة معرفية جديدة",
|
||||
"title": "المكتبة المعرفية"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "جميع الملفات",
|
||||
"allPages": "جميع المستندات"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "تحميل الملف",
|
||||
"unsupportedFileAndContact": "هذا التنسيق من الملفات غير مدعوم للمعاينة عبر الإنترنت، إذا كان لديك طلب للمعاينة، فلا تتردد في <1>إبلاغنا</1>"
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "سيتم حذف هذا المستودع، لكن الملفات الموجودة فيه لن تُحذف، بل سيتم نقلها إلى جميع الملفات. لا يمكن استعادة المستودع بعد حذفه، يرجى توخي الحذر.",
|
||||
"empty": "انقر <1>+</1> لبدء إنشاء مستودع"
|
||||
},
|
||||
"new": "إنشاء مستودع جديد",
|
||||
"title": "المستودع"
|
||||
},
|
||||
"searchFilePlaceholder": "بحث عن ملف",
|
||||
"searchPagePlaceholder": "ابحث في المستندات",
|
||||
"tab": {
|
||||
|
||||
@@ -3467,6 +3467,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 هو أسرع وأذكى نموذج Haiku من Anthropic، يتميز بسرعة فائقة وقدرة متقدمة على التفكير المتسلسل."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 هو النموذج الرائد من Anthropic، يجمع بين الذكاء الفائق والأداء القابل للتوسع، مما يجعله مناسبًا للمهام المعقدة التي تتطلب أعلى مستويات الجودة في الاستجابة والقدرة على الاستدلال."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 هو النموذج الأذكى الذي طورته Anthropic حتى الآن."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Подготовка...",
|
||||
"deleteSuccess": "Файлът е изтрит успешно",
|
||||
"downloading": "Изтегляне на файла...",
|
||||
"goBack": "Назад към предишната страница",
|
||||
"goForward": "Напред към следващата страница",
|
||||
"goToParent": "Влизане в родителската папка",
|
||||
"moveError": "Неуспешно преместване на файла",
|
||||
"moveHere": "Премести тук",
|
||||
"moveSuccess": "Файлът беше преместен успешно",
|
||||
"moveToFolder": "Премести в...",
|
||||
"moveToRoot": "Премести в основната директория",
|
||||
"removeFromKnowledgeBase": "Премахни от базата знания",
|
||||
"removeFromKnowledgeBaseSuccess": "Файлът е премахнат успешно"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "или",
|
||||
"title": "Плъзнете файл или папка тук"
|
||||
},
|
||||
"noFolders": "Няма налични папки",
|
||||
"sort": {
|
||||
"dateAdded": "Дата на добавяне",
|
||||
"name": "Име",
|
||||
"size": "Размер"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Дата на създаване",
|
||||
"size": "Размер",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Сигурни ли сте, че искате да изтриете тази база знания? Файловете в нея няма да бъдат изтрити, а ще бъдат преместени в общите файлове. След изтриването на базата знания, тя не може да бъде възстановена, моля, действайте внимателно.",
|
||||
"empty": "Кликнете <1>+</1>, за да започнете създаването на база знания"
|
||||
},
|
||||
"new": "Нова база знания",
|
||||
"title": "База знания"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Всички файлове",
|
||||
"allPages": "Всички документи"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Изтеглете файла",
|
||||
"unsupportedFileAndContact": "Този формат на файла не поддържа онлайн преглед. Ако имате нужда от преглед, моля, <1>свържете се с нас</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Този хранилище ще бъде изтрито. Файловете в него няма да бъдат изтрити, а ще бъдат преместени в раздела с всички файлове. След изтриване на хранилището, то не може да бъде възстановено. Моля, действайте внимателно.",
|
||||
"empty": "Кликнете <1>+</1>, за да създадете ново хранилище"
|
||||
},
|
||||
"new": "Създай хранилище",
|
||||
"title": "Хранилище"
|
||||
},
|
||||
"searchFilePlaceholder": "Търсене на файл",
|
||||
"searchPagePlaceholder": "Търсене на документи",
|
||||
"tab": {
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
"description": "Opus 4.1 е висок клас модел на Anthropic, оптимизиран за програмиране, сложни логически задачи и продължителни процеси."
|
||||
},
|
||||
"anthropic/claude-opus-4.5": {
|
||||
"description": "Claude Opus 4.5 е водещият модел на Anthropic, който съчетава изключителен интелект и мащабируема производителност, подходящ за сложни задачи, изискващи най-високо качество на отговорите и способност за разсъждение."
|
||||
"description": "Claude Opus 4.5 е флагманският модел на Anthropic, който съчетава изключителен интелект и мащабируема производителност, подходящ за сложни задачи, изискващи най-високо качество на отговорите и способност за разсъждение."
|
||||
},
|
||||
"anthropic/claude-sonnet-4": {
|
||||
"description": "Claude Sonnet 4 е хибриден модел за разсъждение от Anthropic, предлагащ комбинирани възможности за мисловни и немисловни задачи."
|
||||
@@ -831,7 +831,7 @@
|
||||
"description": "Claude Opus 4 е най-мощният модел на Anthropic, предназначен за обработка на изключително сложни задачи. Той се отличава с изключителна производителност, интелигентност, плавност и разбиране."
|
||||
},
|
||||
"claude-opus-4-5-20251101": {
|
||||
"description": "Claude Opus 4.5 е водещият модел на Anthropic, който съчетава изключителен интелект и мащабируема производителност, подходящ за сложни задачи, изискващи най-високо качество на отговорите и способност за разсъждение."
|
||||
"description": "Claude Opus 4.5 е флагманският модел на Anthropic, който съчетава изключителен интелект и мащабируема производителност, подходящ за сложни задачи, изискващи най-високо качество на отговорите и способност за разсъждение."
|
||||
},
|
||||
"claude-sonnet-4-20250514": {
|
||||
"description": "Claude Sonnet 4 може да генерира почти мигновени отговори или удължено стъпково мислене, като потребителите могат ясно да проследят тези процеси."
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview притежава мощни способности за сложни разсъждения, показвайки отлични резултати в логическото разсъждение, математиката и програмирането."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 е водещият модел на Anthropic, който съчетава изключителен интелект и мащабируема производителност, подходящ за сложни задачи, изискващи най-високо качество на отговорите и способност за разсъждение."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash е високопроизводителен модел за разсъждение от Google, подходящ за разширени мултимодални задачи."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, официален модел за извеждане от Kimi, поддържащ дълъг контекст, програмиране, въпроси и отговори и други сценарии."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Моделът kimi-k2-thinking, предоставен от Moonshot AI, е мисловен модел с универсални агентни и логически способности. Той е отличен в дълбокото разсъждение и може да използва инструменти на няколко стъпки, за да помага при решаването на различни сложни проблеми."
|
||||
"description": "Моделът kimi-k2-thinking, предоставен от Moonshot AI, е мисловен модел с универсални агентни способности и умения за разсъждение. Той е отличен в дълбокото разсъждение и може да използва инструменти на няколко стъпки, за да помага при решаването на различни сложни проблеми."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Ускорена версия на модела K2 за дълбоко разсъждение, поддържа 256k контекст и предлага скорост на изход от 60–100 токена в секунда при запазване на дълбоките логически способности."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 е най-бързият и интелигентен Haiku модел на Anthropic, отличаващ се със светкавична скорост и разширени способности за мислене."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 е флагманският модел на Anthropic, който съчетава изключителен интелект и мащабируема производителност, подходящ за сложни задачи, изискващи най-високо качество на отговорите и способност за разсъждение."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 е най-интелигентният модел на Anthropic до момента."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Wird vorbereitet...",
|
||||
"deleteSuccess": "Datei erfolgreich gelöscht",
|
||||
"downloading": "Datei wird heruntergeladen...",
|
||||
"goBack": "Zurück zur vorherigen Seite",
|
||||
"goForward": "Weiter zur nächsten Seite",
|
||||
"goToParent": "Zum übergeordneten Ordner",
|
||||
"moveError": "Datei konnte nicht verschoben werden",
|
||||
"moveHere": "Hierher verschieben",
|
||||
"moveSuccess": "Datei erfolgreich verschoben",
|
||||
"moveToFolder": "Verschieben nach...",
|
||||
"moveToRoot": "In das Stammverzeichnis verschieben",
|
||||
"removeFromKnowledgeBase": "Aus der Wissensdatenbank entfernen",
|
||||
"removeFromKnowledgeBaseSuccess": "Datei erfolgreich entfernt"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "oder",
|
||||
"title": "Ziehen Sie Dateien oder Ordner hierher"
|
||||
},
|
||||
"noFolders": "Keine Ordner vorhanden",
|
||||
"sort": {
|
||||
"dateAdded": "Hinzugefügt am",
|
||||
"name": "Name",
|
||||
"size": "Größe"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Erstellungsdatum",
|
||||
"size": "Größe",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Die Wissensdatenbank wird gelöscht, die darin enthaltenen Dateien werden nicht gelöscht, sondern in den gesamten Dateien verschoben. Nach dem Löschen der Wissensdatenbank kann sie nicht wiederhergestellt werden, bitte vorsichtig vorgehen.",
|
||||
"empty": "Klicken Sie auf <1>+</1>, um eine Wissensdatenbank zu erstellen"
|
||||
},
|
||||
"new": "Neue Wissensdatenbank",
|
||||
"title": "Wissensdatenbank"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Alle Dateien",
|
||||
"allPages": "Alle Dokumente"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Datei herunterladen",
|
||||
"unsupportedFileAndContact": "Dieses Dateiformat wird derzeit nicht für die Online-Vorschau unterstützt. Wenn Sie eine Vorschau wünschen, können Sie uns gerne <1>Feedback geben</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Dieses Repository wird gelöscht. Die darin enthaltenen Dateien bleiben erhalten und werden in 'Alle Dateien' verschoben. Das Repository kann nach dem Löschen nicht wiederhergestellt werden. Bitte gehen Sie vorsichtig vor.",
|
||||
"empty": "Klicken Sie auf <1>+</1>, um ein neues Repository zu erstellen"
|
||||
},
|
||||
"new": "Neues Repository",
|
||||
"title": "Repository"
|
||||
},
|
||||
"searchFilePlaceholder": "Datei suchen",
|
||||
"searchPagePlaceholder": "Dokumente durchsuchen",
|
||||
"tab": {
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
"description": "Opus 4.1 ist ein High-End-Modell von Anthropic, optimiert für Programmierung, komplexe Schlussfolgerungen und dauerhafte Aufgaben."
|
||||
},
|
||||
"anthropic/claude-opus-4.5": {
|
||||
"description": "Claude Opus 4.5 ist das Flaggschiffmodell von Anthropic. Es vereint herausragende Intelligenz mit skalierbarer Leistung und eignet sich ideal für komplexe Aufgaben, die höchste Qualität bei Antworten und ausgeprägte Fähigkeiten im logischen Denken erfordern."
|
||||
"description": "Claude Opus 4.5 ist das Flaggschiffmodell von Anthropic. Es vereint herausragende Intelligenz mit skalierbarer Leistung und eignet sich ideal für komplexe Aufgaben, die höchste Qualität bei Antworten und ausgeprägte Fähigkeiten zur Schlussfolgerung erfordern."
|
||||
},
|
||||
"anthropic/claude-sonnet-4": {
|
||||
"description": "Claude Sonnet 4 ist eine hybride Schlussfolgerungsversion von Anthropic, die sowohl kognitive als auch nicht-kognitive Fähigkeiten kombiniert."
|
||||
@@ -831,7 +831,7 @@
|
||||
"description": "Claude Opus 4 ist das leistungsstärkste Modell von Anthropic zur Bewältigung hochkomplexer Aufgaben. Es zeichnet sich durch hervorragende Leistung, Intelligenz, Flüssigkeit und Verständnis aus."
|
||||
},
|
||||
"claude-opus-4-5-20251101": {
|
||||
"description": "Claude Opus 4.5 ist das Flaggschiffmodell von Anthropic. Es vereint herausragende Intelligenz mit skalierbarer Leistung und eignet sich ideal für komplexe Aufgaben, die höchste Qualität bei Antworten und ausgeprägte Fähigkeiten im logischen Denken erfordern."
|
||||
"description": "Claude Opus 4.5 ist das Flaggschiffmodell von Anthropic. Es vereint herausragende Intelligenz mit skalierbarer Leistung und eignet sich ideal für komplexe Aufgaben, die höchste Qualität bei Antworten und ausgeprägte Fähigkeiten zur Schlussfolgerung erfordern."
|
||||
},
|
||||
"claude-sonnet-4-20250514": {
|
||||
"description": "Claude Sonnet 4 kann nahezu sofortige Antworten oder verlängerte schrittweise Überlegungen erzeugen, die für den Nutzer klar nachvollziehbar sind."
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview verfügt über starke Fähigkeiten zur komplexen Schlussfolgerung und zeigt hervorragende Leistungen in den Bereichen logisches Denken, Mathematik und Programmierung."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 ist das Flaggschiffmodell von Anthropic. Es vereint herausragende Intelligenz mit skalierbarer Leistung und eignet sich ideal für komplexe Aufgaben, die höchste Qualität bei Antworten und ausgeprägte Fähigkeiten im logischen Denken erfordern."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash ist ein leistungsstarkes Schlussfolgerungsmodell von Google, geeignet für erweiterte multimodale Aufgaben."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, das offizielle Inferenzmodell von Kimi mit Unterstützung für Langkontext, Code, QA und mehr."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Das Modell kimi-k2-thinking von Moonshot AI ist ein vielseitiges Denkmodell mit agentischen Fähigkeiten und ausgeprägtem logischen Denkvermögen. Es zeichnet sich durch tiefgehende Schlussfolgerungen aus und kann durch mehrstufige Werkzeugnutzung bei der Lösung verschiedenster Probleme unterstützen."
|
||||
"description": "Das kimi-k2-thinking-Modell von Moonshot AI ist ein vielseitiges Denkmodell mit agentischen Fähigkeiten und ausgeprägtem logischen Denkvermögen. Es zeichnet sich durch tiefgehende Schlussfolgerungen aus und kann durch mehrstufige Werkzeugnutzung bei der Lösung verschiedenster Probleme unterstützen."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Turbo-Version des K2 Langzeit-Denkmodells mit 256k Kontext, spezialisiert auf tiefgreifende Schlussfolgerung und einer Ausgabegeschwindigkeit von 60–100 Tokens pro Sekunde."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 ist das schnellste und intelligenteste Haiku-Modell von Anthropic mit blitzschneller Reaktionszeit und erweiterten Denkfähigkeiten."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 ist das Flaggschiffmodell von Anthropic. Es vereint herausragende Intelligenz mit skalierbarer Leistung und eignet sich ideal für komplexe Aufgaben, die höchste Qualität bei Antworten und ausgeprägte Fähigkeiten zur Schlussfolgerung erfordern."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 ist das bisher intelligenteste Modell von Anthropic."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Preparing...",
|
||||
"deleteSuccess": "File deleted successfully.",
|
||||
"downloading": "Downloading file...",
|
||||
"goBack": "Go to previous page",
|
||||
"goForward": "Go to next page",
|
||||
"goToParent": "Go to parent folder",
|
||||
"moveError": "Failed to move file",
|
||||
"moveHere": "Move here",
|
||||
"moveSuccess": "File moved successfully",
|
||||
"moveToFolder": "Move to...",
|
||||
"moveToRoot": "Move to root directory",
|
||||
"removeFromKnowledgeBase": "Remove from Knowledge Base",
|
||||
"removeFromKnowledgeBaseSuccess": "File removed successfully."
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "or",
|
||||
"title": "Drag files or folders here"
|
||||
},
|
||||
"noFolders": "No folders available",
|
||||
"sort": {
|
||||
"dateAdded": "Date Added",
|
||||
"name": "Name",
|
||||
"size": "Size"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Created At",
|
||||
"size": "Size",
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
"empty": "No files or folders have been uploaded yet.",
|
||||
"header": {
|
||||
"actions": {
|
||||
"connect": "Connect...",
|
||||
"newFolder": "New Folder",
|
||||
"newPage": "New Page",
|
||||
"uploadFile": "Upload File",
|
||||
@@ -107,14 +108,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "You are about to delete this knowledge base. The files within will not be deleted and will be moved to All Files. Once deleted, the knowledge base cannot be recovered. Please proceed with caution.",
|
||||
"empty": "Click <1>+</1> to add a knowledge base"
|
||||
},
|
||||
"new": "New Knowledge Base",
|
||||
"title": "Knowledge Base"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "All Files",
|
||||
"allPages": "All Documents"
|
||||
@@ -142,6 +135,14 @@
|
||||
"downloadFile": "Download File",
|
||||
"unsupportedFileAndContact": "This file format is not currently supported for online preview. If you have a request for previewing, feel free to <1>contact us</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "This repository will be deleted. Its files will not be removed but moved to All Files. Once deleted, the repository cannot be recovered. Please proceed with caution.",
|
||||
"empty": "Click <1>+</1> to create a new repository"
|
||||
},
|
||||
"new": "New Repository",
|
||||
"title": "Repository"
|
||||
},
|
||||
"searchFilePlaceholder": "Search Files",
|
||||
"searchPagePlaceholder": "Search Pages",
|
||||
"tab": {
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
"description": "Opus 4.1 is a premium model from Anthropic, optimized for programming, complex reasoning, and sustained tasks."
|
||||
},
|
||||
"anthropic/claude-opus-4.5": {
|
||||
"description": "Claude Opus 4.5 is Anthropic's flagship model, combining exceptional intelligence with scalable performance. It's ideal for complex tasks that demand top-tier responses and advanced reasoning capabilities."
|
||||
"description": "Claude Opus 4.5 is Anthropic's flagship model, combining exceptional intelligence with scalable performance. It is ideal for complex tasks that demand top-tier response quality and reasoning capabilities."
|
||||
},
|
||||
"anthropic/claude-sonnet-4": {
|
||||
"description": "Claude Sonnet 4 is Anthropic’s hybrid reasoning model, offering a blend of cognitive and non-cognitive capabilities."
|
||||
@@ -831,7 +831,7 @@
|
||||
"description": "Claude Opus 4 is Anthropic's most powerful model for handling highly complex tasks. It excels in performance, intelligence, fluency, and comprehension."
|
||||
},
|
||||
"claude-opus-4-5-20251101": {
|
||||
"description": "Claude Opus 4.5 is Anthropic's flagship model, combining exceptional intelligence with scalable performance. It's ideal for complex tasks that demand top-tier responses and advanced reasoning capabilities."
|
||||
"description": "Claude Opus 4.5 is Anthropic's flagship model, combining exceptional intelligence with scalable performance. It is ideal for complex tasks that demand top-tier response quality and reasoning capabilities."
|
||||
},
|
||||
"claude-sonnet-4-20250514": {
|
||||
"description": "Claude Sonnet 4 can generate near-instant responses or extended step-by-step reasoning, allowing users to clearly observe these processes."
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview possesses strong complex reasoning abilities, excelling in logical reasoning, mathematics, programming, and other fields."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 is Anthropic's flagship model, combining exceptional intelligence with scalable performance. It's ideal for complex tasks that demand top-tier responses and advanced reasoning capabilities."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash is Google’s high-performance reasoning model, suitable for extended multimodal tasks."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, the official Kimi inference model supporting long context, code, Q&A, and more."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "The kimi-k2-thinking model, developed by Moonshot AI, is a general-purpose agentic and reasoning model. It excels at deep reasoning and can utilize multi-step tool use to help solve a wide range of complex problems."
|
||||
"description": "The kimi-k2-thinking model, developed by Moonshot AI, is a general-purpose agentic and reasoning model. It excels at deep reasoning and can utilize multi-step tool calls to help solve a wide range of complex problems."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "The high-speed version of the K2 Long Thinking Model supports 256k context and deep reasoning, with output speeds of 60–100 tokens per second."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 is Anthropic's fastest and most intelligent Haiku model, offering lightning-fast speed and advanced reasoning capabilities."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 is Anthropic's flagship model, combining exceptional intelligence with scalable performance. It is ideal for complex tasks that demand top-tier response quality and reasoning capabilities."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 is the most intelligent model Anthropic has developed to date."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Preparando...",
|
||||
"deleteSuccess": "Archivo eliminado con éxito",
|
||||
"downloading": "Descargando archivo...",
|
||||
"goBack": "Volver a la página anterior",
|
||||
"goForward": "Avanzar a la siguiente página",
|
||||
"goToParent": "Ir a la carpeta superior",
|
||||
"moveError": "Error al mover el archivo",
|
||||
"moveHere": "Mover aquí",
|
||||
"moveSuccess": "Archivo movido con éxito",
|
||||
"moveToFolder": "Mover a...",
|
||||
"moveToRoot": "Mover a la carpeta raíz",
|
||||
"removeFromKnowledgeBase": "Eliminar de la base de conocimientos",
|
||||
"removeFromKnowledgeBaseSuccess": "Archivo eliminado con éxito"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "o",
|
||||
"title": "Arrastra archivos o carpetas aquí"
|
||||
},
|
||||
"noFolders": "No hay carpetas disponibles",
|
||||
"sort": {
|
||||
"dateAdded": "Fecha de añadido",
|
||||
"name": "Nombre",
|
||||
"size": "Tamaño"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Fecha de creación",
|
||||
"size": "Tamaño",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Estás a punto de eliminar esta base de conocimientos. Los archivos no se eliminarán, se moverán a Todos los archivos. Una vez eliminada, la base de conocimientos no se podrá recuperar, por favor actúa con precaución.",
|
||||
"empty": "Haz clic en <1>+</1> para comenzar a crear una base de conocimientos"
|
||||
},
|
||||
"new": "Nueva base de conocimientos",
|
||||
"title": "Base de conocimientos"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Todos los archivos",
|
||||
"allPages": "Todos los documentos"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Descargar archivo",
|
||||
"unsupportedFileAndContact": "Este formato de archivo no es compatible con la vista previa en línea. Si desea solicitar una vista previa, no dude en <1>contactarnos</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Estás a punto de eliminar este repositorio. Los archivos no se eliminarán, sino que se moverán a Todos los archivos. Una vez eliminado, el repositorio no se podrá recuperar. Procede con precaución.",
|
||||
"empty": "Haz clic en <1>+</1> para comenzar a crear un repositorio"
|
||||
},
|
||||
"new": "Nuevo repositorio",
|
||||
"title": "Repositorio"
|
||||
},
|
||||
"searchFilePlaceholder": "Buscar archivo",
|
||||
"searchPagePlaceholder": "Buscar documentos",
|
||||
"tab": {
|
||||
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview posee una poderosa capacidad de razonamiento complejo, destacándose en áreas como razonamiento lógico, matemáticas y programación."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 es el modelo insignia de Anthropic, que combina una inteligencia excepcional con un rendimiento escalable, ideal para tareas complejas que requieren respuestas de la más alta calidad y una gran capacidad de razonamiento."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash es un modelo de razonamiento de alto rendimiento de Google, adecuado para tareas multimodales extendidas."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, modelo de inferencia oficial de Kimi, compatible con contexto largo, código, preguntas y respuestas, entre otros escenarios."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "El modelo kimi-k2-thinking, proporcionado por Moonshot AI, es un modelo de pensamiento con capacidades generales de agente y razonamiento. Se destaca en el razonamiento profundo y puede utilizar herramientas en múltiples pasos para ayudar a resolver diversos problemas complejos."
|
||||
"description": "El modelo kimi-k2-thinking, proporcionado por Moonshot AI, es un modelo de pensamiento con capacidades generales de agente y razonamiento. Destaca en el razonamiento profundo y puede utilizar herramientas en múltiples pasos para ayudar a resolver diversos problemas complejos."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Versión rápida del modelo de pensamiento K2, compatible con contexto de 256k, especializado en razonamiento profundo, con velocidad de salida de 60-100 tokens por segundo."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 es el modelo Haiku más rápido e inteligente de Anthropic, con una velocidad relámpago y una capacidad de razonamiento ampliada."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 es el modelo insignia de Anthropic, que combina una inteligencia excepcional con un rendimiento escalable, ideal para tareas complejas que requieren respuestas de la más alta calidad y una gran capacidad de razonamiento."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 es el modelo más inteligente desarrollado por Anthropic hasta la fecha."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "در حال آمادهسازی...",
|
||||
"deleteSuccess": "فایل با موفقیت حذف شد",
|
||||
"downloading": "در حال دانلود فایل...",
|
||||
"goBack": "بازگشت به صفحه قبل",
|
||||
"goForward": "رفتن به صفحه بعد",
|
||||
"goToParent": "ورود به پوشه والد",
|
||||
"moveError": "انتقال فایل ناموفق بود",
|
||||
"moveHere": "انتقال به این مکان",
|
||||
"moveSuccess": "فایل با موفقیت منتقل شد",
|
||||
"moveToFolder": "انتقال به...",
|
||||
"moveToRoot": "انتقال به ریشه",
|
||||
"removeFromKnowledgeBase": "حذف از پایگاه دانش",
|
||||
"removeFromKnowledgeBaseSuccess": "فایل با موفقیت حذف شد"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "یا",
|
||||
"title": "فایل یا پوشه را به اینجا بکشید"
|
||||
},
|
||||
"noFolders": "هیچ پوشهای موجود نیست",
|
||||
"sort": {
|
||||
"dateAdded": "تاریخ افزودن",
|
||||
"name": "نام",
|
||||
"size": "اندازه"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "زمان ایجاد",
|
||||
"size": "اندازه",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "این پایگاه دانش به زودی حذف خواهد شد، اما فایلهای آن حذف نخواهند شد و به بخش همه فایلها منتقل میشوند. پس از حذف پایگاه دانش، امکان بازیابی آن وجود نخواهد داشت، لطفاً با دقت عمل کنید.",
|
||||
"empty": "برای شروع ایجاد پایگاه دانش، روی <1>+</1> کلیک کنید."
|
||||
},
|
||||
"new": "ایجاد پایگاه دانش جدید",
|
||||
"title": "پایگاه دانش"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "تمام فایلها",
|
||||
"allPages": "همهٔ نوشتهها"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "دانلود فایل",
|
||||
"unsupportedFileAndContact": "فرمت این فایل در حال حاضر از پیشنمایش آنلاین پشتیبانی نمیکند. در صورت نیاز به پیشنمایش، لطفاً <1>به ما بازخورد دهید</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "این مخزن در شرف حذف شدن است، اما فایلهای درون آن حذف نخواهند شد و به بخش همه فایلها منتقل میشوند. پس از حذف، بازیابی مخزن امکانپذیر نخواهد بود. لطفاً با احتیاط عمل کنید.",
|
||||
"empty": "برای ایجاد یک مخزن جدید روی <1>+</1> کلیک کنید"
|
||||
},
|
||||
"new": "ایجاد مخزن جدید",
|
||||
"title": "مخزن"
|
||||
},
|
||||
"searchFilePlaceholder": "جستجوی فایل",
|
||||
"searchPagePlaceholder": "جستجوی سند",
|
||||
"tab": {
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
"description": "Opus 4.1 یک مدل پیشرفته از Anthropic است که برای برنامهنویسی، استدلال پیچیده و وظایف مداوم بهینهسازی شده است."
|
||||
},
|
||||
"anthropic/claude-opus-4.5": {
|
||||
"description": "Claude Opus 4.5 مدل پرچمدار شرکت Anthropic است که هوش برجسته را با عملکرد مقیاسپذیر ترکیب میکند و برای انجام وظایف پیچیدهای که نیازمند پاسخهای با بالاترین کیفیت و توانایی استدلال هستند، مناسب است."
|
||||
"description": "Claude Opus 4.5 مدل پرچمدار شرکت Anthropic است که هوش برجسته را با عملکرد مقیاسپذیر ترکیب میکند و برای انجام وظایف پیچیدهای که نیازمند پاسخهای با کیفیت بالا و توانایی استدلال پیشرفته هستند، مناسب است."
|
||||
},
|
||||
"anthropic/claude-sonnet-4": {
|
||||
"description": "Claude Sonnet 4 نسخهای با قابلیت استدلال ترکیبی از Anthropic است که تواناییهای فکری و غیر فکری را با هم ترکیب میکند."
|
||||
@@ -831,7 +831,7 @@
|
||||
"description": "Claude Opus 4 قدرتمندترین مدل Anthropic برای پردازش وظایف بسیار پیچیده است. این مدل در زمینههای عملکرد، هوش، روانی و درک فوقالعاده عمل میکند."
|
||||
},
|
||||
"claude-opus-4-5-20251101": {
|
||||
"description": "Claude Opus 4.5 مدل پرچمدار شرکت Anthropic است که هوش برجسته را با عملکرد مقیاسپذیر ترکیب میکند و برای انجام وظایف پیچیدهای که نیازمند پاسخهای با بالاترین کیفیت و توانایی استدلال هستند، مناسب است."
|
||||
"description": "Claude Opus 4.5 مدل پرچمدار شرکت Anthropic است که هوش برجسته را با عملکرد مقیاسپذیر ترکیب میکند و برای انجام وظایف پیچیدهای که نیازمند پاسخهای با کیفیت بالا و توانایی استدلال پیشرفته هستند، مناسب است."
|
||||
},
|
||||
"claude-sonnet-4-20250514": {
|
||||
"description": "Claude Sonnet 4 میتواند پاسخهای تقریباً فوری یا تفکر گام به گام طولانیمدت تولید کند که کاربران میتوانند این فرآیندها را به وضوح مشاهده کنند."
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview دارای تواناییهای پیچیده استدلال است و در زمینههای استدلال منطقی، ریاضیات، برنامهنویسی و غیره عملکرد عالی دارد."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 مدل پرچمدار شرکت Anthropic است که هوش برجسته را با عملکرد مقیاسپذیر ترکیب میکند و برای انجام وظایف پیچیدهای که نیازمند پاسخهای با بالاترین کیفیت و توانایی استدلال هستند، مناسب است."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash مدل استدلال با عملکرد بالای Google است که برای وظایف چندوجهی گسترده مناسب است."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct، مدل استنتاج رسمی Kimi، پشتیبانی از زمینه بلند، کدنویسی، پرسش و پاسخ و سناریوهای متنوع."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "مدل kimi-k2-thinking که توسط شرکت Moonshot ارائه شده، یک مدل تفکر با قابلیتهای عمومی عاملمحور و توانایی استدلال است. این مدل در استدلال عمیق مهارت دارد و میتواند با استفاده از فراخوانی چندمرحلهای ابزارها، در حل انواع مسائل دشوار کمک کند."
|
||||
"description": "مدل kimi-k2-thinking از شرکت Moonshot یک مدل تفکر با قابلیتهای عمومی عاملمحور و توانایی استدلال است. این مدل در استدلال عمیق مهارت دارد و میتواند با استفاده از ابزارهای چندمرحلهای، در حل مسائل گوناگون کمک کند."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "نسخه پرسرعت مدل تفکر طولانی K2 با پشتیبانی از زمینه 256k، مناسب برای استدلال عمیق با سرعت خروجی 60 تا 100 توکن در ثانیه."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 سریعترین و هوشمندترین مدل Haiku از شرکت Anthropic است که دارای سرعتی برقآسا و توانایی تفکر توسعهیافته میباشد."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 مدل پرچمدار شرکت Anthropic است که هوش برجسته را با عملکرد مقیاسپذیر ترکیب میکند و برای انجام وظایف پیچیدهای که نیازمند پاسخهای با کیفیت بالا و توانایی استدلال پیشرفته هستند، مناسب است."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 هوشمندترین مدلی است که تاکنون توسط Anthropic ارائه شده است."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Préparation en cours...",
|
||||
"deleteSuccess": "Fichier supprimé avec succès",
|
||||
"downloading": "Téléchargement du fichier en cours...",
|
||||
"goBack": "Retour à la page précédente",
|
||||
"goForward": "Aller à la page suivante",
|
||||
"goToParent": "Accéder au dossier parent",
|
||||
"moveError": "Échec du déplacement du fichier",
|
||||
"moveHere": "Déplacer ici",
|
||||
"moveSuccess": "Fichier déplacé avec succès",
|
||||
"moveToFolder": "Déplacer vers...",
|
||||
"moveToRoot": "Déplacer vers le répertoire racine",
|
||||
"removeFromKnowledgeBase": "Retirer de la base de connaissances",
|
||||
"removeFromKnowledgeBaseSuccess": "Fichier retiré avec succès"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "ou",
|
||||
"title": "Faites glisser un fichier ou un dossier ici"
|
||||
},
|
||||
"noFolders": "Aucun dossier disponible",
|
||||
"sort": {
|
||||
"dateAdded": "Date d'ajout",
|
||||
"name": "Nom",
|
||||
"size": "Taille"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Date de création",
|
||||
"size": "Taille",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Vous allez supprimer cette base de connaissances. Les fichiers ne seront pas supprimés, mais déplacés dans tous les fichiers. La suppression de la base de connaissances est irréversible, veuillez agir avec prudence.",
|
||||
"empty": "Cliquez sur <1>+</1> pour commencer à créer une base de connaissances"
|
||||
},
|
||||
"new": "Nouvelle base de connaissances",
|
||||
"title": "Base de connaissances"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Tous les fichiers",
|
||||
"allPages": "Tous les documents"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Télécharger le fichier",
|
||||
"unsupportedFileAndContact": "Ce format de fichier n'est pas encore pris en charge pour l'aperçu en ligne. Si vous souhaitez un aperçu, n'hésitez pas à <1>nous contacter</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Ce dépôt va être supprimé. Les fichiers qu’il contient ne seront pas supprimés, mais déplacés dans Tous les fichiers. Une fois supprimé, le dépôt ne pourra pas être restauré. Veuillez procéder avec prudence.",
|
||||
"empty": "Cliquez sur <1>+</1> pour commencer à créer un dépôt"
|
||||
},
|
||||
"new": "Nouveau dépôt",
|
||||
"title": "Dépôt"
|
||||
},
|
||||
"searchFilePlaceholder": "Rechercher un fichier",
|
||||
"searchPagePlaceholder": "Rechercher un document",
|
||||
"tab": {
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
"description": "Opus 4.1 est un modèle haut de gamme d’Anthropic, optimisé pour la programmation, le raisonnement complexe et les tâches continues."
|
||||
},
|
||||
"anthropic/claude-opus-4.5": {
|
||||
"description": "Claude Opus 4.5 est le modèle phare d'Anthropic, alliant une intelligence exceptionnelle à des performances évolutives. Il est idéal pour les tâches complexes nécessitant des réponses de très haute qualité et de solides capacités de raisonnement."
|
||||
"description": "Claude Opus 4.5 est le modèle phare d'Anthropic, alliant une intelligence exceptionnelle à des performances évolutives. Il est idéal pour les tâches complexes nécessitant des réponses de la plus haute qualité et de solides capacités de raisonnement."
|
||||
},
|
||||
"anthropic/claude-sonnet-4": {
|
||||
"description": "Claude Sonnet 4 est une version hybride de raisonnement d’Anthropic, combinant capacités cognitives et non cognitives."
|
||||
@@ -831,7 +831,7 @@
|
||||
"description": "Claude Opus 4 est le modèle le plus puissant d'Anthropic pour traiter des tâches hautement complexes. Il excelle en performance, intelligence, fluidité et compréhension."
|
||||
},
|
||||
"claude-opus-4-5-20251101": {
|
||||
"description": "Claude Opus 4.5 est le modèle phare d'Anthropic, alliant une intelligence exceptionnelle à des performances évolutives. Il est idéal pour les tâches complexes nécessitant des réponses de très haute qualité et de solides capacités de raisonnement."
|
||||
"description": "Claude Opus 4.5 est le modèle phare d'Anthropic, alliant une intelligence exceptionnelle à des performances évolutives. Il est idéal pour les tâches complexes nécessitant des réponses de la plus haute qualité et de solides capacités de raisonnement."
|
||||
},
|
||||
"claude-sonnet-4-20250514": {
|
||||
"description": "Claude Sonnet 4 peut générer des réponses quasi instantanées ou des réflexions prolongées étape par étape, visibles clairement par l'utilisateur."
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview possède de puissantes capacités de raisonnement complexe, se distinguant dans les domaines du raisonnement logique, des mathématiques et de la programmation."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 est le modèle phare d'Anthropic, alliant une intelligence exceptionnelle à des performances évolutives. Il est idéal pour les tâches complexes nécessitant des réponses de très haute qualité et de solides capacités de raisonnement."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash est un modèle de raisonnement haute performance de Google, adapté aux tâches multimodales étendues."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, modèle d'inférence officiel de Kimi, prenant en charge le long contexte, le code, les questions-réponses et d'autres scénarios."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Le modèle kimi-k2-thinking, proposé par Moonshot AI, est un modèle de réflexion doté de capacités agentiques générales et de raisonnement. Il excelle dans le raisonnement approfondi et peut utiliser des outils en plusieurs étapes pour résoudre divers problèmes complexes."
|
||||
"description": "Le modèle kimi-k2-thinking, proposé par Moonshot AI, est un modèle de réflexion doté de capacités générales d'agent et de raisonnement. Il excelle dans le raisonnement approfondi et peut utiliser des outils en plusieurs étapes pour résoudre divers problèmes complexes."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Version rapide du modèle de raisonnement long K2, avec un contexte de 256k, spécialisé dans le raisonnement profond et une vitesse de sortie de 60 à 100 tokens par seconde."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 est le modèle Haiku le plus rapide et le plus intelligent d’Anthropic, offrant une vitesse fulgurante et une capacité de raisonnement étendue."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 est le modèle phare d'Anthropic, alliant une intelligence exceptionnelle à des performances évolutives. Il est idéal pour les tâches complexes nécessitant des réponses de la plus haute qualité et de solides capacités de raisonnement."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 est le modèle le plus intelligent jamais conçu par Anthropic."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Preparazione in corso...",
|
||||
"deleteSuccess": "File eliminato con successo",
|
||||
"downloading": "Download del file in corso...",
|
||||
"goBack": "Torna alla pagina precedente",
|
||||
"goForward": "Vai alla pagina successiva",
|
||||
"goToParent": "Vai alla cartella superiore",
|
||||
"moveError": "Spostamento del file non riuscito",
|
||||
"moveHere": "Sposta qui",
|
||||
"moveSuccess": "File spostato con successo",
|
||||
"moveToFolder": "Sposta in...",
|
||||
"moveToRoot": "Sposta nella directory principale",
|
||||
"removeFromKnowledgeBase": "Rimuovi dalla base di conoscenza",
|
||||
"removeFromKnowledgeBaseSuccess": "File rimosso con successo"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "oppure",
|
||||
"title": "Trascina qui file o cartelle"
|
||||
},
|
||||
"noFolders": "Nessuna cartella disponibile",
|
||||
"sort": {
|
||||
"dateAdded": "Data di aggiunta",
|
||||
"name": "Nome",
|
||||
"size": "Dimensione"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Data di creazione",
|
||||
"size": "Dimensione",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Stai per eliminare questa knowledge base. I file al suo interno non verranno eliminati, ma spostati in 'Tutti i file'. Una volta eliminata, la knowledge base non potrà essere recuperata, procedi con cautela.",
|
||||
"empty": "Clicca <1>+</1> per iniziare a creare una knowledge base"
|
||||
},
|
||||
"new": "Nuova knowledge base",
|
||||
"title": "Knowledge Base"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Tutti i file",
|
||||
"allPages": "Tutti i documenti"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Scarica file",
|
||||
"unsupportedFileAndContact": "Questo formato di file non è attualmente supportato per la visualizzazione online. Se hai bisogno di una visualizzazione, ti preghiamo di <1>contattarci</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Il repository sta per essere eliminato. I file al suo interno non verranno cancellati, ma spostati nella sezione Tutti i file. Una volta eliminato, il repository non potrà essere recuperato. Procedi con cautela.",
|
||||
"empty": "Fai clic su <1>+</1> per iniziare a creare un repository"
|
||||
},
|
||||
"new": "Crea nuovo repository",
|
||||
"title": "Repository"
|
||||
},
|
||||
"searchFilePlaceholder": "Cerca file",
|
||||
"searchPagePlaceholder": "Cerca documenti",
|
||||
"tab": {
|
||||
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview possiede potenti capacità di ragionamento complesso, eccellendo nei campi del ragionamento logico, della matematica e della programmazione."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 è il modello di punta di Anthropic, che unisce un'intelligenza straordinaria a prestazioni scalabili, ideale per compiti complessi che richiedono risposte di altissima qualità e capacità di ragionamento avanzate."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash è un modello di ragionamento ad alte prestazioni di Google, adatto a compiti multimodali estesi."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, modello ufficiale di inferenza Kimi, supporta contesto lungo, codice, Q&A e altri scenari."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Il modello kimi-k2-thinking, fornito da Moonshot AI, è un modello di pensiero dotato di capacità agentiche generali e di ragionamento, eccellente nel ragionamento profondo e capace di utilizzare strumenti in più fasi per risolvere una vasta gamma di problemi complessi."
|
||||
"description": "Il modello kimi-k2-thinking, fornito da Moonshot AI, è un modello di pensiero dotato di capacità agentiche generali e di ragionamento. Eccelle nel ragionamento profondo e può utilizzare strumenti in più fasi per aiutare a risolvere una vasta gamma di problemi complessi."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Versione ad alta velocità del modello K2 Thinking, supporta contesto da 256k, eccelle nel ragionamento profondo con output a 60-100 token al secondo."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 è il modello Haiku più veloce e intelligente di Anthropic, con una velocità fulminea e una notevole capacità di ragionamento esteso."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 è il modello di punta di Anthropic, che unisce un'intelligenza straordinaria a prestazioni scalabili, ideale per compiti complessi che richiedono risposte di altissima qualità e capacità di ragionamento avanzate."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 è il modello più intelligente mai realizzato da Anthropic fino ad oggi."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "準備中...",
|
||||
"deleteSuccess": "ファイルが正常に削除されました",
|
||||
"downloading": "ファイルをダウンロード中...",
|
||||
"goBack": "前のページに戻る",
|
||||
"goForward": "次のページへ進む",
|
||||
"goToParent": "親フォルダへ移動",
|
||||
"moveError": "ファイルの移動に失敗しました",
|
||||
"moveHere": "ここに移動",
|
||||
"moveSuccess": "ファイルを正常に移動しました",
|
||||
"moveToFolder": "フォルダへ移動...",
|
||||
"moveToRoot": "ルートディレクトリへ移動",
|
||||
"removeFromKnowledgeBase": "知識ベースから削除",
|
||||
"removeFromKnowledgeBaseSuccess": "ファイルが正常に削除されました"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "または",
|
||||
"title": "ここにファイルまたはフォルダーをドラッグしてください"
|
||||
},
|
||||
"noFolders": "フォルダがありません",
|
||||
"sort": {
|
||||
"dateAdded": "追加日",
|
||||
"name": "名前",
|
||||
"size": "サイズ"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "作成日時",
|
||||
"size": "サイズ",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "この知識ベースを削除しようとしています。ファイルは削除されず、すべてのファイルに移動されます。知識ベースを削除すると復元できませんので、慎重に操作してください。",
|
||||
"empty": "クリックして <1>+</1> 知識ベースを作成を開始"
|
||||
},
|
||||
"new": "新しい知識ベース",
|
||||
"title": "知識ベース"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "すべてのファイル",
|
||||
"allPages": "すべてのドキュメント"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "ファイルをダウンロード",
|
||||
"unsupportedFileAndContact": "このファイル形式はオンラインプレビューをサポートしていません。プレビューのリクエストがある場合は、ぜひ<1>ご連絡ください</1>。"
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "このリポジトリを削除しようとしています。中のファイルは削除されず、すべてのファイルに移動されます。リポジトリを削除すると元に戻せませんので、慎重に操作してください。",
|
||||
"empty": "<1>+</1> をクリックしてリポジトリを作成してください"
|
||||
},
|
||||
"new": "新しいリポジトリを作成",
|
||||
"title": "リポジトリ"
|
||||
},
|
||||
"searchFilePlaceholder": "ファイルを検索",
|
||||
"searchPagePlaceholder": "文書を検索",
|
||||
"tab": {
|
||||
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Previewは、強力な複雑な推論能力を備え、論理推論、数学、プログラミングなどの分野で優れたパフォーマンスを発揮します。"
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 は Anthropic のフラッグシップモデルであり、卓越した知性とスケーラビリティを兼ね備え、最高水準の応答品質と推論能力が求められる複雑なタスクに最適です。"
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash は Google の高性能推論モデルで、拡張されたマルチモーダルタスクに適しています。"
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct、Kimi 公式の推論モデルで、長文コンテキスト、コード、QA など多様なシナリオに対応します。"
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "kimi-k2-thinking モデルは、月の裏側が提供する汎用的なエージェント機能と推論能力を備えた思考モデルであり、高度な推論を得意とし、複数のツールを段階的に活用することで、さまざまな難題の解決を支援します。"
|
||||
"description": "kimi-k2-thinking モデルは、月の裏側が提供する汎用的なエージェント能力と推論能力を備えた思考モデルであり、深い推論に優れ、複数ステップのツール呼び出しを通じてさまざまな難題の解決を支援します。"
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "K2 長期思考モデルの高速版で、256k の文脈をサポートし、深い推論に優れ、出力速度は毎秒 60〜100 トークンに向上しています。"
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 は、Anthropic による最速かつ最もスマートな Haiku モデルで、驚異的なスピードと高度な思考能力を備えています。"
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 は Anthropic のフラッグシップモデルであり、卓越した知性とスケーラビリティを兼ね備え、最高水準の応答品質と推論能力が求められる複雑なタスクに最適です。"
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 は、Anthropic がこれまでに開発した中で最も高度な知能を持つモデルです。"
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "준비 중...",
|
||||
"deleteSuccess": "파일이 성공적으로 삭제되었습니다.",
|
||||
"downloading": "파일 다운로드 중...",
|
||||
"goBack": "이전 페이지로 돌아가기",
|
||||
"goForward": "다음 페이지로 이동",
|
||||
"goToParent": "상위 폴더로 이동",
|
||||
"moveError": "파일 이동 실패",
|
||||
"moveHere": "여기로 이동",
|
||||
"moveSuccess": "파일이 성공적으로 이동되었습니다",
|
||||
"moveToFolder": "다음으로 이동...",
|
||||
"moveToRoot": "루트 디렉터리로 이동",
|
||||
"removeFromKnowledgeBase": "지식베이스에서 제거",
|
||||
"removeFromKnowledgeBaseSuccess": "파일이 성공적으로 제거되었습니다."
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "또는",
|
||||
"title": "파일이나 폴더를 이곳에 끌어다 놓으세요"
|
||||
},
|
||||
"noFolders": "폴더가 없습니다",
|
||||
"sort": {
|
||||
"dateAdded": "추가 날짜",
|
||||
"name": "이름",
|
||||
"size": "크기"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "생성일",
|
||||
"size": "크기",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "이 지식베이스를 삭제하려고 합니다. 포함된 파일은 삭제되지 않으며 전체 파일로 이동됩니다. 삭제된 지식베이스는 복구할 수 없으니 신중히 진행해 주세요.",
|
||||
"empty": "<1>+</1>를 클릭하여 지식베이스를 생성하세요"
|
||||
},
|
||||
"new": "새 지식베이스",
|
||||
"title": "지식베이스"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "모든 파일",
|
||||
"allPages": "모든 문서"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "파일 다운로드",
|
||||
"unsupportedFileAndContact": "이 파일 형식은 온라인 미리보기를 지원하지 않습니다. 미리보기 기능이 필요하시면 <1>의견을 보내주세요</1>"
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "이 저장소를 삭제하려고 합니다. 저장소 내 파일은 삭제되지 않고 전체 파일로 이동됩니다. 저장소 삭제는 복구할 수 없으니 신중히 진행해 주세요.",
|
||||
"empty": "<1>+</1> 버튼을 클릭하여 저장소를 생성하세요"
|
||||
},
|
||||
"new": "새 저장소",
|
||||
"title": "저장소"
|
||||
},
|
||||
"searchFilePlaceholder": "파일 검색",
|
||||
"searchPagePlaceholder": "문서 검색",
|
||||
"tab": {
|
||||
|
||||
@@ -3467,6 +3467,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5는 Anthropic에서 가장 빠르고 똑똑한 Haiku 모델로, 번개처럼 빠른 속도와 확장된 사고 능력을 갖추고 있습니다."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5는 Anthropic의 플래그십 모델로, 탁월한 지능과 확장 가능한 성능을 결합하여 최고 수준의 응답 품질과 추론 능력이 요구되는 복잡한 작업에 적합합니다."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5는 지금까지 Anthropic이 개발한 가장 지능적인 모델입니다."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Voorbereiden...",
|
||||
"deleteSuccess": "Bestand succesvol verwijderd",
|
||||
"downloading": "Bestand aan het downloaden...",
|
||||
"goBack": "Ga terug naar de vorige pagina",
|
||||
"goForward": "Ga verder naar de volgende pagina",
|
||||
"goToParent": "Ga naar de bovenliggende map",
|
||||
"moveError": "Verplaatsen van bestand mislukt",
|
||||
"moveHere": "Hierheen verplaatsen",
|
||||
"moveSuccess": "Bestand succesvol verplaatst",
|
||||
"moveToFolder": "Verplaatsen naar...",
|
||||
"moveToRoot": "Verplaatsen naar hoofdmap",
|
||||
"removeFromKnowledgeBase": "Verwijderen uit kennisbank",
|
||||
"removeFromKnowledgeBaseSuccess": "Bestand succesvol verwijderd"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "of",
|
||||
"title": "Sleep bestanden of mappen hierheen"
|
||||
},
|
||||
"noFolders": "Geen mappen beschikbaar",
|
||||
"sort": {
|
||||
"dateAdded": "Datum toegevoegd",
|
||||
"name": "Naam",
|
||||
"size": "Grootte"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Aangemaakt op",
|
||||
"size": "Grootte",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Je staat op het punt deze kennisbank te verwijderen. De bestanden hierin worden niet verwijderd, maar verplaatst naar 'Alle bestanden'. Een verwijderde kennisbank kan niet worden hersteld, wees voorzichtig.",
|
||||
"empty": "Klik op <1>+</1> om een kennisbank te maken"
|
||||
},
|
||||
"new": "Nieuwe kennisbank",
|
||||
"title": "Kennisbank"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Alle bestanden",
|
||||
"allPages": "Alle documenten"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Bestand downloaden",
|
||||
"unsupportedFileAndContact": "Dit bestandsformaat wordt momenteel niet ondersteund voor online preview. Als u een preview wilt, neem dan gerust <1>contact met ons op</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Deze opslagplaats wordt verwijderd. De bestanden blijven behouden en worden verplaatst naar 'Alle bestanden'. Verwijderde kennisopslagplaatsen kunnen niet worden hersteld. Ga voorzichtig te werk.",
|
||||
"empty": "Klik op <1>+</1> om een nieuwe opslagplaats aan te maken"
|
||||
},
|
||||
"new": "Nieuwe opslagplaats",
|
||||
"title": "Opslagplaats"
|
||||
},
|
||||
"searchFilePlaceholder": "Zoek bestand",
|
||||
"searchPagePlaceholder": "Documenten zoeken",
|
||||
"tab": {
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
"description": "Opus 4.1 is een geavanceerd model van Anthropic, geoptimaliseerd voor programmeren, complexe redenering en langdurige taken."
|
||||
},
|
||||
"anthropic/claude-opus-4.5": {
|
||||
"description": "Claude Opus 4.5 is het vlaggenschipmodel van Anthropic, dat uitmuntende intelligentie combineert met schaalbare prestaties. Het is ideaal voor complexe taken die antwoorden van de hoogste kwaliteit en geavanceerde redeneervermogen vereisen."
|
||||
"description": "Claude Opus 4.5 is het vlaggenschipmodel van Anthropic, dat uitmuntende intelligentie combineert met schaalbare prestaties. Het is ideaal voor complexe taken die de hoogste kwaliteit van antwoorden en redeneervermogen vereisen."
|
||||
},
|
||||
"anthropic/claude-sonnet-4": {
|
||||
"description": "Claude Sonnet 4 is een hybride redeneermodel van Anthropic, dat zowel denkende als niet-denkende capaciteiten combineert."
|
||||
@@ -831,7 +831,7 @@
|
||||
"description": "Claude Opus 4 is het krachtigste model van Anthropic voor het verwerken van zeer complexe taken. Het presteert uitstekend op het gebied van prestaties, intelligentie, vloeiendheid en begrip."
|
||||
},
|
||||
"claude-opus-4-5-20251101": {
|
||||
"description": "Claude Opus 4.5 is het vlaggenschipmodel van Anthropic, dat uitmuntende intelligentie combineert met schaalbare prestaties. Het is ideaal voor complexe taken die antwoorden van de hoogste kwaliteit en geavanceerde redeneervermogen vereisen."
|
||||
"description": "Claude Opus 4.5 is het vlaggenschipmodel van Anthropic, dat uitmuntende intelligentie combineert met schaalbare prestaties. Het is ideaal voor complexe taken die de hoogste kwaliteit van antwoorden en redeneervermogen vereisen."
|
||||
},
|
||||
"claude-sonnet-4-20250514": {
|
||||
"description": "Claude Sonnet 4 kan bijna onmiddellijke reacties genereren of uitgebreide stapsgewijze overwegingen, waarbij gebruikers deze processen duidelijk kunnen volgen."
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview heeft krachtige complexe redeneercapaciteiten en presteert uitstekend in logische redenering, wiskunde en programmeren."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 is het vlaggenschipmodel van Anthropic, dat uitmuntende intelligentie combineert met schaalbare prestaties. Het is ideaal voor complexe taken die antwoorden van de hoogste kwaliteit en geavanceerde redeneervermogen vereisen."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash is een krachtig redeneermodel van Google, geschikt voor uitgebreide multimodale taken."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, het officiële redeneermodel van Kimi, ondersteunt lange context, code, Q&A en meer."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Het kimi-k2-thinking-model, aangeboden door Moonshot AI, is een denkmodel met algemene agentische capaciteiten en redeneervermogen. Het blinkt uit in diepgaande redenering en kan via meerstapsgebruik van tools helpen bij het oplossen van uiteenlopende complexe problemen."
|
||||
"description": "Het kimi-k2-thinking-model, aangeboden door Moonshot AI, is een denkmodel met algemene agentische capaciteiten en redeneervermogen. Het blinkt uit in diepgaande redenering en kan via meerstaps toolgebruik helpen bij het oplossen van uiteenlopende complexe problemen."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Snelle versie van het K2 Thinking-model, ondersteunt 256k context, geoptimaliseerd voor diepgaande redenering met een uitvoersnelheid van 60-100 tokens per seconde."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 is het snelste en slimste Haiku-model van Anthropic, met razendsnelle prestaties en geavanceerde denkvermogens."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 is het vlaggenschipmodel van Anthropic, dat uitmuntende intelligentie combineert met schaalbare prestaties. Het is ideaal voor complexe taken die de hoogste kwaliteit van antwoorden en redeneervermogen vereisen."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 is het meest geavanceerde model dat Anthropic tot nu toe heeft ontwikkeld."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Przygotowywanie...",
|
||||
"deleteSuccess": "Plik usunięty pomyślnie",
|
||||
"downloading": "Pobieranie pliku...",
|
||||
"goBack": "Wróć do poprzedniej strony",
|
||||
"goForward": "Przejdź do następnej strony",
|
||||
"goToParent": "Przejdź do folderu nadrzędnego",
|
||||
"moveError": "Nie udało się przenieść pliku",
|
||||
"moveHere": "Przenieś tutaj",
|
||||
"moveSuccess": "Plik został pomyślnie przeniesiony",
|
||||
"moveToFolder": "Przenieś do...",
|
||||
"moveToRoot": "Przenieś do katalogu głównego",
|
||||
"removeFromKnowledgeBase": "Usuń z bazy wiedzy",
|
||||
"removeFromKnowledgeBaseSuccess": "Plik usunięty pomyślnie"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "lub",
|
||||
"title": "Przeciągnij plik lub folder tutaj"
|
||||
},
|
||||
"noFolders": "Brak folderów",
|
||||
"sort": {
|
||||
"dateAdded": "Data dodania",
|
||||
"name": "Nazwa",
|
||||
"size": "Rozmiar"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Data utworzenia",
|
||||
"size": "Rozmiar",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Zaraz usuniesz tę bazę wiedzy, pliki w niej zawarte nie zostaną usunięte, a zostaną przeniesione do folderu wszystkich plików. Po usunięciu bazy wiedzy nie będzie można jej przywrócić, proszę działać ostrożnie.",
|
||||
"empty": "Kliknij <1>+</1>, aby rozpocząć tworzenie bazy wiedzy"
|
||||
},
|
||||
"new": "Nowa baza wiedzy",
|
||||
"title": "Baza wiedzy"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Wszystkie pliki",
|
||||
"allPages": "Wszystkie dokumenty"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Pobierz plik",
|
||||
"unsupportedFileAndContact": "Ten format pliku nie jest obecnie obsługiwany w podglądzie online. Jeśli chcesz uzyskać podgląd, zachęcamy do <1>skontaktowania się z nami</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Zamierzasz usunąć to repozytorium. Pliki w nim zawarte nie zostaną usunięte, lecz przeniesione do folderu 'Wszystkie pliki'. Po usunięciu repozytorium nie będzie można go odzyskać — prosimy o ostrożność.",
|
||||
"empty": "Kliknij <1>+</1>, aby rozpocząć tworzenie repozytorium"
|
||||
},
|
||||
"new": "Utwórz nowe repozytorium",
|
||||
"title": "Repozytorium"
|
||||
},
|
||||
"searchFilePlaceholder": "Szukaj pliku",
|
||||
"searchPagePlaceholder": "Szukaj dokumentów",
|
||||
"tab": {
|
||||
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview posiada silne zdolności do złożonego wnioskowania, wyróżniając się w dziedzinach takich jak wnioskowanie logiczne, matematyka i programowanie."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 to flagowy model firmy Anthropic, łączący wyjątkową inteligencję z możliwością skalowania, idealny do złożonych zadań wymagających najwyższej jakości odpowiedzi i zdolności rozumowania."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash to wysokowydajny model wnioskowania firmy Google, odpowiedni do rozszerzonych zadań multimodalnych."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, oficjalny model wnioskowania Kimi, wspierający długi kontekst, kodowanie, pytania i inne scenariusze."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Model kimi-k2-thinking, opracowany przez Moonshot AI, to uniwersalny model myślenia z agentowymi zdolnościami i umiejętnością rozumowania. Doskonale radzi sobie z głębokim wnioskowaniem i potrafi korzystać z narzędzi w wielu krokach, pomagając rozwiązywać różnorodne problemy."
|
||||
"description": "Model kimi-k2-thinking, opracowany przez Moonshot AI, to uniwersalny model myślenia z agentowymi zdolnościami i umiejętnością rozumowania. Doskonale radzi sobie z głębokim rozumowaniem i potrafi korzystać z narzędzi w wielu krokach, pomagając rozwiązywać różnorodne trudne problemy."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Szybka wersja modelu długiego myślenia K2, obsługuje kontekst 256k, specjalizuje się w głębokim wnioskowaniu, z prędkością generowania 60–100 tokenów na sekundę."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 to najszybszy i najbardziej inteligentny model Haiku firmy Anthropic, oferujący błyskawiczne działanie i zaawansowane możliwości rozumowania."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 to flagowy model firmy Anthropic, łączący wyjątkową inteligencję z możliwością skalowania, idealny do złożonych zadań wymagających najwyższej jakości odpowiedzi i zdolności rozumowania."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 to jak dotąd najbardziej zaawansowany model stworzony przez firmę Anthropic."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Preparando...",
|
||||
"deleteSuccess": "Arquivo excluído com sucesso",
|
||||
"downloading": "Baixando arquivo...",
|
||||
"goBack": "Voltar para a página anterior",
|
||||
"goForward": "Avançar para a próxima página",
|
||||
"goToParent": "Ir para a pasta pai",
|
||||
"moveError": "Falha ao mover o arquivo",
|
||||
"moveHere": "Mover para cá",
|
||||
"moveSuccess": "Arquivo movido com sucesso",
|
||||
"moveToFolder": "Mover para...",
|
||||
"moveToRoot": "Mover para o diretório raiz",
|
||||
"removeFromKnowledgeBase": "Remover do banco de conhecimento",
|
||||
"removeFromKnowledgeBaseSuccess": "Arquivo removido com sucesso"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "ou",
|
||||
"title": "Arraste arquivos ou pastas para cá"
|
||||
},
|
||||
"noFolders": "Nenhuma pasta disponível",
|
||||
"sort": {
|
||||
"dateAdded": "Data de adição",
|
||||
"name": "Nome",
|
||||
"size": "Tamanho"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Data de criação",
|
||||
"size": "Tamanho",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Você está prestes a excluir este repositório de conhecimento. Os arquivos não serão excluídos, mas serão movidos para 'Todos os arquivos'. Após a exclusão, o repositório não poderá ser recuperado, por favor, proceda com cautela.",
|
||||
"empty": "Clique em <1>+</1> para começar a criar um repositório de conhecimento"
|
||||
},
|
||||
"new": "Novo repositório de conhecimento",
|
||||
"title": "Repositório de conhecimento"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Todos os arquivos",
|
||||
"allPages": "Todos os Documentos"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Baixar arquivo",
|
||||
"unsupportedFileAndContact": "Este formato de arquivo não é suportado para visualização online. Se você tiver interesse em visualizar, sinta-se à vontade para <1>nos enviar um feedback</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Este repositório será excluído, mas os arquivos nele contidos não serão apagados — eles serão movidos para Todos os Arquivos. A exclusão do repositório é irreversível, por favor, proceda com cautela.",
|
||||
"empty": "Clique em <1>+</1> para começar a criar um repositório"
|
||||
},
|
||||
"new": "Novo Repositório",
|
||||
"title": "Repositório"
|
||||
},
|
||||
"searchFilePlaceholder": "Pesquisar arquivo",
|
||||
"searchPagePlaceholder": "Buscar documentos",
|
||||
"tab": {
|
||||
|
||||
@@ -3467,6 +3467,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 é o modelo Haiku mais rápido e inteligente da Anthropic, com velocidade relâmpago e capacidade de raciocínio expandida."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 é o modelo principal da Anthropic, combinando inteligência excepcional com desempenho escalável, ideal para tarefas complexas que exigem respostas de altíssima qualidade e grande capacidade de raciocínio."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 é o modelo mais inteligente já desenvolvido pela Anthropic até o momento."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Подготовка...",
|
||||
"deleteSuccess": "Файл успешно удален",
|
||||
"downloading": "Загрузка файла...",
|
||||
"goBack": "Вернуться на предыдущую страницу",
|
||||
"goForward": "Перейти на следующую страницу",
|
||||
"goToParent": "Перейти в родительскую папку",
|
||||
"moveError": "Не удалось переместить файл",
|
||||
"moveHere": "Переместить сюда",
|
||||
"moveSuccess": "Файл успешно перемещён",
|
||||
"moveToFolder": "Переместить в...",
|
||||
"moveToRoot": "Переместить в корневой каталог",
|
||||
"removeFromKnowledgeBase": "Удалить из базы знаний",
|
||||
"removeFromKnowledgeBaseSuccess": "Файл успешно удален"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "или",
|
||||
"title": "Перетащите файл или папку сюда"
|
||||
},
|
||||
"noFolders": "Папки отсутствуют",
|
||||
"sort": {
|
||||
"dateAdded": "Дата добавления",
|
||||
"name": "Имя",
|
||||
"size": "Размер"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Дата создания",
|
||||
"size": "Размер",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Вы собираетесь удалить эту базу знаний. Файлы в ней не будут удалены и будут перемещены в общие файлы. После удаления база знаний не может быть восстановлена, пожалуйста, будьте осторожны.",
|
||||
"empty": "Нажмите <1>+</1>, чтобы начать создание базы знаний"
|
||||
},
|
||||
"new": "Создать базу знаний",
|
||||
"title": "База знаний"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Все файлы",
|
||||
"allPages": "Все документы"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Скачать файл",
|
||||
"unsupportedFileAndContact": "Этот формат файла в настоящее время не поддерживает онлайн-просмотр. Если у вас есть запрос на просмотр, пожалуйста, <1>сообщите нам</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Этот репозиторий будет удалён, но содержащиеся в нём файлы останутся и будут перемещены в общий список файлов. Удаление репозитория необратимо, пожалуйста, действуйте осторожно.",
|
||||
"empty": "Нажмите <1>+</1>, чтобы создать новый репозиторий"
|
||||
},
|
||||
"new": "Создать репозиторий",
|
||||
"title": "Репозиторий"
|
||||
},
|
||||
"searchFilePlaceholder": "Поиск файла",
|
||||
"searchPagePlaceholder": "Поиск документов",
|
||||
"tab": {
|
||||
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview обладает мощными способностями к сложному выводу, демонстрируя отличные результаты в области логического вывода, математики и программирования."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 — это флагманская модель компании Anthropic, сочетающая выдающийся интеллект и масштабируемость, идеально подходящая для сложных задач, требующих наивысшего качества ответов и способности к рассуждению."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash — высокопроизводительная модель рассуждения от Google, подходящая для расширенных мультимодальных задач."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct — официальная модель вывода Kimi, поддерживающая длинный контекст, программирование, вопросы-ответы и другие сценарии."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Модель kimi-k2-thinking от Moonshot обладает универсальными агентными и логическими способностями. Она превосходно справляется с глубокой дедукцией и может использовать инструменты в несколько этапов для решения различных сложных задач."
|
||||
"description": "Модель kimi-k2-thinking от Moonshot AI — это универсальная модель мышления с агентными и логическими способностями. Она превосходно справляется с глубокой дедукцией и может использовать инструменты в несколько этапов для решения различных сложных задач."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Ускоренная версия модели длительного рассуждения K2 с поддержкой 256k контекста, оптимизирована для глубокого анализа и обеспечивает скорость вывода 60–100 токенов в секунду."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 — самая быстрая и умная модель Haiku от Anthropic, обладающая молниеносной скоростью и расширенными возможностями мышления."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 — это флагманская модель компании Anthropic, сочетающая выдающийся интеллект и масштабируемость, идеально подходящая для сложных задач, требующих наивысшего качества ответов и способности к рассуждению."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 — самая интеллектуально продвинутая модель от Anthropic на сегодняшний день."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Hazırlanıyor...",
|
||||
"deleteSuccess": "Dosya başarıyla silindi",
|
||||
"downloading": "Dosya indiriliyor...",
|
||||
"goBack": "Önceki sayfaya dön",
|
||||
"goForward": "Sonraki sayfaya git",
|
||||
"goToParent": "Üst klasöre git",
|
||||
"moveError": "Dosya taşınamadı",
|
||||
"moveHere": "Buraya taşı",
|
||||
"moveSuccess": "Dosya başarıyla taşındı",
|
||||
"moveToFolder": "Şuraya taşı...",
|
||||
"moveToRoot": "Kök dizine taşı",
|
||||
"removeFromKnowledgeBase": "Bilgi tabanından kaldır",
|
||||
"removeFromKnowledgeBaseSuccess": "Dosya başarıyla kaldırıldı"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "veya",
|
||||
"title": "Dosyayı veya klasörü buraya sürükleyin"
|
||||
},
|
||||
"noFolders": "Klasör bulunamadı",
|
||||
"sort": {
|
||||
"dateAdded": "Eklenme tarihi",
|
||||
"name": "Ad",
|
||||
"size": "Boyut"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Oluşturulma zamanı",
|
||||
"size": "Boyut",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Bu bilgi tabanı silinecek, içindeki dosyalar silinmeyecek, tüm dosyalar içine taşınacaktır. Bilgi tabanı silindikten sonra geri alınamaz, lütfen dikkatli olun.",
|
||||
"empty": "Bilgi tabanı oluşturmak için <1>+</1> tıklayın"
|
||||
},
|
||||
"new": "Yeni Bilgi Tabanı",
|
||||
"title": "Bilgi Tabanı"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Tüm Dosyalar",
|
||||
"allPages": "Tüm Belgeler"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Dosyayı İndir",
|
||||
"unsupportedFileAndContact": "Bu dosya formatı çevrimiçi önizleme için desteklenmiyor. Önizleme talebiniz varsa, lütfen <1>bize geri bildirimde bulunun</1>."
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Bu depo silinmek üzere. İçindeki dosyalar silinmeyecek, tüm dosyalar klasörüne taşınacaktır. Bilgi deposu silindikten sonra geri getirilemez, lütfen dikkatli olun.",
|
||||
"empty": "<1>+</1> simgesine tıklayarak yeni bir depo oluşturun"
|
||||
},
|
||||
"new": "Yeni Depo",
|
||||
"title": "Depo"
|
||||
},
|
||||
"searchFilePlaceholder": "Dosya Ara",
|
||||
"searchPagePlaceholder": "Belge ara",
|
||||
"tab": {
|
||||
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview, karmaşık akıl yürütme yeteneklerine sahip olup, mantıksal akıl yürütme, matematik, programlama gibi alanlarda mükemmel performans sergilemektedir."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5, Anthropic'in amiral gemisi modelidir. Üstün zekâ ve ölçeklenebilir performansı bir araya getirerek, en yüksek kalitede yanıtlar ve akıl yürütme yeteneği gerektiren karmaşık görevler için idealdir."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash, Google’ın yüksek performanslı akıl yürütme modelidir; genişletilmiş çok modlu görevler için uygundur."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, Kimi'nin resmi çıkarım modeli, uzun bağlam, kodlama, soru-cevap gibi çoklu senaryoları destekler."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "kimi-k2-thinking modeli, Moonshot tarafından sunulan genel amaçlı bir düşünme modelidir. Gelişmiş akıl yürütme yeteneklerine sahiptir ve çok adımlı araç kullanımıyla çeşitli zorlukların üstesinden gelmeye yardımcı olur."
|
||||
"description": "kimi-k2-thinking modeli, Moonshot AI tarafından sunulan, genel ajan yetenekleri ve akıl yürütme becerilerine sahip bir düşünme modelidir. Derinlemesine akıl yürütmede uzmandır ve çok adımlı araç kullanımıyla çeşitli zorlukların üstesinden gelmeye yardımcı olur."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "K2 Uzun Düşünme Modeli’nin yüksek hızlı sürümüdür; 256k bağlamı destekler, derin akıl yürütmede uzmandır ve saniyede 60-100 token üretim hızına ulaşır."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5, Anthropic'in şimdiye kadarki en hızlı ve en akıllı Haiku modelidir; yıldırım hızında çalışır ve gelişmiş düşünme yeteneklerine sahiptir."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5, Anthropic'in amiral gemisi modelidir. Üstün zekâ ve ölçeklenebilir performansı bir araya getirerek, en yüksek kalitede yanıtlar ve akıl yürütme yeteneği gerektiren karmaşık görevler için idealdir."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5, Anthropic'in bugüne kadarki en akıllı modelidir."
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "Đang chuẩn bị...",
|
||||
"deleteSuccess": "Tệp đã được xóa thành công",
|
||||
"downloading": "Đang tải tệp...",
|
||||
"goBack": "Quay lại trang trước",
|
||||
"goForward": "Tiến đến trang sau",
|
||||
"goToParent": "Đi đến thư mục cha",
|
||||
"moveError": "Di chuyển tệp thất bại",
|
||||
"moveHere": "Di chuyển đến đây",
|
||||
"moveSuccess": "Di chuyển tệp thành công",
|
||||
"moveToFolder": "Di chuyển đến...",
|
||||
"moveToRoot": "Di chuyển đến thư mục gốc",
|
||||
"removeFromKnowledgeBase": "Xóa khỏi kho tri thức",
|
||||
"removeFromKnowledgeBaseSuccess": "Tệp đã được xóa thành công"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "hoặc",
|
||||
"title": "Kéo tệp hoặc thư mục vào đây"
|
||||
},
|
||||
"noFolders": "Hiện không có thư mục nào",
|
||||
"sort": {
|
||||
"dateAdded": "Ngày thêm",
|
||||
"name": "Tên",
|
||||
"size": "Kích thước"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "Thời gian tạo",
|
||||
"size": "Kích thước",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "Bạn sắp xóa kho tri thức này, các tệp trong đó sẽ không bị xóa mà sẽ được chuyển vào tất cả tệp. Kho tri thức sau khi xóa sẽ không thể khôi phục, vui lòng cẩn thận khi thực hiện.",
|
||||
"empty": "Nhấp vào <1>+</1> để bắt đầu tạo kho tri thức"
|
||||
},
|
||||
"new": "Tạo kho tri thức mới",
|
||||
"title": "Kho tri thức"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "Tất cả tệp",
|
||||
"allPages": "Tất cả tài liệu"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "Tải tệp",
|
||||
"unsupportedFileAndContact": "Định dạng tệp này hiện không hỗ trợ xem trước trực tuyến. Nếu bạn có yêu cầu xem trước, vui lòng <1>phản hồi cho chúng tôi</1>"
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "Sắp xóa kho lưu trữ này, các tệp bên trong sẽ không bị xóa mà sẽ được chuyển vào mục Tất cả tệp. Sau khi xóa, kho kiến thức sẽ không thể khôi phục, vui lòng thao tác cẩn thận.",
|
||||
"empty": "Nhấn <1>+</1> để bắt đầu tạo kho lưu trữ"
|
||||
},
|
||||
"new": "Tạo kho lưu trữ mới",
|
||||
"title": "Kho lưu trữ"
|
||||
},
|
||||
"searchFilePlaceholder": "Tìm kiếm tệp",
|
||||
"searchPagePlaceholder": "Tìm kiếm bản thảo",
|
||||
"tab": {
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
"description": "Opus 4.1 là mô hình cao cấp của Anthropic, được tối ưu cho lập trình, suy luận phức tạp và các tác vụ liên tục."
|
||||
},
|
||||
"anthropic/claude-opus-4.5": {
|
||||
"description": "Claude Opus 4.5 là mô hình hàng đầu của Anthropic, kết hợp trí tuệ vượt trội với khả năng mở rộng, phù hợp cho các nhiệm vụ phức tạp đòi hỏi phản hồi chất lượng cao và năng lực suy luận xuất sắc."
|
||||
"description": "Claude Opus 4.5 là mô hình hàng đầu của Anthropic, kết hợp trí tuệ vượt trội với khả năng mở rộng, phù hợp cho các nhiệm vụ phức tạp đòi hỏi phản hồi chất lượng cao và khả năng suy luận xuất sắc."
|
||||
},
|
||||
"anthropic/claude-sonnet-4": {
|
||||
"description": "Claude Sonnet 4 là phiên bản suy luận hỗn hợp của Anthropic, cung cấp khả năng kết hợp giữa tư duy và phản hồi trực tiếp."
|
||||
@@ -831,7 +831,7 @@
|
||||
"description": "Claude Opus 4 là mô hình mạnh mẽ nhất của Anthropic được sử dụng để xử lý các nhiệm vụ phức tạp cao. Nó thể hiện xuất sắc về hiệu suất, trí tuệ, sự trôi chảy và khả năng hiểu biết."
|
||||
},
|
||||
"claude-opus-4-5-20251101": {
|
||||
"description": "Claude Opus 4.5 là mô hình hàng đầu của Anthropic, kết hợp trí tuệ vượt trội với khả năng mở rộng, phù hợp cho các nhiệm vụ phức tạp đòi hỏi phản hồi chất lượng cao và năng lực suy luận xuất sắc."
|
||||
"description": "Claude Opus 4.5 là mô hình hàng đầu của Anthropic, kết hợp trí tuệ vượt trội với khả năng mở rộng, phù hợp cho các nhiệm vụ phức tạp đòi hỏi phản hồi chất lượng cao và khả năng suy luận xuất sắc."
|
||||
},
|
||||
"claude-sonnet-4-20250514": {
|
||||
"description": "Claude Sonnet 4 có thể tạo ra phản hồi gần như tức thì hoặc suy nghĩ từng bước kéo dài, người dùng có thể thấy rõ các quá trình này."
|
||||
@@ -1676,9 +1676,6 @@
|
||||
"glm-zero-preview": {
|
||||
"description": "GLM-Zero-Preview có khả năng suy luận phức tạp mạnh mẽ, thể hiện xuất sắc trong các lĩnh vực suy luận logic, toán học, lập trình."
|
||||
},
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 là mô hình hàng đầu của Anthropic, kết hợp trí tuệ vượt trội với khả năng mở rộng, phù hợp cho các nhiệm vụ phức tạp đòi hỏi phản hồi chất lượng cao và năng lực suy luận xuất sắc."
|
||||
},
|
||||
"google/gemini-2.0-flash": {
|
||||
"description": "Gemini 2.0 Flash là mô hình suy luận hiệu suất cao của Google, phù hợp với các tác vụ đa phương thức mở rộng."
|
||||
},
|
||||
@@ -2193,7 +2190,7 @@
|
||||
"description": "Kimi K2 Instruct, mô hình suy luận chính thức của Kimi, hỗ trợ ngữ cảnh dài, mã nguồn, hỏi đáp và nhiều tình huống khác."
|
||||
},
|
||||
"kimi-k2-thinking": {
|
||||
"description": "Mô hình kimi-k2-thinking do Moonshot AI phát triển, là một mô hình tư duy với khả năng đại lý tổng quát và suy luận mạnh mẽ. Nó nổi bật trong việc suy luận sâu và có thể sử dụng công cụ nhiều bước để hỗ trợ giải quyết các vấn đề phức tạp."
|
||||
"description": "Mô hình kimi-k2-thinking do Moonshot AI phát triển, là một mô hình tư duy với năng lực đại lý tổng quát và khả năng suy luận, nổi bật với khả năng suy luận sâu và hỗ trợ giải quyết các vấn đề phức tạp thông qua việc sử dụng công cụ nhiều bước."
|
||||
},
|
||||
"kimi-k2-thinking-turbo": {
|
||||
"description": "Phiên bản tốc độ cao của mô hình tư duy dài K2, hỗ trợ ngữ cảnh 256k, giỏi suy luận sâu, tốc độ đầu ra đạt 60-100 tokens mỗi giây."
|
||||
@@ -3467,6 +3464,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 là mô hình Haiku nhanh nhất và thông minh nhất của Anthropic, với tốc độ như chớp và khả năng tư duy mở rộng."
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 là mô hình hàng đầu của Anthropic, kết hợp trí tuệ vượt trội với khả năng mở rộng, phù hợp cho các nhiệm vụ phức tạp đòi hỏi phản hồi chất lượng cao và khả năng suy luận xuất sắc."
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 là mô hình thông minh nhất của Anthropic cho đến nay."
|
||||
},
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
},
|
||||
"duplicateTitle": "{{title}} 副本",
|
||||
"emptyAgent": "暂无助手",
|
||||
"emptyAgentAction": "点击开始创建助手",
|
||||
"extendParams": {
|
||||
"disableContextCaching": {
|
||||
"desc": "单条对话生成成本最高可降低 90%,响应速度提升 4 倍(<1>了解更多</1>)。开启后将自动禁用历史消息数限制",
|
||||
|
||||
@@ -304,6 +304,10 @@
|
||||
"business": "商务合作",
|
||||
"support": "邮件支持"
|
||||
},
|
||||
"navPanel": {
|
||||
"agent": "助手",
|
||||
"repo": "仓库"
|
||||
},
|
||||
"new": "新",
|
||||
"oauth": "SSO 登录",
|
||||
"officialSite": "官方网站",
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "准备中...",
|
||||
"deleteSuccess": "文件删除成功",
|
||||
"downloading": "文件下载中...",
|
||||
"goBack": "返回上一页",
|
||||
"goForward": "前进到下一页",
|
||||
"goToParent": "进入父级文件夹",
|
||||
"moveError": "移动文件失败",
|
||||
"moveHere": "移动到此处",
|
||||
"moveSuccess": "文件移动成功",
|
||||
"moveToFolder": "移动到...",
|
||||
"moveToRoot": "移动到根目录",
|
||||
"removeFromKnowledgeBase": "从知识库中移除",
|
||||
"removeFromKnowledgeBaseSuccess": "文件移除成功"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "或者",
|
||||
"title": "将文件或文件夹拖到这里"
|
||||
},
|
||||
"noFolders": "暂无文件夹",
|
||||
"sort": {
|
||||
"dateAdded": "添加日期",
|
||||
"name": "名称",
|
||||
"size": "大小"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "创建时间",
|
||||
"size": "大小",
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
"empty": "暂无已上传文件/文件夹",
|
||||
"header": {
|
||||
"actions": {
|
||||
"connect": "连接...",
|
||||
"newFolder": "新建文件夹",
|
||||
"newPage": "新建文稿",
|
||||
"uploadFile": "上传文件",
|
||||
@@ -107,14 +108,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "即将删除该知识库,其中的文件不会删除,将移入全部文件中。知识库删除后将不可恢复,请谨慎操作。",
|
||||
"empty": "点击 <1>+</1> 开始创建知识库"
|
||||
},
|
||||
"new": "新建知识库",
|
||||
"title": "知识库"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "全部文件",
|
||||
"allPages": "全部文稿"
|
||||
@@ -142,6 +135,14 @@
|
||||
"downloadFile": "下载文件",
|
||||
"unsupportedFileAndContact": "此文件格式暂不支持在线预览,如有预览诉求,欢迎<1>反馈给我们</1>"
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "即将删除该仓库,其中的文件不会删除,将移入全部文件中。知识库删除后将不可恢复,请谨慎操作。",
|
||||
"empty": "点击 <1>+</1> 开始创建仓库"
|
||||
},
|
||||
"new": "新建仓库",
|
||||
"title": "仓库"
|
||||
},
|
||||
"searchFilePlaceholder": "搜索文件",
|
||||
"searchPagePlaceholder": "搜索文稿",
|
||||
"tab": {
|
||||
|
||||
@@ -3467,6 +3467,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 是 Anthropic 最快且最智能的 Haiku 模型,具有闪电般的速度和扩展思考能力。"
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 是 Anthropic 的旗舰模型,结合了卓越的智能与可扩展性能,适合需要最高质量回应和推理能力的复杂任务。"
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 是 Anthropic 迄今为止最智能的模型。"
|
||||
},
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
"createChunkingTask": "準備中...",
|
||||
"deleteSuccess": "文件刪除成功",
|
||||
"downloading": "文件下載中...",
|
||||
"goBack": "返回上一頁",
|
||||
"goForward": "前進到下一頁",
|
||||
"goToParent": "進入父層資料夾",
|
||||
"moveError": "移動檔案失敗",
|
||||
"moveHere": "移動到此處",
|
||||
"moveSuccess": "檔案移動成功",
|
||||
"moveToFolder": "移動到...",
|
||||
"moveToRoot": "移動到根目錄",
|
||||
"removeFromKnowledgeBase": "從知識庫中移除",
|
||||
"removeFromKnowledgeBaseSuccess": "文件移除成功"
|
||||
},
|
||||
@@ -42,6 +50,12 @@
|
||||
"or": "或者",
|
||||
"title": "將文件或文件夾拖到這裡"
|
||||
},
|
||||
"noFolders": "暫無資料夾",
|
||||
"sort": {
|
||||
"dateAdded": "新增日期",
|
||||
"name": "名稱",
|
||||
"size": "大小"
|
||||
},
|
||||
"title": {
|
||||
"createdAt": "創建時間",
|
||||
"size": "大小",
|
||||
|
||||
@@ -107,14 +107,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"knowledgeBase": {
|
||||
"list": {
|
||||
"confirmRemoveKnowledgeBase": "即將刪除該知識庫,其中的檔案不會刪除,將移入全部檔案中。知識庫刪除後將不可恢復,請謹慎操作。",
|
||||
"empty": "點擊 <1>+</1> 開始創建知識庫"
|
||||
},
|
||||
"new": "新建知識庫",
|
||||
"title": "知識庫"
|
||||
},
|
||||
"menu": {
|
||||
"allFiles": "所有檔案",
|
||||
"allPages": "全部文件"
|
||||
@@ -142,6 +134,14 @@
|
||||
"downloadFile": "下載檔案",
|
||||
"unsupportedFileAndContact": "此檔案格式暫不支援線上預覽,如有預覽需求,歡迎<1>反饋給我們</1>"
|
||||
},
|
||||
"repo": {
|
||||
"list": {
|
||||
"confirmRemoveRepo": "即將刪除該倉庫,其中的檔案不會被刪除,將移入全部檔案中。知識庫刪除後將無法恢復,請謹慎操作。",
|
||||
"empty": "點擊 <1>+</1> 開始建立倉庫"
|
||||
},
|
||||
"new": "新增倉庫",
|
||||
"title": "倉庫"
|
||||
},
|
||||
"searchFilePlaceholder": "搜索檔案",
|
||||
"searchPagePlaceholder": "搜尋文稿",
|
||||
"tab": {
|
||||
|
||||
@@ -3467,6 +3467,9 @@
|
||||
"us.anthropic.claude-haiku-4-5-20251001-v1:0": {
|
||||
"description": "Claude Haiku 4.5 是 Anthropic 速度最快且最聰明的 Haiku 模型,具備閃電般的反應速度與延伸思考能力。"
|
||||
},
|
||||
"us.anthropic.claude-opus-4-5-20251101-v1:0": {
|
||||
"description": "Claude Opus 4.5 是 Anthropic 的旗艦模型,結合了卓越的智慧與可擴展的效能,適用於需要最高品質回應與推理能力的複雜任務。"
|
||||
},
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
|
||||
"description": "Claude Sonnet 4.5 是 Anthropic 迄今為止最智慧的模型。"
|
||||
},
|
||||
|
||||
@@ -248,16 +248,6 @@ const nextConfig: NextConfig = {
|
||||
// permanent: true,
|
||||
// source: '/settings',
|
||||
// },
|
||||
// {
|
||||
// destination: '/chat',
|
||||
// permanent: false,
|
||||
// source: '/',
|
||||
// },
|
||||
{
|
||||
destination: '/chat',
|
||||
permanent: true,
|
||||
source: '/welcome',
|
||||
},
|
||||
// we need back /repos url in the further
|
||||
{
|
||||
destination: '/files',
|
||||
|
||||
+2
-1
@@ -173,7 +173,7 @@
|
||||
"@lobehub/icons": "^2.43.1",
|
||||
"@lobehub/market-sdk": "^0.23.0",
|
||||
"@lobehub/tts": "^2.0.1",
|
||||
"@lobehub/ui": "^2.16.2",
|
||||
"@lobehub/ui": "^2.18.3",
|
||||
"@modelcontextprotocol/sdk": "^1.22.0",
|
||||
"@neondatabase/serverless": "^1.0.2",
|
||||
"@next/third-parties": "^16.0.3",
|
||||
@@ -185,6 +185,7 @@
|
||||
"@serwist/next": "^9.2.1",
|
||||
"@t3-oss/env-nextjs": "^0.13.8",
|
||||
"@tanstack/react-query": "^5.90.10",
|
||||
"@tanstack/react-virtual": "^3.13.12",
|
||||
"@trpc/client": "^11.7.1",
|
||||
"@trpc/next": "^11.7.1",
|
||||
"@trpc/react-query": "^11.7.1",
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import qs from 'query-string';
|
||||
import urlJoin from 'url-join';
|
||||
|
||||
import { INBOX_SESSION_ID } from './session';
|
||||
|
||||
const isDev = process.env.NODE_ENV === 'development';
|
||||
|
||||
export const UTM_SOURCE = 'chat_preview';
|
||||
@@ -47,12 +45,14 @@ export const AGENTS_INDEX_GITHUB = 'https://github.com/lobehub/lobe-chat-agents'
|
||||
export const AGENTS_INDEX_GITHUB_ISSUE = urlJoin(AGENTS_INDEX_GITHUB, 'issues/new');
|
||||
export const AGENTS_OFFICIAL_URL = 'https://lobehub.com/agent';
|
||||
|
||||
export const SESSION_CHAT_URL = (id: string = INBOX_SESSION_ID, mobile?: boolean) =>
|
||||
export const SESSION_CHAT_URL = (agentId: string, mobile?: boolean) =>
|
||||
qs.stringifyUrl({
|
||||
query: mobile ? { session: id, showMobileWorkspace: mobile } : { session: id },
|
||||
url: '/chat',
|
||||
query: mobile ? { showMobileWorkspace: mobile } : {},
|
||||
url: `/agent/${agentId}`,
|
||||
});
|
||||
|
||||
export const LIBRARY_URL = (id: string) => urlJoin('/resource/library', id);
|
||||
|
||||
export const imageUrl = (filename: string) => `/images/${filename}`;
|
||||
|
||||
export const LOBE_URL_IMPORT_NAME = 'settings';
|
||||
|
||||
@@ -7,6 +7,7 @@ import { uuid } from '@/utils/uuid';
|
||||
|
||||
import {
|
||||
agents,
|
||||
agentsToSessions,
|
||||
chatGroups,
|
||||
chunks,
|
||||
documents,
|
||||
@@ -21,6 +22,7 @@ import {
|
||||
messages,
|
||||
messagesFiles,
|
||||
sessions,
|
||||
threads,
|
||||
topics,
|
||||
users,
|
||||
} from '../../../schemas';
|
||||
@@ -781,6 +783,231 @@ describe('MessageModel Query Tests', () => {
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-s1-t1');
|
||||
});
|
||||
|
||||
describe('query with agentId filter', () => {
|
||||
it('should filter messages by agentId through agentsToSessions lookup', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([
|
||||
{ id: 'session-for-agent', userId },
|
||||
{ id: 'session-other', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent1', userId, title: 'Agent 1' }]);
|
||||
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'agent1', sessionId: 'session-for-agent', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-agent-session',
|
||||
userId,
|
||||
sessionId: 'session-for-agent',
|
||||
role: 'user',
|
||||
content: 'message in agent session',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'msg-other-session',
|
||||
userId,
|
||||
sessionId: 'session-other',
|
||||
role: 'user',
|
||||
content: 'message in other session',
|
||||
createdAt: new Date('2023-01-02'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId should return messages from the associated session
|
||||
const result = await messageModel.query({ agentId: 'agent1' });
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-agent-session');
|
||||
});
|
||||
|
||||
it('should return empty array when agentId has no associated session and no sessionId fallback', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'session1', userId }]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent-no-session', userId, title: 'Agent No Session' }]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-session1',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
role: 'user',
|
||||
content: 'message in session1',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId that has no session association
|
||||
const result = await messageModel.query({ agentId: 'agent-no-session' });
|
||||
|
||||
// Should return inbox messages (sessionId is null) which is empty in this case
|
||||
expect(result).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('should fallback to provided sessionId when agentId lookup returns nothing', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'fallback-session', userId }]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent-no-session', userId, title: 'Agent No Session' }]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-fallback',
|
||||
userId,
|
||||
sessionId: 'fallback-session',
|
||||
role: 'user',
|
||||
content: 'message in fallback session',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId that has no session, but provide sessionId as fallback
|
||||
const result = await messageModel.query({
|
||||
agentId: 'agent-no-session',
|
||||
sessionId: 'fallback-session',
|
||||
});
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-fallback');
|
||||
});
|
||||
|
||||
it('should use agentId session over provided sessionId when agentId has association', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([
|
||||
{ id: 'agent-session', userId },
|
||||
{ id: 'provided-session', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent1', userId, title: 'Agent 1' }]);
|
||||
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'agent1', sessionId: 'agent-session', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-agent-session',
|
||||
userId,
|
||||
sessionId: 'agent-session',
|
||||
role: 'user',
|
||||
content: 'message in agent session',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'msg-provided-session',
|
||||
userId,
|
||||
sessionId: 'provided-session',
|
||||
role: 'user',
|
||||
content: 'message in provided session',
|
||||
createdAt: new Date('2023-01-02'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with both agentId and sessionId - agentId should take priority
|
||||
const result = await messageModel.query({
|
||||
agentId: 'agent1',
|
||||
sessionId: 'provided-session',
|
||||
});
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-agent-session');
|
||||
});
|
||||
|
||||
it('should work with agentId and topicId filters combined', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'agent-session', userId }]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent1', userId, title: 'Agent 1' }]);
|
||||
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'agent1', sessionId: 'agent-session', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(topics).values([
|
||||
{ id: 'topic1', sessionId: 'agent-session', userId },
|
||||
{ id: 'topic2', sessionId: 'agent-session', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-topic1',
|
||||
userId,
|
||||
sessionId: 'agent-session',
|
||||
topicId: 'topic1',
|
||||
role: 'user',
|
||||
content: 'message in topic1',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'msg-topic2',
|
||||
userId,
|
||||
sessionId: 'agent-session',
|
||||
topicId: 'topic2',
|
||||
role: 'user',
|
||||
content: 'message in topic2',
|
||||
createdAt: new Date('2023-01-02'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId and topicId
|
||||
const result = await messageModel.query({ agentId: 'agent1', topicId: 'topic1' });
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-topic1');
|
||||
});
|
||||
|
||||
it('should only lookup agentsToSessions for current user', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([
|
||||
{ id: 'user-session', userId },
|
||||
{ id: 'other-user-session', userId: otherUserId },
|
||||
]);
|
||||
|
||||
// Different agent IDs for different users (agent id is primary key)
|
||||
await trx.insert(agents).values([
|
||||
{ id: 'user-agent', userId, title: 'User Agent' },
|
||||
{ id: 'other-user-agent', userId: otherUserId, title: 'Other User Agent' },
|
||||
]);
|
||||
|
||||
// Only create agentsToSessions for the other user
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'other-user-agent', sessionId: 'other-user-session', userId: otherUserId },
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-user',
|
||||
userId,
|
||||
sessionId: null, // inbox
|
||||
role: 'user',
|
||||
content: 'user message',
|
||||
},
|
||||
{
|
||||
id: 'msg-other-user',
|
||||
userId: otherUserId,
|
||||
sessionId: 'other-user-session',
|
||||
role: 'user',
|
||||
content: 'other user message',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with other user's agentId - should not find association since it belongs to other user
|
||||
const result = await messageModel.query({ agentId: 'other-user-agent' });
|
||||
|
||||
// Should return inbox messages (no session found for this user)
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-user');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('queryAll', () => {
|
||||
@@ -1145,6 +1372,254 @@ describe('MessageModel Query Tests', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('query messages with threadId filter', () => {
|
||||
it('should filter messages by threadId', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'session1', userId }]);
|
||||
await trx.insert(topics).values([{ id: 'topic1', sessionId: 'session1', userId }]);
|
||||
|
||||
// Create threads first due to foreign key constraint
|
||||
await trx.insert(threads).values([
|
||||
{
|
||||
id: 'thread1',
|
||||
userId,
|
||||
topicId: 'topic1',
|
||||
sourceMessageId: 'source-msg-1',
|
||||
type: 'standalone',
|
||||
},
|
||||
{
|
||||
id: 'thread2',
|
||||
userId,
|
||||
topicId: 'topic1',
|
||||
sourceMessageId: 'source-msg-2',
|
||||
type: 'standalone',
|
||||
},
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-thread-1',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: 'thread1',
|
||||
role: 'user',
|
||||
content: 'message in thread 1',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'msg-thread-2',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: 'thread1',
|
||||
role: 'assistant',
|
||||
content: 'another message in thread 1',
|
||||
createdAt: new Date('2023-01-02'),
|
||||
},
|
||||
{
|
||||
id: 'msg-thread-other',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: 'thread2',
|
||||
role: 'user',
|
||||
content: 'message in thread 2',
|
||||
createdAt: new Date('2023-01-03'),
|
||||
},
|
||||
{
|
||||
id: 'msg-no-thread',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: null,
|
||||
role: 'user',
|
||||
content: 'message without thread',
|
||||
createdAt: new Date('2023-01-04'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query messages in specific thread
|
||||
const result = await messageModel.query({ sessionId: 'session1', threadId: 'thread1' });
|
||||
|
||||
expect(result).toHaveLength(2);
|
||||
expect(result[0].id).toBe('msg-thread-1');
|
||||
expect(result[1].id).toBe('msg-thread-2');
|
||||
});
|
||||
|
||||
it('should query messages with null threadId (only non-thread messages)', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'session1', userId }]);
|
||||
await trx.insert(topics).values([{ id: 'topic1', sessionId: 'session1', userId }]);
|
||||
|
||||
// Create thread first
|
||||
await trx.insert(threads).values([
|
||||
{
|
||||
id: 'thread1',
|
||||
userId,
|
||||
topicId: 'topic1',
|
||||
sourceMessageId: 'source-msg-1',
|
||||
type: 'standalone',
|
||||
},
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-no-thread-1',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: null,
|
||||
role: 'user',
|
||||
content: 'message without thread 1',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'msg-no-thread-2',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: null,
|
||||
role: 'assistant',
|
||||
content: 'message without thread 2',
|
||||
createdAt: new Date('2023-01-02'),
|
||||
},
|
||||
{
|
||||
id: 'msg-thread-1',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: 'thread1',
|
||||
role: 'user',
|
||||
content: 'message in thread 1',
|
||||
createdAt: new Date('2023-01-03'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with explicit null threadId should return only non-thread messages
|
||||
const result = await messageModel.query({ sessionId: 'session1', threadId: null });
|
||||
|
||||
expect(result).toHaveLength(2);
|
||||
expect(result[0].id).toBe('msg-no-thread-1');
|
||||
expect(result[1].id).toBe('msg-no-thread-2');
|
||||
});
|
||||
|
||||
it('should query messages with combined sessionId, topicId and threadId filters', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'session1', userId }]);
|
||||
await trx.insert(topics).values([{ id: 'topic1', sessionId: 'session1', userId }]);
|
||||
|
||||
// Create threads first
|
||||
await trx.insert(threads).values([
|
||||
{
|
||||
id: 'thread1',
|
||||
userId,
|
||||
topicId: 'topic1',
|
||||
sourceMessageId: 'source-msg-1',
|
||||
type: 'standalone',
|
||||
},
|
||||
{
|
||||
id: 'thread2',
|
||||
userId,
|
||||
topicId: 'topic1',
|
||||
sourceMessageId: 'source-msg-2',
|
||||
type: 'standalone',
|
||||
},
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-all-filters',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
topicId: 'topic1',
|
||||
threadId: 'thread1',
|
||||
role: 'user',
|
||||
content: 'message with all filters',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'msg-diff-thread',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
topicId: 'topic1',
|
||||
threadId: 'thread2',
|
||||
role: 'user',
|
||||
content: 'message with different thread',
|
||||
createdAt: new Date('2023-01-02'),
|
||||
},
|
||||
{
|
||||
id: 'msg-no-thread',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
topicId: 'topic1',
|
||||
threadId: null,
|
||||
role: 'user',
|
||||
content: 'message without thread',
|
||||
createdAt: new Date('2023-01-03'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query specific session, topic and thread combination
|
||||
const result = await messageModel.query({
|
||||
sessionId: 'session1',
|
||||
topicId: 'topic1',
|
||||
threadId: 'thread1',
|
||||
});
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-all-filters');
|
||||
});
|
||||
|
||||
it('should query messages by threadId with sessionId but without topicId', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'session1', userId }]);
|
||||
await trx.insert(topics).values([{ id: 'topic1', sessionId: 'session1', userId }]);
|
||||
|
||||
// Create threads first
|
||||
await trx.insert(threads).values([
|
||||
{
|
||||
id: 'thread1',
|
||||
userId,
|
||||
topicId: 'topic1',
|
||||
sourceMessageId: 'source-msg-1',
|
||||
type: 'standalone',
|
||||
},
|
||||
{
|
||||
id: 'thread2',
|
||||
userId,
|
||||
topicId: 'topic1',
|
||||
sourceMessageId: 'source-msg-2',
|
||||
type: 'standalone',
|
||||
},
|
||||
]);
|
||||
|
||||
await trx.insert(messages).values([
|
||||
{
|
||||
id: 'msg-thread-1',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: 'thread1',
|
||||
role: 'user',
|
||||
content: 'message in thread 1',
|
||||
createdAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'msg-thread-2',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
threadId: 'thread2',
|
||||
role: 'user',
|
||||
content: 'message in thread 2',
|
||||
createdAt: new Date('2023-01-02'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query by sessionId and threadId without topicId
|
||||
const result = await messageModel.query({ sessionId: 'session1', threadId: 'thread1' });
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('msg-thread-1');
|
||||
});
|
||||
});
|
||||
|
||||
describe('findMessageQueriesById', () => {
|
||||
it('should return undefined for non-existent message query', async () => {
|
||||
const result = await messageModel.findMessageQueriesById('non-existent-id');
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { eq, inArray } from 'drizzle-orm';
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { chatGroups, messages, sessions, topics, users } from '../../schemas';
|
||||
import { agents, agentsToSessions, chatGroups, messages, sessions, topics, users } from '../../schemas';
|
||||
import { LobeChatDatabase } from '../../type';
|
||||
import { CreateTopicParams, TopicModel } from '../topic';
|
||||
import { getTestDB } from './_util';
|
||||
@@ -150,6 +150,201 @@ describe('TopicModel', () => {
|
||||
expect(result2).toHaveLength(1);
|
||||
expect(result2[0].id).toBe('topic1');
|
||||
});
|
||||
|
||||
describe('query with agentId filter', () => {
|
||||
it('should filter topics by agentId through agentsToSessions lookup', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([
|
||||
{ id: 'session-for-agent', userId },
|
||||
{ id: 'session-other', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent1', userId, title: 'Agent 1' }]);
|
||||
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'agent1', sessionId: 'session-for-agent', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(topics).values([
|
||||
{
|
||||
id: 'topic-agent-session',
|
||||
userId,
|
||||
sessionId: 'session-for-agent',
|
||||
updatedAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'topic-other-session',
|
||||
userId,
|
||||
sessionId: 'session-other',
|
||||
updatedAt: new Date('2023-01-02'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId should return topics from the associated session
|
||||
const result = await topicModel.query({ agentId: 'agent1' });
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('topic-agent-session');
|
||||
});
|
||||
|
||||
it('should return empty array when agentId has no associated session and no containerId fallback', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'session1', userId }]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent-no-session', userId, title: 'Agent No Session' }]);
|
||||
|
||||
await trx.insert(topics).values([
|
||||
{
|
||||
id: 'topic-session1',
|
||||
userId,
|
||||
sessionId: 'session1',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId that has no session association
|
||||
const result = await topicModel.query({ agentId: 'agent-no-session' });
|
||||
|
||||
// Should return topics with no session/group (which is empty in this case)
|
||||
expect(result).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('should fallback to provided containerId when agentId lookup returns nothing', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'fallback-session', userId }]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent-no-session', userId, title: 'Agent No Session' }]);
|
||||
|
||||
await trx.insert(topics).values([
|
||||
{
|
||||
id: 'topic-fallback',
|
||||
userId,
|
||||
sessionId: 'fallback-session',
|
||||
updatedAt: new Date('2023-01-01'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId that has no session, but provide containerId as fallback
|
||||
const result = await topicModel.query({
|
||||
agentId: 'agent-no-session',
|
||||
containerId: 'fallback-session',
|
||||
});
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('topic-fallback');
|
||||
});
|
||||
|
||||
it('should use agentId session over provided containerId when agentId has association', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([
|
||||
{ id: 'agent-session', userId },
|
||||
{ id: 'provided-session', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent1', userId, title: 'Agent 1' }]);
|
||||
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'agent1', sessionId: 'agent-session', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(topics).values([
|
||||
{
|
||||
id: 'topic-agent-session',
|
||||
userId,
|
||||
sessionId: 'agent-session',
|
||||
updatedAt: new Date('2023-01-01'),
|
||||
},
|
||||
{
|
||||
id: 'topic-provided-session',
|
||||
userId,
|
||||
sessionId: 'provided-session',
|
||||
updatedAt: new Date('2023-01-02'),
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with both agentId and containerId - agentId should take priority
|
||||
const result = await topicModel.query({
|
||||
agentId: 'agent1',
|
||||
containerId: 'provided-session',
|
||||
});
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('topic-agent-session');
|
||||
});
|
||||
|
||||
it('should only lookup agentsToSessions for current user', async () => {
|
||||
const otherUserId = 'other-user-for-topic-test';
|
||||
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(users).values([{ id: otherUserId }]);
|
||||
|
||||
await trx.insert(sessions).values([
|
||||
{ id: 'user-session', userId },
|
||||
{ id: 'other-user-session', userId: otherUserId },
|
||||
]);
|
||||
|
||||
// Different agent IDs for different users (agent id is primary key)
|
||||
await trx.insert(agents).values([
|
||||
{ id: 'user-agent', userId, title: 'User Agent' },
|
||||
{ id: 'other-user-agent', userId: otherUserId, title: 'Other User Agent' },
|
||||
]);
|
||||
|
||||
// Only create agentsToSessions for the other user
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'other-user-agent', sessionId: 'other-user-session', userId: otherUserId },
|
||||
]);
|
||||
|
||||
await trx.insert(topics).values([
|
||||
{
|
||||
id: 'topic-user',
|
||||
userId,
|
||||
sessionId: null, // no session
|
||||
groupId: null,
|
||||
},
|
||||
{
|
||||
id: 'topic-other-user',
|
||||
userId: otherUserId,
|
||||
sessionId: 'other-user-session',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with other user's agentId - should not find association since it belongs to other user
|
||||
const result = await topicModel.query({ agentId: 'other-user-agent' });
|
||||
|
||||
// Should return topics with no session/group for the current user
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].id).toBe('topic-user');
|
||||
});
|
||||
|
||||
it('should work with agentId and pagination', async () => {
|
||||
await serverDB.transaction(async (trx) => {
|
||||
await trx.insert(sessions).values([{ id: 'agent-session', userId }]);
|
||||
|
||||
await trx.insert(agents).values([{ id: 'agent1', userId, title: 'Agent 1' }]);
|
||||
|
||||
await trx.insert(agentsToSessions).values([
|
||||
{ agentId: 'agent1', sessionId: 'agent-session', userId },
|
||||
]);
|
||||
|
||||
await trx.insert(topics).values([
|
||||
{ id: 'topic1', userId, sessionId: 'agent-session', updatedAt: new Date('2023-01-01') },
|
||||
{ id: 'topic2', userId, sessionId: 'agent-session', updatedAt: new Date('2023-01-02') },
|
||||
{ id: 'topic3', userId, sessionId: 'agent-session', updatedAt: new Date('2023-01-03') },
|
||||
]);
|
||||
});
|
||||
|
||||
// Query with agentId and pagination
|
||||
const result = await topicModel.query({ agentId: 'agent1', current: 0, pageSize: 2 });
|
||||
|
||||
expect(result).toHaveLength(2);
|
||||
expect(result[0].id).toBe('topic3'); // Most recent first
|
||||
expect(result[1].id).toBe('topic2');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('findById', () => {
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
import { and, desc, eq, inArray } from 'drizzle-orm';
|
||||
import type { PartialDeep } from 'type-fest';
|
||||
|
||||
import { merge } from '@/utils/merge';
|
||||
|
||||
import {
|
||||
AgentItem,
|
||||
agents,
|
||||
agentsFiles,
|
||||
agentsKnowledgeBases,
|
||||
@@ -180,4 +184,60 @@ export class AgentModel {
|
||||
),
|
||||
);
|
||||
};
|
||||
|
||||
updateConfig = async (agentId: string, data: PartialDeep<AgentItem> | undefined | null) => {
|
||||
if (!data || Object.keys(data).length === 0) return;
|
||||
|
||||
const agent = await this.db.query.agents.findFirst({
|
||||
where: and(eq(agents.id, agentId), eq(agents.userId, this.userId)),
|
||||
});
|
||||
|
||||
if (!agent) return;
|
||||
|
||||
// First process the params field: undefined means delete, null means disable flag
|
||||
const existingParams = agent.params ?? {};
|
||||
const updatedParams: Record<string, any> = { ...existingParams };
|
||||
|
||||
if (data.params) {
|
||||
const incomingParams = data.params as Record<string, any>;
|
||||
Object.keys(incomingParams).forEach((key) => {
|
||||
const incomingValue = incomingParams[key];
|
||||
|
||||
// undefined means explicitly delete this field
|
||||
if (incomingValue === undefined) {
|
||||
delete updatedParams[key];
|
||||
return;
|
||||
}
|
||||
|
||||
// All other values (including null) are directly overwritten, null means disable this param on the frontend
|
||||
updatedParams[key] = incomingValue;
|
||||
});
|
||||
}
|
||||
|
||||
// Build data to be merged, excluding params (processed separately)
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const { params: _params, ...restData } = data;
|
||||
const mergedValue = merge(agent, restData);
|
||||
|
||||
// Apply the processed parameters
|
||||
mergedValue.params = Object.keys(updatedParams).length > 0 ? updatedParams : undefined;
|
||||
|
||||
// Final cleanup: ensure no undefined or null values enter the database
|
||||
if (mergedValue.params) {
|
||||
const params = mergedValue.params as Record<string, any>;
|
||||
Object.keys(params).forEach((key) => {
|
||||
if (params[key] === undefined) {
|
||||
delete params[key];
|
||||
}
|
||||
});
|
||||
if (Object.keys(params).length === 0) {
|
||||
mergedValue.params = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
return this.db
|
||||
.update(agents)
|
||||
.set(mergedValue)
|
||||
.where(and(eq(agents.id, agentId), eq(agents.userId, this.userId)));
|
||||
};
|
||||
}
|
||||
|
||||
@@ -50,6 +50,12 @@ export class DocumentModel {
|
||||
});
|
||||
};
|
||||
|
||||
findBySlug = async (slug: string): Promise<DocumentItem | undefined> => {
|
||||
return this.db.query.documents.findFirst({
|
||||
where: and(eq(documents.userId, this.userId), eq(documents.slug, slug)),
|
||||
});
|
||||
};
|
||||
|
||||
update = async (id: string, value: Partial<DocumentItem>) => {
|
||||
return this.db
|
||||
.update(documents)
|
||||
|
||||
@@ -40,7 +40,11 @@ export class FileModel {
|
||||
}
|
||||
|
||||
create = async (
|
||||
params: Omit<NewFile, 'id' | 'userId'> & { id?: string; knowledgeBaseId?: string },
|
||||
params: Omit<NewFile, 'id' | 'userId'> & {
|
||||
id?: string;
|
||||
knowledgeBaseId?: string;
|
||||
parentId?: string;
|
||||
},
|
||||
insertToGlobalFiles?: boolean,
|
||||
trx?: Transaction,
|
||||
): Promise<{ id: string }> => {
|
||||
|
||||
@@ -108,6 +108,7 @@ export class GenerationModel {
|
||||
const newFile = await this.fileModel.create(
|
||||
{
|
||||
...file,
|
||||
parentId: file.parentId ?? undefined,
|
||||
source: FileSource.ImageGeneration,
|
||||
},
|
||||
true,
|
||||
|
||||
@@ -24,6 +24,7 @@ import { merge } from '@/utils/merge';
|
||||
import { today } from '@/utils/time';
|
||||
|
||||
import {
|
||||
agentsToSessions,
|
||||
chunks,
|
||||
documents,
|
||||
embeddings,
|
||||
@@ -52,14 +53,38 @@ export class MessageModel {
|
||||
|
||||
// **************** Query *************** //
|
||||
query = async (
|
||||
{ current = 0, pageSize = 1000, sessionId, topicId, groupId }: QueryMessageParams = {},
|
||||
{
|
||||
agentId,
|
||||
current = 0,
|
||||
pageSize = 1000,
|
||||
sessionId,
|
||||
topicId,
|
||||
groupId,
|
||||
threadId,
|
||||
}: QueryMessageParams = {},
|
||||
options: {
|
||||
groupAssistantMessages?: boolean;
|
||||
postProcessUrl?: (path: string | null, file: { fileType: string }) => Promise<string>;
|
||||
} = {},
|
||||
) => {
|
||||
const offset = current * pageSize;
|
||||
|
||||
// If agentId is provided, try to get the associated sessionId
|
||||
let effectiveSessionId = sessionId;
|
||||
if (agentId) {
|
||||
const agentSession = await this.db
|
||||
.select({ sessionId: agentsToSessions.sessionId })
|
||||
.from(agentsToSessions)
|
||||
.where(
|
||||
and(eq(agentsToSessions.agentId, agentId), eq(agentsToSessions.userId, this.userId)),
|
||||
)
|
||||
.limit(1);
|
||||
|
||||
// If found, use the associated sessionId; otherwise fallback to the provided sessionId
|
||||
if (agentSession[0]?.sessionId) {
|
||||
effectiveSessionId = agentSession[0].sessionId;
|
||||
}
|
||||
}
|
||||
|
||||
// 1. get basic messages
|
||||
const result = await this.db
|
||||
.select({
|
||||
@@ -116,9 +141,10 @@ export class MessageModel {
|
||||
.where(
|
||||
and(
|
||||
eq(messages.userId, this.userId),
|
||||
this.matchSession(sessionId),
|
||||
this.matchSession(effectiveSessionId),
|
||||
this.matchTopic(topicId),
|
||||
this.matchGroup(groupId),
|
||||
this.matchThread(threadId),
|
||||
),
|
||||
)
|
||||
.leftJoin(messagePlugins, eq(messagePlugins.id, messages.id))
|
||||
@@ -752,4 +778,9 @@ export class MessageModel {
|
||||
|
||||
private matchGroup = (groupId?: string | null) =>
|
||||
groupId ? eq(messages.groupId, groupId) : isNull(messages.groupId);
|
||||
|
||||
private matchThread = (threadId?: string | null) => {
|
||||
if (!!threadId) return eq(messages.threadId, threadId);
|
||||
return isNull(messages.threadId);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -280,6 +280,8 @@ export class SessionModel {
|
||||
examples, // maps to fewShots
|
||||
identifier, // maps to marketIdentifier
|
||||
marketIdentifier,
|
||||
// Editor data
|
||||
editorData,
|
||||
} = config as any;
|
||||
if (type === 'group') {
|
||||
const result = await trx
|
||||
@@ -306,6 +308,7 @@ export class SessionModel {
|
||||
chatConfig: chatConfig || {},
|
||||
createdAt: new Date(),
|
||||
description,
|
||||
editorData: editorData || null,
|
||||
fewShots: examples || null, // Map examples to fewShots field
|
||||
id: idGenerator('agents'),
|
||||
marketIdentifier: identifier || marketIdentifier,
|
||||
@@ -635,6 +638,7 @@ export class SessionModel {
|
||||
avatar: agent?.avatar ?? avatar ?? undefined,
|
||||
backgroundColor: agent?.backgroundColor ?? backgroundColor ?? undefined,
|
||||
description: agent?.description ?? description ?? undefined,
|
||||
|
||||
marketIdentifier: agent?.marketIdentifier ?? undefined,
|
||||
tags: agent?.tags ?? undefined,
|
||||
title: agent?.title ?? title ?? undefined,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { DBMessageItem, TopicRankItem } from '@lobechat/types';
|
||||
import { and, count, desc, eq, gt, ilike, inArray, isNull, or, sql } from 'drizzle-orm';
|
||||
|
||||
import { TopicItem, messages, topics } from '../schemas';
|
||||
import { TopicItem, agentsToSessions, messages, topics } from '../schemas';
|
||||
import { LobeChatDatabase } from '../type';
|
||||
import { genEndDateWhere, genRangeWhere, genStartDateWhere, genWhere } from '../utils/genWhere';
|
||||
import { idGenerator } from '../utils/idGenerator';
|
||||
@@ -15,6 +15,7 @@ export interface CreateTopicParams {
|
||||
}
|
||||
|
||||
interface QueryTopicParams {
|
||||
agentId?: string | null;
|
||||
containerId?: string | null; // sessionId or groupId
|
||||
current?: number;
|
||||
pageSize?: number;
|
||||
@@ -30,8 +31,26 @@ export class TopicModel {
|
||||
}
|
||||
// **************** Query *************** //
|
||||
|
||||
query = async ({ current = 0, pageSize = 9999, containerId }: QueryTopicParams = {}) => {
|
||||
query = async ({ agentId, current = 0, pageSize = 9999, containerId }: QueryTopicParams = {}) => {
|
||||
const offset = current * pageSize;
|
||||
|
||||
// If agentId is provided, try to get the associated sessionId
|
||||
let effectiveContainerId = containerId;
|
||||
if (agentId) {
|
||||
const agentSession = await this.db
|
||||
.select({ sessionId: agentsToSessions.sessionId })
|
||||
.from(agentsToSessions)
|
||||
.where(
|
||||
and(eq(agentsToSessions.agentId, agentId), eq(agentsToSessions.userId, this.userId)),
|
||||
)
|
||||
.limit(1);
|
||||
|
||||
// If found, use the associated sessionId; otherwise fallback to the provided containerId
|
||||
if (agentSession[0]?.sessionId) {
|
||||
effectiveContainerId = agentSession[0].sessionId;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
this.db
|
||||
.select({
|
||||
@@ -44,7 +63,7 @@ export class TopicModel {
|
||||
updatedAt: topics.updatedAt,
|
||||
})
|
||||
.from(topics)
|
||||
.where(and(eq(topics.userId, this.userId), this.matchContainer(containerId)))
|
||||
.where(and(eq(topics.userId, this.userId), this.matchContainer(effectiveContainerId)))
|
||||
// In boolean sorting, false is considered "smaller" than true.
|
||||
// So here we use desc to ensure that topics with favorite as true are in front.
|
||||
.orderBy(desc(topics.favorite), desc(topics.updatedAt))
|
||||
|
||||
@@ -17,6 +17,7 @@ export interface KnowledgeItem {
|
||||
metadata?: Record<string, any> | null;
|
||||
name: string;
|
||||
size: number;
|
||||
slug?: string | null;
|
||||
/**
|
||||
* Source type to distinguish between files and documents
|
||||
* - 'file': from files table
|
||||
@@ -53,11 +54,24 @@ export class KnowledgeRepo {
|
||||
sorter,
|
||||
knowledgeBaseId,
|
||||
showFilesInKnowledgeBase,
|
||||
parentId,
|
||||
}: QueryFileListParams = {}): Promise<KnowledgeItem[]> {
|
||||
// If parentId is provided, check if it's a slug and resolve it to an ID
|
||||
let resolvedParentId = parentId;
|
||||
if (parentId) {
|
||||
// Try to find a document with this slug
|
||||
const docBySlug = await this.documentModel.findBySlug(parentId);
|
||||
if (docBySlug) {
|
||||
resolvedParentId = docBySlug.id;
|
||||
}
|
||||
// Otherwise assume it's already an ID
|
||||
}
|
||||
|
||||
// Build file query
|
||||
const fileQuery = this.buildFileQuery({
|
||||
category,
|
||||
knowledgeBaseId,
|
||||
parentId: resolvedParentId,
|
||||
q,
|
||||
showFilesInKnowledgeBase,
|
||||
sortType,
|
||||
@@ -68,6 +82,7 @@ export class KnowledgeRepo {
|
||||
const documentQuery = this.buildDocumentQuery({
|
||||
category,
|
||||
knowledgeBaseId,
|
||||
parentId: resolvedParentId,
|
||||
q,
|
||||
sortType,
|
||||
sorter,
|
||||
@@ -123,6 +138,7 @@ export class KnowledgeRepo {
|
||||
metadata,
|
||||
name: row.name,
|
||||
size: Number(row.size),
|
||||
slug: row.slug,
|
||||
sourceType: row.source_type,
|
||||
updatedAt: new Date(row.updated_at),
|
||||
url: row.url,
|
||||
@@ -176,25 +192,33 @@ export class KnowledgeRepo {
|
||||
q,
|
||||
knowledgeBaseId,
|
||||
showFilesInKnowledgeBase,
|
||||
parentId,
|
||||
}: QueryFileListParams = {}): ReturnType<typeof sql> {
|
||||
let whereConditions: any[] = [sql`${files.userId} = ${this.userId}`];
|
||||
let whereConditions: any[] = [sql`f.user_id = ${this.userId}`];
|
||||
|
||||
// Parent ID filter
|
||||
if (parentId !== undefined) {
|
||||
if (parentId === null) {
|
||||
whereConditions.push(sql`f.parent_id IS NULL`);
|
||||
} else {
|
||||
whereConditions.push(sql`f.parent_id = ${parentId}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Search filter
|
||||
if (q) {
|
||||
whereConditions.push(sql`${files.name} ILIKE ${`%${q}%`}`);
|
||||
whereConditions.push(sql`f.name ILIKE ${`%${q}%`}`);
|
||||
}
|
||||
|
||||
// Category filter
|
||||
if (category && category !== FilesTabs.All && category !== FilesTabs.Home) {
|
||||
if (category && category !== FilesTabs.All) {
|
||||
const fileTypePrefix = this.getFileTypePrefix(category as FilesTabs);
|
||||
if (Array.isArray(fileTypePrefix)) {
|
||||
// For multiple file types (e.g., Documents includes 'application' and 'custom')
|
||||
const orConditions = fileTypePrefix.map(
|
||||
(prefix) => sql`${files.fileType} ILIKE ${`${prefix}%`}`,
|
||||
);
|
||||
const orConditions = fileTypePrefix.map((prefix) => sql`f.file_type ILIKE ${`${prefix}%`}`);
|
||||
whereConditions.push(sql`(${sql.join(orConditions, sql` OR `)})`);
|
||||
} else {
|
||||
whereConditions.push(sql`${files.fileType} ILIKE ${`${fileTypePrefix}%`}`);
|
||||
whereConditions.push(sql`f.file_type ILIKE ${`${fileTypePrefix}%`}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,6 +227,15 @@ export class KnowledgeRepo {
|
||||
// Build where conditions using proper table references (f.column instead of files.column)
|
||||
const kbWhereConditions: any[] = [sql`f.user_id = ${this.userId}`];
|
||||
|
||||
// Parent ID filter
|
||||
if (parentId !== undefined) {
|
||||
if (parentId === null) {
|
||||
kbWhereConditions.push(sql`f.parent_id IS NULL`);
|
||||
} else {
|
||||
kbWhereConditions.push(sql`f.parent_id = ${parentId}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Search filter
|
||||
if (q) {
|
||||
kbWhereConditions.push(sql`f.name ILIKE ${`%${q}%`}`);
|
||||
@@ -223,7 +256,7 @@ export class KnowledgeRepo {
|
||||
|
||||
return sql`
|
||||
SELECT
|
||||
f.id,
|
||||
COALESCE(d.id, f.id) as id,
|
||||
f.name,
|
||||
f.file_type,
|
||||
f.size,
|
||||
@@ -232,14 +265,17 @@ export class KnowledgeRepo {
|
||||
f.updated_at,
|
||||
f.chunk_task_id,
|
||||
f.embedding_task_id,
|
||||
NULL as editor_data,
|
||||
NULL as content,
|
||||
NULL as metadata,
|
||||
d.editor_data,
|
||||
d.content,
|
||||
d.slug,
|
||||
COALESCE(d.metadata, f.metadata) as metadata,
|
||||
'file' as source_type
|
||||
FROM ${files} f
|
||||
INNER JOIN ${knowledgeBaseFiles} kbf
|
||||
ON f.id = kbf.file_id
|
||||
AND kbf.knowledge_base_id = ${knowledgeBaseId}
|
||||
LEFT JOIN ${documents} d
|
||||
ON f.id = d.file_id
|
||||
WHERE ${sql.join(kbWhereConditions, sql` AND `)}
|
||||
`;
|
||||
}
|
||||
@@ -250,7 +286,7 @@ export class KnowledgeRepo {
|
||||
sql`
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM ${knowledgeBaseFiles}
|
||||
WHERE ${knowledgeBaseFiles.fileId} = ${files.id}
|
||||
WHERE ${knowledgeBaseFiles.fileId} = f.id
|
||||
)
|
||||
`,
|
||||
);
|
||||
@@ -258,20 +294,23 @@ export class KnowledgeRepo {
|
||||
|
||||
return sql`
|
||||
SELECT
|
||||
id,
|
||||
name,
|
||||
file_type,
|
||||
size,
|
||||
url,
|
||||
created_at,
|
||||
updated_at,
|
||||
chunk_task_id,
|
||||
embedding_task_id,
|
||||
NULL as editor_data,
|
||||
NULL as content,
|
||||
NULL as metadata,
|
||||
COALESCE(d.id, f.id) as id,
|
||||
f.name,
|
||||
f.file_type,
|
||||
f.size,
|
||||
f.url,
|
||||
f.created_at,
|
||||
f.updated_at,
|
||||
f.chunk_task_id,
|
||||
f.embedding_task_id,
|
||||
d.editor_data,
|
||||
d.content,
|
||||
d.slug,
|
||||
COALESCE(d.metadata, f.metadata) as metadata,
|
||||
'file' as source_type
|
||||
FROM ${files}
|
||||
FROM ${files} f
|
||||
LEFT JOIN ${documents} d
|
||||
ON f.id = d.file_id
|
||||
WHERE ${sql.join(whereConditions, sql` AND `)}
|
||||
`;
|
||||
}
|
||||
@@ -280,12 +319,22 @@ export class KnowledgeRepo {
|
||||
category,
|
||||
q,
|
||||
knowledgeBaseId,
|
||||
parentId,
|
||||
}: QueryFileListParams = {}): ReturnType<typeof sql> {
|
||||
let whereConditions: any[] = [
|
||||
sql`${documents.userId} = ${this.userId}`,
|
||||
sql`${documents.sourceType} != ${'file'}`,
|
||||
];
|
||||
|
||||
// Parent ID filter
|
||||
if (parentId !== undefined) {
|
||||
if (parentId === null) {
|
||||
whereConditions.push(sql`${documents.parentId} IS NULL`);
|
||||
} else {
|
||||
whereConditions.push(sql`${documents.parentId} = ${parentId}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Search filter
|
||||
if (q) {
|
||||
whereConditions.push(
|
||||
@@ -294,7 +343,7 @@ export class KnowledgeRepo {
|
||||
}
|
||||
|
||||
// Category filter - match documents by fileType prefix
|
||||
if (category && category !== FilesTabs.All && category !== FilesTabs.Home) {
|
||||
if (category && category !== FilesTabs.All) {
|
||||
const fileTypePrefix = this.getFileTypePrefix(category as FilesTabs);
|
||||
if (Array.isArray(fileTypePrefix)) {
|
||||
// For multiple file types (e.g., Documents includes 'application' and 'custom')
|
||||
@@ -324,6 +373,7 @@ export class KnowledgeRepo {
|
||||
NULL::uuid as embedding_task_id,
|
||||
NULL::jsonb as editor_data,
|
||||
NULL::text as content,
|
||||
NULL::varchar(255) as slug,
|
||||
NULL::jsonb as metadata,
|
||||
NULL::text as source_type
|
||||
WHERE false
|
||||
@@ -332,24 +382,92 @@ export class KnowledgeRepo {
|
||||
}
|
||||
|
||||
// Knowledge base filter for documents
|
||||
// Documents don't have knowledge base association currently, so skip if knowledgeBaseId is set
|
||||
// Documents are linked to knowledge bases through files table via fileId
|
||||
if (knowledgeBaseId) {
|
||||
// Build where conditions using proper table references (d.column instead of documents.column)
|
||||
const kbWhereConditions: any[] = [sql`d.user_id = ${this.userId}`];
|
||||
|
||||
// Parent ID filter
|
||||
if (parentId !== undefined) {
|
||||
if (parentId === null) {
|
||||
kbWhereConditions.push(sql`d.parent_id IS NULL`);
|
||||
} else {
|
||||
kbWhereConditions.push(sql`d.parent_id = ${parentId}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Search filter
|
||||
if (q) {
|
||||
kbWhereConditions.push(sql`(d.title ILIKE ${`%${q}%`} OR d.filename ILIKE ${`%${q}%`})`);
|
||||
}
|
||||
|
||||
// Category filter
|
||||
if (category && category !== FilesTabs.All) {
|
||||
const fileTypePrefix = this.getFileTypePrefix(category as FilesTabs);
|
||||
if (Array.isArray(fileTypePrefix)) {
|
||||
const orConditions = fileTypePrefix.map(
|
||||
(prefix) => sql`d.file_type ILIKE ${`${prefix}%`}`,
|
||||
);
|
||||
kbWhereConditions.push(sql`(${sql.join(orConditions, sql` OR `)})`);
|
||||
|
||||
// Exclude custom/document and source_type='file' from Documents category
|
||||
if (category === FilesTabs.Documents) {
|
||||
kbWhereConditions.push(
|
||||
sql`d.file_type != ${'custom/document'}`,
|
||||
sql`d.source_type != ${'file'}`,
|
||||
);
|
||||
}
|
||||
} else if (fileTypePrefix) {
|
||||
kbWhereConditions.push(sql`d.file_type ILIKE ${`${fileTypePrefix}%`}`);
|
||||
} else {
|
||||
// Exclude documents from other categories (Images, Videos, Audios, Websites)
|
||||
return sql`
|
||||
SELECT
|
||||
NULL::varchar(30) as id,
|
||||
NULL::text as name,
|
||||
NULL::varchar(255) as file_type,
|
||||
NULL::integer as size,
|
||||
NULL::text as url,
|
||||
NULL::timestamp with time zone as created_at,
|
||||
NULL::timestamp with time zone as updated_at,
|
||||
NULL::uuid as chunk_task_id,
|
||||
NULL::uuid as embedding_task_id,
|
||||
NULL::jsonb as editor_data,
|
||||
NULL::text as content,
|
||||
NULL::varchar(255) as slug,
|
||||
NULL::jsonb as metadata,
|
||||
NULL::text as source_type
|
||||
WHERE false
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
// When in a knowledge base, return standalone documents (folders and notes without fileId)
|
||||
// that have the knowledgeBaseId set in their metadata. Documents with fileId are already
|
||||
// returned by the file query via their linked file records.
|
||||
kbWhereConditions.push(
|
||||
sql`d.file_id IS NULL`,
|
||||
sql`d.metadata->>'knowledgeBaseId' = ${knowledgeBaseId}`,
|
||||
);
|
||||
|
||||
return sql`
|
||||
SELECT
|
||||
NULL::varchar(30) as id,
|
||||
NULL::text as name,
|
||||
NULL::varchar(255) as file_type,
|
||||
NULL::integer as size,
|
||||
NULL::text as url,
|
||||
NULL::timestamp with time zone as created_at,
|
||||
NULL::timestamp with time zone as updated_at,
|
||||
NULL::uuid as chunk_task_id,
|
||||
NULL::uuid as embedding_task_id,
|
||||
NULL::jsonb as editor_data,
|
||||
NULL::text as content,
|
||||
NULL::jsonb as metadata,
|
||||
NULL::text as source_type
|
||||
WHERE false
|
||||
d.id,
|
||||
COALESCE(d.title, d.filename, 'Untitled') as name,
|
||||
d.file_type,
|
||||
d.total_char_count as size,
|
||||
d.source as url,
|
||||
d.created_at,
|
||||
d.updated_at,
|
||||
NULL as chunk_task_id,
|
||||
NULL as embedding_task_id,
|
||||
d.editor_data,
|
||||
d.content,
|
||||
d.slug,
|
||||
d.metadata,
|
||||
'document' as source_type
|
||||
FROM ${documents} d
|
||||
WHERE ${sql.join(kbWhereConditions, sql` AND `)}
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -366,6 +484,7 @@ export class KnowledgeRepo {
|
||||
NULL as embedding_task_id,
|
||||
editor_data,
|
||||
content,
|
||||
slug,
|
||||
metadata,
|
||||
'document' as source_type
|
||||
FROM ${documents}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
export * from './chains';
|
||||
export * from './contexts';
|
||||
export * from './prompts';
|
||||
export * from './prompts';
|
||||
@@ -7,3 +7,5 @@ ${toolsPrompts(tools)}
|
||||
|
||||
return prompt.trim();
|
||||
};
|
||||
|
||||
export { type API, apiPrompt, type Tool, toolPrompt, toolsPrompts } from './tools';
|
||||
@@ -8,6 +8,13 @@ import { LobeAgentTTSConfig } from './tts';
|
||||
|
||||
export interface LobeAgentConfig {
|
||||
chatConfig: LobeAgentChatConfig;
|
||||
|
||||
/**
|
||||
* 编辑器内容(JSON 格式)
|
||||
* 用于保存富文本编辑器的完整状态,包括 mention 等特殊节点
|
||||
*/
|
||||
editorData?: any;
|
||||
|
||||
fewShots?: FewShots;
|
||||
files?: FileItem[];
|
||||
id?: string;
|
||||
@@ -72,6 +79,7 @@ export interface AgentItem {
|
||||
clientId?: string | null;
|
||||
createdAt: Date;
|
||||
description?: string | null;
|
||||
editorData?: any | null;
|
||||
fewShots?: any | null;
|
||||
id: string;
|
||||
model?: string | null;
|
||||
|
||||
@@ -4,6 +4,7 @@ import { UIChatMessage } from './message';
|
||||
import { OpenAIChatMessage } from './openai/chat';
|
||||
import { LobeUniformTool, LobeUniformToolSchema } from './tool';
|
||||
import { ChatTopic } from './topic';
|
||||
import { ThreadType } from './topic/thread';
|
||||
|
||||
export interface SendNewMessage {
|
||||
content: string;
|
||||
@@ -12,11 +13,31 @@ export interface SendNewMessage {
|
||||
parentId?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parameters for creating a new thread along with message
|
||||
*/
|
||||
export interface CreateThreadWithMessageParams {
|
||||
/** Parent thread ID (for nested threads) */
|
||||
parentThreadId?: string;
|
||||
/** Source message ID that the thread is branched from (optional for standalone threads) */
|
||||
sourceMessageId?: string;
|
||||
/** Optional thread title */
|
||||
title?: string;
|
||||
/** Thread type */
|
||||
type: ThreadType;
|
||||
}
|
||||
|
||||
export interface SendMessageServerParams {
|
||||
agentId?: string;
|
||||
newAssistantMessage: {
|
||||
model: string;
|
||||
provider: string;
|
||||
};
|
||||
/**
|
||||
* Optional: Create a new thread along with the message
|
||||
* If provided, the message will be created in the newly created thread
|
||||
*/
|
||||
newThread?: CreateThreadWithMessageParams;
|
||||
newTopic?: {
|
||||
title?: string;
|
||||
topicMessageIds?: string[];
|
||||
@@ -28,11 +49,20 @@ export interface SendMessageServerParams {
|
||||
topicId?: string;
|
||||
}
|
||||
|
||||
export const CreateThreadWithMessageSchema = z.object({
|
||||
parentThreadId: z.string().optional(),
|
||||
sourceMessageId: z.string().optional(),
|
||||
title: z.string().optional(),
|
||||
type: z.nativeEnum(ThreadType),
|
||||
});
|
||||
|
||||
export const AiSendMessageServerSchema = z.object({
|
||||
agentId: z.string().optional(),
|
||||
newAssistantMessage: z.object({
|
||||
model: z.string().optional(),
|
||||
provider: z.string().optional(),
|
||||
}),
|
||||
newThread: CreateThreadWithMessageSchema.optional(),
|
||||
newTopic: z
|
||||
.object({
|
||||
title: z.string().optional(),
|
||||
@@ -51,6 +81,10 @@ export const AiSendMessageServerSchema = z.object({
|
||||
|
||||
export interface SendMessageServerResponse {
|
||||
assistantMessageId: string;
|
||||
/**
|
||||
* If a new thread was created, this will be the thread ID
|
||||
*/
|
||||
createdThreadId?: string;
|
||||
isCreateNewTopic: boolean;
|
||||
messages: UIChatMessage[];
|
||||
topicId: string;
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
import { ThreadType } from './topic/thread';
|
||||
|
||||
/**
|
||||
* Context for identifying a conversation or message list
|
||||
* This is the standard type for all conversation-related context passing
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* // Basic usage
|
||||
* const context: ConversationContext = { sessionId: 'session-1' };
|
||||
*
|
||||
* // With topic
|
||||
* const topicContext: ConversationContext = {
|
||||
* sessionId: 'session-1',
|
||||
* topicId: 'topic-1'
|
||||
* };
|
||||
*
|
||||
* // With thread (highest priority)
|
||||
* const threadContext: ConversationContext = {
|
||||
* sessionId: 'session-1',
|
||||
* topicId: 'topic-1',
|
||||
* threadId: 'thread-1'
|
||||
* };
|
||||
*
|
||||
* // Create a new thread with message
|
||||
* const newThreadContext: ConversationContext = {
|
||||
* sessionId: 'session-1',
|
||||
* topicId: 'topic-1',
|
||||
* newThread: {
|
||||
* sourceMessageId: 'msg-1',
|
||||
* type: ThreadType.Standalone,
|
||||
* }
|
||||
* };
|
||||
* ```
|
||||
*/
|
||||
export interface ConversationContext {
|
||||
agentId: string;
|
||||
/**
|
||||
* Parameters for creating a new thread along with the message.
|
||||
* If provided, a new thread will be created and the message will be added to it.
|
||||
* The threadId will be returned in the response.
|
||||
*/
|
||||
newThread?: {
|
||||
/**
|
||||
* Parent thread ID (for nested threads)
|
||||
*/
|
||||
parentThreadId?: string;
|
||||
/**
|
||||
* Source message ID that the thread is branched from
|
||||
*/
|
||||
sourceMessageId: string;
|
||||
/**
|
||||
* Thread type
|
||||
*/
|
||||
type: ThreadType;
|
||||
};
|
||||
/**
|
||||
* Session or group ID
|
||||
*/
|
||||
sessionId?: string;
|
||||
/**
|
||||
* Thread ID (takes highest priority if present)
|
||||
*/
|
||||
threadId?: string | null;
|
||||
|
||||
/**
|
||||
* Topic ID
|
||||
*/
|
||||
topicId?: string | null;
|
||||
}
|
||||
@@ -35,7 +35,7 @@ export enum AssistantNavKey {
|
||||
Overview = 'overview',
|
||||
Related = 'related',
|
||||
SystemRole = 'systemRole',
|
||||
Version = 'version'
|
||||
Version = 'version',
|
||||
}
|
||||
|
||||
export interface DiscoverAssistantItem extends Omit<LobeAgentSettings, 'meta'>, MetaData {
|
||||
@@ -73,6 +73,7 @@ export interface AssistantListResponse {
|
||||
|
||||
export interface DiscoverAssistantDetail extends DiscoverAssistantItem {
|
||||
currentVersion?: string;
|
||||
editorData?: any;
|
||||
examples?: FewShots;
|
||||
related: DiscoverAssistantItem[];
|
||||
summary?: string;
|
||||
|
||||
@@ -22,7 +22,12 @@ export interface FileListItem {
|
||||
*/
|
||||
metadata?: Record<string, any> | null;
|
||||
name: string;
|
||||
/**
|
||||
* Parent folder ID (for folder hierarchy)
|
||||
*/
|
||||
parentId?: string | null;
|
||||
size: number;
|
||||
slug?: string | null;
|
||||
sourceType: string;
|
||||
updatedAt: Date;
|
||||
url: string;
|
||||
@@ -36,6 +41,7 @@ export enum SortType {
|
||||
export const QueryFileListSchema = z.object({
|
||||
category: z.string().optional(),
|
||||
knowledgeBaseId: z.string().optional(),
|
||||
parentId: z.string().nullable().optional(),
|
||||
q: z.string().nullable().optional(),
|
||||
showFilesInKnowledgeBase: z.boolean().default(false),
|
||||
sortType: z.enum(['desc', 'asc']).optional(),
|
||||
@@ -47,6 +53,7 @@ export type QueryFileListSchemaType = z.infer<typeof QueryFileListSchema>;
|
||||
export interface QueryFileListParams {
|
||||
category?: string;
|
||||
knowledgeBaseId?: string;
|
||||
parentId?: string | null;
|
||||
q?: string | null;
|
||||
showFilesInKnowledgeBase?: boolean;
|
||||
sortType?: string;
|
||||
|
||||
@@ -7,6 +7,7 @@ export * from './auth';
|
||||
export * from './chatGroup';
|
||||
export * from './chunk';
|
||||
export * from './clientDB';
|
||||
export * from './conversation';
|
||||
export * from './discover';
|
||||
export * from './document';
|
||||
export * from './eval';
|
||||
|
||||
@@ -19,10 +19,12 @@ import {
|
||||
import { UIChatMessage } from '../ui';
|
||||
|
||||
export interface QueryMessageParams {
|
||||
agentId?: string | null;
|
||||
current?: number;
|
||||
groupId?: string | null;
|
||||
pageSize?: number;
|
||||
sessionId?: string | null;
|
||||
threadId?: string | null;
|
||||
topicId?: string | null;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ export type CreateMessageRoleType = 'user' | 'assistant' | 'tool' | 'supervisor'
|
||||
|
||||
export interface CreateMessageParams
|
||||
extends Partial<Omit<UIChatMessage, 'content' | 'role' | 'topicId' | 'chunksList'>> {
|
||||
agentId?: string;
|
||||
content: string;
|
||||
error?: ChatMessageError | null;
|
||||
fileChunks?: MessageSemanticSearchChunk[];
|
||||
@@ -20,7 +21,10 @@ export interface CreateMessageParams
|
||||
provider?: string;
|
||||
groupId?: string;
|
||||
role: CreateMessageRoleType;
|
||||
sessionId: string;
|
||||
/**
|
||||
* @deprecated Use agentId instead
|
||||
*/
|
||||
sessionId?: string;
|
||||
targetId?: string | null;
|
||||
threadId?: string | null;
|
||||
topicId?: string;
|
||||
@@ -35,7 +39,7 @@ export interface CreateNewMessageParams {
|
||||
// ========== Required fields ==========
|
||||
role: CreateMessageRoleType;
|
||||
content: string;
|
||||
sessionId: string;
|
||||
agentId: string;
|
||||
|
||||
// ========== Tool related ==========
|
||||
tool_call_id?: string;
|
||||
@@ -68,6 +72,7 @@ export interface CreateNewMessageParams {
|
||||
export interface SendMessageParams {
|
||||
/**
|
||||
* create a thread
|
||||
* @deprecated Use ConversationContext.newThread instead
|
||||
*/
|
||||
createThread?: boolean;
|
||||
files?: UploadFileItem[];
|
||||
@@ -82,6 +87,19 @@ export interface SendMessageParams {
|
||||
*/
|
||||
metadata?: Record<string, any>;
|
||||
onlyAddUserMessage?: boolean;
|
||||
|
||||
/**
|
||||
* Display messages for the current conversation context.
|
||||
* If provided, sendMessage will use these messages instead of querying from store.
|
||||
* This decouples sendMessage from store selectors.
|
||||
*/
|
||||
messages?: UIChatMessage[];
|
||||
|
||||
/**
|
||||
* Parent message ID for the new message.
|
||||
* If not provided, will be calculated from messages list.
|
||||
*/
|
||||
parentId?: string;
|
||||
}
|
||||
|
||||
export interface SendThreadMessageParams {
|
||||
@@ -125,6 +143,11 @@ export const CreateNewMessageParamsSchema = z
|
||||
// Required fields
|
||||
role: UIMessageRoleTypeSchema,
|
||||
content: z.string(),
|
||||
// agentId is required, but can be resolved from sessionId in the router
|
||||
agentId: z.string().optional(),
|
||||
/**
|
||||
* @deprecated Use agentId instead. Will be resolved to agentId in the router.
|
||||
*/
|
||||
sessionId: z.string().nullable().optional(),
|
||||
// Tool related
|
||||
tool_call_id: z.string().optional(),
|
||||
|
||||
@@ -61,6 +61,7 @@ export interface CreateTopicParams {
|
||||
}
|
||||
|
||||
export interface QueryTopicParams {
|
||||
agentId?: string | null;
|
||||
containerId?: string | null; // sessionId or groupId
|
||||
current?: number;
|
||||
pageSize?: number;
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
import { Outlet } from 'react-router-dom';
|
||||
|
||||
import { Locales } from '@/locales/resources';
|
||||
|
||||
import Hero from '../../features/Hero';
|
||||
import Container from './Container';
|
||||
|
||||
const Layout = (props: { locale: Locales }) => {
|
||||
const { locale } = props;
|
||||
const Layout = () => {
|
||||
return (
|
||||
<Container>
|
||||
<Hero />
|
||||
<Outlet context={{ locale }} />
|
||||
<Outlet />
|
||||
</Container>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
import { Outlet } from 'react-router-dom';
|
||||
|
||||
import MobileContentLayout from '@/components/server/MobileNavLayout';
|
||||
import { Locales } from '@/locales/resources';
|
||||
|
||||
import Hero from '../../features/Hero';
|
||||
import Header from './Header';
|
||||
|
||||
const Layout = (props: { locale: Locales }) => {
|
||||
const { locale } = props;
|
||||
const Layout = () => {
|
||||
return (
|
||||
<MobileContentLayout header={<Header />} padding={16}>
|
||||
<Hero />
|
||||
<Outlet context={{ locale }} />
|
||||
<Outlet />
|
||||
</MobileContentLayout>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { Fragment } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
import { useOutletContext } from 'react-router-dom';
|
||||
import useSWR from 'swr';
|
||||
|
||||
import NotFound from '@/components/404';
|
||||
import { Locales } from '@/locales/resources';
|
||||
import type { Locales } from '@/locales/resources';
|
||||
import { ChangelogService } from '@/server/services/changelog';
|
||||
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
|
||||
|
||||
@@ -14,7 +14,8 @@ import Post from './features/Post';
|
||||
import UpdateChangelogStatus from './features/UpdateChangelogStatus';
|
||||
|
||||
const Page = (props: { isMobile: boolean }) => {
|
||||
const { locale } = useOutletContext<{ locale: Locales }>();
|
||||
const { i18n } = useTranslation();
|
||||
const locale = i18n.language as Locales;
|
||||
const { isMobile } = props;
|
||||
const { hideDocs } = useServerConfigStore(featureFlagsSelectors);
|
||||
|
||||
|
||||
+4
-4
@@ -3,12 +3,12 @@
|
||||
import { createStyles } from 'antd-style';
|
||||
import { memo } from 'react';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
import { Outlet } from 'react-router-dom';
|
||||
|
||||
import { withSuspense } from '@/components/withSuspense';
|
||||
import { useShowMobileWorkspace } from '@/hooks/useShowMobileWorkspace';
|
||||
|
||||
import SessionPanelContent from '../components/SessionPanel';
|
||||
import { Outlet } from 'react-router-dom';
|
||||
import SessionPanelContent from '../session';
|
||||
|
||||
const useStyles = createStyles(({ css, token }) => ({
|
||||
main: css`
|
||||
@@ -18,7 +18,7 @@ const useStyles = createStyles(({ css, token }) => ({
|
||||
`,
|
||||
}));
|
||||
|
||||
const Layout = memo(( ) => {
|
||||
const Layout = memo(() => {
|
||||
const showMobileWorkspace = useShowMobileWorkspace();
|
||||
const { styles } = useStyles();
|
||||
|
||||
@@ -30,7 +30,7 @@ const Layout = memo(( ) => {
|
||||
style={showMobileWorkspace ? { display: 'none' } : undefined}
|
||||
width="100%"
|
||||
>
|
||||
<SessionPanelContent mobile />
|
||||
<SessionPanelContent />
|
||||
</Flexbox>
|
||||
<Flexbox
|
||||
className={styles.main}
|
||||
+5
-5
@@ -6,11 +6,13 @@ import { memo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
|
||||
import { useAgentStore } from '@/store/agent';
|
||||
import { agentSelectors } from '@/store/agent/selectors';
|
||||
import { useChatStore } from '@/store/chat';
|
||||
import { topicSelectors } from '@/store/chat/selectors';
|
||||
import { useGlobalStore } from '@/store/global';
|
||||
import { useSessionStore } from '@/store/session';
|
||||
import { sessionMetaSelectors, sessionSelectors } from '@/store/session/selectors';
|
||||
import { sessionSelectors } from '@/store/session/selectors';
|
||||
|
||||
const ChatHeaderTitle = memo(() => {
|
||||
const { t } = useTranslation(['chat', 'topic']);
|
||||
@@ -19,10 +21,8 @@ const ChatHeaderTitle = memo(() => {
|
||||
topicSelectors.currentTopicLength(s),
|
||||
topicSelectors.currentActiveTopic(s),
|
||||
]);
|
||||
const [isInbox, title] = useSessionStore((s) => [
|
||||
sessionSelectors.isInboxSession(s),
|
||||
sessionMetaSelectors.currentAgentTitle(s),
|
||||
]);
|
||||
const isInbox = useSessionStore(sessionSelectors.isInboxSession);
|
||||
const title = useAgentStore(agentSelectors.currentAgentTitle);
|
||||
const theme = useTheme();
|
||||
|
||||
const displayTitle = isInbox ? t('inbox.title') : title;
|
||||
+3
-12
@@ -3,32 +3,23 @@
|
||||
import { ChatHeader } from '@lobehub/ui/mobile';
|
||||
import { memo, useState } from 'react';
|
||||
|
||||
import ShareButton from '@/app/[variants]/(main)/chat/features/Conversation/Header/ShareButton';
|
||||
import { INBOX_SESSION_ID } from '@/const/session';
|
||||
import { useQueryRoute } from '@/hooks/useQueryRoute';
|
||||
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
|
||||
|
||||
import SettingButton from '../../../features/SettingButton';
|
||||
import ShareButton from '../../../features/ShareButton';
|
||||
import ChatHeaderTitle from './ChatHeaderTitle';
|
||||
|
||||
const MobileHeader = memo(() => {
|
||||
const router = useQueryRoute();
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const { isAgentEditable } = useServerConfigStore(featureFlagsSelectors);
|
||||
|
||||
return (
|
||||
<ChatHeader
|
||||
center={<ChatHeaderTitle />}
|
||||
onBackClick={() =>
|
||||
router.push('/chat', { query: { session: INBOX_SESSION_ID }, replace: true })
|
||||
}
|
||||
right={
|
||||
<>
|
||||
<ShareButton mobile open={open} setOpen={setOpen} />
|
||||
{isAgentEditable && <SettingButton mobile />}
|
||||
</>
|
||||
router.push('/agent', { query: { session: INBOX_SESSION_ID }, replace: true })
|
||||
}
|
||||
right={<ShareButton mobile open={open} setOpen={setOpen} />}
|
||||
showBackButton
|
||||
style={{ width: '100%' }}
|
||||
/>
|
||||
@@ -0,0 +1,30 @@
|
||||
'use client';
|
||||
|
||||
import { memo } from 'react';
|
||||
|
||||
import ConversationArea from '@/app/[variants]/(main)/chat/features/Conversation/ConversationArea';
|
||||
import PortalPanel from '@/app/[variants]/(main)/chat/features/Portal/features/PortalPanel';
|
||||
import MainInterfaceTracker from '@/components/Analytics/MainInterfaceTracker';
|
||||
import MobileContentLayout from '@/components/server/MobileNavLayout';
|
||||
|
||||
import PageTitle from '../features/PageTitle';
|
||||
import TelemetryNotification from '../features/TelemetryNotification';
|
||||
import ChatHeader from './features/ChatHeader';
|
||||
import Topic from './topic';
|
||||
|
||||
const MobileChatPage = memo(() => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle />
|
||||
<MobileContentLayout header={<ChatHeader />} style={{ overflowY: 'hidden' }}>
|
||||
<ConversationArea mobile />
|
||||
</MobileContentLayout>
|
||||
<Topic />
|
||||
<PortalPanel mobile />
|
||||
<MainInterfaceTracker />
|
||||
<TelemetryNotification mobile={true} />
|
||||
</>
|
||||
);
|
||||
});
|
||||
|
||||
export default MobileChatPage;
|
||||
+1
-1
@@ -4,8 +4,8 @@ import { ActionIcon } from '@lobehub/ui';
|
||||
import { ChatHeader } from '@lobehub/ui/mobile';
|
||||
import { MessageSquarePlus } from 'lucide-react';
|
||||
import { memo } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
import { ProductLogo } from '@/components/Branding';
|
||||
import { MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
|
||||
-3
@@ -4,7 +4,6 @@ import { memo, useEffect } from 'react';
|
||||
import { createStoreUpdater } from 'zustand-utils';
|
||||
|
||||
import { parseAsString, useQueryParam } from '@/hooks/useQueryParam';
|
||||
import { useAgentStore } from '@/store/agent';
|
||||
import { useChatStore } from '@/store/chat';
|
||||
import { useSessionStore } from '@/store/session';
|
||||
|
||||
@@ -13,7 +12,6 @@ const THROTTLE_DELAY = 50;
|
||||
// sync outside state to useSessionStore
|
||||
const SessionHydration = memo(() => {
|
||||
const useStoreUpdater = createStoreUpdater(useSessionStore);
|
||||
const useAgentStoreUpdater = createStoreUpdater(useAgentStore);
|
||||
const useChatStoreUpdater = createStoreUpdater(useChatStore);
|
||||
const [switchTopic] = useChatStore((s) => [s.switchTopic]);
|
||||
|
||||
@@ -24,7 +22,6 @@ const SessionHydration = memo(() => {
|
||||
});
|
||||
|
||||
useStoreUpdater('activeId', session);
|
||||
useAgentStoreUpdater('activeId', session);
|
||||
useChatStoreUpdater('activeId', session);
|
||||
|
||||
useEffect(() => {
|
||||
+2
-2
@@ -1,5 +1,3 @@
|
||||
import { isDesktop } from '@lobechat/const';
|
||||
import { SessionDefaultGroup } from '@lobechat/types';
|
||||
import { ActionIcon, Dropdown, Icon } from '@lobehub/ui';
|
||||
import { App } from 'antd';
|
||||
import { createStyles } from 'antd-style';
|
||||
@@ -19,11 +17,13 @@ import {
|
||||
import { memo, useMemo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { isDesktop } from '@/const/index';
|
||||
import { useChatGroupStore } from '@/store/chatGroup';
|
||||
import { useGlobalStore } from '@/store/global';
|
||||
import { useSessionStore } from '@/store/session';
|
||||
import { sessionHelpers } from '@/store/session/helpers';
|
||||
import { sessionGroupSelectors, sessionSelectors } from '@/store/session/selectors';
|
||||
import { SessionDefaultGroup } from '@/types/index';
|
||||
|
||||
const useStyles = createStyles(({ css }) => ({
|
||||
modalRoot: css`
|
||||
+1
-1
@@ -9,8 +9,8 @@ import LazyLoad from 'react-lazy-load';
|
||||
|
||||
import { SESSION_CHAT_URL } from '@/const/url';
|
||||
import { useSwitchSession } from '@/hooks/useSwitchSession';
|
||||
import { useSessionStore, getSessionStoreState } from '@/store/session';
|
||||
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
|
||||
import { getSessionStoreState, useSessionStore } from '@/store/session';
|
||||
import { sessionGroupSelectors, sessionSelectors } from '@/store/session/selectors';
|
||||
import { getUserStoreState } from '@/store/user';
|
||||
import { userProfileSelectors } from '@/store/user/selectors';
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user