msyql 容器化, aichatservice 容器化
This commit is contained in:
@@ -1,17 +1,10 @@
|
||||
# 编译阶段
|
||||
FROM quay.io/0voice/golang:1.20 as stage0
|
||||
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
|
||||
ADD ./ /src/ai-chat-service
|
||||
WORKDIR /src/ai-chat-service
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ai-chat-service ./chat-server
|
||||
|
||||
FROM quay.io/0voice/alpine:3.18 as stage1
|
||||
FROM alpine:3.18
|
||||
ADD ./grpc_health_probe-linux-amd64 /usr/bin/grpc_health_probe
|
||||
RUN chmod +x /usr/bin/grpc_health_probe
|
||||
MAINTAINER nick
|
||||
LABEL maintainer="nick"
|
||||
WORKDIR /app/
|
||||
ADD ./dev.config.yaml /app/config.yaml
|
||||
COPY --from=stage0 /src/ai-chat-service/ai-chat-service ./
|
||||
COPY ./ai-chat-service-bin ./ai-chat-service
|
||||
COPY ./docker.config.yaml /app/config.yaml
|
||||
# 指定入口程序
|
||||
ENTRYPOINT ["./ai-chat-service"]
|
||||
# 指定容器的启动命令或者入口程序的参数
|
||||
|
||||
BIN
ai-chat-service/ai-chat-service-bin
Executable file
BIN
ai-chat-service/ai-chat-service-bin
Executable file
Binary file not shown.
54
ai-chat-service/docker.config.yaml
Normal file
54
ai-chat-service/docker.config.yaml
Normal file
@@ -0,0 +1,54 @@
|
||||
server:
|
||||
ip: 0.0.0.0
|
||||
port: 50055
|
||||
accessToken: "me256487ang1chubdpdialoud22sev1ozhoguumyqca"
|
||||
log:
|
||||
level: "info"
|
||||
logPath: "runtime/logs/app.log"
|
||||
chat:
|
||||
api_key: "sk-8NMdsGbDAMpWdd6hrKHepr1tNVXTy2QppKAqJkoJcHd6TYLs"
|
||||
base_url: "https://api.moonshot.cn/v1"
|
||||
model: "kimi-k2.5"
|
||||
max_tokens: 4096
|
||||
temperature: 1
|
||||
top_p: 0.95
|
||||
presence_penalty: 0
|
||||
frequency_penalty: 0
|
||||
bot_desc: "你是一个AI助手,我需要你模拟一名资深的软件工程师来回答我的问题"
|
||||
min_response_tokens: 600
|
||||
context_ttl: 1800
|
||||
context_len: 4
|
||||
redis:
|
||||
host: "host.docker.internal"
|
||||
port: 8888
|
||||
pwd: "123456"
|
||||
mysql:
|
||||
dsn: "root:root@tcp(mysql:3306)/ai_chat?collation=utf8mb4_unicode_ci&charset=utf8mb4"
|
||||
maxLifeTime: 3600
|
||||
maxOpenConn: 10
|
||||
maxIdleConn: 10
|
||||
dependOn:
|
||||
sensitive:
|
||||
address: "sensitive-filter:50053"
|
||||
accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
|
||||
keywords:
|
||||
address: "keywords-filter:50054"
|
||||
accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
|
||||
tokenizer:
|
||||
address: "http://tokenizer:3002"
|
||||
vector:
|
||||
provider: "pgvector"
|
||||
threshold: 0.99
|
||||
pgvector:
|
||||
dsn: "postgres://postgres:postgres@pgvector:5432/ai_chat?sslmode=disable"
|
||||
table: "chat_record_vectors"
|
||||
dimensions: 1024
|
||||
maxLifeTime: 3600
|
||||
maxOpenConn: 10
|
||||
maxIdleConn: 10
|
||||
embedding:
|
||||
provider: "openai-compatible"
|
||||
base_url: "https://open.bigmodel.cn/api/paas/v4"
|
||||
api_key: "d51b903546814cc9981d3649a4a899a3.NQOtz3ocRtQwimh9"
|
||||
model: "embedding-2"
|
||||
timeout: 10
|
||||
@@ -1,11 +1,7 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
@@ -102,7 +98,6 @@ type Config struct {
|
||||
var conf *Config
|
||||
|
||||
func InitConfig(filePath string, typ ...string) {
|
||||
loadProjectDotEnv(filePath)
|
||||
v := viper.New()
|
||||
v.SetConfigFile(filePath)
|
||||
if len(typ) > 0 {
|
||||
@@ -171,83 +166,4 @@ func normalizeConfig(conf *Config) {
|
||||
if conf.Embedding.Timeout == 0 {
|
||||
conf.Embedding.Timeout = 10
|
||||
}
|
||||
overrideChatFromEnv(conf)
|
||||
overrideEmbeddingFromEnv(conf)
|
||||
}
|
||||
|
||||
func overrideChatFromEnv(conf *Config) {
|
||||
if value := os.Getenv("AI_CHAT_OPENAI_BASE_URL"); value != "" {
|
||||
conf.Chat.BaseUrl = value
|
||||
} else if value := os.Getenv("OPENAI_BASE_URL"); value != "" {
|
||||
conf.Chat.BaseUrl = value
|
||||
}
|
||||
|
||||
if value := os.Getenv("AI_CHAT_OPENAI_MODEL"); value != "" {
|
||||
conf.Chat.Model = value
|
||||
} else if value := os.Getenv("OPENAI_MODEL"); value != "" {
|
||||
conf.Chat.Model = value
|
||||
}
|
||||
|
||||
if value := os.Getenv("AI_CHAT_OPENAI_API_KEY"); value != "" {
|
||||
conf.Chat.ApiKey = value
|
||||
return
|
||||
}
|
||||
if value := os.Getenv("OPENAI_API_KEY"); value != "" {
|
||||
conf.Chat.ApiKey = value
|
||||
return
|
||||
}
|
||||
if value := os.Getenv("MOONSHOT_API_KEY"); value != "" {
|
||||
conf.Chat.ApiKey = value
|
||||
}
|
||||
}
|
||||
|
||||
func overrideEmbeddingFromEnv(conf *Config) {
|
||||
if value := os.Getenv("AI_CHAT_EMBEDDING_BASE_URL"); value != "" {
|
||||
conf.Embedding.BaseUrl = value
|
||||
}
|
||||
if value := os.Getenv("AI_CHAT_EMBEDDING_MODEL"); value != "" {
|
||||
conf.Embedding.Model = value
|
||||
}
|
||||
if value := os.Getenv("AI_CHAT_EMBEDDING_API_KEY"); value != "" {
|
||||
conf.Embedding.ApiKey = value
|
||||
return
|
||||
}
|
||||
if value := os.Getenv("ZAI_API_KEY"); value != "" {
|
||||
conf.Embedding.ApiKey = value
|
||||
}
|
||||
}
|
||||
|
||||
func loadProjectDotEnv(configFilePath string) {
|
||||
projectRoot := filepath.Dir(filepath.Dir(configFilePath))
|
||||
loadDotEnvFile(filepath.Join(projectRoot, ".env"))
|
||||
}
|
||||
|
||||
func loadDotEnvFile(path string) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := strings.TrimSpace(scanner.Text())
|
||||
if line == "" || strings.HasPrefix(line, "#") {
|
||||
continue
|
||||
}
|
||||
key, value, ok := strings.Cut(line, "=")
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
key = strings.TrimSpace(key)
|
||||
value = strings.TrimSpace(value)
|
||||
value = strings.Trim(value, `"'`)
|
||||
if key == "" {
|
||||
continue
|
||||
}
|
||||
if _, exists := os.LookupEnv(key); exists {
|
||||
continue
|
||||
}
|
||||
_ = os.Setenv(key, value)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user