Pinokio 是一款浏览器,可让您在计算机上本地安装、运行和自动化任何 AI 。您可以在命令行中运行的所有内容都可以使用 Pinokio 脚本自动化,并具有用户友好的 UI。
您可以使用 Pinokio 来自动化任何事情,包括:
安装 AI 应用程序和模型
管理和运行 AI 应用程序
创建工作流程来编排已安装的 AI 应用程序
运行任何命令以在计算机上实现自动化操作
还有更多...
Pinokio 的特别之处如下:
本地:一切都在本地安装并运行。您的任何数据都不会存储在其他人的服务器上。
免费: Pinokio 是一款开源应用程序,100% 免费使用,没有任何限制。无需为 API 访问付费,因为一切都在您的本地计算机上运行。随心所欲地使用 AI,永久免费。
私密:您无需担心仅仅为了运行人工智能而提交私密数据,一切都在您自己的机器上 100% 私密地运行。
用户友好的界面: Pinokio 提供了一个用户友好的 GUI,用于运行和自动化您通常需要使用终端执行的任何操作。
包含电池: Pinokio 是一个独立的系统。您不需要安装任何其他程序。 Pinokio 可以自动化任何事情,包括程序/库安装。您需要的唯一程序是 Pinokio。
跨平台: Pinokio 适用于所有操作系统(Windows、Mac、Linux) 。
节省存储和资源: Pinokio 具有许多优化功能,可以为您节省数百 GB 的磁盘空间。此外,许多其他资源优化功能(例如内存)都可以通过 Pinokio 实现。
富有表现力的脚本语言: Pinokio 脚本是一种功能强大的自动化脚本语言,具有内存、动态模板和可扩展的低级 API 等功能。
便携:所有内容都存储在独立的文件夹下,并且所有内容都以文件形式存在,这意味着您只需删除文件即可轻松备份所有内容或删除应用程序。
Pinokio 从传统计算机的工作原理中汲取灵感。
就像计算机凭借其全面的架构可以做各种事情一样,Pinokio 作为虚拟计算机是一个综合平台,可以运行和自动化您可以通过 AI 想象的任何事情。
文件系统:Pinokio 存储文件的位置和方式。
处理器:pinokio 如何运行任务。
内存:pinokio 如何使用其内置本机内存实现状态机。
脚本:运行pinokio的编程语言。
UI:用户访问应用程序的 UI(用户界面)。
视窗
苹果
Linux
请务必遵循以下所有步骤!
下载 Windows 版
解压下载的文件,您将看到一个 .exe 安装程序文件。
运行安装程序文件,您将看到以下 Windows 警告:
显示此消息是因为应用程序是从 Web 下载的,这就是 Windows 对从 Web 下载的应用程序所做的操作。
为了绕过这个,
点击“更多信息”
然后单击“仍然运行”
确保同时遵循步骤 1 和步骤 2。
适用于 Apple Silicon Mac (M1/M2/M3/M4) 的下载 适用于 Intel Mac 的下载
下载dmg文件后,必须打补丁,如下图:
运行下载的 DMG 安装程序文件
将“Pinokio”应用程序拖至“应用程序”文件夹
运行“patch.command”
在应用程序文件夹中打开 Pinokio 应用程序
对于 Linux,您可以直接从 Github 上的最新版本下载并安装(向下滚动到页面底部查看所有二进制文件):
前往发布页面
为了掌握所有新的 API 和应用程序集成,
在 X 上关注 @cocktailpeanut,以随时了解所有正在发布的新脚本和功能更新。
加入 Pinokio 不和谐来提出问题并获得帮助。
Pinokio 是一个独立的平台,可让您以隔离的方式安装应用程序。
隔离环境:无需担心弄乱您的全局系统配置和环境
包含电池:无需手动安装所需的程序即可安装某些东西(例如ffpeg 、 node.js 、 Visual Studio 、 conda 、 python 、 pip等)。 Pinokio 会自动处理它。
为了实现这一点,Pinokio将所有内容存储在一个单独的文件夹(“pinokio home”)下,因此它永远不必依赖于系统范围的配置和程序,而是以独立的方式运行所有内容。
您可以在首次设置 Pinokio 时设置pinokio 主文件夹,也可以稍后从设置选项卡将其更改为新位置。
那么文件存储在哪里呢? 单击主页上的“文件”按钮:
这将在文件资源管理器中打开 Pinokio 的主文件夹:
让我们快速浏览一下每个文件夹的作用:
api
:存储所有下载的应用程序(脚本)。
该文件夹中的文件夹将显示在您的 Pinokio 主页上。
bin
:存储多个应用程序共享的全局安装模块,因此您无需冗余安装它们。
例如, ffmpeg
、 nodejs
、 python
等。
cache
:存储您运行的应用程序自动缓存的所有文件。
当出现问题时,删除此文件夹并重新开始可能会修复它。
删除cache
文件夹是可以的,因为当您开始使用应用程序时,它会被您使用的应用程序重新填充。
drive
:存储 fs.link Pinokio API 创建的所有虚拟驱动器
logs
:存储每个应用程序的所有日志文件。
您可以在此处了解有关文件系统的更多信息
让我们编写一个克隆 git 存储库的脚本。
在 Pinokio api 文件夹下创建一个名为helloworld
的文件夹。
在 Pinokio api/helloworld
文件夹下创建一个名为git.json
的文件。
{“运行”:[{“方法”:“shell.run”,“参数”:{“消息”:“git克隆https://github.com/pinokiocomputer/test”} }] }
现在,当您返回 Pinokio 时,您将看到您的helloworld
存储库出现。导航到它并单击git.json
选项卡来运行它:
您将看到已从 https://github.com/pinokiocomputer/test 存储库克隆了api/helloworld/test
文件夹。
我们还可以使用模板动态更改要运行的命令以及运行它们的方式。
作为示例,让我们编写一个在 Windows 上运行dir
并在 Linux 和 Mac 上运行ls
的脚本。
在api/helloworld
文件夹中,创建一个名为files.json
的文件:
{ "run": [{"method": "shell.run","params": { "message": "{{platform === 'win32' ? 'dir' : 'ls'}}"} }] }
{{ }}
模板表达式包含 JavaScript 表达式
每个模板表达式内都有多个可用变量,其中之一是平台。
platform
的值为darwin
(mac)、 win32
(windows) 或linux
(linux)。
这意味着,在 Windows 上,上述脚本相当于:
{“运行”:[{“方法”:“shell.run”,“参数”:{“消息”:“目录”} }] }
或者如果不是windows(mac或linux),则相当于:
{“运行”:[{“方法”:“shell.run”,“参数”:{“消息”:“ls”} }] }
您可以在此处了解有关模板的更多信息
当 Pinokio 脚本完成运行时,通过该脚本生成的每个 shell 会话都会被释放,并且所有相关进程都会被关闭。
例如,让我们尝试使用 http-server 启动本地 Web 服务器。在 Pinokio api
文件夹下创建一个名为httpserver
的新文件夹,并创建一个名为index.json
的新脚本:
{“运行”:[{“方法”:“shell.run”,“参数”:{“消息”:“npx -y http服务器”} }] }
然后返回 Pinokio,您将看到该应用程序显示在主页上。单击并单击侧边栏上的index.json
选项卡,它将启动此脚本,该脚本应使用npx http-server
启动 Web 服务器。
但问题是,一旦启动服务器,它就会立即关闭,您将无法使用网络服务器。
这是因为当 Pinokio 完成run
数组中的所有步骤时,它会自动关闭与该脚本关联的所有进程。
为了避免这种情况,您需要告诉 Pinokio 这个应用程序即使在所有步骤都运行之后也应该保持运行。我们只需要添加一个daemon
属性:
{ "daemon": true, "run": [{"method": "shell.run","params": { "message": "npx -y http-server"} }] }
现在重试启动脚本,您将看到 Web 服务器开始运行并且不会关闭。
Web 服务器将提供当前文件夹中的所有文件(在本例中只是index.json
),如下所示:
您可以通过按页面顶部的“停止”按钮来停止脚本。
在此处了解有关守护进程模式的更多信息
您还可以通过一次shell.run
调用运行多个命令。
让我们尝试一个例子。我们将在一个脚本中安装、初始化和启动文档引擎。
这样的事情过去对于普通人来说是无法访问的(因为你必须在终端中运行这些东西),但是有了 Pinokio,只需单击一下即可轻松完成。
在 Pinokio api
文件夹下创建一个名为docsify
的文件夹
在api/docsify
文件夹下创建一个名为index.json
的文件。 index.json
文件应如下所示:
{ "daemon": true, "run": [{"method": "shell.run","params": { "message": ["npx -y docsify-cli init docs","npx -y docsify- cli 服务文档"] } }] }
这个例子做了两件事:
初始化 docsify 文档项目
启动 docsify 开发服务器
当您从 Pinokio 终端单击开发服务器链接时,它将在 Web 浏览器中打开文档页面:
在此处了解有关
shell.run
API 的更多信息
Pinokio 的常见用例之一是:
创建/激活 venv
将依赖项安装到激活的venv中
让我们尝试一个简单的例子。此示例是官方渐变教程中的最小渐变应用程序
首先,在 Pinokio 的api
文件夹下创建一个名为gradio_demo
的文件夹。
接下来,在api/gradio_demo
文件夹中创建一个名为app.py
的文件。
# app.pyimport gradio as grdefgreet(name, Intensity):return "Hello," + name + "!" * int(强度)demo = gr.Interface(fn=greet,输入=["文本","滑块"],输出=["文本"], )demo.launch()
我们还需要一个如下所示的requirements.txt
文件:
# requirements.txt gradio
最后,我们需要一个install.json
脚本来安装requirements.txt
文件中的依赖项:
{ "run": [{"method": "shell.run","params": { "venv": "env", "message": "pip install -r requests.txt"} }] }
文件夹结构将如下所示:
/PINOKIO_HOME /api /gradio_demo app.py requirements.txt install.json
返回 Pinokio,您将看到gradio_demo
应用程序。单击进入 UI 并单击install.json
选项卡,它将:
在env
路径下创建venv
文件夹
激活env
环境
运行pip install -r requirements.txt
,这会将gradio
依赖项安装到env
环境中。
安装过程如下所示(请注意,最后创建了一个新的env
文件夹):
在此处了解有关 venv API 的更多信息
从上一节继续。
现在让我们编写一个简单的脚本,该脚本将从上一节的app.py
启动 gradio 服务器。在同一文件夹中创建一个名为start.json
的文件:
{ "daemon": true, "run": [{"method": "shell.run","params": { "venv": "env", "message": "python app.py"} }] }
返回 Pinokio,您会看到start.json
文件现在也显示在侧边栏上。单击以启动start.json
脚本。这将:
激活我们在安装步骤中创建的env
环境
在守护进程模式下运行python app.py
( daemon: true
),这将启动 gradio 服务器并保持其运行。
它看起来像这样:
在此处了解有关 venv API 的更多信息
Pinokio 具有跨平台 API,可以轻松可靠地下载文件(包括自动重试等)。
让我们尝试编写一个下载 PDF 的简单脚本。
首先在 Pinokio api
文件夹下创建一个名为download
文件夹,然后创建一个名为index.json
的文件:
{“运行”:[{“方法”:“fs.download”,“参数”:{“uri”:“https://arxiv.org/pdf/1706.03762.pdf”,“dir”:“pdf”} }] }
这会将 https://arxiv.org/pdf/1706.03762.pdf 上的文件下载到名为pdf
的文件夹中(如果该文件夹尚不存在, fs.download
API 会自动在该位置创建一个文件夹)。它看起来是这样的:
在此处了解有关
fs.download
API 的更多信息
在许多情况下,您可能想从另一个脚本调用一个脚本。一些例子:
一个编排脚本,先启动stable diffusion
,然后启动llama
。
启动stable diffusion
的代理,立即发出生成图像的请求,最后自动停止stable diffusion
服务器以节省资源。
向llama
端点发出请求,然后将响应提供给stable diffusion
端点的代理。
我们可以使用script
API 来实现这一点:
script.start
:启动远程脚本(如果尚不存在则先下载)
script.return
:如果当前脚本是子进程,则指定返回值,该值将在调用者脚本的下一步中可用。
这是一个例子。让我们创建一个简单的caller.json
和callee.json
:
caller.json
:
{ "run": [{"method": "script.start","params": { "uri": "callee.json", "params": { "a": 1, "b": 2 } } }, {"method": "log","params": { "json2": "{{input}}"} }] }
第一步, caller.json
将使用参数{ "a": 1, "b": 2 }
调用callee.json
。
此 params 对象将作为args
传递到callee.json
中:
callee.json
:
{ "run": [{"method": "script.return","params": { "ressponse": "{{args.a + args.b}}"} }] }
callee.json
脚本通过script.return
调用立即返回值{{args.a + args.b}}
。
最后, caller.json
将调用最后一步log
,它将打印值{{input}}
,这是callee.json
的返回值。这将打印3
:
最后一部分解释了如何从同一存储库中调用脚本。但是如果您想从其他存储库调用脚本怎么办?
script.start
API 还可以即时下载和运行远程脚本。
在 Pinokio api
文件夹下创建一个名为remotescript
的文件夹,并在api/remotescript
下创建一个名为install.json
的文件:
{“运行”:[{“方法”:“script.start”,“参数”:{“uri”:“https://github.com/cocktailpeanutlabs/moondream2.git/install.js”} }, {"method": "script.start","params": { "uri": "https://github.com/cocktailpeanutlabs/moondream2.git/start.js"} }, {"id": "run","method": "gradio.predict","params": { "uri": "{{kernel.script.local('https://github.com/cocktailpeanutlabs/ Moondream2.git/start.js').url}}", "路径": "/answer_question_1", "参数": [ { "path": "https://media.timeout.com/images/105795964/750/422/image.jpg" },"解释一下这里发生了什么" ] } }, {"method": "log","params": { "json2": "{{input}}"} }, {"method": "script.stop","params": { "uri": "https://github.com/cocktailpeanutlabs/moondream2.git/start.js"} }] }
第一步启动脚本 https://github.com/cocktailpeanutlabs/moondream2.git/install.js。
如果moondream2.git
存储库已存在于 Pinokio 上,它将运行 install.js 脚本。
如果尚不存在,Pinokio 首先会自动克隆https://github.com/cocktailpeanutlabs/moondream2.git
存储库,然后启动 install.js 脚本。
安装完成后,它会使用 https://github.com/cocktailpeanutlabs/moondream2.git/start.js 脚本启动 gradio 应用程序。该脚本将在服务器启动后返回。
现在我们运行gradio.predict
,使用 kernel.script.local() API 获取 start.js 脚本的局部变量对象,然后获取其url
值(以编程方式在moondream2.git/start.js
中设置)脚本)。
基本上,此步骤向 gradio 端点发出请求,询问 LLM“解释这里发生了什么”,并传递图像。
接下来,使用log
API 将gradio.predict
的返回值记录到终端。
最后,我们停止moondream2/start.js
脚本,使用script.stop
API 关闭 Moondream gradio 服务器。
如果我们不调用script.stop
,即使该脚本停止,moondream2 应用程序也会继续运行。
它看起来像这样:
运行
script.start
和script.stop
的能力对于在个人计算机上运行 AI 非常有用,因为大多数个人计算机没有无限制的内存,如果您无法关闭这些 AI 引擎,您的计算机将很快耗尽内存以编程方式。使用
script.stop
您可以启动脚本,获取其响应,并在任务完成后立即关闭它,这将释放系统内存,您可以将其用于运行其他后续 AI 任务。
Pinokio 应用程序的结构很简单:
快捷方式:Pinokio 主页上显示的应用程序快捷方式。
app:应用程序的主 UI 布局
Shortcut
App
菜单:侧边栏显示您可以运行的所有链接(以及它们的运行状态)
窗口:显示网页的视口,或运行脚本的终端
默认情况下,如果您的项目中没有pinokio.js
文件,
该快捷方式将文件夹名称显示为标题,并将默认图标显示为应用程序的图标。
该菜单显示存储库根目录中的所有.js
或.json
文件。
虽然这对于入门来说很方便,但不够灵活:
您无法控制菜单栏中显示的内容
您无法控制脚本的启动方式(例如通过传递params
)
您无法控制应用程序的显示方式
应用程序的标题将是您的文件夹名称
没有描述
该图标将仅显示默认图标。
要自定义应用程序本身的行为方式,您需要编写一个名为pinokio.js
的 UI 脚本。
让我们尝试编写一个最小的 UI:
在/PINOKIO_HOME/api
文件夹中创建名为downloader
的文件夹
将任意图标添加到/PINOKIO_HOME/api/downloader
文件夹并将其命名为icon.png
创建名为/PINOKIO_HOME/api/downloader/download.json
的文件
创建一个名为/PINOKIO_HOME/api/downloader/pinokio.js
的文件
/PINOKIO_HOME/api/downloader/icon.png
/PINOKIO_HOME/api/downloader/download.json
{“运行”:[{“方法”:“shell.run”,“参数”:{“消息”:“git克隆{{input.url}}”} }] }
/PINOKIO_HOME/api/downloader/pinokio.js
模块. 导出 = { 标题:“下载任何内容”, 描述:“下载 git 存储库”, 图标:“图标.png”, 菜单:[{text:“开始”,href:“download.json”,params:{ url:“https://github.com/cocktailpeanut/dalai”} }]}
最终结果在文件资源管理器中将如下所示:
现在返回 Pinokio 并刷新,您将看到您的应用程序出现:
标题显示Download Anything
描述显示Download a git repository
图标是我们添加的icon.png
现在,当您点击该应用程序时,您将看到以下内容:
您将看到菜单项Start
。
单击此按钮可运行href
属性指定的download.json
。
另请注意,脚本将 https://github.com/cocktailpeanut/dalai 的值作为params.url
值传递。
传递给download.json
params
可用作input
变量,因此git clone {{input.url}}
将被实例化为git clone https://github.com/cocktailpeanut/dalai
。
一旦你有了一个可用的脚本存储库,你就可以发布到任何 git 托管服务并共享 URL,任何人都可以安装和运行你的脚本。
您可以非常轻松地安装任何 pinokio 脚本存储库:
单击“发现”页面顶部的“从 URL 下载”按钮。
输入 git URL(您也可以选择指定分支)。
如果您发布到 github,您可以使用“pinokio”标记您的存储库,使其显示在“发现”页面的“最新”部分中。
现在它会自动显示在“最新”部分(“发现”页面底部):
Pinokio 从 GitHub“/repositories”API 自动构建“最新”部分,网址为 https://api.github.com/search/repositories?q=topic:pinokio&sort=updated&direction=desc
因此,如果您将存储库标记为“pinokio”但没有出现,请检查 API 结果,并尝试找出为什么它没有包含在其中。
虽然了解这一切是如何工作的很重要,但在大多数情况下,您可能需要一个简单的“启动器组合”,其中包括:
应用程序安装脚本:安装应用程序依赖项
应用程序启动脚本:启动应用程序
UI:显示启动器 UI。
重置脚本:出现问题时重置应用程序状态。
更新脚本:一键将应用程序更新到最新版本。
这个用例经常需要,因此我们实现了一个可以立即自动生成这些脚本的程序。它的名字叫杰佩托。
通常您可能想分享有关每个脚本的更多信息。您可以使用新闻源来实现这一点。
为此,只需创建一个带有posts
数组属性的pinokio_meta.json
文件,其中每个项目都是一个 x.com URL。这是一个例子:
{“帖子”: [“https://x.com/cocktailpeanut/status/1819482952071323788”,“https://x.com/cocktailpeanut/status/1819439443394109837”,“https://x.com/cocktailpeanut/status/1800944955738685648” ,“https://x.com/cocktailpeanut/status/1754244867159413001”,“https://x.com/cocktailpeanut/status/1729884460114727197”,“https://x.com/cocktailpeanut/status/1728075614807048208” ] }
您可以看到它的实际效果:https://github.com/cocktailpeanutlabs/comfyui/blob/main/pinokio_meta.json
发布后,这将立即反映在脚本登录页面上。
Gepeto 是一个可让您自动生成 Pinokio 脚本的程序,专门用于应用程序启动器。
让我们首先在 1 分钟内实际生成一个应用程序及其启动器。
如果您尚未安装 gepeto,请在 Pinokio 上找到它并先安装。
您将看到一个简单的 Web UI,可让您填写表格。为简单起见,只需输入Helloworld
作为项目名称,然后按“提交” 。
这将初始化一个项目。当你回到皮诺基奥家时,
您将看到一个名为Helloworld
的新条目。单击它,您将看到启动器屏幕。
另外,检查/PINOKIO_HOME/api
文件夹,您会发现一个名为Helloworld
的新文件夹,其中包含一些脚本文件。
现在让我们单击安装按钮来安装应用程序,安装完成后,单击开始启动。
您将看到一个最小的渐变应用程序,您可以在其中输入提示,它将使用 Stable Diffusion XL Turbo 生成图像。
那么刚刚发生了什么?我们刚刚创建了一个空项目,其中附带了一个最小的演示应用程序。
让我们在下一节中看看每个生成的文件。
Gepeto 自动生成应用程序启动器所需的最少脚本集。典型的应用程序启动器具有以下功能:
安装:安装运行应用程序所需的依赖项。 ( install.js
)
启动:启动应用程序本身。 ( start.js
)
重置安装:重置所有已安装的依赖项,以防您需要重新安装。 ( reset.js
)
更新:项目更新时更新到最新版本。 ( update.js
)
GUI:描述启动器在 Pinokio 主屏幕上的外观和行为以及作为侧边栏菜单的脚本。 ( pinokio.js
)
它看起来是这样的:
请注意,除了上面提到的脚本之外,gepeto 还生成了一些额外的文件:
app.py
:一个简单的演示应用程序。将其替换为您自己的代码。
requirements.txt
:声明app.py
所需的所有 PIP 依赖项。换成你自己的。
icon.png
:应用程序的默认图标文件。换成你自己的。
torch.js
: torch.js
是一个从install.js
调用的实用程序脚本。由于torch几乎用于所有AI项目,并且以跨平台方式安装它们相当棘手,因此默认包含此脚本。您不必担心这个文件,只需了解它由install.js
使用即可。请勿触摸。
值得注意的文件是app.py
和requirements.txt
文件:
import gradio as grimport torchfrom differs import DiffusionPipelineimport devicetorch# 获取当前设备("mps"、"cuda" 或 "cpu")device = devicetorch.get(torch)# 创建扩散管道pipe = DiffusionPipeline.from_pretrained("stabilityai/sdxl -turbo").to(device)# 运行推理defgenerate_image(prompt):return pipeline(prompt, num_inference_steps=2,strength=0.5,guiding_scale=0.0).images[0]#使用Gradio创建文本输入+图像输出UIapp = gr.Interface(fn=generate_image,inputs="text",outputs="image")app 。发射()
以下是运行app.py
所需的库。
transformers accelerate diffusers gradio devicetorch
那么这些文件实际是如何使用的呢?
如果查看install.js
内部,您将看到它正在运行pip install -r requirements.txt
来安装文件内的依赖项,如下所示:
模块. 导出 = { run: [// 如果你的项目没有使用torch,请删除此步骤{ method: "script.start", params: {uri: "torch.js",params: { venv: "env", // 编辑此自定义venv 文件夹路径 // xformers: true // 如果您的项目需要 xformers,请取消注释此行} }},// 使用自定义安装命令编辑此步骤{ method: "shell.run", params: {venv: "env" , //编辑此内容以自定义 venv 文件夹路径message: [ "pip install -rrequirements.txt"], }},// 取消注释此步骤以添加自动 venv 重复数据删除(实验) // {// method: "fs.link", // params: {// venv: "env"// }// },{ method: "notify", params: {html: "点击‘开始’标签获取开始了!” }} ]}
第一步运行script.start
来调用名为torch.js
的脚本。这将安装火炬。
第二步运行pip install -r requirements.txt
文件来安装该文件中的所有内容。