mirror of
https://github.com/affaan-m/ECC.git
synced 2026-08-17 21:15:40 +02:00
* ci: add ruff + mypy to the Python CI job and fix pyproject tool config The python-tests job runs pytest but not lint/type checks, and the ruff and mypy configuration in pyproject.toml was silently broken, so neither tool could run at all. - add ruff and mypy steps to the existing python-tests job - fix invalid pyproject keys: [tool.ruff] src-path -> src, [tool.mypy] src_paths -> mypy_path - ignore ruff UP042 (the (str, Enum) mixin is intentional) - resolve ruff findings (unused/unsorted imports) across src and tests - fix mypy errors in tools/executor.py and prompt/builder.py * fix(ci): satisfy Python lint after main refresh --------- Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>
86 lines
3.1 KiB
Python
86 lines
3.1 KiB
Python
import pytest
|
|
|
|
from llm.core.types import Message, Role, ToolDefinition
|
|
from llm.prompt import PromptBuilder, adapt_messages_for_provider
|
|
from llm.prompt.builder import PromptConfig
|
|
|
|
|
|
class TestPromptBuilder:
|
|
def test_build_without_system(self):
|
|
messages = [Message(role=Role.USER, content="Hello")]
|
|
builder = PromptBuilder()
|
|
result = builder.build(messages)
|
|
|
|
assert len(result) == 1
|
|
assert result[0].role == Role.USER
|
|
|
|
def test_build_with_system(self):
|
|
messages = [
|
|
Message(role=Role.SYSTEM, content="You are helpful."),
|
|
Message(role=Role.USER, content="Hello"),
|
|
]
|
|
builder = PromptBuilder()
|
|
result = builder.build(messages)
|
|
|
|
assert len(result) == 2
|
|
assert result[0].role == Role.SYSTEM
|
|
|
|
def test_build_adds_system_from_keyword_options(self):
|
|
messages = [Message(role=Role.USER, content="Hello")]
|
|
builder = PromptBuilder(system_template="You are a pirate.")
|
|
result = builder.build(messages)
|
|
|
|
assert len(result) == 2
|
|
assert "pirate" in result[0].content
|
|
|
|
def test_build_adds_system_from_prompt_config(self):
|
|
messages = [Message(role=Role.USER, content="Hello")]
|
|
builder = PromptBuilder(config=PromptConfig(system_template="You are a pirate."))
|
|
result = builder.build(messages)
|
|
|
|
assert len(result) == 2
|
|
assert "pirate" in result[0].content
|
|
|
|
def test_rejects_config_with_keyword_options(self):
|
|
with pytest.raises(ValueError, match="Pass either config or PromptBuilder keyword options"):
|
|
PromptBuilder(
|
|
config=PromptConfig(system_template="Configured."),
|
|
system_template="Keyword override.",
|
|
)
|
|
|
|
def test_empty_system_template_does_not_add_blank_system_message(self):
|
|
messages = [Message(role=Role.USER, content="Hello")]
|
|
builder = PromptBuilder(system_template="")
|
|
result = builder.build(messages)
|
|
|
|
assert result == messages
|
|
|
|
def test_build_with_tools(self):
|
|
messages = [Message(role=Role.USER, content="Search for something")]
|
|
tools = [
|
|
ToolDefinition(name="search", description="Search the web", parameters={}),
|
|
]
|
|
builder = PromptBuilder(include_tools_in_system=True)
|
|
result = builder.build(messages, tools)
|
|
|
|
assert len(result) == 2
|
|
assert "search" in result[0].content
|
|
assert "Available Tools" in result[0].content
|
|
|
|
|
|
class TestAdaptMessagesForProvider:
|
|
def test_adapt_for_claude(self):
|
|
messages = [Message(role=Role.USER, content="Hello")]
|
|
result = adapt_messages_for_provider(messages, "claude")
|
|
assert len(result) == 1
|
|
|
|
def test_adapt_for_openai(self):
|
|
messages = [Message(role=Role.USER, content="Hello")]
|
|
result = adapt_messages_for_provider(messages, "openai")
|
|
assert len(result) == 1
|
|
|
|
def test_adapt_for_ollama(self):
|
|
messages = [Message(role=Role.USER, content="Hello")]
|
|
result = adapt_messages_for_provider(messages, "ollama")
|
|
assert len(result) == 1
|