Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@ def _chat(self, messages: Sequence[ChatMessage], **kwargs: Any) -> ChatResponse:
messages,
model=self.model,
is_responses_api=True,
store=kwargs_dict.get("store"),
)

response: Response = self._client.responses.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ def to_openai_message_dict(
message: ChatMessage,
drop_none: bool = False,
model: Optional[str] = None,
store: bool = False,
) -> ChatCompletionMessageParam:
"""Convert a ChatMessage to an OpenAI message dict."""
content = []
Expand Down Expand Up @@ -533,6 +534,7 @@ def to_openai_responses_message_dict(
message: ChatMessage,
drop_none: bool = False,
model: Optional[str] = None,
store: bool = False,
) -> Union[str, Dict[str, Any], List[Dict[str, Any]]]:
"""Convert a ChatMessage to an OpenAI message dict."""
content = []
Expand Down Expand Up @@ -581,17 +583,20 @@ def to_openai_responses_message_dict(
"detail": block.detail or "auto",
}
)

# Omit reasoning items when store is set to False
elif isinstance(block, ThinkingBlock):
if block.content and "id" in block.additional_information:
reasoning.append(
{
"type": "reasoning",
"id": block.additional_information["id"],
"summary": [
{"type": "summary_text", "text": block.content or ""}
],
}
)
if store:
if block.content and "id" in block.additional_information:
reasoning.append(
{
"type": "reasoning",
"id": block.additional_information["id"],
"summary": [
{"type": "summary_text", "text": block.content or ""}
],
}
)
elif isinstance(block, ToolCallBlock):
tool_calls.extend(
[
Expand Down Expand Up @@ -698,6 +703,7 @@ def to_openai_message_dicts(
drop_none: bool = False,
model: Optional[str] = None,
is_responses_api: bool = False,
store: bool = False,
) -> Union[List[ChatCompletionMessageParam], str]:
"""Convert generic messages to OpenAI message dicts."""
if is_responses_api:
Expand All @@ -707,6 +713,7 @@ def to_openai_message_dicts(
message,
drop_none=drop_none,
model="o3-mini", # hardcode to ensure developer messages are used
store=store,
)
if isinstance(message_dicts, list):
final_message_dicts.extend(message_dicts)
Expand All @@ -730,6 +737,7 @@ def to_openai_message_dicts(
message,
drop_none=drop_none,
model=model,
store=store,
)
for message in messages
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ dev = [

[project]
name = "llama-index-llms-openai"
version = "0.6.23"
version = "0.6.24"
description = "llama-index llms openai integration"
authors = [{name = "llama-index"}]
requires-python = ">=3.9,<4.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,73 @@ def test_messages_to_openai_responses_messages():
),
]
openai_messages = to_openai_message_dicts(messages, is_responses_api=True)
assert len(openai_messages) == 7
assert openai_messages[0]["role"] == "developer"
assert openai_messages[0]["content"] == "You are a helpful assistant."
assert openai_messages[1]["role"] == "user"
assert openai_messages[1]["content"] == "What is the capital of France?"
assert openai_messages[2] == {
"type": "function_call",
"arguments": "{'state': 'France'}",
"call_id": "1",
"name": "get_capital_city_by_state",
}
assert openai_messages[3]["role"] == "assistant"
assert openai_messages[3]["content"] == "Paris"
assert openai_messages[4]["role"] == "user"
assert openai_messages[4]["content"] == "What is the capital of Germany?"
assert openai_messages[5] == {
"type": "function_call",
"arguments": "{'state': 'Germany'}",
"call_id": "2",
"name": "get_capital_city_by_state",
}
assert openai_messages[6]["role"] == "assistant"
assert len(openai_messages[6]["content"]) == 1
assert openai_messages[6]["content"][0]["text"] == messages[6].blocks[1].text


def test_messages_to_openai_responses_messages_with_store():
messages = [
ChatMessage(role=MessageRole.SYSTEM, content="You are a helpful assistant."),
ChatMessage(role=MessageRole.USER, content="What is the capital of France?"),
ChatMessage(
role=MessageRole.ASSISTANT,
blocks=[
ToolCallBlock(
tool_call_id="1",
tool_name="get_capital_city_by_state",
tool_kwargs="{'state': 'France'}",
)
],
),
ChatMessage(role=MessageRole.ASSISTANT, content="Paris"),
ChatMessage(role=MessageRole.USER, content="What is the capital of Germany?"),
ChatMessage(
role=MessageRole.ASSISTANT,
blocks=[
ToolCallBlock(
tool_call_id="2",
tool_name="get_capital_city_by_state",
tool_kwargs="{'state': 'Germany'}",
)
],
),
ChatMessage(
role=MessageRole.ASSISTANT,
blocks=[
ThinkingBlock(
content="The user is asking a simple question related to the capital of Germany, I should answer it concisely",
additional_information={"id": "123456789"},
),
TextBlock(text="Berlin"),
],
),
]

openai_messages = to_openai_message_dicts(
messages, is_responses_api=True, store=True
)
assert len(openai_messages) == 8
assert openai_messages[0]["role"] == "developer"
assert openai_messages[0]["content"] == "You are a helpful assistant."
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading