Skip to content

Commit 7dc54ab

Browse files
authored
Refact add model (#57)
* feat: 模型显示tag * feat: 列出模型后会自动分组 * refactor(utils): 将模型相关工具函数移动到单独的文件中 * refactor(URL处理): 重构URL验证和处理逻辑 移除URL验证中的斜杠和路径检查,改为在提交时统一处理URL格式 添加getProcessedUrl函数处理不同URL结尾情况 在UI中显示处理后的URL并提供格式提示 * feat: 为列出来的模型添加logo * feat(backend): 添加后端Docker构建配置和脚本 添加Dockerfile、构建脚本和Makefile用于后端服务的容器化部署 支持多阶段构建和x86平台,包含健康检查和用户权限配置 ``` ```msg feat(ui): 实现前端环境变量配置和Docker部署 添加vite环境类型定义和示例env文件 更新本地服务配置从环境变量读取API地址 添加Dockerfile和nginx配置用于前端部署 ``` ```msg docs: 添加前后端部署文档和说明 包含Docker构建指南、nginx配置说明和Makefile帮助信息 添加README详细说明部署步骤和注意事项 * fix: 修复Ollama URL处理逻辑及UI组件库迁移 修复Ollama供应商的URL处理逻辑,增加对末尾斜杠和/chat/completions路径的校验 迁移UI组件库从antd到mui,更新相关组件和依赖 优化URL校验逻辑,移除不必要的协议检查 更新测试环境配置和类型定义 * feat: 添加代码tag
1 parent 22582e3 commit 7dc54ab

File tree

243 files changed

+2223
-63
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

243 files changed

+2223
-63
lines changed

consts/consts.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const (
2424

2525
func ParseModelType(s string) ModelType {
2626
switch s {
27-
case "llm", "chat":
27+
case "llm", "chat", "analysis":
2828
return ModelTypeChat
2929
case "coder", "code":
3030
return ModelTypeCoder
@@ -221,6 +221,9 @@ type AddModelBaseURLErrType string
221221
const (
222222
AddModelBaseURLErrTypeHost AddModelBaseURLErrType = "host" // 建议使用宿主机主机名
223223
AddModelBaseURLErrTypeV1Path AddModelBaseURLErrType = "v1_path" // 建议在API地址末尾添加/v1
224+
AddModelBaseURLErrTypeSlash AddModelBaseURLErrType = "slash" // 建议去掉末尾的/
225+
AddModelBaseURLErrTypeProtocol AddModelBaseURLErrType = "protocol" // 建议在url开头添加协议 http:// 或者 https://
226+
AddModelBaseURLErrTypeChatCompletions AddModelBaseURLErrType = "chat_completions" // 建议去掉/chat/completions路径
224227
)
225228

226229
const LinuxHost = "172.17.0.1"

package.json

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/backend/Makefile

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# ModelKit Backend Makefile
2+
3+
# 默认配置
4+
IMAGE_NAME ?= modelkit-backend
5+
IMAGE_TAG ?= latest
6+
FULL_IMAGE_NAME = $(IMAGE_NAME):$(IMAGE_TAG)
7+
TAR_FILE = $(IMAGE_NAME)-$(IMAGE_TAG).tar
8+
9+
# 构建Docker镜像并保存到当前文件夹
10+
.PHONY: image
11+
image:
12+
@echo "构建Docker镜像: $(FULL_IMAGE_NAME)"
13+
@cd build && ./build.sh -n $(IMAGE_NAME) -t $(IMAGE_TAG)
14+
@echo "保存镜像到文件: $(TAR_FILE)"
15+
@docker save $(FULL_IMAGE_NAME) -o $(TAR_FILE)
16+
@echo "✅ 镜像已保存到: $(PWD)/$(TAR_FILE)"
17+
@ls -lh $(TAR_FILE)
18+
19+
# 清理生成的镜像文件
20+
.PHONY: clean
21+
clean:
22+
@echo "清理镜像文件..."
23+
@rm -f *.tar
24+
@echo "✅ 清理完成"
25+
26+
# 加载镜像文件
27+
.PHONY: load
28+
load:
29+
@if [ -f "$(TAR_FILE)" ]; then \
30+
echo "加载镜像文件: $(TAR_FILE)"; \
31+
docker load -i $(TAR_FILE); \
32+
echo "✅ 镜像加载完成"; \
33+
else \
34+
echo "❌ 镜像文件不存在: $(TAR_FILE)"; \
35+
exit 1; \
36+
fi
37+
38+
# 显示帮助信息
39+
.PHONY: help
40+
help:
41+
@echo "ModelKit Backend Makefile"
42+
@echo ""
43+
@echo "可用目标:"
44+
@echo " image - 构建Docker镜像并保存到当前文件夹"
45+
@echo " clean - 清理生成的镜像文件"
46+
@echo " load - 加载镜像文件到Docker"
47+
@echo " help - 显示此帮助信息"
48+
@echo ""
49+
@echo "环境变量:"
50+
@echo " IMAGE_NAME - 镜像名称 (默认: $(IMAGE_NAME))"
51+
@echo " IMAGE_TAG - 镜像标签 (默认: $(IMAGE_TAG))"
52+
@echo ""
53+
@echo "示例:"
54+
@echo " make image # 使用默认配置"
55+
@echo " make image IMAGE_TAG=v1.0.0 # 指定标签"
56+
@echo " make clean # 清理文件"
57+
58+
# 默认目标
59+
.DEFAULT_GOAL := help

test/backend/build/.dockerignore

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Git 相关文件
2+
.git
3+
.gitignore
4+
.github
5+
6+
# 文档文件
7+
*.md
8+
README*
9+
CONTRIBUTING*
10+
LICENSE*
11+
docs/
12+
13+
# 构建产物
14+
build/
15+
dist/
16+
target/
17+
*.exe
18+
*.dll
19+
*.so
20+
*.dylib
21+
22+
# 测试文件
23+
*_test.go
24+
testdata/
25+
*.test
26+
coverage.out
27+
28+
# IDE 和编辑器文件
29+
.vscode/
30+
.idea/
31+
*.swp
32+
*.swo
33+
*~
34+
.DS_Store
35+
Thumbs.db
36+
37+
# 临时文件
38+
*.tmp
39+
*.temp
40+
*.log
41+
42+
# Node.js 相关(如果有前端代码)
43+
node_modules/
44+
npm-debug.log*
45+
yarn-debug.log*
46+
yarn-error.log*
47+
.npm
48+
.yarn
49+
package-lock.json
50+
yarn.lock
51+
pnpm-lock.yaml
52+
53+
# 环境配置文件
54+
.env
55+
.env.local
56+
.env.*.local
57+
58+
# 缓存目录
59+
.cache/
60+
61+
# 其他不需要的文件
62+
*.tar
63+
*.tar.gz
64+
*.zip
65+
*.rar
66+
67+
# UI 相关文件(不需要在后端镜像中)
68+
ui/
69+
test/ui_example/
70+
71+
# 镜像文件
72+
*.tar
73+
*.tar.gz
74+
modelmodal-example-latest.tar

test/backend/build/Dockerfile

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# 多阶段构建 Dockerfile for x86 架构
2+
# 构建阶段
3+
FROM --platform=linux/amd64 golang:1.24-alpine AS builder
4+
5+
# 设置工作目录
6+
WORKDIR /app
7+
8+
# 安装必要的构建工具
9+
RUN apk add --no-cache git ca-certificates tzdata
10+
11+
# 复制 go mod 文件并下载依赖
12+
COPY go.mod go.sum ./
13+
RUN go mod download
14+
15+
# 复制源代码
16+
COPY . .
17+
18+
# 构建应用程序
19+
# CGO_ENABLED=0 创建静态链接的二进制文件
20+
# GOOS=linux 指定目标操作系统
21+
# GOARCH=amd64 明确指定 x86 架构
22+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main ./test/backend/main.go
23+
24+
# 运行阶段
25+
FROM --platform=linux/amd64 alpine:3.20
26+
27+
# 安装运行时依赖
28+
RUN apk --no-cache add ca-certificates tzdata
29+
30+
# 创建非 root 用户
31+
RUN addgroup -g 1001 -S appgroup && \
32+
adduser -u 1001 -S appuser -G appgroup
33+
34+
# 设置工作目录
35+
WORKDIR /app
36+
37+
# 从构建阶段复制二进制文件
38+
COPY --from=builder /app/main .
39+
40+
# 更改文件所有者
41+
RUN chown -R appuser:appgroup /app
42+
43+
# 切换到非 root 用户
44+
USER appuser
45+
46+
# 暴露端口
47+
EXPOSE 8080
48+
49+
# 健康检查
50+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
51+
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/api/v1/modelkit/listmodel || exit 1
52+
53+
# 启动应用
54+
CMD ["./main"]

test/backend/build/build.sh

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
#!/bin/bash
2+
3+
# ModelKit Backend Docker 构建脚本
4+
# 用于构建 x86 架构的 Docker 镜像
5+
6+
set -e # 遇到错误时退出
7+
8+
# 颜色定义
9+
RED='\033[0;31m'
10+
GREEN='\033[0;32m'
11+
YELLOW='\033[1;33m'
12+
BLUE='\033[0;34m'
13+
NC='\033[0m' # No Color
14+
15+
# 默认配置
16+
IMAGE_NAME="modelkit-backend"
17+
IMAGE_TAG="latest"
18+
PLATFORM="linux/amd64"
19+
DOCKERFILE_PATH="./Dockerfile"
20+
CONTEXT_PATH="../../.."
21+
22+
# 显示帮助信息
23+
show_help() {
24+
echo "ModelKit Backend Docker 构建脚本"
25+
echo ""
26+
echo "用法: $0 [选项]"
27+
echo ""
28+
echo "选项:"
29+
echo " -n, --name NAME 设置镜像名称 (默认: $IMAGE_NAME)"
30+
echo " -t, --tag TAG 设置镜像标签 (默认: $IMAGE_TAG)"
31+
echo " -p, --platform PLATFORM 设置目标平台 (默认: $PLATFORM)"
32+
echo " -f, --file FILE 指定 Dockerfile 路径 (默认: $DOCKERFILE_PATH)"
33+
echo " -c, --context PATH 设置构建上下文路径 (默认: $CONTEXT_PATH)"
34+
echo " --no-cache 不使用缓存构建"
35+
echo " --push 构建后推送到仓库"
36+
echo " -h, --help 显示此帮助信息"
37+
echo ""
38+
echo "示例:"
39+
echo " $0 # 使用默认配置构建"
40+
echo " $0 -n my-app -t v1.0.0 # 指定名称和标签"
41+
echo " $0 --no-cache # 不使用缓存构建"
42+
echo " $0 -t v1.0.0 --push # 构建并推送"
43+
}
44+
45+
# 解析命令行参数
46+
NO_CACHE=""
47+
PUSH=false
48+
49+
while [[ $# -gt 0 ]]; do
50+
case $1 in
51+
-n|--name)
52+
IMAGE_NAME="$2"
53+
shift 2
54+
;;
55+
-t|--tag)
56+
IMAGE_TAG="$2"
57+
shift 2
58+
;;
59+
-p|--platform)
60+
PLATFORM="$2"
61+
shift 2
62+
;;
63+
-f|--file)
64+
DOCKERFILE_PATH="$2"
65+
shift 2
66+
;;
67+
-c|--context)
68+
CONTEXT_PATH="$2"
69+
shift 2
70+
;;
71+
--no-cache)
72+
NO_CACHE="--no-cache"
73+
shift
74+
;;
75+
--push)
76+
PUSH=true
77+
shift
78+
;;
79+
-h|--help)
80+
show_help
81+
exit 0
82+
;;
83+
*)
84+
echo -e "${RED}错误: 未知选项 $1${NC}"
85+
show_help
86+
exit 1
87+
;;
88+
esac
89+
done
90+
91+
# 构建完整的镜像名称
92+
FULL_IMAGE_NAME="$IMAGE_NAME:$IMAGE_TAG"
93+
94+
echo -e "${BLUE}=== ModelKit Backend Docker 构建 ===${NC}"
95+
echo -e "${YELLOW}镜像名称:${NC} $FULL_IMAGE_NAME"
96+
echo -e "${YELLOW}目标平台:${NC} $PLATFORM"
97+
echo -e "${YELLOW}Dockerfile:${NC} $DOCKERFILE_PATH"
98+
echo -e "${YELLOW}构建上下文:${NC} $CONTEXT_PATH"
99+
echo ""
100+
101+
# 检查 Docker 是否可用
102+
if ! command -v docker &> /dev/null; then
103+
echo -e "${RED}错误: Docker 未安装或不在 PATH 中${NC}"
104+
exit 1
105+
fi
106+
107+
# 检查 Dockerfile 是否存在
108+
if [[ ! -f "$DOCKERFILE_PATH" ]]; then
109+
echo -e "${RED}错误: Dockerfile 不存在: $DOCKERFILE_PATH${NC}"
110+
exit 1
111+
fi
112+
113+
# 检查构建上下文是否存在
114+
if [[ ! -d "$CONTEXT_PATH" ]]; then
115+
echo -e "${RED}错误: 构建上下文目录不存在: $CONTEXT_PATH${NC}"
116+
exit 1
117+
fi
118+
119+
# 开始构建
120+
echo -e "${GREEN}开始构建 Docker 镜像...${NC}"
121+
echo ""
122+
123+
# 构建命令
124+
BUILD_CMD="docker build \
125+
--platform $PLATFORM \
126+
--file $DOCKERFILE_PATH \
127+
--tag $FULL_IMAGE_NAME \
128+
$NO_CACHE \
129+
$CONTEXT_PATH"
130+
131+
echo -e "${YELLOW}执行命令:${NC}"
132+
echo "$BUILD_CMD"
133+
echo ""
134+
135+
# 执行构建
136+
if eval "$BUILD_CMD"; then
137+
echo ""
138+
echo -e "${GREEN}✅ 镜像构建成功: $FULL_IMAGE_NAME${NC}"
139+
140+
# 显示镜像信息
141+
echo ""
142+
echo -e "${BLUE}镜像信息:${NC}"
143+
docker images "$IMAGE_NAME" --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}"
144+
145+
# 推送镜像(如果指定)
146+
if [[ "$PUSH" == true ]]; then
147+
echo ""
148+
echo -e "${GREEN}推送镜像到仓库...${NC}"
149+
if docker push "$FULL_IMAGE_NAME"; then
150+
echo -e "${GREEN}✅ 镜像推送成功${NC}"
151+
else
152+
echo -e "${RED}❌ 镜像推送失败${NC}"
153+
exit 1
154+
fi
155+
fi
156+
157+
else
158+
echo ""
159+
echo -e "${RED}❌ 镜像构建失败${NC}"
160+
exit 1
161+
fi
162+
163+
echo ""
164+
echo -e "${GREEN}=== 构建完成 ===${NC}"
165+
echo -e "${YELLOW}运行镜像:${NC} docker run --rm -p 8080:8080 $FULL_IMAGE_NAME"
166+
echo -e "${YELLOW}查看日志:${NC} docker logs <container_id>"
167+
echo -e "${YELLOW}进入容器:${NC} docker exec -it <container_id> /bin/sh"
File renamed without changes.
40.4 MB
Binary file not shown.

test/ui_example/.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
VITE_API_BASE_URL=http://localhost:8080/api/v1/modelkit

0 commit comments

Comments
 (0)