小布工坊.
← ライブラリに戻る

リソース詳細 · 消息处理

按会话合并短时间内的连续消息

把时间间隔接近的短消息合成一个文本批次,分别维护每个会话的尾部状态,同时限制字符数和消息条数,避免不同会话的内容混在一起。

本文・例・ライセンスは原文のままです。コードを表示するだけで、オンライン実行やAI呼び出しは行いません。

リソース詳細

适合学习分组、滑动时间窗口和输入校验。示例处理已经收到的一组文本,不包含平台接口;正式接入时需另外处理权限、去重、重试和定时触发,并避免在日志中记录消息正文。

始める前に

対応環境
Windows · macOS · Linux
更新日
  • 准备 Node.js 24 和文本编辑器;本站仅在 Node.js v24.19.0 的本地环境核对附带示例。
  • 准备带 sessionId、text、atMs 的虚构消息,保持接收顺序。
node session-batch.mjs

先在文件所在文件夹打开终端。本例无需 npm install,不联网、不调用 AI 接口;不含真实平台接入。

よくある注意点

  • 保存为指定 .mjs 文件,避免变成 .mjs.txt;不要复制 Markdown 的三反引号。
  • 它只合并已收到的消息数组,不会自动监听平台、去重或延迟发送。
公式セットアップ手順 ↗

本文全文

// SPDX-License-Identifier: MIT
// 原创教学示例:输入保持接收顺序;会话标识按原值隔离。
export function mergeMessages(messages, options = {}) {
  const { gapMs = 1500, maxChars = 2000, maxCount = 8 } = options;
  if (!Array.isArray(messages) || !Number.isFinite(gapMs) || gapMs < 0 ||
      !Number.isSafeInteger(maxChars) || maxChars < 1 ||
      !Number.isSafeInteger(maxCount) || maxCount < 1) {
    throw new TypeError("批次选项无效");
  }
  const batches = [];
  const tails = new Map();
  for (const message of messages) {
    const { sessionId, text, atMs } = message ?? {};
    if (typeof sessionId !== "string" || !sessionId.trim() ||
        typeof text !== "string" || !text.trim() ||
        !Number.isSafeInteger(atMs) || atMs < 0) {
      throw new TypeError("消息需要会话、文本和有效时间");
    }
    if (text.length > maxChars) throw new RangeError("单条消息过长");
    const tail = tails.get(sessionId);
    const canAppend = tail && atMs >= tail.lastAt &&
      atMs - tail.lastAt <= gapMs && tail.count < maxCount &&
      tail.text.length + 1 + text.length <= maxChars;
    if (canAppend) {
      tail.text += "\n" + text;
      tail.lastAt = atMs;
      tail.count += 1;
    } else {
      const batch = { sessionId, text, firstAt: atMs, lastAt: atMs, count: 1 };
      batches.push(batch);
      tails.set(sessionId, batch);
    }
  }
  return batches; // 返回新对象,不修改输入消息。
}

console.log(mergeMessages([
  { sessionId: "demo-a", text: "你好", atMs: 0 },
  { sessionId: "demo-b", text: "独立会话", atMs: 200 },
  { sessionId: "demo-a", text: "补充一个问题", atMs: 500 },
]));
// 两个批次;demo-a 的两条消息合并,demo-b 单独保留。

使い方

用资源自带的三条虚构消息观察分组:demo-a 的两条合在一起,demo-b 保持为独立会话。

  1. 保存完整代码

    复制教学代码及末尾示例,保存为 session-batch.mjs,保留许可证说明,不要把三反引号也放进文件。

  2. 运行示例

    在文件所在文件夹打开终端,执行下方命令。它只处理文件里写好的三条虚构消息,不读取真实聊天记录。

  3. 检查分组依据

    结果应有两个批次,demo-a 的 count 为 2,demo-b 为 1。试改 atMs 或 gapMs,可以观察连续消息何时分开;不同会话仍独立处理。

保存ファイル名
session-batch.mjs
実行環境
Node.js 24;本站实际核验版本为 v24.19.0。使用 .mjs 文件直接运行,不需要安装第三方 npm 依赖。
依存関係と費用
这段示例不联网、不调用 AI 接口,不产生模型接口费用。运行设备、电力由使用者自行承担;接入真实模型或平台后的费用需另行核对。

実行コマンド

node session-batch.mjs

期待される出力

[
  {
    sessionId: 'demo-a',
    text: '你好\n补充一个问题',
    firstAt: 0,
    lastAt: 500,
    count: 2
  },
  {
    sessionId: 'demo-b',
    text: '独立会话',
    firstAt: 200,
    lastAt: 200,
    count: 1
  }
]

ローカル検証

2026-10-22 · Node.js v24.19.0

已在本站本地运行资源中原样附带的教学片段,核对下方控制台输出;不代表已验证生产环境、平台接入或所有边界情况。

適した用途

  • 学习分组与滑动时间窗口
  • 理解短消息如何形成独立会话批次

使用前の注意

  • 这里是对已收到的一组消息做计算,不是持续等待新消息的后台机器人。
  • 输入应保持接收顺序;示例不替你进行平台鉴权、去重、失败重试或定时发送。
  • 控制台对象的缩进可能因运行环境不同而变化,重点核对字段、批次数和文字内容。

作者と出典

クレジット
包子海梦 · AI辅助开发
作者と出典
提示集贡献者

通知と変更内容

新编写的通用教学示例,发布前仍需核对来源与运行效果。

ライセンス全文

MIT

MIT License

Copyright (c) 2026 提示集贡献者

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

検証範囲

教学代码已运行

已运行完整带许可的教学文件并核对输出;不代表生产部署、平台接入或全部边界情况都已验证。

2026-10-23 Node.js v24.19.0