-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtwitter_bot.log
1382 lines (1382 loc) · 336 KB
/
twitter_bot.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
2025-04-09 07:51:23,287 - INFO - Starting Twitter bot - monitoring for mentions
2025-04-09 07:51:23,453 - INFO - Authenticated as @AskNebula
2025-04-09 07:51:23,453 - INFO - No last mention ID found. Getting most recent mention as starting point...
2025-04-09 07:51:23,581 - WARNING - Unexpected parameter: tweet.fields
2025-04-09 07:51:23,778 - INFO - Initialized with most recent mention ID: 1909942908121120784
2025-04-09 07:51:23,778 - INFO - Bot will only respond to new mentions from now on.
2025-04-09 07:51:23,778 - INFO - Checking for new mentions...
2025-04-09 07:51:23,910 - WARNING - Unexpected parameter: tweet.fields
2025-04-09 07:51:23,910 - WARNING - Unexpected parameter: user.fields
2025-04-09 07:51:24,029 - INFO - No new mentions found
2025-04-09 07:51:24,029 - INFO - Waiting for next check...
2025-04-09 07:52:54,031 - INFO - Checking for new mentions...
2025-04-09 07:52:54,161 - WARNING - Unexpected parameter: tweet.fields
2025-04-09 07:52:54,161 - WARNING - Unexpected parameter: user.fields
2025-04-09 07:52:54,289 - INFO - No new mentions found
2025-04-09 07:52:54,289 - INFO - Waiting for next check...
2025-04-09 07:53:17,531 - INFO - Bot stopped by user
2025-04-09 07:53:59,659 - INFO - Starting Twitter bot - monitoring for mentions
2025-04-09 07:53:59,826 - INFO - Authenticated as @AskNebula
2025-04-09 07:53:59,827 - INFO - Checking for new mentions...
2025-04-09 07:54:00,067 - INFO - No new mentions found
2025-04-09 07:54:00,067 - INFO - Waiting for next check...
2025-04-09 07:55:30,073 - INFO - Checking for new mentions...
2025-04-09 07:55:30,383 - INFO - Found 1 new mentions to process
2025-04-09 07:55:30,383 - INFO - Processing mention 1909953097033474424: yo should I buy on the dipity dip dip?
2025-04-09 07:55:31,956 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 07:55:36,072 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 07:55:36,602 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 07:55:38,150 - INFO - Created reply to mention 1909953097033474424
2025-04-09 07:55:40,151 - INFO - Waiting for next check...
2025-04-09 07:56:19,810 - INFO - Bot stopped by user
2025-04-09 08:09:40,203 - INFO - Starting Twitter bot - monitoring for mentions
2025-04-09 08:09:40,375 - INFO - Authenticated as @AskNebula
2025-04-09 08:09:40,376 - INFO - Checking for new mentions...
2025-04-09 08:09:40,695 - INFO - Found 1 new mentions to process
2025-04-09 08:09:40,695 - INFO - Processing mention 1909955006674911705: Let's talk and get the project off the ground 📬 https://t.co/VD10MDSZxU
2025-04-09 08:09:41,928 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:09:43,275 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:09:43,964 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:09:45,105 - INFO - Created reply to mention 1909955006674911705
2025-04-09 08:09:47,111 - INFO - Waiting for next check...
2025-04-09 08:11:08,058 - INFO - Bot stopped by user
2025-04-09 08:17:48,647 - INFO - Starting Twitter bot - monitoring for mentions
2025-04-09 08:17:48,814 - INFO - Authenticated as @AskNebula
2025-04-09 08:17:48,815 - INFO - Checking for new mentions...
2025-04-09 08:17:49,070 - INFO - No new mentions found
2025-04-09 08:17:49,070 - INFO - Waiting for next check...
2025-04-09 08:19:19,076 - INFO - Checking for new mentions...
2025-04-09 08:19:19,362 - INFO - Found 1 new mentions to process
2025-04-09 08:19:19,363 - INFO - Processing mention 1909959086466085183: Hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:19:20,535 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:19:22,428 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:20:05,380 - INFO - HTTP Request: POST https://nebula-api.thirdweb.com/chat "HTTP/1.1 200 OK"
2025-04-09 08:20:06,099 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:20:14,163 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:20:26,353 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:20:26,967 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:20:33,247 - ERROR - Error processing mention 1909959086466085183: 403 Forbidden
You are not permitted to perform this action.
2025-04-09 08:20:33,249 - INFO - Waiting for next check...
2025-04-09 08:22:03,254 - INFO - Checking for new mentions...
2025-04-09 08:22:03,546 - INFO - No new mentions found
2025-04-09 08:22:03,546 - INFO - Waiting for next check...
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:35] - API_KEY present: True
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:36] - API_SECRET present: True
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:37] - ACCESS_TOKEN present: True
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:38] - ACCESS_TOKEN_SECRET present: True
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:39] - BEARER_TOKEN present: True
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:49] - Authenticating with Twitter API...
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:57] - Twitter API authentication successful
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:440] - === Twitter Bot Starting ===
2025-04-09 08:23:54,021 - INFO - [twiiter_bot.py:389] - Starting Twitter bot - monitoring for mentions
2025-04-09 08:23:54,021 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:23:54,022 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:23:54,022 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:23:54,022 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '74525391552983292461744205034'), ('oauth_timestamp', '1744205034'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:23:54,022 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=74525391552983292461744205034&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205034&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:23:54,022 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:23:54,022 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D74525391552983292461744205034%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205034%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:23:54,022 - DEBUG - [__init__.py:188] - Signature: eliJfeBlpREMRp0OmSQLQCClaBQ=
2025-04-09 08:23:54,022 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:23:54,022 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'OAuth oauth_nonce="74525391552983292461744205034", oauth_timestamp="1744205034", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="eliJfeBlpREMRp0OmSQLQCClaBQ%3D"'}
2025-04-09 08:23:54,022 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:23:54,026 - DEBUG - [connectionpool.py:1049] - Starting new HTTPS connection (1): api.twitter.com:443
2025-04-09 08:23:54,183 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:23:54,184 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:23:54 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'Set-Cookie': 'guest_id_marketing=v1%3A174420503422185284; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:23:54 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, guest_id_ads=v1%3A174420503422185284; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:23:54 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, personalization_id="v1_uH3xCHKjrEN3CiNmPqOD9Q=="; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:23:54 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, guest_id=v1%3A174420503422185284; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:23:54 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, __cf_bm=tAA4UbXKYV1njVexNyBSXiju6Wg9EP0wz8zCWDi3ook-1744205034-1.0.1.1-spF2xe.NLGDVUdyvEQdYKd9AcWj5jBuqtSIGVxGoVQuTzlQHsEs7_SrJ2ZR2VszGldqKOkSzO7gWmFNQOYTO0jJQMMy1fmF1ND3uNs2h_PE; path=/; expires=Wed, 09-Apr-25 13:53:54 GMT; domain=.twitter.com; HttpOnly; Secure; SameSite=None', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '00b08fd076c72c98', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744205080', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199993', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '236', 'x-response-time': '33', 'x-connection-hash': '2caaab748bed3aed09d131f7927d63c438c7b1ea6ec57e4994f887cbee5aa864', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da525789778252-GYE'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:23:54,184 - INFO - [twiiter_bot.py:394] - Authenticated as @AskNebula (ID: 1896726162791112704)
2025-04-09 08:23:54,184 - INFO - [twiiter_bot.py:404] - Bot will respond to @AskNebula mentions
2025-04-09 08:23:54,184 - DEBUG - [twiiter_bot.py:361] - Initializing bot
2025-04-09 08:23:54,184 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909959086466085183
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909959086466085183
2025-04-09 08:23:54,185 - INFO - [twiiter_bot.py:382] - Bot already initialized with last mention ID: 1909959086466085183
2025-04-09 08:23:54,185 - INFO - [twiiter_bot.py:418] - Check #1: Checking for new mentions...
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:267] - Processing mentions
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:202] - Getting recent mentions
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909959086466085183
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:204] - Last mention ID: 1909959086466085183
2025-04-09 08:23:54,185 - DEBUG - [twiiter_bot.py:214] - Using since_id: 1909959086466085183
2025-04-09 08:23:54,186 - DEBUG - [twiiter_bot.py:218] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909959086466085183}
2025-04-09 08:23:54,186 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:23:54,186 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:23:54,186 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:23:54,186 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '38695508406412132101744205034'), ('oauth_timestamp', '1744205034'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:23:54,186 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=38695508406412132101744205034&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205034&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:23:54,186 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:23:54,186 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D38695508406412132101744205034%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205034%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:23:54,186 - DEBUG - [__init__.py:188] - Signature: G+s6PEE4HSDGSUerLI5qmMZk1r4=
2025-04-09 08:23:54,186 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:23:54,187 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420503422185284; guest_id_ads=v1%3A174420503422185284; personalization_id="v1_uH3xCHKjrEN3CiNmPqOD9Q=="; guest_id=v1%3A174420503422185284; __cf_bm=tAA4UbXKYV1njVexNyBSXiju6Wg9EP0wz8zCWDi3ook-1744205034-1.0.1.1-spF2xe.NLGDVUdyvEQdYKd9AcWj5jBuqtSIGVxGoVQuTzlQHsEs7_SrJ2ZR2VszGldqKOkSzO7gWmFNQOYTO0jJQMMy1fmF1ND3uNs2h_PE', 'Authorization': 'OAuth oauth_nonce="38695508406412132101744205034", oauth_timestamp="1744205034", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="G%2Bs6PEE4HSDGSUerLI5qmMZk1r4%3D"'}
2025-04-09 08:23:54,187 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:23:54,316 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:23:54,317 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:23:54 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '330bad18807e66f2', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744205080', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199992', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '235', 'x-response-time': '34', 'x-connection-hash': '61a3fe046867898633c8e9a5a292fe4075267ad59ca61278c93d921c6c157016', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da52586b2a8252-GYE'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:23:54,318 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909959086466085183}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:23:54,443 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909959086466085183 HTTP/1.1" 200 53
2025-04-09 08:23:54,444 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:23:54 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '53', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '8a7a714b38e654b3', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744205080', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '10', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '22', 'x-connection-hash': '1b9760d098b0d18c5b47a1acd8afd837d69ddf7cab019dc43675b121a213e0dd', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da52593d228252-GYE'}
Content: b'{"meta":{"result_count":0}}'
2025-04-09 08:23:54,444 - DEBUG - [twiiter_bot.py:223] - No new mentions found
2025-04-09 08:23:54,444 - INFO - [twiiter_bot.py:271] - No new mentions found
2025-04-09 08:23:54,444 - INFO - [twiiter_bot.py:424] - Waiting for next check... (90 seconds)
2025-04-09 08:25:24,451 - INFO - [twiiter_bot.py:418] - Check #2: Checking for new mentions...
2025-04-09 08:25:24,451 - DEBUG - [twiiter_bot.py:267] - Processing mentions
2025-04-09 08:25:24,451 - DEBUG - [twiiter_bot.py:202] - Getting recent mentions
2025-04-09 08:25:24,451 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:25:24,453 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909959086466085183
2025-04-09 08:25:24,453 - DEBUG - [twiiter_bot.py:204] - Last mention ID: 1909959086466085183
2025-04-09 08:25:24,453 - DEBUG - [twiiter_bot.py:214] - Using since_id: 1909959086466085183
2025-04-09 08:25:24,453 - DEBUG - [twiiter_bot.py:218] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909959086466085183}
2025-04-09 08:25:24,454 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:25:24,454 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:25:24,455 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:25:24,455 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '161792709230496580751744205124'), ('oauth_timestamp', '1744205124'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:25:24,455 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=161792709230496580751744205124&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205124&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:25:24,455 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:25:24,455 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D161792709230496580751744205124%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205124%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:25:24,456 - DEBUG - [__init__.py:188] - Signature: J1+QMYTRNZmkYiWJqq6UNrrHvP8=
2025-04-09 08:25:24,456 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:25:24,456 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420503422185284; guest_id_ads=v1%3A174420503422185284; personalization_id="v1_uH3xCHKjrEN3CiNmPqOD9Q=="; guest_id=v1%3A174420503422185284; __cf_bm=tAA4UbXKYV1njVexNyBSXiju6Wg9EP0wz8zCWDi3ook-1744205034-1.0.1.1-spF2xe.NLGDVUdyvEQdYKd9AcWj5jBuqtSIGVxGoVQuTzlQHsEs7_SrJ2ZR2VszGldqKOkSzO7gWmFNQOYTO0jJQMMy1fmF1ND3uNs2h_PE', 'Authorization': 'OAuth oauth_nonce="161792709230496580751744205124", oauth_timestamp="1744205124", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="J1%2BQMYTRNZmkYiWJqq6UNrrHvP8%3D"'}
2025-04-09 08:25:24,456 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:25:24,587 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:25:24,587 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:25:24 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': 'd02835135123b249', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199999', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '234', 'x-response-time': '32', 'x-connection-hash': '238b9047ec1c49e31fcb36e0633b949e9228f485926c532b765cb98998f3a67f', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da548c9bea8252-GYE'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:25:24,588 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909959086466085183}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:25:24,732 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909959086466085183 HTTP/1.1" 200 296
2025-04-09 08:25:24,733 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:25:24 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '296', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '046df1532c723a6e', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '14', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '50', 'x-connection-hash': '6870fbb32cf1948fcd8e89b740387e26c96932aa6be63021a7ac1c42e7255185', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da548d6ddb8252-GYE'}
Content: b'{"data":[{"edit_history_tweet_ids":["1909960657732063423"],"id":"1909960657732063423","author_id":"1437794194580459525","text":"Hey @AskNebula can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?"}],"includes":{"users":[{"id":"1437794194580459525","name":"Vasiliy Kirochka","username":"cromewar"}]},"meta":{"result_count":1,"newest_id":"1909960657732063423","oldest_id":"1909960657732063423"}}'
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:228] - Found mention ID: 1909960657732063423, text: Hey @AskNebula can you analyze this transaction 0...
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:234] - Returning 1 mentions sorted by ID
2025-04-09 08:25:24,734 - INFO - [twiiter_bot.py:274] - Found 1 new mentions to process
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:278] - Processing mention ID 1909960657732063423
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:282] - Mention text: Hey @AskNebula can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:261] - Checking if direct mention: 'Hey @AskNebula can you analyze this transaction 0...' -> True
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:299] - Cleaned text: Hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:25:24,734 - INFO - [twiiter_bot.py:301] - Processing mention 1909960657732063423: Hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:304] - Sending query to process_blockchain_query: Hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:25:24,734 - DEBUG - [twiiter_bot.py:307] - Calling process_blockchain_query
2025-04-09 08:25:24,892 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'Hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:25:24,903 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:25:24,903 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:25:25,189 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x114662c90>
2025-04-09 08:25:25,189 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x114374b90> server_hostname='api.openai.com' timeout=None
2025-04-09 08:25:25,203 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x11461bb50>
2025-04-09 08:25:25,203 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:25:25,204 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:25:25,204 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:25:25,204 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:25:25,204 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:25:26,666 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:25:26 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'725'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999680'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'9ms'), (b'x-request-id', b'req_a1ece3a1c6997c079b2cc48a6a00976a'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'__cf_bm=k35SbnDZjHr5.VufY1xFFzXfAGC4MmR9dvIZ5b6HbaU-1744205126-1.0.1.1-fSCU1vXZ1.dft2G6QGG6ig42p5hDbgMobC.FaioviRldYiCwAjTtZDrZyEmKSiObf3xbti9WUqVw8WW0EDewkcFisKTdqcsWTMyPjVtr9jI; path=/; expires=Wed, 09-Apr-25 13:55:26 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'X-Content-Type-Options', b'nosniff'), (b'Set-Cookie', b'_cfuvid=rJv_tr8ExJcIrMyGAnr2A6aZfY.T6JJ.ra.2CNOPgNk-1744205126768-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da549139df824d-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:25:26,667 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:25:26,667 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers([('date', 'Wed, 09 Apr 2025 13:25:26 GMT'), ('content-type', 'text/event-stream; charset=utf-8'), ('transfer-encoding', 'chunked'), ('connection', 'keep-alive'), ('access-control-expose-headers', 'X-Request-ID'), ('openai-organization', 'cromewar'), ('openai-processing-ms', '725'), ('openai-version', '2020-10-01'), ('x-ratelimit-limit-requests', '5000'), ('x-ratelimit-limit-tokens', '2000000'), ('x-ratelimit-remaining-requests', '4999'), ('x-ratelimit-remaining-tokens', '1999680'), ('x-ratelimit-reset-requests', '12ms'), ('x-ratelimit-reset-tokens', '9ms'), ('x-request-id', 'req_a1ece3a1c6997c079b2cc48a6a00976a'), ('strict-transport-security', 'max-age=31536000; includeSubDomains; preload'), ('cf-cache-status', 'DYNAMIC'), ('set-cookie', '__cf_bm=k35SbnDZjHr5.VufY1xFFzXfAGC4MmR9dvIZ5b6HbaU-1744205126-1.0.1.1-fSCU1vXZ1.dft2G6QGG6ig42p5hDbgMobC.FaioviRldYiCwAjTtZDrZyEmKSiObf3xbti9WUqVw8WW0EDewkcFisKTdqcsWTMyPjVtr9jI; path=/; expires=Wed, 09-Apr-25 13:55:26 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('x-content-type-options', 'nosniff'), ('set-cookie', '_cfuvid=rJv_tr8ExJcIrMyGAnr2A6aZfY.T6JJ.ra.2CNOPgNk-1744205126768-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('server', 'cloudflare'), ('cf-ray', '92da549139df824d-GYE'), ('alt-svc', 'h3=":443"; ma=86400')])
2025-04-09 08:25:26,667 - DEBUG - [_base_client.py:999] - request_id: req_a1ece3a1c6997c079b2cc48a6a00976a
2025-04-09 08:25:26,667 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:25:27,716 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:25:27,716 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:25:27,717 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:25:27,728 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant specialized in blockchain operations. For balance queries on specific contracts, use the get_balance_on_contract tool directly instead of the generic chat tool.\n - Always use the most specific tool available for the task.\n - If a chain is not specified, you will assume the user is asking for the balance of an ENS name or an address on the mainnet.\n - You must not make up any information, like contract addresses, chain ids, etc. You will only work with the information provided by the user.\n - By default you will avoid using the get_balance_on_contract tool and use the generic chat tool instead unless the user explicitly asks for the balance of a specific contract. If no contract address is provided, you will assume the user is requesting the balance of an ENS name so you will default to the native currency of the chain.\n - Get transaction details is only for transaction hashes, not for ENS names or addresses. if the tools in incorrectly used you need to pivot and find the transactions for the wallet address and ignore this tool call.\n - If the user asks for information about an ENS name, you will use the resolve_ens_name tool to get the address of the ENS name and then try to get the balances of the address for mainnet unless another chain is specified, and also try to get any other information you can find about the address.\n - If the request is about finding suspicious activity of a wallet address, you will get the last 10 transactions of the address and analyze them looking for patterns that are suspicious, like wash trading, or other patterns.\n - When a chain is provided but not it's chain id, you need to automatically resolve the chain id from the chain name.\n - For off-topic questions, personal messages, greetings, or any requests unrelated to blockchain, use the respond_to_offtopic tool, but if the user asks about blockchain or crypto, you must always first try to get the information from the blockchain and then pivot to the respond_to_offtopic tool if you can't find the information in the blockchain.\n ", 'role': 'system'}, {'content': 'Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base.', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'chat', 'description': 'Send a message to Nebula AI and get a response. This can be used for blockchain queries, contract interactions, and access to thirdweb tools.', 'parameters': {'properties': {'message': {'description': 'The natural language message to process. Can be a question about blockchain data, a request to execute a transaction, or any web3-related query.', 'type': 'string'}, 'session_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional session ID to maintain conversation context. If provided, this message will be part of an ongoing conversation; if omitted, a new session is created.'}, 'context': {'anyOf': [{'additionalProperties': True, 'type': 'object'}, {'type': 'null'}], 'default': None, 'description': "Contextual information for processing the request, including: chainIds (array of chain identifiers) and walletAddress (user's wallet for transaction signing). Example: {'chainIds': ['1', '137'], 'walletAddress': '0x123...'}"}}, 'required': ['message'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_session', 'description': 'Fetch complete information about a specific Nebula AI session, including conversation history, context settings, and metadata. Use this to examine past interactions or resume an existing conversation thread.', 'parameters': {'properties': {'session_id': {'description': 'Unique identifier for the target session. This UUID references a specific conversation history in the Nebula system.', 'type': 'string'}}, 'required': ['session_id'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'list_sessions', 'description': 'Retrieve all available Nebula AI sessions for the authenticated account. Returns an array of session metadata including IDs, titles, and creation timestamps, allowing you to find and reference existing conversations.', 'parameters': {'properties': {}, 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_balance_on_contract', 'description': 'Get the balance of an ENS name on a contract, use this only when the contract address is explicitly provided.\n\n If no chain_id is provided it must utomatically try to resolve the chain_id from the chain name\n For Sepolia the chain_id is 11155111\n For Mainnet the chain_id is 1\n For Optimism the chain_id is 10\n For Base the chain_id is 8453\n For Arbitrum the chain_id is 42161\n For Polygon the chain_id is 137\n And so on for other chains\n\n Args:\n ens_name: The ENS name to get the balance of\n contract_address: The address of the contract to get the balance of\n chain: The chain to get the balance of\n chain_id: The chain id to get the balance of\n\n Returns:\n The balance of the ENS name on the contract', 'parameters': {'properties': {'ens_name': {'type': 'string'}, 'contract_address': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['ens_name', 'contract_address'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'resolve_ens_name', 'description': 'Resolve an ENS name to an address\n\n Args:\n ens_name: The ENS name to resolve\n\n Returns:\n The address of the ENS name', 'parameters': {'properties': {'ens_name': {'type': 'string'}}, 'required': ['ens_name'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_transaction_details', 'description': 'Get the details of a transaction from any EVM chain, if the chain_id is not provided it must utomatically try to resolve the chain_id from the chain name.\n\n\n\n Args:\n transaction_hash: The hash of the transaction to get the details of\n chain: The chain to get the transaction details of\n chain_id: The chain id to get the transaction details of\n\n Returns:\n The details of the transaction', 'parameters': {'properties': {'transaction_hash': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['transaction_hash'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'respond_to_offtopic', 'description': "Handle off-topic questions, personal messages, greetings, jokes, or any requests unrelated to blockchain data.\n Use this tool when the user's query doesn't require blockchain data or other specific tools.\n\n Args:\n query: The off-topic question or message from the user\n\n Returns:\n A friendly, appropriate response to the off-topic query", 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}]}}
2025-04-09 08:25:27,729 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:25:27,730 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:25:27,740 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x1146996d0>
2025-04-09 08:25:27,740 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x114374f80> server_hostname='api.openai.com' timeout=None
2025-04-09 08:25:27,754 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x11468a590>
2025-04-09 08:25:27,754 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:25:27,754 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:25:27,754 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:25:27,754 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:25:27,754 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:25:28,974 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:25:29 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'644'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999403'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'17ms'), (b'x-request-id', b'req_e0d456f45bc3ea09849a74471578bae2'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'__cf_bm=9TPkQh21HJIO3FQ2ELfP4fzBDSJgRHR1jdkjci9azWc-1744205129-1.0.1.1-s6cgwjo.CcH8Be35UIlVLhoD2Qk5VzFdVxa_cK9Fpv.DI8PkoymkwBHYgsfziRo6L8Kcpl8Iizr8BpWX4x9VnIXwJd9J7qU94.Lx0ElQJYc; path=/; expires=Wed, 09-Apr-25 13:55:29 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'X-Content-Type-Options', b'nosniff'), (b'Set-Cookie', b'_cfuvid=P_tR.QBoDlyD_g1doCCySOEJLMv4a1FxSFG4ERqSifQ-1744205129076-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da54a129718252-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:25:28,979 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:25:28,979 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers([('date', 'Wed, 09 Apr 2025 13:25:29 GMT'), ('content-type', 'text/event-stream; charset=utf-8'), ('transfer-encoding', 'chunked'), ('connection', 'keep-alive'), ('access-control-expose-headers', 'X-Request-ID'), ('openai-organization', 'cromewar'), ('openai-processing-ms', '644'), ('openai-version', '2020-10-01'), ('x-ratelimit-limit-requests', '5000'), ('x-ratelimit-limit-tokens', '2000000'), ('x-ratelimit-remaining-requests', '4999'), ('x-ratelimit-remaining-tokens', '1999403'), ('x-ratelimit-reset-requests', '12ms'), ('x-ratelimit-reset-tokens', '17ms'), ('x-request-id', 'req_e0d456f45bc3ea09849a74471578bae2'), ('strict-transport-security', 'max-age=31536000; includeSubDomains; preload'), ('cf-cache-status', 'DYNAMIC'), ('set-cookie', '__cf_bm=9TPkQh21HJIO3FQ2ELfP4fzBDSJgRHR1jdkjci9azWc-1744205129-1.0.1.1-s6cgwjo.CcH8Be35UIlVLhoD2Qk5VzFdVxa_cK9Fpv.DI8PkoymkwBHYgsfziRo6L8Kcpl8Iizr8BpWX4x9VnIXwJd9J7qU94.Lx0ElQJYc; path=/; expires=Wed, 09-Apr-25 13:55:29 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('x-content-type-options', 'nosniff'), ('set-cookie', '_cfuvid=P_tR.QBoDlyD_g1doCCySOEJLMv4a1FxSFG4ERqSifQ-1744205129076-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('server', 'cloudflare'), ('cf-ray', '92da54a129718252-GYE'), ('alt-svc', 'h3=":443"; ma=86400')])
2025-04-09 08:25:28,979 - DEBUG - [_base_client.py:999] - request_id: req_e0d456f45bc3ea09849a74471578bae2
2025-04-09 08:25:28,982 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:25:31,477 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:25:31,477 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:25:31,478 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:25:31,481 - DEBUG - [_trace.py:47] - connect_tcp.started host='nebula-api.thirdweb.com' port=443 local_address=None timeout=120.0 socket_options=None
2025-04-09 08:25:31,507 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x11463a010>
2025-04-09 08:25:31,508 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x114374dd0> server_hostname='nebula-api.thirdweb.com' timeout=120.0
2025-04-09 08:25:31,522 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x114639ed0>
2025-04-09 08:25:31,522 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:25:31,523 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:25:31,523 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:25:31,523 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:25:31,523 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:26:08,397 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:26:08 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'_cfuvid=M_cqx4RBO8eZzoR51r7Olju3HAJbOus_bV55NY_YEW0-1744205168498-0.0.1.1-604800000; path=/; domain=.thirdweb.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da54b8b965824f-GYE'), (b'Content-Encoding', b'gzip')])
2025-04-09 08:26:08,398 - INFO - [_client.py:1025] - HTTP Request: POST https://nebula-api.thirdweb.com/chat "HTTP/1.1 200 OK"
2025-04-09 08:26:08,398 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:26:08,398 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:26:08,398 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:26:08,399 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:26:08,412 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant specialized in blockchain operations. For balance queries on specific contracts, use the get_balance_on_contract tool directly instead of the generic chat tool.\n - Always use the most specific tool available for the task.\n - If a chain is not specified, you will assume the user is asking for the balance of an ENS name or an address on the mainnet.\n - You must not make up any information, like contract addresses, chain ids, etc. You will only work with the information provided by the user.\n - By default you will avoid using the get_balance_on_contract tool and use the generic chat tool instead unless the user explicitly asks for the balance of a specific contract. If no contract address is provided, you will assume the user is requesting the balance of an ENS name so you will default to the native currency of the chain.\n - Get transaction details is only for transaction hashes, not for ENS names or addresses. if the tools in incorrectly used you need to pivot and find the transactions for the wallet address and ignore this tool call.\n - If the user asks for information about an ENS name, you will use the resolve_ens_name tool to get the address of the ENS name and then try to get the balances of the address for mainnet unless another chain is specified, and also try to get any other information you can find about the address.\n - If the request is about finding suspicious activity of a wallet address, you will get the last 10 transactions of the address and analyze them looking for patterns that are suspicious, like wash trading, or other patterns.\n - When a chain is provided but not it's chain id, you need to automatically resolve the chain id from the chain name.\n - For off-topic questions, personal messages, greetings, or any requests unrelated to blockchain, use the respond_to_offtopic tool, but if the user asks about blockchain or crypto, you must always first try to get the information from the blockchain and then pivot to the respond_to_offtopic tool if you can't find the information in the blockchain.\n ", 'role': 'system'}, {'content': 'Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base.', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_HAQzI0ht59CtRQS9GF4cMBYO', 'function': {'name': 'get_transaction_details', 'arguments': '{"transaction_hash": "0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad", "chain": "Base"}'}}]}, {'content': '{"message": "I\'ve analyzed this transaction on the Base chain for you:\\n\\nTransaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad was a successful NFT claim operation.\\n\\n**Key Details:**\\n- Block Number: 28453333\\n- Sender: 0x7b323b7f681d29d477fa33b68758880dd7cff62b\\n- Contract Interacted With: 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d\\n- Gas Used: 131,092\\n\\n**What Happened:**\\nThe transaction was a free NFT claim where:\\n- User claimed 1 NFT (Token ID: 4331)\\n- The NFT was sent to: 0xab64Be5870b82474816B999C96666751AB43a7d0\\n- The claim required verification through an allowlist proof\\n- No payment was required (pricePerToken: 0)\\n\\nThe transaction emitted a Transfer event showing the NFT moving from the zero address to the receiver, confirming this was a new mint rather than a transfer.", "actions": [], "session_id": "9e2528ee-4865-42d3-9960-58d941aed639", "request_id": "919ae48c-8a9f-4d1f-a552-08a4a53ed636"}', 'role': 'tool', 'tool_call_id': 'call_HAQzI0ht59CtRQS9GF4cMBYO'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'chat', 'description': 'Send a message to Nebula AI and get a response. This can be used for blockchain queries, contract interactions, and access to thirdweb tools.', 'parameters': {'properties': {'message': {'description': 'The natural language message to process. Can be a question about blockchain data, a request to execute a transaction, or any web3-related query.', 'type': 'string'}, 'session_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional session ID to maintain conversation context. If provided, this message will be part of an ongoing conversation; if omitted, a new session is created.'}, 'context': {'anyOf': [{'additionalProperties': True, 'type': 'object'}, {'type': 'null'}], 'default': None, 'description': "Contextual information for processing the request, including: chainIds (array of chain identifiers) and walletAddress (user's wallet for transaction signing). Example: {'chainIds': ['1', '137'], 'walletAddress': '0x123...'}"}}, 'required': ['message'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_session', 'description': 'Fetch complete information about a specific Nebula AI session, including conversation history, context settings, and metadata. Use this to examine past interactions or resume an existing conversation thread.', 'parameters': {'properties': {'session_id': {'description': 'Unique identifier for the target session. This UUID references a specific conversation history in the Nebula system.', 'type': 'string'}}, 'required': ['session_id'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'list_sessions', 'description': 'Retrieve all available Nebula AI sessions for the authenticated account. Returns an array of session metadata including IDs, titles, and creation timestamps, allowing you to find and reference existing conversations.', 'parameters': {'properties': {}, 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_balance_on_contract', 'description': 'Get the balance of an ENS name on a contract, use this only when the contract address is explicitly provided.\n\n If no chain_id is provided it must utomatically try to resolve the chain_id from the chain name\n For Sepolia the chain_id is 11155111\n For Mainnet the chain_id is 1\n For Optimism the chain_id is 10\n For Base the chain_id is 8453\n For Arbitrum the chain_id is 42161\n For Polygon the chain_id is 137\n And so on for other chains\n\n Args:\n ens_name: The ENS name to get the balance of\n contract_address: The address of the contract to get the balance of\n chain: The chain to get the balance of\n chain_id: The chain id to get the balance of\n\n Returns:\n The balance of the ENS name on the contract', 'parameters': {'properties': {'ens_name': {'type': 'string'}, 'contract_address': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['ens_name', 'contract_address'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'resolve_ens_name', 'description': 'Resolve an ENS name to an address\n\n Args:\n ens_name: The ENS name to resolve\n\n Returns:\n The address of the ENS name', 'parameters': {'properties': {'ens_name': {'type': 'string'}}, 'required': ['ens_name'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_transaction_details', 'description': 'Get the details of a transaction from any EVM chain, if the chain_id is not provided it must utomatically try to resolve the chain_id from the chain name.\n\n\n\n Args:\n transaction_hash: The hash of the transaction to get the details of\n chain: The chain to get the transaction details of\n chain_id: The chain id to get the transaction details of\n\n Returns:\n The details of the transaction', 'parameters': {'properties': {'transaction_hash': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['transaction_hash'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'respond_to_offtopic', 'description': "Handle off-topic questions, personal messages, greetings, jokes, or any requests unrelated to blockchain data.\n Use this tool when the user's query doesn't require blockchain data or other specific tools.\n\n Args:\n query: The off-topic question or message from the user\n\n Returns:\n A friendly, appropriate response to the off-topic query", 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}]}}
2025-04-09 08:26:08,414 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:26:08,414 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:26:08,414 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:26:08,415 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:26:08,424 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x1146a7a10>
2025-04-09 08:26:08,424 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x114374f80> server_hostname='api.openai.com' timeout=None
2025-04-09 08:26:08,435 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x11469bad0>
2025-04-09 08:26:08,435 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:26:08,435 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:26:08,435 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:26:08,436 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:26:08,436 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:26:09,169 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:26:09 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'386'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999163'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'25ms'), (b'x-request-id', b'req_9088c04b875ea2fcb521b097f19f1b38'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da559f6e869afb-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:26:09,170 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:26:09,171 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:26:09 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '386', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999163', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '25ms', 'x-request-id': 'req_9088c04b875ea2fcb521b097f19f1b38', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da559f6e869afb-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:26:09,171 - DEBUG - [_base_client.py:999] - request_id: req_9088c04b875ea2fcb521b097f19f1b38
2025-04-09 08:26:09,171 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:26:15,087 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:26:15,087 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:26:15,087 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:26:15,098 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'Hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_DWlW9Sx5org3ceI1sfp88Kjp', 'function': {'name': 'query_nebula', 'arguments': '{"query": "Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base."}'}}]}, {'content': 'The transaction **0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad** on the Base chain was a successful NFT claim operation. Here are the key details:\n\n- **Block Number:** 28453333\n- **Sender:** 0x7b323b7f681d29d477fa33b68758880dd7cff62b\n- **Contract Interacted With:** 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d\n- **Gas Used:** 131,092\n\n### What Happened:\n- The user claimed **1 NFT** (Token ID: 4331).\n- The NFT was sent to the address **0xab64Be5870b82474816B999C96666751AB43a7d0**.\n- The claim required verification through an **allowlist proof**.\n- No payment was required (price per token: 0).\n\nThe transaction emitted a **Transfer** event showing the NFT moving from the zero address to the receiver, confirming this was a new mint rather than a transfer.\n\nIf you have any further questions or need additional analysis, feel free to ask!', 'role': 'tool', 'tool_call_id': 'call_DWlW9Sx5org3ceI1sfp88Kjp'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:26:15,100 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:26:15,100 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:26:15,100 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:26:15,101 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:26:15,110 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x1146b0350>
2025-04-09 08:26:15,111 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x114374b90> server_hostname='api.openai.com' timeout=None
2025-04-09 08:26:15,123 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x1146b0e50>
2025-04-09 08:26:15,123 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:26:15,123 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:26:15,123 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:26:15,123 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:26:15,123 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:26:16,339 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:26:16 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'857'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999463'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'16ms'), (b'x-request-id', b'req_f6745a44c9ebed532e28851f18fe799e'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da55c938938259-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:26:16,340 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:26:16,340 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:26:16 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '857', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999463', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '16ms', 'x-request-id': 'req_f6745a44c9ebed532e28851f18fe799e', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da55c938938259-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:26:16,340 - DEBUG - [_base_client.py:999] - request_id: req_f6745a44c9ebed532e28851f18fe799e
2025-04-09 08:26:16,340 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:26:21,066 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:26:21,066 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:26:21,067 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:26:21,072 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': '\n Write a Twitter thread about the following blockchain information in exactly 3 tweets:\n \n Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base is a successful NFT claim operation! Here are the details:\n\n1/3 ✅ Block Number: 28453333 \nSender: 0x7b323b7f681d29d477fa33b68758880dd7cff62b \nContract: 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d \nGas Used: 131,092 \n\n2/3 🎨 The user claimed **1 NFT** (Token ID: 4331) sent to address 0xab64Be5870b82474816B999C96666751AB43a7d0! This claim required an allowlist proof for verification. \n\n3/3 🚨 Notably, there was **no payment required** for claiming this NFT! A Transfer event confirmed this mint from the zero address to the receiver. #NFT #Blockchain\n \n Requirements:\n - NO hashtags whatsoever\n - Use bullet points (•) for better readability\n - Each bullet point should be on its own line\n - NO markdown formatting (no backticks, no asterisks for bold)\n - For technical data like addresses, use clear labels: "From: 0x123..." not "**From**: `0x123...`"\n - Easy-to-read content with clear keywords and concise language\n - Natural flow between tweets, the transition between tweets should be seamless\n - Each Tweet should be about the same length and try to be as concise as possible\n - Use emojis to make the thread more engaging\n - Twitter has character limits, so keep each tweet under 280 characters\n - Use proper spacing between sentences\n - Format numbers with commas for better readability (e.g., "1,234,567" not "1234567")\n - Use proper units (e.g., "ETH" for Ether values)\n - Keep technical details clear but concise\n - If the information is about a transaction, you MUST include a link to the block explorer with the transaction hash in the last tweet\n - For transactions, use the appropriate block explorer: \n - Ethereum: https://etherscan.io/tx/<hash>\n - Base: https://basescan.org/tx/<hash>\n - Polygon: https://polygonscan.com/tx/<hash>\n - Arbitrum: https://arbiscan.io/tx/<hash>\n - Optimism: https://optimistic.etherscan.io/tx/<hash>\n \n Format:\n Return the thread as plain text with each tweet on a new line, separated by line breaks:\n\n Tweet 1: [First tweet content]\n\n Tweet 2: [Second tweet content]\n\n Tweet 3: [Third tweet content with block explorer link if it\'s a transaction]\n ', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': False}}
2025-04-09 08:26:21,074 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:26:21,075 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:26:21,075 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:26:21,075 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:26:21,075 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:26:21,076 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:26:26,692 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:26:26 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'5474'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999332'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'20ms'), (b'x-request-id', b'req_aac0a200d12a83bd9fcaa1b0bfd9566f'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da55ee6dbb8259-GYE'), (b'Content-Encoding', b'gzip'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:26:26,693 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:26:26,693 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:26:26,700 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:26:26,701 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:26:26,701 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:26:26,701 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:26:26 GMT', 'content-type': 'application/json', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '5474', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999332', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '20ms', 'x-request-id': 'req_aac0a200d12a83bd9fcaa1b0bfd9566f', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da55ee6dbb8259-GYE', 'content-encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:26:26,701 - DEBUG - [_base_client.py:999] - request_id: req_aac0a200d12a83bd9fcaa1b0bfd9566f
2025-04-09 08:26:26,723 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'Hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_DWlW9Sx5org3ceI1sfp88Kjp', 'function': {'name': 'query_nebula', 'arguments': '{"query": "Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base."}'}}]}, {'content': 'The transaction **0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad** on the Base chain was a successful NFT claim operation. Here are the key details:\n\n- **Block Number:** 28453333\n- **Sender:** 0x7b323b7f681d29d477fa33b68758880dd7cff62b\n- **Contract Interacted With:** 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d\n- **Gas Used:** 131,092\n\n### What Happened:\n- The user claimed **1 NFT** (Token ID: 4331).\n- The NFT was sent to the address **0xab64Be5870b82474816B999C96666751AB43a7d0**.\n- The claim required verification through an **allowlist proof**.\n- No payment was required (price per token: 0).\n\nThe transaction emitted a **Transfer** event showing the NFT moving from the zero address to the receiver, confirming this was a new mint rather than a transfer.\n\nIf you have any further questions or need additional analysis, feel free to ask!', 'role': 'tool', 'tool_call_id': 'call_DWlW9Sx5org3ceI1sfp88Kjp'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_s6SUQQk9lyhlWNn6GLrhpdRt', 'function': {'name': 'create_twitter_thread', 'arguments': '{"blockchain_data": "Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base is a successful NFT claim operation! Here are the details:\\n\\n1/3 \\u2705 Block Number: 28453333 \\nSender: 0x7b323b7f681d29d477fa33b68758880dd7cff62b \\nContract: 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d \\nGas Used: 131,092 \\n\\n2/3 \\ud83c\\udfa8 The user claimed **1 NFT** (Token ID: 4331) sent to address 0xab64Be5870b82474816B999C96666751AB43a7d0! This claim required an allowlist proof for verification. \\n\\n3/3 \\ud83d\\udea8 Notably, there was **no payment required** for claiming this NFT! A Transfer event confirmed this mint from the zero address to the receiver. #NFT #Blockchain"}'}}]}, {'content': '{"tweet1": "✅ Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base is a successful NFT claim!\\n• Block Number: 28,453,333\\n• Sender: 0x7b323b7f681d29d477fa33b68758880dd7cff62b\\n• Contract: 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d\\n• Gas Used: 131,092", "tweet2": "🎨 The user claimed 1 NFT!\\n• Token ID: 4,331\\n• Sent to address: 0xab64Be5870b82474816B999C96666751AB43a7d0\\n• Claim required allowlist proof for verification.", "tweet3": "🚨 Notably, there was no payment required for claiming this NFT!\\n• A Transfer event confirmed the mint from the zero address to the receiver.\\nCheck out the full transaction here: https://basescan.org/tx/0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad"}', 'role': 'tool', 'tool_call_id': 'call_s6SUQQk9lyhlWNn6GLrhpdRt'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:26:26,725 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:26:26,725 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:26:26,725 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:26:26,725 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:26:26,725 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:26:26,725 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:26:27,287 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:26:27 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'423'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999269'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'21ms'), (b'x-request-id', b'req_3a167e96776842b47953aacc853533e8'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da5611bc2b8259-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:26:27,288 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:26:27,290 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:26:27 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '423', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999269', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '21ms', 'x-request-id': 'req_3a167e96776842b47953aacc853533e8', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da5611bc2b8259-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:26:27,291 - DEBUG - [_base_client.py:999] - request_id: req_3a167e96776842b47953aacc853533e8
2025-04-09 08:26:27,292 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:26:31,546 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:26:31,547 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:26:31,547 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:26:31,548 - DEBUG - [twiiter_bot.py:309] - Result type: thread
2025-04-09 08:26:31,548 - DEBUG - [twiiter_bot.py:313] - Thread result - Tweet 1: ✅ Transaction 0x4db65f81c76a596073d1eddefd592d0c3f...
2025-04-09 08:26:31,548 - DEBUG - [twiiter_bot.py:316] - Thread result - Tweet 2: 🎨 The user claimed 1 NFT!
• Token ID: 4,331
• Sent...
2025-04-09 08:26:31,549 - DEBUG - [twiiter_bot.py:319] - Thread result - Tweet 3: 🚨 Notably, there was no payment required for claim...
2025-04-09 08:26:31,549 - INFO - [twiiter_bot.py:329] - Creating thread in response to mention 1909960657732063423
2025-04-09 08:26:31,549 - DEBUG - [twiiter_bot.py:90] - Creating thread with first tweet: ✅ Transaction 0x4db65f81c76a596073d1eddefd592d0c3f...
2025-04-09 08:26:31,549 - DEBUG - [client.py:77] - Making API request: POST https://api.twitter.com/2/tweets
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: {'text': '✅ Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base is a successful NFT claim!\n• Block Number: 28,453,333\n• Sender: 0x7b323b7f681d29d477fa33b68758880dd7cff62b\n• Contract: 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d\n• Gas Used: 131,092'}
2025-04-09 08:26:31,550 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [POST]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:26:31,550 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:26:31,551 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '112016749520394225011744205191'), ('oauth_timestamp', '1744205191'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:26:31,551 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=112016749520394225011744205191&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205191&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:26:31,551 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/tweets
2025-04-09 08:26:31,551 - DEBUG - [__init__.py:181] - Signing: signature base string: POST&https%3A%2F%2Fapi.twitter.com%2F2%2Ftweets&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D112016749520394225011744205191%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205191%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:26:31,551 - DEBUG - [__init__.py:188] - Signature: GwNiBpmhsISABtYO32iqs9tbYNw=
2025-04-09 08:26:31,551 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/tweets
2025-04-09 08:26:31,551 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420503422185284; guest_id_ads=v1%3A174420503422185284; personalization_id="v1_uH3xCHKjrEN3CiNmPqOD9Q=="; guest_id=v1%3A174420503422185284; __cf_bm=tAA4UbXKYV1njVexNyBSXiju6Wg9EP0wz8zCWDi3ook-1744205034-1.0.1.1-spF2xe.NLGDVUdyvEQdYKd9AcWj5jBuqtSIGVxGoVQuTzlQHsEs7_SrJ2ZR2VszGldqKOkSzO7gWmFNQOYTO0jJQMMy1fmF1ND3uNs2h_PE', 'Content-Length': '311', 'Content-Type': 'application/json', 'Authorization': 'OAuth oauth_nonce="112016749520394225011744205191", oauth_timestamp="1744205191", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="GwNiBpmhsISABtYO32iqs9tbYNw%3D"'}
2025-04-09 08:26:31,552 - DEBUG - [oauth1_auth.py:111] - Updated body: b'{"text": "\\u2705 Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base is a successful NFT claim!\\n\\u2022 Block Number: 28,453,333\\n\\u2022 Sender: 0x7b323b7f681d29d477fa33b68758880dd7cff62b\\n\\u2022 Contract: 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d\\n\\u2022 Gas Used: 131,092"}'
2025-04-09 08:26:31,808 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "POST /2/tweets HTTP/1.1" 201 303
2025-04-09 08:26:31,809 - DEBUG - [client.py:88] - Received API response: 201 Created
Headers: {'Date': 'Wed, 09 Apr 2025 13:26:31 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '303', 'Connection': 'keep-alive', 'perf': '7402827104', 'location': 'https://api.x.com/2/tweets/1909961123052347702', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': 'eaa06a656925a674', 'x-xss-protection': '0', 'x-rate-limit-limit': '1080000', 'x-rate-limit-reset': '1744205733', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1079998', 'x-app-limit-24hour-limit': '1667', 'x-app-limit-24hour-reset': '1744289738', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '100', 'x-user-limit-24hour-reset': '1744289738', 'x-app-limit-24hour-remaining': '1663', 'x-user-limit-24hour-remaining': '96', 'x-response-time': '149', 'x-connection-hash': 'c9a90d49386ca96d2d349f5ffd31142bdb04ee99155fdf7278282ef9f78112bc', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da562fed608252-GYE'}
Content: b'{"data":{"edit_history_tweet_ids":["1909961123052347702"],"id":"1909961123052347702","text":"\xe2\x9c\x85 Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base is a successful NFT claim!\\n\xe2\x80\xa2 Block Number: 28,453,333\\n\xe2\x80\xa2 Sender: 0x7b323b7f681d29d477fa33b68758880dd7cff62b\\n\xe2\x80\xa2 Contract: 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d\\n\xe2\x80\xa2 Gas Used: 131,092"}}'
2025-04-09 08:26:31,809 - INFO - [twiiter_bot.py:95] - Created thread tweet 1 with ID 1909961123052347702: ✅ Transaction 0x4db65f81c76a59...
2025-04-09 08:26:31,809 - DEBUG - [twiiter_bot.py:100] - Creating tweet 2 as reply to 1909961123052347702
2025-04-09 08:26:31,810 - DEBUG - [client.py:77] - Making API request: POST https://api.twitter.com/2/tweets
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: {'reply': {'in_reply_to_tweet_id': '1909961123052347702'}, 'text': '🎨 The user claimed 1 NFT!\n• Token ID: 4,331\n• Sent to address: 0xab64Be5870b82474816B999C96666751AB43a7d0\n• Claim required allowlist proof for verification.'}
2025-04-09 08:26:31,810 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [POST]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:26:31,811 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:26:31,811 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '139798261960448857021744205191'), ('oauth_timestamp', '1744205191'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:26:31,811 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=139798261960448857021744205191&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205191&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:26:31,811 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/tweets
2025-04-09 08:26:31,811 - DEBUG - [__init__.py:181] - Signing: signature base string: POST&https%3A%2F%2Fapi.twitter.com%2F2%2Ftweets&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D139798261960448857021744205191%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205191%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:26:31,812 - DEBUG - [__init__.py:188] - Signature: l0QnVod+mNEsAeBt+m8yPFZkymU=
2025-04-09 08:26:31,812 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/tweets
2025-04-09 08:26:31,812 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420503422185284; guest_id_ads=v1%3A174420503422185284; personalization_id="v1_uH3xCHKjrEN3CiNmPqOD9Q=="; guest_id=v1%3A174420503422185284; __cf_bm=tAA4UbXKYV1njVexNyBSXiju6Wg9EP0wz8zCWDi3ook-1744205034-1.0.1.1-spF2xe.NLGDVUdyvEQdYKd9AcWj5jBuqtSIGVxGoVQuTzlQHsEs7_SrJ2ZR2VszGldqKOkSzO7gWmFNQOYTO0jJQMMy1fmF1ND3uNs2h_PE', 'Content-Length': '255', 'Content-Type': 'application/json', 'Authorization': 'OAuth oauth_nonce="139798261960448857021744205191", oauth_timestamp="1744205191", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="l0QnVod%2BmNEsAeBt%2Bm8yPFZkymU%3D"'}
2025-04-09 08:26:31,812 - DEBUG - [oauth1_auth.py:111] - Updated body: b'{"reply": {"in_reply_to_tweet_id": "1909961123052347702"}, "text": "\\ud83c\\udfa8 The user claimed 1 NFT!\\n\\u2022 Token ID: 4,331\\n\\u2022 Sent to address: 0xab64Be5870b82474816B999C96666751AB43a7d0\\n\\u2022 Claim required allowlist proof for verification."}'
2025-04-09 08:26:32,046 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "POST /2/tweets HTTP/1.1" 201 243
2025-04-09 08:26:32,047 - DEBUG - [client.py:88] - Received API response: 201 Created
Headers: {'Date': 'Wed, 09 Apr 2025 13:26:32 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '243', 'Connection': 'keep-alive', 'perf': '7402827104', 'location': 'https://api.x.com/2/tweets/1909961124105113860', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': 'b45a5bdffc708d97', 'x-xss-protection': '0', 'x-rate-limit-limit': '1080000', 'x-rate-limit-reset': '1744205733', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1079997', 'x-app-limit-24hour-limit': '1667', 'x-app-limit-24hour-reset': '1744289738', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '100', 'x-user-limit-24hour-reset': '1744289738', 'x-app-limit-24hour-remaining': '1662', 'x-user-limit-24hour-remaining': '95', 'x-response-time': '143', 'x-connection-hash': '41181db35958207b6ce19c54600d449536b9dc41bf63bfc00ed38e2a47e88f85', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da56318fdd8252-GYE'}
Content: b'{"data":{"id":"1909961124105113860","edit_history_tweet_ids":["1909961124105113860"],"text":"\\uD83C\\uDFA8 The user claimed 1 NFT!\\n\xe2\x80\xa2 Token ID: 4,331\\n\xe2\x80\xa2 Sent to address: 0xab64Be5870b82474816B999C96666751AB43a7d0\\n\xe2\x80\xa2 Claim required allowlist proof for verification."}}'
2025-04-09 08:26:32,047 - INFO - [twiiter_bot.py:105] - Created thread tweet 2 with ID 1909961124105113860: 🎨 The user claimed 1 NFT!
• To...
2025-04-09 08:26:32,047 - DEBUG - [twiiter_bot.py:110] - Creating tweet 3 as reply to 1909961124105113860
2025-04-09 08:26:32,047 - DEBUG - [client.py:77] - Making API request: POST https://api.twitter.com/2/tweets
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: {'reply': {'in_reply_to_tweet_id': '1909961124105113860'}, 'text': '🚨 Notably, there was no payment required for claiming this NFT!\n• A Transfer event confirmed the mint from the zero address to the receiver.\nCheck out the full transaction here: https://basescan.org/tx/0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad'}
2025-04-09 08:26:32,048 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [POST]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:26:32,049 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:26:32,049 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '181666712968003419251744205192'), ('oauth_timestamp', '1744205192'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:26:32,049 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=181666712968003419251744205192&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205192&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:26:32,049 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/tweets
2025-04-09 08:26:32,049 - DEBUG - [__init__.py:181] - Signing: signature base string: POST&https%3A%2F%2Fapi.twitter.com%2F2%2Ftweets&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D181666712968003419251744205192%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205192%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:26:32,049 - DEBUG - [__init__.py:188] - Signature: R1d1TmTTWRrDCSg8prKtYgjn99g=
2025-04-09 08:26:32,050 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/tweets
2025-04-09 08:26:32,050 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420503422185284; guest_id_ads=v1%3A174420503422185284; personalization_id="v1_uH3xCHKjrEN3CiNmPqOD9Q=="; guest_id=v1%3A174420503422185284; __cf_bm=tAA4UbXKYV1njVexNyBSXiju6Wg9EP0wz8zCWDi3ook-1744205034-1.0.1.1-spF2xe.NLGDVUdyvEQdYKd9AcWj5jBuqtSIGVxGoVQuTzlQHsEs7_SrJ2ZR2VszGldqKOkSzO7gWmFNQOYTO0jJQMMy1fmF1ND3uNs2h_PE', 'Content-Length': '356', 'Content-Type': 'application/json', 'Authorization': 'OAuth oauth_nonce="181666712968003419251744205192", oauth_timestamp="1744205192", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="R1d1TmTTWRrDCSg8prKtYgjn99g%3D"'}
2025-04-09 08:26:32,050 - DEBUG - [oauth1_auth.py:111] - Updated body: b'{"reply": {"in_reply_to_tweet_id": "1909961124105113860"}, "text": "\\ud83d\\udea8 Notably, there was no payment required for claiming this NFT!\\n\\u2022 A Transfer event confirmed the mint from the zero address to the receiver.\\nCheck out the full transaction here: https://basescan.org/tx/0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad"}'
2025-04-09 08:26:32,304 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "POST /2/tweets HTTP/1.1" 201 267
2025-04-09 08:26:32,307 - DEBUG - [client.py:88] - Received API response: 201 Created
Headers: {'Date': 'Wed, 09 Apr 2025 13:26:32 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '267', 'Connection': 'keep-alive', 'perf': '7402827104', 'location': 'https://api.x.com/2/tweets/1909961125128438150', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '3bf439df0611f93d', 'x-xss-protection': '0', 'x-rate-limit-limit': '1080000', 'x-rate-limit-reset': '1744205733', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1079996', 'x-app-limit-24hour-limit': '1667', 'x-app-limit-24hour-reset': '1744289738', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '100', 'x-user-limit-24hour-reset': '1744289738', 'x-app-limit-24hour-remaining': '1661', 'x-user-limit-24hour-remaining': '94', 'x-response-time': '157', 'x-connection-hash': '553425677c524dc7ea050c70d796dd79243f16736e086edeb9c31ea0531def4d', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da563309e68252-GYE'}
Content: b'{"data":{"text":"\\uD83D\\uDEA8 Notably, there was no payment required for claiming this NFT!\\n\xe2\x80\xa2 A Transfer event confirmed the mint from the zero address to the receiver.\\nCheck out the full transaction here: https://t.co/PuS78nHBEh","edit_history_tweet_ids":["1909961125128438150"],"id":"1909961125128438150"}}'
2025-04-09 08:26:32,308 - INFO - [twiiter_bot.py:115] - Created thread tweet 3 with ID 1909961125128438150: 🚨 Notably, there was no paymen...
2025-04-09 08:26:32,309 - INFO - [twiiter_bot.py:331] - Created thread in response to mention 1909960657732063423
2025-04-09 08:26:32,309 - DEBUG - [twiiter_bot.py:152] - Saving last mention ID: 1909960657732063423
2025-04-09 08:26:32,310 - DEBUG - [twiiter_bot.py:157] - Successfully saved last mention ID
2025-04-09 08:26:32,310 - DEBUG - [twiiter_bot.py:344] - Sleeping for 2 seconds to avoid rate limiting
2025-04-09 08:26:34,312 - INFO - [twiiter_bot.py:424] - Waiting for next check... (90 seconds)
2025-04-09 08:27:03,925 - INFO - [twiiter_bot.py:428] - Bot stopped by user
2025-04-09 08:27:03,973 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:27:03,973 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:27:03,974 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:27:03,974 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:35] - API_KEY present: True
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:36] - API_SECRET present: True
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:37] - ACCESS_TOKEN present: True
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:38] - ACCESS_TOKEN_SECRET present: True
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:39] - BEARER_TOKEN present: True
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:49] - Authenticating with Twitter API...
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:57] - Twitter API authentication successful
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:440] - === Twitter Bot Starting ===
2025-04-09 08:33:41,729 - INFO - [twiiter_bot.py:389] - Starting Twitter bot - monitoring for mentions
2025-04-09 08:33:41,729 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:33:41,730 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:33:41,730 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:33:41,730 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '38865455879893912751744205621'), ('oauth_timestamp', '1744205621'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:33:41,730 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=38865455879893912751744205621&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205621&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:33:41,730 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:33:41,730 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D38865455879893912751744205621%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205621%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:33:41,730 - DEBUG - [__init__.py:188] - Signature: uuPvuhCRxOgj1iJ7PawITLufTbQ=
2025-04-09 08:33:41,730 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:33:41,730 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'OAuth oauth_nonce="38865455879893912751744205621", oauth_timestamp="1744205621", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="uuPvuhCRxOgj1iJ7PawITLufTbQ%3D"'}
2025-04-09 08:33:41,730 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:33:41,734 - DEBUG - [connectionpool.py:1049] - Starting new HTTPS connection (1): api.twitter.com:443
2025-04-09 08:33:42,017 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:33:42,018 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:33:42 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'Set-Cookie': 'guest_id_marketing=v1%3A174420562203063773; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:33:42 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, guest_id_ads=v1%3A174420562203063773; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:33:42 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, personalization_id="v1_bpJXzUTLgs2WP0cLmhuURQ=="; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:33:42 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, guest_id=v1%3A174420562203063773; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:33:42 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, __cf_bm=aJbNeidnYqbubxbSwRalPrIXhL0wDHTTBIamggURBTc-1744205622-1.0.1.1-R7AQ7KzwzF_gwJ76C77EtcwhzbMscv5SXwGDsFnVzKbouKJRuQhbVKR8ALHIaUI4cWGyP6yapEI0OHaarKuaxjHmTf6Z7DeeI5lJVP9Gj6s; path=/; expires=Wed, 09-Apr-25 14:03:42 GMT; domain=.twitter.com; HttpOnly; Secure; SameSite=None', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': 'c2c6534b45a247f7', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199998', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '233', 'x-response-time': '40', 'x-connection-hash': '91cc1b6f812d6c714e809727b8d6f7d93b900cfc099bafcb135cbb6dc12d880b', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da60b19953194e-MIA'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:33:42,018 - INFO - [twiiter_bot.py:394] - Authenticated as @AskNebula (ID: 1896726162791112704)
2025-04-09 08:33:42,018 - INFO - [twiiter_bot.py:404] - Bot will respond to @AskNebula mentions
2025-04-09 08:33:42,018 - DEBUG - [twiiter_bot.py:361] - Initializing bot
2025-04-09 08:33:42,018 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909960657732063423
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909960657732063423
2025-04-09 08:33:42,019 - INFO - [twiiter_bot.py:382] - Bot already initialized with last mention ID: 1909960657732063423
2025-04-09 08:33:42,019 - INFO - [twiiter_bot.py:418] - Check #1: Checking for new mentions...
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:267] - Processing mentions
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:202] - Getting recent mentions
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909960657732063423
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:204] - Last mention ID: 1909960657732063423
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:214] - Using since_id: 1909960657732063423
2025-04-09 08:33:42,019 - DEBUG - [twiiter_bot.py:218] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909960657732063423}
2025-04-09 08:33:42,019 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:33:42,020 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:33:42,020 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:33:42,020 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '105237834780326866991744205622'), ('oauth_timestamp', '1744205622'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:33:42,020 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=105237834780326866991744205622&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205622&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:33:42,020 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:33:42,020 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D105237834780326866991744205622%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205622%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:33:42,020 - DEBUG - [__init__.py:188] - Signature: AvZdlDxIFZ/jHs6U8R2WNcxbp5M=
2025-04-09 08:33:42,020 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:33:42,020 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420562203063773; guest_id_ads=v1%3A174420562203063773; personalization_id="v1_bpJXzUTLgs2WP0cLmhuURQ=="; guest_id=v1%3A174420562203063773; __cf_bm=aJbNeidnYqbubxbSwRalPrIXhL0wDHTTBIamggURBTc-1744205622-1.0.1.1-R7AQ7KzwzF_gwJ76C77EtcwhzbMscv5SXwGDsFnVzKbouKJRuQhbVKR8ALHIaUI4cWGyP6yapEI0OHaarKuaxjHmTf6Z7DeeI5lJVP9Gj6s', 'Authorization': 'OAuth oauth_nonce="105237834780326866991744205622", oauth_timestamp="1744205622", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="AvZdlDxIFZ%2FjHs6U8R2WNcxbp5M%3D"'}
2025-04-09 08:33:42,020 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:33:42,144 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:33:42,145 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:33:42 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': 'c90041a95a93440b', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199997', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '232', 'x-response-time': '35', 'x-connection-hash': '5ec9b03dc04bfad37e6340054d0f42dec0be42202887251e6a29993968afdb38', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da60b26ba4194e-MIA'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:33:42,145 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909960657732063423}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:33:42,269 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909960657732063423 HTTP/1.1" 200 53
2025-04-09 08:33:42,271 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:33:42 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '53', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '526a4d79a2c7eef6', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '13', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '29', 'x-connection-hash': 'a987b670dc2c17e4b95bde336221ba6c1a4e57f7ba1dfd9f8197d7c27d7c8575', 'CF-Cache-Status': 'DYNAMIC', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da60b33dc2194e-MIA'}
Content: b'{"meta":{"result_count":0}}'
2025-04-09 08:33:42,272 - DEBUG - [twiiter_bot.py:223] - No new mentions found
2025-04-09 08:33:42,272 - INFO - [twiiter_bot.py:271] - No new mentions found
2025-04-09 08:33:42,272 - INFO - [twiiter_bot.py:424] - Waiting for next check... (90 seconds)
2025-04-09 08:35:12,278 - INFO - [twiiter_bot.py:418] - Check #2: Checking for new mentions...
2025-04-09 08:35:12,280 - DEBUG - [twiiter_bot.py:267] - Processing mentions
2025-04-09 08:35:12,281 - DEBUG - [twiiter_bot.py:202] - Getting recent mentions
2025-04-09 08:35:12,281 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:35:12,281 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909960657732063423
2025-04-09 08:35:12,282 - DEBUG - [twiiter_bot.py:204] - Last mention ID: 1909960657732063423
2025-04-09 08:35:12,282 - DEBUG - [twiiter_bot.py:214] - Using since_id: 1909960657732063423
2025-04-09 08:35:12,282 - DEBUG - [twiiter_bot.py:218] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909960657732063423}
2025-04-09 08:35:12,282 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:35:12,283 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:35:12,284 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:35:12,284 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '175011387084887750091744205712'), ('oauth_timestamp', '1744205712'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:35:12,284 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=175011387084887750091744205712&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205712&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:35:12,285 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:35:12,285 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D175011387084887750091744205712%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205712%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:35:12,288 - DEBUG - [__init__.py:188] - Signature: aHbtyo3zkofDPmIs4FD6KB7BoDs=
2025-04-09 08:35:12,288 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:35:12,288 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420562203063773; guest_id_ads=v1%3A174420562203063773; personalization_id="v1_bpJXzUTLgs2WP0cLmhuURQ=="; guest_id=v1%3A174420562203063773; __cf_bm=aJbNeidnYqbubxbSwRalPrIXhL0wDHTTBIamggURBTc-1744205622-1.0.1.1-R7AQ7KzwzF_gwJ76C77EtcwhzbMscv5SXwGDsFnVzKbouKJRuQhbVKR8ALHIaUI4cWGyP6yapEI0OHaarKuaxjHmTf6Z7DeeI5lJVP9Gj6s', 'Authorization': 'OAuth oauth_nonce="175011387084887750091744205712", oauth_timestamp="1744205712", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="aHbtyo3zkofDPmIs4FD6KB7BoDs%3D"'}
2025-04-09 08:35:12,289 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:35:12,475 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:35:12,476 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:35:12 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '5640b96ab9b6621e', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199996', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '231', 'x-response-time': '94', 'x-connection-hash': '332bd32df4a522cf682977222cbaff15fd0f41b076f8cc7fea6119ca60df6b78', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da62e69892194e-MIA'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:35:12,477 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909960657732063423}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:35:12,632 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909960657732063423 HTTP/1.1" 200 256
2025-04-09 08:35:12,633 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:35:12 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '256', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': 'f64a55c88ba7d260', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '12', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '60', 'x-connection-hash': '2f5538819669a0c27fe0236f0e07efb111b2cc290afcf6f8ecc49cc837843d3a', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da62e7cb95194e-MIA'}
Content: b'{"data":[{"text":"Hey @AskNebula, what is the address associated with vitalik.eth?","edit_history_tweet_ids":["1909963085554634781"],"id":"1909963085554634781","author_id":"1437794194580459525"}],"includes":{"users":[{"id":"1437794194580459525","name":"Vasiliy Kirochka","username":"cromewar"}]},"meta":{"result_count":1,"newest_id":"1909963085554634781","oldest_id":"1909963085554634781"}}'
2025-04-09 08:35:12,633 - DEBUG - [twiiter_bot.py:228] - Found mention ID: 1909963085554634781, text: Hey @AskNebula, what is the address associated wit...
2025-04-09 08:35:12,633 - DEBUG - [twiiter_bot.py:234] - Returning 1 mentions sorted by ID
2025-04-09 08:35:12,633 - INFO - [twiiter_bot.py:274] - Found 1 new mentions to process
2025-04-09 08:35:12,633 - DEBUG - [twiiter_bot.py:278] - Processing mention ID 1909963085554634781
2025-04-09 08:35:12,633 - DEBUG - [twiiter_bot.py:282] - Mention text: Hey @AskNebula, what is the address associated with vitalik.eth?
2025-04-09 08:35:12,634 - DEBUG - [twiiter_bot.py:261] - Checking if direct mention: 'Hey @AskNebula, what is the address associated wit...' -> True
2025-04-09 08:35:12,634 - DEBUG - [twiiter_bot.py:299] - Cleaned text: Hey what is the address associated with vitalik.eth?
2025-04-09 08:35:12,634 - INFO - [twiiter_bot.py:301] - Processing mention 1909963085554634781: Hey what is the address associated with vitalik.eth?
2025-04-09 08:35:12,634 - DEBUG - [twiiter_bot.py:304] - Sending query to process_blockchain_query: Hey what is the address associated with vitalik.eth?
2025-04-09 08:35:12,634 - DEBUG - [twiiter_bot.py:307] - Calling process_blockchain_query
2025-04-09 08:35:12,787 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'Hey what is the address associated with vitalik.eth?', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:35:12,797 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:35:12,798 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:35:13,080 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10a5d5e10>
2025-04-09 08:35:13,081 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x10a574b90> server_hostname='api.openai.com' timeout=None
2025-04-09 08:35:13,098 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10d043cd0>
2025-04-09 08:35:13,099 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:35:13,099 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:35:13,100 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:35:13,100 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:35:13,100 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:35:14,003 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:35:14 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'634'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999696'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'9ms'), (b'x-request-id', b'req_7a365837d94b83a281df72c58e83acf6'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'__cf_bm=it_1EbFzLvpNAPHMrYYlYc4x_x0v.Q93ql6FVMf7dh4-1744205714-1.0.1.1-uLj2yYZI36X1wes1f_k80z4PKxnKYwK27dIVDL_dU7zSr_PRQM02q4K9oox0x0SVWRSkw5LXch1luGuefm0Zlt356vLQeVqk1coTrZqP5NI; path=/; expires=Wed, 09-Apr-25 14:05:14 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'X-Content-Type-Options', b'nosniff'), (b'Set-Cookie', b'_cfuvid=pg7ujTbT6zT4gSsOJNvCOPcuAgLCH7n5Bnav0iBEoWM-1744205714096-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da62eb886f8252-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:35:14,005 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:35:14,005 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers([('date', 'Wed, 09 Apr 2025 13:35:14 GMT'), ('content-type', 'text/event-stream; charset=utf-8'), ('transfer-encoding', 'chunked'), ('connection', 'keep-alive'), ('access-control-expose-headers', 'X-Request-ID'), ('openai-organization', 'cromewar'), ('openai-processing-ms', '634'), ('openai-version', '2020-10-01'), ('x-ratelimit-limit-requests', '5000'), ('x-ratelimit-limit-tokens', '2000000'), ('x-ratelimit-remaining-requests', '4999'), ('x-ratelimit-remaining-tokens', '1999696'), ('x-ratelimit-reset-requests', '12ms'), ('x-ratelimit-reset-tokens', '9ms'), ('x-request-id', 'req_7a365837d94b83a281df72c58e83acf6'), ('strict-transport-security', 'max-age=31536000; includeSubDomains; preload'), ('cf-cache-status', 'DYNAMIC'), ('set-cookie', '__cf_bm=it_1EbFzLvpNAPHMrYYlYc4x_x0v.Q93ql6FVMf7dh4-1744205714-1.0.1.1-uLj2yYZI36X1wes1f_k80z4PKxnKYwK27dIVDL_dU7zSr_PRQM02q4K9oox0x0SVWRSkw5LXch1luGuefm0Zlt356vLQeVqk1coTrZqP5NI; path=/; expires=Wed, 09-Apr-25 14:05:14 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('x-content-type-options', 'nosniff'), ('set-cookie', '_cfuvid=pg7ujTbT6zT4gSsOJNvCOPcuAgLCH7n5Bnav0iBEoWM-1744205714096-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('server', 'cloudflare'), ('cf-ray', '92da62eb886f8252-GYE'), ('alt-svc', 'h3=":443"; ma=86400')])
2025-04-09 08:35:14,007 - DEBUG - [_base_client.py:999] - request_id: req_7a365837d94b83a281df72c58e83acf6
2025-04-09 08:35:14,007 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:35:14,248 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:35:14,248 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:35:14,248 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:35:14,260 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant specialized in blockchain operations. For balance queries on specific contracts, use the get_balance_on_contract tool directly instead of the generic chat tool.\n - Always use the most specific tool available for the task.\n - If a chain is not specified, you will assume the user is asking for the balance of an ENS name or an address on the mainnet.\n - You must not make up any information, like contract addresses, chain ids, etc. You will only work with the information provided by the user.\n - By default you will avoid using the get_balance_on_contract tool and use the generic chat tool instead unless the user explicitly asks for the balance of a specific contract. If no contract address is provided, you will assume the user is requesting the balance of an ENS name so you will default to the native currency of the chain.\n - Get transaction details is only for transaction hashes, not for ENS names or addresses. if the tools in incorrectly used you need to pivot and find the transactions for the wallet address and ignore this tool call.\n - If the user asks for information about an ENS name, you will use the resolve_ens_name tool to get the address of the ENS name and then try to get the balances of the address for mainnet unless another chain is specified, and also try to get any other information you can find about the address.\n - If the request is about finding suspicious activity of a wallet address, you will get the last 10 transactions of the address and analyze them looking for patterns that are suspicious, like wash trading, or other patterns.\n - When a chain is provided but not it's chain id, you need to automatically resolve the chain id from the chain name.\n - For off-topic questions, personal messages, greetings, or any requests unrelated to blockchain, use the respond_to_offtopic tool, but if the user asks about blockchain or crypto, you must always first try to get the information from the blockchain and then pivot to the respond_to_offtopic tool if you can't find the information in the blockchain.\n ", 'role': 'system'}, {'content': 'What is the address associated with vitalik.eth?', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'chat', 'description': 'Send a message to Nebula AI and get a response. This can be used for blockchain queries, contract interactions, and access to thirdweb tools.', 'parameters': {'properties': {'message': {'description': 'The natural language message to process. Can be a question about blockchain data, a request to execute a transaction, or any web3-related query.', 'type': 'string'}, 'session_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional session ID to maintain conversation context. If provided, this message will be part of an ongoing conversation; if omitted, a new session is created.'}, 'context': {'anyOf': [{'additionalProperties': True, 'type': 'object'}, {'type': 'null'}], 'default': None, 'description': "Contextual information for processing the request, including: chainIds (array of chain identifiers) and walletAddress (user's wallet for transaction signing). Example: {'chainIds': ['1', '137'], 'walletAddress': '0x123...'}"}}, 'required': ['message'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_session', 'description': 'Fetch complete information about a specific Nebula AI session, including conversation history, context settings, and metadata. Use this to examine past interactions or resume an existing conversation thread.', 'parameters': {'properties': {'session_id': {'description': 'Unique identifier for the target session. This UUID references a specific conversation history in the Nebula system.', 'type': 'string'}}, 'required': ['session_id'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'list_sessions', 'description': 'Retrieve all available Nebula AI sessions for the authenticated account. Returns an array of session metadata including IDs, titles, and creation timestamps, allowing you to find and reference existing conversations.', 'parameters': {'properties': {}, 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_balance_on_contract', 'description': 'Get the balance of an ENS name on a contract, use this only when the contract address is explicitly provided.\n\n If no chain_id is provided it must utomatically try to resolve the chain_id from the chain name\n For Sepolia the chain_id is 11155111\n For Mainnet the chain_id is 1\n For Optimism the chain_id is 10\n For Base the chain_id is 8453\n For Arbitrum the chain_id is 42161\n For Polygon the chain_id is 137\n And so on for other chains\n\n Args:\n ens_name: The ENS name to get the balance of\n contract_address: The address of the contract to get the balance of\n chain: The chain to get the balance of\n chain_id: The chain id to get the balance of\n\n Returns:\n The balance of the ENS name on the contract', 'parameters': {'properties': {'ens_name': {'type': 'string'}, 'contract_address': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['ens_name', 'contract_address'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'resolve_ens_name', 'description': 'Resolve an ENS name to an address\n\n Args:\n ens_name: The ENS name to resolve\n\n Returns:\n The address of the ENS name', 'parameters': {'properties': {'ens_name': {'type': 'string'}}, 'required': ['ens_name'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_transaction_details', 'description': 'Get the details of a transaction from any EVM chain, if the chain_id is not provided it must utomatically try to resolve the chain_id from the chain name.\n\n\n\n Args:\n transaction_hash: The hash of the transaction to get the details of\n chain: The chain to get the transaction details of\n chain_id: The chain id to get the transaction details of\n\n Returns:\n The details of the transaction', 'parameters': {'properties': {'transaction_hash': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['transaction_hash'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'respond_to_offtopic', 'description': "Handle off-topic questions, personal messages, greetings, jokes, or any requests unrelated to blockchain data.\n Use this tool when the user's query doesn't require blockchain data or other specific tools.\n\n Args:\n query: The off-topic question or message from the user\n\n Returns:\n A friendly, appropriate response to the off-topic query", 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}]}}
2025-04-09 08:35:14,262 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:35:14,262 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:35:14,272 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10d0365d0>
2025-04-09 08:35:14,272 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x10a574f80> server_hostname='api.openai.com' timeout=None
2025-04-09 08:35:14,286 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10d08a0d0>
2025-04-09 08:35:14,286 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:35:14,286 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:35:14,286 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:35:14,286 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:35:14,287 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:35:15,029 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:35:15 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'388'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999414'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'17ms'), (b'x-request-id', b'req_7c9a9c0be912e1e31cd007d0168276f7'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'__cf_bm=ZT4scsyCowfQDht0.GKKcNIwDqLaiUSnxjcmBvtMiXg-1744205715-1.0.1.1-t0tLvly4Y1TRu0wtgCUOq5gfeKtlp0p_Zvus3c4t8K3R9kwetFhhpytslHhL4lt6KQfVwXOU1WUohwU79QoprT25Bt7gOdampTWMQQwuH2A; path=/; expires=Wed, 09-Apr-25 14:05:15 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'X-Content-Type-Options', b'nosniff'), (b'Set-Cookie', b'_cfuvid=QqpYZjBGe0LYVD0YBHKqcWqRI_Wtwna0P2QsccKlwII-1744205715123-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da62f2eb8b83fe-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:35:15,032 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:35:15,033 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers([('date', 'Wed, 09 Apr 2025 13:35:15 GMT'), ('content-type', 'text/event-stream; charset=utf-8'), ('transfer-encoding', 'chunked'), ('connection', 'keep-alive'), ('access-control-expose-headers', 'X-Request-ID'), ('openai-organization', 'cromewar'), ('openai-processing-ms', '388'), ('openai-version', '2020-10-01'), ('x-ratelimit-limit-requests', '5000'), ('x-ratelimit-limit-tokens', '2000000'), ('x-ratelimit-remaining-requests', '4999'), ('x-ratelimit-remaining-tokens', '1999414'), ('x-ratelimit-reset-requests', '12ms'), ('x-ratelimit-reset-tokens', '17ms'), ('x-request-id', 'req_7c9a9c0be912e1e31cd007d0168276f7'), ('strict-transport-security', 'max-age=31536000; includeSubDomains; preload'), ('cf-cache-status', 'DYNAMIC'), ('set-cookie', '__cf_bm=ZT4scsyCowfQDht0.GKKcNIwDqLaiUSnxjcmBvtMiXg-1744205715-1.0.1.1-t0tLvly4Y1TRu0wtgCUOq5gfeKtlp0p_Zvus3c4t8K3R9kwetFhhpytslHhL4lt6KQfVwXOU1WUohwU79QoprT25Bt7gOdampTWMQQwuH2A; path=/; expires=Wed, 09-Apr-25 14:05:15 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('x-content-type-options', 'nosniff'), ('set-cookie', '_cfuvid=QqpYZjBGe0LYVD0YBHKqcWqRI_Wtwna0P2QsccKlwII-1744205715123-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('server', 'cloudflare'), ('cf-ray', '92da62f2eb8b83fe-GYE'), ('alt-svc', 'h3=":443"; ma=86400')])
2025-04-09 08:35:15,033 - DEBUG - [_base_client.py:999] - request_id: req_7c9a9c0be912e1e31cd007d0168276f7
2025-04-09 08:35:15,034 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:35:15,136 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:35:15,137 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:35:15,137 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:35:15,139 - DEBUG - [_trace.py:47] - connect_tcp.started host='nebula-api.thirdweb.com' port=443 local_address=None timeout=120.0 socket_options=None
2025-04-09 08:35:15,164 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x108983010>
2025-04-09 08:35:15,165 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x10a574dd0> server_hostname='nebula-api.thirdweb.com' timeout=120.0
2025-04-09 08:35:15,181 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10a5f0750>
2025-04-09 08:35:15,181 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:35:15,181 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:35:15,182 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:35:15,182 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:35:15,182 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:35:25,098 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:35:25 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'_cfuvid=LmJKCtpKZD1DtzntN4B_RJWSQzhUlea5P6XRzgmpgsI-1744205725192-0.0.1.1-604800000; path=/; domain=.thirdweb.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da62f88d663262-GYE'), (b'Content-Encoding', b'gzip')])
2025-04-09 08:35:25,099 - INFO - [_client.py:1025] - HTTP Request: POST https://nebula-api.thirdweb.com/chat "HTTP/1.1 200 OK"
2025-04-09 08:35:25,099 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:35:25,100 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:35:25,100 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:35:25,100 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:35:25,112 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant specialized in blockchain operations. For balance queries on specific contracts, use the get_balance_on_contract tool directly instead of the generic chat tool.\n - Always use the most specific tool available for the task.\n - If a chain is not specified, you will assume the user is asking for the balance of an ENS name or an address on the mainnet.\n - You must not make up any information, like contract addresses, chain ids, etc. You will only work with the information provided by the user.\n - By default you will avoid using the get_balance_on_contract tool and use the generic chat tool instead unless the user explicitly asks for the balance of a specific contract. If no contract address is provided, you will assume the user is requesting the balance of an ENS name so you will default to the native currency of the chain.\n - Get transaction details is only for transaction hashes, not for ENS names or addresses. if the tools in incorrectly used you need to pivot and find the transactions for the wallet address and ignore this tool call.\n - If the user asks for information about an ENS name, you will use the resolve_ens_name tool to get the address of the ENS name and then try to get the balances of the address for mainnet unless another chain is specified, and also try to get any other information you can find about the address.\n - If the request is about finding suspicious activity of a wallet address, you will get the last 10 transactions of the address and analyze them looking for patterns that are suspicious, like wash trading, or other patterns.\n - When a chain is provided but not it's chain id, you need to automatically resolve the chain id from the chain name.\n - For off-topic questions, personal messages, greetings, or any requests unrelated to blockchain, use the respond_to_offtopic tool, but if the user asks about blockchain or crypto, you must always first try to get the information from the blockchain and then pivot to the respond_to_offtopic tool if you can't find the information in the blockchain.\n ", 'role': 'system'}, {'content': 'What is the address associated with vitalik.eth?', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_6glErfJu8fvKFwf7fqC4t5gy', 'function': {'name': 'resolve_ens_name', 'arguments': '{"ens_name": "vitalik.eth"}'}}]}, {'content': '{"message": "The address of vitalik.eth on Ethereum (chain ID: 1) is 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045.\\n\\nThis is Vitalik Buterin\'s primary Ethereum address that\'s linked to his ENS domain. ENS (Ethereum Name Service) domains like vitalik.eth make it much easier to share and remember Ethereum addresses compared to the long hexadecimal format.", "actions": [], "session_id": "e92da498-29f6-4f09-bc5d-3f7b0b2c4525", "request_id": "51fda84c-ad6e-464f-bd9d-3c05da44cf1a"}', 'role': 'tool', 'tool_call_id': 'call_6glErfJu8fvKFwf7fqC4t5gy'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'chat', 'description': 'Send a message to Nebula AI and get a response. This can be used for blockchain queries, contract interactions, and access to thirdweb tools.', 'parameters': {'properties': {'message': {'description': 'The natural language message to process. Can be a question about blockchain data, a request to execute a transaction, or any web3-related query.', 'type': 'string'}, 'session_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional session ID to maintain conversation context. If provided, this message will be part of an ongoing conversation; if omitted, a new session is created.'}, 'context': {'anyOf': [{'additionalProperties': True, 'type': 'object'}, {'type': 'null'}], 'default': None, 'description': "Contextual information for processing the request, including: chainIds (array of chain identifiers) and walletAddress (user's wallet for transaction signing). Example: {'chainIds': ['1', '137'], 'walletAddress': '0x123...'}"}}, 'required': ['message'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_session', 'description': 'Fetch complete information about a specific Nebula AI session, including conversation history, context settings, and metadata. Use this to examine past interactions or resume an existing conversation thread.', 'parameters': {'properties': {'session_id': {'description': 'Unique identifier for the target session. This UUID references a specific conversation history in the Nebula system.', 'type': 'string'}}, 'required': ['session_id'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'list_sessions', 'description': 'Retrieve all available Nebula AI sessions for the authenticated account. Returns an array of session metadata including IDs, titles, and creation timestamps, allowing you to find and reference existing conversations.', 'parameters': {'properties': {}, 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_balance_on_contract', 'description': 'Get the balance of an ENS name on a contract, use this only when the contract address is explicitly provided.\n\n If no chain_id is provided it must utomatically try to resolve the chain_id from the chain name\n For Sepolia the chain_id is 11155111\n For Mainnet the chain_id is 1\n For Optimism the chain_id is 10\n For Base the chain_id is 8453\n For Arbitrum the chain_id is 42161\n For Polygon the chain_id is 137\n And so on for other chains\n\n Args:\n ens_name: The ENS name to get the balance of\n contract_address: The address of the contract to get the balance of\n chain: The chain to get the balance of\n chain_id: The chain id to get the balance of\n\n Returns:\n The balance of the ENS name on the contract', 'parameters': {'properties': {'ens_name': {'type': 'string'}, 'contract_address': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['ens_name', 'contract_address'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'resolve_ens_name', 'description': 'Resolve an ENS name to an address\n\n Args:\n ens_name: The ENS name to resolve\n\n Returns:\n The address of the ENS name', 'parameters': {'properties': {'ens_name': {'type': 'string'}}, 'required': ['ens_name'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_transaction_details', 'description': 'Get the details of a transaction from any EVM chain, if the chain_id is not provided it must utomatically try to resolve the chain_id from the chain name.\n\n\n\n Args:\n transaction_hash: The hash of the transaction to get the details of\n chain: The chain to get the transaction details of\n chain_id: The chain id to get the transaction details of\n\n Returns:\n The details of the transaction', 'parameters': {'properties': {'transaction_hash': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['transaction_hash'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'respond_to_offtopic', 'description': "Handle off-topic questions, personal messages, greetings, jokes, or any requests unrelated to blockchain data.\n Use this tool when the user's query doesn't require blockchain data or other specific tools.\n\n Args:\n query: The off-topic question or message from the user\n\n Returns:\n A friendly, appropriate response to the off-topic query", 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}]}}
2025-04-09 08:35:25,114 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:35:25,114 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:35:25,114 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:35:25,114 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:35:25,124 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10d0a6bd0>
2025-04-09 08:35:25,124 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x10a574f80> server_hostname='api.openai.com' timeout=None
2025-04-09 08:35:25,140 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10a5e7b10>
2025-04-09 08:35:25,140 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:35:25,140 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:35:25,140 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:35:25,141 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:35:25,141 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:35:26,027 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:35:26 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'514'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999293'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'21ms'), (b'x-request-id', b'req_4ad4fcd145bf9f476cea2b2aa7190e2a'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da6336c9048253-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:35:26,028 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:35:26,028 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:35:26 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '514', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999293', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '21ms', 'x-request-id': 'req_4ad4fcd145bf9f476cea2b2aa7190e2a', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da6336c9048253-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:35:26,028 - DEBUG - [_base_client.py:999] - request_id: req_4ad4fcd145bf9f476cea2b2aa7190e2a
2025-04-09 08:35:26,029 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:35:29,174 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:35:29,175 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:35:29,175 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:35:29,190 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'Hey what is the address associated with vitalik.eth?', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_rwJJFu1qsoGMUb0HaaCiicrU', 'function': {'name': 'query_nebula', 'arguments': '{"query": "What is the address associated with vitalik.eth?"}'}}]}, {'content': "The address associated with **vitalik.eth** is **0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045**. This is Vitalik Buterin's primary Ethereum address linked to his ENS domain.", 'role': 'tool', 'tool_call_id': 'call_rwJJFu1qsoGMUb0HaaCiicrU'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:35:29,191 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:35:29,192 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:35:29,192 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:35:29,192 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:35:29,201 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10d0a7150>
2025-04-09 08:35:29,202 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x10a574b90> server_hostname='api.openai.com' timeout=None
2025-04-09 08:35:29,215 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10d0a6250>
2025-04-09 08:35:29,215 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:35:29,215 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:35:29,215 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:35:29,215 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:35:29,215 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:35:29,940 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:35:30 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'573'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999651'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'10ms'), (b'x-request-id', b'req_ad1ad361c88b1f3ab2d4b820b5ebd707'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da63503f128258-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:35:29,941 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:35:29,941 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:35:30 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '573', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999651', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '10ms', 'x-request-id': 'req_ad1ad361c88b1f3ab2d4b820b5ebd707', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da63503f128258-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:35:29,942 - DEBUG - [_base_client.py:999] - request_id: req_ad1ad361c88b1f3ab2d4b820b5ebd707
2025-04-09 08:35:29,942 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:35:32,267 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:35:32,268 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:35:32,268 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:35:32,273 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': '\n Write a single Twitter post about the following blockchain information:\n \n The address associated with vitalik.eth is 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. This is his primary Ethereum address!\n \n Requirements:\n - NO hashtags or any trending topics with # - they are absolutely not allowed\n - Keep it under 280 characters\n - NO markdown formatting (no backticks, no asterisks for bold)\n - For technical data like addresses, use clear labels: "Address: 0x123..."\n - Format numbers with commas for better readability (e.g., "1,234,567" not "1234567")\n - Use proper units (e.g., "ETH" for Ether values)\n - Be concise and informative\n - Do not include any #hashtags at all - they are forbidden\n \n Format:\n Return just the tweet content without any prefixes like "Tweet:" or "Post:"\n ', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': False}}
2025-04-09 08:35:32,275 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:35:32,275 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:35:32,276 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:35:32,276 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:35:32,276 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:35:32,277 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:35:33,802 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:35:33 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'1379'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999753'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'7ms'), (b'x-request-id', b'req_361e4ad514b7cacdf104a6f86c613ee2'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da636358118258-GYE'), (b'Content-Encoding', b'gzip'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:35:33,804 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:35:33,804 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:35:33,805 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:35:33,805 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:35:33,805 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:35:33,805 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:35:33 GMT', 'content-type': 'application/json', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '1379', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999753', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '7ms', 'x-request-id': 'req_361e4ad514b7cacdf104a6f86c613ee2', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da636358118258-GYE', 'content-encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:35:33,806 - DEBUG - [_base_client.py:999] - request_id: req_361e4ad514b7cacdf104a6f86c613ee2
2025-04-09 08:35:33,824 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'Hey what is the address associated with vitalik.eth?', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_rwJJFu1qsoGMUb0HaaCiicrU', 'function': {'name': 'query_nebula', 'arguments': '{"query": "What is the address associated with vitalik.eth?"}'}}]}, {'content': "The address associated with **vitalik.eth** is **0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045**. This is Vitalik Buterin's primary Ethereum address linked to his ENS domain.", 'role': 'tool', 'tool_call_id': 'call_rwJJFu1qsoGMUb0HaaCiicrU'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_mnXgxjD9atnmyoSOzlF8rtxa', 'function': {'name': 'create_twitter_post', 'arguments': '{"blockchain_data": "The address associated with vitalik.eth is 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. This is his primary Ethereum address!"}'}}]}, {'content': 'The Ethereum address for vitalik.eth is 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. This is his primary address on the Ethereum network.', 'role': 'tool', 'tool_call_id': 'call_mnXgxjD9atnmyoSOzlF8rtxa'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:35:33,825 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:35:33,825 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:35:33,826 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:35:33,826 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:35:33,826 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:35:33,826 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:35:34,449 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:35:34 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'467'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999614'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'11ms'), (b'x-request-id', b'req_95c9138d5f9d95ab8317480e8f9c1d9b'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da636d0c808258-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:35:34,450 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:35:34,450 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:35:34 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '467', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999614', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '11ms', 'x-request-id': 'req_95c9138d5f9d95ab8317480e8f9c1d9b', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da636d0c808258-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:35:34,450 - DEBUG - [_base_client.py:999] - request_id: req_95c9138d5f9d95ab8317480e8f9c1d9b
2025-04-09 08:35:34,451 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:35:35,507 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:35:35,507 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:35:35,507 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:35:35,509 - DEBUG - [twiiter_bot.py:309] - Result type: post
2025-04-09 08:35:35,509 - DEBUG - [twiiter_bot.py:323] - Post result: The Ethereum address for vitalik.eth is 0xd8dA6BF2...
2025-04-09 08:35:35,509 - INFO - [twiiter_bot.py:334] - Creating reply to mention 1909963085554634781
2025-04-09 08:35:35,510 - DEBUG - [client.py:77] - Making API request: POST https://api.twitter.com/2/tweets
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: {'reply': {'in_reply_to_tweet_id': '1909963085554634781'}, 'text': 'The Ethereum address for vitalik.eth is 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. This is his primary address on the Ethereum network.'}
2025-04-09 08:35:35,511 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [POST]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:35:35,511 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:35:35,511 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '27234103522477932931744205735'), ('oauth_timestamp', '1744205735'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:35:35,511 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=27234103522477932931744205735&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205735&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:35:35,512 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/tweets
2025-04-09 08:35:35,512 - DEBUG - [__init__.py:181] - Signing: signature base string: POST&https%3A%2F%2Fapi.twitter.com%2F2%2Ftweets&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D27234103522477932931744205735%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205735%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:35:35,512 - DEBUG - [__init__.py:188] - Signature: n/7Q03WXOCHSzUyU1FwNbsN95oo=
2025-04-09 08:35:35,512 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/tweets
2025-04-09 08:35:35,512 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420562203063773; guest_id_ads=v1%3A174420562203063773; personalization_id="v1_bpJXzUTLgs2WP0cLmhuURQ=="; guest_id=v1%3A174420562203063773; __cf_bm=aJbNeidnYqbubxbSwRalPrIXhL0wDHTTBIamggURBTc-1744205622-1.0.1.1-R7AQ7KzwzF_gwJ76C77EtcwhzbMscv5SXwGDsFnVzKbouKJRuQhbVKR8ALHIaUI4cWGyP6yapEI0OHaarKuaxjHmTf6Z7DeeI5lJVP9Gj6s', 'Content-Length': '206', 'Content-Type': 'application/json', 'Authorization': 'OAuth oauth_nonce="27234103522477932931744205735", oauth_timestamp="1744205735", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="n%2F7Q03WXOCHSzUyU1FwNbsN95oo%3D"'}
2025-04-09 08:35:35,512 - DEBUG - [oauth1_auth.py:111] - Updated body: b'{"reply": {"in_reply_to_tweet_id": "1909963085554634781"}, "text": "The Ethereum address for vitalik.eth is 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. This is his primary address on the Ethereum network."}'
2025-04-09 08:35:35,755 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "POST /2/tweets HTTP/1.1" 201 205
2025-04-09 08:35:35,756 - DEBUG - [client.py:88] - Received API response: 201 Created
Headers: {'Date': 'Wed, 09 Apr 2025 13:35:35 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '205', 'Connection': 'keep-alive', 'perf': '7402827104', 'location': 'https://api.x.com/2/tweets/1909963404514644051', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '51f2300aa4affb49', 'x-xss-protection': '0', 'x-rate-limit-limit': '1080000', 'x-rate-limit-reset': '1744206635', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1079999', 'x-app-limit-24hour-limit': '1667', 'x-app-limit-24hour-reset': '1744289738', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '100', 'x-user-limit-24hour-reset': '1744289738', 'x-app-limit-24hour-remaining': '1660', 'x-user-limit-24hour-remaining': '93', 'x-response-time': '150', 'x-connection-hash': '76ab9aa7f787510d03d98f9a93f7a3b7f2c1317b3bd18b560ccf16d33b3772ab', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da6377c8d9194e-MIA'}
Content: b'{"data":{"edit_history_tweet_ids":["1909963404514644051"],"text":"@cromewar The Ethereum address for vitalik.eth is 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. This is his primary address on the Ethereum network.","id":"1909963404514644051"}}'
2025-04-09 08:35:35,757 - INFO - [twiiter_bot.py:338] - Created reply to mention 1909963085554634781
2025-04-09 08:35:35,757 - DEBUG - [twiiter_bot.py:152] - Saving last mention ID: 1909963085554634781
2025-04-09 08:35:35,758 - DEBUG - [twiiter_bot.py:157] - Successfully saved last mention ID
2025-04-09 08:35:35,758 - DEBUG - [twiiter_bot.py:344] - Sleeping for 2 seconds to avoid rate limiting
2025-04-09 08:35:37,762 - INFO - [twiiter_bot.py:424] - Waiting for next check... (90 seconds)
2025-04-09 08:37:07,764 - INFO - [twiiter_bot.py:418] - Check #3: Checking for new mentions...
2025-04-09 08:37:07,766 - DEBUG - [twiiter_bot.py:267] - Processing mentions
2025-04-09 08:37:07,767 - DEBUG - [twiiter_bot.py:202] - Getting recent mentions
2025-04-09 08:37:07,767 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:37:07,768 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909963085554634781
2025-04-09 08:37:07,768 - DEBUG - [twiiter_bot.py:204] - Last mention ID: 1909963085554634781
2025-04-09 08:37:07,768 - DEBUG - [twiiter_bot.py:214] - Using since_id: 1909963085554634781
2025-04-09 08:37:07,768 - DEBUG - [twiiter_bot.py:218] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909963085554634781}
2025-04-09 08:37:07,769 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:37:07,770 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:37:07,770 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:37:07,770 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '132333708227557932241744205827'), ('oauth_timestamp', '1744205827'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:37:07,770 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=132333708227557932241744205827&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205827&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:37:07,770 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:37:07,770 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D132333708227557932241744205827%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205827%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:37:07,771 - DEBUG - [__init__.py:188] - Signature: FzObKjDNmxSqJFzTAAHXI0GCzX0=
2025-04-09 08:37:07,771 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:37:07,771 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420562203063773; guest_id_ads=v1%3A174420562203063773; personalization_id="v1_bpJXzUTLgs2WP0cLmhuURQ=="; guest_id=v1%3A174420562203063773; __cf_bm=aJbNeidnYqbubxbSwRalPrIXhL0wDHTTBIamggURBTc-1744205622-1.0.1.1-R7AQ7KzwzF_gwJ76C77EtcwhzbMscv5SXwGDsFnVzKbouKJRuQhbVKR8ALHIaUI4cWGyP6yapEI0OHaarKuaxjHmTf6Z7DeeI5lJVP9Gj6s', 'Authorization': 'OAuth oauth_nonce="132333708227557932241744205827", oauth_timestamp="1744205827", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="FzObKjDNmxSqJFzTAAHXI0GCzX0%3D"'}
2025-04-09 08:37:07,771 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:37:07,897 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:37:07,898 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:37:07 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '36a1e99ed1649c38', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199995', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '230', 'x-response-time': '34', 'x-connection-hash': '59bc299c1f7fe88d2e65985028a1769f54345ff7d0cd2f0f90351f8560ccfe11', 'CF-Cache-Status': 'DYNAMIC', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da65b85fa0194e-MIA'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:37:07,899 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909963085554634781}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:37:08,019 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909963085554634781 HTTP/1.1" 200 53
2025-04-09 08:37:08,019 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:37:08 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '53', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '0aa8a7fb57a64386', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '11', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '26', 'x-connection-hash': 'cc94f1d069bbc3e31a492eea404cedf46f8651a164855e6cd8c54a2d79542486', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da65b929a0194e-MIA'}
Content: b'{"meta":{"result_count":0}}'
2025-04-09 08:37:08,019 - DEBUG - [twiiter_bot.py:223] - No new mentions found
2025-04-09 08:37:08,019 - INFO - [twiiter_bot.py:271] - No new mentions found
2025-04-09 08:37:08,019 - INFO - [twiiter_bot.py:424] - Waiting for next check... (90 seconds)
2025-04-09 08:38:38,026 - INFO - [twiiter_bot.py:418] - Check #4: Checking for new mentions...
2025-04-09 08:38:38,026 - DEBUG - [twiiter_bot.py:267] - Processing mentions
2025-04-09 08:38:38,026 - DEBUG - [twiiter_bot.py:202] - Getting recent mentions
2025-04-09 08:38:38,026 - DEBUG - [twiiter_bot.py:133] - Reading last mention ID from last_mention.json
2025-04-09 08:38:38,026 - DEBUG - [twiiter_bot.py:138] - Read last mention ID: 1909963085554634781
2025-04-09 08:38:38,026 - DEBUG - [twiiter_bot.py:204] - Last mention ID: 1909963085554634781
2025-04-09 08:38:38,026 - DEBUG - [twiiter_bot.py:214] - Using since_id: 1909963085554634781
2025-04-09 08:38:38,026 - DEBUG - [twiiter_bot.py:218] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909963085554634781}
2025-04-09 08:38:38,026 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:38:38,027 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:38:38,027 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:38:38,027 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '65801725590551656981744205918'), ('oauth_timestamp', '1744205918'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:38:38,027 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=65801725590551656981744205918&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744205918&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:38:38,027 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:38:38,027 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D65801725590551656981744205918%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744205918%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:38:38,027 - DEBUG - [__init__.py:188] - Signature: Q95YsgUuPFUl1Ee1ZeiqtgFczBQ=
2025-04-09 08:38:38,028 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:38:38,028 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420562203063773; guest_id_ads=v1%3A174420562203063773; personalization_id="v1_bpJXzUTLgs2WP0cLmhuURQ=="; guest_id=v1%3A174420562203063773; __cf_bm=aJbNeidnYqbubxbSwRalPrIXhL0wDHTTBIamggURBTc-1744205622-1.0.1.1-R7AQ7KzwzF_gwJ76C77EtcwhzbMscv5SXwGDsFnVzKbouKJRuQhbVKR8ALHIaUI4cWGyP6yapEI0OHaarKuaxjHmTf6Z7DeeI5lJVP9Gj6s', 'Authorization': 'OAuth oauth_nonce="65801725590551656981744205918", oauth_timestamp="1744205918", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="Q95YsgUuPFUl1Ee1ZeiqtgFczBQ%3D"'}
2025-04-09 08:38:38,028 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:38:38,156 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:38:38,156 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:38:38 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '781c4d44f720ae5b', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199994', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '229', 'x-response-time': '35', 'x-connection-hash': 'a771a965a6c9febe72eb85aa72e9ffd95dc48afe7bb7426ccbf4e2f43d02aede', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da67ec7e78194e-MIA'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:38:38,157 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909963085554634781}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:38:38,273 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909963085554634781 HTTP/1.1" 200 53
2025-04-09 08:38:38,274 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:38:38 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '53', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': 'e100218406ec12d8', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744206024', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '10', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '24', 'x-connection-hash': '76ab9aa7f787510d03d98f9a93f7a3b7f2c1317b3bd18b560ccf16d33b3772ab', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da67ed4880194e-MIA'}
Content: b'{"meta":{"result_count":0}}'
2025-04-09 08:38:38,274 - DEBUG - [twiiter_bot.py:223] - No new mentions found
2025-04-09 08:38:38,274 - INFO - [twiiter_bot.py:271] - No new mentions found
2025-04-09 08:38:38,274 - INFO - [twiiter_bot.py:424] - Waiting for next check... (90 seconds)
2025-04-09 08:38:56,062 - INFO - [twiiter_bot.py:428] - Bot stopped by user
2025-04-09 08:38:56,128 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:38:56,129 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:38:56,129 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:38:56,129 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:48:22,422 - INFO - [twiiter_bot.py:35] - API_KEY present: True
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:36] - API_SECRET present: True
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:37] - ACCESS_TOKEN present: True
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:38] - ACCESS_TOKEN_SECRET present: True
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:39] - BEARER_TOKEN present: True
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:49] - Authenticating with Twitter API...
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:57] - Twitter API authentication successful
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:480] - === Twitter Bot Starting ===
2025-04-09 08:48:22,423 - INFO - [twiiter_bot.py:404] - Starting Twitter bot - monitoring for mentions
2025-04-09 08:48:22,423 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:48:22,423 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:48:22,423 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:48:22,423 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '109480071725156795691744206502'), ('oauth_timestamp', '1744206502'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:48:22,423 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=109480071725156795691744206502&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744206502&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:48:22,423 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:48:22,424 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D109480071725156795691744206502%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744206502%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:48:22,424 - DEBUG - [__init__.py:188] - Signature: LxWQ1zT7v7vn70VIrjptrN9Qb6c=
2025-04-09 08:48:22,424 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:48:22,424 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'OAuth oauth_nonce="109480071725156795691744206502", oauth_timestamp="1744206502", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="LxWQ1zT7v7vn70VIrjptrN9Qb6c%3D"'}
2025-04-09 08:48:22,424 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:48:22,427 - DEBUG - [connectionpool.py:1049] - Starting new HTTPS connection (1): api.twitter.com:443
2025-04-09 08:48:22,587 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:48:22,588 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:48:22 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'Set-Cookie': 'guest_id_marketing=v1%3A174420650257898311; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:48:22 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, guest_id_ads=v1%3A174420650257898311; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:48:22 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, personalization_id="v1_bIsTu+ouq48xxF25/k6mbg=="; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:48:22 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, guest_id=v1%3A174420650257898311; Max-Age=63072000; Expires=Fri, 09 Apr 2027 13:48:22 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None, __cf_bm=T8tqA5g_luQP9jH2gQ5zriZscv3cvuC7lGOom5H.ZRk-1744206502-1.0.1.1-NYVGwYemAKIRTtOcGX7eTVcAabz5.hJ_DY6cpFMuIEL7cqfN9Jgj539oUQguQF.RCdQIwpLZqJFpoYhPZG_nynrkUKtKRIu70Q84GkDtawE; path=/; expires=Wed, 09-Apr-25 14:18:22 GMT; domain=.twitter.com; HttpOnly; Secure; SameSite=None', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '617c4915fa7830ba', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744207402', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199999', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '228', 'x-response-time': '36', 'x-connection-hash': '66ef3ea31e6397d4046b5bc097a3d418d6e27c714d3a9292257932b70009b326', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da7630cbec9afd-GYE'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:48:22,588 - INFO - [twiiter_bot.py:409] - Authenticated as @AskNebula (ID: 1896726162791112704)
2025-04-09 08:48:22,588 - INFO - [twiiter_bot.py:419] - Bot will respond to @AskNebula mentions
2025-04-09 08:48:22,588 - DEBUG - [twiiter_bot.py:376] - Initializing bot
2025-04-09 08:48:22,588 - DEBUG - [twiiter_bot.py:148] - Reading last mention ID from last_mention.json
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:153] - Read last mention ID: 1909963085554634781
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:148] - Reading last mention ID from last_mention.json
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:153] - Read last mention ID: 1909963085554634781
2025-04-09 08:48:22,589 - INFO - [twiiter_bot.py:397] - Bot already initialized with last mention ID: 1909963085554634781
2025-04-09 08:48:22,589 - INFO - [twiiter_bot.py:433] - Check #1: Checking for new mentions...
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:282] - Processing mentions
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:217] - Getting recent mentions
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:148] - Reading last mention ID from last_mention.json
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:153] - Read last mention ID: 1909963085554634781
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:219] - Last mention ID: 1909963085554634781
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:229] - Using since_id: 1909963085554634781
2025-04-09 08:48:22,589 - DEBUG - [twiiter_bot.py:233] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909963085554634781}
2025-04-09 08:48:22,589 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:48:22,590 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:48:22,590 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:48:22,590 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '94464761798779470631744206502'), ('oauth_timestamp', '1744206502'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:48:22,590 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=94464761798779470631744206502&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744206502&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:48:22,590 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:48:22,590 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D94464761798779470631744206502%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744206502%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:48:22,590 - DEBUG - [__init__.py:188] - Signature: cRW9OST/8bqwNenxHlRW/tP8PPQ=
2025-04-09 08:48:22,590 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:48:22,590 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420650257898311; guest_id_ads=v1%3A174420650257898311; personalization_id="v1_bIsTu+ouq48xxF25/k6mbg=="; guest_id=v1%3A174420650257898311; __cf_bm=T8tqA5g_luQP9jH2gQ5zriZscv3cvuC7lGOom5H.ZRk-1744206502-1.0.1.1-NYVGwYemAKIRTtOcGX7eTVcAabz5.hJ_DY6cpFMuIEL7cqfN9Jgj539oUQguQF.RCdQIwpLZqJFpoYhPZG_nynrkUKtKRIu70Q84GkDtawE', 'Authorization': 'OAuth oauth_nonce="94464761798779470631744206502", oauth_timestamp="1744206502", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="cRW9OST%2F8bqwNenxHlRW%2FtP8PPQ%3D"'}
2025-04-09 08:48:22,590 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:48:22,716 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:48:22,716 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:48:22 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '2e1c107cebbf2e43', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744207402', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199998', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '227', 'x-response-time': '33', 'x-connection-hash': '8fec3d40e57d04ccb8efebe9b0145e8180271d30d0ce77c274385e99f85f25cf', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da76319cd29afd-GYE'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:48:22,716 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909963085554634781}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:48:22,840 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909963085554634781 HTTP/1.1" 200 53
2025-04-09 08:48:22,840 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:48:22 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '53', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '139634ddd4028ac2', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744207402', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '14', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '29', 'x-connection-hash': 'e58c89cda7e55aea3bf69faf4f325a2dd7a001bb5a348261d67f9a1919c90904', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da76326dd19afd-GYE'}
Content: b'{"meta":{"result_count":0}}'
2025-04-09 08:48:22,840 - DEBUG - [twiiter_bot.py:238] - No new mentions found
2025-04-09 08:48:22,840 - INFO - [twiiter_bot.py:286] - No new mentions found
2025-04-09 08:48:22,840 - INFO - [twiiter_bot.py:439] - Waiting for next check... (90 seconds)
2025-04-09 08:49:52,847 - INFO - [twiiter_bot.py:433] - Check #2: Checking for new mentions...
2025-04-09 08:49:52,849 - DEBUG - [twiiter_bot.py:282] - Processing mentions
2025-04-09 08:49:52,850 - DEBUG - [twiiter_bot.py:217] - Getting recent mentions
2025-04-09 08:49:52,850 - DEBUG - [twiiter_bot.py:148] - Reading last mention ID from last_mention.json
2025-04-09 08:49:52,851 - DEBUG - [twiiter_bot.py:153] - Read last mention ID: 1909963085554634781
2025-04-09 08:49:52,851 - DEBUG - [twiiter_bot.py:219] - Last mention ID: 1909963085554634781
2025-04-09 08:49:52,851 - DEBUG - [twiiter_bot.py:229] - Using since_id: 1909963085554634781
2025-04-09 08:49:52,851 - DEBUG - [twiiter_bot.py:233] - Requesting mentions with params: {'expansions': 'author_id', 'since_id': 1909963085554634781}
2025-04-09 08:49:52,852 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/me
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: None
2025-04-09 08:49:52,853 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [GET]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:49:52,853 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:49:52,854 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '12155590600688421831744206592'), ('oauth_timestamp', '1744206592'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:49:52,854 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=12155590600688421831744206592&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744206592&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:49:52,854 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/users/me
2025-04-09 08:49:52,854 - DEBUG - [__init__.py:181] - Signing: signature base string: GET&https%3A%2F%2Fapi.twitter.com%2F2%2Fusers%2Fme&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D12155590600688421831744206592%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744206592%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:49:52,854 - DEBUG - [__init__.py:188] - Signature: hPkHAo4t9FdWWjv3YbqUruKmnX8=
2025-04-09 08:49:52,854 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/users/me
2025-04-09 08:49:52,854 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420650257898311; guest_id_ads=v1%3A174420650257898311; personalization_id="v1_bIsTu+ouq48xxF25/k6mbg=="; guest_id=v1%3A174420650257898311; __cf_bm=T8tqA5g_luQP9jH2gQ5zriZscv3cvuC7lGOom5H.ZRk-1744206502-1.0.1.1-NYVGwYemAKIRTtOcGX7eTVcAabz5.hJ_DY6cpFMuIEL7cqfN9Jgj539oUQguQF.RCdQIwpLZqJFpoYhPZG_nynrkUKtKRIu70Q84GkDtawE', 'Authorization': 'OAuth oauth_nonce="12155590600688421831744206592", oauth_timestamp="1744206592", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="hPkHAo4t9FdWWjv3YbqUruKmnX8%3D"'}
2025-04-09 08:49:52,854 - DEBUG - [oauth1_auth.py:111] - Updated body: None
2025-04-09 08:49:53,023 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/me HTTP/1.1" 200 89
2025-04-09 08:49:53,024 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:49:53 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '89', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '60b0450e065368fd', 'x-xss-protection': '0', 'x-rate-limit-limit': '1200000', 'x-rate-limit-reset': '1744207402', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1199997', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '250', 'x-user-limit-24hour-reset': '1744289483', 'x-user-limit-24hour-remaining': '226', 'x-response-time': '32', 'x-connection-hash': 'dfcdac63d733b930c9d1785f083e042d4cff6d1e8d417c623d385cd28d3bb4df', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da7865f93c9afd-GYE'}
Content: b'{"data":{"id":"1896726162791112704","name":"Nebula","username":"AskNebula"}}'
2025-04-09 08:49:53,024 - DEBUG - [client.py:77] - Making API request: GET https://api.twitter.com/2/users/1896726162791112704/mentions
Parameters: {'expansions': 'author_id', 'since_id': 1909963085554634781}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAACho0QEAAAAAN3e9ZNE73Q4dfGCrDdzwYuVm87g%3DlQRGuxNUOuA96P9moKuv0mRmmfu6XhXMbs4KZ6AxjE0vbvwSZ5'}
Body: None
2025-04-09 08:49:53,180 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "GET /2/users/1896726162791112704/mentions?expansions=author_id&since_id=1909963085554634781 HTTP/1.1" 200 298
2025-04-09 08:49:53,181 - DEBUG - [client.py:88] - Received API response: 200 OK
Headers: {'Date': 'Wed, 09 Apr 2025 13:49:53 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '298', 'Connection': 'keep-alive', 'perf': '7402827104', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '7cbba0cbb01bca9d', 'x-xss-protection': '0', 'x-rate-limit-limit': '15', 'x-rate-limit-reset': '1744207402', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '13', 'strict-transport-security': 'max-age=631138519', 'x-response-time': '58', 'x-connection-hash': 'a0dca908e2f018f15202b3abbc69f62dd4aa5e6ceaceb90846b4474dff56542a', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da7866da759afd-GYE'}
Content: b'{"data":[{"edit_history_tweet_ids":["1909966745730720191"],"text":"hey @AskNebula can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?","author_id":"1437794194580459525","id":"1909966745730720191"}],"includes":{"users":[{"id":"1437794194580459525","name":"Vasiliy Kirochka","username":"cromewar"}]},"meta":{"result_count":1,"newest_id":"1909966745730720191","oldest_id":"1909966745730720191"}}'
2025-04-09 08:49:53,182 - DEBUG - [twiiter_bot.py:243] - Found mention ID: 1909966745730720191, text: hey @AskNebula can you analyze this transaction 0x...
2025-04-09 08:49:53,182 - DEBUG - [twiiter_bot.py:249] - Returning 1 mentions sorted by ID
2025-04-09 08:49:53,182 - INFO - [twiiter_bot.py:289] - Found 1 new mentions to process
2025-04-09 08:49:53,182 - DEBUG - [twiiter_bot.py:293] - Processing mention ID 1909966745730720191
2025-04-09 08:49:53,182 - DEBUG - [twiiter_bot.py:297] - Mention text: hey @AskNebula can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:49:53,182 - DEBUG - [twiiter_bot.py:276] - Checking if direct mention: 'hey @AskNebula can you analyze this transaction 0x...' -> True
2025-04-09 08:49:53,182 - DEBUG - [twiiter_bot.py:314] - Cleaned text: hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:49:53,183 - INFO - [twiiter_bot.py:316] - Processing mention 1909966745730720191: hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:49:53,183 - DEBUG - [twiiter_bot.py:319] - Sending query to process_blockchain_query: hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?
2025-04-09 08:49:53,183 - DEBUG - [twiiter_bot.py:322] - Calling process_blockchain_query
2025-04-09 08:49:53,340 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:49:53,352 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:49:53,353 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:49:53,429 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x117b37750>
2025-04-09 08:49:53,429 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x117870cb0> server_hostname='api.openai.com' timeout=None
2025-04-09 08:49:53,499 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x117b09850>
2025-04-09 08:49:53,499 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:49:53,499 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:49:53,499 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:49:53,499 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:49:53,499 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:49:54,198 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:49:54 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'497'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999680'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'9ms'), (b'x-request-id', b'req_4827f9597ee0801bf5357a47653a97e2'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'CF-Cache-Status', b'DYNAMIC'), (b'Set-Cookie', b'__cf_bm=duG2lOVwrZ2R4sfMeqdP2fsQEz5fuc4SqOmLlz5qLF4-1744206594-1.0.1.1-Th0T5WhHlE6Vs1eo9SAJ3Dgrm0LfV3PH3uR.sWSII4WX0BTc1_6AHjEjGSBtmtdDTiNSf062KIjPfe9gDXxYEYt3HTzZHhksua8W0BofZDM; path=/; expires=Wed, 09-Apr-25 14:19:54 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'X-Content-Type-Options', b'nosniff'), (b'Set-Cookie', b'_cfuvid=mOktPZGqmNTe5hoRH7zwq29U5fmmihK8XKpdI3eFTkU-1744206594217-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da7869ec1b1670-MIA'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:49:54,201 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:49:54,202 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers([('date', 'Wed, 09 Apr 2025 13:49:54 GMT'), ('content-type', 'text/event-stream; charset=utf-8'), ('transfer-encoding', 'chunked'), ('connection', 'keep-alive'), ('access-control-expose-headers', 'X-Request-ID'), ('openai-organization', 'cromewar'), ('openai-processing-ms', '497'), ('openai-version', '2020-10-01'), ('x-ratelimit-limit-requests', '5000'), ('x-ratelimit-limit-tokens', '2000000'), ('x-ratelimit-remaining-requests', '4999'), ('x-ratelimit-remaining-tokens', '1999680'), ('x-ratelimit-reset-requests', '12ms'), ('x-ratelimit-reset-tokens', '9ms'), ('x-request-id', 'req_4827f9597ee0801bf5357a47653a97e2'), ('strict-transport-security', 'max-age=31536000; includeSubDomains; preload'), ('cf-cache-status', 'DYNAMIC'), ('set-cookie', '__cf_bm=duG2lOVwrZ2R4sfMeqdP2fsQEz5fuc4SqOmLlz5qLF4-1744206594-1.0.1.1-Th0T5WhHlE6Vs1eo9SAJ3Dgrm0LfV3PH3uR.sWSII4WX0BTc1_6AHjEjGSBtmtdDTiNSf062KIjPfe9gDXxYEYt3HTzZHhksua8W0BofZDM; path=/; expires=Wed, 09-Apr-25 14:19:54 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('x-content-type-options', 'nosniff'), ('set-cookie', '_cfuvid=mOktPZGqmNTe5hoRH7zwq29U5fmmihK8XKpdI3eFTkU-1744206594217-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('server', 'cloudflare'), ('cf-ray', '92da7869ec1b1670-MIA'), ('alt-svc', 'h3=":443"; ma=86400')])
2025-04-09 08:49:54,202 - DEBUG - [_base_client.py:999] - request_id: req_4827f9597ee0801bf5357a47653a97e2
2025-04-09 08:49:54,203 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:49:55,034 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:49:55,034 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:49:55,034 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:49:55,047 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant specialized in blockchain operations. For balance queries on specific contracts, use the get_balance_on_contract tool directly instead of the generic chat tool.\n - Always use the most specific tool available for the task.\n - If a chain is not specified, you will assume the user is asking for the balance of an ENS name or an address on the mainnet.\n - You must not make up any information, like contract addresses, chain ids, etc. You will only work with the information provided by the user.\n - By default you will avoid using the get_balance_on_contract tool and use the generic chat tool instead unless the user explicitly asks for the balance of a specific contract. If no contract address is provided, you will assume the user is requesting the balance of an ENS name so you will default to the native currency of the chain.\n - Get transaction details is only for transaction hashes, not for ENS names or addresses. if the tools in incorrectly used you need to pivot and find the transactions for the wallet address and ignore this tool call.\n - If the user asks for information about an ENS name, you will use the resolve_ens_name tool to get the address of the ENS name and then try to get the balances of the address for mainnet unless another chain is specified, and also try to get any other information you can find about the address.\n - If the request is about finding suspicious activity of a wallet address, you will get the last 10 transactions of the address and analyze them looking for patterns that are suspicious, like wash trading, or other patterns.\n - When a chain is provided but not it's chain id, you need to automatically resolve the chain id from the chain name.\n - For off-topic questions, personal messages, greetings, or any requests unrelated to blockchain, use the respond_to_offtopic tool, but if the user asks about blockchain or crypto, you must always first try to get the information from the blockchain and then pivot to the respond_to_offtopic tool if you can't find the information in the blockchain.\n ", 'role': 'system'}, {'content': 'Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'chat', 'description': 'Send a message to Nebula AI and get a response. This can be used for blockchain queries, contract interactions, and access to thirdweb tools.', 'parameters': {'properties': {'message': {'description': 'The natural language message to process. Can be a question about blockchain data, a request to execute a transaction, or any web3-related query.', 'type': 'string'}, 'session_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional session ID to maintain conversation context. If provided, this message will be part of an ongoing conversation; if omitted, a new session is created.'}, 'context': {'anyOf': [{'additionalProperties': True, 'type': 'object'}, {'type': 'null'}], 'default': None, 'description': "Contextual information for processing the request, including: chainIds (array of chain identifiers) and walletAddress (user's wallet for transaction signing). Example: {'chainIds': ['1', '137'], 'walletAddress': '0x123...'}"}}, 'required': ['message'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_session', 'description': 'Fetch complete information about a specific Nebula AI session, including conversation history, context settings, and metadata. Use this to examine past interactions or resume an existing conversation thread.', 'parameters': {'properties': {'session_id': {'description': 'Unique identifier for the target session. This UUID references a specific conversation history in the Nebula system.', 'type': 'string'}}, 'required': ['session_id'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'list_sessions', 'description': 'Retrieve all available Nebula AI sessions for the authenticated account. Returns an array of session metadata including IDs, titles, and creation timestamps, allowing you to find and reference existing conversations.', 'parameters': {'properties': {}, 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_balance_on_contract', 'description': 'Get the balance of an ENS name on a contract, use this only when the contract address is explicitly provided.\n\n If no chain_id is provided it must utomatically try to resolve the chain_id from the chain name\n For Sepolia the chain_id is 11155111\n For Mainnet the chain_id is 1\n For Optimism the chain_id is 10\n For Base the chain_id is 8453\n For Arbitrum the chain_id is 42161\n For Polygon the chain_id is 137\n And so on for other chains\n\n Args:\n ens_name: The ENS name to get the balance of\n contract_address: The address of the contract to get the balance of\n chain: The chain to get the balance of\n chain_id: The chain id to get the balance of\n\n Returns:\n The balance of the ENS name on the contract', 'parameters': {'properties': {'ens_name': {'type': 'string'}, 'contract_address': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['ens_name', 'contract_address'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'resolve_ens_name', 'description': 'Resolve an ENS name to an address\n\n Args:\n ens_name: The ENS name to resolve\n\n Returns:\n The address of the ENS name', 'parameters': {'properties': {'ens_name': {'type': 'string'}}, 'required': ['ens_name'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_transaction_details', 'description': 'Get the details of a transaction from any EVM chain, if the chain_id is not provided it must utomatically try to resolve the chain_id from the chain name.\n\n\n\n Args:\n transaction_hash: The hash of the transaction to get the details of\n chain: The chain to get the transaction details of\n chain_id: The chain id to get the transaction details of\n\n Returns:\n The details of the transaction', 'parameters': {'properties': {'transaction_hash': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['transaction_hash'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'respond_to_offtopic', 'description': "Handle off-topic questions, personal messages, greetings, jokes, or any requests unrelated to blockchain data.\n Use this tool when the user's query doesn't require blockchain data or other specific tools.\n\n Args:\n query: The off-topic question or message from the user\n\n Returns:\n A friendly, appropriate response to the off-topic query", 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}]}}
2025-04-09 08:49:55,048 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:49:55,048 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:49:55,058 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x1178f2cd0>
2025-04-09 08:49:55,058 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x1178710a0> server_hostname='api.openai.com' timeout=None
2025-04-09 08:49:55,076 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x10786a950>
2025-04-09 08:49:55,076 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:49:55,076 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:49:55,076 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:49:55,076 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:49:55,076 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:49:56,155 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:49:56 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'520'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999403'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'17ms'), (b'x-request-id', b'req_3932f191a84826370dc4470348fde670'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'__cf_bm=m7kK47YxQUND2rKn24oxvqnZBihYo8bdw6KDFSvDfAM-1744206596-1.0.1.1-pXuJ6xuvgPPK3TJ1VqPl_R9ZdpR.wLuDPjhmUGqC5OO3gkBXA7YtwRoQ9f_uXlhleVBmZUuOzGpAL8DmnmGZ0dvYd3s0pDkwOIKqvPWwprs; path=/; expires=Wed, 09-Apr-25 14:19:56 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'X-Content-Type-Options', b'nosniff'), (b'Set-Cookie', b'_cfuvid=VsA0Ka3Xdu5oQPmoYMggMwu98NsbKaJOpYh76AxOp0Y-1744206596211-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da7873abc8824f-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:49:56,157 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:49:56,157 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers([('date', 'Wed, 09 Apr 2025 13:49:56 GMT'), ('content-type', 'text/event-stream; charset=utf-8'), ('transfer-encoding', 'chunked'), ('connection', 'keep-alive'), ('access-control-expose-headers', 'X-Request-ID'), ('openai-organization', 'cromewar'), ('openai-processing-ms', '520'), ('openai-version', '2020-10-01'), ('x-ratelimit-limit-requests', '5000'), ('x-ratelimit-limit-tokens', '2000000'), ('x-ratelimit-remaining-requests', '4999'), ('x-ratelimit-remaining-tokens', '1999403'), ('x-ratelimit-reset-requests', '12ms'), ('x-ratelimit-reset-tokens', '17ms'), ('x-request-id', 'req_3932f191a84826370dc4470348fde670'), ('strict-transport-security', 'max-age=31536000; includeSubDomains; preload'), ('cf-cache-status', 'DYNAMIC'), ('set-cookie', '__cf_bm=m7kK47YxQUND2rKn24oxvqnZBihYo8bdw6KDFSvDfAM-1744206596-1.0.1.1-pXuJ6xuvgPPK3TJ1VqPl_R9ZdpR.wLuDPjhmUGqC5OO3gkBXA7YtwRoQ9f_uXlhleVBmZUuOzGpAL8DmnmGZ0dvYd3s0pDkwOIKqvPWwprs; path=/; expires=Wed, 09-Apr-25 14:19:56 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('x-content-type-options', 'nosniff'), ('set-cookie', '_cfuvid=VsA0Ka3Xdu5oQPmoYMggMwu98NsbKaJOpYh76AxOp0Y-1744206596211-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), ('server', 'cloudflare'), ('cf-ray', '92da7873abc8824f-GYE'), ('alt-svc', 'h3=":443"; ma=86400')])
2025-04-09 08:49:56,157 - DEBUG - [_base_client.py:999] - request_id: req_3932f191a84826370dc4470348fde670
2025-04-09 08:49:56,157 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:49:57,498 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:49:57,498 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:49:57,498 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:49:57,500 - DEBUG - [_trace.py:47] - connect_tcp.started host='nebula-api.thirdweb.com' port=443 local_address=None timeout=120.0 socket_options=None
2025-04-09 08:49:57,510 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x117b14390>
2025-04-09 08:49:57,510 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x117870ef0> server_hostname='nebula-api.thirdweb.com' timeout=120.0
2025-04-09 08:49:57,526 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x117b16f50>
2025-04-09 08:49:57,526 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:49:57,526 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:49:57,526 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:49:57,526 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:49:57,526 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:50:34,258 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:50:34 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'cf-cache-status', b'DYNAMIC'), (b'Set-Cookie', b'_cfuvid=5wDODezlmUoj6nSWhWoZZETHgLjbZAgq_BhBJxdoDvY-1744206634312-0.0.1.1-604800000; path=/; domain=.thirdweb.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da7882ff90825b-GYE'), (b'Content-Encoding', b'gzip')])
2025-04-09 08:50:34,261 - INFO - [_client.py:1025] - HTTP Request: POST https://nebula-api.thirdweb.com/chat "HTTP/1.1 200 OK"
2025-04-09 08:50:34,261 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:50:34,262 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:50:34,263 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:50:34,263 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:50:34,274 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant specialized in blockchain operations. For balance queries on specific contracts, use the get_balance_on_contract tool directly instead of the generic chat tool.\n - Always use the most specific tool available for the task.\n - If a chain is not specified, you will assume the user is asking for the balance of an ENS name or an address on the mainnet.\n - You must not make up any information, like contract addresses, chain ids, etc. You will only work with the information provided by the user.\n - By default you will avoid using the get_balance_on_contract tool and use the generic chat tool instead unless the user explicitly asks for the balance of a specific contract. If no contract address is provided, you will assume the user is requesting the balance of an ENS name so you will default to the native currency of the chain.\n - Get transaction details is only for transaction hashes, not for ENS names or addresses. if the tools in incorrectly used you need to pivot and find the transactions for the wallet address and ignore this tool call.\n - If the user asks for information about an ENS name, you will use the resolve_ens_name tool to get the address of the ENS name and then try to get the balances of the address for mainnet unless another chain is specified, and also try to get any other information you can find about the address.\n - If the request is about finding suspicious activity of a wallet address, you will get the last 10 transactions of the address and analyze them looking for patterns that are suspicious, like wash trading, or other patterns.\n - When a chain is provided but not it's chain id, you need to automatically resolve the chain id from the chain name.\n - For off-topic questions, personal messages, greetings, or any requests unrelated to blockchain, use the respond_to_offtopic tool, but if the user asks about blockchain or crypto, you must always first try to get the information from the blockchain and then pivot to the respond_to_offtopic tool if you can't find the information in the blockchain.\n ", 'role': 'system'}, {'content': 'Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_9vAkfhemRme97vAnllp90eCX', 'function': {'name': 'get_transaction_details', 'arguments': '{"transaction_hash": "0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad", "chain": "Base"}'}}]}, {'content': '{"message": "This transaction on Base is an NFT claim for the \\"angelbaby - imposter (DEMO)\\" collection. Let me break it down:\\n\\nThe transaction successfully minted 1 NFT (token ID 4331) to wallet address 0xab64Be5870b82474816B999C96666751AB43a7d0. It was a free claim (no cost) that used an allowlist proof for verification.\\n\\nThe NFT contract address is 0xbf784c4a1867fa07bfc508631aa50d298d2fe12d, and the transaction was sent from 0x7b323b7f681d29d477fa33b68758880dd7cff62b.\\n\\nThis happened in block 28453333 on the Base network, with about 131,092 gas used. The transaction used EIP-1559 for gas pricing.\\n\\nIs there anything specific about this NFT claim transaction you\'d like me to explain further?", "actions": [], "session_id": "c91276c3-7799-4b8c-b3ea-83204455287d", "request_id": "58f61ed0-a741-4cc0-b0fd-7a5e904c91e9"}', 'role': 'tool', 'tool_call_id': 'call_9vAkfhemRme97vAnllp90eCX'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'chat', 'description': 'Send a message to Nebula AI and get a response. This can be used for blockchain queries, contract interactions, and access to thirdweb tools.', 'parameters': {'properties': {'message': {'description': 'The natural language message to process. Can be a question about blockchain data, a request to execute a transaction, or any web3-related query.', 'type': 'string'}, 'session_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Optional session ID to maintain conversation context. If provided, this message will be part of an ongoing conversation; if omitted, a new session is created.'}, 'context': {'anyOf': [{'additionalProperties': True, 'type': 'object'}, {'type': 'null'}], 'default': None, 'description': "Contextual information for processing the request, including: chainIds (array of chain identifiers) and walletAddress (user's wallet for transaction signing). Example: {'chainIds': ['1', '137'], 'walletAddress': '0x123...'}"}}, 'required': ['message'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_session', 'description': 'Fetch complete information about a specific Nebula AI session, including conversation history, context settings, and metadata. Use this to examine past interactions or resume an existing conversation thread.', 'parameters': {'properties': {'session_id': {'description': 'Unique identifier for the target session. This UUID references a specific conversation history in the Nebula system.', 'type': 'string'}}, 'required': ['session_id'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'list_sessions', 'description': 'Retrieve all available Nebula AI sessions for the authenticated account. Returns an array of session metadata including IDs, titles, and creation timestamps, allowing you to find and reference existing conversations.', 'parameters': {'properties': {}, 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_balance_on_contract', 'description': 'Get the balance of an ENS name on a contract, use this only when the contract address is explicitly provided.\n\n If no chain_id is provided it must utomatically try to resolve the chain_id from the chain name\n For Sepolia the chain_id is 11155111\n For Mainnet the chain_id is 1\n For Optimism the chain_id is 10\n For Base the chain_id is 8453\n For Arbitrum the chain_id is 42161\n For Polygon the chain_id is 137\n And so on for other chains\n\n Args:\n ens_name: The ENS name to get the balance of\n contract_address: The address of the contract to get the balance of\n chain: The chain to get the balance of\n chain_id: The chain id to get the balance of\n\n Returns:\n The balance of the ENS name on the contract', 'parameters': {'properties': {'ens_name': {'type': 'string'}, 'contract_address': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['ens_name', 'contract_address'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'resolve_ens_name', 'description': 'Resolve an ENS name to an address\n\n Args:\n ens_name: The ENS name to resolve\n\n Returns:\n The address of the ENS name', 'parameters': {'properties': {'ens_name': {'type': 'string'}}, 'required': ['ens_name'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'get_transaction_details', 'description': 'Get the details of a transaction from any EVM chain, if the chain_id is not provided it must utomatically try to resolve the chain_id from the chain name.\n\n\n\n Args:\n transaction_hash: The hash of the transaction to get the details of\n chain: The chain to get the transaction details of\n chain_id: The chain id to get the transaction details of\n\n Returns:\n The details of the transaction', 'parameters': {'properties': {'transaction_hash': {'type': 'string'}, 'chain': {'default': None, 'type': 'string'}, 'chain_id': {'default': None, 'type': 'integer'}}, 'required': ['transaction_hash'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'respond_to_offtopic', 'description': "Handle off-topic questions, personal messages, greetings, jokes, or any requests unrelated to blockchain data.\n Use this tool when the user's query doesn't require blockchain data or other specific tools.\n\n Args:\n query: The off-topic question or message from the user\n\n Returns:\n A friendly, appropriate response to the off-topic query", 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}]}}
2025-04-09 08:50:34,276 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:50:34,276 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:50:34,276 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:50:34,276 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:50:34,286 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x1071e4290>
2025-04-09 08:50:34,286 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x1178710a0> server_hostname='api.openai.com' timeout=None
2025-04-09 08:50:34,301 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x117b15590>
2025-04-09 08:50:34,301 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:50:34,301 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:50:34,301 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:50:34,301 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:50:34,301 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:50:35,001 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:50:35 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'366'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999193'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'24ms'), (b'x-request-id', b'req_abd087fe3ac8909d23adf3b783425a3a'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da7968c9a33262-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:50:35,002 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:50:35,002 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:50:35 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '366', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999193', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '24ms', 'x-request-id': 'req_abd087fe3ac8909d23adf3b783425a3a', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da7968c9a33262-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:50:35,003 - DEBUG - [_base_client.py:999] - request_id: req_abd087fe3ac8909d23adf3b783425a3a
2025-04-09 08:50:35,003 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:50:39,346 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:50:39,347 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:50:39,347 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:50:39,359 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_yN2NcdS5mFzMs0oX8aqwEzGH', 'function': {'name': 'query_nebula', 'arguments': '{"query": "Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base"}'}}]}, {'content': 'The transaction with hash `0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad` on the Base network involves an NFT claim for the "angelbaby - imposter (DEMO)" collection. Here\'s a breakdown of the transaction:\n\n- **Transaction Type:** NFT claim (minting)\n- **Token Minted:** 1 NFT (Token ID: 4331)\n- **Recipient Wallet Address:** `0xab64Be5870b82474816B999C96666751AB43a7d0`\n- **Claim Cost:** Free (no cost)\n- **Verification Method:** Allowlist proof\n- **NFT Contract Address:** `0xbf784c4a1867fa07bfc508631aa50d298d2fe12d`\n- **Sender Wallet Address:** `0x7b323b7f681d29d477fa33b68758880dd7cff62b`\n- **Block Number:** 28453333\n- **Gas Used:** Approximately 131,092\n- **Gas Pricing Method:** EIP-1559\n\nIf you need further analysis or specific information about this NFT or transaction, let me know!', 'role': 'tool', 'tool_call_id': 'call_yN2NcdS5mFzMs0oX8aqwEzGH'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:50:39,361 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:50:39,361 - DEBUG - [_trace.py:47] - close.started
2025-04-09 08:50:39,362 - DEBUG - [_trace.py:47] - close.complete
2025-04-09 08:50:39,362 - DEBUG - [_trace.py:47] - connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=None socket_options=None
2025-04-09 08:50:39,372 - DEBUG - [_trace.py:47] - connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x117bb6950>
2025-04-09 08:50:39,373 - DEBUG - [_trace.py:47] - start_tls.started ssl_context=<ssl.SSLContext object at 0x117870cb0> server_hostname='api.openai.com' timeout=None
2025-04-09 08:50:39,386 - DEBUG - [_trace.py:47] - start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x117bb5010>
2025-04-09 08:50:39,386 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:50:39,386 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:50:39,387 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:50:39,387 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:50:39,387 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:50:40,126 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:50:40 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'411'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999476'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'15ms'), (b'x-request-id', b'req_e78152b9fcc42a652308996f1f1862fd'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da79889cc3824d-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:50:40,127 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:50:40,127 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:50:40 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '411', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999476', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '15ms', 'x-request-id': 'req_e78152b9fcc42a652308996f1f1862fd', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da79889cc3824d-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:50:40,128 - DEBUG - [_base_client.py:999] - request_id: req_e78152b9fcc42a652308996f1f1862fd
2025-04-09 08:50:40,129 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:50:43,414 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:50:43,414 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:50:43,415 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:50:43,422 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': '\n Write a Twitter thread about the following blockchain information in exactly 3 tweets:\n \n Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base:\n\n1/3 🚀 This transaction is an NFT claim for the \'angelbaby - imposter (DEMO)\' collection! It involved minting 1 NFT (Token ID: 4331) and was completely free to claim! \n\n2/3 📜 The NFT was sent to wallet address 0xab64Be5870b82474816B999C96666751AB43a7d0, proving participation via an allowlist. The sender\'s address is 0x7b323b7f681d29d477fa33b68758880dd7cff62b.\n\n3/3 ⛽ The transaction was included in block number 28453333 and used around 131,092 gas with EIP-1559 gas pricing. Exciting times for NFT enthusiasts! 🎉 #NFT #Blockchain #BaseNetwork\n \n Requirements:\n - NO hashtags whatsoever\n - Use bullet points (•) for better readability\n - Each bullet point should be on its own line\n - NO markdown formatting (no backticks, no asterisks for bold)\n - For technical data like addresses, use clear labels: "From: 0x123..." not "**From**: `0x123...`"\n - Easy-to-read content with clear keywords and concise language\n - Natural flow between tweets, the transition between tweets should be seamless\n - Each Tweet should be about the same length and try to be as concise as possible\n - Use emojis to make the thread more engaging\n - Twitter has character limits, so keep each tweet under 280 characters\n - Use proper spacing between sentences\n - Format numbers with commas for better readability (e.g., "1,234,567" not "1234567")\n - Use proper units (e.g., "ETH" for Ether values)\n - Keep technical details clear but concise\n - If the information is about a transaction, you MUST include a link to the block explorer with the transaction hash in the last tweet\n - For transactions, use the appropriate block explorer: \n - Ethereum: https://etherscan.io/tx/<hash>\n - Base: https://basescan.org/tx/<hash>\n - Polygon: https://polygonscan.com/tx/<hash>\n - Arbitrum: https://arbiscan.io/tx/<hash>\n - Optimism: https://optimistic.etherscan.io/tx/<hash>\n \n Format:\n Return the thread as plain text with each tweet on a new line, separated by line breaks:\n\n Tweet 1: [First tweet content]\n\n Tweet 2: [Second tweet content]\n\n Tweet 3: [Third tweet content with block explorer link if it\'s a transaction]\n ', 'role': 'user'}], 'model': 'gpt-4o-mini', 'stream': False}}
2025-04-09 08:50:43,423 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:50:43,424 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:50:43,424 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:50:43,425 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:50:43,425 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:50:43,425 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:50:50,574 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:50:50 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'7004'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999332'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'20ms'), (b'x-request-id', b'req_21b5d62c798635766fef46d633bb90fc'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da79a1c9e2824d-GYE'), (b'Content-Encoding', b'gzip'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:50:50,575 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:50:50,575 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:50:50,576 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:50:50,576 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:50:50,576 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:50:50,576 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:50:50 GMT', 'content-type': 'application/json', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '7004', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999332', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '20ms', 'x-request-id': 'req_21b5d62c798635766fef46d633bb90fc', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da79a1c9e2824d-GYE', 'content-encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:50:50,576 - DEBUG - [_base_client.py:999] - request_id: req_21b5d62c798635766fef46d633bb90fc
2025-04-09 08:50:50,594 - DEBUG - [_base_client.py:453] - Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'content': "\n You are an AI assistant that creates Twitter content for blockchain-related information.\n \n Given a user's blockchain query:\n 1. First query the AskNebula agent to get information about the query\n 2. Analyze the response and decide what type of content is appropriate:\n - For complex blockchain data (like transaction details): Create a 3-tweet thread\n - For simple responses (like ENS resolution): Create a single post\n - For off-topic matters: Create a clever, funny response\n \n Use the most appropriate tool for each scenario:\n - create_twitter_thread: For complex transaction data that needs multiple tweets\n - create_twitter_post: For simple blockchain data that fits in one tweet\n - create_clever_response: For off-topic or humorous responses\n \n Never make up blockchain data. Always get the data from the AskNebula agent first.\n ", 'role': 'system'}, {'content': 'hey can you analyze this transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base?', 'role': 'user'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_yN2NcdS5mFzMs0oX8aqwEzGH', 'function': {'name': 'query_nebula', 'arguments': '{"query": "Analyze transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base"}'}}]}, {'content': 'The transaction with hash `0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad` on the Base network involves an NFT claim for the "angelbaby - imposter (DEMO)" collection. Here\'s a breakdown of the transaction:\n\n- **Transaction Type:** NFT claim (minting)\n- **Token Minted:** 1 NFT (Token ID: 4331)\n- **Recipient Wallet Address:** `0xab64Be5870b82474816B999C96666751AB43a7d0`\n- **Claim Cost:** Free (no cost)\n- **Verification Method:** Allowlist proof\n- **NFT Contract Address:** `0xbf784c4a1867fa07bfc508631aa50d298d2fe12d`\n- **Sender Wallet Address:** `0x7b323b7f681d29d477fa33b68758880dd7cff62b`\n- **Block Number:** 28453333\n- **Gas Used:** Approximately 131,092\n- **Gas Pricing Method:** EIP-1559\n\nIf you need further analysis or specific information about this NFT or transaction, let me know!', 'role': 'tool', 'tool_call_id': 'call_yN2NcdS5mFzMs0oX8aqwEzGH'}, {'content': None, 'role': 'assistant', 'tool_calls': [{'type': 'function', 'id': 'call_VY4Ss3ORzgEDHSbZNBJTgTOX', 'function': {'name': 'create_twitter_thread', 'arguments': '{"blockchain_data": "Transaction 0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad on Base:\\n\\n1/3 \\ud83d\\ude80 This transaction is an NFT claim for the \'angelbaby - imposter (DEMO)\' collection! It involved minting 1 NFT (Token ID: 4331) and was completely free to claim! \\n\\n2/3 \\ud83d\\udcdc The NFT was sent to wallet address 0xab64Be5870b82474816B999C96666751AB43a7d0, proving participation via an allowlist. The sender\'s address is 0x7b323b7f681d29d477fa33b68758880dd7cff62b.\\n\\n3/3 \\u26fd The transaction was included in block number 28453333 and used around 131,092 gas with EIP-1559 gas pricing. Exciting times for NFT enthusiasts! \\ud83c\\udf89 #NFT #Blockchain #BaseNetwork"}'}}]}, {'content': '{"tweet1": "🚀 This transaction is an NFT claim for the \'angelbaby - imposter (DEMO)\' collection!\\n• It involved minting 1 NFT (Token ID: 4,331)\\n• The claim was completely free!", "tweet2": "📜 The NFT was sent to wallet address 0xab64Be5870b82474816B999C96666751AB43a7d0\\n• This proves participation via an allowlist\\n• The sender\'s address is 0x7b323b7f681d29d477fa33b68758880dd7cff62b", "tweet3": "⛽ The transaction was included in block number 28,453,333\\n• It used around 131,092 gas with EIP-1559 gas pricing\\n• Exciting times for NFT enthusiasts!\\n👉 Check it out: https://basescan.org/tx/0x4db65f81c76a596073d1eddefd592d0c3f2ef3d80f49dafee445d37e5444a3ad"}', 'role': 'tool', 'tool_call_id': 'call_VY4Ss3ORzgEDHSbZNBJTgTOX'}], 'model': 'gpt-4o-mini', 'stream': True, 'tools': [{'type': 'function', 'function': {'name': 'query_nebula', 'description': 'Query the AskNebula agent to get blockchain-related information.\n\n Args:\n query: A question about blockchain, like asking about a transaction, wallet, ENS name, etc.\n\n Returns:\n The response from the AskNebula agent', 'parameters': {'properties': {'query': {'type': 'string'}}, 'required': ['query'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_thread', 'description': 'Create a Twitter thread with exactly 3 tweets about complex blockchain information.\n\n Args:\n blockchain_data: The blockchain data to create a thread about (like transaction details)\n\n Returns:\n A dictionary with three tweets (tweet1, tweet2, tweet3)', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_twitter_post', 'description': 'Create a single Twitter post for simple blockchain information that fits in one tweet.\n\n Args:\n blockchain_data: The simple blockchain data to create a post about (like an ENS resolution)\n\n Returns:\n A string with the tweet content', 'parameters': {'properties': {'blockchain_data': {'type': 'string'}}, 'required': ['blockchain_data'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'create_clever_response', 'description': 'Create a clever, possibly humorous response for off-topic or non-blockchain matters.\n\n Args:\n topic: The off-topic query or subject\n\n Returns:\n A string with a clever response', 'parameters': {'properties': {'topic': {'type': 'string'}}, 'required': ['topic'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'analyze_nebula_response', 'description': 'Analyze the response from Nebula to determine what kind of Twitter content to create.\n\n Args:\n response: The response from the AskNebula agent\n\n Returns:\n A dictionary with the analysis results', 'parameters': {'properties': {'response': {'type': 'string'}}, 'required': ['response'], 'type': 'object'}}}]}}
2025-04-09 08:50:50,595 - DEBUG - [_base_client.py:952] - Sending HTTP Request: POST https://api.openai.com/v1/chat/completions
2025-04-09 08:50:50,595 - DEBUG - [_trace.py:47] - send_request_headers.started request=<Request [b'POST']>
2025-04-09 08:50:50,595 - DEBUG - [_trace.py:47] - send_request_headers.complete
2025-04-09 08:50:50,596 - DEBUG - [_trace.py:47] - send_request_body.started request=<Request [b'POST']>
2025-04-09 08:50:50,596 - DEBUG - [_trace.py:47] - send_request_body.complete
2025-04-09 08:50:50,596 - DEBUG - [_trace.py:47] - receive_response_headers.started request=<Request [b'POST']>
2025-04-09 08:50:52,079 - DEBUG - [_trace.py:47] - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Wed, 09 Apr 2025 13:50:52 GMT'), (b'Content-Type', b'text/event-stream; charset=utf-8'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-expose-headers', b'X-Request-ID'), (b'openai-organization', b'cromewar'), (b'openai-processing-ms', b'1324'), (b'openai-version', b'2020-10-01'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'2000000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'1999302'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'20ms'), (b'x-request-id', b'req_589a37b986c970e67b8198b61859832a'), (b'strict-transport-security', b'max-age=31536000; includeSubDomains; preload'), (b'cf-cache-status', b'DYNAMIC'), (b'X-Content-Type-Options', b'nosniff'), (b'Server', b'cloudflare'), (b'CF-RAY', b'92da79ce9d7e824d-GYE'), (b'alt-svc', b'h3=":443"; ma=86400')])
2025-04-09 08:50:52,081 - INFO - [_client.py:1025] - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-04-09 08:50:52,081 - DEBUG - [_base_client.py:991] - HTTP Response: POST https://api.openai.com/v1/chat/completions "200 OK" Headers({'date': 'Wed, 09 Apr 2025 13:50:52 GMT', 'content-type': 'text/event-stream; charset=utf-8', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'access-control-expose-headers': 'X-Request-ID', 'openai-organization': 'cromewar', 'openai-processing-ms': '1324', 'openai-version': '2020-10-01', 'x-ratelimit-limit-requests': '5000', 'x-ratelimit-limit-tokens': '2000000', 'x-ratelimit-remaining-requests': '4999', 'x-ratelimit-remaining-tokens': '1999302', 'x-ratelimit-reset-requests': '12ms', 'x-ratelimit-reset-tokens': '20ms', 'x-request-id': 'req_589a37b986c970e67b8198b61859832a', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', 'cf-cache-status': 'DYNAMIC', 'x-content-type-options': 'nosniff', 'server': 'cloudflare', 'cf-ray': '92da79ce9d7e824d-GYE', 'alt-svc': 'h3=":443"; ma=86400'})
2025-04-09 08:50:52,082 - DEBUG - [_base_client.py:999] - request_id: req_589a37b986c970e67b8198b61859832a
2025-04-09 08:50:52,082 - DEBUG - [_trace.py:47] - receive_response_body.started request=<Request [b'POST']>
2025-04-09 08:50:58,098 - DEBUG - [_trace.py:47] - receive_response_body.complete
2025-04-09 08:50:58,098 - DEBUG - [_trace.py:47] - response_closed.started
2025-04-09 08:50:58,100 - DEBUG - [_trace.py:47] - response_closed.complete
2025-04-09 08:50:58,103 - DEBUG - [twiiter_bot.py:324] - Result type: thread
2025-04-09 08:50:58,103 - DEBUG - [twiiter_bot.py:328] - Thread result - Tweet 1: 🚀 This transaction is an NFT claim for the 'angelb...
2025-04-09 08:50:58,104 - DEBUG - [twiiter_bot.py:331] - Thread result - Tweet 2: 📜 The NFT was sent to wallet address 0xab64Be5870b...
2025-04-09 08:50:58,104 - DEBUG - [twiiter_bot.py:334] - Thread result - Tweet 3: ⛽ The transaction was included in block number 28,...
2025-04-09 08:50:58,104 - INFO - [twiiter_bot.py:344] - Creating thread in response to mention 1909966745730720191
2025-04-09 08:50:58,104 - DEBUG - [twiiter_bot.py:92] - Creating thread with first tweet: 🚀 This transaction is an NFT claim for the 'angelb...
2025-04-09 08:50:58,105 - DEBUG - [twiiter_bot.py:109] - Creating first tweet as reply to 1909966745730720191
2025-04-09 08:50:58,106 - DEBUG - [client.py:77] - Making API request: POST https://api.twitter.com/2/tweets
Parameters: {}
Headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0'}
Body: {'reply': {'in_reply_to_tweet_id': '1909966745730720191'}, 'text': "🚀 This transaction is an NFT claim for the 'angelbaby - imposter (DEMO)' collection!\n• It involved minting 1 NFT (Token ID: 4,331)\n• The claim was completely free!"}
2025-04-09 08:50:58,107 - DEBUG - [oauth1_auth.py:72] - Signing request <PreparedRequest [POST]> using client <Client client_key=7kekhzlgHd6XpdpIed1gBVWhi, client_secret=****, resource_owner_key=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3, resource_owner_secret=****, signature_method=HMAC-SHA1, signature_type=AUTH_HEADER, callback_uri=None, rsa_key=None, verifier=None, realm=None, encoding=utf-8, decoding=None, nonce=None, timestamp=None>
2025-04-09 08:50:58,107 - DEBUG - [oauth1_auth.py:86] - Including body in call to sign: False
2025-04-09 08:50:58,108 - DEBUG - [__init__.py:171] - Collected params: [('oauth_nonce', '78581970288037442291744206658'), ('oauth_timestamp', '1744206658'), ('oauth_version', '1.0'), ('oauth_signature_method', 'HMAC-SHA1'), ('oauth_consumer_key', '7kekhzlgHd6XpdpIed1gBVWhi'), ('oauth_token', '1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3')]
2025-04-09 08:50:58,108 - DEBUG - [__init__.py:175] - Normalized params: oauth_consumer_key=7kekhzlgHd6XpdpIed1gBVWhi&oauth_nonce=78581970288037442291744206658&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1744206658&oauth_token=1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3&oauth_version=1.0
2025-04-09 08:50:58,108 - DEBUG - [__init__.py:176] - Normalized URI: https://api.twitter.com/2/tweets
2025-04-09 08:50:58,108 - DEBUG - [__init__.py:181] - Signing: signature base string: POST&https%3A%2F%2Fapi.twitter.com%2F2%2Ftweets&oauth_consumer_key%3D7kekhzlgHd6XpdpIed1gBVWhi%26oauth_nonce%3D78581970288037442291744206658%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1744206658%26oauth_token%3D1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3%26oauth_version%3D1.0
2025-04-09 08:50:58,109 - DEBUG - [__init__.py:188] - Signature: tON/GGkfYfrZEcu933+Y5Bv1WLk=
2025-04-09 08:50:58,109 - DEBUG - [oauth1_auth.py:109] - Updated url: https://api.twitter.com/2/tweets
2025-04-09 08:50:58,109 - DEBUG - [oauth1_auth.py:110] - Updated headers: {'User-Agent': 'Python/3.11.11 Requests/2.32.3 Tweepy/4.15.0', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'guest_id_marketing=v1%3A174420650257898311; guest_id_ads=v1%3A174420650257898311; personalization_id="v1_bIsTu+ouq48xxF25/k6mbg=="; guest_id=v1%3A174420650257898311; __cf_bm=T8tqA5g_luQP9jH2gQ5zriZscv3cvuC7lGOom5H.ZRk-1744206502-1.0.1.1-NYVGwYemAKIRTtOcGX7eTVcAabz5.hJ_DY6cpFMuIEL7cqfN9Jgj539oUQguQF.RCdQIwpLZqJFpoYhPZG_nynrkUKtKRIu70Q84GkDtawE', 'Content-Length': '256', 'Content-Type': 'application/json', 'Authorization': 'OAuth oauth_nonce="78581970288037442291744206658", oauth_timestamp="1744206658", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="7kekhzlgHd6XpdpIed1gBVWhi", oauth_token="1896726162791112704-FeL0bdbYISH8i7wLhdMKc7NuPqZgi3", oauth_signature="tON%2FGGkfYfrZEcu933%2BY5Bv1WLk%3D"'}
2025-04-09 08:50:58,109 - DEBUG - [oauth1_auth.py:111] - Updated body: b'{"reply": {"in_reply_to_tweet_id": "1909966745730720191"}, "text": "\\ud83d\\ude80 This transaction is an NFT claim for the \'angelbaby - imposter (DEMO)\' collection!\\n\\u2022 It involved minting 1 NFT (Token ID: 4,331)\\n\\u2022 The claim was completely free!"}'
2025-04-09 08:50:58,360 - DEBUG - [connectionpool.py:544] - https://api.twitter.com:443 "POST /2/tweets HTTP/1.1" 201 252
2025-04-09 08:50:58,361 - DEBUG - [client.py:88] - Received API response: 201 Created
Headers: {'Date': 'Wed, 09 Apr 2025 13:50:58 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '252', 'Connection': 'keep-alive', 'perf': '7402827104', 'location': 'https://api.x.com/2/tweets/1909967274045227400', 'api-version': '2.133', 'Cache-Control': 'no-cache, no-store, max-age=0', 'x-access-level': 'read-write', 'x-frame-options': 'SAMEORIGIN', 'Content-Encoding': 'gzip', 'x-transaction-id': '80390a804e72ab01', 'x-xss-protection': '0', 'x-rate-limit-limit': '1080000', 'x-rate-limit-reset': '1744207558', 'content-disposition': 'attachment; filename=json.json', 'x-content-type-options': 'nosniff', 'x-rate-limit-remaining': '1079999', 'x-app-limit-24hour-limit': '1667', 'x-app-limit-24hour-reset': '1744289738', 'strict-transport-security': 'max-age=631138519', 'x-user-limit-24hour-limit': '100', 'x-user-limit-24hour-reset': '1744289738', 'x-app-limit-24hour-remaining': '1659', 'x-user-limit-24hour-remaining': '92', 'x-response-time': '147', 'x-connection-hash': '9bc9dd6c86c9993471aee2d57f7f3347c1d26824a2d57d87a73c44e786ab60f5', 'cf-cache-status': 'DYNAMIC', 'vary': 'accept-encoding', 'Server': 'cloudflare tsa_b', 'CF-RAY': '92da79fd9b3f9afd-GYE'}
Content: b'{"data":{"text":"@cromewar \\uD83D\\uDE80 This transaction is an NFT claim for the \'angelbaby - imposter (DEMO)\' collection!\\n\xe2\x80\xa2 It involved minting 1 NFT (Token ID: 4,331)\\n\xe2\x80\xa2 The claim was completely free!","edit_history_tweet_ids":["1909967274045227400"],"id":"1909967274045227400"}}'
2025-04-09 08:50:58,362 - INFO - [twiiter_bot.py:118] - Created thread tweet 1 with ID 1909967274045227400: 🚀 This transaction is an NFT c...
2025-04-09 08:50:58,362 - DEBUG - [twiiter_bot.py:121] - Creating tweet 2 as reply to 1909967274045227400
2025-04-09 08:50:58,362 - DEBUG - [client.py:77] - Making API request: POST https://api.twitter.com/2/tweets