@ykurilov/agent-chat-attachments 0.0.0-stage → 0.56.0
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.
- package/CHANGELOG.md +835 -0
- package/LICENSE +21 -0
- package/README.md +112 -2
- package/THIRD_PARTY_NOTICES.md +44 -0
- package/dist/attachment-storage-contract.js +15495 -0
- package/dist/attachment-storage-contract.js.map +1 -0
- package/dist/chunk-5WRI5ZAA.js +31 -0
- package/dist/chunk-5WRI5ZAA.js.map +1 -0
- package/dist/dist-UJLZHHQP.js +1833 -0
- package/dist/dist-UJLZHHQP.js.map +1 -0
- package/dist/index.js +1007 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.js +325 -0
- package/dist/react/index.js.map +1 -0
- package/dist/types/attachment-routes.d.ts +68 -0
- package/dist/types/attachment-storage-contract.d.ts +6 -0
- package/dist/types/attachment-storage.d.ts +49 -0
- package/dist/types/create-attachments.d.ts +48 -0
- package/dist/types/detect-file-kind.d.ts +17 -0
- package/dist/types/disk-attachment-storage.d.ts +13 -0
- package/dist/types/extract-text.d.ts +17 -0
- package/dist/types/fit-image.d.ts +23 -0
- package/dist/types/image-plan-cache.d.ts +27 -0
- package/dist/types/images-for-blind-models.d.ts +31 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/instructions.d.ts +2 -0
- package/dist/types/limits.d.ts +28 -0
- package/dist/types/memory-attachment-storage.d.ts +3 -0
- package/dist/types/prepare-history.d.ts +30 -0
- package/dist/types/react/index.d.ts +3 -0
- package/dist/types/react/labels.d.ts +20 -0
- package/dist/types/react/use-attachments-controller.d.ts +15 -0
- package/dist/types/terminal-codes.d.ts +2 -0
- package/package.json +67 -3
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,835 @@
|
|
|
1
|
+
# @ykurilov/agent-chat-attachments
|
|
2
|
+
|
|
3
|
+
## 0.56.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [1eadba9]
|
|
8
|
+
- Updated dependencies [24c313e]
|
|
9
|
+
- @ykurilov/agent-chat-react@0.56.0
|
|
10
|
+
- @ykurilov/agent-chat-core@0.56.0
|
|
11
|
+
|
|
12
|
+
## 0.55.0
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Updated dependencies [51f7b38]
|
|
17
|
+
- Updated dependencies [cdc7dd7]
|
|
18
|
+
- @ykurilov/agent-chat-core@0.55.0
|
|
19
|
+
- @ykurilov/agent-chat-react@0.55.0
|
|
20
|
+
|
|
21
|
+
## 0.54.0
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [c8fb0dd]
|
|
26
|
+
- Updated dependencies [73d3aaa]
|
|
27
|
+
- Updated dependencies [fa90219]
|
|
28
|
+
- @ykurilov/agent-chat-react@0.54.0
|
|
29
|
+
- @ykurilov/agent-chat-core@0.54.0
|
|
30
|
+
|
|
31
|
+
## 0.53.0
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- Updated dependencies [b6a7786]
|
|
36
|
+
- @ykurilov/agent-chat-core@0.53.0
|
|
37
|
+
- @ykurilov/agent-chat-react@0.53.0
|
|
38
|
+
|
|
39
|
+
## 0.52.0
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- @ykurilov/agent-chat-core@0.52.0
|
|
44
|
+
- @ykurilov/agent-chat-react@0.52.0
|
|
45
|
+
|
|
46
|
+
## 0.51.0
|
|
47
|
+
|
|
48
|
+
### Patch Changes
|
|
49
|
+
|
|
50
|
+
- Updated dependencies [41b1726]
|
|
51
|
+
- @ykurilov/agent-chat-core@0.51.0
|
|
52
|
+
- @ykurilov/agent-chat-react@0.51.0
|
|
53
|
+
|
|
54
|
+
## 0.50.0
|
|
55
|
+
|
|
56
|
+
### Patch Changes
|
|
57
|
+
|
|
58
|
+
- @ykurilov/agent-chat-core@0.50.0
|
|
59
|
+
- @ykurilov/agent-chat-react@0.50.0
|
|
60
|
+
|
|
61
|
+
## 0.49.0
|
|
62
|
+
|
|
63
|
+
### Patch Changes
|
|
64
|
+
|
|
65
|
+
- Updated dependencies [084cef7]
|
|
66
|
+
- @ykurilov/agent-chat-core@0.49.0
|
|
67
|
+
- @ykurilov/agent-chat-react@0.49.0
|
|
68
|
+
|
|
69
|
+
## 0.48.0
|
|
70
|
+
|
|
71
|
+
### Patch Changes
|
|
72
|
+
|
|
73
|
+
- Updated dependencies [fa10d5a]
|
|
74
|
+
- @ykurilov/agent-chat-core@0.48.0
|
|
75
|
+
- @ykurilov/agent-chat-react@0.48.0
|
|
76
|
+
|
|
77
|
+
## 0.47.0
|
|
78
|
+
|
|
79
|
+
### Patch Changes
|
|
80
|
+
|
|
81
|
+
- Updated dependencies [5a59c33]
|
|
82
|
+
- @ykurilov/agent-chat-core@0.47.0
|
|
83
|
+
- @ykurilov/agent-chat-react@0.47.0
|
|
84
|
+
|
|
85
|
+
## 0.46.2
|
|
86
|
+
|
|
87
|
+
### Patch Changes
|
|
88
|
+
|
|
89
|
+
- Updated dependencies [3d0d2f2]
|
|
90
|
+
- @ykurilov/agent-chat-core@0.46.2
|
|
91
|
+
- @ykurilov/agent-chat-react@0.46.2
|
|
92
|
+
|
|
93
|
+
## 0.46.1
|
|
94
|
+
|
|
95
|
+
### Patch Changes
|
|
96
|
+
|
|
97
|
+
- @ykurilov/agent-chat-core@0.46.1
|
|
98
|
+
- @ykurilov/agent-chat-react@0.46.1
|
|
99
|
+
|
|
100
|
+
## 0.46.0
|
|
101
|
+
|
|
102
|
+
### Patch Changes
|
|
103
|
+
|
|
104
|
+
- Updated dependencies [56d7528]
|
|
105
|
+
- Updated dependencies [a1933fd]
|
|
106
|
+
- Updated dependencies [52cc67d]
|
|
107
|
+
- @ykurilov/agent-chat-core@0.46.0
|
|
108
|
+
- @ykurilov/agent-chat-react@0.46.0
|
|
109
|
+
|
|
110
|
+
## 0.45.0
|
|
111
|
+
|
|
112
|
+
### Patch Changes
|
|
113
|
+
|
|
114
|
+
- Updated dependencies [eb74c58]
|
|
115
|
+
- Updated dependencies [ac9aede]
|
|
116
|
+
- @ykurilov/agent-chat-react@0.45.0
|
|
117
|
+
- @ykurilov/agent-chat-core@0.45.0
|
|
118
|
+
|
|
119
|
+
## 0.44.0
|
|
120
|
+
|
|
121
|
+
### Patch Changes
|
|
122
|
+
|
|
123
|
+
- Updated dependencies [6a2b5d9]
|
|
124
|
+
- @ykurilov/agent-chat-core@0.44.0
|
|
125
|
+
- @ykurilov/agent-chat-react@0.44.0
|
|
126
|
+
|
|
127
|
+
## 0.43.0
|
|
128
|
+
|
|
129
|
+
### Patch Changes
|
|
130
|
+
|
|
131
|
+
- Updated dependencies [763f4c5]
|
|
132
|
+
- @ykurilov/agent-chat-core@0.43.0
|
|
133
|
+
- @ykurilov/agent-chat-react@0.43.0
|
|
134
|
+
|
|
135
|
+
## 0.42.0
|
|
136
|
+
|
|
137
|
+
### Patch Changes
|
|
138
|
+
|
|
139
|
+
- Updated dependencies [a385276]
|
|
140
|
+
- @ykurilov/agent-chat-core@0.42.0
|
|
141
|
+
- @ykurilov/agent-chat-react@0.42.0
|
|
142
|
+
|
|
143
|
+
## 0.41.0
|
|
144
|
+
|
|
145
|
+
### Minor Changes
|
|
146
|
+
|
|
147
|
+
- 9472fcb: Поправка на лету и английский интерфейс.
|
|
148
|
+
|
|
149
|
+
- `onTurnFinished` в `AgentChat` приходит и для ответа, закрытого ради поправки, — перед ответом на поправку. Раньше
|
|
150
|
+
событие получал только последний ответ, и действия под первым (например, «Вернуть эту версию») не появлялись.
|
|
151
|
+
Событие есть, даже если продолжение по поправке не стартовало (лимит расходов, чужие ходы, чат закрыт).
|
|
152
|
+
**Внимание:** при поправке на ходу `onTurnFinished` теперь приходит на каждый ответ — обработчик, который сохраняет
|
|
153
|
+
снимок или считает ходы, увидит 2 события и больше.
|
|
154
|
+
- Продолжение после поправки получает `place` самой свежей поправки, где он есть, иначе начала хода: служебная заметка
|
|
155
|
+
приложения уже новая, а поправка только с `tabId` место не стирает. Вкладка и пояс — от последней поправки: браузерные
|
|
156
|
+
инструменты продолжения идут на её вкладку. Кэш цел — блок места ложится в хвост поправки.
|
|
157
|
+
- `englishLabels` — полный английский словарь чата. `englishAttachmentsLabels`, `englishWebToolTitles`,
|
|
158
|
+
`englishHistorySearchTitles`, `englishMemoryToolTitles` (два последних — и из корня пакета); `withWebToolTitles` и
|
|
159
|
+
соседи берут словарь названий вторым аргументом (по умолчанию русский).
|
|
160
|
+
|
|
161
|
+
Как обновить: поднять версию. Английский интерфейс — `<ChatLabelsProvider labels={englishLabels}>` и
|
|
162
|
+
`createAttachmentsClient(englishAttachmentsLabels)` вместо своих словарей.
|
|
163
|
+
|
|
164
|
+
### Patch Changes
|
|
165
|
+
|
|
166
|
+
- Updated dependencies [9472fcb]
|
|
167
|
+
- @ykurilov/agent-chat-core@0.41.0
|
|
168
|
+
- @ykurilov/agent-chat-react@0.41.0
|
|
169
|
+
|
|
170
|
+
## 0.40.0
|
|
171
|
+
|
|
172
|
+
### Patch Changes
|
|
173
|
+
|
|
174
|
+
- Updated dependencies [0e7aab3]
|
|
175
|
+
- @ykurilov/agent-chat-core@0.40.0
|
|
176
|
+
- @ykurilov/agent-chat-react@0.40.0
|
|
177
|
+
|
|
178
|
+
## 0.39.1
|
|
179
|
+
|
|
180
|
+
### Patch Changes
|
|
181
|
+
|
|
182
|
+
- Updated dependencies [5c0f3af]
|
|
183
|
+
- @ykurilov/agent-chat-react@0.39.1
|
|
184
|
+
- @ykurilov/agent-chat-core@0.39.1
|
|
185
|
+
|
|
186
|
+
## 0.39.0
|
|
187
|
+
|
|
188
|
+
### Patch Changes
|
|
189
|
+
|
|
190
|
+
- Updated dependencies [3b90429]
|
|
191
|
+
- @ykurilov/agent-chat-core@0.39.0
|
|
192
|
+
- @ykurilov/agent-chat-react@0.39.0
|
|
193
|
+
|
|
194
|
+
## 0.38.0
|
|
195
|
+
|
|
196
|
+
### Minor Changes
|
|
197
|
+
|
|
198
|
+
- 4065a4a: Картинки для моделей без зрения. Зрение модели теперь решается для пары «модель + провайдер»: в профиле
|
|
199
|
+
`acceptsImagesByProvider: { together: false }` главнее `acceptsImages`, решение даёт `modelAcceptsImages(profile, providerId)`
|
|
200
|
+
из ядра, по нему меню моделей и вложения. В стандартном каталоге DeepSeek 4.1 Flash и GLM 5.3 Flash через Together
|
|
201
|
+
отмечены без зрения (у Together они только текстовые) — картинка туда больше не уходит, модель получает пометку.
|
|
202
|
+
|
|
203
|
+
Во вложениях:
|
|
204
|
+
|
|
205
|
+
- `createAttachments({ imagesForBlindModels: { toolName, marker?, always? } })` — модели без зрения вместо картинки идёт
|
|
206
|
+
постоянная плашка `[Картинка «shot.png», вложение <id>. Посмотреть: <toolName>.]`; к инструкции вложений дописывается
|
|
207
|
+
строка про неё. Без настройки — прежняя пометка «картинка не показана».
|
|
208
|
+
- `attachments.readChatImage({ chatId, attachmentId })` — картинка только этого чата для инструмента приложения
|
|
209
|
+
(`chatId` — из `AgentToolsModel.chatId`); чужое, не картинка, неверный номер — `undefined`.
|
|
210
|
+
- `createAttachments({ acceptedMediaTypes: ["image/png", "image/jpeg", "image/webp"] })` — файл другого типа отклоняется
|
|
211
|
+
`unsupported_type` до разбора и записи; поле ввода получает список из настроек и отказывает до загрузки.
|
|
212
|
+
Решает тип, с которым файл пришёл (поле записи `sourceMediaType`): ужатый в JPEG PNG при `["image/png"]` проходит.
|
|
213
|
+
Импорт чата вместо картинки неподходящего типа пишет «[картинка: имя]».
|
|
214
|
+
- `isAttachmentId` — из публичного входа.
|
|
215
|
+
- Снимок страницы (`page_screenshot`) тоже решает по паре «модель + провайдер».
|
|
216
|
+
|
|
217
|
+
Ничего не ломает: приложениям без этих настроек делать ничего не нужно. Как убрать свой обход — в CHANGES.md,
|
|
218
|
+
раздел 0.38.0 «Как обновить приложение».
|
|
219
|
+
|
|
220
|
+
### Patch Changes
|
|
221
|
+
|
|
222
|
+
- Updated dependencies [1cae504]
|
|
223
|
+
- Updated dependencies [4065a4a]
|
|
224
|
+
- @ykurilov/agent-chat-core@0.38.0
|
|
225
|
+
- @ykurilov/agent-chat-react@0.38.0
|
|
226
|
+
|
|
227
|
+
## 0.37.0
|
|
228
|
+
|
|
229
|
+
### Patch Changes
|
|
230
|
+
|
|
231
|
+
- Updated dependencies [7f49d12]
|
|
232
|
+
- Updated dependencies [ea78982]
|
|
233
|
+
- @ykurilov/agent-chat-core@0.37.0
|
|
234
|
+
- @ykurilov/agent-chat-react@0.37.0
|
|
235
|
+
|
|
236
|
+
## 0.36.0
|
|
237
|
+
|
|
238
|
+
### Patch Changes
|
|
239
|
+
|
|
240
|
+
- Updated dependencies [3487fb4]
|
|
241
|
+
- Updated dependencies [8c43b86]
|
|
242
|
+
- Updated dependencies [6f42418]
|
|
243
|
+
- Updated dependencies [5f13c74]
|
|
244
|
+
- @ykurilov/agent-chat-core@0.36.0
|
|
245
|
+
- @ykurilov/agent-chat-react@0.36.0
|
|
246
|
+
|
|
247
|
+
## 0.35.0
|
|
248
|
+
|
|
249
|
+
### Patch Changes
|
|
250
|
+
|
|
251
|
+
- Updated dependencies [6ceee78]
|
|
252
|
+
- Updated dependencies [2382026]
|
|
253
|
+
- @ykurilov/agent-chat-react@0.35.0
|
|
254
|
+
- @ykurilov/agent-chat-core@0.35.0
|
|
255
|
+
|
|
256
|
+
## 0.34.0
|
|
257
|
+
|
|
258
|
+
### Patch Changes
|
|
259
|
+
|
|
260
|
+
- Updated dependencies [d039ce4]
|
|
261
|
+
- @ykurilov/agent-chat-core@0.34.0
|
|
262
|
+
- @ykurilov/agent-chat-react@0.34.0
|
|
263
|
+
|
|
264
|
+
## 0.33.0
|
|
265
|
+
|
|
266
|
+
### Patch Changes
|
|
267
|
+
|
|
268
|
+
- Updated dependencies [4a72339]
|
|
269
|
+
- @ykurilov/agent-chat-core@0.33.0
|
|
270
|
+
- @ykurilov/agent-chat-react@0.33.0
|
|
271
|
+
|
|
272
|
+
## 0.32.0
|
|
273
|
+
|
|
274
|
+
### Patch Changes
|
|
275
|
+
|
|
276
|
+
- bc78aec: Вложения: идентификатор чата теперь кодируется в адресах загрузки, удаления и показа файлов. Раньше чат со «/», «?», «#» или пробелом в идентификаторе загружал и удалял файлы по неверному адресу.
|
|
277
|
+
- Updated dependencies [4087a22]
|
|
278
|
+
- Updated dependencies [71c32b7]
|
|
279
|
+
- Updated dependencies [cae13bf]
|
|
280
|
+
- Updated dependencies [a94bda9]
|
|
281
|
+
- Updated dependencies [4e44492]
|
|
282
|
+
- Updated dependencies [ac9b7d3]
|
|
283
|
+
- Updated dependencies [27f4b1e]
|
|
284
|
+
- @ykurilov/agent-chat-react@0.32.0
|
|
285
|
+
- @ykurilov/agent-chat-core@0.32.0
|
|
286
|
+
|
|
287
|
+
## 0.31.2
|
|
288
|
+
|
|
289
|
+
### Patch Changes
|
|
290
|
+
|
|
291
|
+
- @ykurilov/agent-chat-core@0.31.2
|
|
292
|
+
- @ykurilov/agent-chat-react@0.31.2
|
|
293
|
+
|
|
294
|
+
## 0.31.1
|
|
295
|
+
|
|
296
|
+
### Patch Changes
|
|
297
|
+
|
|
298
|
+
- @ykurilov/agent-chat-core@0.31.1
|
|
299
|
+
- @ykurilov/agent-chat-react@0.31.1
|
|
300
|
+
|
|
301
|
+
## 0.31.0
|
|
302
|
+
|
|
303
|
+
### Patch Changes
|
|
304
|
+
|
|
305
|
+
- @ykurilov/agent-chat-core@0.31.0
|
|
306
|
+
- @ykurilov/agent-chat-react@0.31.0
|
|
307
|
+
|
|
308
|
+
## 0.30.0
|
|
309
|
+
|
|
310
|
+
### Patch Changes
|
|
311
|
+
|
|
312
|
+
- @ykurilov/agent-chat-core@0.30.0
|
|
313
|
+
- @ykurilov/agent-chat-react@0.30.0
|
|
314
|
+
|
|
315
|
+
## 0.29.0
|
|
316
|
+
|
|
317
|
+
### Patch Changes
|
|
318
|
+
|
|
319
|
+
- @ykurilov/agent-chat-core@0.29.0
|
|
320
|
+
- @ykurilov/agent-chat-react@0.29.0
|
|
321
|
+
|
|
322
|
+
## 0.28.0
|
|
323
|
+
|
|
324
|
+
### Patch Changes
|
|
325
|
+
|
|
326
|
+
- Updated dependencies [11c3c97]
|
|
327
|
+
- Updated dependencies [d63ccaa]
|
|
328
|
+
- Updated dependencies [6a2f903]
|
|
329
|
+
- Updated dependencies [189cba9]
|
|
330
|
+
- @ykurilov/agent-chat-core@0.28.0
|
|
331
|
+
- @ykurilov/agent-chat-react@0.28.0
|
|
332
|
+
|
|
333
|
+
## 0.27.0
|
|
334
|
+
|
|
335
|
+
### Patch Changes
|
|
336
|
+
|
|
337
|
+
- Updated dependencies [d8341b2]
|
|
338
|
+
- Updated dependencies [5e4ed28]
|
|
339
|
+
- Updated dependencies [e0bb519]
|
|
340
|
+
- @ykurilov/agent-chat-core@0.27.0
|
|
341
|
+
- @ykurilov/agent-chat-react@0.27.0
|
|
342
|
+
|
|
343
|
+
## 0.26.2
|
|
344
|
+
|
|
345
|
+
### Patch Changes
|
|
346
|
+
|
|
347
|
+
- Updated dependencies [f24858a]
|
|
348
|
+
- @ykurilov/agent-chat-core@0.26.2
|
|
349
|
+
- @ykurilov/agent-chat-react@0.26.2
|
|
350
|
+
|
|
351
|
+
## 0.26.1
|
|
352
|
+
|
|
353
|
+
### Patch Changes
|
|
354
|
+
|
|
355
|
+
- Updated dependencies [5b52515]
|
|
356
|
+
- @ykurilov/agent-chat-react@0.26.1
|
|
357
|
+
- @ykurilov/agent-chat-core@0.26.1
|
|
358
|
+
|
|
359
|
+
## 0.26.0
|
|
360
|
+
|
|
361
|
+
### Patch Changes
|
|
362
|
+
|
|
363
|
+
- Updated dependencies [eb43e47]
|
|
364
|
+
- @ykurilov/agent-chat-core@0.26.0
|
|
365
|
+
- @ykurilov/agent-chat-react@0.26.0
|
|
366
|
+
|
|
367
|
+
## 0.25.0
|
|
368
|
+
|
|
369
|
+
### Patch Changes
|
|
370
|
+
|
|
371
|
+
- Updated dependencies [99d426e]
|
|
372
|
+
- Updated dependencies [d8201f6]
|
|
373
|
+
- @ykurilov/agent-chat-core@0.25.0
|
|
374
|
+
- @ykurilov/agent-chat-react@0.25.0
|
|
375
|
+
|
|
376
|
+
## 0.24.0
|
|
377
|
+
|
|
378
|
+
### Minor Changes
|
|
379
|
+
|
|
380
|
+
- 9b895cd: Ломает приложения: только исчерпывающие `switch` по видам ошибок сервера и событиям чата (новые значения) и код, который
|
|
381
|
+
сам читает ответ `resolveUser`. Без новых настроек поведение прежнее.
|
|
382
|
+
|
|
383
|
+
Агент внутри продукта: агент работает с объектами приложения — уроком, заказом, документом. Всё по желанию; без новых
|
|
384
|
+
настроек запрос к модели не меняется ни на байт. Подробно — `docs/in-product-agent.md`.
|
|
385
|
+
|
|
386
|
+
- **Проверка перед ходом.** `beforeTurn({ userId, chat, action, text? })` отказывает своими словами: 403 `turn_refused`
|
|
387
|
+
до любых записей и лимитов, на отправке, правке, повторе, переделке, подтверждении, виджете, служебных сообщениях, фоновой
|
|
388
|
+
задаче и в мессенджерах. `resolveUser` может вернуть `{ refused: { code, message, status? } }` → `access_refused` на всех
|
|
389
|
+
адресах чата, голоса, голосового режима (WebSocket 4401) и мессенджеров. React: `onTurnRefused`, текст отказа вместо «нет
|
|
390
|
+
связи», сообщение возвращается в поле. Ручная проверка — `service.assertTurnAllowed`.
|
|
391
|
+
- **Итог хода.** `afterTurn(turn)` после каждого хода с повторами и сроком (`afterTurnAttempts`, `afterTurnTimeoutMs`),
|
|
392
|
+
переживает перезапуск сервера. `TurnResult`: владелец и автор хода, текст, части, расход, действие, канал, объект,
|
|
393
|
+
сотрудник. События приложения `{ type, data? }` — из хука, из инструмента (`model.emitAppEvent`) и вне хода
|
|
394
|
+
(`service.publishAppEvent`); в React `appEvents` и `onAppEvent`, события переживают перезагрузку. Модели не уходят.
|
|
395
|
+
- **Чат объекта.** Ключ и данные объекта у чата, один чат на ключ у человека: `service.openSubjectChat`, на сервере
|
|
396
|
+
`subjectChats` (`POST …/subject`), в React `<AgentChat subject="lesson:42" />`. Данные объекта видят `beforeTurn`,
|
|
397
|
+
инструменты (`model.subject`) и `afterTurn`; в браузер и модели не уходят.
|
|
398
|
+
- **Приветствие.** `greeting: { text }` — первое сообщение от агента без вызова модели. Проверено на всех моделях каталога.
|
|
399
|
+
- **Лимит сообщений.** Окно лимитов с `limitMessages` вместо `limitUsd`, `exemptUsers` — люди без лимитов,
|
|
400
|
+
`onMessageThreshold` — пороги. Отказ — 429 с `unit: "messages"`.
|
|
401
|
+
- **Импорт старой переписки.** `service.importChat({ ownerId, chat, messages })` с датами и картинками
|
|
402
|
+
(`attachments.importFile`), без хода, памяти, расхода и лимитов.
|
|
403
|
+
- **Сотрудник проверяет чат человека.** Песочница с опцией `people`: админ видит чаты человека только на чтение и
|
|
404
|
+
проверяет ответы в копии у себя. Память человека в копии только читается, расход — на админа, человек ничего не видит.
|
|
405
|
+
Инструменты приложения получают `model.staff` и в копии в данные человека не пишут.
|
|
406
|
+
- **Свои кнопки у поля ввода.** `composerActions` с помощником `{ value, setValue, send, addFiles, busy, blocked, canSend }`.
|
|
407
|
+
Договор скина v19: `Composer.actions`; скин v18 работает без кнопок, Тандем готов.
|
|
408
|
+
- **Хранилища.** Миграции применяются сами: SQLite `0015`, PostgreSQL `0014` (ключ объекта, состояние хука итога).
|
|
409
|
+
|
|
410
|
+
### Что может сломаться
|
|
411
|
+
|
|
412
|
+
- **Исчерпывающие `switch` по закрытым спискам.** Новые значения: вид ошибки сервера `turn_refused` и `access_refused`
|
|
413
|
+
(`HandlerErrorKind`), события чата `after-turn-failed` и `app-event` (`ChatEvent`), `unit` у отказа лимита. Добавьте ветки
|
|
414
|
+
и надписи.
|
|
415
|
+
- **Список чатов без чатов объектов.** `listChats` и `GET {basePath}` по умолчанию не показывают чаты с ключом объекта.
|
|
416
|
+
Касается только приложений, которые начнут ими пользоваться; показать — `chatList: { subjectChats: true }` или
|
|
417
|
+
`listChats(userId, { subjects: "include" })`.
|
|
418
|
+
- **Свой `resolveUser` в обёртках.** Тип ответа — `ResolvedUser` (`{ id } | { refused } | null`). Код, который сам вызывает
|
|
419
|
+
`resolveUser` и читает `.id`, сначала проверяет `"refused" in user`.
|
|
420
|
+
- **Своё хранилище.** Для новых возможностей нужны необязательные методы (`findChatBySubject`, `importChat`,
|
|
421
|
+
`setAfterTurnState`, `listPendingAfterTurn`); без них эти возможности при включении дают ошибку при старте, остальное
|
|
422
|
+
работает. `listChats(ownerId, options?)` получил второй параметр — чаты с ключом скрывать по умолчанию.
|
|
423
|
+
- **Свой `ChatService`** (заглушки в тестах) добавляет новые методы: `openSubjectChat`, `importChat`, `assertTurnAllowed`, `peekHistory`,
|
|
424
|
+
`publishAppEvent`.
|
|
425
|
+
- **Своя реализация `SpendingLimits`** может добавить `takeMessage` — без него сообщения не считаются.
|
|
426
|
+
- **`AgentChat`: `chatId` стал необязательным** — нужен ровно один из `chatId` и `subject`; ни одного или оба — ошибка при
|
|
427
|
+
рендере. При смене `chatId` чат пересоздаётся: черновик и состояние прошлого чата не переносятся.
|
|
428
|
+
- **Окна лимитов: `limitUsd` стал необязательным** (у окна сообщений его нет). Код, который читает свои окна, проверяет
|
|
429
|
+
`limitMessages`.
|
|
430
|
+
- **Отказ сервера в React** (`ServerRefusal`) получил `kind` и `code`. 401 со словами приложения (`access_refused`) — это
|
|
431
|
+
отказ, а не «вход истёк».
|
|
432
|
+
- **«Пустой чат»** для «Нового чата»: чат объекта пустым не считается, обычный чат с одним приветствием — считается.
|
|
433
|
+
- Новый подпуть `@ykurilov/agent-chat-core/access` — помощники отказа в доступе для своих обработчиков.
|
|
434
|
+
|
|
435
|
+
### Как обновить приложение
|
|
436
|
+
|
|
437
|
+
1. `pnpm up "@ykurilov/agent-chat-*@^0.24.0"`. Миграции базы применяются сами при открытии хранилища.
|
|
438
|
+
2. Исчерпывающие `switch` по `HandlerErrorKind` (сервер) и `ChatEvent` (`chatEvents` ядра): найдите их поиском и добавьте
|
|
439
|
+
ветки `turn_refused`, `access_refused`, `after-turn-failed`, `app-event`. Обязательных надписей не прибавилось: текст
|
|
440
|
+
отказа приходит с сервера. Свой словарь для лимита сообщений — необязательные `spendingMessagesLeft`,
|
|
441
|
+
`spendingMessagesExhausted`, `editMessageLimit`.
|
|
442
|
+
|
|
443
|
+
Было: `switch (event.type) { case "tasks-changed": … case "notice-added": … default: assertNever(event) }`
|
|
444
|
+
Стало: те же ветки плюс `case "after-turn-failed": case "app-event": break;`
|
|
445
|
+
3. Свой код, который сам зовёт `resolveUser` и читает `.id`: сначала `if (user && "refused" in user) …`.
|
|
446
|
+
4. Ничего больше не нужно, если новые возможности не включать. Чтобы включить — `docs/in-product-agent.md`.
|
|
447
|
+
5. Свой скин: кнопки у поля появятся, когда `Composer` начнёт рисовать `actions` (договор v19, `docs/skin-v19.md`).
|
|
448
|
+
6. Проверка: `pnpm typecheck` без ошибок, чат открывается и отвечает как раньше.
|
|
449
|
+
|
|
450
|
+
### Patch Changes
|
|
451
|
+
|
|
452
|
+
- Updated dependencies [9b895cd]
|
|
453
|
+
- @ykurilov/agent-chat-core@0.24.0
|
|
454
|
+
- @ykurilov/agent-chat-react@0.24.0
|
|
455
|
+
|
|
456
|
+
## 0.23.0
|
|
457
|
+
|
|
458
|
+
### Patch Changes
|
|
459
|
+
|
|
460
|
+
- Updated dependencies [30fb729]
|
|
461
|
+
- @ykurilov/agent-chat-react@0.23.0
|
|
462
|
+
- @ykurilov/agent-chat-core@0.23.0
|
|
463
|
+
|
|
464
|
+
## 0.22.0
|
|
465
|
+
|
|
466
|
+
### Patch Changes
|
|
467
|
+
|
|
468
|
+
- @ykurilov/agent-chat-core@0.22.0
|
|
469
|
+
- @ykurilov/agent-chat-react@0.22.0
|
|
470
|
+
|
|
471
|
+
## 0.21.0
|
|
472
|
+
|
|
473
|
+
### Patch Changes
|
|
474
|
+
|
|
475
|
+
- Updated dependencies [7c3bcc4]
|
|
476
|
+
- @ykurilov/agent-chat-core@0.21.0
|
|
477
|
+
- @ykurilov/agent-chat-react@0.21.0
|
|
478
|
+
|
|
479
|
+
## 0.20.0
|
|
480
|
+
|
|
481
|
+
### Minor Changes
|
|
482
|
+
|
|
483
|
+
- fd16b01: Вложения и голос можно подключить к мессенджерам. У маршрутов `@ykurilov/agent-chat-attachments` появился `ingestFile` — файл из мессенджера становится вложением чата. `@ykurilov/agent-chat-voice/server` отдаёт `transcribeAudioFile` — голосовое сообщение превращается в текст через Soniox. Примеры обёрток — в README `@ykurilov/agent-chat-messengers`.
|
|
484
|
+
|
|
485
|
+
Что сделать в приложении: ничего, пока мессенджеры не подключены.
|
|
486
|
+
|
|
487
|
+
### Patch Changes
|
|
488
|
+
|
|
489
|
+
- Updated dependencies [fd16b01]
|
|
490
|
+
- Updated dependencies [fd16b01]
|
|
491
|
+
- @ykurilov/agent-chat-core@0.20.0
|
|
492
|
+
- @ykurilov/agent-chat-react@0.20.0
|
|
493
|
+
|
|
494
|
+
## 0.19.0
|
|
495
|
+
|
|
496
|
+
### Patch Changes
|
|
497
|
+
|
|
498
|
+
- Updated dependencies [fde2297]
|
|
499
|
+
- Updated dependencies [aa0fd51]
|
|
500
|
+
- Updated dependencies [6f26b93]
|
|
501
|
+
- Updated dependencies [9f94dbe]
|
|
502
|
+
- Updated dependencies [2013f15]
|
|
503
|
+
- Updated dependencies [aa0fd51]
|
|
504
|
+
- Updated dependencies [05e258b]
|
|
505
|
+
- Updated dependencies [aa0fd51]
|
|
506
|
+
- @ykurilov/agent-chat-core@0.19.0
|
|
507
|
+
- @ykurilov/agent-chat-react@0.19.0
|
|
508
|
+
|
|
509
|
+
## 0.18.6
|
|
510
|
+
|
|
511
|
+
### Patch Changes
|
|
512
|
+
|
|
513
|
+
- @ykurilov/agent-chat-core@0.18.6
|
|
514
|
+
- @ykurilov/agent-chat-react@0.18.6
|
|
515
|
+
|
|
516
|
+
## 0.18.5
|
|
517
|
+
|
|
518
|
+
### Patch Changes
|
|
519
|
+
|
|
520
|
+
- Updated dependencies [56b9ab6]
|
|
521
|
+
- @ykurilov/agent-chat-react@0.18.5
|
|
522
|
+
- @ykurilov/agent-chat-core@0.18.5
|
|
523
|
+
|
|
524
|
+
## 0.18.4
|
|
525
|
+
|
|
526
|
+
### Patch Changes
|
|
527
|
+
|
|
528
|
+
- @ykurilov/agent-chat-core@0.18.4
|
|
529
|
+
- @ykurilov/agent-chat-react@0.18.4
|
|
530
|
+
|
|
531
|
+
## 0.18.3
|
|
532
|
+
|
|
533
|
+
### Patch Changes
|
|
534
|
+
|
|
535
|
+
- Updated dependencies [ce3c26f]
|
|
536
|
+
- @ykurilov/agent-chat-react@0.18.3
|
|
537
|
+
- @ykurilov/agent-chat-core@0.18.3
|
|
538
|
+
|
|
539
|
+
## 0.18.2
|
|
540
|
+
|
|
541
|
+
### Patch Changes
|
|
542
|
+
|
|
543
|
+
- Updated dependencies [7e7e966]
|
|
544
|
+
- @ykurilov/agent-chat-react@0.18.2
|
|
545
|
+
- @ykurilov/agent-chat-core@0.18.2
|
|
546
|
+
|
|
547
|
+
## 0.18.1
|
|
548
|
+
|
|
549
|
+
### Patch Changes
|
|
550
|
+
|
|
551
|
+
- Updated dependencies [179ad9d]
|
|
552
|
+
- @ykurilov/agent-chat-react@0.18.1
|
|
553
|
+
- @ykurilov/agent-chat-core@0.18.1
|
|
554
|
+
|
|
555
|
+
## 0.18.0
|
|
556
|
+
|
|
557
|
+
### Patch Changes
|
|
558
|
+
|
|
559
|
+
- Updated dependencies [43d7ebe]
|
|
560
|
+
- @ykurilov/agent-chat-core@0.18.0
|
|
561
|
+
- @ykurilov/agent-chat-react@0.18.0
|
|
562
|
+
|
|
563
|
+
## 0.17.0
|
|
564
|
+
|
|
565
|
+
### Patch Changes
|
|
566
|
+
|
|
567
|
+
- Updated dependencies [e5d0860]
|
|
568
|
+
- @ykurilov/agent-chat-react@0.17.0
|
|
569
|
+
- @ykurilov/agent-chat-core@0.17.0
|
|
570
|
+
|
|
571
|
+
## 0.16.0
|
|
572
|
+
|
|
573
|
+
### Minor Changes
|
|
574
|
+
|
|
575
|
+
- cf52f10: **Ломает только исчерпывающие проверки:** у `UsageSource` появилось значение `images`, у видов ошибок сервера — `widget_not_pending` и `invalid_answer`, у `ChatService` — метод `answerWidget`. Своё хранилище должно поддержать условную запись `AwaitingMessagePatch.expectedParts` (при несовпадении частей — `MessageNotAwaitingError`; помощник `sameMessageParts` из core), иначе две копии сервера могут затереть ответы друг друга; общие тесты хранилищ это проверяют. Остальное необязательно, приложение без правок работает как раньше.
|
|
576
|
+
|
|
577
|
+
Что нового: агент может спросить кнопками, звёздами или формой (виджеты), нарисовать схему блоком ` ```mermaid ` и создать картинки через Runware. Всё включается отдельно:
|
|
578
|
+
|
|
579
|
+
- виджеты: `agent: { widgets: { basic: true, custom: [свойВиджет] } }`, свой виджет — `defineWidget` из core и компонент в `widgets={{ … }}` у `AgentChat`; ответ человека идёт на `POST /:chatId/widgets/:toolCallId`, ход ждёт со статусом `awaiting_approval`;
|
|
580
|
+
- схемы: новый пакет `@ykurilov/agent-chat-diagrams`, `agent: { diagrams: true }` на сервере и `diagrams={diagramsClient}` на странице;
|
|
581
|
+
- картинки: новый пакет `@ykurilov/agent-chat-images` (нужен пакет вложений и `RUNWARE_API_KEY`), `images.tools(model)` в `agent.tools`, `images={imagesClient}` на странице; свой срок ожидания (210 с) инструмент сообщает ядру сам (`declareToolTimeout`), расход бронируется до заказа (`assertWithinLimit({ pendingUsd })`);
|
|
582
|
+
- окно просмотра картинок и схем: Тандем готов, своему скину — необязательные части договора версии 13 (`Widget`, `SuggestedReplies`, `GeneratedImages`, `MediaViewer`, `diagramColors`, `renderDiagram`). `splitMermaidBlocks` экспортируется из react;
|
|
583
|
+
- вложения: `Attachments.storage` и `detectFileKind` экспортируются из пакета вложений;
|
|
584
|
+
- голосовой режим произносит вопрос и варианты ждущего виджета и говорит «схема на экране» вместо блока схемы;
|
|
585
|
+
- «Стоп» на экране закрывает висящие вызовы так же, как сервер, разрешённые без результата — «результат неизвестен» (`stoppedToolCallReasons.resultUnknown`);
|
|
586
|
+
- упавший свой виджет страницы заменяется запасным видом скина, лента цела.
|
|
587
|
+
|
|
588
|
+
Подробно: `docs/widgets.md`, `docs/diagrams.md`, `docs/images.md`, `docs/media-viewer.md`.
|
|
589
|
+
|
|
590
|
+
### Как обновить приложение
|
|
591
|
+
|
|
592
|
+
Обычному приложению на SQLite или PostgreSQL из набора делать ничего не нужно: миграций нет, всё новое включается отдельно.
|
|
593
|
+
|
|
594
|
+
1. Исчерпывающий `switch` по `UsageSource` — добавьте ветку `"images"`; по видам ошибок сервера — `"widget_not_pending"` и `"invalid_answer"`.
|
|
595
|
+
2. Своя реализация `ChatService` — добавьте метод `answerWidget({ chatId, ownerId, toolCallId, answer, page }): Promise<{ resumed: boolean }>` (тип `WidgetAnswerRequest` из core, образец — служба из core).
|
|
596
|
+
3. Своё хранилище: `updateAwaitingMessage` получает необязательное поле `expectedParts`. Если оно есть и части сообщения в базе с ним не совпадают (`sameMessageParts` из core), бросайте `MessageNotAwaitingError`; проверку и запись делайте в одной транзакции. Прогоните общие тесты хранилищ из core.
|
|
597
|
+
4. Своя обёртка `assertWithinLimit` из limits — пробрасывайте новое необязательное поле `pendingUsd`.
|
|
598
|
+
5. Проверка: `pnpm typecheck`, затем в чате отправить сообщение и получить ответ.
|
|
599
|
+
|
|
600
|
+
### Patch Changes
|
|
601
|
+
|
|
602
|
+
- Updated dependencies [cf52f10]
|
|
603
|
+
- @ykurilov/agent-chat-core@0.16.0
|
|
604
|
+
- @ykurilov/agent-chat-react@0.16.0
|
|
605
|
+
|
|
606
|
+
## 0.15.0
|
|
607
|
+
|
|
608
|
+
### Patch Changes
|
|
609
|
+
|
|
610
|
+
- Updated dependencies [f05ad23]
|
|
611
|
+
- Updated dependencies [f05ad23]
|
|
612
|
+
- @ykurilov/agent-chat-core@0.15.0
|
|
613
|
+
- @ykurilov/agent-chat-react@0.15.0
|
|
614
|
+
|
|
615
|
+
## 0.14.0
|
|
616
|
+
|
|
617
|
+
### Minor Changes
|
|
618
|
+
|
|
619
|
+
- 96098be: Мелкие исправления (022). Символ с кодом ноль в первом сообщении больше не роняет отправку на Postgres: он выбрасывается из названия чата, из записей памяти и из сводки сжатия истории (иначе запись сжатия падала бы при каждой попытке); в самом тексте сообщения он лежит как раньше. Вложения отмечаются прикреплёнными до записи сообщения, а не после: если сервер упал между двумя шагами, чистка брошенных файлов не удалит их через сутки (файл, отмеченный зря, безвреден и уходит вместе с чатом). Во всех пакетах появилось поле `engines: { node: ">=22" }`; голосовой сервер (`createVoiceRelay`) и голосовой диалог (`createDialogRelay`) на Node 20 сразу при создании говорят понятной ошибкой, что нужен Node 22 (раньше падали при первом соединении; со своим `connectUpstream` проверки нет). В пакете вложений `react` и `@ykurilov/agent-chat-react` стали необязательными peer-зависимостями: серверу без экрана они больше не ставятся. Приложению, которое берёт `@ykurilov/agent-chat-attachments/react`, достаточно иметь их в проекте — для чата на экране они нужны и так; если они подтягивались только через вложения, добавьте их в зависимости приложения.
|
|
620
|
+
- 84ad64f: Укрепление по третьему проходу Pi (022, этап S9). **Большие фото уменьшаются при загрузке**: поворот по EXIF, не больше 2000×2000 пикселей и ~4,5 МБ в base64; хранится уменьшенная копия, старые картинки ужимаются при сборке запроса (результат запоминается), нечитаемая картинка и картинка больше 60 млн пикселей — отказ 422 `unreadable` (в старой истории — пометка «пропущена»). Новая зависимость `sharp` (готовые сборки для macOS и Linux, в том числе Alpine; порядок ужатия из pi-mono, MIT). **Секреты в ошибке инструмента** вычищаются до того, как текст уйдёт человеку, в базу и модели: пароль в адресе, `password=`/`password: …`/`token=`, `"secret": "…"`, заголовок `Authorization`, `X-Api-Key`, ключи сервисов, закрытые ключи PEM и значения секретных переменных окружения (кроме путей, адресов без пароля и простых слов); чистятся сообщение, стек и `cause`; `scrubSecrets` и `environmentSecrets` экспортированы из ядра. **Внешние картинки** в ответе модели и в сводке сжатия скин Тандема показывает ссылкой и не грузит (новая необязательная надпись словаря `externalImageLink`, по умолчанию «картинка»; свои словари без неё работают); инструкция веб-инструментов называет страницы данными, а не указаниями. **Ступени цены** по длине контекста: `pricing.tiers` (`inputTokensAbove` и цены), ход считается по шагам; у GPT 6 Luna выше 272 тысяч токенов. Пауза в `useAgentChat` больше не копит слушатели отмены.
|
|
621
|
+
- 0cdf102: Несколько копий сервера на одной базе (022, этап 8в). Идущий ответ раз в 5 с отмечает «жив» (новая колонка `alive_at`: миграция SQLite `0012`, PostgreSQL `0011`, применяются сами). `recoverInterruptedAnswers` прерывает только брошенные ответы — без отметки дольше 15 с — и дальше сам проверяет их раз в 5 с до `flush`. Штатная остановка помечает свои ответы брошенными, и следующий старт прерывает их сразу. Новая копия при старте и обновление с перекрытием больше не обрывают живые ответы соседа; две копии, прервавшие один ответ, не задваивают расход. Цена: после падения сервера ответ ещё до ~20 с выглядит идущим (раньше перезапуск прерывал его сразу). Экран человека в это время сам перечитывает историю раз в 3 с и показывает «прерван» с «Повторить», как только сервер прервёт ответ; обновлять страницу не нужно (история отдаёт признак `detachedAnswer`, чтение истории сразу прерывает брошенный дольше порога ответ этого чата). Ход, чей ответ прервала другая копия, останавливается сам: человек видит «прерван», расход не задваивается. Время знака «жив» ставит хранилище: PostgreSQL — по часам базы, часы машин с копиями могут расходиться. Запросы одного чата держите на одной копии. Свои хранилища: два новых необязательных метода — `listSilentAnswerIds({ silentForMs, chatId? })` и лёгкая отметка `markAnswerAlive(messageId)` — и поле записи `alive` (`"now"` или `"released"`, время ставит само хранилище); общий набор контракта их проверяет. Хранилище без `listSilentAnswerIds` продолжает работать только с одной копией сервера: при старте `recoverInterruptedAnswers` прерывает все идущие ответы, проверок брошенных ответов дальше нет, а в журнал сервера пишется предупреждение. Без `markAnswerAlive` знак в тишине идёт полной записью ответа. Поле `alive` приходит в `insertMessage`, `updateStreamingMessage` и `updateAwaitingMessage`: если хранилище не ведёт знак, уберите поле перед записью, а не передавайте его в базу целиком. Переход на эту версию — один раз без перекрытия копий: старые копии не отмечают «жив», и новая прервала бы их ответы старше 15 с; сначала остановите все старые копии, потом запускайте новые. Дальше перекрытие безопасно. Если запрос истории попал не на ту копию, экран через 30 с сам покажет «прерван», хотя ответ идёт: держите запросы одного чата на одной копии. Сбой базы при конечной записи ответа повторяется через 1 и 3 с, а если не вышло — ответ остаётся для восстановления вместо вечного «идёт»; если запись прошла, а потерялся только ответ базы, повтор узнаёт свой итог и считает его удачным. Инструмент «по очереди», не слушающий отмену, после обрыва попытки держит очередь не дольше своего срока; очередь одна на чат, так что «Стоп» и сразу «Повторить» не запустят его второй раз параллельно. Восстановление пропускает ответ, на котором упало, с записью в журнал сервера, и прерывает остальные: битая запись не мешает серверу стартовать. Мелочи: адрес ответа вкладки на браузерный инструмент отвечает 413 `too_large` на слишком большое тело; неотвеченный запрос подтверждения закрывается только после сохранения нового сообщения, а если закрыть не вышло — повтор того же сообщения или «Повторить» доводят дело до конца; вызов веб-инструмента, оборванный «Стопом» или сбоем после отправки запроса, пишется в расход `web_tools`; картинки при загрузке ужимаются через очередь — разом не больше половины ядер (`limits.maxParallelImageFits`).
|
|
622
|
+
- 6b20d83: Голосовой режим («разговор»): человек говорит, слова сами уходят сообщением в чат, ответ агента звучит голосом, человека можно перебить. Новый пакет `@ykurilov/agent-chat-voice-dialog`: распознавание Soniox, озвучка ElevenLabs (голос по умолчанию «Профессиональный диктор для аудиокниг», модель `eleven_v4_turbo`), ключи только на сервере. Перебитый ответ остаётся в ленте с отметкой «Вы перебили: озвучено до «…»», она хранится и видна после перезагрузки. Расход на озвучку идёт в учёт и лимиты (`source: "speech"`). Человек выбирает голос в меню режима; выбор хранится на сервере.
|
|
623
|
+
|
|
624
|
+
Модель узнаёт о режиме двумя служебными пометками: одна при входе («ответы озвучиваются, отвечай коротко и разговорно»), одна при возврате к тексту («разговор снова текстом»). Они стоят в конце сообщения человека, где режим сменился, а не в каждом запросе. Сообщение из режима запоминается голосовым отметкой в самом сообщении (часть `data-voice-mode` в `parts`), поэтому миграции для этого нет, пометки выводятся из сохранённого и кэш модели цел. Тексты задают настройки агента `voiceModeHint` и `textModeNote` (есть умолчания).
|
|
625
|
+
|
|
626
|
+
Обновление ничего не ломает: без нового пакета чат работает как раньше. Диктовка в поле ввода (`@ykurilov/agent-chat-voice`) не меняется.
|
|
627
|
+
|
|
628
|
+
### Как обновить приложение
|
|
629
|
+
|
|
630
|
+
Нужно, только если вы хотите голосовой режим.
|
|
631
|
+
|
|
632
|
+
1. Поставьте пакет `@ykurilov/agent-chat-voice-dialog` той же версии, что и остальные пакеты SDK. Скин Тандем обновите вместе с SDK: договор скина теперь версии 10 (необязательный `dialog` у поля ввода, панель режима, меню голосов, отметка обрыва; свой скин может их не рисовать, тогда кнопки режима не будет).
|
|
633
|
+
2. Сервер. Рядом с чатом подключите режим (нужен WebSocket; с Hono и `@hono/node-ws`):
|
|
634
|
+
|
|
635
|
+
```ts
|
|
636
|
+
import { mountDialogRelay } from "@ykurilov/agent-chat-voice-dialog/hono";
|
|
637
|
+
|
|
638
|
+
mountDialogRelay(app, {
|
|
639
|
+
path: "/api/voice-dialog",
|
|
640
|
+
upgradeWebSocket,
|
|
641
|
+
storage,
|
|
642
|
+
resolveUser, // тот же вход, что у чата
|
|
643
|
+
spendingLimits, // по желанию
|
|
644
|
+
logError: (message) => console.error(message),
|
|
645
|
+
speech: {
|
|
646
|
+
voices: [{ id: "oE0n0S3wK5Mj9C62iehn", name: "Профессиональный диктор для аудиокниг" }],
|
|
647
|
+
defaultVoiceId: "oE0n0S3wK5Mj9C62iehn",
|
|
648
|
+
pricePerThousandChars: { eleven_v4_turbo: 0.11, eleven_v4: 0.22 }, // ваша цена, $ за 1000 знаков
|
|
649
|
+
},
|
|
650
|
+
});
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
Ключи `ELEVENLABS_API_KEY` и `SONIOX_API_KEY` — в окружении сервера. Next.js: WebSocket нужен свой Node-сервер, см. README пакета (`createDialogRelay`).
|
|
654
|
+
3. Браузер:
|
|
655
|
+
|
|
656
|
+
```tsx
|
|
657
|
+
const voiceDialog = createVoiceDialogEngine({ basePath: "/api/voice-dialog" });
|
|
658
|
+
<AgentChat api="/api/chat" skin={tandemSkin} voiceDialog={voiceDialog} />
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
4. Настройки. Слова остановки и междометия по умолчанию только русские; для другого языка задайте `bargeIn.stopWords` и `bargeIn.ignoreWords` у движка и `language` на сервере. Строгая политика содержимого страницы: добавьте `worklet-src blob:`.
|
|
662
|
+
5. Хранилище. SQLite получает миграцию 0008, PostgreSQL — 0007 (схема `agent_chat`) сами при открытии базы. Свой `ChatStorage`: добавьте необязательные методы `setVoiceCut`, `getVoiceChoice`, `setVoiceChoice` (без них отметка обрыва и выбор голоса живут только до перезагрузки) и значение `"speech"` в `UsageSource`, если учёт расхода у вас свой.
|
|
663
|
+
6. Свой экран (не наш скин): части сообщения с типом `data-voice-mode` не рисуйте, показывайте только текстовые части.
|
|
664
|
+
7. Проверка: `pnpm typecheck` проходит; в чате появилась кнопка режима, после нажатия виден статус «Слушаю», фраза уходит сообщением, ответ звучит.
|
|
665
|
+
|
|
666
|
+
### Patch Changes
|
|
667
|
+
|
|
668
|
+
- 8b59096: Настоящий расход оборванных ответов и надёжнее переходы между попытками (022, этап 8б). «Стоп» или обрыв посреди ответа у OpenRouter сначала записывается оценкой «примерно», а затем сервер в фоне узнаёт у OpenRouter настоящий расход генерации по её номеру и дописывает запись `answer_correction` — разницу с оценкой (может быть меньше нуля); сумма записей ответа становится точной. Не узнал за ~10 минут или сервер перезапустился — остаётся оценка. Свой провайдер подключает то же новым необязательным полем описания `generationUsage` (номер генерации из заголовков и запрос расхода по номеру). Запрос, открытый, но оборванный до первого куска, теперь оценивается входом; отказ провайдера — нет. Расход хода пишется по каждому провайдеру отдельно и по его цене: основной, с которого ушли на запасной, — по своему тарифу; восстановление после перезапуска делает так же и считает ступень цены у каждого шага (идущая запись несёт `usage.pendingSteps`). У каждой попытки хода своя отмена: переход к повтору, запасному провайдеру или автопродолжению отменяет инструменты старой попытки; запущенный инструмент из `sequentialTools` держит очередь до своего конца, так что новая попытка не запустит второе «спиши деньги» поверх первого. Фоновая память после ответа идёт к провайдеру, который ответил, а не к лежащему основному. Старые картинки ужимаются один раз: кэш решений ограничен памятью копий, а не 20 местами, и чат с десятками старых картинок не ужимает их заново на каждом шаге. Память под копии — новая настройка `createAttachments({ limits: { imageCacheBytes } })`, по умолчанию 128 МБ.
|
|
669
|
+
- Updated dependencies [4f33e85]
|
|
670
|
+
- Updated dependencies [15fbbcc]
|
|
671
|
+
- Updated dependencies [c09c1e2]
|
|
672
|
+
- Updated dependencies [41992d0]
|
|
673
|
+
- Updated dependencies [42d17cc]
|
|
674
|
+
- Updated dependencies [062ce36]
|
|
675
|
+
- Updated dependencies [5e99fb2]
|
|
676
|
+
- Updated dependencies [ecd63f8]
|
|
677
|
+
- Updated dependencies [656233a]
|
|
678
|
+
- Updated dependencies [96098be]
|
|
679
|
+
- Updated dependencies [b6f4855]
|
|
680
|
+
- Updated dependencies [278a718]
|
|
681
|
+
- Updated dependencies [c1581f4]
|
|
682
|
+
- Updated dependencies [213bcb3]
|
|
683
|
+
- Updated dependencies [927c02c]
|
|
684
|
+
- Updated dependencies [be77ee2]
|
|
685
|
+
- Updated dependencies [8b59096]
|
|
686
|
+
- Updated dependencies [7fbc105]
|
|
687
|
+
- Updated dependencies [84ad64f]
|
|
688
|
+
- Updated dependencies [5027963]
|
|
689
|
+
- Updated dependencies [c2769dd]
|
|
690
|
+
- Updated dependencies [0cdf102]
|
|
691
|
+
- Updated dependencies [ba16989]
|
|
692
|
+
- Updated dependencies [aba59fe]
|
|
693
|
+
- Updated dependencies [47a56ac]
|
|
694
|
+
- Updated dependencies [f9b6162]
|
|
695
|
+
- Updated dependencies [f9b6162]
|
|
696
|
+
- Updated dependencies [f9b6162]
|
|
697
|
+
- Updated dependencies [1b2f9f1]
|
|
698
|
+
- Updated dependencies [6335921]
|
|
699
|
+
- Updated dependencies [00965e1]
|
|
700
|
+
- Updated dependencies [0e8e0ae]
|
|
701
|
+
- Updated dependencies [6b20d83]
|
|
702
|
+
- Updated dependencies [1402afe]
|
|
703
|
+
- Updated dependencies [d12dcf3]
|
|
704
|
+
- Updated dependencies [366d785]
|
|
705
|
+
- Updated dependencies [946e5d8]
|
|
706
|
+
- @ykurilov/agent-chat-core@0.14.0
|
|
707
|
+
- @ykurilov/agent-chat-react@0.14.0
|
|
708
|
+
|
|
709
|
+
## 0.13.0
|
|
710
|
+
|
|
711
|
+
### Patch Changes
|
|
712
|
+
|
|
713
|
+
- Updated dependencies [4793e4d]
|
|
714
|
+
- @ykurilov/agent-chat-core@0.13.0
|
|
715
|
+
- @ykurilov/agent-chat-react@0.13.0
|
|
716
|
+
|
|
717
|
+
## 0.12.0
|
|
718
|
+
|
|
719
|
+
### Patch Changes
|
|
720
|
+
|
|
721
|
+
- @ykurilov/agent-chat-core@0.12.0
|
|
722
|
+
- @ykurilov/agent-chat-react@0.12.0
|
|
723
|
+
|
|
724
|
+
## 0.11.0
|
|
725
|
+
|
|
726
|
+
### Patch Changes
|
|
727
|
+
|
|
728
|
+
- Updated dependencies [9d510b8]
|
|
729
|
+
- @ykurilov/agent-chat-react@0.11.0
|
|
730
|
+
- @ykurilov/agent-chat-core@0.11.0
|
|
731
|
+
|
|
732
|
+
## 0.10.0
|
|
733
|
+
|
|
734
|
+
### Patch Changes
|
|
735
|
+
|
|
736
|
+
- Updated dependencies [4a76ff3]
|
|
737
|
+
- @ykurilov/agent-chat-core@0.10.0
|
|
738
|
+
- @ykurilov/agent-chat-react@0.10.0
|
|
739
|
+
|
|
740
|
+
## 0.9.0
|
|
741
|
+
|
|
742
|
+
### Patch Changes
|
|
743
|
+
|
|
744
|
+
- Updated dependencies [d07a1c3]
|
|
745
|
+
- @ykurilov/agent-chat-core@0.9.0
|
|
746
|
+
- @ykurilov/agent-chat-react@0.9.0
|
|
747
|
+
|
|
748
|
+
## 0.8.0
|
|
749
|
+
|
|
750
|
+
### Minor Changes
|
|
751
|
+
|
|
752
|
+
- a24c79d: **Ломает приложения:** у `ChatStorage` три новых обязательных метода (`listChats`, `renameChat`, `deleteChat`), у `AttachmentStorage` — один (`removeAllOfChat`), а у `ChatLabels` — 16 новых обязательных надписей `chatList*`. Приложения на готовых хранилищах и готовом словаре надписей ничего менять не должны; поломка только у своих реализаций.
|
|
753
|
+
|
|
754
|
+
Список чатов в боковой панели: создать чат, переименовать, удалить. Чат сам получает название по первому сообщению. Это расширение по желанию: приложение без `chatList` и без `ChatWorkspace` работает как раньше.
|
|
755
|
+
|
|
756
|
+
Что изменилось:
|
|
757
|
+
|
|
758
|
+
- `@ykurilov/agent-chat-core`: `createChatService` умеет `listChats(userId)`, `renameChat(userId, chatId, title)`, `deleteChat(userId, chatId)`. Название ставится по первому сообщению (до 60 знаков), вручную заданное не перезаписывается; длина названия до 100 знаков. Удаление настоящее: идущий ответ и сжатие останавливаются, затем убираются сообщения, записи сжатия, выбор веток, файлы вложений и сам чат. Чужой и несуществующий чат — одинаково `ChatNotFoundError`. Экспортируются `deriveChatTitle`, `normalizeChatTitle`, `InvalidChatTitleError`, тип `ChatListItem`. `Chat.title` необязательное. Набор проверок `describeChatStorageContract` расширен.
|
|
759
|
+
- `@ykurilov/agent-chat-server`: `createChatHandler({ chatList: true })` включает три адреса: `GET {basePath}` (список), `PATCH {basePath}/:id` с телом `{ title }`, `DELETE {basePath}/:id`. Без `chatList` эти адреса отвечают 404. Чужой чат — 404, неверное название — 400. Идущий ответ удалению не мешает: он останавливается. `409` при удалении — только если чат уже удаляется или в этот миг запускается ход; пока чат удаляется, сообщение, сжатие и вложения в него тоже получают `409`. Переименование `409` не даёт.
|
|
760
|
+
- `@ykurilov/agent-chat-storage-sqlite` и `@ykurilov/agent-chat-storage-postgres`: колонка `title` у чатов, методы `listChats`, `renameChat`, `deleteChat` (удаление в одной транзакции). Миграция сама заполняет названия старых чатов по их первому сообщению.
|
|
761
|
+
- `@ykurilov/agent-chat-attachments`: `AttachmentStorage` получил `removeAllOfChat(chatId)`; `createAttachments` отдаёт ядру `removeChatFiles`, и файлы удаляются вместе с чатом. Набор `describeAttachmentStorageContract` расширен.
|
|
762
|
+
- `@ykurilov/agent-chat-react`: компонент `ChatWorkspace` (список и открытый чат вместе), хук `useChatList`, у `AgentChat` необязательное `onBusyChange`. Договор скина версии 7: скин, который хочет работать с `ChatWorkspace`, дополнительно даёт `ChatWorkspace` и `ChatList` (тип `ChatListSkin`); договор самого чата не менялся. 16 новых надписей `chatList*` в словаре (`ChatLabels`).
|
|
763
|
+
- `@ykurilov/agent-chat-skin-tandem`: `TandemChatWorkspace` и `TandemChatList`. На широком экране список слева, на узком — панель по кнопке «Чаты».
|
|
764
|
+
|
|
765
|
+
### Как обновить приложение
|
|
766
|
+
|
|
767
|
+
Если список чатов не нужен, а хранилища и словарь надписей готовые, обновление ничего не требует.
|
|
768
|
+
|
|
769
|
+
Если у приложения своё `ChatStorage`:
|
|
770
|
+
|
|
771
|
+
1. Добавьте методы `listChats(ownerId)`, `renameChat(chatId, title | null)` и `deleteChat(chatId)`. Список — только чаты владельца, самые недавно менявшиеся первыми; `deleteChat` убирает сообщения, записи сжатия, выбор веток и чат одной транзакцией. Точные правила — в общем наборе проверок.
|
|
772
|
+
2. Храните название чата (`Chat.title`, необязательное) и проведите свою миграцию.
|
|
773
|
+
3. Проверка: `describeChatStorageContract` из `@ykurilov/agent-chat-core/storage-contract` проходит.
|
|
774
|
+
|
|
775
|
+
Если у приложения своё `AttachmentStorage`: добавьте `removeAllOfChat(chatId): Promise<number>` (удалить все файлы чата, вернуть сколько) и прогоните `describeAttachmentStorageContract`.
|
|
776
|
+
|
|
777
|
+
Если у приложения свой полный словарь надписей (`ChatLabels` целиком, а не `{ ...russianLabels, … }`): добавьте 16 новых ключей, иначе `pnpm typecheck` упадёт. Простые строки: `chatListHeading` («Чаты»), `chatListNewChat` («Новый чат»), `chatListUntitled` («Новый чат»), `chatListLoading`, `chatListLoadFailed`, `chatListCreateFailed`, `chatListRenameFailed`, `chatListDeleteFailed`, `chatListRename`, `chatListRenameField`, `chatListDelete`, `chatListDeleteTitle`, `chatListDeleteConfirm`, `chatListDeleteCancel`. Функции от названия чата: `chatListRowMenu(title)` («Действия с чатом …») и `chatListDeleteBody(title)`.
|
|
778
|
+
Было: `const labels: ChatLabels = { …прежние надписи }`. Стало: те же надписи плюс 16 новых; проще всего `{ ...russianLabels, …свои }`.
|
|
779
|
+
|
|
780
|
+
Чтобы включить список чатов:
|
|
781
|
+
|
|
782
|
+
1. Сервер: `createChatHandler({ …, chatList: true })`. Базы SQLite и PostgreSQL обновятся сами при открытии.
|
|
783
|
+
2. Браузер: вместо `<AgentChat api chatId … />` — `<ChatWorkspace api="/api/chat" skin={tandemSkin} … />` (те же остальные свойства, кроме `chatId`). Открытый чат приложение может показывать в адресе: `initialChatId` и `onChatChange`.
|
|
784
|
+
3. Если скин свой: добавьте `ChatWorkspace` и `ChatList` по договору версии 7 (`ChatListSkin`). Скин Тандема обновляется вместе с пакетом.
|
|
785
|
+
4. Если приложение само создавало чат кнопкой «Новый чат», уберите её: «Новый чат» теперь в списке.
|
|
786
|
+
5. Проверка: `pnpm typecheck` (ловит недостающие методы хранилищ и надписи); в списке видны чаты пользователя, «Новый чат» открывает пустой чат, после первого сообщения чат получает название, переименование и удаление (с подтверждением) работают.
|
|
787
|
+
|
|
788
|
+
### Patch Changes
|
|
789
|
+
|
|
790
|
+
- Updated dependencies [a24c79d]
|
|
791
|
+
- @ykurilov/agent-chat-core@0.8.0
|
|
792
|
+
- @ykurilov/agent-chat-react@0.8.0
|
|
793
|
+
|
|
794
|
+
## 0.7.0
|
|
795
|
+
|
|
796
|
+
### Minor Changes
|
|
797
|
+
|
|
798
|
+
- 7c205c4: Новый пакет `@ykurilov/agent-chat-attachments`: вложения к сообщению. В поле ввода появляются скрепка, перетаскивание и вставка файлов из буфера, превью с удалением; в ленте у сообщения — миниатюры картинок и плашки файлов. Картинки, PDF и текстовые файлы; тип определяется по содержимому.
|
|
799
|
+
|
|
800
|
+
Что изменилось:
|
|
801
|
+
|
|
802
|
+
- `@ykurilov/agent-chat-attachments`: `createAttachments({ storage, limits? })`, хранилища файлов `createDiskAttachmentStorage({ directory })` и `createMemoryAttachmentStorage()`, `attachmentsInstructions`, общий набор проверок своего хранилища `describeAttachmentStorageContract` (подпуть `/storage-contract`). Подпуть `/react`: `attachmentsClient`. Пределы по умолчанию: 10 файлов, 20 МБ на файл, потолок извлечённого текста; меняются в `limits`.
|
|
803
|
+
- Картинки уходят только моделям с `acceptsImages`; если модель не видит, человек узнаёт об этом до отправки. Текст PDF и текстовых файлов достаётся на сервере и идёт любой модели. Кэш модели не страдает: извлечённый текст не меняется от хода к ходу.
|
|
804
|
+
- `@ykurilov/agent-chat-core`: `createChatHandler`/`createChatService` принимают необязательное `attachments`; меню моделей несёт `acceptsImages`; задание сжатия просит назвать прикреплённые файлы в сводке (оригиналы остаются). Без `attachments` файлы в сообщении отклоняются.
|
|
805
|
+
- `@ykurilov/agent-chat-server`: новые адреса под адресом чата: `GET /attachments/settings`, `POST /:chatId/attachments`, `GET` и `DELETE /:chatId/attachments/:id`.
|
|
806
|
+
- `@ykurilov/agent-chat-react`: `AgentChat` принимает необязательное `attachments`. Договор скина версии 5: `Composer` и `UserMessage` получают необязательное `attachments`, у моделей в `ModelChoiceView` появилось необязательное `acceptsImages`.
|
|
807
|
+
- `@ykurilov/agent-chat-skin-tandem`: скрепка, превью, миниатюры и плашки файлов. Встроенный микрофон полного поля Тандема спрятан: голос — отдельная кнопка (пакет `voice`).
|
|
808
|
+
- Разбор PDF идёт в отдельном потоке с потолком памяти и сроком: зависший или «раздутый» файл обрывается, сервер живёт дальше; текст собирается до потолка символов.
|
|
809
|
+
- Лимиты на человека: `maxUnsentFiles` (30), `maxUnsentBytes` (200 МБ), `maxParallelUploads` (8), `maxParallelUploadsPerUser` (3); отказы 429 `too_many_unsent` и `busy`. Файлы с ошибкой в лимит не входят. Тело загрузки читается потоком без лишних копий. Поле ввода грузит файлы по два одновременно, остальные ждут в очереди, а на отказ `busy` повторяет несколько раз.
|
|
810
|
+
- Диск чистит недописанные остатки (`.tmp` и `.bin` без описания) по возрасту; неотправленные файлы убираются через 24 часа, прикреплённые не трогаются. Просроченный файл возвращается в поле с пометкой «загрузите снова».
|
|
811
|
+
- Файл помечается «прикреплён» только после записи сообщения (`confirmUserParts` в контракте `MessageAttachments`; `acceptUserParts` файлы не помечает). Отказ отправки возвращает текст и файлы в поле, повторный клик не очищает его раньше времени. Контракт `AttachmentsController` в `@ykurilov/agent-chat-react`: вместо `takeFiles` — `readFiles`, `markSent`, `restoreFiles`; `useAgentChat.submit` возвращает признак «принято».
|
|
812
|
+
- Текстовые логи с цветовыми кодами терминала (ANSI) принимаются как текст, коды убираются. Закрывающий тег `</attachment>` в тексте файла обезвреживается без учёта регистра.
|
|
813
|
+
- `MessageAttachments.instructions`: ядро само дописывает инструкцию про вложения к инструкции агента (один раз, дубль не появляется). Вручную `attachmentsInstructions` добавлять больше не нужно, но и не вредно.
|
|
814
|
+
- `@ykurilov/agent-chat-skin-tandem`: пока грузится список моделей, в поле со вложениями нет пустой кнопки «Выберите модель».
|
|
815
|
+
- Схема базы чата не меняется, миграции не нужны.
|
|
816
|
+
|
|
817
|
+
### Как обновить приложение
|
|
818
|
+
|
|
819
|
+
Если вложения не нужны, обновление ничего не требует: без `attachments` чат работает как раньше.
|
|
820
|
+
|
|
821
|
+
Чтобы включить вложения:
|
|
822
|
+
|
|
823
|
+
1. `pnpm add @ykurilov/agent-chat-attachments`.
|
|
824
|
+
2. На сервере: `const attachments = createAttachments({ storage: createDiskAttachmentStorage({ directory: "./data/attachments" }) })`, передайте `attachments` в `createChatHandler` и инструкцию агенту про вложения ядро добавляет само. Папку с файлами включите в резервные копии вместе с базой.
|
|
825
|
+
3. В браузере: `<AgentChat … attachments={attachmentsClient} />` (`attachmentsClient` из `@ykurilov/agent-chat-attachments/react`).
|
|
826
|
+
4. Если скин свой: `Composer` получает `attachments` (скрепка, превью, `notice`), `UserMessage` — `attachments` (миниатюры и плашки). Нет свойства — ничего про вложения не рисовать. Свой скин на `@ykurilov/agent-chat-skin-tandem` обновляется вместе с пакетом.
|
|
827
|
+
5. Проверка: `pnpm typecheck`; в поле ввода есть скрепка, картинка и PDF прикрепляются, в ленте видны миниатюра и плашка, агент отвечает по содержимому.
|
|
828
|
+
|
|
829
|
+
### Patch Changes
|
|
830
|
+
|
|
831
|
+
- Updated dependencies [b8f9e9f]
|
|
832
|
+
- Updated dependencies [7c205c4]
|
|
833
|
+
- Updated dependencies [e741e6d]
|
|
834
|
+
- @ykurilov/agent-chat-core@0.7.0
|
|
835
|
+
- @ykurilov/agent-chat-react@0.7.0
|