/** * vision-ocr.ts * * 非多模态主模型的图片预处理服务。 * * 流程: * 1. 借用 opencode 已配置的多模态 model(见 VISION_OCR_MODEL) * 2. 创建临时 session(复用调用方 workspace/directory) * 3. 发送图片 + 引导提示词(VISION_OCR_PROMPT),指定 model override * 4. 提取 assistant 回复中所有 text part,拼接为 OCR/描述文本 * 5. 删除临时 session(OCR 无需保留历史) * * 任何阶段失败均返回 null,调用方据此回退到 "直发图片" 原路径。 */ /** * OCR 单张图片的请求参数。 */ export interface OcrImageRequest { /** 图片内容(dataURL,如 `data:image/png;base64,...`) */ imageDataUrl: string; /** 图片 MIME 类型,如 `image/png` */ mime: string; /** 原始文件名(用于日志和提示词) */ filename: string; /** 来源消息的 workspace 目录;用于临时 session 的上下文对齐 */ directory?: string; /** 单次调用超时(毫秒)。默认 60s,GLM-4.5V 等 vision 模型在大图场景耗时可能接近 30s */ timeoutMs?: number; } /** * 通过 opencode 内的多模态 model 对图片做 OCR / 内容描述。 * * @returns 成功时返回描述文本;任何失败 / 降级场景返回 `null` */ export declare function ocrImageViaOpencode(req: OcrImageRequest): Promise; /** * 聊天 / API 层共享的 Part 形态(文本 + 文件)。 * * 所有平台 handler 已在用 `{type:'file'|'text', ...}` 的结构,这里做最小公共定义, * 便于 `preprocessVisionParts` 在调度端(而非每个 handler)统一处理非多模态主模型的 * 图片回退。 */ export type VisionPart = { type: 'text'; text: string; } | { type: 'file'; mime: string; url: string; filename?: string; }; /** * 预处理 parts:主模型不支持 image 输入时,把每张图片交给 opencode 内配置的多模态 * model 做 OCR,用文本 part 替换原图片 file part;否则原样透传。 * * 触发条件(全部满足才走 OCR): * - parts 中至少一个 `file` part 的 `mime` 以 `image/` 开头 * - `visionPreprocessConfig.enabled === true` 且已配置 OCR 副模型 * - 传入了 providerId / modelId,且 `getModelCapabilities().input.image === false` * (能力嗅探返回 null / 未提供 ids → 乐观假设支持图片,不做 OCR) * * OCR 失败 / 异常:按议题 #54 约定降级为"直发原图",保持与现有行为一致。 * * @param parts 已构建好的 parts 数组(经过上传/下载/解码后的 file dataURL) * @param ctx 主模型 + 会话工作区上下文 * @param tag 日志前缀(如 `'飞书'` / `'Chat API'`),便于排查 */ export declare function preprocessVisionParts(parts: VisionPart[], ctx: { providerId?: string; modelId?: string; directory?: string; }, tag?: string): Promise; //# sourceMappingURL=vision-ocr.d.ts.map