77 "encoding/json"
88 "os"
99 "path/filepath"
10+ "time"
1011
1112 "github.com/gin-gonic/gin"
1213 "oadin/extension/api/dto"
@@ -17,6 +18,7 @@ import (
1718 "oadin/internal/types"
1819 dto2 "oadin/internal/api/dto"
1920 "oadin/internal/logger"
21+ provider2 "oadin/internal/provider"
2022)
2123
2224type EngineApi struct {
@@ -71,6 +73,32 @@ func (e *EngineApi) install(c *gin.Context) {
7173 dto .Success (c , "引擎安装成功" )
7274}
7375
76+ func waitEngineReady (modelEngine provider2.ModelServiceProvider ) error {
77+ // 启动成功后,增加就绪检测,启动后轮询健康检查直到成功或超时,再返回。这样接口只在服务就绪时响应
78+ const (
79+ maxWait = 5 * time .Second
80+ interval = 200 * time .Millisecond
81+ )
82+ start := time .Now ()
83+ for {
84+ err := modelEngine .HealthCheck ()
85+ if err == nil {
86+ break
87+ }
88+ if time .Since (start ) >= maxWait {
89+ break
90+ }
91+ time .Sleep (interval )
92+ }
93+
94+ err := modelEngine .HealthCheck ()
95+ if err != nil {
96+ logger .EngineLogger .Error ("waitEngineReady: Failed to start engine." )
97+ return err
98+ }
99+ return nil
100+ }
101+
74102// 根据引擎名称下载引擎,流式返回下载进度
75103func (e * EngineApi ) DownloadStreamEngine (c * gin.Context ) {
76104 request := dto.EngineDownloadRequest {}
@@ -113,12 +141,21 @@ func (e *EngineApi) DownloadStreamEngine(c *gin.Context) {
113141 err = modelEngine .InitEnv ()
114142 if err != nil {
115143 res .Status = "error"
144+ res .Data = "init env error"
116145 logger .EngineLogger .Error ("DownloadStreamEngine InitEnv error 1: " , err )
117146 } else {
118147 err = modelEngine .StartEngine (types .EngineStartModeDaemon )
119148 if err != nil {
120149 res .Status = "error"
150+ res .Data = "start engine error"
121151 logger .EngineLogger .Error ("DownloadStreamEngine StartEngine error 1: " , err )
152+ } else {
153+ err = waitEngineReady (modelEngine )
154+ if err != nil {
155+ res .Status = "error"
156+ res .Data = "engine not ready error"
157+ logger .EngineLogger .Error ("DownloadStreamEngine waitEngineReady error 1: " , err )
158+ }
122159 }
123160 }
124161 }
@@ -148,12 +185,21 @@ func (e *EngineApi) DownloadStreamEngine(c *gin.Context) {
148185 err = modelEngine .InitEnv ()
149186 if err != nil {
150187 res .Status = "error"
188+ res .Data = "init env error"
151189 logger .EngineLogger .Error ("DownloadStreamEngine InitEnv error 2: " , err )
152190 } else {
153191 err = modelEngine .StartEngine (types .EngineStartModeDaemon )
154192 if err != nil {
155193 res .Status = "error"
194+ res .Data = "start engine error"
156195 logger .EngineLogger .Error ("DownloadStreamEngine StartEngine error 2: " , err )
196+ } else {
197+ err = waitEngineReady (modelEngine )
198+ if err != nil {
199+ res .Status = "error"
200+ res .Data = "engine not ready error"
201+ logger .EngineLogger .Error ("DownloadStreamEngine waitEngineReady error 2: " , err )
202+ }
157203 }
158204 }
159205 }
0 commit comments