Skip to content

AI 应用

首先,我们先理解下下面几个概念

  1. lzc-cli 懒猫微服中用来开发微服应用的脚手架,通过 lzc-cli 可以快速的打包应用、安装应用、调试应用、发布应用等。
  2. 通过 lzc-cli 打包后产生的包就为 lpk 格式,这个是微服中应用的格式。
  3. 懒猫AI浏览器中可以安装插件,支持 PCAndroid 平台。

AI应用 是指在微服应用的基础上,添加 AI服务 或者 AI浏览器插件 的应用。这一类应用的下载和安装都和正常的微服应用一样,区别在于以下的两点:

  • 支持添加AI服务,在应用安装后,会自动部署相关的服务到算力舱上。
  • 支持添加AI浏览器插件,在应用安装后,AI浏览器上会自动加载对应的插件。

添加 AI服务

lzc-build.yml 文件中添加 ai-pod-service这个字段,如下所示:

yml
...

# ai-pod-service: 指定算力舱的服务目录,会将里面的内容打包到lpk中
ai-pod-service: ./ai-pod-service

...

ai-pod-service 字段需要指定一个目录,这个目录下需要包含 docker-compose.yml 文件。

这个目录将会作为 docker-compose 的运行服务,所以在 docker-compose.yml 中可以通过路径使用你当前目录下的资源。在服务运行的时候,算力舱中会提供以下环境变量:

  1. 数据持久化路径

    • 定义: /ssd/lzc-ai-agent/data/<service_id>
    • 环境变量: LZC_AGENT_DATA_DIR
    • 示例: /ssd/lzc-ai-agent/data/cloud.lazycat.aipod.ai
    yml
    ollama:
      volumes:
        - /etc/timezone:/etc/timezone:ro
        - ${LZC_AGENT_DATA_DIR}/data:/root/.ollama
        - ./check_ollama.py:/check_ollama.py:ro
  2. 数据缓存路径

    • 定义: /ssd/lzc-ai-agent/cache/<service_id>
    • 环境变量: LZC_AGENT_CACHE_DIR
    • 示例: /ssd/lzc-ai-agent/cache/cloud.lazycat.aipod.ai
    yml
    ollama:
      volumes:
        - ${LZC_AGENT_CACHE_DIR}/cache:/root/.cache
  3. 服务ID(对应LPK中的appId)

    • 定义: <appId>
    • 环境变量: LZC_SERVICE_ID
    • 示例: cloudlazycataipodfishspeech
    • 注意: 这个环境变量和 LPK 中的 appId 不一致,LZC_SERVICE_ID 会将 . 去掉
    yml
    ollama:
      labels:
        - "traefik.http.routers.${LZC_SERVICE_ID}-ollama.rule=Host(`ollama-ai`)"

附加说明

算力舱中的 docker 默认是使用 nvidia-runtime,在容器中能直接使用 gpus,不需要显式的指定 gpus 相关的配置。更详细的说明,点击连接

配置AI服务访问规则

算力舱中的服务是使用 traefik 结合 Host 的规则做服务的转发,一个服务能正常的被访问,需要配置下面的两个部分

  1. Host 规则

    Host 定义的值必须-ai 结尾,要不然会无法转发到正确的服务上。

    规则表现为: traefik.http.routers.<router_name>.rule=Host(<service_name>-ai)

    • <router_name> 为服务名称,这个是 traefik 中路由标识使用,正常情况下,各个服务填写的都是唯一的。

    • <service_name>-ai为微服中访问服务的域名地址。

    下面是一个示例:

    yml
    services:
      ollama:
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.${LZC_SERVICE_ID}-ollama.rule=Host(`ollama-ai`)"

    关于 traefik 的更多使用方法可以查看 Host Rule

  2. 配置 traefik 网络

    只有添加了 traefik 网络的服务才能被 traefik 接管. traefik-shared-network 这个网络是 lzc-ai-agent 运行起来之后就会被创建。

    yml
    networks:
      - traefik-shared-network

    或者在 docker-compose.yml 中的将 traefik-shared-network 网络指定为默认的网络配置.

    yml
    networks:
      default:
        external: true
        name: traefik-shared-network

    下面是一个示例:

    yml
    services:
      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这个字段,如下所示:

yml
...

# browser-extension: 指定浏览器插件的目录,如果这个路径为一个文件,将直接复制作
# 为扩展的zip包打包,如果是为一个目录,将打包成zip,再打包到 lpk 中
browser-extension: ./my-awesome-chrome-extension.zip

...

zip 为浏览器兼容的插件格式,如果插件是 wxt 开发的,那可以很简单的打包插件为一个zip包,或者手动把插件目录打包成一个zip包。

配置

在微服应用中的 lzc-manifest.yml 中添加 aipod 来配置应用是否创建快捷方式等选项。

快捷方式

安装到微服中的 AI应用 会默认显示在 AI浏览器 的快捷方式上,但可以通过下面的方式配置禁用

lzc-manifest.yml
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
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