cozy-search 2.1.1 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,6 +25,8 @@ var _Typography = _interopRequireDefault(require("cozy-ui/transpiled/react/Typog
25
25
 
26
26
  var _Breakpoints = require("cozy-ui/transpiled/react/providers/Breakpoints");
27
27
 
28
+ var _twakeI18n = require("twake-i18n");
29
+
28
30
  var _AssistantAvatar = _interopRequireDefault(require("../Assistant/AssistantAvatar"));
29
31
 
30
32
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -61,6 +63,9 @@ var AssistantSelectionItem = function AssistantSelectionItem(_ref) {
61
63
  var _useBreakpoints = (0, _Breakpoints.useBreakpoints)(),
62
64
  isMobile = _useBreakpoints.isMobile;
63
65
 
66
+ var _useI18n = (0, _twakeI18n.useI18n)(),
67
+ t = _useI18n.t;
68
+
64
69
  var handleSelect = function handleSelect(assistant) {
65
70
  onSelect(assistant);
66
71
  onClose();
@@ -119,7 +124,7 @@ var AssistantSelectionItem = function AssistantSelectionItem(_ref) {
119
124
  }), !disableActions && /*#__PURE__*/_react.default.createElement("div", {
120
125
  className: styles['menu-item-actions']
121
126
  }, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
122
- "aria-label": "Edit assistant",
127
+ "aria-label": t('assistant_edit.title'),
123
128
  size: "small",
124
129
  className: (0, _classnames.default)((_cx = {}, (0, _defineProperty2.default)(_cx, styles['menu-item-icon-button'], !isMobile || !isSelected && isMobile), (0, _defineProperty2.default)(_cx, 'u-db', isSelected && isMobile), _cx)),
125
130
  onClick: handleEdit
@@ -127,7 +132,7 @@ var AssistantSelectionItem = function AssistantSelectionItem(_ref) {
127
132
  icon: _twakeIcons.Pen,
128
133
  color: "var(--primaryColor)"
129
134
  })), /*#__PURE__*/_react.default.createElement(_IconButton.default, {
130
- "aria-label": "Delete assistant",
135
+ "aria-label": t('assistant_delete.title'),
131
136
  size: "small",
132
137
  className: (0, _classnames.default)((_cx2 = {}, (0, _defineProperty2.default)(_cx2, styles['menu-item-icon-button'], !isMobile || !isSelected && isMobile), (0, _defineProperty2.default)(_cx2, 'u-db', isSelected && isMobile), _cx2)),
133
138
  onClick: handleDelete
@@ -125,11 +125,11 @@ var BasicInfoStep = function BasicInfoStep(_ref) {
125
125
  }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
126
126
  variant: "h6",
127
127
  className: "u-mb-half"
128
- }, t('assistant_create.steps.basic_info.instructions')), /*#__PURE__*/_react.default.createElement(_TextField.default, {
128
+ }, t('assistant_create.steps.basic_info.description_label')), /*#__PURE__*/_react.default.createElement(_TextField.default, {
129
129
  fullWidth: true,
130
130
  multiline: true,
131
131
  rows: 6,
132
- placeholder: t('assistant_create.steps.basic_info.instructions_placeholder'),
132
+ placeholder: t('assistant_create.steps.basic_info.description_placeholder'),
133
133
  value: description,
134
134
  onChange: onChange('description'),
135
135
  variant: "outlined"
@@ -17,6 +17,8 @@ var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helper
17
17
 
18
18
  var _cozyMinilog = _interopRequireDefault(require("cozy-minilog"));
19
19
 
20
+ var _constants = require("../constants");
21
+
20
22
  var _helpers = require("../helpers");
21
23
 
22
24
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -109,10 +111,11 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
109
111
 
110
112
  case 13:
111
113
  _context.next = 15;
112
- return (0, _awaitAsyncGenerator2.default)(client.stackClient.fetchJSON('POST', "/ai/chat/conversations/".concat(conversationId), _objectSpread({
113
- q: userQuery,
114
+ return (0, _awaitAsyncGenerator2.default)(client.stackClient.fetchJSON('POST', "/ai/chat/conversations/".concat(conversationId), _objectSpread(_objectSpread({
115
+ q: userQuery
116
+ }, assistantId && assistantId !== _constants.DEFAULT_ASSISTANT._id && {
114
117
  assistantID: assistantId
115
- }, websearchEnabled && {
118
+ }), websearchEnabled && {
116
119
  websearch: true
117
120
  })));
118
121
 
@@ -0,0 +1,70 @@
1
+ import type { ChatModelRunOptions } from '@assistant-ui/react'
2
+
3
+ import { createCozyRealtimeChatAdapter } from './CozyRealtimeChatAdapter'
4
+ import type { StreamBridge } from './StreamBridge'
5
+ import { DEFAULT_ASSISTANT } from '../constants'
6
+
7
+ const makeStreamBridge = (): StreamBridge =>
8
+ ({
9
+ createStream: jest.fn(async function* () {
10
+ // no chunks
11
+ }),
12
+ getSources: jest.fn(() => null),
13
+ cleanup: jest.fn()
14
+ }) as unknown as StreamBridge
15
+
16
+ const makeRunOptions = (): ChatModelRunOptions =>
17
+ ({
18
+ messages: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }],
19
+ abortSignal: undefined
20
+ }) as unknown as ChatModelRunOptions
21
+
22
+ const runAdapter = async (assistantId?: string): Promise<jest.Mock> => {
23
+ const fetchJSON = jest.fn().mockResolvedValue({})
24
+ const adapter = createCozyRealtimeChatAdapter(
25
+ {
26
+ client: { stackClient: { fetchJSON } },
27
+ conversationId: 'conv-1',
28
+ assistantId
29
+ },
30
+ key => key,
31
+ { current: makeStreamBridge() }
32
+ )
33
+ const generator = adapter.run(makeRunOptions()) as AsyncGenerator<unknown>
34
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
35
+ for await (const _ of generator) {
36
+ // drain the generator
37
+ }
38
+ return fetchJSON
39
+ }
40
+
41
+ describe('CozyRealtimeChatAdapter', () => {
42
+ it('sends the assistantID for a real assistant', async () => {
43
+ const fetchJSON = await runAdapter('real-assistant-id')
44
+ expect(fetchJSON).toHaveBeenCalledWith(
45
+ 'POST',
46
+ '/ai/chat/conversations/conv-1',
47
+ expect.objectContaining({ assistantID: 'real-assistant-id' })
48
+ )
49
+ })
50
+
51
+ it('omits the assistantID for the default assistant sentinel', async () => {
52
+ const fetchJSON = await runAdapter(DEFAULT_ASSISTANT._id)
53
+ const [, , body] = fetchJSON.mock.calls[0] as [
54
+ string,
55
+ string,
56
+ Record<string, unknown>
57
+ ]
58
+ expect(body).not.toHaveProperty('assistantID')
59
+ })
60
+
61
+ it('omits the assistantID when no assistant is selected', async () => {
62
+ const fetchJSON = await runAdapter(undefined)
63
+ const [, , body] = fetchJSON.mock.calls[0] as [
64
+ string,
65
+ string,
66
+ Record<string, unknown>
67
+ ]
68
+ expect(body).not.toHaveProperty('assistantID')
69
+ })
70
+ })
@@ -79,18 +79,17 @@
79
79
  }
80
80
  },
81
81
  "assistant_create": {
82
- "title": "Create Assistant",
82
+ "title": "Create Agent",
83
83
  "steps": {
84
84
  "basic_info": {
85
- "description": "Customize your assistant's identity and behavior to match your specific needs.",
85
+ "description": "Customize your agent. Choose its knowledge base, then its AI model.",
86
86
  "avatar": "Avatar (optional)",
87
87
  "name": "Name",
88
- "name_placeholder": "Name your assistant",
89
- "instructions": "Instructions (optional)",
90
- "instructions_placeholder": "What does this assistant do? How should it behave? What should it avoid doing?",
88
+ "name_placeholder": "Name your agent",
89
+ "description_label": "Description",
90
+ "description_placeholder": "Optional description of this agent's role. This description will not be used by the AI",
91
91
  "knowledge_base": "Knowledge Base (optional)",
92
92
  "knowledge_base_placeholder": "Conversations may reveal some or all of the files that have been uploaded.",
93
- "load_file": "Load files",
94
93
  "from_drive": "From Drive",
95
94
  "from_mail": "From Mail"
96
95
  },
@@ -119,7 +118,7 @@
119
118
  "external_warning": "Your data will be processed on external servers. This mode does not provide enhanced security protections."
120
119
  },
121
120
  "configuration": {
122
- "description": "Enter provider URL, model and your API key to configure the new assistant. Your key will be stored securely.",
121
+ "description": "Enter provider URL, model and your API key to configure the new agent. Your key will be stored securely.",
123
122
  "custom_provider_description": "Configure your custom AI provider settings",
124
123
  "model": {
125
124
  "label": "Model",
@@ -145,25 +144,25 @@
145
144
  "next": "Next",
146
145
  "create": "Create"
147
146
  },
148
- "configure_api_key_title": "Configure a new assistant",
149
- "configure_api_key_description": "Enter provider URL, model and your API key to configure the new assistant. Your key will be stored securely.",
147
+ "configure_api_key_title": "Configure a new agent",
148
+ "configure_api_key_description": "Enter provider URL, model and your API key to configure the new agent. Your key will be stored securely.",
150
149
  "from_drive": {
151
150
  "actions": {
152
151
  "cancel": "Cancel",
153
152
  "add": "Add"
154
153
  }
155
154
  },
156
- "success": "Assistant created successfully"
155
+ "success": "Agent created successfully"
157
156
  },
158
157
  "assistant_edit": {
159
- "title": "Edit Assistant",
158
+ "title": "Edit Agent",
160
159
  "buttons": {
161
160
  "cancel": "Cancel",
162
161
  "next": "Next",
163
162
  "edit": "Edit"
164
163
  },
165
- "configure_api_key_title": "Configure your assistant",
166
- "success": "Assistant updated successfully"
164
+ "configure_api_key_title": "Configure your agent",
165
+ "success": "Agent updated successfully"
167
166
  },
168
167
  "conversation_delete": {
169
168
  "title": "Delete conversation",
@@ -174,8 +173,8 @@
174
173
  }
175
174
  },
176
175
  "assistant_delete": {
177
- "title": "Delete AI Assistant",
178
- "content": "Are you sure you want to delete %{name}? This action cannot be undone and will permanently remove this assistant from your Twake.",
176
+ "title": "Delete Agent",
177
+ "content": "Are you sure you want to delete %{name}? This action cannot be undone and will permanently remove this agent from your Twake.",
179
178
  "buttons": {
180
179
  "cancel": "Cancel",
181
180
  "confirm": "Delete"
@@ -79,18 +79,17 @@
79
79
  }
80
80
  },
81
81
  "assistant_create": {
82
- "title": "Créer un assistant",
82
+ "title": "Créer un agent",
83
83
  "steps": {
84
84
  "basic_info": {
85
- "description": "Personnalisez l'identité et le comportement de votre assistant pour répondre à vos besoins spécifiques.",
85
+ "description": "Personnalisez votre agent. Choisissez la base de connaissances, puis son modèle d'IA.",
86
86
  "avatar": "Avatar (optionnel)",
87
87
  "name": "Nom",
88
- "name_placeholder": "Nommez votre assistant",
89
- "instructions": "Instructions (optionnel)",
90
- "instructions_placeholder": "Que fait cet assistant ? Comment doit-il se comporter ? Que doit-il éviter de faire ?",
88
+ "name_placeholder": "Nommez votre agent",
89
+ "description_label": "Description",
90
+ "description_placeholder": "Description optionnelle du rôle de cet agent. Cette description ne sera pas utilisée par l'IA",
91
91
  "knowledge_base": "Base de connaissances (optionnel)",
92
92
  "knowledge_base_placeholder": "Les conversations peuvent révéler une partie ou l'intégralité des fichiers qui ont été téléversés.",
93
- "load_file": "Charger des fichiers",
94
93
  "from_drive": "Depuis Drive",
95
94
  "from_mail": "Depuis Mail"
96
95
  },
@@ -119,7 +118,7 @@
119
118
  "external_warning": "Vos données seront traitées sur des serveurs externes. Ce mode ne fournit pas de protections de sécurité renforcées."
120
119
  },
121
120
  "configuration": {
122
- "description": "Saisissez l'URL du fournisseur, le modèle et votre clé API pour configurer le nouvel assistant. Votre clé sera stockée de manière sécurisée.",
121
+ "description": "Saisissez l'URL du fournisseur, le modèle et votre clé API pour configurer le nouvel agent. Votre clé sera stockée de manière sécurisée.",
123
122
  "custom_provider_description": "Configurez les paramètres de votre fournisseur d'IA personnalisé",
124
123
  "model": {
125
124
  "label": "Modèle",
@@ -145,25 +144,25 @@
145
144
  "next": "Suivant",
146
145
  "create": "Créer"
147
146
  },
148
- "configure_api_key_title": "Configurer un nouvel assistant",
149
- "configure_api_key_description": "Saisissez l'URL du fournisseur, le modèle et votre clé API pour configurer le nouvel assistant. Votre clé sera stockée de manière sécurisée.",
147
+ "configure_api_key_title": "Configurer un nouvel agent",
148
+ "configure_api_key_description": "Saisissez l'URL du fournisseur, le modèle et votre clé API pour configurer le nouvel agent. Votre clé sera stockée de manière sécurisée.",
150
149
  "from_drive": {
151
150
  "actions": {
152
151
  "cancel": "Annuler",
153
152
  "add": "Ajouter"
154
153
  }
155
154
  },
156
- "success": "Assistant créé avec succès"
155
+ "success": "Agent créé avec succès"
157
156
  },
158
157
  "assistant_edit": {
159
- "title": "Modifier l'assistant",
158
+ "title": "Modifier l'agent",
160
159
  "buttons": {
161
160
  "cancel": "Annuler",
162
161
  "next": "Suivant",
163
162
  "edit": "Modifier"
164
163
  },
165
- "configure_api_key_title": "Configurer votre assistant",
166
- "success": "Assistant modifié avec succès"
164
+ "configure_api_key_title": "Configurer votre agent",
165
+ "success": "Agent modifié avec succès"
167
166
  },
168
167
  "conversation_delete": {
169
168
  "title": "Supprimer la conversation",
@@ -174,8 +173,8 @@
174
173
  }
175
174
  },
176
175
  "assistant_delete": {
177
- "title": "Supprimer l'assistant",
178
- "content": "Êtes-vous sûr de vouloir supprimer %{name} ? Cette action ne peut pas être annulée et supprimera définitivement cet assistant de votre Twake.",
176
+ "title": "Supprimer l'agent",
177
+ "content": "Êtes-vous sûr de vouloir supprimer %{name} ? Cette action ne peut pas être annulée et supprimera définitivement cet agent de votre Twake.",
179
178
  "buttons": {
180
179
  "cancel": "Annuler",
181
180
  "confirm": "Supprimer"
@@ -85,18 +85,17 @@ var en = {
85
85
  }
86
86
  },
87
87
  assistant_create: {
88
- title: "Create Assistant",
88
+ title: "Create Agent",
89
89
  steps: {
90
90
  basic_info: {
91
- description: "Customize your assistant's identity and behavior to match your specific needs.",
91
+ description: "Customize your agent. Choose its knowledge base, then its AI model.",
92
92
  avatar: "Avatar (optional)",
93
93
  name: "Name",
94
- name_placeholder: "Name your assistant",
95
- instructions: "Instructions (optional)",
96
- instructions_placeholder: "What does this assistant do? How should it behave? What should it avoid doing?",
94
+ name_placeholder: "Name your agent",
95
+ description_label: "Description",
96
+ description_placeholder: "Optional description of this agent's role. This description will not be used by the AI",
97
97
  knowledge_base: "Knowledge Base (optional)",
98
98
  knowledge_base_placeholder: "Conversations may reveal some or all of the files that have been uploaded.",
99
- load_file: "Load files",
100
99
  from_drive: "From Drive",
101
100
  from_mail: "From Mail"
102
101
  },
@@ -125,7 +124,7 @@ var en = {
125
124
  external_warning: "Your data will be processed on external servers. This mode does not provide enhanced security protections."
126
125
  },
127
126
  configuration: {
128
- description: "Enter provider URL, model and your API key to configure the new assistant. Your key will be stored securely.",
127
+ description: "Enter provider URL, model and your API key to configure the new agent. Your key will be stored securely.",
129
128
  custom_provider_description: "Configure your custom AI provider settings",
130
129
  model: {
131
130
  label: "Model",
@@ -151,25 +150,25 @@ var en = {
151
150
  next: "Next",
152
151
  create: "Create"
153
152
  },
154
- configure_api_key_title: "Configure a new assistant",
155
- configure_api_key_description: "Enter provider URL, model and your API key to configure the new assistant. Your key will be stored securely.",
153
+ configure_api_key_title: "Configure a new agent",
154
+ configure_api_key_description: "Enter provider URL, model and your API key to configure the new agent. Your key will be stored securely.",
156
155
  from_drive: {
157
156
  actions: {
158
157
  cancel: "Cancel",
159
158
  add: "Add"
160
159
  }
161
160
  },
162
- success: "Assistant created successfully"
161
+ success: "Agent created successfully"
163
162
  },
164
163
  assistant_edit: {
165
- title: "Edit Assistant",
164
+ title: "Edit Agent",
166
165
  buttons: {
167
166
  cancel: "Cancel",
168
167
  next: "Next",
169
168
  edit: "Edit"
170
169
  },
171
- configure_api_key_title: "Configure your assistant",
172
- success: "Assistant updated successfully"
170
+ configure_api_key_title: "Configure your agent",
171
+ success: "Agent updated successfully"
173
172
  },
174
173
  conversation_delete: {
175
174
  title: "Delete conversation",
@@ -180,8 +179,8 @@ var en = {
180
179
  }
181
180
  },
182
181
  assistant_delete: {
183
- title: "Delete AI Assistant",
184
- content: "Are you sure you want to delete %{name}? This action cannot be undone and will permanently remove this assistant from your Twake.",
182
+ title: "Delete Agent",
183
+ content: "Are you sure you want to delete %{name}? This action cannot be undone and will permanently remove this agent from your Twake.",
185
184
  buttons: {
186
185
  cancel: "Cancel",
187
186
  confirm: "Delete"
@@ -269,18 +268,17 @@ var fr = {
269
268
  }
270
269
  },
271
270
  assistant_create: {
272
- title: "Cr\xE9er un assistant",
271
+ title: "Cr\xE9er un agent",
273
272
  steps: {
274
273
  basic_info: {
275
- description: "Personnalisez l'identit\xE9 et le comportement de votre assistant pour r\xE9pondre \xE0 vos besoins sp\xE9cifiques.",
274
+ description: "Personnalisez votre agent. Choisissez la base de connaissances, puis son mod\xE8le d'IA.",
276
275
  avatar: "Avatar (optionnel)",
277
276
  name: "Nom",
278
- name_placeholder: "Nommez votre assistant",
279
- instructions: "Instructions (optionnel)",
280
- instructions_placeholder: "Que fait cet assistant ? Comment doit-il se comporter ? Que doit-il \xE9viter de faire ?",
277
+ name_placeholder: "Nommez votre agent",
278
+ description_label: "Description",
279
+ description_placeholder: "Description optionnelle du r\xF4le de cet agent. Cette description ne sera pas utilis\xE9e par l'IA",
281
280
  knowledge_base: "Base de connaissances (optionnel)",
282
281
  knowledge_base_placeholder: "Les conversations peuvent r\xE9v\xE9ler une partie ou l'int\xE9gralit\xE9 des fichiers qui ont \xE9t\xE9 t\xE9l\xE9vers\xE9s.",
283
- load_file: "Charger des fichiers",
284
282
  from_drive: "Depuis Drive",
285
283
  from_mail: "Depuis Mail"
286
284
  },
@@ -309,7 +307,7 @@ var fr = {
309
307
  external_warning: "Vos donn\xE9es seront trait\xE9es sur des serveurs externes. Ce mode ne fournit pas de protections de s\xE9curit\xE9 renforc\xE9es."
310
308
  },
311
309
  configuration: {
312
- description: "Saisissez l'URL du fournisseur, le mod\xE8le et votre cl\xE9 API pour configurer le nouvel assistant. Votre cl\xE9 sera stock\xE9e de mani\xE8re s\xE9curis\xE9e.",
310
+ description: "Saisissez l'URL du fournisseur, le mod\xE8le et votre cl\xE9 API pour configurer le nouvel agent. Votre cl\xE9 sera stock\xE9e de mani\xE8re s\xE9curis\xE9e.",
313
311
  custom_provider_description: "Configurez les param\xE8tres de votre fournisseur d'IA personnalis\xE9",
314
312
  model: {
315
313
  label: "Mod\xE8le",
@@ -335,25 +333,25 @@ var fr = {
335
333
  next: "Suivant",
336
334
  create: "Cr\xE9er"
337
335
  },
338
- configure_api_key_title: "Configurer un nouvel assistant",
339
- configure_api_key_description: "Saisissez l'URL du fournisseur, le mod\xE8le et votre cl\xE9 API pour configurer le nouvel assistant. Votre cl\xE9 sera stock\xE9e de mani\xE8re s\xE9curis\xE9e.",
336
+ configure_api_key_title: "Configurer un nouvel agent",
337
+ configure_api_key_description: "Saisissez l'URL du fournisseur, le mod\xE8le et votre cl\xE9 API pour configurer le nouvel agent. Votre cl\xE9 sera stock\xE9e de mani\xE8re s\xE9curis\xE9e.",
340
338
  from_drive: {
341
339
  actions: {
342
340
  cancel: "Annuler",
343
341
  add: "Ajouter"
344
342
  }
345
343
  },
346
- success: "Assistant cr\xE9\xE9 avec succ\xE8s"
344
+ success: "Agent cr\xE9\xE9 avec succ\xE8s"
347
345
  },
348
346
  assistant_edit: {
349
- title: "Modifier l'assistant",
347
+ title: "Modifier l'agent",
350
348
  buttons: {
351
349
  cancel: "Annuler",
352
350
  next: "Suivant",
353
351
  edit: "Modifier"
354
352
  },
355
- configure_api_key_title: "Configurer votre assistant",
356
- success: "Assistant modifi\xE9 avec succ\xE8s"
353
+ configure_api_key_title: "Configurer votre agent",
354
+ success: "Agent modifi\xE9 avec succ\xE8s"
357
355
  },
358
356
  conversation_delete: {
359
357
  title: "Supprimer la conversation",
@@ -364,8 +362,8 @@ var fr = {
364
362
  }
365
363
  },
366
364
  assistant_delete: {
367
- title: "Supprimer l'assistant",
368
- content: "\xCAtes-vous s\xFBr de vouloir supprimer %{name}\xA0? Cette action ne peut pas \xEAtre annul\xE9e et supprimera d\xE9finitivement cet assistant de votre Twake.",
365
+ title: "Supprimer l'agent",
366
+ content: "\xCAtes-vous s\xFBr de vouloir supprimer %{name}\xA0? Cette action ne peut pas \xEAtre annul\xE9e et supprimera d\xE9finitivement cet agent de votre Twake.",
369
367
  buttons: {
370
368
  cancel: "Annuler",
371
369
  confirm: "Supprimer"
@@ -452,22 +450,35 @@ var ru = {
452
450
  draft: "\u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0438",
453
451
  outbox: "\u0418\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0435",
454
452
  spam: "\u0421\u043F\u0430\u043C",
455
- search_in: "\u041F\u043E\u0438\u0441\u043A \u0432"
453
+ search_in: "\u041F\u043E\u0438\u0441\u043A \u0432",
454
+ drive: "Drive"
455
+ },
456
+ knowledge_base: {
457
+ change_folder: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u043F\u043A\u0443\u2026",
458
+ emails: "\u041F\u0438\u0441\u044C\u043C\u0430",
459
+ open_folder: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 Drive",
460
+ picker_error: "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u043F\u0430\u043F\u043A\u0438 Drive. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437.",
461
+ remove: "\u0423\u0431\u0440\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443",
462
+ remove_emails: "\u0423\u0431\u0440\u0430\u0442\u044C \u043F\u0438\u0441\u044C\u043C\u0430",
463
+ select_folder: "\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u044D\u0442\u0443 \u043F\u0430\u043F\u043A\u0443",
464
+ unavailable: "\u041F\u0430\u043F\u043A\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430"
465
+ },
466
+ websearch: {
467
+ label: "\u0412\u0435\u0431-\u043F\u043E\u0438\u0441\u043A"
456
468
  }
457
469
  },
458
470
  assistant_create: {
459
- title: "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430",
471
+ title: "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430",
460
472
  steps: {
461
473
  basic_info: {
462
- description: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u043E\u0441\u0442\u044C \u0438 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u0430\u0448\u0435\u0433\u043E \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430 \u043F\u043E\u0434 \u0432\u0430\u0448\u0438 \u0437\u0430\u0434\u0430\u0447\u0438.",
474
+ description: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u0432\u0430\u0448\u0435\u0433\u043E \u0430\u0433\u0435\u043D\u0442\u0430. \u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u0430\u0437\u0443 \u0437\u043D\u0430\u043D\u0438\u0439, \u0437\u0430\u0442\u0435\u043C \u043C\u043E\u0434\u0435\u043B\u044C \u0418\u0418.",
463
475
  avatar: "\u0410\u0432\u0430\u0442\u0430\u0440 (\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)",
464
476
  name: "\u0418\u043C\u044F",
465
- name_placeholder: "\u041D\u0430\u0437\u043E\u0432\u0438\u0442\u0435 \u0432\u0430\u0448\u0435\u0433\u043E \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430",
466
- instructions: "\u0418\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0438 (\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)",
467
- instructions_placeholder: "\u0427\u0442\u043E \u0434\u0435\u043B\u0430\u0435\u0442 \u044D\u0442\u043E\u0442 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442? \u041A\u0430\u043A \u043E\u043D \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u0435\u0431\u044F \u0432\u0435\u0441\u0442\u0438? \u0427\u0435\u0433\u043E \u0435\u043C\u0443 \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044C?",
477
+ name_placeholder: "\u041D\u0430\u0437\u043E\u0432\u0438\u0442\u0435 \u0432\u0430\u0448\u0435\u0433\u043E \u0430\u0433\u0435\u043D\u0442\u0430",
478
+ description_label: "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",
479
+ description_placeholder: "\u041D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0440\u043E\u043B\u0438 \u044D\u0442\u043E\u0433\u043E \u0430\u0433\u0435\u043D\u0442\u0430. \u042D\u0442\u043E \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0418\u0418",
468
480
  knowledge_base: "\u0411\u0430\u0437\u0430 \u0437\u043D\u0430\u043D\u0438\u0439 (\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)",
469
481
  knowledge_base_placeholder: "\u0412 \u0445\u043E\u0434\u0435 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u043E\u0432 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u0440\u0430\u0441\u043A\u0440\u044B\u0442\u044B \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u043B\u0438 \u0432\u0441\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0435 \u0444\u0430\u0439\u043B\u044B.",
470
- load_file: "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B",
471
482
  from_drive: "\u0418\u0437 Drive",
472
483
  from_mail: "\u0418\u0437 Mail"
473
484
  },
@@ -496,7 +507,7 @@ var ru = {
496
507
  external_warning: "\u0412\u0430\u0448\u0438 \u0434\u0430\u043D\u043D\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u043D\u0435\u0448\u043D\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445. \u042D\u0442\u043E\u0442 \u0440\u0435\u0436\u0438\u043C \u043D\u0435 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0441\u0438\u043B\u0435\u043D\u043D\u044B\u0445 \u043C\u0435\u0440 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438."
497
508
  },
498
509
  configuration: {
499
- description: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u043C\u043E\u0434\u0435\u043B\u044C \u0438 \u0432\u0430\u0448 API\u2011\u043A\u043B\u044E\u0447 \u0434\u043B\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u043E\u0432\u043E\u0433\u043E \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430. \u0412\u0430\u0448 \u043A\u043B\u044E\u0447 \u0431\u0443\u0434\u0435\u0442 \u043D\u0430\u0434\u0435\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D.",
510
+ description: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u043C\u043E\u0434\u0435\u043B\u044C \u0438 \u0432\u0430\u0448 API\u2011\u043A\u043B\u044E\u0447 \u0434\u043B\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u043E\u0432\u043E\u0433\u043E \u0430\u0433\u0435\u043D\u0442\u0430. \u0412\u0430\u0448 \u043A\u043B\u044E\u0447 \u0431\u0443\u0434\u0435\u0442 \u043D\u0430\u0434\u0435\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D.",
500
511
  custom_provider_description: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0432\u0430\u0448\u0435\u0433\u043E \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0418\u0418",
501
512
  model: {
502
513
  label: "\u041C\u043E\u0434\u0435\u043B\u044C",
@@ -522,25 +533,25 @@ var ru = {
522
533
  next: "\u0414\u0430\u043B\u0435\u0435",
523
534
  create: "\u0421\u043E\u0437\u0434\u0430\u0442\u044C"
524
535
  },
525
- configure_api_key_title: "\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u043D\u043E\u0432\u043E\u0433\u043E \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430",
526
- configure_api_key_description: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u043C\u043E\u0434\u0435\u043B\u044C \u0438 \u0432\u0430\u0448 API\u2011\u043A\u043B\u044E\u0447 \u0434\u043B\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u043E\u0432\u043E\u0433\u043E \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430. \u0412\u0430\u0448 \u043A\u043B\u044E\u0447 \u0431\u0443\u0434\u0435\u0442 \u043D\u0430\u0434\u0435\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D.",
536
+ configure_api_key_title: "\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u043D\u043E\u0432\u043E\u0433\u043E \u0430\u0433\u0435\u043D\u0442\u0430",
537
+ configure_api_key_description: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u043C\u043E\u0434\u0435\u043B\u044C \u0438 \u0432\u0430\u0448 API\u2011\u043A\u043B\u044E\u0447 \u0434\u043B\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u043E\u0432\u043E\u0433\u043E \u0430\u0433\u0435\u043D\u0442\u0430. \u0412\u0430\u0448 \u043A\u043B\u044E\u0447 \u0431\u0443\u0434\u0435\u0442 \u043D\u0430\u0434\u0435\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D.",
527
538
  from_drive: {
528
539
  actions: {
529
540
  cancel: "\u041E\u0442\u043C\u0435\u043D\u0430",
530
541
  add: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C"
531
542
  }
532
543
  },
533
- success: "\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043E\u0437\u0434\u0430\u043D"
544
+ success: "\u0410\u0433\u0435\u043D\u0442 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043E\u0437\u0434\u0430\u043D"
534
545
  },
535
546
  assistant_edit: {
536
- title: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430",
547
+ title: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430",
537
548
  buttons: {
538
549
  cancel: "\u041E\u0442\u043C\u0435\u043D\u0430",
539
550
  next: "\u0414\u0430\u043B\u0435\u0435",
540
551
  edit: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C"
541
552
  },
542
- configure_api_key_title: "\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430",
543
- success: "\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D"
553
+ configure_api_key_title: "\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430",
554
+ success: "\u0410\u0433\u0435\u043D\u0442 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D"
544
555
  },
545
556
  conversation_delete: {
546
557
  title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440",
@@ -551,8 +562,8 @@ var ru = {
551
562
  }
552
563
  },
553
564
  assistant_delete: {
554
- title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430",
555
- content: "\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C %{name}? \u042D\u0442\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043D\u0435\u043B\u044C\u0437\u044F \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0438 \u043E\u043D\u043E \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u0430\u043B\u0438\u0442 \u044D\u0442\u043E\u0433\u043E \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430 \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043E Twake.",
565
+ title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430",
566
+ content: "\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C %{name}? \u042D\u0442\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043D\u0435\u043B\u044C\u0437\u044F \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0438 \u043E\u043D\u043E \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u0430\u043B\u0438\u0442 \u044D\u0442\u043E\u0433\u043E \u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043E Twake.",
556
567
  buttons: {
557
568
  cancel: "\u041E\u0442\u043C\u0435\u043D\u0430",
558
569
  confirm: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C"
@@ -639,22 +650,35 @@ var vi = {
639
650
  draft: "Nh\xE1p",
640
651
  outbox: "H\u1ED9p th\u01B0 \u0111i",
641
652
  spam: "Th\u01B0 r\xE1c",
642
- search_in: "T\xECm ki\u1EBFm trong"
653
+ search_in: "T\xECm ki\u1EBFm trong",
654
+ drive: "Drive"
655
+ },
656
+ knowledge_base: {
657
+ change_folder: "Thay \u0111\u1ED5i th\u01B0 m\u1EE5c\u2026",
658
+ emails: "Email",
659
+ open_folder: "M\u1EDF trong Drive",
660
+ picker_error: "Kh\xF4ng th\u1EC3 m\u1EDF b\u1ED9 ch\u1ECDn th\u01B0 m\u1EE5c Drive. Vui l\xF2ng th\u1EED l\u1EA1i.",
661
+ remove: "G\u1EE1 th\u01B0 m\u1EE5c",
662
+ remove_emails: "G\u1EE1 email",
663
+ select_folder: "Ch\u1ECDn th\u01B0 m\u1EE5c n\xE0y",
664
+ unavailable: "Th\u01B0 m\u1EE5c kh\xF4ng kh\u1EA3 d\u1EE5ng"
665
+ },
666
+ websearch: {
667
+ label: "T\xECm ki\u1EBFm web"
643
668
  }
644
669
  },
645
670
  assistant_create: {
646
- title: "T\u1EA1o tr\u1EE3 l\xFD",
671
+ title: "T\u1EA1o t\xE1c nh\xE2n",
647
672
  steps: {
648
673
  basic_info: {
649
- description: "T\xF9y ch\u1EC9nh danh t\xEDnh v\xE0 h\xE0nh vi c\u1EE7a tr\u1EE3 l\xFD \u0111\u1EC3 ph\xF9 h\u1EE3p v\u1EDBi nhu c\u1EA7u c\u1EE7a b\u1EA1n.",
674
+ description: "T\xF9y ch\u1EC9nh t\xE1c nh\xE2n c\u1EE7a b\u1EA1n. Ch\u1ECDn c\u01A1 s\u1EDF tri th\u1EE9c, sau \u0111\xF3 l\xE0 m\xF4 h\xECnh AI.",
650
675
  avatar: "\u1EA2nh \u0111\u1EA1i di\u1EC7n (t\xF9y ch\u1ECDn)",
651
676
  name: "T\xEAn",
652
- name_placeholder: "\u0110\u1EB7t t\xEAn cho tr\u1EE3 l\xFD c\u1EE7a b\u1EA1n",
653
- instructions: "H\u01B0\u1EDBng d\u1EABn (t\xF9y ch\u1ECDn)",
654
- instructions_placeholder: "Tr\u1EE3 l\xFD n\xE0y l\xE0m g\xEC? N\xEAn h\xE0nh x\u1EED nh\u01B0 th\u1EBF n\xE0o? N\xEAn tr\xE1nh \u0111i\u1EC1u g\xEC?",
677
+ name_placeholder: "\u0110\u1EB7t t\xEAn cho t\xE1c nh\xE2n c\u1EE7a b\u1EA1n",
678
+ description_label: "M\xF4 t\u1EA3",
679
+ description_placeholder: "M\xF4 t\u1EA3 t\xF9y ch\u1ECDn v\u1EC1 vai tr\xF2 c\u1EE7a t\xE1c nh\xE2n n\xE0y. M\xF4 t\u1EA3 n\xE0y s\u1EBD kh\xF4ng \u0111\u01B0\u1EE3c AI s\u1EED d\u1EE5ng",
655
680
  knowledge_base: "C\u01A1 s\u1EDF tri th\u1EE9c (t\xF9y ch\u1ECDn)",
656
681
  knowledge_base_placeholder: "C\xE1c cu\u1ED9c tr\xF2 chuy\u1EC7n c\xF3 th\u1EC3 l\xE0m l\u1ED9 m\u1ED9t ph\u1EA7n ho\u1EB7c to\xE0n b\u1ED9 c\xE1c t\u1EC7p \u0111\xE3 \u0111\u01B0\u1EE3c t\u1EA3i l\xEAn.",
657
- load_file: "T\u1EA3i t\u1EC7p",
658
682
  from_drive: "T\u1EEB Drive",
659
683
  from_mail: "T\u1EEB Mail"
660
684
  },
@@ -683,7 +707,7 @@ var vi = {
683
707
  external_warning: "D\u1EEF li\u1EC7u c\u1EE7a b\u1EA1n s\u1EBD \u0111\u01B0\u1EE3c x\u1EED l\xFD tr\xEAn m\xE1y ch\u1EE7 b\xEAn ngo\xE0i. Ch\u1EBF \u0111\u1ED9 n\xE0y kh\xF4ng cung c\u1EA5p c\xE1c bi\u1EC7n ph\xE1p b\u1EA3o v\u1EC7 b\u1EA3o m\u1EADt n\xE2ng cao."
684
708
  },
685
709
  configuration: {
686
- description: "Nh\u1EADp URL nh\xE0 cung c\u1EA5p, m\xF4 h\xECnh v\xE0 kh\xF3a API c\u1EE7a b\u1EA1n \u0111\u1EC3 \u0111\u1ECBnh c\u1EA5u h\xECnh tr\u1EE3 l\xFD m\u1EDBi. Kh\xF3a c\u1EE7a b\u1EA1n s\u1EBD \u0111\u01B0\u1EE3c l\u01B0u tr\u1EEF an to\xE0n.",
710
+ description: "Nh\u1EADp URL nh\xE0 cung c\u1EA5p, m\xF4 h\xECnh v\xE0 kh\xF3a API c\u1EE7a b\u1EA1n \u0111\u1EC3 \u0111\u1ECBnh c\u1EA5u h\xECnh t\xE1c nh\xE2n m\u1EDBi. Kh\xF3a c\u1EE7a b\u1EA1n s\u1EBD \u0111\u01B0\u1EE3c l\u01B0u tr\u1EEF an to\xE0n.",
687
711
  custom_provider_description: "C\u1EA5u h\xECnh c\xE0i \u0111\u1EB7t nh\xE0 cung c\u1EA5p AI t\xF9y ch\u1EC9nh",
688
712
  model: {
689
713
  label: "M\xF4 h\xECnh",
@@ -709,25 +733,25 @@ var vi = {
709
733
  next: "Ti\u1EBFp",
710
734
  create: "T\u1EA1o"
711
735
  },
712
- configure_api_key_title: "C\u1EA5u h\xECnh tr\u1EE3 l\xFD m\u1EDBi",
713
- configure_api_key_description: "Nh\u1EADp URL nh\xE0 cung c\u1EA5p, m\xF4 h\xECnh v\xE0 kh\xF3a API c\u1EE7a b\u1EA1n \u0111\u1EC3 \u0111\u1ECBnh c\u1EA5u h\xECnh tr\u1EE3 l\xFD m\u1EDBi. Kh\xF3a c\u1EE7a b\u1EA1n s\u1EBD \u0111\u01B0\u1EE3c l\u01B0u tr\u1EEF an to\xE0n.",
736
+ configure_api_key_title: "C\u1EA5u h\xECnh t\xE1c nh\xE2n m\u1EDBi",
737
+ configure_api_key_description: "Nh\u1EADp URL nh\xE0 cung c\u1EA5p, m\xF4 h\xECnh v\xE0 kh\xF3a API c\u1EE7a b\u1EA1n \u0111\u1EC3 \u0111\u1ECBnh c\u1EA5u h\xECnh t\xE1c nh\xE2n m\u1EDBi. Kh\xF3a c\u1EE7a b\u1EA1n s\u1EBD \u0111\u01B0\u1EE3c l\u01B0u tr\u1EEF an to\xE0n.",
714
738
  from_drive: {
715
739
  actions: {
716
740
  cancel: "H\u1EE7y",
717
741
  add: "Th\xEAm"
718
742
  }
719
743
  },
720
- success: "T\u1EA1o tr\u1EE3 l\xFD th\xE0nh c\xF4ng"
744
+ success: "T\u1EA1o t\xE1c nh\xE2n th\xE0nh c\xF4ng"
721
745
  },
722
746
  assistant_edit: {
723
- title: "Ch\u1EC9nh s\u1EEDa tr\u1EE3 l\xFD",
747
+ title: "Ch\u1EC9nh s\u1EEDa t\xE1c nh\xE2n",
724
748
  buttons: {
725
749
  cancel: "H\u1EE7y",
726
750
  next: "Ti\u1EBFp",
727
751
  edit: "L\u01B0u"
728
752
  },
729
- configure_api_key_title: "C\u1EA5u h\xECnh tr\u1EE3 l\xFD c\u1EE7a b\u1EA1n",
730
- success: "Ch\u1EC9nh s\u1EEDa tr\u1EE3 l\xFD th\xE0nh c\xF4ng"
753
+ configure_api_key_title: "C\u1EA5u h\xECnh t\xE1c nh\xE2n c\u1EE7a b\u1EA1n",
754
+ success: "Ch\u1EC9nh s\u1EEDa t\xE1c nh\xE2n th\xE0nh c\xF4ng"
731
755
  },
732
756
  conversation_delete: {
733
757
  title: "X\xF3a cu\u1ED9c tr\xF2 chuy\u1EC7n",
@@ -738,8 +762,8 @@ var vi = {
738
762
  }
739
763
  },
740
764
  assistant_delete: {
741
- title: "X\xF3a tr\u1EE3 l\xFD",
742
- content: "B\u1EA1n c\xF3 ch\u1EAFc ch\u1EAFn mu\u1ED1n x\xF3a %{name}? H\xE0nh \u0111\u1ED9ng n\xE0y kh\xF4ng th\u1EC3 ho\xE0n t\xE1c v\xE0 s\u1EBD x\xF3a v\u0129nh vi\u1EC5n tr\u1EE3 l\xFD n\xE0y kh\u1ECFi Twake c\u1EE7a b\u1EA1n.",
765
+ title: "X\xF3a t\xE1c nh\xE2n",
766
+ content: "B\u1EA1n c\xF3 ch\u1EAFc ch\u1EAFn mu\u1ED1n x\xF3a %{name}? H\xE0nh \u0111\u1ED9ng n\xE0y kh\xF4ng th\u1EC3 ho\xE0n t\xE1c v\xE0 s\u1EBD x\xF3a v\u0129nh vi\u1EC5n t\xE1c nh\xE2n n\xE0y kh\u1ECFi Twake c\u1EE7a b\u1EA1n.",
743
767
  buttons: {
744
768
  cancel: "H\u1EE7y",
745
769
  confirm: "X\xF3a"
@@ -78,22 +78,35 @@
78
78
  "draft": "Черновики",
79
79
  "outbox": "Исходящие",
80
80
  "spam": "Спам",
81
- "search_in": "Поиск в"
81
+ "search_in": "Поиск в",
82
+ "drive": "Drive"
83
+ },
84
+ "knowledge_base": {
85
+ "change_folder": "Изменить папку…",
86
+ "emails": "Письма",
87
+ "open_folder": "Открыть в Drive",
88
+ "picker_error": "Не удалось открыть выбор папки Drive. Пожалуйста, попробуйте ещё раз.",
89
+ "remove": "Убрать папку",
90
+ "remove_emails": "Убрать письма",
91
+ "select_folder": "Выбрать эту папку",
92
+ "unavailable": "Папка недоступна"
93
+ },
94
+ "websearch": {
95
+ "label": "Веб-поиск"
82
96
  }
83
97
  },
84
98
  "assistant_create": {
85
- "title": "Создать ассистента",
99
+ "title": "Создать агента",
86
100
  "steps": {
87
101
  "basic_info": {
88
- "description": "Настройте идентичность и поведение вашего ассистента под ваши задачи.",
102
+ "description": "Настройте вашего агента. Выберите базу знаний, затем модель ИИ.",
89
103
  "avatar": "Аватар (необязательно)",
90
104
  "name": "Имя",
91
- "name_placeholder": "Назовите вашего ассистента",
92
- "instructions": "Инструкции (необязательно)",
93
- "instructions_placeholder": "Что делает этот ассистент? Как он должен себя вести? Чего ему следует избегать?",
105
+ "name_placeholder": "Назовите вашего агента",
106
+ "description_label": "Описание",
107
+ "description_placeholder": "Необязательное описание роли этого агента. Это описание не будет использоваться ИИ",
94
108
  "knowledge_base": "База знаний (необязательно)",
95
109
  "knowledge_base_placeholder": "В ходе разговоров могут быть раскрыты некоторые или все загруженные файлы.",
96
- "load_file": "Загрузить файлы",
97
110
  "from_drive": "Из Drive",
98
111
  "from_mail": "Из Mail"
99
112
  },
@@ -122,7 +135,7 @@
122
135
  "external_warning": "Ваши данные будут обрабатываться на внешних серверах. Этот режим не обеспечивает усиленных мер безопасности."
123
136
  },
124
137
  "configuration": {
125
- "description": "Введите URL провайдера, модель и ваш API‑ключ для настройки нового ассистента. Ваш ключ будет надежно сохранен.",
138
+ "description": "Введите URL провайдера, модель и ваш API‑ключ для настройки нового агента. Ваш ключ будет надежно сохранен.",
126
139
  "custom_provider_description": "Настройте параметры вашего собственного провайдера ИИ",
127
140
  "model": {
128
141
  "label": "Модель",
@@ -148,25 +161,25 @@
148
161
  "next": "Далее",
149
162
  "create": "Создать"
150
163
  },
151
- "configure_api_key_title": "Настроить нового ассистента",
152
- "configure_api_key_description": "Введите URL провайдера, модель и ваш API‑ключ для настройки нового ассистента. Ваш ключ будет надежно сохранен.",
164
+ "configure_api_key_title": "Настроить нового агента",
165
+ "configure_api_key_description": "Введите URL провайдера, модель и ваш API‑ключ для настройки нового агента. Ваш ключ будет надежно сохранен.",
153
166
  "from_drive": {
154
167
  "actions": {
155
168
  "cancel": "Отмена",
156
169
  "add": "Добавить"
157
170
  }
158
171
  },
159
- "success": "Ассистент успешно создан"
172
+ "success": "Агент успешно создан"
160
173
  },
161
174
  "assistant_edit": {
162
- "title": "Редактировать ассистента",
175
+ "title": "Редактировать агента",
163
176
  "buttons": {
164
177
  "cancel": "Отмена",
165
178
  "next": "Далее",
166
179
  "edit": "Сохранить"
167
180
  },
168
- "configure_api_key_title": "Настроить ассистента",
169
- "success": "Ассистент успешно обновлён"
181
+ "configure_api_key_title": "Настроить агента",
182
+ "success": "Агент успешно обновлён"
170
183
  },
171
184
  "conversation_delete": {
172
185
  "title": "Удалить разговор",
@@ -177,8 +190,8 @@
177
190
  }
178
191
  },
179
192
  "assistant_delete": {
180
- "title": "Удалить ассистента",
181
- "content": "Вы уверены, что хотите удалить %{name}? Это действие нельзя отменить и оно навсегда удалит этого ассистента из вашего Twake.",
193
+ "title": "Удалить агента",
194
+ "content": "Вы уверены, что хотите удалить %{name}? Это действие нельзя отменить и оно навсегда удалит этого агента из вашего Twake.",
182
195
  "buttons": {
183
196
  "cancel": "Отмена",
184
197
  "confirm": "Удалить"
@@ -78,22 +78,35 @@
78
78
  "draft": "Nháp",
79
79
  "outbox": "Hộp thư đi",
80
80
  "spam": "Thư rác",
81
- "search_in": "Tìm kiếm trong"
81
+ "search_in": "Tìm kiếm trong",
82
+ "drive": "Drive"
83
+ },
84
+ "knowledge_base": {
85
+ "change_folder": "Thay đổi thư mục…",
86
+ "emails": "Email",
87
+ "open_folder": "Mở trong Drive",
88
+ "picker_error": "Không thể mở bộ chọn thư mục Drive. Vui lòng thử lại.",
89
+ "remove": "Gỡ thư mục",
90
+ "remove_emails": "Gỡ email",
91
+ "select_folder": "Chọn thư mục này",
92
+ "unavailable": "Thư mục không khả dụng"
93
+ },
94
+ "websearch": {
95
+ "label": "Tìm kiếm web"
82
96
  }
83
97
  },
84
98
  "assistant_create": {
85
- "title": "Tạo trợ lý",
99
+ "title": "Tạo tác nhân",
86
100
  "steps": {
87
101
  "basic_info": {
88
- "description": "Tùy chỉnh danh tính và hành vi của trợ lý để phù hợp với nhu cầu của bạn.",
102
+ "description": "Tùy chỉnh tác nhân của bạn. Chọn cơ sở tri thức, sau đó là mô hình AI.",
89
103
  "avatar": "Ảnh đại diện (tùy chọn)",
90
104
  "name": "Tên",
91
- "name_placeholder": "Đặt tên cho trợ lý của bạn",
92
- "instructions": "Hướng dẫn (tùy chọn)",
93
- "instructions_placeholder": "Trợ lý này làm gì? Nên hành xử như thế nào? Nên tránh điều gì?",
105
+ "name_placeholder": "Đặt tên cho tác nhân của bạn",
106
+ "description_label": "Mô tả",
107
+ "description_placeholder": "Mô tả tùy chọn về vai trò của tác nhân này. Mô tả này sẽ không được AI sử dụng",
94
108
  "knowledge_base": "Cơ sở tri thức (tùy chọn)",
95
109
  "knowledge_base_placeholder": "Các cuộc trò chuyện có thể làm lộ một phần hoặc toàn bộ các tệp đã được tải lên.",
96
- "load_file": "Tải tệp",
97
110
  "from_drive": "Từ Drive",
98
111
  "from_mail": "Từ Mail"
99
112
  },
@@ -122,7 +135,7 @@
122
135
  "external_warning": "Dữ liệu của bạn sẽ được xử lý trên máy chủ bên ngoài. Chế độ này không cung cấp các biện pháp bảo vệ bảo mật nâng cao."
123
136
  },
124
137
  "configuration": {
125
- "description": "Nhập URL nhà cung cấp, mô hình và khóa API của bạn để định cấu hình trợ lý mới. Khóa của bạn sẽ được lưu trữ an toàn.",
138
+ "description": "Nhập URL nhà cung cấp, mô hình và khóa API của bạn để định cấu hình tác nhân mới. Khóa của bạn sẽ được lưu trữ an toàn.",
126
139
  "custom_provider_description": "Cấu hình cài đặt nhà cung cấp AI tùy chỉnh",
127
140
  "model": {
128
141
  "label": "Mô hình",
@@ -148,25 +161,25 @@
148
161
  "next": "Tiếp",
149
162
  "create": "Tạo"
150
163
  },
151
- "configure_api_key_title": "Cấu hình trợ lý mới",
152
- "configure_api_key_description": "Nhập URL nhà cung cấp, mô hình và khóa API của bạn để định cấu hình trợ lý mới. Khóa của bạn sẽ được lưu trữ an toàn.",
164
+ "configure_api_key_title": "Cấu hình tác nhân mới",
165
+ "configure_api_key_description": "Nhập URL nhà cung cấp, mô hình và khóa API của bạn để định cấu hình tác nhân mới. Khóa của bạn sẽ được lưu trữ an toàn.",
153
166
  "from_drive": {
154
167
  "actions": {
155
168
  "cancel": "Hủy",
156
169
  "add": "Thêm"
157
170
  }
158
171
  },
159
- "success": "Tạo trợ lý thành công"
172
+ "success": "Tạo tác nhân thành công"
160
173
  },
161
174
  "assistant_edit": {
162
- "title": "Chỉnh sửa trợ lý",
175
+ "title": "Chỉnh sửa tác nhân",
163
176
  "buttons": {
164
177
  "cancel": "Hủy",
165
178
  "next": "Tiếp",
166
179
  "edit": "Lưu"
167
180
  },
168
- "configure_api_key_title": "Cấu hình trợ lý của bạn",
169
- "success": "Chỉnh sửa trợ lý thành công"
181
+ "configure_api_key_title": "Cấu hình tác nhân của bạn",
182
+ "success": "Chỉnh sửa tác nhân thành công"
170
183
  },
171
184
  "conversation_delete": {
172
185
  "title": "Xóa cuộc trò chuyện",
@@ -177,8 +190,8 @@
177
190
  }
178
191
  },
179
192
  "assistant_delete": {
180
- "title": "Xóa trợ lý",
181
- "content": "Bạn có chắc chắn muốn xóa %{name}? Hành động này không thể hoàn tác và sẽ xóa vĩnh viễn trợ lý này khỏi Twake của bạn.",
193
+ "title": "Xóa tác nhân",
194
+ "content": "Bạn có chắc chắn muốn xóa %{name}? Hành động này không thể hoàn tác và sẽ xóa vĩnh viễn tác nhân này khỏi Twake của bạn.",
182
195
  "buttons": {
183
196
  "cancel": "Hủy",
184
197
  "confirm": "Xóa"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cozy-search",
3
3
  "description": "UI components about search bar and IA assistant",
4
- "version": "2.1.1",
4
+ "version": "2.2.1",
5
5
  "author": {
6
6
  "name": "Cozy Cloud",
7
7
  "url": "https://github.com/cozy"
@@ -37,7 +37,7 @@
37
37
  "cozy-pouch-link": "^54.0.0",
38
38
  "cozy-realtime": "^5.9.3",
39
39
  "cozy-ui": "^138.4.0",
40
- "cozy-ui-plus": "^12.1.3",
40
+ "cozy-ui-plus": "^12.1.4",
41
41
  "cross-fetch": "^4.0.0",
42
42
  "jest": "30.3.0",
43
43
  "react": "18.2.0",
@@ -96,5 +96,5 @@
96
96
  "lint": "cd .. && yarn eslint --ext js,jsx,ts packages/cozy-search"
97
97
  },
98
98
  "types": "dist/index.d.ts",
99
- "gitHead": "76ef5e1d8385f885cd5469e3b1b7f36b5620d381"
99
+ "gitHead": "ba501af781312be5d4f530b8dac3c6b9604da60e"
100
100
  }