feat: llamaparse & diff agent (#2427)

This pull request updates the dependencies in the Pipfile to their
latest versions.
This commit is contained in:
Stan Girard 2024-04-12 09:06:50 -07:00 committed by GitHub
parent a8c5e186be
commit c773677b46
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 2051 additions and 1558 deletions

43
Pipfile
View File

@ -4,30 +4,30 @@ verify_ssl = true
name = "pypi"
[packages]
langchain = "==0.1.11"
langchain = "*"
litellm = "*"
openai = "1.13.3"
gitpython = "==3.1.36"
openai = "*"
gitpython = "*"
pdf2image = "*"
nest-asyncio = "==1.5.6"
pypdf = "==3.9.0"
supabase = "==2.4.0"
tiktoken = "==0.6.0"
fastapi = "==0.110.0"
python-multipart = "==0.0.6"
nest-asyncio = "*"
pypdf = "*"
supabase = "*"
tiktoken = "*"
fastapi = "*"
python-multipart = "*"
uvicorn = "*"
pypandoc = "==1.11"
docx2txt = "==0.8"
python-jose = "==3.3.0"
asyncpg = "==0.27.0"
flake8 = "==7.0.0"
flake8-black = "==0.3.6"
pypandoc = "*"
docx2txt = "*"
python-jose = "*"
asyncpg = "*"
flake8 = "*"
flake8-black = "*"
sentry-sdk = {extras = ["fastapi"] }
pyright = "==1.1.316"
pyright = "*"
resend = "*"
html5lib = "==1.1"
html5lib = "*"
beautifulsoup4 = "*"
newspaper3k = "==0.2.8"
newspaper3k = "*"
xlrd = "*"
redis = "*"
flower = "*"
@ -38,8 +38,8 @@ pytest-mock = "*"
pytest-celery = "*"
pytesseract = "*"
async-generator = "*"
posthog = "==3.5.0"
jq = "==1.6.0"
posthog = "*"
jq = "*"
pytest = "*"
watchdog = "*"
langchain-community = "*"
@ -52,6 +52,9 @@ psycopg2-binary = "*"
psycopg2 = "*"
celery = {extras = ["redis", "sqs"], version = "*"}
unstructured = {extras = ["all-docs"], version = "*"}
llama-parse = "*"
llama-index = "*"
lxml = {extras = ["html_clean"], version = "*"}
[dev-packages]
black = "*"

3172
Pipfile.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@ from logger import get_logger
from middlewares.auth import AuthBearer, get_current_user
from modules.assistant.dto.inputs import InputAssistant
from modules.assistant.dto.outputs import AssistantOutput
from modules.assistant.ito.difference import DifferenceAssistant, difference_inputs
from modules.assistant.ito.summary import SummaryAssistant, summary_inputs
from modules.assistant.service.assistant import Assistant
from modules.user.entity.user_identity import UserIdentity
@ -26,6 +27,7 @@ async def list_assistants(
"""
summary = summary_inputs()
# difference = difference_inputs()
# crawler = crawler_inputs()
# audio_transcript = audio_transcript_inputs()
return [summary]
@ -50,4 +52,13 @@ async def process_assistant(
return await summary_assistant.process_assistant()
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
elif input.name == "difference":
difference_assistant = DifferenceAssistant(
input=input, files=files, current_user=current_user
)
try:
difference_assistant.check_input()
return await difference_assistant.process_assistant()
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
return {"message": "Assistant not found"}

View File

@ -0,0 +1,175 @@
import os
import tempfile
from typing import List
import nest_asyncio
from fastapi import UploadFile
from langchain.prompts import HumanMessagePromptTemplate, SystemMessagePromptTemplate
from langchain_community.chat_models import ChatLiteLLM
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from llama_parse import LlamaParse
from logger import get_logger
from modules.assistant.dto.inputs import InputAssistant
from modules.assistant.dto.outputs import (
AssistantOutput,
InputFile,
Inputs,
OutputBrain,
OutputEmail,
Outputs,
)
from modules.assistant.ito.ito import ITO
from modules.user.entity.user_identity import UserIdentity
nest_asyncio.apply()
logger = get_logger(__name__)
class DifferenceAssistant(ITO):
def __init__(
self,
input: InputAssistant,
files: List[UploadFile] = None,
current_user: UserIdentity = None,
**kwargs,
):
super().__init__(
input=input,
files=files,
current_user=current_user,
**kwargs,
)
def check_input(self):
if not self.files:
raise ValueError("No file was uploaded")
if len(self.files) != 2:
raise ValueError("Only two files can be uploaded")
if not self.input.inputs.files:
raise ValueError("No files key were given in the input")
if len(self.input.inputs.files) != 2:
raise ValueError("Only two files can be uploaded")
if not self.input.inputs.files[0].key == "doc_1":
raise ValueError("The key of the first file should be doc_1")
if not self.input.inputs.files[1].key == "doc_2":
raise ValueError("The key of the second file should be doc_2")
if not self.input.inputs.files[0].value:
raise ValueError("No file was uploaded")
if not (
self.input.outputs.brain.activated or self.input.outputs.email.activated
):
raise ValueError("No output was selected")
return True
async def process_assistant(self):
document_1 = self.files[0]
document_2 = self.files[1]
# Get the file extensions
document_1_ext = os.path.splitext(document_1.filename)[1]
document_2_ext = os.path.splitext(document_2.filename)[1]
# Create temporary files with the same extension as the original files
document_1_tmp = tempfile.NamedTemporaryFile(
suffix=document_1_ext, delete=False
)
document_2_tmp = tempfile.NamedTemporaryFile(
suffix=document_2_ext, delete=False
)
document_1_tmp.write(document_1.file.read())
document_2_tmp.write(document_2.file.read())
parser = LlamaParse(
result_type="markdown" # "markdown" and "text" are available
)
document_1_llama_parsed = parser.load_data(document_1_tmp.name)
document_2_llama_parsed = parser.load_data(document_2_tmp.name)
document_1_tmp.close()
document_2_tmp.close()
document_1_to_langchain = document_1_llama_parsed[0].to_langchain_format()
document_2_to_langchain = document_2_llama_parsed[0].to_langchain_format()
llm = ChatLiteLLM(model="gpt-4-turbo-2024-04-09")
human_prompt = """Given the following two documents, find the difference between them:
Document 1:
{document_1}
Document 2:
{document_2}
Difference:
"""
CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(human_prompt)
system_message_template = """
You are an expert in finding the difference between two documents. You look deeply into what makes the two documents different and provide a detailed analysis if needed of the differences between the two documents.
If no differences are found, simply say that there are no differences.
"""
ANSWER_PROMPT = ChatPromptTemplate.from_messages(
[
SystemMessagePromptTemplate.from_template(system_message_template),
HumanMessagePromptTemplate.from_template(human_prompt),
]
)
final_inputs = {
"document_1": document_1_to_langchain.page_content,
"document_2": document_2_to_langchain.page_content,
}
output_parser = StrOutputParser()
chain = ANSWER_PROMPT | llm | output_parser
result = chain.invoke(final_inputs)
return result
def difference_inputs():
output = AssistantOutput(
name="difference",
description="Finds the difference between two sets of documents",
tags=["new"],
input_description="Two documents to compare",
output_description="The difference between the two documents",
icon_url="https://quivr-cms.s3.eu-west-3.amazonaws.com/assistant_summary_434446a2aa.png",
inputs=Inputs(
files=[
InputFile(
key="doc_1",
allowed_extensions=["pdf"],
required=True,
description="The first document to compare",
),
InputFile(
key="doc_2",
allowed_extensions=["pdf"],
required=True,
description="The second document to compare",
),
]
),
outputs=Outputs(
brain=OutputBrain(
required=True,
description="The brain to which upload the document",
type="uuid",
),
email=OutputEmail(
required=True,
description="Send the document by email",
type="str",
),
),
)
return output

View File

@ -1,240 +1,250 @@
-i https://pypi.org/simple
# Ensure PyTorch, along with its required dependencies, is explicitly installed in 'CPU-only' mode to optimize compatibility and performance for systems without GPU support.
--extra-index-url https://download.pytorch.org/whl/cpu
aiohttp==3.9.3; python_version >= '3.8'
aiohttp==3.9.4; python_version >= '3.8'
aiosignal==1.3.1; python_version >= '3.7'
amqp==5.2.0; python_version >= '3.6'
annotated-types==0.6.0; python_version >= '3.8'
antlr4-python3-runtime==4.9.3
anyio==4.3.0; python_version >= '3.8'
argon2-cffi==23.1.0; python_version >= '3.7'
argon2-cffi-bindings==21.2.0; python_version >= '3.6'
astor==0.8.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
asttokens==2.4.1
async-generator==1.10; python_version >= '3.5'
asyncpg==0.27.0; python_full_version >= '3.7.0'
async-timeout==4.0.3; python_full_version < '3.12.0'
asyncpg==0.29.0; python_full_version >= '3.8.0'
attrs==23.2.0; python_version >= '3.7'
backoff==2.2.1; python_version >= '3.7' and python_version < '4.0'
beautifulsoup4==4.12.3; python_full_version >= '3.6.0'
billiard==4.2.0; python_version >= '3.7'
black==24.2.0; python_version >= '3.8'
blinker==1.7.0; python_version >= '3.8'
boto3==1.34.60; python_version >= '3.8'
botocore==1.34.60; python_version >= '3.8'
black==24.3.0; python_version >= '3.8'
boto3==1.34.83; python_version >= '3.8'
botocore==1.34.83; python_version >= '3.8'
celery[redis,sqs]==5.3.6; python_version >= '3.8'
certifi==2024.2.2; python_version >= '3.6'
cffi==1.16.0; platform_python_implementation != 'PyPy'
chardet==5.2.0; python_version >= '3.7'
charset-normalizer==3.3.2; python_full_version >= '3.7.0'
chevron==0.14.0
click==8.1.7; python_version >= '3.7'
click-didyoumean==0.3.0; python_full_version >= '3.6.2' and python_full_version < '4.0.0'
click-didyoumean==0.3.1; python_full_version >= '3.6.2'
click-plugins==1.1.1
click-repl==0.3.0; python_version >= '3.6'
coloredlogs==15.0.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
colorlog==6.8.2; python_version >= '3.6'
contourpy==1.2.0; python_version >= '3.9'
contourpy==1.2.1; python_version >= '3.9'
cryptography==42.0.5; python_version >= '3.7'
cssselect==1.2.0; python_version >= '3.7'
cycler==0.12.1; python_version >= '3.8'
dataclasses-json==0.6.4; python_version >= '3.7' and python_version < '4.0'
dataclasses-json-speakeasy==0.5.11; python_version >= '3.7' and python_version < '4.0'
debugpy==1.8.1; python_version >= '3.8'
decorator==5.1.1; python_version >= '3.5'
deprecated==1.2.14; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
deprecation==2.1.0
dirtyjson==1.0.8
distro==1.9.0; python_version >= '3.6'
docker==7.0.0; python_version >= '3.8'
docx2txt==0.8
duckdb==0.9.2; python_full_version >= '3.7.0'
ecdsa==0.18.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'
duckdb==0.10.1; python_full_version >= '3.7.0'
ecdsa==0.19.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
effdet==0.4.1
emoji==2.10.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
emoji==2.11.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
et-xmlfile==1.1.0; python_version >= '3.6'
executing==2.0.1; python_version >= '3.5'
faker==19.13.0; python_version >= '3.8'
fastapi==0.110.0; python_version >= '3.8'
fastapi==0.110.1; python_version >= '3.8'
feedfinder2==0.0.4
feedparser==6.0.11; python_version >= '3.6'
filelock==3.13.1; python_version >= '3.8'
filelock==3.13.4; python_version >= '3.8'
filetype==1.2.0
flake8==7.0.0; python_full_version >= '3.8.1'
flake8-black==0.3.6; python_version >= '3.7'
flask==3.0.2; python_version >= '3.8'
flatbuffers==24.3.7
flatbuffers==24.3.25
flower==2.0.1; python_version >= '3.7'
fonttools==4.49.0; python_version >= '3.8'
fonttools==4.51.0; python_version >= '3.8'
frozenlist==1.4.1; python_version >= '3.8'
fsspec==2024.2.0; python_version >= '3.8'
fsspec==2024.3.1; python_version >= '3.8'
gitdb==4.0.11; python_version >= '3.7'
gitpython==3.1.36; python_version >= '3.7'
gotrue==2.4.1; python_version >= '3.8' and python_version < '4.0'
gitpython==3.1.43; python_version >= '3.7'
gotrue==2.4.2; python_version >= '3.8' and python_version < '4.0'
greenlet==3.0.3
h11==0.14.0; python_version >= '3.7'
html5lib==1.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
httpcore==1.0.4; python_version >= '3.8'
httpx==0.25.2; python_version >= '3.8'
huggingface-hub==0.21.4; python_full_version >= '3.8.0'
httpcore==1.0.5; python_version >= '3.8'
httpx==0.27.0; python_version >= '3.8'
huggingface-hub==0.22.2; python_full_version >= '3.8.0'
humanfriendly==10.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
humanize==4.9.0; python_version >= '3.8'
idna==3.6; python_version >= '3.5'
importlib-metadata==7.0.2; python_version >= '3.8'
idna==3.7; python_version >= '3.5'
importlib-metadata==7.1.0; python_version >= '3.8'
iniconfig==2.0.0; python_version >= '3.7'
iopath==0.1.10; python_version >= '3.6'
ipython==8.22.2; python_version >= '3.10'
itsdangerous==2.1.2; python_version >= '3.7'
jedi==0.19.1; python_version >= '3.6'
jieba3k==0.35.1
jinja2==3.1.3; python_version >= '3.7'
jmespath==1.0.1; python_version >= '3.7'
joblib==1.3.2; python_version >= '3.7'
jq==1.6.0; python_version >= '3.5'
joblib==1.4.0; python_version >= '3.8'
jq==1.7.0; python_version >= '3.5'
jsonpatch==1.33; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'
jsonpath-python==1.0.6; python_version >= '3.6'
jsonpointer==2.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'
kiwisolver==1.4.5; python_version >= '3.7'
kombu[sqs]==5.3.5; python_version >= '3.8'
langchain==0.1.11; python_version < '4.0' and python_full_version >= '3.8.1'
langchain-community==0.0.27; python_version < '4.0' and python_full_version >= '3.8.1'
langchain-core==0.1.30; python_version < '4.0' and python_full_version >= '3.8.1'
langchain-openai==0.0.8; python_version < '4.0' and python_full_version >= '3.8.1'
kombu[sqs]==5.3.7; python_version >= '3.8'
langchain==0.1.16; python_version < '4.0' and python_full_version >= '3.8.1'
langchain-community==0.0.32; python_version < '4.0' and python_full_version >= '3.8.1'
langchain-core==0.1.42; python_version < '4.0' and python_full_version >= '3.8.1'
langchain-openai==0.1.3; python_version < '4.0' and python_full_version >= '3.8.1'
langchain-text-splitters==0.0.1; python_version < '4.0' and python_full_version >= '3.8.1'
langdetect==1.0.9
langfuse==2.20.1; python_version < '4.0' and python_full_version >= '3.8.1'
langsmith==0.1.23; python_version < '4.0' and python_full_version >= '3.8.1'
langfuse==2.25.0; python_version < '4.0' and python_full_version >= '3.8.1'
langsmith==0.1.45; python_version < '4.0' and python_full_version >= '3.8.1'
layoutparser[layoutmodels,tesseract]==0.3.4; python_version >= '3.6'
litellm==1.31.2; python_version not in '2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7' and python_version >= '3.8'
lxml==5.1.0; python_version >= '3.6'
markdown==3.5.2
litellm==1.35.2; python_version not in '2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7' and python_version >= '3.8'
llama-index==0.10.28; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-agent-openai==0.2.2; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-cli==0.1.11; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-core==0.10.28; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-embeddings-openai==0.1.7; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-indices-managed-llama-cloud==0.1.5; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-legacy==0.9.48; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-llms-openai==0.1.15; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-multi-modal-llms-openai==0.1.5; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-program-openai==0.1.5; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-question-gen-openai==0.1.3; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-readers-file==0.1.16; python_version < '4.0' and python_full_version >= '3.8.1'
llama-index-readers-llama-parse==0.1.4; python_version < '4.0' and python_full_version >= '3.8.1'
llama-parse==0.4.0; python_version < '4.0' and python_full_version >= '3.8.1'
llamaindex-py-client==0.1.17; python_version >= '3.8' and python_version < '4'
lxml[html_clean]==5.2.1; python_version >= '3.6'
lxml-html-clean==0.1.1
markdown==3.6
markupsafe==2.1.5; python_version >= '3.7'
marshmallow==3.21.1; python_version >= '3.8'
matplotlib==3.8.3; python_version >= '3.9'
matplotlib-inline==0.1.6; python_version >= '3.5'
matplotlib==3.8.4; python_version >= '3.9'
mccabe==0.7.0; python_version >= '3.6'
monotonic==1.6
mpmath==1.3.0
msg-parser==1.2.0
multidict==6.0.5; python_version >= '3.7'
mypy-extensions==1.0.0; python_version >= '3.5'
nest-asyncio==1.5.6; python_version >= '3.5'
networkx==3.2.1
nest-asyncio==1.6.0; python_version >= '3.5'
networkx==3.3
newspaper3k==0.2.8
nltk==3.8.1; python_version >= '3.7'
nodeenv==1.8.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'
numpy==1.26.4; python_version >= '3.9'
olefile==0.47; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
omegaconf==2.3.0; python_version >= '3.6'
onnx==1.15.0
onnx==1.16.0
onnxruntime==1.15.1
openai==1.13.3; python_full_version >= '3.7.1'
openai==1.17.0; python_full_version >= '3.7.1'
opencv-python==4.9.0.80; python_version >= '3.6'
openpyxl==3.1.2
orjson==3.9.15; python_version >= '3.8'
orjson==3.10.0; python_version >= '3.8'
packaging==23.2; python_version >= '3.7'
pandas==1.5.3; python_version >= '3.8'
pandasai==2.0.7; python_version not in '2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8' and python_version >= '3.9'
parso==0.8.3; python_version >= '3.6'
pandasai==2.0.32; python_version not in '2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8' and python_version >= '3.9'
pathspec==0.12.1; python_version >= '3.8'
pdf2image==1.17.0
pdfminer.six==20231228
pdfplumber==0.11.0; python_version >= '3.8'
pexpect==4.9.0; sys_platform != 'win32' and sys_platform != 'emscripten'
pikepdf==8.13.0
pillow==10.2.0; python_version >= '3.8'
pillow-heif==0.15.0
pikepdf==8.15.0
pillow==10.3.0; python_version >= '3.8'
pillow-heif==0.16.0
platformdirs==4.2.0; python_version >= '3.8'
pluggy==1.4.0; python_version >= '3.8'
portalocker==2.8.2; python_version >= '3.8'
postgrest==0.16.1; python_version >= '3.8' and python_version < '4.0'
postgrest==0.16.2; python_version >= '3.8' and python_version < '4.0'
posthog==3.5.0
prometheus-client==0.20.0; python_version >= '3.8'
prompt-toolkit==3.0.43; python_full_version >= '3.7.0'
protobuf==4.25.3; python_version >= '3.8'
protobuf==5.26.1; python_version >= '3.8'
psutil==5.9.8; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
psycopg2==2.9.9; python_version >= '3.7'
psycopg2-binary==2.9.9; python_version >= '3.7'
ptyprocess==0.7.0
pure-eval==0.2.2
pyasn1==0.5.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
py==1.11.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
pyasn1==0.6.0; python_version >= '3.8'
pycocotools==2.0.7; python_version >= '3.5'
pycodestyle==2.11.1; python_version >= '3.8'
pycparser==2.21
pycparser==2.22; python_version >= '3.8'
pycurl==7.45.3
pydantic==2.6.3; python_version >= '3.8'
pydantic-core==2.16.3; python_version >= '3.8'
pydantic==2.7.0; python_version >= '3.8'
pydantic-core==2.18.1; python_version >= '3.8'
pydantic-settings==2.2.1; python_version >= '3.8'
pyflakes==3.2.0; python_version >= '3.8'
pygments==2.17.2; python_version >= '3.7'
pypandoc==1.11; python_version >= '3.6'
pymupdf==1.24.1; python_version >= '3.8'
pymupdfb==1.24.1; python_version >= '3.8'
pypandoc==1.13; python_version >= '3.6'
pyparsing==3.1.2; python_full_version >= '3.6.8'
pypdf==3.9.0; python_version >= '3.6'
pypdfium2==4.28.0; python_version >= '3.6'
pyright==1.1.316; python_version >= '3.7'
pypdf==4.2.0; python_version >= '3.6'
pypdfium2==4.29.0; python_version >= '3.6'
pyright==1.1.358; python_version >= '3.7'
pytesseract==0.3.10; python_version >= '3.7'
pytest==8.1.1; python_version >= '3.8'
pytest-celery==0.0.0
pytest-mock==3.12.0; python_version >= '3.8'
pytest-celery==1.0.0; python_version >= '3.8' and python_version < '4.0'
pytest-docker-tools==3.1.3; python_full_version >= '3.7.0' and python_full_version < '4.0.0'
pytest-mock==3.14.0; python_version >= '3.8'
python-dateutil==2.9.0.post0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
python-docx==1.1.0
python-dotenv==1.0.1; python_version >= '3.8'
python-iso639==2024.2.7; python_version >= '3.8'
python-jose==3.3.0
python-magic==0.4.27; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
python-multipart==0.0.6; python_version >= '3.7'
python-multipart==0.0.9; python_version >= '3.8'
python-pptx==0.6.23
pytz==2024.1
pyyaml==6.0.1; python_version >= '3.6'
rapidfuzz==3.6.2; python_version >= '3.8'
realtime==1.0.2; python_version >= '3.8' and python_version < '4.0'
rapidfuzz==3.8.1; python_version >= '3.8'
realtime==1.0.3; python_version >= '3.8' and python_version < '4.0'
redis==5.0.3; python_version >= '3.7'
regex==2023.12.25; python_version >= '3.7'
requests==2.31.0; python_version >= '3.7'
requests-file==2.0.0
resend==0.8.0; python_version >= '3.7'
retry==0.9.2
rsa==4.9; python_version >= '3.6' and python_version < '4'
s3transfer==0.10.0; python_version >= '3.8'
s3transfer==0.10.1; python_version >= '3.8'
safetensors==0.4.2; python_version >= '3.7'
scipy==1.12.0; python_version >= '3.9'
sentry-sdk[fastapi]==1.41.0
setuptools==69.1.1; python_version >= '3.8'
scipy==1.13.0; python_version >= '3.9'
sentry-sdk[fastapi]==1.45.0
setuptools==69.2.0; python_version >= '3.8'
sgmllib3k==1.0.0
six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
smmap==5.0.1; python_version >= '3.7'
sniffio==1.3.1; python_version >= '3.7'
soupsieve==2.5; python_version >= '3.8'
sqlalchemy==2.0.28; python_version >= '3.7'
stack-data==0.6.3
starlette==0.36.3; python_version >= '3.8'
storage3==0.7.3; python_version >= '3.8' and python_version < '4.0'
sqlalchemy[asyncio]==2.0.29; python_version >= '3.7'
starlette==0.37.2; python_version >= '3.8'
storage3==0.7.4; python_version >= '3.8' and python_version < '4.0'
strenum==0.4.15
supabase==2.4.0; python_version >= '3.8' and python_version < '4.0'
supafunc==0.3.3; python_version >= '3.8' and python_version < '4.0'
striprtf==0.0.26
supabase==2.4.1; python_version >= '3.8' and python_version < '4.0'
supafunc==0.4.5; python_version >= '3.8' and python_version < '4.0'
sympy==1.12; python_version >= '3.8'
tabulate==0.9.0; python_version >= '3.7'
tenacity==8.2.3; python_version >= '3.7'
tiktoken==0.6.0; python_version >= '3.8'
timm==0.9.16; python_version >= '3.8'
tinysegmenter==0.3
tldextract==5.1.1; python_version >= '3.8'
tldextract==5.1.2; python_version >= '3.8'
tokenizers==0.15.2; python_version >= '3.7'
torch==2.2.1
torchvision==0.17.1
torch==2.2.2
torchvision==0.17.2
tornado==6.4; python_version >= '3.8'
tqdm==4.66.2; python_version >= '3.7'
traitlets==5.14.1; python_version >= '3.8'
transformers==4.38.2; python_full_version >= '3.8.0'
typing-extensions==4.10.0; python_version >= '3.8'
transformers==4.39.3; python_full_version >= '3.8.0'
typing-extensions==4.11.0; python_version >= '3.8'
typing-inspect==0.9.0
tzdata==2024.1; python_version >= '2'
unstructured[all-docs]==0.12.5; python_version < '3.12' and python_full_version >= '3.9.0'
unstructured-client==0.21.0; python_version >= '3.8'
unstructured-inference==0.7.23
unstructured[all-docs]==0.13.2; python_version < '3.12' and python_full_version >= '3.9.0'
unstructured-client==0.18.0; python_version >= '3.8'
unstructured-inference==0.7.25
unstructured.pytesseract==0.3.12
urllib3==2.0.7; python_version >= '3.10'
uvicorn==0.28.0; python_version >= '3.8'
urllib3==2.2.1; python_version >= '3.8'
uvicorn==0.29.0; python_version >= '3.8'
vine==5.1.0; python_version >= '3.6'
watchdog==4.0.0; python_version >= '3.8'
wcwidth==0.2.13
webencodings==0.5.1
websockets==11.0.3; python_version >= '3.7'
werkzeug==3.0.1; python_version >= '3.8'
websockets==12.0; python_version >= '3.8'
wrapt==1.16.0; python_version >= '3.6'
xlrd==2.0.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
xlsxwriter==3.2.0; python_version >= '3.6'
yarl==1.9.4; python_version >= '3.7'
zipp==3.17.0; python_version >= '3.8'
zipp==3.18.1; python_version >= '3.8'