From 526390816b32e4e1f0135e325c0e147decce09a4 Mon Sep 17 00:00:00 2001 From: Liujian <824010343@qq.com> Date: Wed, 8 Jan 2025 11:11:41 +0800 Subject: [PATCH] update package script --- app/ai-event-handler/main.go | 13 +++++-- app/ai-event-handler/nsq.go | 17 +++++++++ gateway/profession.go | 2 +- module/ai-key/iml.go | 6 +-- module/ai/iml.go | 69 ++++++++++++++++++++++------------ scripts/Dockerfile | 3 ++ scripts/build.sh | 9 +++++ scripts/resource/docker_run.sh | 7 +++- scripts/resource/run.sh | 3 +- service/ai-api/iml.go | 2 +- 10 files changed, 96 insertions(+), 35 deletions(-) diff --git a/app/ai-event-handler/main.go b/app/ai-event-handler/main.go index 7fa9271a..f768a7d7 100644 --- a/app/ai-event-handler/main.go +++ b/app/ai-event-handler/main.go @@ -42,10 +42,15 @@ func main() { log.Fatal("check autowired:", err) return } - // 2. 创建 NSQ 消费者 config := nsq.NewConfig() - consumer, err := nsq.NewConsumer("ai_event", "tmp", config) + hostname, err := os.Hostname() + if err != nil { + log.Fatalf("Failed to get hostname: %v", err) + return + } + nsqConfig := handler.nsqConfig + consumer, err := nsq.NewConsumer(fmt.Sprintf("%s_ai_event", nsqConfig.TopicPrefix), hostname, config) if err != nil { log.Fatalf("Failed to create NSQ consumer: %v", err) } @@ -53,8 +58,8 @@ func main() { consumer.AddHandler(handler) // 4. 连接到 NSQ - nsqAddress := "172.18.166.219:9150" // NSQ 地址 - err = consumer.ConnectToNSQD(nsqAddress) + //nsqAddress := "172.18.166.219:9150" // NSQ 地址 + err = consumer.ConnectToNSQD(nsqConfig.Addr) if err != nil { log.Fatalf("Failed to connect to NSQ: %v", err) } diff --git a/app/ai-event-handler/nsq.go b/app/ai-event-handler/nsq.go index 2611a3d1..f8e9e03c 100644 --- a/app/ai-event-handler/nsq.go +++ b/app/ai-event-handler/nsq.go @@ -7,6 +7,8 @@ import ( "strings" "time" + "github.com/eolinker/go-common/cftool" + ai_dto "github.com/APIParkLab/APIPark/module/ai/dto" "github.com/eolinker/go-common/store" @@ -20,6 +22,15 @@ import ( ai_api "github.com/APIParkLab/APIPark/service/ai-api" ) +func init() { + cftool.Register[NSQConfig]("nsq") +} + +type NSQConfig struct { + Addr string `json:"addr"` + TopicPrefix string `json:"topic_prefix"` +} + // 定义 NSQ 消息结构 type AIProviderStatus struct { Provider string `json:"provider"` @@ -52,6 +63,7 @@ type NSQHandler struct { aiKeyService ai_key.IKeyService `autowired:""` aiService ai.IProviderService `autowired:""` transaction store.ITransaction `autowired:""` + nsqConfig *NSQConfig `autowired:""` ctx context.Context } @@ -107,6 +119,11 @@ func (h *NSQHandler) HandleMessage(message *nsq.Message) error { err = h.aiService.Save(ctx, s.Provider, &ai.SetProvider{ Status: &pStatus, }) + } else { + pStatus := ai_dto.ProviderEnabled.Int() + err = h.aiService.Save(ctx, s.Provider, &ai.SetProvider{ + Status: &pStatus, + }) } finalStatus = &s } diff --git a/gateway/profession.go b/gateway/profession.go index 4c812778..16956421 100644 --- a/gateway/profession.go +++ b/gateway/profession.go @@ -63,7 +63,7 @@ var dynamicResourceMap = map[string]Worker{ Driver: "loki", }, "ai-provider": { - Profession: ProfessionAIProvider, + Profession: ProfessionAIResource, Driver: "ai-provider", }, "ai-key": { diff --git a/module/ai-key/iml.go b/module/ai-key/iml.go index df6b331a..21cf216e 100644 --- a/module/ai-key/iml.go +++ b/module/ai-key/iml.go @@ -42,7 +42,7 @@ func newKey(key *ai_key.Key) *gateway.DynamicRelease { return &gateway.DynamicRelease{ BasicItem: &gateway.BasicItem{ - ID: key.ID, + ID: fmt.Sprintf("%s-%s", key.Provider, key.ID), Description: key.Name, Resource: "ai-key", Version: time.Now().Format("20060102150405"), @@ -55,7 +55,7 @@ func newKey(key *ai_key.Key) *gateway.DynamicRelease { "config": key.Config, "provider": key.Provider, "priority": key.Priority, - "disabled": key.Status == 1, + "disabled": key.Status == 0, }, } } @@ -243,7 +243,7 @@ func (i *imlKeyModule) Delete(ctx context.Context, providerId string, id string) } return i.syncGateway(ctx, cluster.DefaultClusterID, []*gateway.DynamicRelease{{ BasicItem: &gateway.BasicItem{ - ID: id, + ID: fmt.Sprintf("%s-%s", providerId, id), Resource: "ai-key", }, Attr: nil, diff --git a/module/ai/iml.go b/module/ai/iml.go index 88e73454..0e4b9a50 100644 --- a/module/ai/iml.go +++ b/module/ai/iml.go @@ -33,7 +33,7 @@ func newKey(key *ai_key.Key) *gateway.DynamicRelease { return &gateway.DynamicRelease{ BasicItem: &gateway.BasicItem{ - ID: key.ID, + ID: fmt.Sprintf("%s-%s", key.Provider, key.ID), Description: key.Name, Resource: "ai-key", Version: time.Now().Format("20060102150405"), @@ -46,7 +46,7 @@ func newKey(key *ai_key.Key) *gateway.DynamicRelease { "config": key.Config, "provider": key.Provider, "priority": key.Priority, - "disabled": key.Status == 1, + "disabled": key.Status == 0, }, } } @@ -85,6 +85,7 @@ func (i *imlProviderModule) Sort(ctx context.Context, input *ai_dto.Sort) error return e.Id }) releases := make([]*gateway.DynamicRelease, 0, len(list)) + offlineReleases := make([]*gateway.DynamicRelease, 0, len(list)) for index, id := range input.Providers { p, has := model_runtime.GetProvider(id) if !has { @@ -106,30 +107,39 @@ func (i *imlProviderModule) Sort(ctx context.Context, input *ai_dto.Sort) error if err != nil { return err } - cfg := make(map[string]interface{}) - cfg["provider"] = l.Id - cfg["model"] = l.DefaultLLM - cfg["model_config"] = model.DefaultConfig() - cfg["priority"] = l.Priority - cfg["base"] = fmt.Sprintf("%s://%s", p.URI().Scheme(), p.URI().Host()) - releases = append(releases, &gateway.DynamicRelease{ - BasicItem: &gateway.BasicItem{ - ID: l.Id, - Description: l.Name, - Resource: "ai-provider", - Version: l.UpdateAt.Format("20060102150405"), - MatchLabels: map[string]string{ - "module": "ai-provider", + if ai_dto.ToProviderStatus(l.Status) == ai_dto.ProviderDisabled { + offlineReleases = append(offlineReleases, &gateway.DynamicRelease{ + BasicItem: &gateway.BasicItem{ + ID: l.Id, + Resource: "ai-provider", + }}) + } else { + cfg := make(map[string]interface{}) + cfg["provider"] = l.Id + cfg["model"] = l.DefaultLLM + cfg["model_config"] = model.DefaultConfig() + cfg["priority"] = l.Priority + cfg["base"] = fmt.Sprintf("%s://%s", p.URI().Scheme(), p.URI().Host()) + releases = append(releases, &gateway.DynamicRelease{ + BasicItem: &gateway.BasicItem{ + ID: l.Id, + Description: l.Name, + Resource: "ai-provider", + Version: l.UpdateAt.Format("20060102150405"), + MatchLabels: map[string]string{ + "module": "ai-provider", + }, }, - }, - Attr: cfg, - }) - err = i.syncGateway(ctx, cluster.DefaultClusterID, releases, true) - if err != nil { - return err + Attr: cfg, + }) } } - return nil + err = i.syncGateway(ctx, cluster.DefaultClusterID, releases, true) + if err != nil { + return err + } + return i.syncGateway(ctx, cluster.DefaultClusterID, offlineReleases, false) + }) } @@ -537,6 +547,7 @@ func (i *imlProviderModule) UpdateProviderConfig(ctx context.Context, id string, Status: 1, ExpireTime: 0, Default: true, + Priority: 1, }) } else { err = i.aiKeyService.Save(ctx, id, &ai_key.Edit{ @@ -558,6 +569,16 @@ func (i *imlProviderModule) UpdateProviderConfig(ctx context.Context, id string, if err != nil { return err } + if *pInfo.Status == 0 { + return i.syncGateway(ctx, cluster.DefaultClusterID, []*gateway.DynamicRelease{ + { + BasicItem: &gateway.BasicItem{ + ID: id, + Resource: "ai-provider", + }, + }, + }, false) + } // 获取当前供应商所有Key信息 defaultKey, err := i.aiKeyService.DefaultKey(ctx, id) if err != nil { @@ -665,7 +686,7 @@ func (i *imlProviderModule) syncGateway(ctx context.Context, clusterId string, r if online { err = dynamicClient.Online(ctx, releaseInfo) } else { - err = dynamicClient.Offline(ctx, releaseInfo) + dynamicClient.Offline(ctx, releaseInfo) } if err != nil { return err diff --git a/scripts/Dockerfile b/scripts/Dockerfile index f78900c8..71b5c4e3 100755 --- a/scripts/Dockerfile +++ b/scripts/Dockerfile @@ -8,6 +8,9 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ARG APP +ENV NSQ_ADDR=nsq:4150 +ENV NSQ_TOPIC_PREFIX=apipark + RUN mkdir -p /${APP} COPY cmd/* /${APP}/ diff --git a/scripts/build.sh b/scripts/build.sh index 47747583..0b6c85dc 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -8,6 +8,8 @@ source ./scripts/common.sh OUTPUT_DIR=$(mkdir_output "$1") APP="apipark" OUTPUT_BIN="${OUTPUT_DIR}/${APP}" +AI_EVENT_LISTEN_APP="apipark_ai_event_listen" +AI_EVENT_LISTEN_BIN="${OUTPUT_DIR}/${AI_EVENT_LISTEN_APP}" VERSION=$(gen_version "$2") BUILD_TYPE=$3 ARCH=$4 @@ -104,6 +106,10 @@ build_backend() { # -ldflags="-w -s" means omit DWARF symbol table and the symbol table and debug information echo "GOOS=linux GOARCH=$ARCH CGO_ENABLED=0 go build $Tags -ldflags \"-w -s $flags\" -o \"${OUTPUT_BIN}\"" GOOS=linux GOARCH=$ARCH CGO_ENABLED=0 go build ${Tags} -ldflags "-w -s $flags" -o ${OUTPUT_BIN} + + echo "Build backend successfully..." + echo "GOOS=linux GOARCH=$ARCH CGO_ENABLED=0 go build -ldflags \"-w -s\" -o \"${AI_EVENT_LISTEN_BIN}\" ./app/ai-event-handler" + GOOS=linux GOARCH=$ARCH CGO_ENABLED=0 go build -ldflags "-w -s" -o "${AI_EVENT_LISTEN_BIN}" ./app/ai-event-handler return } @@ -123,6 +129,9 @@ package() { cp "${OUTPUT_BIN}" "${PACKAGE_DIR}" + echo "cp ${AI_EVENT_LISTEN_BIN} ${PACKAGE_DIR}" + cp "${AI_EVENT_LISTEN_BIN}" "${PACKAGE_DIR}" + echo "tar -czvf ${PACKAGE_DIR}_linux_${ARCH}.tar.gz -C ${PACKAGE_DIR}/ ./" tar -czvf "${PACKAGE_DIR}_linux_${ARCH}.tar.gz" -C "${PACKAGE_DIR}/" "./" # rm -fr "${PACKAGE_DIR}" diff --git a/scripts/resource/docker_run.sh b/scripts/resource/docker_run.sh index 53d3d711..caaac971 100755 --- a/scripts/resource/docker_run.sh +++ b/scripts/resource/docker_run.sh @@ -21,6 +21,9 @@ echo -e "redis:" >> config.yml echo -e " user_name: ${REDIS_USER_NAME}" >> config.yml echo -e " password: ${REDIS_PWD}" >> config.yml echo -e " addr: " >> config.yml +echo -e "nsq:" >> config.yml +echo -e " addr: ${NSQ_ADDR}" >> config.yml +echo -e " topic: ${NSQ_TOPIC}" >> config.yml for s in ${arr[@]} do echo -e " - $s" >> config.yml @@ -34,4 +37,6 @@ echo -e " log_expire: ${ERROR_EXPIRE}" >> config.yml echo -e " log_period: ${ERROR_PERIOD}" >> config.yml cat config.yml -./apipark \ No newline at end of file +nohup ./apipark >> run.log 2>&1 & +nohup ./apipark_ai_event_listen >> run.log 2>&1 & +tail -F run.log \ No newline at end of file diff --git a/scripts/resource/run.sh b/scripts/resource/run.sh index cc998bd9..6aff686b 100755 --- a/scripts/resource/run.sh +++ b/scripts/resource/run.sh @@ -42,7 +42,8 @@ start() { cat "$LOG_FILE" exit 1 fi - + # 启动ai事件监听程序 +# nohup ./apipark_ai_event_listen >> "$LOG_FILE" 2>&1 & } # 停止函数 diff --git a/service/ai-api/iml.go b/service/ai-api/iml.go index 97ffbe31..b59a004e 100644 --- a/service/ai-api/iml.go +++ b/service/ai-api/iml.go @@ -35,7 +35,7 @@ func (i *imlAPIService) OnComplete() { } func labelHandler(e *api.AiAPIInfo) []string { - return []string{e.Name} + return []string{e.Name, e.Path} } func uniquestHandler(i *Create) []map[string]interface{} { return []map[string]interface{}{{"uuid": i.ID}}