LONGYKING commited on
Commit
86a1f4f
·
1 Parent(s): dc8df59
Files changed (18) hide show
  1. .dockerignore +101 -0
  2. .gitignore +163 -0
  3. Dockerfile +34 -0
  4. LICENSE +21 -0
  5. Procfile +1 -0
  6. README.md +86 -5
  7. TODO.md +79 -0
  8. chainlit.md +14 -0
  9. dependencies.txt +841 -0
  10. docker-compose.yml +24 -0
  11. giino-assistant.py +363 -0
  12. lite-llm-config.yaml +15 -0
  13. pip +0 -0
  14. reference.md +23 -0
  15. requirements.bk.txt +104 -0
  16. requirements.txt +221 -0
  17. run.py +37 -0
  18. sample.env +28 -0
.dockerignore ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+
27
+ # PyInstaller
28
+ # Usually these files are written by a python script from a template
29
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
30
+ *.manifest
31
+ *.spec
32
+
33
+ # Installer logs
34
+ pip-log.txt
35
+ pip-delete-this-directory.txt
36
+
37
+ # Unit test / coverage reports
38
+ htmlcov/
39
+ .tox/
40
+ .nox/
41
+ .coverage
42
+ .coverage.*
43
+ .cache
44
+ nosetests.xml
45
+ coverage.xml
46
+ *.cover
47
+ *.py,cover
48
+ .hypothesis/
49
+ .pytest_cache/
50
+ cover/
51
+
52
+ # Jupyter Notebook
53
+ .ipynb_checkpoints
54
+
55
+ # pyenv
56
+ .python-version
57
+
58
+ # pipenv
59
+ .venv
60
+
61
+ # Environments
62
+ .env
63
+ .venv/
64
+ env/
65
+ venv/
66
+ ENV/
67
+ env.bak/
68
+ venv.bak/
69
+
70
+ # Spyder project settings
71
+ .spyderproject
72
+ .spyproject
73
+
74
+ # Rope project settings
75
+ .ropeproject
76
+
77
+ # mkdocs documentation
78
+ /site
79
+
80
+ # mypy
81
+ .mypy_cache/
82
+ .dmypy.json
83
+ dmypy.json
84
+
85
+ # Pyre type checker
86
+ .pyre/
87
+
88
+ # Ignore virtual environments
89
+ venv/
90
+ .venv/
91
+
92
+ env/
93
+ .env/
94
+
95
+ # Ignore Dockerfile and docker-compose.yml if not needed in the image
96
+ Dockerfile
97
+ docker-compose.yml
98
+
99
+ # Ignore temporary files
100
+ *.log
101
+ *.tmp
.gitignore ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
110
+ .pdm.toml
111
+ .pdm-python
112
+ .pdm-build/
113
+
114
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115
+ __pypackages__/
116
+
117
+ # Celery stuff
118
+ celerybeat-schedule
119
+ celerybeat.pid
120
+
121
+ # SageMath parsed files
122
+ *.sage.py
123
+
124
+ # Environments
125
+ .env
126
+ .venv
127
+ env/
128
+ venv/
129
+ ENV/
130
+ env.bak/
131
+ venv.bak/
132
+
133
+ # Spyder project settings
134
+ .spyderproject
135
+ .spyproject
136
+
137
+ # Rope project settings
138
+ .ropeproject
139
+
140
+ # mkdocs documentation
141
+ /site
142
+
143
+ # mypy
144
+ .mypy_cache/
145
+ .dmypy.json
146
+ dmypy.json
147
+
148
+ # Pyre type checker
149
+ .pyre/
150
+
151
+ # pytype static type analyzer
152
+ .pytype/
153
+
154
+ # Cython debug symbols
155
+ cython_debug/
156
+
157
+
158
+ # PyCharm
159
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
160
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
161
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
162
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
163
+ #.idea/
Dockerfile ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use an official Python runtime as a parent image
2
+ FROM python:3.11-slim
3
+
4
+ # Create a user and set permissions
5
+ RUN useradd -m -u 1000 user
6
+
7
+ # Set the working directory in the container
8
+ WORKDIR /app
9
+
10
+ # Install system dependencies
11
+ USER root
12
+ RUN apt-get update && apt-get install -y \
13
+ python3-dev \
14
+ libpq-dev \
15
+ gcc \
16
+ && rm -rf /var/lib/apt/lists/*
17
+
18
+ # Ensure .files directory exists and is writable
19
+ RUN mkdir -p /app/.files && chown -R user:user /app/.files
20
+
21
+ # Switch back to the non-root user
22
+ USER user
23
+
24
+ # Copy the rest of the application code into the container
25
+ COPY --chown=user . .
26
+
27
+ # Install any needed packages specified in requirements.txt
28
+ RUN pip install --no-cache-dir -r requirements.txt
29
+
30
+ # Expose port 8080 to the world outside this container
31
+ EXPOSE 7860
32
+
33
+ # Run chainlit when the container launches
34
+ CMD ["python", "-m", "chainlit", "run", "giino-assistant.py", "-h", "--port", "7860"]
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2024 icodeidea
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
Procfile ADDED
@@ -0,0 +1 @@
 
 
1
+ web: docker-compose up --build
README.md CHANGED
@@ -1,11 +1,92 @@
1
  ---
2
- title: Telzho
3
- emoji: 🔥
4
  colorFrom: blue
5
- colorTo: blue
6
  sdk: docker
 
 
7
  pinned: false
8
- license: mit
9
  ---
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Giino
3
+ emoji: 💬
4
  colorFrom: blue
5
+ colorTo: pink
6
  sdk: docker
7
+ sdk_version: "latest"
8
+ app_file: giino-assistant.py
9
  pinned: false
 
10
  ---
11
 
12
+ # Giino AI Assistant Service
13
+
14
+ AI-powered personal assistant
15
+
16
+ ## Requirements
17
+
18
+ The list below contains all the requirements needed to have a complete developer environment to start working on this project.
19
+ Follow the links to install or update these tools on your machine.
20
+
21
+ 1. [Python 3.12+](https://www.python.org/downloads/release/python-3120/)
22
+ 2. [Pyenv](https://github.com/pyenv/pyenv)
23
+ 3. [Pip Installer](https://pip.pypa.io/en/stable/installation/)
24
+ 4. [Python Venv](https://docs.python.org/3/library/venv.html)
25
+
26
+ ## Installation
27
+
28
+ 1. Clone the repository: `git clone https://github.com/icodeidea/giino-pc-assistant.git`
29
+ 2. Get a copy of the `.env` file from the project manager
30
+ 3. Create a virtual environment: `python -m venv env`
31
+ 4. Activate the virtual environment: `source env/bin/activate`
32
+ 5. Install the dependencies: `pip install -r requirements.txt`
33
+ 6. Run the application: `chainlit run giino-assistant.py -w`
34
+ 7. Open the application in your browser: `http://localhost:8000`
35
+
36
+ ## Project Overview
37
+
38
+ The project is structured as follows:
39
+
40
+ 1. src/data_sources: `a list of data sources that can be used to retrieve data for the AI assistant.`
41
+ 2. src/databases: `a list of databases that can be used to store data for the AI assistant.`
42
+ 3. src/libs: `a list of libraries that can be used to extend the classes and functions servicing the AI assistant.`
43
+ 4. src/llms: `a list of language models powered libs that can be used to power the AI assistant.`
44
+ 5. src/search_services: `a list of search services that can be used to retrieve data for the AI assistant.`
45
+ 6. src/tools: `a list of tools that can be used to extend the functionality of the AI assistant.`
46
+
47
+ ## Guides
48
+
49
+ 1. Follow the development, structure and documentation patterns of the `src/tools` to build custom toolkits
50
+ 2. Follow the development, structure and documentation patterns of the `src/tools` to build classes
51
+ 3. Pay attention to the `constants` variables and `caching` decorators to optimize performance of class functions/methods across the project
52
+ 4. Create new classes in the appropriate folders to maintain an organized codebase and project
53
+ 5. After installing any new package run `` to update the dependency requirements list
54
+ 6. Expose RPC functions for SDKs that do not support python runtime. use [DeepKit](https://deepkit.io/documentation/rpc) and [BunJS](https://bun.sh/) if possible.
55
+
56
+ ## Git Workflow
57
+
58
+ For this project, we will be using a very simple version of the Gitflow workflow. This workflow is designed to manage the development, release, and maintenance of software projects. It provides a clear and structured approach to managing branches, releases, and feature development.
59
+
60
+ ### Feature
61
+
62
+ 1. Create a branch off of main branch: `git checkout -b feature/my-feature`
63
+ 2. Make your changes and commit them: `git commit -m "Add my feature"`
64
+ 3. Push your changes to the remote repository: `git push origin feature/my-feature`
65
+ 4. Open a pull request on GitHub and request a review from a team member.
66
+ 5. Once the pull request is approved, merge it into the main branch.
67
+ 6. Delete the feature branch: `git branch -d feature/my-feature`
68
+ 7. Update your local main branch: `git checkout main && git pull origin main`
69
+
70
+ ### Bugfix
71
+
72
+ 1. For bug fixes, create a branch off of main branch: `git checkout -b bugfix/my-bugfix`
73
+ 2. Make your changes and commit them: `git commit -m "Fix my bug"`
74
+ 3. Push your changes to the remote repository: `git push origin bugfix/my-bugfix`
75
+ 4. Open a pull request on GitHub and request a review from a team member.
76
+ 5. Deploy the bugfix branch to a staging environment for testing.
77
+ 6. Once testing is finished, merge the pull request into the main branch.
78
+ 7. Once the pull request is approved, merge it into the main branch.
79
+ 8. Delete the bugfix branch: `git branch -d bugfix/my-bugfix`
80
+ 9. Update your local main branch: `git checkout main && git pull origin main`
81
+
82
+ ## Deployment to production
83
+
84
+ To be finalised and added
85
+
86
+ ## TODO
87
+
88
+ 1. Add deployment instructions
89
+ 2. Setup CI/CD pipelines for automatic deployment
90
+ 3. Setup and integrate `LiteLLM` instance for LLM service high availability
91
+ 4. Add RPC class for remote method calls to other Giino services written in other languages such as `JS`, `TS` & `GO`
92
+ 5. Write enough unit tests to ensure class and function input and output correctness
TODO.md ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Initial System Efficiency Strategy
2
+ 1. Query generator system
3
+ a. Discovery
4
+ b. Tokens
5
+ 2. Prompt enhancer system
6
+ 3. Typesense instance for (short cached)
7
+ a. user actions similarity and recomendation/suggestion
8
+ b. function path and execution graph search
9
+ c. external data fetches and proactive data fetch
10
+ 4. Function path and execution graph generator class
11
+ 5. Timescale instance for metric measurements and ranking
12
+ a. Function execution time
13
+ b. Gas spend
14
+ c. Integration latency
15
+ d. Prompt -> answer latency
16
+ 6. Proactive cache enrichment based on user activity
17
+ 7. Proactive knowledge graph update based on market activity and user interests
18
+ a. KG pipeline flow
19
+ b. Progressive cache and hot context for llm as flow progresses
20
+ 8. Purchase suggestion engines for users
21
+ 9. Subtle user education to increase chances of purchases
22
+ 10. Interest provoking alerts
23
+ a. Toasts
24
+ b. Email
25
+ c. Highlights
26
+ 11. Short form content generation engine
27
+ a. Giphs
28
+ b. Memes
29
+ c. Short video highlights
30
+ d. Short voice highlights in background as user interacts with system
31
+ e. Short top gainer and looser animations
32
+ 12. User PnL stats animations layerd on system prediction performance
33
+ 13. User pseudo trading system gamified
34
+ 14. Fast and easy stock purchase for boosted assets (LP partners)
35
+ 15. Index system for users (create, manage and adjust) for short term and long term
36
+ 16. User budgeting and financial planning system with scores
37
+ 17. Users global engagment score and leaaderboard system with point awards
38
+ 18. Fundamentaal analysis feature
39
+ 19. Signal and listing alerts
40
+ 20. Copy trading service
41
+ 21. Bot trading service
42
+ 22. Persive-Agressive investor potfolio execution and management service
43
+ 23. Stock trading service
44
+ 24. Utility payments
45
+ 25. Travel service
46
+ a. Cheap flight paths
47
+ b. Esim
48
+ c. Travel expense on crypto
49
+ d. Airtime and data
50
+ e. Vouchers and points
51
+
52
+
53
+ ## Infra
54
+ 1. Async everthing
55
+ 2. CI/CD pipeline
56
+ 3. Strict typed input and output validations
57
+ 4. Debugging logs
58
+ 5. Proper general logging and export to log service
59
+ 6. LLM load balancing and redundancy
60
+ 7. LLM caching
61
+ 8. Local and secure micro LLMs servers (Fly or RunPod)
62
+ 9. Proper backups of all infra resources
63
+ 10. Cloudflare captcha and WAF
64
+ 11. User traffic monitoring and active banning system
65
+ 12. Ofac and sanctions checks
66
+ 13. KYC flows
67
+ 14. KYC check service offering to 3rd party
68
+ 15. V1 SDK realease
69
+ 16. V1 developer contribution campaings
70
+
71
+
72
+ ## Priority
73
+ 1. Host TypeSence or Upstash Redis, Timescale DB, LiteLLM, Ollama, FalkorDB,
74
+ a. compare Fly and Digital Ocean
75
+ 2. Create secret store and integrate
76
+ 3. Create Giino host scalabe hosting (fly or Digital Ocean or RunPod)
77
+ 4. Set alerts for billing and uptime
78
+ 5. Set error alerts and llm investigation
79
+ 6. Add guard rails - https://github.com/NVIDIA/NeMo-Guardrails
chainlit.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Welcome to Chainlit! 🚀🤖
2
+
3
+ Hi there, Developer! 👋 We're excited to have you on board. Chainlit is a powerful tool designed to help you prototype, debug and share applications built on top of LLMs.
4
+
5
+ ## Useful Links 🔗
6
+
7
+ - **Documentation:** Get started with our comprehensive [Chainlit Documentation](https://docs.chainlit.io) 📚
8
+ - **Discord Community:** Join our friendly [Chainlit Discord](https://discord.gg/k73SQ3FyUh) to ask questions, share your projects, and connect with other developers! 💬
9
+
10
+ We can't wait to see what you create with Chainlit! Happy coding! 💻😊
11
+
12
+ ## Welcome screen
13
+
14
+ To modify the welcome screen, edit the `chainlit.md` file at the root of your project. If you do not want a welcome screen, just leave this file empty.
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]
docker-compose.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ services:
2
+ app:
3
+ image: giino-ai-assistant
4
+ build: .
5
+ ports:
6
+ - "7860:7860"
7
+ env_file:
8
+ - .env
9
+ depends_on:
10
+ - db
11
+ # environment:
12
+ # - DATABASE_URL=postgresql://postgres:postgres@db:5432/mydatabase
13
+
14
+ db:
15
+ image: postgres:13
16
+ # environment:
17
+ # POSTGRES_USER: postgres
18
+ # POSTGRES_PASSWORD: postgres
19
+ # POSTGRES_DB: mydatabase
20
+ volumes:
21
+ - postgres_data:/var/lib/postgresql/data
22
+
23
+ volumes:
24
+ postgres_data:
giino-assistant.py ADDED
@@ -0,0 +1,363 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from typing import Optional, Dict
3
+ from dotenv import load_dotenv
4
+ import base64
5
+ import httpx
6
+ load_dotenv()
7
+ from io import BytesIO
8
+ import chainlit as cl
9
+ from chainlit.element import ElementBased
10
+ from phi.assistant import Assistant
11
+ from phi.llm.groq import Groq
12
+ from phi.tools.duckduckgo import DuckDuckGo
13
+ from phi.tools.yfinance import YFinanceTools
14
+ from phi.tools.resend_tools import ResendTools
15
+ from phi.tools.youtube_tools import YouTubeTools
16
+ from phi.tools.file import FileTools
17
+ from src.databases.postgres import sqlalchemy_engine
18
+ from src.tools.user_profile_toolkit import UserProfileToolkit
19
+ from src.tools.notepad_toolkit import NotedPadToolkit
20
+ from src.tools.cloudinary_toolkit import CloudinaryTool
21
+ from phi.storage.assistant.postgres import PgAssistantStorage
22
+ from src.knowledge_bases.combined import knowledge_base
23
+ from groq import AsyncGroq
24
+ from phi.llm.openai import OpenAIChat
25
+ # from phi.embedder.ollama import OllamaEmbedder
26
+
27
+ storage = PgAssistantStorage(
28
+ # stores runs in the ai.assistant_runs table
29
+ table_name="assistant_runs",
30
+ db_engine=sqlalchemy_engine,
31
+ )
32
+
33
+ # cl.instrument_openai()
34
+ client = AsyncGroq()
35
+
36
+ ELEVENLABS_API_KEY = os.environ.get("ELEVENLABS_API_KEY")
37
+ ELEVENLABS_VOICE_ID = os.environ.get("ELEVENLABS_VOICE_ID")
38
+
39
+ if not ELEVENLABS_API_KEY or not ELEVENLABS_VOICE_ID:
40
+ raise ValueError("ELEVENLABS_API_KEY and ELEVENLABS_VOICE_ID must be set")
41
+
42
+
43
+ # Function to encode an image
44
+ def encode_image(image_path):
45
+ with open(image_path, "rb") as image_file:
46
+ return base64.b64encode(image_file.read()).decode("utf-8")
47
+
48
+
49
+ @cl.step(type="tool")
50
+ async def speech_to_text(audio_file):
51
+ response = await client.audio.transcriptions.create(
52
+ model="whisper-large-v3", file=audio_file
53
+ )
54
+
55
+ return response.text
56
+
57
+
58
+ @cl.step(type="tool")
59
+ async def generate_text_answer(transcription, images):
60
+ if images:
61
+ # Only process the first 3 images
62
+ images = images[:3]
63
+
64
+ images_content = [
65
+ {
66
+ "type": "image_url",
67
+ "image_url": {
68
+ "url": f"data:{image.mime};base64,{encode_image(image.path)}"
69
+ },
70
+ }
71
+ for image in images
72
+ ]
73
+
74
+ model = "llama3-70b-8192"
75
+ messages = [
76
+ {
77
+ "role": "user",
78
+ "content": [{"type": "text", "text": transcription}, *images_content],
79
+ }
80
+ ]
81
+ else:
82
+ model = "llama3-70b-8192"
83
+ messages = [{"role": "user", "content": transcription}]
84
+
85
+ response = await client.chat.completions.create(
86
+ messages=messages, model=model, temperature=0.3
87
+ )
88
+
89
+ return response.choices[0].message.content
90
+
91
+
92
+ @cl.step(type="tool")
93
+ async def text_to_speech(text: str, mime_type: str):
94
+ CHUNK_SIZE = 1024
95
+
96
+ url = f"https://api.elevenlabs.io/v1/text-to-speech/{ELEVENLABS_VOICE_ID}"
97
+
98
+ headers = {
99
+ "Accept": mime_type,
100
+ "Content-Type": "application/json",
101
+ "xi-api-key": ELEVENLABS_API_KEY
102
+ }
103
+
104
+ data = {
105
+ "text": text,
106
+ "model_id": "eleven_monolingual_v1",
107
+ "voice_settings": {
108
+ "stability": 0.5,
109
+ "similarity_boost": 0.5
110
+ }
111
+ }
112
+
113
+ async with httpx.AsyncClient(timeout=25.0) as client:
114
+ response = await client.post(url, json=data, headers=headers)
115
+ response.raise_for_status() # Ensure we notice bad responses
116
+
117
+ buffer = BytesIO()
118
+ buffer.name = f"output_audio.{mime_type.split('/')[1]}"
119
+
120
+ async for chunk in response.aiter_bytes(chunk_size=CHUNK_SIZE):
121
+ if chunk:
122
+ buffer.write(chunk)
123
+
124
+ buffer.seek(0)
125
+ return buffer.name, buffer.read()
126
+
127
+ @cl.oauth_callback
128
+ def oauth_callback(
129
+ provider_id: str,
130
+ token: str,
131
+ raw_user_data: Dict[str, str],
132
+ default_user: cl.User,
133
+ ) -> Optional[cl.User]:
134
+ # step-todo: will handle auth from v2 api
135
+ return cl.User(
136
+ identifier=raw_user_data.get('email'),
137
+ email=raw_user_data.get('email'),
138
+ name=raw_user_data.get('name'),
139
+ metadata={**raw_user_data, **({'image':default_user.metadata.get('image')})}
140
+ )
141
+
142
+
143
+ @cl.password_auth_callback
144
+ def auth_callback(username: str, password: str):
145
+ # Fetch the user matching username from your database
146
+ # and compare the hashed password with the value stored in the database
147
+ if (username, password) == ("admin", "admin"):
148
+ user = {
149
+ "identifier": "admin", "email": username, "metadata": {"role": "admin", "provider": "credentials"}
150
+ }
151
+ cl.user_session.set("user_profile", user)
152
+ return cl.User(
153
+ identifier="admin", email=username, metadata={"role": "admin", "provider": "credentials"}
154
+ )
155
+ else:
156
+ return None
157
+
158
+
159
+ @cl.set_starters
160
+ async def set_starters():
161
+ return [
162
+ cl.Starter(
163
+ label="send an email to a friend",
164
+ message="write an email to my friend ",
165
+ icon="/public/wallet-svgrepo-com.svg",
166
+ ),
167
+
168
+ cl.Starter(
169
+ label="Latest News on love world christ embassy",
170
+ message="What news are currentlly trending about christ embassy.",
171
+ icon="/public/news-svgrepo-com.svg",
172
+ ),
173
+ cl.Starter(
174
+ label="Write an article about Love the way of life",
175
+ message="write an article about love the way to life",
176
+ icon="/public/coins-electronics-svgrepo-com.svg",
177
+ ),
178
+ cl.Starter(
179
+ label="Get trending stocks",
180
+ message="Get latest stock",
181
+ icon="/public/stockchart-svgrepo-com.svg",
182
+ )
183
+ ]
184
+
185
+ @cl.on_chat_start
186
+ async def start():
187
+ is_dev_mode = True if os.getenv("DEV_MODE") else False
188
+
189
+ cl.user_session.set(
190
+ "message_history",
191
+ [{"role": "system", "content": "You are a helpful assistant."}],
192
+ )
193
+
194
+ contractCraft = Assistant(
195
+ name="ContractCraft",
196
+ # llm=OpenAIChat(model="gpt-4o"),
197
+ llm=Groq(model="llama3-70b-8192"),
198
+ description="ContractCraft is an AI-powered assistant designed to help you draft any type of contract or agreement efficiently and accurately. Whether you need a lease, employment contract, non-disclosure agreement, or any other legal document, ContractCraft ensures your contracts are comprehensive, legally sound, and tailored to your specific needs.",
199
+ instructions=[
200
+ "1. Input Contract Type: Begin by specifying the type of contract or agreement you need. For example, lease agreement, service contract, non-disclosure agreement, etc.",
201
+ "2. Provide Key Details: Enter essential information such as names of parties involved, specific terms, dates, obligations, and any other relevant details.",
202
+ "3. Customize Clauses: Select from a list of common clauses to include in your contract. You can also customize these clauses or add new ones as necessary.",
203
+ "4. Review and Edit: ContractCraft will generate a draft of your contract. Review the document carefully, and make any necessary edits or adjustments.",
204
+ "5. Legal Compliance Check: The AI will provide suggestions to ensure that your contract complies with relevant laws and regulations.",
205
+ "6. Finalization: Once you are satisfied with the draft, finalize the document. ContractCraft will format it appropriately and prepare it for signing.",
206
+ "7. Download and Share: Download the final contract in your preferred format (e.g., PDF, Word) and share it with the other parties involved."
207
+ ],
208
+ markdown=True,
209
+ debug_mode=True,
210
+ role="Helps draft and review contract agreements.",
211
+ tools=[
212
+ CloudinaryTool(
213
+ cloud_name=os.environ.get("CLOUDINARY_CLOUD_NAME"),
214
+ api_key=os.environ.get("CLOUDINARY_API_KEY"),
215
+ api_secret=os.environ.get("CLOUDINARY_API_SECRET")
216
+ ),
217
+ FileTools()
218
+ ],
219
+ add_datetime_to_instructions=True,
220
+ )
221
+
222
+ # Initialize the assistant
223
+ telzho_assistant = Assistant(
224
+ description="""You are Giinoe, an advanced AI crafted to serve as a personal companion, offering guidance on personal, ideological, philosophical, and spiritual matters.
225
+ Your primary role is to provide counsel that resonates with Pastor Chris Oyakhilome, embodying his character, values, and wisdom.
226
+ With access to a comprehensive knowledge base of his books, sermons, and teachings, you will communicate with users as if you are Pastor Chris himself, providing insightful, empathetic,
227
+ and spiritually enriching advice that reflects his compassionate demeanor and pastoral approach.
228
+
229
+ Additionally, when you detect a key point that requires noting in next conversation you will use a tool called noted_pad_toolkit to keep individual records of key points, especially personal issues shared by users.
230
+ You will update, retrieve, edit, and delete notes as needed, ensuring that each interaction builds on previous conversations.
231
+ This functionality allows you to offer a truly personalized and continuous support experience, akin to a dedicated spiritual therapist, pull up the notes at will when you feel like making reference to an old issues.
232
+
233
+ You will also teach users the word of God using Bible scriptures, offering relevant verses to guide and uplift them.""",
234
+ instructions=[
235
+ "1. Address users by their names to create a sense of familiarity.",
236
+ "2. Take notes of key points, especially personal issues, and remind the user of these in future conversations using a tool called Noted Pad.",
237
+ "3. Actively listen and engage in a way that shows genuine care and empathy.",
238
+ "4. Ask thoughtful questions to gain deeper insights into the user's situation, one at a time, to avoid overwhelming them.",
239
+ "5. Offer prayers or spiritual support at the end of conversations to provide comfort and a sense of closure.",
240
+ "6. Teach users the word of God using Bible scriptures, offering relevant verses to guide and uplift them.",
241
+ "7. don't mention pastor chris oyakhilome, just say what he would say or said as though it's coming from you.",
242
+ ],
243
+ # description="""
244
+ # You are Giinoe, designed to guide the heart and mind on personal, ideological, philosophical, and spiritual issues, emulating the wisdom, compassion, and teachings of Pastor Chris Oyakhilome.
245
+ # You serve as a personal companion, offering guidance and support just like Pastor Chris would, with access to a knowledge base of his books and teachings.
246
+ #
247
+ # Your role is to provide counsel that resonates with Pastor Chris's character and values. You must:
248
+ #
249
+ # Address users by their names to create a sense of familiarity.
250
+ # Take notes of key points, especially personal issues, and remind the user of these in future conversations using a tool called Noted Pad.
251
+ # Actively listen and engage in a way that shows genuine care and empathy.
252
+ # Ask thoughtful questions to gain deeper insights into the user's situation, one at a time, to avoid overwhelming them.
253
+ # Offer prayers or spiritual support at the end of conversations to provide comfort and a sense of closure.
254
+ # Teach users the word of God using Bible scriptures, offering relevant verses to guide and uplift them.
255
+ # """,
256
+ llm=Groq(model="llama3-70b-8192"),
257
+ # llm=OpenAIChat(model="gpt-4o"),
258
+ tools=[
259
+ UserProfileToolkit(),
260
+ NotedPadToolkit(),
261
+ DuckDuckGo(),
262
+ YouTubeTools(),
263
+ YFinanceTools(stock_price=True),
264
+ ResendTools(from_email=os.environ.get("FROM_EMAIL"), api_key=os.environ.get("RESEND_API_KEY")),
265
+ ],
266
+ team=[contractCraft],
267
+ show_tool_calls=is_dev_mode,
268
+ markdown=True,
269
+ knowledge_base=knowledge_base,
270
+ storage=storage,
271
+ search_knowledge=True,
272
+ read_chat_history=True,
273
+ add_references_to_prompt=True,
274
+ add_chat_history_to_prompt=True,
275
+ )
276
+
277
+ # telzho_assistant.knowledge_base.load(recreate=False)
278
+
279
+ # Set the assistant in the user session
280
+ cl.user_session.set("agent", telzho_assistant)
281
+
282
+
283
+ @cl.on_audio_chunk
284
+ async def on_audio_chunk(chunk: cl.AudioChunk):
285
+ if chunk.isStart:
286
+ buffer = BytesIO()
287
+ # This is required for whisper to recognize the file type
288
+ buffer.name = f"input_audio.{chunk.mimeType.split('/')[1]}"
289
+ # Initialize the session for a new audio stream
290
+ cl.user_session.set("audio_buffer", buffer)
291
+ cl.user_session.set("audio_mime_type", chunk.mimeType)
292
+
293
+ # TODO: Use Gladia to transcribe chunks as they arrive would decrease latency
294
+ # see https://docs-v1.gladia.io/reference/live-audio
295
+
296
+ # For now, write the chunks to a buffer and transcribe the whole audio at the end
297
+ cl.user_session.get("audio_buffer").write(chunk.data)
298
+
299
+
300
+ @cl.on_audio_end
301
+ async def on_audio_end(elements: list[ElementBased]):
302
+ # Get the audio buffer from the session
303
+ audio_buffer: BytesIO = cl.user_session.get("audio_buffer")
304
+ audio_buffer.seek(0) # Move the file pointer to the beginning
305
+ audio_file = audio_buffer.read()
306
+ audio_mime_type: str = cl.user_session.get("audio_mime_type")
307
+
308
+ input_audio_el = cl.Audio(
309
+ mime=audio_mime_type, content=audio_file, name=audio_buffer.name
310
+ )
311
+ await cl.Message(
312
+ author="You",
313
+ type="user_message",
314
+ content="",
315
+ elements=[input_audio_el, *elements]
316
+ ).send()
317
+
318
+ whisper_input = (audio_buffer.name, audio_file, audio_mime_type)
319
+ transcription = await speech_to_text(whisper_input)
320
+
321
+ images = [file for file in elements if "image" in file.mime]
322
+
323
+ text_answer = await generate_text_answer(transcription, images)
324
+
325
+ output_name, output_audio = await text_to_speech(text_answer, audio_mime_type)
326
+
327
+ output_audio_el = cl.Audio(
328
+ name=output_name,
329
+ auto_play=True,
330
+ mime=audio_mime_type,
331
+ content=output_audio,
332
+ )
333
+ answer_message = await cl.Message(content="").send()
334
+
335
+ answer_message.elements = [output_audio_el]
336
+ await answer_message.update()
337
+
338
+
339
+ @cl.on_message
340
+ async def main(message: cl.Message):
341
+
342
+ message_history = cl.user_session.get("message_history")
343
+ message_history.append({"role": "user", "content": message.content})
344
+
345
+ msg = cl.Message(content="")
346
+ await msg.send()
347
+
348
+ # Retrieve the assistant from the user sessions
349
+ agent = cl.user_session.get("agent")
350
+
351
+ # Process the user message using the assistant
352
+ for delta in agent.run(message.content, stream=True):
353
+ for part in delta:
354
+ if token := part or "":
355
+ # Send the response back to the user
356
+ await msg.stream_token(token)
357
+
358
+ message_history.append({"role": "assistant", "content": msg.content})
359
+ await msg.update()
360
+
361
+ # Run the Chainlit application
362
+ if __name__ == "__main__":
363
+ cl.run()
lite-llm-config.yaml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_list:
2
+ - model_name: gpt-3.5-turbo # user-facing model alias
3
+ litellm_params: # all params accepted by litellm.completion() - https://docs.litellm.ai/docs/completion/input
4
+ model: azure/<your-deployment-name>
5
+ api_base: <your-azure-api-endpoint>
6
+ api_key: <your-azure-api-key>
7
+ - model_name: gpt-3.5-turbo
8
+ litellm_params:
9
+ model: azure/gpt-turbo-small-ca
10
+ api_base: https://my-endpoint-canada-berri992.openai.azure.com/
11
+ api_key: <your-azure-api-key>
12
+ - model_name: vllm-model
13
+ litellm_params:
14
+ model: openai/<your-model-name>
15
+ api_base: <your-api-base> # e.g. http://0.0.0.0:3000
pip ADDED
File without changes
reference.md ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## py-jsonq
2
+ https://github.com/s1s1ty/py-jsonq
3
+ py-jsonq is a simple, elegant Python package to Query over any type of JSON Data. It'll make your life easier by giving the flavour of an ORM-like query on your JSON.
4
+
5
+ ## JMESPath Python: JSON Query Language
6
+ https://python.land/data-processing/working-with-json/jmespath
7
+
8
+ ## fastapi-cloudevents
9
+ Allows to easily consume and produce CloudEvents over REST API.
10
+ https://pypi.org/project/fastapi-cloudevents/
11
+
12
+ ## Pydantic
13
+ 1. Logfire
14
+ https://pydantic.dev/logfire
15
+ https://pydantic.dev/opensource
16
+ https://docs.pydantic.dev/logfire
17
+ 2. Settings & Config - https://docs.pydantic.dev/latest/concepts/pydantic_settings/
18
+
19
+ ## Dev Tools
20
+ 3. https://docs.astral.sh/ruff/
21
+ 4. https://tox.wiki/en/4.15.1/index.html
22
+ 5. https://black.readthedocs.io/en/stable/
23
+ 6. https://pycqa.github.io/isort/
requirements.bk.txt ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiohttp==3.9.5
2
+ aiosignal==1.3.1
3
+ annotated-types==0.7.0
4
+ anyio==4.4.0
5
+ appnope==0.1.4
6
+ asgiref==3.8.1
7
+ asttokens==2.4.1
8
+ async-timeout==4.0.3
9
+ attrs==23.2.0
10
+ backcall==0.2.0
11
+ beautifulsoup4==4.12.3
12
+ bleach==6.1.0
13
+ certifi==2024.6.2
14
+ charset-normalizer==3.3.2
15
+ coingecko==0.13
16
+ decorator==5.1.1
17
+ defusedxml==0.7.1
18
+ Deprecated==1.2.14
19
+ docopt==0.6.2
20
+ exceptiongroup==1.2.1
21
+ executing==2.0.1
22
+ fastjsonschema==2.19.1
23
+ frozenlist==1.4.1
24
+ googleapis-common-protos==1.63.1
25
+ h11==0.14.0
26
+ httpcore==1.0.5
27
+ httpx==0.27.0
28
+ idna==3.7
29
+ importlib_metadata==7.1.0
30
+ ipython==8.12.3
31
+ jedi==0.19.1
32
+ Jinja2==3.1.4
33
+ jsonschema==4.22.0
34
+ jsonschema-specifications==2023.12.1
35
+ jupyter_client==8.6.2
36
+ jupyter_core==5.7.2
37
+ jupyterlab_pygments==0.3.0
38
+ logfire==0.42.0
39
+ markdown-it-py==3.0.0
40
+ MarkupSafe==2.1.5
41
+ matplotlib-inline==0.1.7
42
+ mdurl==0.1.2
43
+ mistune==3.0.2
44
+ multidict==6.0.5
45
+ nbclient==0.10.0
46
+ nbconvert==7.16.4
47
+ nbformat==5.10.4
48
+ opentelemetry-api==1.25.0
49
+ opentelemetry-exporter-otlp-proto-common==1.25.0
50
+ opentelemetry-exporter-otlp-proto-http==1.25.0
51
+ opentelemetry-instrumentation==0.46b0
52
+ opentelemetry-instrumentation-asgi==0.46b0
53
+ opentelemetry-instrumentation-fastapi==0.46b0
54
+ opentelemetry-instrumentation-httpx==0.46b0
55
+ opentelemetry-instrumentation-redis==0.46b0
56
+ opentelemetry-instrumentation-requests==0.46b0
57
+ opentelemetry-instrumentation-system-metrics==0.46b0
58
+ opentelemetry-proto==1.25.0
59
+ opentelemetry-sdk==1.25.0
60
+ opentelemetry-semantic-conventions==0.46b0
61
+ opentelemetry-util-http==0.46b0
62
+ packaging==24.1
63
+ pandocfilters==1.5.1
64
+ parso==0.8.4
65
+ pexpect==4.9.0
66
+ pickleshare==0.7.5
67
+ pipdeptree==2.22.0
68
+ pipreqs==0.5.0
69
+ platformdirs==4.2.2
70
+ prompt_toolkit==3.0.47
71
+ protobuf==4.25.3
72
+ psutil==5.9.8
73
+ ptyprocess==0.7.0
74
+ pure-eval==0.2.2
75
+ pydantic==2.7.4
76
+ pydantic_core==2.18.4
77
+ Pygments==2.18.0
78
+ python-dateutil==2.9.0.post0
79
+ python-dotenv==1.0.1
80
+ python-ulid==2.6.0
81
+ pyzmq==26.0.3
82
+ redis==5.0.6
83
+ referencing==0.35.1
84
+ requests==2.32.3
85
+ rich==13.7.1
86
+ rpds-py==0.18.1
87
+ six==1.16.0
88
+ sniffio==1.3.1
89
+ soupsieve==2.5
90
+ stack-data==0.6.3
91
+ tinycss2==1.3.0
92
+ tomli==2.0.1
93
+ tornado==6.4.1
94
+ traitlets==5.14.3
95
+ typing_extensions==4.12.2
96
+ ulid==1.1
97
+ upstash-redis==1.1.0
98
+ urllib3==2.2.1
99
+ wcwidth==0.2.13
100
+ webencodings==0.5.1
101
+ wrapt==1.16.0
102
+ yarg==0.1.9
103
+ yarl==1.9.4
104
+ zipp==3.19.2
requirements.txt ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
11
+ asgiref==3.8.1
12
+ asttokens==2.4.1
13
+ async-timeout==4.0.3
14
+ asyncer==0.0.2
15
+ attrs==23.2.0
16
+ backcall==0.2.0
17
+ baize==0.20.8
18
+ beautifulsoup4==4.12.3
19
+ bidict==0.23.1
20
+ bitarray==2.9.2
21
+ bleach==6.1.0
22
+ boto3==1.34.106
23
+ botocore==1.34.106
24
+ certifi==2024.6.2
25
+ chainlit==1.1.300
26
+ charset-normalizer==3.3.2
27
+ psycopg2-binary==2.9.9
28
+ chevron==0.14.0
29
+ ckzg==1.0.2
30
+ click==8.1.7
31
+ coingecko==0.13
32
+ cytoolz==0.12.3
33
+ dataclasses-json==0.5.14
34
+ decorator==5.1.1
35
+ defusedxml==0.7.1
36
+ Deprecated==1.2.14
37
+ distro==1.9.0
38
+ docopt==0.6.2
39
+ duckduckgo_search==6.1.6
40
+ eth-account==0.11.2
41
+ eth-hash==0.7.0
42
+ eth-keyfile==0.8.1
43
+ eth-keys==0.5.1
44
+ eth-rlp==1.0.1
45
+ eth-typing==4.3.1
46
+ eth-utils==4.1.1
47
+ eth_abi==5.1.0
48
+ exceptiongroup==1.2.1
49
+ executing==2.0.1
50
+ fastapi>=0.110.1,<0.111.0
51
+ fastjsonschema==2.19.1
52
+ filelock==3.15.1
53
+ filetype==1.2.0
54
+ frozendict==2.4.4
55
+ frozenlist==1.4.1
56
+ fs==2.4.16
57
+ fs-s3fs==1.1.1
58
+ fsspec==2024.6.0
59
+ gitdb==4.0.11
60
+ GitPython==3.1.43
61
+ google_search_results==2.4.2
62
+ googleapis-common-protos==1.63.1
63
+ greenlet==3.0.3
64
+ grpcio==1.64.1
65
+ h11==0.14.0
66
+ hexbytes==0.3.1
67
+ html5lib==1.1
68
+ httpcore==1.0.5
69
+ httpx==0.27.0
70
+ huggingface-hub==0.23.3
71
+ idna==3.7
72
+ importlib_metadata==7.1.0
73
+ ipython==8.12.3
74
+ jedi==0.19.1
75
+ Jinja2==3.1.4
76
+ jiter==0.4.2
77
+ jmespath==1.0.1
78
+ jsonpatch==1.33
79
+ jsonpointer==3.0.0
80
+ jsonschema==4.22.0
81
+ jsonschema-specifications==2023.12.1
82
+ jupyter_client==8.6.2
83
+ jupyter_core==5.7.2
84
+ jupyterlab_pygments==0.3.0
85
+ langchain==0.2.4
86
+ langchain-anthropic==0.1.15
87
+ langchain-community==0.2.4
88
+ langchain-core==0.2.6
89
+ langchain-openai==0.1.8
90
+ langchain-text-splitters==0.2.1
91
+ langchainhub==0.1.20
92
+ langgraph==0.0.68
93
+ langsmith==0.1.77
94
+ Lazify==0.4.0
95
+ literalai==0.0.604
96
+ logfire==0.42.0
97
+ lru-dict==1.2.0
98
+ lxml==5.2.2
99
+ markdown-it-py==3.0.0
100
+ MarkupSafe==2.1.5
101
+ marshmallow==3.21.3
102
+ matplotlib-inline==0.1.7
103
+ mdurl==0.1.2
104
+ mistune==3.0.2
105
+ multidict==6.0.5
106
+ multitasking==0.0.11
107
+ mypy-extensions==1.0.0
108
+ nbclient==0.10.0
109
+ nbconvert==7.16.4
110
+ nbformat==5.10.4
111
+ nest-asyncio==1.6.0
112
+ numexpr==2.10.0
113
+ numpy==1.26.4
114
+ openai==1.34.0
115
+ opentelemetry-api==1.25.0
116
+ opentelemetry-exporter-otlp==1.25.0
117
+ opentelemetry-exporter-otlp-proto-common==1.25.0
118
+ opentelemetry-exporter-otlp-proto-grpc==1.25.0
119
+ opentelemetry-exporter-otlp-proto-http==1.25.0
120
+ opentelemetry-instrumentation==0.46b0
121
+ opentelemetry-instrumentation-asgi==0.46b0
122
+ opentelemetry-instrumentation-fastapi==0.46b0
123
+ opentelemetry-instrumentation-httpx==0.46b0
124
+ opentelemetry-instrumentation-redis==0.46b0
125
+ opentelemetry-instrumentation-requests==0.46b0
126
+ opentelemetry-instrumentation-system-metrics==0.46b0
127
+ opentelemetry-proto==1.25.0
128
+ opentelemetry-sdk==1.25.0
129
+ opentelemetry-semantic-conventions==0.46b0
130
+ opentelemetry-util-http==0.46b0
131
+ orjson==3.10.5
132
+ packaging==23.2
133
+ pandas==2.2.2
134
+ pandocfilters==1.5.1
135
+ parsimonious==0.10.0
136
+ parso==0.8.4
137
+ peewee==3.17.5
138
+ pexpect==4.9.0
139
+ pgvector==0.2.5
140
+ phidata==2.4.27
141
+ pickleshare==0.7.5
142
+ pipdeptree==2.22.0
143
+ pipreqs==0.5.0
144
+ platformdirs==4.2.2
145
+ prompt_toolkit==3.0.47
146
+ protobuf==4.25.3
147
+ psutil==5.9.8
148
+ psycopg==3.1.19
149
+ psycopg2==2.9.9
150
+ ptyprocess==0.7.0
151
+ pure-eval==0.2.2
152
+ pycryptodome==3.20.0
153
+ pydantic==2.7.4
154
+ pydantic-settings==2.3.3
155
+ pydantic_core==2.18.4
156
+ Pygments==2.18.0
157
+ PyJWT==2.8.0
158
+ pypeln==0.4.9
159
+ pyreqwest_impersonate==0.4.7
160
+ python-dateutil==2.9.0.post0
161
+ python-dotenv==1.0.1
162
+ python-engineio==4.9.1
163
+ python-multipart==0.0.9
164
+ python-socketio==5.11.2
165
+ python-ulid==2.6.0
166
+ pytz==2024.1
167
+ pyunormalize==15.1.0
168
+ PyYAML==6.0.1
169
+ pyzmq==26.0.3
170
+ redis==5.0.6
171
+ referencing==0.35.1
172
+ regex==2024.5.15
173
+ requests==2.32.3
174
+ rich==13.7.1
175
+ rlp==4.0.1
176
+ rpc.py==0.6.0
177
+ rpds-py==0.18.1
178
+ s3fs==2024.6.0
179
+ s3transfer==0.10.1
180
+ shellingham==1.5.4
181
+ simple-websocket==1.0.0
182
+ six==1.16.0
183
+ smmap==5.0.1
184
+ sniffio==1.3.1
185
+ soupsieve==2.5
186
+ SQLAlchemy==2.0.30
187
+ stack-data==0.6.3
188
+ starlette==0.37.2
189
+ stopit==1.1.2
190
+ syncer==2.0.3
191
+ tenacity==8.3.0
192
+ tiktoken==0.7.0
193
+ tinycss2==1.3.0
194
+ tokenizers==0.19.1
195
+ tomli==2.0.1
196
+ toolz==0.12.1
197
+ tornado==6.4.1
198
+ tqdm==4.66.4
199
+ traitlets==5.14.3
200
+ typer==0.12.3
201
+ types-requests==2.32.0.20240602
202
+ typing-inspect==0.9.0
203
+ typing_extensions==4.12.2
204
+ tzdata==2024.1
205
+ ulid==1.1
206
+ upstash-redis==1.1.0
207
+ uptrace==1.24.0
208
+ urllib3==2.2.1
209
+ uvicorn==0.25.0
210
+ watchfiles==0.20.0
211
+ wcwidth==0.2.13
212
+ web3==6.19.0
213
+ webencodings==0.5.1
214
+ websockets==12.0
215
+ wrapt==1.16.0
216
+ wsproto==1.2.0
217
+ yarg==0.1.9
218
+ yarl==1.9.4
219
+ yfinance==0.2.40
220
+ zipp==3.19.2
221
+ ollama==0.3.0
run.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import pprint
3
+ import httpx
4
+ import asyncio
5
+
6
+ # # import src.knowledge_bases.pipeline as Pipeline
7
+
8
+ # # asyncio.run(Pipeline.main())
9
+
10
+ # from src.data_sources.coin_gecko import CoinGecko
11
+ # from src.data_sources.cryptocompare import CryptoCompare
12
+
13
+ # cgc = CoinGecko()
14
+
15
+ # pprint.pprint(cgc.get_trending_coin_list())
16
+
17
+
18
+ from src.libs.rpc_client import rpc_call
19
+
20
+ # response = rpc_call(method_name="getSwapSources")
21
+
22
+ async def main():
23
+ method_name = 'getSwapSources'
24
+
25
+ try:
26
+ response = await rpc_call(method_name)
27
+ if response is not None:
28
+ print("RPC call successful!")
29
+ print(response)
30
+ else:
31
+ print("RPC call failed.")
32
+ except httpx.RequestError as e:
33
+ print(f"Error in main function: {e}")
34
+
35
+ asyncio.run(main())
36
+ # web: docker-compose up --build
37
+ # web: python -m chainlit run giino-assistant.py -h --port 8080
sample.env ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ OPENAI_API_KEY=""
2
+
3
+ GROQ_API_KEY=""
4
+
5
+ LANGCHAIN_TRACING_V2=""
6
+ LANGCHAIN_ENDPOINT=""
7
+ LANGCHAIN_API_KEY=""
8
+
9
+ JINA_READER_API_KEY=""
10
+
11
+ EXA_API_KEY=""
12
+
13
+ SERPAPI_API_KEY=""
14
+
15
+ CRYPTOCOMPARE_API_KEY=""
16
+
17
+ COINGECKO_PRO_API_KEY=""
18
+ COINGECKO_DEMO_API_KEY=""
19
+
20
+ UPSTASH_REDIS_REST_URL=""
21
+ UPSTASH_REDIS_REST_TOKEN=""
22
+ UPSTASH_REDIS_HOST=""
23
+ UPSTASH_REDIS_PORT=""
24
+ UPSTASH_REDIS_PASSWORD=""
25
+ UPSTASH_REDIS_CONNECTION_STRING=""
26
+
27
+ LOGFIRE_TOKEN=""
28
+ LOG_LEVEL=""