Longy King lemdaddy commited on
Commit
cbb819c
·
unverified ·
1 Parent(s): 2267d03

Feature/ox swap (#5)

Browse files

* added swap with 0x api

* Refactor

---------

Co-authored-by: Lemuel Okoli <lc_okoli@hotmail.com>

chatxbt-assistant.py CHANGED
@@ -9,6 +9,7 @@ from phi.llm.openai import OpenAIChat
9
  from phi.tools.duckduckgo import DuckDuckGo
10
  from phi.tools.yfinance import YFinanceTools
11
  from src.databases.postgres import sqlalchemy_engine
 
12
  from src.tools.crypto_data_toolkit import CryptoDataTools
13
  from phi.storage.assistant.postgres import PgAssistantStorage
14
  from src.knowledge_bases.combined import knowledge_base
@@ -64,7 +65,7 @@ def start():
64
  # Initialize the assistant
65
  cxbt_assistant = Assistant(
66
  llm=OpenAIChat(model="gpt-4o"),
67
- tools=[CryptoDataTools(), DuckDuckGo(), YFinanceTools(stock_price=True)],
68
  show_tool_calls= is_dev_mode,
69
  markdown=True,
70
  knowledge_base=knowledge_base,
 
9
  from phi.tools.duckduckgo import DuckDuckGo
10
  from phi.tools.yfinance import YFinanceTools
11
  from src.databases.postgres import sqlalchemy_engine
12
+ from src.tools.crypto_swap_toolkit import CryptoSwapTools
13
  from src.tools.crypto_data_toolkit import CryptoDataTools
14
  from phi.storage.assistant.postgres import PgAssistantStorage
15
  from src.knowledge_bases.combined import knowledge_base
 
65
  # Initialize the assistant
66
  cxbt_assistant = Assistant(
67
  llm=OpenAIChat(model="gpt-4o"),
68
+ tools=[CryptoDataTools(), CryptoSwapTools(), DuckDuckGo(), YFinanceTools(stock_price=True)],
69
  show_tool_calls= is_dev_mode,
70
  markdown=True,
71
  knowledge_base=knowledge_base,
dependencies.txt ADDED
@@ -0,0 +1,841 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ async-timeout==4.0.3
2
+ chainlit==1.1.300
3
+ ├── aiofiles [required: >=23.1.0,<24.0.0, installed: 23.2.1]
4
+ ├── asyncer [required: >=0.0.2,<0.0.3, installed: 0.0.2]
5
+ │ └── anyio [required: >=3.4.0,<4.0.0, installed: 3.7.1]
6
+ │ ├── idna [required: >=2.8, installed: 3.7]
7
+ │ └── sniffio [required: >=1.1, installed: 1.3.1]
8
+ ├── click [required: >=8.1.3,<9.0.0, installed: 8.1.7]
9
+ ├── dataclasses-json [required: >=0.5.7,<0.6.0, installed: 0.5.14]
10
+ │ ├── marshmallow [required: >=3.18.0,<4.0.0, installed: 3.21.3]
11
+ │ │ └── packaging [required: >=17.0, installed: 23.2]
12
+ │ └── typing-inspect [required: >=0.4.0,<1, installed: 0.9.0]
13
+ │ ├── mypy-extensions [required: >=0.3.0, installed: 1.0.0]
14
+ │ └── typing_extensions [required: >=3.7.4, installed: 4.12.2]
15
+ ├── fastapi [required: >=0.110.1,<0.111.0, installed: 0.110.3]
16
+ │ ├── pydantic [required: >=1.7.4,<3.0.0,!=2.1.0,!=2.0.1,!=2.0.0,!=1.8.1,!=1.8, installed: 2.7.4]
17
+ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
18
+ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
19
+ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
20
+ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
21
+ │ ├── starlette [required: >=0.37.2,<0.38.0, installed: 0.37.2]
22
+ │ │ └── anyio [required: >=3.4.0,<5, installed: 3.7.1]
23
+ │ │ ├── idna [required: >=2.8, installed: 3.7]
24
+ │ │ └── sniffio [required: >=1.1, installed: 1.3.1]
25
+ │ └── typing_extensions [required: >=4.8.0, installed: 4.12.2]
26
+ ├── filetype [required: >=1.2.0,<2.0.0, installed: 1.2.0]
27
+ ├── httpx [required: >=0.23.0, installed: 0.27.0]
28
+ │ ├── anyio [required: Any, installed: 3.7.1]
29
+ │ │ ├── idna [required: >=2.8, installed: 3.7]
30
+ │ │ └── sniffio [required: >=1.1, installed: 1.3.1]
31
+ │ ├── certifi [required: Any, installed: 2024.6.2]
32
+ │ ├── httpcore [required: ==1.*, installed: 1.0.5]
33
+ │ │ ├── certifi [required: Any, installed: 2024.6.2]
34
+ │ │ └── h11 [required: >=0.13,<0.15, installed: 0.14.0]
35
+ │ ├── idna [required: Any, installed: 3.7]
36
+ │ └── sniffio [required: Any, installed: 1.3.1]
37
+ ├── Lazify [required: >=0.4.0,<0.5.0, installed: 0.4.0]
38
+ ├── literalai [required: ==0.0.604, installed: 0.0.604]
39
+ │ ├── chevron [required: >=0.14.0, installed: 0.14.0]
40
+ │ ├── httpx [required: >=0.23.0, installed: 0.27.0]
41
+ │ │ ├── anyio [required: Any, installed: 3.7.1]
42
+ │ │ │ ├── idna [required: >=2.8, installed: 3.7]
43
+ │ │ │ └── sniffio [required: >=1.1, installed: 1.3.1]
44
+ │ │ ├── certifi [required: Any, installed: 2024.6.2]
45
+ │ │ ├── httpcore [required: ==1.*, installed: 1.0.5]
46
+ │ │ │ ├── certifi [required: Any, installed: 2024.6.2]
47
+ │ │ │ └── h11 [required: >=0.13,<0.15, installed: 0.14.0]
48
+ │ │ ├── idna [required: Any, installed: 3.7]
49
+ │ │ └── sniffio [required: Any, installed: 1.3.1]
50
+ │ ├── packaging [required: >=23.0, installed: 23.2]
51
+ │ └── pydantic [required: >=1,<3, installed: 2.7.4]
52
+ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
53
+ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
54
+ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
55
+ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
56
+ ├── nest-asyncio [required: >=1.5.6,<2.0.0, installed: 1.6.0]
57
+ ├── numpy [required: >=1.26,<2.0, installed: 1.26.4]
58
+ ├── packaging [required: >=23.1,<24.0, installed: 23.2]
59
+ ├── pydantic [required: >=1,<3, installed: 2.7.4]
60
+ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
61
+ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
62
+ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
63
+ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
64
+ ├── PyJWT [required: >=2.8.0,<3.0.0, installed: 2.8.0]
65
+ ├── python-dotenv [required: >=1.0.0,<2.0.0, installed: 1.0.1]
66
+ ├── python-multipart [required: >=0.0.9,<0.0.10, installed: 0.0.9]
67
+ ├── python-socketio [required: >=5.11.0,<6.0.0, installed: 5.11.2]
68
+ │ ├── bidict [required: >=0.21.0, installed: 0.23.1]
69
+ │ └── python-engineio [required: >=4.8.0, installed: 4.9.1]
70
+ │ └── simple-websocket [required: >=0.10.0, installed: 1.0.0]
71
+ │ └── wsproto [required: Any, installed: 1.2.0]
72
+ │ └── h11 [required: >=0.9.0,<1, installed: 0.14.0]
73
+ ├── starlette [required: >=0.37.2,<0.38.0, installed: 0.37.2]
74
+ │ └── anyio [required: >=3.4.0,<5, installed: 3.7.1]
75
+ │ ├── idna [required: >=2.8, installed: 3.7]
76
+ │ └── sniffio [required: >=1.1, installed: 1.3.1]
77
+ ├── syncer [required: >=2.0.3,<3.0.0, installed: 2.0.3]
78
+ ├── tomli [required: >=2.0.1,<3.0.0, installed: 2.0.1]
79
+ ├── uptrace [required: >=1.22.0,<2.0.0, installed: 1.24.0]
80
+ │ ├── opentelemetry-api [required: ~=1.24, installed: 1.25.0]
81
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
82
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
83
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
84
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
85
+ │ ├── opentelemetry-exporter-otlp [required: ~=1.24, installed: 1.25.0]
86
+ │ │ ├── opentelemetry-exporter-otlp-proto-grpc [required: ==1.25.0, installed: 1.25.0]
87
+ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
88
+ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
89
+ │ │ │ ├── googleapis-common-protos [required: ~=1.52, installed: 1.63.1]
90
+ │ │ │ │ └── protobuf [required: >=3.19.5,<6.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=3.20.1,!=3.20.0, installed: 4.25.3]
91
+ │ │ │ ├── grpcio [required: >=1.0.0,<2.0.0, installed: 1.64.1]
92
+ │ │ │ ├── opentelemetry-api [required: ~=1.15, installed: 1.25.0]
93
+ │ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
94
+ │ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
95
+ │ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
96
+ │ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
97
+ │ │ │ ├── opentelemetry-exporter-otlp-proto-common [required: ==1.25.0, installed: 1.25.0]
98
+ │ │ │ │ └── opentelemetry-proto [required: ==1.25.0, installed: 1.25.0]
99
+ │ │ │ │ └── protobuf [required: >=3.19,<5.0, installed: 4.25.3]
100
+ │ │ │ ├── opentelemetry-proto [required: ==1.25.0, installed: 1.25.0]
101
+ │ │ │ │ └── protobuf [required: >=3.19,<5.0, installed: 4.25.3]
102
+ │ │ │ └── opentelemetry-sdk [required: ~=1.25.0, installed: 1.25.0]
103
+ │ │ │ ├── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
104
+ │ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
105
+ │ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
106
+ │ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
107
+ │ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
108
+ │ │ │ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
109
+ │ │ │ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
110
+ │ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
111
+ │ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
112
+ │ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
113
+ │ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
114
+ │ │ │ └── typing_extensions [required: >=3.7.4, installed: 4.12.2]
115
+ │ │ └── opentelemetry-exporter-otlp-proto-http [required: ==1.25.0, installed: 1.25.0]
116
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
117
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
118
+ │ │ ├── googleapis-common-protos [required: ~=1.52, installed: 1.63.1]
119
+ │ │ │ └── protobuf [required: >=3.19.5,<6.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=3.20.1,!=3.20.0, installed: 4.25.3]
120
+ │ │ ├── opentelemetry-api [required: ~=1.15, installed: 1.25.0]
121
+ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
122
+ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
123
+ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
124
+ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
125
+ │ │ ├── opentelemetry-exporter-otlp-proto-common [required: ==1.25.0, installed: 1.25.0]
126
+ │ │ │ └── opentelemetry-proto [required: ==1.25.0, installed: 1.25.0]
127
+ │ │ │ └── protobuf [required: >=3.19,<5.0, installed: 4.25.3]
128
+ │ │ ├── opentelemetry-proto [required: ==1.25.0, installed: 1.25.0]
129
+ │ │ │ └── protobuf [required: >=3.19,<5.0, installed: 4.25.3]
130
+ │ │ ├── opentelemetry-sdk [required: ~=1.25.0, installed: 1.25.0]
131
+ │ │ │ ├── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
132
+ │ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
133
+ │ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
134
+ │ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
135
+ │ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
136
+ │ │ │ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
137
+ │ │ │ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
138
+ │ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
139
+ │ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
140
+ │ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
141
+ │ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
142
+ │ │ │ └── typing_extensions [required: >=3.7.4, installed: 4.12.2]
143
+ │ │ └── requests [required: ~=2.7, installed: 2.32.3]
144
+ │ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
145
+ │ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
146
+ │ │ ├── idna [required: >=2.5,<4, installed: 3.7]
147
+ │ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
148
+ │ ├── opentelemetry-instrumentation [required: ~=0.45b0, installed: 0.46b0]
149
+ │ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
150
+ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
151
+ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
152
+ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
153
+ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
154
+ │ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
155
+ │ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
156
+ │ └── opentelemetry-sdk [required: ~=1.24, installed: 1.25.0]
157
+ │ ├── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
158
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
159
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
160
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
161
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
162
+ │ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
163
+ │ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
164
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
165
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
166
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
167
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
168
+ │ └── typing_extensions [required: >=3.7.4, installed: 4.12.2]
169
+ ├── uvicorn [required: >=0.25.0,<0.26.0, installed: 0.25.0]
170
+ │ ├── click [required: >=7.0, installed: 8.1.7]
171
+ │ └── h11 [required: >=0.8, installed: 0.14.0]
172
+ └── watchfiles [required: >=0.20.0,<0.21.0, installed: 0.20.0]
173
+ └── anyio [required: >=3.0.0, installed: 3.7.1]
174
+ ├── idna [required: >=2.8, installed: 3.7]
175
+ └── sniffio [required: >=1.1, installed: 1.3.1]
176
+ coingecko==0.13
177
+ └── requests [required: Any, installed: 2.32.3]
178
+ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
179
+ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
180
+ ├── idna [required: >=2.5,<4, installed: 3.7]
181
+ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
182
+ duckduckgo_search==6.1.6
183
+ ├── click [required: >=8.1.7, installed: 8.1.7]
184
+ ├── orjson [required: >=3.10.4, installed: 3.10.5]
185
+ └── pyreqwest_impersonate [required: >=0.4.7, installed: 0.4.7]
186
+ exceptiongroup==1.2.1
187
+ langchain-community==0.2.4
188
+ ├── aiohttp [required: >=3.8.3,<4.0.0, installed: 3.9.5]
189
+ │ ├── aiosignal [required: >=1.1.2, installed: 1.3.1]
190
+ │ │ └── frozenlist [required: >=1.1.0, installed: 1.4.1]
191
+ │ ├── attrs [required: >=17.3.0, installed: 23.2.0]
192
+ │ ├── frozenlist [required: >=1.1.1, installed: 1.4.1]
193
+ │ ├── multidict [required: >=4.5,<7.0, installed: 6.0.5]
194
+ │ └── yarl [required: >=1.0,<2.0, installed: 1.9.4]
195
+ │ ├── idna [required: >=2.0, installed: 3.7]
196
+ │ └── multidict [required: >=4.0, installed: 6.0.5]
197
+ ├── dataclasses-json [required: >=0.5.7,<0.7, installed: 0.5.14]
198
+ │ ├── marshmallow [required: >=3.18.0,<4.0.0, installed: 3.21.3]
199
+ │ │ └── packaging [required: >=17.0, installed: 23.2]
200
+ │ └── typing-inspect [required: >=0.4.0,<1, installed: 0.9.0]
201
+ │ ├── mypy-extensions [required: >=0.3.0, installed: 1.0.0]
202
+ │ └── typing_extensions [required: >=3.7.4, installed: 4.12.2]
203
+ ├── langchain [required: >=0.2.0,<0.3.0, installed: 0.2.4]
204
+ │ ├── aiohttp [required: >=3.8.3,<4.0.0, installed: 3.9.5]
205
+ │ │ ├── aiosignal [required: >=1.1.2, installed: 1.3.1]
206
+ │ │ │ └── frozenlist [required: >=1.1.0, installed: 1.4.1]
207
+ │ │ ├── attrs [required: >=17.3.0, installed: 23.2.0]
208
+ │ │ ├── frozenlist [required: >=1.1.1, installed: 1.4.1]
209
+ │ │ ├── multidict [required: >=4.5,<7.0, installed: 6.0.5]
210
+ │ │ └── yarl [required: >=1.0,<2.0, installed: 1.9.4]
211
+ │ │ ├── idna [required: >=2.0, installed: 3.7]
212
+ │ │ └── multidict [required: >=4.0, installed: 6.0.5]
213
+ │ ├── langchain-core [required: >=0.2.6,<0.3.0, installed: 0.2.6]
214
+ │ │ ├── jsonpatch [required: >=1.33,<2.0, installed: 1.33]
215
+ │ │ │ └── jsonpointer [required: >=1.9, installed: 3.0.0]
216
+ │ │ ├── langsmith [required: >=0.1.75,<0.2.0, installed: 0.1.77]
217
+ │ │ │ ├── orjson [required: >=3.9.14,<4.0.0, installed: 3.10.5]
218
+ │ │ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
219
+ │ │ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
220
+ │ │ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
221
+ │ │ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
222
+ │ │ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
223
+ │ │ │ └── requests [required: >=2,<3, installed: 2.32.3]
224
+ │ │ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
225
+ │ │ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
226
+ │ │ │ ├── idna [required: >=2.5,<4, installed: 3.7]
227
+ │ │ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
228
+ │ │ ├── packaging [required: >=23.2,<25, installed: 23.2]
229
+ │ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
230
+ │ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
231
+ │ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
232
+ │ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
233
+ │ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
234
+ │ │ ├── PyYAML [required: >=5.3, installed: 6.0.1]
235
+ │ │ └── tenacity [required: >=8.1.0,<9.0.0, installed: 8.3.0]
236
+ │ ├── langchain-text-splitters [required: >=0.2.0,<0.3.0, installed: 0.2.1]
237
+ │ │ └── langchain-core [required: >=0.2.0,<0.3.0, installed: 0.2.6]
238
+ │ │ ├── jsonpatch [required: >=1.33,<2.0, installed: 1.33]
239
+ │ │ │ └── jsonpointer [required: >=1.9, installed: 3.0.0]
240
+ │ │ ├── langsmith [required: >=0.1.75,<0.2.0, installed: 0.1.77]
241
+ │ │ │ ├── orjson [required: >=3.9.14,<4.0.0, installed: 3.10.5]
242
+ │ │ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
243
+ │ │ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
244
+ │ │ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
245
+ │ │ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
246
+ │ │ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
247
+ │ │ │ └── requests [required: >=2,<3, installed: 2.32.3]
248
+ │ │ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
249
+ │ │ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
250
+ │ │ │ ├── idna [required: >=2.5,<4, installed: 3.7]
251
+ │ │ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
252
+ │ │ ├── packaging [required: >=23.2,<25, installed: 23.2]
253
+ │ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
254
+ │ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
255
+ │ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
256
+ │ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
257
+ │ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
258
+ │ │ ├── PyYAML [required: >=5.3, installed: 6.0.1]
259
+ │ │ └── tenacity [required: >=8.1.0,<9.0.0, installed: 8.3.0]
260
+ │ ├── langsmith [required: >=0.1.17,<0.2.0, installed: 0.1.77]
261
+ │ │ ├── orjson [required: >=3.9.14,<4.0.0, installed: 3.10.5]
262
+ │ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
263
+ │ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
264
+ │ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
265
+ │ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
266
+ │ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
267
+ │ │ └── requests [required: >=2,<3, installed: 2.32.3]
268
+ │ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
269
+ │ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
270
+ │ │ ├── idna [required: >=2.5,<4, installed: 3.7]
271
+ │ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
272
+ │ ├── numpy [required: >=1.26.0,<2.0.0, installed: 1.26.4]
273
+ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
274
+ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
275
+ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
276
+ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
277
+ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
278
+ │ ├── PyYAML [required: >=5.3, installed: 6.0.1]
279
+ │ ├── requests [required: >=2,<3, installed: 2.32.3]
280
+ │ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
281
+ │ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
282
+ │ │ ├── idna [required: >=2.5,<4, installed: 3.7]
283
+ │ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
284
+ │ ├── SQLAlchemy [required: >=1.4,<3, installed: 2.0.30]
285
+ │ │ ├── greenlet [required: !=0.4.17, installed: 3.0.3]
286
+ │ │ └── typing_extensions [required: >=4.6.0, installed: 4.12.2]
287
+ │ └── tenacity [required: >=8.1.0,<9.0.0, installed: 8.3.0]
288
+ ├── langchain-core [required: >=0.2.0,<0.3.0, installed: 0.2.6]
289
+ │ ├── jsonpatch [required: >=1.33,<2.0, installed: 1.33]
290
+ │ │ └── jsonpointer [required: >=1.9, installed: 3.0.0]
291
+ │ ├── langsmith [required: >=0.1.75,<0.2.0, installed: 0.1.77]
292
+ │ │ ├── orjson [required: >=3.9.14,<4.0.0, installed: 3.10.5]
293
+ │ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
294
+ │ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
295
+ │ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
296
+ │ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
297
+ │ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
298
+ │ │ └── requests [required: >=2,<3, installed: 2.32.3]
299
+ │ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
300
+ │ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
301
+ │ │ ├── idna [required: >=2.5,<4, installed: 3.7]
302
+ │ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
303
+ │ ├── packaging [required: >=23.2,<25, installed: 23.2]
304
+ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
305
+ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
306
+ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
307
+ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
308
+ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
309
+ │ ├── PyYAML [required: >=5.3, installed: 6.0.1]
310
+ │ └── tenacity [required: >=8.1.0,<9.0.0, installed: 8.3.0]
311
+ ├── langsmith [required: >=0.1.0,<0.2.0, installed: 0.1.77]
312
+ │ ├── orjson [required: >=3.9.14,<4.0.0, installed: 3.10.5]
313
+ │ ├── pydantic [required: >=1,<3, installed: 2.7.4]
314
+ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
315
+ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
316
+ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
317
+ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
318
+ │ └── requests [required: >=2,<3, installed: 2.32.3]
319
+ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
320
+ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
321
+ │ ├── idna [required: >=2.5,<4, installed: 3.7]
322
+ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
323
+ ├── numpy [required: >=1,<2, installed: 1.26.4]
324
+ ├── PyYAML [required: >=5.3, installed: 6.0.1]
325
+ ├── requests [required: >=2,<3, installed: 2.32.3]
326
+ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
327
+ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
328
+ │ ├── idna [required: >=2.5,<4, installed: 3.7]
329
+ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
330
+ ├── SQLAlchemy [required: >=1.4,<3, installed: 2.0.30]
331
+ │ ├── greenlet [required: !=0.4.17, installed: 3.0.3]
332
+ │ └── typing_extensions [required: >=4.6.0, installed: 4.12.2]
333
+ └── tenacity [required: >=8.1.0,<9.0.0, installed: 8.3.0]
334
+ logfire==0.42.0
335
+ ├── executing [required: >=2.0.1, installed: 2.0.1]
336
+ ├── opentelemetry-exporter-otlp-proto-http [required: >=1.21.0, installed: 1.25.0]
337
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
338
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
339
+ │ ├── googleapis-common-protos [required: ~=1.52, installed: 1.63.1]
340
+ │ │ └── protobuf [required: >=3.19.5,<6.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=3.20.1,!=3.20.0, installed: 4.25.3]
341
+ │ ├── opentelemetry-api [required: ~=1.15, installed: 1.25.0]
342
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
343
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
344
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
345
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
346
+ │ ├── opentelemetry-exporter-otlp-proto-common [required: ==1.25.0, installed: 1.25.0]
347
+ │ │ └── opentelemetry-proto [required: ==1.25.0, installed: 1.25.0]
348
+ │ │ └── protobuf [required: >=3.19,<5.0, installed: 4.25.3]
349
+ │ ├── opentelemetry-proto [required: ==1.25.0, installed: 1.25.0]
350
+ │ │ └── protobuf [required: >=3.19,<5.0, installed: 4.25.3]
351
+ │ ├── opentelemetry-sdk [required: ~=1.25.0, installed: 1.25.0]
352
+ │ │ ├── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
353
+ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
354
+ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
355
+ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
356
+ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
357
+ │ │ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
358
+ │ │ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
359
+ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
360
+ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
361
+ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
362
+ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
363
+ │ │ └── typing_extensions [required: >=3.7.4, installed: 4.12.2]
364
+ │ └── requests [required: ~=2.7, installed: 2.32.3]
365
+ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
366
+ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
367
+ │ ├── idna [required: >=2.5,<4, installed: 3.7]
368
+ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
369
+ ├── opentelemetry-instrumentation [required: >=0.41b0, installed: 0.46b0]
370
+ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
371
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
372
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
373
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
374
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
375
+ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
376
+ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
377
+ ├── opentelemetry-sdk [required: >=1.21.0, installed: 1.25.0]
378
+ │ ├── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
379
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
380
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
381
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
382
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
383
+ │ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
384
+ │ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
385
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
386
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
387
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
388
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
389
+ │ └── typing_extensions [required: >=3.7.4, installed: 4.12.2]
390
+ ├── protobuf [required: >=4.23.4, installed: 4.25.3]
391
+ ├── rich [required: >=13.4.2, installed: 13.7.1]
392
+ │ ├── markdown-it-py [required: >=2.2.0, installed: 3.0.0]
393
+ │ │ └── mdurl [required: ~=0.1, installed: 0.1.2]
394
+ │ └── Pygments [required: >=2.13.0,<3.0.0, installed: 2.18.0]
395
+ └── typing_extensions [required: >=4.1.0, installed: 4.12.2]
396
+ openai==1.34.0
397
+ ├── anyio [required: >=3.5.0,<5, installed: 3.7.1]
398
+ │ ├── idna [required: >=2.8, installed: 3.7]
399
+ │ └── sniffio [required: >=1.1, installed: 1.3.1]
400
+ ├── distro [required: >=1.7.0,<2, installed: 1.9.0]
401
+ ├── httpx [required: >=0.23.0,<1, installed: 0.27.0]
402
+ │ ├── anyio [required: Any, installed: 3.7.1]
403
+ │ │ ├── idna [required: >=2.8, installed: 3.7]
404
+ │ │ └── sniffio [required: >=1.1, installed: 1.3.1]
405
+ │ ├── certifi [required: Any, installed: 2024.6.2]
406
+ │ ├── httpcore [required: ==1.*, installed: 1.0.5]
407
+ │ │ ├── certifi [required: Any, installed: 2024.6.2]
408
+ │ │ └── h11 [required: >=0.13,<0.15, installed: 0.14.0]
409
+ │ ├── idna [required: Any, installed: 3.7]
410
+ │ └── sniffio [required: Any, installed: 1.3.1]
411
+ ├── pydantic [required: >=1.9.0,<3, installed: 2.7.4]
412
+ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
413
+ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
414
+ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
415
+ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
416
+ ├── sniffio [required: Any, installed: 1.3.1]
417
+ ├── tqdm [required: >4, installed: 4.66.4]
418
+ └── typing_extensions [required: >=4.7,<5, installed: 4.12.2]
419
+ opentelemetry-instrumentation-fastapi==0.46b0
420
+ ├── opentelemetry-api [required: ~=1.12, installed: 1.25.0]
421
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
422
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
423
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
424
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
425
+ ├── opentelemetry-instrumentation [required: ==0.46b0, installed: 0.46b0]
426
+ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
427
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
428
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
429
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
430
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
431
+ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
432
+ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
433
+ ├── opentelemetry-instrumentation-asgi [required: ==0.46b0, installed: 0.46b0]
434
+ │ ├── asgiref [required: ~=3.0, installed: 3.8.1]
435
+ │ ├── opentelemetry-api [required: ~=1.12, installed: 1.25.0]
436
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
437
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
438
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
439
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
440
+ │ ├── opentelemetry-instrumentation [required: ==0.46b0, installed: 0.46b0]
441
+ │ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
442
+ │ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
443
+ │ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
444
+ │ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
445
+ │ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
446
+ │ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
447
+ │ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
448
+ │ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
449
+ │ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
450
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
451
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
452
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
453
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
454
+ │ └── opentelemetry-util-http [required: ==0.46b0, installed: 0.46b0]
455
+ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
456
+ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
457
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
458
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
459
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
460
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
461
+ └── opentelemetry-util-http [required: ==0.46b0, installed: 0.46b0]
462
+ opentelemetry-instrumentation-httpx==0.46b0
463
+ ├── opentelemetry-api [required: ~=1.12, installed: 1.25.0]
464
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
465
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
466
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
467
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
468
+ ├── opentelemetry-instrumentation [required: ==0.46b0, installed: 0.46b0]
469
+ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
470
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
471
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
472
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
473
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
474
+ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
475
+ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
476
+ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
477
+ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
478
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
479
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
480
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
481
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
482
+ └── opentelemetry-util-http [required: ==0.46b0, installed: 0.46b0]
483
+ opentelemetry-instrumentation-redis==0.46b0
484
+ ├── opentelemetry-api [required: ~=1.12, installed: 1.25.0]
485
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
486
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
487
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
488
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
489
+ ├── opentelemetry-instrumentation [required: ==0.46b0, installed: 0.46b0]
490
+ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
491
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
492
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
493
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
494
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
495
+ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
496
+ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
497
+ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
498
+ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
499
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
500
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
501
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
502
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
503
+ └── wrapt [required: >=1.12.1, installed: 1.16.0]
504
+ opentelemetry-instrumentation-requests==0.46b0
505
+ ├── opentelemetry-api [required: ~=1.12, installed: 1.25.0]
506
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
507
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
508
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
509
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
510
+ ├── opentelemetry-instrumentation [required: ==0.46b0, installed: 0.46b0]
511
+ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
512
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
513
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
514
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
515
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
516
+ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
517
+ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
518
+ ├── opentelemetry-semantic-conventions [required: ==0.46b0, installed: 0.46b0]
519
+ │ └── opentelemetry-api [required: ==1.25.0, installed: 1.25.0]
520
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
521
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
522
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
523
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
524
+ └── opentelemetry-util-http [required: ==0.46b0, installed: 0.46b0]
525
+ opentelemetry-instrumentation-system-metrics==0.46b0
526
+ ├── opentelemetry-api [required: ~=1.11, installed: 1.25.0]
527
+ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
528
+ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
529
+ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
530
+ │ └── zipp [required: >=0.5, installed: 3.19.2]
531
+ ├── opentelemetry-instrumentation [required: ==0.46b0, installed: 0.46b0]
532
+ │ ├── opentelemetry-api [required: ~=1.4, installed: 1.25.0]
533
+ │ │ ├── Deprecated [required: >=1.2.6, installed: 1.2.14]
534
+ │ │ │ └── wrapt [required: >=1.10,<2, installed: 1.16.0]
535
+ │ │ └── importlib_metadata [required: >=6.0,<=7.1, installed: 7.1.0]
536
+ │ │ └── zipp [required: >=0.5, installed: 3.19.2]
537
+ │ ├── setuptools [required: >=16.0, installed: 70.0.0]
538
+ │ └── wrapt [required: >=1.0.0,<2.0.0, installed: 1.16.0]
539
+ └── psutil [required: ~=5.9, installed: 5.9.8]
540
+ phidata==2.4.20
541
+ ├── GitPython [required: Any, installed: 3.1.43]
542
+ │ └── gitdb [required: >=4.0.1,<5, installed: 4.0.11]
543
+ │ └── smmap [required: >=3.0.1,<6, installed: 5.0.1]
544
+ ├── httpx [required: Any, installed: 0.27.0]
545
+ │ ├── anyio [required: Any, installed: 3.7.1]
546
+ │ │ ├── idna [required: >=2.8, installed: 3.7]
547
+ │ │ └── sniffio [required: >=1.1, installed: 1.3.1]
548
+ │ ├── certifi [required: Any, installed: 2024.6.2]
549
+ │ ├── httpcore [required: ==1.*, installed: 1.0.5]
550
+ │ │ ├── certifi [required: Any, installed: 2024.6.2]
551
+ │ │ └── h11 [required: >=0.13,<0.15, installed: 0.14.0]
552
+ │ ├── idna [required: Any, installed: 3.7]
553
+ │ └── sniffio [required: Any, installed: 1.3.1]
554
+ ├── pydantic [required: Any, installed: 2.7.4]
555
+ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
556
+ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
557
+ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
558
+ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
559
+ ├── pydantic-settings [required: Any, installed: 2.3.3]
560
+ │ ├── pydantic [required: >=2.7.0, installed: 2.7.4]
561
+ │ │ ├── annotated-types [required: >=0.4.0, installed: 0.7.0]
562
+ │ │ ├── pydantic_core [required: ==2.18.4, installed: 2.18.4]
563
+ │ │ │ └── typing_extensions [required: >=4.6.0,!=4.7.0, installed: 4.12.2]
564
+ │ │ └── typing_extensions [required: >=4.6.1, installed: 4.12.2]
565
+ │ └── python-dotenv [required: >=0.21.0, installed: 1.0.1]
566
+ ├── python-dotenv [required: Any, installed: 1.0.1]
567
+ ├── PyYAML [required: Any, installed: 6.0.1]
568
+ ├── rich [required: Any, installed: 13.7.1]
569
+ │ ├── markdown-it-py [required: >=2.2.0, installed: 3.0.0]
570
+ │ │ └── mdurl [required: ~=0.1, installed: 0.1.2]
571
+ │ └── Pygments [required: >=2.13.0,<3.0.0, installed: 2.18.0]
572
+ ├── tomli [required: Any, installed: 2.0.1]
573
+ ├── typer [required: Any, installed: 0.12.3]
574
+ │ ├── click [required: >=8.0.0, installed: 8.1.7]
575
+ │ ├── rich [required: >=10.11.0, installed: 13.7.1]
576
+ │ │ ├── markdown-it-py [required: >=2.2.0, installed: 3.0.0]
577
+ │ │ │ └── mdurl [required: ~=0.1, installed: 0.1.2]
578
+ │ │ └── Pygments [required: >=2.13.0,<3.0.0, installed: 2.18.0]
579
+ │ ├── shellingham [required: >=1.3.0, installed: 1.5.4]
580
+ │ └── typing_extensions [required: >=3.7.4.3, installed: 4.12.2]
581
+ └── typing_extensions [required: Any, installed: 4.12.2]
582
+ pipdeptree==2.22.0
583
+ ├── packaging [required: >=23.1, installed: 23.2]
584
+ └── pip [required: >=23.1.2, installed: 24.0]
585
+ pipreqs==0.5.0
586
+ ├── docopt [required: ==0.6.2, installed: 0.6.2]
587
+ ├── ipython [required: ==8.12.3, installed: 8.12.3]
588
+ │ ├── appnope [required: Any, installed: 0.1.4]
589
+ │ ├── backcall [required: Any, installed: 0.2.0]
590
+ │ ├── decorator [required: Any, installed: 5.1.1]
591
+ │ ├── jedi [required: >=0.16, installed: 0.19.1]
592
+ │ │ └── parso [required: >=0.8.3,<0.9.0, installed: 0.8.4]
593
+ │ ├── matplotlib-inline [required: Any, installed: 0.1.7]
594
+ │ │ └── traitlets [required: Any, installed: 5.14.3]
595
+ │ ├── pexpect [required: >4.3, installed: 4.9.0]
596
+ │ │ └── ptyprocess [required: >=0.5, installed: 0.7.0]
597
+ │ ├── pickleshare [required: Any, installed: 0.7.5]
598
+ │ ├── prompt_toolkit [required: >=3.0.30,<3.1.0,!=3.0.37, installed: 3.0.47]
599
+ │ │ └── wcwidth [required: Any, installed: 0.2.13]
600
+ │ ├── Pygments [required: >=2.4.0, installed: 2.18.0]
601
+ │ ├── stack-data [required: Any, installed: 0.6.3]
602
+ │ │ ├── asttokens [required: >=2.1.0, installed: 2.4.1]
603
+ │ │ │ └── six [required: >=1.12.0, installed: 1.16.0]
604
+ │ │ ├── executing [required: >=1.2.0, installed: 2.0.1]
605
+ │ │ └── pure-eval [required: Any, installed: 0.2.2]
606
+ │ └── traitlets [required: >=5, installed: 5.14.3]
607
+ ├── nbconvert [required: >=7.11.0,<8.0.0, installed: 7.16.4]
608
+ │ ├── beautifulsoup4 [required: Any, installed: 4.12.3]
609
+ │ │ └── soupsieve [required: >1.2, installed: 2.5]
610
+ │ ├── bleach [required: !=5.0.0, installed: 6.1.0]
611
+ │ │ ├── six [required: >=1.9.0, installed: 1.16.0]
612
+ │ │ └── webencodings [required: Any, installed: 0.5.1]
613
+ │ ├── defusedxml [required: Any, installed: 0.7.1]
614
+ │ ├── Jinja2 [required: >=3.0, installed: 3.1.4]
615
+ │ │ └── MarkupSafe [required: >=2.0, installed: 2.1.5]
616
+ │ ├── jupyter_core [required: >=4.7, installed: 5.7.2]
617
+ │ │ ├── platformdirs [required: >=2.5, installed: 4.2.2]
618
+ │ │ └── traitlets [required: >=5.3, installed: 5.14.3]
619
+ │ ├── jupyterlab_pygments [required: Any, installed: 0.3.0]
620
+ │ ├── MarkupSafe [required: >=2.0, installed: 2.1.5]
621
+ │ ├── mistune [required: >=2.0.3,<4, installed: 3.0.2]
622
+ │ ├── nbclient [required: >=0.5.0, installed: 0.10.0]
623
+ │ │ ├── jupyter_client [required: >=6.1.12, installed: 8.6.2]
624
+ │ │ │ ├── jupyter_core [required: >=4.12,!=5.0.*, installed: 5.7.2]
625
+ │ │ │ │ ├── platformdirs [required: >=2.5, installed: 4.2.2]
626
+ │ │ │ │ └── traitlets [required: >=5.3, installed: 5.14.3]
627
+ │ ��� │ ├── python-dateutil [required: >=2.8.2, installed: 2.9.0.post0]
628
+ │ │ │ │ └── six [required: >=1.5, installed: 1.16.0]
629
+ │ │ │ ├── pyzmq [required: >=23.0, installed: 26.0.3]
630
+ │ │ │ ├── tornado [required: >=6.2, installed: 6.4.1]
631
+ │ │ │ └── traitlets [required: >=5.3, installed: 5.14.3]
632
+ │ │ ├── jupyter_core [required: >=4.12,!=5.0.*, installed: 5.7.2]
633
+ │ │ │ ├── platformdirs [required: >=2.5, installed: 4.2.2]
634
+ │ │ │ └── traitlets [required: >=5.3, installed: 5.14.3]
635
+ │ │ ├── nbformat [required: >=5.1, installed: 5.10.4]
636
+ │ │ │ ├── fastjsonschema [required: >=2.15, installed: 2.19.1]
637
+ │ │ │ ├── jsonschema [required: >=2.6, installed: 4.22.0]
638
+ │ │ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
639
+ │ │ │ │ ├── jsonschema-specifications [required: >=2023.03.6, installed: 2023.12.1]
640
+ │ │ │ │ │ └── referencing [required: >=0.31.0, installed: 0.35.1]
641
+ │ │ │ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
642
+ │ │ │ │ │ └── rpds-py [required: >=0.7.0, installed: 0.18.1]
643
+ │ │ │ │ ├── referencing [required: >=0.28.4, installed: 0.35.1]
644
+ │ │ │ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
645
+ │ │ │ │ │ └── rpds-py [required: >=0.7.0, installed: 0.18.1]
646
+ │ │ │ │ └── rpds-py [required: >=0.7.1, installed: 0.18.1]
647
+ │ │ │ ├── jupyter_core [required: >=4.12,!=5.0.*, installed: 5.7.2]
648
+ │ │ │ │ ├── platformdirs [required: >=2.5, installed: 4.2.2]
649
+ │ │ │ │ └── traitlets [required: >=5.3, installed: 5.14.3]
650
+ │ │ │ └── traitlets [required: >=5.1, installed: 5.14.3]
651
+ │ │ └── traitlets [required: >=5.4, installed: 5.14.3]
652
+ │ ├── nbformat [required: >=5.7, installed: 5.10.4]
653
+ │ │ ├── fastjsonschema [required: >=2.15, installed: 2.19.1]
654
+ │ │ ├── jsonschema [required: >=2.6, installed: 4.22.0]
655
+ │ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
656
+ │ │ │ ├── jsonschema-specifications [required: >=2023.03.6, installed: 2023.12.1]
657
+ │ │ │ │ └── referencing [required: >=0.31.0, installed: 0.35.1]
658
+ │ │ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
659
+ │ │ │ │ └── rpds-py [required: >=0.7.0, installed: 0.18.1]
660
+ │ │ │ ├── referencing [required: >=0.28.4, installed: 0.35.1]
661
+ │ │ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
662
+ │ │ │ │ └── rpds-py [required: >=0.7.0, installed: 0.18.1]
663
+ │ │ │ └── rpds-py [required: >=0.7.1, installed: 0.18.1]
664
+ │ │ ├── jupyter_core [required: >=4.12,!=5.0.*, installed: 5.7.2]
665
+ │ │ │ ├── platformdirs [required: >=2.5, installed: 4.2.2]
666
+ │ │ │ └── traitlets [required: >=5.3, installed: 5.14.3]
667
+ │ │ └── traitlets [required: >=5.1, installed: 5.14.3]
668
+ │ ├── packaging [required: Any, installed: 23.2]
669
+ │ ├── pandocfilters [required: >=1.4.1, installed: 1.5.1]
670
+ │ ├── Pygments [required: >=2.4.1, installed: 2.18.0]
671
+ │ ├── tinycss2 [required: Any, installed: 1.3.0]
672
+ │ │ └── webencodings [required: >=0.4, installed: 0.5.1]
673
+ │ └── traitlets [required: >=5.1, installed: 5.14.3]
674
+ └── yarg [required: ==0.1.9, installed: 0.1.9]
675
+ └── requests [required: Any, installed: 2.32.3]
676
+ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
677
+ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
678
+ ├── idna [required: >=2.5,<4, installed: 3.7]
679
+ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
680
+ python-ulid==2.6.0
681
+ redis==5.0.6
682
+ ulid==1.1
683
+ upstash-redis==1.1.0
684
+ ├── aiohttp [required: >=3.8.4,<4.0.0, installed: 3.9.5]
685
+ │ ├── aiosignal [required: >=1.1.2, installed: 1.3.1]
686
+ │ │ └── frozenlist [required: >=1.1.0, installed: 1.4.1]
687
+ │ ├── attrs [required: >=17.3.0, installed: 23.2.0]
688
+ │ ├── frozenlist [required: >=1.1.1, installed: 1.4.1]
689
+ │ ├── multidict [required: >=4.5,<7.0, installed: 6.0.5]
690
+ │ └── yarl [required: >=1.0,<2.0, installed: 1.9.4]
691
+ │ ├── idna [required: >=2.0, installed: 3.7]
692
+ │ └── multidict [required: >=4.0, installed: 6.0.5]
693
+ └── requests [required: >=2.31.0,<3.0.0, installed: 2.32.3]
694
+ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
695
+ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
696
+ ├── idna [required: >=2.5,<4, installed: 3.7]
697
+ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
698
+ web3==6.19.0
699
+ ├── aiohttp [required: >=3.7.4.post0, installed: 3.9.5]
700
+ │ ├── aiosignal [required: >=1.1.2, installed: 1.3.1]
701
+ │ │ └── frozenlist [required: >=1.1.0, installed: 1.4.1]
702
+ │ ├── attrs [required: >=17.3.0, installed: 23.2.0]
703
+ │ ├── frozenlist [required: >=1.1.1, installed: 1.4.1]
704
+ │ ├── multidict [required: >=4.5,<7.0, installed: 6.0.5]
705
+ │ └── yarl [required: >=1.0,<2.0, installed: 1.9.4]
706
+ │ ├── idna [required: >=2.0, installed: 3.7]
707
+ │ └── multidict [required: >=4.0, installed: 6.0.5]
708
+ ├── eth_abi [required: >=4.0.0, installed: 5.1.0]
709
+ │ ├── eth-typing [required: >=3.0.0, installed: 4.3.1]
710
+ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
711
+ │ ├── eth-utils [required: >=2.0.0, installed: 4.1.1]
712
+ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
713
+ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
714
+ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
715
+ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
716
+ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
717
+ │ └── parsimonious [required: >=0.10.0,<0.11.0, installed: 0.10.0]
718
+ │ └── regex [required: >=2022.3.15, installed: 2024.5.15]
719
+ ├── eth-account [required: >=0.8.0,<0.13, installed: 0.11.2]
720
+ │ ├── bitarray [required: >=2.4.0, installed: 2.9.2]
721
+ │ ├── ckzg [required: >=0.4.3, installed: 1.0.2]
722
+ │ ├── eth_abi [required: >=4.0.0-b.2, installed: 5.1.0]
723
+ │ │ ├── eth-typing [required: >=3.0.0, installed: 4.3.1]
724
+ │ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
725
+ │ │ ├── eth-utils [required: >=2.0.0, installed: 4.1.1]
726
+ │ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
727
+ │ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
728
+ │ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
729
+ │ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
730
+ │ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
731
+ │ │ └── parsimonious [required: >=0.10.0,<0.11.0, installed: 0.10.0]
732
+ │ │ └── regex [required: >=2022.3.15, installed: 2024.5.15]
733
+ │ ├── eth-keyfile [required: >=0.6.0, installed: 0.8.1]
734
+ │ │ ├── eth-keys [required: >=0.4.0, installed: 0.5.1]
735
+ │ │ │ ├── eth-typing [required: >=3, installed: 4.3.1]
736
+ │ │ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
737
+ │ │ │ └── eth-utils [required: >=2, installed: 4.1.1]
738
+ │ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
739
+ │ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
740
+ │ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
741
+ │ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
742
+ │ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
743
+ │ │ ├── eth-utils [required: >=2, installed: 4.1.1]
744
+ │ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
745
+ │ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
746
+ │ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
747
+ │ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
748
+ │ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
749
+ │ │ └── pycryptodome [required: >=3.6.6,<4, installed: 3.20.0]
750
+ │ ├── eth-keys [required: >=0.4.0, installed: 0.5.1]
751
+ │ │ ├── eth-typing [required: >=3, installed: 4.3.1]
752
+ │ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
753
+ │ │ └── eth-utils [required: >=2, installed: 4.1.1]
754
+ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
755
+ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
756
+ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
757
+ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
758
+ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
759
+ │ ├── eth-rlp [required: >=0.3.0, installed: 1.0.1]
760
+ │ │ ├── eth-utils [required: >=2.0.0, installed: 4.1.1]
761
+ │ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
762
+ │ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
763
+ │ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
764
+ │ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
765
+ │ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
766
+ │ │ ├── hexbytes [required: >=0.1.0,<1, installed: 0.3.1]
767
+ │ │ └── rlp [required: >=0.6.0, installed: 4.0.1]
768
+ │ │ └─��� eth-utils [required: >=2, installed: 4.1.1]
769
+ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
770
+ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
771
+ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
772
+ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
773
+ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
774
+ │ ├── eth-utils [required: >=2.0.0, installed: 4.1.1]
775
+ │ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
776
+ │ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
777
+ │ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
778
+ │ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
779
+ │ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
780
+ │ ├── hexbytes [required: >=0.1.0,<0.4.0, installed: 0.3.1]
781
+ │ └── rlp [required: >=1.0.0, installed: 4.0.1]
782
+ │ └── eth-utils [required: >=2, installed: 4.1.1]
783
+ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
784
+ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
785
+ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
786
+ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
787
+ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
788
+ ├── eth-hash [required: >=0.5.1, installed: 0.7.0]
789
+ ├── eth-typing [required: >=3.0.0,!=4.2.0, installed: 4.3.1]
790
+ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
791
+ ├── eth-utils [required: >=2.1.0, installed: 4.1.1]
792
+ │ ├── cytoolz [required: >=0.10.1, installed: 0.12.3]
793
+ │ │ └── toolz [required: >=0.8.0, installed: 0.12.1]
794
+ │ ├── eth-hash [required: >=0.3.1, installed: 0.7.0]
795
+ │ └── eth-typing [required: >=3.0.0, installed: 4.3.1]
796
+ │ └── typing_extensions [required: >=4.5.0, installed: 4.12.2]
797
+ ├── hexbytes [required: >=0.1.0,<0.4.0, installed: 0.3.1]
798
+ ├── jsonschema [required: >=4.0.0, installed: 4.22.0]
799
+ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
800
+ │ ├── jsonschema-specifications [required: >=2023.03.6, installed: 2023.12.1]
801
+ │ │ └── referencing [required: >=0.31.0, installed: 0.35.1]
802
+ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
803
+ │ │ └── rpds-py [required: >=0.7.0, installed: 0.18.1]
804
+ │ ├── referencing [required: >=0.28.4, installed: 0.35.1]
805
+ │ │ ├── attrs [required: >=22.2.0, installed: 23.2.0]
806
+ │ │ └── rpds-py [required: >=0.7.0, installed: 0.18.1]
807
+ │ └── rpds-py [required: >=0.7.1, installed: 0.18.1]
808
+ ├── lru-dict [required: >=1.1.6,<1.3.0, installed: 1.2.0]
809
+ ├── protobuf [required: >=4.21.6, installed: 4.25.3]
810
+ ├── pyunormalize [required: >=15.0.0, installed: 15.1.0]
811
+ ├── requests [required: >=2.16.0, installed: 2.32.3]
812
+ │ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
813
+ │ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
814
+ │ ├── idna [required: >=2.5,<4, installed: 3.7]
815
+ │ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
816
+ ├── typing_extensions [required: >=4.0.1, installed: 4.12.2]
817
+ └── websockets [required: >=10.0.0, installed: 12.0]
818
+ yfinance==0.2.40
819
+ ├── beautifulsoup4 [required: >=4.11.1, installed: 4.12.3]
820
+ │ └── soupsieve [required: >1.2, installed: 2.5]
821
+ ├── frozendict [required: >=2.3.4, installed: 2.4.4]
822
+ ├── html5lib [required: >=1.1, installed: 1.1]
823
+ │ ├── six [required: >=1.9, installed: 1.16.0]
824
+ │ └── webencodings [required: Any, installed: 0.5.1]
825
+ ├── lxml [required: >=4.9.1, installed: 5.2.2]
826
+ ├── multitasking [required: >=0.0.7, installed: 0.0.11]
827
+ ├── numpy [required: >=1.16.5, installed: 1.26.4]
828
+ ├── pandas [required: >=1.3.0, installed: 2.2.2]
829
+ │ ├── numpy [required: >=1.26.0, installed: 1.26.4]
830
+ │ ├── python-dateutil [required: >=2.8.2, installed: 2.9.0.post0]
831
+ │ │ └── six [required: >=1.5, installed: 1.16.0]
832
+ │ ├── pytz [required: >=2020.1, installed: 2024.1]
833
+ │ └── tzdata [required: >=2022.7, installed: 2024.1]
834
+ ├── peewee [required: >=3.16.2, installed: 3.17.5]
835
+ ├── platformdirs [required: >=2.0.0, installed: 4.2.2]
836
+ ├── pytz [required: >=2022.5, installed: 2024.1]
837
+ └── requests [required: >=2.31, installed: 2.32.3]
838
+ ├── certifi [required: >=2017.4.17, installed: 2024.6.2]
839
+ ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
840
+ ├── idna [required: >=2.5,<4, installed: 3.7]
841
+ └── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]
requirements.txt CHANGED
@@ -1,10 +1,8 @@
1
- aiobotocore==2.13.0
2
  aiofiles==23.2.1
3
  aiohttp==3.9.5
4
  aioitertools==0.11.0
5
  aiosignal==1.3.1
6
  annotated-types==0.7.0
7
- anthropic==0.28.0
8
  anyio==3.7.1
9
  appdirs==1.4.4
10
  appnope==0.1.4
@@ -16,15 +14,16 @@ attrs==23.2.0
16
  backcall==0.2.0
17
  beautifulsoup4==4.12.3
18
  bidict==0.23.1
 
19
  bleach==6.1.0
20
- boto3==1.34.131
21
- botocore==1.34.131
22
  certifi==2024.6.2
23
  chainlit==1.1.300
24
  charset-normalizer==3.3.2
25
  chevron==0.14.0
 
26
  click==8.1.7
27
  coingecko==0.13
 
28
  dataclasses-json==0.5.14
29
  decorator==5.1.1
30
  defusedxml==0.7.1
@@ -32,11 +31,18 @@ Deprecated==1.2.14
32
  distro==1.9.0
33
  docopt==0.6.2
34
  duckduckgo_search==6.1.6
 
 
 
 
 
 
 
 
35
  exceptiongroup==1.2.1
36
  executing==2.0.1
37
  fastapi==0.110.3
38
  fastjsonschema==2.19.1
39
- filelock==3.15.1
40
  filetype==1.2.0
41
  frozendict==2.4.4
42
  frozenlist==1.4.1
@@ -45,21 +51,19 @@ fs-s3fs==1.1.1
45
  fsspec==2024.6.0
46
  gitdb==4.0.11
47
  GitPython==3.1.43
48
- google_search_results==2.4.2
49
  googleapis-common-protos==1.63.1
50
  greenlet==3.0.3
51
  grpcio==1.64.1
52
  h11==0.14.0
 
53
  html5lib==1.1
54
  httpcore==1.0.5
55
  httpx==0.27.0
56
- huggingface-hub==0.23.3
57
  idna==3.7
58
  importlib_metadata==7.1.0
59
  ipython==8.12.3
60
  jedi==0.19.1
61
  Jinja2==3.1.4
62
- jiter==0.4.2
63
  jmespath==1.0.1
64
  jsonpatch==1.33
65
  jsonpointer==3.0.0
@@ -69,17 +73,14 @@ jupyter_client==8.6.2
69
  jupyter_core==5.7.2
70
  jupyterlab_pygments==0.3.0
71
  langchain==0.2.4
72
- langchain-anthropic==0.1.15
73
  langchain-community==0.2.4
74
  langchain-core==0.2.6
75
- langchain-openai==0.1.8
76
  langchain-text-splitters==0.2.1
77
- langchainhub==0.1.20
78
- langgraph==0.0.68
79
  langsmith==0.1.77
80
  Lazify==0.4.0
81
  literalai==0.0.604
82
  logfire==0.42.0
 
83
  lxml==5.2.2
84
  markdown-it-py==3.0.0
85
  MarkupSafe==2.1.5
@@ -94,7 +95,6 @@ nbclient==0.10.0
94
  nbconvert==7.16.4
95
  nbformat==5.10.4
96
  nest-asyncio==1.6.0
97
- numexpr==2.10.0
98
  numpy==1.26.4
99
  openai==1.34.0
100
  opentelemetry-api==1.25.0
@@ -117,6 +117,7 @@ orjson==3.10.5
117
  packaging==23.2
118
  pandas==2.2.2
119
  pandocfilters==1.5.1
 
120
  parso==0.8.4
121
  peewee==3.17.5
122
  pexpect==4.9.0
@@ -133,12 +134,12 @@ psycopg==3.1.19
133
  psycopg2==2.9.9
134
  ptyprocess==0.7.0
135
  pure-eval==0.2.2
 
136
  pydantic==2.7.4
137
  pydantic-settings==2.3.3
138
  pydantic_core==2.18.4
139
  Pygments==2.18.0
140
  PyJWT==2.8.0
141
- pypeln==0.4.9
142
  pyreqwest_impersonate==0.4.7
143
  python-dateutil==2.9.0.post0
144
  python-dotenv==1.0.1
@@ -147,6 +148,7 @@ python-multipart==0.0.9
147
  python-socketio==5.11.2
148
  python-ulid==2.6.0
149
  pytz==2024.1
 
150
  PyYAML==6.0.1
151
  pyzmq==26.0.3
152
  redis==5.0.6
@@ -154,9 +156,11 @@ referencing==0.35.1
154
  regex==2024.5.15
155
  requests==2.32.3
156
  rich==13.7.1
 
157
  rpds-py==0.18.1
158
  s3fs==2024.6.0
159
  s3transfer==0.10.1
 
160
  shellingham==1.5.4
161
  simple-websocket==1.0.0
162
  six==1.16.0
@@ -166,18 +170,15 @@ soupsieve==2.5
166
  SQLAlchemy==2.0.30
167
  stack-data==0.6.3
168
  starlette==0.37.2
169
- stopit==1.1.2
170
  syncer==2.0.3
171
  tenacity==8.3.0
172
- tiktoken==0.7.0
173
  tinycss2==1.3.0
174
- tokenizers==0.19.1
175
  tomli==2.0.1
 
176
  tornado==6.4.1
177
  tqdm==4.66.4
178
  traitlets==5.14.3
179
  typer==0.12.3
180
- types-requests==2.32.0.20240602
181
  typing-inspect==0.9.0
182
  typing_extensions==4.12.2
183
  tzdata==2024.1
@@ -188,7 +189,9 @@ urllib3==2.2.1
188
  uvicorn==0.25.0
189
  watchfiles==0.20.0
190
  wcwidth==0.2.13
 
191
  webencodings==0.5.1
 
192
  wrapt==1.16.0
193
  wsproto==1.2.0
194
  yarg==0.1.9
 
 
1
  aiofiles==23.2.1
2
  aiohttp==3.9.5
3
  aioitertools==0.11.0
4
  aiosignal==1.3.1
5
  annotated-types==0.7.0
 
6
  anyio==3.7.1
7
  appdirs==1.4.4
8
  appnope==0.1.4
 
14
  backcall==0.2.0
15
  beautifulsoup4==4.12.3
16
  bidict==0.23.1
17
+ bitarray==2.9.2
18
  bleach==6.1.0
 
 
19
  certifi==2024.6.2
20
  chainlit==1.1.300
21
  charset-normalizer==3.3.2
22
  chevron==0.14.0
23
+ ckzg==1.0.2
24
  click==8.1.7
25
  coingecko==0.13
26
+ cytoolz==0.12.3
27
  dataclasses-json==0.5.14
28
  decorator==5.1.1
29
  defusedxml==0.7.1
 
31
  distro==1.9.0
32
  docopt==0.6.2
33
  duckduckgo_search==6.1.6
34
+ eth-account==0.11.2
35
+ eth-hash==0.7.0
36
+ eth-keyfile==0.8.1
37
+ eth-keys==0.5.1
38
+ eth-rlp==1.0.1
39
+ eth-typing==4.3.1
40
+ eth-utils==4.1.1
41
+ eth_abi==5.1.0
42
  exceptiongroup==1.2.1
43
  executing==2.0.1
44
  fastapi==0.110.3
45
  fastjsonschema==2.19.1
 
46
  filetype==1.2.0
47
  frozendict==2.4.4
48
  frozenlist==1.4.1
 
51
  fsspec==2024.6.0
52
  gitdb==4.0.11
53
  GitPython==3.1.43
 
54
  googleapis-common-protos==1.63.1
55
  greenlet==3.0.3
56
  grpcio==1.64.1
57
  h11==0.14.0
58
+ hexbytes==0.3.1
59
  html5lib==1.1
60
  httpcore==1.0.5
61
  httpx==0.27.0
 
62
  idna==3.7
63
  importlib_metadata==7.1.0
64
  ipython==8.12.3
65
  jedi==0.19.1
66
  Jinja2==3.1.4
 
67
  jmespath==1.0.1
68
  jsonpatch==1.33
69
  jsonpointer==3.0.0
 
73
  jupyter_core==5.7.2
74
  jupyterlab_pygments==0.3.0
75
  langchain==0.2.4
 
76
  langchain-community==0.2.4
77
  langchain-core==0.2.6
 
78
  langchain-text-splitters==0.2.1
 
 
79
  langsmith==0.1.77
80
  Lazify==0.4.0
81
  literalai==0.0.604
82
  logfire==0.42.0
83
+ lru-dict==1.2.0
84
  lxml==5.2.2
85
  markdown-it-py==3.0.0
86
  MarkupSafe==2.1.5
 
95
  nbconvert==7.16.4
96
  nbformat==5.10.4
97
  nest-asyncio==1.6.0
 
98
  numpy==1.26.4
99
  openai==1.34.0
100
  opentelemetry-api==1.25.0
 
117
  packaging==23.2
118
  pandas==2.2.2
119
  pandocfilters==1.5.1
120
+ parsimonious==0.10.0
121
  parso==0.8.4
122
  peewee==3.17.5
123
  pexpect==4.9.0
 
134
  psycopg2==2.9.9
135
  ptyprocess==0.7.0
136
  pure-eval==0.2.2
137
+ pycryptodome==3.20.0
138
  pydantic==2.7.4
139
  pydantic-settings==2.3.3
140
  pydantic_core==2.18.4
141
  Pygments==2.18.0
142
  PyJWT==2.8.0
 
143
  pyreqwest_impersonate==0.4.7
144
  python-dateutil==2.9.0.post0
145
  python-dotenv==1.0.1
 
148
  python-socketio==5.11.2
149
  python-ulid==2.6.0
150
  pytz==2024.1
151
+ pyunormalize==15.1.0
152
  PyYAML==6.0.1
153
  pyzmq==26.0.3
154
  redis==5.0.6
 
156
  regex==2024.5.15
157
  requests==2.32.3
158
  rich==13.7.1
159
+ rlp==4.0.1
160
  rpds-py==0.18.1
161
  s3fs==2024.6.0
162
  s3transfer==0.10.1
163
+ setuptools==70.0.0
164
  shellingham==1.5.4
165
  simple-websocket==1.0.0
166
  six==1.16.0
 
170
  SQLAlchemy==2.0.30
171
  stack-data==0.6.3
172
  starlette==0.37.2
 
173
  syncer==2.0.3
174
  tenacity==8.3.0
 
175
  tinycss2==1.3.0
 
176
  tomli==2.0.1
177
+ toolz==0.12.1
178
  tornado==6.4.1
179
  tqdm==4.66.4
180
  traitlets==5.14.3
181
  typer==0.12.3
 
182
  typing-inspect==0.9.0
183
  typing_extensions==4.12.2
184
  tzdata==2024.1
 
189
  uvicorn==0.25.0
190
  watchfiles==0.20.0
191
  wcwidth==0.2.13
192
+ web3==6.19.0
193
  webencodings==0.5.1
194
+ websockets==12.0
195
  wrapt==1.16.0
196
  wsproto==1.2.0
197
  yarg==0.1.9
src/libs/helper_functions.py CHANGED
@@ -1,9 +1,9 @@
1
- import os
2
- import re
3
- import uuid
4
- import hashlib
5
  from ulid import ULID
 
 
 
6
 
 
7
 
8
  def chunk_data(data : list | dict, chunk_size: int):
9
  """
@@ -147,3 +147,17 @@ def store_json_data(data, output_file):
147
  print(f"Data successfully stored in {output_file}")
148
  except Exception as e:
149
  print(f"An error occurred: {e}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from ulid import ULID
2
+ from typing import Dict
3
+ import os, re, uuid, hashlib
4
+ from dotenv import load_dotenv
5
 
6
+ load_dotenv()
7
 
8
  def chunk_data(data : list | dict, chunk_size: int):
9
  """
 
147
  print(f"Data successfully stored in {output_file}")
148
  except Exception as e:
149
  print(f"An error occurred: {e}")
150
+
151
+ def get_headers() -> Dict[str, str]:
152
+ """
153
+ Returns the headers for the requests including the API key.
154
+ """
155
+ return {
156
+ '0x-api-key': f"{os.getenv('OX_API_KEY')}"
157
+ }
158
+
159
+ def get_private_key() -> str:
160
+ """
161
+ Returns a private key.
162
+ """
163
+ return os.getenv('WALLET_PRIVATE_KEY')
src/libs/token_approval_helper.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from web3 import Web3
3
+ from typing import Dict, Any
4
+
5
+ class TokenApprovalHelper:
6
+ def __init__(self, web3: Web3, private_key: str):
7
+ self.web3 = web3
8
+ self.private_key = private_key
9
+
10
+ def approve_token(self, erc20_contract_address: str, exchange_proxy_address: str, sell_amount: str, eth_address: str) -> Dict[str, Any]:
11
+ """
12
+ Approves the 0x Exchange Proxy contract to spend the specified amount of the ERC-20 token.
13
+
14
+ Args:
15
+ erc20_contract_address (str): The address of the ERC-20 token contract.
16
+ exchange_proxy_address (str): The address of the 0x Exchange Proxy contract.
17
+ sell_amount (str): The amount of the token to approve.
18
+ eth_address (str): Your Ethereum address.
19
+
20
+ Returns:
21
+ dict: The transaction receipt of the approval transaction.
22
+
23
+ Example:
24
+ >>> approve_token('0xTokenAddress', '0xProxyAddress', '1000000000000000000', '0xYourAddress')
25
+ """
26
+ erc20_abi = [
27
+ {
28
+ "constant": False,
29
+ "inputs": [
30
+ {
31
+ "name": "_spender",
32
+ "type": "address"
33
+ },
34
+ {
35
+ "name": "_value",
36
+ "type": "uint256"
37
+ }
38
+ ],
39
+ "name": "approve",
40
+ "outputs": [
41
+ {
42
+ "name": "",
43
+ "type": "bool"
44
+ }
45
+ ],
46
+ "type": "function"
47
+ }
48
+ ]
49
+ erc20_contract = self.web3.eth.contract(address=erc20_contract_address, abi=erc20_abi)
50
+ approve_tx = erc20_contract.functions.approve(
51
+ exchange_proxy_address,
52
+ int(sell_amount)
53
+ ).buildTransaction({
54
+ 'from': eth_address,
55
+ 'nonce': self.web3.eth.getTransactionCount(eth_address),
56
+ 'gas': 100000,
57
+ 'gasPrice': self.web3.toWei('20', 'gwei')
58
+ })
59
+ signed_approve_tx = self.web3.eth.account.signTransaction(approve_tx, private_key=self.private_key)
60
+ tx_hash = self.web3.eth.sendRawTransaction(signed_approve_tx.rawTransaction)
61
+ return self.web3.eth.waitForTransactionReceipt(tx_hash)
src/libs/web3.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from web3 import Web3
3
+ from dotenv import load_dotenv
4
+
5
+ load_dotenv()
6
+
7
+ def get_web3_instance(rpc_ulr: str = os.getenv('INFURA_OR_ALCHEMY_URL')) -> Web3:
8
+ return Web3(Web3.HTTPProvider(rpc_ulr))
src/tools/crypto_swap_toolkit.py ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import requests
3
+ from web3 import Web3
4
+ from phi.tools import Toolkit
5
+ from phi.utils.log import logger
6
+ from src.libs.web3 import get_web3_instance
7
+ from src.libs.helper_functions import get_headers, get_private_key
8
+ from src.libs.token_approval_helper import TokenApprovalHelper
9
+
10
+ class CryptoSwapTools(Toolkit):
11
+ def __init__(self, web3: Web3 = get_web3_instance()):
12
+ super().__init__(name="swap_tools")
13
+
14
+ # Store Web3 instance
15
+ self.web3 = web3
16
+
17
+ # Helper for token approval
18
+ self.token_approval_helper = TokenApprovalHelper(web3, get_private_key())
19
+
20
+ # Registering methods to make them accessible via the toolkit
21
+ self.register(self.get_swap_quote)
22
+ self.register(self.get_swap_price)
23
+ self.register(self.get_swap_sources)
24
+ self.register(self.execute_swap)
25
+
26
+ def get_swap_quote(self, buy_token: str, sell_token: str, sell_amount: str) -> str:
27
+ """
28
+ Fetches a swap quote from the 0x Swap API.
29
+
30
+ Args:
31
+ buy_token (str): The token to buy (e.g., 'DAI').
32
+ sell_token (str): The token to sell (e.g., 'ETH').
33
+ sell_amount (str): The amount of the sell token to swap, in the smallest unit (e.g., wei for ETH).
34
+
35
+ Returns:
36
+ dict: A dictionary containing the swap quote details.
37
+
38
+ Example:
39
+ >>> get_swap_quote('DAI', 'ETH', '1000000000000000000')
40
+ """
41
+ logger.info(f"Fetching swap quote: buying {buy_token} with {sell_token} amount {sell_amount}")
42
+ try:
43
+ params = {
44
+ 'buyToken': buy_token,
45
+ 'sellToken': sell_token,
46
+ 'sellAmount': sell_amount
47
+ }
48
+ response = requests.get("https://api.0x.org/swap/v1/quote", params=params, headers=get_headers())
49
+ response.raise_for_status()
50
+ # return response.json()
51
+ return f"{(response.json())}"
52
+ except requests.exceptions.RequestException as e:
53
+ logger.warning(f"Failed to get swap quote: {e}")
54
+ # return {"error": str(e)}
55
+ return f"Error: {e}"
56
+
57
+ def get_swap_price(self, buy_token: str, sell_token: str, buy_amount: str) -> str:
58
+ """
59
+ Fetches the price for a swap from the 0x Swap API.
60
+
61
+ Args:
62
+ buy_token (str): The token to buy.
63
+ sell_token (str): The token to sell.
64
+ buy_amount (str): The amount of the buy token, in the smallest unit.
65
+
66
+ Returns:
67
+ dict: A dictionary containing the swap price details.
68
+
69
+ Example:
70
+ >>> get_swap_price('DAI', 'ETH', '1000000000000000000')
71
+ """
72
+ logger.info(f"Fetching swap price: buying {buy_token} with {sell_token} amount {buy_amount}")
73
+ try:
74
+ params = {
75
+ 'buyToken': buy_token,
76
+ 'sellToken': sell_token,
77
+ 'buyAmount': buy_amount
78
+ }
79
+ response = requests.get("https://api.0x.org/swap/v1/price", params=params, headers=get_headers())
80
+ response.raise_for_status()
81
+ # return response.json()
82
+ return f"{(response.json())}"
83
+ except requests.exceptions.RequestException as e:
84
+ logger.warning(f"Failed to get swap price: {e}")
85
+ # return {"error": str(e)}
86
+ return f"Error: {e}"
87
+
88
+ def get_swap_sources(self) -> str:
89
+ """
90
+ Fetches the list of liquidity sources from the 0x Swap API.
91
+
92
+ Returns:
93
+ dict: A dictionary containing the list of liquidity sources.
94
+
95
+ Example:
96
+ >>> get_swap_sources()
97
+ """
98
+ logger.info("Fetching swap sources")
99
+ try:
100
+ response = requests.get("https://api.0x.org/swap/v1/sources", headers=get_headers())
101
+ response.raise_for_status()
102
+ # return response.json()
103
+ return f"{(response.json())}"
104
+ except requests.exceptions.RequestException as e:
105
+ logger.warning(f"Failed to get swap sources: {e}")
106
+ # return {"error": str(e)}
107
+ return f"Error: {e}"
108
+
109
+ def execute_swap(self, buy_token: str, sell_token: str, sell_amount: str, eth_address: str) -> str:
110
+ """
111
+ Executes a swap using the 0x Swap API.
112
+
113
+ Args:
114
+ buy_token (str): The token to buy (e.g., 'DAI').
115
+ sell_token (str): The token to sell (e.g., 'ETH').
116
+ sell_amount (str): The amount of the sell token to swap, in the smallest unit (e.g., wei for ETH).
117
+ eth_address (str): The Ethereum address of the user executing the swap.
118
+
119
+ Returns:
120
+ dict: The transaction receipt of the swap transaction.
121
+
122
+ Example:
123
+ >>> execute_swap('DAI', 'ETH', '1000000000000000000', '0xYourEthereumAddress')
124
+ """
125
+ # Get the swap quote
126
+ quote = json.loads(self.get_swap_quote(buy_token, sell_token, sell_amount))
127
+ logger.info(f"Swap quote: {quote}")
128
+
129
+ if 'error' in quote:
130
+ # return {"error": "Failed to get swap quote"}
131
+ return f"Error: Failed to get swap quote"
132
+
133
+ # Approve the token if needed (skip if selling ETH)
134
+ if sell_token != 'ETH':
135
+ approval_receipt = self.token_approval_helper.approve_token(sell_token, quote['allowanceTarget'],
136
+ sell_amount, eth_address)
137
+ logger.info(f"Approval receipt: {approval_receipt}")
138
+
139
+ if 'status' not in approval_receipt or approval_receipt['status'] != 1:
140
+ # return {"error": "Token approval failed"}
141
+ return f"Error: Token approval failed"
142
+
143
+ # Execute the swap
144
+ try:
145
+ swap_tx = {
146
+ 'from': eth_address,
147
+ 'to': quote['to'],
148
+ 'data': quote['data'],
149
+ 'value': int(quote['value']),
150
+ 'gas': 200000,
151
+ 'gasPrice': self.web3.to_wei('20', 'gwei'),
152
+ 'nonce': self.web3.eth.get_transaction_count(eth_address)
153
+ }
154
+ signed_swap_tx = self.web3.eth.account.signTransaction(swap_tx, private_key=get_private_key())
155
+ tx_hash = self.web3.eth.send_raw_transaction(signed_swap_tx.rawTransaction)
156
+ receipt = self.web3.eth.wait_for_transaction_receipt(tx_hash)
157
+ logger.info(f"Swap transaction receipt: {receipt}")
158
+ # return receipt
159
+ return f"{(receipt)}"
160
+ except Exception as e:
161
+ logger.warning(f"Failed to execute swap: {e}")
162
+ # return {"error": str(e)}
163
+ return f"Error: {e}"
164
+
165
+
166
+ # Example usage
167
+ if __name__ == "__main__":
168
+ eth_address = '0xYourEthereumAddress' # Replace with your Ethereum address
169
+
170
+ # Initialize Web3
171
+ web3 = Web3(Web3.HTTPProvider('YOUR_INFURA_OR_ALCHEMY_URL'))
172
+
173
+ # Initialize CryptoSwapTools
174
+ swap_tool = CryptoSwapTools(web3)
175
+
176
+ # Fetch and print swap sources
177
+ sources = swap_tool.get_swap_sources()
178
+ print(f"Swap Sources: {sources}")
179
+
180
+ # Execute a swap (example)
181
+ receipt = swap_tool.execute_swap('DAI', 'ETH', '1000000000000000000', eth_address)
182
+ print(f"Swap Transaction Receipt: {receipt}")