106 lines
4.4 KiB
Python
106 lines
4.4 KiB
Python
from api import streaming
|
|
|
|
|
|
PRIOR_DISPLAY = [
|
|
{"role": "user", "content": "Earlier request"},
|
|
{"role": "assistant", "content": "Earlier reply"},
|
|
]
|
|
|
|
|
|
class TestIssue5686CompletedOutputText:
|
|
def test_assistant_reply_added_after_current_turn_counts_visible_output_text_after_tool_metadata(self):
|
|
previous_context = list(PRIOR_DISPLAY) + [
|
|
{"role": "user", "content": "What is the weather?"},
|
|
]
|
|
result_messages = list(previous_context) + [
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{"type": "tool_use", "name": "weather.lookup", "input": {"city": "Leeds"}},
|
|
{"type": "output_text", "output_text": "It is 18C and sunny."},
|
|
],
|
|
"tool_calls": [{"id": "call_1", "type": "function", "function": {"name": "weather.lookup", "arguments": "{}"}}],
|
|
}
|
|
]
|
|
assert streaming._assistant_reply_added_after_current_turn(
|
|
result_messages,
|
|
previous_context,
|
|
"What is the weather?",
|
|
) is True
|
|
|
|
def test_session_lacks_final_answer_false_when_visible_output_text_follows_tool_use(self):
|
|
messages = list(PRIOR_DISPLAY) + [
|
|
{"role": "user", "content": "What is the weather?"},
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{"type": "tool_use", "name": "weather.lookup", "input": {"city": "Leeds"}},
|
|
{"type": "output_text", "output_text": "It is 18C and sunny."},
|
|
],
|
|
"tool_calls": [{"id": "call_1", "type": "function", "function": {"name": "weather.lookup", "arguments": "{}"}}],
|
|
},
|
|
]
|
|
assert streaming._session_lacks_final_assistant_answer(messages) is False
|
|
|
|
def test_session_lacks_final_answer_true_for_tool_only_assistant_content(self):
|
|
messages = list(PRIOR_DISPLAY) + [
|
|
{"role": "user", "content": "What is the weather?"},
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{"type": "tool_use", "name": "weather.lookup", "input": {"city": "Leeds"}},
|
|
],
|
|
"tool_calls": [{"id": "call_1", "type": "function", "function": {"name": "weather.lookup", "arguments": "{}"}}],
|
|
},
|
|
]
|
|
assert streaming._session_lacks_final_assistant_answer(messages) is True
|
|
|
|
def test_session_lacks_final_answer_false_for_untyped_visible_text_with_call_metadata(self):
|
|
messages = list(PRIOR_DISPLAY) + [
|
|
{"role": "user", "content": "What is the weather?"},
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{"call_id": "call_1", "name": "weather.lookup", "text": "It is 18C and sunny."},
|
|
],
|
|
},
|
|
]
|
|
assert streaming._session_lacks_final_assistant_answer(messages) is False
|
|
|
|
def test_session_lacks_final_answer_true_for_untyped_tool_part_with_empty_args(self):
|
|
messages = list(PRIOR_DISPLAY) + [
|
|
{"role": "user", "content": "What is the weather?"},
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{"call_id": "call_1", "args": {}},
|
|
],
|
|
},
|
|
]
|
|
assert streaming._session_lacks_final_assistant_answer(messages) is True
|
|
|
|
def test_session_lacks_final_answer_true_for_top_level_tool_calls_without_in_content_boundary(self):
|
|
messages = list(PRIOR_DISPLAY) + [
|
|
{"role": "user", "content": "What is the weather?"},
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{"type": "text", "text": "Checking the tool result"},
|
|
],
|
|
"tool_calls": [{"id": "call_1", "type": "function", "function": {"name": "weather.lookup", "arguments": "{}"}}],
|
|
},
|
|
]
|
|
assert streaming._session_lacks_final_assistant_answer(messages) is True
|
|
|
|
def test_session_lacks_final_answer_false_for_plain_output_text_parts(self):
|
|
messages = list(PRIOR_DISPLAY) + [
|
|
{"role": "user", "content": "Summarize"},
|
|
{
|
|
"role": "assistant",
|
|
"content": [
|
|
{"type": "output_text", "output_text": "Summary complete."},
|
|
],
|
|
},
|
|
]
|
|
assert streaming._session_lacks_final_assistant_answer(messages) is False
|