@ averyyy/ pi 服务器
服务器 @averyyy/pi-client。它存储会话状态,并向上游模式提供者转发客户请求.
安装
npm i -g --ignore-scripts --legacy-peer-deps @averyyy/pi-server
开始
pi-server
默认它会听 http://127.0.0.1:4217 和存储会话 .pi/pi-server/sessions 在当前目录中.
配置
在服务器环境中设置提供者密钥, 然后启动服务器 :
OPENAI_API_KEY=your-key pi-server
有用的服务器设置 :
PI_SERVER_HOST=127.0.0.1
PI_SERVER_PORT=4217
PI_SERVER_AUTH_TOKEN=your-token
PI_SERVER_SESSION_STORE_DIR=/path/to/sessions
PI_SERVER_UPLOAD_DIR=/path/to/upload_files
PI_SERVER_ACCOUNT_STORE_DIR=/path/to/accounts
收到文件默认为 ~/.pi/upload_files。 。 。 .
账户提供者
PiServer拥有Devin和Google Antigravity账户登录,认证持久性,符号刷新和模型发现. 连接 pi-client运行 /login devin 或者说 /login google-antigravity,然后完成浏览器的授权并快速重定向。 客户端接收账户状态和模型元数据;证书保留在服务器上.
账户文件默认为 ~/.pi/pi-server/accounts设置 PI_SERVER_ACCOUNT_STORE_DIR 来选择另一个目录。 服务器在启动时恢复已保存的账户目录,并在背景中刷新,成功登录后,每4小时更新一次. 过期 OAuth 令牌在需要时刷新 。 失败发现保存了保存的目录并报告错误 . /logout 取消所选账户的待定工作并删除其证书和目录.
认证 /api/accounts 端点曝光这两个账户快照. 它们的推论和收缩请求 options.authSource: "server-account",它选择了精确的保存账户模型和服务器证书。 其他供应商的配置和登录仍然为客户所有.
公共模型目录
认证 /api/model-catalog/providers/:provider?pi-version=<version> 端点服务于来自pi.dev的共享公共目录. 客户端只请求拥有已配置认证的提供者 。 服务器按要求获取一个提供者,并使用同Pi版本在客户端之间共享其缓存响应. Catalog请求包括聊天,图像,以及没有提供者证书的分类元数据;客户从自己的证书和配置中确定模型可用性.
目录存储在 .model-catalog 在会话存储目录中保存并保存4小时的新鲜度。 过期的条目使用ETag重新验证;同时提出的请求共享一个上游获取. force=true 请求立即重新确认。 服务器启动不会获取公共目录 。 失败刷新报告出错并保留保存的目录供下次尝试使用 。 OpenRouter的证书专用过滤器仍然保留在客户端上.
人类订阅
Anthropic OAuth 请求使用 Claude 代码订阅请求在服务器上塑造,其基础是 人类-原子。继续使用客户端的现有 /login anthropic;客户端存储并刷新其证书,并为每个请求提供访问符. 服务器将同样的形状应用于原始而简单的聊天流,收缩,和缓存变暖.
服务器使用本地请求 Claude 代码版本添加了计费系统块,并在客户端有效载荷回调后塑造了Pi 默认的提示部分. 项目指令,自定义提示,工具定义,以及签名的助手内容被保存. 这适用于: anthropic 提供者的 OAuth 请求; API 密钥和其他提供者保留它们现有的行为. 第一个用户信息必须包含文本 。 Pi客户端的额外使用警告反映了OAuth登录状态,而不是服务器的请求塑造;在克洛德的使用页面中验证实际消耗.
连接客户端
PI_SERVER_URL=http://127.0.0.1:4217 pi-client
带有认证 :
PI_SERVER_AUTH_TOKEN=your-token PI_SERVER_URL=http://127.0.0.1:4217 pi-client
对客户端和服务器使用相同的发布版本. 认证 /api/models 端点报告服务器配置的模型 。 客户模式选择使用公共目录缓存和客户端认证. /api/stream, (中文(简体) ), /api/generate-images,以及 /api/classify 解决服务器侧提供方证书或使用客户端明确提供的证书.
图像生成和分类流心跳响应和期刊在不重复提供者操作的情况下完成了回收结果. 供应商清理完成后确认取消 。 使用过大的有效载荷 /api/request/chunk,包括客户端设定64个KiB请求-体限时.
请求时间
设定 PI_TIMING=1 由客户端打印请求延迟诊断。 客户端请求选入 event: timing SSE 框架来自 /api/stream;普通请求不包括这个框架.
客户端 clientPrepareMs 起始于 clientPrepareFrom: 接受运行,代理工具补全事件,或用户消息启动. 工具边界包括后续扩展处理器和请求准备,同时排除工具执行本身. sessionInitMs 计量会话初始化和客户端 firstContentMs 测量从启动流 POST 到接收内容的间隔.
服务器字段是收到 HTTP 请求后累积的毫秒 : bodyReadyMs 标记解析请求数据, providerDispatchMs 标记提供者呼叫, upstreamRequestMs 标记准备的上游有效载荷, upstreamHeadersMs 标记第一个上游HTTP反应 firstContentMs 标记第一个非空文本、思维或工具调用输出。 最终唯一内容也算数. 没有生命周期回调的适配器省略了它的场. 对于被块状上传,服务器时间从完成的HTTP块开始. 客户的 requestToHeadersMs 包括序列化,所有上传块,服务器处理,以及响应头.
providerDispatchMs 改为 upstreamRequestMs 包括供应商认证、装载和服务器上的有效载荷准备. upstreamRequestMs 改为 firstContentMs 包括HTTP设置,网络中转,上游排队,再试,和模型处理. upstreamHeadersMs 将首个上游HTTP响应与剩余等内容相分离. 这些间隔并不单独测量模型预填. HTTP 头,心跳字节,和空流事件不计为模型内容.
线索查看器
打开服务器的根 URL并签名到 PI_SERVER_AUTH_TOKEN。主页按客户端工作目录组合线索,并首先列出运行的线索。 线程由其最新的活性来命令;项目使用其最新的活性线程. 服务器在开始和完成推断时记录活动,收缩,图像,分类器,以及被推迟的操作. 读取历史,重联,同步现有历史,更名,再播放完成的结果,不会推进这段时间. 已存档的会话使用他们保存的对话时间戳,直到服务器记录到新的操作. 缓存变暖使用相同的提供者请求协议并算作活性. 没有活动的会话最后出现.
项目文件夹一次扩展5个线程. 线索页显示最新的5个对话回合;滚动到顶部负载时会提前5个回合,同时保持当前段落的位置. 已完成的回合揭示出最后的答案;思维和工具活动可以单独扩展,包括在流出时扩展.
右键单击一个工程来崩溃或扩展,或者删除其服务器的全部对话. 右键单击线索删除服务器对话 。 相同的菜单通过上下文菜单键或Shift+F10提供. 删除需要确认,并包括已保存的历史和观察员记录。 项目删除包括当前已加载的页面以外的对白.
服务器索引每个进程一次并更新仅会随着变化而影响会话. Pgination 不扫描每个会话就读取工程的索引 。 浏览器加载可见的扩展文件夹并保留其页面为内存,而页面仍然开放;没有修改的文件夹会再使用这些页面. 当文件夹可见时会获取屏幕外的更改 。 JavaScript 和 CSS 使用构建版本的 URL 和 不可移动的浏览器缓存, 包括跨服务器重启; HTML 、 认证和对话响应仍然保留 no-store。 。 。 .
查看器会读取,写出,并且通知会同步运行,以排列每个线程. 活动更新不会等查看器存储或通知后再发送推论. 观察者更新在存储承诺后公布内容索引;删除等待之前的操作,服务器关闭排出待操作. 资产加载和认证状态I/O也是同步状态.
打开一条线程通过一个事件流请求读取其初始历史并直播更新. 直接线程 URL 启动该流与项目目录 。 未更改会话初始化和"一能"历史写作不会重发取景者的历史快照.
浏览器收到一个单独的12小时 HttpOnly, (中文(简体) ), SameSite=Strict 会话 cookie 范围到 /viewer。该 cookie 授权只读取并删除同源会话。 提供方请求和普通会话 APIs保留了无记名认证. 在公共访问的倒置代理上配置HTTPS;代理必须保留请求主机和HTTPS协议. 查看器需要配置的服务器令牌 .
10个失败的代币检查锁认证访问,包括正确的代币. 计数在重启的整个过程中持续,由查看器登录共享,并要求提供不正确的API授权头. 没有 API 证书的请求并不需要尝试 。 一个成功的查看器登录重置了计数;普通客户端流量没有. 解锁服务器, 使用与运行进程相同的配置和会话目录 :
PI_SERVER_SESSION_STORE_DIR=/path/to/sessions pi-server viewer unlock
在不重新启动服务器的情况下解锁生效 。 没有 HTTP 解锁端点 .
匹配 pi-client 发布事件触发更新,包含当前分支的承诺消息,项目目录,标题,以及明确的运行/工具状态. 客户端发布执行开始,内容更改,执行完成时更新,没有观察者连接,心跳,或定时重接. 运行报告和闲置报告共享TUI工作指标的会话周期,包括工具,收缩,同步完成处理器和取消确认. 已完成的闲置报告在服务器重启时持续存在;未完成的运行报告恢复为未知. 浏览器通过自己的事件流接收服务器更新. 观察者不修改服务器的推断树或提供者上下文. 它的历史和认证状态生活在 .viewer 在会话目录中.
现有的服务器会话是从已恢复的快照和WAL记录中读取. 项目使用在有效系统消息中声明的远程工作目录或Pi的标准系统即时目录字段;只有没有该元数据的会议才会显示为未指定的档案. 保存的分支历史在没有连接客户端的情况下是可用的,成功的会话会写更新开放的取景器页面.
取景器显示由服务器保存或由连接客户端发布的历史. 只包含初始化元数据的会话没有保存的对话正文 。 系统指令用于项目元数据,不包括在对话显示中. 图像以附件标签表示. 转写 Markdown 不执行 HTML 或装入外部图像 .
前端保留在 viewer/ 作为固定资产的船舶 dist/viewer/与 npm run build:viewer· ; npm run build 包括这个步骤。 此查看器独立于由 pi-client web。 。 。 .