lmstudio_openai_reasoning_probe.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/env python3
  2. import argparse
  3. import json
  4. import urllib.error
  5. import urllib.request
  6. from datetime import datetime
  7. from pathlib import Path
  8. PROBE_FIELDS = [
  9. ("baseline", {}),
  10. ("enable_thinking_false", {"enable_thinking": False}),
  11. ("reasoning_off_string", {"reasoning": "off"}),
  12. ("reasoning_false_bool", {"reasoning": False}),
  13. ("extra_body_enable_thinking_false", {"extra_body": {"enable_thinking": False}}),
  14. ("extra_body_reasoning_off", {"extra_body": {"reasoning": "off"}}),
  15. ("chat_template_kwargs_enable_thinking_false", {"chat_template_kwargs": {"enable_thinking": False}}),
  16. ("chat_template_kwargs_preserve_false", {"chat_template_kwargs": {"preserve_thinking": False, "enable_thinking": False}}),
  17. ("include_reasoning_false", {"include_reasoning": False}),
  18. ("separate_reasoning_false", {"separate_reasoning": False}),
  19. ]
  20. def post_json(url: str, payload: dict, timeout: int) -> tuple[int, str]:
  21. body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
  22. req = urllib.request.Request(
  23. url,
  24. data=body,
  25. headers={"Content-Type": "application/json"},
  26. method="POST",
  27. )
  28. try:
  29. with urllib.request.urlopen(req, timeout=timeout) as resp:
  30. return resp.status, resp.read().decode("utf-8", errors="replace")
  31. except urllib.error.HTTPError as exc:
  32. return exc.code, exc.read().decode("utf-8", errors="replace")
  33. def main() -> int:
  34. parser = argparse.ArgumentParser()
  35. parser.add_argument("--port", type=int, default=7860)
  36. parser.add_argument(
  37. "--model",
  38. default="local/qwen3.6-35b-a3b-hauhaucs-aggressive",
  39. )
  40. parser.add_argument(
  41. "--prompt",
  42. default="Compute 317 * 29. Give the final answer only.",
  43. )
  44. parser.add_argument("--output-root", default="artifacts/lmstudio-openai-reasoning-probe")
  45. parser.add_argument("--max-tokens", type=int, default=64)
  46. parser.add_argument("--timeout", type=int, default=300)
  47. args = parser.parse_args()
  48. run_dir = Path(args.output_root) / datetime.now().strftime("%Y%m%d-%H%M%S")
  49. run_dir.mkdir(parents=True, exist_ok=True)
  50. results = []
  51. url = f"http://127.0.0.1:{args.port}/v1/chat/completions"
  52. for index, (name, fields) in enumerate(PROBE_FIELDS, start=1):
  53. payload = {
  54. "model": args.model,
  55. "messages": [{"role": "user", "content": args.prompt}],
  56. "temperature": 0.2,
  57. "max_tokens": args.max_tokens,
  58. "stream": False,
  59. }
  60. payload.update(fields)
  61. prefix = f"{index:02d}_{name}"
  62. (run_dir / f"{prefix}.request.json").write_text(
  63. json.dumps(payload, ensure_ascii=False, indent=2) + "\n",
  64. encoding="utf-8",
  65. )
  66. status_code, raw = post_json(url, payload, timeout=args.timeout)
  67. (run_dir / f"{prefix}.response.raw.json").write_text(raw, encoding="utf-8")
  68. parsed = None
  69. try:
  70. parsed = json.loads(raw)
  71. except json.JSONDecodeError:
  72. pass
  73. msg = ((parsed or {}).get("choices") or [{}])[0].get("message") or {}
  74. summary = {
  75. "name": name,
  76. "status_code": status_code,
  77. "fields": fields,
  78. "has_reasoning_content": "reasoning_content" in msg and msg.get("reasoning_content") is not None,
  79. "content": msg.get("content"),
  80. "reasoning_content": msg.get("reasoning_content"),
  81. "error": (parsed or {}).get("error"),
  82. "usage": (parsed or {}).get("usage"),
  83. }
  84. (run_dir / f"{prefix}.summary.json").write_text(
  85. json.dumps(summary, ensure_ascii=False, indent=2) + "\n",
  86. encoding="utf-8",
  87. )
  88. results.append(summary)
  89. (run_dir / "all_summaries.json").write_text(
  90. json.dumps({"results": results}, ensure_ascii=False, indent=2) + "\n",
  91. encoding="utf-8",
  92. )
  93. print(run_dir)
  94. return 0
  95. if __name__ == "__main__":
  96. raise SystemExit(main())