AI 应用
首先,我们先理解下下面几个概念
lzc-cli懒猫微服中用来开发微服应用的脚手架,通过lzc-cli可以快速的打包应用、安装应用、调试应用、发布应用等。- 通过
lzc-cli打包后产生的包就为lpk格式,这个是微服中应用的格式。 - 懒猫AI浏览器中可以安装插件,支持
PC和Android平台。
AI应用 是指在微服应用的基础上,添加 AI服务 或者 AI浏览器插件 的应用。这一类应用的下载和安装都和正常的微服应用一样,区别在于以下的两点:
- 支持添加AI服务,在应用安装后,会自动部署相关的服务到算力舱上。
- 支持添加AI浏览器插件,在应用安装后,AI浏览器上会自动加载对应的插件。
添加 AI服务
在 lzc-build.yml 文件中添加 ai-pod-service这个字段,如下所示:
...
# ai-pod-service: 指定算力舱的服务目录,会将里面的内容打包到lpk中
ai-pod-service: ./ai-pod-service
...ai-pod-service 字段需要指定一个目录,这个目录下需要包含 docker-compose.yml 文件。
这个目录将会作为 docker-compose 的运行服务,所以在 docker-compose.yml 中可以通过路径使用你当前目录下的资源。在服务运行的时候,算力舱中会提供以下环境变量:
数据持久化路径
- 定义:
/ssd/lzc-ai-agent/data/<service_id> - 环境变量:
LZC_AGENT_DATA_DIR - 示例:
/ssd/lzc-ai-agent/data/cloud.lazycat.aipod.ai
ymlollama: volumes: - /etc/timezone:/etc/timezone:ro - ${LZC_AGENT_DATA_DIR}/data:/root/.ollama - ./check_ollama.py:/check_ollama.py:ro- 定义:
数据缓存路径
- 定义:
/ssd/lzc-ai-agent/cache/<service_id> - 环境变量:
LZC_AGENT_CACHE_DIR - 示例:
/ssd/lzc-ai-agent/cache/cloud.lazycat.aipod.ai
ymlollama: volumes: - ${LZC_AGENT_CACHE_DIR}/cache:/root/.cache- 定义:
服务ID(对应LPK中的appId)
- 定义:
<appId> - 环境变量:
LZC_SERVICE_ID - 示例:
cloudlazycataipodfishspeech - 注意: 这个环境变量和 LPK 中的
appId不一致,LZC_SERVICE_ID会将.去掉
ymlollama: labels: - "traefik.http.routers.${LZC_SERVICE_ID}-ollama.rule=Host(`ollama-ai`)"- 定义:
附加说明
算力舱中的 docker 默认是使用 nvidia-runtime,在容器中能直接使用 gpus,不需要显式的指定 gpus 相关的配置。更详细的说明,点击连接
配置AI服务访问规则
算力舱中的服务是使用 traefik 结合 Host 的规则做服务的转发,一个服务能正常的被访问,需要配置下面的两个部分
Host规则Host定义的值必须要-ai结尾,要不然会无法转发到正确的服务上。规则表现为:
traefik.http.routers.<router_name>.rule=Host(<service_name>-ai)<router_name>为服务名称,这个是traefik中路由标识使用,正常情况下,各个服务填写的都是唯一的。<service_name>-ai为微服中访问服务的域名地址。
下面是一个示例:
ymlservices: ollama: labels: - "traefik.enable=true" - "traefik.http.routers.${LZC_SERVICE_ID}-ollama.rule=Host(`ollama-ai`)"关于
traefik的更多使用方法可以查看 Host Rule配置 traefik 网络只有添加了
traefik网络的服务才能被traefik接管.traefik-shared-network这个网络是lzc-ai-agent运行起来之后就会被创建。ymlnetworks: - traefik-shared-network或者在
docker-compose.yml中的将traefik-shared-network网络指定为默认的网络配置.ymlnetworks: default: external: true name: traefik-shared-network下面是一个示例:
ymlservices: whoami: image: registry.lazycat.cloud/traefik/whoami:ab541801c8cc labels: - "traefik.http.routers.whoami.rule=Host(`whoami-ai`)" networks: default: external: true name: traefik-shared-network
添加 AI浏览器插件
在 lzc-build.yml 文件中添加 browser-extension这个字段,如下所示:
...
# browser-extension: 指定浏览器插件的目录,如果这个路径为一个文件,将直接复制作
# 为扩展的zip包打包,如果是为一个目录,将打包成zip,再打包到 lpk 中
browser-extension: ./my-awesome-chrome-extension.zip
...zip 为浏览器兼容的插件格式,如果插件是 wxt 开发的,那可以很简单的打包插件为一个zip包,或者手动把插件目录打包成一个zip包。
配置
在微服应用中的 lzc-manifest.yml 中添加 aipod 来配置应用是否创建快捷方式等选项。
快捷方式
安装到微服中的 AI应用 会默认显示在 AI浏览器 的快捷方式上,但可以通过下面的方式配置禁用
aipod:
shortcut:
disable: true在 aipod 的字段中,仅仅支持 .SysParams(.S) 参数中的 .BoxName 和 .BoxDomain 更多的信息查看模板参数
AI应用的lpk目录结构
M Mode Size Date&time Filename
- ---------- ------ -------------------- ----------------
drwxrwxr-x 0 16-May-2025 08:01:18 ai-pod-service/
-rw-rw-r-- 13 16-May-2025 08:01:18 ai-pod-service/README.md
-rw-rw-r-- 529 16-May-2025 08:01:18 ai-pod-service/docker-compose.yml
-rw-rw-r-- 1536 16-May-2025 08:01:18 content.tar
-rw-rw-r-- 440469 16-May-2025 08:01:18 extension.zip
-rw-rw-r-- 16532 16-May-2025 08:01:18 icon.png
-rw-rw-r-- 276 16-May-2025 08:01:18 manifest.yml
- ---------- ------ -------------------- ----------------
459355 7 files这个是通过 lzc-cli 打包出来的 AI应用 里面包含了 extension.zip 浏览器插件,以及 ai-pod-service AI服务,其他的为微服应用相关的文件。
AI应用 中添加进度提示
AI应用在本质上是一个懒猫微服的应用 + 算力舱中的服务,懒猫微服的应用是有下载进度和启动进度的,但并没有显示算力舱中的服务进度。针对这种情况,需要单独的对 AI应用 做一个兼容层。我们提供了一个 caddy-aipod 的中间件,您需要把这个作为 AI应用 的入口,类似下面的做法
- lzc-manifest.yml
name: ComfyUI
package: cloud.lazycat.aipod.comfyui
version: 1.0.5
description: 最强大的开源基于节点的生成式人工智能应用程序
license: https://github.com/comfyanonymous/ComfyUI/blob/master/LICENSE
homepage: https://www.comfy.org
author: x
usage: 这个应用需要结合算力舱使用
locales:
en:
title: ComfyUI
description: "The most powerful open source node-based application for generative AI"
usage: "This application needs to be used in conjunction with AI Pod"
aipod:
shortcut:
disable: false
application:
subdomain: comfyui
routes:
- /=http://caddy:80
services:
caddy:
image: registry.lazycat.cloud/catdogai/caddy-aipod:65e058ce
setup_script: |
cat <<'EOF' > /etc/caddy/Caddyfile
{
auto_https off
http_port 80
https_port 0
}
:80 {
handle {
route {
lzcaipod
root * /lzcapp/pkg/content/ui/
try_files {path} /index.html
header Cache-Control "max-age=60, private, must-revalidate"
file_server
}
}
}
EOF
cat /etc/caddy/Caddyfile主要的关键在于 Caddyfile 中的 lzcaipod 指令,在这个指令中会将进来的流量做判断,检测当前的服务是否已经运行,从而给出相应的提示。
指定某一个算力舱上的服务
在具有多个算力舱的情况下,可以通过 f-{算力舱的序列号}-{服务名称}-ai.{微服名称}.heiyu.space 来访问。如 https://f-1420225016421-dozzle-ai.catdog.heiyu.space