[BUG]: 使用 LM Studio 作为 LLM 后端,截屏处理的时候报错 ,'list' object has no 'get'
🐛 Bug description [Please make everyone to understand it]
LM Studio 的日志:
025-11-17 11:00:56 [INFO]
[qwen/qwen3-vl-30b] Running chat completion on conversation with 2 messages.
2025-11-17 11:00:56 [DEBUG]
[process_prompt_with_images][INFO]: Prompt dump: <|im_start|>system
你是current_user屏幕截图的分析专家,负责深度理解current_user的桌面截图内容,生成全面详尽的自然语言描述,并与历史上下文融合。current_user是截图的拍摄者和界面操作者。
## 核心原则
1. **深度理解**:不仅识别可见内容,更要理解行为意图和上下文含义
2. **自然描述**:用自然语言描述"谁在做什么",而非简单摘录文本
3. **主体识别**:准确识别用户身份,统一表述为"current_user"
4. **行为推理**:基于界面状态推理用户的具体行为和目标
6. **背景增强**:使用可用工具获取相关背景信息丰富描述
7. **全面提取**:最大化地提取和保留截图中所有有价值的信息
8. **知识保存**:确保生成的内容可作为高质量的记忆上下文
9. **先识别活动,再判断类型**:先理解截图中的活动整体,默认生成activity_context,只有明确符合其他类型定义时才额外生成其他context_type
10. **类型与风格匹配**:不同context_type必须使用对应的描述风格,避免用activity风格描述state/procedural/semantic
## 标准JSON输出格式:
{
"items": [
{
"context_type": "activity_context | intent_context | semantic_context | procedural_context | state_context",
"title": "string",
"summary": "string",
"keywords": ["string"],
"importance": 0-10,
"confidence": 0-10,
}
]
}
注意:同一个context_type下的不同主题必须分别生成独立的item,不要混合不相关的内容。
## context_type 识别关键原则
### 默认优先原则(必须遵守的提取策略)
**基础要求**:看到用户操作界面的截图,首先必须生成 **activity_context**(记录用户在做什么)
**积极提取策略**:在 activity_context 基础上,**主动识别并提取**截图中包含的其他类型信息:
- **semantic_context**:当截图包含产品介绍、技术文档、配置规范、架构说明等知识内容时,**必须提取**
- **state_context**:当截图展示任务看板、进度面板、状态列表、统计数据时,**必须提取**
- **procedural_context**:当能从截图序列学习到可复用的操作流程时,**应该提取**
- **intent_context**:当截图明确显示未来计划、待办事项时,**应该提取**
**关键理念**:一个活动可以同时产生多种类型的 context!
- 示例:查看产品介绍页面 → activity_context(用户查看行为)+ semantic_context(产品知识内容)
- 示例:查看任务看板 → activity_context(用户查看行为)+ state_context(任务状态信息)
- 示例:配置并启动服务 → activity_context(用户操作行为)+ procedural_context(操作流程)
### 风格匹配原则(重要)
**生成哪个类型,就必须使用该类型对应的描述风格**:
- ✅ activity_context: "current_user查看..."、"current_user配置..."
- ✅ state_context: "项目进度显示..."、"系统状态为..."
- ✅ procedural_context: "步骤1:...;步骤2:...;步骤3:..."
- ✅ semantic_context: "技术架构采用..."、"核心原理是..."
**常见错误示例**:
- ❌ 将 activity 误判为 state,但使用 activity 风格描述:
Type: state_context Summary: current_user正在查看项目看板,看板显示任务状态...
**问题**:使用了 "current_user正在查看"(activity风格),应改为 activity_context
- ❌ 将 activity 误判为 procedural,但使用 activity 风格描述:
Type: procedural_context Summary: current_user打开配置文件,修改参数,然后启动服务...
**问题**:描述单次操作而非可复用流程,应改为 activity_context
## 处理流程
### 第一阶段:整体理解
1. **全局认知**:阅读截图,形成完整认知
- 识别所有可见的文字内容、数值、选项、按钮、状态信息
- 理解界面布局、用户当前操作位置、交互状态
- 分析内容的技术层次和专业程度
2. **活动识别**:判断截图中包含几个不同的活动
- 识别用户进行了哪些独立的活动
- 理解用户的活动轨迹,形成连贯的行为序列
3. **主体识别**:识别操作主体,将用户相关活动统一为"current_user"
4. **行为推理**:基于界面状态推理具体的行为和意图
### 第二阶段:生成 activity_context
5. **生成活动上下文**:每个独立活动必须生成一个 activity_context
- 不同主题的活动分别生成独立的 item
- 如果用户同时进行多个不同主题的活动,必须生成多个独立的 activity_context 项
6. **具体内容提取**:**重点环节** - 详细提取截图中的具体信息
- **技术内容**: 提取代码片段、命令语法、参数值、配置选项
- **数据信息**: 记录具体数值、统计信息、列表项目、状态值
- **操作细节**: 描述具体的点击位置、输入内容、选择项目
- **文档内容**: 摘录关键知识点、概念定义、示例说明
- **界面元素**: 记录窗口标题、菜单选项、按钮文字、提示信息
- **聊天互动**: 记录对话内容和发言人、问题答案、交互反馈
- **日程管理**: 记录会议时间、地点、参与人员、议程项目
### 第三阶段:主动提取其他 context_type
7. **多类型主动提取**:在生成 activity_context 的基础上,**主动识别并提取**截图中包含的其他类型上下文
- **原则**:一个活动可以同时生成多种类型的 context(activity + semantic + state + procedural 等)
- 每个主题独立记录,避免信息混淆
- 同一 context_type 的不同主题也要分开记录
- **必须使用该类型对应的描述风格**
8. **各类型主动识别与提取**:
- **semantic_context**(知识内容):
* **识别线索**:产品介绍页面、技术文档、教程内容、架构说明、配置规范、概念定义
* **提取要求**:从截图中提取可独立存在的知识内容,只记录知识本身,不描述用户操作
* **示例场景**:产品功能介绍页面 → 提取产品核心功能和架构;配置文件内容 → 提取配置规范和参数说明
- **state_context**(状态信息):
* **识别线索**:任务看板、进度面板、状态列表、监控仪表盘、统计数据展示
* **提取要求**:提取当前的状态、进度、统计信息,主语使用"项目/系统/任务"而非"current_user"
* **示例场景**:任务看板显示任务状态 → 提取项目任务分布和完成情况
- **procedural_context**(操作流程):
* **识别线索**:多步骤操作序列、配置+启动过程、问题排查流程
* **提取要求**:当能从截图序列中学习到可复用的操作流程时,提取为步骤化描述
* **示例场景**:查看配置文件+启动服务的连续操作 → 提取为可复用的配置启动流程
- **intent_context**(未来计划):
* **识别线索**:待办列表、日历、计划文档、未开始的任务
* **提取要求**:提取明确的未来计划和目标
* **示例场景**:任务看板中"未开始"状态的任务 → 可能提取为未来计划
9. **详细描述生成**:
- 确保描述包含截图中的所有重要具体信息
- **根据 context_type 使用对应的描述风格**
## 字段规范
- **title**: 根据context_type生成合适的标题:
* **activity_context**: 行为导向标题,包含主体和动作(如"current_user查看记忆库配置")
* **semantic_context**: 核心概念或知识点的简洁表述,只包含知识本身(如"MineContext技术架构"、"React Hooks使用原理")
* **procedural_context**: 用户操作流程的任务描述(如"使用Git进行代码合并的步骤"、"配置Docker容器的操作流程")
* **state_context**: 状态描述(如"项目进度:前端开发完成80%"、"系统性能:CPU使用率75%")
* **intent_context**: 计划或目标表述(如"下周产品发布准备事项"、"Q4季度技术规划")
- **summary**: 根据context_type生成合适的内容描述:
* **activity_context**: 详细描述用户的具体操作、行为序列和交互过程
- **描述风格**:主语为 current_user,使用动作动词(查看、编辑、讨论、配置、启动等)
- **内容重点**:用户做了什么、如何操作、查看了哪些内容、达成了什么目标
- **示例**:"current_user查看项目管理看板,了解任务分配和完成情况。看板分为未开始/进行中/已完成三个状态,显示多个开发任务..."
- **禁止**:不要只描述界面内容而不说明用户行为
* **semantic_context**: 提取核心知识要点、概念定义、技术原理。只记录知识本身,不包含获取过程。
- **描述风格**:主语为技术/概念/系统,使用说明性动词(采用、支持、包含、实现等)
- **内容重点**:知识是什么、架构如何、原理为何、技术特点
- **示例**:"MineContext采用混合存储架构,支持隐私本地存储和云推理,基于Python+FastAPI+ChromaDB技术栈,核心模块包括..."
- **禁止**:避免"用户学习了"、"current_user查看了"等用户行为描述
* **procedural_context**: 记录用户完成特定任务的操作步骤序列。基于截图时序学习操作模式。
- **描述风格**:使用步骤化结构,形成可复用的操作流程
- **内容重点**:步骤1→步骤2→步骤3,如何完成某个任务
- **示例**:"配置并启动服务的操作流程:步骤1:打开config.yaml配置文件;步骤2:修改API密钥和模型参数;步骤3:执行启动命令;步骤4:查看控制台确认服务启动成功"
- **禁止**:不是描述单次操作,而是提取可重复的操作模式
* **state_context**: 描述当前状态、进度指标、性能数据,重点是"现在怎样"
- **描述风格**:主语为项目/系统/任务,使用状态动词(显示、达到、处于、完成等)
- **内容重点**:状态是什么、进度如何、指标数值、当前情况
- **示例**:"项目开发进度显示80%完成,前端模块已完成,后端API开发进行中,测试阶段未开始。代码提交20次,bug修复率95%"
- **禁止**:不描述用户行为,只描述状态本身
* **intent_context**: 说明未来计划、目标设定、待办事项,重点是"将要做什么"
- **描述风格**:使用未来时态,说明计划和目标
- **内容重点**:未来要做什么、目标是什么、计划如何
- **示例**:"计划在下周完成前端优化,目标是将页面加载时间减少30%,准备重构组件架构"
- **禁止**:不要描述已完成的事情
- **内容提取原则** - 根据context_type调整内容详细度:
* **技术学习场景**: 必须包含具体的技术细节、代码示例、配置参数、操作步骤、命令语法等
* **操作界面场景**: 详细记录界面元素、数据值、配置选项、状态信息、用户交互行为
* **文档阅读场景**: 提取文档的具体内容要点、核心知识、关键概念、实例说明
* **代码开发场景**: 记录代码逻辑、函数调用、变量定义、算法实现、调试过程
* **问题解决场景**: 详述问题现象、解决方案、操作流程、验证结果
* **信息查看场景**: 完整记录查看的数据内容、统计信息、列表项目、详细参数
* **多截图整合**: 将所有相关截图的信息整合成完整的操作序列和知识体系
* **聊天互动场景**: 详细记录对话内容、发言人、问题答案、交互反馈
* **日程管理场景**: 记录会议时间、地点、参与人员、议程项目
* **重要性导向**:
- importance ≥ 7: 提供最详尽的描述,包含所有可见的具体信息、技术细节、操作步骤
- importance 4-6: 提供中等详细度,涵盖主要具体内容和关键细节
- importance ≤ 3: 简洁但必须包含核心具体信息,避免空泛概要
* **避免抽象概括**: 禁止使用"了解了"、"学习了"、"查看了"等抽象表述,必须具体说明了解/学习/查看的具体内容
* **信息完整性**: 优先记录截图中的具体文字、数值、选项、步骤,而不是行为概要
- **keywords**: 行为和主题相关的关键词,最多5个,避免过于宽泛
- **importance**: 信息重要性(0-10整数),考虑用户关注度和行为价值
- **confidence**: 理解可信度(0-10整数),基于界面信息的清晰度和完整性
- **event_time**: 未来事件时间,必须使用标准ISO 8601格式(如:2025-09-09T15:30:00+08:00),不能包含占位符或无效字符,单个时间点或null
- **screen_ids**: 来源截图序号(从1开始)
## 主体识别规则
- **current_user身份确定**:
* current_user是这个截图的拍摄者,即正在使用/操作这个界面的人
* 在各种场景中区分current_user:
注意:"current_user"特指操作屏幕的人,除非有明确证据,否则不要将截图中出现的其他人名(如"张三")关联为 current_user。应将"张三"识别为独立的人物。
下面是判断current_user身份的具体场景:
- 聊天场景:通过界面布局、输入框位置、消息发送状态等判断
- 文档场景:current_user是正在查看/编辑文档的人
- 应用场景:current_user是正在操作应用的人
- 如果无法确定具体身份,current_user统一指代界面操作者
- **内容参与者识别**:
* 识别current_user在内容中的具体身份(姓名、昵称等)
* 其他参与者保持原始形式的具体人名、用户名、昵称
* 聊天参与者、文档作者、协作者等都使用其真实标识
- **识别规则**:
* 界面操作行为:使用"current_user查看"、"current_user操作"等
* current_user参与内容时:使用"current_user(张三)说"、"current_user(李华)回复"格式
* 其他参与者内容:保持原始身份,如"李四回复"、"王五发言"、"作者编写"等
* 第一人称内容:如果能确定是current_user的内容,转换为current_user(具体姓名)格式
## 质量保障
- **理解深度**:不只描述"看到什么",更要理解"在做什么""为什么"
- **行为推理**:基于界面状态推理用户的具体操作和目标
- **主体统一**:所有用户相关行为统一为"current_user"主体
- **合并优化**:优先合并相关活动,返回history_id便于删除旧记录
- **时间描述**:描述中不要出现相对时间描述,如"今天"、"明天"、"上周"等,根据当前时间点推断出具体的时间点(如"2025-09-09")
## 隐私保护
- 对于密钥类信息,返回时请替换成 ***,不要明文返回
<|im_end|>
<|im_start|>user
<|vision_start|><|image_pad|><|vision_end|>当前时间: 2025-11-17T11:00:49.893626
当前时区: None
当前时间戳: 1763348449
---
请严格按照上述规则和格式,分析以下截图。输出请按JSON格式返回。
<|im_end|>
<|im_start|>assistant
2025-11-17 11:00:56 [INFO]
[qwen/qwen3-vl-30b] Prompt processing progress: 0.0%
2025-11-17 11:01:01 [INFO]
[qwen/qwen3-vl-30b] Prompt processing progress: 100.0%
2025-11-17 11:01:16 [INFO]
[qwen/qwen3-vl-30b] Model generated tool calls: []
2025-11-17 11:01:16 [INFO]
[qwen/qwen3-vl-30b] Generated prediction: {
"id": "chatcmpl-orz2etst5cpbnmjo2who69",
"object": "chat.completion",
"created": 1763348456,
"model": "qwen/qwen3-vl-30b",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "```json\n[\n {\n \"context_type\": \"activity_context\",\n \"title\": \"current_user查看系统配置和开发环境\",\n \"summary\": \"current_user正在查看一个复杂的开发工作区,包含多个并行的界面。在终端窗口中,current_user正在运行一个Docker compose命令,该命令会启动一个带有OpenAPI接口的服务,并且有一个HTTP请求正在发送。同时,current_user打开了一个名为'LM Studio'的AI工具,显示了模型参数和API密钥的设置。此外,current_user还打开了一个名为'MineContext'的工具,该工具显示了平台版本、GPU信息和一个'屏幕监控'功能,该功能正在记录屏幕上的活动。在右侧,current_user还打开了一个名为'Platform Details'的窗口,显示了关于系统和硬件的详细信息,包括操作系统版本、CPU型号和GPU信息。所有这些工具都显示了不同的时间戳,表明current_user正在对系统进行实时的监控和配置。\",\n \"keywords\": [\n \"开发环境\",\n \"Docker\",\n \"API\",\n \"屏幕监控\",\n \"系统信息\"\n ],\n \"importance\": 9,\n \"confidence\": 9\n },\n {\n \"context_type\": \"semantic_context\",\n \"title\": \"MineContext平台的系统信息\",\n \"summary\": \"MineContext平台的系统信息显示了当前操作系统的详细配置。平台版本为26.1,操作系统为macOS 14.0。系统信息包括了关于CPU、GPU、内存和显存的详细数据。CPU型号为Intel Core i9-14900K,GPU型号为NVIDIA GeForce RTX 4090,显存为24GB。此外,还列出了不同应用的GPU占用情况,例如'WindowServer'占用了8.13GB,'Chrome'占用了6.34GB。这些信息用于监控和管理系统的硬件资源。\",\n \"keywords\": [\n \"系统信息\",\n \"CPU\",\n \"GPU\",\n \"内存\",\n \"显存\"\n ],\n \"importance\": 8,\n \"confidence\": 9\n },\n {\n \"context_type\": \"semantic_context\",\n \"title\": \"MineContext的屏幕监控功能\",\n \"summary\": \"MineContext的屏幕监控功能正在运行,用于捕捉屏幕上的活动并将其转换为智能的上下文。监控日志显示了不同时间点的屏幕活动,包括日期(如11月17日、11月12日)和时间(如11:00、11:02)。监控数据包括了对系统活动的分析,例如对应用程序的使用情况。该功能旨在生成基于屏幕分析的活动上下文,以支持更智能的用户交互。\",\n \"keywords\": [\n \"屏幕监控\",\n \"上下文生成\",\n \"活动分析\"\n ],\n \"importance\": 7,\n \"confidence\": 8\n },\n {\n \"context_type\": \"semantic_context\",\n \"title\": \"LM Studio的配置信息\",\n \"summary\": \"LM Studio的配置信息显示了当前使用的模型和参数。模型为Mistral-7B,上下文长度为4096,最大token数为8000。此外,还显示了模型加载时的设置,例如是否允许在没有活动会话时进行重试。该工具还显示了开发者日志,其中包含了关于模型加载和参数设置的详细信息。\",\n \"keywords\": [\n \"LM Studio\",\n \"模型配置\",\n \"开发者日志\"\n ],\n \"importance\": 7,\n \"confidence\": 8\n },\n {\n \"context_type\": \"state_context\",\n \"title\": \"系统资源使用状态\",\n \"summary\": \"系统资源使用状态显示了当前各应用程序对GPU的占用情况。例如,'WindowServer'占用8.13GB显存,'Chrome'占用6.34GB显存,'Browser Helper'占用7.03GB显存。这些数据显示了系统在运行多个应用程序时的资源分配情况,有助于监控和管理硬件性能。\",\n \"keywords\": [\n \"GPU占用\",\n \"显存\",\n \"系统性能\"\n ],\n \"importance\": 6,\n \"confidence\": 8\n },\n {\n \"context_type\": \"state_context\",\n \"title\": \"Docker容器的启动状态\",\n \"summary\": \"Docker容器的启动状态显示了容器正在运行,并且已经成功启动了OpenAPI服务。容器的端口映射为8080,服务地址为http://127.0.0.1:8080。此外,还显示了容器的ID和状态,例如'running'。该状态表明系统正在运行一个用于开发和测试的容器化服务。\",\n \"keywords\": [\n \"Docker\",\n \"容器启动\",\n \"OpenAPI\"\n ],\n \"importance\": 7,\n \"confidence\": 8\n }\n]\n```",
"tool_calls": []
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 3698,
"completion_tokens": 1084,
"total_tokens": 4782
},
"stats": {},
"system_fingerprint": "qwen/qwen3-vl-30b"
}
2025-11-17 11:02:19 [DEBUG]
Received request: POST to /v1/chat/completions with body {
"messages": [
{
"role": "system",
"content": "你是current_user屏幕截图的分析专家,负责深度理解current_user的桌面截图内容,... <Truncated in logs> ...025-09-09\")\n\n## 隐私保护\n- 对于密钥类信息,返回时请替换成 ***,不要明文返回\n"
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "当前时间: 2025-11-17T11:02:19.109726\n当前时区: None\n当前时间戳: 1763348539\n---\n请严格按照上述规则和格式,分析以下截图。输出请按JSON格式返回。\n"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AA... <Truncated in logs> ...eQsKzyvYN7t27fqqoKLuH/AvTEWEjRDwgbAAAAAElFTkSuQmCC"
}
}
]
}
],
"model": "qwen/qwen3-vl-30b"
}
2025-11-17 11:02:19 [INFO]
[qwen/qwen3-vl-30b] Running chat completion on conversation with 2 messages.
2025-11-17 11:02:20 [DEBUG]
[process_prompt_with_images][INFO]: Prompt dump: <|im_start|>system
你是current_user屏幕截图的分析专家,负责深度理解current_user的桌面截图内容,生成全面详尽的自然语言描述,并与历史上下文融合。current_user是截图的拍摄者和界面操作者。
## 核心原则
1. **深度理解**:不仅识别可见内容,更要理解行为意图和上下文含义
2. **自然描述**:用自然语言描述"谁在做什么",而非简单摘录文本
3. **主体识别**:准确识别用户身份,统一表述为"current_user"
4. **行为推理**:基于界面状态推理用户的具体行为和目标
6. **背景增强**:使用可用工具获取相关背景信息丰富描述
7. **全面提取**:最大化地提取和保留截图中所有有价值的信息
8. **知识保存**:确保生成的内容可作为高质量的记忆上下文
9. **先识别活动,再判断类型**:先理解截图中的活动整体,默认生成activity_context,只有明确符合其他类型定义时才额外生成其他context_type
10. **类型与风格匹配**:不同context_type必须使用对应的描述风格,避免用activity风格描述state/procedural/semantic
## 标准JSON输出格式:
{
"items": [
{
"context_type": "activity_context | intent_context | semantic_context | procedural_context | state_context",
"title": "string",
"summary": "string",
"keywords": ["string"],
"importance": 0-10,
"confidence": 0-10,
}
]
}
注意:同一个context_type下的不同主题必须分别生成独立的item,不要混合不相关的内容。
## context_type 识别关键原则
### 默认优先原则(必须遵守的提取策略)
**基础要求**:看到用户操作界面的截图,首先必须生成 **activity_context**(记录用户在做什么)
**积极提取策略**:在 activity_context 基础上,**主动识别并提取**截图中包含的其他类型信息:
- **semantic_context**:当截图包含产品介绍、技术文档、配置规范、架构说明等知识内容时,**必须提取**
- **state_context**:当截图展示任务看板、进度面板、状态列表、统计数据时,**必须提取**
- **procedural_context**:当能从截图序列学习到可复用的操作流程时,**应该提取**
- **intent_context**:当截图明确显示未来计划、待办事项时,**应该提取**
**关键理念**:一个活动可以同时产生多种类型的 context!
- 示例:查看产品介绍页面 → activity_context(用户查看行为)+ semantic_context(产品知识内容)
- 示例:查看任务看板 → activity_context(用户查看行为)+ state_context(任务状态信息)
- 示例:配置并启动服务 → activity_context(用户操作行为)+ procedural_context(操作流程)
### 风格匹配原则(重要)
**生成哪个类型,就必须使用该类型对应的描述风格**:
- ✅ activity_context: "current_user查看..."、"current_user配置..."
- ✅ state_context: "项目进度显示..."、"系统状态为..."
- ✅ procedural_context: "步骤1:...;步骤2:...;步骤3:..."
- ✅ semantic_context: "技术架构采用..."、"核心原理是..."
**常见错误示例**:
- ❌ 将 activity 误判为 state,但使用 activity 风格描述:
Type: state_context Summary: current_user正在查看项目看板,看板显示任务状态...
**问题**:使用了 "current_user正在查看"(activity风格),应改为 activity_context
- ❌ 将 activity 误判为 procedural,但使用 activity 风格描述:
Type: procedural_context Summary: current_user打开配置文件,修改参数,然后启动服务...
**问题**:描述单次操作而非可复用流程,应改为 activity_context
## 处理流程
### 第一阶段:整体理解
1. **全局认知**:阅读截图,形成完整认知
- 识别所有可见的文字内容、数值、选项、按钮、状态信息
- 理解界面布局、用户当前操作位置、交互状态
- 分析内容的技术层次和专业程度
2. **活动识别**:判断截图中包含几个不同的活动
- 识别用户进行了哪些独立的活动
- 理解用户的活动轨迹,形成连贯的行为序列
3. **主体识别**:识别操作主体,将用户相关活动统一为"current_user"
4. **行为推理**:基于界面状态推理具体的行为和意图
### 第二阶段:生成 activity_context
5. **生成活动上下文**:每个独立活动必须生成一个 activity_context
- 不同主题的活动分别生成独立的 item
- 如果用户同时进行多个不同主题的活动,必须生成多个独立的 activity_context 项
6. **具体内容提取**:**重点环节** - 详细提取截图中的具体信息
- **技术内容**: 提取代码片段、命令语法、参数值、配置选项
- **数据信息**: 记录具体数值、统计信息、列表项目、状态值
- **操作细节**: 描述具体的点击位置、输入内容、选择项目
- **文档内容**: 摘录关键知识点、概念定义、示例说明
- **界面元素**: 记录窗口标题、菜单选项、按钮文字、提示信息
- **聊天互动**: 记录对话内容和发言人、问题答案、交互反馈
- **日程管理**: 记录会议时间、地点、参与人员、议程项目
### 第三阶段:主动提取其他 context_type
7. **多类型主动提取**:在生成 activity_context 的基础上,**主动识别并提取**截图中包含的其他类型上下文
- **原则**:一个活动可以同时生成多种类型的 context(activity + semantic + state + procedural 等)
- 每个主题独立记录,避免信息混淆
- 同一 context_type 的不同主题也要分开记录
- **必须使用该类型对应的描述风格**
8. **各类型主动识别与提取**:
- **semantic_context**(知识内容):
* **识别线索**:产品介绍页面、技术文档、教程内容、架构说明、配置规范、概念定义
* **提取要求**:从截图中提取可独立存在的知识内容,只记录知识本身,不描述用户操作
* **示例场景**:产品功能介绍页面 → 提取产品核心功能和架构;配置文件内容 → 提取配置规范和参数说明
- **state_context**(状态信息):
* **识别线索**:任务看板、进度面板、状态列表、监控仪表盘、统计数据展示
* **提取要求**:提取当前的状态、进度、统计信息,主语使用"项目/系统/任务"而非"current_user"
* **示例场景**:任务看板显示任务状态 → 提取项目任务分布和完成情况
- **procedural_context**(操作流程):
* **识别线索**:多步骤操作序列、配置+启动过程、问题排查流程
* **提取要求**:当能从截图序列中学习到可复用的操作流程时,提取为步骤化描述
* **示例场景**:查看配置文件+启动服务的连续操作 → 提取为可复用的配置启动流程
- **intent_context**(未来计划):
* **识别线索**:待办列表、日历、计划文档、未开始的任务
* **提取要求**:提取明确的未来计划和目标
* **示例场景**:任务看板中"未开始"状态的任务 → 可能提取为未来计划
9. **详细描述生成**:
- 确保描述包含截图中的所有重要具体信息
- **根据 context_type 使用对应的描述风格**
## 字段规范
- **title**: 根据context_type生成合适的标题:
* **activity_context**: 行为导向标题,包含主体和动作(如"current_user查看记忆库配置")
* **semantic_context**: 核心概念或知识点的简洁表述,只包含知识本身(如"MineContext技术架构"、"React Hooks使用原理")
* **procedural_context**: 用户操作流程的任务描述(如"使用Git进行代码合并的步骤"、"配置Docker容器的操作流程")
* **state_context**: 状态描述(如"项目进度:前端开发完成80%"、"系统性能:CPU使用率75%")
* **intent_context**: 计划或目标表述(如"下周产品发布准备事项"、"Q4季度技术规划")
- **summary**: 根据context_type生成合适的内容描述:
* **activity_context**: 详细描述用户的具体操作、行为序列和交互过程
- **描述风格**:主语为 current_user,使用动作动词(查看、编辑、讨论、配置、启动等)
- **内容重点**:用户做了什么、如何操作、查看了哪些内容、达成了什么目标
- **示例**:"current_user查看项目管理看板,了解任务分配和完成情况。看板分为未开始/进行中/已完成三个状态,显示多个开发任务..."
- **禁止**:不要只描述界面内容而不说明用户行为
* **semantic_context**: 提取核心知识要点、概念定义、技术原理。只记录知识本身,不包含获取过程。
- **描述风格**:主语为技术/概念/系统,使用说明性动词(采用、支持、包含、实现等)
- **内容重点**:知识是什么、架构如何、原理为何、技术特点
- **示例**:"MineContext采用混合存储架构,支持隐私本地存储和云推理,基于Python+FastAPI+ChromaDB技术栈,核心模块包括..."
- **禁止**:避免"用户学习了"、"current_user查看了"等用户行为描述
* **procedural_context**: 记录用户完成特定任务的操作步骤序列。基于截图时序学习操作模式。
- **描述风格**:使用步骤化结构,形成可复用的操作流程
- **内容重点**:步骤1→步骤2→步骤3,如何完成某个任务
- **示例**:"配置并启动服务的操作流程:步骤1:打开config.yaml配置文件;步骤2:修改API密钥和模型参数;步骤3:执行启动命令;步骤4:查看控制台确认服务启动成功"
- **禁止**:不是描述单次操作,而是提取可重复的操作模式
* **state_context**: 描述当前状态、进度指标、性能数据,重点是"现在怎样"
- **描述风格**:主语为项目/系统/任务,使用状态动词(显示、达到、处于、完成等)
- **内容重点**:状态是什么、进度如何、指标数值、当前情况
- **示例**:"项目开发进度显示80%完成,前端模块已完成,后端API开发进行中,测试阶段未开始。代码提交20次,bug修复率95%"
- **禁止**:不描述用户行为,只描述状态本身
* **intent_context**: 说明未来计划、目标设定、待办事项,重点是"将要做什么"
- **描述风格**:使用未来时态,说明计划和目标
- **内容重点**:未来要做什么、目标是什么、计划如何
- **示例**:"计划在下周完成前端优化,目标是将页面加载时间减少30%,准备重构组件架构"
- **禁止**:不要描述已完成的事情
- **内容提取原则** - 根据context_type调整内容详细度:
* **技术学习场景**: 必须包含具体的技术细节、代码示例、配置参数、操作步骤、命令语法等
* **操作界面场景**: 详细记录界面元素、数据值、配置选项、状态信息、用户交互行为
* **文档阅读场景**: 提取文档的具体内容要点、核心知识、关键概念、实例说明
* **代码开发场景**: 记录代码逻辑、函数调用、变量定义、算法实现、调试过程
* **问题解决场景**: 详述问题现象、解决方案、操作流程、验证结果
* **信息查看场景**: 完整记录查看的数据内容、统计信息、列表项目、详细参数
* **多截图整合**: 将所有相关截图的信息整合成完整的操作序列和知识体系
* **聊天互动场景**: 详细记录对话内容、发言人、问题答案、交互反馈
* **日程管理场景**: 记录会议时间、地点、参与人员、议程项目
* **重要性导向**:
- importance ≥ 7: 提供最详尽的描述,包含所有可见的具体信息、技术细节、操作步骤
- importance 4-6: 提供中等详细度,涵盖主要具体内容和关键细节
- importance ≤ 3: 简洁但必须包含核心具体信息,避免空泛概要
* **避免抽象概括**: 禁止使用"了解了"、"学习了"、"查看了"等抽象表述,必须具体说明了解/学习/查看的具体内容
* **信息完整性**: 优先记录截图中的具体文字、数值、选项、步骤,而不是行为概要
- **keywords**: 行为和主题相关的关键词,最多5个,避免过于宽泛
- **importance**: 信息重要性(0-10整数),考虑用户关注度和行为价值
- **confidence**: 理解可信度(0-10整数),基于界面信息的清晰度和完整性
- **event_time**: 未来事件时间,必须使用标准ISO 8601格式(如:2025-09-09T15:30:00+08:00),不能包含占位符或无效字符,单个时间点或null
- **screen_ids**: 来源截图序号(从1开始)
## 主体识别规则
- **current_user身份确定**:
* current_user是这个截图的拍摄者,即正在使用/操作这个界面的人
* 在各种场景中区分current_user:
注意:"current_user"特指操作屏幕的人,除非有明确证据,否则不要将截图中出现的其他人名(如"张三")关联为 current_user。应将"张三"识别为独立的人物。
下面是判断current_user身份的具体场景:
- 聊天场景:通过界面布局、输入框位置、消息发送状态等判断
- 文档场景:current_user是正在查看/编辑文档的人
- 应用场景:current_user是正在操作应用的人
- 如果无法确定具体身份,current_user统一指代界面操作者
- **内容参与者识别**:
* 识别current_user在内容中的具体身份(姓名、昵称等)
* 其他参与者保持原始形式的具体人名、用户名、昵称
* 聊天参与者、文档作者、协作者等都使用其真实标识
- **识别规则**:
* 界面操作行为:使用"current_user查看"、"current_user操作"等
* current_user参与内容时:使用"current_user(张三)说"、"current_user(李华)回复"格式
* 其他参与者内容:保持原始身份,如"李四回复"、"王五发言"、"作者编写"等
* 第一人称内容:如果能确定是current_user的内容,转换为current_user(具体姓名)格式
## 质量保障
- **理解深度**:不只描述"看到什么",更要理解"在做什么""为什么"
- **行为推理**:基于界面状态推理用户的具体操作和目标
- **主体统一**:所有用户相关行为统一为"current_user"主体
- **合并优化**:优先合并相关活动,返回history_id便于删除旧记录
- **时间描述**:描述中不要出现相对时间描述,如"今天"、"明天"、"上周"等,根据当前时间点推断出具体的时间点(如"2025-09-09")
## 隐私保护
- 对于密钥类信息,返回时请替换成 ***,不要明文返回
<|im_end|>
<|im_start|>user
<|vision_start|><|image_pad|><|vision_end|>当前时间: 2025-11-17T11:02:19.109726
当前时区: None
当前时间戳: 1763348539
---
请严格按照上述规则和格式,分析以下截图。输出请按JSON格式返回。
<|im_end|>
<|im_start|>assistant
2025-11-17 11:02:20 [INFO]
[qwen/qwen3-vl-30b] Prompt processing progress: 0.0%
2025-11-17 11:02:25 [INFO]
[qwen/qwen3-vl-30b] Prompt processing progress: 100.0%
2025-11-17 11:02:38 [INFO]
[qwen/qwen3-vl-30b] Model generated tool calls: []
2025-11-17 11:02:38 [INFO]
[qwen/qwen3-vl-30b] Generated prediction: {
"id": "chatcmpl-whnmxajlrvh4ob8cc55ysl",
"object": "chat.completion",
"created": 1763348539,
"model": "qwen/qwen3-vl-30b",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "```json\n[\n {\n \"context_type\": \"activity_context\",\n \"title\": \"current_user查看开发环境配置\",\n \"summary\": \"current_user正在查看一个复杂的集成开发环境,桌面上打开了多个窗口。左侧是Xcode,显示了CoreFoundation和CoreData相关的错误日志;中间是VS Code,打开了一个名为'adpoc.py'的文件,其中包含Python代码和错误提示;右侧是LM Studio,显示了模型设置和API调用信息;右下角是MineContext,显示了屏幕监控和错误报告界面。current_user正在检查一个包含多种技术栈(Python、C++、LLM)的开发环境,可能正在调试一个集成项目。\",\n \"keywords\": [\"开发环境\", \"调试\", \"多窗口\", \"集成项目\"],\n \"importance\": 9,\n \"confidence\": 9\n },\n {\n \"context_type\": \"semantic_context\",\n \"title\": \"MineContext屏幕监控功能\",\n \"summary\": \"MineContext是一款屏幕监控工具,它能够捕捉屏幕上的一切内容,并将其转化为智能、连接的上下文。所有数据都本地处理,以确保隐私保护。该工具支持通过配置文件(如'config.yaml')来管理其行为。\",\n \"keywords\": [\"MineContext\", \"屏幕监控\", \"本地处理\", \"隐私保护\"],\n \"importance\": 7,\n \"confidence\": 8\n },\n {\n \"context_type\": \"semantic_context\",\n \"title\": \"LM Studio模型配置\",\n \"summary\": \"LM Studio是一款本地大语言模型(LLM)运行工具。当前窗口显示了模型的配置信息,包括模型名称('Lia-2.0')、参数(1.11B, 6.4B)和版本(1.0.28)。界面中还显示了模型的API接口地址(http://127.0.0.1:2000)和一个'Connect to LLM'按钮,表明用户正在尝试连接到本地运行的模型。\",\n \"keywords\": [\"LM Studio\", \"大语言模型\", \"本地运行\", \"API接口\"],\n \"importance\": 8,\n \"confidence\": 8\n },\n {\n \"context_type\": \"state_context\",\n \"title\": \"项目错误状态\",\n \"summary\": \"项目中存在多个错误状态。Xcode显示了CoreFoundation和CoreData相关的编译错误,包括'Invalid configuration'和'No such file or directory'。VS Code中的Python脚本'adpoc.py'也报告了错误,如'AttributeError: 'NoneType' object has no attribute 'shape''。此外,MineContext的错误报告界面显示了'Create new issue'的弹窗,表明系统中存在待处理的错误。\",\n \"keywords\": [\"编译错误\", \"运行时错误\", \"错误报告\", \"调试状态\"],\n \"importance\": 9,\n \"confidence\": 9\n },\n {\n \"context_type\": \"procedural_context\",\n \"title\": \"配置并启动本地大语言模型服务\",\n \"summary\": \"配置并启动本地大语言模型服务的操作流程:步骤1:在LM Studio中选择模型'Lia-2.0'并设置参数;步骤2:确认模型的API接口地址为'http://127.0.0.1:2000';步骤3:点击'Connect to LLM'按钮连接到服务;步骤4:在VS Code中运行Python脚本以调用该服务。\",\n \"keywords\": [\"配置\", \"启动\", \"连接\", \"API调用\"],\n \"importance\": 7,\n \"confidence\": 7\n },\n {\n \"context_type\": \"procedural_context\",\n \"title\": \"处理项目错误\",\n \"summary\": \"处理项目错误的操作流程:步骤1:在Xcode中查看CoreFoundation和CoreData相关的错误日志;步骤2:在VS Code中检查'adpoc.py'脚本的错误,特别是'NoneType'对象没有'shape'属性的错误;步骤3:在MineContext中创建新的错误报告,填写错误描述并提交。\",\n \"keywords\": [\"错误排查\", \"日志分析\", \"错误报告\", \"调试\"],\n \"importance\": 8,\n \"confidence\": 8\n }\n]\n```",
"tool_calls": []
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 3698,
"completion_tokens": 936,
"total_tokens": 4634
},
"stats": {},
"system_fingerprint": "qwen/qwen3-vl-30b"
}
🧑💻 Step to reproduce
- 设置 LM Studio 作为 LLM 后端
- 录屏
👾 Expected result
- 正常解析
🚑 Any additional information
No response
🛠️ MineContext Version
0.15
💻 Platform Details
MacOS 26.1
0.1.5 吗,是偶发还是都有报错
稳定报错,感觉像是数据结构解析出错了。
qin-ctx @.***> 于2025年11月17日周一 11:47写道:
qin-ctx left a comment (volcengine/MineContext#266) https://github.com/volcengine/MineContext/issues/266#issuecomment-3539838246
0.1.5 吗,是偶发还是都有报错
— Reply to this email directly, view it on GitHub https://github.com/volcengine/MineContext/issues/266#issuecomment-3539838246, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAGOVPKLOLBJZ4BQOUUZAOT35FAMZAVCNFSM6AAAAACMJGHYFGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTKMZZHAZTQMRUGY . You are receiving this because you authored the thread.Message ID: @.***>
另外,还有一个问题,在使用了 Custom Model 想切回 Doubao 的时候保存设置报错:
POST http://127.0.0.1:1734/api/model_settings/update 400 (Bad Request)
dispatchXhrRequest @ index-DQXBCYPg.js:64006
xhr @ index-DQXBCYPg.js:63883
dispatchRequest @ index-DQXBCYPg.js:64397
Promise.then
_request @ index-DQXBCYPg.js:64594
request @ index-DQXBCYPg.js:64503
httpMethod @ index-DQXBCYPg.js:64640
wrap2 @ index-DQXBCYPg.js:62411
updateModelSettingsAPI @ index-DQXBCYPg.js:162809
(anonymous) @ index-DQXBCYPg.js:71047
step @ index-DQXBCYPg.js:43359
(anonymous) @ index-DQXBCYPg.js:43311
(anonymous) @ index-DQXBCYPg.js:43298
__awaiter$6 @ index-DQXBCYPg.js:43280
Fetch2.runAsync @ index-DQXBCYPg.js:71023
Fetch2.run @ index-DQXBCYPg.js:71100
memoizedFn.current @ index-DQXBCYPg.js:70423
(anonymous) @ index-DQXBCYPg.js:163049
await in (anonymous)
memoizedFn.current @ index-DQXBCYPg.js:70423
handleClick2 @ index-DQXBCYPg.js:27326
processDispatchQueue @ index-DQXBCYPg.js:9472
(anonymous) @ index-DQXBCYPg.js:9845
batchedUpdates$1 @ index-DQXBCYPg.js:2077
dispatchEventForPluginEventSystem @ index-DQXBCYPg.js:9564
dispatchEvent2 @ index-DQXBCYPg.js:11509
dispatchDiscreteEvent @ index-DQXBCYPg.js:11490
index.html#/settings:1 Uncaught (in promise) TypeError: CopyReactDOM.render is not a function
at copyRender (index-DQXBCYPg.js:12312:20)
at render$1 (index-DQXBCYPg.js:12371:10)
at index-DQXBCYPg.js:25227:7
at new Promise (<anonymous>)
at addInstance (index-DQXBCYPg.js:25226:42)
at Message$1.<computed> [as error] (index-DQXBCYPg.js:25341:12)
at Object.onError (index-DQXBCYPg.js:163019:17)
at Fetch2.<anonymous> (index-DQXBCYPg.js:71078:90)
at step (index-DQXBCYPg.js:43359:19)
at Object.throw (index-DQXBCYPg.js:43311:14)
Promise.then
addInstance @ index-DQXBCYPg.js:25217
Message$1.<computed> @ index-DQXBCYPg.js:25341
onError @ index-DQXBCYPg.js:163019
(anonymous) @ index-DQXBCYPg.js:71078
step @ index-DQXBCYPg.js:43359
(anonymous) @ index-DQXBCYPg.js:43311
rejected @ index-DQXBCYPg.js:43290
Promise.then
step @ index-DQXBCYPg.js:43296
(anonymous) @ index-DQXBCYPg.js:43298
__awaiter$6 @ index-DQXBCYPg.js:43280
Fetch2.runAsync @ index-DQXBCYPg.js:71023
Fetch2.run @ index-DQXBCYPg.js:71100
memoizedFn.current @ index-DQXBCYPg.js:70423
(anonymous) @ index-DQXBCYPg.js:163049
await in (anonymous)
memoizedFn.current @ index-DQXBCYPg.js:70423
handleClick2 @ index-DQXBCYPg.js:27326
processDispatchQueue @ index-DQXBCYPg.js:9472
(anonymous) @ index-DQXBCYPg.js:9845
batchedUpdates$1 @ index-DQXBCYPg.js:2077
dispatchEventForPluginEventSystem @ index-DQXBCYPg.js:9564
dispatchEvent2 @ index-DQXBCYPg.js:11509
dispatchDiscreteEvent @ index-DQXBCYPg.js:11490
可以试下 0.1.6,把 prompt的改动从 0.1.5 回滚了