Skip to content

Commit fe04feb

Browse files
committed
feat: ollama后台启动,Run()会一直卡住,只能用Start()
1 parent 0115e06 commit fe04feb

3 files changed

Lines changed: 54 additions & 4 deletions

File tree

extension/api/engine_manage_api.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
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

2224
type 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
// 根据引擎名称下载引擎,流式返回下载进度
75103
func (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
}

internal/provider/engine/llamacpp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ func (l *llamacppProvider) StartEngine(mode string) error {
222222
LlamaSwapConfigFilePath := filepath.Join(l.EngineConfig.ExecPath, LlamaSwapConfigFile)
223223
logger.EngineLogger.Info("[llamacpp] exec file path: ", execFile, l.EngineConfig.Host, LlamaSwapConfigFilePath)
224224
cmd := exec.Command(execFile, "-listen", l.EngineConfig.Host, "-config", LlamaSwapConfigFilePath)
225-
err := cmd.Run()
225+
err := cmd.Start()
226226
if err != nil {
227227
logger.EngineLogger.Error("[llamacpp] failed to start llamacpp-server: " + err.Error())
228228
return fmt.Errorf("failed to start llamacpp-server: %v", err)

internal/provider/engine/ollama.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (o *OllamaProvider) StartEngine(mode string) error {
164164
if runtime.GOOS == "windows" {
165165
utils.SetCmdSysProcAttr(cmd)
166166
}
167-
err := cmd.Run()
167+
err := cmd.Start()
168168
if err != nil {
169169
logger.EngineLogger.Error("[Ollama] failed to start ollama: " + err.Error())
170170
return fmt.Errorf("failed to start ollama: %v", err)
@@ -181,13 +181,17 @@ func (o *OllamaProvider) StartEngine(mode string) error {
181181
logger.EngineLogger.Error("[Ollama] failed to write pid file: " + err.Error())
182182
return fmt.Errorf("failed to write pid file: %v", err)
183183
}
184+
185+
go func() {
186+
cmd.Wait()
187+
}()
184188
} else {
185189
if utils.IpexOllamaSupportGPUStatus() {
186190
cmd := exec.Command(o.EngineConfig.ExecPath + "/" + OllamaBatchFile)
187191
if runtime.GOOS == "windows" {
188192
utils.SetCmdSysProcAttr(cmd)
189193
}
190-
err := cmd.Run()
194+
err := cmd.Start()
191195
if err != nil {
192196
logger.EngineLogger.Error("[Ollama] failed to start ollama: " + err.Error())
193197
return fmt.Errorf("failed to start ollama: %v", err)
@@ -197,7 +201,7 @@ func (o *OllamaProvider) StartEngine(mode string) error {
197201
if runtime.GOOS == "windows" {
198202
utils.SetCmdSysProcAttr(cmd)
199203
}
200-
err := cmd.Run()
204+
err := cmd.Start()
201205
if err != nil {
202206
logger.EngineLogger.Error("[Ollama] failed to start ollama: " + err.Error())
203207
return fmt.Errorf("failed to start ollama: %v", err)

0 commit comments

Comments
 (0)