From 460994a990f22f52be8a14658582b233c5d51fe8 Mon Sep 17 00:00:00 2001 From: Sam Brenner Date: Tue, 4 Feb 2025 14:00:03 -0500 Subject: [PATCH] refactor --- tests/contrib/langchain/conftest.py | 211 ++++++------------ ....test_openai_chat_model_sync_generate.json | 14 +- ...test_openai_llm_sync_multiple_prompts.json | 12 +- 3 files changed, 87 insertions(+), 150 deletions(-) diff --git a/tests/contrib/langchain/conftest.py b/tests/contrib/langchain/conftest.py index b438a2932c..d5c6e4d0b1 100644 --- a/tests/contrib/langchain/conftest.py +++ b/tests/contrib/langchain/conftest.py @@ -210,28 +210,29 @@ def responder(module, client_class_key, http_client_key, endpoint_path: list[str yield -@pytest.fixture -@pytest.mark.respx() -def openai_completion(respx_mock): +def _openai_completion_object( + n: int = 1, +): from datetime import datetime - import httpx from openai.types.completion import Completion from openai.types.completion_choice import CompletionChoice from openai.types.completion_usage import CompletionUsage + choice = CompletionChoice( + text="I am a helpful assistant.", + index=0, + logprobs=None, + finish_reason="length", + ) + + choices = [choice for _ in range(n)] + completion = Completion( id="foo", model="gpt-3.5-turbo-instruct", object="text_completion", - choices=[ - CompletionChoice( - text="I am a helpful assistant.", - index=0, - logprobs=None, - finish_reason="length", - ) - ], + choices=choices, created=int(datetime.now().timestamp()), usage=CompletionUsage( prompt_tokens=5, @@ -240,37 +241,35 @@ def openai_completion(respx_mock): ), ) - respx_mock.post("/v1/completions").mock(return_value=httpx.Response(200, json=completion.model_dump(mode="json"))) + return completion -@pytest.fixture -@pytest.mark.respx() -def openai_completion_multiple(respx_mock): +def _openai_chat_completion_object( + n: int = 1, + tools: bool = False, +): from datetime import datetime - import httpx - from openai.types.completion import Completion - from openai.types.completion_choice import CompletionChoice + from openai.types.chat import ChatCompletionMessage + from openai.types.chat.chat_completion import ChatCompletion + from openai.types.chat.chat_completion import Choice from openai.types.completion_usage import CompletionUsage - completion = Completion( + choice = Choice( + finish_reason="stop", + index=0, + message=ChatCompletionMessage( + content="Hello world!", + role="assistant", + ), + ) + choices = [choice for _ in range(n)] + + completion = ChatCompletion( id="foo", - model="gpt-3.5-turbo-instruct", - object="text_completion", - choices=[ - CompletionChoice( - text="I am a helpful assistant.", - index=0, - logprobs=None, - finish_reason="length", - ), - CompletionChoice( - text="I am a helpful assistant too!", - index=1, - logprobs=None, - finish_reason="length", - ), - ], + model="gpt-4", + object="chat.completion", + choices=choices, created=int(datetime.now().timestamp()), usage=CompletionUsage( prompt_tokens=5, @@ -279,6 +278,42 @@ def openai_completion_multiple(respx_mock): ), ) + if tools: + from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall + from openai.types.chat.chat_completion_message_tool_call import Function + + tool_call = ChatCompletionMessageToolCall( + function=Function( + arguments='{"a":1,"b":2}', + name="add", + ), + id="bar", + type="function", + ) + + for choice in completion.choices: + choice.message.tool_calls = [tool_call] + + return completion + + +@pytest.fixture +@pytest.mark.respx() +def openai_completion(respx_mock): + completion = _openai_completion_object() + + import httpx + + respx_mock.post("/v1/completions").mock(return_value=httpx.Response(200, json=completion.model_dump(mode="json"))) + + +@pytest.fixture +@pytest.mark.respx() +def openai_completion_multiple(respx_mock): + import httpx + + completion = _openai_completion_object(n=2) + respx_mock.post("/v1/completions").mock(return_value=httpx.Response(200, json=completion.model_dump(mode="json"))) @@ -305,35 +340,9 @@ def openai_completion_error(respx_mock): @pytest.fixture @pytest.mark.respx() def openai_chat_completion(respx_mock): - from datetime import datetime - import httpx - from openai.types.chat import ChatCompletionMessage - from openai.types.chat.chat_completion import ChatCompletion - from openai.types.chat.chat_completion import Choice - from openai.types.completion_usage import CompletionUsage - completion = ChatCompletion( - id="foo", - model="gpt-4", - object="chat.completion", - choices=[ - Choice( - finish_reason="stop", - index=0, - message=ChatCompletionMessage( - content="Hello world!", - role="assistant", - ), - ) - ], - created=int(datetime.now().timestamp()), - usage=CompletionUsage( - prompt_tokens=5, - completion_tokens=5, - total_tokens=10, - ), - ) + completion = _openai_chat_completion_object() respx_mock.post("/v1/chat/completions").mock( return_value=httpx.Response(200, json=completion.model_dump(mode="json")) @@ -343,43 +352,9 @@ def openai_chat_completion(respx_mock): @pytest.fixture @pytest.mark.respx() def openai_chat_completion_multiple(respx_mock): - from datetime import datetime - import httpx - from openai.types.chat import ChatCompletionMessage - from openai.types.chat.chat_completion import ChatCompletion - from openai.types.chat.chat_completion import Choice - from openai.types.completion_usage import CompletionUsage - completion = ChatCompletion( - id="foo", - model="gpt-4", - object="chat.completion", - choices=[ - Choice( - finish_reason="stop", - index=0, - message=ChatCompletionMessage( - content="Hello world!", - role="assistant", - ), - ), - Choice( - finish_reason="stop", - index=0, - message=ChatCompletionMessage( - content="World hello!", - role="assistant", - ), - ), - ], - created=int(datetime.now().timestamp()), - usage=CompletionUsage( - prompt_tokens=5, - completion_tokens=5, - total_tokens=10, - ), - ) + completion = _openai_chat_completion_object(n=2) respx_mock.post("/v1/chat/completions").mock( return_value=httpx.Response(200, json=completion.model_dump(mode="json")) @@ -389,47 +364,9 @@ def openai_chat_completion_multiple(respx_mock): @pytest.fixture @pytest.mark.respx() def openai_chat_completion_tools(respx_mock): - from datetime import datetime - import httpx - from openai.types.chat import ChatCompletionMessage - from openai.types.chat.chat_completion import ChatCompletion - from openai.types.chat.chat_completion import Choice - from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall - from openai.types.chat.chat_completion_message_tool_call import Function - from openai.types.completion_usage import CompletionUsage - completion = ChatCompletion( - id="foo", - model="gpt-4", - object="chat.completion", - choices=[ - Choice( - finish_reason="stop", - index=0, - message=ChatCompletionMessage( - content="Hello world!", - role="assistant", - tool_calls=[ - ChatCompletionMessageToolCall( - function=Function( - arguments='{"a":1,"b":2}', - name="add", - ), - id="bar", - type="function", - ), - ], - ), - ) - ], - created=int(datetime.now().timestamp()), - usage=CompletionUsage( - prompt_tokens=5, - completion_tokens=5, - total_tokens=10, - ), - ) + completion = _openai_chat_completion_object(tools=True) respx_mock.post("/v1/chat/completions").mock( return_value=httpx.Response(200, json=completion.model_dump(mode="json")) diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json index cc22b8f8f8..4b00d11757 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_chat_model_sync_generate.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "67a102f200000000", + "_dd.p.tid": "67a257a700000000", "langchain.request.api_key": "...key>", "langchain.request.messages.0.0.content": "Respond like a frat boy.", "langchain.request.messages.0.0.message_type": "SystemMessage", @@ -30,14 +30,14 @@ "langchain.request.type": "chat_model", "langchain.response.completions.0.0.content": "Hello world!", "langchain.response.completions.0.0.message_type": "AIMessage", - "langchain.response.completions.0.1.content": "World hello!", + "langchain.response.completions.0.1.content": "Hello world!", "langchain.response.completions.0.1.message_type": "AIMessage", "langchain.response.completions.1.0.content": "Hello world!", "langchain.response.completions.1.0.message_type": "AIMessage", - "langchain.response.completions.1.1.content": "World hello!", + "langchain.response.completions.1.1.content": "Hello world!", "langchain.response.completions.1.1.message_type": "AIMessage", "language": "python", - "runtime-id": "424868b67e904e92b8626273a6e771f6" + "runtime-id": "17c27aac7afb415fa2d87b3f3bf1378c" }, "metrics": { "_dd.measured": 1, @@ -48,8 +48,8 @@ "langchain.tokens.prompt_tokens": 10, "langchain.tokens.total_cost": 3.5000000000000004e-05, "langchain.tokens.total_tokens": 20, - "process_id": 79621 + "process_id": 1518 }, - "duration": 6863000, - "start": 1738605298269374000 + "duration": 6479000, + "start": 1738692519215022000 }]] diff --git a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json index 567a516839..05072912a1 100644 --- a/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json +++ b/tests/snapshots/tests.contrib.langchain.test_langchain.test_openai_llm_sync_multiple_prompts.json @@ -10,7 +10,7 @@ "error": 0, "meta": { "_dd.p.dm": "-0", - "_dd.p.tid": "67a102ed00000000", + "_dd.p.tid": "67a2578700000000", "langchain.request.api_key": "...key>", "langchain.request.model": "gpt-3.5-turbo-instruct", "langchain.request.openai.parameters.frequency_penalty": "0", @@ -29,9 +29,9 @@ "langchain.response.completions.0.text": "I am a helpful assistant.", "langchain.response.completions.1.finish_reason": "length", "langchain.response.completions.1.logprobs": "None", - "langchain.response.completions.1.text": "I am a helpful assistant too!", + "langchain.response.completions.1.text": "I am a helpful assistant.", "language": "python", - "runtime-id": "78a3ac00072b4dbd85dcb18195090178" + "runtime-id": "c64df646b0274caaa34422a7b07e64a6" }, "metrics": { "_dd.measured": 1, @@ -42,8 +42,8 @@ "langchain.tokens.prompt_tokens": 5, "langchain.tokens.total_cost": 1.7500000000000002e-05, "langchain.tokens.total_tokens": 10, - "process_id": 79446 + "process_id": 99901 }, - "duration": 2453000, - "start": 1738605293414865000 + "duration": 2862000, + "start": 1738692487893691000 }]]