跳转到正文

Sitoo API 参考手册 ​

维护日期:2026-10-06。对应当前源码;App SDK 0.0.2,能力/任务契约 1。本文描述现有接口,不代表已发布公共 REST API。

1. 接口边界与入口 ​

认证服务返回 HTTP 429 时,Desktop IPC 错误码为 RATE_LIMITED;错误信息区分限流与会话失效,有有效 Retry-After 时显示保守等待秒数,不自动重试。登录失败的 signed-out 事件保留 message,账户已连接时的限流不会作为 401 自动退出。New API 身份认证、刷新、OAuth 和凭据读取可能共享按 IP 的关键操作限流,外部身份页面登录成功不代表所有网关步骤已完成。

分组凭据已创建但读取失败时,后续主动重试复用尚未过期的记录,只重新读取凭据,不反复删除和新建。会话结束仍清理该记录;服务器实际限流策略由 New API 管理。

类型入口调用方与状态
App SDK@pi-market/sdk、/host、/mcp应用声明与可信服务端;详见 开发者手册
Desktop IPCwindow.piMarket当前 Desktop 主窗口 renderer;不向第三方应用直接开放完整桥
应用 MCPPOST http://127.0.0.1:<动态端口>/mcp平台绑定的可信 MCP 客户端,账户 token 鉴权
生图私有 HTTP 桥POST http://127.0.0.1:<动态端口>/toolRuntime 扩展,不是公开生图 API
模型私有代理POST http://127.0.0.1:<动态端口>/v1/chat/completionsRuntime,真实模型凭据留在 Desktop
更新测试服务器GET/HEAD latest.yml、安装包、packages/catalog.json本地验收用下载服务,不是专业应用发布管理 API

server/ 当前仅占位。登录、账单、模型调度使用外部 New API;其 /api 与 /v1 接口不是本仓库实现。没有现成的 /api/apps/install、资源包安装或 spkg REST 接口,不应据设计文档调用这些路径。

2. Desktop 约定 ​

权威定义:preload.ts,执行处理:main.ts。DesktopApi 类型通过 typeof desktopApi 导出;返回数据类型以该文件引用的实际类型为准。

JS 调用形式为 await window.piMarket.<模块>.<方法>(参数),不是 HTTP。下表省略 Promise:除事件订阅和 applications.images 外,方法均异步。? 表示可选参数;字符串方法名和大小写不能修改。

底层 IPC 响应为 {ok:true,value:T} 或 {ok:false,error:{code,message}}。preload 返回 value,失败保留 error.code。应用 apps:* 错误额外包含 retryable/action,preload 抛 AppSdkError,转发到隔离浏览器客户端时保留安全分类信息;不转发堆栈与原始宿主路径。不要解析中文错误文字作为稳定协议。void 成功可能是 undefined。

主进程只允许当前 mainWindow 的主 frame 调用,其他发送方返回 FORBIDDEN。此处保护可信 Desktop,不能当作第三方应用的身份沙盒。账户要求和参数校验由具体处理器执行。用户取消系统目录选择时部分接口正常返回 undefined,不是异常。

3. 应用与配置 API ​

方法参数返回
applications.list无RegisteredApp[]
applications.tasksappId:stringAppTask[]
applications.taskappId:string,id:stringAppTask
applications.configurationappId:stringAppConfigState
applications.configureappId:string,revision:number,values:Record<string,unknown>,credentials?:Record<string,string>AppConfigState
applications.imagesappId:stringAppImages(同步绑定对象,内部方法异步)

applications.images 的 getCapabilities、generate(request)、getTask(id)、listTasks、getArtifact(id) 分别返回 SitooImageCapabilities、SitooImageTask、SitooImageTask、SitooImageTask[]、{mimeType:'image/png',dataUrl:string}。需要应用声明 sitoo_image:generate;账户切换后旧绑定失效。当前可信窗口可传 appId,这不是不可信 UI 能自报身份的第三方授权方案。

静态应用新增以下受控桥。完整 window.piMarket 仅可信主窗口可用;应用 iframe 只能使用 SDK /ui 的窄接口,身份由主进程签发的随机会话绑定,不能自报 appId。

方法参数返回及边界
applications.market无AppMarketState,签名目录、当前账户安装项、离线 warning
applications.installid,digest,permissions:string[]InstalledApplication;重新核验市场摘要与用户确认的权限,再原子激活
applications.uninstallidvoid;阻止活跃任务,撤销会话,保留数据
applications.rollbackidInstalledApplication;只切回上一已校验缓存包,无数据迁移
applications.openid{token,url};仅已安装应用,可撤销的账户绑定会话
applications.closetokenvoid;关闭桥,不取消上游任务
applications.invoketoken,capability,parameters,requestId绑定能力结果;schema 与身份校验,付费请求冻结参数并沿用幂等 ID
applications.imageOperationtoken,operation,taskId?operation 为 image-capabilities/image-tasks/image-task/image-artifact;只有生图权限可调用,仅本应用任务
applications.platformCapabilitiestokenAppPlatformCapabilities;已安装包绑定的身份、SDK 版本、实际支持能力和配额
applications.storagetoken,operation,inputAppDataRecord/null 或 AppDataPage;storage-get 接收 id,storage-list 接收分页对象,storage-put 接收 AppDataWrite,storage-delete 接收 id/revision 对象
applications.resourcestoken,packId?,resourceId?本应用随包资源声明,或已校验文本和 snapshot;无任意文件路径访问
applications.sessionConfigurationtoken,revision?,values?AppConfigState;本应用普通配置,revision 防陈旧覆盖,无凭据写入
applications.importDevelopment无DevelopmentPackagePreview或undefined;只选取和校验文件,尚未安装;正式客户端禁止
applications.installDevelopmenttoken,permissions:string[]InstalledApplication;五分钟、账户绑定的一次性确认,权限须与已选择文件一致

明确 @ 命令仍走 workbench.send;已安装静态应用可以帮助和明确调用,自然语言 MCP 接入尚需通用应用路由。Host 的 approve/executeApproved 不暴露给第三方 UI。

服务器新增 GET/HEAD apps/metadata/{root,targets,snapshot,timestamp}.json、版本 root 元数据和 apps/targets/{catalog.json,sha256.spkg} 的固定安全路径。服务仅托管文件,不持有私钥。部署配置 appRepository.url/trustedRoot 由维护方提供,客户端禁止从远程自动建立初始信任。

AppTask 字段及状态、AppConfigState、参数转换、凭据和审批见 SDK 手册。配置使用当前 revision 保存;credentials 省略保留、空字符串删除,响应只返回凭据是否配置。不能把密钥写入普通 values。

ts
const api = window.piMarket;
const state = await api.applications.configuration('sitoo.materials');
await api.applications.configure(state.appId, state.revision, {
  ...state.values,
  prefix: '项目A_',
});
const tasks = await api.applications.tasks('sitoo.materials');

此示例在已登录 Desktop renderer 使用,不在普通浏览器/Node 使用。遇到并发配置错误先刷新,禁止静默覆盖。

4. 图像与作品 API ​

方法参数返回
images.configuration无SitooImageConfiguration
images.configurevalue:SitooImageConfigurationSitooImageConfiguration
images.capabilities无SitooImageCapabilities
images.modelsgroup?:string{groups:{id,description}[],models:string[]}
images.generaterequest:SitooImageRequestSitooImageTask
images.tasks无SitooImageTask[]
images.taskid:stringSitooImageTask
images.artifactid:string
works.configuration无WorksConfiguration
works.pickDirectoryrevision:numberWorksConfiguration
works.list无WorkItem[]
works.pending无SitooImageTask[]
works.previewid:string,full?:boolean(默认 false)string(图像预览数据)
works.revealid:stringvoid

SitooImageRequest:prompt 必填,可选 aspectRatio、resolution(1K/2K/4K)、references:string[]。数量/比例等实际能力先查询 capabilities;模型、分组和凭据通过平台配置,不放在 generate 参数中。generate 会审批、提交并返回任务,不承诺立即得到图片,也不能当作免费试用。

images.tasks 当前合并 desktop/chat 来源、按创建时间降序、最多 50 条;不是所有应用的全局任务列表。应用来源用 applications.images(appId)。images.artifact 的 id 当前是任务 ID,具体实现核对任务归属后读取产物,不传作品文件路径。

生成成功不等于保存成功。未知结果先查询原任务,禁止自动重提付费操作。无取消上游接口。作品只登记成功保存产物,失败任务不作为作品。

works.list 除当前账户内部索引外,会从已配置保存目录的 图片/ 恢复本产品生成的 .png.json 元数据:校验文件类型、尺寸、PNG 标识、摘要和时间后补建索引。使用目录中实际文件位置,不信任元数据中的绝对路径;损坏、摘要不匹配或链接文件不导入。不扫描未配置目录,不搬迁或改写原图片。用户主动选择已有作品目录时,该目录中有效作品可在当前账户中重新展示。

WorksConfiguration 为 revision/directory。WorkItem 含 id/kind/filename/prompt/generatedAt/savedAt/model/group/referenceCount/caller/bytes/sha256,可选 resolution/aspectRatio/width/height/gatewayTaskId,见 works.ts。保存位置改变只影响后续保存,不自动搬迁旧作品;pickDirectory 由系统选择器授权。

5. 资料应用领域 API ​

方法参数返回
materials.list无MaterialsRun[]
materials.createrules:MaterialsRulesMaterialsRun或undefined(取消)
materials.getid:stringMaterialsRun
materials.scanid:stringMaterialsRun
materials.updateid:string,revision:number,rules?:MaterialsRules,edits?:{id,target,included}[]MaterialsRun
materials.cancelid:stringMaterialsRun
materials.previewid:string,file:stringstring
materials.deliverid:string,revision:numberMaterialsRun或undefined(取消)
materials.openid:stringvoid

create 不接受目录路径,使用系统选择器。deliver 选输出目录并显示真实确认,再由主进程签票执行;不是无交互交付。scan 为异步任务,get 查询真实状态。领域 status 为 draft/scanning/review/delivering/completed/failed/cancelled,与通用 AppTask 分开。

MaterialsRules 必填 title(1–80)、groupBy(type/original)、deduplicate:boolean、prefix(<=40,字母数字下划线连字符)、requiredExtensions:string[](最多20,格式如 .pdf)。更新 edits 最多500,revision 必须最新。MaterialsRun/MaterialsFile 完整字段见 service.ts;预览、交付与打开均经过业务权限检查。

6. 对话工作台 API ​

方法参数返回
workbench.getState无WorkbenchState
workbench.newSession无void
workbench.openSessionid:stringvoid
workbench.updateSessionid:string,action:rename/archive/unarchive/delete,name?:stringvoid
workbench.sendtext:string,images?:WorkbenchImage[],application?:void
workbench.resendid:string,text?:string,images?:WorkbenchImage[]void
workbench.abort无void
workbench.selectModelid:stringvoid
workbench.setReasoningEfforteffort:ReasoningEffortvoid
workbench.setApprovalModemode:manual/auto/fullvoid
workbench.answerDialogid:string,response:void
workbench.selectProject无void
workbench.projectChanges无ProjectReview
workbench.projectDifffilename:stringProjectDiff
workbench.runTestcommand:stringvoid
workbench.onEventlistener:(WorkbenchEvent)=>void取消订阅函数(同步)

send/resend/runTest 的 void 表示请求已交给处理器,不表示模型回复、测试或外部任务完成。用 getState/onEvent 查看实际状态。runTest 会执行命令,不能拿任意字符串作无副作用示例。忙碌/待审批时切换模式受限制。abort 不保证上游付费任务取消。

应用明确命令示例:

ts
await window.piMarket.workbench.send('', undefined, {
  appId: 'sitoo.materials',
  command: 'help',
  hasExtraInput: false,
});
const unsubscribe = window.piMarket.workbench.onEvent((event) => console.log(event));
// 组件卸载时调用 unsubscribe(),避免重复事件处理。

事件和消息类型以 workbench-types.ts 的实际联合类型为准,按 type 分支处理,不将原始事件日志直接作为用户交付内容。

7. Runtime 设置与扩展市场 ​

方法参数返回
capabilities.getState无CapabilityState
capabilities.updatekey:CapabilityKey,enabled:booleanCapabilityState
capabilities.apply无CapabilityState
capabilities.configureconfiguration:RuntimeConfigurationCapabilityState
capabilities.mcpAuthenticationaction:login/logout/cancel,name?:stringvoid
capabilities.pickPathkind:shell/skill/promptstring或undefined
packages.getState/refresh/apply无PackageMarketState
packages.install/removeid:stringPackageMarketState
packages.setEnabledid:string,enabled:booleanPackageMarketState

packages 是 Pi Runtime 扩展市场,不是专业应用 spkg 安装 API。配置保存与实际应用状态分别检查;apply 可能重连运行时,不能把保存成功等同当前会话已启用。类型见 capability-settings.ts、package-market.ts。

8. 账户、模型、更新与桌面 ​

方法参数返回
auth.getState/login/logout/refresh无AuthState
auth.credentials无ModelCredentialSummary[]:group,name,status,expiresAt;无密钥
auth.connectCredentialsgroups:string[]void;1–100 个不重复分组,空字符串表示默认通道;已有有效凭据直接复用,其余批量获取
auth.clearCredentialsgroups:string[]void;只清除本地副本并保留清除标记,取消所选分组请求,不撤销服务端令牌
auth.checkConnection无void
auth.onChangelistener:(AuthState)=>void取消订阅函数
platform.list无PlatformGroup[]
platform.updategroup:string,enabled:boolean,models:string[]void
providers.list无ProviderInfo[]
providers.loginid:string,method:oauth/api_keyvoid
providers.answerid:string,value:stringvoid
providers.cancel/openBrowser无void
providers.removeid:stringvoid
providers.addCustominput:CustomProviderInputvoid
providers.onEventlistener:(ProviderAuthEvent)=>void取消订阅函数
updates.getState/check/download/install无UpdateState
updates.onChangelistener:(UpdateState)=>void取消订阅函数
desktop.getConfiguration无desktopConfiguration
desktop.downloadImagesource:stringboolean
desktop.showMenuname:string,x:number,y:numbervoid
desktop.setTitleThemetheme:stringvoid
desktop.onCommandlistener:(string)=>void取消订阅函数

平台凭据与登录会话分别管理。login 只完成身份认证,不读取模型 Key;refresh 只更新账户。logout 不撤销用户令牌,本地加密副本保留。connectCredentials 优先复用账户已有令牌,必要时创建长期有效、受账户余额约束的令牌;不修改已有令牌配置。凭据查询仅在主窗口可用,第三方应用没有访问权限,不属于 App SDK 公共契约。

凭据状态为 saved/pending/cleared/invalid/expired;saved 仅表示本地已保存,不证明实时网关可用。expiresAt=-1 表示无自动过期。首次缺失可按需获取,cleared/invalid/expired 必须明确 connectCredentials;清除后不会自动下载回来。模型网关 HTTP 401 将对应凭据标记 invalid,保留账户登录且不自动重放;429、网络错误、5xx、额度/权限类失败不删除密钥。批量创建结果不确定时返回 CREDENTIAL_PENDING,先核对 New API;确认后可清除本地标记并重新连接。存储异常 CREDENTIAL_STORAGE_FAILED 不降级为明文。官方批量接口 /api/token/batch/keys 是第三方 New API 接口,本仓库不新增公共 HTTP 服务。

AuthState 为 signed-out/signing-in/authenticated,authenticated 含 AccountSummary,不返回登录 token。providers 受编译版本限制,平台版不能靠调用 API 开启扩展版权限。updates.install 会进入实际更新流程,不作示例调用。

事件订阅立即返回解除函数,React effect 清理时调用。账户/更新数据详见 auth-types.ts、update-types.ts,Provider 类型见 provider-types.ts。

9. 应用 MCP HTTP 协议 ​

资料服务来自 host.ts,动态 loopback 地址与 token 由平台 getBinding 获取,不固定端口或给普通网页暴露。Authorization: Bearer <token>,Content-Type: application/json,客户端按官方 Streamable HTTP 协商 Accept,调用 initialize 后再 list/call 工具。

当前是无服务端 session ID 的 Streamable HTTP,POST /mcp;不存在专用 GET /tasks REST。未认证/账户不匹配 401;路径/Host/Origin 不符 403;认证通过但非 POST 405;传输内部失败可能 500。拒绝带 Origin 的浏览器请求,不能直接从网页 fetch。

通用工具 get_capabilities({id?})、invoke_capability({id,parameters});parameters 序列化长度上限10000。调用示例(初始化后的官方 MCP client):

ts
await client.callTool({ name: 'get_capabilities', arguments: { id: 'scan' } });
await client.callTool({
  name: 'invoke_capability',
  arguments: { id: 'scan', parameters: { task: existingTaskId } },
});

资料领域工具:

工具参数行为
list_tasks{}当前账户任务摘要,最多30
get_taskid:UUID,offset?:整数>=0,limit?:1–30默认 offset=0/limit=20,返回文件分页
scan_taskid:UUID异步扫描已授权目录
update_planid,revision:正整数,rules?,edits?修改方案,最多500 edits
request_deliveryid,revision返回 requiresUserApproval,不批准/执行
cancel_taskid请求停止,保留原文件和已有输出

MCP 调用结果 content 包含 text,通用 invoke 还有 structuredContent;工具错误查看 isError,不能只判断 HTTP 200。HTTP 错误与业务工具错误不是同一层。MCP 不提供创建目录授权或签票工具。

10. 私有 Runtime HTTP 桥 ​

这些接口只记录给平台维护者排查,第三方应用使用 SDK 能力,不依赖动态 token 或桥实现。

生图 /tool:动态地址、账户 Bearer token、准确 Host、拒绝 Origin;仅 POST,正文最多800 KiB。操作为 capabilities、generate(requestId:string,<=300;request:SitooImageRequest)、status(id:string)。requestId 用于原任务幂等,不为同一逻辑动作随意更换。

成功200返回能力或任务对象;鉴权失败401;方法/路径/Host/Origin 不合规403;超限413;解析/业务调用失败400,正文 {error:消息}。wait 是 Runtime 扩展对 status 的等待逻辑,不是该 HTTP 桥的 operation。

模型代理:Bearer 代理会话 token(不同于持久化的 New API Key)、无 Origin、只 POST;路径 /v1/chat/completions 或 /v1/desktop-newapi-<24位小写hex>/chat/completions。正文上限16 MiB,转发上游流式响应;它不是任意 URL 代理。完整错误行为见 model-proxy.ts,生图见 sitoo-image-host.ts。

11. 本地更新与目录下载 ​

serve-desktop-updates.mjs 只用于本地更新验收,默认 loopback 18680(可指定)。无认证,不作为生产发布管理后端。

路径方法响应
/latest.ymlGET/HEADelectron-updater 版本清单
/Pi-Market[-Extended]-x.y.z-x64-setup.exe[.blockmap]GET/HEAD允许名称的文件,支持单个 bytes=start-end Range
/packages/catalog.jsonGET/HEADRuntime 扩展目录,文件缺失404
/__statsGET验收下载统计,非生产监控 API

未知文件404、不支持方法405、非法Range416;目录与清单 no-store,安装文件缓存一小时。没有 POST 上传、审核或专业应用目录接口。目录部署配置见 扩展市场 与 更新配置。

12. 版本、维护与验证 ​

浏览器 SDK 0.0.3 与宿主私有桥 ​

应用公开接口为 createAppClient(),详见浏览器 SDK。platform.getCapabilities、storage.get/list/put/delete、images.listTasks 均已接入;文本推理尚未开放。内部对应 IPC apps:platform-capabilities(token) 和 apps:storage(token,operation,input),token 由主进程创建并绑定当前账户、已安装应用与包摘要,应用不能自行传入 appId 或 scope。浏览器只传数据,可信父页面持有 token 并调用私有 IPC。

存储输入使用 JSON;get 输入 id,list 输入 cursor/limit,put 输入 id/revision/version/value,delete 输入 id/revision。revision 乐观并发检查、原子保存、删除墓碑及配额在宿主执行。单写 16 KiB、单应用单账户 8 MiB/1000 记录、分页最多 100;卸载保留,普通业务存储不加密,不接受路径或凭据槽位。

浏览器错误为 AppSdkError(code,message,retryable,action),消息不暴露原始路径/堆栈;TIMEOUT 表示提交结果可能未知,不能自动重提付费请求。Account 变化或关闭会话后拒绝调用;已提交的写入须重开查询确认。没有新增公开 HTTP API。

SDK API 按 SDK/契约版本管理;Desktop IPC 和私有桥目前是同客户端内部契约,不承诺不同客户端版本间稳定。未来公共 HTTP API 实现后增加独立版本、OpenAPI/schema、认证、限流与兼容策略,当前不生成虚构 OpenAPI。

公开方法/路由/参数/鉴权/状态改变时,同批更新本手册;API 原因引发 SDK 变化还须同步 SDK 手册和 CHANGELOG。维护入口见根 AGENTS。新接口说明权限、返回时机、取消、幂等、副作用和失败,不把网络200写成任务完成。

文档验证核对源码入口、方法清单、链接及示例;行为变更运行相关 SDK、桌面、MCP 和桥测试。不要为验证手册实际发送付费生图、执行任意 shell 或发起更新安装。本次文档编写不是所有接口端到端验收。