from pathlib import Path
import sys
import pytest
sys.path.insert(0, str(Path(__file__).parent.parent))
from kiro_proxy.core.thinking import (
ThinkingConfig,
build_thinking_prompt,
build_user_prompt_with_thinking,
extract_thinking_config_from_gemini_body,
extract_thinking_config_from_openai_body,
infer_thinking_from_anthropic_messages,
infer_thinking_from_gemini_contents,
infer_thinking_from_openai_messages,
infer_thinking_from_openai_responses_input,
normalize_thinking_config,
)
def test_normalize_thinking_config_defaults_to_disabled_unlimited():
cfg = normalize_thinking_config(None)
assert cfg == ThinkingConfig(False, None)
@pytest.mark.parametrize(
"raw,expected",
[
(True, ThinkingConfig(True, None)),
("enabled", ThinkingConfig(True, None)),
({"type": "enabled"}, ThinkingConfig(True, None)),
({"thinking_type": "enabled", "budget_tokens": 20000}, ThinkingConfig(True, 20000)),
({"enabled": True, "budget_tokens": 0}, ThinkingConfig(True, None)),
({"includeThoughts": True, "thinkingBudget": 1234}, ThinkingConfig(True, 1234)),
({"type": "disabled", "budget_tokens": 9999}, ThinkingConfig(False, 9999)),
],
)
def test_normalize_thinking_config_variants(raw, expected):
assert normalize_thinking_config(raw) == expected
def test_extract_thinking_config_from_openai_body():
cfg, explicit = extract_thinking_config_from_openai_body({})
assert cfg == ThinkingConfig(False, None)
assert explicit is False
cfg, explicit = extract_thinking_config_from_openai_body({"thinking": {"type": "enabled"}})
assert cfg.enabled is True
assert explicit is True
cfg, explicit = extract_thinking_config_from_openai_body({"reasoning_effort": "high"})
assert cfg.enabled is True
assert cfg.budget_tokens is None
assert explicit is True
cfg, explicit = extract_thinking_config_from_openai_body({"reasoning": {"effort": "medium"}})
assert cfg == ThinkingConfig(True, 20000)
assert explicit is True
def test_extract_thinking_config_from_gemini_body():
cfg, explicit = extract_thinking_config_from_gemini_body({})
assert cfg == ThinkingConfig(False, None)
assert explicit is False
cfg, explicit = extract_thinking_config_from_gemini_body(
{"generationConfig": {"thinkingConfig": {"includeThoughts": True, "thinkingBudget": 1234}}}
)
assert cfg == ThinkingConfig(True, 1234)
assert explicit is True
def test_infer_thinking_from_payloads():
assert (
infer_thinking_from_anthropic_messages(
[{"role": "assistant", "content": [{"type": "thinking", "thinking": "x"}]}]
)
is True
)
assert infer_thinking_from_openai_messages(
[{"role": "assistant", "content": "AAA\nBBB"}]
)
assert infer_thinking_from_openai_responses_input(
[
{
"type": "message",
"role": "assistant",
"content": [{"type": "output_text", "text": "AAABBB"}],
}
]
)
assert infer_thinking_from_gemini_contents(
[{"role": "model", "parts": [{"text": "AAA\nBBB"}]}]
)
def test_thinking_prompts_include_ultrathink_and_budget_hint():
p1 = build_thinking_prompt("hi", budget_tokens=None)
assert "ULTRATHINK" in p1
assert "within" not in p1.lower()
p2 = build_thinking_prompt("hi", budget_tokens=123)
assert "ULTRATHINK" in p2
assert "123" in p2
def test_build_user_prompt_with_thinking_wraps_and_forbids_disclosure():
prompt = build_user_prompt_with_thinking("hello", "secret reasoning")
assert "" in prompt and "" in prompt
assert "Do NOT reveal" in prompt