From e8d3d4340fa67d766dd435632be18aa443530b2f Mon Sep 17 00:00:00 2001 From: ycd Date: Tue, 8 Sep 2026 21:14:14 +0800 Subject: [PATCH] fix(providers): detect llama.cpp context size overflow in error classifier --- internal/providers/error_classify.go | 3 +++ internal/providers/error_classify_test.go | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/internal/providers/error_classify.go b/internal/providers/error_classify.go index 61df90f3..ead5116f 100644 --- a/internal/providers/error_classify.go +++ b/internal/providers/error_classify.go @@ -170,6 +170,9 @@ func isContextOverflow(lower string) bool { "request_too_large", // Generic "input is too long", // DashScope "exceed_context_size", // Ollama native /api/chat 400 + // llama.cpp / OpenAI-compat local servers return: + // "request (N tokens) exceeds the available context size (M tokens)" + "context size", // llama.cpp native /v1/chat/completions 400 "请求输入过长", // Chinese generic ) } diff --git a/internal/providers/error_classify_test.go b/internal/providers/error_classify_test.go index 6a941186..35f53840 100644 --- a/internal/providers/error_classify_test.go +++ b/internal/providers/error_classify_test.go @@ -151,6 +151,14 @@ func TestClassifyTooManyTokens(t *testing.T) { } } +func TestClassifyContextOverflowLlamaCpp(t *testing.T) { + classifier := NewDefaultClassifier() + result := classifier.Classify(nil, 400, `{"error":{"code":400,"message":"request (218678 tokens) exceeds the available context size (204800 tokens), try increasing it","type":"exceed_context_size_error","n_prompt_tokens":218678,"n_ctx":204800}}`) + if result.Kind != "context_overflow" { + t.Errorf("expected context_overflow for llama.cpp message, got %s", result.Kind) + } +} + func TestClassifyNetworkTimeoutError(t *testing.T) { classifier := NewDefaultClassifier() timeoutErr := &net.DNSError{