feat(release): migrate GeekAI v4.3.0 to open source

- Sync backend and frontend from GeekAI Plus v4.3.0

- Remove commercial License flows and update open-source deployment defaults

- Preserve Docker Compose deployment and bump image tags to v4.3.0

BREAKING CHANGE: commercial License configuration and related endpoints are removed
This commit is contained in:
RockYang
2026-08-11 14:51:20 +08:00
parent 37e024acea
commit 9ccff4efbc
219 changed files with 29212 additions and 10802 deletions
+12 -2
View File
@@ -10,7 +10,7 @@ package core
import (
"bytes"
"geekai/core/types"
logger2 "geekai/logger"
"geekai/log"
"geekai/store/model"
"geekai/utils"
"os"
@@ -19,7 +19,7 @@ import (
"gorm.io/gorm"
)
var logger = logger2.GetLogger()
var logger = log.GetLogger()
func NewDefaultConfig() *types.AppConfig {
return &types.AppConfig{
@@ -157,6 +157,15 @@ func LoadSystemConfig(db *gorm.DB) *types.SystemConfig {
logger.Error("load jimeng config error: ", err)
}
// 加载微信公众号配置
var wxGzhConfig types.WxGzhConfig
sysConfig.Id = 0
db.Where("name", types.ConfigKeyWxGzh).First(&sysConfig)
err = utils.JsonDecode(sysConfig.Value, &wxGzhConfig)
if err != nil {
logger.Error("load wx gzh config error: ", err)
}
return &types.SystemConfig{
Base: baseConfig,
SMS: smsConfig,
@@ -167,5 +176,6 @@ func LoadSystemConfig(db *gorm.DB) *types.SystemConfig {
WxLogin: wxLoginConfig,
Moderation: moderationConfig,
Jimeng: jimengConfig,
WxGzh: wxGzhConfig,
}
}
+2 -2
View File
@@ -4,7 +4,7 @@ import (
"context"
"fmt"
"geekai/core/types"
logger2 "geekai/logger"
"geekai/log"
"geekai/utils"
"geekai/utils/resp"
"time"
@@ -14,7 +14,7 @@ import (
"github.com/golang-jwt/jwt"
)
var logger = logger2.GetLogger()
var logger = log.GetLogger()
// 前端用户授权验证
func UserAuthMiddleware(secretKey string, redis *redis.Client) gin.HandlerFunc {
+24 -18
View File
@@ -57,8 +57,11 @@ type BaseConfig struct {
DailyPower int `json:"daily_power,omitempty"` // 每日签到赠送算力
InvitePower int `json:"invite_power,omitempty"` // 邀请新用户赠送算力值
MjPower int `json:"mj_power,omitempty"` // MJ 绘画消耗算力
MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力
SdPower int `json:"sd_power,omitempty"` // SD 绘画消耗算力
MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力,未配置分项时回退用
MjUpscalePower int `json:"mj_upscale_power,omitempty"` // MJ 放大/变换消耗算力
MjBlendPower int `json:"mj_blend_power,omitempty"` // MJ 融图消耗算力
MjSwapFacePower int `json:"mj_swap_face_power,omitempty"` // MJ 换脸消耗算力
MjModalPower int `json:"mj_modal_power,omitempty"` // MJ 局部重绘消耗算力
SunoPower int `json:"suno_power,omitempty"` // Suno 生成歌曲消耗算力
LumaPower int `json:"luma_power,omitempty"` // Luma 生成视频消耗算力
KeLingPowers map[string]int `json:"keling_powers,omitempty"` // 可灵生成视频消耗算力
@@ -69,8 +72,7 @@ type BaseConfig struct {
EnableContext bool `json:"enable_context,omitempty"`
ContextDeep int `json:"context_deep,omitempty"`
SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词
MjMode string `json:"mj_mode"` // midjourney 默认的API模式,relax, fast, turbo
MjMode string `json:"mj_mode"` // midjourney 默认的API模式,relax, fast, turbo
IndexNavs []int `json:"index_navs"` // 首页显示的导航菜单
IndexPage string `json:"index_page"` // 首页显示的页面
@@ -95,22 +97,26 @@ type SystemConfig struct {
WxLogin WxLoginConfig
Jimeng JimengConfig
Moderation ModerationConfig
WxGzh WxGzhConfig
}
// 配置键名常量
const (
ConfigKeySystem = "system"
ConfigKeyNotice = "notice"
ConfigKeyAgreement = "agreement"
ConfigKeyPrivacy = "privacy"
ConfigKeyMarkMap = "mark_map"
ConfigKeyCaptcha = "captcha"
ConfigKeyWxLogin = "wx_login"
ConfigKeySms = "sms"
ConfigKeySmtp = "smtp"
ConfigKeyOss = "oss"
ConfigKeyPayment = "payment"
ConfigKeyModeration = "moderation"
ConfigKeyAI3D = "ai3d"
ConfigKeyJimeng = "jimeng"
ConfigKeySystem = "system" // 系统配置
ConfigKeyNotice = "notice" // 公告配置
ConfigKeyAgreement = "agreement" // 用户协议配置
ConfigKeyPrivacy = "privacy" // 隐私政策配置
ConfigKeyMarkMap = "mark_map" // 水印配置
ConfigKeyCaptcha = "captcha" // 验证码配置
ConfigKeyWxLogin = "wx_login" // 微信扫码登录配置
ConfigKeyWxGzh = "wx_gzh" // 微信公众号配置
ConfigKeySms = "sms" // 短信配置
ConfigKeySmtp = "smtp" // SMTP 配置
ConfigKeyOss = "oss" // OSS 配置
ConfigKeyPayment = "payment" // 支付配置
ConfigKeyModeration = "moderation" // 文本审查配置
ConfigKeyAI3D = "ai3d" // AI3D 配置
ConfigKeyJimeng = "jimeng" // 即梦AI配置
ConfigKeyVideo = "video" // 视频生成配置
ConfigKeyPPT = "ppt" // PPT 生成配置
)
+10 -1
View File
@@ -25,9 +25,18 @@ type CaptchaConfig struct {
Enabled bool `json:"enabled,omitempty"`
}
// WxLoginConfig 微信登录配置
// WxLoginConfig 微信扫码登录配置
type WxLoginConfig struct {
ApiKey string `json:"api_key,omitempty"`
NotifyURL string `json:"notify_url,omitempty"` // 登录成功回调 URL
Enabled bool `json:"enabled,omitempty"` // 是否启用微信登录
}
// 微信公众号配置
type WxGzhConfig struct {
AppId string `json:"app_id,omitempty"`
Secret string `json:"secret,omitempty"`
Token string `json:"token"`
EncodingAESKey string `json:"encoding_aes_key"`
Enabled bool `json:"enabled"`
}
+1 -2
View File
@@ -65,8 +65,7 @@ var ModerationCategories = map[string]string{
const (
ModerationSourceChat = "chat"
ModerationSourceMJ = "mj"
ModerationSourceDalle = "dalle"
ModerationSourceSD = "sd"
ModerationSourceImage = "image"
ModerationSourceSuno = "suno"
ModerationSourceVideo = "video"
ModerationSourceJiMeng = "jimeng"
+37 -23
View File
@@ -8,39 +8,53 @@ package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
type OSSConfig struct {
Active string `json:"active,omitempty"`
Local LocalStorageConfig `json:"local,omitempty"`
Minio MiniOssConfig `json:"minio,omitempty"`
QiNiu QiNiuOssConfig `json:"qiniu,omitempty"`
AliYun AliYunOssConfig `json:"aliyun,omitempty"`
Active string `json:"active,omitempty"`
Local LocalStorageConfig `json:"local,omitempty"`
Minio MiniOssConfig `json:"minio,omitempty"`
QiNiu QiNiuOssConfig `json:"qiniu,omitempty"`
AliYun AliYunOssConfig `json:"aliyun,omitempty"`
Tencent TencentOssConfig `json:"tencent,omitempty"`
}
type MiniOssConfig struct {
Endpoint string `json:"endpoint,omitempty"`
AccessKey string `json:"access_key,omitempty"`
AccessSecret string `json:"access_secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
UseSSL bool `json:"use_ssl,omitempty"`
Domain string `json:"domain,omitempty"`
Endpoint string `json:"endpoint,omitempty"`
AccessKey string `json:"access_key,omitempty"`
AccessSecret string `json:"access_secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
UseSSL bool `json:"use_ssl,omitempty"`
Domain string `json:"domain,omitempty"`
ThumbTemplate string `json:"thumb_template,omitempty"` // 缩略图模板,使用{width}和{height}作为变量占位符
}
type QiNiuOssConfig struct {
Zone string `json:"zone,omitempty"`
AccessKey string `json:"access_key,omitempty"`
AccessSecret string `json:"access_secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
Domain string `json:"domain,omitempty"`
Zone string `json:"zone,omitempty"`
AccessKey string `json:"access_key,omitempty"`
AccessSecret string `json:"access_secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
Domain string `json:"domain,omitempty"`
ThumbTemplate string `json:"thumb_template,omitempty"` // 缩略图模板,使用{width}和{height}作为变量占位符,默认:?imageView2/4/w/{width}/h/{height}/q/75
}
type AliYunOssConfig struct {
Endpoint string `json:"endpoint,omitempty"`
AccessKey string `json:"access_key,omitempty"`
AccessSecret string `json:"access_secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
Domain string `json:"domain,omitempty"`
Endpoint string `json:"endpoint,omitempty"`
AccessKey string `json:"access_key,omitempty"`
AccessSecret string `json:"access_secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
Domain string `json:"domain,omitempty"`
ThumbTemplate string `json:"thumb_template,omitempty"` // 缩略图模板,使用{width}和{height}作为变量占位符,默认:?x-oss-process=image/resize,m_lfit,w_{width},h_{height}
}
type LocalStorageConfig struct {
BasePath string `json:"base_path,omitempty"`
BaseURL string `json:"base_url,omitempty"`
BasePath string `json:"base_path,omitempty"`
BaseURL string `json:"base_url,omitempty"`
ThumbTemplate string `json:"thumb_template,omitempty"` // 缩略图模板,使用{width}和{height}作为变量占位符,默认:?imageView2/4/w/{width}/h/{height}/q/75
}
type TencentOssConfig struct {
Region string `json:"region,omitempty"`
SecretId string `json:"secret_id,omitempty"`
SecretKey string `json:"secret_key,omitempty"`
Bucket string `json:"bucket,omitempty"`
Domain string `json:"domain,omitempty"`
ThumbTemplate string `json:"thumb_template,omitempty"` // 缩略图模板,使用{width}和{height}作为变量占位符,默认:?imageView2/1/w/{width}/h/{height}/format/jpg
}
+47
View File
@@ -0,0 +1,47 @@
package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// PPTImageProvider PPT 图片生成提供方
type PPTImageProvider string
const (
PPTImageProviderNanoBanana PPTImageProvider = "nano_banana"
PPTImageProviderSeedream PPTImageProvider = "seedream"
)
// PPTConfig PPT 生成配置(存储在 config 表,name = 'ppt'
type PPTConfig struct {
// 分镜 LLM 配置
OutlineLLMApiURL string `json:"outline_llm_api_url"` // 分镜 LLM API 地址
OutlineLLMApiKey string `json:"outline_llm_api_key"` // 分镜 LLM API Key
OutlineLLMModel string `json:"outline_llm_model"` // 分镜 LLM 模型名称,如 gpt-4o-mini
// 图片生成通用配置
ActiveImageProvider PPTImageProvider `json:"active_image_provider"` // 当前启用的图片模型提供方
MaxSlidesPerTask int `json:"max_slides_per_task"` // 单个任务最多生成的 PPT 页数
PowerCostPerSlide int `json:"power_cost_per_slide"` // 每张 PPT 图片消耗的算力
MaxConcurrentRequests int `json:"max_concurrent_requests"` // 图片生成最大并发数
QPSLimit int `json:"qps_limit"` // 外部图片 API 的 QPS 限制
// Nano Banana 配置
NanoBananaApiURL string `json:"nano_banana_api_url"` // Nano Banana API 地址,如 https://xxx/v1/images/generations
NanoBananaApiKey string `json:"nano_banana_api_key"` // Nano Banana API Key
NanoBananaModel string `json:"nano_banana_model"` // 模型名称,如 nano-banana、nano-banana-hd
NanoBananaResponseFormat string `json:"nano_banana_response_format"` // 响应格式:url 或 b64_json
NanoBananaAspectRatio string `json:"nano_banana_aspect_ratio"` // 宽高比,如 1:1、4:3、16:9;空则默认 16:9
// Doubao Seedream 配置
SeedreamBaseURL string `json:"seedream_base_url"` // Seedream base url,例如:https://ark.cn-beijing.volces.com/api/v3
SeedreamApiKey string `json:"seedream_api_key"` // Seedream API KeyARK_API_KEY
SeedreamModel string `json:"seedream_model"` // Seedream 模型 ID,例如:doubao-seedream-5-0-260128
SeedreamSize string `json:"seedream_size"` // 图片尺寸 WxH(如 1920x1080)或 2K/4K 等;空则默认 1920x108016:9
SeedreamOutputFormat string `json:"seedream_output_format"` // 输出格式,例如:png
SeedreamResponseType string `json:"seedream_response_format"` // 响应格式,例如:url
SeedreamWatermark bool `json:"seedream_watermark"` // 是否开启水印
}
+14 -3
View File
@@ -8,9 +8,10 @@ package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
type SMSConfig struct {
Active string `json:"active,omitempty"`
Ali SmsConfigAli `json:"aliyun,omitempty"`
Bao SmsConfigBao `json:"bao,omitempty"`
Active string `json:"active,omitempty"`
Ali SmsConfigAli `json:"aliyun,omitempty"`
Bao SmsConfigBao `json:"bao,omitempty"`
Tencent SmsConfigTencent `json:"tencent,omitempty"`
}
// SmsConfigAli 阿里云短信平台配置
@@ -28,3 +29,13 @@ type SmsConfigBao struct {
Sign string `json:"sign,omitempty"` // 短信签名
CodeTemplate string `json:"code_template,omitempty"` // 验证码短信模板 匹配
}
// SmsConfigTencent 腾讯云短信平台配置
type SmsConfigTencent struct {
SecretId string `json:"secret_id,omitempty"` // 腾讯云 SecretId
SecretKey string `json:"secret_key,omitempty"` // 腾讯云 SecretKey
SmsSdkAppId string `json:"sms_sdk_app_id,omitempty"` // 短信应用ID
Sign string `json:"sign,omitempty"` // 短信签名
CodeTempId string `json:"code_temp_id,omitempty"` // 验证码短信模板ID
Region string `json:"region,omitempty"` // 地区,默认 ap-guangzhou
}
+20 -83
View File
@@ -20,6 +20,7 @@ const (
TaskSwapFace = TaskType("swapFace")
TaskUpscale = TaskType("upscale")
TaskVariation = TaskType("variation")
TaskModal = TaskType("modal") // 局部重绘
)
// MjTask MidJourney 任务
@@ -38,43 +39,17 @@ type MjTask struct {
ChannelId string `json:"channel_id"` // 渠道ID,用来区分是哪个渠道创建的任务,一个任务的 create 和 action 操作必须要再同一个渠道
Mode string `json:"mode"` // 绘画模式,relax, fast, turbo
TranslateModelId int `json:"translate_model_id"` // 提示词翻译模型ID
MaskBase64 string `json:"mask_base64,omitempty"` // 局部重绘蒙版 base64(仅 TaskModal 使用)
}
type SdTask struct {
Id int `json:"id"` // job 数据库ID
Type TaskType `json:"type"`
UserId int `json:"user_id"`
Params SdTaskParams `json:"params"`
RetryCount int `json:"retry_count"`
TranslateModelId int `json:"translate_model_id"` // 提示词翻译模型ID
}
type SdTaskParams struct {
TaskId string `json:"task_id"`
Prompt string `json:"prompt"` // 提示词
NegPrompt string `json:"neg_prompt"` // 反向提示词
Steps int `json:"steps"` // 迭代步数,默认20
Sampler string `json:"sampler"` // 采样器
Scheduler string `json:"scheduler"` // 采样调度
FaceFix bool `json:"face_fix"` // 面部修复
CfgScale float32 `json:"cfg_scale"` //引导系数,默认 7
Seed int64 `json:"seed"` // 随机数种子
Height int `json:"height"`
Width int `json:"width"`
HdFix bool `json:"hd_fix"` // 启用高清修复
HdRedrawRate float32 `json:"hd_redraw_rate"` // 高清修复重绘幅度
HdScale int `json:"hd_scale"` // 放大倍数
HdScaleAlg string `json:"hd_scale_alg"` // 放大算法
HdSteps int `json:"hd_steps"` // 高清修复迭代步数
}
// DallTask DALL-E task
type DallTask struct {
// ImageTask Image generation task
type ImageTask struct {
ModelId uint `json:"model_id"`
ModelName string `json:"model_name"`
ModelValue string `json:"model_value"`
Image []string `json:"image,omitempty"`
Id uint `json:"id"`
TaskId string `json:"task_id"` // Kapon 异步任务 ID,与 API 返回的 task_id 一致
UserId uint `json:"user_id"`
Prompt string `json:"prompt"`
AspectRatio string `json:"aspect_ratio"`
@@ -102,60 +77,22 @@ type SunoTask struct {
}
const (
VideoLuma = "luma"
VideoRunway = "runway"
VideoCog = "cog"
VideoKeLing = "keling"
VideoLuma = "luma"
VideoSora = "sora"
VideoVeo = "veo"
VideoKeLing = "keling"
VideoMiniMax = "minimax"
VideoWan = "wan"
VideoDoubao = "doubao"
)
type VideoTask struct {
Id uint `json:"id"`
Channel string `json:"channel"`
UserId int `json:"user_id"`
Type string `json:"type"`
TaskId string `json:"task_id"`
Prompt string `json:"prompt"` // 提示词
Params interface{} `json:"params"`
TranslateModelId int `json:"translate_model_id"` // 提示词翻译模型ID
}
type LumaVideoParams struct {
PromptOptimize bool `json:"prompt_optimize"` // 是否优化提示词
Loop bool `json:"loop"` // 是否循环参考图
StartImgURL string `json:"start_img_url"` // 第一帧参考图地址
EndImgURL string `json:"end_img_url"` // 最后一帧参考图地址
Model string `json:"model"` // 使用哪个模型生成视频
Radio string `json:"radio"` // 视频尺寸
Style string `json:"style"` // 风格
Duration int `json:"duration"` // 视频时长(秒)
}
type KeLingVideoParams struct {
TaskType string `json:"task_type"` // 任务类型: text2video/image2video
Model string `json:"model"` // 模型: default/anime
Prompt string `json:"prompt"` // 视频描述
NegPrompt string `json:"negative_prompt"` // 负面提示词
CfgScale float64 `json:"cfg_scale"` // 相关性系数(0-1)
Mode string `json:"mode"` // 生成模式: std/pro
AspectRatio string `json:"aspect_ratio"` // 画面比例: 16:9/9:16/1:1
Duration string `json:"duration"` // 视频时长: 5/10
CameraControl CameraControl `json:"camera_control"` // 摄像机控制
Image string `json:"image"` // 参考图片URL(image2video)
ImageTail string `json:"image_tail"` // 尾帧图片URL(image2video)
}
// CameraControl 摄像机控制
type CameraControl struct {
Type string `json:"type"` // 控制类型: simple/down_back/forward_up/right_turn_forward/left_turn_forward
Config CameraConfig `json:"config"` // 控制参数(仅simple类型时使用)
}
// CameraConfig 摄像机参数
type CameraConfig struct {
Horizontal int `json:"horizontal"` // 水平移动(-10到10)
Vertical int `json:"vertical"` // 垂直移动(-10到10)
Pan int `json:"pan"` // 左右旋转(-10到10)
Tilt int `json:"tilt"` // 上下旋转(-10到10)
Roll int `json:"roll"` // 横向翻转(-10到10)
Zoom int `json:"zoom"` // 镜头缩放(-10到10)
Id uint `json:"id"`
Channel string `json:"channel"`
UserId int `json:"user_id"`
Type string `json:"type"` // provider(不带版本号:veo, sora, luma
TaskId string `json:"task_id"`
Prompt string `json:"prompt"` // 提示词
Params any `json:"params"`
TranslateModelId int `json:"translate_model_id"` // 提示词翻译模型ID
}
+37
View File
@@ -0,0 +1,37 @@
package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// VideoConfig 视频生成配置(存储在 config 表,name = 'video'
type VideoConfig struct {
ApiURL string `json:"api_url"` // API 地址
ApiKey string `json:"api_key"` // API 密钥
VideoPowers map[string]VideoModelPower `json:"video_powers"` // 模型算力配置
}
// VideoModelPower 单个模型的算力配置
// PowerConfig 说明:
// 新的价格配置方式:根据模型的 priceParams 生成笛卡尔乘积,每个组合对应一个价格
// 固定价格示例:{"fixed": 20}
// 多参数组合示例:{"5_720P": 10, "5_1080P": 20, "10_720P": 10, "10_1080P": 40}
// 复杂组合示例:{"std_5_sound": 10, "std_5_silent": 5, "pro_10_sound": 20, "pro_10_silent": 10}
type VideoModelPower struct {
Provider string `json:"provider"` // 服务提供商(不带版本号:veo, sora, luma
Model string `json:"model"` // 模型名称(带版本号:veo-2.0, sora-2.0
PowerConfig map[string]int `json:"power_config"` // 算力配置(基于 priceParams 的笛卡尔乘积)
ApiKeyType string `json:"api_key_type"` // ApiKey 表的 type 字段(可选,用于多 API Key 场景)
}
// 视频任务状态常量
const (
VideoStatusPending = "pending" // 等待处理
VideoStatusInProgress = "in_progress" // 处理中
VideoStatusDownloading = "downloading" // 视频下载中
VideoStatusSuccess = "success" // 成功
VideoStatusFailed = "failed" // 失败
)
+2 -3
View File
@@ -36,9 +36,8 @@ const (
ChPing = WsChannel("ping")
ChChat = WsChannel("chat")
ChMj = WsChannel("mj")
ChSd = WsChannel("sd")
ChDall = WsChannel("dall")
ChMj = WsChannel("mj")
ChImage = WsChannel("image")
ChSuno = WsChannel("suno")
ChLuma = WsChannel("luma")
ChKeLing = WsChannel("keling")