Return partial search results before proxy timeout
build-push / docker (push) Successful in 4m26s

This commit is contained in:
AI Assistant
2026-03-16 15:17:25 +09:00
parent f5d03627be
commit 4133b9cd4d
5 changed files with 61 additions and 11 deletions
+9 -5
View File
@@ -383,6 +383,7 @@ func (a *App) runDownload(recordID int64, url, start, end, quality, outputPath s
func (a *App) searchMedia(c *gin.Context) {
started := time.Now()
deadline := started.Add(45 * time.Second)
var req struct {
Query string `json:"query"`
Platforms []string `json:"platforms"`
@@ -411,7 +412,7 @@ func (a *App) searchMedia(c *gin.Context) {
enabledPlatforms := normalizePlatforms(req.Platforms)
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "searching " + selectedPlatformLabel(enabledPlatforms), "progress": 35})
results, err := a.SearchService.SearchMedia(queryVariants, enabledPlatforms)
results, err := a.SearchService.SearchMediaWithDeadline(queryVariants, enabledPlatforms, deadline.Add(-20*time.Second))
if err != nil {
a.debug("search backend failed", gin.H{"error": err.Error(), "variants": queryVariants, "durationMs": time.Since(started).Milliseconds()})
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "search failed", "progress": 100, "message": err.Error()})
@@ -434,16 +435,16 @@ func (a *App) searchMedia(c *gin.Context) {
scored := services.RankSearchResults(rankQuery, results)
a.debug("search ranked summary", summarizeSearchResults(scored, time.Since(started), services.GeminiCandidateLimit(len(scored)), ""))
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "analyzing all candidate visuals with Gemini Vision", "progress": 75})
recommended, geminiStats, geminiErr := services.EvaluateAllCandidatesWithGemini(a.GeminiService, req.Query, scored)
recommended, geminiStats, geminiErr := services.EvaluateAllCandidatesWithGeminiWithDeadline(a.GeminiService, req.Query, scored, deadline.Add(-5*time.Second))
a.debug("search gemini evaluation", geminiStats)
if services.NeedsSupplementalExploration(recommended) {
if services.NeedsSupplementalExploration(recommended) && time.Now().Before(deadline.Add(-10*time.Second)) {
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "Gemini 평가가 약해 추가 후보를 탐색하는 중", "progress": 82})
explorationQueries := buildSupplementalQueries(req.Query, queryVariants)
extraResults, extraErr := a.SearchService.SearchMedia(explorationQueries, enabledPlatforms)
extraResults, extraErr := a.SearchService.SearchMediaWithDeadline(explorationQueries, enabledPlatforms, deadline.Add(-10*time.Second))
if extraErr == nil && len(extraResults) > 0 {
results = mergeSearchResults(results, extraResults)
scored = services.RankSearchResults(strings.Join(explorationQueries[:min(len(explorationQueries), 3)], " "), results)
recommended, geminiStats, geminiErr = services.EvaluateAllCandidatesWithGemini(a.GeminiService, req.Query, scored)
recommended, geminiStats, geminiErr = services.EvaluateAllCandidatesWithGeminiWithDeadline(a.GeminiService, req.Query, scored, deadline.Add(-3*time.Second))
a.debug("search supplemental query variants", gin.H{"variants": explorationQueries, "variantCount": len(explorationQueries)})
a.debug("search gemini evaluation after supplemental search", geminiStats)
}
@@ -476,6 +477,9 @@ func (a *App) searchMedia(c *gin.Context) {
if warning != "" {
response["warning"] = warning
}
if time.Now().After(deadline.Add(-2*time.Second)) && warning == "" {
response["warning"] = "search returned partial results to avoid gateway timeout"
}
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "search complete", "progress": 100})
c.JSON(http.StatusOK, response)
}