chore: migrate to ruff (#4305)

* base requirements

* autofix

* Configure ruff for Python linting and formatting

- Set up minimal ruff configuration with basic checks (E, W, F, I)
- Add temporary ignores for common issues during migration
- Configure pre-commit hooks to use ruff with pass_filenames
- This enables gradual migration from black to ruff

* Delete sdj

* autofixed only

* migrate lint action

* more autofixed

* more fixes

* change precommit

* try changing the hook

* try this stuff
This commit is contained in:
Kian Jones
2025-08-29 11:11:19 -07:00
committed by GitHub
parent e6c2c2121e
commit fecf6decfb
121 changed files with 627 additions and 666 deletions

View File

@@ -143,7 +143,7 @@ def assert_invoked_send_message_with_keyword(messages: Sequence[LettaMessage], k
# Message field not in send_message
if "message" not in arguments:
raise InvalidToolCallError(
messages=[target_message], explanation=f"send_message function call does not have required field `message`"
messages=[target_message], explanation="send_message function call does not have required field `message`"
)
# Check that the keyword is in the message arguments
@@ -151,7 +151,7 @@ def assert_invoked_send_message_with_keyword(messages: Sequence[LettaMessage], k
keyword = keyword.lower()
arguments["message"] = arguments["message"].lower()
if not keyword in arguments["message"]:
if keyword not in arguments["message"]:
raise InvalidToolCallError(messages=[target_message], explanation=f"Message argument did not contain keyword={keyword}")

View File

@@ -12,8 +12,7 @@ from letta.schemas.enums import MessageRole
from letta.schemas.file import FileAgent
from letta.schemas.memory import ContextWindowOverview
from letta.schemas.tool import Tool
from letta.schemas.user import User
from letta.schemas.user import User as PydanticUser
from letta.schemas.user import User, User as PydanticUser
from letta.server.rest_api.routers.v1.agents import ImportedAgentsResponse
from letta.server.server import SyncServer
@@ -66,7 +65,6 @@ def retry_until_success(max_attempts=10, sleep_time_seconds=4):
def decorator_retry(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(1, max_attempts + 1):
try:
return func(*args, **kwargs)
@@ -124,32 +122,32 @@ def comprehensive_agent_checks(agent: AgentState, request: Union[CreateAgent, Up
assert agent.llm_config == request.llm_config, f"LLM config mismatch: {agent.llm_config} != {request.llm_config}"
# Assert embedding configuration
assert (
agent.embedding_config == request.embedding_config
), f"Embedding config mismatch: {agent.embedding_config} != {request.embedding_config}"
assert agent.embedding_config == request.embedding_config, (
f"Embedding config mismatch: {agent.embedding_config} != {request.embedding_config}"
)
# Assert memory blocks
if hasattr(request, "memory_blocks"):
assert len(agent.memory.blocks) == len(request.memory_blocks) + len(
request.block_ids
), f"Memory blocks count mismatch: {len(agent.memory.blocks)} != {len(request.memory_blocks) + len(request.block_ids)}"
assert len(agent.memory.blocks) == len(request.memory_blocks) + len(request.block_ids), (
f"Memory blocks count mismatch: {len(agent.memory.blocks)} != {len(request.memory_blocks) + len(request.block_ids)}"
)
memory_block_values = {block.value for block in agent.memory.blocks}
expected_block_values = {block.value for block in request.memory_blocks}
assert expected_block_values.issubset(
memory_block_values
), f"Memory blocks mismatch: {expected_block_values} not in {memory_block_values}"
assert expected_block_values.issubset(memory_block_values), (
f"Memory blocks mismatch: {expected_block_values} not in {memory_block_values}"
)
# Assert tools
assert len(agent.tools) == len(request.tool_ids), f"Tools count mismatch: {len(agent.tools)} != {len(request.tool_ids)}"
assert {tool.id for tool in agent.tools} == set(
request.tool_ids
), f"Tools mismatch: {set(tool.id for tool in agent.tools)} != {set(request.tool_ids)}"
assert {tool.id for tool in agent.tools} == set(request.tool_ids), (
f"Tools mismatch: {set(tool.id for tool in agent.tools)} != {set(request.tool_ids)}"
)
# Assert sources
assert len(agent.sources) == len(request.source_ids), f"Sources count mismatch: {len(agent.sources)} != {len(request.source_ids)}"
assert {source.id for source in agent.sources} == set(
request.source_ids
), f"Sources mismatch: {set(source.id for source in agent.sources)} != {set(request.source_ids)}"
assert {source.id for source in agent.sources} == set(request.source_ids), (
f"Sources mismatch: {set(source.id for source in agent.sources)} != {set(request.source_ids)}"
)
# Assert tags
assert set(agent.tags) == set(request.tags), f"Tags mismatch: {set(agent.tags)} != {set(request.tags)}"
@@ -158,15 +156,15 @@ def comprehensive_agent_checks(agent: AgentState, request: Union[CreateAgent, Up
print("TOOLRULES", request.tool_rules)
print("AGENTTOOLRULES", agent.tool_rules)
if request.tool_rules:
assert len(agent.tool_rules) == len(
request.tool_rules
), f"Tool rules count mismatch: {len(agent.tool_rules)} != {len(request.tool_rules)}"
assert all(
any(rule.tool_name == req_rule.tool_name for rule in agent.tool_rules) for req_rule in request.tool_rules
), f"Tool rules mismatch: {agent.tool_rules} != {request.tool_rules}"
assert len(agent.tool_rules) == len(request.tool_rules), (
f"Tool rules count mismatch: {len(agent.tool_rules)} != {len(request.tool_rules)}"
)
assert all(any(rule.tool_name == req_rule.tool_name for rule in agent.tool_rules) for req_rule in request.tool_rules), (
f"Tool rules mismatch: {agent.tool_rules} != {request.tool_rules}"
)
# Assert message_buffer_autoclear
if not request.message_buffer_autoclear is None:
if request.message_buffer_autoclear is not None:
assert agent.message_buffer_autoclear == request.message_buffer_autoclear
@@ -176,9 +174,9 @@ def validate_context_window_overview(
"""Validate common sense assertions for ContextWindowOverview"""
# 1. Current context size should not exceed maximum
assert (
overview.context_window_size_current <= overview.context_window_size_max
), f"Current context size ({overview.context_window_size_current}) exceeds maximum ({overview.context_window_size_max})"
assert overview.context_window_size_current <= overview.context_window_size_max, (
f"Current context size ({overview.context_window_size_current}) exceeds maximum ({overview.context_window_size_max})"
)
# 2. All token counts should be non-negative
assert overview.num_tokens_system >= 0, "System token count cannot be negative"
@@ -197,14 +195,14 @@ def validate_context_window_overview(
+ overview.num_tokens_messages
+ overview.num_tokens_functions_definitions
)
assert (
overview.context_window_size_current == expected_total
), f"Token sum ({expected_total}) doesn't match current size ({overview.context_window_size_current})"
assert overview.context_window_size_current == expected_total, (
f"Token sum ({expected_total}) doesn't match current size ({overview.context_window_size_current})"
)
# 4. Message count should match messages list length
assert (
len(overview.messages) == overview.num_messages
), f"Messages list length ({len(overview.messages)}) doesn't match num_messages ({overview.num_messages})"
assert len(overview.messages) == overview.num_messages, (
f"Messages list length ({len(overview.messages)}) doesn't match num_messages ({overview.num_messages})"
)
# 5. If summary_memory is None, its token count should be 0
if overview.summary_memory is None: