mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-28 07:35:27 -04:00
test: split llm-core temperature tests (#4935)
This commit is contained in:
committed by
GitHub
parent
70d806019b
commit
2497160fd4
@@ -0,0 +1,111 @@
|
||||
"""Regression tests: OpenAI reasoning models reject a non-default temperature.
|
||||
|
||||
o1/o3/o4/gpt-5 only accept the default temperature (1); sending an explicit
|
||||
value — even 0.0 — returns HTTP 400 "Only the default (1) value is supported".
|
||||
The OpenAI-compatible payload builders must omit the temperature field for these
|
||||
models so chat (with a non-default preset) and endpoint probing don't break.
|
||||
"""
|
||||
import httpx
|
||||
import pytest
|
||||
|
||||
from src import llm_core
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"model",
|
||||
["o1", "o1-mini", "o3", "o3-mini", "o4-mini", "gpt-5", "gpt-5-mini",
|
||||
"openrouter/openai/o3-mini", "OpenAI/GPT-5", "kimi-for-coding"],
|
||||
)
|
||||
def test_reasoning_models_restrict_temperature(model):
|
||||
assert llm_core._restricts_temperature(model) is True
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"model",
|
||||
["gpt-4o", "gpt-4.1", "gpt-3.5-turbo", "gpt-4.5-preview",
|
||||
"claude-3-5-sonnet", "llama3.1", "", None],
|
||||
)
|
||||
def test_normal_models_allow_temperature(model):
|
||||
assert llm_core._restricts_temperature(model) is False
|
||||
|
||||
|
||||
def _capture_openai_payload(
|
||||
monkeypatch,
|
||||
model,
|
||||
temperature,
|
||||
url="https://api.openai.com/v1/chat/completions",
|
||||
):
|
||||
"""Run a synchronous OpenAI-compatible call and return the posted JSON body."""
|
||||
llm_core._response_cache.clear()
|
||||
seen = {}
|
||||
|
||||
def fake_post(url, headers=None, json=None, timeout=None):
|
||||
seen["json"] = json
|
||||
request = httpx.Request("POST", url)
|
||||
return httpx.Response(
|
||||
200,
|
||||
request=request,
|
||||
json={"choices": [{"message": {"content": "OK"}}]},
|
||||
)
|
||||
|
||||
monkeypatch.setattr(llm_core.httpx, "post", fake_post)
|
||||
result = llm_core.llm_call(
|
||||
url,
|
||||
model,
|
||||
[{"role": "user", "content": "Say OK"}],
|
||||
temperature=temperature,
|
||||
max_tokens=5,
|
||||
)
|
||||
assert result == "OK"
|
||||
return seen["json"]
|
||||
|
||||
|
||||
def test_reasoning_model_payload_omits_temperature(monkeypatch):
|
||||
payload = _capture_openai_payload(monkeypatch, "o3-mini", 0.0)
|
||||
assert "temperature" not in payload
|
||||
# Reasoning models also use max_completion_tokens, which must survive.
|
||||
assert payload["max_completion_tokens"] == 5
|
||||
|
||||
|
||||
def test_kimi_for_coding_payload_omits_temperature(monkeypatch):
|
||||
payload = _capture_openai_payload(monkeypatch, "kimi-for-coding", 0.1)
|
||||
assert "temperature" not in payload
|
||||
assert payload["max_tokens"] == 5
|
||||
|
||||
|
||||
def test_normal_model_payload_keeps_temperature(monkeypatch):
|
||||
payload = _capture_openai_payload(monkeypatch, "gpt-4o", 0.2)
|
||||
assert payload["temperature"] == 0.2
|
||||
assert payload["max_tokens"] == 5
|
||||
|
||||
|
||||
def test_normal_model_payload_keeps_temperature_above_one(monkeypatch):
|
||||
# OpenAI/local providers may validly use temperatures above 1.0; the clamp
|
||||
# is Anthropic-only and must not touch this path.
|
||||
payload = _capture_openai_payload(monkeypatch, "gpt-4o", 1.2)
|
||||
assert payload["temperature"] == 1.2
|
||||
|
||||
|
||||
def test_chatgpt_subscription_payload_omits_max_output_tokens():
|
||||
# ChatGPT Subscription Codex API does not support max_output_tokens —
|
||||
# passing it returns HTTP 400 "Unsupported parameter: max_output_tokens".
|
||||
# The payload should NOT include max_output_tokens regardless of max_tokens.
|
||||
payload = llm_core._build_chatgpt_responses_payload(
|
||||
"gpt-5.1-codex",
|
||||
[{"role": "user", "content": "Say OK"}],
|
||||
temperature=0.2,
|
||||
max_tokens=37,
|
||||
)
|
||||
|
||||
assert "max_output_tokens" not in payload
|
||||
|
||||
|
||||
def test_chatgpt_subscription_payload_omits_max_output_tokens_when_zero():
|
||||
payload = llm_core._build_chatgpt_responses_payload(
|
||||
"gpt-5.1-codex",
|
||||
[{"role": "user", "content": "Say OK"}],
|
||||
temperature=0.2,
|
||||
max_tokens=0,
|
||||
)
|
||||
|
||||
assert "max_output_tokens" not in payload
|
||||
Reference in New Issue
Block a user