@ykurilov/agent-chat-core 0.67.0 → 0.69.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 +10 -0
- package/README.md +12 -0
- package/dist/{chunk-WMP5AKDU.js → chunk-BJTHXNB6.js} +502 -22
- package/dist/chunk-BJTHXNB6.js.map +1 -0
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/storage-contract.js +1 -1
- package/dist/types/access/client-visibility.d.ts +8 -1
- package/dist/types/agent-run/answer-saver.d.ts +3 -1
- package/dist/types/agent-run/run-agent-turn.d.ts +6 -0
- package/dist/types/chat-service.d.ts +7 -0
- package/dist/types/conversation/types.d.ts +7 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/thought-titles/thought-title-model.d.ts +27 -0
- package/dist/types/thought-titles/thought-title-parts.d.ts +20 -0
- package/dist/types/thought-titles/thought-title-text.d.ts +26 -0
- package/dist/types/thought-titles/thought-titles-setting.d.ts +83 -0
- package/dist/types/thought-titles/turn-thought-titles.d.ts +56 -0
- package/package.json +1 -1
- package/dist/chunk-WMP5AKDU.js.map +0 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Больше слов в заголовке раздумья не бывает: «Продумываю правила игры», а не пересказ. */
|
|
2
|
+
export declare const THOUGHT_TITLE_MAX_WORDS = 6;
|
|
3
|
+
/** Язык по тексту человека: есть кириллица — русский, иначе английский. */
|
|
4
|
+
export declare function languageOfText(text: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Написан ли текст письменностью языка: для языков на кириллице нужна кириллица и не больше латинских букв, чем
|
|
7
|
+
* кириллических; для языков на латинице — наоборот. Незнакомый язык не проверяется.
|
|
8
|
+
*/
|
|
9
|
+
export declare function fitsLanguage(text: string, language: string): boolean;
|
|
10
|
+
/** Первый заголовок провайдера — строка целиком жирным (`**…**`), так пишет сводку рассуждений GPT. */
|
|
11
|
+
export declare function providerHeadingOf(text: string): string | undefined;
|
|
12
|
+
export interface ThoughtTitleRules {
|
|
13
|
+
/** Самый длинный заголовок, знаков. */
|
|
14
|
+
maxLength: number;
|
|
15
|
+
/** Язык человека, код («ru»). */
|
|
16
|
+
language: string;
|
|
17
|
+
/** Имена инструментов хода и навыков: заголовок с ними — техника, а не мысль. */
|
|
18
|
+
toolNames?: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Заголовок из ответа модели или провайдера по правилам: первая строка, без разметки, кавычек и точки на конце, с
|
|
22
|
+
* заглавной; 1–6 слов, не длиннее предела, языком человека, без кода, путей и имён инструментов. Иначе `undefined`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function cleanThoughtTitle(raw: string, rules: ThoughtTitleRules): string | undefined;
|
|
25
|
+
/** Заголовок короткого раздумья без модели: его первое предложение, если оно подходит под правила. */
|
|
26
|
+
export declare function shortThoughtTitle(text: string, rules: ThoughtTitleRules): string | undefined;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { ModelCatalog } from "../models/model-catalog.js";
|
|
2
|
+
import type { ModelChoice } from "../models/model-choice.js";
|
|
3
|
+
/** Что знает функция языка заголовков: чей чат и последнее сообщение человека текстом. */
|
|
4
|
+
export interface ThoughtTitleLanguageInput {
|
|
5
|
+
ownerId: string;
|
|
6
|
+
chatId: string;
|
|
7
|
+
lastUserText: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Заголовки раздумий вместо «Думал 3 сек» (`createChatService({ thoughtTitles })`). Провайдер сам отдаёт заголовки
|
|
11
|
+
* (сводка рассуждений GPT через OpenRouter) — берутся они; иначе пересказ моделью `model`. Нет настройки — заголовков
|
|
12
|
+
* нет, ход и запрос побайтно прежние.
|
|
13
|
+
*/
|
|
14
|
+
export interface ThoughtTitlesSetting {
|
|
15
|
+
/**
|
|
16
|
+
* `false` — выключено. Функция — решение на каждый ход (например, только для части людей); сбой функции — без
|
|
17
|
+
* заголовков, строка в журнал. По умолчанию включено, если настройка задана.
|
|
18
|
+
*/
|
|
19
|
+
enabled?: boolean | ((chat: {
|
|
20
|
+
ownerId: string;
|
|
21
|
+
chatId: string;
|
|
22
|
+
}) => boolean);
|
|
23
|
+
/**
|
|
24
|
+
* Дешёвая модель каталога для пересказа, например `{ modelId: "deepseek-4.1-flash", providerId: "deepseek",
|
|
25
|
+
* reasoning: "off" }`. Нет — только заголовки провайдера и первые предложения коротких раздумий.
|
|
26
|
+
*/
|
|
27
|
+
model?: ModelChoice;
|
|
28
|
+
/**
|
|
29
|
+
* Показывать заголовки тем, у кого нет права `reasoning` (по умолчанию да): включая `thoughtTitles`, приложение разрешает
|
|
30
|
+
* показывать людям сжатую суть раздумий. Сам текст раздумий им не уходит. `false` — без права `reasoning` как раньше:
|
|
31
|
+
* ни раздумий, ни заголовков.
|
|
32
|
+
*/
|
|
33
|
+
showWithoutReasoning?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Свои слова, которых не должно быть в заголовке: имена навыков, внутренние названия. Имена инструментов хода ядро
|
|
36
|
+
* знает само. Например `async () => (await skills.manage.list()).map((skill) => skill.name)`. Сбой — без них, строка в журнал.
|
|
37
|
+
*/
|
|
38
|
+
hiddenNames?: (chat: {
|
|
39
|
+
ownerId: string;
|
|
40
|
+
chatId: string;
|
|
41
|
+
}) => readonly string[] | Promise<readonly string[]>;
|
|
42
|
+
/** Самый длинный заголовок, знаков. По умолчанию 60. */
|
|
43
|
+
maxLength?: number;
|
|
44
|
+
/** Сколько раз за ход звать модель заголовков. По умолчанию 6. */
|
|
45
|
+
maxPerTurn?: number;
|
|
46
|
+
/** Раздумье короче — без модели: первое предложение или прежняя подпись. По умолчанию 150 знаков. */
|
|
47
|
+
minChars?: number;
|
|
48
|
+
/** Срок ответа модели заголовков, мс. По умолчанию 8000. */
|
|
49
|
+
timeoutMs?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Язык заголовков: код («ru», «en») или функция хода. Нет или функция вернула пусто — по последнему сообщению
|
|
52
|
+
* человека: есть кириллица — русский, иначе английский.
|
|
53
|
+
*/
|
|
54
|
+
language?: string | ((input: ThoughtTitleLanguageInput) => string | undefined);
|
|
55
|
+
}
|
|
56
|
+
export interface ResolvedThoughtTitles {
|
|
57
|
+
enabled?: (chat: {
|
|
58
|
+
ownerId: string;
|
|
59
|
+
chatId: string;
|
|
60
|
+
}) => boolean;
|
|
61
|
+
showWithoutReasoning: boolean;
|
|
62
|
+
hiddenNames?: ThoughtTitlesSetting["hiddenNames"];
|
|
63
|
+
model?: ModelChoice;
|
|
64
|
+
maxLength: number;
|
|
65
|
+
maxPerTurn: number;
|
|
66
|
+
minChars: number;
|
|
67
|
+
timeoutMs: number;
|
|
68
|
+
language?: ThoughtTitlesSetting["language"];
|
|
69
|
+
}
|
|
70
|
+
/** Настройка к одному виду; ошибка в ней — `TypeError` при создании службы. Выключено или нет — `null`. */
|
|
71
|
+
export declare function resolveThoughtTitles(setting: ThoughtTitlesSetting | undefined, catalog: ModelCatalog): ResolvedThoughtTitles | null;
|
|
72
|
+
/** Язык заголовков хода: настройка, иначе по сообщению человека. Сбой функции — по сообщению, строка в журнал. */
|
|
73
|
+
export declare function thoughtTitleLanguage(resolved: ResolvedThoughtTitles, input: ThoughtTitleLanguageInput, logError: (message: string) => void): string;
|
|
74
|
+
/** Включены ли заголовки в этом ходе; сбой функции `enabled` — нет, строка в журнал. */
|
|
75
|
+
export declare function thoughtTitlesEnabled(resolved: ResolvedThoughtTitles, chat: {
|
|
76
|
+
ownerId: string;
|
|
77
|
+
chatId: string;
|
|
78
|
+
}, logError: (message: string) => void): boolean;
|
|
79
|
+
/** Свои слова приложения для проверки заголовков; сбой функции — без них, строка в журнал. */
|
|
80
|
+
export declare function thoughtTitleHiddenNames(resolved: ResolvedThoughtTitles, chat: {
|
|
81
|
+
ownerId: string;
|
|
82
|
+
chatId: string;
|
|
83
|
+
}, logError: (message: string) => void): Promise<string[]>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { UIMessageChunk } from "ai";
|
|
2
|
+
/** Заголовки раздумий по порядковому номеру части рассуждения в сообщении («0», «1»…), как `reasoningDurationsMs`. */
|
|
3
|
+
export type ThoughtTitles = Record<string, string>;
|
|
4
|
+
export interface TurnThoughtTitlesInput {
|
|
5
|
+
/** Язык человека, код («ru»). */
|
|
6
|
+
language: string;
|
|
7
|
+
maxLength: number;
|
|
8
|
+
/** Сколько раз за ход можно звать модель заголовков. */
|
|
9
|
+
maxPerTurn: number;
|
|
10
|
+
/** Раздумье короче — его первое предложение, если оно на языке человека; иначе — пересказ моделью. */
|
|
11
|
+
minChars: number;
|
|
12
|
+
/** Пересказ моделью заголовков: сырой ответ модели; `signal` — «Стоп» хода. Нет — только заголовки провайдера и короткие. */
|
|
13
|
+
summarize?: (text: string, signal?: AbortSignal) => Promise<string | undefined>;
|
|
14
|
+
/** Имена инструментов и навыков хода (и не вызванных): заголовок с ними — техника, а не мысль. */
|
|
15
|
+
toolNames?: readonly string[];
|
|
16
|
+
/** Сигнал хода: «Стоп» отменяет начатые пересказы, новых не будет. */
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
/**
|
|
19
|
+
* Продолжение ответа: сколько раздумий уже в сообщении, их заголовки и сколько раз уже звали модель (`asked`):
|
|
20
|
+
* `maxPerTurn` — на ответ целиком.
|
|
21
|
+
*/
|
|
22
|
+
existing?: {
|
|
23
|
+
count: number;
|
|
24
|
+
titles: ThoughtTitles;
|
|
25
|
+
asked?: number;
|
|
26
|
+
};
|
|
27
|
+
/** Карта заголовков изменилась: полная копия. После `close` не зовётся. */
|
|
28
|
+
onChange: (titles: ThoughtTitles) => void;
|
|
29
|
+
logError: (message: string) => void;
|
|
30
|
+
}
|
|
31
|
+
export type TurnThoughtTitles = ReturnType<typeof createTurnThoughtTitles>;
|
|
32
|
+
/** Сколько конец хода ждёт недоделанные заголовки, мс: дольше — они остаются без заголовка. */
|
|
33
|
+
export declare const THOUGHT_TITLES_SETTLE_MS = 1500;
|
|
34
|
+
/** Заголовки для хода: всё, кроме того, что ход знает сам. `settleMs` — ожидание в конце хода (`THOUGHT_TITLES_SETTLE_MS`). */
|
|
35
|
+
export type TurnThoughtTitlesSource = Omit<TurnThoughtTitlesInput, "existing" | "onChange" | "logError" | "signal"> & {
|
|
36
|
+
settleMs?: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Заголовки раздумий одного хода. Смотрит куски потока: копит текст каждого раздумья, на его конце решает — заголовок
|
|
40
|
+
* провайдера (жирная строка на языке человека), короткое раздумье (первое предложение, если оно на языке человека),
|
|
41
|
+
* иначе пересказ моделью (не больше `maxPerTurn` за ход). Ход не ждёт: модель отвечает в фоне, готовый заголовок уходит в `onChange`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function createTurnThoughtTitles(input: TurnThoughtTitlesInput): {
|
|
44
|
+
observe(chunk: UIMessageChunk): void;
|
|
45
|
+
/** Имена инструментов набора попытки: весь набор, а не только вызванные. */
|
|
46
|
+
addToolNames(names: readonly string[]): void;
|
|
47
|
+
/** Шаг стёрт: в сообщении осталось `kept` раздумий, заголовки и ответы после них забываются; счёт запросов — нет. */
|
|
48
|
+
rewind(kept: number): void;
|
|
49
|
+
titles: () => ThoughtTitles;
|
|
50
|
+
/** Раздумья этого хода, которые пересказывала модель: для отметки в частях. */
|
|
51
|
+
askedKeys: () => string[];
|
|
52
|
+
/** Ждёт начатые пересказы, но не дольше `timeoutMs`: ход кончается, недоделанные останутся без заголовка. */
|
|
53
|
+
settle(timeoutMs: number): Promise<void>;
|
|
54
|
+
/** Ход кончился: поздние заголовки больше не принимаются. */
|
|
55
|
+
close(): void;
|
|
56
|
+
};
|