Skip to content

Commit ffafffe

Browse files
authored
Return tool error to Google in 'error' key (#3583)
1 parent c27e5e4 commit ffafffe

File tree

3 files changed

+209
-40
lines changed

3 files changed

+209
-40
lines changed

pydantic_ai_slim/pydantic_ai/models/google.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ async def _map_messages(
566566
{
567567
'function_response': {
568568
'name': part.tool_name,
569-
'response': {'call_error': part.model_response()},
569+
'response': {'error': part.model_response()},
570570
'id': part.tool_call_id,
571571
}
572572
}

tests/models/cassettes/test_google/test_google_model_retry.yaml

Lines changed: 157 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ interactions:
88
connection:
99
- keep-alive
1010
content-length:
11-
- '473'
11+
- '548'
1212
content-type:
1313
- application/json
1414
host:
@@ -20,6 +20,8 @@ interactions:
2020
- text: What is the capital of France?
2121
role: user
2222
generationConfig:
23+
responseModalities:
24+
- TEXT
2325
temperature: 0.0
2426
systemInstruction:
2527
parts:
@@ -29,25 +31,26 @@ interactions:
2931
- functionDeclarations:
3032
- description: Get the capital of a country.
3133
name: get_capital
32-
parameters:
34+
parameters_json_schema:
35+
additionalProperties: false
3336
properties:
3437
country:
3538
description: The country name.
36-
type: STRING
39+
type: string
3740
required:
3841
- country
39-
type: OBJECT
40-
uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro-preview-03-25:generateContent
42+
type: object
43+
uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent
4144
response:
4245
headers:
4346
alt-svc:
4447
- h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
4548
content-length:
46-
- '683'
49+
- '1488'
4750
content-type:
4851
- application/json; charset=UTF-8
4952
server-timing:
50-
- gfet4t7; dur=6424
53+
- gfet4t7; dur=2250
5154
transfer-encoding:
5255
- chunked
5356
vary:
@@ -62,19 +65,21 @@ interactions:
6265
args:
6366
country: France
6467
name: get_capital
68+
thoughtSignature: CpYEAXLI2nxHJhy3F4oMijlAus2CPUEnTw16KkDpmU77MgVhg6piCF3GycCmKbjhGXQ8mBK5lSpsqwI7DapurrH+NcQiuUJYF1CpS438/kC6pw0JsXszEoBQyJN7zTXqfLgiNOzO5sBwQU1fc5cBUiMzzAxHOyltJwZcYOqFXMPQ0c2AaNvHO4nOOFwRrJuwGVfpfP1BnpuiDUz5c5roIwkC8sykcxva7lOniPdd5Soy0juNxCK4BAXTq/TgHPxB6yEUBGaAYaR9JId6EaWV1/gDa+eSpvLI8P4TQiFWa4UUK/89/TmMEQlRsmbGHcuxU+6GGLI0szs5h2dq8yM8Dy5R/DyB9xXPwUl4c9A+m64LEk6aludQE2X/LKb7y1pfL2f6wjH89DY4F4Y0934R21eYeb9MZMuB+IYaEYIvk7Fhdx5VolnNYPoqoLpCxwHVucmEBruS9m7Li6VO7zZdDVgikbWKxZyixLIfy4LKthacCJERSAJl4aAAllotfzZopY+dUkujmlny/UyPotpJXH+3K6L2Ge3uFOmNShPNN3oSMBf2K3DBit6OE5FA4JMyi7PnzlhiSmPLVOFZEWvINXbHim4Bh7QpIyGnIiT5n/8lSIrcNbf/vD/ZqDqivM/gjyS/ayZqW7tzNW5J1xDkiJpEUK1aokoG+GeaKXZ+AsR6xPXj6hYqpYRhtCsY49KhVme/JJp6XMrN
6569
role: model
70+
finishMessage: Model generated function call(s).
6671
finishReason: STOP
6772
index: 0
68-
modelVersion: models/gemini-2.5-pro
69-
responseId: ylpeaP3yFtyokdUPiOXJwQg
73+
modelVersion: gemini-2.5-pro
74+
responseId: g5YoaezOBeyrqtsPwYqL2Q8
7075
usageMetadata:
7176
candidatesTokenCount: 15
7277
promptTokenCount: 57
7378
promptTokensDetails:
7479
- modality: TEXT
7580
tokenCount: 57
76-
thoughtsTokenCount: 155
77-
totalTokenCount: 227
81+
thoughtsTokenCount: 124
82+
totalTokenCount: 196
7883
status:
7984
code: 200
8085
message: OK
@@ -87,7 +92,7 @@ interactions:
8792
connection:
8893
- keep-alive
8994
content-length:
90-
- '845'
95+
- '1682'
9196
content-type:
9297
- application/json
9398
host:
@@ -102,20 +107,23 @@ interactions:
102107
- functionCall:
103108
args:
104109
country: France
105-
id: pyd_ai_c9686c312aec46fca301d52554e47726
110+
id: pyd_ai_1f2bdea4ea804905a3f05dfe5b96a7fb
106111
name: get_capital
112+
thoughtSignature: CpYEAXLI2nxHJhy3F4oMijlAus2CPUEnTw16KkDpmU77MgVhg6piCF3GycCmKbjhGXQ8mBK5lSpsqwI7DapurrH-NcQiuUJYF1CpS438_kC6pw0JsXszEoBQyJN7zTXqfLgiNOzO5sBwQU1fc5cBUiMzzAxHOyltJwZcYOqFXMPQ0c2AaNvHO4nOOFwRrJuwGVfpfP1BnpuiDUz5c5roIwkC8sykcxva7lOniPdd5Soy0juNxCK4BAXTq_TgHPxB6yEUBGaAYaR9JId6EaWV1_gDa-eSpvLI8P4TQiFWa4UUK_89_TmMEQlRsmbGHcuxU-6GGLI0szs5h2dq8yM8Dy5R_DyB9xXPwUl4c9A-m64LEk6aludQE2X_LKb7y1pfL2f6wjH89DY4F4Y0934R21eYeb9MZMuB-IYaEYIvk7Fhdx5VolnNYPoqoLpCxwHVucmEBruS9m7Li6VO7zZdDVgikbWKxZyixLIfy4LKthacCJERSAJl4aAAllotfzZopY-dUkujmlny_UyPotpJXH-3K6L2Ge3uFOmNShPNN3oSMBf2K3DBit6OE5FA4JMyi7PnzlhiSmPLVOFZEWvINXbHim4Bh7QpIyGnIiT5n_8lSIrcNbf_vD_ZqDqivM_gjyS_ayZqW7tzNW5J1xDkiJpEUK1aokoG-GeaKXZ-AsR6xPXj6hYqpYRhtCsY49KhVme_JJp6XMrN
107113
role: model
108114
- parts:
109115
- functionResponse:
110-
id: pyd_ai_c9686c312aec46fca301d52554e47726
116+
id: pyd_ai_1f2bdea4ea804905a3f05dfe5b96a7fb
111117
name: get_capital
112118
response:
113-
call_error: |-
114-
The country is not supported.
119+
error: |-
120+
The country is not supported. Use "La France" instead.
115121
116122
Fix the errors and try again.
117123
role: user
118124
generationConfig:
125+
responseModalities:
126+
- TEXT
119127
temperature: 0.0
120128
systemInstruction:
121129
parts:
@@ -125,25 +133,26 @@ interactions:
125133
- functionDeclarations:
126134
- description: Get the capital of a country.
127135
name: get_capital
128-
parameters:
136+
parameters_json_schema:
137+
additionalProperties: false
129138
properties:
130139
country:
131140
description: The country name.
132-
type: STRING
141+
type: string
133142
required:
134143
- country
135-
type: OBJECT
136-
uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro-preview-03-25:generateContent
144+
type: object
145+
uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent
137146
response:
138147
headers:
139148
alt-svc:
140149
- h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
141150
content-length:
142-
- '647'
151+
- '1933'
143152
content-type:
144153
- application/json; charset=UTF-8
145154
server-timing:
146-
- gfet4t7; dur=3889
155+
- gfet4t7; dur=4567
147156
transfer-encoding:
148157
- chunked
149158
vary:
@@ -154,20 +163,138 @@ interactions:
154163
candidates:
155164
- content:
156165
parts:
157-
- text: I am sorry, I cannot fulfill this request. The country "France" is not supported by my system.
166+
- functionCall:
167+
args:
168+
country: La France
169+
name: get_capital
170+
thoughtSignature: Ct8GAXLI2nz7mNfYmvoMGtxbp6sB05S83E1PgFbBidrtXSNPmssR19LsxIgLyCeT2CLOe1EiWP9Vw6M4hVSB8yaWgKruIK7GBaUt44ElKq+1tPlYToIrEmM+Y+YATGnWU9BeX8+RTpPzE2j0dEkAxfe+15IrZxBj7RTydL6FL3wpRgeMn3urrBXIDY/JfXlRakk8UKMhrwh4hC6jDEaeRGQUrrXChZ0yqj2MH3uEKsVBTiQi1HIs082MMRPSWE7RWoHCY7zWe3xrGRkiOyIZ/irYsMlMjLyUkqPrmQITg02oRWDsvE1E0Hf3saKxV/KKFjYExsaZpvms8z2Zqmy/vYsSU50PRPjJADOcbooiuUNFNAzf+yGgO2cRyZbZRORzf/nOAGlUJKBfCEnqkwprLr/VfNyBK5VmlPjj8+oPcVH7rCkbH5jLG0PrjB9jpiyYzr7YHUjWYHxLBAlCXMEt/iBc6lMviMJ9GckFGzIOPCzi/PVF/l7kcubCV01mfskGbJAy1UQ2khZW+uCeIc1eWr7+0sC7+mdnfHqpSCZJCom0KQiE/CHKSbn6ROS5dCYHwSYjmxyR1ja4LxssSDKafJUHjE1GlnlQy03bb/QoI+MDCIdRS+y0FwXt2TPgo8nuqIlhzx1NaDtA8431G9UPxCgs6fkRf1/QBo6TvI9VMT/mYhMb0+91ZwEIyA1YlKYErO2MSZwlbgZtMyWYGpLJ9NOBh6+6Ww9oYtNinL9gEhcDXJStJWSiJXGOWUEc6nUG7n8waM1Iqgg/pBx3VxDqrN5Wcnyu0uamQEo63xUeB/YAmOAuuhuPBhcfW3/oqTUaApDtCFMsCoJE3tf//RhW3J1b0IWOvN9/kgsKDpMX+GK5F5+b0JSsz2kdUo9u7he14C8fyLDx1fswFzIwpSmNdqs23RZUfqB9yajh83wWK7UdPxOcX+Mq7TlocixYZf8B4hARE1ORwkmzvL1XUtCLHJWN4KvrkahYS2+El3po/K/+dnmFyYDnusyjpsLnkV7uPBvqBlkP0cg0TT6afeuPffxBM68yI4k+iCFVLxwQCYG68BCRT96rBDyCt4rpECd1PUYFmQWhGbdS4norEcXbwcBNj79LbXak4KI9vbxR0wzgsuShBc78V51cMQU720slB+U=
171+
role: model
172+
finishMessage: Model generated function call(s).
173+
finishReason: STOP
174+
index: 0
175+
modelVersion: gemini-2.5-pro
176+
responseId: h5YoaYnYK5q5mtkP6u3JoAs
177+
usageMetadata:
178+
candidatesTokenCount: 16
179+
promptTokenCount: 109
180+
promptTokensDetails:
181+
- modality: TEXT
182+
tokenCount: 109
183+
thoughtsTokenCount: 199
184+
totalTokenCount: 324
185+
status:
186+
code: 200
187+
message: OK
188+
- request:
189+
headers:
190+
accept:
191+
- '*/*'
192+
accept-encoding:
193+
- gzip, deflate
194+
connection:
195+
- keep-alive
196+
content-length:
197+
- '3182'
198+
content-type:
199+
- application/json
200+
host:
201+
- generativelanguage.googleapis.com
202+
method: POST
203+
parsed_body:
204+
contents:
205+
- parts:
206+
- text: What is the capital of France?
207+
role: user
208+
- parts:
209+
- functionCall:
210+
args:
211+
country: France
212+
id: pyd_ai_1f2bdea4ea804905a3f05dfe5b96a7fb
213+
name: get_capital
214+
thoughtSignature: CpYEAXLI2nxHJhy3F4oMijlAus2CPUEnTw16KkDpmU77MgVhg6piCF3GycCmKbjhGXQ8mBK5lSpsqwI7DapurrH-NcQiuUJYF1CpS438_kC6pw0JsXszEoBQyJN7zTXqfLgiNOzO5sBwQU1fc5cBUiMzzAxHOyltJwZcYOqFXMPQ0c2AaNvHO4nOOFwRrJuwGVfpfP1BnpuiDUz5c5roIwkC8sykcxva7lOniPdd5Soy0juNxCK4BAXTq_TgHPxB6yEUBGaAYaR9JId6EaWV1_gDa-eSpvLI8P4TQiFWa4UUK_89_TmMEQlRsmbGHcuxU-6GGLI0szs5h2dq8yM8Dy5R_DyB9xXPwUl4c9A-m64LEk6aludQE2X_LKb7y1pfL2f6wjH89DY4F4Y0934R21eYeb9MZMuB-IYaEYIvk7Fhdx5VolnNYPoqoLpCxwHVucmEBruS9m7Li6VO7zZdDVgikbWKxZyixLIfy4LKthacCJERSAJl4aAAllotfzZopY-dUkujmlny_UyPotpJXH-3K6L2Ge3uFOmNShPNN3oSMBf2K3DBit6OE5FA4JMyi7PnzlhiSmPLVOFZEWvINXbHim4Bh7QpIyGnIiT5n_8lSIrcNbf_vD_ZqDqivM_gjyS_ayZqW7tzNW5J1xDkiJpEUK1aokoG-GeaKXZ-AsR6xPXj6hYqpYRhtCsY49KhVme_JJp6XMrN
215+
role: model
216+
- parts:
217+
- functionResponse:
218+
id: pyd_ai_1f2bdea4ea804905a3f05dfe5b96a7fb
219+
name: get_capital
220+
response:
221+
error: |-
222+
The country is not supported. Use "La France" instead.
223+
224+
Fix the errors and try again.
225+
role: user
226+
- parts:
227+
- functionCall:
228+
args:
229+
country: La France
230+
id: pyd_ai_9f63eafb0eac47419f4f6c19975e924b
231+
name: get_capital
232+
thoughtSignature: Ct8GAXLI2nz7mNfYmvoMGtxbp6sB05S83E1PgFbBidrtXSNPmssR19LsxIgLyCeT2CLOe1EiWP9Vw6M4hVSB8yaWgKruIK7GBaUt44ElKq-1tPlYToIrEmM-Y-YATGnWU9BeX8-RTpPzE2j0dEkAxfe-15IrZxBj7RTydL6FL3wpRgeMn3urrBXIDY_JfXlRakk8UKMhrwh4hC6jDEaeRGQUrrXChZ0yqj2MH3uEKsVBTiQi1HIs082MMRPSWE7RWoHCY7zWe3xrGRkiOyIZ_irYsMlMjLyUkqPrmQITg02oRWDsvE1E0Hf3saKxV_KKFjYExsaZpvms8z2Zqmy_vYsSU50PRPjJADOcbooiuUNFNAzf-yGgO2cRyZbZRORzf_nOAGlUJKBfCEnqkwprLr_VfNyBK5VmlPjj8-oPcVH7rCkbH5jLG0PrjB9jpiyYzr7YHUjWYHxLBAlCXMEt_iBc6lMviMJ9GckFGzIOPCzi_PVF_l7kcubCV01mfskGbJAy1UQ2khZW-uCeIc1eWr7-0sC7-mdnfHqpSCZJCom0KQiE_CHKSbn6ROS5dCYHwSYjmxyR1ja4LxssSDKafJUHjE1GlnlQy03bb_QoI-MDCIdRS-y0FwXt2TPgo8nuqIlhzx1NaDtA8431G9UPxCgs6fkRf1_QBo6TvI9VMT_mYhMb0-91ZwEIyA1YlKYErO2MSZwlbgZtMyWYGpLJ9NOBh6-6Ww9oYtNinL9gEhcDXJStJWSiJXGOWUEc6nUG7n8waM1Iqgg_pBx3VxDqrN5Wcnyu0uamQEo63xUeB_YAmOAuuhuPBhcfW3_oqTUaApDtCFMsCoJE3tf__RhW3J1b0IWOvN9_kgsKDpMX-GK5F5-b0JSsz2kdUo9u7he14C8fyLDx1fswFzIwpSmNdqs23RZUfqB9yajh83wWK7UdPxOcX-Mq7TlocixYZf8B4hARE1ORwkmzvL1XUtCLHJWN4KvrkahYS2-El3po_K_-dnmFyYDnusyjpsLnkV7uPBvqBlkP0cg0TT6afeuPffxBM68yI4k-iCFVLxwQCYG68BCRT96rBDyCt4rpECd1PUYFmQWhGbdS4norEcXbwcBNj79LbXak4KI9vbxR0wzgsuShBc78V51cMQU720slB-U=
233+
role: model
234+
- parts:
235+
- functionResponse:
236+
id: pyd_ai_9f63eafb0eac47419f4f6c19975e924b
237+
name: get_capital
238+
response:
239+
return_value: Paris
240+
role: user
241+
generationConfig:
242+
responseModalities:
243+
- TEXT
244+
temperature: 0.0
245+
systemInstruction:
246+
parts:
247+
- text: You are a helpful chatbot.
248+
role: user
249+
tools:
250+
- functionDeclarations:
251+
- description: Get the capital of a country.
252+
name: get_capital
253+
parameters_json_schema:
254+
additionalProperties: false
255+
properties:
256+
country:
257+
description: The country name.
258+
type: string
259+
required:
260+
- country
261+
type: object
262+
uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent
263+
response:
264+
headers:
265+
alt-svc:
266+
- h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
267+
content-length:
268+
- '1147'
269+
content-type:
270+
- application/json; charset=UTF-8
271+
server-timing:
272+
- gfet4t7; dur=2362
273+
transfer-encoding:
274+
- chunked
275+
vary:
276+
- Origin
277+
- X-Origin
278+
- Referer
279+
parsed_body:
280+
candidates:
281+
- content:
282+
parts:
283+
- text: Paris
284+
thoughtSignature: CqQDAXLI2nzVwq8xStOWq3HumdAIrENdeO52sOtNadWTEdAHverlPYNZqz8VJMonMgBngg4V2UthuMF+iKik+Qf767C1DVvs5eIWfo08jLWzJq3lDcbB2fBSEw8lyW4hGumG+uCB6mWuE3+d6x8K+dOl8Rti9Upf/nAeSuebMiOfJYa8ztl++BJTA6E+/+gtaxfStKl6IJau4Pn+Ik4V4F8iMsxlhJzlE4H3DgXL5QU0mXRq3QkdHTOvZkURLKDd4qVy0LxVbneh2P1WaT6PFjkNNAOMeKNYGB1m3kgzOPCmoZHhFfxtN1u6g7qhLHh20UNQKcdNIdc5JhKdg+VLhVj71wN+FyGRdMM3lNsBXBgYA0CjZ1PWDuC08yzFV37BQq7GGA9oI6d5V/9W60tHPDQQ3W9+z8V2SWM5FhELa0yhkpmd4IH7CBvZxEx4lwRZ/Va37gb+Co90Q9G3SWza2noMRJUkr4z8yaUDPZY7uzSyUsLidp+9SMp8Eke/pQC2VhV/uPUrlV1NKPpdAgj/mLffxRiyQV3ShzTcYDj2VTkEcFvJ2Wpj
158285
role: model
159286
finishReason: STOP
160287
index: 0
161-
modelVersion: models/gemini-2.5-pro
162-
responseId: zlpeaKvDEdK2nsEPq97emQ0
288+
modelVersion: gemini-2.5-pro
289+
responseId: ipYoaaGNB9qVmtkP_vrsuQs
163290
usageMetadata:
164-
candidatesTokenCount: 22
165-
promptTokenCount: 104
291+
candidatesTokenCount: 1
292+
promptTokenCount: 142
166293
promptTokensDetails:
167294
- modality: TEXT
168-
tokenCount: 104
169-
thoughtsTokenCount: 178
170-
totalTokenCount: 304
295+
tokenCount: 142
296+
thoughtsTokenCount: 97
297+
totalTokenCount: 240
171298
status:
172299
code: 200
173300
message: OK

0 commit comments

Comments
 (0)