前后端源码方式部署Coze Studio

本文主要介绍了通过源码方式部署Coze Studio前端和后端,其它依赖中间件通过Docker方式部署。源码使用main分支,因为main分支随时都在更新代码,所以本文仅仅作为参考操作,可能由于版本会遇到其它的问题,但基本原理都是一样的。其中,前端在Windows11+WSL2+Ubuntu22.04+Node22.15.1环境运行,后端在Windows11+Go1.24.5环境运行。


一.Coze Studio介绍

1.Coze Studio定位

按照Coze官方说法,Coze Studio 是一站式 AI Agent 开发工具。提供各类最新大模型和工具、多种开发模式和框架,从开发到部署,为你提供最便捷的 AI Agent 开发环境。

  • 提供 AI Agent 开发所需的全部核心技术:Prompt、RAG、Plugin、Workflow,使得开发者可以聚焦创造 AI 核心价值。

  • 开箱即用,用最低的成本开发最专业的 AI Agent:Coze Studio 为开发者提供了健全的应用模板和编排框架,可基于它们快速构建各种 AI Agent ,将创意变为现实。

2.Coze Studio技术栈

Coze Studio 的后端采用 Golang 开发,前端使用 React + TypeScript,整体基于微服务架构并遵循领域驱动设计(DDD)原则构建。为开发者提供一个高性能、高扩展性、易于二次开发的底层框架,助力开发者应对复杂的业务需求。

DDD貌似在.NET Core相关开源项目中用的很多,比如ABP框架,它是一种以领域建模为核心的软件开发方法论,适用于复杂业务系统的设计与开发。DDD 的核心目标是:通过聚焦于业务领域本身及其逻辑,构建一个高度符合业务需求的系统模型,而不仅仅是技术驱动,即要有业务专家的参与。DDD涉及的核心概念也很多,如下所示:

层级 概念 说明
战略设计
限界上下文(Bounded Context)
指定模型适用的边界,一个上下文内的词汇有统一语义
战略设计
领域(Domain)
问题空间,即业务本身
战略设计
子域(Subdomain)
把复杂领域拆分为多个功能相关的子域,如核心、支撑、通用
战略设计
上下文映射(Context Mapping)
定义多个限界上下文之间的关系,如 ACL、防腐层、共享内核等
战术设计
实体(Entity)
拥有唯一标识的业务对象,生命周期长,如订单、用户
战术设计
值对象(Value Object)
无唯一标识、不可变,如金额、地址等
战术设计
聚合(Aggregate)
由实体和值对象组成的聚合体,有一个根(Aggregate Root)
战术设计
领域服务(Domain Service)
业务逻辑不归属于任何实体时,可以使用服务封装
战术设计
应用服务(Application Service)
协调多个领域对象的行为,位于领域模型之外
战术设计
领域事件(Domain Event)
某个领域内发生的重要事件,可用于解耦
战术设计
工厂(Factory)
创建复杂对象的逻辑封装
战术设计
仓储(Repository)
封装持久化逻辑,仿佛是在操作内存集合

虽然DDD看上去很复杂,但是典型架构主要是:基础设置层,领域层,应用层,[表现层]。

3.功能清单

功能模块 功能点
模型服务
管理模型列表,可接入OpenAI、火山方舟 等在线或离线模型服务
搭建智能体
编排、发布、管理智能体;支持配置工作流、知识库等资源
搭建应用
创建、发布应用;通过工作流搭建业务逻辑
搭建工作流
创建、修改、发布、删除工作流
开发资源
支持创建并管理以下资源:插件,知识库,数据库,提示词
API 与 SDK
创建会话、发起对话等 OpenAPI;通过 Chat SDK 将智能体或应用集成到自己的应用

二.Coze Studio依赖中间件

启动Coze Studio依赖中间件,主要是修改相关端口,以防止端口冲突。

cd docker
docker compose -f docker-compose-debug.yml --profile middleware -p "coze-studio" up -d

在最新的main分支代码中,coze-studio/docker目录中包含docker-compose.ymldocker-compose-debug.yml两种yml文件类型(docker-compose-debug.yml是最早版本的docker-compose.yml)。如下所示:

1.防止端口冲突

主要修改了常用的mysql、redis、minio、etcd的宿主机映射端口,可根据实际情况修改即可。

2.coze-studio

Coze Studio依赖中间件容器启动后,带setup名字的容器启动后会退出,属于正常情况,主要是为了完成初始化工作。可通过Docker Desktop查看它们对应的容器日志。

(1)coze-mysql-setup-init-sql

(2)coze-mysql-setup-schema

(3)coze-minio-setup

三.Coze Studio前端(Windows11+WSL2+Node22.15.1)

Coze Studio前端环境需要node(>=22) 、npm、rush等。作为前端小白,第一次听说rush。Rush 是由 Microsoft 开发的 JavaScript/TypeScript monorepo 管理工具,适用于管理包含多个包(package)的大型项目。它支持依赖安装、构建、发布、版本管理等流程,常用于企业级项目,提升多包协作和 CI/CD 效率。常见于需要统一依赖和自动化流程的前端/全栈项目。

1.Node安装

因为本地开发环境可能会有多个Node版本,因此需要通过nvm进行切换。

(1)安装nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

(2)安装 Node.js v22.15.1

nvm install 22.15.1

(3)切换和验证版本

nvm use 22.15.1
node -v

2.启动前端项目(开发模式)

在开发模式下,独立启动前端项目,如下所示:

bash scripts/setup_fe.sh
cd frontend/apps/coze-studio
npm run dev

通过http://localhost:8080/访问前端页面,如下所示:

这里的http://localhost:8888/是后端API的地址。

3.打包前端工程(生产模式)

在生产模式下,通常直接把前端项目打包为静态文件,如下所示:

bash scripts/build_fe.sh

根据scripts/build_fe.sh脚本可知,生成的static文件夹有2个地方,如下所示:

如果源码启动Coze Studio后端,默认confstatic文件夹在resources目录下面。为了不修改后端源码,新建resources目录,然后把confstatic文件夹拷贝到resources目录下面,同时把backend/resources/*添加到coze-studio\.gitignore文件中。如下所示:

四.Coze Studio后端(Windows11+Go1.24.5)

1.GoLand 2024.2.5配置

(1)GOROOT

(2)GOPATH

(3)Go Modules

(4)Build Tags

2.配置文件

(1).env文件

同时修改mysqlredisminioetcd服务对应的端口,与coze-studio\docker\docker-compose.yml服务中的端口保持一致。

(2)qwen.yaml

拷贝coze-studio\backend\resources\conf\model\template\model_template_qwen.yaml为coze-studio\backend\resources\conf\model\qwen.yaml,同时修改对应配置,如下所示:

3.运行main.go文件

五.工作流简单示例

1.创建智能体

项目开发中创建智能体,适用于快速搭建对话式智能体。

2.创建应用

项目开发中创建应用,适用于搭建多工作流协同的完整应用。

六.可能遇到的问题

1.IS_OPEN_SOURCE不识别问题

当执行命令F:\Coze\coze-studio\frontend\apps\coze-studio> npx rushx dev时,报错’IS_OPEN_SOURCE’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

报错是因为在 Windows 下,IS_OPEN_SOURCE=true CUSTOM_VERSION=release rsbuild dev 这种写法(设置环境变量)只适用于 Linux/macOS,不适用于 Windows。

PS F:\Coze\coze-studio\frontend\apps\coze-studio> npx rushx dev
Found configuration in F:\Coze\coze-studio\rush.json

Rush Multi-Project Build Tool 5.147.1 - Node.js 22.15.1 (LTS)
> "IS_OPEN_SOURCE=true CUSTOM_VERSION=release rsbuild dev"

'IS_OPEN_SOURCE' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
Error: Failed calling IS_OPEN_SOURCE=true CUSTOM_VERSION=release rsbuild dev.  Exit code: 1

用 cross-env 工具在 package.json 的 dev 脚本里,把

IS_OPEN_SOURCE=true CUSTOM_VERSION=release rsbuild dev

改成

cross-env IS_OPEN_SOURCE=true CUSTOM_VERSION=release rsbuild dev

然后在根目录或当前包下执行

npm install cross-env --save-dev

2.Unable to determine your Git configuration using this command

当执行命令duomiagi@DuoMiAGI:/mnt/f/Coze/coze-studio$ bash scripts/setup_fe.sh时,可能报错:

duomiagi@DuoMiAGI:/mnt/f/Coze/coze-studio$ bash scripts/setup_fe.sh
+ RED='\033[0;31m'
+ GREEN='\033[0;32m'
+ YELLOW='\033[0;33m'
+ NC='\033[0m'
pushd /mnt/f/Coze/coze-studio/scripts/../frontend
/mnt/f/Coze/coze-studio/frontend /mnt/f/Coze/coze-studio
echo'正在进入前端目录: /mnt/f/Coze/coze-studio/scripts/../frontend'
正在进入前端目录: /mnt/f/Coze/coze-studio/scripts/../frontend
echo -e '正在检查 Node.js 是否已安装...'
正在检查 Node.js 是否已安装...
command -v node
++ node -v
+ NODE_VERSION=v22.15.1
echo -e '\033[0;32mNode.js 已安装: v22.15.1\033[0m'
Node.js 已安装: v22.15.1
echo -e '正在检查 Rush 是否已安装...'
正在检查 Rush 是否已安装...
command -v rush
++ rush version
+ RUSH_VERSION='Found configuration in /mnt/f/Coze/coze-studio/rush.json


Rush Multi-Project Build Tool 5.147.1 - https://rushjs.io
Node.js version is 22.15.1 (LTS)

Found configuration in /mnt/f/Coze/coze-studio/rush.json

Trying to acquire lock for pnpm-8.15.8
Acquired lock for pnpm-8.15.8
Found pnpm version 8.15.8 in /home/duomiagi/.rush/node-v22.15.1/pnpm-8.15.8

Symlinking "/mnt/f/Coze/coze-studio/common/temp/pnpm-local"
  --> "/home/duomiagi/.rush/node-v22.15.1/pnpm-8.15.8"
Acquiring lock for "common/autoinstallers/plugins" folder...
Autoinstaller folder is already up to date

Starting "rush version"

Validating package manager shrinkwrap file.

Validating package manager shrinkwrap file.

Validating package manager shrinkwrap file.

Error: Process exited with code 1
Unable to determine your Git configuration using this command:

    git config user.email'

解决方案是配置emailname,如下所示:

git config --global user.email "your.email@example.com"
git config --global user.name "Your Name"

3.Go依赖库版本问题

(1)milvus版本

问题描述,如下所示:

GOROOT=D:\go-1.24.5 #gosetup
GOPATH=D:\go;C:\Users\wangs\go #gosetup
GOPROXY=https://goproxy.cn,direct #gosetup
D:\go-1.24.5\bin\go.exe build -o C:\Users\wangs\AppData\Local\JetBrains\GoLand2024.2\tmp\GoLand\___main.exe -gcflags "all=-N -l" F:\Coze\coze-studio\backend\main.go #gosetup
# github.com/milvus-io/milvus/pkg/v2/util/hardware
D:\go\pkg\mod\github.com\milvus-io\milvus\pkg\v2@v2.0.0-20250319085209-5a6b4e56d59e\util\hardware\mem_info.go:52:17: memInfo.RSS undefined (type *process.MemoryInfoExStat has no field or method RSS)
D:\go\pkg\mod\github.com\milvus-io\milvus\pkg\v2@v2.0.0-20250319085209-5a6b4e56d59e\util\hardware\mem_info.go:52:31: memInfo.Shared undefined (type *process.MemoryInfoExStat has no field or method Shared)

Compilation finished with exit code 1

解决方案,如下所示:

go get -u github.com/milvus-io/milvus/pkg/v2@latest
go get -u github.com/milvus-io/milvus/client/v2@latest

(2)eino-ext版本

问题描述,如下所示:

GOROOT=D:\go-1.24.5 #gosetup
GOPATH=D:\go;C:\Users\wangs\go #gosetup
GOPROXY=https://goproxy.cn,direct #gosetup
D:\go-1.24.5\bin\go.exe build -o C:\Users\wangs\AppData\Local\JetBrains\GoLand2024.2\tmp\GoLand\___1main.exe F:\Coze\coze-studio\backend\main.go #gosetup
# github.com/cloudwego/eino-ext/components/model/ollama
D:\go\pkg\mod\github.com\cloudwego\eino-ext\components\model\ollama@v0.0.0-20250610035057-2c4e7c8488a5\chatmodel.go:431:17: cannot use struct{Type string`json:"type"`; Required []string`json:"required"`; Properties map[string]struct{Type string`json:"type"`; Description string`json:"description"`; Enum []string`json:"enum,omitempty"``json:"properties"`}{…} (value of typestruct{Type string"json:\"type\""; Required []string"json:\"required\""; Properties map[string]struct{Type string"json:\"type\""; Description string"json:\"description\""; Enum []string"json:\"enum,omitempty\"""json:\"properties\""}) as struct{Type string"json:\"type\""; Defs any "json:\"$defs,omitempty\""; Items any "json:\"items,omitempty\""; Required []string"json:\"required\""; Properties map[string]struct{Type "github.com/ollama/ollama/api".PropertyType "json:\"type\""; Items any "json:\"items,omitempty\""; Description string"json:\"description\""; Enum []any "json:\"enum,omitempty\"""json:\"properties\""} value in struct literal

Compilation finished with exit code 1

解决方案,如下所示:

修改:github.com/cloudwego/eino-ext/components/model/ollama v0.0.0-20250610035057-2c4e7c8488a5
成为:github.com/cloudwego/eino-ext/components/model/ollama v0.1.0
然后:go mod tidy

(3)依赖库版本变化

特别说明:最新main分支已经发生了变化,这里的依赖库版本变化仅供参考。

4.无法查看智能体

在生产模式下不存在该问题,主要是在开发模式下,当点击项目开发中创建的智能体或者应用时,就会大概率出现”无法查看智能体”页面。

参考文献

[1] Coze Studio说明文档:https://github.com/coze-dev/coze-studio/blob/main/README.zh_CN.md

[2] Go All releases:https://golang.google.cn/dl/

[3] https://github.com/coze-dev/coze-studio/wiki/7.-开发规范




知识星球:Dify源码剖析及答疑,Dify扩展系统源码,Coze答疑,AI书籍课程|AI报告论文,公众号付费资料。加微信buxingtianxia21进NLP工程化资料群,以及Dify和Coze交流群。


(文:NLP工程化)

发表评论