Telegram 图片消息此前一律回复「暂只支持文本消息」。本改动: - photo 取最大尺寸(TG 压成 jpeg),document 仅接受 image/png|jpeg|webp|gif - caption 作为伴随文本块进入同一条消息(不解析为命令) - 相册(同一 media_group_id)去抖 1.2s 合并为一条多图消息,避免 N 连回合 - 派发走宿主 sessions.prompt RPC(Web 端同通道):模型图像能力校验 + 附件服务持久化 + mode queue 排队,与纯文本路径的 agent.followup 语义一致 - 错误映射:MODEL_DOES_NOT_SUPPORT_IMAGES → 提示换多模态模型;其余回退 图片发送失败 + [code] 详情;下载失败即时提示 - 客户端新增 getFile/downloadFile(GET file 端点,复用代理感知 fetch) tests +7(58/58):photo+caption、png document、pdf 拒绝、相册合并、 模型不支持、下载失败、未绑定。无 emoji 文案。
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import type { Context } from '@deepseek-ai/cordis';
|
|
/** Loose ApiProxy surface used by catalog + model helpers. */
|
|
export type ApiProxySessions = {
|
|
list?: (req: {
|
|
rpcId: string;
|
|
payload: unknown;
|
|
}) => Promise<unknown>;
|
|
history?: (req: {
|
|
rpcId: string;
|
|
payload: unknown;
|
|
}) => Promise<unknown>;
|
|
models?: (req: {
|
|
rpcId: string;
|
|
payload: unknown;
|
|
}) => Promise<unknown>;
|
|
selectModel?: (req: {
|
|
rpcId: string;
|
|
payload: unknown;
|
|
}) => Promise<unknown>;
|
|
/** Create a session (used by /new; payload: workspaceId | cwd). */
|
|
create?: (req: {
|
|
rpcId: string;
|
|
payload: unknown;
|
|
}) => Promise<unknown>;
|
|
/**
|
|
* Prompt dispatch (Web 端同通道):文本 + 图片字节(base64)经宿主附件服务持久化后
|
|
* 进入会话;含图片时会校验当前模型是否支持图像输入。
|
|
*/
|
|
prompt?: (req: {
|
|
rpcId: string;
|
|
payload: unknown;
|
|
}) => Promise<unknown>;
|
|
};
|
|
export type ApiProxyLike = {
|
|
workspace?: {
|
|
list?: (req: {
|
|
rpcId: string;
|
|
payload: unknown;
|
|
}) => Promise<unknown>;
|
|
};
|
|
sessions?: ApiProxySessions;
|
|
};
|
|
/**
|
|
* Resolve host apiProxy without requiring Cordis inject.
|
|
* Direct `ctx.apiProxy` throws "cannot get property without inject" on real fibers.
|
|
*/
|
|
export declare function resolveApiProxy(ctx: Context): ApiProxyLike | undefined;
|