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{