AI

k8s 部署 AutoGen Tips🌀

想通过docker buiid AutoGen 环境,并且发布到k8s环境,记录了一下过程。

build AutoGen 环境 镜像


准备一个 Python fastapi 代码,这样容器进程就不会退出了,监听8000端口。

  • app.py
from fastapi import FastAPI
app = FastAPI()  # 实例名为 "app"

@app.get("/")
def read_root():
    return {"message": "Hello World"}
  • Dockerfile

准备镜像Dockerfile,因为AutoGen需要至少3.10以上的Python环境,这里选了python:3.12-slim基础镜像,然后安装autogen 和 autogenstudio, autogenstudio需要8001端口。

FROM python:3.12-slim

# 设置工作目录
WORKDIR /app

# 安装系统依赖和curl工具
RUN apt-get update && \
    apt-get install -y --no-install-recommends curl && \
    rm -rf /var/lib/apt/lists/*

# 配置国内PyPI镜像源(阿里云),加速pip安装
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
    pip config set global.trusted-host mirrors.aliyun.com

# 复制代码和配置文件
COPY . /app

# 安装AgentChat和OpenAI客户端扩展
RUN pip install -U "autogen-agentchat" "autogen-ext[openai]"

# 安装AutoGen Studio无代码GUI
RUN pip install -U "autogenstudio"

# 安装FastAPI和服务运行工具uvicorn
RUN pip install -U fastapi uvicorn

# 暴露端口(FastAPI默认使用8000端口,AutoGen Studio可能需要额外端口)
EXPOSE 8000
EXPOSE 8001

# 启动命令:用uvicorn运行FastAPI服务
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

 

准备k8s 部署用的 deployment yaml 和 service yaml


  • service-autogen-deployment.yaml
# service-autogen-deployment.yaml
# kubectl apply -f service-autogen-deployment.yaml -n common-services
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service-autogen-deployment
  labels:
    app: service-autogen
spec:
  replicas: 1  # 创建1个Pod副本
  selector:
    matchLabels:
      app: service-autogen
  template:
    metadata:
      labels:
        app: service-autogen
    spec:
      containers:
      - name: service-autogen
        # 私有的镜像仓库地址
        image: 123.xxx.xxx.xxx:5001/service-autogen:latest
        ports:
        - containerPort: 8000  
          name: fastapi
        - containerPort: 8001  
          name: autogen-studio
        # resources:
        #   limits:
        #     memory: "256Mi"
        #     cpu: "500m"
      imagePullSecrets:
      - name: docker-registry-secret
  • autogen-service.yaml
# autogen-service.yaml
# kubectl apply -f autogen-service.yaml -n common-services
apiVersion: v1
kind: Service
metadata:
  name: autogen-service
spec:
  selector:
    app: service-autogen
  ports:
  # FastAPI 端口转发配置
  - port: 8000        # Service 暴露在集群内的端口
    targetPort: 8000  # 转发到 Pod 内的端口 fastapi
    nodePort: 32180   # 手动指定节点端口,范围需在 30000-32767 之间
  # AutoGen Studio 端口转发配置
  - port: 8001        # Service 暴露在集群内的端口
    targetPort: 8001  # 转发到 Pod 内的端口 autogenstudio
    nodePort: 32181   # 手动指定节点端口,范围需在 30000-32767 之间
  type: NodePort  # 暴露到集群外

  

配置Jenkins 脚本


写Jenkins脚本,用来 build 和 推送镜像到私有仓库,并在 k8s创建deployment。

 

Jenkins脚本

pipeline {
    agent any

    // 禁止并发构建,确保一次只有一个实例运行
    options {
        disableConcurrentBuilds()
    }
    
    environment {
        PATH = "$PATH:/usr/local/bin"  // 添加凭据助手所在路径
    }
    
    stages {
        stage('Git Clone') {
            steps {
                git(
                    url: 'http://123.xxx.xxx.xxx:3001/xxxx/wechat-applet-services',
                    credentialsId: 'd2ed6ebb-xxx-xxx-xxx-ca9dd3bc75ba',
                    branch: 'main',
                )
            }
        }
        
       // 删除K8s Deployment
       stage('Delete Deployment') {
           steps {
              sh 'kubectl delete deployment service-autogen-deployment -n common-services --ignore-not-found=true'
           }
       }
        
        stage('Dokcer Image Build & Push') {
            steps {
                dir('service-autogen') {
                    sh 'docker build --progress=plain -t service-autogen .'
                    sh 'docker tag service-autogen:latest 123.xxx.xxx.xxx:5001/service-autogen:latest'
                    sh "docker push 123.xxx.xxx.xxx:5001/service-autogen:latest"
                }
            }
        }
        
        stage('Create Deployment') {
            steps {
                dir('service-autogen') {
                    sh 'kubectl apply -f service-autogen-deployment.yaml -n common-services'
                }
            }
        }
        
        stage('clean prune Image') {
            steps {
                sh 'docker image prune -f'  // -f 强制删除悬空镜像
            }
        }
        
    }
}

可以看到deployement已经发布好了

 

用上面的servcie yaml创建service服务

  

进入Pod启动 AutoGen Studio 服务


可以在k8s dashboard的Pod界面,选择AutoGen的Pod,点击执行,进入容器。

 

可以看到Python的版本 和 autogenstudio ui 都确认是OK的。

 

用下面的命令,启动 autogenstudio ui, 注意–host 0.0.0.0 是必须的,否则只能localhost本地访问, 不能在别的机器用ip访问。

autogenstudio ui --host 0.0.0.0 --port 8001

浏览器 http://localhost:32181/ 就可以打开 autogenstudio ui 页面了。(32181是Node port,service 映射端口8001)

  

在AutoGen Studio 创建模型


AutoGen 想使用本地模型,在ollama上确认下可以使用的模型。

mini ~ % ollama list
NAME                ID              SIZE      MODIFIED     
qwen3:1.7b          8f68893c685c    1.4 GB    45 hours ago    
deepseek-r1:1.5b    e0979632db5a    1.1 GB    45 hours ago    
deepseek-r1:8b      6995872bfe4c    5.2 GB    5 days ago      
qwen3:8b            500a1f067a9f    5.2 GB    5 days ago   

点击Gallery -> Models -> Add Model 按钮 添加本地模型

这里添加 qwen3:8b 模型。

Name:qwen3:8b
Model:qwen3:8b
Base URL:http://192.168.3.3:11434/v1 (本地 ollama api的路径)

‼️注意:非常重要 添加的模型必须支持 function call, 否则后面运行的时候会出错,qwen3:8b是支持function call的,deepseek-r1的模型都不支持function call,所以 deepseek-r1的模型用不了

如果用 deepseek-r1 模型会出下面的错误,这是因为deepseek-r1 大模型不支持 Function call 功能。

| ERROR | Function call is not supported for this model.’

可以点击Test 按钮测试,看和模型通信是否正常。

  

配置一个可以取得页面内容的智能体


点击Team Builder -> New Team 按钮

 

修改Team名字:可以修改Team的名字,这里改成 team-get-webpage

修改Agent模型:然后从左边的面板Models模块,选中qwen3:8b模型,拖拽到右边AssistantAgent的位置【Drop models here】位置。

  

给Agent添加Tool:从左边的Tool面板,选择fetch_webpage工具,拖拽到右边AssistantAgent的【Drop tools here】位置。

  

保存的时候,出现这个错误:

解决办法参考:

https://github.com/microsoft/autogen/discussions/6658

  

所以我们选择编辑 AssistantAgent-> 点击JSON Editor

  

删除JSON Editor这部分内容 -> 保存

  

点击Run,我们运行智能体,并且输入下面的提示词。

获取 https://92it.top/?p=269网页的内容, 帮我总结下.

   

创建有多个Agent 旅行计划工作流的例子


这个例子,我们要创建一个工作流,配置多个角色的Agent来制定旅行计划

  

我们先创建一个新的Team: team_travel_plan, 然后在AssistantAgent 里面,输入:

Description:一个能够规划旅行的助手
name:planner_agent
model:qwen3:8b
system message:你是一位乐于助人的助手,能够根据用户的请求提供旅行计划建议。

 

都设置好以后,点击保存,然后添加另一个AssistantAgent。我们在左边面板Agents处,选择AssistantAgent 拖拽到右边 【Drop agents here】位置,添加一个新的agent。

 

可以看到多了一个新的智能体

 

我们编辑新的智能体,输入如下内容,保存:

Description:一个能够推荐当地活动或游览地点的本地助手。
name:local_agent
model:qwen3:8b
system message:你是一位乐于助人的助手,能够为用户推荐正宗且有趣的当地活动或游览地点,并且能够利用提供的任何上下文信息。

 

再按照上面方法继续添加两个新的Agent

Description:一个能够为特定目的地提供语言提示的有用助手。
name:language_agent
model:qwen3:8b
system message:你是一位乐于助人的助手,能够审查旅行计划,提供关于如何最好地应对特定目的地的语言或沟通挑战的重要/关键提示。如果计划中已经包含了语言提示,你可以附带理由表明该计划是令人满意的。

 

Description:一个能够总结旅行计划的有用助手。
name:travel_summary_agent
model:qwen3:8b
system message:你是一位乐于助人的助手,能够接收其他助手的所有建议和意见,并提供详细的最终旅行计划。你必须确保最终计划是整合的且完整的。你的最终回复必须是完整的计划。当计划完成且所有观点都被整合后,你可以回复'TERMINATE'。

 

可以看到我们这个智能体工作流创建好了,没有写一行代码,我们只设置了描述,还有提示词,工作流有4个Agent。

这个工作流执行流程就是:用户输入要去的目的地,然后由planner_agent 和 local_agent, language_agent 会根据这个目的地各种制定旅行方案,然后由travel_summary_agent进行总结汇总。

 

我们可以测试一下

输入提示词:

泰国三日游, 给个计划。

发现智能体Flow执行的有问题,总有计算器Tool的内容。

 

我们点开每个Agent的,JSON Editor,发现里面有计算器的workbench,把每个Agent的这部分内容删除掉。

 

‼️ 重要:还有需要 去ollama 设置里面 调整Context length, token的数量,否则Agent会超过上限token,可以看到很超过4k的token数了

 

上面都修改好以后,我们在Playgroud中,重新运行一下,看下结果。