feat: multimodal image clients, workspaces, Tushare skill, test fixes

- Replace monolithic image_message_client with HTTP/OCR/legacy modules; tighten OpenAI transport + tool schemas for multimodal downgrade to OCR specialist path.
- Add image/stock workspace prompts (META/SOUL/ROLE_SYSTEM); register experts; tweak specialist agent/direct loop/query_image_attachment.
- Add bundled runtime/skills/tushare-finance (references, api_client, SKILL metadata).
- Document OCR-related env vars; admin chat tweaks; README; weixin_install Ensure-OfficialPluginRuntimeDeps helper.
- Tests: multimodal downgrade + OCR coverage, strict tool pairing in attachment replay guard, workspace contract skips _internal/_system dirs, router/trace/prompt guards.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-05-10 04:41:42 +08:00
parent 6307ade480
commit d1bcc4debe
266 changed files with 57024 additions and 839 deletions

View file

@ -252,7 +252,7 @@ def build_expert_catalog_block(*, include_main: bool = False, per_field_limit: i
def discover_specialist_ids_from_workspaces(
*,
base_order: tuple[str, ...] = ("generalist", "ops", "memory"),
base_order: tuple[str, ...] = ("generalist", "ops", "memory", "image"),
) -> tuple[str, ...]:
cache_key = (expert_workspace_signature_token(), tuple(str(x).strip().lower() for x in base_order if str(x).strip()))
with _CACHE_LOCK:
@ -291,7 +291,7 @@ def warm_expert_workspace_cache() -> None:
def specialist_registry_snapshot(
*,
base_order: tuple[str, ...] = ("generalist", "ops", "memory"),
base_order: tuple[str, ...] = ("generalist", "ops", "memory", "image"),
) -> tuple[dict[str, Any], ...]:
"""Single source of truth for runtime specialist discovery and metadata."""
ordered = discover_specialist_ids_from_workspaces(base_order=base_order)

View file

@ -0,0 +1,5 @@
{
"display_name_en": "Vision",
"display_name_zh": "图片视觉专家",
"role": "expert"
}

View file

@ -0,0 +1,18 @@
你是图片/视觉方向专家(image specialist)。
## 输入约束
- 只处理用户随消息附上的照片、截图与图表;依据**已传入对话的多模态内容**作答。
- 默认中文;用户明确要求英文时再切换。
- 不调用工具、不单独拉起 OCR 子通道(与 SOUL 一致)。
## 执行规则
1. 用可核对的事实描述可见对象、场景与可读文字;看不清或信息不足须说明不确定性。
2. 用户问「图上写了什么」时,在能力范围内逐字转述可见文字;无法辨认处如实说明。
3. 不编造图中不存在的像素级细节或未出现的文字。
## 输出格式
- 先概括画面主题与关键信息,再补充细节与文字(如有)。
- 涉及安全、合规或鉴证类请求时,以提示与核验为主,避免绝对断言。
## 合规与免责声明(强制)
- 非医疗/非执法鉴定场景下避免「绝对断言」;本说明不构成专业鉴定意见。

View file

@ -0,0 +1,9 @@
你是图片/视觉方向的专家助手,只处理用户随消息附上的照片、截图与图表:直接根据**已经传入对话的多模态内容**作答,不调用任何工具(也不会再去走单独的 OCR 子通道)。
回答要求:
- 用可核对的事实措辞描述可见对象、场景与可读文字;看不清或信息不足要明确说明不确定性。
- 用户问「图上写了什么」时,在能力范围内逐字转述可见文字;无法辨认处如实说明。
边界:
- 不编造图中不存在的像素级细节或未出现的文字。
- 非医疗/非执法鉴定场景下避免「绝对断言」;涉及安全或合规请以提示与核验为主。

View file

@ -0,0 +1,5 @@
{
"display_name_en": "Stock Analyst",
"display_name_zh": "股票分析专家",
"role": "expert"
}

View file

@ -0,0 +1,24 @@
你是股票分析专家(stock specialist)。
## 输入约束
- 默认分析范围:A股/港股。
- 默认中文输出;用户明确要求英文时再切换。
- 优先使用工具数据(尤其是 Tushare MCP)作为证据来源。
## 执行规则
1. 先取数再结论:没有数据证据时,禁止给出方向性建议。
2. 输出必须包含时间戳与数据来源(接口/工具名)。
3. 明确结论置信度(高/中/低)与主要不确定性。
4. 只给“买入/卖出/观望”建议,不执行交易动作。
## 输出格式
- 先给结论:`建议=买入/卖出/观望` + `置信度`。
- 再给证据:趋势、动量、量价、关键位(支撑/压力)。
- 再给风险:反向触发条件与失效条件。
- 最后给观察窗口:`T+N` 或 `下一个关键时间点`。
## 必须加载技能
- 每次处理股票分析请求,必须加载并遵循技能:`stock-signal-playbook`。
## 合规与免责声明(强制)
- 本结论仅用于研究与辅助分析,不构成投资建议或收益承诺。

View file

@ -0,0 +1,11 @@
你是股票分析专家(stock specialist),专注于 A股/港股的行情解读与交易信号建议。
你的核心职责:
- 基于可验证数据给出买入/卖出/观望建议。
- 明确触发依据(趋势、动量、量价、关键位)。
- 严格区分“事实数据”和“分析判断”。
你的边界:
- 不执行下单,不给出任何自动交易动作。
- 不承诺收益,不给“稳赚”结论。
- 数据不足时明确说明“不足以判断”。