

























@@ -60,7 +60,10 @@ import {
6060resolveInboundMediaFileId,
6161} from "./bot-handlers.media.js";
6262import type { TelegramMediaRef } from "./bot-message-context.js";
63-import type { TelegramMessageContextOptions } from "./bot-message-context.types.js";
63+import type {
64+TelegramMessageContextOptions,
65+TelegramPromptContextEntry,
66+} from "./bot-message-context.types.js";
6467import {
6568parseTelegramNativeCommandCallbackData,
6669RegisterTelegramHandlerParams,
@@ -547,6 +550,80 @@ export const registerTelegramHandlers = ({
547550};
548551};
549552553+const toPromptContextMessage = (
554+node: TelegramCachedMessageNode,
555+flags?: { replyTarget?: boolean },
556+) => ({
557+message_id: node.messageId,
558+thread_id: node.threadId,
559+sender: node.sender,
560+sender_id: node.senderId,
561+sender_username: node.senderUsername,
562+timestamp_ms: node.timestamp,
563+body: node.body,
564+media_type: node.mediaType,
565+media_ref: node.mediaRef,
566+reply_to_id: node.replyToId,
567+is_reply_target: flags?.replyTarget === true ? true : undefined,
568+});
569+570+const buildPromptContextForMessage = (
571+msg: Message,
572+replyChainNodes: TelegramCachedMessageNode[],
573+): TelegramPromptContextEntry[] => {
574+const messageId = typeof msg.message_id === "number" ? String(msg.message_id) : undefined;
575+const currentNode = messageCache.get({
576+ accountId,
577+chatId: msg.chat.id,
578+ messageId,
579+});
580+const threadId = currentNode?.threadId ? Number(currentNode.threadId) : undefined;
581+const currentWindow = messageCache.recentBefore({
582+ accountId,
583+chatId: msg.chat.id,
584+ messageId,
585+ ...(Number.isFinite(threadId) ? { threadId } : {}),
586+limit: 10,
587+});
588+const replyTargetId = replyChainNodes[0]?.messageId;
589+const replyTargetWindow = messageCache.around({
590+ accountId,
591+chatId: msg.chat.id,
592+messageId: replyTargetId,
593+ ...(Number.isFinite(threadId) ? { threadId } : {}),
594+before: 2,
595+after: 2,
596+});
597+const entries: TelegramPromptContextEntry[] = [];
598+if (currentWindow.length > 0) {
599+entries.push({
600+label: "Current local chat window",
601+source: "telegram",
602+type: "chat_window",
603+payload: {
604+order: "chronological",
605+relation: "before_current_message",
606+messages: currentWindow.map((node) => toPromptContextMessage(node)),
607+},
608+});
609+}
610+if (replyTargetWindow.length > 0) {
611+entries.push({
612+label: "Nearby reply target window",
613+source: "telegram",
614+type: "chat_window",
615+payload: {
616+order: "chronological",
617+relation: "around_reply_target",
618+messages: replyTargetWindow.map((node) =>
619+toPromptContextMessage(node, { replyTarget: node.messageId === replyTargetId }),
620+),
621+},
622+});
623+}
624+return entries;
625+};
626+550627const resolveReplyMediaForChain = async (
551628ctx: TelegramContext,
552629chain: TelegramCachedMessageNode[],
@@ -598,7 +675,16 @@ export const registerTelegramHandlers = ({
598675) => {
599676const replyChainNodes = buildReplyChainForMessage(msg);
600677const { replyMedia, replyChain } = await resolveReplyMediaForChain(ctx, replyChainNodes);
601-await processMessage(ctx, allMedia, storeAllowFrom, options, replyMedia, replyChain);
678+const promptContext = buildPromptContextForMessage(msg, replyChainNodes);
679+await processMessage(
680+ctx,
681+allMedia,
682+storeAllowFrom,
683+options,
684+replyMedia,
685+replyChain,
686+promptContext,
687+);
602688};
603689604690const isAllowlistAuthorized = (
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。