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:
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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],
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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=[
|
||||
{
|
||||
|
||||
@@ -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?"),
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user