mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-25 00:51:20 +00:00
fix(gemini): fail fast on missing API key + surface it in hermes dump (#15133)
Two small fixes triggered by a support report where the user saw a cryptic 'HTTP 400 - Error 400 (Bad Request)!!1' (Google's GFE HTML error page, not a real API error) on every gemini-2.5-pro request. The underlying cause was an empty GOOGLE_API_KEY / GEMINI_API_KEY, but nothing in our output made that diagnosable: 1. hermes_cli/dump.py: the api_keys section enumerated 23 providers but omitted Google entirely, so users had no way to verify from 'hermes dump' whether the key was set. Added GOOGLE_API_KEY and GEMINI_API_KEY rows. 2. agent/gemini_native_adapter.py: GeminiNativeClient.__init__ accepted an empty/whitespace api_key and stamped it into the x-goog-api-key header, which made Google's frontend return a generic HTML 400 long before the request reached the Generative Language backend. Now we raise RuntimeError at construction with an actionable message pointing at GOOGLE_API_KEY/GEMINI_API_KEY and aistudio.google.com. Added a regression test that covers '', ' ', and None.
This commit is contained in:
parent
a1caec1088
commit
ba44a3d256
3 changed files with 22 additions and 0 deletions
|
|
@ -234,6 +234,19 @@ def test_native_client_accepts_injected_http_client():
|
|||
assert client._http is injected
|
||||
|
||||
|
||||
def test_native_client_rejects_empty_api_key_with_actionable_message():
|
||||
"""Empty/whitespace api_key must raise at construction, not produce a cryptic
|
||||
Google GFE 'Error 400 (Bad Request)!!1' HTML page on the first request."""
|
||||
from agent.gemini_native_adapter import GeminiNativeClient
|
||||
|
||||
for bad in ("", " ", None):
|
||||
with pytest.raises(RuntimeError) as excinfo:
|
||||
GeminiNativeClient(api_key=bad) # type: ignore[arg-type]
|
||||
msg = str(excinfo.value)
|
||||
assert "GOOGLE_API_KEY" in msg and "GEMINI_API_KEY" in msg
|
||||
assert "aistudio.google.com" in msg
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_async_native_client_streams_without_requiring_async_iterator_from_sync_client():
|
||||
from agent.gemini_native_adapter import AsyncGeminiNativeClient
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue