背景
主包工作两年了,最近准备换工作了,打开boss直聘一看,现在要求会 AI 开发的岗位越来越多了,打开 GitHub 一看最近最火的开源 AI 项目就是coze-studio,所以想记录一下。之前的技术栈是Spring全家桶 CRUD 工程师+Vue,coze 的技术栈是 go+react,正好来学习一下新东西。
版本
2025.08.02 19:00 拉取coze-studio repo 最新 main 分支
text
源仓库地址:https://github.com/coze-dev/coze-studio.git
学习工具
Cursor、GoLand
学习目标
从零复刻一个一模一样的 coze 页面以及功能。
Day1
git fork到自己的仓库
git clone
cursor分析
大致了解项目结构以及项目的启动方式、DDD架构设计
graph TD
A["用户界面层
(User Interface)"] --> B["应用层
(Application Layer)"] B --> C["领域层
(Domain Layer)"] C --> D["基础设施层
(Infrastructure Layer)"] subgraph "Coze Studio 实际结构" E["frontend/
React + TypeScript"] --> F["backend/api/
HTTP接口"] F --> G["backend/application/
应用服务"] G --> H["backend/domain/
领域模型"] H --> I["backend/infra/
数据库、外部服务"] end A -.-> E B -.-> G C -.-> H D -.-> I
(User Interface)"] --> B["应用层
(Application Layer)"] B --> C["领域层
(Domain Layer)"] C --> D["基础设施层
(Infrastructure Layer)"] subgraph "Coze Studio 实际结构" E["frontend/
React + TypeScript"] --> F["backend/api/
HTTP接口"] F --> G["backend/application/
应用服务"] G --> H["backend/domain/
领域模型"] H --> I["backend/infra/
数据库、外部服务"] end A -.-> E B -.-> G C -.-> H D -.-> I
之前没有接触过 DDD,做个笔记:
🎯 什么是领域设计(DDD)
DDD是由Eric Evans提出的软件设计方法,核心思想是:将复杂的业务问题分解为多个相对独立的领域,每个领域专注于解决特定的业务问题。
📁 项目结构分析
后端DDD架构
text
backend/
├── domain/ # 领域层 - 核心业务逻辑
│ ├── agent/ # AI智能体领域
│ ├── workflow/ # 工作流领域
│ ├── knowledge/ # 知识库领域
│ ├── conversation/# 对话领域
│ └── ...
├── application/ # 应用层 - 业务用例
├── api/ # 接口层 - HTTP路由和中间件
├── infra/ # 基础设施层 - 数据库、外部服务
└── pkg/ # 公共包
前端Monorepo架构
text
frontend/
├── apps/ # 应用层
│ └── coze-studio/# 主应用
├── packages/ # 核心包
│ ├── agent-ide/ # AI智能体IDE
│ ├── workflow/ # 工作流引擎
│ ├── arch/ # 架构基础设施
│ └── ...
└── config/ # 配置文件
通过 docker compose 启动项目
1. 数据库服务
MySQL 8.4.5
- 容器名: coze-mysql
- 功能: 主数据库,存储应用核心数据
- 端口: 3306
- 配置: UTF8MB4字符集,包含健康检查和初始化脚本
Redis 8.0 (Bitnami)
- 容器名: coze-redis
- 功能: 缓存和会话存储
- 端口: 6379
- 配置: 支持AOF持久化,多线程IO
2. 搜索和向量数据库
Elasticsearch 8.18.0 (Bitnami)
- 容器名: coze-elasticsearch
- 功能: 全文搜索引擎
- 端口: 9200
- 特性: 安装了中文分词插件 analysis-smartcn
Milvus v2.5.10
- 容器名: coze-milvus
- 功能: 向量数据库,用于AI相关的向量搜索
- 端口: 19530, 9091
- 依赖: etcd + MinIO
3. 对象存储
MinIO (RELEASE.2025-06-13T11-33-47Z-cpuv1)
- 容器名: coze-minio
- 功能: 对象存储服务,兼容S3 API
- 端口: 9000 (API), 9001 (Console)
- 用途: 存储文件、图片等静态资源
4. 服务发现和配置
etcd 3.5 (Bitnami)
- 容器名: coze-etcd
- 功能: 分布式键值存储,用于服务发现和配置管理
- 端口: 2379, 2380
- 用途: Milvus的元数据存储
5. 消息队列
NSQ v1.2.1
- 组件:
- nsqlookupd (服务发现)
- nsqd (消息代理)
- nsqadmin (管理界面)
- 功能: 实时分布式消息平台
- 端口: 4160, 4161, 4150, 4151, 4171
6. 应用服务
Coze Server
- 镜像: opencoze/opencoze:latest
- 容器名: coze-server
- 端口: 8888, 8889
- 基础镜像: Alpine Linux 3.22.0 + Go 1.24
7. 运行时依赖
Python 环境
- 版本: Python 3 (Alpine包)
- 用途: 文档解析和代码执行沙箱
- 包含库:
- pillow==11.2.1 (图像处理)
- pdfplumber==0.11.7 (PDF解析)
- python-docx==1.2.0 (Word文档解析)
- numpy==2.3.1 (数值计算)
- urllib3==1.26.16 (HTTP客户端)
- requests-async (异步HTTP请求)
Deno
- 用途: JavaScript/TypeScript运行时
表结构设计(Cursor 生成)
mermaid真好用,一下子整个项目的表关系就一目了然了。
erDiagram
%% 用户和空间相关
user {
bigint id PK
varchar name
varchar unique_name
varchar email UK
varchar password
varchar description
varchar icon_uri
bool user_verified
varchar locale
varchar session_key
bigint created_at
bigint updated_at
bigint deleted_at
}
space {
bigint id PK
bigint owner_id FK
varchar name
varchar description
varchar icon_uri
bigint creator_id FK
bigint created_at
bigint updated_at
bigint deleted_at
}
space_user {
bigint id PK
bigint space_id FK
bigint user_id FK
int role_type
bigint created_at
bigint updated_at
}
api_key {
bigint id PK
varchar api_key
varchar name
tinyint status
bigint user_id FK
bigint expired_at
bigint created_at
bigint updated_at
bigint last_used_at
}
%% 应用相关
app_draft {
bigint id PK
bigint space_id FK
bigint owner_id FK
varchar icon_uri
varchar name
text description
bigint created_at
bigint updated_at
datetime deleted_at
}
app_release_record {
bigint id PK
bigint app_id FK
bigint space_id FK
bigint owner_id FK
varchar icon_uri
varchar name
text description
json connector_ids
json extra_info
varchar version
text version_desc
tinyint publish_status
bigint publish_at
bigint created_at
bigint updated_at
}
%% Agent相关
single_agent_draft {
bigint id PK
bigint agent_id
bigint creator_id FK
bigint space_id FK
varchar name
text description
varchar icon_uri
bigint created_at
bigint updated_at
datetime deleted_at
bigint variables_meta_id FK
json model_info
json onboarding_info
json prompt
json plugin
json knowledge
json workflow
json suggest_reply
json jump_config
json background_image_info_list
json database_config
json shortcut_command
}
single_agent_version {
bigint id PK
bigint agent_id
bigint creator_id FK
bigint space_id FK
varchar name
text description
varchar icon_uri
bigint created_at
bigint updated_at
datetime deleted_at
bigint variables_meta_id FK
json model_info
json onboarding_info
json prompt
json plugin
json knowledge
json workflow
json suggest_reply
json jump_config
bigint connector_id
varchar version
json background_image_info_list
json database_config
json shortcut_command
}
single_agent_publish {
bigint id PK
bigint agent_id FK
varchar publish_id
json connector_ids
varchar version
text publish_info
bigint publish_time
bigint created_at
bigint updated_at
bigint creator_id FK
tinyint status
json extra
}
%% 工作流相关
workflow_meta {
bigint id PK
varchar name
varchar description
varchar icon_uri
tinyint status
tinyint content_type
tinyint mode
bigint created_at
bigint updated_at
datetime deleted_at
bigint creator_id FK
tinyint tag
bigint author_id FK
bigint space_id FK
bigint updater_id FK
bigint source_id FK
bigint app_id FK
varchar latest_version
bigint latest_version_ts
}
workflow_draft {
bigint id PK
mediumtext canvas
mediumtext input_params
mediumtext output_params
bool test_run_success
bool modified
bigint updated_at
datetime deleted_at
varchar commit_id
}
workflow_version {
bigint id PK
bigint workflow_id FK
varchar version
varchar version_description
mediumtext canvas
mediumtext input_params
mediumtext output_params
bigint creator_id FK
bigint created_at
datetime deleted_at
varchar commit_id
}
workflow_execution {
bigint id PK
bigint workflow_id FK
varchar version
bigint space_id FK
tinyint mode
bigint operator_id FK
bigint connector_id
varchar connector_uid
bigint created_at
varchar log_id
tinyint status
bigint duration
mediumtext input
mediumtext output
varchar error_code
mediumtext fail_reason
bigint input_tokens
bigint output_tokens
bigint updated_at
bigint root_execution_id
varchar parent_node_id
bigint app_id FK
mediumint node_count
bigint resume_event_id
bigint agent_id FK
tinyint sync_pattern
varchar commit_id
}
node_execution {
bigint id PK
bigint execute_id FK
varchar node_id
varchar node_name
varchar node_type
bigint created_at
tinyint status
bigint duration
mediumtext input
mediumtext output
mediumtext raw_output
mediumtext error_info
varchar error_level
bigint input_tokens
bigint output_tokens
bigint updated_at
bigint composite_node_index
mediumtext composite_node_items
varchar parent_node_id
bigint sub_execute_id
mediumtext extra
}
%% 插件相关
plugin_draft {
bigint id PK
bigint space_id FK
bigint developer_id FK
bigint app_id FK
varchar icon_uri
varchar server_url
tinyint plugin_type
bigint created_at
bigint updated_at
datetime deleted_at
json manifest
json openapi_doc
}
plugin {
bigint id PK
bigint space_id FK
bigint developer_id FK
bigint app_id FK
varchar icon_uri
varchar server_url
tinyint plugin_type
bigint created_at
bigint updated_at
varchar version
text version_desc
json manifest
json openapi_doc
}
tool_draft {
bigint id PK
bigint plugin_id FK
bigint created_at
bigint updated_at
varchar sub_url
varchar method
json operation
tinyint debug_status
tinyint activated_status
}
tool {
bigint id PK
bigint plugin_id FK
bigint created_at
bigint updated_at
varchar version
varchar sub_url
varchar method
json operation
tinyint activated_status
}
%% 知识库相关
knowledge {
bigint id PK
varchar name
bigint app_id FK
bigint creator_id FK
bigint space_id FK
bigint created_at
bigint updated_at
datetime deleted_at
tinyint status
text description
varchar icon_uri
tinyint format_type
}
knowledge_document {
bigint id PK
bigint knowledge_id FK
varchar name
varchar file_extension
int document_type
text uri
bigint size
bigint slice_count
bigint char_count
bigint creator_id FK
bigint space_id FK
bigint created_at
bigint updated_at
datetime deleted_at
int source_type
int status
text fail_reason
json parse_rule
json table_info
}
knowledge_document_slice {
bigint id PK
bigint knowledge_id FK
bigint document_id FK
text content
decimal sequence
bigint created_at
bigint updated_at
datetime deleted_at
bigint creator_id FK
bigint space_id FK
int status
text fail_reason
bigint hit
}
%% 对话相关
conversation {
bigint id PK
bigint connector_id
bigint agent_id FK
tinyint scene
bigint section_id
bigint creator_id FK
text ext
tinyint status
bigint created_at
bigint updated_at
}
message {
bigint id PK
bigint run_id FK
bigint conversation_id FK
varchar user_id
bigint agent_id FK
varchar role
varchar content_type
mediumtext content
varchar message_type
text display_content
text ext
bigint section_id
int broken_position
tinyint status
mediumtext model_content
text meta_info
text reasoning_content
bigint created_at
bigint updated_at
}
run_record {
bigint id PK
bigint conversation_id FK
bigint section_id
bigint agent_id FK
varchar user_id
tinyint source
varchar status
bigint creator_id FK
bigint created_at
bigint updated_at
bigint failed_at
text last_error
bigint completed_at
text chat_request
text ext
json usage
}
%% 模型相关
model_meta {
bigint id PK
varchar model_name
varchar protocol
varchar icon_uri
json capability
json conn_config
int status
varchar description
bigint created_at
bigint updated_at
bigint deleted_at
varchar icon_url
}
model_entity {
bigint id PK
bigint meta_id FK
varchar name
text description
json default_params
bigint scenario
int status
bigint created_at
bigint updated_at
bigint deleted_at
}
%% 关系定义
user ||--o{ space : "owns"
user ||--o{ space_user : "belongs_to"
space ||--o{ space_user : "has_members"
user ||--o{ api_key : "has"
space ||--o{ app_draft : "contains"
app_draft ||--o{ app_release_record : "releases"
space ||--o{ single_agent_draft : "contains"
single_agent_draft ||--o{ single_agent_version : "versions"
single_agent_draft ||--o{ single_agent_publish : "publishes"
space ||--o{ workflow_meta : "contains"
workflow_meta ||--|| workflow_draft : "has_draft"
workflow_meta ||--o{ workflow_version : "has_versions"
workflow_meta ||--o{ workflow_execution : "executes"
workflow_execution ||--o{ node_execution : "contains_nodes"
space ||--o{ plugin_draft : "contains"
plugin_draft ||--|| plugin : "publishes_to"
plugin ||--o{ tool : "has_tools"
plugin_draft ||--o{ tool_draft : "has_draft_tools"
space ||--o{ knowledge : "contains"
knowledge ||--o{ knowledge_document : "has_documents"
knowledge_document ||--o{ knowledge_document_slice : "has_slices"
conversation ||--o{ message : "contains"
conversation ||--o{ run_record : "has_runs"
run_record ||--o{ message : "generates"
model_meta ||--o{ model_entity : "defines"
user ||--o{ conversation : "creates"
user ||--o{ knowledge : "creates"
user ||--o{ workflow_meta : "creates"
搭建GO项目框架
新建文件夹,明天继续