Skip to content

Commit f579dbc

Browse files
committed
fix: disable json_mode for QA eval LLM, add list-format unwrap safety net
1 parent 5d3dd9c commit f579dbc

3 files changed

Lines changed: 9 additions & 5 deletions

File tree

benchmarks/locomo/locomo_runner.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ def _init_eval_llm(self) -> None:
166166
self._eval_llm = create_llm(
167167
self.config.eval_model,
168168
thinking_level=self.config.qa_thinking_level,
169+
json_mode=False,
169170
)
170171
level = self.config.qa_thinking_level or "model-default"
171172
logger.info("Eval LLM: %s (thinking=%s)", self.config.eval_model, level)

vektori/models/gemini.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,12 @@ def __init__(
4343
max_retries: int = DEFAULT_MAX_RETRIES,
4444
initial_backoff: float = DEFAULT_INITIAL_BACKOFF,
4545
max_backoff: float = DEFAULT_MAX_BACKOFF,
46+
json_mode: bool = True,
4647
) -> None:
4748
self.model = model or DEFAULT_MODEL
4849
self._api_key = api_key
4950
self._thinking_level = thinking_level # None = use model-based default
51+
self._json_mode = json_mode
5052
self._client = None
5153
self.max_retries = max_retries
5254
self.initial_backoff = initial_backoff
@@ -94,10 +96,9 @@ async def generate(self, prompt: str, max_tokens: int | None = None) -> str:
9496

9597
client = self._get_client()
9698

97-
config_kwargs: dict[str, Any] = {
98-
"temperature": 0.1,
99-
"response_mime_type": "application/json",
100-
}
99+
config_kwargs: dict[str, Any] = {"temperature": 0.1}
100+
if self._json_mode:
101+
config_kwargs["response_mime_type"] = "application/json"
101102
if max_tokens is not None:
102103
config_kwargs["max_output_tokens"] = max_tokens
103104
thinking = self._thinking_config()

vektori/qa/generator.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,14 @@ async def generate_answer(
108108
)
109109
try:
110110
answer = (await llm.generate(prompt, max_tokens=max_tokens)).strip()
111-
# Unwrap {"answer": "..."} JSON that some models (e.g. gemini) occasionally return
111+
# Unwrap JSON-wrapped answers (safety net — should not trigger after json_mode fix)
112112
try:
113113
import json as _json
114114
parsed = _json.loads(answer)
115115
if isinstance(parsed, dict) and "answer" in parsed:
116116
answer = str(parsed["answer"]).strip()
117+
elif isinstance(parsed, list) and parsed and isinstance(parsed[0], dict) and "answer" in parsed[0]:
118+
answer = str(parsed[0]["answer"]).strip()
117119
except Exception:
118120
# Fallback: regex extraction handles malformed/truncated JSON
119121
m = re.search(r'"answer"\s*:\s*"((?:[^"\\]|\\.)*)"', answer)

0 commit comments

Comments
 (0)