From 7e79bf4a7e5d9a94fd64e91dfb81c2a9394e1ae4 Mon Sep 17 00:00:00 2001 From: Emerald33 <31729272+Emerald33@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:46:30 +0000 Subject: [PATCH] changes to python code --- .chainlit/config.toml | 97 ++ .chainlit/translations/en-US.json | 155 ++ .chainlit/translations/pt-BR.json | 155 ++ .../9c20404c-fb52-409a-984c-5ffdf3ebeb8f.pdf | Bin 0 -> 33551 bytes .../c249b19c-d56a-4c7c-ab64-dd3ca05b676d.pdf | Bin 0 -> 15275 bytes chainlit.md | 14 + crewai_local/trip_agents.py | 2 +- crewai_local/trip_crew.py | 46 +- crewai_local/trip_task.py | 5 +- crewai_local/trip_tasks.py | 0 langchain_folder/.chainlit/config.toml | 97 ++ .../.chainlit/translations/en-US.json | 155 ++ .../.chainlit/translations/pt-BR.json | 155 ++ .../__init__.py | 0 langchain_folder/agent.py | 168 +++ langchain_folder/agent_chainlit.py | 186 +++ .../tools/__init__.py | 0 .../tools/rag_tool.py | 59 +- .../tools/serper_tool.py | 0 langchain_local/agent.py | 51 - llamaindex/main.py | 83 ++ llamaindex/main_chainlit.py | 124 ++ poetry.lock | 1283 +++++++++++++---- pyproject.toml | 5 +- tests/test_crewai.py | 12 +- tests/test_langchain.py | 74 +- tests/test_llamaIndex.py | 67 + 27 files changed, 2586 insertions(+), 407 deletions(-) create mode 100644 .chainlit/config.toml create mode 100644 .chainlit/translations/en-US.json create mode 100644 .chainlit/translations/pt-BR.json create mode 100644 .files/4f7b3a24-4747-4e89-8cef-bf4828c12a26/9c20404c-fb52-409a-984c-5ffdf3ebeb8f.pdf create mode 100644 .files/4f7b3a24-4747-4e89-8cef-bf4828c12a26/c249b19c-d56a-4c7c-ab64-dd3ca05b676d.pdf create mode 100644 chainlit.md delete mode 100644 crewai_local/trip_tasks.py create mode 100644 langchain_folder/.chainlit/config.toml create mode 100644 langchain_folder/.chainlit/translations/en-US.json create mode 100644 langchain_folder/.chainlit/translations/pt-BR.json rename {langchain_local => langchain_folder}/__init__.py (100%) create mode 100644 langchain_folder/agent.py create mode 100644 langchain_folder/agent_chainlit.py rename {langchain_local => langchain_folder}/tools/__init__.py (100%) rename {langchain_local => langchain_folder}/tools/rag_tool.py (50%) rename {langchain_local => langchain_folder}/tools/serper_tool.py (100%) delete mode 100644 langchain_local/agent.py create mode 100644 llamaindex/main_chainlit.py diff --git a/.chainlit/config.toml b/.chainlit/config.toml new file mode 100644 index 0000000..888f7e7 --- /dev/null +++ b/.chainlit/config.toml @@ -0,0 +1,97 @@ +[project] +# Whether to enable telemetry (default: true). No personal data is collected. +enable_telemetry = true + + +# List of environment variables to be provided by each user to use the app. +user_env = [] + +# Duration (in seconds) during which the session is saved when the connection is lost +session_timeout = 3600 + +# Enable third parties caching (e.g LangChain cache) +cache = false + +# Authorized origins +allow_origins = ["*"] + +# Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317) +# follow_symlink = false + +[features] +# Show the prompt playground +prompt_playground = true + +# Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript) +unsafe_allow_html = false + +# Process and display mathematical expressions. This can clash with "$" characters in messages. +latex = false + +# Authorize users to upload files with messages +multi_modal = true + +# Allows user to use speech to text +[features.speech_to_text] + enabled = false + # See all languages here https://github.com/JamesBrill/react-speech-recognition/blob/HEAD/docs/API.md#language-string + # language = "en-US" + +[UI] +# Name of the app and chatbot. +name = "Chatbot" + +# Show the readme while the thread is empty. +show_readme_as_default = true + +# Description of the app and chatbot. This is used for HTML tags. +# description = "" + +# Large size content are by default collapsed for a cleaner ui +default_collapse_content = true + +# The default value for the expand messages settings. +default_expand_messages = false + +# Hide the chain of thought details from the user in the UI. +hide_cot = false + +# Link to your github repo. This will add a github button in the UI's header. +# github = "" + +# Specify a CSS file that can be used to customize the user interface. +# The CSS file can be served from the public directory or via an external link. +# custom_css = "/public/test.css" + +# Specify a Javascript file that can be used to customize the user interface. +# The Javascript file can be served from the public directory. +# custom_js = "/public/test.js" + +# Specify a custom font url. +# custom_font = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap" + +# Override default MUI light theme. (Check theme.ts) +[UI.theme] + #font_family = "Inter, sans-serif" +[UI.theme.light] + #background = "#FAFAFA" + #paper = "#FFFFFF" + + [UI.theme.light.primary] + #main = "#F80061" + #dark = "#980039" + #light = "#FFE7EB" + +# Override default MUI dark theme. (Check theme.ts) +[UI.theme.dark] + #background = "#FAFAFA" + #paper = "#FFFFFF" + + [UI.theme.dark.primary] + #main = "#F80061" + #dark = "#980039" + #light = "#FFE7EB" + + +[meta] +generated_by = "1.0.401" diff --git a/.chainlit/translations/en-US.json b/.chainlit/translations/en-US.json new file mode 100644 index 0000000..249353c --- /dev/null +++ b/.chainlit/translations/en-US.json @@ -0,0 +1,155 @@ +{ + "components": { + "atoms": { + "buttons": { + "userButton": { + "menu": { + "settings": "Settings", + "settingsKey": "S", + "APIKeys": "API Keys", + "logout": "Logout" + } + } + } + }, + "molecules": { + "newChatButton": { + "newChat": "New Chat" + }, + "tasklist": { + "TaskList": { + "title": "\ud83d\uddd2\ufe0f Task List", + "loading": "Loading...", + "error": "An error occured" + } + }, + "attachments": { + "cancelUpload": "Cancel upload", + "removeAttachment": "Remove attachment" + }, + "newChatDialog": { + "createNewChat": "Create new chat?", + "clearChat": "This will clear the current messages and start a new chat.", + "cancel": "Cancel", + "confirm": "Confirm" + }, + "settingsModal": { + "expandMessages": "Expand Messages", + "hideChainOfThought": "Hide Chain of Thought", + "darkMode": "Dark Mode" + } + }, + "organisms": { + "chat": { + "history": { + "index": { + "lastInputs": "Last Inputs", + "noInputs": "Such empty...", + "loading": "Loading..." + } + }, + "inputBox": { + "input": { + "placeholder": "Type your message here..." + }, + "speechButton": { + "start": "Start recording", + "stop": "Stop recording" + }, + "SubmitButton": { + "sendMessage": "Send message", + "stopTask": "Stop Task" + }, + "UploadButton": { + "attachFiles": "Attach files" + }, + "waterMark": { + "text": "Built with" + } + }, + "Messages": { + "index": { + "running": "Running", + "executedSuccessfully": "executed successfully", + "failed": "failed", + "feedbackUpdated": "Feedback updated", + "updating": "Updating" + } + }, + "dropScreen": { + "dropYourFilesHere": "Drop your files here" + }, + "index": { + "failedToUpload": "Failed to upload", + "cancelledUploadOf": "Cancelled upload of", + "couldNotReachServer": "Could not reach the server", + "continuingChat": "Continuing previous chat" + }, + "settings": { + "settingsPanel": "Settings panel", + "reset": "Reset", + "cancel": "Cancel", + "confirm": "Confirm" + } + }, + "threadHistory": { + "sidebar": { + "filters": { + "FeedbackSelect": { + "feedbackAll": "Feedback: All", + "feedbackPositive": "Feedback: Positive", + "feedbackNegative": "Feedback: Negative" + }, + "SearchBar": { + "search": "Search" + } + }, + "DeleteThreadButton": { + "confirmMessage": "This will delete the thread as well as it's messages and elements.", + "cancel": "Cancel", + "confirm": "Confirm", + "deletingChat": "Deleting chat", + "chatDeleted": "Chat deleted" + }, + "index": { + "pastChats": "Past Chats" + }, + "ThreadList": { + "empty": "Empty..." + }, + "TriggerButton": { + "closeSidebar": "Close sidebar", + "openSidebar": "Open sidebar" + } + }, + "Thread": { + "backToChat": "Go back to chat", + "chatCreatedOn": "This chat was created on" + } + }, + "header": { + "chat": "Chat", + "readme": "Readme" + } + } + }, + "hooks": { + "useLLMProviders": { + "failedToFetchProviders": "Failed to fetch providers:" + } + }, + "pages": { + "Design": {}, + "Env": { + "savedSuccessfully": "Saved successfully", + "requiredApiKeys": "Required API Keys", + "requiredApiKeysInfo": "To use this app, the following API keys are required. The keys are stored on your device's local storage." + }, + "Page": { + "notPartOfProject": "You are not part of this project." + }, + "ResumeButton": { + "resumeChat": "Resume Chat" + } + } +} \ No newline at end of file diff --git a/.chainlit/translations/pt-BR.json b/.chainlit/translations/pt-BR.json new file mode 100644 index 0000000..5b42831 --- /dev/null +++ b/.chainlit/translations/pt-BR.json @@ -0,0 +1,155 @@ +{ + "components": { + "atoms": { + "buttons": { + "userButton": { + "menu": { + "settings": "Configura\u00e7\u00f5es", + "settingsKey": "S", + "APIKeys": "Chaves de API", + "logout": "Sair" + } + } + } + }, + "molecules": { + "newChatButton": { + "newChat": "Nova Conversa" + }, + "tasklist": { + "TaskList": { + "title": "\ud83d\uddd2\ufe0f Lista de Tarefas", + "loading": "Carregando...", + "error": "Ocorreu um erro" + } + }, + "attachments": { + "cancelUpload": "Cancelar envio", + "removeAttachment": "Remover anexo" + }, + "newChatDialog": { + "createNewChat": "Criar novo chat?", + "clearChat": "Isso limpar\u00e1 as mensagens atuais e iniciar\u00e1 uma nova conversa.", + "cancel": "Cancelar", + "confirm": "Confirmar" + }, + "settingsModal": { + "expandMessages": "Expandir Mensagens", + "hideChainOfThought": "Esconder Sequ\u00eancia de Pensamento", + "darkMode": "Modo Escuro" + } + }, + "organisms": { + "chat": { + "history": { + "index": { + "lastInputs": "\u00daltimas Entradas", + "noInputs": "Vazio...", + "loading": "Carregando..." + } + }, + "inputBox": { + "input": { + "placeholder": "Digite sua mensagem aqui..." + }, + "speechButton": { + "start": "Iniciar grava\u00e7\u00e3o", + "stop": "Parar grava\u00e7\u00e3o" + }, + "SubmitButton": { + "sendMessage": "Enviar mensagem", + "stopTask": "Parar Tarefa" + }, + "UploadButton": { + "attachFiles": "Anexar arquivos" + }, + "waterMark": { + "text": "Constru\u00eddo com" + } + }, + "Messages": { + "index": { + "running": "Executando", + "executedSuccessfully": "executado com sucesso", + "failed": "falhou", + "feedbackUpdated": "Feedback atualizado", + "updating": "Atualizando" + } + }, + "dropScreen": { + "dropYourFilesHere": "Solte seus arquivos aqui" + }, + "index": { + "failedToUpload": "Falha ao enviar", + "cancelledUploadOf": "Envio cancelado de", + "couldNotReachServer": "N\u00e3o foi poss\u00edvel conectar ao servidor", + "continuingChat": "Continuando o chat anterior" + }, + "settings": { + "settingsPanel": "Painel de Configura\u00e7\u00f5es", + "reset": "Redefinir", + "cancel": "Cancelar", + "confirm": "Confirmar" + } + }, + "threadHistory": { + "sidebar": { + "filters": { + "FeedbackSelect": { + "feedbackAll": "Feedback: Todos", + "feedbackPositive": "Feedback: Positivo", + "feedbackNegative": "Feedback: Negativo" + }, + "SearchBar": { + "search": "Buscar" + } + }, + "DeleteThreadButton": { + "confirmMessage": "Isso deletar\u00e1 a conversa, assim como suas mensagens e elementos.", + "cancel": "Cancelar", + "confirm": "Confirmar", + "deletingChat": "Deletando conversa", + "chatDeleted": "Conversa deletada" + }, + "index": { + "pastChats": "Conversas Anteriores" + }, + "ThreadList": { + "empty": "Vazio..." + }, + "TriggerButton": { + "closeSidebar": "Fechar barra lateral", + "openSidebar": "Abrir barra lateral" + } + }, + "Thread": { + "backToChat": "Voltar para a conversa", + "chatCreatedOn": "Esta conversa foi criada em" + } + }, + "header": { + "chat": "Conversa", + "readme": "Leia-me" + } + }, + "hooks": { + "useLLMProviders": { + "failedToFetchProviders": "Falha ao buscar provedores:" + } + }, + "pages": { + "Design": {}, + "Env": { + "savedSuccessfully": "Salvo com sucesso", + "requiredApiKeys": "Chaves de API necess\u00e1rias", + "requiredApiKeysInfo": "Para usar este aplicativo, as seguintes chaves de API s\u00e3o necess\u00e1rias. As chaves s\u00e3o armazenadas localmente em seu dispositivo." + }, + "Page": { + "notPartOfProject": "Voc\u00ea n\u00e3o faz parte deste projeto." + }, + "ResumeButton": { + "resumeChat": "Continuar Conversa" + } + } + } +} \ No newline at end of file diff --git a/.files/4f7b3a24-4747-4e89-8cef-bf4828c12a26/9c20404c-fb52-409a-984c-5ffdf3ebeb8f.pdf b/.files/4f7b3a24-4747-4e89-8cef-bf4828c12a26/9c20404c-fb52-409a-984c-5ffdf3ebeb8f.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1eaf02bf3825e9f2962845c57f7a542d7303611b GIT binary patch literal 33551 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[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 literal 0 HcmV?d00001 diff --git a/.files/4f7b3a24-4747-4e89-8cef-bf4828c12a26/c249b19c-d56a-4c7c-ab64-dd3ca05b676d.pdf b/.files/4f7b3a24-4747-4e89-8cef-bf4828c12a26/c249b19c-d56a-4c7c-ab64-dd3ca05b676d.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e4079ca54a5d15663a1550593f8acf0725869239 GIT binary patch literal 15275 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 HWbywG`32vp literal 0 HcmV?d00001 diff --git a/chainlit.md b/chainlit.md new file mode 100644 index 0000000..4507ac4 --- /dev/null +++ b/chainlit.md @@ -0,0 +1,14 @@ +# Welcome to Chainlit! 🚀🤖 + +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. + +## Useful Links 🔗 + +- **Documentation:** Get started with our comprehensive [Chainlit Documentation](https://docs.chainlit.io) 📚 +- **Discord Community:** Join our friendly [Chainlit Discord](https://discord.gg/k73SQ3FyUh) to ask questions, share your projects, and connect with other developers! 💬 + +We can't wait to see what you create with Chainlit! Happy coding! 💻😊 + +## Welcome screen + +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. diff --git a/crewai_local/trip_agents.py b/crewai_local/trip_agents.py index bb506da..52ca679 100644 --- a/crewai_local/trip_agents.py +++ b/crewai_local/trip_agents.py @@ -4,7 +4,7 @@ from tools.browser_tools import BrowserTools from tools.calculator_tools import CalculatorTools from tools.search_tools import SearchTools -from langchain_local.tools import serper_tool +from langchain_folder.tools import serper_tool diff --git a/crewai_local/trip_crew.py b/crewai_local/trip_crew.py index 9c7442b..e720342 100644 --- a/crewai_local/trip_crew.py +++ b/crewai_local/trip_crew.py @@ -63,28 +63,30 @@ def run(self): if __name__ == "__main__": - print("## Welcom to Trip Planner Crew") - print("------------------------------") - location = input( - dedent(""" Where will you be travelling from?""") - ) - cities = input( - dedent('''What are cities are you interested in visiting?''') - ) - date_range = input( - dedent('''What is the date range you are interested in traveling?''') - ) - interests = input( - dedent('''What are some of your high level interests and hobbies?''') - ) - - trip_crew = TripCrew(origin=location, cities=cities, date_range=date_range, interests=interests) - result = trip_crew.run() - - print("\n\n ###################") - print("## Here is your Trip Plan") - print("##########################") - print(result) + import streamlit as st + + st.title("Trip Planner Crew!!") + st.write("""Input a location, a list of cities you have in mind, your proposed + travel date and you interests. Watch this agent plan a costed trip for you""") + + location = st.text_area("Enter you location") + cities = st.text_area("Enter the lis of cities you intend to visit") + date_range = st.text_area("Enter the proposed data range for the trip") + interests = st.text_area("Enter a list of things you're interested in or hope to do during the trip") + + if st.sidebar.button("Build a plan"): + with st.spinner(text = "Generating"): + trip_crew = TripCrew( + origin = location, + cities = cities, + date_range = date_range, + interests = interests + ) + result = trip_crew.run() + st.markdown(result) + + + diff --git a/crewai_local/trip_task.py b/crewai_local/trip_task.py index 75bfec2..064c286 100644 --- a/crewai_local/trip_task.py +++ b/crewai_local/trip_task.py @@ -9,8 +9,7 @@ def __tip_selection(self): return "If you do your BEST WORK, I'll tip you $100!" def identify_task(self, agent, origin, cities, interests, range): - return Task( - description=dedent(f""" + return Task(description=dedent(f""" Analyze and select the best city for the trip based on specific criteria such as weather patterns, seasonal events and travel costs. This task involves comparing multiple cities, considering factors like current weather @@ -24,7 +23,7 @@ def identify_task(self, agent, origin, cities, interests, range): Trip Date: {range} Traveler Interests: {interests} """ - ) + ), agent=agent, async_execution=True, diff --git a/crewai_local/trip_tasks.py b/crewai_local/trip_tasks.py deleted file mode 100644 index e69de29..0000000 diff --git a/langchain_folder/.chainlit/config.toml b/langchain_folder/.chainlit/config.toml new file mode 100644 index 0000000..888f7e7 --- /dev/null +++ b/langchain_folder/.chainlit/config.toml @@ -0,0 +1,97 @@ +[project] +# Whether to enable telemetry (default: true). No personal data is collected. +enable_telemetry = true + + +# List of environment variables to be provided by each user to use the app. +user_env = [] + +# Duration (in seconds) during which the session is saved when the connection is lost +session_timeout = 3600 + +# Enable third parties caching (e.g LangChain cache) +cache = false + +# Authorized origins +allow_origins = ["*"] + +# Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317) +# follow_symlink = false + +[features] +# Show the prompt playground +prompt_playground = true + +# Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript) +unsafe_allow_html = false + +# Process and display mathematical expressions. This can clash with "$" characters in messages. +latex = false + +# Authorize users to upload files with messages +multi_modal = true + +# Allows user to use speech to text +[features.speech_to_text] + enabled = false + # See all languages here https://github.com/JamesBrill/react-speech-recognition/blob/HEAD/docs/API.md#language-string + # language = "en-US" + +[UI] +# Name of the app and chatbot. +name = "Chatbot" + +# Show the readme while the thread is empty. +show_readme_as_default = true + +# Description of the app and chatbot. This is used for HTML tags. +# description = "" + +# Large size content are by default collapsed for a cleaner ui +default_collapse_content = true + +# The default value for the expand messages settings. +default_expand_messages = false + +# Hide the chain of thought details from the user in the UI. +hide_cot = false + +# Link to your github repo. This will add a github button in the UI's header. +# github = "" + +# Specify a CSS file that can be used to customize the user interface. +# The CSS file can be served from the public directory or via an external link. +# custom_css = "/public/test.css" + +# Specify a Javascript file that can be used to customize the user interface. +# The Javascript file can be served from the public directory. +# custom_js = "/public/test.js" + +# Specify a custom font url. +# custom_font = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap" + +# Override default MUI light theme. (Check theme.ts) +[UI.theme] + #font_family = "Inter, sans-serif" +[UI.theme.light] + #background = "#FAFAFA" + #paper = "#FFFFFF" + + [UI.theme.light.primary] + #main = "#F80061" + #dark = "#980039" + #light = "#FFE7EB" + +# Override default MUI dark theme. (Check theme.ts) +[UI.theme.dark] + #background = "#FAFAFA" + #paper = "#FFFFFF" + + [UI.theme.dark.primary] + #main = "#F80061" + #dark = "#980039" + #light = "#FFE7EB" + + +[meta] +generated_by = "1.0.401" diff --git a/langchain_folder/.chainlit/translations/en-US.json b/langchain_folder/.chainlit/translations/en-US.json new file mode 100644 index 0000000..249353c --- /dev/null +++ b/langchain_folder/.chainlit/translations/en-US.json @@ -0,0 +1,155 @@ +{ + "components": { + "atoms": { + "buttons": { + "userButton": { + "menu": { + "settings": "Settings", + "settingsKey": "S", + "APIKeys": "API Keys", + "logout": "Logout" + } + } + } + }, + "molecules": { + "newChatButton": { + "newChat": "New Chat" + }, + "tasklist": { + "TaskList": { + "title": "\ud83d\uddd2\ufe0f Task List", + "loading": "Loading...", + "error": "An error occured" + } + }, + "attachments": { + "cancelUpload": "Cancel upload", + "removeAttachment": "Remove attachment" + }, + "newChatDialog": { + "createNewChat": "Create new chat?", + "clearChat": "This will clear the current messages and start a new chat.", + "cancel": "Cancel", + "confirm": "Confirm" + }, + "settingsModal": { + "expandMessages": "Expand Messages", + "hideChainOfThought": "Hide Chain of Thought", + "darkMode": "Dark Mode" + } + }, + "organisms": { + "chat": { + "history": { + "index": { + "lastInputs": "Last Inputs", + "noInputs": "Such empty...", + "loading": "Loading..." + } + }, + "inputBox": { + "input": { + "placeholder": "Type your message here..." + }, + "speechButton": { + "start": "Start recording", + "stop": "Stop recording" + }, + "SubmitButton": { + "sendMessage": "Send message", + "stopTask": "Stop Task" + }, + "UploadButton": { + "attachFiles": "Attach files" + }, + "waterMark": { + "text": "Built with" + } + }, + "Messages": { + "index": { + "running": "Running", + "executedSuccessfully": "executed successfully", + "failed": "failed", + "feedbackUpdated": "Feedback updated", + "updating": "Updating" + } + }, + "dropScreen": { + "dropYourFilesHere": "Drop your files here" + }, + "index": { + "failedToUpload": "Failed to upload", + "cancelledUploadOf": "Cancelled upload of", + "couldNotReachServer": "Could not reach the server", + "continuingChat": "Continuing previous chat" + }, + "settings": { + "settingsPanel": "Settings panel", + "reset": "Reset", + "cancel": "Cancel", + "confirm": "Confirm" + } + }, + "threadHistory": { + "sidebar": { + "filters": { + "FeedbackSelect": { + "feedbackAll": "Feedback: All", + "feedbackPositive": "Feedback: Positive", + "feedbackNegative": "Feedback: Negative" + }, + "SearchBar": { + "search": "Search" + } + }, + "DeleteThreadButton": { + "confirmMessage": "This will delete the thread as well as it's messages and elements.", + "cancel": "Cancel", + "confirm": "Confirm", + "deletingChat": "Deleting chat", + "chatDeleted": "Chat deleted" + }, + "index": { + "pastChats": "Past Chats" + }, + "ThreadList": { + "empty": "Empty..." + }, + "TriggerButton": { + "closeSidebar": "Close sidebar", + "openSidebar": "Open sidebar" + } + }, + "Thread": { + "backToChat": "Go back to chat", + "chatCreatedOn": "This chat was created on" + } + }, + "header": { + "chat": "Chat", + "readme": "Readme" + } + } + }, + "hooks": { + "useLLMProviders": { + "failedToFetchProviders": "Failed to fetch providers:" + } + }, + "pages": { + "Design": {}, + "Env": { + "savedSuccessfully": "Saved successfully", + "requiredApiKeys": "Required API Keys", + "requiredApiKeysInfo": "To use this app, the following API keys are required. The keys are stored on your device's local storage." + }, + "Page": { + "notPartOfProject": "You are not part of this project." + }, + "ResumeButton": { + "resumeChat": "Resume Chat" + } + } +} \ No newline at end of file diff --git a/langchain_folder/.chainlit/translations/pt-BR.json b/langchain_folder/.chainlit/translations/pt-BR.json new file mode 100644 index 0000000..5b42831 --- /dev/null +++ b/langchain_folder/.chainlit/translations/pt-BR.json @@ -0,0 +1,155 @@ +{ + "components": { + "atoms": { + "buttons": { + "userButton": { + "menu": { + "settings": "Configura\u00e7\u00f5es", + "settingsKey": "S", + "APIKeys": "Chaves de API", + "logout": "Sair" + } + } + } + }, + "molecules": { + "newChatButton": { + "newChat": "Nova Conversa" + }, + "tasklist": { + "TaskList": { + "title": "\ud83d\uddd2\ufe0f Lista de Tarefas", + "loading": "Carregando...", + "error": "Ocorreu um erro" + } + }, + "attachments": { + "cancelUpload": "Cancelar envio", + "removeAttachment": "Remover anexo" + }, + "newChatDialog": { + "createNewChat": "Criar novo chat?", + "clearChat": "Isso limpar\u00e1 as mensagens atuais e iniciar\u00e1 uma nova conversa.", + "cancel": "Cancelar", + "confirm": "Confirmar" + }, + "settingsModal": { + "expandMessages": "Expandir Mensagens", + "hideChainOfThought": "Esconder Sequ\u00eancia de Pensamento", + "darkMode": "Modo Escuro" + } + }, + "organisms": { + "chat": { + "history": { + "index": { + "lastInputs": "\u00daltimas Entradas", + "noInputs": "Vazio...", + "loading": "Carregando..." + } + }, + "inputBox": { + "input": { + "placeholder": "Digite sua mensagem aqui..." + }, + "speechButton": { + "start": "Iniciar grava\u00e7\u00e3o", + "stop": "Parar grava\u00e7\u00e3o" + }, + "SubmitButton": { + "sendMessage": "Enviar mensagem", + "stopTask": "Parar Tarefa" + }, + "UploadButton": { + "attachFiles": "Anexar arquivos" + }, + "waterMark": { + "text": "Constru\u00eddo com" + } + }, + "Messages": { + "index": { + "running": "Executando", + "executedSuccessfully": "executado com sucesso", + "failed": "falhou", + "feedbackUpdated": "Feedback atualizado", + "updating": "Atualizando" + } + }, + "dropScreen": { + "dropYourFilesHere": "Solte seus arquivos aqui" + }, + "index": { + "failedToUpload": "Falha ao enviar", + "cancelledUploadOf": "Envio cancelado de", + "couldNotReachServer": "N\u00e3o foi poss\u00edvel conectar ao servidor", + "continuingChat": "Continuando o chat anterior" + }, + "settings": { + "settingsPanel": "Painel de Configura\u00e7\u00f5es", + "reset": "Redefinir", + "cancel": "Cancelar", + "confirm": "Confirmar" + } + }, + "threadHistory": { + "sidebar": { + "filters": { + "FeedbackSelect": { + "feedbackAll": "Feedback: Todos", + "feedbackPositive": "Feedback: Positivo", + "feedbackNegative": "Feedback: Negativo" + }, + "SearchBar": { + "search": "Buscar" + } + }, + "DeleteThreadButton": { + "confirmMessage": "Isso deletar\u00e1 a conversa, assim como suas mensagens e elementos.", + "cancel": "Cancelar", + "confirm": "Confirmar", + "deletingChat": "Deletando conversa", + "chatDeleted": "Conversa deletada" + }, + "index": { + "pastChats": "Conversas Anteriores" + }, + "ThreadList": { + "empty": "Vazio..." + }, + "TriggerButton": { + "closeSidebar": "Fechar barra lateral", + "openSidebar": "Abrir barra lateral" + } + }, + "Thread": { + "backToChat": "Voltar para a conversa", + "chatCreatedOn": "Esta conversa foi criada em" + } + }, + "header": { + "chat": "Conversa", + "readme": "Leia-me" + } + }, + "hooks": { + "useLLMProviders": { + "failedToFetchProviders": "Falha ao buscar provedores:" + } + }, + "pages": { + "Design": {}, + "Env": { + "savedSuccessfully": "Salvo com sucesso", + "requiredApiKeys": "Chaves de API necess\u00e1rias", + "requiredApiKeysInfo": "Para usar este aplicativo, as seguintes chaves de API s\u00e3o necess\u00e1rias. As chaves s\u00e3o armazenadas localmente em seu dispositivo." + }, + "Page": { + "notPartOfProject": "Voc\u00ea n\u00e3o faz parte deste projeto." + }, + "ResumeButton": { + "resumeChat": "Continuar Conversa" + } + } + } +} \ No newline at end of file diff --git a/langchain_local/__init__.py b/langchain_folder/__init__.py similarity index 100% rename from langchain_local/__init__.py rename to langchain_folder/__init__.py diff --git a/langchain_folder/agent.py b/langchain_folder/agent.py new file mode 100644 index 0000000..ca9d312 --- /dev/null +++ b/langchain_folder/agent.py @@ -0,0 +1,168 @@ +import os +import openai +import tempfile + + +from langchain_openai import ChatOpenAI, OpenAIEmbeddings +from langchain_community.llms import ollama +from langchain_community.chat_models import ChatOllama +from langchain.prompts import ChatPromptTemplate +from langchain_core.utils.function_calling import convert_to_openai_function +from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser +from langchain.prompts import MessagesPlaceholder +from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable import RunnablePassthrough, Runnable +from langchain.agents import AgentExecutor +from langchain.memory import ConversationBufferMemory +from langchain.agents.format_scratchpad import format_to_openai_functions +from langchain.pydantic_v1 import BaseModel, Field +from langchain_core.tools import tool +from langchain_community.document_loaders import PyPDFLoader +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_community.vectorstores.docarray import DocArrayInMemorySearch +from langchain.chains import RetrievalQA + +from dotenv import load_dotenv +load_dotenv() + +from langchain_folder.tools.serper_tool import serper_tool +api_key = os.getenv('OPENAI_API_KEY') +os.environ["SERPER_API_KEY"] = os.getenv('SERPER_API_KEY') + + + + +file_path = [] + +class RagToolOne(BaseModel): + query: str = Field(description = "This should be a search query") + + +@tool("rag-tool-one", args_schema=RagToolOne, return_direct=False) +def rag_one(query: str) -> str: + """A tool that retrieves contents that are semantically relevant to the input query from the provided document. + + Args: + query (str): input query from the user. + + Returns: + str: top k amount of retrieved content from the uploaded document. content that are semantically similar to the input query. + """ + try: + pdf_file_path = file_path[0] + + loader = PyPDFLoader(pdf_file_path) + pages = loader.load_and_split() + + text_splitter = RecursiveCharacterTextSplitter() + splits = text_splitter.split_documents(pages) + + embedding = OpenAIEmbeddings(api_key = api_key) + + vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) + + results = vectordb.similarity_search(query, k = 4 ) + result_string = "\n\n".join(str(result) for result in results) + + except FileNotFoundError: + result_string = "" + + return result_string + + + + +"""The second RAG tool""" +class RagToolTwo(BaseModel): + query: str = Field(description = "This should be a search query") + + +@tool("rag-tool-two", args_schema=RagToolTwo, return_direct=False) +def rag_two(query: str) -> str: + """A tool that retrieves contents that are semantically relevant to the input query from the provided document. + + Args: + query (str): input query from the user. + + Returns: + str: top k amount of retrieved content from the uploaded document. content that are semantically similar to the input query. + """ + try: + pdf_file_path = file_path[1] + + loader = PyPDFLoader(pdf_file_path) + pages = loader.load_and_split() + + text_splitter = RecursiveCharacterTextSplitter() + splits = text_splitter.split_documents(pages) + + embedding = OpenAIEmbeddings(api_key = api_key) + + vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) + + results = vectordb.similarity_search(query, k = 4 ) + result_string = "\n\n".join(str(result) for result in results) + except FileNotFoundError: + result_string = "" + + return result_string + + +tools = [rag_one, rag_two, serper_tool] + +functions = [convert_to_openai_function(f) for f in tools] +model = ChatOpenAI(temperature= 0, api_key = api_key).bind_functions(functions=functions) +#model = ChatOllama(model="mistral").bind(functions = functions) + +def generate(query: str): + """Function for interracting with the AI Agent""" + + prompt = ChatPromptTemplate.from_messages([ + ("system", "You are an expert agent with the ability to decide if a function is needed and route queries to the right function"), + MessagesPlaceholder(variable_name="chat_history"), + ("user", "{input}"), + MessagesPlaceholder(variable_name="agent_scratchpad") + ]) + + agent_chain = RunnablePassthrough.assign( + agent_scratchpad = lambda x: format_to_openai_functions(x["intermediate_steps"]) + ) | prompt | model | OpenAIFunctionsAgentOutputParser() + + memory = ConversationBufferMemory(return_message = True, memory_key = "chat_history") + + agent_executor = AgentExecutor(agent = agent_chain, tools = tools, verbose= False, memory = memory) + + result = agent_executor.invoke({"input": query}) + return result['output'] + + +def main(): + st.title("Multi-Agent Chatbot") + st.write("Ask questions based on the uploaded document and get a response") + + texts = st.text_area("Enter your questions here") + + file_uploaded = st.sidebar.file_uploader( + "Upload two PDF files containing any document", key="file_upload", + accept_multiple_files = True + ) + + if st.sidebar.button("Upload PDF File"): + if file_uploaded: + for file in file_uploaded: + while len(file_path) > 2: + file_path.pop(0) + file_path.append(file.name) + + if st.button("Ask Question"): + with st.spinner(text="Generating"): + response = generate(texts) + st.markdown(response) + + +if __name__ =="__main__": + import streamlit as st + + main() + + diff --git a/langchain_folder/agent_chainlit.py b/langchain_folder/agent_chainlit.py new file mode 100644 index 0000000..3f2f56f --- /dev/null +++ b/langchain_folder/agent_chainlit.py @@ -0,0 +1,186 @@ +import os +import openai +import tempfile +import chainlit as cl + + +from langchain_openai import ChatOpenAI, OpenAIEmbeddings +from langchain_community.llms import ollama +from langchain_community.chat_models import ChatOllama +from langchain.prompts import ChatPromptTemplate +from langchain_core.utils.function_calling import convert_to_openai_function +from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser +from langchain.prompts import MessagesPlaceholder +from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable import RunnablePassthrough, Runnable +from langchain.agents import AgentExecutor +from langchain.memory import ConversationBufferMemory +from langchain.agents.format_scratchpad import format_to_openai_functions +from langchain.pydantic_v1 import BaseModel, Field +from langchain_core.tools import tool +from langchain_community.document_loaders import PyPDFLoader +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_community.vectorstores.docarray import DocArrayInMemorySearch +from langchain.chains import RetrievalQA + +from dotenv import load_dotenv +load_dotenv() + +from langchain_folder.tools.serper_tool import serper_tool +api_key = os.getenv('OPENAI_API_KEY') +os.environ["SERPER_API_KEY"] = os.getenv('SERPER_API_KEY') + + + + +file_path = [] + +class RagToolOne(BaseModel): + query: str = Field(description = "This should be a search query") + + +@tool("rag-tool-one", args_schema=RagToolOne, return_direct=False) +def rag_one(query: str) -> str: + """A tool that retrieves contents that are semantically relevant to the input query from the provided document. + + Args: + query (str): input query from the user. + + Returns: + str: top k amount of retrieved content from the uploaded document. content that are semantically similar to the input query. + """ + try: + pdf_file_path = '' + + loader = PyPDFLoader(pdf_file_path) + pages = loader.load_and_split() + + text_splitter = RecursiveCharacterTextSplitter() + splits = text_splitter.split_documents(pages) + + embedding = OpenAIEmbeddings(api_key = api_key) + + vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) + + results = vectordb.similarity_search(query, k = 4 ) + result_string = "\n\n".join(str(result) for result in results) + + except FileNotFoundError: + result_string = "" + + return result_string + + + + +"""The second RAG tool""" +class RagToolTwo(BaseModel): + query: str = Field(description = "This should be a search query") + + +@tool("rag-tool-two", args_schema=RagToolTwo, return_direct=False) +def rag_two(query: str) -> str: + """A tool that retrieves contents that are semantically relevant to the input query from the provided document. + + Args: + query (str): input query from the user. + + Returns: + str: top k amount of retrieved content from the uploaded document. content that are semantically similar to the input query. + """ + try: + pdf_file_path = '' + + loader = PyPDFLoader(pdf_file_path) + pages = loader.load_and_split() + + text_splitter = RecursiveCharacterTextSplitter() + splits = text_splitter.split_documents(pages) + + embedding = OpenAIEmbeddings(api_key = api_key) + + vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) + + results = vectordb.similarity_search(query, k = 4 ) + result_string = "\n\n".join(str(result) for result in results) + except FileNotFoundError: + result_string = "" + + return result_string + + +tools = [rag_one, rag_two, serper_tool] + +functions = [convert_to_openai_function(f) for f in tools] + +#model = ChatOllama(model="mistral").bind(functions = functions) + + + +welcome_message = """Welcome to this AI agent that lets you chat with two large PDF files and +also connects to the internet whenever recent information is needed. To get started: +1. Upload two PDFs +2. Ask a question about the files or any random question requiring new information. +""" +@cl.on_chat_start +async def on_chat_start(): + await cl.Message(content="""Hello there, Welcome to this multi-tool Langchain Agent that connects to the internet and let's you chat + with your data""").send() + files = None + while files == None: + files = await cl.AskFileMessage( + content="please upload a PDF file if you want to chat with a document, upload a max of two files", + accept=["application/pdf"], max_files=2, + max_size_mb=20, timeout=180 + ).send() + + for file in files: + + # with tempfile.NamedTemporaryFile() as temp_file: + # temp_file.write(file.content) + # temp_file_path = temp_file.name + while len(file_path) > 2: + file_path.pop(0) + file_path.append(file) + + + + model = ChatOpenAI(temperature= 0, streaming=True).bind_functions(functions=functions) + prompt = ChatPromptTemplate.from_messages([ + ("system", "You are an expert agent with the ability to decide if a function is needed and route queries to the right function"), + MessagesPlaceholder(variable_name="chat_history"), + ("user", "{question}"), + MessagesPlaceholder(variable_name="agent_scratchpad") + ]) + memory = ConversationBufferMemory(return_message = True, memory_key = "chat_history") + agent_chain = RunnablePassthrough.assign( + agent_scratchpad = lambda x: format_to_openai_functions(x["intermediate_steps"]) + ) | prompt | model | OpenAIFunctionsAgentOutputParser() + + agent_executor = AgentExecutor(agent = agent_chain, tools = tools, verbose= False, memory = memory) + + cl.user_session.set("runnable", agent_executor) + + +@cl.on_message +async def on_message(message: cl.Message): + runnable = cl.user_session.get("runnable") + + msg = cl.Message(content="") + + async for chunk in runnable.astream( + {"question": message.content,}, + config = RunnableConfig(callbacks=[cl.LangchainCallbackHandler()]), + + ): + await msg.stream_token(chunk) + + await msg.send() + + + + + + + + diff --git a/langchain_local/tools/__init__.py b/langchain_folder/tools/__init__.py similarity index 100% rename from langchain_local/tools/__init__.py rename to langchain_folder/tools/__init__.py diff --git a/langchain_local/tools/rag_tool.py b/langchain_folder/tools/rag_tool.py similarity index 50% rename from langchain_local/tools/rag_tool.py rename to langchain_folder/tools/rag_tool.py index 2bfaf6a..4db1e1a 100644 --- a/langchain_local/tools/rag_tool.py +++ b/langchain_folder/tools/rag_tool.py @@ -9,6 +9,9 @@ from langchain_community.vectorstores.docarray import DocArrayInMemorySearch from langchain.chains import RetrievalQA + + + from dotenv import load_dotenv load_dotenv() @@ -16,11 +19,11 @@ api_key = os.getenv('OPENAI_API_KEY') -class RagTool(BaseModel): +class RagToolOne(BaseModel): query: str = Field(description = "This should be a search query") -@tool("rag-tool-one", args_schema=RagTool, return_direct=False) +@tool("rag-tool-one", args_schema=RagToolOne, return_direct=False) def rag_one(query: str) -> str: """A tool that retrieves contents that are semantically relevant to the input query from the provided document. @@ -30,20 +33,24 @@ def rag_one(query: str) -> str: Returns: str: top k amount of retrieved content from the uploaded document. content that are semantically similar to the input query. """ - pdf_file_path = #'/content/data/cover_docs.pdf' - - loader = PyPDFLoader(pdf_file_path) - pages = loader.load_and_split() + try: + pdf_file_path = '' + + loader = PyPDFLoader(pdf_file_path) + pages = loader.load_and_split() - text_splitter = RecursiveCharacterTextSplitter() - splits = text_splitter.split_documents(pages) + text_splitter = RecursiveCharacterTextSplitter() + splits = text_splitter.split_documents(pages) - embedding = OpenAIEmbeddings(api_key = api_key) + embedding = OpenAIEmbeddings(api_key = api_key) - vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) + vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) - results = vectordb.similarity_search(query, k = 4 ) - result_string = "\n\n".join(str(result) for result in results) + results = vectordb.similarity_search(query, k = 4 ) + result_string = "\n\n".join(str(result) for result in results) + + except FileNotFoundError: + result_string = "" return result_string @@ -51,8 +58,11 @@ def rag_one(query: str) -> str: """The second RAG tool""" +class RagToolTwo(BaseModel): + query: str = Field(description = "This should be a search query") + -@tool("rag-tool-two", args_schema=RagTool, return_direct=False) +@tool("rag-tool-two", args_schema=RagToolTwo, return_direct=False) def rag_two(query: str) -> str: """A tool that retrieves contents that are semantically relevant to the input query from the provided document. @@ -62,19 +72,22 @@ def rag_two(query: str) -> str: Returns: str: top k amount of retrieved content from the uploaded document. content that are semantically similar to the input query. """ - pdf_file_path = #'/content/data/ptdf_sop.pdf' + try: + pdf_file_path = '' - loader = PyPDFLoader(pdf_file_path) - pages = loader.load_and_split() + loader = PyPDFLoader(pdf_file_path) + pages = loader.load_and_split() - text_splitter = RecursiveCharacterTextSplitter() - splits = text_splitter.split_documents(pages) + text_splitter = RecursiveCharacterTextSplitter() + splits = text_splitter.split_documents(pages) - embedding = OpenAIEmbeddings(api_key = api_key) + embedding = OpenAIEmbeddings(api_key = api_key) - vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) + vectordb = DocArrayInMemorySearch.from_documents(splits, embedding) - results = vectordb.similarity_search(query, k = 4 ) - result_string = "\n\n".join(str(result) for result in results) + results = vectordb.similarity_search(query, k = 4 ) + result_string = "\n\n".join(str(result) for result in results) + except FileNotFoundError: + result_string = "" - return result_string \ No newline at end of file + return result_string diff --git a/langchain_local/tools/serper_tool.py b/langchain_folder/tools/serper_tool.py similarity index 100% rename from langchain_local/tools/serper_tool.py rename to langchain_folder/tools/serper_tool.py diff --git a/langchain_local/agent.py b/langchain_local/agent.py deleted file mode 100644 index 64acbed..0000000 --- a/langchain_local/agent.py +++ /dev/null @@ -1,51 +0,0 @@ -import os - -from langchain_openai import ChatOpenAI -from langchain_community.llms import ollama -from langchain_community.chat_models import ChatOllama -from langchain.prompts import ChatPromptTemplate -from langchain_core.utils.function_calling import convert_to_openai_function -from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser -from langchain.prompts import MessagesPlaceholder -from langchain.schema.runnable import RunnablePassthrough -from langchain.agents import AgentExecutor -from langchain.memory import ConversationBufferMemory -from langchain.agents.format_scratchpad import format_to_openai_functions -from dotenv import load_dotenv, find_dotenv - - -from tools.rag_tool import rag_one, rag_two -from tools.serper_tool import serper_tool - -_ = load_dotenv(find_dotenv()) - -api_key = os.getenv('OPENAI_API_KEY') - -tools = [rag_one, rag_two, serper_tool] - -functions = [convert_to_openai_function(f) for f in tools] -model = ChatOpenAI(temperature= 0).bind_functions(functions=functions) -#model = ChatOllama(model="mistral").bind(functions = functions) - -def generate(query: str): - """Function for interracting with the AI Agent""" - - prompt = ChatPromptTemplate.from_messages([ - ("system", "You are an expert agent with the ability to decide if a function is needed and route queries to the right function"), - MessagesPlaceholder(variable_name="chat_history"), - ("user", "{input}"), - MessagesPlaceholder(variable_name="agent_scratchpad") - ]) - - agent_chain = RunnablePassthrough.assign( - agent_scratchpad = lambda x: format_to_openai_functions(x["intermediate_steps"]) - ) | prompt | model | OpenAIFunctionsAgentOutputParser() - - memory = ConversationBufferMemory(return_message = True, memory_key = "chat_history") - - agent_executor = AgentExecutor(agent = agent_chain, tools = tools, verbose= False, memory = memory) - - result = agent_executor.invoke({"input": query}) - return result['output'] - - diff --git a/llamaindex/main.py b/llamaindex/main.py index e69de29..d88d2e6 100644 --- a/llamaindex/main.py +++ b/llamaindex/main.py @@ -0,0 +1,83 @@ +import logging +import os +import sys + +logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logging.getLogger().handlers = [] +logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) + +from llama_index.core import ( + VectorStoreIndex, + SimpleDirectoryReader, + StorageContext, + SimpleKeywordTableIndex +) +from llama_index.core import SummaryIndex, Settings +from llama_index.core.node_parser import SentenceSplitter +from llama_index.llms.openai import OpenAI +from llama_index.embeddings.openai import OpenAIEmbedding +from llama_index.core.tools import QueryEngineTool, RetrieverTool +from llama_index.core.query_engine import RouterQueryEngine +from llama_index.core.selectors import LLMSingleSelector + +os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY') + +Settings.llm = OpenAI(model="gpt-3.5-turbo-1106", temperature=0.2) +Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small") + +def generate(query: str, data_dir: str) -> str: + """main function""" + document_dir = data_dir + documents = SimpleDirectoryReader(document_dir).load_data() + + Settings.chunk_size = 1024 + nodes = Settings.node_parser.get_nodes_from_documents(documents) + + storage_context = StorageContext.from_defaults() + storage_context.docstore.add_documents(nodes) + + summary_index = SummaryIndex(nodes, storage_context=storage_context) + vector_index = VectorStoreIndex(nodes, storage_context=storage_context) + keyword_index = SimpleKeywordTableIndex(nodes, storage_context=storage_context) + + list_query_engine = summary_index.as_query_engine( + response_mode = "tree_summarize", + use_async = True +) + vector_query_engine = vector_index.as_query_engine() + keyword_query_engine = keyword_index.as_query_engine() + + list_tool = QueryEngineTool.from_defaults( + query_engine = list_query_engine, + description=( + "useful for summarization questions about the provided document. retrieves all the context" + ) +) + + vector_tool = QueryEngineTool.from_defaults( + query_engine= vector_query_engine, + description= ( + "useful for retrieving specific context from the provided document" + ) + ) + + keyword_tool = QueryEngineTool.from_defaults( + query_engine = keyword_query_engine, + description = ( + "useful for retrieving specific context from the provided document based on (specific entities within query)" + ) + ) + + query_engine = RouterQueryEngine( + selector = LLMSingleSelector.from_defaults(), + query_engine_tools = [ + list_tool, + vector_tool, + keyword_tool + ] + +) + response = query_engine.query(query) + return str(response) + + diff --git a/llamaindex/main_chainlit.py b/llamaindex/main_chainlit.py new file mode 100644 index 0000000..c91e282 --- /dev/null +++ b/llamaindex/main_chainlit.py @@ -0,0 +1,124 @@ +import logging +import openai +import os +import sys +import tempfile +import chainlit as cl + +logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logging.getLogger().handlers = [] +logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) + +from llama_index.core import ( + VectorStoreIndex, + SimpleDirectoryReader, + StorageContext, + SimpleKeywordTableIndex +) +from llama_index.core import SummaryIndex, Settings +from llama_index.core.node_parser import SentenceSplitter +from llama_index.llms.openai import OpenAI +from llama_index.embeddings.openai import OpenAIEmbedding +from llama_index.core.tools import QueryEngineTool, RetrieverTool +from llama_index.core.query_engine import RouterQueryEngine +from llama_index.core.selectors import LLMSingleSelector + +openai.api_key = os.getenv('OPENAI_API_KEY') + +Settings.llm = OpenAI(model="gpt-3.5-turbo-1106", temperature=0.2, streaming=True) +Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small") + +document_dir = "" +documents = SimpleDirectoryReader(document_dir).load_data() + +Settings.chunk_size = 1024 +nodes = Settings.node_parser.get_nodes_from_documents(documents) + +storage_context = StorageContext.from_defaults() +storage_context.docstore.add_documents(nodes) + +summary_index = SummaryIndex(nodes, storage_context=storage_context) +vector_index = VectorStoreIndex(nodes, storage_context=storage_context) +keyword_index = SimpleKeywordTableIndex(nodes, storage_context=storage_context) + + +list_query_engine = summary_index.as_query_engine( + response_mode = "tree_summarize", + use_async = True +) +vector_query_engine = vector_index.as_query_engine() +keyword_query_engine = keyword_index.as_query_engine() + +list_tool = QueryEngineTool.from_defaults( +query_engine = list_query_engine, +description=( + "useful for summarization questions about the provided document. retrieves all the context" +) +) + +vector_tool = QueryEngineTool.from_defaults( + query_engine= vector_query_engine, + description= ( + "useful for retrieving specific context from the provided document" + ) +) + +keyword_tool = QueryEngineTool.from_defaults( + query_engine = keyword_query_engine, + description = ( + "useful for retrieving specific context from the provided document based on (specific entities within query)" + ) +) + + +@cl.on_chat_start +async def factory(): + + files = None + while files == None: + files = await cl.AskFileMessage( + content="please upload a PDF file if you want to chat with a document.", + accept=["application/pdf"], max_files=50, + max_size_mb=20, timeout=180 + ).send() + + temp_dir = tempfile.mkdtemp() + + for file in files: + file_path = os.path.join(temp_dir, file.name) + + with open(file_path, "wb") as f_out: + f_out.write(file.content) + + document_dir += temp_dir + + + + query_engine = RouterQueryEngine( + selector = LLMSingleSelector.from_defaults(), + query_engine_tools = [ + list_tool, + vector_tool, + keyword_tool + ], + streaming = True + +) + cl.user_session.set("query_engine", query_engine) + + +@cl.on_message +async def main(message: cl.Message): + query_engine = cl.user_session.get("query_engine") + response = await cl.make_async(query_engine.query)(message.content) + + response_message = cl.Message(content="") + + for token in response.response_gen: + await response_message.stream_token(token=token) + + if response.response_txt: + response_message.content = response.response_txt + + await response_message.send() + diff --git a/poetry.lock b/poetry.lock index 35ac94b..0b4eb67 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,16 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +[[package]] +name = "aiofiles" +version = "23.2.1" +description = "File support for asyncio." +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, +] + [[package]] name = "aiohttp" version = "3.9.3" @@ -110,6 +121,30 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "altair" +version = "5.2.0" +description = "Vega-Altair: A declarative statistical visualization library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "altair-5.2.0-py3-none-any.whl", hash = "sha256:8c4888ad11db7c39f3f17aa7f4ea985775da389d79ac30a6c22856ab238df399"}, + {file = "altair-5.2.0.tar.gz", hash = "sha256:2ad7f0c8010ebbc46319cc30febfb8e59ccf84969a201541c207bc3a4fa6cf81"}, +] + +[package.dependencies] +jinja2 = "*" +jsonschema = ">=3.0" +numpy = "*" +packaging = "*" +pandas = ">=0.25" +toolz = "*" +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["anywidget", "geopandas", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pyarrow (>=11)", "pytest", "pytest-cov", "ruff (>=0.1.3)", "types-jsonschema", "types-setuptools", "vega-datasets", "vegafusion[embed] (>=1.4.0)", "vl-convert-python (>=1.1.0)"] +doc = ["docutils", "jinja2", "myst-parser", "numpydoc", "pillow (>=9,<10)", "pydata-sphinx-theme (>=0.14.1)", "scipy", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] + [[package]] name = "annotated-types" version = "0.6.0" @@ -123,25 +158,24 @@ files = [ [[package]] name = "anyio" -version = "4.3.0" +version = "3.7.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, ] [package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] [[package]] name = "asgiref" @@ -203,6 +237,20 @@ files = [ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] +[[package]] +name = "asyncer" +version = "0.0.2" +description = "Asyncer, async and await, focused on developer experience." +optional = false +python-versions = ">=3.6.2,<4.0.0" +files = [ + {file = "asyncer-0.0.2-py3-none-any.whl", hash = "sha256:46e0e1423ce21588350ad425875e81795280b9e1f517e8a389de940b86c348bd"}, + {file = "asyncer-0.0.2.tar.gz", hash = "sha256:d546c85f3626ebbaf06bb4395db49761c902a61a6ac802b1a74133cab4f7f433"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<4.0.0" + [[package]] name = "attrs" version = "23.2.0" @@ -294,6 +342,17 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] +[[package]] +name = "bidict" +version = "0.23.1" +description = "The bidirectional mapping library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5"}, + {file = "bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71"}, +] + [[package]] name = "black" version = "24.2.0" @@ -340,6 +399,17 @@ d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "blinker" +version = "1.7.0" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.8" +files = [ + {file = "blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9"}, + {file = "blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"}, +] + [[package]] name = "bs4" version = "0.0.2" @@ -400,6 +470,42 @@ files = [ {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] +[[package]] +name = "chainlit" +version = "1.0.401" +description = "Build Conversational AI." +optional = false +python-versions = ">=3.8.1,<4.0.0" +files = [ + {file = "chainlit-1.0.401-py3-none-any.whl", hash = "sha256:3c4322032a2b9a0becc919048c06576fe0457b343d7793af459976642f78e523"}, + {file = "chainlit-1.0.401.tar.gz", hash = "sha256:9b72e50335741c77a02645a28da311b08ad91bbf68af1533d2e80a9177715f99"}, +] + +[package.dependencies] +aiofiles = ">=23.1.0,<24.0.0" +asyncer = ">=0.0.2,<0.0.3" +click = ">=8.1.3,<9.0.0" +dataclasses_json = ">=0.5.7,<0.6.0" +fastapi = ">=0.100" +fastapi-socketio = ">=0.0.10,<0.0.11" +filetype = ">=1.2.0,<2.0.0" +httpx = ">=0.23.0" +lazify = ">=0.4.0,<0.5.0" +literalai = "0.0.300" +nest-asyncio = ">=1.5.6,<2.0.0" +packaging = ">=23.1,<24.0" +pydantic = ">=1,<3" +pyjwt = ">=2.8.0,<3.0.0" +python-dotenv = ">=1.0.0,<2.0.0" +python-graphql-client = ">=0.4.3,<0.5.0" +python-multipart = ">=0.0.9,<0.0.10" +starlette = "<0.33.0" +syncer = ">=2.0.3,<3.0.0" +tomli = ">=2.0.1,<3.0.0" +uptrace = ">=1.22.0,<2.0.0" +uvicorn = ">=0.25.0,<0.26.0" +watchfiles = ">=0.20.0,<0.21.0" + [[package]] name = "chardet" version = "5.2.0" @@ -510,6 +616,17 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + [[package]] name = "chroma-hnswlib" version = "0.7.3" @@ -658,13 +775,13 @@ tools = ["crewai-tools (>=0.0.15,<0.0.16)"] [[package]] name = "dataclasses-json" -version = "0.6.4" +version = "0.5.14" description = "Easily serialize dataclasses to and from JSON." optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.7,<3.13" files = [ - {file = "dataclasses_json-0.6.4-py3-none-any.whl", hash = "sha256:f90578b8a3177f7552f4e1a6e535e84293cd5da421fcce0642d49c0d7bdf8df2"}, - {file = "dataclasses_json-0.6.4.tar.gz", hash = "sha256:73696ebf24936560cca79a2430cbc4f3dd23ac7bf46ed17f38e5e5e7657a6377"}, + {file = "dataclasses_json-0.5.14-py3-none-any.whl", hash = "sha256:5ec6fed642adb1dbdb4182badb01e0861badfd8fda82e3b67f44b2d1e9d10d21"}, + {file = "dataclasses_json-0.5.14.tar.gz", hash = "sha256:d82896a94c992ffaf689cd1fafc180164e2abdd415b8f94a7f78586af5886236"}, ] [package.dependencies] @@ -856,22 +973,40 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastapi" -version = "0.110.0" +version = "0.108.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.110.0-py3-none-any.whl", hash = "sha256:87a1f6fb632a218222c5984be540055346a8f5d8a68e8f6fb647b1dc9934de4b"}, - {file = "fastapi-0.110.0.tar.gz", hash = "sha256:266775f0dcc95af9d3ef39bad55cff525329a931d5fd51930aadd4f428bf7ff3"}, + {file = "fastapi-0.108.0-py3-none-any.whl", hash = "sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7"}, + {file = "fastapi-0.108.0.tar.gz", hash = "sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296"}, ] [package.dependencies] pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.36.3,<0.37.0" +starlette = ">=0.29.0,<0.33.0" typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-socketio" +version = "0.0.10" +description = "Easily integrate socket.io with your FastAPI app." +optional = false +python-versions = "*" +files = [ + {file = "fastapi-socketio-0.0.10.tar.gz", hash = "sha256:202f9b319f010001cbd1114ec92a0d9eb5f5ca9316eae5fd41a6088da0812727"}, + {file = "fastapi_socketio-0.0.10-py3-none-any.whl", hash = "sha256:11c2bfa3f25d786bd860ed13c892472e86bfeba85e7a0bec4f922ae5e4d8650f"}, +] + +[package.dependencies] +fastapi = ">=0.61.1" +python-socketio = ">=4.6.0" + +[package.extras] +test = ["pytest"] [[package]] name = "filelock" @@ -1032,6 +1167,37 @@ smb = ["smbprotocol"] ssh = ["paramiko"] tqdm = ["tqdm"] +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.42" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.42-py3-none-any.whl", hash = "sha256:1bf9cd7c9e7255f77778ea54359e54ac22a72a5b51288c457c881057b7bb9ecd"}, + {file = "GitPython-3.1.42.tar.gz", hash = "sha256:2d99869e0fef71a73cbd242528105af1d6c1b108c60dfabd994bf292f76c3ceb"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar"] + [[package]] name = "google-auth" version = "2.28.2" @@ -1505,6 +1671,23 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "joblib" version = "1.3.2" @@ -1552,6 +1735,41 @@ files = [ {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] +[[package]] +name = "jsonschema" +version = "4.21.1" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "kubernetes" version = "29.0.0" @@ -1733,6 +1951,33 @@ orjson = ">=3.9.14,<4.0.0" pydantic = ">=1,<3" requests = ">=2,<3" +[[package]] +name = "lazify" +version = "0.4.0" +description = "Lazify all the things!" +optional = false +python-versions = "*" +files = [ + {file = "Lazify-0.4.0-py2.py3-none-any.whl", hash = "sha256:c2c17a7a33e9406897e3f66fde4cd3f84716218d580330e5af10cfe5a0cd195a"}, + {file = "Lazify-0.4.0.tar.gz", hash = "sha256:7102bfe63e56de2ab62b3bc661a7190c4056771a8624f04a8b785275c3dd1f9b"}, +] + +[[package]] +name = "literalai" +version = "0.0.300" +description = "An SDK for observability in Python applications" +optional = false +python-versions = "*" +files = [ + {file = "literalai-0.0.300.tar.gz", hash = "sha256:a7f4d927fcf1fc08b914f4056d8a44a09e958356c4ac40fd4d29ce6cb82a03ef"}, +] + +[package.dependencies] +chevron = ">=0.14.0" +httpx = ">=0.23.0" +packaging = ">=23.0" +pydantic = ">=1,<3" + [[package]] name = "llama-index" version = "0.10.18" @@ -2186,6 +2431,75 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "marshmallow" version = "3.20.2" @@ -2685,6 +2999,21 @@ files = [ deprecated = ">=1.2.6" importlib-metadata = ">=6.0,<7.0" +[[package]] +name = "opentelemetry-exporter-otlp" +version = "1.23.0" +description = "OpenTelemetry Collector Exporters" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_exporter_otlp-1.23.0-py3-none-any.whl", hash = "sha256:92371fdc8d7803465a45801fe30cd8c522ef355a385b0a1d5346d32f77511ea2"}, + {file = "opentelemetry_exporter_otlp-1.23.0.tar.gz", hash = "sha256:4af8798f9bc3bddb92fcbb5b4aa9d0e955d962aa1d9bceaab08891c355a9f907"}, +] + +[package.dependencies] +opentelemetry-exporter-otlp-proto-grpc = "1.23.0" +opentelemetry-exporter-otlp-proto-http = "1.23.0" + [[package]] name = "opentelemetry-exporter-otlp-proto-common" version = "1.23.0" @@ -3477,6 +3806,25 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydeck" +version = "0.8.0" +description = "Widget for deck.gl maps" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydeck-0.8.0-py2.py3-none-any.whl", hash = "sha256:a8fa7757c6f24bba033af39db3147cb020eef44012ba7e60d954de187f9ed4d5"}, + {file = "pydeck-0.8.0.tar.gz", hash = "sha256:07edde833f7cfcef6749124351195aa7dcd24663d4909fd7898dbd0b6fbc01ec"}, +] + +[package.dependencies] +jinja2 = ">=2.10.1" +numpy = ">=1.16.4" + +[package.extras] +carto = ["pydeck-carto"] +jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"] + [[package]] name = "pygments" version = "2.17.2" @@ -3492,6 +3840,23 @@ files = [ plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "pylint" version = "3.1.0" @@ -3681,6 +4046,44 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-engineio" +version = "4.9.0" +description = "Engine.IO server and client for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-engineio-4.9.0.tar.gz", hash = "sha256:e87459c15638e567711fd156e6f9c4a402668871bed79523f0ecfec744729ec7"}, + {file = "python_engineio-4.9.0-py3-none-any.whl", hash = "sha256:979859bff770725b75e60353d7ae53b397e8b517d05ba76733b404a3dcca3e4c"}, +] + +[package.dependencies] +simple-websocket = ">=0.10.0" + +[package.extras] +asyncio-client = ["aiohttp (>=3.4)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] +docs = ["sphinx"] + +[[package]] +name = "python-graphql-client" +version = "0.4.3" +description = "Python GraphQL Client" +optional = false +python-versions = "*" +files = [ + {file = "python_graphql_client-0.4.3-py3-none-any.whl", hash = "sha256:c5eb996702acf46110b352f61819c46065ea4f4f106158535cd471e66490b25e"}, + {file = "python_graphql_client-0.4.3.tar.gz", hash = "sha256:fdbd03115dde8776db02e60414b83b018d7d95e5752d6d5fabf21c99265f5b9d"}, +] + +[package.dependencies] +aiohttp = ">=3.0,<4.0" +requests = ">=2.0,<3.0" +websockets = ">=5.0" + +[package.extras] +dev = ["black", "flake8", "flake8-black", "flake8-docstrings", "flake8-isort", "gitchangelog", "pre-commit", "pystache"] + [[package]] name = "python-iso639" version = "2024.2.7" @@ -3706,6 +4109,40 @@ files = [ {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, ] +[[package]] +name = "python-multipart" +version = "0.0.9" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, +] + +[package.extras] +dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] + +[[package]] +name = "python-socketio" +version = "5.11.1" +description = "Socket.IO server and client for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-socketio-5.11.1.tar.gz", hash = "sha256:bbcbd758ed8c183775cb2853ba001361e2fa018babf5cbe11a5b77e91c2ec2a2"}, + {file = "python_socketio-5.11.1-py3-none-any.whl", hash = "sha256:f1a0228b8b1fbdbd93fbbedd821ebce0ef54b2b5bf6e98fcf710deaa7c574259"}, +] + +[package.dependencies] +bidict = ">=0.21.0" +python-engineio = ">=4.8.0" + +[package.extras] +asyncio-client = ["aiohttp (>=3.4)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] +docs = ["sphinx"] + [[package]] name = "pytz" version = "2024.1" @@ -3779,106 +4216,121 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.6.1" +version = "3.6.2" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.8" files = [ - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"}, - {file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"}, - {file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"}, - {file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"}, - {file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"}, - {file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"}, - {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"}, - {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"}, - {file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a5637e6bf11b15b5aff6ee818c76bdec99ad208511b78985e6209ba648a6e3ee"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:380586664f2f63807050ddb95e7702888b4f0b425abf17655940c411f39287ad"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3168ff565d4b8c239cf11fb604dd2507d30e9bcaac76a4077c0ac23cf2c866ed"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be69f7fd46b5c6467fe5e2fd4cff3816b0c03048eed8a4becb9a73e6000960e7"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbd5894f23fdf5697499cf759523639838ac822bd1600e343fdce7313baa02ae"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85a5b6e026393fe39fb61146b9c17c5af66fffbe1410e992c4bb06d9ec327bd3"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab269adfc64480f209e99f253391a10735edd5c09046e04899adab5fb132f20e"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35aeac852bca06023d6bbd50c1fc504ca5a9a3613d5e75a140f0be7601fa34ef"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e706f302c6a3ae0d74edd0d6ace46aee1ae07c563b436ccf5ff04db2b3571e60"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bec353f022011e6e5cd28ccb8700fbd2a33918197af0d4e0abb3c3f4845cc864"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ef3925daaa93eed20401012e219f569ff0c039ed5bf4ce2d3737b4f75d441622"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6ee98d88ae9ccc77ff61992ed33b2496478def5dc0da55c9a9aa06fcb725a352"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:423c7c588b09d618601097b7a0017dfcb91132a2076bef29023c5f3cd2dc3de1"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-win32.whl", hash = "sha256:c17c5efee347a40a6f4c1eec59e3d7d1e22f7613a97f8b8a07733ef723483a04"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:4209816626d8d6ff8ae7dc248061c6059e618b70c6e6f6e4d7444ae3740b2b85"}, + {file = "rapidfuzz-3.6.2-cp310-cp310-win_arm64.whl", hash = "sha256:1c54d3c85e522d3ac9ee39415f183c8fa184c4f87e7e5a37938f15a6d50e853a"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e06f6d270112f5db001f1cba5a97e1a48aee3d3dbdcbea3ec027c230462dbf9b"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:080cb71b50cb6aff11d1c6aeb157f273e2da0b2bdb3f9d7b01257e49e69a8576"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7895e04a22d6515bc91a850e0831f2405547605aa311d1ffec51e4818abc3c1"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82f9838519136b7083dd1e3149ee80344521f3dc37f744f227505ff0883efb"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a945567c2b0b6e069454c9782d5234b0b6795718adf7a9f868bd3144afa6a023"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:673ba2c343644805acdae1cb949c6a4de71aa2f62a998978551ebea59603af3f"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d457c89bac1471442002e70551e8268e639b3870b4a4521eae363c07253be87"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:495c0d8e14e6f12520eb7fc71b9ba9fcaafb47fc23a654e6e89b6c7985ec0020"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d67b649bf3e1b1722d04eca44d37919aef88305ce7ad05564502d013cf550fd"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e48dde8ca83d11daa00900cf6a5d281a1297aef9b7bfa73801af6e8822be5019"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:824cc381cf81cbf8d158f6935664ec2a69e6ac3b1d39fa201988bf81a257f775"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1dfe4c24957474ce0ac75d886387e30e292b4be39228a6d71f76de414dc187db"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57b98013b802621bbc8b12a46bfc9d36ac552ab51ca207f7ce167ad46adabeb"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-win32.whl", hash = "sha256:9a07dffac439223b4f1025dbfc68f4445a3460a859309c9858c2a3fa29617cdc"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:95a49c6b8bf1229743ae585dd5b7d57f0d15a7eb6e826866d5c9965ba958503c"}, + {file = "rapidfuzz-3.6.2-cp311-cp311-win_arm64.whl", hash = "sha256:af7c19ec86e11488539380d3db1755be5d561a3c0e7b04ff9d07abd7f9a8e9d8"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:de8adc12161bf282c60f12dc9233bb31632f71d446a010fe7469a69b8153427f"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:337e357f693130c4c6be740652542b260e36f622c59e01fa33d58f1d2750c930"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6468f8bc8c3c50604f43631550ef9cfec873515dba5023ca34d461be94669fc8"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74c6773b11445b5e5cf93ca383171cd0ac0cdeafea11a7b2a5688f8bf8d813e6"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1507fc5769aa109dda4de3a15f822a0f6a03e18d627bd0ba3ddbb253cf70e07"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:617949a70150e6fffdaed19253dd49f7a53528411dc8bf7663d499ba21e0f61e"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8b77779174b1b40aa70827692571ab457061897846255ad7d5d559e2edb1932"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80e51b22a7da83f9c87a97e92df07ed0612c74c35496590255f4b5d5b4212dfe"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3ae7c86914cb6673e97e187ba431b9c4cf4177d9ae77f8a1e5b2ba9a5628839e"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ddc380ffaa90f204cc9ddcb779114b9ab6f015246d549de9d47871a97ef9f18a"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3c1dc078ef371fce09f9f3eec2ca4eaa2a8cd412ec53941015b4f39f14d34407"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:9a74102fc5a2534fe91f7507838623e1f3a149d8e05648389c42bb42e14b1c3f"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:48e1eaea8fcd522fca7f04f0480663f0f0cfb77957092cce60a93f4462864996"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-win32.whl", hash = "sha256:66b008bf2972740cd2dda5d382eb8bdb87265cd88198e71c7797bdc0d1f79d20"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:87ac3a87f2251ae2e95fc9478ca5c759de6d141d04c84d3fec9f9cdcfc167b33"}, + {file = "rapidfuzz-3.6.2-cp312-cp312-win_arm64.whl", hash = "sha256:b593cc51aed887e93b78c2f94dfae9008be2b23d17afd3b1f1d3eb3913b58f26"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d830bc7a9b586a374147ec60b08b1f9ae5996b43f75cc514f37faef3866b519"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbee7f5ff11872b76505cbd87c814abc823e8757f11c69062eb3b25130a283da"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c011fb31f2c3f82f503aedd6097d3d3854e574e327a119a3b7eb2cf90b79ca"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cda81d0e0ce0c13abfa46b24e10c1e85f9c6acb628f0a9a948f5779f9c2076a2"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c279928651ce0e9e5220dcb25a00cc53b65e592a0861336a38299bcdca3a596"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35bd4bc9c40e6994c5d6edea4b9319388b4d9711c13c66d543bb4c37624b4184"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d07899506a5a8760448d9df036d528b55a554bf571714173635c79eef4a86e58"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb2e51d01b9c6d6954a3e055c57a80d4685b4fc82719db5519fc153566bcd6bb"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:153d065e353371cc0aeff32b99999a5758266a64e958d1364189367c1c9f6814"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4edcceebb85ebfa49a3ddcde20ad891d36c08dc0fd592efdab0e7d313a4e36af"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3549123fca5bb817341025f98e8e49ca99f84596c7c4f92b658f8e5836040d4a"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:84c1032ae42628465b7a5cc35249906061e18a8193c9c27cbd2db54e9823a9a6"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9bcc91ebd8fc69a6bd3b5711c8250f5f4e70606b4da75ef415f57ad209978205"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-win32.whl", hash = "sha256:f3a70f341c4c111bad910d2df69c78577a98af140319a996af24c9385939335d"}, + {file = "rapidfuzz-3.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:354ad5fe655beb7b279390cb58334903931c5452ecbad1b1666ffb06786498e2"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1b86b93d93020c2b3edc1665d75c8855784845fc0a739b312c26c3a4bf0c80d5"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28243086ed0e50808bb56632e5442c457241646aeafafd501ac87901f40a3237"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed52461ae5a9ea4c400d38e2649c74a413f1a6d8fb8308b66f1fbd122514732f"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a46220f86a5f9cb016af31525e0d0865cad437d02239aa0d8aed2ab8bff1f1c"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81a630ed2fc3ec5fc7400eb66bab1f87e282b4d47f0abe3e48c6634dfa13b5e4"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8e5a437b9089df6242a718d9c31ab1742989e9400a0977af012ef483b63b4c2"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16270b5529de83b7bae7457e952e4d9cf3fbf029a837dd32d415bb9e0eb8e599"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378c04102c7f084cde30a100154fa6d7e2baf0d51a6bdd2f912545559c1fb35"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f18397c8d6a65fc0b288d2fc29bc7baeea6ba91eeb95163a3cd98f23cd3bc85"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2acd2514defce81e6ff4bbff50252d5e7df8e85a731442c4b83e44c86cf1c916"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:1df2faf80201952e252413b6fac6f3e146080dcebb87bb1bb722508e67558ed8"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6440ed0b3007c1c9286b0b88fe2ab2d9e83edd60cd62293b3dfabb732b4e8a30"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4fcfa23b5553b27f4016df77c53172ea743454cf12c28cfa7c35a309a2be93b3"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-win32.whl", hash = "sha256:2d580d937146e803c8e5e1b87916cab8d6f84013b6392713e201efcda335c7d8"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:fe2a68be734e8e88af23385c68d6467e15818b6b1df1cbfebf7bff577226c957"}, + {file = "rapidfuzz-3.6.2-cp39-cp39-win_arm64.whl", hash = "sha256:6478f7803efebf5f644d0b758439c5b25728550fdfbb19783d150004c46a75a9"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:36ce7b68a7b90b787cdd73480a68d2f1ca63c31a3a9d5a79a8736f978e1e9344"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53597fd72a9340bcdd80d3620f4957c2b92f9b569313b969a3abdaffd193aae6"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4f6de745fe6ce46a422d353ee10599013631d7d714a36d025f164b2d4e8c000"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62df2136068e2515ed8beb01756381ff62c29384d785e3bf46e3111d4ea3ba1e"}, + {file = "rapidfuzz-3.6.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7382c90170f60c846c81a07ddd80bb2e8c43c8383754486fa37f67391a571897"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f31314fd2e2f3dc3e519e6f93669462ce7953df2def1c344aa8f5345976d0eb2"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012221629d54d3bee954148247f711eb86d4d390b589ebfe03172ea0b37a7531"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d41dd59a70decfce6595315367a2fea2af660d92a9d144acc6479030501014d7"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f9fa14136a5b0cba1ec42531f7c3e0b0d3edb7fd6bc5e5ae7b498541f3855ab"}, + {file = "rapidfuzz-3.6.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:259364199cbfeca33b1af369fc7951f71717aa285184a3fa5a7b1772da1b89db"}, + {file = "rapidfuzz-3.6.2.tar.gz", hash = "sha256:cf911e792ab0c431694c9bf2648afabfd92099103f2e31492893e078ddca5e1a"}, ] [package.extras] full = ["numpy"] +[[package]] +name = "referencing" +version = "0.34.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "regex" version = "2023.12.25" @@ -3981,6 +4433,26 @@ files = [ {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] +[[package]] +name = "reportlab" +version = "4.1.0" +description = "The Reportlab Toolkit" +optional = false +python-versions = ">=3.7,<4" +files = [ + {file = "reportlab-4.1.0-py3-none-any.whl", hash = "sha256:28a40d5000afbd8ccae15a47f7abe2841768461354bede1a9d42841132997c98"}, + {file = "reportlab-4.1.0.tar.gz", hash = "sha256:3a99faf412691159c068b3ff01c15307ce2fd2cf6b860199434874e002040a84"}, +] + +[package.dependencies] +chardet = "*" +pillow = ">=9.0.0" + +[package.extras] +accel = ["rl-accel (>=0.9.0,<1.1)"] +pycairo = ["freetype-py (>=2.3.0,<2.4)", "rlPyCairo (>=0.2.0,<1)"] +renderpm = ["rl-renderPM (>=4.0.3,<4.1)"] + [[package]] name = "requests" version = "2.31.0" @@ -4038,6 +4510,114 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rpds-py" +version = "0.18.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, +] + [[package]] name = "rsa" version = "4.9" @@ -4068,6 +4648,23 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "simple-websocket" +version = "1.0.0" +description = "Simple WebSocket server and client for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "simple-websocket-1.0.0.tar.gz", hash = "sha256:17d2c72f4a2bd85174a97e3e4c88b01c40c3f81b7b648b0cc3ce1305968928c8"}, + {file = "simple_websocket-1.0.0-py3-none-any.whl", hash = "sha256:1d5bf585e415eaa2083e2bcf02a3ecf91f9712e7b3e6b9fa0b461ad04e0837bc"}, +] + +[package.dependencies] +wsproto = "*" + +[package.extras] +docs = ["sphinx"] + [[package]] name = "six" version = "1.16.0" @@ -4079,6 +4676,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + [[package]] name = "sniffio" version = "1.3.1" @@ -4209,20 +4817,55 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.36.3" +version = "0.32.0.post1" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.36.3-py3-none-any.whl", hash = "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044"}, - {file = "starlette-0.36.3.tar.gz", hash = "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080"}, + {file = "starlette-0.32.0.post1-py3-none-any.whl", hash = "sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09"}, + {file = "starlette-0.32.0.post1.tar.gz", hash = "sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02"}, ] [package.dependencies] anyio = ">=3.4.0,<5" [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "streamlit" +version = "1.32.2" +description = "A faster way to build and share data apps" +optional = false +python-versions = ">=3.8, !=3.9.7" +files = [ + {file = "streamlit-1.32.2-py2.py3-none-any.whl", hash = "sha256:a0b8044e76fec364b07be145f8b40dbd8d083e20ebbb189ceb1fa9423f3dedea"}, + {file = "streamlit-1.32.2.tar.gz", hash = "sha256:1258b9cbc3ff957bf7d09b1bfc85cedc308f1065b30748545295a9af8d5577ab"}, +] + +[package.dependencies] +altair = ">=4.0,<6" +blinker = ">=1.0.0,<2" +cachetools = ">=4.0,<6" +click = ">=7.0,<9" +gitpython = ">=3.0.7,<3.1.19 || >3.1.19,<4" +numpy = ">=1.19.3,<2" +packaging = ">=16.8,<24" +pandas = ">=1.3.0,<3" +pillow = ">=7.1.0,<11" +protobuf = ">=3.20,<5" +pyarrow = ">=7.0" +pydeck = ">=0.8.0b4,<1" +requests = ">=2.27,<3" +rich = ">=10.14.0,<14" +tenacity = ">=8.1.0,<9" +toml = ">=0.10.1,<2" +tornado = ">=6.0.3,<7" +typing-extensions = ">=4.3.0,<5" +watchdog = {version = ">=2.1.5", markers = "platform_system != \"Darwin\""} + +[package.extras] +snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python (>=0.9.0)"] [[package]] name = "striprtf" @@ -4249,6 +4892,16 @@ files = [ [package.dependencies] mpmath = ">=0.19" +[[package]] +name = "syncer" +version = "2.0.3" +description = "Async to sync converter" +optional = false +python-versions = "*" +files = [ + {file = "syncer-2.0.3.tar.gz", hash = "sha256:4340eb54b54368724a78c5c0763824470201804fe9180129daf3635cb500550f"}, +] + [[package]] name = "tabulate" version = "0.9.0" @@ -4456,6 +5109,17 @@ dev = ["tokenizers[testing]"] docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -4478,6 +5142,37 @@ files = [ {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, ] +[[package]] +name = "toolz" +version = "0.12.1" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, +] + +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + [[package]] name = "tqdm" version = "4.66.2" @@ -4598,111 +5293,90 @@ files = [ [[package]] name = "unstructured" -version = "0.12.6" +version = "0.11.8" description = "A library that prepares raw documents for downstream ML tasks." optional = false -python-versions = ">=3.9.0,<3.12" -files = [ - {file = "unstructured-0.12.6-py3-none-any.whl", hash = "sha256:b317957d9d34e23ad884acb2ee48d93afad9f9c10b77c1a764b0459c7a807efc"}, - {file = "unstructured-0.12.6.tar.gz", hash = "sha256:fd971c5ae15730d7303e3c0cf493d5393ec6ca742c7f02f8ba5da1778a92c6f4"}, -] - -[package.dependencies] -backoff = "2.2.1" -beautifulsoup4 = "4.12.3" -certifi = "2024.2.2" -chardet = "5.2.0" -charset-normalizer = "3.3.2" -click = "8.1.7" -dataclasses-json = "0.6.4" -dataclasses-json-speakeasy = "0.5.11" -emoji = "2.10.1" -filetype = "1.2.0" -idna = "3.6" -joblib = "1.3.2" -jsonpath-python = "1.0.6" -langdetect = "1.0.9" -lxml = "5.1.0" -marshmallow = "3.20.2" -mypy-extensions = "1.0.0" -nltk = "3.8.1" -numpy = "1.26.4" -packaging = "23.2" -python-dateutil = "2.8.2" -python-iso639 = "2024.2.7" -python-magic = "0.4.27" -rapidfuzz = "3.6.1" -regex = "2023.12.25" -requests = "2.31.0" -six = "1.16.0" -soupsieve = "2.5" -tabulate = "0.9.0" -tqdm = "4.66.2" -typing-extensions = "4.9.0" -typing-inspect = "0.9.0" -unstructured-client = "0.18.0" -urllib3 = "1.26.18" -wrapt = "1.16.0" +python-versions = ">=3.7.0" +files = [ + {file = "unstructured-0.11.8-py3-none-any.whl", hash = "sha256:71e8d135a723d8c692a0a43683e3dca4a9b3e0fd8a1d255f57689591ed3860c0"}, + {file = "unstructured-0.11.8.tar.gz", hash = "sha256:dba8b2d54fdc781acef6c9590510e1f55e7467abaaf00403031331903d415f07"}, +] + +[package.dependencies] +backoff = "*" +beautifulsoup4 = "*" +chardet = "*" +dataclasses-json = "*" +emoji = "*" +filetype = "*" +langdetect = "*" +lxml = "*" +nltk = "*" +numpy = "*" +python-iso639 = "*" +python-magic = "*" +rapidfuzz = "*" +requests = "*" +tabulate = "*" +typing-extensions = "*" +unstructured-client = "*" +wrapt = "*" [package.extras] -airtable = ["certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "idna (==3.6)", "inflection (==0.5.1)", "pyairtable (==2.2.2)", "pydantic (==1.10.14)", "requests (==2.31.0)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)"] -all-docs = ["antlr4-python3-runtime (==4.9.3)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "coloredlogs (==15.0.1)", "contourpy (==1.2.0)", "cryptography (==42.0.2)", "cycler (==0.12.1)", "deprecated (==1.2.14)", "effdet (==0.4.1)", "et-xmlfile (==1.1.0)", "filelock (==3.13.1)", "flatbuffers (==23.5.26)", "fonttools (==4.49.0)", "fsspec (==2024.2.0)", "huggingface-hub (==0.20.3)", "humanfriendly (==10.0)", "idna (==3.6)", "importlib-metadata (==7.0.1)", "importlib-resources (==6.1.1)", "iopath (==0.1.10)", "jinja2 (==3.1.3)", "kiwisolver (==1.4.5)", "layoutparser[layoutmodels,tesseract] (==0.3.4)", "lxml (==5.1.0)", "markdown (==3.5.2)", "markupsafe (==2.1.5)", "matplotlib (==3.7.2)", "mpmath (==1.3.0)", "msg-parser (==1.2.0)", "networkx (==3.2.1)", "numpy (==1.26.4)", "olefile (==0.47)", "omegaconf (==2.3.0)", "onnx (==1.15.0)", "onnxruntime (==1.15.1)", "opencv-python (==4.8.0.76)", "openpyxl (==3.1.2)", "packaging (==23.2)", "pandas (==2.2.0)", "pdf2image (==1.17.0)", "pdfminer-six (==20221105)", "pdfplumber (==0.10.4)", "pikepdf (==8.11.0)", "pillow (==10.2.0)", "pillow-heif (==0.15.0)", "portalocker (==2.8.2)", "protobuf (==4.23.4)", "pycocotools (==2.0.7)", "pycparser (==2.21)", "pypandoc (==1.12)", "pyparsing (==3.0.9)", "pypdf (==4.0.1)", "pypdfium2 (==4.27.0)", "pytesseract (==0.3.10)", "python-dateutil (==2.8.2)", "python-docx (==1.1.0)", "python-multipart (==0.0.9)", "python-pptx (==0.6.23)", "pytz (==2024.1)", "pyyaml (==6.0.1)", "rapidfuzz (==3.6.1)", "regex (==2023.12.25)", "requests (==2.31.0)", "safetensors (==0.3.2)", "scipy (==1.10.1)", "six (==1.16.0)", "sympy (==1.12)", "timm (==0.9.12)", "tokenizers (==0.15.2)", "torch (==2.2.0)", "torchvision (==0.17.0)", "tqdm (==4.66.2)", "transformers (==4.37.1)", "typing-extensions (==4.9.0)", "tzdata (==2024.1)", "unstructured-inference (==0.7.23)", "unstructured-pytesseract (==0.3.12)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)", "xlrd (==2.0.1)", "xlsxwriter (==3.1.9)", "zipp (==3.17.0)"] -astra = ["anyio (==3.7.1)", "astrapy (==0.7.6)", "cassandra-driver (==3.29.0)", "cassio (==0.1.5)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "click (==8.1.7)", "deprecation (==2.1.0)", "exceptiongroup (==1.2.0)", "geomet (==0.2.1.post1)", "h11 (==0.14.0)", "h2 (==4.1.0)", "hpack (==4.0.0)", "httpcore (==1.0.4)", "httpx[http2] (==0.27.0)", "hyperframe (==6.0.1)", "idna (==3.6)", "numpy (==1.26.4)", "packaging (==23.2)", "requests (==2.31.0)", "six (==1.16.0)", "sniffio (==1.3.0)", "toml (==0.10.2)", "urllib3 (==1.26.18)"] -azure = ["adlfs (==2024.2.0)", "aiohttp (==3.9.3)", "aiosignal (==1.3.1)", "async-timeout (==4.0.3)", "attrs (==23.2.0)", "azure-core (==1.30.0)", "azure-datalake-store (==0.0.53)", "azure-identity (==1.15.0)", "azure-storage-blob (==12.19.0)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "frozenlist (==1.4.1)", "fsspec (==2024.2.0)", "idna (==3.6)", "isodate (==0.6.1)", "msal (==1.26.0)", "msal-extensions (==1.1.0)", "multidict (==6.0.5)", "packaging (==23.2)", "portalocker (==2.8.2)", "pycparser (==2.21)", "pyjwt[crypto] (==2.8.0)", "requests (==2.31.0)", "six (==1.16.0)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)", "yarl (==1.9.4)"] -azure-cognitive-search = ["azure-common (==1.1.28)", "azure-core (==1.30.0)", "azure-search-documents (==11.4.0)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "idna (==3.6)", "isodate (==0.6.1)", "requests (==2.31.0)", "six (==1.16.0)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)"] -bedrock = ["aiohttp (==3.9.3)", "aiosignal (==1.3.1)", "anyio (==3.7.1)", "async-timeout (==4.0.3)", "attrs (==23.2.0)", "boto3 (==1.28.17)", "botocore (==1.31.17)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "dataclasses-json (==0.6.4)", "exceptiongroup (==1.2.0)", "frozenlist (==1.4.1)", "idna (==3.6)", "jmespath (==1.0.1)", "jsonpatch (==1.33)", "jsonpointer (==2.4)", "langchain-community (==0.0.20)", "langchain-core (==0.1.23)", "langsmith (==0.0.87)", "marshmallow (==3.20.2)", "multidict (==6.0.5)", "mypy-extensions (==1.0.0)", "numpy (==1.26.4)", "packaging (==23.2)", "pydantic (==1.10.14)", "python-dateutil (==2.8.2)", "pyyaml (==6.0.1)", "requests (==2.31.0)", "s3transfer (==0.6.2)", "six (==1.16.0)", "sniffio (==1.3.0)", "sqlalchemy (==2.0.27)", "tenacity (==8.2.3)", "typing-extensions (==4.9.0)", "typing-inspect (==0.9.0)", "urllib3 (==1.26.18)", "yarl (==1.9.4)"] -biomed = ["beautifulsoup4 (==4.12.3)", "bs4 (==0.0.2)", "soupsieve (==2.5)"] -box = ["attrs (==23.2.0)", "boxfs (==0.2.1)", "boxsdk[jwt] (==3.9.2)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "fsspec (==2024.2.0)", "idna (==3.6)", "pycparser (==2.21)", "pyjwt (==2.8.0)", "python-dateutil (==2.8.2)", "requests (==2.31.0)", "requests-toolbelt (==1.0.0)", "six (==1.16.0)", "urllib3 (==1.26.18)"] -chroma = ["anyio (==3.7.1)", "asgiref (==3.7.2)", "backoff (==2.2.1)", "bcrypt (==4.1.2)", "build (==1.0.3)", "cachetools (==5.3.2)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "chroma-hnswlib (==0.7.3)", "chromadb (==0.4.22)", "click (==8.1.7)", "coloredlogs (==15.0.1)", "deprecated (==1.2.14)", "exceptiongroup (==1.2.0)", "fastapi (==0.109.2)", "filelock (==3.13.1)", "flatbuffers (==23.5.26)", "fsspec (==2024.2.0)", "google-auth (==2.28.0)", "googleapis-common-protos (==1.62.0)", "grpcio (==1.60.1)", "h11 (==0.14.0)", "httptools (==0.6.1)", "huggingface-hub (==0.20.3)", "humanfriendly (==10.0)", "idna (==3.6)", "importlib-metadata (==6.11.0)", "importlib-resources (==6.1.1)", "kubernetes (==29.0.0)", "mmh3 (==4.1.0)", "monotonic (==1.6)", "mpmath (==1.3.0)", "numpy (==1.26.4)", "oauthlib (==3.2.2)", "onnxruntime (==1.15.1)", "opentelemetry-api (==1.22.0)", "opentelemetry-exporter-otlp-proto-common (==1.22.0)", "opentelemetry-exporter-otlp-proto-grpc (==1.22.0)", "opentelemetry-instrumentation (==0.43b0)", "opentelemetry-instrumentation-asgi (==0.43b0)", "opentelemetry-instrumentation-fastapi (==0.43b0)", "opentelemetry-proto (==1.22.0)", "opentelemetry-sdk (==1.22.0)", "opentelemetry-semantic-conventions (==0.43b0)", "opentelemetry-util-http (==0.43b0)", "overrides (==7.7.0)", "packaging (==23.2)", "posthog (==3.4.1)", "protobuf (==4.23.4)", "pulsar-client (==3.4.0)", "pyasn1 (==0.5.1)", "pyasn1-modules (==0.3.0)", "pydantic (==1.10.14)", "pypika (==0.48.9)", "pyproject-hooks (==1.0.0)", "python-dateutil (==2.8.2)", "python-dotenv (==1.0.1)", "pyyaml (==6.0.1)", "requests (==2.31.0)", "requests-oauthlib (==1.3.1)", "rsa (==4.9)", "six (==1.16.0)", "sniffio (==1.3.0)", "starlette (==0.36.3)", "sympy (==1.12)", "tenacity (==8.2.3)", "tokenizers (==0.15.2)", "tomli (==2.0.1)", "tqdm (==4.66.2)", "typer (==0.9.0)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)", "uvicorn[standard] (==0.27.1)", "uvloop (==0.19.0)", "watchfiles (==0.21.0)", "websocket-client (==1.7.0)", "websockets (==12.0)", "wrapt (==1.16.0)", "zipp (==3.17.0)"] -confluence = ["atlassian-python-api (==3.41.10)", "beautifulsoup4 (==4.12.3)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "deprecated (==1.2.14)", "idna (==3.6)", "jmespath (==1.0.1)", "oauthlib (==3.2.2)", "requests (==2.31.0)", "requests-oauthlib (==1.3.1)", "six (==1.16.0)", "soupsieve (==2.5)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)"] -csv = ["numpy (==1.26.4)", "pandas (==2.2.0)", "python-dateutil (==2.8.2)", "pytz (==2024.1)", "six (==1.16.0)", "tzdata (==2024.1)"] -databricks-volumes = ["cachetools (==5.3.2)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "databricks-sdk (==0.19.1)", "google-auth (==2.28.0)", "idna (==3.6)", "pyasn1 (==0.5.1)", "pyasn1-modules (==0.3.0)", "requests (==2.31.0)", "rsa (==4.9)", "urllib3 (==1.26.18)"] -delta-table = ["deltalake (==0.15.3)", "fsspec (==2024.2.0)", "numpy (==1.26.4)", "pyarrow (==15.0.0)", "pyarrow-hotfix (==0.6)"] -discord = ["aiohttp (==3.9.3)", "aiosignal (==1.3.1)", "async-timeout (==4.0.3)", "attrs (==23.2.0)", "discord-py (==2.3.2)", "frozenlist (==1.4.1)", "idna (==3.6)", "multidict (==6.0.5)", "yarl (==1.9.4)"] -doc = ["lxml (==5.1.0)", "python-docx (==1.1.0)", "typing-extensions (==4.9.0)"] -docx = ["lxml (==5.1.0)", "python-docx (==1.1.0)", "typing-extensions (==4.9.0)"] -dropbox = ["certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "dropbox (==11.36.2)", "dropboxdrivefs (==1.3.1)", "fsspec (==2024.2.0)", "idna (==3.6)", "ply (==3.11)", "requests (==2.31.0)", "six (==1.16.0)", "stone (==3.3.1)", "urllib3 (==1.26.18)"] -elasticsearch = ["certifi (==2024.2.2)", "elastic-transport (==8.12.0)", "elasticsearch (==8.12.0)", "urllib3 (==1.26.18)"] -embed-huggingface = ["aiohttp (==3.9.3)", "aiosignal (==1.3.1)", "anyio (==3.7.1)", "async-timeout (==4.0.3)", "attrs (==23.2.0)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "click (==8.1.7)", "dataclasses-json (==0.6.4)", "exceptiongroup (==1.2.0)", "filelock (==3.13.1)", "frozenlist (==1.4.1)", "fsspec (==2024.2.0)", "huggingface (==0.0.1)", "huggingface-hub (==0.20.3)", "idna (==3.6)", "jinja2 (==3.1.3)", "joblib (==1.3.2)", "jsonpatch (==1.33)", "jsonpointer (==2.4)", "langchain-community (==0.0.20)", "langchain-core (==0.1.23)", "langsmith (==0.0.87)", "markupsafe (==2.1.5)", "marshmallow (==3.20.2)", "mpmath (==1.3.0)", "multidict (==6.0.5)", "mypy-extensions (==1.0.0)", "networkx (==3.2.1)", "nltk (==3.8.1)", "numpy (==1.26.4)", "packaging (==23.2)", "pillow (==10.2.0)", "pydantic (==1.10.14)", "pyyaml (==6.0.1)", "regex (==2023.12.25)", "requests (==2.31.0)", "safetensors (==0.3.2)", "scikit-learn (==1.4.0)", "scipy (==1.10.1)", "sentence-transformers (==2.3.1)", "sentencepiece (==0.1.99)", "sniffio (==1.3.0)", "sqlalchemy (==2.0.27)", "sympy (==1.12)", "tenacity (==8.2.3)", "threadpoolctl (==3.3.0)", "tokenizers (==0.15.2)", "torch (==2.2.0)", "tqdm (==4.66.2)", "transformers (==4.37.1)", "typing-extensions (==4.9.0)", "typing-inspect (==0.9.0)", "urllib3 (==1.26.18)", "yarl (==1.9.4)"] -epub = ["pypandoc (==1.12)"] -gcs = ["aiohttp (==3.9.3)", "aiosignal (==1.3.1)", "async-timeout (==4.0.3)", "attrs (==23.2.0)", "beautifulsoup4 (==4.12.3)", "bs4 (==0.0.2)", "cachetools (==5.3.2)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "decorator (==5.1.1)", "frozenlist (==1.4.1)", "fsspec (==2024.2.0)", "gcsfs (==2024.2.0)", "google-api-core (==2.17.1)", "google-auth (==2.28.0)", "google-auth-oauthlib (==1.2.0)", "google-cloud-core (==2.4.1)", "google-cloud-storage (==2.14.0)", "google-crc32c (==1.5.0)", "google-resumable-media (==2.7.0)", "googleapis-common-protos (==1.62.0)", "idna (==3.6)", "multidict (==6.0.5)", "oauthlib (==3.2.2)", "protobuf (==4.23.4)", "pyasn1 (==0.5.1)", "pyasn1-modules (==0.3.0)", "requests (==2.31.0)", "requests-oauthlib (==1.3.1)", "rsa (==4.9)", "soupsieve (==2.5)", "urllib3 (==1.26.18)", "yarl (==1.9.4)"] -github = ["certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "deprecated (==1.2.14)", "idna (==3.6)", "pycparser (==2.21)", "pygithub (==2.2.0)", "pyjwt[crypto] (==2.8.0)", "pynacl (==1.5.0)", "requests (==2.31.0)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)"] -gitlab = ["certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "idna (==3.6)", "python-gitlab (==4.4.0)", "requests (==2.31.0)", "requests-toolbelt (==1.0.0)", "urllib3 (==1.26.18)"] -google-drive = ["cachetools (==5.3.2)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "google-api-core (==2.17.1)", "google-api-python-client (==2.118.0)", "google-auth (==2.28.0)", "google-auth-httplib2 (==0.2.0)", "googleapis-common-protos (==1.62.0)", "httplib2 (==0.22.0)", "idna (==3.6)", "protobuf (==4.23.4)", "pyasn1 (==0.5.1)", "pyasn1-modules (==0.3.0)", "pyparsing (==3.0.9)", "requests (==2.31.0)", "rsa (==4.9)", "uritemplate (==4.1.1)", "urllib3 (==1.26.18)"] -hubspot = ["certifi (==2024.2.2)", "hubspot-api-client (==8.2.1)", "python-dateutil (==2.8.2)", "six (==1.16.0)", "urllib3 (==1.26.18)"] -huggingface = ["certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "click (==8.1.7)", "filelock (==3.13.1)", "fsspec (==2024.2.0)", "huggingface-hub (==0.20.3)", "idna (==3.6)", "jinja2 (==3.1.3)", "joblib (==1.3.2)", "langdetect (==1.0.9)", "markupsafe (==2.1.5)", "mpmath (==1.3.0)", "networkx (==3.2.1)", "numpy (==1.26.4)", "packaging (==23.2)", "pyyaml (==6.0.1)", "regex (==2023.12.25)", "requests (==2.31.0)", "sacremoses (==0.1.1)", "safetensors (==0.3.2)", "sentencepiece (==0.1.99)", "six (==1.16.0)", "sympy (==1.12)", "tokenizers (==0.15.2)", "torch (==2.2.0)", "tqdm (==4.66.2)", "transformers (==4.37.1)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)"] -image = ["antlr4-python3-runtime (==4.9.3)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "coloredlogs (==15.0.1)", "contourpy (==1.2.0)", "cryptography (==42.0.2)", "cycler (==0.12.1)", "deprecated (==1.2.14)", "effdet (==0.4.1)", "filelock (==3.13.1)", "flatbuffers (==23.5.26)", "fonttools (==4.49.0)", "fsspec (==2024.2.0)", "huggingface-hub (==0.20.3)", "humanfriendly (==10.0)", "idna (==3.6)", "importlib-resources (==6.1.1)", "iopath (==0.1.10)", "jinja2 (==3.1.3)", "kiwisolver (==1.4.5)", "layoutparser[layoutmodels,tesseract] (==0.3.4)", "lxml (==5.1.0)", "markupsafe (==2.1.5)", "matplotlib (==3.7.2)", "mpmath (==1.3.0)", "networkx (==3.2.1)", "numpy (==1.26.4)", "omegaconf (==2.3.0)", "onnx (==1.15.0)", "onnxruntime (==1.15.1)", "opencv-python (==4.8.0.76)", "packaging (==23.2)", "pandas (==2.2.0)", "pdf2image (==1.17.0)", "pdfminer-six (==20221105)", "pdfplumber (==0.10.4)", "pikepdf (==8.11.0)", "pillow (==10.2.0)", "pillow-heif (==0.15.0)", "portalocker (==2.8.2)", "protobuf (==4.23.4)", "pycocotools (==2.0.7)", "pycparser (==2.21)", "pyparsing (==3.0.9)", "pypdf (==4.0.1)", "pypdfium2 (==4.27.0)", "pytesseract (==0.3.10)", "python-dateutil (==2.8.2)", "python-multipart (==0.0.9)", "pytz (==2024.1)", "pyyaml (==6.0.1)", "rapidfuzz (==3.6.1)", "regex (==2023.12.25)", "requests (==2.31.0)", "safetensors (==0.3.2)", "scipy (==1.10.1)", "six (==1.16.0)", "sympy (==1.12)", "timm (==0.9.12)", "tokenizers (==0.15.2)", "torch (==2.2.0)", "torchvision (==0.17.0)", "tqdm (==4.66.2)", "transformers (==4.37.1)", "typing-extensions (==4.9.0)", "tzdata (==2024.1)", "unstructured-inference (==0.7.23)", "unstructured-pytesseract (==0.3.12)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)", "zipp (==3.17.0)"] -jira = ["atlassian-python-api (==3.41.10)", "beautifulsoup4 (==4.12.3)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "deprecated (==1.2.14)", "idna (==3.6)", "jmespath (==1.0.1)", "oauthlib (==3.2.2)", "requests (==2.31.0)", "requests-oauthlib (==1.3.1)", "six (==1.16.0)", "soupsieve (==2.5)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)"] -local-inference = ["antlr4-python3-runtime (==4.9.3)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "coloredlogs (==15.0.1)", "contourpy (==1.2.0)", "cryptography (==42.0.2)", "cycler (==0.12.1)", "deprecated (==1.2.14)", "effdet (==0.4.1)", "et-xmlfile (==1.1.0)", "filelock (==3.13.1)", "flatbuffers (==23.5.26)", "fonttools (==4.49.0)", "fsspec (==2024.2.0)", "huggingface-hub (==0.20.3)", "humanfriendly (==10.0)", "idna (==3.6)", "importlib-metadata (==7.0.1)", "importlib-resources (==6.1.1)", "iopath (==0.1.10)", "jinja2 (==3.1.3)", "kiwisolver (==1.4.5)", "layoutparser[layoutmodels,tesseract] (==0.3.4)", "lxml (==5.1.0)", "markdown (==3.5.2)", "markupsafe (==2.1.5)", "matplotlib (==3.7.2)", "mpmath (==1.3.0)", "msg-parser (==1.2.0)", "networkx (==3.2.1)", "numpy (==1.26.4)", "olefile (==0.47)", "omegaconf (==2.3.0)", "onnx (==1.15.0)", "onnxruntime (==1.15.1)", "opencv-python (==4.8.0.76)", "openpyxl (==3.1.2)", "packaging (==23.2)", "pandas (==2.2.0)", "pdf2image (==1.17.0)", "pdfminer-six (==20221105)", "pdfplumber (==0.10.4)", "pikepdf (==8.11.0)", "pillow (==10.2.0)", "pillow-heif (==0.15.0)", "portalocker (==2.8.2)", "protobuf (==4.23.4)", "pycocotools (==2.0.7)", "pycparser (==2.21)", "pypandoc (==1.12)", "pyparsing (==3.0.9)", "pypdf (==4.0.1)", "pypdfium2 (==4.27.0)", "pytesseract (==0.3.10)", "python-dateutil (==2.8.2)", "python-docx (==1.1.0)", "python-multipart (==0.0.9)", "python-pptx (==0.6.23)", "pytz (==2024.1)", "pyyaml (==6.0.1)", "rapidfuzz (==3.6.1)", "regex (==2023.12.25)", "requests (==2.31.0)", "safetensors (==0.3.2)", "scipy (==1.10.1)", "six (==1.16.0)", "sympy (==1.12)", "timm (==0.9.12)", "tokenizers (==0.15.2)", "torch (==2.2.0)", "torchvision (==0.17.0)", "tqdm (==4.66.2)", "transformers (==4.37.1)", "typing-extensions (==4.9.0)", "tzdata (==2024.1)", "unstructured-inference (==0.7.23)", "unstructured-pytesseract (==0.3.12)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)", "xlrd (==2.0.1)", "xlsxwriter (==3.1.9)", "zipp (==3.17.0)"] -md = ["importlib-metadata (==7.0.1)", "markdown (==3.5.2)", "zipp (==3.17.0)"] -mongodb = ["dnspython (==2.5.0)", "pymongo (==4.6.1)"] -msg = ["msg-parser (==1.2.0)", "olefile (==0.47)"] -notion = ["anyio (==3.7.1)", "certifi (==2024.2.2)", "exceptiongroup (==1.2.0)", "h11 (==0.14.0)", "htmlbuilder (==1.0.0)", "httpcore (==1.0.3)", "httpx (==0.26.0)", "idna (==3.6)", "notion-client (==2.2.1)", "sniffio (==1.3.0)"] -odt = ["lxml (==5.1.0)", "pypandoc (==1.12)", "python-docx (==1.1.0)", "typing-extensions (==4.9.0)"] -onedrive = ["beautifulsoup4 (==4.12.3)", "bs4 (==0.0.2)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "idna (==3.6)", "msal (==1.26.0)", "office365-rest-python-client (==2.4.2)", "pycparser (==2.21)", "pyjwt[crypto] (==2.8.0)", "pytz (==2024.1)", "requests (==2.31.0)", "soupsieve (==2.5)", "urllib3 (==1.26.18)"] -openai = ["aiohttp (==3.9.3)", "aiosignal (==1.3.1)", "anyio (==3.7.1)", "async-timeout (==4.0.3)", "attrs (==23.2.0)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "dataclasses-json (==0.6.4)", "distro (==1.9.0)", "exceptiongroup (==1.2.0)", "frozenlist (==1.4.1)", "h11 (==0.14.0)", "httpcore (==1.0.3)", "httpx (==0.26.0)", "idna (==3.6)", "jsonpatch (==1.33)", "jsonpointer (==2.4)", "langchain-community (==0.0.20)", "langchain-core (==0.1.23)", "langsmith (==0.0.87)", "marshmallow (==3.20.2)", "multidict (==6.0.5)", "mypy-extensions (==1.0.0)", "numpy (==1.26.4)", "openai (==1.12.0)", "packaging (==23.2)", "pydantic (==1.10.14)", "pyyaml (==6.0.1)", "regex (==2023.12.25)", "requests (==2.31.0)", "sniffio (==1.3.0)", "sqlalchemy (==2.0.27)", "tenacity (==8.2.3)", "tiktoken (==0.6.0)", "tqdm (==4.66.2)", "typing-extensions (==4.9.0)", "typing-inspect (==0.9.0)", "urllib3 (==1.26.18)", "yarl (==1.9.4)"] -opensearch = ["certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "idna (==3.6)", "opensearch-py (==2.4.2)", "python-dateutil (==2.8.2)", "requests (==2.31.0)", "six (==1.16.0)", "urllib3 (==1.26.18)"] -org = ["pypandoc (==1.12)"] -outlook = ["certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "idna (==3.6)", "msal (==1.26.0)", "office365-rest-python-client (==2.4.2)", "pycparser (==2.21)", "pyjwt[crypto] (==2.8.0)", "pytz (==2024.1)", "requests (==2.31.0)", "urllib3 (==1.26.18)"] -paddleocr = ["attrdict (==2.0.1)", "babel (==2.14.0)", "bce-python-sdk (==0.9.4)", "blinker (==1.7.0)", "cachetools (==5.3.2)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "click (==8.1.7)", "contourpy (==1.2.0)", "cssselect (==1.2.0)", "cssutils (==2.9.0)", "cycler (==0.12.1)", "cython (==3.0.8)", "et-xmlfile (==1.1.0)", "flask (==3.0.2)", "flask-babel (==4.0.0)", "fonttools (==4.49.0)", "future (==0.18.3)", "idna (==3.6)", "imageio (==2.34.0)", "imgaug (==0.4.0)", "importlib-metadata (==7.0.1)", "importlib-resources (==6.1.1)", "itsdangerous (==2.1.2)", "jinja2 (==3.1.3)", "kiwisolver (==1.4.5)", "lanms-neo (==1.0.2)", "lazy-loader (==0.3)", "lmdb (==1.4.1)", "lxml (==5.1.0)", "markupsafe (==2.1.5)", "matplotlib (==3.7.2)", "networkx (==3.2.1)", "numpy (==1.26.4)", "opencv-contrib-python (==4.8.0.76)", "opencv-python (==4.8.0.76)", "openpyxl (==3.1.2)", "packaging (==23.2)", "pandas (==2.2.0)", "pdf2image (==1.17.0)", "pillow (==10.2.0)", "polygon3 (==3.0.9.1)", "premailer (==3.10.0)", "protobuf (==4.23.4)", "psutil (==5.9.8)", "pyclipper (==1.3.0.post5)", "pycryptodome (==3.20.0)", "pyparsing (==3.0.9)", "python-dateutil (==2.8.2)", "pytz (==2024.1)", "rapidfuzz (==3.6.1)", "rarfile (==4.1)", "requests (==2.31.0)", "scikit-image (==0.22.0)", "scipy (==1.10.1)", "shapely (==2.0.2)", "six (==1.16.0)", "tifffile (==2024.2.12)", "tqdm (==4.66.2)", "tzdata (==2024.1)", "unstructured-paddleocr (==2.6.1.3)", "urllib3 (==1.26.18)", "visualdl (==2.5.3)", "werkzeug (==3.0.1)", "zipp (==3.17.0)"] -pdf = ["antlr4-python3-runtime (==4.9.3)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "coloredlogs (==15.0.1)", "contourpy (==1.2.0)", "cryptography (==42.0.2)", "cycler (==0.12.1)", "deprecated (==1.2.14)", "effdet (==0.4.1)", "filelock (==3.13.1)", "flatbuffers (==23.5.26)", "fonttools (==4.49.0)", "fsspec (==2024.2.0)", "huggingface-hub (==0.20.3)", "humanfriendly (==10.0)", "idna (==3.6)", "importlib-resources (==6.1.1)", "iopath (==0.1.10)", "jinja2 (==3.1.3)", "kiwisolver (==1.4.5)", "layoutparser[layoutmodels,tesseract] (==0.3.4)", "lxml (==5.1.0)", "markupsafe (==2.1.5)", "matplotlib (==3.7.2)", "mpmath (==1.3.0)", "networkx (==3.2.1)", "numpy (==1.26.4)", "omegaconf (==2.3.0)", "onnx (==1.15.0)", "onnxruntime (==1.15.1)", "opencv-python (==4.8.0.76)", "packaging (==23.2)", "pandas (==2.2.0)", "pdf2image (==1.17.0)", "pdfminer-six (==20221105)", "pdfplumber (==0.10.4)", "pikepdf (==8.11.0)", "pillow (==10.2.0)", "pillow-heif (==0.15.0)", "portalocker (==2.8.2)", "protobuf (==4.23.4)", "pycocotools (==2.0.7)", "pycparser (==2.21)", "pyparsing (==3.0.9)", "pypdf (==4.0.1)", "pypdfium2 (==4.27.0)", "pytesseract (==0.3.10)", "python-dateutil (==2.8.2)", "python-multipart (==0.0.9)", "pytz (==2024.1)", "pyyaml (==6.0.1)", "rapidfuzz (==3.6.1)", "regex (==2023.12.25)", "requests (==2.31.0)", "safetensors (==0.3.2)", "scipy (==1.10.1)", "six (==1.16.0)", "sympy (==1.12)", "timm (==0.9.12)", "tokenizers (==0.15.2)", "torch (==2.2.0)", "torchvision (==0.17.0)", "tqdm (==4.66.2)", "transformers (==4.37.1)", "typing-extensions (==4.9.0)", "tzdata (==2024.1)", "unstructured-inference (==0.7.23)", "unstructured-pytesseract (==0.3.12)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)", "zipp (==3.17.0)"] -pinecone = ["certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "dnspython (==2.5.0)", "idna (==3.6)", "loguru (==0.7.2)", "numpy (==1.26.4)", "pinecone-client (==2.2.4)", "python-dateutil (==2.8.2)", "pyyaml (==6.0.1)", "requests (==2.31.0)", "six (==1.16.0)", "tqdm (==4.66.2)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)"] -postgres = ["psycopg2-binary (==2.9.9)"] -ppt = ["lxml (==5.1.0)", "pillow (==10.2.0)", "python-pptx (==0.6.23)", "xlsxwriter (==3.1.9)"] -pptx = ["lxml (==5.1.0)", "pillow (==10.2.0)", "python-pptx (==0.6.23)", "xlsxwriter (==3.1.9)"] -qdrant = ["anyio (==3.7.1)", "certifi (==2024.2.2)", "exceptiongroup (==1.2.0)", "grpcio (==1.60.1)", "grpcio-tools (==1.60.1)", "h11 (==0.14.0)", "h2 (==4.1.0)", "hpack (==4.0.0)", "httpcore (==1.0.3)", "httpx[http2] (==0.26.0)", "hyperframe (==6.0.1)", "idna (==3.6)", "numpy (==1.26.4)", "portalocker (==2.8.2)", "protobuf (==4.23.4)", "pydantic (==1.10.14)", "qdrant-client (==1.7.3)", "sniffio (==1.3.0)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)"] -reddit = ["certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "idna (==3.6)", "praw (==7.7.1)", "prawcore (==2.4.0)", "requests (==2.31.0)", "update-checker (==0.18.0)", "urllib3 (==1.26.18)", "websocket-client (==1.7.0)"] -rst = ["pypandoc (==1.12)"] -rtf = ["pypandoc (==1.12)"] -s3 = ["aiobotocore (==2.7.0)", "aiohttp (==3.9.3)", "aioitertools (==0.11.0)", "aiosignal (==1.3.1)", "async-timeout (==4.0.3)", "attrs (==23.2.0)", "botocore (==1.31.17)", "frozenlist (==1.4.1)", "fsspec (==2024.2.0)", "idna (==3.6)", "jmespath (==1.0.1)", "multidict (==6.0.5)", "python-dateutil (==2.8.2)", "s3fs (==2024.2.0)", "six (==1.16.0)", "typing-extensions (==4.9.0)", "urllib3 (==1.26.18)", "wrapt (==1.16.0)", "yarl (==1.9.4)"] -salesforce = ["attrs (==23.2.0)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "idna (==3.6)", "isodate (==0.6.1)", "lxml (==5.1.0)", "more-itertools (==10.2.0)", "pendulum (==3.0.0)", "platformdirs (==3.10.0)", "pycparser (==2.21)", "pyjwt (==2.8.0)", "python-dateutil (==2.8.2)", "pytz (==2024.1)", "requests (==2.31.0)", "requests-file (==2.0.0)", "requests-toolbelt (==1.0.0)", "simple-salesforce (==1.12.5)", "six (==1.16.0)", "time-machine (==2.13.0)", "tzdata (==2024.1)", "urllib3 (==1.26.18)", "zeep (==4.2.1)"] -sftp = ["bcrypt (==4.1.2)", "cffi (==1.16.0)", "cryptography (==42.0.2)", "fsspec (==2024.2.0)", "paramiko (==3.4.0)", "pycparser (==2.21)", "pynacl (==1.5.0)"] -sharepoint = ["certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "idna (==3.6)", "msal (==1.26.0)", "office365-rest-python-client (==2.4.2)", "pycparser (==2.21)", "pyjwt[crypto] (==2.8.0)", "pytz (==2024.1)", "requests (==2.31.0)", "urllib3 (==1.26.18)"] -slack = ["slack-sdk (==3.27.0)"] -tsv = ["numpy (==1.26.4)", "pandas (==2.2.0)", "python-dateutil (==2.8.2)", "pytz (==2024.1)", "six (==1.16.0)", "tzdata (==2024.1)"] -weaviate = ["authlib (==1.3.0)", "certifi (==2024.2.2)", "cffi (==1.16.0)", "charset-normalizer (==3.3.2)", "cryptography (==42.0.2)", "idna (==3.6)", "pycparser (==2.21)", "requests (==2.31.0)", "urllib3 (==1.26.18)", "validators (==0.22.0)", "weaviate-client (==3.26.2)"] -wikipedia = ["beautifulsoup4 (==4.12.3)", "certifi (==2024.2.2)", "charset-normalizer (==3.3.2)", "idna (==3.6)", "requests (==2.31.0)", "soupsieve (==2.5)", "urllib3 (==1.26.18)", "wikipedia (==1.4.0)"] -xlsx = ["et-xmlfile (==1.1.0)", "networkx (==3.2.1)", "numpy (==1.26.4)", "openpyxl (==3.1.2)", "pandas (==2.2.0)", "python-dateutil (==2.8.2)", "pytz (==2024.1)", "six (==1.16.0)", "tzdata (==2024.1)", "xlrd (==2.0.1)"] +airtable = ["pyairtable"] +all-docs = ["markdown", "msg-parser", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pypandoc", "pypdf", "python-docx (>=1.1.0)", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] +azure = ["adlfs", "fsspec (==2023.9.1)"] +azure-cognitive-search = ["azure-search-documents"] +bedrock = ["boto3", "langchain"] +biomed = ["bs4"] +box = ["boxfs", "fsspec (==2023.9.1)"] +chroma = ["chromadb"] +confluence = ["atlassian-python-api"] +csv = ["pandas"] +delta-table = ["deltalake", "fsspec (==2023.9.1)"] +discord = ["discord-py"] +doc = ["python-docx (>=1.1.0)"] +docx = ["python-docx (>=1.1.0)"] +dropbox = ["dropboxdrivefs", "fsspec (==2023.9.1)"] +elasticsearch = ["elasticsearch"] +embed-huggingface = ["huggingface", "langchain", "sentence-transformers"] +epub = ["pypandoc"] +gcs = ["bs4", "fsspec (==2023.9.1)", "gcsfs"] +github = ["pygithub (>1.58.0)"] +gitlab = ["python-gitlab"] +google-drive = ["google-api-python-client"] +hubspot = ["hubspot-api-client", "urllib3 (>=1.26.17)"] +huggingface = ["langdetect", "sacremoses", "sentencepiece", "torch", "transformers"] +image = ["onnx", "pdf2image", "pdfminer.six", "pikepdf", "pypdf", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)"] +jira = ["atlassian-python-api"] +local-inference = ["markdown", "msg-parser", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pypandoc", "pypdf", "python-docx (>=1.1.0)", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] +md = ["markdown"] +mongodb = ["pymongo"] +msg = ["msg-parser"] +notion = ["htmlBuilder", "notion-client"] +odt = ["pypandoc", "python-docx (>=1.1.0)"] +onedrive = ["Office365-REST-Python-Client (<2.4.3)", "bs4", "msal"] +openai = ["langchain", "openai", "tiktoken"] +org = ["pypandoc"] +outlook = ["Office365-REST-Python-Client (<2.4.3)", "msal"] +paddleocr = ["unstructured.paddleocr (==2.6.1.3)"] +pdf = ["onnx", "pdf2image", "pdfminer.six", "pikepdf", "pypdf", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)"] +pinecone = ["pinecone-client"] +ppt = ["python-pptx (<=0.6.23)"] +pptx = ["python-pptx (<=0.6.23)"] +qdrant = ["qdrant-client"] +reddit = ["praw"] +rst = ["pypandoc"] +rtf = ["pypandoc"] +s3 = ["fsspec (==2023.9.1)", "s3fs"] +salesforce = ["simple-salesforce"] +sftp = ["fsspec", "paramiko"] +sharepoint = ["Office365-REST-Python-Client (<2.4.3)", "msal"] +slack = ["slack-sdk"] +tsv = ["pandas"] +weaviate = ["weaviate-client"] +wikipedia = ["wikipedia"] +xlsx = ["networkx", "openpyxl", "pandas", "xlrd"] [[package]] name = "unstructured-client" @@ -4734,6 +5408,23 @@ urllib3 = ">=1.26.18" [package.extras] dev = ["pylint (==2.16.2)"] +[[package]] +name = "uptrace" +version = "1.22.0" +description = "OpenTelemetry Python distribution for Uptrace" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uptrace-1.22.0-py3-none-any.whl", hash = "sha256:f5e697d2b7995e0e6ca1af2c8a4ff79d12d69a9398cc8333bf4d3a95057bc08c"}, + {file = "uptrace-1.22.0.tar.gz", hash = "sha256:58334258ebb09da030ccdbf1549b6d05560968b1de4168e714698e4572b89f8a"}, +] + +[package.dependencies] +opentelemetry-api = ">=1.22,<2.0" +opentelemetry-exporter-otlp = ">=1.22,<2.0" +opentelemetry-instrumentation = ">=0.43b0,<1.0" +opentelemetry-sdk = ">=1.22,<2.0" + [[package]] name = "urllib3" version = "1.26.18" @@ -4752,13 +5443,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uvicorn" -version = "0.28.0" +version = "0.25.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.28.0-py3-none-any.whl", hash = "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1"}, - {file = "uvicorn-0.28.0.tar.gz", hash = "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067"}, + {file = "uvicorn-0.25.0-py3-none-any.whl", hash = "sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c"}, + {file = "uvicorn-0.25.0.tar.gz", hash = "sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2"}, ] [package.dependencies] @@ -4820,88 +5511,76 @@ files = [ docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] +[[package]] +name = "watchdog" +version = "4.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "watchfiles" -version = "0.21.0" +version = "0.20.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, - {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, - {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, - {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, - {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, - {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, - {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, - {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, - {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, - {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, - {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, - {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, - {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, - {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, - {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, - {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, - {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, - {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, - {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, - {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, - {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, - {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, - {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, - {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, - {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, - {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, - {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, - {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, - {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, - {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, - {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, - {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, - {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, - {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, - {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, - {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, - {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, - {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, - {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, - {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, - {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, + {file = "watchfiles-0.20.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:3796312bd3587e14926013612b23066912cf45a14af71cf2b20db1c12dadf4e9"}, + {file = "watchfiles-0.20.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:d0002d81c89a662b595645fb684a371b98ff90a9c7d8f8630c82f0fde8310458"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:570848706440373b4cd8017f3e850ae17f76dbdf1e9045fc79023b11e1afe490"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a0351d20d03c6f7ad6b2e8a226a5efafb924c7755ee1e34f04c77c3682417fa"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:007dcc4a401093010b389c044e81172c8a2520dba257c88f8828b3d460c6bb38"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d82dbc1832da83e441d112069833eedd4cf583d983fb8dd666fbefbea9d99c0"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99f4c65fd2fce61a571b2a6fcf747d6868db0bef8a934e8ca235cc8533944d95"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5392dd327a05f538c56edb1c6ebba6af91afc81b40822452342f6da54907bbdf"}, + {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:08dc702529bb06a2b23859110c214db245455532da5eaea602921687cfcd23db"}, + {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7d4e66a857621584869cfbad87039e65dadd7119f0d9bb9dbc957e089e32c164"}, + {file = "watchfiles-0.20.0-cp37-abi3-win32.whl", hash = "sha256:a03d1e6feb7966b417f43c3e3783188167fd69c2063e86bad31e62c4ea794cc5"}, + {file = "watchfiles-0.20.0-cp37-abi3-win_amd64.whl", hash = "sha256:eccc8942bcdc7d638a01435d915b913255bbd66f018f1af051cd8afddb339ea3"}, + {file = "watchfiles-0.20.0-cp37-abi3-win_arm64.whl", hash = "sha256:b17d4176c49d207865630da5b59a91779468dd3e08692fe943064da260de2c7c"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d97db179f7566dcf145c5179ddb2ae2a4450e3a634eb864b09ea04e68c252e8e"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:835df2da7a5df5464c4a23b2d963e1a9d35afa422c83bf4ff4380b3114603644"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:608cd94a8767f49521901aff9ae0c92cc8f5a24d528db7d6b0295290f9d41193"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89d1de8218874925bce7bb2ae9657efc504411528930d7a83f98b1749864f2ef"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:13f995d5152a8ba4ed7c2bbbaeee4e11a5944defc7cacd0ccb4dcbdcfd78029a"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b5c8d3be7b502f8c43a33c63166ada8828dbb0c6d49c8f9ce990a96de2f5a49"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e43af4464daa08723c04b43cf978ab86cc55c684c16172622bdac64b34e36af0"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d9e1f75c4f86c93d73b5bd1ebe667558357548f11b4f8af4e0e272f79413ce"}, + {file = "watchfiles-0.20.0.tar.gz", hash = "sha256:728575b6b94c90dd531514677201e8851708e6e4b5fe7028ac506a200b622019"}, ] [package.dependencies] @@ -5108,6 +5787,20 @@ files = [ {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + [[package]] name = "yarl" version = "1.9.4" @@ -5229,4 +5922,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.10.0,<3.12" -content-hash = "6ad96ba3afbb1e5920209b1753d933ccb3374dad75c458a43a39bd2f21585c89" +content-hash = "215903665ad1db8a33f2e7b2e9fb4d81ae70d489fca7af1d349faf318015b62d" diff --git a/pyproject.toml b/pyproject.toml index 675dfda..006c36d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,10 +20,13 @@ llama-index-llms-ollama = "^0.1.2" wikipedia = "^1.4.0" pypdf = "^4.1.0" docarray = "^0.40.0" -unstructured = "^0.12.6" dedent = "^0.5" llama-index-embeddings-mistralai = "^0.1.4" openai = "^1.14.0" +chainlit = "^1.0.401" +unstructured = "^0.11.0" +streamlit = "^1.32.2" +reportlab = "^4.1.0" [tool.pyright] diff --git a/tests/test_crewai.py b/tests/test_crewai.py index fdeef9c..8423b2e 100644 --- a/tests/test_crewai.py +++ b/tests/test_crewai.py @@ -5,7 +5,7 @@ from crewai import Crew, Process from textwrap import dedent -from langchain_community.chat_models import ChatOllama +#from langchain_community.chat_models import ChatOllama from langchain_openai import ChatOpenAI from crewai_local.trip_agents import TripAgents from crewai_local.trip_task import TripTasks @@ -13,7 +13,7 @@ from dotenv import load_dotenv load_dotenv() -openai.api_key = os.environ.get('OPENAI_API_KEY') +os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY') @pytest.mark.parametrize("cities, date_range, interests, expected_output", [ @@ -35,9 +35,11 @@ def test_crew(cities, date_range, interests, expected_output): t_crew = TripCrew(cities, date_range, interests) response = t_crew.run() - model = ChatOllama(model="mistral") + model = ChatOpenAI() expected_response = f"Is the context in {response} a detailed travel plan for a trip to one of the cities in the list provided `{cities}`. Response should be YES or NO. Remember to capitalize the answer" - chain = expected_response | model + model_response = model.invoke(expected_response) - assert chain == expected_output + model_eval = model_response.content + + assert model_eval == expected_output diff --git a/tests/test_langchain.py b/tests/test_langchain.py index e663072..a9f00cf 100644 --- a/tests/test_langchain.py +++ b/tests/test_langchain.py @@ -1,22 +1,84 @@ import os import openai import pytest +import tempfile +from reportlab.lib.pagesizes import letter +from reportlab.pdfgen import canvas -from langchain_openai import ChatOpenAI +from langchain_openai import ChatOpenAI, OpenAIEmbeddings +from langchain_community.llms import ollama +from langchain_community.chat_models import ChatOllama from langchain.prompts import ChatPromptTemplate from langchain_core.utils.function_calling import convert_to_openai_function from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser from langchain.prompts import MessagesPlaceholder -from langchain.schema.runnable import RunnablePassthrough +from langchain.schema.runnable.config import RunnableConfig +from langchain.schema.runnable import RunnablePassthrough, Runnable from langchain.agents import AgentExecutor from langchain.memory import ConversationBufferMemory from langchain.agents.format_scratchpad import format_to_openai_functions +from langchain.pydantic_v1 import BaseModel, Field +from langchain_core.tools import tool +from langchain_community.document_loaders import PyPDFLoader +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_community.vectorstores.docarray import DocArrayInMemorySearch +from langchain.chains import RetrievalQA - -from langchain_local.tools.rag_tool import rag_one, rag_two -from langchain_local.tools.serper_tool import serper_tool +from langchain_folder.agent import file_path, generate +from langchain_folder.tools.serper_tool import serper_tool from dotenv import load_dotenv load_dotenv() -openai.api_key = os.environ.get('OPENAI_API_KEY') +os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY') + +# Text data +data_one = ("Citizen science, the involvement of the public in scientific research, is rapidly transforming " + "how we understand and address global challenges. Gone are the days when scientific inquiry was solely the " + "domain of researchers in ivory towers. Today, ordinary citizens are contributing valuable data and insights " + "across diverse fields, from ecology to astronomy.This surge in citizen science participation can be attributed " + "to several factors. The internet has facilitated collaboration and data collection on a massive scale. Easy-to-use " + "mobile apps and online platforms have lowered the barrier to entry, allowing anyone with a smartphone or computer " + "to contribute. Additionally, the growing public interest in science and a desire to make a difference are fueling this trend.") + +data_two = ("Citizen science projects encompass a wide range of topics. Volunteers might monitor bird populations in their " + "backyards, classify galaxies from space telescope images, or track the spread of invasive species. The collected data can " + "be invaluable for researchers, providing insights that traditional methods might miss. For example, citizen scientists have " + "helped track the spread of COVID-19, monitor air and water quality, and even discover new species.Beyond data collection, " + "citizen science fosters a sense of community and ownership. Participants gain a deeper understanding of scientific processes " + "and the challenges faced by researchers. This connection can lead to increased environmental awareness and responsible citizen behavior.") + +# Create temporary directory +temp_dir = tempfile.mkdtemp() + +# Save data_one to PDF +file_name_one = 'data_one.pdf' +file_path_one = os.path.join(temp_dir, file_name_one) +c = canvas.Canvas(file_path_one, pagesize=letter) +c.drawString(100, 700, data_one) # Adjust coordinates as needed +c.save() +file_path.append(file_path_one) + +# Save data_two to PDF +file_name_two = 'data_two.pdf' +file_path_two = os.path.join(temp_dir, file_name_two) +c = canvas.Canvas(file_path_two, pagesize=letter) +c.drawString(100, 700, data_two) # Adjust coordinates as needed +c.save() +file_path.append(file_path_two) + +query= "what is the first document all about" + +expected_output = "YES" + +def test_llamaindex_rag(): + response = generate(query) + + model = ChatOpenAI() + + expected_response = "Is the context in {response} a summary of the information provided in`{data_one}` or `{data_two}`. Response should be YES or NO. Remember to capitalize the answer" + model_response = model.invoke(expected_response) + + model_eval = model_response.content + + assert model_eval == expected_output \ No newline at end of file diff --git a/tests/test_llamaIndex.py b/tests/test_llamaIndex.py index e69de29..8a3abe5 100644 --- a/tests/test_llamaIndex.py +++ b/tests/test_llamaIndex.py @@ -0,0 +1,67 @@ +import logging +import os +import sys +import pytest +import tempfile +from reportlab.lib.pagesizes import letter +from reportlab.pdfgen import canvas + +logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logging.getLogger().handlers = [] +logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) + +from llama_index.core import ( + VectorStoreIndex, + SimpleDirectoryReader, + StorageContext, + SimpleKeywordTableIndex +) +from llama_index.core import SummaryIndex, Settings +from llama_index.core.node_parser import SentenceSplitter +from llama_index.llms.openai import OpenAI +from langchain_openai.chat_models import ChatOpenAI +from llama_index.embeddings.openai import OpenAIEmbedding +from llama_index.core.tools import QueryEngineTool, RetrieverTool +from llama_index.core.query_engine import RouterQueryEngine +from llama_index.core.selectors import LLMSingleSelector + +from llamaindex.main import generate + +os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY') + +Settings.llm = OpenAI(model="gpt-3.5-turbo-1106", temperature=0.2) +Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small") + +temp_dir = tempfile.mkdtemp() + +data = ("Citizen science, the involvement of the public in scientific research, is rapidly transforming how we " + "understand and address global challenges. Gone are the days when scientific inquiry was solely the domain of " + "researchers in ivory towers. Today, ordinary citizens are contributing valuable data and insights across diverse fields, " + "from ecology to astronomy. This surge in citizen science participation can be attributed to several factors. The internet " + "has facilitated collaboration and data collection on a massive scale. Easy-to-use mobile apps and online platforms have " + "lowered the barrier to entry, allowing anyone with a smartphone or computer to contribute. Additionally, the growing public " + "interest in science and a desire to make a difference are fueling this trend.") + +file_name = 'data.pdf' +file_path = os.path.join(temp_dir, file_name) + +# Create PDF +c = canvas.Canvas(file_path, pagesize=letter) +c.drawString(100, 700, data) # Adjust coordinates as needed +c.save() + +query= "what is the provided document all about" + +expected_output = "YES" + +def test_llamaindex_rag(): + response = generate(query, temp_dir) + + model = ChatOpenAI() + + expected_response = "Is the context in {response} a summary of the information provided in`{data}`. Response should be YES or NO. Remember to capitalize the answer" + model_response = model.invoke(expected_response) + + model_eval = model_response.content + + assert model_eval == expected_output \ No newline at end of file