Skip to content

Commit 687c31b

Browse files
carenthomasmattzh72cpacker
authored
chore: bump version 0.7.2 (#2584)
Co-authored-by: Matthew Zhou <[email protected]> Co-authored-by: Charles Packer <[email protected]>
1 parent 956f8b9 commit 687c31b

28 files changed

+477
-134
lines changed

letta/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "0.7.1"
1+
__version__ = "0.7.2"
22

33
# import clients
44
from letta.client.client import LocalClient, RESTClient, create_client

letta/helpers/composio_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def get_composio_api_key(actor: User, logger: Optional[Logger] = None) -> Option
1010
api_keys = SandboxConfigManager().list_sandbox_env_vars_by_key(key="COMPOSIO_API_KEY", actor=actor)
1111
if not api_keys:
1212
if logger:
13-
logger.warning(f"No API keys found for Composio. Defaulting to the environment variable...")
13+
logger.debug(f"No API keys found for Composio. Defaulting to the environment variable...")
1414
if tool_settings.composio_api_key:
1515
return tool_settings.composio_api_key
1616
else:

letta/helpers/datetime_helpers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ def get_utc_time() -> datetime:
6666
return datetime.now(timezone.utc)
6767

6868

69+
def get_utc_time_int() -> int:
70+
return int(get_utc_time().timestamp())
71+
72+
73+
def timestamp_to_datetime(timestamp_seconds: int) -> datetime:
74+
"""Convert Unix timestamp in seconds to UTC datetime object"""
75+
return datetime.fromtimestamp(timestamp_seconds, tz=timezone.utc)
76+
77+
6978
def format_datetime(dt):
7079
return dt.strftime("%Y-%m-%d %I:%M:%S %p %Z%z")
7180

letta/jobs/llm_batch_job_polling.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ async def fetch_batch_items(server: SyncServer, batch_id: str, batch_resp_id: st
7373
"""
7474
updates = []
7575
try:
76-
async for item_result in server.anthropic_async_client.beta.messages.batches.results(batch_resp_id):
76+
results = await server.anthropic_async_client.beta.messages.batches.results(batch_resp_id)
77+
async for item_result in results:
7778
# Here, custom_id should be the agent_id
7879
item_status = map_anthropic_individual_batch_item_status_to_job_status(item_result)
7980
updates.append(ItemUpdateInfo(batch_id, item_result.custom_id, item_status, item_result))

letta/llm_api/anthropic.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
)
2121

2222
from letta.errors import BedrockError, BedrockPermissionError
23-
from letta.helpers.datetime_helpers import get_utc_time
23+
from letta.helpers.datetime_helpers import get_utc_time_int, timestamp_to_datetime
2424
from letta.llm_api.aws_bedrock import get_bedrock_client
2525
from letta.llm_api.helpers import add_inner_thoughts_to_functions
2626
from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION
@@ -396,7 +396,7 @@ def convert_anthropic_response_to_chatcompletion(
396396
return ChatCompletionResponse(
397397
id=response.id,
398398
choices=[choice],
399-
created=get_utc_time(),
399+
created=get_utc_time_int(),
400400
model=response.model,
401401
usage=UsageStatistics(
402402
prompt_tokens=prompt_tokens,
@@ -451,7 +451,7 @@ def convert_anthropic_stream_event_to_chatcompletion(
451451
'logprobs': None
452452
}
453453
],
454-
'created': datetime.datetime(2025, 1, 24, 0, 18, 55, tzinfo=TzInfo(UTC)),
454+
'created': 1713216662,
455455
'model': 'gpt-4o-mini-2024-07-18',
456456
'system_fingerprint': 'fp_bd83329f63',
457457
'object': 'chat.completion.chunk'
@@ -613,7 +613,7 @@ def convert_anthropic_stream_event_to_chatcompletion(
613613
return ChatCompletionChunkResponse(
614614
id=message_id,
615615
choices=[choice],
616-
created=get_utc_time(),
616+
created=get_utc_time_int(),
617617
model=model,
618618
output_tokens=completion_chunk_tokens,
619619
)
@@ -920,7 +920,7 @@ def anthropic_chat_completions_process_stream(
920920
chat_completion_response = ChatCompletionResponse(
921921
id=dummy_message.id if create_message_id else TEMP_STREAM_RESPONSE_ID,
922922
choices=[],
923-
created=dummy_message.created_at,
923+
created=int(dummy_message.created_at.timestamp()),
924924
model=chat_completion_request.model,
925925
usage=UsageStatistics(
926926
prompt_tokens=prompt_tokens,
@@ -954,7 +954,11 @@ def anthropic_chat_completions_process_stream(
954954
message_type = stream_interface.process_chunk(
955955
chat_completion_chunk,
956956
message_id=chat_completion_response.id if create_message_id else chat_completion_chunk.id,
957-
message_date=chat_completion_response.created if create_message_datetime else chat_completion_chunk.created,
957+
message_date=(
958+
timestamp_to_datetime(chat_completion_response.created)
959+
if create_message_datetime
960+
else timestamp_to_datetime(chat_completion_chunk.created)
961+
),
958962
# if extended_thinking is on, then reasoning_content will be flowing as chunks
959963
# TODO handle emitting redacted reasoning content (e.g. as concat?)
960964
expect_reasoning_content=extended_thinking,

letta/llm_api/anthropic_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
LLMServerError,
2323
LLMUnprocessableEntityError,
2424
)
25-
from letta.helpers.datetime_helpers import get_utc_time
25+
from letta.helpers.datetime_helpers import get_utc_time_int
2626
from letta.llm_api.helpers import add_inner_thoughts_to_functions, unpack_all_inner_thoughts_from_kwargs
2727
from letta.llm_api.llm_client_base import LLMClientBase
2828
from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION
@@ -403,7 +403,7 @@ def convert_response_to_chat_completion(
403403
chat_completion_response = ChatCompletionResponse(
404404
id=response.id,
405405
choices=[choice],
406-
created=get_utc_time(),
406+
created=get_utc_time_int(),
407407
model=response.model,
408408
usage=UsageStatistics(
409409
prompt_tokens=prompt_tokens,

letta/llm_api/cohere.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import requests
66

7-
from letta.helpers.datetime_helpers import get_utc_time
7+
from letta.helpers.datetime_helpers import get_utc_time_int
88
from letta.helpers.json_helpers import json_dumps
99
from letta.local_llm.utils import count_tokens
1010
from letta.schemas.message import Message
@@ -207,7 +207,7 @@ def convert_cohere_response_to_chatcompletion(
207207
return ChatCompletionResponse(
208208
id=response_json["response_id"],
209209
choices=[choice],
210-
created=get_utc_time(),
210+
created=get_utc_time_int(),
211211
model=model,
212212
usage=UsageStatistics(
213213
prompt_tokens=prompt_tokens,

letta/llm_api/google_ai_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from google.genai.types import FunctionCallingConfig, FunctionCallingConfigMode, ToolConfig
77

88
from letta.constants import NON_USER_MSG_PREFIX
9-
from letta.helpers.datetime_helpers import get_utc_time
9+
from letta.helpers.datetime_helpers import get_utc_time_int
1010
from letta.helpers.json_helpers import json_dumps
1111
from letta.llm_api.helpers import make_post_request
1212
from letta.llm_api.llm_client_base import LLMClientBase
@@ -260,7 +260,7 @@ def convert_response_to_chat_completion(
260260
id=response_id,
261261
choices=choices,
262262
model=self.llm_config.model, # NOTE: Google API doesn't pass back model in the response
263-
created=get_utc_time(),
263+
created=get_utc_time_int(),
264264
usage=usage,
265265
)
266266
except KeyError as e:

letta/llm_api/google_vertex_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from google import genai
55
from google.genai.types import FunctionCallingConfig, FunctionCallingConfigMode, GenerateContentResponse, ThinkingConfig, ToolConfig
66

7-
from letta.helpers.datetime_helpers import get_utc_time
7+
from letta.helpers.datetime_helpers import get_utc_time_int
88
from letta.helpers.json_helpers import json_dumps
99
from letta.llm_api.google_ai_client import GoogleAIClient
1010
from letta.local_llm.json_parser import clean_json_string_extra_backslash
@@ -234,7 +234,7 @@ def convert_response_to_chat_completion(
234234
id=response_id,
235235
choices=choices,
236236
model=self.llm_config.model, # NOTE: Google API doesn't pass back model in the response
237-
created=get_utc_time(),
237+
created=get_utc_time_int(),
238238
usage=usage,
239239
)
240240
except KeyError as e:

letta/llm_api/openai.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import requests
55
from openai import OpenAI
66

7+
from letta.helpers.datetime_helpers import timestamp_to_datetime
78
from letta.llm_api.helpers import add_inner_thoughts_to_functions, convert_to_structured_output, make_post_request
9+
from letta.llm_api.openai_client import supports_parallel_tool_calling, supports_temperature_param
810
from letta.local_llm.constants import INNER_THOUGHTS_KWARG, INNER_THOUGHTS_KWARG_DESCRIPTION, INNER_THOUGHTS_KWARG_DESCRIPTION_GO_FIRST
911
from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_messages
1012
from letta.log import get_logger
@@ -135,7 +137,7 @@ def build_openai_chat_completions_request(
135137
tool_choice=tool_choice,
136138
user=str(user_id),
137139
max_completion_tokens=llm_config.max_tokens,
138-
temperature=1.0 if llm_config.enable_reasoner else llm_config.temperature,
140+
temperature=llm_config.temperature if supports_temperature_param(model) else None,
139141
reasoning_effort=llm_config.reasoning_effort,
140142
)
141143
else:
@@ -237,7 +239,7 @@ def openai_chat_completions_process_stream(
237239
chat_completion_response = ChatCompletionResponse(
238240
id=dummy_message.id if create_message_id else TEMP_STREAM_RESPONSE_ID,
239241
choices=[],
240-
created=dummy_message.created_at, # NOTE: doesn't matter since both will do get_utc_time()
242+
created=int(dummy_message.created_at.timestamp()), # NOTE: doesn't matter since both will do get_utc_time()
241243
model=chat_completion_request.model,
242244
usage=UsageStatistics(
243245
completion_tokens=0,
@@ -274,7 +276,11 @@ def openai_chat_completions_process_stream(
274276
message_type = stream_interface.process_chunk(
275277
chat_completion_chunk,
276278
message_id=chat_completion_response.id if create_message_id else chat_completion_chunk.id,
277-
message_date=chat_completion_response.created if create_message_datetime else chat_completion_chunk.created,
279+
message_date=(
280+
timestamp_to_datetime(chat_completion_response.created)
281+
if create_message_datetime
282+
else timestamp_to_datetime(chat_completion_chunk.created)
283+
),
278284
expect_reasoning_content=expect_reasoning_content,
279285
name=name,
280286
message_index=message_idx,
@@ -489,6 +495,7 @@ def prepare_openai_payload(chat_completion_request: ChatCompletionRequest):
489495
# except ValueError as e:
490496
# warnings.warn(f"Failed to convert tool function to structured output, tool={tool}, error={e}")
491497

492-
if "o3-mini" in chat_completion_request.model or "o1" in chat_completion_request.model:
498+
if not supports_parallel_tool_calling(chat_completion_request.model):
493499
data.pop("parallel_tool_calls", None)
500+
494501
return data

0 commit comments

Comments
 (0)