@ykurilov/agent-chat-memory 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 +648 -0
- package/LICENSE +21 -0
- package/README.md +136 -2
- package/dist/chunk-VOET63ER.js +55 -0
- package/dist/chunk-VOET63ER.js.map +1 -0
- package/dist/index.js +647 -0
- package/dist/index.js.map +1 -0
- package/dist/labels.js +15 -0
- package/dist/labels.js.map +1 -0
- package/dist/types/create-long-term-memory.d.ts +37 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/instructions.d.ts +2 -0
- package/dist/types/manage-memory-tool.d.ts +4 -0
- package/dist/types/memory-block.d.ts +14 -0
- package/dist/types/memory-operations.d.ts +41 -0
- package/dist/types/note-rules.d.ts +33 -0
- package/dist/types/optimizer/merge-history.d.ts +27 -0
- package/dist/types/optimizer/merge-plan.d.ts +43 -0
- package/dist/types/optimizer/propose-merges.d.ts +26 -0
- package/dist/types/optimizer/protected-details.d.ts +11 -0
- package/dist/types/optimizer/run-optimization.d.ts +45 -0
- package/dist/types/owner-lock.d.ts +4 -0
- package/dist/types/search-notes.d.ts +7 -0
- package/dist/types/tool-titles.d.ts +24 -0
- package/package.json +45 -3
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
# @ykurilov/agent-chat-memory
|
|
2
|
+
|
|
3
|
+
## 0.56.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [24c313e]
|
|
8
|
+
- @ykurilov/agent-chat-core@0.56.0
|
|
9
|
+
|
|
10
|
+
## 0.55.0
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Updated dependencies [51f7b38]
|
|
15
|
+
- Updated dependencies [cdc7dd7]
|
|
16
|
+
- @ykurilov/agent-chat-core@0.55.0
|
|
17
|
+
|
|
18
|
+
## 0.54.0
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- Updated dependencies [fa90219]
|
|
23
|
+
- @ykurilov/agent-chat-core@0.54.0
|
|
24
|
+
|
|
25
|
+
## 0.53.0
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- Updated dependencies [b6a7786]
|
|
30
|
+
- @ykurilov/agent-chat-core@0.53.0
|
|
31
|
+
|
|
32
|
+
## 0.52.0
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- @ykurilov/agent-chat-core@0.52.0
|
|
37
|
+
|
|
38
|
+
## 0.51.0
|
|
39
|
+
|
|
40
|
+
### Patch Changes
|
|
41
|
+
|
|
42
|
+
- Updated dependencies [41b1726]
|
|
43
|
+
- @ykurilov/agent-chat-core@0.51.0
|
|
44
|
+
|
|
45
|
+
## 0.50.0
|
|
46
|
+
|
|
47
|
+
### Patch Changes
|
|
48
|
+
|
|
49
|
+
- @ykurilov/agent-chat-core@0.50.0
|
|
50
|
+
|
|
51
|
+
## 0.49.0
|
|
52
|
+
|
|
53
|
+
### Patch Changes
|
|
54
|
+
|
|
55
|
+
- Updated dependencies [084cef7]
|
|
56
|
+
- @ykurilov/agent-chat-core@0.49.0
|
|
57
|
+
|
|
58
|
+
## 0.48.0
|
|
59
|
+
|
|
60
|
+
### Patch Changes
|
|
61
|
+
|
|
62
|
+
- Updated dependencies [fa10d5a]
|
|
63
|
+
- @ykurilov/agent-chat-core@0.48.0
|
|
64
|
+
|
|
65
|
+
## 0.47.0
|
|
66
|
+
|
|
67
|
+
### Patch Changes
|
|
68
|
+
|
|
69
|
+
- Updated dependencies [5a59c33]
|
|
70
|
+
- @ykurilov/agent-chat-core@0.47.0
|
|
71
|
+
|
|
72
|
+
## 0.46.2
|
|
73
|
+
|
|
74
|
+
### Patch Changes
|
|
75
|
+
|
|
76
|
+
- Updated dependencies [3d0d2f2]
|
|
77
|
+
- @ykurilov/agent-chat-core@0.46.2
|
|
78
|
+
|
|
79
|
+
## 0.46.1
|
|
80
|
+
|
|
81
|
+
### Patch Changes
|
|
82
|
+
|
|
83
|
+
- @ykurilov/agent-chat-core@0.46.1
|
|
84
|
+
|
|
85
|
+
## 0.46.0
|
|
86
|
+
|
|
87
|
+
### Patch Changes
|
|
88
|
+
|
|
89
|
+
- Updated dependencies [56d7528]
|
|
90
|
+
- Updated dependencies [a1933fd]
|
|
91
|
+
- Updated dependencies [52cc67d]
|
|
92
|
+
- @ykurilov/agent-chat-core@0.46.0
|
|
93
|
+
|
|
94
|
+
## 0.45.0
|
|
95
|
+
|
|
96
|
+
### Minor Changes
|
|
97
|
+
|
|
98
|
+
- eb74c58: Простой вид работы агента: свойство экрана `workView="simple"` — пока ход идёт, одна живая строка с текущим шагом
|
|
99
|
+
(«Рисую календарь…»); после хода шаги свёрнуты в «Сделано N шагов» со списком понятных фраз, без кода и «Думал N сек».
|
|
100
|
+
По умолчанию `workView="detailed"` — всё как раньше. Фразы задаёт приложение (`stepPhrases`: имя инструмента →
|
|
101
|
+
`{ running, done, failed? }` или функция от вызова); встроенные пакеты дают свои во входе `./labels`
|
|
102
|
+
(`webToolStepPhrases`, `memoryStepPhrases`, `historySearchStepPhrases`, `backgroundStepPhrases`, и английские).
|
|
103
|
+
Договор скина 23: необязательный `ChatSkin.WorkSteps`; скин 22 работает без правок. Подробно — docs/work-view.md.
|
|
104
|
+
|
|
105
|
+
### Как обновить приложение
|
|
106
|
+
|
|
107
|
+
Ничего не требуется. Чтобы включить простой вид:
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
import { webToolStepPhrases } from "@ykurilov/agent-chat-web-tools/labels";
|
|
111
|
+
|
|
112
|
+
<ChatWorkspace
|
|
113
|
+
workView="simple"
|
|
114
|
+
stepPhrases={{
|
|
115
|
+
...webToolStepPhrases,
|
|
116
|
+
write_file: ({ input }) => ((input as { path?: string } | undefined)?.path ? { running: "Пишу файл", done: "Написал файл" } : undefined),
|
|
117
|
+
check_app: { running: "Проверяю приложение", done: "Проверил приложение" },
|
|
118
|
+
}}
|
|
119
|
+
…
|
|
120
|
+
/>;
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Свой скин может нарисовать простой вид сам — `WorkSteps` по docs/work-view.md (`WorkStepsView`: `live` с фразой или
|
|
124
|
+
`done` со `steps`, `count`, `open`). Без него шаги рисуются строкой `ToolCallRow`: «Сделано N шагов» в `title`, входа нет,
|
|
125
|
+
а список понятных фраз приходит в `output` строкой — скин покажет его как обычный результат вызова.
|
|
126
|
+
|
|
127
|
+
### Patch Changes
|
|
128
|
+
|
|
129
|
+
- @ykurilov/agent-chat-core@0.45.0
|
|
130
|
+
|
|
131
|
+
## 0.44.0
|
|
132
|
+
|
|
133
|
+
### Patch Changes
|
|
134
|
+
|
|
135
|
+
- Updated dependencies [6a2b5d9]
|
|
136
|
+
- @ykurilov/agent-chat-core@0.44.0
|
|
137
|
+
|
|
138
|
+
## 0.43.0
|
|
139
|
+
|
|
140
|
+
### Patch Changes
|
|
141
|
+
|
|
142
|
+
- Updated dependencies [763f4c5]
|
|
143
|
+
- @ykurilov/agent-chat-core@0.43.0
|
|
144
|
+
|
|
145
|
+
## 0.42.0
|
|
146
|
+
|
|
147
|
+
### Patch Changes
|
|
148
|
+
|
|
149
|
+
- Updated dependencies [a385276]
|
|
150
|
+
- @ykurilov/agent-chat-core@0.42.0
|
|
151
|
+
|
|
152
|
+
## 0.41.0
|
|
153
|
+
|
|
154
|
+
### Minor Changes
|
|
155
|
+
|
|
156
|
+
- 9472fcb: Поправка на лету и английский интерфейс.
|
|
157
|
+
|
|
158
|
+
- `onTurnFinished` в `AgentChat` приходит и для ответа, закрытого ради поправки, — перед ответом на поправку. Раньше
|
|
159
|
+
событие получал только последний ответ, и действия под первым (например, «Вернуть эту версию») не появлялись.
|
|
160
|
+
Событие есть, даже если продолжение по поправке не стартовало (лимит расходов, чужие ходы, чат закрыт).
|
|
161
|
+
**Внимание:** при поправке на ходу `onTurnFinished` теперь приходит на каждый ответ — обработчик, который сохраняет
|
|
162
|
+
снимок или считает ходы, увидит 2 события и больше.
|
|
163
|
+
- Продолжение после поправки получает `place` самой свежей поправки, где он есть, иначе начала хода: служебная заметка
|
|
164
|
+
приложения уже новая, а поправка только с `tabId` место не стирает. Вкладка и пояс — от последней поправки: браузерные
|
|
165
|
+
инструменты продолжения идут на её вкладку. Кэш цел — блок места ложится в хвост поправки.
|
|
166
|
+
- `englishLabels` — полный английский словарь чата. `englishAttachmentsLabels`, `englishWebToolTitles`,
|
|
167
|
+
`englishHistorySearchTitles`, `englishMemoryToolTitles` (два последних — и из корня пакета); `withWebToolTitles` и
|
|
168
|
+
соседи берут словарь названий вторым аргументом (по умолчанию русский).
|
|
169
|
+
|
|
170
|
+
Как обновить: поднять версию. Английский интерфейс — `<ChatLabelsProvider labels={englishLabels}>` и
|
|
171
|
+
`createAttachmentsClient(englishAttachmentsLabels)` вместо своих словарей.
|
|
172
|
+
|
|
173
|
+
### Patch Changes
|
|
174
|
+
|
|
175
|
+
- Updated dependencies [9472fcb]
|
|
176
|
+
- @ykurilov/agent-chat-core@0.41.0
|
|
177
|
+
|
|
178
|
+
## 0.40.0
|
|
179
|
+
|
|
180
|
+
### Patch Changes
|
|
181
|
+
|
|
182
|
+
- Updated dependencies [0e7aab3]
|
|
183
|
+
- @ykurilov/agent-chat-core@0.40.0
|
|
184
|
+
|
|
185
|
+
## 0.39.1
|
|
186
|
+
|
|
187
|
+
### Patch Changes
|
|
188
|
+
|
|
189
|
+
- @ykurilov/agent-chat-core@0.39.1
|
|
190
|
+
|
|
191
|
+
## 0.39.0
|
|
192
|
+
|
|
193
|
+
### Patch Changes
|
|
194
|
+
|
|
195
|
+
- Updated dependencies [3b90429]
|
|
196
|
+
- @ykurilov/agent-chat-core@0.39.0
|
|
197
|
+
|
|
198
|
+
## 0.38.0
|
|
199
|
+
|
|
200
|
+
### Patch Changes
|
|
201
|
+
|
|
202
|
+
- Updated dependencies [1cae504]
|
|
203
|
+
- Updated dependencies [4065a4a]
|
|
204
|
+
- @ykurilov/agent-chat-core@0.38.0
|
|
205
|
+
|
|
206
|
+
## 0.37.0
|
|
207
|
+
|
|
208
|
+
### Minor Changes
|
|
209
|
+
|
|
210
|
+
- ea78982: **Ломает приложения:** изменения памяти больше не доходят в уже идущий чат на каждом ходе — они придут, когда память прочитается заново (новый чат, сжатие истории и случаи ниже).
|
|
211
|
+
|
|
212
|
+
Память теперь ведёт себя как файл правил в Claude Code: читается один раз на чат. В идущем чате ядро не зовёт
|
|
213
|
+
`snapshot()` и `blocks()` памяти и не досылает модели ни новых, ни изменённых записей, ни строки «Больше не действует»
|
|
214
|
+
про удалённые. Запись, сделанную самим агентом, он видит в переписке как вызов инструмента.
|
|
215
|
+
|
|
216
|
+
Память читается заново: в новом чате; после сжатия истории (целиком, новые факты не теряются); при смене начала
|
|
217
|
+
истории — правке первого сообщения или «Переделать» первого ответа; в первом личном ходе после группового (групповой
|
|
218
|
+
ход память не читает); в ходе после сбоя чтения памяти. Чат из прошлой версии перечитает память один раз, при первом
|
|
219
|
+
ходе после обновления. Дата, место на экране и блоки `agent.contextBlocks` досылаются припиской,
|
|
220
|
+
как раньше. В служебной части ответа `data-frozen-context` новое необязательное поле `memoryFrom`.
|
|
221
|
+
|
|
222
|
+
### Как обновить приложение
|
|
223
|
+
|
|
224
|
+
1. Код менять не нужно: типы и настройки прежние.
|
|
225
|
+
2. Если приложение рассчитывало, что правка памяти на экране памяти или запись из другого чата сразу дойдёт до модели
|
|
226
|
+
в открытом чате, — теперь она дойдёт в новом чате. Нужна в идущем чате — дайте человеку начать новый чат или сожмите
|
|
227
|
+
историю (`service.compactNow(ownerId, chatId)`).
|
|
228
|
+
3. Свои тесты, которые ждут приписку памяти во втором ходе того же чата, поправьте: приписки больше нет; проверяйте
|
|
229
|
+
новый чат.
|
|
230
|
+
4. Своя обёртка памяти (`LongTermMemory`) с подсчётом вызовов `snapshot()`/`blocks()` на каждый ход: теперь вызов один
|
|
231
|
+
на чат и после сжатия.
|
|
232
|
+
5. Проверка: `pnpm typecheck` и тесты проходят; в новом чате модель видит свежую память.
|
|
233
|
+
|
|
234
|
+
### Patch Changes
|
|
235
|
+
|
|
236
|
+
- Updated dependencies [7f49d12]
|
|
237
|
+
- Updated dependencies [ea78982]
|
|
238
|
+
- @ykurilov/agent-chat-core@0.37.0
|
|
239
|
+
|
|
240
|
+
## 0.36.0
|
|
241
|
+
|
|
242
|
+
### Patch Changes
|
|
243
|
+
|
|
244
|
+
- Updated dependencies [3487fb4]
|
|
245
|
+
- Updated dependencies [8c43b86]
|
|
246
|
+
- Updated dependencies [6f42418]
|
|
247
|
+
- Updated dependencies [5f13c74]
|
|
248
|
+
- @ykurilov/agent-chat-core@0.36.0
|
|
249
|
+
|
|
250
|
+
## 0.35.0
|
|
251
|
+
|
|
252
|
+
### Minor Changes
|
|
253
|
+
|
|
254
|
+
- 2382026: **Ломает приложения:** память, сегодняшняя дата и место на экране больше не переезжают в последний вопрос на каждом
|
|
255
|
+
ходе. Они вписываются в вопрос того хода, где их прочитали, и дальше не меняются; набор хода хранится служебной частью
|
|
256
|
+
ответа `data-frozen-context`.
|
|
257
|
+
|
|
258
|
+
Что изменилось. Раньше блок памяти, дата и место стояли в конце последнего вопроса и на следующем ходе уезжали из него.
|
|
259
|
+
Из-за этого всё после старого вопроса (рассуждения, вызовы инструментов, их результаты) каждый ход читалось заново, мимо
|
|
260
|
+
кэша модели. Теперь блоки застывают там, где их показали, как в Claude Code. Следующий ход побайтно начинается с
|
|
261
|
+
последнего шага прошлого и читает всю переписку из кэша.
|
|
262
|
+
|
|
263
|
+
- **Изменения — только припиской.** В новый вопрос идут только изменившиеся блоки целиком и одна строка
|
|
264
|
+
`[Больше не действует: «ключ»]` про пропавшие. Ничего не менялось — вопрос без приписки.
|
|
265
|
+
- **Удалённая запись памяти** остаётся в старом вопросе, а в новом модель видит, что она больше не действует.
|
|
266
|
+
- **Запись, не влезшая в лимит памяти** (`maxBlockChars`), не считается удалённой. Модель, которая её уже видела,
|
|
267
|
+
получает строку `[Не показано ради места, но по-прежнему действует: «ключ»]` и находит её поиском. Так может любой
|
|
268
|
+
источник: элемент `{ key, hidden: true }` в списке блоков значит «блок есть, но не показан». Новый тип
|
|
269
|
+
`ContextBlockEntry = ContextBlock | HiddenContextBlock`.
|
|
270
|
+
- **Продолжение хода** (после подтверждения инструмента, автопродолжение, запасной провайдер, «Повторить») берёт блоки
|
|
271
|
+
из ответа и память заново не читает. Инструменты при этом получают свежее место (`model.place`), а модель видит
|
|
272
|
+
застывшее.
|
|
273
|
+
- **Память по записям.** `createLongTermMemory` отдаёт память блоками: шапка `<agent_memory>` (ключ `memory`) и по блоку
|
|
274
|
+
на запись (`memory:<id>`). Правка одной записи стоит одной строки, а не всего блока. Своя память может делать так же
|
|
275
|
+
через необязательный `LongTermMemory.blocks?({ userId, chatId })`; без него — один блок из `snapshot()`, как раньше.
|
|
276
|
+
Обёртка памяти в песочнице пробрасывает `blocks`. Счётчик «Показано агенту: N из M» считает записи, которые уходят
|
|
277
|
+
модели блоками.
|
|
278
|
+
- **Блоки приложения — `agent.contextBlocks`** (новое, по желанию). Приложение отдаёт список `{ key, text, private? }`:
|
|
279
|
+
скиллы, роль, правила. Он вписывается в вопрос после памяти и даты по тем же правилам:
|
|
280
|
+
|
|
281
|
+
```ts
|
|
282
|
+
agent: {
|
|
283
|
+
instructions,
|
|
284
|
+
contextBlocks: async ({ chatId, ownerId, chat, audience, abortSignal }) => [
|
|
285
|
+
{ key: "skills", text: `Скиллы агента: ${await skillsOf(ownerId, { signal: abortSignal })}` },
|
|
286
|
+
],
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
- Вход: `chatId`, `ownerId`, `messageId`, `chat.data`, `subject`, `channel`, `audience`, `staff`, `modelId`,
|
|
291
|
+
`providerId`, `abortSignal`. Данные и объект чата — копии.
|
|
292
|
+
- `private: true` — блок не показывается в групповом ходе (`audience: "group"`).
|
|
293
|
+
- Ключи `memory`, `memory:*`, `today`, `screen_place` заняты ядром. Такой блок, повтор ключа и пустой текст
|
|
294
|
+
отбрасываются, в `logError` строка `[блоки контекста] … отброшен`.
|
|
295
|
+
- `agent.contextBlocksTimeoutMs` — срок функции, по умолчанию 5000 мс; 0 или `Infinity` — без срока, иначе от 1000.
|
|
296
|
+
Не ответила или бросила — блоки приложения берутся из прошлого ответа чата, в `logError` строка
|
|
297
|
+
`[блоки контекста] … не ответил за N мс`. «Стоп» отменяет функцию сразу, без строки.
|
|
298
|
+
- Новые типы `ContextBlock`, `ContextBlocksInput`, `ContextBlocksSource`, `HiddenContextBlock`, `ContextBlockEntry`.
|
|
299
|
+
- **Кэш шагов у моделей с явными метками** (Claude, Gemini через OpenRouter). Со второго шага хода метка кэша стоит на
|
|
300
|
+
конце шага, до снимка `stepContext` и служебных пометок. Меток в запросе не больше трёх: инструкция, последнее
|
|
301
|
+
сообщение истории, конец шага. У провайдеров с автоматическим кэшем (DeepSeek, Fireworks, Together, GPT напрямую)
|
|
302
|
+
меток нет и запросы без лишних байтов. У Gemini через OpenRouter метка на самом конце запроса не работает (OpenRouter
|
|
303
|
+
её пропускает), поэтому у моделей `google/` она стоит на предпоследнем сообщении: конце прошлого хода или вызове
|
|
304
|
+
инструмента. У Claude через OpenRouter шаги с инструментами теперь пишутся в кэш (запись
|
|
305
|
+
дороже входа на 25%, при `cacheTtl: "1h"` — вдвое), а следующий ход читает их по цене чтения.
|
|
306
|
+
- **Журнал промахов кэша** (`[промах кэша]`) сравнивает первый шаг хода с последним шагом прошлого хода, без его
|
|
307
|
+
концовки (снимок, пометка попытки, пометка «подведи итог»).
|
|
308
|
+
- **Служебная часть `data-frozen-context`** не уходит в поток, историю (`getHistory`), `afterTurn` (`TurnResult.parts`) и
|
|
309
|
+
поиск по истории. Константа — `FROZEN_CONTEXT_PART_TYPE`. Миграций базы нет. Старый чат: первый ход после обновления
|
|
310
|
+
кладёт полный набор блоков в свой вопрос, прошлые вопросы остаются как были.
|
|
311
|
+
|
|
312
|
+
### Как обновить приложение
|
|
313
|
+
|
|
314
|
+
1. Найдите места, где приложение читает ответы прямо из хранилища (`storage.listMessages`, `storage.getMessage`, свой
|
|
315
|
+
SQL по таблице сообщений) и разбирает части ответа: показ, выгрузка, подсчёт, `parts[0]`. Теперь первой частью
|
|
316
|
+
ответа стоит служебная `data-frozen-context`. В ней память человека, дата и место, показывать её нельзя. Пропускайте
|
|
317
|
+
её:
|
|
318
|
+
|
|
319
|
+
Было:
|
|
320
|
+
|
|
321
|
+
```ts
|
|
322
|
+
const parts = message.parts;
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
Стало:
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
import { FROZEN_CONTEXT_PART_TYPE } from "@ykurilov/agent-chat-core";
|
|
329
|
+
|
|
330
|
+
const parts = message.parts.filter((part) => part.type !== FROZEN_CONTEXT_PART_TYPE);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
`service.getHistory`, поток, `afterTurn` и `@ykurilov/agent-chat-history-search` её уже не отдают: там ничего делать
|
|
334
|
+
не нужно.
|
|
335
|
+
2. Если у приложения есть свои тесты, которые сравнивают запрос к модели или его снимок (где стоит `<agent_memory>`,
|
|
336
|
+
«Сегодня: …», `<screen_place>`), обновите их. Блоки теперь в вопросе того хода, где их прочитали, а не в последнем
|
|
337
|
+
вопросе. Проверьте, что разница в снимке только в этом переносе.
|
|
338
|
+
3. Если приложение подставляло в вопрос свои сведения на каждом ходе (скиллы, роль) через инструкцию или `stepContext`,
|
|
339
|
+
а они меняются редко, перенесите их в `agent.contextBlocks`: кэш модели перестанет сбрасываться. Шаг по желанию.
|
|
340
|
+
4. Своя реализация `LongTermMemory` работает без правок. Если записей много и они часто меняются, добавьте метод
|
|
341
|
+
`blocks({ userId, chatId })`, который возвращает `[{ key: "memory", text: шапка, private: true }, { key: "memory:<id>",
|
|
342
|
+
text: запись, private: true }, …]`. Шаг по желанию.
|
|
343
|
+
5. Проверка. Временно запишите в `afterTurn` расход хода:
|
|
344
|
+
|
|
345
|
+
```ts
|
|
346
|
+
afterTurn: ({ messageId, usage }) => console.log("кэш", messageId, usage?.cachedInputTokens, "из", usage?.inputTokens),
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
В одном чате с моделью, которая сообщает о кэше (Claude или Gemini через OpenRouter, DeepSeek), задайте вопрос, на
|
|
350
|
+
который агент вызовет инструмент, и через полминуты — второй вопрос. Ожидается: на втором ходе `cachedInputTokens`
|
|
351
|
+
не меньше входа последнего шага первого хода, то есть почти весь вход прочитан из кэша. Строк `[промах кэша]` в
|
|
352
|
+
журнале сервера (`logError`) нет. На экране служебных блоков нет, агент помнит записи памяти.
|
|
353
|
+
|
|
354
|
+
### Patch Changes
|
|
355
|
+
|
|
356
|
+
- Updated dependencies [2382026]
|
|
357
|
+
- @ykurilov/agent-chat-core@0.35.0
|
|
358
|
+
|
|
359
|
+
## 0.34.0
|
|
360
|
+
|
|
361
|
+
### Patch Changes
|
|
362
|
+
|
|
363
|
+
- Updated dependencies [d039ce4]
|
|
364
|
+
- @ykurilov/agent-chat-core@0.34.0
|
|
365
|
+
|
|
366
|
+
## 0.33.0
|
|
367
|
+
|
|
368
|
+
### Patch Changes
|
|
369
|
+
|
|
370
|
+
- Updated dependencies [4a72339]
|
|
371
|
+
- @ykurilov/agent-chat-core@0.33.0
|
|
372
|
+
|
|
373
|
+
## 0.32.0
|
|
374
|
+
|
|
375
|
+
### Patch Changes
|
|
376
|
+
|
|
377
|
+
- Updated dependencies [71c32b7]
|
|
378
|
+
- Updated dependencies [cae13bf]
|
|
379
|
+
- Updated dependencies [a94bda9]
|
|
380
|
+
- Updated dependencies [4e44492]
|
|
381
|
+
- Updated dependencies [ac9b7d3]
|
|
382
|
+
- Updated dependencies [27f4b1e]
|
|
383
|
+
- @ykurilov/agent-chat-core@0.32.0
|
|
384
|
+
|
|
385
|
+
## 0.31.2
|
|
386
|
+
|
|
387
|
+
### Patch Changes
|
|
388
|
+
|
|
389
|
+
- @ykurilov/agent-chat-core@0.31.2
|
|
390
|
+
|
|
391
|
+
## 0.31.1
|
|
392
|
+
|
|
393
|
+
### Patch Changes
|
|
394
|
+
|
|
395
|
+
- @ykurilov/agent-chat-core@0.31.1
|
|
396
|
+
|
|
397
|
+
## 0.31.0
|
|
398
|
+
|
|
399
|
+
### Patch Changes
|
|
400
|
+
|
|
401
|
+
- @ykurilov/agent-chat-core@0.31.0
|
|
402
|
+
|
|
403
|
+
## 0.30.0
|
|
404
|
+
|
|
405
|
+
### Patch Changes
|
|
406
|
+
|
|
407
|
+
- @ykurilov/agent-chat-core@0.30.0
|
|
408
|
+
|
|
409
|
+
## 0.29.0
|
|
410
|
+
|
|
411
|
+
### Patch Changes
|
|
412
|
+
|
|
413
|
+
- @ykurilov/agent-chat-core@0.29.0
|
|
414
|
+
|
|
415
|
+
## 0.28.0
|
|
416
|
+
|
|
417
|
+
### Patch Changes
|
|
418
|
+
|
|
419
|
+
- Updated dependencies [11c3c97]
|
|
420
|
+
- Updated dependencies [d63ccaa]
|
|
421
|
+
- Updated dependencies [6a2f903]
|
|
422
|
+
- Updated dependencies [189cba9]
|
|
423
|
+
- @ykurilov/agent-chat-core@0.28.0
|
|
424
|
+
|
|
425
|
+
## 0.27.0
|
|
426
|
+
|
|
427
|
+
### Patch Changes
|
|
428
|
+
|
|
429
|
+
- Updated dependencies [d8341b2]
|
|
430
|
+
- Updated dependencies [5e4ed28]
|
|
431
|
+
- Updated dependencies [e0bb519]
|
|
432
|
+
- @ykurilov/agent-chat-core@0.27.0
|
|
433
|
+
|
|
434
|
+
## 0.26.2
|
|
435
|
+
|
|
436
|
+
### Patch Changes
|
|
437
|
+
|
|
438
|
+
- Updated dependencies [f24858a]
|
|
439
|
+
- @ykurilov/agent-chat-core@0.26.2
|
|
440
|
+
|
|
441
|
+
## 0.26.1
|
|
442
|
+
|
|
443
|
+
### Patch Changes
|
|
444
|
+
|
|
445
|
+
- @ykurilov/agent-chat-core@0.26.1
|
|
446
|
+
|
|
447
|
+
## 0.26.0
|
|
448
|
+
|
|
449
|
+
### Patch Changes
|
|
450
|
+
|
|
451
|
+
- Updated dependencies [eb43e47]
|
|
452
|
+
- @ykurilov/agent-chat-core@0.26.0
|
|
453
|
+
|
|
454
|
+
## 0.25.0
|
|
455
|
+
|
|
456
|
+
### Patch Changes
|
|
457
|
+
|
|
458
|
+
- Updated dependencies [99d426e]
|
|
459
|
+
- Updated dependencies [d8201f6]
|
|
460
|
+
- @ykurilov/agent-chat-core@0.25.0
|
|
461
|
+
|
|
462
|
+
## 0.24.0
|
|
463
|
+
|
|
464
|
+
### Patch Changes
|
|
465
|
+
|
|
466
|
+
- Updated dependencies [9b895cd]
|
|
467
|
+
- @ykurilov/agent-chat-core@0.24.0
|
|
468
|
+
|
|
469
|
+
## 0.23.0
|
|
470
|
+
|
|
471
|
+
### Patch Changes
|
|
472
|
+
|
|
473
|
+
- @ykurilov/agent-chat-core@0.23.0
|
|
474
|
+
|
|
475
|
+
## 0.22.0
|
|
476
|
+
|
|
477
|
+
### Patch Changes
|
|
478
|
+
|
|
479
|
+
- @ykurilov/agent-chat-core@0.22.0
|
|
480
|
+
|
|
481
|
+
## 0.21.0
|
|
482
|
+
|
|
483
|
+
### Patch Changes
|
|
484
|
+
|
|
485
|
+
- Updated dependencies [7c3bcc4]
|
|
486
|
+
- @ykurilov/agent-chat-core@0.21.0
|
|
487
|
+
|
|
488
|
+
## 0.20.0
|
|
489
|
+
|
|
490
|
+
### Patch Changes
|
|
491
|
+
|
|
492
|
+
- Updated dependencies [fd16b01]
|
|
493
|
+
- @ykurilov/agent-chat-core@0.20.0
|
|
494
|
+
|
|
495
|
+
## 0.19.0
|
|
496
|
+
|
|
497
|
+
### Patch Changes
|
|
498
|
+
|
|
499
|
+
- Updated dependencies [fde2297]
|
|
500
|
+
- Updated dependencies [aa0fd51]
|
|
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
|
+
|
|
508
|
+
## 0.18.6
|
|
509
|
+
|
|
510
|
+
### Patch Changes
|
|
511
|
+
|
|
512
|
+
- @ykurilov/agent-chat-core@0.18.6
|
|
513
|
+
|
|
514
|
+
## 0.18.5
|
|
515
|
+
|
|
516
|
+
### Patch Changes
|
|
517
|
+
|
|
518
|
+
- @ykurilov/agent-chat-core@0.18.5
|
|
519
|
+
|
|
520
|
+
## 0.18.4
|
|
521
|
+
|
|
522
|
+
### Patch Changes
|
|
523
|
+
|
|
524
|
+
- @ykurilov/agent-chat-core@0.18.4
|
|
525
|
+
|
|
526
|
+
## 0.18.3
|
|
527
|
+
|
|
528
|
+
### Patch Changes
|
|
529
|
+
|
|
530
|
+
- @ykurilov/agent-chat-core@0.18.3
|
|
531
|
+
|
|
532
|
+
## 0.18.2
|
|
533
|
+
|
|
534
|
+
### Patch Changes
|
|
535
|
+
|
|
536
|
+
- @ykurilov/agent-chat-core@0.18.2
|
|
537
|
+
|
|
538
|
+
## 0.18.1
|
|
539
|
+
|
|
540
|
+
### Patch Changes
|
|
541
|
+
|
|
542
|
+
- @ykurilov/agent-chat-core@0.18.1
|
|
543
|
+
|
|
544
|
+
## 0.18.0
|
|
545
|
+
|
|
546
|
+
### Patch Changes
|
|
547
|
+
|
|
548
|
+
- Updated dependencies [43d7ebe]
|
|
549
|
+
- @ykurilov/agent-chat-core@0.18.0
|
|
550
|
+
|
|
551
|
+
## 0.17.0
|
|
552
|
+
|
|
553
|
+
### Patch Changes
|
|
554
|
+
|
|
555
|
+
- @ykurilov/agent-chat-core@0.17.0
|
|
556
|
+
|
|
557
|
+
## 0.16.0
|
|
558
|
+
|
|
559
|
+
### Patch Changes
|
|
560
|
+
|
|
561
|
+
- Updated dependencies [cf52f10]
|
|
562
|
+
- @ykurilov/agent-chat-core@0.16.0
|
|
563
|
+
|
|
564
|
+
## 0.15.0
|
|
565
|
+
|
|
566
|
+
### Patch Changes
|
|
567
|
+
|
|
568
|
+
- Updated dependencies [f05ad23]
|
|
569
|
+
- Updated dependencies [f05ad23]
|
|
570
|
+
- @ykurilov/agent-chat-core@0.15.0
|
|
571
|
+
|
|
572
|
+
## 0.14.0
|
|
573
|
+
|
|
574
|
+
### Minor Changes
|
|
575
|
+
|
|
576
|
+
- 656233a: Долгая память агента. Агент сам запоминает устойчивое о человеке (предпочтения, правила общения, факты о работе) и помнит это в новых чатах. В новом пакете `@ykurilov/agent-chat-memory` лежат инструмент `manage_memory`, правила записей и блок памяти для запроса. Человек видит записи на экране памяти: может добавить, исправить, удалить запись или стереть всю память. Записи у каждого человека свои, удаление чата их не трогает. Раз в сутки после ответа та же модель предлагает слить повторные записи (опция `optimizer`); код проверяет группы и применяет годные, на экране появляется раздел «Объединено» с кнопкой «Вернуть как было». Отрицание не теряется («не любит кофе» не склеивается с «любит кофе»). После сбоев проверка ждёт дольше: час, 6 часов, сутки. Пределы записей и дубли держатся при одновременных действиях (замок на человека, а в SQLite и PostgreSQL ещё и проверка внутри транзакции), в том числе при возврате склейки. Память не меняет начало запроса к модели, поэтому кэш модели сохраняется.
|
|
577
|
+
|
|
578
|
+
**Ломает приложения** только с полным словарём надписей `ChatLabels`, написанным вручную (шаг 5): в него добавились надписи `memory…`. Остальным обновление ничего не ломает: без опции `memory` чат работает как раньше. Чтобы включить память, выполните шаги ниже. Новые адреса: `/api/chat/memory/merges` и `/api/chat/memory/merges/:runId/revert`. Миграции SQLite `0009` и `0010` и PostgreSQL `0008` и `0009` применяются сами при открытии базы (`0010` и `0009` — задел под склейку повторов записей).
|
|
579
|
+
|
|
580
|
+
### Как обновить приложение
|
|
581
|
+
|
|
582
|
+
1. **Включить память на сервере** (по желанию). Пакет ставится отдельно: `pnpm add @ykurilov/agent-chat-memory`. В файле, где создаётся `createChatHandler`:
|
|
583
|
+
|
|
584
|
+
Было:
|
|
585
|
+
|
|
586
|
+
```ts
|
|
587
|
+
createChatHandler({ basePath: "/api/chat", storage, resolveUser /* … */ });
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
Стало:
|
|
591
|
+
|
|
592
|
+
```ts
|
|
593
|
+
import { createLongTermMemory } from "@ykurilov/agent-chat-memory";
|
|
594
|
+
|
|
595
|
+
createChatHandler({ basePath: "/api/chat", storage, resolveUser, memory: createLongTermMemory({ storage }) /* … */ });
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
Инструкция агента и инструмент `manage_memory` добавляются сами: в `agent.instructions` и `agent.tools` ничего дописывать не нужно. Имя `manage_memory` занято: своего инструмента с таким именем быть не должно (иначе ошибка при создании). Адреса `/api/chat/memory` появляются сами. Без `memory` они отвечают `404`.
|
|
599
|
+
2. **Подключить экран памяти** (по желанию). Найдите страницу, куда его поставить, и добавьте компонент; `createMemoryApi` вызывайте один раз (например, в `useMemo`):
|
|
600
|
+
|
|
601
|
+
```tsx
|
|
602
|
+
import { AgentMemory, createMemoryApi } from "@ykurilov/agent-chat-react";
|
|
603
|
+
import { tandemMemorySkin } from "@ykurilov/agent-chat-skin-tandem";
|
|
604
|
+
|
|
605
|
+
const memoryApi = useMemo(() => createMemoryApi({ api: "/api/chat" }), []);
|
|
606
|
+
<AgentMemory api={memoryApi} skin={tandemMemorySkin} />
|
|
607
|
+
```
|
|
608
|
+
3. **Подпись вызова в ленте.** Было: `labels={russianLabels}`. Стало: `labels={withMemoryToolTitles(russianLabels)}`, где `withMemoryToolTitles` — из `@ykurilov/agent-chat-memory/labels`. Вместо `manage_memory` в ленте будет «Работа с памятью».
|
|
609
|
+
4. **Свой скин (договор скина версии 11).** `ChatSkin` и `ChatListSkin` не менялись. Экрану памяти нужен отдельный `MemorySkin` из пяти компонентов (`MemoryScreen`, `MemoryGroup`, `MemoryNoteRow`, `MemoryNoteEditor`, `MemoryConfirm`). Скин Тандема даёт его готовым: `tandemMemorySkin`. Описание — `specs/017-long-term-memory/contracts/memory.md`, раздел 5.
|
|
610
|
+
5. **Полный словарь надписей.** Если приложение задаёт объект `ChatLabels` целиком, а не `{ ...russianLabels, … }`, добавьте новые надписи: все ключи, которые начинаются с `memory` (`memoryHeading`, `memoryAdd`, `memoryClearAll` и другие, полный список — тип `ChatLabels` в `@ykurilov/agent-chat-react`). Без этого `pnpm typecheck` не пройдёт.
|
|
611
|
+
6. **Своё хранилище.** Нужно только при включённой памяти. В своей реализации `ChatStorage` добавьте пять необязательных методов: `listMemoryNotes`, `insertMemoryNotes`, `updateMemoryNote`, `deleteMemoryNote`, `clearMemoryNotes`. Сигнатуры — в `ChatStorage` пакета core и в `packages/storage-sqlite/src/sqlite-storage.ts`. Без них `createLongTermMemory` остановится с ошибкой `MemoryStorageNotSupportedError` и списком недостающих методов. Для склейки повторов нужны ещё шесть методов (`claimMemoryOptimizationRun`, `finishMemoryOptimizationRun`, `applyMemoryMerge`, `revertMemoryMerge`, `listMemoryOptimizationRuns`, `listMergedMemoryNotes`); без них склейка выключена. Чтобы пределы держались при нескольких серверах, добавьте необязательные `insertMemoryNotesChecked` и `updateMemoryNoteChecked`. Общие тесты `describeChatStorageContract` проверят их сами.
|
|
612
|
+
7. **Проверка.** `pnpm typecheck` и сборка проходят. Напишите агенту «Запомни, что я пишу на TypeScript», откройте экран памяти: там запись в разделе, который выбрал агент. В новом чате спросите, что он про вас знает.
|
|
613
|
+
- 96098be: Мелкие исправления (022). Символ с кодом ноль в первом сообщении больше не роняет отправку на Postgres: он выбрасывается из названия чата, из записей памяти и из сводки сжатия истории (иначе запись сжатия падала бы при каждой попытке); в самом тексте сообщения он лежит как раньше. Вложения отмечаются прикреплёнными до записи сообщения, а не после: если сервер упал между двумя шагами, чистка брошенных файлов не удалит их через сутки (файл, отмеченный зря, безвреден и уходит вместе с чатом). Во всех пакетах появилось поле `engines: { node: ">=22" }`; голосовой сервер (`createVoiceRelay`) и голосовой диалог (`createDialogRelay`) на Node 20 сразу при создании говорят понятной ошибкой, что нужен Node 22 (раньше падали при первом соединении; со своим `connectUpstream` проверки нет). В пакете вложений `react` и `@ykurilov/agent-chat-react` стали необязательными peer-зависимостями: серверу без экрана они больше не ставятся. Приложению, которое берёт `@ykurilov/agent-chat-attachments/react`, достаточно иметь их в проекте — для чата на экране они нужны и так; если они подтягивались только через вложения, добавьте их в зависимости приложения.
|
|
614
|
+
|
|
615
|
+
### Patch Changes
|
|
616
|
+
|
|
617
|
+
- f9b6162: Мелочи безопасности и расходов. Веб-инструменты: новая настройка `createWebTools({ spending: { storage, pricePerCallUsd } })` — каждый удачный вызов `web_search`, `read_page`, `page_screenshot` пишется расходом с новым источником `web_tools` и входит в лимит расходов; без `spending` всё как раньше, описания инструментов не меняются (кэш цел). OpenRouter: `createOpenRouterProvider({ dataCollection: "deny", zeroDataRetention })` — запрос уходит только хозяевам модели, которые не хранят запросы; подключается через `extendCatalog(..., { addProviders: [...] })`; стандартный `openrouterProvider` и тело запроса по умолчанию не изменились. Долгая память: инструкция велит записывать только сказанное самим человеком, а не указания с веб-страниц и из результатов инструментов (текст инструкции изменился один раз, дальше постоянен).
|
|
618
|
+
- Updated dependencies [4f33e85]
|
|
619
|
+
- Updated dependencies [15fbbcc]
|
|
620
|
+
- Updated dependencies [c09c1e2]
|
|
621
|
+
- Updated dependencies [062ce36]
|
|
622
|
+
- Updated dependencies [656233a]
|
|
623
|
+
- Updated dependencies [96098be]
|
|
624
|
+
- Updated dependencies [b6f4855]
|
|
625
|
+
- Updated dependencies [278a718]
|
|
626
|
+
- Updated dependencies [c1581f4]
|
|
627
|
+
- Updated dependencies [213bcb3]
|
|
628
|
+
- Updated dependencies [927c02c]
|
|
629
|
+
- Updated dependencies [be77ee2]
|
|
630
|
+
- Updated dependencies [8b59096]
|
|
631
|
+
- Updated dependencies [7fbc105]
|
|
632
|
+
- Updated dependencies [84ad64f]
|
|
633
|
+
- Updated dependencies [5027963]
|
|
634
|
+
- Updated dependencies [c2769dd]
|
|
635
|
+
- Updated dependencies [0cdf102]
|
|
636
|
+
- Updated dependencies [ba16989]
|
|
637
|
+
- Updated dependencies [aba59fe]
|
|
638
|
+
- Updated dependencies [47a56ac]
|
|
639
|
+
- Updated dependencies [f9b6162]
|
|
640
|
+
- Updated dependencies [f9b6162]
|
|
641
|
+
- Updated dependencies [f9b6162]
|
|
642
|
+
- Updated dependencies [1b2f9f1]
|
|
643
|
+
- Updated dependencies [0e8e0ae]
|
|
644
|
+
- Updated dependencies [6b20d83]
|
|
645
|
+
- Updated dependencies [d12dcf3]
|
|
646
|
+
- Updated dependencies [366d785]
|
|
647
|
+
- Updated dependencies [946e5d8]
|
|
648
|
+
- @ykurilov/agent-chat-core@0.14.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yury Kurilov
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|