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

  1. Inspect the wrapped error to distinguish transport vs HTTP status vs decode failure
  2. Validate the QkpansoAPI URL and payload against the current upstream API
  3. Add retry/backoff for transient 5xx/timeouts
  4. Rely on the other three API results (aggregation tolerates one failure)
  5. 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

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)