pinokio
一键启动任意开源AI应用的Electron桌面平台,JSON脚本自动化全流程,覆盖400+AI工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
一键启动任意开源AI应用的Electron桌面平台,JSON脚本自动化全流程,覆盖400+AI工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
项目地址:https://github.com/pinokiocomputer/pinokio
当前版本:v7.2.6(2026年4月)
Stars:7,548
License:MIT
主要语言:JavaScript(Electron + Node.js)
开源 AI 生态有一个根深蒂固的问题:技术可用性 ≠ 用户可用性。以 Stable Diffusion WebUI 为例,用户从 GitHub 克隆代码到本地成功运行,平均需要解决以下问题:Python 环境版本、CUDA 驱动版本、torch 与 CUDA 版本匹配、Git LFS 下载大模型权重、环境变量配置、端口冲突……每一个环节都可能卡住一个非技术用户。
根据社区反馈数据,一个熟练开发者平均需要 30-60 分钟 完成初次配置,而 AI 爱好者(非开发者)往往在环境配置阶段就放弃了。这导致大量优秀的开源 AI 项目被埋没在实际用户的视野之外。
Pinokio 正是为解决这个问题而生。它的核心理念是:让 AI 应用的安装和运行,变得和从手机应用商店安装一个 App 一样简单。用户不需要懂命令行,不需要理解 CUDA,不需要配置任何环境变量——只需要打开 Pinokio,点击「Install」,然后等待一杯咖啡的时间,AI 应用就自动启动好了。
Pinokio 由独立开发者 cocktailpeanut(Twitter/X: @cocktailpeanut)创建并维护,联系邮箱 cocktailpeanuts@proton.me。项目起源于 2023 年,最初只是一个「一人审核的 AI 应用目录」——所有上架 Discover 页面的脚本,都需要 cocktailpeanut 亲自测试验证后才能上线。
2024 年,项目宣布向社区开放,任何人都可以提交脚本并经过审核后上架。这种「创始人背书 + 社区共建」的模式,既保证了应用质量,又借助社区力量快速扩充了应用数量。
截至 2026 年,Pinokio 已收录超过 400+ AI 应用,涵盖图像生成、视频合成、3D 重建、语音合成、AI Agent 等数十个类别,成为开源 AI 应用本地化运行领域 star 数最高(7,548★)的项目。
Pinokio 目前没有公开的公司注册信息,以两个 GitHub 组织运营:
| 组织 | 仓库数 | 定位 |
|---|---|---|
| pinokiocomputer | 22 | 核心项目:Electron 应用(pinokio)、运行时引擎(pinokiod)、文档站点(program.pinokio.computer)、llamanet(Llama.cpp 封装) |
| PinokioFactory | 101 | 应用脚本:所有 Discover 收录的 AI 应用 launch.json 脚本仓库,经审核后冻结于此 |
Pinokio 采用 MIT 许可证完全开源,无专利限制,代码可自由 fork、修改和再分发。
Pinokio 由两个独立的 GitHub 仓库共同构成,形成「桌面壳 + 运行时引擎」的分层架构:
| 仓库 | 技术栈 | 职责 |
|---|---|---|
| pinokiocomputer/pinokio | Electron + electron-builder | 桌面应用外壳:窗口管理、UI 渲染、自动更新、打包分发 |
| pinokiocomputer/pinokiod | Node.js + Express + WebSocket | 运行时引擎:脚本执行、进程管理、环境隔离、网络服务 |
两个仓库版本号严格同步(当前均为 v7.2.6),pinokiod 作为 npm 依赖嵌入 pinokio 的 package.json 中:
"dependencies": {
"pinokiod": "^7.2.6"
}
Pinokio 运行时的系统架构分为五层:
第一层:Electron 桌面进程
window.prompt() 等原生 API第二层:pinokiod HTTP 服务(port 42000)
第三层:pinokiod Kernel 核心
第四层:包管理器抽象层
第五层:隔离的应用环境
~/pinokio/api/<app-name>/~/pinokio/api/<app-name>/venv/~/pinokio/api/<app-name>/cache/| 端口 | 服务 | 说明 |
|---|---|---|
| 42000 | pinokiod HTTP Server | Express.js 主服务,托管 UI 和 API |
| 42001 | Python RPC Server | Uvicorn FastAPI,接收 Python RPC 调用 |
| 动态端口 | AI 应用 WebUI | 每个 AI 应用独立端口,由 portfinder 自动分配 |
| WebSocket | 终端流 | 与端口 42000 共享同一个 HTTP 服务器 |
Electron 主进程(PID 1)
├── BrowserWindow(渲染进程 × N)
│ └── BrowserView × N(每个 AI 应用一个)
└── pinokiod 子进程(PID 2,Node.js)
├── Express Server(port 42000)
│ └── WebSocket Server
└── child_process × N(每个 AI 应用一个 PTY 进程)
└── AI 应用主进程(如 python launch.py)
Electron 主进程从 main.js 开始:
const { app } = require('electron')
const Pinokiod = require("pinokiod")
const pinokiod = new Pinokiod(config)
// Linux: 禁用硬件加速,解决 wayland 兼容问题
if (process.platform === 'linux') {
app.disableHardwareAcceleration()
}
// 根据用户设置的模式选择加载完整窗口或最小化后台
let mode = pinokiod.kernel.store.get("mode") || "full"
if (mode === 'minimal' || mode === 'background') {
require('./minimal')
} else {
require('./full')
}
关键点:Linux 平台需要禁用硬件加速(app.disableHardwareAcceleration()),因为在 wayland 环境下硬件加速会导致渲染异常。
full.js 是标准的 Electron 窗口管理模块,核心职责如下:
1. 窗口创建与 BrowserView 管理
Pinokio 使用 Electron 的 BrowserView API 实现多标签页。每个 AI 应用占用一个独立的 BrowserView Tab,可以独立加载、关闭、切换。BrowserView 相比 window.open() 的优势在于:可以在同一个父窗口内实现多标签页的视觉效果,同时保持各 Tab 的 JS 上下文隔离。
2. 内置 UI 加载
mainWindow.loadURL('http://localhost:42000')
内置 UI 实际托管在 pinokiocomputer.github.io/home(GitHub Pages),通过 pinokiod 的 Express 服务器反向代理到根路径 /。这意味着 UI 是纯前端项目(HTML/CSS/JS),与后端完全解耦,可独立迭代更新,无需重新发布 Electron 应用。
3. 自动更新(electron-updater)
.zip / .dmg / .AppImage)4. 主题色系统
支持浅色(light)、深色(dark)和金色渐变(gold)三种主题。主题配置存储在用户本地(~/pinokio/kernel/pinokio.json),启动时读取并应用。窗口标题栏叠加层(Title Bar Overlay)颜色也会随主题同步变化。
5. 截图能力(Debug 功能)
ipcMain.handle('pinokio:capture-screenshot-debug', ...)
通过 desktopCapturer.getSources() API 捕获当前窗口画面,用于调试 AI 应用的渲染问题。当用户在 AI 应用中遇到界面异常时,可以一键截图并反馈给应用开发者。
minimal.js 提供轻量级后台运行模式:
Tray)图标,应用在后台静默运行启动参数支持 --background 或 --minimal flag。
preload.js 是 Electron 的上下文隔离桥,在 Chromium 渲染进程和 Node.js 主进程之间建立安全的双向通信通道。这是 Electron 安全模型的核心——渲染进程无法直接访问 Node.js API,所有访问必须通过 preload 暴露的接口。
核心 IPC 通道:
| IPC 方法 | 方向 | 作用 |
|---|---|---|
ipcRenderer.send(type, msg) | Renderer → Main | 渲染进程向主进程发异步消息 |
ipcRenderer.sendSync(type, msg) | Renderer → Main | 同步消息(如 window.prompt() 实现) |
ipcRenderer.invoke('pinokio:request-permissions') | Renderer → Main | 请求系统权限(摄像头、麦克风等) |
ipcRenderer.invoke('pinokio:start-inspector') | Renderer → Main | 启动 DevTools 检查器 |
ipcRenderer.invoke('pinokio:capture-screenshot') | Renderer → Main | 截图 |
window.parent.postMessage({ action }, '*') | Frame → Parent | 同源策略下跨 Frame 通信 |
BrowserView 导航追踪
AI 应用(如 Gradio WebUI)大量使用 history.pushState() 和 history.replaceState() 进行无刷新路由切换。Pinokio 的 preload 脚本通过劫持这两个方法,感知 URL 变化并通知父窗口:
history.pushState = function pushStateWithPinokioLocation(...args) {
const result = originalPushState.apply(this, args)
publishFrameLocation() // 通知父窗口 URL 已变化
return result
}
这样 Pinokio 就能在 AI 应用切换路由时自动更新 Tab 标题和地址栏,实现与原生浏览器几乎一致的导航体验。
Pinokio Event System
preload.js 还实现了自定义事件系统 window.$pinokio,允许 AI 应用的 Web 页面通过 JavaScript 与 Pinokio 主进程通信:
window.$pinokio.trigger('app:install', { uri: '...' }, { workspace: 'my-app' })
应用可以触发命名事件,Pinokio 主进程监听并响应,实现如「安装完成通知」「模型下载进度」等交互。
package.json 中的 electron-builder 配置支持多平台打包:
| 平台 | 格式 | 架构 |
|---|---|---|
| macOS | .dmg / .zip | x64 + arm64(Apple Silicon) |
| Windows | .exe(NSIS 安装包) | x64 |
| Linux | .deb / .rpm / .AppImage | x64 + arm64 |
特殊处理:
node_modules/pinokiod/server/public/**、node_modules/@homebridge/**、node_modules/7zip-bin/**pinokio:// URL scheme 支持从外部网页唤起 Pinokio 并打开指定应用temp/yarn.js 覆盖到 app-builder-lib 解决 yarn 兼容性问题pinokiod/
├── index.js # npm 包入口:Store + Server 启动
├── worker.js # 子进程 fs 操作代理
├── package.json # Node.js 依赖定义(v3.9.0)
│
├── kernel/ # 核心引擎
│ ├── index.js # Kernel 主调度器(19,989 字节)
│ ├── shell.js # PTY 伪终端(32,396 字节)
│ ├── shells.js # Shell 队列管理(13,326 字节)
│ ├── api/ # API 方法集(20+ 子模块)
│ │ ├── index.js # API 路由器(39,862 字节)
│ │ ├── browser/ # 浏览器打开/关闭
│ │ ├── proxy/ # 本地网络共享
│ │ ├── process/ # 进程等待/启动
│ │ ├── gradio/ # Gradio API 调用
│ │ ├── cloudflare/ # Cloudflare Tunnel 隧道
│ │ ├── git/ # Git 克隆
│ │ └── ...(fs, env, global, goto, hf, input, json, jump, key, load, local, log, modal, net, notify, rm, script, self, set, shell, tab, web 等)
│ ├── bin/ # 包管理器抽象层(24,763 字节)
│ │ ├── git.js # Git 克隆
│ │ ├── python.js # pip / uv / conda
│ │ ├── node.js # npm / yarn
│ │ ├── conda.js # Miniconda 管理
│ │ ├── brew.js # Homebrew(macOS)
│ │ ├── cuda.js # CUDA 驱动检测
│ │ ├── ffmpeg.js # FFmpeg 安装
│ │ ├── torch.js # PyTorch 特殊安装逻辑
│ │ └── ...
│ ├── python/ # Python RPC Server(port 42001)
│ ├── environment.js # 环境变量管理(13,288 字节)
│ ├── loader.js # 脚本加载器(JSON/JS/YAML)
│ ├── script.js # URI 解析(本地/GitHub)
│ ├── sysinfo.js # 系统信息采集(GPU/CPU/内存)
│ ├── util.js # 工具函数
│ ├── key.js # 密钥存储
│ └── vars/ # 变量模板(torch 等特殊安装逻辑)
│
├── server/ # HTTP 服务
│ ├── index.js # Express 主文件(112,141 字节)
│ ├── socket.js # WebSocket 实时通信
│ ├── public/ # 静态资源
│ └── views/ # EJS 模板
│
├── script/ # pinokiod 启动入口
│ └── index.js
│
└── pipe/ # 分享端点服务
├── index.js # 带密码保护的代理服务
└── views/
Kernel 是 pinokiod 的核心调度器,负责协调所有子系统。关键设计:
内存管理
this.memory = {
local: {}, // 每个应用脚本的本地变量(URI → 变量对象)
global: {} // 全局共享变量
}
memory.local 以脚本 URI 为键,存储该脚本执行过程中的所有状态变量(如 local.url、local.port)。memory.global 跨脚本共享,用于存储全局配置。
URI 解析
Kernel 支持两种 URI 格式:
// GitHub 远程脚本
kernel.script.resolve('https://github.com/cocktailpeanut/sd-webui.git/start.json')
// 本地绝对路径
kernel.script.resolve('~/api/sd-webui/start.json')
resolve() 方法将 URI 转换为本地文件系统绝对路径,统一后的路径格式为 ~/pinokio/api/<app-name>/start.json。
进程队列管理
this.procs = {} // 等待中的进程(用于 pause/resume)
this.queues = {} // 每个 URI 的执行队列(保证同一脚本不并发执行)
Shell 是 Pinokio 脚本的实际执行单元,基于 node-pty(@homebridge/node-pty-prebuilt-multiarch)实现伪终端(PTY)。
PTY 启动流程
async start(params, ondata) {
// 1. 清理可能干扰的环境变量
delete this.env.CUDA_HOME // 避免 CUDA 版本冲突
delete this.env.PYTHONPATH // 避免全局包干扰
// 2. 创建 PTY 进程
this.pty = pty.spawn(shell, args, {
name: 'xterm-color',
cols: this.cols,
rows: this.rows,
cwd: params.path, // 工作目录隔离
env: this.env, // 注入应用专属环境变量
})
// 3. PTY 输出 → 回调 → WebSocket → 前端终端
this.pty.onData((data) => {
ondata({ raw: data, cleaned: cleanAnsi(data) })
})
}
环境变量清理策略
Pinokio 在启动 PTY 前会清理以下系统环境变量,防止干扰 AI 应用:
PYTHONPATH:避免全局 Python 包与虚拟环境冲突CUDA_HOME 及所有以 CUDA 开头的变量:强制让应用使用 Pinokio 管理的 CUDA 版本CMAKE_MAKE_PROGRAM、CMAKE_GENERATOR:避免构建工具版本冲突SSH 和 SSL 相关变量:避免代理冲突Checkpoint 与序列日志
Shell 实现了类似 Git 的 checkpoint 机制——记录每个关键时间点的终端状态快照,支持回退和重放。这对于调试安装脚本和重现用户遇到的问题非常有价值。
Shells 管理器维护多个 Shell 实例的并发调度:
事件驱动的脚本控制
Pinokio 脚本支持在输出中匹配正则表达式来触发后续动作:
{
"method": "shell.run",
"params": {
"message": "python install.py",
"on": [
{ "event": "/Download complete/i", "done": true },
{ "event": "/error:/i", "break": true }
]
}
}
shells.js 中的 _launch() 方法会:
on 数组中的正则表达式done: true 时发送 continue 信号break: true 时立即 kill PTY 进程kill: true 时 kill PTY 并设置返回值错误处理
默认错误处理规则:
error: → break(立即终止)errno → break(立即终止)error: triton → 不 break(忽略 triton 警告)Api 是 pinokiod 对外暴露能力的核心模块,包含 20+ 个 API 方法:
脚本执行入口
async process(req) {
// 1. 解析 URI → 本地路径
let scriptPath = this.filePath(req.uri)
// 2. 检查是否已在运行
if (this.running[scriptPath]) return
// 3. 加载脚本文件(JSON/JS)
let script = await this.load(scriptPath)
// 4. 压入队列(先进先出)
await this.queue(scriptPath, async () => {
await this.run(script, req, ondata)
})
}
Git 链接(init)
首次访问时,init() 方法自动在 ~/pinokio/api/ 下为每个 Git 仓库创建符号链接:
// ~/pinokio/api/ 目录结构
api/
├── sd-webui.git/ # 符号链接 → ~/pinokio/cache/git/github.com/cocktailpeanut/sd-webui.git
├── comfyui.git/
└── stable-audio-3/
这样脚本中的相对路径引用可以正常工作,同时保持统一的缓存管理。
RPC 响应机制
wait(scriptPath) {
return new Promise((resolve, reject) => {
this.waiter[scriptPath] = { resolve, reject }
})
}
respond(req) {
let requestPath = this.filePath(req.uri)
if (this.waiter[requestPath]) {
this.waiter[requestPath].resolve(req.response)
}
}
Pinokio 的脚本执行支持暂停等待——当脚本发出等待信号(如等待某个端口就绪)后,Kernel 会注册一个 Promise 等待器,等条件满足时通过 RPC 响应机制唤醒。
Bin 是 Pinokio 实现「一键安装」的关键——它对各种包管理工具进行了统一的抽象。
下载器(Download)
async download(url, dest, ondata) {
const agent = new ProxyAgent()
// 支持系统代理设置
if (process.env.HTTP_PROXY) {
opts.httpRequestOptions = { agent }
}
const dl = new DownloaderHelper(url, this.path(), opts)
// 实时推送下载进度
dl.on('progress', (stats) => {
ondata({ raw: `[${'#'.repeat(p)} barr(${p}%)] ${stats.speed}` })
})
}
支持 HTTP/HTTPS 代理自动穿透、自动重试、进度条显示。
Python 环境隔离
Bin 为每个应用创建独立的 Python 虚拟环境:
// 每个应用的目录结构
~/pinokio/api/<app-name>/
├── venv/ # Python 虚拟环境(pip install 目标)
├── cache/ # 缓存目录
│ ├── UV_CACHE_DIR/
│ ├── PIP_CACHE_DIR/
│ ├── XDG_CACHE_HOME/
│ └── TMPDIR/
└── start.json # Pinokio 脚本
所有 Python 包缓存重定向到 ~/pinokio/api/<app-name>/cache/,确保:
torch 特殊处理
PyTorch 安装是 AI 应用配置中最容易出问题的环节(CUDA 版本匹配问题)。Pinokio 在 kernel/vars/pip/install/torch/ 中针对不同 CUDA 版本预设了不同的安装命令,通过 semver 模块检测系统 CUDA 版本后自动选择合适的安装指令。
Environment 模块为每个应用生成独立的环境变量集合:
const ENVS = [
{ type: ["system"], key: "HOMEBREW_CACHE", val: "./cache/HOMEBREW_CACHE" },
{ type: ["system"], key: "XDG_CACHE_HOME", val: "./cache/XDG_DATA_HOME" },
{ type: ["system"], key: "PIP_CACHE_DIR", val: "./cache/PIP_CACHE_DIR" },
{ type: ["system"], key: "UV_CACHE_DIR", val: "./cache/UV_CACHE_DIR" },
{ type: ["app"], key: "PINOKIO_SCRIPT_AUTOLAUNCH", val: "" },
{ type: ["system"], key: "GRADIO_ALLOWED_PATHS", val: "./" },
]
关键设计:
./cache/(相对于应用目录)GRADIO_ALLOWED_PATHS=./ 允许 Gradio 应用访问应用目录下的所有文件PINOKIO_SCRIPT_AUTOLAUNCH 支持脚本自启动配置Sysinfo 使用 systeminformation 库采集硬件信息,用于辅助决策安装流程:
GPU 自动检测
async gpus() {
let g = await system.graphics()
// 检测 NVIDIA / AMD / Apple Silicon
let is_nvidia = gpus.find(gpu => /nvidia/i.test(gpu.name))
let is_amd = gpus.find(gpu => /(amd|advanced micro devices)/i.test(gpu.name))
let is_apple = gpus.find(gpu => /apple/i.test(gpu.name))
// 决定安装哪个版本的应用
}
Pinokio 的 Discover 页面应用有 NVIDIA / AMD / Apple Silicon 之分,Sysinfo 采集到 GPU 信息后,系统会自动为用户过滤显示兼容的应用。
Server 是 pinokiod 的 HTTP 服务端,基于 Express.js:
路由结构
| 路径 | 方法 | 功能 |
|---|---|---|
GET /api/<app-name>/ | 获取应用列表 | 列出所有已安装应用 |
GET /api/<app-name>/<item> | 获取应用详情 | 包括状态、URL、日志等 |
POST /api/<app-name>/start | 启动应用 | 执行 start.json 脚本 |
POST /api/<app-name>/stop | 停止应用 | 关闭 PTY 进程和代理 |
GET /api/<app-name>/terminal | WebSocket | 终端流 |
GET /api/sysinfo | 系统信息 | GPU/CPU/内存状态 |
GET /* | 代理 | 反向代理到 AI 应用 WebUI |
文件浏览器
Express 服务器还提供了内置文件浏览器(通过 EJS 模板),用户可以直接在浏览器中浏览 ~/pinokio/api/ 目录结构。
自动端口分配
let port = await portfinder.getPortPromise({ port: 42003 })
每个新启动的 AI 应用由 portfinder 自动分配空闲端口,避免手动指定导致的冲突。
Socket 为每个脚本运行实例建立 WebSocket 订阅通道:
wss.on('connection', (ws, request) => {
ws.on('message', async (message) => {
const req = JSON.parse(message)
// 订阅某个应用的状态
if (req.uri) {
let id = kernel.api.filePath(req.uri)
this.subscribe(ws, id) // 加入订阅者列表
// 如果应用未运行,立即启动
if (!kernel.api.running[id]) {
kernel.api.process(req)
}
}
})
})
// PTY 有新输出时,推送给所有订阅者
trigger(e) {
const subscribers = this.subscriptions.get(id)
subscribers.forEach((subscriber) => {
subscriber.send(JSON.stringify(e)) // 实时推送
})
}
前端通过这个 WebSocket 通道实时接收 PTY 输出流,实现终端的「打字机」效果——用户看到 AI 应用安装过程的每一步输出,就像在真实终端中一样。
Pinokio 提供了一个 Python 侧的 RPC 服务,用于在 Node.js 和 Python 环境之间双向通信:
// Node.js 端:调用 Python 函数
async call(modname, modpath, method, args, ondata) {
// 1. 启动 Uvicorn RPC Server(如尚未启动)
await this.kernel.exec({
venv: "env",
message: "uvicorn --port 42001 server:app",
path: modpath,
}, ondata)
// 2. 通过 HTTP POST 调用
let res = await fetch("http://127.0.0.1:42001/call", {
method: "POST",
body: JSON.stringify({ name: modname, path: modpath, method, params: args })
}).then(res => res.json())
return res
}
Pipe 模块为每个 AI 应用创建一个带密码保护的可分享端点:
http-proxy-middleware)这解决了「我在本地跑了一个 AI 应用,如何安全地分享给朋友使用」的问题——无需暴露内网 IP 或配置复杂的反向代理,只需发一个带密码的链接即可。
Pinokio 支持通过 cloudflared 创建 Cloudflare Tunnel,将本地服务暴露到公网:
cloudflared tunnel --url http://localhost:<app-port>
启动后 cloudflared 会输出一个 *.trycloudflare.com 域名,用户可以通过这个域名从任何设备访问本地 AI 应用。Pinokio 会:
*.trycloudflare.com URLPinokio Script 是声明式的 JSON 文件,描述安装和运行一个 AI 应用所需的全部步骤:
{
"setup": [
{
"method": "git.clone",
"params": { "uri": "https://github.com/AUTOMATIC1111/stable-diffusion-webui.git" }
},
{
"method": "shell.run",
"params": {
"message": "pip install -r requirements.txt",
"venv": "venv"
}
}
],
"start": [
{
"method": "shell.run",
"params": {
"message": "python launch.py --xformers",
"on": [
{ "event": "/Running on/i", "done": true }
]
}
}
]
}
| 方法 | 参数 | 说明 |
|---|---|---|
git.clone | uri, branch | 克隆 Git 仓库 |
shell.run | message, path, venv, on, shell | 执行 shell 命令 |
download | url, dest | 下载文件 |
process.start | uri, wait | 启动另一个脚本 |
process.wait | wait | 等待条件满足 |
proxy.start | uri, name, port | 启动本地代理 |
cloudflare.tunnel | uri, passcode | 创建公网隧道 |
gradio.predict | uri, path, params | 调用 Gradio API |
安装阶段(setup)
启动阶段(start)
on 属性)Pinokio 的安全策略基于三层隔离:
文件系统隔离
所有操作强制限制在 ~/pinokio/ 目录树下:
~/pinokio/api/<app-name>/~/pinokio/bin/~/pinokio/kernel/与系统全局环境(/usr/local/bin、~/.local 等)完全分离。
环境变量隔离
每个应用有独立的环境变量集合,关键系统变量(CUDA_HOME、PYTHONPATH 等)被强制覆盖或删除,由 Pinokio 统一管理。
脚本审核冻结
Discover 页面的脚本审核后转移至 PinokioFactory 组织冻结,原开发者无法单方面修改已上线版本。管理员有权下架或修改任何问题脚本。
v7.2 引入了 Protected Mode,在 npm/uv/bun 安装时拦截过去 72 小时内发布的新版包,防止恶意包通过包管理器注入。
~/pinokio/ 内执行任意操作截至 2026 年,Pinokio 完全免费,采用 MIT 许可证开源。收入来源推测为:
| 方向 | 可行性 | 分析 |
|---|---|---|
| Pinokio Cloud(托管版) | 中 | 提供云端运行 AI 应用的托管服务,按 GPU 时长收费。竞品 Paperspace、RunPod 已验证此模式。Pinokio 已有完整的脚本系统和 Web UI,扩展为托管服务成本较低 |
| Pinokio Pro(年订阅) | 中高 | 提供高级工作流(Universal Tasks)、多 Agent 协作、企业级控制台、优先应用审核通道,按年收费 |
| 应用商店佣金 | 低 | 在 Discover 页面推广付费模型/数据集,收取佣金。但 AI 模型多为开源,此模式空间有限 |
| 品牌硬件合作 | 低 | 与 AI PC / 工作站厂商预装合作,获得预装授权费 |
| API 访问层 | 低 | 提供远程调用本地部署 AI 应用的 API,按调用量收费 |
相比 Ollama(仅 LLM)和 LM Studio(仅模型管理),Pinokio 是全类别 AI 应用分发平台——不仅支持 LLM,还支持图像生成、视频、3D、TTS 等各种类型的 AI 应用。随着 AI 应用种类爆发式增长,Pinokio 作为「AI 应用总入口」的价值有望进一步凸显。
Pinokio 是一个设计精良的本地 AI 应用运行时平台,通过 Electron + Node.js 的组合,实现了「一个桌面应用 + 一个 JSON 脚本 = 一键运行任意开源 AI 应用」的极简用户体验。
其技术亮点包括:
其局限性也很明显:
总体而言,Pinokio 是开源 AI 社区「降低使用门槛」运动中的标杆项目,对推动 AI 技术的普及具有重要价值。