- GLM 응답의 content가 비어있을 경우 reasoning_content를 대신 사용하도록 로직 개선 - 새로운 메서드 _extract_glm_assistant_text 추가하여 assistant 텍스트 추출을 명확히 함 - 관련 단위 테스트 추가 및 README.md에 변경 사항 반영
57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
import os
|
|
import unittest
|
|
|
|
from ai_planner import AIPlanner
|
|
|
|
|
|
class TestAIPlannerParseJson(unittest.TestCase):
|
|
def setUp(self):
|
|
# AIPlanner 생성 시 ZAI_API_KEY가 필요하므로 테스트에서는 더미를 주입한다.
|
|
os.environ.setdefault("ZAI_API_KEY", "dummy")
|
|
self.planner = AIPlanner()
|
|
|
|
def test_parse_json_object(self):
|
|
raw = (
|
|
'{"thinking":"t","current_goal":"g",'
|
|
'"actions":[{"action":"explore","params":{"direction":"east","max_steps":1},"reason":"x"}],'
|
|
'"after_this":"a"}'
|
|
)
|
|
plan = self.planner._parse_json(raw)
|
|
self.assertEqual(plan["current_goal"], "g")
|
|
self.assertEqual(len(plan["actions"]), 1)
|
|
self.assertEqual(plan["actions"][0]["action"], "explore")
|
|
|
|
def test_parse_json_array_top_level(self):
|
|
raw = '[{"action":"explore","params":{"direction":"east","max_steps":1},"reason":"x"}]'
|
|
plan = self.planner._parse_json(raw)
|
|
self.assertEqual(len(plan["actions"]), 1)
|
|
self.assertEqual(plan["actions"][0]["action"], "explore")
|
|
self.assertIn("after_this", plan)
|
|
|
|
def test_parse_json_array_with_code_fence(self):
|
|
raw = (
|
|
"```json\n"
|
|
'[{"action":"explore","params":{"direction":"east","max_steps":1},"reason":"x"}]\n'
|
|
"```"
|
|
)
|
|
plan = self.planner._parse_json(raw)
|
|
self.assertEqual(len(plan["actions"]), 1)
|
|
self.assertEqual(plan["actions"][0]["action"], "explore")
|
|
|
|
def test_extract_glm_text_prefers_content_then_reasoning(self):
|
|
# content가 비어있고 reasoning_content에 JSON이 들어있는 케이스
|
|
fake = {
|
|
"choices": [
|
|
{
|
|
"finish_reason": "length",
|
|
"message": {
|
|
"content": "",
|
|
"reasoning_content": '{"thinking":"t","current_goal":"g","actions":[],"after_this":"a"}',
|
|
},
|
|
}
|
|
]
|
|
}
|
|
extracted = self.planner._extract_glm_assistant_text(fake)
|
|
self.assertIn('"current_goal":"g"', extracted)
|
|
|