Add ruff, remove black, isort, flake8, pylint (#3092)
* black, isort, flake8 -> ruff * remove unused * add back needed import * fix
This commit is contained in:
@@ -2,8 +2,6 @@
|
||||
tests for chat_template prompt strategy
|
||||
"""
|
||||
|
||||
# pylint: disable=too-many-lines
|
||||
|
||||
from copy import deepcopy
|
||||
|
||||
import pytest
|
||||
@@ -96,9 +94,9 @@ class TestChatTemplateConfigurations:
|
||||
and turn.get("from") in ["system", "context"]
|
||||
and ("mistral" in tokenizer.name_or_path.lower())
|
||||
):
|
||||
assert (
|
||||
start_idx == -1 and end_idx == -1
|
||||
), "Expected system message to be skipped"
|
||||
assert start_idx == -1 and end_idx == -1, (
|
||||
"Expected system message to be skipped"
|
||||
)
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -155,7 +153,9 @@ class TestChatTemplateConfigurations:
|
||||
|
||||
assert all(
|
||||
label != IGNORE_TOKEN_ID for label in labels[start_idx:end_idx]
|
||||
), f"Expected labels for input '{response}' to be ignored, but got {labels[start_idx:end_idx]}"
|
||||
), (
|
||||
f"Expected labels for input '{response}' to be ignored, but got {labels[start_idx:end_idx]}"
|
||||
)
|
||||
|
||||
LOG.debug("Full labels: %s", labels)
|
||||
LOG.debug("Full input_ids: %s", input_ids)
|
||||
@@ -215,11 +215,15 @@ class TestChatTemplateConfigurations:
|
||||
if is_assistant:
|
||||
assert all(
|
||||
label != IGNORE_TOKEN_ID for label in labels[start_idx:end_idx]
|
||||
), f"Expected labels for assistant response '{response}' to be set, but got {labels[start_idx:end_idx]}"
|
||||
), (
|
||||
f"Expected labels for assistant response '{response}' to be set, but got {labels[start_idx:end_idx]}"
|
||||
)
|
||||
else:
|
||||
assert all(
|
||||
label == IGNORE_TOKEN_ID for label in labels[start_idx:end_idx]
|
||||
), f"Expected labels for human input '{response}' to be IGNORE_TOKEN_ID, but got {labels[start_idx:end_idx]}"
|
||||
), (
|
||||
f"Expected labels for human input '{response}' to be IGNORE_TOKEN_ID, but got {labels[start_idx:end_idx]}"
|
||||
)
|
||||
|
||||
def test_roles_to_train_human_assistant_only(
|
||||
self,
|
||||
@@ -276,11 +280,15 @@ class TestChatTemplateConfigurations:
|
||||
if should_be_labelled:
|
||||
assert all(
|
||||
label != IGNORE_TOKEN_ID for label in labels[start_idx:end_idx]
|
||||
), f"Expected labels for assistant response '{response}' to be set, but got {labels[start_idx:end_idx]}"
|
||||
), (
|
||||
f"Expected labels for assistant response '{response}' to be set, but got {labels[start_idx:end_idx]}"
|
||||
)
|
||||
else:
|
||||
assert all(
|
||||
label == IGNORE_TOKEN_ID for label in labels[start_idx:end_idx]
|
||||
), f"Expected labels for human input '{response}' to be IGNORE_TOKEN_ID, but got {labels[start_idx:end_idx]}"
|
||||
), (
|
||||
f"Expected labels for human input '{response}' to be IGNORE_TOKEN_ID, but got {labels[start_idx:end_idx]}"
|
||||
)
|
||||
|
||||
def test_roles_to_train_all(
|
||||
self,
|
||||
@@ -327,13 +335,15 @@ class TestChatTemplateConfigurations:
|
||||
continue
|
||||
|
||||
decoded_response = tokenizer.decode(input_ids[start_idx:end_idx])
|
||||
assert (
|
||||
response in decoded_response
|
||||
), f"Response {response} not found in index {start_idx}:{end_idx} decoded:{decoded_response}"
|
||||
assert response in decoded_response, (
|
||||
f"Response {response} not found in index {start_idx}:{end_idx} decoded:{decoded_response}"
|
||||
)
|
||||
|
||||
assert all(
|
||||
label != IGNORE_TOKEN_ID for label in labels[start_idx:end_idx]
|
||||
), f"Expected labels for response '{response}' to be set, but got {labels[start_idx:end_idx]}"
|
||||
), (
|
||||
f"Expected labels for response '{response}' to be set, but got {labels[start_idx:end_idx]}"
|
||||
)
|
||||
|
||||
def test_empty_roles_to_train(
|
||||
self,
|
||||
@@ -371,9 +381,9 @@ class TestChatTemplateConfigurations:
|
||||
|
||||
# Verify that no labels are set when roles_to_train is empty
|
||||
LOG.debug("Full labels: %s", labels)
|
||||
assert all(
|
||||
label == IGNORE_TOKEN_ID for label in labels
|
||||
), "Expected all labels to be IGNORE_TOKEN_ID when roles_to_train is empty"
|
||||
assert all(label == IGNORE_TOKEN_ID for label in labels), (
|
||||
"Expected all labels to be IGNORE_TOKEN_ID when roles_to_train is empty"
|
||||
)
|
||||
|
||||
def test_train_on_eos_all(
|
||||
self,
|
||||
@@ -417,9 +427,9 @@ class TestChatTemplateConfigurations:
|
||||
|
||||
assert len(eos_indices) > 0, "Expected at least one EOS token in the input"
|
||||
for eos_idx in eos_indices:
|
||||
assert (
|
||||
labels[eos_idx] != IGNORE_TOKEN_ID
|
||||
), f"Expected EOS token at index {eos_idx} to be labeled"
|
||||
assert labels[eos_idx] != IGNORE_TOKEN_ID, (
|
||||
f"Expected EOS token at index {eos_idx} to be labeled"
|
||||
)
|
||||
|
||||
def test_train_on_eos_turn(
|
||||
self,
|
||||
@@ -477,9 +487,9 @@ class TestChatTemplateConfigurations:
|
||||
while eos_idx < len(input_ids) and input_ids[eos_idx] != eos_token_id:
|
||||
eos_idx += 1
|
||||
|
||||
assert eos_idx < len(
|
||||
input_ids
|
||||
), f"Could not find EOS token after '{response}'"
|
||||
assert eos_idx < len(input_ids), (
|
||||
f"Could not find EOS token after '{response}'"
|
||||
)
|
||||
|
||||
LOG.debug(
|
||||
f"Turn {i}: role={turn['from']}, content='{turn['value']}', start_idx={start_idx}, end_idx={end_idx}, eos_idx={eos_idx}"
|
||||
@@ -492,13 +502,13 @@ class TestChatTemplateConfigurations:
|
||||
# Verify EOS token labeling based on role
|
||||
is_assistant = turn["from"] == "assistant"
|
||||
if is_assistant:
|
||||
assert (
|
||||
labels[eos_idx] != IGNORE_TOKEN_ID
|
||||
), f"Expected EOS token after assistant response '{response}' to be labeled"
|
||||
assert labels[eos_idx] != IGNORE_TOKEN_ID, (
|
||||
f"Expected EOS token after assistant response '{response}' to be labeled"
|
||||
)
|
||||
else:
|
||||
assert (
|
||||
labels[eos_idx] == IGNORE_TOKEN_ID
|
||||
), f"Expected EOS token after non-assistant input '{response}' to not be labeled"
|
||||
assert labels[eos_idx] == IGNORE_TOKEN_ID, (
|
||||
f"Expected EOS token after non-assistant input '{response}' to not be labeled"
|
||||
)
|
||||
|
||||
def test_train_on_eos_last(
|
||||
self,
|
||||
@@ -545,12 +555,12 @@ class TestChatTemplateConfigurations:
|
||||
|
||||
# Check that only the last EOS token is labeled
|
||||
for idx in eos_indices[:-1]:
|
||||
assert (
|
||||
labels[idx] == IGNORE_TOKEN_ID
|
||||
), f"Expected EOS token at index {idx} to not be labeled"
|
||||
assert (
|
||||
labels[last_eos_idx] != IGNORE_TOKEN_ID
|
||||
), f"Expected last EOS token at index {last_eos_idx} to be labeled"
|
||||
assert labels[idx] == IGNORE_TOKEN_ID, (
|
||||
f"Expected EOS token at index {idx} to not be labeled"
|
||||
)
|
||||
assert labels[last_eos_idx] != IGNORE_TOKEN_ID, (
|
||||
f"Expected last EOS token at index {last_eos_idx} to be labeled"
|
||||
)
|
||||
|
||||
def test_train_on_eos_none(
|
||||
self,
|
||||
@@ -594,9 +604,9 @@ class TestChatTemplateConfigurations:
|
||||
|
||||
assert len(eos_indices) > 0, "Expected at least one EOS token in the input"
|
||||
for eos_idx in eos_indices:
|
||||
assert (
|
||||
labels[eos_idx] == IGNORE_TOKEN_ID
|
||||
), f"Expected EOS token at index {eos_idx} to not be labeled"
|
||||
assert labels[eos_idx] == IGNORE_TOKEN_ID, (
|
||||
f"Expected EOS token at index {eos_idx} to not be labeled"
|
||||
)
|
||||
|
||||
def test_drop_system_message(
|
||||
self,
|
||||
@@ -634,9 +644,9 @@ class TestChatTemplateConfigurations:
|
||||
# Check if system message is not present in input_ids
|
||||
system_message = "You are an AI assistant."
|
||||
decoded_message = tokenizer.decode(input_ids)
|
||||
assert (
|
||||
system_message not in decoded_message
|
||||
), "Expected system message to be dropped"
|
||||
assert system_message not in decoded_message, (
|
||||
"Expected system message to be dropped"
|
||||
)
|
||||
|
||||
def test_custom_roles(
|
||||
self,
|
||||
@@ -711,7 +721,9 @@ class TestChatTemplateConfigurations:
|
||||
else:
|
||||
assert all(
|
||||
label == IGNORE_TOKEN_ID for label in labels[start_idx:end_idx]
|
||||
), f"Expected labels for non-AI message '{response}' to be IGNORE_TOKEN_ID"
|
||||
), (
|
||||
f"Expected labels for non-AI message '{response}' to be IGNORE_TOKEN_ID"
|
||||
)
|
||||
|
||||
def test_message_field_training(
|
||||
self,
|
||||
@@ -776,13 +788,13 @@ class TestChatTemplateConfigurations:
|
||||
def verify_labels(labels_span, should_train, context_message):
|
||||
"""Helper to verify if a span of labels matches expected training state"""
|
||||
if should_train:
|
||||
assert all(
|
||||
label != IGNORE_TOKEN_ID for label in labels_span
|
||||
), f"Expected all labels for {context_message} to be set, but got {labels_span}"
|
||||
assert all(label != IGNORE_TOKEN_ID for label in labels_span), (
|
||||
f"Expected all labels for {context_message} to be set, but got {labels_span}"
|
||||
)
|
||||
else:
|
||||
assert all(
|
||||
label == IGNORE_TOKEN_ID for label in labels_span
|
||||
), f"Expected all labels for {context_message} to be {IGNORE_TOKEN_ID}, but got {labels_span}"
|
||||
assert all(label == IGNORE_TOKEN_ID for label in labels_span), (
|
||||
f"Expected all labels for {context_message} to be {IGNORE_TOKEN_ID}, but got {labels_span}"
|
||||
)
|
||||
|
||||
# Process all turns and verify labeling
|
||||
for i, turn in enumerate(modified_dataset[0]["messages"]):
|
||||
@@ -861,9 +873,9 @@ class TestChatTemplateConfigurations:
|
||||
actual_labels = labels[
|
||||
start_idx : start_idx + len(token_offsets_masked)
|
||||
]
|
||||
assert (
|
||||
actual_labels == expected_labels
|
||||
), f"Labels mismatch for turn: {turn['value']}\nExpected: {expected_labels}\nActual: {actual_labels}"
|
||||
assert actual_labels == expected_labels, (
|
||||
f"Labels mismatch for turn: {turn['value']}\nExpected: {expected_labels}\nActual: {actual_labels}"
|
||||
)
|
||||
|
||||
# Verify each detail section
|
||||
for detail in adjusted_train_details:
|
||||
@@ -958,7 +970,7 @@ class TestChatTemplateConfigurations:
|
||||
chat_template,
|
||||
chat_template_jinja,
|
||||
eos_token,
|
||||
basic_dataset, # pylint: disable=unused-argument
|
||||
basic_dataset,
|
||||
request,
|
||||
):
|
||||
"""Test that an error is raised when eot_tokens contains eos_token and train_on_eot/train_on_eos conflict"""
|
||||
@@ -1005,7 +1017,7 @@ class TestChatTemplateConfigurations:
|
||||
chat_template,
|
||||
chat_template_jinja,
|
||||
eos_token,
|
||||
basic_dataset, # pylint: disable=unused-argument
|
||||
basic_dataset,
|
||||
request,
|
||||
):
|
||||
"""Test that eot_tokens inherits from eos_token when not specified"""
|
||||
@@ -1032,12 +1044,12 @@ class TestChatTemplateConfigurations:
|
||||
)
|
||||
|
||||
# In backward compatibility mode, eot_tokens should be derived from eos_token
|
||||
assert strategy.eot_tokens == [
|
||||
tokenizer.eos_token
|
||||
], f"Expected eot_tokens to inherit from eos_token, got {strategy.eot_tokens}"
|
||||
assert (
|
||||
strategy.train_on_eot == "turn"
|
||||
), f"Expected train_on_eot to inherit from train_on_eos, got {strategy.train_on_eot}"
|
||||
assert strategy.eot_tokens == [tokenizer.eos_token], (
|
||||
f"Expected eot_tokens to inherit from eos_token, got {strategy.eot_tokens}"
|
||||
)
|
||||
assert strategy.train_on_eot == "turn", (
|
||||
f"Expected train_on_eot to inherit from train_on_eos, got {strategy.train_on_eot}"
|
||||
)
|
||||
|
||||
def test_token_not_in_template(
|
||||
self,
|
||||
@@ -1091,7 +1103,7 @@ class TestChatTemplateConfigurations:
|
||||
tokenizer,
|
||||
chat_template,
|
||||
chat_template_jinja,
|
||||
eos_token, # pylint: disable=unused-argument
|
||||
eos_token,
|
||||
basic_dataset,
|
||||
request,
|
||||
):
|
||||
@@ -1157,13 +1169,13 @@ class TestChatTemplateConfigurations:
|
||||
)
|
||||
|
||||
if is_after_assistant:
|
||||
assert (
|
||||
labels[eot_idx] != IGNORE_TOKEN_ID
|
||||
), f"Expected EOT token after assistant turn at index {eot_idx} to be labeled"
|
||||
assert labels[eot_idx] != IGNORE_TOKEN_ID, (
|
||||
f"Expected EOT token after assistant turn at index {eot_idx} to be labeled"
|
||||
)
|
||||
else:
|
||||
assert (
|
||||
labels[eot_idx] == IGNORE_TOKEN_ID
|
||||
), f"Expected EOT token not after assistant turn at index {eot_idx} to not be labeled"
|
||||
assert labels[eot_idx] == IGNORE_TOKEN_ID, (
|
||||
f"Expected EOT token not after assistant turn at index {eot_idx} to not be labeled"
|
||||
)
|
||||
|
||||
def test_multiple_train_on_eot_settings(
|
||||
self,
|
||||
@@ -1224,9 +1236,9 @@ class TestChatTemplateConfigurations:
|
||||
i for i, token_id in enumerate(input_ids) if token_id == eos_token_id
|
||||
]
|
||||
|
||||
assert (
|
||||
len(eos_indices) > 0
|
||||
), "Expected at least one EOS/EOT token in the input"
|
||||
assert len(eos_indices) > 0, (
|
||||
"Expected at least one EOS/EOT token in the input"
|
||||
)
|
||||
|
||||
# Check labeling for each EOS/EOT token
|
||||
for idx, eos_idx in enumerate(eos_indices):
|
||||
@@ -1252,13 +1264,13 @@ class TestChatTemplateConfigurations:
|
||||
)
|
||||
|
||||
if expected_label:
|
||||
assert (
|
||||
labels[eos_idx] == IGNORE_TOKEN_ID
|
||||
), f"Expected EOT token at index {eos_idx} to not be labeled with train_on_eot='{setting}'"
|
||||
assert labels[eos_idx] == IGNORE_TOKEN_ID, (
|
||||
f"Expected EOT token at index {eos_idx} to not be labeled with train_on_eot='{setting}'"
|
||||
)
|
||||
else:
|
||||
assert (
|
||||
labels[eos_idx] != IGNORE_TOKEN_ID
|
||||
), f"Expected EOT token at index {eos_idx} to be labeled with train_on_eot='{setting}'"
|
||||
assert labels[eos_idx] != IGNORE_TOKEN_ID, (
|
||||
f"Expected EOT token at index {eos_idx} to be labeled with train_on_eot='{setting}'"
|
||||
)
|
||||
|
||||
|
||||
class TestChatTemplateToolCalling:
|
||||
@@ -1378,29 +1390,27 @@ class TestChatTemplateToolCalling:
|
||||
decoded_conversation = tokenizer.decode(input_ids)
|
||||
|
||||
# Verify tool calling structure is present in the decoded conversation
|
||||
assert (
|
||||
'"type": "function",' in decoded_conversation
|
||||
), "Tool type function should be in conversation"
|
||||
assert (
|
||||
'"name": "multiples",' in decoded_conversation
|
||||
), "Tool function name should be in conversation"
|
||||
assert '"type": "function",' in decoded_conversation, (
|
||||
"Tool type function should be in conversation"
|
||||
)
|
||||
assert '"name": "multiples",' in decoded_conversation, (
|
||||
"Tool function name should be in conversation"
|
||||
)
|
||||
|
||||
assert (
|
||||
'<|python_start|><|python_end|>{"name": "multiples", "parameters": {"number": 5, "limit": 20}}<|eot|>'
|
||||
in decoded_conversation
|
||||
), "Assistant tool call should be in conversation"
|
||||
assert (
|
||||
"<|header_start|>ipython<|header_end|>" in decoded_conversation
|
||||
), "IPython header should be in conversation"
|
||||
assert (
|
||||
'"5,10,15"' in decoded_conversation
|
||||
), "Tool response should be in conversation"
|
||||
assert "<|header_start|>ipython<|header_end|>" in decoded_conversation, (
|
||||
"IPython header should be in conversation"
|
||||
)
|
||||
assert '"5,10,15"' in decoded_conversation, (
|
||||
"Tool response should be in conversation"
|
||||
)
|
||||
|
||||
# Get conversation turns to verify labeling
|
||||
turns = strategy.get_conversation_thread(tool_calling_dataset[0])
|
||||
tools = strategy._get_tools( # pylint: disable=protected-access
|
||||
tool_calling_dataset[0]
|
||||
)
|
||||
tools = strategy._get_tools(tool_calling_dataset[0])
|
||||
|
||||
# Check that assistant responses are properly labeled
|
||||
for i, turn in enumerate(tool_calling_dataset[0]["messages"]):
|
||||
@@ -1409,12 +1419,12 @@ class TestChatTemplateToolCalling:
|
||||
turns=turns, turn_idx=i, tools=tools
|
||||
)
|
||||
|
||||
assert (
|
||||
start_idx != -1 and end_idx != -1
|
||||
), f"Assistant turn {i} should be found"
|
||||
assert start_idx != -1 and end_idx != -1, (
|
||||
f"Assistant turn {i} should be found"
|
||||
)
|
||||
|
||||
# Verify that assistant responses have proper labels
|
||||
turn_labels = labels[start_idx:end_idx]
|
||||
assert all(
|
||||
label != IGNORE_TOKEN_ID for label in turn_labels
|
||||
), f"Assistant turn {i} should be unmasked"
|
||||
assert all(label != IGNORE_TOKEN_ID for label in turn_labels), (
|
||||
f"Assistant turn {i} should be unmasked"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user