diff --git a/src/openai/resources/evals/runs/runs.py b/src/openai/resources/evals/runs/runs.py index f57db15977..3b47640334 100644 --- a/src/openai/resources/evals/runs/runs.py +++ b/src/openai/resources/evals/runs/runs.py @@ -292,7 +292,7 @@ def cancel( if not run_id: raise ValueError(f"Expected a non-empty value for `run_id` but received {run_id!r}") return self._post( - path_template("/evals/{eval_id}/runs/{run_id}", eval_id=eval_id, run_id=run_id), + path_template("/evals/{eval_id}/runs/{run_id}/cancel", eval_id=eval_id, run_id=run_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -562,7 +562,7 @@ async def cancel( if not run_id: raise ValueError(f"Expected a non-empty value for `run_id` but received {run_id!r}") return await self._post( - path_template("/evals/{eval_id}/runs/{run_id}", eval_id=eval_id, run_id=run_id), + path_template("/evals/{eval_id}/runs/{run_id}/cancel", eval_id=eval_id, run_id=run_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/tests/test_eval_run_cancel.py b/tests/test_eval_run_cancel.py new file mode 100644 index 0000000000..4f8736bcf9 --- /dev/null +++ b/tests/test_eval_run_cancel.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +from typing import Literal + +import httpx2 +import pytest + +from openai import OpenAI, AsyncOpenAI + + +def cancel_response(request: httpx2.Request) -> httpx2.Response: + assert request.method == "POST" + assert request.url == httpx2.URL("https://example.test/v1/evals/eval_test/runs/evalrun_test/cancel") + return httpx2.Response(200, json={"id": "evalrun_test", "eval_id": "eval_test", "status": "canceled"}) + + +@pytest.mark.parametrize("response_mode", ["parsed", "raw", "streaming"]) +def test_sync_cancel_endpoint(response_mode: Literal["parsed", "raw", "streaming"]) -> None: + with OpenAI( + api_key="test-key", + base_url="https://example.test/v1", + max_retries=0, + http_client=httpx2.Client(transport=httpx2.MockTransport(cancel_response), trust_env=False), + ) as client: + if response_mode == "parsed": + run = client.evals.runs.cancel("evalrun_test", eval_id="eval_test") + elif response_mode == "raw": + run = client.evals.runs.with_raw_response.cancel("evalrun_test", eval_id="eval_test").parse() + else: + with client.evals.runs.with_streaming_response.cancel("evalrun_test", eval_id="eval_test") as response: + run = response.parse() + + assert run.id == "evalrun_test" + assert run.status == "canceled" + + +@pytest.mark.parametrize("response_mode", ["parsed", "raw", "streaming"]) +async def test_async_cancel_endpoint(response_mode: Literal["parsed", "raw", "streaming"]) -> None: + async with AsyncOpenAI( + api_key="test-key", + base_url="https://example.test/v1", + max_retries=0, + http_client=httpx2.AsyncClient(transport=httpx2.MockTransport(cancel_response), trust_env=False), + ) as client: + if response_mode == "parsed": + run = await client.evals.runs.cancel("evalrun_test", eval_id="eval_test") + elif response_mode == "raw": + raw_response = await client.evals.runs.with_raw_response.cancel("evalrun_test", eval_id="eval_test") + run = raw_response.parse() + else: + async with client.evals.runs.with_streaming_response.cancel( + "evalrun_test", eval_id="eval_test" + ) as response: + run = await response.parse() + + assert run.id == "evalrun_test" + assert run.status == "canceled"