test_openai_reasoning_proxy.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import importlib.util
  2. import unittest
  3. from pathlib import Path
  4. MODULE_PATH = Path(__file__).resolve().parent.parent / "tools" / "lmstudio" / "openai_reasoning_proxy.py"
  5. if MODULE_PATH.exists():
  6. spec = importlib.util.spec_from_file_location("openai_reasoning_proxy", MODULE_PATH)
  7. module = importlib.util.module_from_spec(spec)
  8. assert spec is not None and spec.loader is not None
  9. spec.loader.exec_module(module)
  10. proxy = module
  11. else: # pragma: no cover
  12. proxy = None
  13. class OpenAIReasoningProxyTests(unittest.TestCase):
  14. def setUp(self):
  15. if proxy is None:
  16. self.fail("tools.lmstudio.openai_reasoning_proxy is not available")
  17. def test_build_native_payload_prefers_reasoning_field(self):
  18. request_payload = {
  19. "model": "qwen/qwen3.6-35b-a3b",
  20. "messages": [
  21. {"role": "system", "content": "be precise"},
  22. {"role": "user", "content": "hello"},
  23. {"role": "assistant", "content": "hi"},
  24. {"role": "user", "content": "continue"},
  25. ],
  26. "max_tokens": 64,
  27. "temperature": 0.1,
  28. "reasoning": "off",
  29. "enable_thinking": True,
  30. }
  31. native_payload = proxy.build_native_payload(request_payload)
  32. self.assertEqual(native_payload["model"], "qwen/qwen3.6-35b-a3b")
  33. self.assertEqual(
  34. native_payload["input"],
  35. "User: hello\n\nAssistant: hi\n\nUser: continue",
  36. )
  37. self.assertEqual(native_payload["max_output_tokens"], 64)
  38. self.assertEqual(native_payload["temperature"], 0.1)
  39. self.assertEqual(native_payload["reasoning"], "off")
  40. self.assertEqual(native_payload["system_prompt"], "be precise")
  41. self.assertFalse(native_payload["store"])
  42. def test_build_native_payload_maps_enable_thinking_false_to_reasoning_off(self):
  43. request_payload = {
  44. "model": "qwen/qwen3.6-35b-a3b",
  45. "messages": [{"role": "user", "content": "hello"}],
  46. "enable_thinking": False,
  47. }
  48. native_payload = proxy.build_native_payload(request_payload)
  49. self.assertEqual(native_payload["reasoning"], "off")
  50. def test_translate_native_response_keeps_reasoning_content(self):
  51. native_response = {
  52. "id": "chatcmpl-native",
  53. "model": "qwen/qwen3.6-35b-a3b",
  54. "output": [
  55. {"type": "reasoning", "content": "reasoning text"},
  56. {"type": "message", "content": "final answer"},
  57. ],
  58. "stats": {
  59. "input_tokens": 11,
  60. "total_output_tokens": 19,
  61. "reasoning_output_tokens": 7,
  62. },
  63. }
  64. translated = proxy.translate_native_response(native_response)
  65. self.assertEqual(translated["object"], "chat.completion")
  66. self.assertEqual(translated["model"], "qwen/qwen3.6-35b-a3b")
  67. self.assertEqual(translated["choices"][0]["message"]["content"], "final answer")
  68. self.assertEqual(
  69. translated["choices"][0]["message"]["reasoning_content"],
  70. "reasoning text",
  71. )
  72. self.assertEqual(translated["usage"]["prompt_tokens"], 11)
  73. self.assertEqual(translated["usage"]["completion_tokens"], 19)
  74. self.assertEqual(
  75. translated["usage"]["completion_tokens_details"]["reasoning_tokens"],
  76. 7,
  77. )
  78. if __name__ == "__main__":
  79. unittest.main()