@thesashadev/girl-agent 0.1.14 → 0.1.16
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 +14 -0
- package/dist/cli.js +97 -12
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.16
|
|
4
|
+
|
|
5
|
+
Дата: 2026-05-08
|
|
6
|
+
|
|
7
|
+
- Merge pull request #63 from TheSashaDev/devin/1778244236-serialize-llm-requests
|
|
8
|
+
- Serialize LLM provider requests
|
|
9
|
+
|
|
10
|
+
## 0.1.15
|
|
11
|
+
|
|
12
|
+
Дата: 2026-05-08
|
|
13
|
+
|
|
14
|
+
- Merge pull request #62 from TheSashaDev/devin/1778239329-fix-proactive-memory-and-username
|
|
15
|
+
- fix: proactive messages account for conversation memory + add TG identity to system prompt
|
|
16
|
+
|
|
3
17
|
## 0.1.14
|
|
4
18
|
|
|
5
19
|
Дата: 2026-05-08
|
package/dist/cli.js
CHANGED
|
@@ -209,6 +209,16 @@ function makeUserbotAdapter(cfg) {
|
|
|
209
209
|
const peer = await resolvePeer(chatId);
|
|
210
210
|
await client.deleteMessages(peer, messageIds, { revoke });
|
|
211
211
|
},
|
|
212
|
+
getSelf() {
|
|
213
|
+
if (!me) return {};
|
|
214
|
+
const parts = [];
|
|
215
|
+
if (me.firstName) parts.push(me.firstName);
|
|
216
|
+
if (me.lastName) parts.push(me.lastName);
|
|
217
|
+
return {
|
|
218
|
+
username: me.username ?? void 0,
|
|
219
|
+
displayName: parts.join(" ") || void 0
|
|
220
|
+
};
|
|
221
|
+
},
|
|
212
222
|
async stop() {
|
|
213
223
|
await client.disconnect();
|
|
214
224
|
}
|
|
@@ -282,6 +292,7 @@ function makeBotAdapter(cfg) {
|
|
|
282
292
|
const token = cfg.telegram.botToken;
|
|
283
293
|
if (!token) throw new Error("BOT_TOKEN missing");
|
|
284
294
|
const bot = new Bot(token);
|
|
295
|
+
let selfInfo = {};
|
|
285
296
|
return {
|
|
286
297
|
async start(onMessage) {
|
|
287
298
|
bot.on("message", async (ctx) => {
|
|
@@ -301,6 +312,14 @@ function makeBotAdapter(cfg) {
|
|
|
301
312
|
});
|
|
302
313
|
bot.start({ drop_pending_updates: true }).catch(() => {
|
|
303
314
|
});
|
|
315
|
+
try {
|
|
316
|
+
const me = await bot.api.getMe();
|
|
317
|
+
selfInfo = {
|
|
318
|
+
username: me.username ?? void 0,
|
|
319
|
+
displayName: [me.first_name, me.last_name].filter(Boolean).join(" ") || void 0
|
|
320
|
+
};
|
|
321
|
+
} catch {
|
|
322
|
+
}
|
|
304
323
|
},
|
|
305
324
|
async sendText(chatId, text) {
|
|
306
325
|
if (hasSpoilers(text)) {
|
|
@@ -332,6 +351,9 @@ function makeBotAdapter(cfg) {
|
|
|
332
351
|
async sendSticker(chatId, fileId) {
|
|
333
352
|
await bot.api.sendSticker(chatId, fileId);
|
|
334
353
|
},
|
|
354
|
+
getSelf() {
|
|
355
|
+
return selfInfo;
|
|
356
|
+
},
|
|
335
357
|
async stop() {
|
|
336
358
|
await bot.stop();
|
|
337
359
|
}
|
|
@@ -1207,6 +1229,31 @@ function openBrowser(url) {
|
|
|
1207
1229
|
// src/llm/index.ts
|
|
1208
1230
|
var LLM_TIMEOUT_MS = 12e4;
|
|
1209
1231
|
var LLM_MAX_RETRIES = 1;
|
|
1232
|
+
var llmQueueTail = Promise.resolve();
|
|
1233
|
+
var SerializedLLMClient = class {
|
|
1234
|
+
constructor(inner) {
|
|
1235
|
+
this.inner = inner;
|
|
1236
|
+
}
|
|
1237
|
+
inner;
|
|
1238
|
+
chat(messages, opts = {}) {
|
|
1239
|
+
return runExclusiveLLM(() => this.inner.chat(messages, opts));
|
|
1240
|
+
}
|
|
1241
|
+
};
|
|
1242
|
+
async function runExclusiveLLM(task) {
|
|
1243
|
+
const previous = llmQueueTail.catch(() => void 0);
|
|
1244
|
+
let release = () => {
|
|
1245
|
+
};
|
|
1246
|
+
const current = new Promise((resolve) => {
|
|
1247
|
+
release = resolve;
|
|
1248
|
+
});
|
|
1249
|
+
llmQueueTail = previous.then(() => current);
|
|
1250
|
+
await previous;
|
|
1251
|
+
try {
|
|
1252
|
+
return await task();
|
|
1253
|
+
} finally {
|
|
1254
|
+
release();
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1210
1257
|
var OpenAILike = class {
|
|
1211
1258
|
constructor(cfg) {
|
|
1212
1259
|
this.cfg = cfg;
|
|
@@ -1511,7 +1558,8 @@ function errorMessage(error) {
|
|
|
1511
1558
|
return error instanceof Error ? error.message : String(error ?? "");
|
|
1512
1559
|
}
|
|
1513
1560
|
function makeLLM(cfg) {
|
|
1514
|
-
|
|
1561
|
+
const inner = cfg.proto === "anthropic" ? new AnthropicLike(cfg) : new OpenAILike(cfg);
|
|
1562
|
+
return new SerializedLLMClient(inner);
|
|
1515
1563
|
}
|
|
1516
1564
|
|
|
1517
1565
|
// src/engine/persona-gen.ts
|
|
@@ -4006,6 +4054,10 @@ ${ctx.romanticApproach ? `\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435
|
|
|
4006
4054
|
ANTI_AI_RULES,
|
|
4007
4055
|
communicationFragment,
|
|
4008
4056
|
`# \u0422\u042B \u2014 ${cfg.name}, ${cfg.age}, ${cfg.nationality === "UA" ? "\u0423\u043A\u0440\u0430\u0438\u043D\u0430" : "\u0420\u043E\u0441\u0441\u0438\u044F / \u0421\u041D\u0413"}`,
|
|
4057
|
+
ctx.tgUsername || ctx.tgDisplayName ? `# \u0422\u0432\u043E\u0439 \u0430\u043A\u043A\u0430\u0443\u043D\u0442 \u0432 \u0422\u0413${ctx.tgUsername ? `
|
|
4058
|
+
\u0422\u0432\u043E\u0439 \u044E\u0437\u0435\u0440\u043D\u0435\u0439\u043C \u0432 \u0442\u0433: @${ctx.tgUsername.replace(/^@/, "")}` : ""}${ctx.tgDisplayName ? `
|
|
4059
|
+
\u0422\u0432\u043E\u0451 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0435 \u0438\u043C\u044F \u0432 \u0442\u0433: ${ctx.tgDisplayName}` : ""}
|
|
4060
|
+
\u0423\u0447\u0442\u0438: \u0438\u043C\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u044B (${cfg.name}) \u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0435 \u0438\u043C\u044F \u0432 \u0442\u0433 \u043C\u043E\u0433\u0443\u0442 \u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F.` : "",
|
|
4009
4061
|
`\u0427\u0430\u0441\u043E\u0432\u043E\u0439 \u043F\u043E\u044F\u0441: ${cfg.tz}. \u0423 \u0442\u0435\u0431\u044F \u0441\u0435\u0439\u0447\u0430\u0441: ${localTime}. \u041F\u0430\u0442\u0442\u0435\u0440\u043D \u043F\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044F \u0432 \u0442\u0433: ${presenceProfile.pattern}. \u0423\u0447\u0438\u0442\u044B\u0432\u0430\u0439 \u2014 \u0433\u043B\u0443\u0431\u043E\u043A\u0430\u044F \u043D\u043E\u0447\u044C = \u043B\u0438\u0431\u043E \u0441\u043F\u0438\u0448\u044C \u0438 \u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0448\u044C, \u043B\u0438\u0431\u043E \u0442\u0440\u0435\u0432\u043E\u0436\u043D\u043E. \u0423\u0442\u0440\u043E = \u0432\u044F\u043B\u043E. \u0414\u0435\u043D\u044C/\u0432\u0435\u0447\u0435\u0440 = \u0430\u043A\u0442\u0438\u0432\u043D\u0430.`,
|
|
4010
4062
|
cfg.nationality === "UA" ? `# \u042F\u0437\u044B\u043A
|
|
4011
4063
|
\u041F\u0438\u0448\u0435\u0448\u044C \u041D\u0410 \u0420\u0423\u0421\u0421\u041A\u041E\u041C. \u0420\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0432\u0443\u0448\u043A\u0438 \u0432 \u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u043E\u043C \u0442\u0433 \u0447\u0430\u0449\u0435 \u043F\u0438\u0448\u0443\u0442 \u0440\u0443\u0441\u0441\u043A\u0438\u043C \u2014 \u043D\u0435 \u0432\u044B\u043F\u0435\u043D\u0434\u0440\u0438\u0432\u0430\u0439\u0441\u044F \u0447\u0438\u0441\u0442\u043E-\u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0438\u043C. \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C \u043B\u0451\u0433\u043A\u0438\u0439 \u0441\u0443\u0440\u0436\u0438\u043A: \u043F\u0430\u0440\u0430 \u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0438\u0445 \u0441\u043B\u043E\u0432 \u0432 \u043D\u0435\u0434\u0435\u043B\u044E \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0438 ('\u0448\u043E', '\u043C\u0430\u0431\u0443\u0442\u044C', '\u0442\u0440\u043E\u0445\u0438', '\u044F\u043A', '\u043D\u0443 \u0448\u043E', '\u0434\u044F\u043A\u0443\u044E') \u2014 \u043D\u043E \u043D\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 ~10% \u0442\u0435\u043A\u0441\u0442\u0430. \u041F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u043D\u0430 \u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u043E\u043C \u041D\u0415 \u043F\u0438\u0448\u0438, \u044D\u0442\u043E \u043D\u0435\u0440\u0435\u0430\u043B\u0438\u0441\u0442\u0438\u0447\u043D\u043E \u0434\u043B\u044F \u0442\u0433.` : `# \u042F\u0437\u044B\u043A
|
|
@@ -4556,6 +4608,8 @@ var SYS_AUTONOMOUS = `\u0422\u044B \u2014 \u0432\u043D\u0443\u0442\u0440\u0435\u
|
|
|
4556
4608
|
|
|
4557
4609
|
\u0417\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0440\u0435\u0430\u043B\u0438\u0441\u0442\u0438\u0447\u043D\u044B\u0435 \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u043F\u043E\u0432\u043E\u0434\u044B \u043D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0435\u043C\u0443 \u0441\u0435\u0433\u043E\u0434\u043D\u044F/\u0437\u0430\u0432\u0442\u0440\u0430. \u042D\u0442\u043E \u041D\u0415 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C \u0438 \u041D\u0415 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442. \u042D\u0442\u043E \u0436\u0438\u0432\u0430\u044F \u0434\u0435\u0432\u0443\u0448\u043A\u0430.
|
|
4558
4610
|
|
|
4611
|
+
\u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u041D\u0415 \u041F\u0420\u0418\u0414\u0423\u041C\u042B\u0412\u0410\u0419 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0438 \u0442\u0435\u043C\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435 \u0431\u044B\u043B\u043E \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435. \u0415\u0441\u043B\u0438 \u0442\u044B \u0441\u0441\u044B\u043B\u0430\u0435\u0448\u044C\u0441\u044F \u043D\u0430 \u0442\u043E \u0447\u0442\u043E \u043E\u043D \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u043B \u043F\u0440\u043E X \u2014 \u043F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0442\u043E X \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u0435\u0441\u0442\u044C \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435 \u0438\u043B\u0438 long-term memory. \u041D\u0435\u043B\u044C\u0437\u044F \u043F\u0438\u0441\u0430\u0442\u044C \u043F\u0440\u043E \u0442\u0435\u043C\u0443 \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u0432\u044B \u041D\u0418\u041A\u041E\u0413\u0414\u0410 \u043D\u0435 \u043E\u0431\u0441\u0443\u0436\u0434\u0430\u043B\u0438. \u041B\u0443\u0447\u0448\u0435 \u043F\u0438\u0448\u0438 \u043F\u0440\u043E \u0441\u0432\u043E\u044E \u0436\u0438\u0437\u043D\u044C (\u0441\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0439 \u0434\u0435\u043D\u044C, \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0438\u0437 daily-life) \u0447\u0435\u043C \u0441\u0441\u044B\u043B\u0430\u0439\u0441\u044F \u043D\u0430 \u043D\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0439 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440.
|
|
4612
|
+
|
|
4559
4613
|
\u0412\u0435\u0440\u043D\u0438 \u0421\u0422\u0420\u041E\u0413\u041E JSON:
|
|
4560
4614
|
{
|
|
4561
4615
|
"items": [
|
|
@@ -4593,6 +4647,7 @@ ${currentAgenda.length ? JSON.stringify(currentAgenda.filter((a) => a.state ===
|
|
|
4593
4647
|
- \u042D\u0442\u043E \u0438\u043C\u0435\u043D\u043D\u043E \u0415\u0401 \u0438\u043D\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u044B: "\u0431\u043B\u0438\u043D \u0443 \u043D\u0430\u0441 \u0449\u0430\u0441...", "\u0442\u044B \u0433\u0434\u0435 \u043F\u0440\u043E\u043F\u0430\u043B", "\u044F \u0449\u0430\u0441 \u0442\u0430\u043A\u043E\u0435 \u0443\u0432\u0438\u0434\u0435\u043B\u0430", "\u043C\u043D\u0435 \u0441\u043D\u0438\u043B\u0430\u0441\u044C \u0444\u0438\u0433\u043D\u044F", "\u043C\u0430\u043C\u0430 \u0431\u0435\u0441\u0438\u0442", "\u0441\u043A\u0438\u043D\u0443\u0442\u044C \u0431\u044B \u0442\u0435\u0431\u0435 \u043D\u043E \u043B\u0430\u0434\u043D\u043E", "\u044F \u0443\u0441\u0442\u0430\u043B\u0430".
|
|
4594
4648
|
- \u041D\u0435 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0439 \u0441\u043A\u0443\u0447\u043D\u043E\u0435 "\u043A\u0430\u043A \u0434\u0435\u043B\u0430" \u0431\u0435\u0437 \u043F\u0440\u0438\u0447\u0438\u043D\u044B.
|
|
4595
4649
|
- \u041D\u0435 \u0431\u0443\u0434\u044C \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043B\u0438\u043F\u043A\u043E\u0439 \u043D\u0430 \u0445\u043E\u043B\u043E\u0434\u043D\u044B\u0445 \u0441\u0442\u0430\u0434\u0438\u044F\u0445.
|
|
4650
|
+
- \u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u041D\u0415 \u0412\u042B\u0414\u0423\u041C\u042B\u0412\u0410\u0419 \u0442\u0435\u043C\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435 \u0431\u044B\u043B\u043E \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435 \u0438\u043B\u0438 long-term memory. \u041D\u0435 \u0441\u0441\u044B\u043B\u0430\u0439\u0441\u044F \u043D\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F/\u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u041D\u0415 \u0431\u044B\u043B\u043E. \u0415\u0441\u043B\u0438 \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u043D\u0435\u0442 \u0443\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u044F \u0442\u0435\u043C\u044B \u2014 \u043D\u0435 \u043F\u0438\u0448\u0438 \u043F\u0440\u043E \u043D\u0435\u0451. \u041B\u0443\u0447\u0448\u0435 \u0441\u043E\u0437\u0434\u0430\u0439 item \u043F\u0440\u043E \u0441\u0432\u043E\u044E \u0436\u0438\u0437\u043D\u044C/\u0434\u0435\u043D\u044C/\u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u0435.
|
|
4596
4651
|
- \u041D\u0430 dating-early+ \u043C\u043E\u0436\u043D\u043E \u0441\u043A\u0443\u0447\u0430\u0442\u044C, \u0440\u0435\u0432\u043D\u043E\u0432\u0430\u0442\u044C, \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C, \u043F\u0438\u0441\u0430\u0442\u044C \u0431\u044B\u0442\u043E\u0432\u043E\u0435.
|
|
4597
4652
|
- pingAt \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043C, \u043D\u0435 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0441\u043D\u0430 \u0438 \u043D\u0435 \u0432\u043E \u0432\u0440\u0435\u043C\u044F blocks \u0441 phoneAvailable=false.
|
|
4598
4653
|
- \u0420\u0430\u0437\u043D\u043E\u0441\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043C\u0438\u043D\u0438\u043C\u0443\u043C \u043D\u0430 45 \u043C\u0438\u043D\u0443\u0442.
|
|
@@ -4698,6 +4753,7 @@ autonomous:${dateKey} created=0`.trim() + "\n");
|
|
|
4698
4753
|
const rel = await readRelationship(cfg.slug);
|
|
4699
4754
|
const persona = (await readMd(cfg.slug, "persona.md")).slice(0, 900);
|
|
4700
4755
|
const speech = (await readMd(cfg.slug, "speech.md")).slice(0, 600);
|
|
4756
|
+
const longTerm = (await readMd(cfg.slug, "memory/long-term.md")).slice(0, 1200);
|
|
4701
4757
|
const histStr = history.slice(-16).map((m) => `${m.role === "user" ? "\u043E\u043D" : "\u043E\u043D\u0430"}: ${m.content}`).join("\n");
|
|
4702
4758
|
const stateBlock = [
|
|
4703
4759
|
`# \u0421\u0442\u0430\u0434\u0438\u044F: ${stage.label} (${cfg.stage})`,
|
|
@@ -4707,8 +4763,10 @@ autonomous:${dateKey} created=0`.trim() + "\n");
|
|
|
4707
4763
|
`# persona:
|
|
4708
4764
|
${persona}`,
|
|
4709
4765
|
`# speech:
|
|
4710
|
-
${speech}
|
|
4711
|
-
|
|
4766
|
+
${speech}`,
|
|
4767
|
+
longTerm ? `# long-term memory (\u0447\u0442\u043E \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u043E \u043E \u043D\u0451\u043C):
|
|
4768
|
+
${longTerm}` : "# long-term memory: (\u043F\u0443\u0441\u0442\u043E \u2014 \u043F\u043E\u043A\u0430 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0437\u043D\u0430\u0435\u0448\u044C \u043E \u043D\u0451\u043C, \u041D\u0415 \u043F\u0440\u0438\u0434\u0443\u043C\u044B\u0432\u0430\u0439 \u0444\u0430\u043A\u0442\u044B)"
|
|
4769
|
+
].filter(Boolean).join("\n\n");
|
|
4712
4770
|
let items = [];
|
|
4713
4771
|
try {
|
|
4714
4772
|
const raw = await llm.chat(
|
|
@@ -4927,9 +4985,19 @@ function isTechnicalError(e) {
|
|
|
4927
4985
|
}
|
|
4928
4986
|
function silentErrorLabel(e) {
|
|
4929
4987
|
const msg = e instanceof Error ? e.message : String(e ?? "unknown");
|
|
4930
|
-
if (isTechnicalError(e)) return
|
|
4988
|
+
if (isTechnicalError(e)) return `llm/provider unavailable: ${technicalErrorKind(msg)}`;
|
|
4931
4989
|
return msg.slice(0, 160);
|
|
4932
4990
|
}
|
|
4991
|
+
function technicalErrorKind(message) {
|
|
4992
|
+
const msg = message.toLowerCase();
|
|
4993
|
+
if (/401|403|auth|unauthorized|forbidden|apikey|api key|token/.test(msg)) return "auth";
|
|
4994
|
+
if (/quota|balance|billing|insufficient_quota|credit|credits/.test(msg)) return "quota";
|
|
4995
|
+
if (/rate limit|429|too many requests/.test(msg)) return "rate-limit";
|
|
4996
|
+
if (/timeout|etimedout|abort/.test(msg)) return "timeout";
|
|
4997
|
+
if (/econn|enotfound|fetch failed|network/.test(msg)) return "network";
|
|
4998
|
+
if (/overloaded|500|502|503|504|unavailable/.test(msg)) return "provider";
|
|
4999
|
+
return "error";
|
|
5000
|
+
}
|
|
4933
5001
|
|
|
4934
5002
|
// src/engine/stickers.ts
|
|
4935
5003
|
init_esm_shims();
|
|
@@ -5002,12 +5070,14 @@ var Runtime = class extends EventEmitter {
|
|
|
5002
5070
|
pendingReplySeq = /* @__PURE__ */ new Map();
|
|
5003
5071
|
pendingReplyIncoming = /* @__PURE__ */ new Map();
|
|
5004
5072
|
incomingSeq = /* @__PURE__ */ new Map();
|
|
5073
|
+
tgSelf = {};
|
|
5005
5074
|
async start() {
|
|
5006
5075
|
this.presenceProfile = computePresenceProfile(this.cfg);
|
|
5007
5076
|
this.mcps = await startMcpServers(this.cfg);
|
|
5008
5077
|
this.emit("event", { type: "info", text: `MCP started: ${this.mcps.map((m) => m.id).join(", ") || "none"}` });
|
|
5009
5078
|
this.tg = await makeTgAdapter(this.cfg);
|
|
5010
5079
|
await this.tg.start((m) => this.handleIncoming(m));
|
|
5080
|
+
if (this.tg.getSelf) this.tgSelf = this.tg.getSelf();
|
|
5011
5081
|
this.emit("event", { type: "info", text: `Telegram ${this.cfg.mode} \u0437\u0430\u043F\u0443\u0449\u0435\u043D. \u041F\u0440\u043E\u0444\u0438\u043B\u044C: ${this.cfg.slug} | presence: ${this.presenceProfile.pattern} | communication: ${communicationProfileLabel(normalizeCommunicationProfile(this.cfg))}` });
|
|
5012
5082
|
this.lastStage = this.cfg.stage;
|
|
5013
5083
|
this.refreshDailyLife().catch(() => {
|
|
@@ -5205,7 +5275,9 @@ ${m.text}` : media;
|
|
|
5205
5275
|
incoming: incomingText,
|
|
5206
5276
|
relationshipScope: scope,
|
|
5207
5277
|
committedPrimary: this.primaryIsCommitted(),
|
|
5208
|
-
realism
|
|
5278
|
+
realism,
|
|
5279
|
+
tgUsername: this.tgSelf.username,
|
|
5280
|
+
tgDisplayName: this.tgSelf.displayName
|
|
5209
5281
|
});
|
|
5210
5282
|
const reply = sanitizeModelReply(await this.llm.chat([
|
|
5211
5283
|
{
|
|
@@ -5230,7 +5302,9 @@ ${m.text}` : media;
|
|
|
5230
5302
|
incoming: incomingText,
|
|
5231
5303
|
relationshipScope: scope,
|
|
5232
5304
|
committedPrimary: this.primaryIsCommitted(),
|
|
5233
|
-
realism
|
|
5305
|
+
realism,
|
|
5306
|
+
tgUsername: this.tgSelf.username,
|
|
5307
|
+
tgDisplayName: this.tgSelf.displayName
|
|
5234
5308
|
});
|
|
5235
5309
|
const label = kind === "photo" ? "\u0444\u043E\u0442\u043E/\u0441\u0435\u043B\u0444\u0438" : kind === "video" ? "\u0432\u0438\u0434\u0435\u043E" : kind === "voice" ? "\u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435" : "\u043A\u0440\u0443\u0436\u043E\u0447\u0435\u043A";
|
|
5236
5310
|
const reply = sanitizeModelReply(await this.llm.chat([
|
|
@@ -5479,7 +5553,9 @@ ${m.text}` : media;
|
|
|
5479
5553
|
committedPrimary: this.primaryIsCommitted(),
|
|
5480
5554
|
romanticApproach,
|
|
5481
5555
|
realism,
|
|
5482
|
-
media: incoming?.media
|
|
5556
|
+
media: incoming?.media,
|
|
5557
|
+
tgUsername: this.tgSelf.username,
|
|
5558
|
+
tgDisplayName: this.tgSelf.displayName
|
|
5483
5559
|
});
|
|
5484
5560
|
const scopeHint = scope === "acquaintance" ? "\n\u042D\u0442\u043E \u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0438\u0439 \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442, \u043D\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043F\u0430\u0440\u0435\u043D\u044C. \u041D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u043F\u0430\u043C\u044F\u0442\u044C/\u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u044F \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0433\u043E \u043F\u0430\u0440\u043D\u044F. \u0415\u0441\u043B\u0438 \u0437\u0430\u0445\u043E\u0434 \u0440\u043E\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u2014 \u043F\u043E\u0441\u0442\u0430\u0432\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0443. \u0415\u0441\u043B\u0438 \u0432\u043E\u043F\u0440\u043E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 \u2014 \u043E\u0442\u0432\u0435\u0442\u044C \u043F\u043E \u043B\u0435\u0433\u0435\u043D\u0434\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u043E." : "";
|
|
5485
5561
|
const messages = [
|
|
@@ -5609,27 +5685,36 @@ ${tick.intent === "short" ? "\u041E\u0442\u0432\u0435\u0447\u0430\u0439 \u043E\u
|
|
|
5609
5685
|
async composeProactiveMessage(item, hist) {
|
|
5610
5686
|
const conflict = await readConflict(this.cfg.slug);
|
|
5611
5687
|
const realism = await loadRealismContext(this.cfg, item.about);
|
|
5612
|
-
const sys = await buildSystemPrompt(this.cfg, { dailyLife: this.dailyLife, conflict, realism });
|
|
5688
|
+
const sys = await buildSystemPrompt(this.cfg, { dailyLife: this.dailyLife, conflict, realism, tgUsername: this.tgSelf.username, tgDisplayName: this.tgSelf.displayName });
|
|
5689
|
+
const lastMessages = hist.slice(-10);
|
|
5690
|
+
const herLastMessages = lastMessages.filter((t) => t.role === "assistant").map((t) => t.content);
|
|
5691
|
+
const alreadySaidHint = herLastMessages.length ? `
|
|
5692
|
+
|
|
5693
|
+
\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0422\u0412\u041E\u0418 (\u0443\u0436\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0435) \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u044D\u0442\u043E\u043C \u0447\u0430\u0442\u0435:
|
|
5694
|
+
${herLastMessages.map((m) => `- "${m}"`).join("\n")}
|
|
5695
|
+
\u041D\u0415 \u041F\u041E\u0412\u0422\u041E\u0420\u042F\u0419 \u0442\u043E \u0447\u0442\u043E \u0442\u044B \u0443\u0436\u0435 \u043F\u0438\u0441\u0430\u043B\u0430. \u0415\u0441\u043B\u0438 \u0442\u044B \u0443\u0436\u0435 \u0437\u0434\u043E\u0440\u043E\u0432\u0430\u043B\u0430\u0441\u044C \u2014 \u041D\u0415 \u0437\u0434\u043E\u0440\u043E\u0432\u0430\u0439\u0441\u044F \u0441\u043D\u043E\u0432\u0430. \u0415\u0441\u043B\u0438 \u0442\u044B \u0443\u0436\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u0430 \u2014 \u043D\u0435 \u0434\u0443\u0431\u043B\u0438\u0440\u0443\u0439 \u0441\u0432\u043E\u0439 \u043E\u0442\u0432\u0435\u0442.` : "";
|
|
5613
5696
|
const proactiveHint = `
|
|
5614
5697
|
|
|
5615
5698
|
# \u041F\u0420\u041E\u0410\u041A\u0422\u0418\u0412\u041D\u041E\u0415 \u0421\u041E\u041E\u0411\u0429\u0415\u041D\u0418\u0415
|
|
5616
5699
|
\u0422\u044B \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0430\u043C\u0430 \u043F\u0438\u0448\u0435\u0448\u044C \u0435\u043C\u0443 \u043F\u0435\u0440\u0432\u0430\u044F. \u041D\u0435 \u043E\u043D \u0442\u0435\u0431\u0435. \u041A\u043E\u043D\u0442\u0435\u043A\u0441\u0442:
|
|
5617
|
-
- \
|
|
5700
|
+
- \u0422\u0435\u043C\u0430/\u043F\u043E\u0432\u043E\u0434: "${item.about}"
|
|
5618
5701
|
- \u041F\u043E\u0447\u0435\u043C\u0443 \u0442\u044B \u043F\u0438\u0448\u0435\u0448\u044C: "${item.reason}"
|
|
5619
5702
|
- \u0412\u0430\u0436\u043D\u043E\u0441\u0442\u044C \u0434\u043B\u044F \u0442\u0435\u0431\u044F: ${item.importance}/3
|
|
5620
5703
|
- \u041F\u043E\u043F\u044B\u0442\u043A\u0430 \u2116${item.attempts + 1}
|
|
5621
5704
|
|
|
5622
5705
|
\u0412\u0410\u0416\u041D\u041E:
|
|
5623
|
-
- \u041D\u0435 \u043F\u0438\u0448\u0438 "\u043F\u0440\u0438\u0432\u0435\u0442, \u043A\u0430\u043A \u0434\u0435\u043B\u0430" \u0441\u0443\u0445\u043E. \u041F\u0438\u0448\u0438 \u043A\u0430\u043A \u0436\u0438\u0432\u043E\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A
|
|
5706
|
+
- \u041D\u0435 \u043F\u0438\u0448\u0438 "\u043F\u0440\u0438\u0432\u0435\u0442, \u043A\u0430\u043A \u0434\u0435\u043B\u0430" \u0441\u0443\u0445\u043E. \u041F\u0438\u0448\u0438 \u043A\u0430\u043A \u0436\u0438\u0432\u043E\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A.
|
|
5624
5707
|
- \u0415\u0441\u043B\u0438 \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u044C 1 \u2014 \u043A\u043E\u0440\u043E\u0442\u043A\u043E\u0435 \u043B\u044E\u0431\u043E\u043F\u044B\u0442\u0441\u0442\u0432\u043E ("\u043D\u0443 \u043A\u0430\u043A \u0442\u0430\u043C")
|
|
5625
5708
|
- \u0415\u0441\u043B\u0438 2 \u2014 \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0435\u0441 ("\u043D\u0443 \u043A\u0430\u043A, \u043F\u0440\u043E\u0448\u043B\u043E \u0443\u0436\u0435?")
|
|
5626
5709
|
- \u0415\u0441\u043B\u0438 3 \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u043F\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0448\u044C, \u043C\u043E\u0436\u043D\u043E 2-3 \u043F\u0443\u0437\u044B\u0440\u044F, \u044D\u043C\u043E\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E.
|
|
5627
5710
|
- \u041D\u0415 \u0443\u043F\u043E\u043C\u0438\u043D\u0430\u0439 \u0447\u0442\u043E "\u043F\u043E\u043C\u043D\u0438\u043B\u0430" \u0438\u043B\u0438 "\u0437\u0430\u043F\u0438\u0441\u0430\u043B\u0430" \u2014 \u043F\u0440\u043E\u0441\u0442\u043E \u043F\u0438\u0448\u0435\u0448\u044C \u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u0430\u044F \u0434\u0435\u0432\u0443\u0448\u043A\u0430.
|
|
5628
|
-
- \u0415\u0441\u043B\u0438 \u044D\u0442\u043E \u0443\u0436\u0435 \u043D\u0435 \u043F\u0435\u0440\u0432\u0430\u044F \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u2014 \u0443\u0447\u0442\u0438 \u044D\u0442\u043E (\u043C\u0431 \u043E\u0431\u0438\u0436\u0435\u043D\u043D\u043E "\u043D\u0443 \u0442\u044B \u0438 \u043D\u0435 \u043F\u0438\u0448\u0435\u0448\u044C" \u0438\u043B\u0438 \u043C\u044F\u0433\u043A\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0438)
|
|
5711
|
+
- \u0415\u0441\u043B\u0438 \u044D\u0442\u043E \u0443\u0436\u0435 \u043D\u0435 \u043F\u0435\u0440\u0432\u0430\u044F \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u2014 \u0443\u0447\u0442\u0438 \u044D\u0442\u043E (\u043C\u0431 \u043E\u0431\u0438\u0436\u0435\u043D\u043D\u043E "\u043D\u0443 \u0442\u044B \u0438 \u043D\u0435 \u043F\u0438\u0448\u0435\u0448\u044C" \u0438\u043B\u0438 \u043C\u044F\u0433\u043A\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0438).
|
|
5712
|
+
- \u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0422\u041E\u041B\u042C\u041A\u041E \u0442\u0435\u043C\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0420\u0415\u0410\u041B\u042C\u041D\u041E \u043E\u0431\u0441\u0443\u0436\u0434\u0430\u043B\u0438\u0441\u044C \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435 \u0438\u043B\u0438 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u044B \u0432 long-term memory. \u041D\u0415 \u041F\u0420\u0418\u0414\u0423\u041C\u042B\u0412\u0410\u0419 \u0444\u0430\u043A\u0442\u044B \u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435 \u0431\u044B\u043B\u043E. \u0415\u0441\u043B\u0438 \u0442\u0435\u043C\u0430 "${item.about}" \u041D\u0415 \u0443\u043F\u043E\u043C\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0438 \u0438 \u043D\u0435 \u0432 long-term memory \u2014 \u041D\u0415 \u0441\u0441\u044B\u043B\u0430\u0439\u0441\u044F \u043D\u0430 \u043D\u0435\u0451 \u043A\u0430\u043A \u043D\u0430 \u043E\u0431\u0449\u0443\u044E \u0442\u0435\u043C\u0443, \u0430 \u043D\u0430\u043F\u0438\u0448\u0438 \u043E\u0442 \u0441\u0435\u0431\u044F \u043A\u0430\u043A \u0441\u0432\u043E\u044E \u043D\u043E\u0432\u043E\u0441\u0442\u044C/\u043C\u044B\u0441\u043B\u044C.
|
|
5713
|
+
- \u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0438 \u043D\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0438. \u0415\u0441\u043B\u0438 \u0442\u044B \u0423\u0416\u0415 \u0437\u0434\u043E\u0440\u043E\u0432\u0430\u043B\u0430\u0441\u044C \u0438\u043B\u0438 \u043E\u0442\u0432\u0435\u0447\u0430\u043B\u0430 \u2014 \u041D\u0415 \u043D\u0430\u0447\u0438\u043D\u0430\u0439 \u0441\u043D\u043E\u0432\u0430 \u0441 "\u043F\u0440\u0438\u0432\u0435\u0442". \u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E.${alreadySaidHint}`;
|
|
5629
5714
|
const messages = [
|
|
5630
5715
|
{ role: "system", content: sys + proactiveHint },
|
|
5631
5716
|
...hist.slice(-20).map((t) => ({ role: t.role, content: t.content })),
|
|
5632
|
-
{ role: "user", content: "[system: \u043F\u043E\u0440\u0430 \u043F\u0438\u0441\u0430\u0442\u044C \u0435\u043C\u0443 \u043F\u0435\u0440\u0432\u043E\u0439 \u043F\u043E \u0442\u0435\u043C\u0435 \u0432\u044B\u0448\u0435. \u0421\u0444\u043E\u0440\u043C\u0443\u043B\u0438\u0440\u0443\u0439 \u0435\u0451 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435.]" }
|
|
5717
|
+
{ role: "user", content: "[system: \u043F\u043E\u0440\u0430 \u043F\u0438\u0441\u0430\u0442\u044C \u0435\u043C\u0443 \u043F\u0435\u0440\u0432\u043E\u0439 \u043F\u043E \u0442\u0435\u043C\u0435 \u0432\u044B\u0448\u0435. \u0421\u0444\u043E\u0440\u043C\u0443\u043B\u0438\u0440\u0443\u0439 \u0435\u0451 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435. \u041D\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439 \u0442\u043E \u0447\u0442\u043E \u0443\u0436\u0435 \u0433\u043E\u0432\u043E\u0440\u0438\u043B\u0430.]" }
|
|
5633
5718
|
];
|
|
5634
5719
|
const reply = sanitizeModelReply(await this.llm.chat(messages, { temperature: 0.95, maxTokens: 3500 }));
|
|
5635
5720
|
return reply.trim();
|