ai-parrot 0.5.10__tar.gz → 0.5.12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ai-parrot might be problematic. Click here for more details.
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/PKG-INFO +1 -1
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/__pycache__/version.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/abstract.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/chatbot.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/abstract.py +6 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/chatbot.py +3 -0
- ai_parrot-0.5.12/parrot/bots/retrievals/__pycache__/multi.cpython-311.pyc +0 -0
- ai_parrot-0.5.12/parrot/bots/retrievals/multi.py +123 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/abstract.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/version.py +1 -1
- ai_parrot-0.5.10/parrot/bots/retrievals/__pycache__/multi.cpython-311.pyc +0 -0
- ai_parrot-0.5.10/parrot/bots/retrievals/multi.py +0 -102
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/.flake8 +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/.github/dependabot.yml +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/.github/workflows/codeql-analysis.yml +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/.github/workflows/release.yml +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/.gitignore +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/.isort.cfg +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/.pylintrc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/INSTALL +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/LICENSE +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/MANIFEST.in +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/Makefile +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/README.md +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/SECURITY.md +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/ai_parrot.egg-info/SOURCES.txt +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/app.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/mypy.ini +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/__pycache__/conf.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/__pycache__/manager.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/__pycache__/models.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/a.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/agent.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/askbrett.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/asktroc.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/base.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/basic.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/bose.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/cody.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/copilot.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/dataframe.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/hragents.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/hrbot.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/oddie.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/odoo.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/__pycache__/troc.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/agent.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/basic.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/bose.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/cody.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/copilot.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/dataframe.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/hrbot.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/interfaces/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/interfaces/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/interfaces/__pycache__/retrievers.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/interfaces/retrievers.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/odoo.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/prompts/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/prompts/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/prompts/__pycache__/agents.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/prompts/agents.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/retrievals/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/retrievals/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/retrievals/constitutional.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/retrievals/retrieval.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/troc.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/conf.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/bing.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/config.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/duckgo.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/file.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/google.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/md2pdf.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/rag.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/url.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/weather.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/bing.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/config.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/duckgo.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/file.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/google.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/gtrends.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/md2pdf.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/rag.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/search.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/url.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/exceptions.c +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/exceptions.cpython-311-x86_64-linux-gnu.so +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/exceptions.pxd +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/exceptions.pyx +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/handlers/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/handlers/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/handlers/__pycache__/bots.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/handlers/__pycache__/chat.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/handlers/bots.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/handlers/chat.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/__pycache__/database.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/__pycache__/http.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/database.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/http.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/abstract.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/anthropic.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/google.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/groq.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/hf.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/openai.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/pipes.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/__pycache__/vertex.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/abstract.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/anthropic.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/google.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/groq.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/hf.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/openai.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/pipes.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/llms/vertex.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/manager.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/models.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/py.typed +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/base.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/chroma.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/duck.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/empty.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/faiss.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/milvus.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/postgres.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/__pycache__/qdrant.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/abstract.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/chroma.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/duck.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/abstract.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/base.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/huggingface.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/transformers.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/abstract.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/base.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/bge.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/fastembed.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/google.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/huggingface.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/ollama.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/openai.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/transformers.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/vertexai.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/empty.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/faiss.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/milvus.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/postgres.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/qdrant.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/abstract.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/asknews.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/basic.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/bby.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/bing.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/duck.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/execute.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/google.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/stack.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/weather.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/wikipedia.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/__pycache__/zipcode.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/abstract.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/asknews.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/basic.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/bby.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/bing.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/duck.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/execute.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/google.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/stack.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/weather.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/wikipedia.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/tools/zipcode.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/__pycache__/toml.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/parsers/__init__.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/parsers/__pycache__/__init__.cpython-311.pyc +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/parsers/toml.c +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/parsers/toml.cpython-311-x86_64-linux-gnu.so +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/parsers/toml.pyx +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/toml.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/types.cpp +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/types.cpython-311-x86_64-linux-gnu.so +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/types.pyx +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/uv.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/pyproject.toml +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/pytest.ini +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/requirements/requirements-dev.txt +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/run.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/setup.cfg +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/setup.py +0 -0
- {ai_parrot-0.5.10 → ai_parrot-0.5.12}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: ai-parrot
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.12
|
|
4
4
|
Summary: Live Chatbots based on Langchain chatbots and Agents Integrated into Navigator Framework or used into any aiohttp applications.
|
|
5
5
|
Home-page: https://github.com/phenobarbital/ai-parrot
|
|
6
6
|
Author: Jesus Lara
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -466,6 +466,7 @@ class AbstractBot(DBInterface, ABC):
|
|
|
466
466
|
|
|
467
467
|
def configure_store(self, **kwargs):
|
|
468
468
|
# TODO: Implement VectorStore Configuration
|
|
469
|
+
print('SELF > ', self._vector_store)
|
|
469
470
|
if isinstance(self._vector_store, list):
|
|
470
471
|
# Is a list of vector stores instances:
|
|
471
472
|
for st in self._vector_store:
|
|
@@ -476,6 +477,7 @@ class AbstractBot(DBInterface, ABC):
|
|
|
476
477
|
except ImportError:
|
|
477
478
|
continue
|
|
478
479
|
elif isinstance(self._vector_store, dict):
|
|
480
|
+
print('< ENTERING HERE > ', )
|
|
479
481
|
# Is a single vector store instance:
|
|
480
482
|
store_cls = self._get_database_store(self._vector_store)
|
|
481
483
|
store_cls.use_database = self._use_vector
|
|
@@ -487,6 +489,10 @@ class AbstractBot(DBInterface, ABC):
|
|
|
487
489
|
self.logger.info(f"Configured Vector Stores: {self.stores}")
|
|
488
490
|
if self.stores:
|
|
489
491
|
self.store = self.stores[0]
|
|
492
|
+
print('=================================')
|
|
493
|
+
print('END STORES >> ', self.stores, self.store)
|
|
494
|
+
print('=================================')
|
|
495
|
+
|
|
490
496
|
|
|
491
497
|
def get_memory(
|
|
492
498
|
self,
|
|
@@ -244,6 +244,9 @@ class Chatbot(AbstractBot):
|
|
|
244
244
|
vector_db = database.pop('vector_database', None)
|
|
245
245
|
# configure vector database:
|
|
246
246
|
if vector_db:
|
|
247
|
+
# Initialize the store:
|
|
248
|
+
self.stores = []
|
|
249
|
+
self.store = None
|
|
247
250
|
self._use_vector = vector_store
|
|
248
251
|
self._vector_store = database
|
|
249
252
|
self.configure_store()
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from typing import List, Dict, Any, Optional
|
|
2
|
+
from collections.abc import Callable
|
|
3
|
+
from langchain_core.retrievers import BaseRetriever
|
|
4
|
+
from langchain_core.callbacks import CallbackManagerForRetrieverRun
|
|
5
|
+
from langchain_core.documents import Document
|
|
6
|
+
from pydantic import Field
|
|
7
|
+
|
|
8
|
+
class MultiVectorStoreRetriever(BaseRetriever):
|
|
9
|
+
"""
|
|
10
|
+
This aggregator retriever queries multiple vector stores
|
|
11
|
+
and merges the results into a single list.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# Define class attributes with default values
|
|
15
|
+
stores: List[Any] = Field(description="List of vector stores that provide an as_retriever() method")
|
|
16
|
+
search_kwargs: Dict[str, Any] = Field(default_factory=dict, description="Dict to pass to each store's retrieve method (like 'k' for top_k)")
|
|
17
|
+
chain_type: str = Field(default="stuff", description="Chain type for the retriever")
|
|
18
|
+
search_type: str = Field(default="similarity", description="Search type (similarity, mmr)")
|
|
19
|
+
metric_type: str = Field(default="COSINE", description="Similarity metric (COSINE, EUCLIDEAN, DOT_PRODUCT)")
|
|
20
|
+
|
|
21
|
+
class Config:
|
|
22
|
+
"""Configuration for this pydantic object."""
|
|
23
|
+
arbitrary_types_allowed = True
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
stores: List[Any],
|
|
28
|
+
metric_type: str = 'COSINE',
|
|
29
|
+
chain_type: str = 'stuff',
|
|
30
|
+
search_type: str = 'similarity',
|
|
31
|
+
search_kwargs: Optional[Dict[str, Any]] = None,
|
|
32
|
+
**kwargs
|
|
33
|
+
):
|
|
34
|
+
"""
|
|
35
|
+
Initialize the MultiVectorStoreRetriever.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
stores: List of vector stores that provide an as_retriever() method
|
|
39
|
+
metric_type: Similarity metric (COSINE, EUCLIDEAN, DOT_PRODUCT)
|
|
40
|
+
chain_type: Chain type for the retriever
|
|
41
|
+
search_type: Search type (similarity, mmr)
|
|
42
|
+
search_kwargs: Dict to pass to each store's retrieve method (like 'k' for top_k)
|
|
43
|
+
"""
|
|
44
|
+
# Initialize with default values
|
|
45
|
+
search_kwargs = search_kwargs or {}
|
|
46
|
+
|
|
47
|
+
# Call super().__init__ with all properties
|
|
48
|
+
super().__init__(
|
|
49
|
+
stores=stores,
|
|
50
|
+
search_kwargs=search_kwargs,
|
|
51
|
+
chain_type=chain_type,
|
|
52
|
+
search_type=search_type,
|
|
53
|
+
metric_type=metric_type,
|
|
54
|
+
**kwargs
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
def _get_relevant_documents(
|
|
58
|
+
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
|
|
59
|
+
) -> List[Document]:
|
|
60
|
+
"""
|
|
61
|
+
Get documents relevant to the query.
|
|
62
|
+
Implements the required method from BaseRetriever.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
query: Query string
|
|
66
|
+
run_manager: CallbackManager for the run
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
List of relevant documents
|
|
70
|
+
"""
|
|
71
|
+
all_results = []
|
|
72
|
+
for store in self.stores:
|
|
73
|
+
try:
|
|
74
|
+
retriever = store.as_retriever(
|
|
75
|
+
search_type=self.search_type,
|
|
76
|
+
search_kwargs=self.search_kwargs,
|
|
77
|
+
)
|
|
78
|
+
# Pass the run_manager to the sub-retrievers if they support it
|
|
79
|
+
if hasattr(retriever, "_get_relevant_documents"):
|
|
80
|
+
callback_manager = run_manager.get_child()
|
|
81
|
+
docs = retriever._get_relevant_documents(query, run_manager=callback_manager)
|
|
82
|
+
else:
|
|
83
|
+
docs = retriever.get_relevant_documents(query)
|
|
84
|
+
all_results.extend(docs)
|
|
85
|
+
except Exception as e:
|
|
86
|
+
# Log the error but continue with other stores
|
|
87
|
+
run_manager.on_retriever_error(f"Error retrieving from store: {str(e)}")
|
|
88
|
+
continue
|
|
89
|
+
return all_results
|
|
90
|
+
|
|
91
|
+
async def _aget_relevant_documents(
|
|
92
|
+
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
|
|
93
|
+
) -> List[Document]:
|
|
94
|
+
"""
|
|
95
|
+
Asynchronously get documents relevant to the query.
|
|
96
|
+
Implements the required async method from BaseRetriever.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
query: Query string
|
|
100
|
+
run_manager: CallbackManager for the run
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
List of relevant documents
|
|
104
|
+
"""
|
|
105
|
+
all_results = []
|
|
106
|
+
for store in self.stores:
|
|
107
|
+
try:
|
|
108
|
+
retriever = store.as_retriever(
|
|
109
|
+
search_type=self.search_type,
|
|
110
|
+
search_kwargs=self.search_kwargs,
|
|
111
|
+
)
|
|
112
|
+
# Pass the run_manager to the sub-retrievers if they support it
|
|
113
|
+
if hasattr(retriever, "_aget_relevant_documents"):
|
|
114
|
+
callback_manager = run_manager.get_child()
|
|
115
|
+
docs = await retriever._aget_relevant_documents(query, run_manager=callback_manager)
|
|
116
|
+
else:
|
|
117
|
+
docs = await retriever.aget_relevant_documents(query)
|
|
118
|
+
all_results.extend(docs)
|
|
119
|
+
except Exception as e:
|
|
120
|
+
# Log the error but continue with other stores
|
|
121
|
+
run_manager.on_retriever_error(f"Error retrieving from store: {str(e)}")
|
|
122
|
+
continue
|
|
123
|
+
return all_results
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
__title__ = "ai-parrot"
|
|
4
4
|
__description__ = "Live Chatbots based on Langchain chatbots and Agents \
|
|
5
5
|
Integrated into Navigator Framework or used into any aiohttp applications."
|
|
6
|
-
__version__ = "0.5.
|
|
6
|
+
__version__ = "0.5.12"
|
|
7
7
|
__author__ = "Jesus Lara"
|
|
8
8
|
__author_email__ = "jesuslarag@gmail.com"
|
|
9
9
|
__license__ = "MIT"
|
|
Binary file
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
from typing import List, Dict, Any, Optional
|
|
2
|
-
from langchain_core.retrievers import BaseRetriever
|
|
3
|
-
from langchain_core.callbacks import CallbackManagerForRetrieverRun
|
|
4
|
-
from langchain_core.documents import Document
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class MultiVectorStoreRetriever(BaseRetriever):
|
|
8
|
-
"""
|
|
9
|
-
This aggregator retriever queries multiple vector stores
|
|
10
|
-
and merges the results into a single list.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
stores: List[Any]
|
|
14
|
-
search_kwargs: Dict[str, Any]
|
|
15
|
-
chain_type: str
|
|
16
|
-
search_type: str
|
|
17
|
-
metric_type: str
|
|
18
|
-
|
|
19
|
-
def __init__(
|
|
20
|
-
self,
|
|
21
|
-
stores: List[Any],
|
|
22
|
-
metric_type: str = 'COSINE',
|
|
23
|
-
chain_type: str = 'stuff',
|
|
24
|
-
search_type: str = 'similarity',
|
|
25
|
-
search_kwargs: Optional[Dict[str, Any]] = None,
|
|
26
|
-
):
|
|
27
|
-
"""
|
|
28
|
-
Initialize the MultiVectorStoreRetriever.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
stores: List of vector stores that provide an as_retriever() method
|
|
32
|
-
metric_type: Similarity metric (COSINE, EUCLIDEAN, DOT_PRODUCT)
|
|
33
|
-
chain_type: Chain type for the retriever
|
|
34
|
-
search_type: Search type (similarity, mmr)
|
|
35
|
-
search_kwargs: Dict to pass to each store's retrieve method (like 'k' for top_k)
|
|
36
|
-
"""
|
|
37
|
-
super().__init__()
|
|
38
|
-
self.stores = stores
|
|
39
|
-
self.search_kwargs = search_kwargs or {}
|
|
40
|
-
self.chain_type = chain_type
|
|
41
|
-
self.search_type = search_type
|
|
42
|
-
self.metric_type = metric_type
|
|
43
|
-
|
|
44
|
-
def _get_relevant_documents(
|
|
45
|
-
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
|
|
46
|
-
) -> List[Document]:
|
|
47
|
-
"""
|
|
48
|
-
Get documents relevant to the query.
|
|
49
|
-
Implements the required method from BaseRetriever.
|
|
50
|
-
|
|
51
|
-
Args:
|
|
52
|
-
query: Query string
|
|
53
|
-
run_manager: CallbackManager for the run
|
|
54
|
-
|
|
55
|
-
Returns:
|
|
56
|
-
List of relevant documents
|
|
57
|
-
"""
|
|
58
|
-
all_results = []
|
|
59
|
-
for store in self.stores:
|
|
60
|
-
retriever = store.as_retriever(
|
|
61
|
-
search_type=self.search_type,
|
|
62
|
-
search_kwargs=self.search_kwargs,
|
|
63
|
-
chain_type=self.chain_type
|
|
64
|
-
)
|
|
65
|
-
# Pass the run_manager to the sub-retrievers if they support it
|
|
66
|
-
if hasattr(retriever, "_get_relevant_documents"):
|
|
67
|
-
callback_manager = run_manager.get_child()
|
|
68
|
-
docs = retriever._get_relevant_documents(query, run_manager=callback_manager)
|
|
69
|
-
else:
|
|
70
|
-
docs = retriever.get_relevant_documents(query)
|
|
71
|
-
all_results.extend(docs)
|
|
72
|
-
return all_results
|
|
73
|
-
|
|
74
|
-
async def _aget_relevant_documents(
|
|
75
|
-
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
|
|
76
|
-
) -> List[Document]:
|
|
77
|
-
"""
|
|
78
|
-
Asynchronously get documents relevant to the query.
|
|
79
|
-
Implements the required async method from BaseRetriever.
|
|
80
|
-
|
|
81
|
-
Args:
|
|
82
|
-
query: Query string
|
|
83
|
-
run_manager: CallbackManager for the run
|
|
84
|
-
|
|
85
|
-
Returns:
|
|
86
|
-
List of relevant documents
|
|
87
|
-
"""
|
|
88
|
-
all_results = []
|
|
89
|
-
for store in self.stores:
|
|
90
|
-
retriever = store.as_retriever(
|
|
91
|
-
search_type=self.search_type,
|
|
92
|
-
search_kwargs=self.search_kwargs,
|
|
93
|
-
chain_type=self.chain_type
|
|
94
|
-
)
|
|
95
|
-
# Pass the run_manager to the sub-retrievers if they support it
|
|
96
|
-
if hasattr(retriever, "_aget_relevant_documents"):
|
|
97
|
-
callback_manager = run_manager.get_child()
|
|
98
|
-
docs = await retriever._aget_relevant_documents(query, run_manager=callback_manager)
|
|
99
|
-
else:
|
|
100
|
-
docs = await retriever.aget_relevant_documents(query)
|
|
101
|
-
all_results.extend(docs)
|
|
102
|
-
return all_results
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/interfaces/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/interfaces/__pycache__/retrievers.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/prompts/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/prompts/__pycache__/agents.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/bots/retrievals/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/crew/tools/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/interfaces/__pycache__/database.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/abstract.cpython-311.pyc
RENAMED
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/stores/embeddings/__pycache__/base.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/parsers/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
{ai_parrot-0.5.10 → ai_parrot-0.5.12}/parrot/utils/parsers/toml.cpython-311-x86_64-linux-gnu.so
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|