diff --git a/gateway/platforms/telegram.py b/gateway/platforms/telegram.py index e7c6062a1..c37fde42c 100644 --- a/gateway/platforms/telegram.py +++ b/gateway/platforms/telegram.py @@ -539,6 +539,7 @@ class TelegramAdapter(BasePlatformAdapter): try: text_content = raw_bytes.decode("utf-8") display_name = original_filename or f"document{ext}" + display_name = re.sub(r'[^\w.\- ]', '_', display_name) injection = f"[Content of {display_name}]:\n{text_content}" if event.text: event.text = f"{injection}\n\n{event.text}" diff --git a/run_agent.py b/run_agent.py index 5d687d0e4..4f5700176 100644 --- a/run_agent.py +++ b/run_agent.py @@ -2099,6 +2099,7 @@ class AIAgent: is_payload_too_large = ( status_code == 413 or 'request entity too large' in error_msg + or 'payload too large' in error_msg or 'error code: 413' in error_msg ) diff --git a/tests/test_413_compression.py b/tests/test_413_compression.py index f6274ebf1..e6e0c216e 100644 --- a/tests/test_413_compression.py +++ b/tests/test_413_compression.py @@ -88,18 +88,24 @@ class TestHTTP413Compression: ok_resp = _mock_response(content="Success after compression", finish_reason="stop") agent.client.chat.completions.create.side_effect = [err_413, ok_resp] + # Prefill so there are multiple messages for compression to reduce + prefill = [ + {"role": "user", "content": "previous question"}, + {"role": "assistant", "content": "previous answer"}, + ] + with ( patch.object(agent, "_compress_context") as mock_compress, patch.object(agent, "_persist_session"), patch.object(agent, "_save_trajectory"), patch.object(agent, "_cleanup_task_resources"), ): - # Compression removes messages, enabling retry + # Compression reduces 3 messages down to 1 mock_compress.return_value = ( [{"role": "user", "content": "hello"}], "compressed prompt", ) - result = agent.run_conversation("hello") + result = agent.run_conversation("hello", conversation_history=prefill) mock_compress.assert_called_once() assert result["completed"] is True @@ -111,6 +117,11 @@ class TestHTTP413Compression: ok_resp = _mock_response(content="Recovered", finish_reason="stop") agent.client.chat.completions.create.side_effect = [err_413, ok_resp] + prefill = [ + {"role": "user", "content": "previous question"}, + {"role": "assistant", "content": "previous answer"}, + ] + with ( patch.object(agent, "_compress_context") as mock_compress, patch.object(agent, "_persist_session"), @@ -121,7 +132,7 @@ class TestHTTP413Compression: [{"role": "user", "content": "hello"}], "compressed", ) - result = agent.run_conversation("hello") + result = agent.run_conversation("hello", conversation_history=prefill) # If 413 were treated as generic 4xx, result would have "failed": True assert result.get("failed") is not True @@ -133,6 +144,11 @@ class TestHTTP413Compression: ok_resp = _mock_response(content="OK", finish_reason="stop") agent.client.chat.completions.create.side_effect = [err, ok_resp] + prefill = [ + {"role": "user", "content": "previous question"}, + {"role": "assistant", "content": "previous answer"}, + ] + with ( patch.object(agent, "_compress_context") as mock_compress, patch.object(agent, "_persist_session"), @@ -143,7 +159,7 @@ class TestHTTP413Compression: [{"role": "user", "content": "hello"}], "compressed", ) - result = agent.run_conversation("hello") + result = agent.run_conversation("hello", conversation_history=prefill) mock_compress.assert_called_once() assert result["completed"] is True diff --git a/tests/test_run_agent.py b/tests/test_run_agent.py index a07c52f84..fe1202069 100644 --- a/tests/test_run_agent.py +++ b/tests/test_run_agent.py @@ -468,7 +468,7 @@ class TestBuildApiKwargs: kwargs = agent._build_api_kwargs(messages) assert kwargs["model"] == agent.model assert kwargs["messages"] is messages - assert kwargs["timeout"] == 600.0 + assert kwargs["timeout"] == 900.0 def test_provider_preferences_injected(self, agent): agent.providers_allowed = ["Anthropic"]