fish2018/pansou · error
qkpanso API error
Error message
qkpanso API error: %w
What it means
Per-source wrapped error in hunhepan's parallel search fan-out (plugin/hunhepan/hunhepan.go:96): the qkpanso backend's searchAPI failed and its error is wrapped with the source name before being pushed to errChan. One of several concurrent upstream APIs; other sources may still succeed.
Solutions
- Inspect the wrapped error to distinguish transport vs HTTP status vs decode failure
- Validate the QkpansoAPI URL and payload against the current upstream API
- Add retry/backoff for transient 5xx/timeouts
- Rely on the other three API results (aggregation tolerates one failure)
- If persistent, update the plugin to the new qkpanso endpoint or disable this source
Defensive patterns
Strategy: fallback
Type guard
func isQkpansoAPIError(err error) bool {
return err != nil && strings.Contains(err.Error(), "qkpanso API error")
} Try / catch
if err != nil && isQkpansoAPIError(err) {
log.Printf("qkpanso source unavailable, using remaining sources: %v", err)
} Prevention
- Treat each of the four sources as individually fallible
- Alert on persistent single-source failures (endpoint moved/dead)
- Update the qkpanso endpoint when upstream redesigns its API
- Cap concurrent per-source requests to stay under rate limits
When it happens
Trigger: p.searchAPI(client, QkpansoAPI, keyword) returns an error during a Search call — request build failure, HTTP error, non-2xx response, or JSON decode error from the qkpanso endpoint.
Common situations: qkpanso 上游接口宕机或超时;该分支限流。
Related errors
AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07).
Data as JSON: /api/errors/f64f1d06136b349d.
Report an issue: GitHub.
Appendix: source
Thrown at plugin/hunhepan/hunhepan.go:96
var wg sync.WaitGroup
wg.Add(4)
// 并行请求三个API
go func() {
defer wg.Done()
items, err := p.searchAPI(client, HunhepanAPI, keyword)
if err != nil {
errChan <- fmt.Errorf("hunhepan API error: %w", err)
return
}
resultChan <- items
}()
go func() {
defer wg.Done()
items, err := p.searchAPI(client, QkpansoAPI, keyword)
if err != nil {
errChan <- fmt.Errorf("qkpanso API error: %w", err)
return
}
resultChan <- items
}()
go func() {
defer wg.Done()
items, err := p.searchAPI(client, KuakeAPI, keyword)
if err != nil {
errChan <- fmt.Errorf("kuake API error: %w", err)
return
}
resultChan <- items
}()
go func() {
defer wg.Done()
debugLog("调用 misoso API")View on GitHub (pinned to beaa561337)