1
1
import json
2
+ import re
2
3
from dataclasses import asdict
4
+ from datetime import timezone
3
5
4
6
import pydantic_core
5
7
import pytest
8
+ from dirty_equals import IsStr
6
9
from inline_snapshot import snapshot
7
10
from pydantic import BaseModel
8
11
@@ -38,12 +41,12 @@ def test_simple():
38
41
[
39
42
UserPrompt (
40
43
content = 'Hello' ,
41
- timestamp = IsNow (),
44
+ timestamp = IsNow (tz = timezone . utc ),
42
45
role = 'user' ,
43
46
),
44
47
LLMResponse (
45
48
content = "content='Hello' role='user' message_count=1" ,
46
- timestamp = IsNow (),
49
+ timestamp = IsNow (tz = timezone . utc ),
47
50
role = 'llm-response' ,
48
51
),
49
52
]
@@ -55,22 +58,22 @@ def test_simple():
55
58
[
56
59
UserPrompt (
57
60
content = 'Hello' ,
58
- timestamp = IsNow (),
61
+ timestamp = IsNow (tz = timezone . utc ),
59
62
role = 'user' ,
60
63
),
61
64
LLMResponse (
62
65
content = "content='Hello' role='user' message_count=1" ,
63
- timestamp = IsNow (),
66
+ timestamp = IsNow (tz = timezone . utc ),
64
67
role = 'llm-response' ,
65
68
),
66
69
UserPrompt (
67
70
content = 'World' ,
68
- timestamp = IsNow (),
71
+ timestamp = IsNow (tz = timezone . utc ),
69
72
role = 'user' ,
70
73
),
71
74
LLMResponse (
72
75
content = "content='World' role='user' message_count=3" ,
73
- timestamp = IsNow (),
76
+ timestamp = IsNow (tz = timezone . utc ),
74
77
role = 'llm-response' ,
75
78
),
76
79
]
@@ -128,16 +131,19 @@ def test_weather():
128
131
[
129
132
UserPrompt (
130
133
content = 'London' ,
131
- timestamp = IsNow (),
134
+ timestamp = IsNow (tz = timezone . utc ),
132
135
role = 'user' ,
133
136
),
134
137
LLMToolCalls (
135
138
calls = [ToolCall .from_json ('get_location' , '{"location_description": "London"}' )],
136
- timestamp = IsNow (),
139
+ timestamp = IsNow (tz = timezone . utc ),
137
140
role = 'llm-tool-calls' ,
138
141
),
139
142
ToolReturn (
140
- tool_name = 'get_location' , content = '{"lat": 51, "lng": 0}' , timestamp = IsNow (), role = 'tool-return'
143
+ tool_name = 'get_location' ,
144
+ content = '{"lat": 51, "lng": 0}' ,
145
+ timestamp = IsNow (tz = timezone .utc ),
146
+ role = 'tool-return' ,
141
147
),
142
148
LLMToolCalls (
143
149
calls = [
@@ -146,18 +152,18 @@ def test_weather():
146
152
'{"lat": 51, "lng": 0}' ,
147
153
)
148
154
],
149
- timestamp = IsNow (),
155
+ timestamp = IsNow (tz = timezone . utc ),
150
156
role = 'llm-tool-calls' ,
151
157
),
152
158
ToolReturn (
153
159
tool_name = 'get_weather' ,
154
160
content = 'Raining' ,
155
- timestamp = IsNow (),
161
+ timestamp = IsNow (tz = timezone . utc ),
156
162
role = 'tool-return' ,
157
163
),
158
164
LLMResponse (
159
165
content = 'Raining in London' ,
160
- timestamp = IsNow (),
166
+ timestamp = IsNow (tz = timezone . utc ),
161
167
role = 'llm-response' ,
162
168
),
163
169
]
@@ -198,12 +204,14 @@ def get_var_args(ctx: CallContext[int], *args: int):
198
204
def test_var_args ():
199
205
result = var_args_agent .run_sync ('{"function": "get_var_args", "arguments": {"args": [1, 2, 3]}}' )
200
206
response_data = json .loads (result .response )
207
+ # Can't parse ISO timestamps with trailing 'Z' in older versions of python:
208
+ response_data ['timestamp' ] = re .sub ('Z$' , '+00:00' , response_data ['timestamp' ])
201
209
assert response_data == snapshot (
202
210
{
203
211
'tool_name' : 'get_var_args' ,
204
212
'content' : '{"args": [1, 2, 3]}' ,
205
213
'tool_id' : None ,
206
- 'timestamp' : IsNow (iso_string = True ),
214
+ 'timestamp' : IsStr () & IsNow (iso_string = True , tz = timezone . utc ),
207
215
'role' : 'tool-return' ,
208
216
}
209
217
)
@@ -317,7 +325,7 @@ def test_call_all():
317
325
assert result .message_history == snapshot (
318
326
[
319
327
SystemPrompt (content = 'foobar' ),
320
- UserPrompt (content = 'Hello' , timestamp = IsNow ()),
328
+ UserPrompt (content = 'Hello' , timestamp = IsNow (tz = timezone . utc )),
321
329
LLMToolCalls (
322
330
calls = [
323
331
ToolCall .from_object ('foo' , {'x' : 0 }),
@@ -326,14 +334,16 @@ def test_call_all():
326
334
ToolCall .from_object ('qux' , {'x' : 0 }),
327
335
ToolCall .from_object ('quz' , {'x' : 'a' }),
328
336
],
329
- timestamp = IsNow (),
337
+ timestamp = IsNow (tz = timezone .utc ),
338
+ ),
339
+ ToolReturn (tool_name = 'foo' , content = '1' , timestamp = IsNow (tz = timezone .utc )),
340
+ ToolReturn (tool_name = 'bar' , content = '2' , timestamp = IsNow (tz = timezone .utc )),
341
+ ToolReturn (tool_name = 'baz' , content = '3' , timestamp = IsNow (tz = timezone .utc )),
342
+ ToolReturn (tool_name = 'qux' , content = '4' , timestamp = IsNow (tz = timezone .utc )),
343
+ ToolReturn (tool_name = 'quz' , content = 'a' , timestamp = IsNow (tz = timezone .utc )),
344
+ LLMResponse (
345
+ content = '{"foo":"1","bar":"2","baz":"3","qux":"4","quz":"a"}' , timestamp = IsNow (tz = timezone .utc )
330
346
),
331
- ToolReturn (tool_name = 'foo' , content = '1' , timestamp = IsNow ()),
332
- ToolReturn (tool_name = 'bar' , content = '2' , timestamp = IsNow ()),
333
- ToolReturn (tool_name = 'baz' , content = '3' , timestamp = IsNow ()),
334
- ToolReturn (tool_name = 'qux' , content = '4' , timestamp = IsNow ()),
335
- ToolReturn (tool_name = 'quz' , content = 'a' , timestamp = IsNow ()),
336
- LLMResponse (content = '{"foo":"1","bar":"2","baz":"3","qux":"4","quz":"a"}' , timestamp = IsNow ()),
337
347
]
338
348
)
339
349
0 commit comments