mirror of
https://github.com/hwchase17/langchain.git
synced 2026-06-09 18:50:33 +00:00
revert: Support for SystemMessage in create_agent (#33889)
Reverts langchain-ai/langchain#33640 Introduces lint errors into langchain-anthropic Should incorporate into 1.1 instead of patch release.
This commit is contained in:
@@ -13,7 +13,6 @@ from langchain_core.language_models.fake_chat_models import FakeChatModel
|
||||
from langchain_core.messages import (
|
||||
AIMessage,
|
||||
MessageLikeRepresentation,
|
||||
SystemMessage,
|
||||
ToolMessage,
|
||||
)
|
||||
from langgraph.runtime import Runtime
|
||||
@@ -400,126 +399,3 @@ async def test_exclude_tools_prevents_clearing_async() -> None:
|
||||
|
||||
assert isinstance(calc_tool, ToolMessage)
|
||||
assert calc_tool.content == "[cleared]"
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
# SystemMessage Tests
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
def test_handles_system_message_prompt() -> None:
|
||||
"""Test that middleware handles SystemMessage as system_prompt correctly."""
|
||||
tool_call_id = "call-1"
|
||||
ai_message = AIMessage(
|
||||
content="",
|
||||
tool_calls=[{"id": tool_call_id, "name": "search", "args": {}}],
|
||||
)
|
||||
tool_message = ToolMessage(content="12345", tool_call_id=tool_call_id)
|
||||
|
||||
system_prompt = SystemMessage(content="You are a helpful assistant.")
|
||||
state, request = _make_state_and_request([ai_message, tool_message], system_prompt=None)
|
||||
# Manually set SystemMessage as system_prompt
|
||||
request.system_prompt = system_prompt
|
||||
|
||||
middleware = ContextEditingMiddleware(
|
||||
edits=[ClearToolUsesEdit(trigger=50)],
|
||||
token_count_method="model",
|
||||
)
|
||||
|
||||
def mock_handler(req: ModelRequest) -> AIMessage:
|
||||
return AIMessage(content="mock response")
|
||||
|
||||
# Call wrap_model_call - should not fail with SystemMessage
|
||||
middleware.wrap_model_call(request, mock_handler)
|
||||
|
||||
# Request should have processed without errors
|
||||
assert request.system_prompt == system_prompt
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
|
||||
|
||||
def test_does_not_double_wrap_system_message() -> None:
|
||||
"""Test that middleware doesn't wrap SystemMessage in another SystemMessage."""
|
||||
tool_call_id = "call-1"
|
||||
ai_message = AIMessage(
|
||||
content="",
|
||||
tool_calls=[{"id": tool_call_id, "name": "search", "args": {}}],
|
||||
)
|
||||
tool_message = ToolMessage(content="x" * 100, tool_call_id=tool_call_id)
|
||||
|
||||
system_prompt = SystemMessage(content="Original system prompt")
|
||||
state, request = _make_state_and_request([ai_message, tool_message], system_prompt=None)
|
||||
request.system_prompt = system_prompt
|
||||
|
||||
middleware = ContextEditingMiddleware(
|
||||
edits=[ClearToolUsesEdit(trigger=50)],
|
||||
token_count_method="model",
|
||||
)
|
||||
|
||||
def mock_handler(req: ModelRequest) -> AIMessage:
|
||||
return AIMessage(content="mock response")
|
||||
|
||||
middleware.wrap_model_call(request, mock_handler)
|
||||
|
||||
# System prompt should still be the same SystemMessage, not wrapped
|
||||
assert request.system_prompt == system_prompt
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
assert request.system_prompt.content == "Original system prompt"
|
||||
|
||||
|
||||
async def test_handles_system_message_prompt_async() -> None:
|
||||
"""Test async version - middleware handles SystemMessage as system_prompt correctly."""
|
||||
tool_call_id = "call-1"
|
||||
ai_message = AIMessage(
|
||||
content="",
|
||||
tool_calls=[{"id": tool_call_id, "name": "search", "args": {}}],
|
||||
)
|
||||
tool_message = ToolMessage(content="12345", tool_call_id=tool_call_id)
|
||||
|
||||
system_prompt = SystemMessage(content="You are a helpful assistant.")
|
||||
state, request = _make_state_and_request([ai_message, tool_message], system_prompt=None)
|
||||
# Manually set SystemMessage as system_prompt
|
||||
request.system_prompt = system_prompt
|
||||
|
||||
middleware = ContextEditingMiddleware(
|
||||
edits=[ClearToolUsesEdit(trigger=50)],
|
||||
token_count_method="model",
|
||||
)
|
||||
|
||||
async def mock_handler(req: ModelRequest) -> AIMessage:
|
||||
return AIMessage(content="mock response")
|
||||
|
||||
# Call awrap_model_call - should not fail with SystemMessage
|
||||
await middleware.awrap_model_call(request, mock_handler)
|
||||
|
||||
# Request should have processed without errors
|
||||
assert request.system_prompt == system_prompt
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
|
||||
|
||||
async def test_does_not_double_wrap_system_message_async() -> None:
|
||||
"""Test async version - middleware doesn't wrap SystemMessage in another SystemMessage."""
|
||||
tool_call_id = "call-1"
|
||||
ai_message = AIMessage(
|
||||
content="",
|
||||
tool_calls=[{"id": tool_call_id, "name": "search", "args": {}}],
|
||||
)
|
||||
tool_message = ToolMessage(content="x" * 100, tool_call_id=tool_call_id)
|
||||
|
||||
system_prompt = SystemMessage(content="Original system prompt")
|
||||
state, request = _make_state_and_request([ai_message, tool_message], system_prompt=None)
|
||||
request.system_prompt = system_prompt
|
||||
|
||||
middleware = ContextEditingMiddleware(
|
||||
edits=[ClearToolUsesEdit(trigger=50)],
|
||||
token_count_method="model",
|
||||
)
|
||||
|
||||
async def mock_handler(req: ModelRequest) -> AIMessage:
|
||||
return AIMessage(content="mock response")
|
||||
|
||||
await middleware.awrap_model_call(request, mock_handler)
|
||||
|
||||
# System prompt should still be the same SystemMessage, not wrapped
|
||||
assert request.system_prompt == system_prompt
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
assert request.system_prompt.content == "Original system prompt"
|
||||
|
||||
@@ -5,7 +5,7 @@ from __future__ import annotations
|
||||
from typing import cast
|
||||
|
||||
from langchain_core.language_models.fake_chat_models import GenericFakeChatModel
|
||||
from langchain_core.messages import AIMessage, SystemMessage
|
||||
from langchain_core.messages import AIMessage
|
||||
|
||||
from langchain.agents.middleware.todo import TodoListMiddleware
|
||||
from langchain.agents.middleware.types import ModelRequest, ModelResponse
|
||||
@@ -170,131 +170,3 @@ async def test_handler_called_with_modified_request_async() -> None:
|
||||
assert received_prompt["value"] is not None
|
||||
assert "Original" in received_prompt["value"]
|
||||
assert "write_todos" in received_prompt["value"]
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
# SystemMessage Tests
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
def test_appends_to_system_message_with_list_content() -> None:
|
||||
"""Test that middleware appends to SystemMessage with list content."""
|
||||
existing_prompt = SystemMessage(content=["You are helpful.", "Be concise."])
|
||||
middleware = TodoListMiddleware()
|
||||
|
||||
model = GenericFakeChatModel(messages=iter([AIMessage(content="response")]))
|
||||
request = ModelRequest(
|
||||
model=model,
|
||||
system_prompt=existing_prompt,
|
||||
messages=[],
|
||||
tool_choice=None,
|
||||
tools=[],
|
||||
response_format=None,
|
||||
state=cast("AgentState", {}), # type: ignore[name-defined]
|
||||
runtime=_fake_runtime(),
|
||||
model_settings={},
|
||||
)
|
||||
|
||||
def mock_handler(req: ModelRequest) -> ModelResponse:
|
||||
return ModelResponse(result=[AIMessage(content="response")])
|
||||
|
||||
middleware.wrap_model_call(request, mock_handler)
|
||||
|
||||
# System prompt should be a SystemMessage with combined content
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
assert isinstance(request.system_prompt.content, list)
|
||||
assert len(request.system_prompt.content) == 3
|
||||
assert request.system_prompt.content[0] == "You are helpful."
|
||||
assert request.system_prompt.content[1] == "Be concise."
|
||||
assert "write_todos" in request.system_prompt.content[2]
|
||||
|
||||
|
||||
async def test_appends_to_system_message_with_string_content_async() -> None:
|
||||
"""Test async version - middleware appends to SystemMessage with string content."""
|
||||
existing_prompt = SystemMessage(content="You are a helpful assistant.")
|
||||
middleware = TodoListMiddleware()
|
||||
|
||||
model = GenericFakeChatModel(messages=iter([AIMessage(content="response")]))
|
||||
request = ModelRequest(
|
||||
model=model,
|
||||
system_prompt=existing_prompt,
|
||||
messages=[],
|
||||
tool_choice=None,
|
||||
tools=[],
|
||||
response_format=None,
|
||||
state=cast("AgentState", {}), # type: ignore[name-defined]
|
||||
runtime=_fake_runtime(),
|
||||
model_settings={},
|
||||
)
|
||||
|
||||
async def mock_handler(req: ModelRequest) -> ModelResponse:
|
||||
return ModelResponse(result=[AIMessage(content="response")])
|
||||
|
||||
await middleware.awrap_model_call(request, mock_handler)
|
||||
|
||||
# System prompt should be a SystemMessage with combined content
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
assert isinstance(request.system_prompt.content, str)
|
||||
assert "You are a helpful assistant." in request.system_prompt.content
|
||||
assert middleware.system_prompt in request.system_prompt.content
|
||||
|
||||
|
||||
async def test_appends_to_system_message_with_list_content_async() -> None:
|
||||
"""Test async version - middleware appends to SystemMessage with list content."""
|
||||
existing_prompt = SystemMessage(content=["You are helpful.", "Be concise."])
|
||||
middleware = TodoListMiddleware()
|
||||
|
||||
model = GenericFakeChatModel(messages=iter([AIMessage(content="response")]))
|
||||
request = ModelRequest(
|
||||
model=model,
|
||||
system_prompt=existing_prompt,
|
||||
messages=[],
|
||||
tool_choice=None,
|
||||
tools=[],
|
||||
response_format=None,
|
||||
state=cast("AgentState", {}), # type: ignore[name-defined]
|
||||
runtime=_fake_runtime(),
|
||||
model_settings={},
|
||||
)
|
||||
|
||||
async def mock_handler(req: ModelRequest) -> ModelResponse:
|
||||
return ModelResponse(result=[AIMessage(content="response")])
|
||||
|
||||
await middleware.awrap_model_call(request, mock_handler)
|
||||
|
||||
# System prompt should be a SystemMessage with combined content
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
assert isinstance(request.system_prompt.content, list)
|
||||
assert len(request.system_prompt.content) == 3
|
||||
assert request.system_prompt.content[0] == "You are helpful."
|
||||
assert request.system_prompt.content[1] == "Be concise."
|
||||
assert "write_todos" in request.system_prompt.content[2]
|
||||
|
||||
|
||||
def test_creates_system_message_when_prompt_is_system_message() -> None:
|
||||
"""Test that middleware preserves SystemMessage type."""
|
||||
existing_prompt = SystemMessage(content="Original instructions")
|
||||
middleware = TodoListMiddleware(system_prompt="Todo instructions")
|
||||
|
||||
model = GenericFakeChatModel(messages=iter([AIMessage(content="response")]))
|
||||
request = ModelRequest(
|
||||
model=model,
|
||||
system_prompt=existing_prompt,
|
||||
messages=[],
|
||||
tool_choice=None,
|
||||
tools=[],
|
||||
response_format=None,
|
||||
state=cast("AgentState", {}), # type: ignore[name-defined]
|
||||
runtime=_fake_runtime(),
|
||||
model_settings={},
|
||||
)
|
||||
|
||||
def mock_handler(req: ModelRequest) -> ModelResponse:
|
||||
return ModelResponse(result=[AIMessage(content="response")])
|
||||
|
||||
result = middleware.wrap_model_call(request, mock_handler)
|
||||
|
||||
# Result should be returned from handler
|
||||
assert isinstance(result, ModelResponse)
|
||||
# System prompt should still be a SystemMessage
|
||||
assert isinstance(request.system_prompt, SystemMessage)
|
||||
|
||||
Reference in New Issue
Block a user