fix: v1 sdk integration tests for update and create renames (#6139)

* base

* yay

* update

* update

---------

Co-authored-by: Letta Bot <noreply@letta.com>
This commit is contained in:
jnjpng
2025-11-12 15:42:49 -08:00
committed by Caren Thomas
parent b73545cd60
commit 53d01f29a1
13 changed files with 156 additions and 156 deletions

View File

@@ -20,12 +20,12 @@ AGENTS_CREATE_PARAMS = [
),
]
AGENTS_MODIFY_PARAMS = [
AGENTS_UPDATE_PARAMS = [
(
"caren_agent",
{"name": "caren_updated"},
{
# After modifying just the name, model_settings should still be present
# After updating just the name, model_settings should still be present
"model_settings": {
"max_output_tokens": 4096,
"parallel_tool_calls": False,
@@ -50,7 +50,7 @@ globals().update(
resource_name="agents",
id_param_name="agent_id",
create_params=AGENTS_CREATE_PARAMS,
modify_params=AGENTS_MODIFY_PARAMS,
update_params=AGENTS_UPDATE_PARAMS,
list_params=AGENTS_LIST_PARAMS,
)
)

View File

@@ -8,7 +8,7 @@ BLOCKS_CREATE_PARAMS = [
("persona_block", {"label": "persona", "value": "test1"}, {"limit": CORE_MEMORY_PERSONA_CHAR_LIMIT}, None),
]
BLOCKS_MODIFY_PARAMS = [
BLOCKS_UPDATE_PARAMS = [
("human_block", {"value": "test2"}, {}, None),
("persona_block", {"value": "testing testing testing", "limit": 10}, {}, UnprocessableEntityError),
]
@@ -25,7 +25,7 @@ globals().update(
resource_name="blocks",
id_param_name="block_id",
create_params=BLOCKS_CREATE_PARAMS,
modify_params=BLOCKS_MODIFY_PARAMS,
update_params=BLOCKS_UPDATE_PARAMS,
list_params=BLOCKS_LIST_PARAMS,
)
)

View File

@@ -66,7 +66,7 @@ def create_test_module(
id_param_name: str,
create_params: List[Tuple[str, Dict[str, Any], Dict[str, Any], Optional[Exception]]] = [],
upsert_params: List[Tuple[str, Dict[str, Any], Dict[str, Any], Optional[Exception]]] = [],
modify_params: List[Tuple[str, Dict[str, Any], Dict[str, Any], Optional[Exception]]] = [],
update_params: List[Tuple[str, Dict[str, Any], Dict[str, Any], Optional[Exception]]] = [],
list_params: List[Tuple[Dict[str, Any], int]] = [],
) -> Dict[str, Any]:
"""Create a test module for a resource.
@@ -78,7 +78,7 @@ def create_test_module(
resource_name: Name of the resource (e.g., "blocks", "tools")
id_param_name: Name of the ID parameter (e.g., "block_id", "tool_id")
create_params: List of (name, params, expected_error) tuples for create tests
modify_params: List of (name, params, expected_error) tuples for modify tests
update_params: List of (name, params, expected_error) tuples for update tests
list_params: List of (query_params, expected_count) tuples for list tests
Returns:
@@ -174,9 +174,9 @@ def create_test_module(
assert custom_model_dump(getattr(item, key)) == value
@pytest.mark.order(3)
def test_modify(handler, caren_agent, name, params, extra_expected_values, expected_error):
"""Test modifying a resource."""
skip_test_if_not_implemented(handler, resource_name, "modify")
def test_update(handler, caren_agent, name, params, extra_expected_values, expected_error):
"""Test updating a resource."""
skip_test_if_not_implemented(handler, resource_name, "update")
if name not in test_item_ids:
pytest.skip(f"Item '{name}' not found in test_items")
@@ -186,7 +186,7 @@ def create_test_module(
processed_extra_expected = preprocess_params(extra_expected_values, caren_agent)
try:
item = handler.modify(**processed_params)
item = handler.update(**processed_params)
except Exception as e:
if expected_error is not None:
assert isinstance(e, expected_error), f"Expected error with type {expected_error}, but got {type(e)}: {e}"
@@ -248,7 +248,7 @@ def create_test_module(
"test_create": pytest.mark.parametrize("name, params, extra_expected_values, expected_error", create_params)(test_create),
"test_retrieve": test_retrieve,
"test_upsert": pytest.mark.parametrize("name, params, extra_expected_values, expected_error", upsert_params)(test_upsert),
"test_modify": pytest.mark.parametrize("name, params, extra_expected_values, expected_error", modify_params)(test_modify),
"test_update": pytest.mark.parametrize("name, params, extra_expected_values, expected_error", update_params)(test_update),
"test_delete": test_delete,
"test_list": pytest.mark.parametrize("query_params, count", list_params)(test_list),
}

View File

@@ -10,7 +10,7 @@ GROUPS_CREATE_PARAMS = [
),
]
GROUPS_MODIFY_PARAMS = [
GROUPS_UPDATE_PARAMS = [
(
"round_robin_group",
{"manager_config": {"manager_type": "round_robin", "max_turns": 10}},
@@ -30,7 +30,7 @@ globals().update(
resource_name="groups",
id_param_name="group_id",
create_params=GROUPS_CREATE_PARAMS,
modify_params=GROUPS_MODIFY_PARAMS,
update_params=GROUPS_UPDATE_PARAMS,
list_params=GROUPS_LIST_PARAMS,
)
)

View File

@@ -5,7 +5,7 @@ IDENTITIES_CREATE_PARAMS = [
("caren2", {"identifier_key": "456", "name": "caren", "identity_type": "user"}, {}, None),
]
IDENTITIES_MODIFY_PARAMS = [
IDENTITIES_UPDATE_PARAMS = [
("caren1", {"properties": [{"key": "email", "value": "caren@letta.com", "type": "string"}]}, {}, None),
("caren2", {"properties": [{"key": "email", "value": "caren@gmail.com", "type": "string"}]}, {}, None),
]
@@ -37,7 +37,7 @@ globals().update(
id_param_name="identity_id",
create_params=IDENTITIES_CREATE_PARAMS,
upsert_params=IDENTITIES_UPSERT_PARAMS,
modify_params=IDENTITIES_MODIFY_PARAMS,
update_params=IDENTITIES_UPDATE_PARAMS,
list_params=IDENTITIES_LIST_PARAMS,
)
)

View File

@@ -143,7 +143,7 @@ def test_run_code(
otid=USER_MESSAGE_OTID,
)
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=[user_message],
)

View File

@@ -100,7 +100,7 @@ def accumulate_chunks(stream):
def approve_tool_call(client: Letta, agent_id: str, tool_call_id: str):
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent_id,
messages=[
ApprovalCreateParam(
@@ -168,7 +168,7 @@ def agent(client: Letta, approval_tool_fixture, dice_tool_fixture) -> AgentState
tags=["approval_test"],
)
# Enable parallel tool calls for testing
agent_state = client.agents.modify(agent_id=agent_state.id, parallel_tool_calls=True)
agent_state = client.agents.update(agent_id=agent_state.id, parallel_tool_calls=True)
yield agent_state
client.agents.delete(agent_id=agent_state.id)
@@ -181,7 +181,7 @@ def agent(client: Letta, approval_tool_fixture, dice_tool_fixture) -> AgentState
def test_send_approval_without_pending_request(client, agent):
with pytest.raises(APIError, match="No tool call is currently awaiting approval"):
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -200,13 +200,13 @@ def test_send_approval_without_pending_request(client, agent):
def test_send_user_message_with_pending_request(client, agent):
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
with pytest.raises(APIError, match="Please approve or deny the pending request before continuing"):
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[MessageCreateParam(role="user", content="hi")],
)
@@ -215,13 +215,13 @@ def test_send_user_message_with_pending_request(client, agent):
def test_send_approval_message_with_incorrect_request_id(client, agent):
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
with pytest.raises(APIError, match="Invalid tool call IDs"):
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -250,7 +250,7 @@ def test_invoke_approval_request(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -311,7 +311,7 @@ def test_invoke_tool_after_turning_off_requires_approval(
agent: AgentState,
approval_tool_fixture,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -385,7 +385,7 @@ def test_approve_tool_call_request(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -437,7 +437,7 @@ def test_approve_cursor_fetch(
agent: AgentState,
) -> None:
last_message_cursor = client.agents.messages.list(agent_id=agent.id, limit=1).items[0].id
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -457,7 +457,7 @@ def test_approve_cursor_fetch(
_args = _json.loads(messages[3].tool_call.arguments)
assert "request_heartbeat" not in _args
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -493,7 +493,7 @@ def test_approve_with_context_check(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -531,13 +531,13 @@ def test_approve_and_follow_up(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
tool_call_id = response.messages[2].tool_call.tool_call_id
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -586,7 +586,7 @@ def test_deny_tool_call_request(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -630,7 +630,7 @@ def test_deny_cursor_fetch(
agent: AgentState,
) -> None:
last_message_cursor = client.agents.messages.list(agent_id=agent.id, limit=1).items[0].id
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -651,7 +651,7 @@ def test_deny_cursor_fetch(
# _args = _json.loads(messages[2].tool_call.arguments)
# assert "request_heartbeat" not in _args
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -687,7 +687,7 @@ def test_deny_with_context_check(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -727,13 +727,13 @@ def test_deny_and_follow_up(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
tool_call_id = response.messages[2].tool_call.tool_call_id
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -781,7 +781,7 @@ def test_agent_records_last_stop_reason_after_approval_flow(
initial_stop_reason = initial_agent.last_stop_reason
# Trigger approval request
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -805,7 +805,7 @@ def test_agent_records_last_stop_reason_after_approval_flow(
assert agent_after_approval.last_stop_reason != initial_stop_reason
# Send follow-up message to complete the flow
response2 = client.agents.messages.send(
response2 = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_FOLLOW_UP,
)
@@ -824,7 +824,7 @@ def test_client_side_tool_call_request(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -869,7 +869,7 @@ def test_client_side_tool_call_cursor_fetch(
agent: AgentState,
) -> None:
last_message_cursor = client.agents.messages.list(agent_id=agent.id, limit=1).items[0].id
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -890,7 +890,7 @@ def test_client_side_tool_call_cursor_fetch(
# _args = _json.loads(messages[2].tool_call.arguments)
# assert "request_heartbeat" not in _args
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -929,7 +929,7 @@ def test_client_side_tool_call_with_context_check(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -969,13 +969,13 @@ def test_client_side_tool_call_and_follow_up(
client: Letta,
agent: AgentState,
) -> None:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
tool_call_id = response.messages[2].tool_call.tool_call_id
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -1026,7 +1026,7 @@ def test_parallel_tool_calling(
pytest.skip("Parallel tool calling test only applies to Anthropic models.")
last_message_cursor = client.agents.messages.list(agent_id=agent.id, limit=1).items[0].id
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_PARALLEL_TOOL_CALL,
)
@@ -1145,7 +1145,7 @@ def test_parallel_tool_calling(
# ensure context is not bricked
client.agents.retrieve(agent_id=agent.id)
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
ApprovalCreateParam(
@@ -1241,7 +1241,7 @@ def test_agent_records_last_stop_reason_after_approval_flow(
initial_stop_reason = initial_agent.last_stop_reason
# Trigger approval request
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_TEST_APPROVAL,
)
@@ -1265,7 +1265,7 @@ def test_agent_records_last_stop_reason_after_approval_flow(
assert agent_after_approval.last_stop_reason != initial_stop_reason
# Send follow-up message to complete the flow
response2 = client.agents.messages.send(
response2 = client.agents.messages.create(
agent_id=agent.id,
messages=USER_MESSAGE_FOLLOW_UP,
)

View File

@@ -121,7 +121,7 @@ def test_send_message_to_agent(client: Letta, agent_obj: AgentState, other_agent
secret_word = "banana"
# Encourage the agent to send a message to the other agent_obj with the secret string
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_obj.id,
messages=[
MessageCreateParam(
@@ -187,7 +187,7 @@ def test_send_message_to_agent(client: Letta, agent_obj: AgentState, other_agent
raise Exception(f"Was not able to find an instance of the target snippet: {target_snippet}")
# Test that the agent can still receive messages fine
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_obj.id,
messages=[
MessageCreateParam(
@@ -243,7 +243,7 @@ def test_send_message_to_agents_with_tags_simple(client: Letta):
worker_agents_456.append(worker_agent_state)
# Encourage the manager to send a message to the other agent_obj with the secret string
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=manager_agent_state.id,
messages=[
MessageCreateParam(
@@ -294,7 +294,7 @@ def test_send_message_to_agents_with_tags_simple(client: Letta):
assert secret_word not in m.content, f"Secret word should not be in agent {agent_state.id}"
# Test that the agent can still receive messages fine
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=manager_agent_state.id,
messages=[
MessageCreateParam(
@@ -333,7 +333,7 @@ def test_send_message_to_agents_with_tags_complex_tool_use(client: Letta, roll_d
# Encourage the manager to send a message to the other agent_obj with the secret string
broadcast_message = f"Send a message to all agents with tags {worker_tags} asking them to roll a dice for you!"
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=manager_agent_state.id,
messages=[
MessageCreateParam(
@@ -363,7 +363,7 @@ def test_send_message_to_agents_with_tags_complex_tool_use(client: Letta, roll_d
break
# Test that the agent can still receive messages fine
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=manager_agent_state.id,
messages=[
MessageCreateParam(

View File

@@ -931,8 +931,8 @@ def test_greeting_with_assistant_message(
pytest.skip(f"Skipping deprecated model {llm_config.model}")
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.send(
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
)
@@ -964,8 +964,8 @@ def test_greeting_without_assistant_message(
pytest.skip(f"Skipping deprecated model {llm_config.model}")
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.send(
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
use_assistant_message=False,
@@ -1001,7 +1001,7 @@ def test_tool_call(
pytest.skip(f"Skipping {llm_config.model} due to OTID chain issue and incomplete agent response")
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use the thinking prompt for Anthropic models with extended reasoning to ensure second reasoning step
if llm_config.model_endpoint_type == "anthropic" and llm_config.enable_reasoner:
messages_to_send = USER_MESSAGE_ROLL_DICE_LONG_THINKING
@@ -1010,7 +1010,7 @@ def test_tool_call(
else:
messages_to_send = USER_MESSAGE_ROLL_DICE
try:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=messages_to_send,
)
@@ -1065,8 +1065,8 @@ def test_base64_image_input(
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.send(
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_BASE64_IMAGE,
)
@@ -1093,13 +1093,13 @@ def test_agent_loop_error(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
with patch("letta.agents.letta_agent_v2.LettaAgentV2.step") as mock_step:
mock_step.side_effect = LLMError("No tool calls found in response, model must make a tool call")
with pytest.raises(APIError):
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
)
@@ -1127,7 +1127,7 @@ def test_step_streaming_greeting_with_assistant_message(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.stream(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
@@ -1160,7 +1160,7 @@ def test_step_streaming_greeting_without_assistant_message(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.stream(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
@@ -1204,7 +1204,7 @@ def test_step_streaming_tool_call(
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use the thinking prompt for Anthropic models with extended reasoning to ensure second reasoning step
if llm_config.model_endpoint_type == "anthropic" and llm_config.enable_reasoner:
messages_to_send = USER_MESSAGE_ROLL_DICE_LONG_THINKING
@@ -1256,7 +1256,7 @@ def test_step_stream_agent_loop_error(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
with patch("letta.agents.letta_agent_v2.LettaAgentV2.stream") as mock_step:
mock_step.side_effect = ValueError("No tool calls found in response, model must make a tool call")
@@ -1290,7 +1290,7 @@ def test_token_streaming_greeting_with_assistant_message(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use longer message for Anthropic models to test if they stream in chunks
if llm_config.model_endpoint_type == "anthropic":
messages_to_send = USER_MESSAGE_FORCE_LONG_REPLY
@@ -1328,7 +1328,7 @@ def test_token_streaming_greeting_without_assistant_message(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use longer message for Anthropic models to force chunking
if llm_config.model_endpoint_type == "anthropic":
messages_to_send = USER_MESSAGE_FORCE_LONG_REPLY
@@ -1381,7 +1381,7 @@ def test_token_streaming_tool_call(
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use longer message for Anthropic models to force chunking
if llm_config.model_endpoint_type == "anthropic":
if llm_config.enable_reasoner:
@@ -1437,7 +1437,7 @@ def test_token_streaming_agent_loop_error(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
with patch("letta.agents.letta_agent_v2.LettaAgentV2.stream") as mock_step:
mock_step.side_effect = ValueError("No tool calls found in response, model must make a tool call")
@@ -1472,7 +1472,7 @@ def test_background_token_streaming_greeting_with_assistant_message(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use longer message for Anthropic models to test if they stream in chunks
if llm_config.model_endpoint_type == "anthropic":
messages_to_send = USER_MESSAGE_FORCE_LONG_REPLY
@@ -1531,7 +1531,7 @@ def test_background_token_streaming_greeting_without_assistant_message(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use longer message for Anthropic models to force chunking
if llm_config.model_endpoint_type == "anthropic":
messages_to_send = USER_MESSAGE_FORCE_LONG_REPLY
@@ -1585,7 +1585,7 @@ def test_background_token_streaming_tool_call(
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use longer message for Anthropic models to force chunking
if llm_config.model_endpoint_type == "anthropic":
if llm_config.enable_reasoner:
@@ -1645,9 +1645,9 @@ def test_async_greeting_with_assistant_message(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
run = client.agents.messages.send_async(
run = client.agents.messages.create_async(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
)
@@ -1681,9 +1681,9 @@ def test_async_greeting_with_assistant_message(
# """
# last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
# client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
# client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
#
# run = client.agents.messages.send_async(
# run = client.agents.messages.create_async(
# agent_id=agent_state.id,
# messages=USER_MESSAGE_FORCE_REPLY,
# use_assistant_message=False,
@@ -1732,7 +1732,7 @@ def test_async_tool_call(
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use the thinking prompt for Anthropic models with extended reasoning to ensure second reasoning step
if llm_config.model_endpoint_type == "anthropic" and llm_config.enable_reasoner:
@@ -1741,7 +1741,7 @@ def test_async_tool_call(
messages_to_send = USER_MESSAGE_ROLL_DICE_GEMINI_FLASH
else:
messages_to_send = USER_MESSAGE_ROLL_DICE
run = client.agents.messages.send_async(
run = client.agents.messages.create_async(
agent_id=agent_state.id,
messages=messages_to_send,
)
@@ -1865,11 +1865,11 @@ def test_async_greeting_with_callback_url(
if not config_filename or config_filename in limited_configs:
pytest.skip(f"Skipping test for limited model {llm_config.model}")
client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
with callback_server() as server:
# Create async job with callback URL
run = client.agents.messages.send_async(
run = client.agents.messages.create_async(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
callback_url=server.url,
@@ -1957,7 +1957,7 @@ def test_auto_summarize(disable_e2b_api_key: Any, client: Letta, llm_config: LLM
for attempt in range(MAX_ATTEMPTS):
try:
client.agents.messages.send(
client.agents.messages.create(
agent_id=temp_agent_state.id,
messages=[MessageCreateParam(role="user", content=philosophical_question)],
)
@@ -2014,10 +2014,10 @@ def test_job_creation_for_send_message(
Test that send_message endpoint creates a job and the job completes successfully.
"""
previous_runs = client.runs.list(agent_ids=[agent_state.id])
client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Send a simple message and verify a job was created
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
)
@@ -2050,11 +2050,11 @@ def test_job_creation_for_send_message(
# """
# Test that an async job can be cancelled and the cancellation is reflected in the job status.
# """
# client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
# client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
#
# # client.runs.cancel
# # Start an async job
# run = client.agents.messages.send_async(
# run = client.agents.messages.create_async(
# agent_id=agent_state.id,
# messages=USER_MESSAGE_FORCE_REPLY,
# )
@@ -2107,10 +2107,10 @@ def test_job_creation_for_send_message(
# """
# Test that completed jobs cannot be cancelled.
# """
# client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
# client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
#
# # Start an async job and wait for it to complete
# run = client.agents.messages.send_async(
# run = client.agents.messages.create_async(
# agent_id=agent_state.id,
# messages=USER_MESSAGE_FORCE_REPLY,
# )
@@ -2141,7 +2141,7 @@ def test_job_creation_for_send_message(
# Test that streaming jobs are independent of client connection state.
# This verifies that jobs continue even if the client "disconnects" (simulated by not consuming the stream).
# """
# client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
# client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
#
# # Create a streaming request
# import threading
@@ -2222,8 +2222,8 @@ def test_inner_thoughts_false_non_reasoner_models(
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=adjusted_llm_config)
response = client.agents.messages.send(
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=adjusted_llm_config)
response = client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
)
@@ -2269,7 +2269,7 @@ def test_inner_thoughts_false_non_reasoner_models_streaming(
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=adjusted_llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=adjusted_llm_config)
response = client.agents.messages.stream(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
@@ -2309,10 +2309,10 @@ def test_inner_thoughts_toggle_interleaved(
pytest.skip(f"Skipping `test_inner_thoughts_toggle_interleaved` for model endpoint type {llm_config.model_endpoint_type}")
assert not is_reasoning_completely_disabled(llm_config), "Reasoning should be enabled"
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Send a message with inner thoughts
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_GREETING,
)
@@ -2323,7 +2323,7 @@ def test_inner_thoughts_toggle_interleaved(
new_llm_config["enable_reasoner"] = False
new_llm_config["max_reasoning_tokens"] = 0
adjusted_llm_config = LLMConfig(**new_llm_config)
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=adjusted_llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=adjusted_llm_config)
# Preview the message payload of the next message
# response = client.agents.messages.preview_raw_payload(
@@ -2370,10 +2370,10 @@ def test_input_parameter_basic(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
# Use input parameter instead of messages
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_state.id,
input=f"This is an automated test message. Call the send_message tool with the message '{USER_MESSAGE_RESPONSE}'.",
)
@@ -2402,7 +2402,7 @@ def test_input_parameter_streaming(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
response = client.agents.messages.stream(
agent_id=agent_state.id,
@@ -2436,9 +2436,9 @@ def test_input_parameter_async(
"""
last_message_page = client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
run = client.agents.messages.send_async(
run = client.agents.messages.create_async(
agent_id=agent_state.id,
input=f"This is an automated test message. Call the send_message tool with the message '{USER_MESSAGE_RESPONSE}'.",
)
@@ -2461,7 +2461,7 @@ def test_input_and_messages_both_provided_error(
Tests that providing both input and messages raises a validation error.
"""
with pytest.raises(APIError) as exc_info:
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent_state.id,
input="This is a test message",
messages=USER_MESSAGE_FORCE_REPLY,
@@ -2479,7 +2479,7 @@ def test_input_and_messages_neither_provided_error(
Tests that providing neither input nor messages raises a validation error.
"""
with pytest.raises(APIError) as exc_info:
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent_state.id,
)
# Should get a 422 validation error

View File

@@ -548,17 +548,17 @@ async def test_greeting(
) -> None:
last_message_page = await client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = await client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = await client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
if send_type == "step":
response = await client.agents.messages.send(
response = await client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
)
messages = response.messages
run_id = next((msg.run_id for msg in messages if hasattr(msg, "run_id")), None)
elif send_type == "async":
run = await client.agents.messages.send_async(
run = await client.agents.messages.create_async(
agent_id=agent_state.id,
messages=USER_MESSAGE_FORCE_REPLY,
)
@@ -630,19 +630,19 @@ async def test_parallel_tool_calls(
# IMPORTANT: Set parallel_tool_calls at BOTH the agent level and llm_config level
# There are two different parallel_tool_calls fields that need to be set
agent_state = await client.agents.modify(
agent_state = await client.agents.update(
agent_id=agent_state.id,
llm_config=modified_llm_config,
parallel_tool_calls=True, # Set at agent level as well!
)
if send_type == "step":
await client.agents.messages.send(
await client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_PARALLEL_TOOL_CALL,
)
elif send_type == "async":
run = await client.agents.messages.send_async(
run = await client.agents.messages.create_async(
agent_id=agent_state.id,
messages=USER_MESSAGE_PARALLEL_TOOL_CALL,
)
@@ -815,21 +815,21 @@ async def test_tool_call(
last_message_page = await client.agents.messages.list(agent_id=agent_state.id, limit=1)
last_message = last_message_page.items[0] if last_message_page.items else None
agent_state = await client.agents.modify(agent_id=agent_state.id, llm_config=llm_config)
agent_state = await client.agents.update(agent_id=agent_state.id, llm_config=llm_config)
if cancellation == "with_cancellation":
delay = 5 if llm_config.model == "gpt-5" else 0.5 # increase delay for responses api
_cancellation_task = asyncio.create_task(cancel_run_after_delay(client, agent_state.id, delay=delay))
if send_type == "step":
response = await client.agents.messages.send(
response = await client.agents.messages.create(
agent_id=agent_state.id,
messages=USER_MESSAGE_ROLL_DICE,
)
messages = response.messages
run_id = next((msg.run_id for msg in messages if hasattr(msg, "run_id")), None)
elif send_type == "async":
run = await client.agents.messages.send_async(
run = await client.agents.messages.create_async(
agent_id=agent_state.id,
messages=USER_MESSAGE_ROLL_DICE,
)

View File

@@ -412,7 +412,7 @@ def test_update_stdio_mcp_server(client: Letta):
"env": {"NEW_ENV": "new_value", "PORT": "3000"},
}
updated_server = client.mcp_servers.modify(server_id, **update_request)
updated_server = client.mcp_servers.update(server_id, **update_request)
assert get_attr(updated_server, "server_name") == "updated-stdio-server"
assert get_attr(updated_server, "args") == ["new_server.js", "--port", "3000"]
@@ -445,7 +445,7 @@ def test_update_sse_mcp_server(client: Letta):
"custom_headers": {"X-Updated": "true", "X-Version": "2.0"},
}
updated_server = client.mcp_servers.modify(server_id, **update_request)
updated_server = client.mcp_servers.update(server_id, **update_request)
assert get_attr(updated_server, "server_name") == "updated-sse-server"
assert get_attr(updated_server, "server_url") == "https://new.example.com/sse/v2"
@@ -594,7 +594,7 @@ def test_partial_update_preserves_fields(client: Letta):
# Update only the server name
update_request = {"server_name": "renamed-server"}
updated_server = client.mcp_servers.modify(server_id, **update_request)
updated_server = client.mcp_servers.update(server_id, **update_request)
assert get_attr(updated_server, "server_name") == "renamed-server"
# Other fields should be preserved
@@ -622,7 +622,7 @@ def test_concurrent_server_operations(client: Letta):
for i, server_id in enumerate(servers_created):
update_request = {"server_name": f"updated-concurrent-{i}"}
updated_server = client.mcp_servers.modify(server_id, **update_request)
updated_server = client.mcp_servers.update(server_id, **update_request)
assert get_attr(updated_server, "server_name") == f"updated-concurrent-{i}"
# Get all servers
@@ -657,7 +657,7 @@ def test_full_server_lifecycle(client: Letta):
# 4. Update server
update_request = {"server_name": "lifecycle-updated", "env": {"TEST": "false", "NEW_VAR": "value"}}
updated_server = client.mcp_servers.modify(server_id, **update_request)
updated_server = client.mcp_servers.update(server_id, **update_request)
assert get_attr(updated_server, "server_name") == "lifecycle-updated"
# 5. List tools
@@ -734,7 +734,7 @@ def test_mcp_echo_tool_with_agent(client: Letta, agent_with_mcp_tools: AgentStat
"""
test_message = "Hello from MCP integration test!"
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_with_mcp_tools.id,
messages=[
{
@@ -772,7 +772,7 @@ def test_mcp_add_tool_with_agent(client: Letta, agent_with_mcp_tools: AgentState
a, b = 42, 58
expected_sum = a + b
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent_with_mcp_tools.id,
messages=[
{
@@ -860,7 +860,7 @@ def test_mcp_multiple_tools_in_sequence_with_agent(client: Letta):
)
# Send message requiring multiple tool calls
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
{
@@ -963,7 +963,7 @@ def test_mcp_complex_schema_tool_with_agent(client: Letta):
)
# Test 1: Simple call with just preset
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
{
@@ -988,7 +988,7 @@ def test_mcp_complex_schema_tool_with_agent(client: Letta):
assert "Preset: a" in complex_return.tool_return, f"Expected 'Preset: a' in return, got: {complex_return.tool_return}"
# Test 2: Complex call with nested data
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
{
@@ -1018,7 +1018,7 @@ def test_mcp_complex_schema_tool_with_agent(client: Letta):
# Test 3: If create_person tool is available, test it
if create_person_tool:
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
{

View File

@@ -290,7 +290,7 @@ def test_shared_blocks(client: LettaSDKClient):
)
# update memory
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent_state1.id,
messages=[
MessageCreateParam(
@@ -304,7 +304,7 @@ def test_shared_blocks(client: LettaSDKClient):
block_value = client.blocks.retrieve(block_id=block.id).value
assert "charles" in block_value.lower(), f"Shared block update failed {block_value}"
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent_state2.id,
messages=[
MessageCreateParam(
@@ -336,7 +336,7 @@ def test_read_only_block(client: LettaSDKClient):
)
# make sure agent cannot update read-only block
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreateParam(
@@ -352,7 +352,7 @@ def test_read_only_block(client: LettaSDKClient):
# make sure can update from client
new_value = "hello"
client.agents.blocks.modify(agent_id=agent.id, block_label="human", value=new_value)
client.agents.blocks.update(agent_id=agent.id, block_label="human", value=new_value)
block = client.agents.blocks.retrieve(agent_id=agent.id, block_label="human")
assert block.value == new_value
@@ -380,7 +380,7 @@ def test_add_and_manage_tags_for_agent(client: LettaSDKClient):
assert len(agent.tags) == 0
# Step 1: Add multiple tags to the agent
updated_agent = client.agents.modify(agent_id=agent.id, tags=tags_to_add)
updated_agent = client.agents.update(agent_id=agent.id, tags=tags_to_add)
# Add small delay to ensure tags are persisted
time.sleep(0.1)
@@ -398,7 +398,7 @@ def test_add_and_manage_tags_for_agent(client: LettaSDKClient):
# Step 4: Delete a specific tag from the agent and verify its removal
tag_to_delete = tags_to_add.pop()
updated_agent = client.agents.modify(agent_id=agent.id, tags=tags_to_add)
updated_agent = client.agents.update(agent_id=agent.id, tags=tags_to_add)
# Verify the tag is removed from the agent's tags - explicitly request tags
remaining_tags = client.agents.retrieve(agent_id=agent.id, include=["agent.tags"]).tags
@@ -406,7 +406,7 @@ def test_add_and_manage_tags_for_agent(client: LettaSDKClient):
assert set(remaining_tags) == set(tags_to_add), f"Expected remaining tags to be {tags_to_add[1:]}, but got {remaining_tags}"
# Step 5: Delete all remaining tags from the agent
client.agents.modify(agent_id=agent.id, tags=[])
client.agents.update(agent_id=agent.id, tags=[])
# Verify all tags are removed - explicitly request tags
final_tags = client.agents.retrieve(agent_id=agent.id, include=["agent.tags"]).tags
@@ -427,7 +427,7 @@ def test_reset_messages(client: LettaSDKClient):
try:
# Send a message
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[MessageCreateParam(role="user", content="Hello")],
)
@@ -596,7 +596,7 @@ def test_modify_message(client: LettaSDKClient):
try:
# Send a message
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[MessageCreateParam(role="user", content="Original message")],
)
@@ -624,7 +624,7 @@ def test_modify_message(client: LettaSDKClient):
try:
# Check if modify method exists
if hasattr(client.agents.messages, "modify"):
updated_message = client.agents.messages.modify(
updated_message = client.agents.messages.update(
agent_id=agent.id,
message_id=message_id,
content="Modified message content",
@@ -751,7 +751,7 @@ def test_update_agent_memory_label(client: LettaSDKClient, agent: AgentState):
example_new_label = "example_new_label"
assert example_new_label not in current_labels
client.agents.blocks.modify(
client.agents.blocks.update(
agent_id=agent.id,
block_label=example_label,
label=example_new_label,
@@ -809,7 +809,7 @@ def test_update_agent_memory_limit(client: LettaSDKClient, agent: AgentState):
# We expect this to throw a value error
with pytest.raises(APIError):
client.agents.blocks.modify(
client.agents.blocks.update(
agent_id=agent.id,
block_label=example_label,
limit=example_new_limit,
@@ -818,7 +818,7 @@ def test_update_agent_memory_limit(client: LettaSDKClient, agent: AgentState):
# Now try the same thing with a higher limit
example_new_limit = current_block_length + 10000
assert example_new_limit > current_block_length
client.agents.blocks.modify(
client.agents.blocks.update(
agent_id=agent.id,
block_label=example_label,
limit=example_new_limit,
@@ -828,7 +828,7 @@ def test_update_agent_memory_limit(client: LettaSDKClient, agent: AgentState):
def test_messages(client: LettaSDKClient, agent: AgentState):
send_message_response = client.agents.messages.send(
send_message_response = client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreateParam(
@@ -848,7 +848,7 @@ def test_messages(client: LettaSDKClient, agent: AgentState):
def test_send_system_message(client: LettaSDKClient, agent: AgentState):
"""Important unit test since the Letta API exposes sending system messages, but some backends don't natively support it (eg Anthropic)"""
send_system_message_response = client.agents.messages.send(
send_system_message_response = client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreateParam(
@@ -877,7 +877,7 @@ def test_function_return_limit(disable_e2b_api_key, client: LettaSDKClient, agen
client.agents.tools.attach(agent_id=agent.id, tool_id=tool.id)
# get function response
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreateParam(
@@ -914,7 +914,7 @@ def test_function_always_error(client: LettaSDKClient, agent: AgentState):
client.agents.tools.attach(agent_id=agent.id, tool_id=tool.id)
# get function response
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreateParam(
@@ -1129,7 +1129,7 @@ def test_include_return_message_types(client: LettaSDKClient, agent: AgentState,
verify_message_types(messages, message_types)
elif message_create == "async":
response = client.agents.messages.send_async(
response = client.agents.messages.create_async(
agent_id=agent.id,
messages=[
MessageCreateParam(
@@ -1165,7 +1165,7 @@ def test_include_return_message_types(client: LettaSDKClient, agent: AgentState,
verify_message_types(messages, message_types)
elif message_create == "sync":
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreateParam(
@@ -1287,7 +1287,7 @@ def test_pydantic_inventory_management_tool(e2b_sandbox_mode, client: LettaSDKCl
include_base_tools=False,
)
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=temp_agent.id,
messages=[
MessageCreateParam(
@@ -1377,7 +1377,7 @@ def test_pydantic_task_planning_tool(e2b_sandbox_mode, client: LettaSDKClient):
],
)
response = client.agents.messages.send(
response = client.agents.messages.create(
agent_id=temp_agent.id,
messages=[
MessageCreateParam(
@@ -1619,7 +1619,7 @@ def test_agent_tool_rules_deduplication(client: LettaSDKClient):
MaxCountPerStepToolRule(tool_name="test_tool", max_count_limit=3, type="max_count_per_step"), # different limit, not a duplicate
]
updated_agent = client.agents.modify(agent_id=agent_state.id, tool_rules=update_rules)
updated_agent = client.agents.update(agent_id=agent_state.id, tool_rules=update_rules)
# Check that duplicates were removed
assert len(updated_agent.tool_rules) == 3, f"Expected 3 unique tool rules after update, got {len(updated_agent.tool_rules)}"
@@ -1806,7 +1806,7 @@ def test_add_tool_with_multiple_functions_in_source_code(client: LettaSDKClient)
# ).strip()
#
# # Modify the tool with new source code
# modified_tool = client.tools.modify(name="helper_utility", tool_id=tool.id, source_code=new_source_code)
# modified_tool = client.tools.update(name="helper_utility", tool_id=tool.id, source_code=new_source_code)
#
# # Verify the name automatically updated to the last function
# assert modified_tool.name == "helper_utility"
@@ -1844,7 +1844,7 @@ def test_add_tool_with_multiple_functions_in_source_code(client: LettaSDKClient)
# ).strip()
#
# # Modify again
# final_tool = client.tools.modify(tool_id=tool.id, source_code=single_function_code)
# final_tool = client.tools.update(tool_id=tool.id, source_code=single_function_code)
#
# # Verify name updated again
# assert final_tool.name == "calculate_total"
@@ -1911,12 +1911,12 @@ def test_tool_rename_with_json_schema_and_source_code(client: LettaSDKClient):
# verify there is a 400 error when both source code and json schema are provided
with pytest.raises(Exception) as e:
client.tools.modify(tool_id=tool.id, source_code=new_source_code, json_schema=custom_json_schema)
client.tools.update(tool_id=tool.id, source_code=new_source_code, json_schema=custom_json_schema)
assert e.value.status_code == 400
# update with consistent name and schema
custom_json_schema["name"] = "renamed_function"
tool = client.tools.modify(tool_id=tool.id, json_schema=custom_json_schema)
tool = client.tools.update(tool_id=tool.id, json_schema=custom_json_schema)
assert tool.json_schema == custom_json_schema
assert tool.name == "renamed_function"
@@ -2108,7 +2108,7 @@ def test_run_list(client: LettaSDKClient):
)
# message an agent
client.agents.messages.send(
client.agents.messages.create(
agent_id=agent.id,
messages=[
MessageCreateParam(role="user", content="Hello, how are you?"),
@@ -2116,7 +2116,7 @@ def test_run_list(client: LettaSDKClient):
)
# message an agent async
async_run = client.agents.messages.send_async(
async_run = client.agents.messages.create_async(
agent_id=agent.id,
messages=[
MessageCreateParam(role="user", content="Hello, how are you?"),

View File

@@ -44,7 +44,7 @@ TOOLS_UPSERT_PARAMS = [
("unfriendly_func", {"source_code": UNFRIENDLY_FUNC_SOURCE_CODE_V2}, {}, None),
]
TOOLS_MODIFY_PARAMS = [
TOOLS_UPDATE_PARAMS = [
("friendly_func", {"tags": ["sdk_test"]}, {}, None),
("unfriendly_func", {"return_char_limit": 300}, {}, None),
]
@@ -61,7 +61,7 @@ globals().update(
id_param_name="tool_id",
create_params=TOOLS_CREATE_PARAMS,
upsert_params=TOOLS_UPSERT_PARAMS,
modify_params=TOOLS_MODIFY_PARAMS,
update_params=TOOLS_UPDATE_PARAMS,
list_params=TOOLS_LIST_PARAMS,
)
)