Skip to content

Commit 75b0064

Browse files
authored
Chat tests (#157)
1 parent fb3321b commit 75b0064

19 files changed

+2058
-5
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ repos:
4141
rev: v2.1.0
4242
hooks:
4343
- id: codespell
44-
args: ["--skip=*.ipynb,*.json,*.jsonlines"]
44+
args: ["--skip=*.ipynb,*.json,*.jsonlines,*.yaml"]
4545

4646
- repo: https://github.com/pre-commit/pygrep-hooks
4747
rev: v1.9.0

src/yandex_cloud_ml_sdk/_chat/completions/message.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ChatFunctionResultMessageDict(TypedDict):
2424
ChatMessageInputType = Union[ChatCompletionsMessageType, Iterable[ChatCompletionsMessageType]]
2525

2626

27+
# pylint: disable-next=too-many-return-statements
2728
def message_to_json(message: ChatCompletionsMessageType, tool_name_ids: dict[str, str]) -> JsonObject | list[JsonObject]:
2829
if isinstance(message, str):
2930
return {'role': 'user', 'content': message}
@@ -56,6 +57,14 @@ def message_to_json(message: ChatCompletionsMessageType, tool_name_ids: dict[str
5657
'tool_call_id': tool_call_id,
5758
}
5859

60+
if tool_calls := message.get('tool_calls'):
61+
tool_calls = cast(JsonObject, tool_calls)
62+
role = message.get('role', 'assistant')
63+
return {
64+
'tool_calls': tool_calls,
65+
'role': role,
66+
}
67+
5968
if text:
6069
message = cast(TextMessageDict, message)
6170
role = message.get('role', 'user')

src/yandex_cloud_ml_sdk/_chat/completions/model.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ def _build_request_json(self, messages: ChatMessageInputType, stream: bool) -> d
8585

8686
if c.tool_choice is not None:
8787
result['tool_choice'] = coerce_tool_choice_to_json(c.tool_choice)
88-
8988
return result
9089

9190
@override

test_requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ certifi
22
data-science-types
33
googleapis-common-protos-stubs
44
grpc-stubs
5-
mypy!=1.17.0,!=1.17.1
5+
mypy!=1.17.0,!=1.17.1,!=1.18.0,!=1.18.1
66
psutil
77
pyarrow-stubs
88
pydantic<2.10

tests/chat/__init__.py

Whitespace-only changes.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
interactions:
2+
- request:
3+
body: '{"model":"gpt://b1ghsjum2v37c2un8h64/yandexgpt/latest","messages":[{"role":"user","content":"doesn''t
4+
matter"}],"stream":false,"tools":[{"function":{"name":"something","description":"Tool
5+
which have to collect all the numbers from user message and do a SOMETHING with
6+
it","parameters":{"properties":{"numbers":{"items":{"type":"integer"},"title":"Numbers","type":"array"}},"required":["numbers"],"title":"Numbers","type":"object"},"strict":null},"type":"function"}],"tool_choice":"foo"}'
7+
headers:
8+
accept:
9+
- '*/*'
10+
accept-encoding:
11+
- gzip, deflate, zstd
12+
authorization:
13+
- Bearer t1.9euelZqOl8_MysaajJLNx5uQipTHmO3rnpWalM3InMbJl5qUmJnHmcfPzsnl8_cpaXQ5-e94QTBB_d3z92kXcjn573hBMEH9zef1656VmpyJzpyOzMbLncfGnJDNnJWe7_zF656VmpyJzpyOzMbLncfGnJDNnJWeveuelZqZio7GyJCbiY-KzJCVyZuMzrXrhpzRlp6S0ZCPmpGWm9KMmo2Jmo0.5Xf19Ehbay0iZuIm7eBBIf1wntPWuIc_CpGJBkkREyU2J0hL3Uavgu1L5_K3WUTKWDfgYUpGCkZxZA-NV1ZCDQ
14+
connection:
15+
- keep-alive
16+
content-length:
17+
- '485'
18+
content-type:
19+
- application/json
20+
host:
21+
- llm.api.cloud.yandex.net
22+
user-agent:
23+
- yandex-cloud-ml-sdk/0.15.0 python/3.12
24+
x-client-request-id:
25+
- e0ed5418-d8a0-400f-8826-4de630914f3d
26+
method: POST
27+
uri: https://llm.api.cloud.yandex.net/v1/chat/completions
28+
response:
29+
body:
30+
string: '{"error":{"message":"invalid tool choice: foo","type":"invalid_request_error"}}
31+
32+
'
33+
headers:
34+
content-length:
35+
- '80'
36+
content-type:
37+
- application/json
38+
date:
39+
- Thu, 11 Sep 2025 13:35:47 GMT
40+
server:
41+
- ycalb
42+
x-client-request-id:
43+
- e0ed5418-d8a0-400f-8826-4de630914f3d
44+
x-request-id:
45+
- 959ab37f-b3d9-4689-aba2-8b24fe5fe219
46+
x-server-trace-id:
47+
- 8715238fd9c10677:c2f06193888bfc9e:8715238fd9c10677:1
48+
status:
49+
code: 400
50+
message: Bad Request
51+
version: 1
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
interactions:
2+
- request:
3+
body: '{"model":"gpt://b1ghsjum2v37c2un8h64/qwen3-235b-a22b-fp8/latest","messages":[{"content":"Your
4+
name is Arkadiy","role":"system"},{"role":"user","content":"Hello! how is your
5+
name?"}],"stream":false}'
6+
headers:
7+
accept:
8+
- '*/*'
9+
accept-encoding:
10+
- gzip, deflate, zstd
11+
authorization:
12+
- Bearer t1.9euelZqWlp2bxpiUmZuLl57Lz8yMjO3rnpWalM3InMbJl5qUmJnHmcfPzsnl8_cXWF85-e9wPgBV_t3z91cGXTn573A-AFX-zef1656VmpHMi8vNmY2YjI_OjpWYncaM7_zF656VmpHMi8vNmY2YjI_OjpWYncaMveuelZrHy5fHis2MjY-dzIyJnJXIkrXrhpzRlp6S0ZCPmpGWm9KMmo2Jmo0.G0eyVx1OQ_yLFHLGkNV9gUPu64rm0aIT2-Hdbo-LGa5pwM7KetKWhD9ZTXg-Sg6L6CH_kW8Ay1LzAaQON5OfAw
13+
connection:
14+
- keep-alive
15+
content-length:
16+
- '197'
17+
content-type:
18+
- application/json
19+
host:
20+
- llm.api.cloud.yandex.net
21+
user-agent:
22+
- yandex-cloud-ml-sdk/0.15.0 python/3.12
23+
x-client-request-id:
24+
- 5a3fcf89-bb93-4e61-9379-61227d23bd28
25+
method: POST
26+
uri: https://llm.api.cloud.yandex.net/v1/chat/completions
27+
response:
28+
body:
29+
string: "{\"id\":\"chatcmpl-2ee9e39e-6ceb-4c70-93e1-a29034b09534\",\"object\":\"chat.completion\",\"created\":1757951686,\"model\":\"gpt://qwen3-235b-a22b-fp8/latest\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"Hello!
30+
My name is Arkadiy. How can I assist you today? \U0001F60A\"},\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":26,\"total_tokens\":45,\"completion_tokens\":19}}\n"
31+
headers:
32+
content-length:
33+
- '366'
34+
content-type:
35+
- application/json
36+
date:
37+
- Mon, 15 Sep 2025 15:54:46 GMT
38+
server:
39+
- ycalb
40+
x-server-trace-id:
41+
- a2fbc7955280d426:7d558323c079506f:a2fbc7955280d426:1
42+
status:
43+
code: 200
44+
message: OK
45+
- request:
46+
body: "{\"model\":\"gpt://b1ghsjum2v37c2un8h64/qwen3-235b-a22b-fp8/latest\",\"messages\":[{\"content\":\"Your
47+
name is Arkadiy\",\"role\":\"system\"},{\"role\":\"user\",\"content\":\"Hello!
48+
how is your name?\"},{\"content\":\"Hello! My name is Arkadiy. How can I assist
49+
you today? \U0001F60A\",\"role\":\"assistant\"},{\"role\":\"user\",\"content\":\"My
50+
name is Andrew\"}],\"stream\":false}"
51+
headers:
52+
accept:
53+
- '*/*'
54+
accept-encoding:
55+
- gzip, deflate, zstd
56+
authorization:
57+
- Bearer t1.9euelZqWlp2bxpiUmZuLl57Lz8yMjO3rnpWalM3InMbJl5qUmJnHmcfPzsnl8_cXWF85-e9wPgBV_t3z91cGXTn573A-AFX-zef1656VmpHMi8vNmY2YjI_OjpWYncaM7_zF656VmpHMi8vNmY2YjI_OjpWYncaMveuelZrHy5fHis2MjY-dzIyJnJXIkrXrhpzRlp6S0ZCPmpGWm9KMmo2Jmo0.G0eyVx1OQ_yLFHLGkNV9gUPu64rm0aIT2-Hdbo-LGa5pwM7KetKWhD9ZTXg-Sg6L6CH_kW8Ay1LzAaQON5OfAw
58+
connection:
59+
- keep-alive
60+
content-length:
61+
- '336'
62+
content-type:
63+
- application/json
64+
host:
65+
- llm.api.cloud.yandex.net
66+
user-agent:
67+
- yandex-cloud-ml-sdk/0.15.0 python/3.12
68+
x-client-request-id:
69+
- 24ae7c12-ca25-4764-9b37-d3848f67cd81
70+
method: POST
71+
uri: https://llm.api.cloud.yandex.net/v1/chat/completions
72+
response:
73+
body:
74+
string: "{\"id\":\"chatcmpl-26c17979-ed03-414d-b613-6a2a5bc7ba03\",\"object\":\"chat.completion\",\"created\":1757951686,\"model\":\"gpt://qwen3-235b-a22b-fp8/latest\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"Nice
75+
to meet you, Andrew! \U0001F60A How can I help you today?\"},\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":58,\"total_tokens\":75,\"completion_tokens\":17}}\n"
76+
headers:
77+
content-length:
78+
- '363'
79+
content-type:
80+
- application/json
81+
date:
82+
- Mon, 15 Sep 2025 15:54:46 GMT
83+
server:
84+
- ycalb
85+
x-server-trace-id:
86+
- 73cf81250d9fc777:1cd7ffa5c15e8f0:73cf81250d9fc777:1
87+
status:
88+
code: 200
89+
message: OK
90+
- request:
91+
body: "{\"model\":\"gpt://b1ghsjum2v37c2un8h64/qwen3-235b-a22b-fp8/latest\",\"messages\":[{\"content\":\"Your
92+
name is Arkadiy\",\"role\":\"system\"},{\"role\":\"user\",\"content\":\"Hello!
93+
how is your name?\"},{\"content\":\"Hello! My name is Arkadiy. How can I assist
94+
you today? \U0001F60A\",\"role\":\"assistant\"},{\"role\":\"user\",\"content\":\"My
95+
name is Andrew\"},{\"content\":\"Nice to meet you, Andrew! \U0001F60A How can
96+
I help you today?\",\"role\":\"assistant\"},{\"role\":\"user\",\"content\":\"What
97+
is my name?\"}],\"stream\":false}"
98+
headers:
99+
accept:
100+
- '*/*'
101+
accept-encoding:
102+
- gzip, deflate, zstd
103+
authorization:
104+
- Bearer t1.9euelZqWlp2bxpiUmZuLl57Lz8yMjO3rnpWalM3InMbJl5qUmJnHmcfPzsnl8_cXWF85-e9wPgBV_t3z91cGXTn573A-AFX-zef1656VmpHMi8vNmY2YjI_OjpWYncaM7_zF656VmpHMi8vNmY2YjI_OjpWYncaMveuelZrHy5fHis2MjY-dzIyJnJXIkrXrhpzRlp6S0ZCPmpGWm9KMmo2Jmo0.G0eyVx1OQ_yLFHLGkNV9gUPu64rm0aIT2-Hdbo-LGa5pwM7KetKWhD9ZTXg-Sg6L6CH_kW8Ay1LzAaQON5OfAw
105+
connection:
106+
- keep-alive
107+
content-length:
108+
- '471'
109+
content-type:
110+
- application/json
111+
host:
112+
- llm.api.cloud.yandex.net
113+
user-agent:
114+
- yandex-cloud-ml-sdk/0.15.0 python/3.12
115+
x-client-request-id:
116+
- d26dea55-8f0c-4f20-a771-ac77db321a2b
117+
method: POST
118+
uri: https://llm.api.cloud.yandex.net/v1/chat/completions
119+
response:
120+
body:
121+
string: "{\"id\":\"chatcmpl-985ce6ba-8160-4c52-b6c7-466c9e470bf5\",\"object\":\"chat.completion\",\"created\":1757951687,\"model\":\"gpt://qwen3-235b-a22b-fp8/latest\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"Your
122+
name is Andrew! \U0001F60A\"},\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":89,\"total_tokens\":97,\"completion_tokens\":8}}\n"
123+
headers:
124+
content-length:
125+
- '331'
126+
content-type:
127+
- application/json
128+
date:
129+
- Mon, 15 Sep 2025 15:54:47 GMT
130+
server:
131+
- ycalb
132+
x-server-trace-id:
133+
- 3f621a2346607f53:8798599acd908a22:3f621a2346607f53:1
134+
status:
135+
code: 200
136+
message: OK
137+
version: 1
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
interactions:
2+
- request:
3+
body: '{"model":"gpt://b1ghsjum2v37c2un8h64/yandexgpt/latest","messages":[{"role":"user","content":"do
4+
a SOMETHING with all the numbers from: 5, 4, a, 1"}],"stream":false,"tools":[{"function":{"name":"something","description":"Tool
5+
which have to collect all the numbers from user message and do a SOMETHING with
6+
it","parameters":{"properties":{"numbers":{"items":{"type":"integer"},"title":"Numbers","type":"array"}},"required":["numbers"],"title":"Numbers","type":"object"},"strict":null},"type":"function"}]}'
7+
headers:
8+
accept:
9+
- '*/*'
10+
accept-encoding:
11+
- gzip, deflate, zstd
12+
authorization:
13+
- Bearer t1.9euelZqWlp2bxpiUmZuLl57Lz8yMjO3rnpWalM3InMbJl5qUmJnHmcfPzsnl8_cXWF85-e9wPgBV_t3z91cGXTn573A-AFX-zef1656VmpHMi8vNmY2YjI_OjpWYncaM7_zF656VmpHMi8vNmY2YjI_OjpWYncaMveuelZrHy5fHis2MjY-dzIyJnJXIkrXrhpzRlp6S0ZCPmpGWm9KMmo2Jmo0.G0eyVx1OQ_yLFHLGkNV9gUPu64rm0aIT2-Hdbo-LGa5pwM7KetKWhD9ZTXg-Sg6L6CH_kW8Ay1LzAaQON5OfAw
14+
connection:
15+
- keep-alive
16+
content-length:
17+
- '503'
18+
content-type:
19+
- application/json
20+
host:
21+
- llm.api.cloud.yandex.net
22+
user-agent:
23+
- yandex-cloud-ml-sdk/0.15.0 python/3.12
24+
x-client-request-id:
25+
- 0567acea-6d36-43fd-a9fe-8413785acbb9
26+
method: POST
27+
uri: https://llm.api.cloud.yandex.net/v1/chat/completions
28+
response:
29+
body:
30+
string: '{"id":"d5ef1f8c-652e-4c53-ada8-6d748b5808b6","object":"chat.completion","created":1757951688,"model":"gpt://b1ghsjum2v37c2un8h64/yandexgpt/latest","choices":[{"index":0,"message":{"role":"assistant","content":"","tool_calls":[{"index":0,"id":"something","type":"function","function":{"name":"something","arguments":"{\"numbers\":[5,4,1]}"}}]},"finish_reason":"tool_calls"}],"usage":{"prompt_tokens":100,"total_tokens":114,"completion_tokens":14}}
31+
32+
'
33+
headers:
34+
content-length:
35+
- '447'
36+
content-type:
37+
- application/json
38+
date:
39+
- Mon, 15 Sep 2025 15:54:48 GMT
40+
server:
41+
- ycalb
42+
x-client-request-id:
43+
- 0567acea-6d36-43fd-a9fe-8413785acbb9
44+
x-request-id:
45+
- 5255a16b-e5e7-4acd-943a-30c79cb11050
46+
x-server-trace-id:
47+
- 124a38f19dd92e4f:503d1158efd4e39:124a38f19dd92e4f:1
48+
status:
49+
code: 200
50+
message: OK
51+
- request:
52+
body: '{"model":"gpt://b1ghsjum2v37c2un8h64/yandexgpt/latest","messages":[{"role":"user","content":"do
53+
a SOMETHING with all the numbers from: 5, 4, a, 1"},{"role":"assistant","tool_calls":[{"index":0,"id":"something","type":"function","function":{"name":"something","arguments":"{\"numbers\":[5,4,1]}"}}]},{"role":"tool","content":"+20.0","tool_call_id":"something"}],"stream":false,"tools":[{"function":{"name":"something","description":"Tool
54+
which have to collect all the numbers from user message and do a SOMETHING with
55+
it","parameters":{"properties":{"numbers":{"items":{"type":"integer"},"title":"Numbers","type":"array"}},"required":["numbers"],"title":"Numbers","type":"object"},"strict":null},"type":"function"}]}'
56+
headers:
57+
accept:
58+
- '*/*'
59+
accept-encoding:
60+
- gzip, deflate, zstd
61+
authorization:
62+
- Bearer t1.9euelZqWlp2bxpiUmZuLl57Lz8yMjO3rnpWalM3InMbJl5qUmJnHmcfPzsnl8_cXWF85-e9wPgBV_t3z91cGXTn573A-AFX-zef1656VmpHMi8vNmY2YjI_OjpWYncaM7_zF656VmpHMi8vNmY2YjI_OjpWYncaMveuelZrHy5fHis2MjY-dzIyJnJXIkrXrhpzRlp6S0ZCPmpGWm9KMmo2Jmo0.G0eyVx1OQ_yLFHLGkNV9gUPu64rm0aIT2-Hdbo-LGa5pwM7KetKWhD9ZTXg-Sg6L6CH_kW8Ay1LzAaQON5OfAw
63+
connection:
64+
- keep-alive
65+
content-length:
66+
- '715'
67+
content-type:
68+
- application/json
69+
host:
70+
- llm.api.cloud.yandex.net
71+
user-agent:
72+
- yandex-cloud-ml-sdk/0.15.0 python/3.12
73+
x-client-request-id:
74+
- 1a13e16d-a129-4579-a92d-91dad64a9c7b
75+
method: POST
76+
uri: https://llm.api.cloud.yandex.net/v1/chat/completions
77+
response:
78+
body:
79+
string: '{"id":"a24b0c4c-26b5-49ac-8763-6d32ce420680","object":"chat.completion","created":1757951688,"model":"gpt://b1ghsjum2v37c2un8h64/yandexgpt/latest","choices":[{"index":0,"message":{"role":"assistant","content":"The
80+
result of the operation performed by the tool on the numbers [5, 4, 1] is
81+
+20.0."},"finish_reason":"stop"}],"usage":{"prompt_tokens":130,"total_tokens":158,"completion_tokens":28}}
82+
83+
'
84+
headers:
85+
content-length:
86+
- '395'
87+
content-type:
88+
- application/json
89+
date:
90+
- Mon, 15 Sep 2025 15:54:48 GMT
91+
server:
92+
- ycalb
93+
x-client-request-id:
94+
- 1a13e16d-a129-4579-a92d-91dad64a9c7b
95+
x-request-id:
96+
- 8710b8a5-f823-4f4b-91e4-f43cb8497891
97+
x-server-trace-id:
98+
- b729c273dfa0d799:b06551a059e0ae74:b729c273dfa0d799:1
99+
status:
100+
code: 200
101+
message: OK
102+
version: 1

0 commit comments

Comments
 (0)