From dfe3c4398c1a6aa5e3178a7959d5d350a34e0988 Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Wed, 30 Sep 2026 07:15:46 +0200 Subject: [PATCH] Report llama context limit errors clearly --- endpoint.py | 20 +++++++++++++++++++- test_endpoint.py | 15 ++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/endpoint.py b/endpoint.py index dd2c385..65b000b 100644 --- a/endpoint.py +++ b/endpoint.py @@ -19,6 +19,24 @@ class APIError(ValueError): def __init__(self,message,status=400,code='invalid_request_error'): super().__init__(message);self.status=status;self.code=code +def chat_upstream_error(status, raw): + """Expose known, safe llama.cpp limits without reflecting request content.""" + try: + detail=json.loads(raw) + error=detail.get('error',{}) if isinstance(detail,dict) else {} + if error.get('type')=='exceed_context_size_error': + needed=error.get('n_prompt_tokens');available=error.get('n_ctx') + if all(type(value) is int and 016*1024*1024:raise InferenceError('Modellantwort überschreitet 16 MiB.') diff --git a/test_endpoint.py b/test_endpoint.py index ceb6b93..c630335 100644 --- a/test_endpoint.py +++ b/test_endpoint.py @@ -11,7 +11,7 @@ from pathlib import Path from types import SimpleNamespace from http.server import BaseHTTPRequestHandler,ThreadingHTTPServer from unittest.mock import Mock -from endpoint import Endpoint +from endpoint import Endpoint,chat_upstream_error from inference import Scheduler,InferenceError class FakeWorker: @@ -32,6 +32,19 @@ class Upstream(BaseHTTPRequestHandler): else: body=json.dumps(dict(id='test',model=data['model'],choices=[{'message':{'role':'assistant','content':'synthetic'}}])).encode();self.send_response(200);self.send_header('Content-Length',str(len(body)));self.end_headers();self.wfile.write(body) +class UpstreamErrorTests(unittest.TestCase): + def test_context_limit_is_actionable_without_echoing_upstream_text(self): + raw=json.dumps({'error':{'type':'exceed_context_size_error','message':'private request text', + 'n_prompt_tokens':13523,'n_ctx':8192}}).encode() + error=chat_upstream_error(400,raw) + self.assertEqual(error.code,'context_length_exceeded') + self.assertIn('13.523',str(error));self.assertIn('8.192',str(error)) + self.assertNotIn('private request text',str(error)) + def test_unknown_upstream_errors_stay_generic(self): + error=chat_upstream_error(400,b'{"error":{"message":"private request text"}}') + self.assertEqual(error.code,'upstream_error') + self.assertNotIn('private request text',str(error)) + class EndpointTests(unittest.TestCase): def setUp(self): self.tmp=tempfile.TemporaryDirectory();self.worker=FakeWorker();self.worker.http=ThreadingHTTPServer(('127.0.0.1',0),Upstream);self.worker.http.worker=self.worker;threading.Thread(target=self.worker.http.serve_forever,daemon=True).start()