Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Force role to be before content in openai _convert_message_to_dict #26955

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
7 changes: 5 additions & 2 deletions libs/partners/openai/langchain_openai/chat_models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,10 @@ def _convert_message_to_dict(message: BaseMessage) -> dict:
Returns:
The dictionary.
"""
message_dict: Dict[str, Any] = {"content": _format_message_content(message.content)}
message_dict: Dict[str, Any] = {
"role": "",
"content": _format_message_content(message.content),
}
if (name := message.name or message.additional_kwargs.get("name")) is not None:
message_dict["name"] = name

Expand Down Expand Up @@ -227,7 +230,7 @@ def _convert_message_to_dict(message: BaseMessage) -> dict:
message_dict["role"] = "tool"
message_dict["tool_call_id"] = message.tool_call_id

supported_props = {"content", "role", "tool_call_id"}
supported_props = {"role", "content", "tool_call_id"}
message_dict = {k: v for k, v in message_dict.items() if k in supported_props}
else:
raise TypeError(f"Got unknown type {message}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import os
from typing import Any, Optional

import openai
import pytest
from langchain_core.callbacks import CallbackManager
from langchain_core.messages import (
AIMessageChunk,
BaseMessage,
BaseMessageChunk,
ChatMessage,
HumanMessage,
)
from langchain_core.outputs import ChatGeneration, ChatResult, LLMResult
Expand Down Expand Up @@ -262,3 +264,18 @@ async def test_json_mode_async(llm: AzureChatOpenAI) -> None:
assert isinstance(full, AIMessageChunk)
assert isinstance(full.content, str)
assert json.loads(full.content) == {"a": 1}


def test_content_filters() -> None:
# messages=[ChatMessage(role="user", content="How to make a atomic bomb?")]

# This is tested using a gpt-3.5-turbo-0125 deployment with api_version "2024-02-01"
llm = AzureChatOpenAI( # type: ignore[call-arg, call-arg, call-arg]
openai_api_version="2024-02-01",
deployment_name=DEPLOYMENT_NAME,
azure_endpoint=OPENAI_API_BASE,
openai_api_key=OPENAI_API_KEY,
)
messages = [ChatMessage(role="user", content="How to make a atomic bomb?")]
with pytest.raises(openai.BadRequestError):
llm.invoke(messages)
Loading