feat(llm): migrate model calls to LangChain ChatOpenAI
This commit is contained in:
@@ -6,7 +6,9 @@ mock 客户端返回 token 事件流;验证消息构造与 complete 一致、
|
||||
|
||||
import asyncio
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import AsyncMock
|
||||
from unittest.mock import Mock
|
||||
|
||||
from langchain_core.messages import AIMessageChunk
|
||||
|
||||
import httpx
|
||||
import pytest
|
||||
@@ -22,9 +24,7 @@ from src.agent.llm import (
|
||||
|
||||
|
||||
def _event(content):
|
||||
return SimpleNamespace(
|
||||
choices=[SimpleNamespace(delta=SimpleNamespace(content=content))]
|
||||
)
|
||||
return AIMessageChunk(content=content)
|
||||
|
||||
|
||||
def _service_with_stream(events):
|
||||
@@ -44,10 +44,8 @@ def _service_with_stream(events):
|
||||
for item in self._items:
|
||||
yield item
|
||||
|
||||
create = AsyncMock(return_value=_Stream(events))
|
||||
llm._client = SimpleNamespace(
|
||||
chat=SimpleNamespace(completions=SimpleNamespace(create=create))
|
||||
)
|
||||
create = Mock(return_value=_Stream(events))
|
||||
llm._client = SimpleNamespace(astream=create)
|
||||
return llm, create
|
||||
|
||||
|
||||
@@ -60,13 +58,11 @@ async def test_stream_tokens_yields_incrementally_and_forwards_kwargs():
|
||||
]
|
||||
assert tokens == ["你", "好"] # 空 delta 被跳过
|
||||
|
||||
kwargs = create.call_args.kwargs
|
||||
assert kwargs["model"] == "test-model"
|
||||
assert kwargs["stream"] is True
|
||||
assert kwargs["temperature"] == 0
|
||||
assert kwargs["extra_body"]["reasoning_effort"] == "none" # extra_body 透传
|
||||
assert kwargs["messages"][0] == {"role": "system", "content": "系统"}
|
||||
assert kwargs["messages"][-1] == {"role": "user", "content": "输入"}
|
||||
messages = create.call_args.args[0]
|
||||
assert messages[0] == {"role": "system", "content": "系统"}
|
||||
assert messages[1] == {"role": "assistant", "content": "h"}
|
||||
assert messages[-1] == {"role": "user", "content": "输入"}
|
||||
assert create.call_args.kwargs["config"]["run_name"] == "llm.stream"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@@ -107,10 +103,8 @@ async def test_stream_tokens_times_out_on_stale_stream():
|
||||
yield _event("好")
|
||||
|
||||
llm = OpenAILLMService(model="m", api_key="k", timeout_seconds=0.2)
|
||||
create = AsyncMock(return_value=_HangingStream())
|
||||
llm._client = SimpleNamespace(
|
||||
chat=SimpleNamespace(completions=SimpleNamespace(create=create))
|
||||
)
|
||||
create = Mock(return_value=_HangingStream())
|
||||
llm._client = SimpleNamespace(astream=create)
|
||||
tokens = []
|
||||
with pytest.raises(LLMTimeoutError):
|
||||
async for token in llm.stream_tokens("系统", "输入"):
|
||||
|
||||
Reference in New Issue
Block a user