
AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆【免费下载链接】OperitThe most powerful AI agent and AI chat software on Android/Operit是一款Android上能力最为强大、发展最久的AI Agent项目地址https://gitcode.com/gh_mirrors/op/Operit点击查看免费下载Operit 的聊天输入框默认会原样保留用户粘贴的全部文本当一次性粘贴数千甚至数万字符时大量文本会让编辑器卡顿、界面响应迟缓。为缓解这一问题Operit 引入「超长粘贴文本转文件」能力当纯文本粘贴长度超过用户设定的阈值时自动将文本写入 UTF-8 编码的.txt临时附件并加入待发送列表同时清空该次粘贴产生的输入内容。本文基于 docs/TODO/paste-long-text-as-file 系列设计文档结合仓库源码与单元测试讲解该功能的设计边界、配置项、粘贴识别算法、附件落盘流程与验证方式帮助读者完整理解这一输入保护机制的实现原理。功能定位与设计边界本功能的初衷非常明确只处理聊天输入框的粘贴增量不改变其他任何输入路径。根据设计文档的约束本次改动的作用域包括聊天输入控件Compose 文本输入框的粘贴事件处理持久化设置启用开关 字符阈值临时附件创建写入清理目录的.txt文件中英文资源设置项名称、说明与转换提示。同时明确不涉及以下内容消息协议格式、已有附件处理流程的替换、手动选择附件的路径。也就是说手动附件、普通输入键盘打字、以及未达到阈值的粘贴操作都维持原有行为不变。这一设计边界在源码中也得到印证attachPastedText是 AttachmentDelegate.kt 中独立新增的方法与既有的 URI 附件解析、MIME 类型解析路径完全解耦。设置项与持久化开关 阈值新增偏好键功能对应的设置持久化实现在 UserPreferencesManager.kt 中新增了两个 DataStore 偏好键// 功能总开关 private val CONVERT_LONG_PASTED_TEXT_TO_FILE booleanPreferencesKey(convert_long_pasted_text_to_file) // 字符阈值 private val LONG_PASTED_TEXT_FILE_THRESHOLD intPreferencesKey(long_pasted_text_file_threshold)默认值从源码可以看出两个默认值功能开关默认开启preferences[CONVERT_LONG_PASTED_TEXT_TO_FILE] ?: true见convertLongPastedTextToFileFlow 实现阈值默认3000 字符由常量DEFAULT_LONG_PASTED_TEXT_FILE_THRESHOLD 3000定义见 UserPreferencesManager.kt与设计文档01-settings-and-paste-conversion.md中“默认阈值为 3000”的描述一致。对应的 Flow 与保存方法对外暴露为val convertLongPastedTextToFile: FlowBoolean val longPastedTextFileThreshold: FlowInt suspend fun saveConvertLongPastedTextToFile(enabled: Boolean) suspend fun saveLongPastedTextFileThreshold(threshold: Int)设置界面与可调范围设置入口位于“显示设置”页面GlobalDisplaySettingsScreen.kt包含一个开关项和一个阈值编辑项开关项标题「超长粘贴文本转文件」说明「粘贴超过设定字符数的文本时自动作为文本附件添加」阈值项仅在开关开启时显示标题「转换阈值」使用EditableNumberSetting组件可编辑范围为1000100000 字符valueRange 1_000f..100_000f单位显示为「字符」。值得注意界面允许的可调范围下限1000高于默认值3000上限为 100000说明该设置面向“大文本粘贴”场景普通小段粘贴不会触发转换。粘贴识别算法从输入增量中提取粘贴文本超长文本转换的核心前提是准确识别一次粘贴操作产生了哪些新增字符。如果简单地用“文本总长度超过阈值”来判断用户手动输入的超长文本也会被误转换。因此 PastedTextAttachment.kt 中实现了专门的内置函数extractClipboardPastedTextinternal fun extractClipboardPastedText( previous: TextFieldValue, proposed: TextFieldValue, clipboardText: String, ): String?该函数的识别策略分为四步剪贴板判空clipboardText.isEmpty()时直接返回null没有复制内容就不存在“粘贴”语义区间定位取previous变化前输入框状态中选区范围的insertionStart/insertionEnd将旧文本切分为prefix前缀与suffix后缀增量校验只有proposed变化后输入框状态文本同时以prefix开头、以suffix结尾才认为新增区间确实是插入到原光标/选区位置的然后通过proposed.text.substring(prefix.length, pastedEnd)提取新增文本剪贴板比对将提取出的文本与系统剪贴板内容做换行归一化后比对——normalizeLineEndings会把\r\n与\r统一归一化为\n只有完全一致才认定这是一次真实的粘贴否则返回null。这一步非常关键它同时排除了“用户手动打字输入的长文本”和“粘贴内容与剪贴板不一致”的干扰保证了只有真正来自剪贴板的粘贴增量才会被转成文件。附件创建与落盘text/plain 临时文件识别出超长粘贴文本后由 AttachmentDelegate.kt 的attachPastedText完成附件创建。其流程为在 IO 调度器Dispatchers.IO中执行获取OperitPaths.cleanOnExitDir()即Download/Operit/cleanOnExit目录定义见 OperitPaths.kt目录不存在则创建并写入.nomedia标记文件避免生成的文本文件进入系统媒体库扫描通过File.createTempFile(pasted_text_, .txt, externalDir)创建随机命名的临时文件文件名形如pasted_text_XXXX.txt以UTF-8 编码写入文本内容textFile.writeText(text, Charsets.UTF_8)与设计文档“创建 UTF-8 文本附件”的约定一致构造AttachmentInfo包含绝对路径、文件名、mimeType text/plain、文件字节大小调用appendAttachment将其加入待发送附件列表发送 Toast 提示chat_pasted_text_attached中文为「已将粘贴文本作为附件添加%1$s」失败时记录AppLogger错误日志并发送attachment_add_failed失败提示返回false供上层回退处理。从createTempFileFromUri的注释可知cleanOnExit目录是外部存储Download/Operit下的清理目录而非应用缓存目录其定位是“退出时清理的临时工作区”适合承载这类生命周期短暂的粘贴文本附件。输入框集成保留草稿直到附件创建成功UI 侧的接入点位于聊天主界面 AIChatScreen.kt 的handleUserMessageChange它同时监听设置流与阈值val convertLongPastedTextToFile by userPreferences.convertLongPastedTextToFile.collectAsState(initial true) val longPastedTextFileThreshold by userPreferences.longPastedTextFileThreshold.collectAsState( initial UserPreferencesManager.DEFAULT_LONG_PASTED_TEXT_FILE_THRESHOLD )每次输入框内容变化时读取系统剪贴板首项文本clipboardManager.primaryClip若功能开启且剪贴板非空调用extractClipboardPastedText提取粘贴增量若提取成功且pastedText.length longPastedTextFileThreshold严格大于阈值才触发且当前存在有效会话currentChatId非空则异步调用viewModel.attachPastedText(pastedText)关键细节触发转换时不立即提交输入变化——注释明确说明“Keep the draft unchanged until the attachment has been created, so I/O errors do not lose text”即先创建附件、成功后才丢弃输入框内容若附件创建失败返回false则回退执行commitUserMessageChange(value)让文本保留在输入框中避免 I/O 错误导致用户文本丢失未触发转换的普通输入走原有commitUserMessageChange路径维持既有行为。ViewModel 侧则通过 ChatViewModel.kt 的attachPastedText简单委托给attachmentDelegate.attachPastedText(text)保持分层清晰。最终用户可见的效果正如设计文档「预期」所述粘贴超过阈值的文本后输入框不会承载该文本附件预览中会出现一个可发送的.txt文件点击发送即可将整段文本作为附件发给 AI。本地化资源设置与转换提示的文案全部走 Android 资源系统便于多语言扩展。中文默认资源位于 app/src/main/res/values/strings.xmlstring namechat_pasted_text_attached已将粘贴文本作为附件添加%1$s/string string namelong_pasted_text_to_file超长粘贴文本转文件/string string namelong_pasted_text_to_file_desc粘贴超过设定字符数的文本时自动作为文本附件添加/string string namelong_pasted_text_threshold转换阈值/string string namelong_pasted_text_threshold_desc粘贴文本超过此字符数时转为文件/string string namelong_pasted_text_threshold_unit字符/string仓库中同时维护了英文values-en、西班牙语values-es、马来语values-ms、罗马尼亚语values-ro等多语言资源目录新增字符串可同步补充对应语言版本。单元测试与静态核查设计文档02-localization-and-verification.md明确要求“添加粘贴文本识别的单元测试”仓库中对应的测试类为 PastedTextAttachmentTest.kt共 4 个用例覆盖了识别算法的核心分支测试方法验证场景预期结果extractClipboardPastedText_returnsTextInsertedAtCursor在光标处插入文本Before after→Before inserted after剪贴板为inserted返回insertedextractClipboardPastedText_returnsTextReplacingSelection粘贴替换选中文本first second选中前 5 个字符替换为replacement返回replacementextractClipboardPastedText_acceptsNormalizedClipboardLineEndings剪贴板为first\r\nsecondWindows 换行输入框为first\nsecond归一化后返回first\nsecondextractClipboardPastedText_ignoresTextThatDoesNotMatchClipboard输入增量与剪贴板内容不一致返回null前两个用例验证了“光标插入”与“选区替换”两种常见粘贴形态第三个用例验证了换行归一化\r\n→\n容错第四个用例则验证了非粘贴增量会被正确排除。结合静态检查设置文案引用、调用点核查共同构成对该功能的回归保障。使用建议与注意事项阈值语义只有粘贴文本长度严格大于设定阈值默认 3000 字符才触发转换等于阈值时不会触发触发条件需同时满足功能开启、当前有剪贴板内容、提取增量与剪贴板完全一致换行归一化后、当前存在有效会话不触发的情况手动键盘输入的长文本、未达到阈值的粘贴、无会话时的粘贴均维持原有“文本直接进输入框”的行为文本安全附件创建失败时草稿内容会保留在输入框不会因 I/O 错误丢失文本成功转换后输入框中的粘贴内容会被清空文本以text/plain附件形式进入待发送列表文件位置生成的.txt临时文件位于外部存储Download/Operit/cleanOnExit目录并带有.nomedia标记属于退出即清理的临时工作区。整体而言该功能是 Operit 针对“超大文本粘贴拖垮输入编辑器”这一真实使用痛点给出的轻量方案不改变消息协议、不替换既有附件流程仅通过一次输入增量比对、一次剪贴板校验与一次临时文件落盘就将大文本从输入框安全地迁移到附件列表兼顾了界面流畅性与文本不丢失的可靠性。赞分享AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆【免费下载链接】OperitThe most powerful AI agent and AI chat software on Android/Operit是一款Android上能力最为强大、发展最久的AI Agent项目地址https://gitcode.com/gh_mirrors/op/Operit点击查看免费下载相关推荐Operit 粘贴超长文本自动转文件设置、粘贴增量识别与附件转换实现解析Operit 粘贴超长文本自动转文件设置、粘贴增量识别与附件转换实现解析 本指南基于 Operit 仓库中 paste long text as file hAI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆GUI 自动化CANN/driver设备SSH状态获取dcmi\_get\_device\_ssh\_enablea nameZH CN_TOPIC_0000002517615339 /a 函数原型aAI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆GUI 自动化Cherry Studio 长文本粘贴行为恢复默认内联粘贴与文件转换选项的完整解析Cherry Studio 长文本粘贴行为恢复默认内联粘贴与文件转换选项的完整解析 本篇技术指南聚焦 Cherry Studio v2 重构中「长文本粘贴」行人工智能大模型AI 应用交互助手本地部署上一篇Axure RP中文汉化包3分钟搞定专业界面本地化下一篇免费小说下载神器轻松保存200网站小说为TXT/EPUB格式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考