fix: 搜索走 SearXNG + 工具调用分页修复
- ai-core DevTools 启动配置补充 SEARXNG_URL,避免回退到 DuckDuckGo 导致超时 - 工具调用 API 加入 offset 分页,修复 page 参数不生效问题 - 响应新增 total_pages 字段,修复前端分页栏不渲染 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -397,19 +397,25 @@ func main() {
|
||||
if limit > 500 {
|
||||
limit = 500
|
||||
}
|
||||
calls := toolRegistry.GetCallLogs(toolName, limit)
|
||||
if calls == nil {
|
||||
calls = []plgManager.CallLogRecord{}
|
||||
}
|
||||
page, _ := strconv.Atoi(r.URL.Query().Get("page"))
|
||||
page, _ := strconv.Atoi(r.URL.Query().Get("page"))
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
offset := (page - 1) * limit
|
||||
calls, total := toolRegistry.GetCallLogs(toolName, limit, offset)
|
||||
if calls == nil {
|
||||
calls = []plgManager.CallLogRecord{}
|
||||
}
|
||||
totalPages := total / limit
|
||||
if total%limit != 0 {
|
||||
totalPages++
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"calls": calls, "total": len(calls), "page": page, "limit": limit,
|
||||
"calls": calls, "total": total, "total_pages": totalPages,
|
||||
"page": page, "limit": limit,
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
// 工具调用统计
|
||||
mux.HandleFunc("/api/v1/tools/calls/stats", func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
@@ -230,25 +230,35 @@ func (r *ToolRegistry) UnregisterAll(toolIDs []string) {
|
||||
}
|
||||
}
|
||||
|
||||
// GetCallLogs 获取工具调用记录(最新在前,支持按工具名过滤)
|
||||
func (r *ToolRegistry) GetCallLogs(toolName string, limit int) []CallLogRecord {
|
||||
// GetCallLogs 获取工具调用记录(最新在前,支持按工具名过滤、分页)
|
||||
func (r *ToolRegistry) GetCallLogs(toolName string, limit, offset int) ([]CallLogRecord, int) {
|
||||
all := r.callLog.getAll()
|
||||
|
||||
// 过滤
|
||||
var filtered []CallLogRecord
|
||||
if toolName == "" {
|
||||
if limit > 0 && limit < len(all) {
|
||||
return all[:limit]
|
||||
}
|
||||
return all
|
||||
}
|
||||
filtered := make([]CallLogRecord, 0)
|
||||
for _, rec := range all {
|
||||
if rec.ToolName == toolName {
|
||||
filtered = append(filtered, rec)
|
||||
if limit > 0 && len(filtered) >= limit {
|
||||
break
|
||||
filtered = all
|
||||
} else {
|
||||
filtered = make([]CallLogRecord, 0)
|
||||
for _, rec := range all {
|
||||
if rec.ToolName == toolName {
|
||||
filtered = append(filtered, rec)
|
||||
}
|
||||
}
|
||||
}
|
||||
return filtered
|
||||
|
||||
total := len(filtered)
|
||||
|
||||
// 分页
|
||||
if offset >= len(filtered) {
|
||||
return []CallLogRecord{}, total
|
||||
}
|
||||
page := filtered[offset:]
|
||||
if limit > 0 && limit < len(page) {
|
||||
page = page[:limit]
|
||||
}
|
||||
|
||||
return page, total
|
||||
}
|
||||
|
||||
// GetCallStats 获取工具调用统计
|
||||
|
||||
@@ -68,6 +68,7 @@ export const SERVICES = {
|
||||
env: {
|
||||
AI_CORE_PORT: '8081',
|
||||
PERSONA_DIR: './internal/persona',
|
||||
SEARXNG_URL: process.env.SEARXNG_URL || 'http://localhost:8088',
|
||||
IOT_SERVICE_URL: process.env.IOT_SERVICE_URL || process.env.IOT_DEBUG_SERVICE_URL || 'http://localhost:8083',
|
||||
ENABLE_BACKGROUND_THINKING: process.env.ENABLE_BACKGROUND_THINKING || 'true',
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user