From ca93cb9062c7dc960d3049856721e3f22ca5b18d Mon Sep 17 00:00:00 2001 From: AmineDiro Date: Wed, 26 Jun 2024 09:58:55 +0200 Subject: [PATCH] refacto(backend): poetry package manager and chat route refactoring (#2684) # Description - Added package manager - Added precommit checks - Rewrote dependency injection of Services and Repositories - Integrate async SQL alchemy engine - Migrate Chat repository to SQLModel - Migrated ChatHistory repository to SQLModel - User SQLModel - Unit test methodology with db rollback - Unit tests ChatRepository - Test ChatService get_history - Brain entity SQL Model - Promp SQLModel - Rewrite chat/{chat_id}/question route - updated docker files and docker compose in dev and production Added `quivr_core` subpackages: - Refactored KnowledgebrainQa - Added Rag service to interface with non-rag dependencies --------- Co-authored-by: aminediro --- .env.example | 3 +- CHANGELOG.md | 1872 ++-- backend/.pre-commit-config.yaml | 24 + backend/Dockerfile | 30 +- backend/Dockerfile.dev | 34 +- backend/README.md | 1 + backend/{ => backend}/__init__.py | 0 backend/{ => backend}/celery_config.py | 3 +- backend/{ => backend}/celery_worker.py | 42 +- backend/{ => backend}/logger.py | 0 backend/{ => backend}/main.py | 42 +- backend/{ => backend}/middlewares/__init__.py | 0 .../middlewares/auth/__init__.py | 0 .../middlewares/auth/auth_bearer.py | 9 +- .../middlewares/auth/jwt_token_handler.py | 3 +- backend/{ => backend}/middlewares/cors.py | 0 .../databases => backend/models}/__init__.py | 0 .../models/brains_subscription_invitations.py | 5 +- .../models/databases}/__init__.py | 0 .../models/databases/llm_models.py | 2 +- .../models/databases/repository.py | 4 +- .../models/databases/supabase/__init__.py | 6 + .../brains_subscription_invitations.py | 5 +- .../models/databases/supabase/files.py | 2 +- .../models/databases/supabase/supabase.py | 3 +- .../models/databases/supabase/user_usage.py | 15 +- .../models/databases/supabase/vectors.py | 2 +- backend/{ => backend}/models/files.py | 11 +- .../{ => backend}/models/files_in_storage.py | 0 backend/{ => backend}/models/settings.py | 38 +- .../models/sqlalchemy_repository.py | 0 .../analytics => backend/modules}/__init__.py | 0 .../modules/analytics}/__init__.py | 0 .../modules/analytics/controller}/__init__.py | 0 .../analytics/controller/analytics_routes.py | 13 +- .../modules/analytics/entity}/__init__.py | 0 .../modules/analytics/entity/analytics.py | 0 .../modules/analytics/repository}/__init__.py | 0 .../modules/analytics/repository/analytics.py | 6 +- .../repository/analytics_interface.py | 13 +- .../modules/analytics/service}/__init__.py | 0 .../analytics/service/analytics_service.py | 13 + .../modules/api_key}/__init__.py | 0 .../modules/api_key/controller/__init__.py | 0 .../api_key/controller/api_key_routes.py | 13 +- .../modules/api_key/dto/__init__.py | 0 .../modules/api_key/dto/outputs.py | 0 .../modules/api_key/entity}/__init__.py | 0 .../modules/api_key/entity/api_key.py | 0 .../modules/api_key/repository}/__init__.py | 0 .../api_key/repository/api_key_interface.py | 2 +- .../modules/api_key/repository/api_keys.py | 6 +- .../modules/api_key/service}/__init__.py | 0 .../api_key/service/api_key_service.py | 11 +- .../modules/api_key/tests/test_api_key.py | 0 .../modules/assistant}/__init__.py | 0 .../modules/assistant/controller/__init__.py | 0 .../assistant/controller/assistant_routes.py | 17 +- .../modules/assistant/dto}/__init__.py | 0 .../modules/assistant/dto/inputs.py | 0 .../modules/assistant/dto/outputs.py | 0 .../modules/assistant/entity/__init__.py | 0 .../modules/assistant/entity/assistant.py | 0 .../modules/assistant/ito}/__init__.py | 0 .../modules/assistant/ito/audio_transcript.py | 9 +- .../modules/assistant/ito/crawler.py | 7 +- .../modules/assistant/ito/difference.py | 11 +- .../modules/assistant/ito/ito.py | 19 +- .../modules/assistant/ito/summary.py | 11 +- .../modules/assistant/ito/utils}/__init__.py | 0 .../utils/font/DejaVuSansCondensed-Bold.ttf | Bin .../font/DejaVuSansCondensed-Oblique.ttf | Bin .../ito/utils/font/DejaVuSansCondensed.ttf | Bin .../modules/assistant/ito/utils/logo.png | Bin .../assistant/ito/utils/pdf_generator.py | 0 .../modules/assistant/repository/__init__.py | 0 .../repository/assistant_interface.py | 2 +- .../modules/assistant/service}/__init__.py | 0 .../modules/assistant/service/assistant.py | 6 +- .../modules/authorization/utils}/__init__.py | 0 backend/backend/modules/base_repository.py | 113 + backend/backend/modules/base_uuid_entity.py | 11 + .../dto => backend/modules/brain}/__init__.py | 0 .../modules/brain/api_brain_qa.py | 42 +- .../modules/brain/composite_brain_qa.py | 30 +- .../modules/brain/controller/__init__.py | 0 .../modules/brain/controller/brain_routes.py | 31 +- .../modules/brain/dto}/__init__.py | 0 .../{ => backend}/modules/brain/dto/inputs.py | 14 +- .../modules/brain/entity/__init__.py | 0 .../entity/api_brain_definition_entity.py | 0 .../modules/brain/entity/brain_entity.py | 135 + .../composite_brain_connection_entity.py | 0 .../modules/brain/entity/integration_brain.py | 0 .../modules/brain/integrations/Big/Brain.py | 7 +- .../brain/integrations/Big}/__init__.py | 0 .../brain/integrations/Claude/Brain.py | 6 +- .../brain/integrations/Claude}/__init__.py | 0 .../modules/brain/integrations/GPT4/Brain.py | 16 +- .../brain/integrations/GPT4}/__init__.py | 0 .../integrations/Multi_Contract/Brain.py | 5 +- .../integrations/Multi_Contract}/__init__.py | 0 .../brain/integrations/Notion/Brain.py | 2 +- .../integrations/Notion/Notion_connector.py | 20 +- .../brain/integrations/Notion}/__init__.py | 0 .../modules/brain/integrations/Proxy/Brain.py | 14 +- .../brain/integrations/Proxy}/__init__.py | 0 .../modules/brain/integrations/SQL/Brain.py | 9 +- .../brain/integrations/SQL/SQL_connector.py | 14 +- .../brain/integrations/SQL}/__init__.py | 0 .../modules/brain/integrations/Self/Brain.py | 14 +- .../brain/integrations/Self}/__init__.py | 0 .../modules/brain/integrations}/__init__.py | 0 .../modules/brain/knowledge_brain_qa.py | 109 +- .../modules/brain/qa_headless.py | 30 +- .../modules/brain/qa_interface.py | 43 +- .../modules/brain/rags}/__init__.py | 0 .../modules/brain/rags/quivr_rag.py | 77 +- .../modules/brain/rags/rag_interface.py | 0 .../modules/brain/repository/__init__.py | 0 .../brain/repository/api_brain_definitions.py | 10 +- .../modules/brain/repository/brains.py | 24 +- .../modules/brain/repository/brains_users.py | 22 +- .../brain/repository/brains_vectors.py | 6 +- .../composite_brains_connections.py | 10 +- .../brain/repository/external_api_secrets.py | 4 +- .../brain/repository/integration_brains.py | 8 +- .../brain/repository/interfaces/__init__.py | 0 .../api_brain_definitions_interface.py | 6 +- .../repository/interfaces/brains_interface.py | 7 +- .../interfaces/brains_users_interface.py | 2 +- .../interfaces/brains_vectors_interface.py | 0 .../composite_brains_connections_interface.py | 2 +- .../external_api_secrets_interface.py | 0 .../integration_brains_interface.py | 2 +- .../modules/brain/service}/__init__.py | 0 .../service/api_brain_definition_service.py | 10 +- .../service/brain_authorization_service.py | 11 +- .../modules/brain/service/brain_service.py | 68 +- .../service/brain_subscription/__init__.py | 0 .../resend_invitation_email.py | 9 +- .../subscription_invitation_service.py | 11 +- .../brain/service/brain_user_service.py | 25 +- .../brain/service/brain_vector_service.py | 10 +- .../modules/brain/service/call_brain_api.py | 15 +- ...get_api_brain_definition_as_json_schema.py | 10 +- .../get_question_context_from_brain.py | 13 +- .../service/integration_brain_service.py | 6 +- .../brain/service/test_brain_service.py | 0 .../modules/brain/service/utils/__init__.py | 0 .../service/utils/format_chat_history.py | 9 +- .../service/utils/get_prompt_to_use_id.py | 6 +- .../brain/service/utils/validate_brain.py | 3 +- .../brain/tests/test_brains_interface.py | 0 backend/backend/modules/chat/__init__.py | 6 + .../modules/chat/controller/__init__.py | 0 .../modules/chat/controller/chat/__init_.py | 0 .../chat/controller/chat/brainful_chat.py | 62 +- .../chat/controller/chat/brainless_chat.py | 3 +- .../modules/chat/controller/chat/factory.py | 0 .../modules/chat/controller/chat/interface.py | 4 - .../chat/controller/chat/test_utils.py | 0 .../modules/chat/controller/chat/utils.py | 29 +- .../modules/chat/controller/chat_routes.py | 169 +- .../modules/chat/dto/__init__.py | 0 .../{ => backend}/modules/chat/dto/chats.py | 5 +- .../{ => backend}/modules/chat/dto/inputs.py | 0 .../{ => backend}/modules/chat/dto/outputs.py | 15 +- .../modules/chat/entity/__init__.py | 0 backend/backend/modules/chat/entity/chat.py | 81 + .../modules/chat/repository/__init__.py | 0 .../backend/modules/chat/repository/chats.py | 124 + .../chat/repository/chats_interface.py | 12 +- .../modules/chat/service/__init__.py | 0 .../modules/chat/service/chat_service.py | 153 +- .../modules/chat/service/utils.py | 25 +- .../modules/chat/tests/conftest.py} | 0 .../backend/modules/chat/tests/test_chats.py | 177 + .../modules/contact_support/__init__.py | 0 .../contact_support/controller/__init__.py | 0 .../controller/contact_routes.py | 7 +- .../contact_support/controller/settings.py | 0 backend/backend/modules/dependencies.py | 61 + .../modules/knowledge/__init__.py | 0 .../modules/knowledge/controller/__init__.py | 0 .../knowledge/controller/knowledge_routes.py | 19 +- .../modules/knowledge/dto/__init__.py | 0 .../modules/knowledge/dto/inputs.py | 0 .../modules/knowledge/dto/outputs.py | 0 .../modules/knowledge/entity/__init__.py | 0 .../modules/knowledge/entity/knowledge.py | 0 .../modules/knowledge/repository/__init__.py | 1 + .../repository/knowledge_interface.py | 6 +- .../knowledge/repository/knowledges.py | 15 +- .../modules/knowledge/repository/storage.py | 7 +- .../knowledge/repository/storage_interface.py | 0 .../modules/knowledge/service/__init__.py | 0 .../knowledge/service/knowledge_service.py | 12 +- .../modules/misc/controller/__init__.py | 0 .../modules/misc/controller/misc_routes.py | 0 .../modules/notification/__init__.py | 0 .../notification/controller/__init__.py | 0 .../modules/notification/dto/__init__.py | 0 .../modules/notification/dto/inputs.py | 3 +- .../modules/notification/dto/outputs.py | 0 .../modules/notification/entity/__init__.py | 0 .../notification/entity/notification.py | 0 .../notification/repository/__init__.py | 0 .../notification/repository/notifications.py | 8 +- .../repository/notifications_interface.py | 7 +- .../modules/notification/service/__init__.py | 0 .../service/notification_service.py | 8 +- .../notification/tests/test_notification.py | 0 .../modules/onboarding/__init__.py | 0 .../modules/onboarding/controller/__init__.py | 0 .../controller/onboarding_routes.py | 11 +- .../modules/onboarding/dto/__init__.py | 0 .../modules/onboarding/dto/inputs.py | 0 .../modules/onboarding/entity/__init__.py | 0 .../modules/onboarding/entity/onboarding.py | 0 .../modules/onboarding/repository/__init__.py | 0 .../onboarding/repository/onboardings.py | 5 +- .../repository/onboardings_interface.py | 4 +- .../modules/onboarding/service/__init__.py | 0 .../onboarding/service/onboarding_service.py | 10 +- .../onboarding/tests/test_onboarding.py | 0 .../{ => backend}/modules/prompt/__init__.py | 0 .../modules/prompt/controller/__init__.py | 0 .../prompt/controller/prompt_routes.py | 7 +- .../modules/prompt/entity/__init__.py | 0 .../modules/prompt/entity/prompt.py | 25 +- .../modules/prompt/repository/__init__.py | 0 .../modules/prompt/repository/prompts.py | 7 +- .../prompt/repository/prompts_interface.py | 2 +- .../modules/prompt/service/__init__.py | 0 .../prompt/service/get_prompt_to_use.py | 6 +- .../modules/prompt/service/prompt_service.py | 6 +- .../modules/prompt/tests/test_prompt.py | 0 .../{ => backend}/modules/sync/__init__.py | 0 .../modules/sync/controller/__init__.py | 0 .../sync/controller/azure_sync_routes.py | 11 +- .../sync/controller/google_sync_routes.py | 11 +- .../sync/controller/successfull_connection.py | 0 .../modules/sync/controller/sync_routes.py | 29 +- .../modules/sync/dto/__init__.py | 0 .../{ => backend}/modules/sync/dto/inputs.py | 0 .../{ => backend}/modules/sync/dto/outputs.py | 0 .../modules/sync/entity/__init__.py | 0 .../{ => backend}/modules/sync/entity/sync.py | 0 .../modules/sync/repository/__init__.py | 0 .../modules/sync/repository/sync.py | 16 +- .../modules/sync/repository/sync_files.py | 10 +- .../sync/repository/sync_interfaces.py | 4 +- .../modules/sync/repository/sync_user.py | 19 +- .../modules/sync/service/__init__.py | 0 .../modules/sync/service/sync_service.py | 17 +- backend/{ => backend}/modules/sync/tasks.py | 14 +- .../modules/sync/tests/test_api_key.py | 0 .../{ => backend}/modules/sync/utils/LICENSE | 0 .../modules/sync/utils/__init__.py | 0 .../modules/sync/utils/googleutils.py | 44 +- .../modules/sync/utils/list_files.py | 11 +- .../modules/sync/utils/normalize.py | 12 +- .../modules/sync/utils/sharepointutils.py | 46 +- .../modules/sync/utils/upload.py | 27 +- .../{ => backend}/modules/tools/__init__.py | 0 .../modules/tools/email_sender.py | 12 +- .../modules/tools/image_generator.py | 0 .../{ => backend}/modules/tools/url_reader.py | 3 +- .../{ => backend}/modules/tools/web_search.py | 3 +- .../{ => backend}/modules/upload/__init__.py | 0 .../modules/upload/controller/__init__.py | 0 .../upload/controller/upload_routes.py | 33 +- .../modules/upload/service/__init__.py | 0 .../service/generate_file_signed_url.py | 2 +- .../modules/upload/service/list_files.py | 2 +- .../modules/upload/service/upload_file.py | 6 +- .../modules/upload/tests/test_files/test.bib | 0 .../modules/upload/tests/test_files/test.csv | 0 .../modules/upload/tests/test_files/test.pdf | Bin .../modules/upload/tests/test_files/test.txt | 0 .../modules/upload/tests/test_upload.py | 0 .../{ => backend}/modules/user/__init__.py | 0 .../modules/user/controller/__init__.py | 0 .../user/controller/user_controller.py | 15 +- .../{ => backend}/modules/user/dto/inputs.py | 0 .../modules/user/entity/user_identity.py | 28 + .../modules/user/repository/__init__.py | 0 .../modules/user/repository/users.py | 46 +- .../user/repository/users_interface.py | 9 +- .../modules/user/service/__init__.py | 0 .../modules/user/service/user_service.py | 4 +- .../modules/user/service/user_usage.py | 16 +- .../user/tests/test_user_controller.py | 0 backend/{ => backend}/packages/__init__.py | 0 .../{ => backend}/packages/emails/__init__.py | 0 .../packages/emails/send_email.py | 3 +- .../packages/embeddings/__init__.py | 0 .../packages/embeddings/vectors.py | 11 +- .../{ => backend}/packages/files/__init__.py | 0 .../packages/files/crawl/__init__.py | 0 .../packages/files/crawl/crawler.py | 3 +- backend/{ => backend}/packages/files/file.py | 0 .../packages/files/loaders/__init__.py | 0 .../packages/files/loaders/telegram.py | 0 .../packages/files/parsers/__init__.py | 0 .../packages/files/parsers/audio.py | 6 +- .../packages/files/parsers/bibtex.py | 3 +- .../packages/files/parsers/code_python.py | 3 +- .../packages/files/parsers/common.py | 28 +- .../packages/files/parsers/csv.py | 3 +- .../packages/files/parsers/docx.py | 3 +- .../packages/files/parsers/epub.py | 3 +- .../packages/files/parsers/github.py | 7 +- .../packages/files/parsers/html.py | 3 +- .../packages/files/parsers/markdown.py | 3 +- .../packages/files/parsers/notebook.py | 3 +- .../packages/files/parsers/odt.py | 3 +- .../packages/files/parsers/pdf.py | 3 +- .../packages/files/parsers/powerpoint.py | 3 +- .../packages/files/parsers/telegram.py | 4 +- .../packages/files/parsers/txt.py | 3 +- .../packages/files/parsers/xlsx.py | 3 +- .../packages/files/processors.py | 4 +- .../packages/quivr_core}/__init__.py | 0 .../packages/quivr_core/brain_factory.py | 292 + backend/backend/packages/quivr_core/config.py | 23 + backend/backend/packages/quivr_core/models.py | 66 + .../backend/packages/quivr_core/prompts.py | 58 + .../backend/packages/quivr_core/quivr_rag.py | 246 + backend/backend/packages/quivr_core/utils.py | 271 + .../{ => backend}/packages/utils/__init__.py | 0 .../utils/handle_request_validation_error.py | 3 +- .../packages/utils/parse_message_time.py | 2 +- .../{ => backend}/packages/utils/telemetry.py | 14 +- .../{ => backend}/playground/auth-azure.py | 0 backend/{ => backend}/playground/auth.py | 0 .../routes}/__init__.py | 0 backend/{ => backend}/routes/crawl_routes.py | 31 +- .../{ => backend}/routes/headers/__init_.py | 0 .../routes/headers/get_origin_header.py | 0 .../routes/subscription_routes.py | 37 +- backend/backend/vectorstore/__init__.py | 0 backend/{ => backend}/vectorstore/supabase.py | 15 +- backend/models/__init__.py | 5 - backend/models/databases/supabase/__init__.py | 5 - .../analytics/service/analytics_service.py | 13 - backend/modules/brain/entity/brain_entity.py | 82 - backend/modules/chat/entity/chat.py | 45 - backend/modules/chat/repository/chats.py | 118 - .../modules/knowledge/repository/__init__.py | 1 - backend/modules/user/entity/user_identity.py | 14 - backend/poetry.lock | 9074 +++++++++++++++++ backend/pyproject.toml | 129 + backend/supabase/20240103191539_private.sql | 2 +- backend/supabase/config.toml | 2 +- .../migrations/20240103173626_init.sql | 39 +- .../migrations/20240103175048_prod.sql | 4 +- .../migrations/20240103181249_premium.sql | 2 - .../migrations/20240103181925_cleanup.sql | 2 - .../20240103193921_stripe_customers.sql | 2 +- .../migrations/20240103194255_api.sql | 2 - .../20240103204741_product_to_features.sql | 2 - .../migrations/20240103231656_product.sql | 2 - .../migrations/20240103234423_models.sql | 2 - .../migrations/20240107231636_policies.sql | 3 - .../migrations/20240119070124_search.sql | 2 - .../migrations/20240119222036_metadata.sql | 2 - .../migrations/20240120004107_tags.sql | 2 - .../migrations/20240121195523_fix-public.sql | 4 +- .../20240122194117_monthly-credit.sql | 2 - .../migrations/20240125230346_raw.sql | 2 - .../migrations/20240206040636_notion.sql | 2 - .../migrations/20240207034043_related.sql | 2 - .../migrations/20240207071108_chunk.sql | 2 - .../migrations/20240216192826_integration.sql | 2 +- .../migrations/20240228182948_notion.sql | 3 - .../20240304223646_integrations-all.sql | 2 - .../20240305225452_tags-integration.sql | 2 - .../20240306013910_allow_model_change.sql | 2 - ...0240306205133_integration_display_name.sql | 2 - .../20240313024244_onboarding-user.sql | 2 - ...40314005817_user_identity_company_info.sql | 2 - .../20240316195514_usage_purpose.sql | 2 - ...240320215813_fix_match_vector_function.sql | 2 +- .../20240329212126_onboarding_brain.sql | 2 - .../migrations/20240330233534_ingestion.sql | 3 - .../migrations/20240402005455_ingestion.sql | 2 - .../20240402013303_ingestion_url.sql | 2 - .../20240402015128_seed-ingestions.sql | 2 +- .../migrations/20240410112108_assistant.sql | 3 - .../20240501180719_notifications.sql | 3 - .../migrations/20240506150059_timestampz.sql | 2 - .../migrations/20240514080520_rls_optim.sql | 3 - .../migrations/20240516143634_syncs.sql | 2 - .../migrations/20240521144817_syncs-files.sql | 3 - .../20240529132812_syncs-emails.sql | 2 - .../local_20240107152745_ollama.sql | 2 - backend/tests/crawl/__init__.py | 0 backend/tests/crawl/test_crawl.py | 9 + backend/tests/file_process/__init__.py | 0 backend/tests/file_process/dummy.pdf | Bin 0 -> 7478 bytes .../tests/file_process/test_pdf_process.py | 34 + .../tests/ragas_evaluation/run_evaluation.py | 15 +- backend/tests/test_brains.py | 19 +- docker-compose.dev.yml | 17 +- docker-compose.yml | 12 +- .../FromConnections.module.scss | 2 +- .../SyncElementLine.module.scss | 2 +- .../Connections/Connections.module.scss | 2 +- .../components/Settings/Settings.module.scss | 2 +- .../BrainRecapCard/BrainRecapCard.module.scss | 2 +- .../BrainRecapStep/BrainRecapStep.module.scss | 2 +- .../ConnectionCards.module.scss | 2 +- .../ConnectionButton.module.scss | 2 +- .../ConnectionLine/ConnectionLine.module.scss | 2 +- .../ConnectionSection.module.scss | 2 +- .../ConnectionIcon/ConnectionIcon.module.scss | 2 +- .../lib/components/ui/Icon/Icon.module.scss | 2 +- .../ui/SwitchButton/SwitchButton.module.scss | 2 +- 420 files changed, 13339 insertions(+), 2496 deletions(-) create mode 100644 backend/.pre-commit-config.yaml create mode 100644 backend/README.md rename backend/{ => backend}/__init__.py (100%) rename backend/{ => backend}/celery_config.py (92%) rename backend/{ => backend}/celery_worker.py (89%) rename backend/{ => backend}/logger.py (100%) rename backend/{ => backend}/main.py (71%) rename backend/{ => backend}/middlewares/__init__.py (100%) rename backend/{ => backend}/middlewares/auth/__init__.py (100%) rename backend/{ => backend}/middlewares/auth/auth_bearer.py (84%) rename backend/{ => backend}/middlewares/auth/jwt_token_handler.py (94%) rename backend/{ => backend}/middlewares/cors.py (100%) rename backend/{models/databases => backend/models}/__init__.py (100%) rename backend/{ => backend}/models/brains_subscription_invitations.py (72%) rename backend/{modules => backend/models/databases}/__init__.py (100%) rename backend/{ => backend}/models/databases/llm_models.py (91%) rename backend/{ => backend}/models/databases/repository.py (95%) create mode 100644 backend/backend/models/databases/supabase/__init__.py rename backend/{ => backend}/models/databases/supabase/brains_subscription_invitations.py (92%) rename backend/{ => backend}/models/databases/supabase/files.py (93%) rename backend/{ => backend}/models/databases/supabase/supabase.py (75%) rename backend/{ => backend}/models/databases/supabase/user_usage.py (95%) rename backend/{ => backend}/models/databases/supabase/vectors.py (97%) rename backend/{ => backend}/models/files.py (90%) rename backend/{ => backend}/models/files_in_storage.py (100%) rename backend/{ => backend}/models/settings.py (89%) rename backend/{ => backend}/models/sqlalchemy_repository.py (100%) rename backend/{modules/analytics => backend/modules}/__init__.py (100%) rename backend/{modules/analytics/controller => backend/modules/analytics}/__init__.py (100%) rename backend/{modules/analytics/entity => backend/modules/analytics/controller}/__init__.py (100%) rename backend/{ => backend}/modules/analytics/controller/analytics_routes.py (61%) rename backend/{modules/analytics/repository => backend/modules/analytics/entity}/__init__.py (100%) rename backend/{ => backend}/modules/analytics/entity/analytics.py (100%) rename backend/{modules/analytics/service => backend/modules/analytics/repository}/__init__.py (100%) rename backend/{ => backend}/modules/analytics/repository/analytics.py (88%) rename backend/{ => backend}/modules/analytics/repository/analytics_interface.py (55%) rename backend/{modules/api_key => backend/modules/analytics/service}/__init__.py (100%) create mode 100644 backend/backend/modules/analytics/service/analytics_service.py rename backend/{modules/api_key/entity => backend/modules/api_key}/__init__.py (100%) rename backend/{ => backend}/modules/api_key/controller/__init__.py (100%) rename backend/{ => backend}/modules/api_key/controller/api_key_routes.py (87%) rename backend/{ => backend}/modules/api_key/dto/__init__.py (100%) rename backend/{ => backend}/modules/api_key/dto/outputs.py (100%) rename backend/{modules/api_key/repository => backend/modules/api_key/entity}/__init__.py (100%) rename backend/{ => backend}/modules/api_key/entity/api_key.py (100%) rename backend/{modules/api_key/service => backend/modules/api_key/repository}/__init__.py (100%) rename backend/{ => backend}/modules/api_key/repository/api_key_interface.py (92%) rename backend/{ => backend}/modules/api_key/repository/api_keys.py (92%) rename backend/{modules/assistant => backend/modules/api_key/service}/__init__.py (100%) rename backend/{ => backend}/modules/api_key/service/api_key_service.py (83%) rename backend/{ => backend}/modules/api_key/tests/test_api_key.py (100%) rename backend/{modules/assistant/dto => backend/modules/assistant}/__init__.py (100%) rename backend/{ => backend}/modules/assistant/controller/__init__.py (100%) rename backend/{ => backend}/modules/assistant/controller/assistant_routes.py (76%) rename backend/{modules/assistant/ito => backend/modules/assistant/dto}/__init__.py (100%) rename backend/{ => backend}/modules/assistant/dto/inputs.py (100%) rename backend/{ => backend}/modules/assistant/dto/outputs.py (100%) rename backend/{ => backend}/modules/assistant/entity/__init__.py (100%) rename backend/{ => backend}/modules/assistant/entity/assistant.py (100%) rename backend/{modules/assistant/ito/utils => backend/modules/assistant/ito}/__init__.py (100%) rename backend/{ => backend}/modules/assistant/ito/audio_transcript.py (94%) rename backend/{ => backend}/modules/assistant/ito/crawler.py (92%) rename backend/{ => backend}/modules/assistant/ito/difference.py (95%) rename backend/{ => backend}/modules/assistant/ito/ito.py (91%) rename backend/{ => backend}/modules/assistant/ito/summary.py (96%) rename backend/{modules/assistant/service => backend/modules/assistant/ito/utils}/__init__.py (100%) rename backend/{ => backend}/modules/assistant/ito/utils/font/DejaVuSansCondensed-Bold.ttf (100%) rename backend/{ => backend}/modules/assistant/ito/utils/font/DejaVuSansCondensed-Oblique.ttf (100%) rename backend/{ => backend}/modules/assistant/ito/utils/font/DejaVuSansCondensed.ttf (100%) rename backend/{ => backend}/modules/assistant/ito/utils/logo.png (100%) rename backend/{ => backend}/modules/assistant/ito/utils/pdf_generator.py (100%) rename backend/{ => backend}/modules/assistant/repository/__init__.py (100%) rename backend/{ => backend}/modules/assistant/repository/assistant_interface.py (81%) rename backend/{modules/authorization/utils => backend/modules/assistant/service}/__init__.py (100%) rename backend/{ => backend}/modules/assistant/service/assistant.py (75%) rename backend/{modules/brain => backend/modules/authorization/utils}/__init__.py (100%) create mode 100644 backend/backend/modules/base_repository.py create mode 100644 backend/backend/modules/base_uuid_entity.py rename backend/{modules/brain/dto => backend/modules/brain}/__init__.py (100%) rename backend/{ => backend}/modules/brain/api_brain_qa.py (93%) rename backend/{ => backend}/modules/brain/composite_brain_qa.py (96%) rename backend/{ => backend}/modules/brain/controller/__init__.py (100%) rename backend/{ => backend}/modules/brain/controller/brain_routes.py (87%) rename backend/{modules/brain/integrations/Big => backend/modules/brain/dto}/__init__.py (100%) rename backend/{ => backend}/modules/brain/dto/inputs.py (88%) rename backend/{ => backend}/modules/brain/entity/__init__.py (100%) rename backend/{ => backend}/modules/brain/entity/api_brain_definition_entity.py (100%) create mode 100644 backend/backend/modules/brain/entity/brain_entity.py rename backend/{ => backend}/modules/brain/entity/composite_brain_connection_entity.py (100%) rename backend/{ => backend}/modules/brain/entity/integration_brain.py (100%) rename backend/{ => backend}/modules/brain/integrations/Big/Brain.py (97%) rename backend/{modules/brain/integrations/Claude => backend/modules/brain/integrations/Big}/__init__.py (100%) rename backend/{ => backend}/modules/brain/integrations/Claude/Brain.py (95%) rename backend/{modules/brain/integrations/GPT4 => backend/modules/brain/integrations/Claude}/__init__.py (100%) rename backend/{ => backend}/modules/brain/integrations/GPT4/Brain.py (96%) rename backend/{modules/brain/integrations/Multi_Contract => backend/modules/brain/integrations/GPT4}/__init__.py (100%) rename backend/{ => backend}/modules/brain/integrations/Multi_Contract/Brain.py (98%) rename backend/{modules/brain/integrations/Notion => backend/modules/brain/integrations/Multi_Contract}/__init__.py (100%) rename backend/{ => backend}/modules/brain/integrations/Notion/Brain.py (88%) rename backend/{ => backend}/modules/brain/integrations/Notion/Notion_connector.py (95%) rename backend/{modules/brain/integrations/Proxy => backend/modules/brain/integrations/Notion}/__init__.py (100%) rename backend/{ => backend}/modules/brain/integrations/Proxy/Brain.py (91%) rename backend/{modules/brain/integrations/SQL => backend/modules/brain/integrations/Proxy}/__init__.py (100%) rename backend/{ => backend}/modules/brain/integrations/SQL/Brain.py (91%) rename backend/{ => backend}/modules/brain/integrations/SQL/SQL_connector.py (72%) rename backend/{modules/brain/integrations/Self => backend/modules/brain/integrations/SQL}/__init__.py (100%) rename backend/{ => backend}/modules/brain/integrations/Self/Brain.py (97%) rename backend/{modules/brain/integrations => backend/modules/brain/integrations/Self}/__init__.py (100%) rename backend/{modules/brain/rags => backend/modules/brain/integrations}/__init__.py (100%) rename backend/{ => backend}/modules/brain/knowledge_brain_qa.py (87%) rename backend/{ => backend}/modules/brain/qa_headless.py (91%) rename backend/{ => backend}/modules/brain/qa_interface.py (58%) rename backend/{modules/brain/service => backend/modules/brain/rags}/__init__.py (100%) rename backend/{ => backend}/modules/brain/rags/quivr_rag.py (87%) rename backend/{ => backend}/modules/brain/rags/rag_interface.py (100%) rename backend/{ => backend}/modules/brain/repository/__init__.py (100%) rename backend/{ => backend}/modules/brain/repository/api_brain_definitions.py (84%) rename backend/{ => backend}/modules/brain/repository/brains.py (84%) rename backend/{ => backend}/modules/brain/repository/brains_users.py (92%) rename backend/{ => backend}/modules/brain/repository/brains_vectors.py (94%) rename backend/{ => backend}/modules/brain/repository/composite_brains_connections.py (86%) rename backend/{ => backend}/modules/brain/repository/external_api_secrets.py (91%) rename backend/{ => backend}/modules/brain/repository/integration_brains.py (94%) rename backend/{ => backend}/modules/brain/repository/interfaces/__init__.py (100%) rename backend/{ => backend}/modules/brain/repository/interfaces/api_brain_definitions_interface.py (83%) rename backend/{ => backend}/modules/brain/repository/interfaces/brains_interface.py (86%) rename backend/{ => backend}/modules/brain/repository/interfaces/brains_users_interface.py (95%) rename backend/{ => backend}/modules/brain/repository/interfaces/brains_vectors_interface.py (100%) rename backend/{ => backend}/modules/brain/repository/interfaces/composite_brains_connections_interface.py (92%) rename backend/{ => backend}/modules/brain/repository/interfaces/external_api_secrets_interface.py (100%) rename backend/{ => backend}/modules/brain/repository/interfaces/integration_brains_interface.py (96%) rename backend/{modules/chat => backend/modules/brain/service}/__init__.py (100%) rename backend/{ => backend}/modules/brain/service/api_brain_definition_service.py (74%) rename backend/{ => backend}/modules/brain/service/brain_authorization_service.py (87%) rename backend/{ => backend}/modules/brain/service/brain_service.py (87%) rename backend/{ => backend}/modules/brain/service/brain_subscription/__init__.py (100%) rename backend/{ => backend}/modules/brain/service/brain_subscription/resend_invitation_email.py (82%) rename backend/{ => backend}/modules/brain/service/brain_subscription/subscription_invitation_service.py (91%) rename backend/{ => backend}/modules/brain/service/brain_user_service.py (80%) rename backend/{ => backend}/modules/brain/service/brain_vector_service.py (85%) rename backend/{ => backend}/modules/brain/service/call_brain_api.py (91%) rename backend/{ => backend}/modules/brain/service/get_api_brain_definition_as_json_schema.py (84%) rename backend/{ => backend}/modules/brain/service/get_question_context_from_brain.py (84%) rename backend/{ => backend}/modules/brain/service/integration_brain_service.py (73%) rename backend/{ => backend}/modules/brain/service/test_brain_service.py (100%) rename backend/{ => backend}/modules/brain/service/utils/__init__.py (100%) rename backend/{ => backend}/modules/brain/service/utils/format_chat_history.py (75%) rename backend/{ => backend}/modules/brain/service/utils/get_prompt_to_use_id.py (66%) rename backend/{ => backend}/modules/brain/service/utils/validate_brain.py (86%) rename backend/{ => backend}/modules/brain/tests/test_brains_interface.py (100%) create mode 100644 backend/backend/modules/chat/__init__.py rename backend/{ => backend}/modules/chat/controller/__init__.py (100%) rename backend/{ => backend}/modules/chat/controller/chat/__init_.py (100%) rename backend/{ => backend}/modules/chat/controller/chat/brainful_chat.py (53%) rename backend/{ => backend}/modules/chat/controller/chat/brainless_chat.py (88%) rename backend/{ => backend}/modules/chat/controller/chat/factory.py (100%) rename backend/{ => backend}/modules/chat/controller/chat/interface.py (75%) rename backend/{ => backend}/modules/chat/controller/chat/test_utils.py (100%) rename backend/{ => backend}/modules/chat/controller/chat/utils.py (83%) rename backend/{ => backend}/modules/chat/controller/chat_routes.py (59%) rename backend/{ => backend}/modules/chat/dto/__init__.py (100%) rename backend/{ => backend}/modules/chat/dto/chats.py (87%) rename backend/{ => backend}/modules/chat/dto/inputs.py (100%) rename backend/{ => backend}/modules/chat/dto/outputs.py (79%) rename backend/{ => backend}/modules/chat/entity/__init__.py (100%) create mode 100644 backend/backend/modules/chat/entity/chat.py rename backend/{ => backend}/modules/chat/repository/__init__.py (100%) create mode 100644 backend/backend/modules/chat/repository/chats.py rename backend/{ => backend}/modules/chat/repository/chats_interface.py (85%) rename backend/{ => backend}/modules/chat/service/__init__.py (100%) rename backend/{ => backend}/modules/chat/service/chat_service.py (51%) rename backend/{ => backend}/modules/chat/service/utils.py (57%) rename backend/{modules/chat/tests/test_chats.py => backend/modules/chat/tests/conftest.py} (100%) create mode 100644 backend/backend/modules/chat/tests/test_chats.py rename backend/{ => backend}/modules/contact_support/__init__.py (100%) rename backend/{ => backend}/modules/contact_support/controller/__init__.py (100%) rename backend/{ => backend}/modules/contact_support/controller/contact_routes.py (84%) rename backend/{ => backend}/modules/contact_support/controller/settings.py (100%) create mode 100644 backend/backend/modules/dependencies.py rename backend/{ => backend}/modules/knowledge/__init__.py (100%) rename backend/{ => backend}/modules/knowledge/controller/__init__.py (100%) rename backend/{ => backend}/modules/knowledge/controller/knowledge_routes.py (82%) rename backend/{ => backend}/modules/knowledge/dto/__init__.py (100%) rename backend/{ => backend}/modules/knowledge/dto/inputs.py (100%) rename backend/{ => backend}/modules/knowledge/dto/outputs.py (100%) rename backend/{ => backend}/modules/knowledge/entity/__init__.py (100%) rename backend/{ => backend}/modules/knowledge/entity/knowledge.py (100%) create mode 100644 backend/backend/modules/knowledge/repository/__init__.py rename backend/{ => backend}/modules/knowledge/repository/knowledge_interface.py (86%) rename backend/{ => backend}/modules/knowledge/repository/knowledges.py (87%) rename backend/{ => backend}/modules/knowledge/repository/storage.py (77%) rename backend/{ => backend}/modules/knowledge/repository/storage_interface.py (100%) rename backend/{ => backend}/modules/knowledge/service/__init__.py (100%) rename backend/{ => backend}/modules/knowledge/service/knowledge_service.py (71%) rename backend/{ => backend}/modules/misc/controller/__init__.py (100%) rename backend/{ => backend}/modules/misc/controller/misc_routes.py (100%) rename backend/{ => backend}/modules/notification/__init__.py (100%) rename backend/{ => backend}/modules/notification/controller/__init__.py (100%) rename backend/{ => backend}/modules/notification/dto/__init__.py (100%) rename backend/{ => backend}/modules/notification/dto/inputs.py (89%) rename backend/{ => backend}/modules/notification/dto/outputs.py (100%) rename backend/{ => backend}/modules/notification/entity/__init__.py (100%) rename backend/{ => backend}/modules/notification/entity/notification.py (100%) rename backend/{ => backend}/modules/notification/repository/__init__.py (100%) rename backend/{ => backend}/modules/notification/repository/notifications.py (86%) rename backend/{ => backend}/modules/notification/repository/notifications_interface.py (79%) rename backend/{ => backend}/modules/notification/service/__init__.py (100%) rename backend/{ => backend}/modules/notification/service/notification_service.py (74%) rename backend/{ => backend}/modules/notification/tests/test_notification.py (100%) rename backend/{ => backend}/modules/onboarding/__init__.py (100%) rename backend/{ => backend}/modules/onboarding/controller/__init__.py (100%) rename backend/{ => backend}/modules/onboarding/controller/onboarding_routes.py (71%) rename backend/{ => backend}/modules/onboarding/dto/__init__.py (100%) rename backend/{ => backend}/modules/onboarding/dto/inputs.py (100%) rename backend/{ => backend}/modules/onboarding/entity/__init__.py (100%) rename backend/{ => backend}/modules/onboarding/entity/onboarding.py (100%) rename backend/{ => backend}/modules/onboarding/repository/__init__.py (100%) rename backend/{ => backend}/modules/onboarding/repository/onboardings.py (95%) rename backend/{ => backend}/modules/onboarding/repository/onboardings_interface.py (87%) rename backend/{ => backend}/modules/onboarding/service/__init__.py (100%) rename backend/{ => backend}/modules/onboarding/service/onboarding_service.py (80%) rename backend/{ => backend}/modules/onboarding/tests/test_onboarding.py (100%) rename backend/{ => backend}/modules/prompt/__init__.py (100%) rename backend/{ => backend}/modules/prompt/controller/__init__.py (100%) rename backend/{ => backend}/modules/prompt/controller/prompt_routes.py (88%) rename backend/{ => backend}/modules/prompt/entity/__init__.py (100%) rename backend/{ => backend}/modules/prompt/entity/prompt.py (50%) rename backend/{ => backend}/modules/prompt/repository/__init__.py (100%) rename backend/{ => backend}/modules/prompt/repository/prompts.py (93%) rename backend/{ => backend}/modules/prompt/repository/prompts_interface.py (96%) rename backend/{ => backend}/modules/prompt/service/__init__.py (100%) rename backend/{ => backend}/modules/prompt/service/get_prompt_to_use.py (69%) rename backend/{ => backend}/modules/prompt/service/prompt_service.py (89%) rename backend/{ => backend}/modules/prompt/tests/test_prompt.py (100%) rename backend/{ => backend}/modules/sync/__init__.py (100%) rename backend/{ => backend}/modules/sync/controller/__init__.py (100%) rename backend/{ => backend}/modules/sync/controller/azure_sync_routes.py (93%) rename backend/{ => backend}/modules/sync/controller/google_sync_routes.py (93%) rename backend/{ => backend}/modules/sync/controller/successfull_connection.py (100%) rename backend/{ => backend}/modules/sync/controller/sync_routes.py (89%) rename backend/{ => backend}/modules/sync/dto/__init__.py (100%) rename backend/{ => backend}/modules/sync/dto/inputs.py (100%) rename backend/{ => backend}/modules/sync/dto/outputs.py (100%) rename backend/{ => backend}/modules/sync/entity/__init__.py (100%) rename backend/{ => backend}/modules/sync/entity/sync.py (100%) rename backend/{ => backend}/modules/sync/repository/__init__.py (100%) rename backend/{ => backend}/modules/sync/repository/sync.py (93%) rename backend/{ => backend}/modules/sync/repository/sync_files.py (91%) rename backend/{ => backend}/modules/sync/repository/sync_interfaces.py (95%) rename backend/{ => backend}/modules/sync/repository/sync_user.py (92%) rename backend/{ => backend}/modules/sync/service/__init__.py (100%) rename backend/{ => backend}/modules/sync/service/sync_service.py (84%) rename backend/{ => backend}/modules/sync/tasks.py (79%) rename backend/{ => backend}/modules/sync/tests/test_api_key.py (100%) rename backend/{ => backend}/modules/sync/utils/LICENSE (100%) rename backend/{ => backend}/modules/sync/utils/__init__.py (100%) rename backend/{ => backend}/modules/sync/utils/googleutils.py (92%) rename backend/{ => backend}/modules/sync/utils/list_files.py (98%) rename backend/{ => backend}/modules/sync/utils/normalize.py (62%) rename backend/{ => backend}/modules/sync/utils/sharepointutils.py (92%) rename backend/{ => backend}/modules/sync/utils/upload.py (76%) rename backend/{ => backend}/modules/tools/__init__.py (100%) rename backend/{ => backend}/modules/tools/email_sender.py (91%) rename backend/{ => backend}/modules/tools/image_generator.py (100%) rename backend/{ => backend}/modules/tools/url_reader.py (97%) rename backend/{ => backend}/modules/tools/web_search.py (98%) rename backend/{ => backend}/modules/upload/__init__.py (100%) rename backend/{ => backend}/modules/upload/controller/__init__.py (100%) rename backend/{ => backend}/modules/upload/controller/upload_routes.py (76%) rename backend/{ => backend}/modules/upload/service/__init__.py (100%) rename backend/{ => backend}/modules/upload/service/generate_file_signed_url.py (91%) rename backend/{ => backend}/modules/upload/service/list_files.py (85%) rename backend/{ => backend}/modules/upload/service/upload_file.py (97%) rename backend/{ => backend}/modules/upload/tests/test_files/test.bib (100%) rename backend/{ => backend}/modules/upload/tests/test_files/test.csv (100%) rename backend/{ => backend}/modules/upload/tests/test_files/test.pdf (100%) rename backend/{ => backend}/modules/upload/tests/test_files/test.txt (100%) rename backend/{ => backend}/modules/upload/tests/test_upload.py (100%) rename backend/{ => backend}/modules/user/__init__.py (100%) rename backend/{ => backend}/modules/user/controller/__init__.py (100%) rename backend/{ => backend}/modules/user/controller/user_controller.py (88%) rename backend/{ => backend}/modules/user/dto/inputs.py (100%) create mode 100644 backend/backend/modules/user/entity/user_identity.py rename backend/{ => backend}/modules/user/repository/__init__.py (100%) rename backend/{ => backend}/modules/user/repository/users.py (71%) rename backend/{ => backend}/modules/user/repository/users_interface.py (85%) rename backend/{ => backend}/modules/user/service/__init__.py (100%) rename backend/{ => backend}/modules/user/service/user_service.py (75%) rename backend/{ => backend}/modules/user/service/user_usage.py (86%) rename backend/{ => backend}/modules/user/tests/test_user_controller.py (100%) rename backend/{ => backend}/packages/__init__.py (100%) rename backend/{ => backend}/packages/emails/__init__.py (100%) rename backend/{ => backend}/packages/emails/send_email.py (78%) rename backend/{ => backend}/packages/embeddings/__init__.py (100%) rename backend/{ => backend}/packages/embeddings/vectors.py (90%) rename backend/{ => backend}/packages/files/__init__.py (100%) rename backend/{ => backend}/packages/files/crawl/__init__.py (100%) rename backend/{ => backend}/packages/files/crawl/crawler.py (96%) rename backend/{ => backend}/packages/files/file.py (100%) rename backend/{ => backend}/packages/files/loaders/__init__.py (100%) rename backend/{ => backend}/packages/files/loaders/telegram.py (100%) rename backend/{ => backend}/packages/files/parsers/__init__.py (100%) rename backend/{ => backend}/packages/files/parsers/audio.py (90%) rename backend/{ => backend}/packages/files/parsers/bibtex.py (91%) rename backend/{ => backend}/packages/files/parsers/code_python.py (91%) rename backend/{ => backend}/packages/files/parsers/common.py (85%) rename backend/{ => backend}/packages/files/parsers/csv.py (91%) rename backend/{ => backend}/packages/files/parsers/docx.py (91%) rename backend/{ => backend}/packages/files/parsers/epub.py (92%) rename backend/{ => backend}/packages/files/parsers/github.py (93%) rename backend/{ => backend}/packages/files/parsers/html.py (92%) rename backend/{ => backend}/packages/files/parsers/markdown.py (92%) rename backend/{ => backend}/packages/files/parsers/notebook.py (91%) rename backend/{ => backend}/packages/files/parsers/odt.py (92%) rename backend/{ => backend}/packages/files/parsers/pdf.py (92%) rename backend/{ => backend}/packages/files/parsers/powerpoint.py (92%) rename backend/{ => backend}/packages/files/parsers/telegram.py (77%) rename backend/{ => backend}/packages/files/parsers/txt.py (91%) rename backend/{ => backend}/packages/files/parsers/xlsx.py (92%) rename backend/{ => backend}/packages/files/processors.py (96%) rename backend/{routes => backend/packages/quivr_core}/__init__.py (100%) create mode 100644 backend/backend/packages/quivr_core/brain_factory.py create mode 100644 backend/backend/packages/quivr_core/config.py create mode 100644 backend/backend/packages/quivr_core/models.py create mode 100644 backend/backend/packages/quivr_core/prompts.py create mode 100644 backend/backend/packages/quivr_core/quivr_rag.py create mode 100644 backend/backend/packages/quivr_core/utils.py rename backend/{ => backend}/packages/utils/__init__.py (100%) rename backend/{ => backend}/packages/utils/handle_request_validation_error.py (95%) rename backend/{ => backend}/packages/utils/parse_message_time.py (68%) rename backend/{ => backend}/packages/utils/telemetry.py (88%) rename backend/{ => backend}/playground/auth-azure.py (100%) rename backend/{ => backend}/playground/auth.py (100%) rename backend/{vectorstore => backend/routes}/__init__.py (100%) rename backend/{ => backend}/routes/crawl_routes.py (70%) rename backend/{ => backend}/routes/headers/__init_.py (100%) rename backend/{ => backend}/routes/headers/get_origin_header.py (100%) rename backend/{ => backend}/routes/subscription_routes.py (93%) create mode 100644 backend/backend/vectorstore/__init__.py rename backend/{ => backend}/vectorstore/supabase.py (93%) delete mode 100644 backend/models/__init__.py delete mode 100644 backend/models/databases/supabase/__init__.py delete mode 100644 backend/modules/analytics/service/analytics_service.py delete mode 100644 backend/modules/brain/entity/brain_entity.py delete mode 100644 backend/modules/chat/entity/chat.py delete mode 100644 backend/modules/chat/repository/chats.py delete mode 100644 backend/modules/knowledge/repository/__init__.py delete mode 100644 backend/modules/user/entity/user_identity.py create mode 100644 backend/poetry.lock create mode 100644 backend/pyproject.toml create mode 100644 backend/tests/crawl/__init__.py create mode 100644 backend/tests/crawl/test_crawl.py create mode 100644 backend/tests/file_process/__init__.py create mode 100644 backend/tests/file_process/dummy.pdf create mode 100644 backend/tests/file_process/test_pdf_process.py diff --git a/.env.example b/.env.example index f7884c39d4dc..80176a457dce 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,7 @@ # This file is used to configure the Quivr stack. It is used by the `docker-compose.yml` file to configure the stack. # OPENAI. Update this to use your API key. To skip OpenAI integration use a fake key, for example: tk-aabbccddAABBCCDDEeFfGgHhIiJKLmnopjklMNOPqQqQqQqQ -OPENAI_API_KEY=CHANGE_ME +OPENAI_API_KEY=CHANGE_ME # LOCAL # OLLAMA_API_BASE_URL=http://host.docker.internal:11434 # Uncomment to activate ollama. This is the local url for the ollama api @@ -28,6 +28,7 @@ NEXT_PUBLIC_AUTH_MODES=password SUPABASE_URL=http://host.docker.internal:54321 SUPABASE_SERVICE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU PG_DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:54322/postgres +PG_DATABASE_ASYNC_URL=postgresql+asyncpg://postgres:postgres@host.docker.internal:54322/postgres ANTHROPIC_API_KEY=null JWT_SECRET_KEY=super-secret-jwt-token-with-at-least-32-characters-long AUTHENTICATE=true diff --git a/CHANGELOG.md b/CHANGELOG.md index 207a5b1424a1..55727b92b569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,1000 +53,1034 @@ ## 0.0.268 (2024-06-18) ## What's Changed -* fix(frontend): rephrase unpaid to free by @Zewed in https://github.com/QuivrHQ/quivr/pull/2679 -* feat(frontend): set from connections by default in knowledge to feed by @Zewed in https://github.com/QuivrHQ/quivr/pull/2680 -* feat(frontend): rephrase from Url to from Website's page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2683 -* feat(frontend): new chat interface by @Zewed in https://github.com/QuivrHQ/quivr/pull/2687 -* fix(frontend): next step impossible if no knowledge when creating brain if no onboarded by @Zewed in https://github.com/QuivrHQ/quivr/pull/2688 -* feat(turbopack): Implement turbo pack compiler by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2685 -* fix(frontend): rephrase thoughts button title by @Zewed in https://github.com/QuivrHQ/quivr/pull/2689 +- fix(frontend): rephrase unpaid to free by @Zewed in https://github.com/QuivrHQ/quivr/pull/2679 +- feat(frontend): set from connections by default in knowledge to feed by @Zewed in https://github.com/QuivrHQ/quivr/pull/2680 +- feat(frontend): rephrase from Url to from Website's page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2684 +- feat(frontend): new chat interface by @Zewed in https://github.com/QuivrHQ/quivr/pull/2687 +- fix(frontend): next step impossible if no knowledge when creating brain if no onboarded by @Zewed in https://github.com/QuivrHQ/quivr/pull/2688 +- feat(turbopack): Implement turbo pack compiler by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2685 +- fix(frontend): rephrase thoughts button title by @Zewed in https://github.com/QuivrHQ/quivr/pull/2689 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.267...v0.0.268 ## 0.0.267 (2024-06-14) ## What's Changed -* fix(frontend): scroll modal payment by @Zewed in https://github.com/QuivrHQ/quivr/pull/2675 +- fix(frontend): scroll modal payment by @Zewed in https://github.com/QuivrHQ/quivr/pull/2675 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.266...v0.0.267 ## 0.0.266 (2024-06-13) ## What's Changed -* fix: Add logic to filter active subscriptions in check_if_is_premium_user function by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2673 +- fix: Add logic to filter active subscriptions in check_if_is_premium_user function by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2673 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.265...v0.0.266 ## 0.0.265 (2024-06-13) ## What's Changed -* feat: Add timezone conversion for premium user check by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2670 +- feat: Add timezone conversion for premium user check by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2670 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.264...v0.0.265 ## 0.0.264 (2024-06-13) ## What's Changed -* fix: name passed in sync authorize by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2665 -* feat: Add premium user check in celery task by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2668 +- fix: name passed in sync authorize by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2665 +- feat: Add premium user check in celery task by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2668 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.263...v0.0.264 ## 0.0.263 (2024-06-12) ## What's Changed -* fix: Add error handling for syncing in tasks.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2663 +- fix: Add error handling for syncing in tasks.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2663 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.262...v0.0.263 ## 0.0.262 (2024-06-12) ## What's Changed -* Update README.md by @ferozemohideen in https://github.com/QuivrHQ/quivr/pull/2660 -* feat: Normalize file names in sync module by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2661 +- Update README.md by @ferozemohideen in https://github.com/QuivrHQ/quivr/pull/2660 +- feat: Normalize file names in sync module by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2661 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.261...v0.0.262 ## 0.0.261 (2024-06-11) ## What's Changed -* feat: Update Google authorization URL with prompt for consent by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2658 +- feat: Update Google authorization URL with prompt for consent by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2658 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.260...v0.0.261 ## 0.0.260 (2024-06-11) ## What's Changed -* feat: Add extra_hosts configuration to docker-compose.dev.yml by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2635 -* fix: sync creation fixed by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2637 -* chore: Set default value for "last_synced" column in "syncs_active" table to '2024-06-01 15:30:25+00' by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2638 -* fix: integrations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2642 -* feat(frontend): sharepoint and gdrive integration by @Zewed in https://github.com/QuivrHQ/quivr/pull/2643 -* fix(frontend): display bug on add knowledge by @Zewed in https://github.com/QuivrHQ/quivr/pull/2644 -* fix: files_metadata by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2645 -* fix(google): auth is now in state by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2647 -* fix(frontend): add brain modal integration doestn t work by @Zewed in https://github.com/QuivrHQ/quivr/pull/2649 -* fix(frontend): tooltip on folder line by @Zewed in https://github.com/QuivrHQ/quivr/pull/2650 -* feat: telemetry improved by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2651 -* feat: Add force_sync option to SyncsActiveUpdateInput by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2652 -* Update license to include enterprise features by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2653 -* fix(frontend): onboarding bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2655 -* Update README.md by @ferozemohideen in https://github.com/QuivrHQ/quivr/pull/2656 + +- feat: Add extra_hosts configuration to docker-compose.dev.yml by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2635 +- fix: sync creation fixed by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2637 +- chore: Set default value for "last_synced" column in "syncs_active" table to '2024-06-01 15:30:25+00' by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2638 +- fix: integrations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2642 +- feat(frontend): sharepoint and gdrive integration by @Zewed in https://github.com/QuivrHQ/quivr/pull/2643 +- fix(frontend): display bug on add knowledge by @Zewed in https://github.com/QuivrHQ/quivr/pull/2644 +- fix: files_metadata by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2645 +- fix(google): auth is now in state by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2647 +- fix(frontend): add brain modal integration doestn t work by @Zewed in https://github.com/QuivrHQ/quivr/pull/2649 +- fix(frontend): tooltip on folder line by @Zewed in https://github.com/QuivrHQ/quivr/pull/2650 +- feat: telemetry improved by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2651 +- feat: Add force_sync option to SyncsActiveUpdateInput by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2652 +- Update license to include enterprise features by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2653 +- fix(frontend): onboarding bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2655 +- Update README.md by @ferozemohideen in https://github.com/QuivrHQ/quivr/pull/2656 ## New Contributors -* @ferozemohideen made their first contribution in https://github.com/QuivrHQ/quivr/pull/2656 + +- @ferozemohideen made their first contribution in https://github.com/QuivrHQ/quivr/pull/2656 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.259...v0.0.260 ## 0.0.259 (2024-06-04) ## What's Changed -* feat(upload): async improved by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2544 + +- feat(upload): async improved by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2544 ## New Contributors -* @AmineDiro made their first contribution in https://github.com/QuivrHQ/quivr/pull/2544 + +- @AmineDiro made their first contribution in https://github.com/QuivrHQ/quivr/pull/2544 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.258...v0.0.259 ## 0.0.258 (2024-05-29) ## What's Changed -* feat: Update QuivrRAG and run_evaluation.py files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2615 -* fix: modify thought prompt by @chloedia in https://github.com/QuivrHQ/quivr/pull/2626 -* feat(llamaparse): Update parsing instructions in common.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2627 -* feat(sync): retrieve user email used for the connection by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2628 -* fix: Refactor conversational_qa_chain initialization in KnowledgeBrainQA by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2629 +- feat: Update QuivrRAG and run_evaluation.py files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2615 +- fix: modify thought prompt by @chloedia in https://github.com/QuivrHQ/quivr/pull/2626 +- feat(llamaparse): Update parsing instructions in common.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2627 +- feat(sync): retrieve user email used for the connection by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2628 +- fix: Refactor conversational_qa_chain initialization in KnowledgeBrainQA by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2629 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.257...v0.0.258 ## 0.0.257 (2024-05-28) ## What's Changed -* Add Privacy & Compliance Documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2620 -* docs(security): added compliance by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2621 -* fix(frontend): upgrade button on user page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2623 -* feat(frontend): Add ThoughtsButton component for displaying thoughts by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2624 +- Add Privacy & Compliance Documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2620 +- docs(security): added compliance by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2621 +- fix(frontend): upgrade button on user page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2623 +- feat(frontend): Add ThoughtsButton component for displaying thoughts by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2624 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.256...v0.0.257 ## 0.0.256 (2024-05-26) ## What's Changed -* feat(rag): follow-up questions and thoughts with spanish fix by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2618 +- feat(rag): follow-up questions and thoughts with spanish fix by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2618 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.255...v0.0.256 ## 0.0.255 (2024-05-24) ## What's Changed -* feat: Add Google Drive & Sharepoint sync in backend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2592 -* Revert "feat: Add Google Drive & Sharepoint sync in backend" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2603 -* Feat/auth-playground by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2605 -* feat: add init to create packages by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2606 -* Add additional modules to celery.autodiscover_tasks() by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2607 -* Feat/celery import by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2608 -* feat: self-reflect brain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2610 -* feat: ragas improved testing by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2611 -* fix(frontend): less agressive colors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2612 -* fix(frontend): important buttons by @Zewed in https://github.com/QuivrHQ/quivr/pull/2613 -* fix(frontend): fix white colors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2614 -* fix(frontend): using dark mode in tiptap by @ramonzaca in https://github.com/QuivrHQ/quivr/pull/2616 + +- feat: Add Google Drive & Sharepoint sync in backend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2592 +- Revert "feat: Add Google Drive & Sharepoint sync in backend" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2603 +- Feat/auth-playground by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2605 +- feat: add init to create packages by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2606 +- Add additional modules to celery.autodiscover_tasks() by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2607 +- Feat/celery import by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2608 +- feat: self-reflect brain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2610 +- feat: ragas improved testing by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2611 +- fix(frontend): less agressive colors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2612 +- fix(frontend): important buttons by @Zewed in https://github.com/QuivrHQ/quivr/pull/2613 +- fix(frontend): fix white colors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2614 +- fix(frontend): using dark mode in tiptap by @ramonzaca in https://github.com/QuivrHQ/quivr/pull/2616 ## New Contributors -* @ramonzaca made their first contribution in https://github.com/QuivrHQ/quivr/pull/2616 + +- @ramonzaca made their first contribution in https://github.com/QuivrHQ/quivr/pull/2616 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.254...v0.0.255 ## 0.0.254 (2024-05-21) ## What's Changed -* fix: sender email address in resend_invitation_email.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2600 +- fix: sender email address in resend_invitation_email.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2600 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.253...v0.0.254 ## 0.0.253 (2024-05-14) ## What's Changed -* fix(frontend): Implement persistent dark mode setting and & Implement persistent dark mode setting by @elazarnaaman in https://github.com/QuivrHQ/quivr/pull/2423 -* fix(frontend): hover effect on profile Button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2587 -* fix(frontend): user invite UI on Mobile by @Zewed in https://github.com/QuivrHQ/quivr/pull/2586 -* feat: Update ChatLiteLLM model and add RLS optimization for notifications by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2591 + +- fix(frontend): Implement persistent dark mode setting and & Implement persistent dark mode setting by @elazarnaaman in https://github.com/QuivrHQ/quivr/pull/2423 +- fix(frontend): hover effect on profile Button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2587 +- fix(frontend): user invite UI on Mobile by @Zewed in https://github.com/QuivrHQ/quivr/pull/2586 +- feat: Update ChatLiteLLM model and add RLS optimization for notifications by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2591 ## New Contributors -* @elazarnaaman made their first contribution in https://github.com/QuivrHQ/quivr/pull/2423 + +- @elazarnaaman made their first contribution in https://github.com/QuivrHQ/quivr/pull/2423 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.252...v0.0.253 ## 0.0.252 (2024-05-13) ## What's Changed -* docs: Update GPT4 documentation with available tools and use cases by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2580 -* docs: Add docstrings to integration brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2582 -* fix: Update import statements for OllamaEmbeddings by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2584 -* feat: Add support for gpt-4o model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2589 +- docs: Update GPT4 documentation with available tools and use cases by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2580 +- docs: Add docstrings to integration brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2582 +- fix: Update import statements for OllamaEmbeddings by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2584 +- feat: Add support for gpt-4o model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2589 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.251...v0.0.252 ## 0.0.251 (2024-05-10) ## What's Changed -* feat(tool): Add URLReaderTool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2577 -* feat(email): Add email sender tool and update image generator tool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2579 +- feat(tool): Add URLReaderTool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2577 +- feat(email): Add email sender tool and update image generator tool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2579 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.250...v0.0.251 ## 0.0.250 (2024-05-10) ## What's Changed -* feat(gpt4): Add search functionality by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2566 -* [ImgBot] Optimize images by @imgbot in https://github.com/QuivrHQ/quivr/pull/2568 -* feat(gpt4): image generation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2569 -* fix(front): Add NEXT_PUBLIC_AUTH_MODES to .env.example by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2570 -* fix: NEXT_PUBLIC_AUTH_MODES in docker-compose.yml by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2572 -* docs: Add Supabase configuration documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2574 -* docs(gpt4): Update GPT-4 Documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2573 -* chore: tools by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2575 -* feat(brave-search): Update GPT4Brain tools and add WebSearchTool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2576 + +- feat(gpt4): Add search functionality by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2566 +- [ImgBot] Optimize images by @imgbot in https://github.com/QuivrHQ/quivr/pull/2568 +- feat(gpt4): image generation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2569 +- fix(front): Add NEXT_PUBLIC_AUTH_MODES to .env.example by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2570 +- fix: NEXT_PUBLIC_AUTH_MODES in docker-compose.yml by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2572 +- docs: Add Supabase configuration documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2574 +- docs(gpt4): Update GPT-4 Documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2573 +- chore: tools by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2575 +- feat(brave-search): Update GPT4Brain tools and add WebSearchTool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2576 ## New Contributors -* @imgbot made their first contribution in https://github.com/QuivrHQ/quivr/pull/2568 + +- @imgbot made their first contribution in https://github.com/QuivrHQ/quivr/pull/2568 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.249...v0.0.250 ## 0.0.249 (2024-05-08) ## What's Changed -* feat(crawler): Add Playwright for web crawling by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2562 -* ci(ecr): added build to public ecr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2564 +- feat(crawler): Add Playwright for web crawling by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2562 +- ci(ecr): added build to public ecr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2564 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.248...v0.0.249 ## 0.0.248 (2024-05-07) ## What's Changed -* fix: utf8 encoding by @chloedia in https://github.com/QuivrHQ/quivr/pull/2555 -* feat(celery): moved assistant summary to celery by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2557 -* Revert "feat(celery): moved assistant summary to celery" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2558 + +- fix: utf8 encoding by @chloedia in https://github.com/QuivrHQ/quivr/pull/2555 +- feat(celery): moved assistant summary to celery by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2557 +- Revert "feat(celery): moved assistant summary to celery" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2558 ## New Contributors -* @chloedia made their first contribution in https://github.com/QuivrHQ/quivr/pull/2555 + +- @chloedia made their first contribution in https://github.com/QuivrHQ/quivr/pull/2555 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.247...v0.0.248 ## 0.0.247 (2024-05-07) ## What's Changed -* feat(frontend): add notifications for document uploads by @Zewed in https://github.com/QuivrHQ/quivr/pull/2549 -* Update install.mdx by @dazeb in https://github.com/QuivrHQ/quivr/pull/2552 -* fix(frontend): fix notifications issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2551 -* chore(ci): Update PR title linting workflow by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2553 + +- feat(frontend): add notifications for document uploads by @Zewed in https://github.com/QuivrHQ/quivr/pull/2549 +- Update install.mdx by @dazeb in https://github.com/QuivrHQ/quivr/pull/2552 +- fix(frontend): fix notifications issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2551 +- chore(ci): Update PR title linting workflow by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2553 ## New Contributors -* @dazeb made their first contribution in https://github.com/QuivrHQ/quivr/pull/2552 + +- @dazeb made their first contribution in https://github.com/QuivrHQ/quivr/pull/2552 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.246...v0.0.247 ## 0.0.246 (2024-05-04) ## What's Changed -* Enable Porter Application theodo-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2537 -* Enable Porter Application theodo-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2538 -* Add config parameter to conversational_qa_chain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2540 -* feat(notion): update doc by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2542 +- Enable Porter Application theodo-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2537 +- Enable Porter Application theodo-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2538 +- Add config parameter to conversational_qa_chain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2540 +- feat(notion): update doc by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2542 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.245...v0.0.246 ## 0.0.245 (2024-05-03) ## What's Changed -* feat(user): Delete User Data from frontend by @Zewed in https://github.com/QuivrHQ/quivr/pull/2476 -* feat(backend): Add a pre_pring on Connection polling to handle disconnection by @dmourot in https://github.com/QuivrHQ/quivr/pull/2534 -* feat(llama-parse): improve prompt by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2535 -* feat(brain): Add ProxyBrain integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2536 +- feat(user): Delete User Data from frontend by @Zewed in https://github.com/QuivrHQ/quivr/pull/2476 +- feat(backend): Add a pre_pring on Connection polling to handle disconnection by @dmourot in https://github.com/QuivrHQ/quivr/pull/2534 +- feat(llama-parse): improve prompt by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2535 +- feat(brain): Add ProxyBrain integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2536 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.244...v0.0.245 ## 0.0.244 (2024-05-02) ## What's Changed -* fix: Update parsing instruction in common.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2531 +- fix: Update parsing instruction in common.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2531 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.243...v0.0.244 ## 0.0.243 (2024-05-01) ## What's Changed -* fix: Refactor chat_service.py and remove unused code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2530 +- fix: Refactor chat_service.py and remove unused code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2530 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.242...v0.0.243 ## 0.0.242 (2024-05-01) ## What's Changed -* feat(notifications): implemented notifications with RLS and realtime by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2525 -* chore: packages by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2527 -* Enable Porter Application production by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2528 +- feat(notifications): implemented notifications with RLS and realtime by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2525 +- chore: packages by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2527 +- Enable Porter Application production by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2528 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.241...v0.0.242 ## 0.0.241 (2024-05-01) ## What's Changed -* feat(llamaparse): Add Llama Parse integration for complex document parsing by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2517 -* Delete Porter Application quivr-back by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2519 -* Delete Porter Application quivr-demo-front by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2520 -* Enable Porter Application preview by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2521 -* Enable Porter Application preview-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2522 -* feat(frontend): citations & sources by @Zewed in https://github.com/QuivrHQ/quivr/pull/2523 -* Fix: citation handling in ChatItem component by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2524 +- feat(llamaparse): Add Llama Parse integration for complex document parsing by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2517 +- Delete Porter Application quivr-back by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2519 +- Delete Porter Application quivr-demo-front by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2520 +- Enable Porter Application preview by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2521 +- Enable Porter Application preview-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2522 +- feat(frontend): citations & sources by @Zewed in https://github.com/QuivrHQ/quivr/pull/2523 +- Fix: citation handling in ChatItem component by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2524 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.240...v0.0.241 ## 0.0.240 (2024-04-29) ## What's Changed -* feat(supabase): Add logging statements and refactor Supabase client creation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2514 -* feat(backend): use SQLAlchemy instead od supabase API by @dmourot in https://github.com/QuivrHQ/quivr/pull/2516 +- feat(supabase): Add logging statements and refactor Supabase client creation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2514 +- feat(backend): use SQLAlchemy instead od supabase API by @dmourot in https://github.com/QuivrHQ/quivr/pull/2516 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.239...v0.0.240 ## 0.0.239 (2024-04-28) ## What's Changed -* feat(citations): system added by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2498 -* feat(frontend): add nb of knowledges per brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2502 -* docs: Update links in mint.json to add api by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2504 -* feat(docker): Update Dockerfile to install Supabase CLI by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2505 -* fix(frontend): fix some next errors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2503 -* feat(frontend): show remaining credits by @Zewed in https://github.com/QuivrHQ/quivr/pull/2495 -* feat(embedding): keeping citations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2506 -* fix(metadata): Removed citation from metadata by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2507 -* Add ci-migration script by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2508 -* Feat/migration ci 2 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2509 -* Enable Porter Application quivr-com-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2510 -* Enable Porter Application quivr-com by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2511 -* feat(profiler): Add pyinstrument package and update Makefile and backend code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2512 -* feat(db): Add Supabase client and database instances caching by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2513 +- feat(citations): system added by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2498 +- feat(frontend): add nb of knowledges per brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2502 +- docs: Update links in mint.json to add api by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2504 +- feat(docker): Update Dockerfile to install Supabase CLI by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2505 +- fix(frontend): fix some next errors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2503 +- feat(frontend): show remaining credits by @Zewed in https://github.com/QuivrHQ/quivr/pull/2495 +- feat(embedding): keeping citations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2506 +- fix(metadata): Removed citation from metadata by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2507 +- Add ci-migration script by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2508 +- Feat/migration ci 2 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2509 +- Enable Porter Application quivr-com-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2510 +- Enable Porter Application quivr-com by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2511 +- feat(profiler): Add pyinstrument package and update Makefile and backend code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2512 +- feat(db): Add Supabase client and database instances caching by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2513 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.238...v0.0.239 ## 0.0.238 (2024-04-25) ## What's Changed -* Enable Porter Application cherry-pick-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2492 -* Enable Porter Application cherry-pick-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2493 -* feat: Add telemetry ping task to celery worker and main.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2494 -* fix(backend): compute history only if needed and put some cache to remove some call… by @dmourot in https://github.com/QuivrHQ/quivr/pull/2497 +- Enable Porter Application cherry-pick-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2492 +- Enable Porter Application cherry-pick-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2493 +- feat: Add telemetry ping task to celery worker and main.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2494 +- fix(backend): compute history only if needed and put some cache to remove some call… by @dmourot in https://github.com/QuivrHQ/quivr/pull/2497 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.237...v0.0.238 ## 0.0.237 (2024-04-24) ## What's Changed -* docs: Add environment variables, increase user usage, and add new models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2481 -* fix(frontend): Warning for Quivr Assistants by @Zewed in https://github.com/QuivrHQ/quivr/pull/2479 -* fix(frontend): better UI for Onboarding by @Zewed in https://github.com/QuivrHQ/quivr/pull/2477 -* docs: add new configuration items by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2483 -* Revert "fix(frontend): better UI for Onboarding" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2485 -* feat(reranker): Add flashrank and contextual compression retriever by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2480 -* feat(history): max tokens in the history provided by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2487 -* feat: Update chunk overlap to 200 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2488 -* docs: Add reranking configuration guide by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2489 -* docs: Update telemetry configuration in Quivr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2490 +- docs: Add environment variables, increase user usage, and add new models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2481 +- fix(frontend): Warning for Quivr Assistants by @Zewed in https://github.com/QuivrHQ/quivr/pull/2479 +- fix(frontend): better UI for Onboarding by @Zewed in https://github.com/QuivrHQ/quivr/pull/2477 +- docs: add new configuration items by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2483 +- Revert "fix(frontend): better UI for Onboarding" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2485 +- feat(reranker): Add flashrank and contextual compression retriever by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2480 +- feat(history): max tokens in the history provided by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2487 +- feat: Update chunk overlap to 200 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2488 +- docs: Add reranking configuration guide by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2489 +- docs: Update telemetry configuration in Quivr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2490 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.236...v0.0.237 ## 0.0.236 (2024-04-23) ## What's Changed -* feat(docs): update to new by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2465 -* feat(docs): Add new brain files and update navigation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2467 -* Feat/docs category brains agents by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2469 -* fix(docs): update doc by @Zewed in https://github.com/QuivrHQ/quivr/pull/2470 -* feat(digital-ocean): Update deployment instructions for Digital Ocean by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2472 -* docs(digital-ocean): added missing photo by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2473 -* docs: Update brain documentation and images by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2475 +- feat(docs): update to new by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2465 +- feat(docs): Add new brain files and update navigation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2467 +- Feat/docs category brains agents by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2469 +- fix(docs): update doc by @Zewed in https://github.com/QuivrHQ/quivr/pull/2470 +- feat(digital-ocean): Update deployment instructions for Digital Ocean by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2472 +- docs(digital-ocean): added missing photo by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2473 +- docs: Update brain documentation and images by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2475 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.235...v0.0.236 ## 0.0.235 (2024-04-21) ## What's Changed -* fix(sources): Remove duplicate sources and add metadata to model response by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2462 +- fix(sources): Remove duplicate sources and add metadata to model response by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2462 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.234...v0.0.235 ## 0.0.234 (2024-04-21) ## What's Changed -* fix(gpt4): Refactor GPT4Brain and KnowledgeBrainQA classes to add non-streaming-saving-answer by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2460 +- fix(gpt4): Refactor GPT4Brain and KnowledgeBrainQA classes to add non-streaming-saving-answer by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2460 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.233...v0.0.234 ## 0.0.233 (2024-04-21) ## What's Changed -* refactor: reorg files in backend by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2449 -* Revert "refactor: reorg files in backend" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2456 -* refactor: Refacto code #1 by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2458 -* refactor: reorg the files #2 by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2457 -* feat(gpt4): Add chat service and generate answer method to GPT4Brain class by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2459 + +- refactor: reorg files in backend by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2449 +- Revert "refactor: reorg files in backend" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2456 +- refactor: Refacto code #1 by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2458 +- refactor: reorg the files #2 by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2457 +- feat(gpt4): Add chat service and generate answer method to GPT4Brain class by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2459 ## New Contributors -* @MaximeThoonsen made their first contribution in https://github.com/QuivrHQ/quivr/pull/2449 + +- @MaximeThoonsen made their first contribution in https://github.com/QuivrHQ/quivr/pull/2449 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.232...v0.0.233 ## 0.0.232 (2024-04-19) ## What's Changed -* Update CPU and memory settings in task definition files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2450 -* fix: Fix error message in SummaryAssistant class by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2453 +- Update CPU and memory settings in task definition files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2450 +- fix: Fix error message in SummaryAssistant class by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2453 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.231...v0.0.232 ## 0.0.231 (2024-04-19) ## What's Changed -* feat(assistants): Add user usage update and pricing calculation to ITO assistant by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2433 -* feat(assistant): improve prompt summary by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2435 -* feat(assistants): Add PDF generation functionality and nice emails by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2436 -* feat(analytics): rely on sql rather that python loop for brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2437 -* fix(assistant): summary now can output 2000 tokens by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2440 -* feat(assistant): check if key of file is same as filename uploaded by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2439 -* feat: Update Docker build commands and dependencies by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2441 -* feat(rag): Refactor DEFAULT_DOCUMENT_PROMPT in quivr_rag.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2442 -* Enable Porter Application quivr-back by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2443 -* Enable Porter Application quivr-demo-front by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2444 -* fix(assistants): brain id is null by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2445 -* feat(summary): improve prompt to get more insights by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2446 -* feat(aws): Update CPU and memory configurations for task definitions by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2447 -* feat(frontend): Quivr Assistants by @Zewed in https://github.com/QuivrHQ/quivr/pull/2448 +- feat(assistants): Add user usage update and pricing calculation to ITO assistant by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2433 +- feat(assistant): improve prompt summary by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2435 +- feat(assistants): Add PDF generation functionality and nice emails by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2436 +- feat(analytics): rely on sql rather that python loop for brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2437 +- fix(assistant): summary now can output 2000 tokens by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2440 +- feat(assistant): check if key of file is same as filename uploaded by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2439 +- feat: Update Docker build commands and dependencies by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2441 +- feat(rag): Refactor DEFAULT_DOCUMENT_PROMPT in quivr_rag.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2442 +- Enable Porter Application quivr-back by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2443 +- Enable Porter Application quivr-demo-front by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2444 +- fix(assistants): brain id is null by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2445 +- feat(summary): improve prompt to get more insights by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2446 +- feat(aws): Update CPU and memory configurations for task definitions by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2447 +- feat(frontend): Quivr Assistants by @Zewed in https://github.com/QuivrHQ/quivr/pull/2448 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.230...v0.0.231 ## 0.0.230 (2024-04-16) ## What's Changed -* feat(backend): add RAG evaluation using Ragas by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2429 -* feat(assistants): Add new input models for boolean, number, select text, and select number by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2432 +- feat(backend): add RAG evaluation using Ragas by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2429 +- feat(assistants): Add new input models for boolean, number, select text, and select number by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2432 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.229...v0.0.230 ## 0.0.229 (2024-04-12) ## What's Changed -* feat: optimization calls by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2417 -* feat: Add assistant module and remove ingestion module by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2420 -* feat: assistants by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2421 -* feat: Add tags to AssistantOutput classes by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2425 -* feat: Add icon and description to assistant by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2426 -* feat: llamaparse & diff agent by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2427 +- feat: optimization calls by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2417 +- feat: Add assistant module and remove ingestion module by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2420 +- feat: assistants by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2421 +- feat: Add tags to AssistantOutput classes by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2425 +- feat: Add icon and description to assistant by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2426 +- feat: llamaparse & diff agent by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2427 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.228...v0.0.229 ## 0.0.228 (2024-04-10) ## What's Changed -* fix(frontend): phone display issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2386 -* Patch 1 by @llwp in https://github.com/QuivrHQ/quivr/pull/2388 -* fix: typo in README.md by @bolens in https://github.com/QuivrHQ/quivr/pull/2391 -* feat(ingestion): Add ingestion module and routes by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2393 -* feat: Add seed ingestions to supabase migrations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2399 -* feat: Add url_required field to IngestionEntity by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2400 -* Feat: Bibtex file uploads by @colesnic in https://github.com/QuivrHQ/quivr/pull/2398 -* fix: logger level and telemetry function calls by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2409 -* fix: Add integration brain to subscription route by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2410 -* feat(frontend): onboarding V2 by @Zewed in https://github.com/QuivrHQ/quivr/pull/2394 -* fix(frontend): onboardind bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2414 -* fix(frontend): cleaner fix for onboarding by @Zewed in https://github.com/QuivrHQ/quivr/pull/2415 -* feat(analytics): added analytics page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2416 + +- fix(frontend): phone display issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2386 +- Patch 1 by @llwp in https://github.com/QuivrHQ/quivr/pull/2388 +- fix: typo in README.md by @bolens in https://github.com/QuivrHQ/quivr/pull/2391 +- feat(ingestion): Add ingestion module and routes by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2393 +- feat: Add seed ingestions to supabase migrations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2399 +- feat: Add url_required field to IngestionEntity by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2400 +- Feat: Bibtex file uploads by @colesnic in https://github.com/QuivrHQ/quivr/pull/2398 +- fix: logger level and telemetry function calls by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2409 +- fix: Add integration brain to subscription route by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2410 +- feat(frontend): onboarding V2 by @Zewed in https://github.com/QuivrHQ/quivr/pull/2394 +- fix(frontend): onboardind bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2414 +- fix(frontend): cleaner fix for onboarding by @Zewed in https://github.com/QuivrHQ/quivr/pull/2415 +- feat(analytics): added analytics page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2416 ## New Contributors -* @llwp made their first contribution in https://github.com/QuivrHQ/quivr/pull/2388 -* @bolens made their first contribution in https://github.com/QuivrHQ/quivr/pull/2391 -* @colesnic made their first contribution in https://github.com/QuivrHQ/quivr/pull/2398 + +- @llwp made their first contribution in https://github.com/QuivrHQ/quivr/pull/2388 +- @bolens made their first contribution in https://github.com/QuivrHQ/quivr/pull/2391 +- @colesnic made their first contribution in https://github.com/QuivrHQ/quivr/pull/2398 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.227...v0.0.228 ## 0.0.227 (2024-03-28) ## What's Changed -* fix(backend): invitation with new brains did not work by @Zewed in https://github.com/QuivrHQ/quivr/pull/2378 -* fix(backend): invitation brain bugs by @Zewed in https://github.com/QuivrHQ/quivr/pull/2380 -* fix(frontend): disable knowledge tab by @Zewed in https://github.com/QuivrHQ/quivr/pull/2381 -* fix(frontend): dark mode issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2382 -* feat(frontend): show icons only on hover except for last message by @Zewed in https://github.com/QuivrHQ/quivr/pull/2377 +- fix(backend): invitation with new brains did not work by @Zewed in https://github.com/QuivrHQ/quivr/pull/2378 +- fix(backend): invitation brain bugs by @Zewed in https://github.com/QuivrHQ/quivr/pull/2380 +- fix(frontend): disable knowledge tab by @Zewed in https://github.com/QuivrHQ/quivr/pull/2381 +- fix(frontend): dark mode issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2382 +- feat(frontend): show icons only on hover except for last message by @Zewed in https://github.com/QuivrHQ/quivr/pull/2377 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.226...v0.0.227 ## 0.0.226 (2024-03-21) ## What's Changed -* feat: Add Mistral models to defineMaxTokens and BrainConfig by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2363 -* feat: mistral by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2365 -* fix(retriever): Update match_vectors sql function to rank chunks in correct order by @dmourot in https://github.com/QuivrHQ/quivr/pull/2367 -* feat(docker image): Docker image Optimized for CPU-only env by @dmourot in https://github.com/QuivrHQ/quivr/pull/2368 -* feat(frontend): dark mode by @Zewed in https://github.com/QuivrHQ/quivr/pull/2369 -* feat(frontend & backend): thumbs for message feedback by @Zewed in https://github.com/QuivrHQ/quivr/pull/2360 -* fix(backend): migration legacy by @Zewed in https://github.com/QuivrHQ/quivr/pull/2370 -* fix(frontend): type stripe casing by @Zewed in https://github.com/QuivrHQ/quivr/pull/2371 -* fix(backend): unsubscribe from brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2373 -* feat(frontend): onboarding form by @Zewed in https://github.com/QuivrHQ/quivr/pull/2342 -* fix(frontend): onBoarding issue by @Zewed in https://github.com/QuivrHQ/quivr/pull/2374 + +- feat: Add Mistral models to defineMaxTokens and BrainConfig by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2363 +- feat: mistral by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2365 +- fix(retriever): Update match_vectors sql function to rank chunks in correct order by @dmourot in https://github.com/QuivrHQ/quivr/pull/2367 +- feat(docker image): Docker image Optimized for CPU-only env by @dmourot in https://github.com/QuivrHQ/quivr/pull/2368 +- feat(frontend): dark mode by @Zewed in https://github.com/QuivrHQ/quivr/pull/2369 +- feat(frontend & backend): thumbs for message feedback by @Zewed in https://github.com/QuivrHQ/quivr/pull/2360 +- fix(backend): migration legacy by @Zewed in https://github.com/QuivrHQ/quivr/pull/2370 +- fix(frontend): type stripe casing by @Zewed in https://github.com/QuivrHQ/quivr/pull/2371 +- fix(backend): unsubscribe from brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2373 +- feat(frontend): onboarding form by @Zewed in https://github.com/QuivrHQ/quivr/pull/2342 +- fix(frontend): onBoarding issue by @Zewed in https://github.com/QuivrHQ/quivr/pull/2374 ## New Contributors -* @dmourot made their first contribution in https://github.com/QuivrHQ/quivr/pull/2367 + +- @dmourot made their first contribution in https://github.com/QuivrHQ/quivr/pull/2367 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.225...v0.0.226 ## 0.0.225 (2024-03-15) ## What's Changed -* fix(frontend): bigger icon on message row by @Zewed in https://github.com/QuivrHQ/quivr/pull/2345 -* fix(frontend): remove brains usage in user page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2349 +- fix(frontend): bigger icon on message row by @Zewed in https://github.com/QuivrHQ/quivr/pull/2345 +- fix(frontend): remove brains usage in user page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2349 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.224...v0.0.225 ## 0.0.224 (2024-03-15) ## What's Changed -* feat(frontend): add discord link by @Zewed in https://github.com/QuivrHQ/quivr/pull/2343 -* fix(frontend): upgrade to plus by @Zewed in https://github.com/QuivrHQ/quivr/pull/2346 +- feat(frontend): add discord link by @Zewed in https://github.com/QuivrHQ/quivr/pull/2343 +- fix(frontend): upgrade to plus by @Zewed in https://github.com/QuivrHQ/quivr/pull/2346 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.223...v0.0.224 ## 0.0.223 (2024-03-13) ## What's Changed -* chore: update packages backend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2339 -* feat: Add optional fields to UserIdentity and UserUpdatableProperties by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2341 +- chore: update packages backend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2339 +- feat: Add optional fields to UserIdentity and UserUpdatableProperties by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2341 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.222...v0.0.223 ## 0.0.222 (2024-03-09) ## What's Changed -* feat: Update langchain.prompts and langchain_core.messages modules by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2326 -* feat(frontend): social buttons by @Zewed in https://github.com/QuivrHQ/quivr/pull/2325 -* fix(frontend): upgrade to plus button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2324 -* fix(frontend): maximum amount of brains reached by @Zewed in https://github.com/QuivrHQ/quivr/pull/2323 +- feat: Update langchain.prompts and langchain_core.messages modules by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2326 +- feat(frontend): social buttons by @Zewed in https://github.com/QuivrHQ/quivr/pull/2325 +- fix(frontend): upgrade to plus button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2324 +- fix(frontend): maximum amount of brains reached by @Zewed in https://github.com/QuivrHQ/quivr/pull/2323 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.221...v0.0.222 ## 0.0.221 (2024-03-07) ## What's Changed -* feat: seed updated by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2313 -* fix(frontend): allow model change by @Zewed in https://github.com/QuivrHQ/quivr/pull/2317 -* fix(frontend): mention list by @Zewed in https://github.com/QuivrHQ/quivr/pull/2315 -* fix(frontend): studio to brain studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2316 -* feat(frontend): add help tooltip for model selection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2318 -* fix(frontend): page header studio to brain studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2319 +- feat: seed updated by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2313 +- fix(frontend): allow model change by @Zewed in https://github.com/QuivrHQ/quivr/pull/2317 +- fix(frontend): mention list by @Zewed in https://github.com/QuivrHQ/quivr/pull/2315 +- fix(frontend): studio to brain studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2316 +- feat(frontend): add help tooltip for model selection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2318 +- fix(frontend): page header studio to brain studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2319 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.220...v0.0.221 ## 0.0.220 (2024-03-06) ## What's Changed -* fix(frontend): brain name by @Zewed in https://github.com/QuivrHQ/quivr/pull/2311 +- fix(frontend): brain name by @Zewed in https://github.com/QuivrHQ/quivr/pull/2311 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.219...v0.0.220 ## 0.0.219 (2024-03-06) ## What's Changed -* feat: Update to newest version of litellm by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2307 -* fix(frontend): small renaiming chat to thread by @Zewed in https://github.com/QuivrHQ/quivr/pull/2306 -* feat(frontend): brain Catalogue by @Zewed in https://github.com/QuivrHQ/quivr/pull/2303 -* feat(frontend): 404 redirection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2309 -* fix(frontend): old brain legacy by @Zewed in https://github.com/QuivrHQ/quivr/pull/2310 +- feat: Update to newest version of litellm by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2307 +- fix(frontend): small renaiming chat to thread by @Zewed in https://github.com/QuivrHQ/quivr/pull/2306 +- feat(frontend): brain Catalogue by @Zewed in https://github.com/QuivrHQ/quivr/pull/2303 +- feat(frontend): 404 redirection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2309 +- fix(frontend): old brain legacy by @Zewed in https://github.com/QuivrHQ/quivr/pull/2310 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.218...v0.0.219 ## 0.0.218 (2024-03-05) ## What's Changed -* feat: doc as integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2297 -* fix(rag): add api_base by @niels-garve in https://github.com/QuivrHQ/quivr/pull/2289 -* fix(frontend): login bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2300 + +- feat: doc as integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2297 +- fix(rag): add api_base by @niels-garve in https://github.com/QuivrHQ/quivr/pull/2289 +- fix(frontend): login bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2300 ## New Contributors -* @niels-garve made their first contribution in https://github.com/QuivrHQ/quivr/pull/2289 + +- @niels-garve made their first contribution in https://github.com/QuivrHQ/quivr/pull/2289 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.217...v0.0.218 ## 0.0.217 (2024-03-04) ## What's Changed -* fix(frontend): fix home page redirection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2295 +- fix(frontend): fix home page redirection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2295 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.216...v0.0.217 ## 0.0.216 (2024-03-04) ## What's Changed -* feat: Update chunk_size in File model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2281 -* fix(frontend): double file upload on drag and drop by @Zewed in https://github.com/QuivrHQ/quivr/pull/2284 -* fix(frontend): click anywhere on drop zone to upload file by @Zewed in https://github.com/QuivrHQ/quivr/pull/2285 -* fix(frontend): smalls on thread section by @Zewed in https://github.com/QuivrHQ/quivr/pull/2286 -* fix(frontend): remove tests by @Zewed in https://github.com/QuivrHQ/quivr/pull/2287 -* feat(frontend): better UI/UX on select brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2288 -* feat(frontend): add brain icon on brain list by @Zewed in https://github.com/QuivrHQ/quivr/pull/2292 -* fix(frontend): whitespace on firefox by @Zewed in https://github.com/QuivrHQ/quivr/pull/2293 -* fix(frontend): remove unused stuff by @Zewed in https://github.com/QuivrHQ/quivr/pull/2282 +- feat: Update chunk_size in File model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2281 +- fix(frontend): double file upload on drag and drop by @Zewed in https://github.com/QuivrHQ/quivr/pull/2284 +- fix(frontend): click anywhere on drop zone to upload file by @Zewed in https://github.com/QuivrHQ/quivr/pull/2285 +- fix(frontend): smalls on thread section by @Zewed in https://github.com/QuivrHQ/quivr/pull/2286 +- fix(frontend): remove tests by @Zewed in https://github.com/QuivrHQ/quivr/pull/2287 +- feat(frontend): better UI/UX on select brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2288 +- feat(frontend): add brain icon on brain list by @Zewed in https://github.com/QuivrHQ/quivr/pull/2292 +- fix(frontend): whitespace on firefox by @Zewed in https://github.com/QuivrHQ/quivr/pull/2293 +- fix(frontend): remove unused stuff by @Zewed in https://github.com/QuivrHQ/quivr/pull/2282 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.215...v0.0.216 ## 0.0.215 (2024-03-01) ## What's Changed -* fix(frontend): message info box by @Zewed in https://github.com/QuivrHQ/quivr/pull/2277 -* fix(frontend): see knowledge in custom brains by @Zewed in https://github.com/QuivrHQ/quivr/pull/2278 -* fix(frontend): fix disabled knwoledge tab by @Zewed in https://github.com/QuivrHQ/quivr/pull/2280 +- fix(frontend): message info box by @Zewed in https://github.com/QuivrHQ/quivr/pull/2277 +- fix(frontend): see knowledge in custom brains by @Zewed in https://github.com/QuivrHQ/quivr/pull/2278 +- fix(frontend): fix disabled knwoledge tab by @Zewed in https://github.com/QuivrHQ/quivr/pull/2280 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.214...v0.0.215 ## 0.0.214 (2024-02-29) ## What's Changed -* fix(frontend): revamp quivr studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2274 -* fix(frontend): zindex and radius on single selector component by @Zewed in https://github.com/QuivrHQ/quivr/pull/2276 +- fix(frontend): revamp quivr studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2274 +- fix(frontend): zindex and radius on single selector component by @Zewed in https://github.com/QuivrHQ/quivr/pull/2276 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.213...v0.0.214 ## 0.0.213 (2024-02-28) ## What's Changed -* feat(notion): added custom integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2268 -* feat: Remove constraints and add foreign key references to brain tables by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2273 +- feat(notion): added custom integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2268 +- feat: Remove constraints and add foreign key references to brain tables by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2273 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.212...v0.0.213 ## 0.0.212 (2024-02-26) ## What's Changed -* feat: new landing page by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2264 +- feat: new landing page by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2264 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.211...v0.0.212 ## 0.0.211 (2024-02-24) ## What's Changed -* fix: ollama migration documentation by @bidoubiwa in https://github.com/QuivrHQ/quivr/pull/2248 -* Update Sentry configuration and ignore file by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2250 -* Fix Sentry DSN environment variable by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2251 -* fix(sentry): Refactor GlobalError component to use arrow function syntax by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2252 -* fix: Update Sentry configuration to use NEXT_PUBLIC_SENTRY_DSN by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2254 -* feat(frontend): integrate octolane by @Zewed in https://github.com/QuivrHQ/quivr/pull/2256 -* fix(frontend): better search bar and chat box by @Zewed in https://github.com/QuivrHQ/quivr/pull/2255 -* feat(frontend): sources per messages by @Zewed in https://github.com/QuivrHQ/quivr/pull/2253 -* feat(sentry): remove health endpoint by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2257 -* Add octolane.com to Content Security Policy by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2258 -* fix(frontend): ui chat box & sources small bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2260 -* Refactor GitHub workflows by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2261 + +- fix: ollama migration documentation by @bidoubiwa in https://github.com/QuivrHQ/quivr/pull/2248 +- Update Sentry configuration and ignore file by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2250 +- Fix Sentry DSN environment variable by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2251 +- fix(sentry): Refactor GlobalError component to use arrow function syntax by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2252 +- fix: Update Sentry configuration to use NEXT_PUBLIC_SENTRY_DSN by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2254 +- feat(frontend): integrate octolane by @Zewed in https://github.com/QuivrHQ/quivr/pull/2256 +- fix(frontend): better search bar and chat box by @Zewed in https://github.com/QuivrHQ/quivr/pull/2255 +- feat(frontend): sources per messages by @Zewed in https://github.com/QuivrHQ/quivr/pull/2253 +- feat(sentry): remove health endpoint by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2257 +- Add octolane.com to Content Security Policy by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2258 +- fix(frontend): ui chat box & sources small bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2260 +- Refactor GitHub workflows by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2261 ## New Contributors -* @bidoubiwa made their first contribution in https://github.com/QuivrHQ/quivr/pull/2248 + +- @bidoubiwa made their first contribution in https://github.com/QuivrHQ/quivr/pull/2248 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.210...v0.0.211 ## 0.0.210 (2024-02-22) ## What's Changed -* feat: Update memory allocation in task definition by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2243 -* fix: get_brain_details API to include user_id parameter by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2242 -* feat(chat): Add follow up questions functionality by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2241 -* Reduce sampling rate for Sentry traces by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2245 -* Revert "feat(chat): Add follow up questions functionality" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2246 -* Add max_input and max_tokens parameters to KnowledgeBrainQA constructor by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2247 +- feat: Update memory allocation in task definition by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2243 +- fix: get_brain_details API to include user_id parameter by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2242 +- feat(chat): Add follow up questions functionality by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2241 +- Reduce sampling rate for Sentry traces by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2245 +- Revert "feat(chat): Add follow up questions functionality" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2246 +- Add max_input and max_tokens parameters to KnowledgeBrainQA constructor by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2247 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.209...v0.0.210 ## 0.0.209 (2024-02-22) ## What's Changed -* fix(frontend): fix share brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2238 -* fix(frontend): don't preselect core brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2239 +- fix(frontend): fix share brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2238 +- fix(frontend): don't preselect core brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2239 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.208...v0.0.209 ## 0.0.208 (2024-02-21) ## What's Changed -* feat: Add pricing calculation method to GPT4Brain class and update user usage in chat controller by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2216 -* Enable Porter Application quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2220 -* Delete Porter Application quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2221 -* Enable Porter Application preview-quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2222 -* Enable Porter Application prod-quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2223 -* feat(brains): added description by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2224 -* feat: Add integration_logo_url to MinimalUserBrainEntity by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2225 -* Add Redis configuration to celery_config.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2227 -* Remove unused 'model' variable and logging statements by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2228 -* feat: Add max_files attribute to MinimalUserBrainEntity and BrainsUsers repository by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2229 -* Feature: Add animations to foldable section by @johnfewell in https://github.com/QuivrHQ/quivr/pull/2202 -* feat(frontend): first custom brain live by @Zewed in https://github.com/QuivrHQ/quivr/pull/2226 -* fix(frontend): legacy on foldable section animation pr by @Zewed in https://github.com/QuivrHQ/quivr/pull/2230 -* Fix: API endpoint for getting integration brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2231 -* feat: Update dependencies and remove unnecessary logging statements by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2232 -* feat: implement elasticache by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2234 -* fix(frontend): ellipsis overflow on large brain or prompt names by @Zewed in https://github.com/QuivrHQ/quivr/pull/2233 + +- feat: Add pricing calculation method to GPT4Brain class and update user usage in chat controller by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2216 +- Enable Porter Application quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2220 +- Delete Porter Application quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2221 +- Enable Porter Application preview-quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2222 +- Enable Porter Application prod-quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2223 +- feat(brains): added description by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2224 +- feat: Add integration_logo_url to MinimalUserBrainEntity by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2225 +- Add Redis configuration to celery_config.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2227 +- Remove unused 'model' variable and logging statements by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2228 +- feat: Add max_files attribute to MinimalUserBrainEntity and BrainsUsers repository by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2229 +- Feature: Add animations to foldable section by @johnfewell in https://github.com/QuivrHQ/quivr/pull/2202 +- feat(frontend): first custom brain live by @Zewed in https://github.com/QuivrHQ/quivr/pull/2226 +- fix(frontend): legacy on foldable section animation pr by @Zewed in https://github.com/QuivrHQ/quivr/pull/2230 +- Fix: API endpoint for getting integration brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2231 +- feat: Update dependencies and remove unnecessary logging statements by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2232 +- feat: implement elasticache by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2234 +- fix(frontend): ellipsis overflow on large brain or prompt names by @Zewed in https://github.com/QuivrHQ/quivr/pull/2233 ## New Contributors -* @porter-deployment-app made their first contribution in https://github.com/QuivrHQ/quivr/pull/2220 -* @johnfewell made their first contribution in https://github.com/QuivrHQ/quivr/pull/2202 + +- @porter-deployment-app made their first contribution in https://github.com/QuivrHQ/quivr/pull/2220 +- @johnfewell made their first contribution in https://github.com/QuivrHQ/quivr/pull/2202 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.207...v0.0.208 ## 0.0.206 (2024-02-19) ## What's Changed -* feat: Add pricing calculation method to GPT4Brain class and update user usage in chat controller by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2210 -* fix(frontend): click on inputs by @Zewed in https://github.com/QuivrHQ/quivr/pull/2212 +- feat: Add pricing calculation method to GPT4Brain class and update user usage in chat controller by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2210 +- fix(frontend): click on inputs by @Zewed in https://github.com/QuivrHQ/quivr/pull/2212 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.205...v0.0.206 ## 0.0.205 (2024-02-19) ## What's Changed -* Update ollama.mdx by @zangjiucheng in https://github.com/QuivrHQ/quivr/pull/2196 -* feat(integration): improve by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2199 -* fix(frontend): history to threads by @Zewed in https://github.com/QuivrHQ/quivr/pull/2201 -* feat(custom): big brain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2198 -* feat: Update system templates with custom personality support by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2209 + +- Update ollama.mdx by @zangjiucheng in https://github.com/QuivrHQ/quivr/pull/2196 +- feat(integration): improve by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2199 +- fix(frontend): history to threads by @Zewed in https://github.com/QuivrHQ/quivr/pull/2201 +- feat(custom): big brain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2198 +- feat: Update system templates with custom personality support by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2209 ## New Contributors -* @zangjiucheng made their first contribution in https://github.com/QuivrHQ/quivr/pull/2196 + +- @zangjiucheng made their first contribution in https://github.com/QuivrHQ/quivr/pull/2196 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.204...v0.0.205 ## 0.0.203 (2024-02-15) ## What's Changed -* feat: 🎸 ocr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2187 -* feat(lcel): migrated to lcel and pydantic by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2185 -* feat(frontend): new brain creation modal by @Zewed in https://github.com/QuivrHQ/quivr/pull/2192 -* feat(integration): implementation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2191 -* feat(frontend): new design for brain table by @Zewed in https://github.com/QuivrHQ/quivr/pull/2193 +- feat: 🎸 ocr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2187 +- feat(lcel): migrated to lcel and pydantic by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2185 +- feat(frontend): new brain creation modal by @Zewed in https://github.com/QuivrHQ/quivr/pull/2192 +- feat(integration): implementation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2191 +- feat(frontend): new design for brain table by @Zewed in https://github.com/QuivrHQ/quivr/pull/2193 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.202...v0.0.203 ## 0.0.202 (2024-02-11) ## What's Changed -* fix(frontend): change placeholder in chat bar by @Zewed in https://github.com/QuivrHQ/quivr/pull/2177 -* fix(frontend): remove notification banner by @Zewed in https://github.com/QuivrHQ/quivr/pull/2178 -* fix(frontend): remove onboarding questions by @Zewed in https://github.com/QuivrHQ/quivr/pull/2176 -* feat(frontend): new modal for add knowledge by @Zewed in https://github.com/QuivrHQ/quivr/pull/2173 -* Revert "fix(frontend): remove onboarding questions" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2181 -* fix(frontend): remove onboarding question by @Zewed in https://github.com/QuivrHQ/quivr/pull/2183 +- fix(frontend): change placeholder in chat bar by @Zewed in https://github.com/QuivrHQ/quivr/pull/2177 +- fix(frontend): remove notification banner by @Zewed in https://github.com/QuivrHQ/quivr/pull/2178 +- fix(frontend): remove onboarding questions by @Zewed in https://github.com/QuivrHQ/quivr/pull/2176 +- feat(frontend): new modal for add knowledge by @Zewed in https://github.com/QuivrHQ/quivr/pull/2173 +- Revert "fix(frontend): remove onboarding questions" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2181 +- fix(frontend): remove onboarding question by @Zewed in https://github.com/QuivrHQ/quivr/pull/2183 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.201...v0.0.202 ## 0.0.201 (2024-02-10) ## What's Changed -* fix: 🐛 session by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2174 +- fix: 🐛 session by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2174 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.200...v0.0.201 ## 0.0.200 (2024-02-09) ## What's Changed -* fix(daily-usage): Update daily requests count in UserUsage model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2171 +- fix(daily-usage): Update daily requests count in UserUsage model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2171 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.199...v0.0.200 ## 0.0.199 (2024-02-08) ## What's Changed -* feat: 🎸 telemetry by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2169 +- feat: 🎸 telemetry by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2169 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.198...v0.0.199 ## 0.0.197 (2024-02-07) ## What's Changed -* fix(prompts): can now be removed by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2154 -* tests: Add tests for deleting prompts by ID by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2156 -* fix(related): removed public brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2157 -* perf: ⚡️ signed_url by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2159 -* fix(backend): typo in word response by @untilhamza in https://github.com/QuivrHQ/quivr/pull/2158 -* fix(frontend): better UI for phone device by @Zewed in https://github.com/QuivrHQ/quivr/pull/2160 -* fix(frontend): add knwoledge from create brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2161 -* feat(chunks): now chunk size is saved in database dynamically and not just 500 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2164 -* fix(frontend): remove related brains for now by @Zewed in https://github.com/QuivrHQ/quivr/pull/2162 -* fix(frontend): can"t choose private or public brains by @Zewed in https://github.com/QuivrHQ/quivr/pull/2163 -* feat(frontend): manage current brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2165 -* fix(frontend): upgrade my plan by @Zewed in https://github.com/QuivrHQ/quivr/pull/2167 + +- fix(prompts): can now be removed by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2154 +- tests: Add tests for deleting prompts by ID by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2156 +- fix(related): removed public brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2157 +- perf: ⚡️ signed_url by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2159 +- fix(backend): typo in word response by @untilhamza in https://github.com/QuivrHQ/quivr/pull/2158 +- fix(frontend): better UI for phone device by @Zewed in https://github.com/QuivrHQ/quivr/pull/2160 +- fix(frontend): add knwoledge from create brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2161 +- feat(chunks): now chunk size is saved in database dynamically and not just 500 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2164 +- fix(frontend): remove related brains for now by @Zewed in https://github.com/QuivrHQ/quivr/pull/2162 +- fix(frontend): can"t choose private or public brains by @Zewed in https://github.com/QuivrHQ/quivr/pull/2163 +- feat(frontend): manage current brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2165 +- fix(frontend): upgrade my plan by @Zewed in https://github.com/QuivrHQ/quivr/pull/2167 ## New Contributors -* @untilhamza made their first contribution in https://github.com/QuivrHQ/quivr/pull/2158 + +- @untilhamza made their first contribution in https://github.com/QuivrHQ/quivr/pull/2158 **Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.196...v0.0.197 ## 0.0.196 (2024-02-07) ## What's Changed -* feat(frontend): Page Header + Begin of Studio by @Zewed in https://github.com/StanGirard/quivr/pull/2151 -* fix(frontend): overflow brain item by @Zewed in https://github.com/StanGirard/quivr/pull/2153 +- feat(frontend): Page Header + Begin of Studio by @Zewed in https://github.com/StanGirard/quivr/pull/2151 +- fix(frontend): overflow brain item by @Zewed in https://github.com/StanGirard/quivr/pull/2153 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.195...v0.0.196 ## 0.0.195 (2024-02-06) ## What's Changed -* feat(integrations): integration with Notion in the backend by @StanGirard in https://github.com/StanGirard/quivr/pull/2123 +- feat(integrations): integration with Notion in the backend by @StanGirard in https://github.com/StanGirard/quivr/pull/2123 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.194...v0.0.195 ## 0.0.194 (2024-02-05) ## What's Changed -* feat(frontend): add a chatbot for users by @Zewed in https://github.com/StanGirard/quivr/pull/2144 +- feat(frontend): add a chatbot for users by @Zewed in https://github.com/StanGirard/quivr/pull/2144 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.193...v0.0.194 ## 0.0.193 (2024-02-04) ## What's Changed -* feat(frontend): design changes on user profile by @Zewed in https://github.com/StanGirard/quivr/pull/2140 -* fix(frontend): rename upgrade to plus to upgrade by @Zewed in https://github.com/StanGirard/quivr/pull/2141 +- feat(frontend): design changes on user profile by @Zewed in https://github.com/StanGirard/quivr/pull/2140 +- fix(frontend): rename upgrade to plus to upgrade by @Zewed in https://github.com/StanGirard/quivr/pull/2141 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.192...v0.0.193 ## 0.0.192 (2024-02-02) ## What's Changed -* feat(frontend): display which brain you are talking to by @Zewed in https://github.com/StanGirard/quivr/pull/2137 +- feat(frontend): display which brain you are talking to by @Zewed in https://github.com/StanGirard/quivr/pull/2137 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.191...v0.0.192 ## 0.0.191 (2024-02-01) ## What's Changed -* fix(frontend): no sources repetition in data panel by @Zewed in https://github.com/StanGirard/quivr/pull/2132 -* fix(frontend): don't show copy icon when thinking by @Zewed in https://github.com/StanGirard/quivr/pull/2133 +- fix(frontend): no sources repetition in data panel by @Zewed in https://github.com/StanGirard/quivr/pull/2132 +- fix(frontend): don't show copy icon when thinking by @Zewed in https://github.com/StanGirard/quivr/pull/2133 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.190...v0.0.191 ## 0.0.190 (2024-01-31) ## What's Changed -* fix(frontend): Better contrast in Menu by @Zewed in https://github.com/StanGirard/quivr/pull/2119 -* fix(frontend): better chat color and copy icon position by @Zewed in https://github.com/StanGirard/quivr/pull/2121 -* fix(frontend): better visualisation of current path on menu by @Zewed in https://github.com/StanGirard/quivr/pull/2122 -* feat(frontend): uniformize behaviour for metadata panel by @Zewed in https://github.com/StanGirard/quivr/pull/2124 -* fix(frontend): fetch chat only if session exist by @Zewed in https://github.com/StanGirard/quivr/pull/2130 -* fix(frontend): prompt display by @Zewed in https://github.com/StanGirard/quivr/pull/2129 -* fix(frontend): upload knwoledge in brains manegement by @Zewed in https://github.com/StanGirard/quivr/pull/2131 +- fix(frontend): Better contrast in Menu by @Zewed in https://github.com/StanGirard/quivr/pull/2119 +- fix(frontend): better chat color and copy icon position by @Zewed in https://github.com/StanGirard/quivr/pull/2121 +- fix(frontend): better visualisation of current path on menu by @Zewed in https://github.com/StanGirard/quivr/pull/2122 +- feat(frontend): uniformize behaviour for metadata panel by @Zewed in https://github.com/StanGirard/quivr/pull/2124 +- fix(frontend): fetch chat only if session exist by @Zewed in https://github.com/StanGirard/quivr/pull/2130 +- fix(frontend): prompt display by @Zewed in https://github.com/StanGirard/quivr/pull/2129 +- fix(frontend): upload knwoledge in brains manegement by @Zewed in https://github.com/StanGirard/quivr/pull/2131 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.189...v0.0.190 ## 0.0.189 (2024-01-30) ## What's Changed -* feat(frontend): design menu by @Zewed in https://github.com/StanGirard/quivr/pull/2116 -* fix(frontend): fix z index popover on add knwoledge modal by @Zewed in https://github.com/StanGirard/quivr/pull/2118 +- feat(frontend): design menu by @Zewed in https://github.com/StanGirard/quivr/pull/2116 +- fix(frontend): fix z index popover on add knwoledge modal by @Zewed in https://github.com/StanGirard/quivr/pull/2118 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.188...v0.0.189 ## 0.0.188 (2024-01-29) ## What's Changed -* fix: 🐛 upload by @StanGirard in https://github.com/StanGirard/quivr/pull/2112 -* feat(frontend): add sources to metadata by @Zewed in https://github.com/StanGirard/quivr/pull/2113 +- fix: 🐛 upload by @StanGirard in https://github.com/StanGirard/quivr/pull/2112 +- feat(frontend): add sources to metadata by @Zewed in https://github.com/StanGirard/quivr/pull/2113 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.187...v0.0.188 ## 0.0.187 (2024-01-28) ## What's Changed -* feat: 🎸 user-limits by @StanGirard in https://github.com/StanGirard/quivr/pull/2104 -* fix: 🐛 brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2107 -* feat(frontend): chat page ui/ux design by @Zewed in https://github.com/StanGirard/quivr/pull/2106 -* Fix typo of UI: Ressources ==> Resources by @iharel in https://github.com/StanGirard/quivr/pull/2109 -* fix(frontend): fix li markdown on chat by @Zewed in https://github.com/StanGirard/quivr/pull/2110 + +- feat: 🎸 user-limits by @StanGirard in https://github.com/StanGirard/quivr/pull/2104 +- fix: 🐛 brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2107 +- feat(frontend): chat page ui/ux design by @Zewed in https://github.com/StanGirard/quivr/pull/2106 +- Fix typo of UI: Ressources ==> Resources by @iharel in https://github.com/StanGirard/quivr/pull/2109 +- fix(frontend): fix li markdown on chat by @Zewed in https://github.com/StanGirard/quivr/pull/2110 ## New Contributors -* @iharel made their first contribution in https://github.com/StanGirard/quivr/pull/2109 + +- @iharel made their first contribution in https://github.com/StanGirard/quivr/pull/2109 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.186...v0.0.187 ## 0.0.186 (2024-01-27) ## What's Changed -* fix(frontend): click on mention list on search bar in modal bug by @Zewed in https://github.com/StanGirard/quivr/pull/2098 -* fix(frontend): remove dark theme by @Zewed in https://github.com/StanGirard/quivr/pull/2100 -* fix(frontend): delete brain by @Zewed in https://github.com/StanGirard/quivr/pull/2101 -* feat(14k): done by @StanGirard in https://github.com/StanGirard/quivr/pull/2102 +- fix(frontend): click on mention list on search bar in modal bug by @Zewed in https://github.com/StanGirard/quivr/pull/2098 +- fix(frontend): remove dark theme by @Zewed in https://github.com/StanGirard/quivr/pull/2100 +- fix(frontend): delete brain by @Zewed in https://github.com/StanGirard/quivr/pull/2101 +- feat(14k): done by @StanGirard in https://github.com/StanGirard/quivr/pull/2102 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.185...v0.0.186 ## 0.0.185 (2024-01-27) ## What's Changed -* fix: 🐛 brain by @StanGirard in https://github.com/StanGirard/quivr/pull/2096 -* feat(frontend): search modal - remove parameters and explore buttons by @Zewed in https://github.com/StanGirard/quivr/pull/2094 -* fix: 🐛 tests by @StanGirard in https://github.com/StanGirard/quivr/pull/2095 +- fix: 🐛 brain by @StanGirard in https://github.com/StanGirard/quivr/pull/2096 +- feat(frontend): search modal - remove parameters and explore buttons by @Zewed in https://github.com/StanGirard/quivr/pull/2094 +- fix: 🐛 tests by @StanGirard in https://github.com/StanGirard/quivr/pull/2095 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.184...v0.0.185 ## 0.0.184 (2024-01-26) ## What's Changed -* feat(panel): added by @Zewed in https://github.com/StanGirard/quivr/pull/2088 -* feat: 🎸 api by @StanGirard in https://github.com/StanGirard/quivr/pull/2078 -* fix(frontend): clear message input on submit by @Zewed in https://github.com/StanGirard/quivr/pull/2087 -* fix: 🐛 related by @StanGirard in https://github.com/StanGirard/quivr/pull/2090 -* feat: Added translation status badge from inlang by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/2080 -* fix(streaming): Data Truncation Issue in useHandleStream Function by @openperf in https://github.com/StanGirard/quivr/pull/2079 -* feat: 🎸 sources by @StanGirard in https://github.com/StanGirard/quivr/pull/2092 -* fix(frontend): clean related Brains useEffect by @Zewed in https://github.com/StanGirard/quivr/pull/2091 + +- feat(panel): added by @Zewed in https://github.com/StanGirard/quivr/pull/2088 +- feat: 🎸 api by @StanGirard in https://github.com/StanGirard/quivr/pull/2078 +- fix(frontend): clear message input on submit by @Zewed in https://github.com/StanGirard/quivr/pull/2087 +- fix: 🐛 related by @StanGirard in https://github.com/StanGirard/quivr/pull/2090 +- feat: Added translation status badge from inlang by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/2080 +- fix(streaming): Data Truncation Issue in useHandleStream Function by @openperf in https://github.com/StanGirard/quivr/pull/2079 +- feat: 🎸 sources by @StanGirard in https://github.com/StanGirard/quivr/pull/2092 +- fix(frontend): clean related Brains useEffect by @Zewed in https://github.com/StanGirard/quivr/pull/2091 ## New Contributors -* @openperf made their first contribution in https://github.com/StanGirard/quivr/pull/2079 + +- @openperf made their first contribution in https://github.com/StanGirard/quivr/pull/2079 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.183...v0.0.184 ## 0.0.183 (2024-01-24) ## What's Changed -* fix: 🐛 subscription by @StanGirard in https://github.com/StanGirard/quivr/pull/2081 +- fix: 🐛 subscription by @StanGirard in https://github.com/StanGirard/quivr/pull/2081 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.182...v0.0.183 ## 0.0.182 (2024-01-24) ## What's Changed -* fix: 🐛 crawl by @StanGirard in https://github.com/StanGirard/quivr/pull/2076 +- fix: 🐛 crawl by @StanGirard in https://github.com/StanGirard/quivr/pull/2076 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.181...v0.0.182 ## 0.0.181 (2024-01-23) ## What's Changed -* fix(frontend): unable multiple enter on search page by @Zewed in https://github.com/StanGirard/quivr/pull/2074 -* fix(frontend): force brain on search was broken by @Zewed in https://github.com/StanGirard/quivr/pull/2075 +- fix(frontend): unable multiple enter on search page by @Zewed in https://github.com/StanGirard/quivr/pull/2074 +- fix(frontend): force brain on search was broken by @Zewed in https://github.com/StanGirard/quivr/pull/2075 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.180...v0.0.181 ## 0.0.180 (2024-01-23) ## What's Changed -* fix: 🐛 api by @StanGirard in https://github.com/StanGirard/quivr/pull/2068 -* feat(frontend): Add Brain On Search Page by @Zewed in https://github.com/StanGirard/quivr/pull/2067 -* fix(frontend): uniformize case for types by @Zewed in https://github.com/StanGirard/quivr/pull/2071 -* fix: 🐛 gitconfig by @StanGirard in https://github.com/StanGirard/quivr/pull/2072 +- fix: 🐛 api by @StanGirard in https://github.com/StanGirard/quivr/pull/2068 +- feat(frontend): Add Brain On Search Page by @Zewed in https://github.com/StanGirard/quivr/pull/2067 +- fix(frontend): uniformize case for types by @Zewed in https://github.com/StanGirard/quivr/pull/2071 +- fix: 🐛 gitconfig by @StanGirard in https://github.com/StanGirard/quivr/pull/2072 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.179...v0.0.180 @@ -1057,17 +1091,17 @@ ## 0.0.178 (2024-01-22) ## What's Changed -* fix(frontend): use mention brain on search bar by @Zewed in https://github.com/StanGirard/quivr/pull/2060 -* feat: 🎸 cpu by @StanGirard in https://github.com/StanGirard/quivr/pull/2065 +- fix(frontend): use mention brain on search bar by @Zewed in https://github.com/StanGirard/quivr/pull/2060 +- feat: 🎸 cpu by @StanGirard in https://github.com/StanGirard/quivr/pull/2065 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.177...v0.0.178 ## 0.0.177 (2024-01-22) ## What's Changed -* fix: 🐛 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/2062 +- fix: 🐛 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/2062 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.176...v0.0.177 @@ -1078,98 +1112,98 @@ ## 0.0.175 (2024-01-22) ## What's Changed -* fix: 🐛 limits by @StanGirard in https://github.com/StanGirard/quivr/pull/2058 +- fix: 🐛 limits by @StanGirard in https://github.com/StanGirard/quivr/pull/2058 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.174...v0.0.175 ## 0.0.174 (2024-01-22) ## What's Changed -* fix(frontend): remove actions modal by @Zewed in https://github.com/StanGirard/quivr/pull/2054 -* feat: 🎸 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/2057 +- fix(frontend): remove actions modal by @Zewed in https://github.com/StanGirard/quivr/pull/2054 +- feat: 🎸 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/2057 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.173...v0.0.174 ## 0.0.173 (2024-01-22) ## What's Changed -* fix(api-brains): fixed with new types of brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2052 -* fix(frontend): font size on chat feed by @Zewed in https://github.com/StanGirard/quivr/pull/2051 +- fix(api-brains): fixed with new types of brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2052 +- fix(frontend): font size on chat feed by @Zewed in https://github.com/StanGirard/quivr/pull/2051 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.172...v0.0.173 ## 0.0.172 (2024-01-22) ## What's Changed -* feat(frontend): handle mentions in search bar by @Zewed in https://github.com/StanGirard/quivr/pull/2049 +- feat(frontend): handle mentions in search bar by @Zewed in https://github.com/StanGirard/quivr/pull/2049 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.171...v0.0.172 ## 0.0.171 (2024-01-22) ## What's Changed -* fix(frontend): don't set default brain as current brain and remove change brain button by @Zewed in https://github.com/StanGirard/quivr/pull/2047 -* feat: 🎸 brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2048 +- fix(frontend): don't set default brain as current brain and remove change brain button by @Zewed in https://github.com/StanGirard/quivr/pull/2047 +- feat: 🎸 brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2048 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.170...v0.0.171 ## 0.0.170 (2024-01-21) ## What's Changed -* fix(frontend): translate configure for brains and successfully deleted for chat by @Zewed in https://github.com/StanGirard/quivr/pull/2042 -* fix(frontend): change search icon on menu by @Zewed in https://github.com/StanGirard/quivr/pull/2043 -* fix: 🐛 search by @StanGirard in https://github.com/StanGirard/quivr/pull/2045 -* fix(frontend): remove brain choice when search page displays by @Zewed in https://github.com/StanGirard/quivr/pull/2044 +- fix(frontend): translate configure for brains and successfully deleted for chat by @Zewed in https://github.com/StanGirard/quivr/pull/2042 +- fix(frontend): change search icon on menu by @Zewed in https://github.com/StanGirard/quivr/pull/2043 +- fix: 🐛 search by @StanGirard in https://github.com/StanGirard/quivr/pull/2045 +- fix(frontend): remove brain choice when search page displays by @Zewed in https://github.com/StanGirard/quivr/pull/2044 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.169...v0.0.170 ## 0.0.169 (2024-01-21) ## What's Changed -* feat(brains): added now multiple brains close by by @StanGirard in https://github.com/StanGirard/quivr/pull/2039 -* fix(frontend): set chat messages only if needed by @Zewed in https://github.com/StanGirard/quivr/pull/2040 +- feat(brains): added now multiple brains close by by @StanGirard in https://github.com/StanGirard/quivr/pull/2039 +- fix(frontend): set chat messages only if needed by @Zewed in https://github.com/StanGirard/quivr/pull/2040 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.168...v0.0.169 ## 0.0.168 (2024-01-20) ## What's Changed -* fix(frontend): don t load chat items on search by @Zewed in https://github.com/StanGirard/quivr/pull/2036 +- fix(frontend): don t load chat items on search by @Zewed in https://github.com/StanGirard/quivr/pull/2036 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.167...v0.0.168 ## 0.0.167 (2024-01-20) ## What's Changed -* fix(frontend): chat still refreshs on first request by @Zewed in https://github.com/StanGirard/quivr/pull/2034 +- fix(frontend): chat still refreshs on first request by @Zewed in https://github.com/StanGirard/quivr/pull/2034 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.166...v0.0.167 ## 0.0.166 (2024-01-20) ## What's Changed -* feat(search): new way to interact with Quivr by @StanGirard in https://github.com/StanGirard/quivr/pull/2026 -* feat: adding search by @StanGirard in https://github.com/StanGirard/quivr/pull/2031 -* fix(frontend): remove close menu icon on mobile by @Zewed in https://github.com/StanGirard/quivr/pull/2030 -* fix(frontend): chat refreshed on first search request by @Zewed in https://github.com/StanGirard/quivr/pull/2033 +- feat(search): new way to interact with Quivr by @StanGirard in https://github.com/StanGirard/quivr/pull/2026 +- feat: adding search by @StanGirard in https://github.com/StanGirard/quivr/pull/2031 +- fix(frontend): remove close menu icon on mobile by @Zewed in https://github.com/StanGirard/quivr/pull/2030 +- fix(frontend): chat refreshed on first search request by @Zewed in https://github.com/StanGirard/quivr/pull/2033 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.165...v0.0.166 ## 0.0.165 (2024-01-17) ## What's Changed -* fix(frontend): wrong placeholder message date by @Zewed in https://github.com/StanGirard/quivr/pull/2023 +- fix(frontend): wrong placeholder message date by @Zewed in https://github.com/StanGirard/quivr/pull/2023 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.164...v0.0.165 @@ -1180,27 +1214,29 @@ ## 0.0.163 (2024-01-14) ## What's Changed -* fix(frontend): left panel is not closing by @Zewed in https://github.com/StanGirard/quivr/pull/2014 -* fix: csp by @StanGirard in https://github.com/StanGirard/quivr/pull/2016 +- fix(frontend): left panel is not closing by @Zewed in https://github.com/StanGirard/quivr/pull/2014 +- fix: csp by @StanGirard in https://github.com/StanGirard/quivr/pull/2016 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.162...v0.0.163 ## 0.0.162 (2024-01-13) ## What's Changed -* fix(frontend): remove right panel and reduce chat section width by @Zewed in https://github.com/StanGirard/quivr/pull/2012 + +- fix(frontend): remove right panel and reduce chat section width by @Zewed in https://github.com/StanGirard/quivr/pull/2012 ## New Contributors -* @Zewed made their first contribution in https://github.com/StanGirard/quivr/pull/2012 + +- @Zewed made their first contribution in https://github.com/StanGirard/quivr/pull/2012 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.161...v0.0.162 ## 0.0.161 (2024-01-07) ## What's Changed -* feat: 🎸 policies by @StanGirard in https://github.com/StanGirard/quivr/pull/1997 +- feat: 🎸 policies by @StanGirard in https://github.com/StanGirard/quivr/pull/1997 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.160...v0.0.161 @@ -1215,24 +1251,24 @@ ## 0.0.158 (2024-01-04) ## What's Changed -* chore(deps): pin dependencies by @renovate in https://github.com/StanGirard/quivr/pull/1975 +- chore(deps): pin dependencies by @renovate in https://github.com/StanGirard/quivr/pull/1975 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.157...v0.0.158 ## 0.0.157 (2024-01-04) ## What's Changed -* feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1978 +- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1978 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.156...v0.0.157 ## 0.0.156 (2024-01-04) ## What's Changed -* fix: 🐛 models by @StanGirard in https://github.com/StanGirard/quivr/pull/1973 +- fix: 🐛 models by @StanGirard in https://github.com/StanGirard/quivr/pull/1973 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.155...v0.0.156 @@ -1243,52 +1279,52 @@ ## 0.0.154 (2024-01-04) ## What's Changed -* feat: 🎸 models by @StanGirard in https://github.com/StanGirard/quivr/pull/1967 +- feat: 🎸 models by @StanGirard in https://github.com/StanGirard/quivr/pull/1967 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.153...v0.0.154 ## 0.0.153 (2024-01-03) ## What's Changed -* chore(deps): Pin Node.js by @renovate in https://github.com/StanGirard/quivr/pull/1952 -* chore(deps): Pin dependencies by @renovate in https://github.com/StanGirard/quivr/pull/1953 -* chore(deps): Update actions/checkout action to v4 by @renovate in https://github.com/StanGirard/quivr/pull/1957 -* chore(deps): Update actions/setup-node action to v4 by @renovate in https://github.com/StanGirard/quivr/pull/1958 -* feat: 🎸 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/1966 +- chore(deps): Pin Node.js by @renovate in https://github.com/StanGirard/quivr/pull/1952 +- chore(deps): Pin dependencies by @renovate in https://github.com/StanGirard/quivr/pull/1953 +- chore(deps): Update actions/checkout action to v4 by @renovate in https://github.com/StanGirard/quivr/pull/1957 +- chore(deps): Update actions/setup-node action to v4 by @renovate in https://github.com/StanGirard/quivr/pull/1958 +- feat: 🎸 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/1966 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.152...v0.0.153 ## 0.0.152 (2024-01-02) ## What's Changed -* feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1945 +- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1945 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.151...v0.0.152 ## 0.0.151 (2023-12-29) ## What's Changed -* feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1938 +- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1938 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.150...v0.0.151 ## 0.0.150 (2023-12-29) ## What's Changed -* feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1936 +- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1936 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.149...v0.0.150 ## 0.0.149 (2023-12-29) ## What's Changed -* feat: 🎸 pricing by @StanGirard in https://github.com/StanGirard/quivr/pull/1935 +- feat: 🎸 pricing by @StanGirard in https://github.com/StanGirard/quivr/pull/1935 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.148...v0.0.149 @@ -1299,87 +1335,89 @@ ## 0.0.147 (2023-12-28) ## What's Changed -* feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1931 +- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1931 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.146...v0.0.147 ## 0.0.146 (2023-12-28) ## What's Changed -* feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1929 +- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1929 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.145...v0.0.146 ## 0.0.145 (2023-12-28) ## What's Changed -* feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1927 +- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1927 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.144...v0.0.145 ## 0.0.144 (2023-12-27) ## What's Changed -* feat: 🎸 pricing by @StanGirard in https://github.com/StanGirard/quivr/pull/1923 -* feat(pricing): added testimonials and else by @StanGirard in https://github.com/StanGirard/quivr/pull/1925 +- feat: 🎸 pricing by @StanGirard in https://github.com/StanGirard/quivr/pull/1923 +- feat(pricing): added testimonials and else by @StanGirard in https://github.com/StanGirard/quivr/pull/1925 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.143...v0.0.144 ## 0.0.143 (2023-12-27) ## What's Changed -* docs: ✏️ mintlify by @StanGirard in https://github.com/StanGirard/quivr/pull/1917 -* feat(docs): added homepage by @StanGirard in https://github.com/StanGirard/quivr/pull/1919 -* docs: ✏️ homepage by @StanGirard in https://github.com/StanGirard/quivr/pull/1922 +- docs: ✏️ mintlify by @StanGirard in https://github.com/StanGirard/quivr/pull/1917 +- feat(docs): added homepage by @StanGirard in https://github.com/StanGirard/quivr/pull/1919 +- docs: ✏️ homepage by @StanGirard in https://github.com/StanGirard/quivr/pull/1922 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.142...v0.0.143 ## 0.0.142 (2023-12-18) ## What's Changed -* feat: add new brain management page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1906 -* feat: update brain details page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1910 +- feat: add new brain management page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1906 +- feat: update brain details page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1910 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.141...v0.0.142 ## 0.0.141 (2023-12-15) ## What's Changed -* feat[i18n]: Added i18n documenation to the contribution guidelines by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/1899 -* feat: Update Explore button label by @StanGirard in https://github.com/StanGirard/quivr/pull/1901 -* feat: chat with compositeBrain ( with/out streaming) by @gozineb in https://github.com/StanGirard/quivr/pull/1883 -* feat: update brains library by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1903 +- feat[i18n]: Added i18n documenation to the contribution guidelines by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/1899 +- feat: Update Explore button label by @StanGirard in https://github.com/StanGirard/quivr/pull/1901 +- feat: chat with compositeBrain ( with/out streaming) by @gozineb in https://github.com/StanGirard/quivr/pull/1883 +- feat: update brains library by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1903 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.140...v0.0.141 ## 0.0.140 (2023-12-14) ## What's Changed -* feat: Update pytest command in Makefile and add new test by @StanGirard in https://github.com/StanGirard/quivr/pull/1893 -* chore: add IDE extension for i18n handling by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/1896 -* feat: add chat view new design by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1897 + +- feat: Update pytest command in Makefile and add new test by @StanGirard in https://github.com/StanGirard/quivr/pull/1893 +- chore: add IDE extension for i18n handling by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/1896 +- feat: add chat view new design by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1897 ## New Contributors -* @NilsJacobsen made their first contribution in https://github.com/StanGirard/quivr/pull/1896 + +- @NilsJacobsen made their first contribution in https://github.com/StanGirard/quivr/pull/1896 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.139...v0.0.140 ## 0.0.139 (2023-12-14) ## What's Changed -* feat: allow user to feed brain from Actions bar by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1882 -* feat: add Menu bar by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1885 -* feat: Remove unused method and update file processing by @StanGirard in https://github.com/StanGirard/quivr/pull/1890 -* fix: update chat history fetching logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1891 -* feat: add default feed button label by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1892 +- feat: allow user to feed brain from Actions bar by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1882 +- feat: add Menu bar by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1885 +- feat: Remove unused method and update file processing by @StanGirard in https://github.com/StanGirard/quivr/pull/1890 +- fix: update chat history fetching logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1891 +- feat: add default feed button label by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1892 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.138...v0.0.139 @@ -1390,23 +1428,23 @@ ## 0.0.137 (2023-12-13) ## What's Changed -* feat: add chat history to Actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1877 -* feat: allow user to control left panel from Chat input by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1880 +- feat: add chat history to Actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1877 +- feat: allow user to control left panel from Chat input by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1880 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.136...v0.0.137 ## 0.0.136 (2023-12-13) ## What's Changed -* feat: Add @tailwindcss/forms plugin and update by @StanGirard in https://github.com/StanGirard/quivr/pull/1869 -* feat: Refactor get_question_context_for_brain endpoint by @StanGirard in https://github.com/StanGirard/quivr/pull/1872 -* feat: Add file URL to DocumentAnswer objects by @StanGirard in https://github.com/StanGirard/quivr/pull/1874 -* Update .gitignore and add .gitmodules by @StanGirard in https://github.com/StanGirard/quivr/pull/1875 -* feat: add new actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1870 -* feat: add selected brain tag and new discussion button to actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1873 -* feat: add action modal change brain button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1876 +- feat: Add @tailwindcss/forms plugin and update by @StanGirard in https://github.com/StanGirard/quivr/pull/1869 +- feat: Refactor get_question_context_for_brain endpoint by @StanGirard in https://github.com/StanGirard/quivr/pull/1872 +- feat: Add file URL to DocumentAnswer objects by @StanGirard in https://github.com/StanGirard/quivr/pull/1874 +- Update .gitignore and add .gitmodules by @StanGirard in https://github.com/StanGirard/quivr/pull/1875 +- feat: add new actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1870 +- feat: add selected brain tag and new discussion button to actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1873 +- feat: add action modal change brain button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1876 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.135...v0.0.136 @@ -1417,9 +1455,9 @@ ## 0.0.134 (2023-12-11) ## What's Changed -* feat: add custom rag first abstraction layer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1858 -* feat(payment): added modal of right size by @StanGirard in https://github.com/StanGirard/quivr/pull/1860 +- feat: add custom rag first abstraction layer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1858 +- feat(payment): added modal of right size by @StanGirard in https://github.com/StanGirard/quivr/pull/1860 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.133...v0.0.134 @@ -1430,23 +1468,25 @@ ## 0.0.132 (2023-12-10) ## What's Changed -* feat: add generate_answer function to support non streamed response for api brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1847 -* fix(ollama): - update supabase-db postgres docker image version by @KonstantinosAng in https://github.com/StanGirard/quivr/pull/1853 + +- feat: add generate_answer function to support non streamed response for api brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1847 +- fix(ollama): - update supabase-db postgres docker image version by @KonstantinosAng in https://github.com/StanGirard/quivr/pull/1853 ## New Contributors -* @KonstantinosAng made their first contribution in https://github.com/StanGirard/quivr/pull/1853 + +- @KonstantinosAng made their first contribution in https://github.com/StanGirard/quivr/pull/1853 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.131...v0.0.132 ## 0.0.131 (2023-12-06) ## What's Changed -* feat: update onboarding questions answer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1834 -* feat: composite brains get by @gozineb in https://github.com/StanGirard/quivr/pull/1837 -* feat: add Agent creation frontend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1836 -* feat: keep sidebar opened on non mobile devices by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1840 -* feat: add brains list overflow indicator by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1842 +- feat: update onboarding questions answer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1834 +- feat: composite brains get by @gozineb in https://github.com/StanGirard/quivr/pull/1837 +- feat: add Agent creation frontend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1836 +- feat: keep sidebar opened on non mobile devices by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1840 +- feat: add brains list overflow indicator by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1842 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.130...v0.0.131 @@ -1457,197 +1497,201 @@ ## 0.0.129 (2023-12-06) ## What's Changed -* feat(requirements): update aws version by @StanGirard in https://github.com/StanGirard/quivr/pull/1819 -* feat: add brain creation step 2 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1823 -* feat: composite brains db by @gozineb in https://github.com/StanGirard/quivr/pull/1826 -* feat: finalise steps based brain creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1825 +- feat(requirements): update aws version by @StanGirard in https://github.com/StanGirard/quivr/pull/1819 +- feat: add brain creation step 2 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1823 +- feat: composite brains db by @gozineb in https://github.com/StanGirard/quivr/pull/1826 +- feat: finalise steps based brain creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1825 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.128...v0.0.129 ## 0.0.128 (2023-12-05) ## What's Changed -* feat: track response source usage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1810 -* doc: add VirtioFS instruction for MacOS users by @tarek-ayed in https://github.com/StanGirard/quivr/pull/1813 -* refactor: chat for multibrains by @gozineb in https://github.com/StanGirard/quivr/pull/1812 -* feat(prebuilt): prebuild backend image for faster compilation by @StanGirard in https://github.com/StanGirard/quivr/pull/1815 -* fix: text not clear in dark mode by @Jezla in https://github.com/StanGirard/quivr/pull/1804 -* fix: celery config typo by @yonmey in https://github.com/StanGirard/quivr/pull/1776 -* feat: add brain creation steps system by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1814 + +- feat: track response source usage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1810 +- doc: add VirtioFS instruction for MacOS users by @tarek-ayed in https://github.com/StanGirard/quivr/pull/1813 +- refactor: chat for multibrains by @gozineb in https://github.com/StanGirard/quivr/pull/1812 +- feat(prebuilt): prebuild backend image for faster compilation by @StanGirard in https://github.com/StanGirard/quivr/pull/1815 +- fix: text not clear in dark mode by @Jezla in https://github.com/StanGirard/quivr/pull/1804 +- fix: celery config typo by @yonmey in https://github.com/StanGirard/quivr/pull/1776 +- feat: add brain creation steps system by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1814 ## New Contributors -* @tarek-ayed made their first contribution in https://github.com/StanGirard/quivr/pull/1813 -* @Jezla made their first contribution in https://github.com/StanGirard/quivr/pull/1804 -* @yonmey made their first contribution in https://github.com/StanGirard/quivr/pull/1776 + +- @tarek-ayed made their first contribution in https://github.com/StanGirard/quivr/pull/1813 +- @Jezla made their first contribution in https://github.com/StanGirard/quivr/pull/1804 +- @yonmey made their first contribution in https://github.com/StanGirard/quivr/pull/1776 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.127...v0.0.128 ## 0.0.127 (2023-12-04) ## What's Changed -* feat(api-keys): added customization by @StanGirard in https://github.com/StanGirard/quivr/pull/1802 -* feat(embedding): now 100 times faster ⚡️🔥 by @StanGirard in https://github.com/StanGirard/quivr/pull/1807 -* fix: update editor state update logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1809 +- feat(api-keys): added customization by @StanGirard in https://github.com/StanGirard/quivr/pull/1802 +- feat(embedding): now 100 times faster ⚡️🔥 by @StanGirard in https://github.com/StanGirard/quivr/pull/1807 +- fix: update editor state update logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1809 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.126...v0.0.127 ## 0.0.126 (2023-12-03) ## What's Changed -* feat: add optimistic update on new message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1764 -* feat: update models logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1767 -* refactor: to modules by @gozineb in https://github.com/StanGirard/quivr/pull/1754 -* feat(supabase): local installation made easy by @StanGirard in https://github.com/StanGirard/quivr/pull/1777 -* feat(install): it now takes 30 seconds to install Quivr by @StanGirard in https://github.com/StanGirard/quivr/pull/1780 -* feat: 🎸 install by @StanGirard in https://github.com/StanGirard/quivr/pull/1784 -* fix(url): crawling fixed by @StanGirard in https://github.com/StanGirard/quivr/pull/1785 -* docs: fix typo in name of docker compose dev file by @iMADi-ARCH in https://github.com/StanGirard/quivr/pull/1800 +- feat: add optimistic update on new message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1764 +- feat: update models logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1767 +- refactor: to modules by @gozineb in https://github.com/StanGirard/quivr/pull/1754 +- feat(supabase): local installation made easy by @StanGirard in https://github.com/StanGirard/quivr/pull/1777 +- feat(install): it now takes 30 seconds to install Quivr by @StanGirard in https://github.com/StanGirard/quivr/pull/1780 +- feat: 🎸 install by @StanGirard in https://github.com/StanGirard/quivr/pull/1784 +- fix(url): crawling fixed by @StanGirard in https://github.com/StanGirard/quivr/pull/1785 +- docs: fix typo in name of docker compose dev file by @iMADi-ARCH in https://github.com/StanGirard/quivr/pull/1800 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.125...v0.0.126 ## 0.0.125 (2023-11-30) ## What's Changed -* fix(api): fixed issue with name function and ilmproved promtp by @StanGirard in https://github.com/StanGirard/quivr/pull/1759 -* fix: update mention suggestion filtering logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1763 +- fix(api): fixed issue with name function and ilmproved promtp by @StanGirard in https://github.com/StanGirard/quivr/pull/1759 +- fix: update mention suggestion filtering logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1763 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.124...v0.0.125 ## 0.0.124 (2023-11-29) ## What's Changed -* feat(chatInput): use tiptap editor by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1752 -* docs: update guidelines.md by @eltociear in https://github.com/StanGirard/quivr/pull/1755 -* Feat/local llm bug fix by @StanGirard in https://github.com/StanGirard/quivr/pull/1758 +- feat(chatInput): use tiptap editor by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1752 +- docs: update guidelines.md by @eltociear in https://github.com/StanGirard/quivr/pull/1755 +- Feat/local llm bug fix by @StanGirard in https://github.com/StanGirard/quivr/pull/1758 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.123...v0.0.124 ## 0.0.123 (2023-11-29) ## What's Changed -* chore: downgrade versions by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1748 -* fix: revert implement local llms by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1749 +- chore: downgrade versions by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1748 +- fix: revert implement local llms by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1749 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.122...v0.0.123 ## 0.0.122 (2023-11-29) ## What's Changed -* refactor: Notification module by @gozineb in https://github.com/StanGirard/quivr/pull/1740 -* refactor: remove explore route from back & front by @gozineb in https://github.com/StanGirard/quivr/pull/1741 -* feat: implement local llms by @StanGirard in https://github.com/StanGirard/quivr/pull/1745 -* refactor: knowledge module by @gozineb in https://github.com/StanGirard/quivr/pull/1743 +- refactor: Notification module by @gozineb in https://github.com/StanGirard/quivr/pull/1740 +- refactor: remove explore route from back & front by @gozineb in https://github.com/StanGirard/quivr/pull/1741 +- feat: implement local llms by @StanGirard in https://github.com/StanGirard/quivr/pull/1745 +- refactor: knowledge module by @gozineb in https://github.com/StanGirard/quivr/pull/1743 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.121...v0.0.122 ## 0.0.121 (2023-11-28) ## What's Changed -* fix: update max token logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1725 -* fix: update public brain subscription logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1727 -* fix: sanitize file name by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1728 -* feat(publicBrains): use join queries for better performance by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1730 -* feat: improve delete knowledge performance by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1733 -* fix: 🐛 crawler by @StanGirard in https://github.com/StanGirard/quivr/pull/1735 -* feat: 🎸 local user by @StanGirard in https://github.com/StanGirard/quivr/pull/1736 +- fix: update max token logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1725 +- fix: update public brain subscription logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1727 +- fix: sanitize file name by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1728 +- feat(publicBrains): use join queries for better performance by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1730 +- feat: improve delete knowledge performance by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1733 +- fix: 🐛 crawler by @StanGirard in https://github.com/StanGirard/quivr/pull/1735 +- feat: 🎸 local user by @StanGirard in https://github.com/StanGirard/quivr/pull/1736 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.120...v0.0.121 ## 0.0.120 (2023-11-27) ## What's Changed -* fix: 🐛 sentry by @StanGirard in https://github.com/StanGirard/quivr/pull/1716 +- fix: 🐛 sentry by @StanGirard in https://github.com/StanGirard/quivr/pull/1716 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.119...v0.0.120 ## 0.0.119 (2023-11-24) ## What's Changed -* refactor: Prompt module by @gozineb in https://github.com/StanGirard/quivr/pull/1688 -* Fixes string formatting when logging knowledge table by @MeTaNoV in https://github.com/StanGirard/quivr/pull/1691 -* fix: update max token overwrite logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1694 -* fix: remove diacritics from filenames by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1695 -* refactor: onboarding module by @gozineb in https://github.com/StanGirard/quivr/pull/1702 -* feat: display notification when file size is too big by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1704 -* feat: add api brain steps log (backend) by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1705 +- refactor: Prompt module by @gozineb in https://github.com/StanGirard/quivr/pull/1688 +- Fixes string formatting when logging knowledge table by @MeTaNoV in https://github.com/StanGirard/quivr/pull/1691 +- fix: update max token overwrite logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1694 +- fix: remove diacritics from filenames by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1695 +- refactor: onboarding module by @gozineb in https://github.com/StanGirard/quivr/pull/1702 +- feat: display notification when file size is too big by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1704 +- feat: add api brain steps log (backend) by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1705 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.118...v0.0.119 ## 0.0.118 (2023-11-22) ## What's Changed -* docs: add api based brains by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1685 -* Adds pytesseract, tesseract and poopler-utils by @MeTaNoV in https://github.com/StanGirard/quivr/pull/1648 + +- docs: add api based brains by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1685 +- Adds pytesseract, tesseract and poopler-utils by @MeTaNoV in https://github.com/StanGirard/quivr/pull/1648 ## New Contributors -* @MeTaNoV made their first contribution in https://github.com/StanGirard/quivr/pull/1648 + +- @MeTaNoV made their first contribution in https://github.com/StanGirard/quivr/pull/1648 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.117...v0.0.118 ## 0.0.117 (2023-11-22) ## What's Changed -* fix: 🐛 api by @StanGirard in https://github.com/StanGirard/quivr/pull/1676 -* fix: persist api brain creation data on tab change by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1680 -* feat: 🎸 tokens by @StanGirard in https://github.com/StanGirard/quivr/pull/1678 -* feat: allow updating api brain definition by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1682 -* feat: make brain description required by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1684 +- fix: 🐛 api by @StanGirard in https://github.com/StanGirard/quivr/pull/1676 +- fix: persist api brain creation data on tab change by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1680 +- feat: 🎸 tokens by @StanGirard in https://github.com/StanGirard/quivr/pull/1678 +- feat: allow updating api brain definition by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1682 +- feat: make brain description required by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1684 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.116...v0.0.117 ## 0.0.116 (2023-11-21) ## What's Changed -* feat: update brain modal in chat input by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1668 -* feat(apiBrain): add api brain secrets field in knowledge tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1669 -* feat(apiBrain): improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1672 -* feat(feedBrain): add manage button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1674 +- feat: update brain modal in chat input by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1668 +- feat(apiBrain): add api brain secrets field in knowledge tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1669 +- feat(apiBrain): improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1672 +- feat(feedBrain): add manage button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1674 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.115...v0.0.116 ## 0.0.115 (2023-11-20) ## What's Changed -* fix(apiBrain): fix default type selection by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1642 -* fix: allow user to set a brain as public after creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1646 -* fix(brainManagement): fix shared brain access issue by @gozineb in https://github.com/StanGirard/quivr/pull/1641 -* feat: 🎸 docker reduced size by 2 by @StanGirard in https://github.com/StanGirard/quivr/pull/1653 -* feat: 🎸 docker by @StanGirard in https://github.com/StanGirard/quivr/pull/1656 -* feat: 🎸 marketplace by @StanGirard in https://github.com/StanGirard/quivr/pull/1657 -* feat: 🎸 openai by @StanGirard in https://github.com/StanGirard/quivr/pull/1658 +- fix(apiBrain): fix default type selection by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1642 +- fix: allow user to set a brain as public after creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1646 +- fix(brainManagement): fix shared brain access issue by @gozineb in https://github.com/StanGirard/quivr/pull/1641 +- feat: 🎸 docker reduced size by 2 by @StanGirard in https://github.com/StanGirard/quivr/pull/1653 +- feat: 🎸 docker by @StanGirard in https://github.com/StanGirard/quivr/pull/1656 +- feat: 🎸 marketplace by @StanGirard in https://github.com/StanGirard/quivr/pull/1657 +- feat: 🎸 openai by @StanGirard in https://github.com/StanGirard/quivr/pull/1658 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.114...v0.0.115 ## 0.0.114 (2023-11-16) ## What's Changed -* feat: add api brain creation frontend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1631 -* refactor: add modules folder by @gozineb in https://github.com/StanGirard/quivr/pull/1633 -* feat: update settings tab add api brain definition by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1635 -* feat: add public api brain subscription by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1636 -* fix: delete brain on users click in brains management by @gozineb in https://github.com/StanGirard/quivr/pull/1638 +- feat: add api brain creation frontend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1631 +- refactor: add modules folder by @gozineb in https://github.com/StanGirard/quivr/pull/1633 +- feat: update settings tab add api brain definition by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1635 +- feat: add public api brain subscription by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1636 +- fix: delete brain on users click in brains management by @gozineb in https://github.com/StanGirard/quivr/pull/1638 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.113...v0.0.114 ## 0.0.113 (2023-11-14) ## What's Changed -* refactor: packages folder be 2 by @gozineb in https://github.com/StanGirard/quivr/pull/1628 +- refactor: packages folder be 2 by @gozineb in https://github.com/StanGirard/quivr/pull/1628 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.112...v0.0.113 @@ -1658,397 +1702,421 @@ ## 0.0.111 (2023-11-14) ## What's Changed -* ci: 🎡 tests by @StanGirard in https://github.com/StanGirard/quivr/pull/1615 -* fix: update delete brain logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1619 -* test(added): misc prompt onboarding by @StanGirard in https://github.com/StanGirard/quivr/pull/1622 -* feat: remove api brain secrets and schemas on delete by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1621 -* test(all): added by @StanGirard in https://github.com/StanGirard/quivr/pull/1624 -* refactor: create "files" package by @gozineb in https://github.com/StanGirard/quivr/pull/1626 -* feat: api definition in brain creation modal by @gozineb in https://github.com/StanGirard/quivr/pull/1613 +- ci: 🎡 tests by @StanGirard in https://github.com/StanGirard/quivr/pull/1615 +- fix: update delete brain logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1619 +- test(added): misc prompt onboarding by @StanGirard in https://github.com/StanGirard/quivr/pull/1622 +- feat: remove api brain secrets and schemas on delete by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1621 +- test(all): added by @StanGirard in https://github.com/StanGirard/quivr/pull/1624 +- refactor: create "files" package by @gozineb in https://github.com/StanGirard/quivr/pull/1626 +- feat: api definition in brain creation modal by @gozineb in https://github.com/StanGirard/quivr/pull/1613 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.110...v0.0.111 ## 0.0.110 (2023-11-13) ## What's Changed -* fix: add user id while creating default brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1616 +- fix: add user id while creating default brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1616 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.109...v0.0.110 ## 0.0.109 (2023-11-13) ## What's Changed -* feat: add APIBrainQA by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1606 -* feat: allow users to chat with apis by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1612 -* feat(docker): use multi-stage Docker builds for smaller images by @shidenkai0 in https://github.com/StanGirard/quivr/pull/1614 + +- feat: add APIBrainQA by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1606 +- feat: allow users to chat with apis by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1612 +- feat(docker): use multi-stage Docker builds for smaller images by @shidenkai0 in https://github.com/StanGirard/quivr/pull/1614 ## New Contributors -* @shidenkai0 made their first contribution in https://github.com/StanGirard/quivr/pull/1614 + +- @shidenkai0 made their first contribution in https://github.com/StanGirard/quivr/pull/1614 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.108...v0.0.109 ## 0.0.108 (2023-11-07) ## What's Changed -* feat: add api_brain_definition table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1601 -* feat: add brain_type column to brain table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1603 -* feat: supabase vault by @gozineb in https://github.com/StanGirard/quivr/pull/1605 +- feat: add api_brain_definition table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1601 +- feat: add brain_type column to brain table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1603 +- feat: supabase vault by @gozineb in https://github.com/StanGirard/quivr/pull/1605 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.107...v0.0.108 ## 0.0.107 (2023-11-06) ## What's Changed -* fix: allow to change model bro brain settings tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1590 -* fix: fix notification banner display when too much items in chat list by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1593 -* docs: add auth modes config by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1595 -* fix: allow users to delete brains by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1596 -* feat: 🎸 source documents by @StanGirard in https://github.com/StanGirard/quivr/pull/1598 +- fix: allow to change model bro brain settings tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1590 +- fix: fix notification banner display when too much items in chat list by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1593 +- docs: add auth modes config by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1595 +- fix: allow users to delete brains by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1596 +- feat: 🎸 source documents by @StanGirard in https://github.com/StanGirard/quivr/pull/1598 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.106...v0.0.107 ## 0.0.106 (2023-11-06) ## What's Changed -* feat: 🎸 sources by @StanGirard in https://github.com/StanGirard/quivr/pull/1591 +- feat: 🎸 sources by @StanGirard in https://github.com/StanGirard/quivr/pull/1591 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.105...v0.0.106 ## 0.0.105 (2023-11-06) ## What's Changed -* feat: make auth mode configurable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1579 -* Fix #1290 issue running migrations by @charlesbrandt in https://github.com/StanGirard/quivr/pull/1585 -* Use 'unless-stopped' instead of 'always' for development by @charlesbrandt in https://github.com/StanGirard/quivr/pull/1586 -* feat: 🎸 vps by @StanGirard in https://github.com/StanGirard/quivr/pull/1587 -* Update vps_install.md for subdomain by @jbeltran73-2 in https://github.com/StanGirard/quivr/pull/1589 + +- feat: make auth mode configurable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1579 +- Fix #1290 issue running migrations by @charlesbrandt in https://github.com/StanGirard/quivr/pull/1585 +- Use 'unless-stopped' instead of 'always' for development by @charlesbrandt in https://github.com/StanGirard/quivr/pull/1586 +- feat: 🎸 vps by @StanGirard in https://github.com/StanGirard/quivr/pull/1587 +- Update vps_install.md for subdomain by @jbeltran73-2 in https://github.com/StanGirard/quivr/pull/1589 ## New Contributors -* @charlesbrandt made their first contribution in https://github.com/StanGirard/quivr/pull/1585 -* @jbeltran73-2 made their first contribution in https://github.com/StanGirard/quivr/pull/1589 + +- @charlesbrandt made their first contribution in https://github.com/StanGirard/quivr/pull/1585 +- @jbeltran73-2 made their first contribution in https://github.com/StanGirard/quivr/pull/1589 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.104...v0.0.105 ## 0.0.104 (2023-11-03) ## What's Changed -* feat: 🎸 docs by @StanGirard in https://github.com/StanGirard/quivr/pull/1561 -* style(prompts): update public prompts dropdown styling by @St-Bloom in https://github.com/StanGirard/quivr/pull/1563 -* feat: add remote notification config by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1547 -* fix: fix button bad children error by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1564 -* style: fix hidden contents by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1577 + +- feat: 🎸 docs by @StanGirard in https://github.com/StanGirard/quivr/pull/1561 +- style(prompts): update public prompts dropdown styling by @St-Bloom in https://github.com/StanGirard/quivr/pull/1563 +- feat: add remote notification config by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1547 +- fix: fix button bad children error by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1564 +- style: fix hidden contents by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1577 ## New Contributors -* @St-Bloom made their first contribution in https://github.com/StanGirard/quivr/pull/1563 + +- @St-Bloom made their first contribution in https://github.com/StanGirard/quivr/pull/1563 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.103...v0.0.104 ## 0.0.103 (2023-11-02) ## What's Changed -* feat: allow to share a public brain link by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1541 -* fix: prompt update in brains management settings tab by @gozineb in https://github.com/StanGirard/quivr/pull/1543 -* refactor: extract prompt from settings by @gozineb in https://github.com/StanGirard/quivr/pull/1546 -* feat: 🎸 telegram by @StanGirard in https://github.com/StanGirard/quivr/pull/1555 -* feat: 🎸 telegram by @StanGirard in https://github.com/StanGirard/quivr/pull/1559 -* docs: update run_fully_local.md by @eltociear in https://github.com/StanGirard/quivr/pull/1556 -* docs: grammatical errors in README.md by @HimanshuMahto in https://github.com/StanGirard/quivr/pull/1536 -* fix: missing or inaccurate zh-cn translations by @jerryshang in https://github.com/StanGirard/quivr/pull/1558 + +- feat: allow to share a public brain link by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1541 +- fix: prompt update in brains management settings tab by @gozineb in https://github.com/StanGirard/quivr/pull/1543 +- refactor: extract prompt from settings by @gozineb in https://github.com/StanGirard/quivr/pull/1546 +- feat: 🎸 telegram by @StanGirard in https://github.com/StanGirard/quivr/pull/1555 +- feat: 🎸 telegram by @StanGirard in https://github.com/StanGirard/quivr/pull/1559 +- docs: update run_fully_local.md by @eltociear in https://github.com/StanGirard/quivr/pull/1556 +- docs: grammatical errors in README.md by @HimanshuMahto in https://github.com/StanGirard/quivr/pull/1536 +- fix: missing or inaccurate zh-cn translations by @jerryshang in https://github.com/StanGirard/quivr/pull/1558 ## New Contributors -* @HimanshuMahto made their first contribution in https://github.com/StanGirard/quivr/pull/1536 -* @jerryshang made their first contribution in https://github.com/StanGirard/quivr/pull/1558 + +- @HimanshuMahto made their first contribution in https://github.com/StanGirard/quivr/pull/1536 +- @jerryshang made their first contribution in https://github.com/StanGirard/quivr/pull/1558 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.102...v0.0.103 ## 0.0.102 (2023-11-01) ## What's Changed -* docs: update Quivr doc by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1531 -* docs: ✏️ search by @StanGirard in https://github.com/StanGirard/quivr/pull/1535 -* feat(brainSettings): rework knowledge tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1534 -* docs: ✏️ schema by @StanGirard in https://github.com/StanGirard/quivr/pull/1537 -* feat: 🎸 max-token by @StanGirard in https://github.com/StanGirard/quivr/pull/1538 +- docs: update Quivr doc by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1531 +- docs: ✏️ search by @StanGirard in https://github.com/StanGirard/quivr/pull/1535 +- feat(brainSettings): rework knowledge tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1534 +- docs: ✏️ schema by @StanGirard in https://github.com/StanGirard/quivr/pull/1537 +- feat: 🎸 max-token by @StanGirard in https://github.com/StanGirard/quivr/pull/1538 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.101...v0.0.102 ## 0.0.101 (2023-10-31) ## What's Changed -* chore: update tanstack query dep by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1528 -* fix: update mutation pending flag by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1530 +- chore: update tanstack query dep by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1528 +- fix: update mutation pending flag by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1530 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.100...v0.0.101 ## 0.0.100 (2023-10-30) ## What's Changed -* refactor: fix bad smells by @gozineb in https://github.com/StanGirard/quivr/pull/1399 -* refactor: chat_routes by @gozineb in https://github.com/StanGirard/quivr/pull/1512 -* feat: improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1522 -* feat(docs): reworked the website by @StanGirard in https://github.com/StanGirard/quivr/pull/1523 -* Feat/docs rework by @StanGirard in https://github.com/StanGirard/quivr/pull/1525 +- refactor: fix bad smells by @gozineb in https://github.com/StanGirard/quivr/pull/1399 +- refactor: chat_routes by @gozineb in https://github.com/StanGirard/quivr/pull/1512 +- feat: improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1522 +- feat(docs): reworked the website by @StanGirard in https://github.com/StanGirard/quivr/pull/1523 +- Feat/docs rework by @StanGirard in https://github.com/StanGirard/quivr/pull/1525 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.99...v0.0.100 ## 0.0.99 (2023-10-27) ## What's Changed -* fix: minor fixes by @gozineb in https://github.com/StanGirard/quivr/pull/1499 -* feat: remove onboarding's feature flag by @matthieujacq in https://github.com/StanGirard/quivr/pull/1501 -* feat: update form content on magic link auth request by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1502 -* feat: remove legacy header and footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1509 -* fix: black horizontal line sometimes appearing below section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1510 -* Improve readme.md by @ankur0904 in https://github.com/StanGirard/quivr/pull/1511 -* refactor(settings tab): extract components by @gozineb in https://github.com/StanGirard/quivr/pull/1335 -* fix: hidden video playing automatically on iphone by @matthieujacq in https://github.com/StanGirard/quivr/pull/1514 + +- fix: minor fixes by @gozineb in https://github.com/StanGirard/quivr/pull/1499 +- feat: remove onboarding's feature flag by @matthieujacq in https://github.com/StanGirard/quivr/pull/1501 +- feat: update form content on magic link auth request by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1502 +- feat: remove legacy header and footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1509 +- fix: black horizontal line sometimes appearing below section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1510 +- Improve readme.md by @ankur0904 in https://github.com/StanGirard/quivr/pull/1511 +- refactor(settings tab): extract components by @gozineb in https://github.com/StanGirard/quivr/pull/1335 +- fix: hidden video playing automatically on iphone by @matthieujacq in https://github.com/StanGirard/quivr/pull/1514 ## New Contributors -* @ankur0904 made their first contribution in https://github.com/StanGirard/quivr/pull/1511 + +- @ankur0904 made their first contribution in https://github.com/StanGirard/quivr/pull/1511 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.98...v0.0.99 ## 0.0.98 (2023-10-26) ## What's Changed -* feat: upgrade button in user settings by @matthieujacq in https://github.com/StanGirard/quivr/pull/1484 -* fix: failing build (removed avatar alt prop) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1487 -* Fixed license link in intro.md by @Eric013 in https://github.com/StanGirard/quivr/pull/1486 -* feat: manage plan by @matthieujacq in https://github.com/StanGirard/quivr/pull/1488 -* feat: remove feature flags for homepage by @matthieujacq in https://github.com/StanGirard/quivr/pull/1493 -* feat: add new signin/login page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1492 + +- feat: upgrade button in user settings by @matthieujacq in https://github.com/StanGirard/quivr/pull/1484 +- fix: failing build (removed avatar alt prop) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1487 +- Fixed license link in intro.md by @Eric013 in https://github.com/StanGirard/quivr/pull/1486 +- feat: manage plan by @matthieujacq in https://github.com/StanGirard/quivr/pull/1488 +- feat: remove feature flags for homepage by @matthieujacq in https://github.com/StanGirard/quivr/pull/1493 +- feat: add new signin/login page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1492 ## New Contributors -* @Eric013 made their first contribution in https://github.com/StanGirard/quivr/pull/1486 + +- @Eric013 made their first contribution in https://github.com/StanGirard/quivr/pull/1486 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.97...v0.0.98 ## 0.0.97 (2023-10-24) ## What's Changed -* feat(cms): update content type by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1477 -* feat: upgrade to plus button by @matthieujacq in https://github.com/StanGirard/quivr/pull/1482 -* feat: 🎸 sitemap by @StanGirard in https://github.com/StanGirard/quivr/pull/1483 +- feat(cms): update content type by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1477 +- feat: upgrade to plus button by @matthieujacq in https://github.com/StanGirard/quivr/pull/1482 +- feat: 🎸 sitemap by @StanGirard in https://github.com/StanGirard/quivr/pull/1483 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.96...v0.0.97 ## 0.0.96 (2023-10-24) ## What's Changed -* feat: validate email and required question with react-hook-form by @matthieujacq in https://github.com/StanGirard/quivr/pull/1463 -* feat: fetch security questions from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1464 -* feat: POST on /contact to contact quivr team by email by @matthieujacq in https://github.com/StanGirard/quivr/pull/1466 -* feat: setup premium feature backend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1467 -* feat: add sponsor and blog links by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1472 -* feat: contact sales submission by @matthieujacq in https://github.com/StanGirard/quivr/pull/1473 -* feat(homepage): add analytics by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1474 -* fix: make use cases clickable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1475 -* fix: update blog link position by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1476 +- feat: validate email and required question with react-hook-form by @matthieujacq in https://github.com/StanGirard/quivr/pull/1463 +- feat: fetch security questions from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1464 +- feat: POST on /contact to contact quivr team by email by @matthieujacq in https://github.com/StanGirard/quivr/pull/1466 +- feat: setup premium feature backend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1467 +- feat: add sponsor and blog links by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1472 +- feat: contact sales submission by @matthieujacq in https://github.com/StanGirard/quivr/pull/1473 +- feat(homepage): add analytics by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1474 +- fix: make use cases clickable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1475 +- fix: update blog link position by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1476 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.95...v0.0.96 ## 0.0.95 (2023-10-23) ## What's Changed -* feat: homepage first section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1439 -* fix: show a flat gradient in the UseCase section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1440 -* style: update testimonials display by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1441 -* feat: fetch homepage data from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1452 -* feat: contact sales page (front layout) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1451 -* Fix: Improved Text Visibility in Dark Mode in OnboardingQuestion Component by @Dev-Dz27 in https://github.com/StanGirard/quivr/pull/1456 -* feat(cms): added single video demo by @StanGirard in https://github.com/StanGirard/quivr/pull/1459 -* feat: fetch demo video from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1461 -* feat: Contact form component by @matthieujacq in https://github.com/StanGirard/quivr/pull/1453 + +- feat: homepage first section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1439 +- fix: show a flat gradient in the UseCase section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1440 +- style: update testimonials display by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1441 +- feat: fetch homepage data from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1452 +- feat: contact sales page (front layout) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1451 +- Fix: Improved Text Visibility in Dark Mode in OnboardingQuestion Component by @Dev-Dz27 in https://github.com/StanGirard/quivr/pull/1456 +- feat(cms): added single video demo by @StanGirard in https://github.com/StanGirard/quivr/pull/1459 +- feat: fetch demo video from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1461 +- feat: Contact form component by @matthieujacq in https://github.com/StanGirard/quivr/pull/1453 ## New Contributors -* @Dev-Dz27 made their first contribution in https://github.com/StanGirard/quivr/pull/1456 + +- @Dev-Dz27 made their first contribution in https://github.com/StanGirard/quivr/pull/1456 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.94...v0.0.95 ## 0.0.94 (2023-10-19) ## What's Changed -* feat: Homepage demo section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1420 -* feat: add security section by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1423 -* feat: HomePage new footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1425 -* feat: add testimonials section by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1427 -* refactor(backend): cleaning dead and unused code by @StanGirard in https://github.com/StanGirard/quivr/pull/1432 +- feat: Homepage demo section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1420 +- feat: add security section by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1423 +- feat: HomePage new footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1425 +- feat: add testimonials section by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1427 +- refactor(backend): cleaning dead and unused code by @StanGirard in https://github.com/StanGirard/quivr/pull/1432 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.93...v0.0.94 ## 0.0.93 (2023-10-17) ## What's Changed -* feat: add use cases to homepage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1415 -* feat: Homepage screen 1 content by @matthieujacq in https://github.com/StanGirard/quivr/pull/1414 +- feat: add use cases to homepage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1415 +- feat: Homepage screen 1 content by @matthieujacq in https://github.com/StanGirard/quivr/pull/1414 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.92...v0.0.93 ## 0.0.92 (2023-10-17) ## What's Changed -* feat: add a cron to remove onboarding more than 7 days by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1397 -* feat: 🖼️ new homepage background by @matthieujacq in https://github.com/StanGirard/quivr/pull/1395 +- feat: add a cron to remove onboarding more than 7 days by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1397 +- feat: 🖼️ new homepage background by @matthieujacq in https://github.com/StanGirard/quivr/pull/1395 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.91...v0.0.92 ## 0.0.91 (2023-10-12) ## What's Changed -* feat: track onboarding events by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1388 -* fix(user identity): User identity dict has no attribute user_id and open_api_key by @HamzaKhalidDhillon in https://github.com/StanGirard/quivr/pull/1351 -* feat: new homepage header by @matthieujacq in https://github.com/StanGirard/quivr/pull/1382 -* feat(onboarding): add suggested questions answer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1390 + +- feat: track onboarding events by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1388 +- fix(user identity): User identity dict has no attribute user_id and open_api_key by @HamzaKhalidDhillon in https://github.com/StanGirard/quivr/pull/1351 +- feat: new homepage header by @matthieujacq in https://github.com/StanGirard/quivr/pull/1382 +- feat(onboarding): add suggested questions answer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1390 ## New Contributors -* @HamzaKhalidDhillon made their first contribution in https://github.com/StanGirard/quivr/pull/1351 + +- @HamzaKhalidDhillon made their first contribution in https://github.com/StanGirard/quivr/pull/1351 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.90...v0.0.91 ## 0.0.90 (2023-10-11) ## What's Changed -* feat: add Welcome chat by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1365 -* feat: handle suggestion click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1368 -* refactor: Enable linting on login+signup page and hooks by @matthieujacq in https://github.com/StanGirard/quivr/pull/1369 -* feat: finish onboarding step on first upload or crawl by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1373 -* feat: add create_user_onboarding_function by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1383 -* feat: remove user onboarding on complete by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1387 +- feat: add Welcome chat by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1365 +- feat: handle suggestion click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1368 +- refactor: Enable linting on login+signup page and hooks by @matthieujacq in https://github.com/StanGirard/quivr/pull/1369 +- feat: finish onboarding step on first upload or crawl by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1373 +- feat: add create_user_onboarding_function by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1383 +- feat: remove user onboarding on complete by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1387 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.89...v0.0.90 ## 0.0.89 (2023-10-09) ## What's Changed -* feat: enable CSP in all environments (local/preview/prod) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1334 -* feat: enhance user page UI by @nguernse in https://github.com/StanGirard/quivr/pull/1319 -* feat: update onboarding steps by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1337 -* feat: add onboarding_a column to onboarding table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1340 -* fix(question): fixed with user_settings by @StanGirard in https://github.com/StanGirard/quivr/pull/1349 -* FIX tables.sql - missing ; breaks SQL queries. by @stanrb in https://github.com/StanGirard/quivr/pull/1348 -* feat: ⚙️🐞 configure debugger for the backend by @matthieujacq in https://github.com/StanGirard/quivr/pull/1345 -* test: add chat e2e tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1344 -* feat: configure CSP for self-hosting and multiple ports in dev mode by @matthieujacq in https://github.com/StanGirard/quivr/pull/1364 + +- feat: enable CSP in all environments (local/preview/prod) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1334 +- feat: enhance user page UI by @nguernse in https://github.com/StanGirard/quivr/pull/1319 +- feat: update onboarding steps by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1337 +- feat: add onboarding_a column to onboarding table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1340 +- fix(question): fixed with user_settings by @StanGirard in https://github.com/StanGirard/quivr/pull/1349 +- FIX tables.sql - missing ; breaks SQL queries. by @stanrb in https://github.com/StanGirard/quivr/pull/1348 +- feat: ⚙️🐞 configure debugger for the backend by @matthieujacq in https://github.com/StanGirard/quivr/pull/1345 +- test: add chat e2e tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1344 +- feat: configure CSP for self-hosting and multiple ports in dev mode by @matthieujacq in https://github.com/StanGirard/quivr/pull/1364 ## New Contributors -* @stanrb made their first contribution in https://github.com/StanGirard/quivr/pull/1348 + +- @stanrb made their first contribution in https://github.com/StanGirard/quivr/pull/1348 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.88...v0.0.89 ## 0.0.88 (2023-10-05) ## What's Changed -* fix: wrap parsing with try catch statements by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1321 -* fix: 🐛 ↕️ 📱height now matches mobile height by @matthieujacq in https://github.com/StanGirard/quivr/pull/1323 -* feat: add onboarding step 3 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1324 -* feat: restructure the sidebar of the brains management page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1325 -* feat: add onboarding table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1327 -* feat: update onboarding controller and fix typo by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1333 +- fix: wrap parsing with try catch statements by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1321 +- fix: 🐛 ↕️ 📱height now matches mobile height by @matthieujacq in https://github.com/StanGirard/quivr/pull/1323 +- feat: add onboarding step 3 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1324 +- feat: restructure the sidebar of the brains management page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1325 +- feat: add onboarding table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1327 +- feat: update onboarding controller and fix typo by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1333 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.87...v0.0.88 ## 0.0.87 (2023-10-03) ## What's Changed -* feat: ↕️ maximize brains management page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1308 -* refactor: ♻️ ContentSecurityPolicy as an object by @matthieujacq in https://github.com/StanGirard/quivr/pull/1312 -* fix: replace next/image's layout deprecated attribute by @matthieujacq in https://github.com/StanGirard/quivr/pull/1313 -* fix: remove undesired outlines around divs by @matthieujacq in https://github.com/StanGirard/quivr/pull/1316 -* feat(onboarding): add step 2 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1314 -* feat(onboarding): add questions suggestions layout by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1318 +- feat: ↕️ maximize brains management page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1308 +- refactor: ♻️ ContentSecurityPolicy as an object by @matthieujacq in https://github.com/StanGirard/quivr/pull/1312 +- fix: replace next/image's layout deprecated attribute by @matthieujacq in https://github.com/StanGirard/quivr/pull/1313 +- fix: remove undesired outlines around divs by @matthieujacq in https://github.com/StanGirard/quivr/pull/1316 +- feat(onboarding): add step 2 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1314 +- feat(onboarding): add questions suggestions layout by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1318 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.86...v0.0.87 ## 0.0.86 (2023-10-03) ## What's Changed -* fix(script): added percent before list of emails by @StanGirard in https://github.com/StanGirard/quivr/pull/1284 -* feat: improve app ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1281 -* test: add e2e for crawling by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1288 -* feat(user_settings): increased by @StanGirard in https://github.com/StanGirard/quivr/pull/1291 -* fix: prevent fetch when user is not logged in by @nguernse in https://github.com/StanGirard/quivr/pull/1293 -* fix(Select): fix JSX typo by @nguernse in https://github.com/StanGirard/quivr/pull/1292 -* feat: ✨ responsive sidebar by @matthieujacq in https://github.com/StanGirard/quivr/pull/1279 -* fix: 🐛 Sidebar content should not hide the sidebar footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1298 -* feat: allow users to turn private brain to public by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1300 -* feat: add onboarding first step by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1303 -* feat: update chat list on new chat first message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1305 -* feat: ↕️ Maximise chat window by @matthieujacq in https://github.com/StanGirard/quivr/pull/1301 + +- fix(script): added percent before list of emails by @StanGirard in https://github.com/StanGirard/quivr/pull/1284 +- feat: improve app ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1281 +- test: add e2e for crawling by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1288 +- feat(user_settings): increased by @StanGirard in https://github.com/StanGirard/quivr/pull/1291 +- fix: prevent fetch when user is not logged in by @nguernse in https://github.com/StanGirard/quivr/pull/1293 +- fix(Select): fix JSX typo by @nguernse in https://github.com/StanGirard/quivr/pull/1292 +- feat: ✨ responsive sidebar by @matthieujacq in https://github.com/StanGirard/quivr/pull/1279 +- fix: 🐛 Sidebar content should not hide the sidebar footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1298 +- feat: allow users to turn private brain to public by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1300 +- feat: add onboarding first step by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1303 +- feat: update chat list on new chat first message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1305 +- feat: ↕️ Maximise chat window by @matthieujacq in https://github.com/StanGirard/quivr/pull/1301 ## New Contributors -* @nguernse made their first contribution in https://github.com/StanGirard/quivr/pull/1293 + +- @nguernse made their first contribution in https://github.com/StanGirard/quivr/pull/1293 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.85...v0.0.86 ## 0.0.84 (2023-09-28) ## What's Changed -* feat: 👤 Implement gravatar by @matthieujacq in https://github.com/StanGirard/quivr/pull/1268 -* feat: improve knowledge feed process ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1274 -* fix: 🔒️ add gravatar.com to the content security policy by @matthieujacq in https://github.com/StanGirard/quivr/pull/1273 -* feat(chatPage): update ui add new feed component by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1275 -* feat: knowledge tab add button by @gozineb in https://github.com/StanGirard/quivr/pull/1277 -* fix(brains): get brains on local by @B0rrA in https://github.com/StanGirard/quivr/pull/1272 +- feat: 👤 Implement gravatar by @matthieujacq in https://github.com/StanGirard/quivr/pull/1268 +- feat: improve knowledge feed process ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1274 +- fix: 🔒️ add gravatar.com to the content security policy by @matthieujacq in https://github.com/StanGirard/quivr/pull/1273 +- feat(chatPage): update ui add new feed component by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1275 +- feat: knowledge tab add button by @gozineb in https://github.com/StanGirard/quivr/pull/1277 +- fix(brains): get brains on local by @B0rrA in https://github.com/StanGirard/quivr/pull/1272 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.83...v0.0.84 ## 0.0.83 (2023-09-27) ## What's Changed -* feat(nav): 🚚 Move Brain and User buttons to the sidebar in the chat by @matthieujacq in https://github.com/StanGirard/quivr/pull/1262 -* feat: save last chat config and make it default one by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1266 -* style: improve upload ux by @Rahil2507 in https://github.com/StanGirard/quivr/pull/1259 -* fix(docs): add prerequisites section in step 2 by @JvSdv in https://github.com/StanGirard/quivr/pull/1149 -* style: improve ui by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1263 + +- feat(nav): 🚚 Move Brain and User buttons to the sidebar in the chat by @matthieujacq in https://github.com/StanGirard/quivr/pull/1262 +- feat: save last chat config and make it default one by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1266 +- style: improve upload ux by @Rahil2507 in https://github.com/StanGirard/quivr/pull/1259 +- fix(docs): add prerequisites section in step 2 by @JvSdv in https://github.com/StanGirard/quivr/pull/1149 +- style: improve ui by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1263 ## New Contributors -* @Rahil2507 made their first contribution in https://github.com/StanGirard/quivr/pull/1259 -* @JvSdv made their first contribution in https://github.com/StanGirard/quivr/pull/1149 + +- @Rahil2507 made their first contribution in https://github.com/StanGirard/quivr/pull/1259 +- @JvSdv made their first contribution in https://github.com/StanGirard/quivr/pull/1149 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.82...v0.0.83 ## 0.0.82 (2023-09-26) ## What's Changed -* fix(RBAC): skip validation for unplug by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1264 +- fix(RBAC): skip validation for unplug by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1264 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.81...v0.0.82 ## 0.0.81 (2023-09-26) ## What's Changed -* feat: activate public brain subscription by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1241 -* feat(publicBrain): disable subscribe button when already subscribed and refetch brains list by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1246 -* feat: knowledge tab list by @gozineb in https://github.com/StanGirard/quivr/pull/1222 -* fix(preview): fixed a few bugs unchecked by @StanGirard in https://github.com/StanGirard/quivr/pull/1247 -* feat: add last_update field to brain table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1252 -* fix: urls to avoid 307 by @gozineb in https://github.com/StanGirard/quivr/pull/1253 -* feat: allow user to unsubscribe from a brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1254 -* feat(user): 🚚 Move language and theme buttons to the User page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1256 -* Update next.config.js by @riccardolinares in https://github.com/StanGirard/quivr/pull/1251 -* feat: allow setting public brain status to private by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1258 + +- feat: activate public brain subscription by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1241 +- feat(publicBrain): disable subscribe button when already subscribed and refetch brains list by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1246 +- feat: knowledge tab list by @gozineb in https://github.com/StanGirard/quivr/pull/1222 +- fix(preview): fixed a few bugs unchecked by @StanGirard in https://github.com/StanGirard/quivr/pull/1247 +- feat: add last_update field to brain table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1252 +- fix: urls to avoid 307 by @gozineb in https://github.com/StanGirard/quivr/pull/1253 +- feat: allow user to unsubscribe from a brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1254 +- feat(user): 🚚 Move language and theme buttons to the User page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1256 +- Update next.config.js by @riccardolinares in https://github.com/StanGirard/quivr/pull/1251 +- feat: allow setting public brain status to private by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1258 ## New Contributors -* @matthieujacq made their first contribution in https://github.com/StanGirard/quivr/pull/1256 -* @riccardolinares made their first contribution in https://github.com/StanGirard/quivr/pull/1251 + +- @matthieujacq made their first contribution in https://github.com/StanGirard/quivr/pull/1256 +- @riccardolinares made their first contribution in https://github.com/StanGirard/quivr/pull/1251 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.80...v0.0.81 @@ -2059,68 +2127,68 @@ ## 0.0.79 (2023-09-21) ## What's Changed -* fix(gpt-3.5-instruct): bug and new version of node by @StanGirard in https://github.com/StanGirard/quivr/pull/1228 -* feat: display brain status on settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1221 -* feat(upload): changed icons by @StanGirard in https://github.com/StanGirard/quivr/pull/1233 -* Feat/paperclip by @StanGirard in https://github.com/StanGirard/quivr/pull/1234 -* fix(brain_size): increased size by @StanGirard in https://github.com/StanGirard/quivr/pull/1235 -* feat(strapi): added first draft by @StanGirard in https://github.com/StanGirard/quivr/pull/1237 -* feat: add public brain page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1230 -* feat: count public brains number of subscribers by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1236 +- fix(gpt-3.5-instruct): bug and new version of node by @StanGirard in https://github.com/StanGirard/quivr/pull/1228 +- feat: display brain status on settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1221 +- feat(upload): changed icons by @StanGirard in https://github.com/StanGirard/quivr/pull/1233 +- Feat/paperclip by @StanGirard in https://github.com/StanGirard/quivr/pull/1234 +- fix(brain_size): increased size by @StanGirard in https://github.com/StanGirard/quivr/pull/1235 +- feat(strapi): added first draft by @StanGirard in https://github.com/StanGirard/quivr/pull/1237 +- feat: add public brain page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1230 +- feat: count public brains number of subscribers by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1236 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.78...v0.0.79 ## 0.0.78 (2023-09-20) ## What's Changed -* feat: add public brain creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1218 -* feat: get files from storage by @gozineb in https://github.com/StanGirard/quivr/pull/1205 +- feat: add public brain creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1218 +- feat: get files from storage by @gozineb in https://github.com/StanGirard/quivr/pull/1205 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.77...v0.0.78 ## 0.0.77 (2023-09-19) ## What's Changed -* feat(memory): optimisation by @StanGirard in https://github.com/StanGirard/quivr/pull/1214 +- feat(memory): optimisation by @StanGirard in https://github.com/StanGirard/quivr/pull/1214 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.76...v0.0.77 ## 0.0.76 (2023-09-19) ## What's Changed -* chore(theodo): added trigger function for theodo by @StanGirard in https://github.com/StanGirard/quivr/pull/1195 -* feat: add tooltip on upload card toggle button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1197 -* feat(analytics): add google analytics by @gozineb in https://github.com/StanGirard/quivr/pull/1147 -* Feat/theodo gpt4 by @StanGirard in https://github.com/StanGirard/quivr/pull/1198 -* fix(chats): now in order and with a little bonus ;) by @StanGirard in https://github.com/StanGirard/quivr/pull/1200 -* fix: fix some bugs by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1201 -* feat(question): now not rephrasing question when passed to answering llm by @StanGirard in https://github.com/StanGirard/quivr/pull/1202 +- chore(theodo): added trigger function for theodo by @StanGirard in https://github.com/StanGirard/quivr/pull/1195 +- feat: add tooltip on upload card toggle button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1197 +- feat(analytics): add google analytics by @gozineb in https://github.com/StanGirard/quivr/pull/1147 +- Feat/theodo gpt4 by @StanGirard in https://github.com/StanGirard/quivr/pull/1198 +- fix(chats): now in order and with a little bonus ;) by @StanGirard in https://github.com/StanGirard/quivr/pull/1200 +- fix: fix some bugs by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1201 +- feat(question): now not rephrasing question when passed to answering llm by @StanGirard in https://github.com/StanGirard/quivr/pull/1202 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.75...v0.0.76 ## 0.0.75 (2023-09-18) ## What's Changed -* feat(frontend): responsiveness by @StanGirard in https://github.com/StanGirard/quivr/pull/1174 -* feat(upload): changed to task by @StanGirard in https://github.com/StanGirard/quivr/pull/1178 -* fix(qa_base): asign max_token to llm by @B0rrA in https://github.com/StanGirard/quivr/pull/1179 -* feat(perf): increased perf embedding and search for files by @StanGirard in https://github.com/StanGirard/quivr/pull/1182 -* fix(usersettings): Fix bugs with user settings in the back always gpt-3.5-turbo by @StanGirard in https://github.com/StanGirard/quivr/pull/1183 -* feat(notificatins): higher refresh rate by @StanGirard in https://github.com/StanGirard/quivr/pull/1184 -* style(notifications): improve the messages for the notifications by @StanGirard in https://github.com/StanGirard/quivr/pull/1185 -* fix(notifications): dead notifications that are still present long after by @StanGirard in https://github.com/StanGirard/quivr/pull/1186 -* fix(notifications): greater than 5 minutes ago not less by @StanGirard in https://github.com/StanGirard/quivr/pull/1187 -* feat(aws): improved size by @StanGirard in https://github.com/StanGirard/quivr/pull/1188 -* feat(concurrency): added concurrency for increased performance by @StanGirard in https://github.com/StanGirard/quivr/pull/1189 -* feat(prompt): improved answer readability with markdown and aerataed by @StanGirard in https://github.com/StanGirard/quivr/pull/1190 -* fix(notification): information now displayed on the right by @StanGirard in https://github.com/StanGirard/quivr/pull/1191 -* feat(chat): added copy feature to message by @StanGirard in https://github.com/StanGirard/quivr/pull/1192 -* feat(e2e): add playright config and createBrain e2e test by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1177 +- feat(frontend): responsiveness by @StanGirard in https://github.com/StanGirard/quivr/pull/1174 +- feat(upload): changed to task by @StanGirard in https://github.com/StanGirard/quivr/pull/1178 +- fix(qa_base): asign max_token to llm by @B0rrA in https://github.com/StanGirard/quivr/pull/1179 +- feat(perf): increased perf embedding and search for files by @StanGirard in https://github.com/StanGirard/quivr/pull/1182 +- fix(usersettings): Fix bugs with user settings in the back always gpt-3.5-turbo by @StanGirard in https://github.com/StanGirard/quivr/pull/1183 +- feat(notificatins): higher refresh rate by @StanGirard in https://github.com/StanGirard/quivr/pull/1184 +- style(notifications): improve the messages for the notifications by @StanGirard in https://github.com/StanGirard/quivr/pull/1185 +- fix(notifications): dead notifications that are still present long after by @StanGirard in https://github.com/StanGirard/quivr/pull/1186 +- fix(notifications): greater than 5 minutes ago not less by @StanGirard in https://github.com/StanGirard/quivr/pull/1187 +- feat(aws): improved size by @StanGirard in https://github.com/StanGirard/quivr/pull/1188 +- feat(concurrency): added concurrency for increased performance by @StanGirard in https://github.com/StanGirard/quivr/pull/1189 +- feat(prompt): improved answer readability with markdown and aerataed by @StanGirard in https://github.com/StanGirard/quivr/pull/1190 +- fix(notification): information now displayed on the right by @StanGirard in https://github.com/StanGirard/quivr/pull/1191 +- feat(chat): added copy feature to message by @StanGirard in https://github.com/StanGirard/quivr/pull/1192 +- feat(e2e): add playright config and createBrain e2e test by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1177 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.74...v0.0.75 @@ -2135,370 +2203,348 @@ ## 0.0.72 (2023-09-14) ## What's Changed -* feat(file-system): added queue and filesystem by @StanGirard in https://github.com/StanGirard/quivr/pull/1159 -* fix(migration): removed by @StanGirard in https://github.com/StanGirard/quivr/pull/1170 +- feat(file-system): added queue and filesystem by @StanGirard in https://github.com/StanGirard/quivr/pull/1159 +- fix(migration): removed by @StanGirard in https://github.com/StanGirard/quivr/pull/1170 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.71...v0.0.72 ## 0.0.71 (2023-09-14) ## What's Changed -* feat: the good user management by @StanGirard in https://github.com/StanGirard/quivr/pull/1158 -* feat: add knowledge tab on brains settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1163 -* feat: update header and improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1164 -* feat: submit upload on Enter by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1160 -* feat: make error messages more clear by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1166 +- feat: the good user management by @StanGirard in https://github.com/StanGirard/quivr/pull/1158 +- feat: add knowledge tab on brains settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1163 +- feat: update header and improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1164 +- feat: submit upload on Enter by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1160 +- feat: make error messages more clear by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1166 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.70...v0.0.71 ## 0.0.70 (2023-09-12) ## What's Changed -* feat: add notifications components by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1148 -* feat: add polling for pending notifications by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1152 -* fix(selectedBrain): prevent picking brainId from local storage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1154 -* feat: update isValidUrl function by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1155 +- feat: add notifications components by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1148 +- feat: add polling for pending notifications by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1152 +- fix(selectedBrain): prevent picking brainId from local storage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1154 +- feat: update isValidUrl function by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1155 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.69...v0.0.70 ## 0.0.69 (2023-09-08) ## What's Changed -* feat: add multiple upload and crawl in parallel by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1118 -* feat: allow user to chat while feed process is pending by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1120 -* feat: add notifications table, and push notification on upload and crawl by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1125 -* feat: merge chat history with chat notifications by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1127 -* feat(feedBrain): add request pending message #1135 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1136 -* fix: update crawl and upload endpoints by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1142 -* make docker compose command more flexible by @thehunmonkgroup in https://github.com/StanGirard/quivr/pull/1139 + +- feat: add multiple upload and crawl in parallel by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1118 +- feat: allow user to chat while feed process is pending by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1120 +- feat: add notifications table, and push notification on upload and crawl by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1125 +- feat: merge chat history with chat notifications by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1127 +- feat(feedBrain): add request pending message #1135 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1136 +- fix: update crawl and upload endpoints by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1142 +- make docker compose command more flexible by @thehunmonkgroup in https://github.com/StanGirard/quivr/pull/1139 ## New Contributors -* @thehunmonkgroup made their first contribution in https://github.com/StanGirard/quivr/pull/1139 + +- @thehunmonkgroup made their first contribution in https://github.com/StanGirard/quivr/pull/1139 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.68...v0.0.69 ## 0.0.68 (2023-09-06) ## What's Changed -* feat(liteLLM): Add support for Azure OpenAI, Palm, Claude-2, Llama2, CodeLlama (100+LLMs) by @ishaan-jaff in https://github.com/StanGirard/quivr/pull/1097 -* feat(crawler): add multiple urls support by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1112 -* fix(csp): add growthbook to csp headers by @gozineb in https://github.com/StanGirard/quivr/pull/1117 + +- feat(liteLLM): Add support for Azure OpenAI, Palm, Claude-2, Llama2, CodeLlama (100+LLMs) by @ishaan-jaff in https://github.com/StanGirard/quivr/pull/1097 +- feat(crawler): add multiple urls support by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1112 +- fix(csp): add growthbook to csp headers by @gozineb in https://github.com/StanGirard/quivr/pull/1117 ## New Contributors -* @ishaan-jaff made their first contribution in https://github.com/StanGirard/quivr/pull/1097 + +- @ishaan-jaff made their first contribution in https://github.com/StanGirard/quivr/pull/1097 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.67...v0.0.68 ## 0.0.67 (2023-09-05) ## What's Changed -* feat: add FeedBrainInput component by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1101 -* feat: add component in chat page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1103 -* 🚑 fix feature flags -> add it back to context by @gozineb in https://github.com/StanGirard/quivr/pull/1106 +- feat: add FeedBrainInput component by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1101 +- feat: add component in chat page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1103 +- 🚑 fix feature flags -> add it back to context by @gozineb in https://github.com/StanGirard/quivr/pull/1106 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.66...v0.0.67 ## 0.0.66 (2023-09-04) ## What's Changed -* fix(prod): add url api.openai to CSP headers by @gozineb in https://github.com/StanGirard/quivr/pull/1077 -* feat: change share brain button logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1078 -* fix(brainsSettings): handle nullish value from api call by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1080 -* fix: update hash routing logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1082 -* fix: fix hash redirection by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1085 -* feat: add tanstack query and optimistic fetch on brains settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1087 -* docs: writeup for running quivr fully locally by @mvda in https://github.com/StanGirard/quivr/pull/1096 -* fix: prevent submit on share button click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1098 + +- fix(prod): add url api.openai to CSP headers by @gozineb in https://github.com/StanGirard/quivr/pull/1077 +- feat: change share brain button logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1078 +- fix(brainsSettings): handle nullish value from api call by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1080 +- fix: update hash routing logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1082 +- fix: fix hash redirection by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1085 +- feat: add tanstack query and optimistic fetch on brains settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1087 +- docs: writeup for running quivr fully locally by @mvda in https://github.com/StanGirard/quivr/pull/1096 +- fix: prevent submit on share button click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1098 ## New Contributors -* @mvda made their first contribution in https://github.com/StanGirard/quivr/pull/1096 + +- @mvda made their first contribution in https://github.com/StanGirard/quivr/pull/1096 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.65...v0.0.66 ## 0.0.65 (2023-08-31) ## What's Changed -* feat: make chatlist scrollable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1064 -* feat(newBrain): update data validation logic and add * on required fields by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1065 -* feat(shareBrain): prevent re inviting users with access by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1063 -* feat(chatMessage): update attributes display by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1067 -* fix: fix minor bugs by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1070 -* feat: remove mic button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1075 -* feat: truncate long chat name by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1076 +- feat: make chatlist scrollable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1064 +- feat(newBrain): update data validation logic and add \* on required fields by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1065 +- feat(shareBrain): prevent re inviting users with access by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1063 +- feat(chatMessage): update attributes display by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1067 +- fix: fix minor bugs by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1070 +- feat: remove mic button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1075 +- feat: truncate long chat name by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1076 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.64...v0.0.65 ## 0.0.64 (2023-08-30) ## What's Changed -* feat: add prompt trigger through # by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1023 -* feat: add headless question tracking by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1051 -* feat: update header and remove prompt / brain on backspace by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1052 -* feat: handle new chat button click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1054 -* feat: add name missing error in new brain modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1055 -* feat: validate api key before saving by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1057 -* feat: track prompt and brain changes by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1058 -* feat(chat): update chat input placeholder by @gozineb in https://github.com/StanGirard/quivr/pull/1060 -* fix(invitationPage): avoid multiple re-rendering by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1062 +- feat: add prompt trigger through # by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1023 +- feat: add headless question tracking by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1051 +- feat: update header and remove prompt / brain on backspace by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1052 +- feat: handle new chat button click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1054 +- feat: add name missing error in new brain modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1055 +- feat: validate api key before saving by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1057 +- feat: track prompt and brain changes by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1058 +- feat(chat): update chat input placeholder by @gozineb in https://github.com/StanGirard/quivr/pull/1060 +- fix(invitationPage): avoid multiple re-rendering by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1062 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.63...v0.0.64 ## 0.0.63 (2023-08-27) ## What's Changed -* fix(dockerfile): backend Dockerfile exit code 1 by @pat266 in https://github.com/StanGirard/quivr/pull/1032 -* test(backend): skip failing tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1036 -* feat(messagesList): auto scroll on new message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1040 -* test: unskip `qa_headless.py` linter tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1041 -* feat: add 2 save buttons on Brain management tab by @ChloeMouret in https://github.com/StanGirard/quivr/pull/1039 -* feat(brain): add endpoint to return context to question by @ZongZiWang in https://github.com/StanGirard/quivr/pull/1044 -* fix: English grammar translation.json by @elie222 in https://github.com/StanGirard/quivr/pull/1046 + +- fix(dockerfile): backend Dockerfile exit code 1 by @pat266 in https://github.com/StanGirard/quivr/pull/1032 +- test(backend): skip failing tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1036 +- feat(messagesList): auto scroll on new message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1040 +- test: unskip `qa_headless.py` linter tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1041 +- feat: add 2 save buttons on Brain management tab by @ChloeMouret in https://github.com/StanGirard/quivr/pull/1039 +- feat(brain): add endpoint to return context to question by @ZongZiWang in https://github.com/StanGirard/quivr/pull/1044 +- fix: English grammar translation.json by @elie222 in https://github.com/StanGirard/quivr/pull/1046 ## New Contributors -* @pat266 made their first contribution in https://github.com/StanGirard/quivr/pull/1032 -* @elie222 made their first contribution in https://github.com/StanGirard/quivr/pull/1046 + +- @pat266 made their first contribution in https://github.com/StanGirard/quivr/pull/1032 +- @elie222 made their first contribution in https://github.com/StanGirard/quivr/pull/1046 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.62...v0.0.63 ## 0.0.62 (2023-08-25) ## What's Changed -* feat: Remove chat id from chat list by @ChloeMouret in https://github.com/StanGirard/quivr/pull/1031 -* fix(analytics): june debug for real by @gozineb in https://github.com/StanGirard/quivr/pull/1033 +- feat: Remove chat id from chat list by @ChloeMouret in https://github.com/StanGirard/quivr/pull/1031 +- fix(analytics): june debug for real by @gozineb in https://github.com/StanGirard/quivr/pull/1033 **Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.61...v0.0.62 ## [0.0.61](https://github.com/StanGirard/quivr/compare/v0.0.60...v0.0.61) (2023-08-23) - ### Features -* add brain prompt overwritting from chat ([#1012](https://github.com/StanGirard/quivr/issues/1012)) ([b967c2d](https://github.com/StanGirard/quivr/commit/b967c2d2d60b93f9142fe2afd04fb9422adcc2be)) -* **backend:** adds python code parsing ([#1003](https://github.com/StanGirard/quivr/issues/1003)) ([a626b84](https://github.com/StanGirard/quivr/commit/a626b84b96c7b40904960e039f72ff042148a240)) -* **prompts:** add public prompts to SQL db ([#1014](https://github.com/StanGirard/quivr/issues/1014)) ([4b1f4b1](https://github.com/StanGirard/quivr/commit/4b1f4b141287d109794aa6015f83deb3882ac5cb)) -* **translation:** Added Simplified Chinese translation,Fix pt-br not working ([#1011](https://github.com/StanGirard/quivr/issues/1011)) ([e328ab8](https://github.com/StanGirard/quivr/commit/e328ab81b30f2dd3dae7287e0351fdacd1c18133)) - +- add brain prompt overwritting from chat ([#1012](https://github.com/StanGirard/quivr/issues/1012)) ([b967c2d](https://github.com/StanGirard/quivr/commit/b967c2d2d60b93f9142fe2afd04fb9422adcc2be)) +- **backend:** adds python code parsing ([#1003](https://github.com/StanGirard/quivr/issues/1003)) ([a626b84](https://github.com/StanGirard/quivr/commit/a626b84b96c7b40904960e039f72ff042148a240)) +- **prompts:** add public prompts to SQL db ([#1014](https://github.com/StanGirard/quivr/issues/1014)) ([4b1f4b1](https://github.com/StanGirard/quivr/commit/4b1f4b141287d109794aa6015f83deb3882ac5cb)) +- **translation:** Added Simplified Chinese translation,Fix pt-br not working ([#1011](https://github.com/StanGirard/quivr/issues/1011)) ([e328ab8](https://github.com/StanGirard/quivr/commit/e328ab81b30f2dd3dae7287e0351fdacd1c18133)) ### Bug Fixes -* **Analytics:** no tags tracking for upload & crawl ([#1024](https://github.com/StanGirard/quivr/issues/1024)) ([2b74ebc](https://github.com/StanGirard/quivr/commit/2b74ebc1f099c4d12705d458fefad94120af9208)) +- **Analytics:** no tags tracking for upload & crawl ([#1024](https://github.com/StanGirard/quivr/issues/1024)) ([2b74ebc](https://github.com/StanGirard/quivr/commit/2b74ebc1f099c4d12705d458fefad94120af9208)) ## [0.0.60](https://github.com/StanGirard/quivr/compare/v0.0.59...v0.0.60) (2023-08-22) - ### Features -* **chat:** add brain selection through mention input ([#969](https://github.com/StanGirard/quivr/issues/969)) ([8e94f22](https://github.com/StanGirard/quivr/commit/8e94f22782dd2255e8125fbb4b3718413ad4701e)) - +- **chat:** add brain selection through mention input ([#969](https://github.com/StanGirard/quivr/issues/969)) ([8e94f22](https://github.com/StanGirard/quivr/commit/8e94f22782dd2255e8125fbb4b3718413ad4701e)) ### Bug Fixes -* remove conflicts ([#998](https://github.com/StanGirard/quivr/issues/998)) ([f61b70a](https://github.com/StanGirard/quivr/commit/f61b70a34f6d24e6f343d31cc4aa63265bb1c218)) -* update backend tests ([#992](https://github.com/StanGirard/quivr/issues/992)) ([5a3a6fe](https://github.com/StanGirard/quivr/commit/5a3a6fe370756783a204f2a62007f6cb23c7b202)) +- remove conflicts ([#998](https://github.com/StanGirard/quivr/issues/998)) ([f61b70a](https://github.com/StanGirard/quivr/commit/f61b70a34f6d24e6f343d31cc4aa63265bb1c218)) +- update backend tests ([#992](https://github.com/StanGirard/quivr/issues/992)) ([5a3a6fe](https://github.com/StanGirard/quivr/commit/5a3a6fe370756783a204f2a62007f6cb23c7b202)) ## [0.0.59](https://github.com/StanGirard/quivr/compare/v0.0.58...v0.0.59) (2023-08-20) - ### Features -* **aws:** all in microservices ([b3a6231](https://github.com/StanGirard/quivr/commit/b3a6231274e5aea28675381ba6f7ba277228f5ac)) -* **chat-service:** added task definition ([d001ec7](https://github.com/StanGirard/quivr/commit/d001ec70df3ccd5f3885b5f174e58f1b3238c433)) -* **docker:** improved size image ([#978](https://github.com/StanGirard/quivr/issues/978)) ([aa623c4](https://github.com/StanGirard/quivr/commit/aa623c4039ba31928dd0934a682259c7762d2efa)) -* **docker:** pushing image to github registry ([ad3dca3](https://github.com/StanGirard/quivr/commit/ad3dca3e2705b87a9c9c0b35f67773bcc182ae88)) -* **gcr:** removed sha and put latest ([2b85a94](https://github.com/StanGirard/quivr/commit/2b85a94e8835861afd9c178b72e59d018d8b956f)) -* **health:** added endpoint for services ([#989](https://github.com/StanGirard/quivr/issues/989)) ([ae7852e](https://github.com/StanGirard/quivr/commit/ae7852ec3f9d6e20b28c3b6fbc0d433d476395ea)) -* **microservices:** split into 4 quivr to better handle long services ([#972](https://github.com/StanGirard/quivr/issues/972)) ([7281fd9](https://github.com/StanGirard/quivr/commit/7281fd905a24b8e4dad7214d7809b8856685fca8)) -* **preview:** added crawl service to ci ([b7f9876](https://github.com/StanGirard/quivr/commit/b7f9876ce20a2c802ccfd7cff35de50ac2fd2226)) -* **preview:** added preview ([#974](https://github.com/StanGirard/quivr/issues/974)) ([9eb25a4](https://github.com/StanGirard/quivr/commit/9eb25a4d1777b9fdbc1c4b93df0b51e8b28d3ae9)) -* **preview:** added service upload ([#979](https://github.com/StanGirard/quivr/issues/979)) ([ce6b45e](https://github.com/StanGirard/quivr/commit/ce6b45e1ac8e9a3d21b7f56ad228351e34179e11)) -* **refacto:** changed a bit of things to make better dx ([#984](https://github.com/StanGirard/quivr/issues/984)) ([d0370ab](https://github.com/StanGirard/quivr/commit/d0370ab499465ee1404d3c1d32878e8da3853441)) -* **Unplug:** chatting without brain streaming ([#970](https://github.com/StanGirard/quivr/issues/970)) ([600ff1e](https://github.com/StanGirard/quivr/commit/600ff1ede02741c66853cc3e4e7f5001aaba3bc2)) - +- **aws:** all in microservices ([b3a6231](https://github.com/StanGirard/quivr/commit/b3a6231274e5aea28675381ba6f7ba277228f5ac)) +- **chat-service:** added task definition ([d001ec7](https://github.com/StanGirard/quivr/commit/d001ec70df3ccd5f3885b5f174e58f1b3238c433)) +- **docker:** improved size image ([#978](https://github.com/StanGirard/quivr/issues/978)) ([aa623c4](https://github.com/StanGirard/quivr/commit/aa623c4039ba31928dd0934a682259c7762d2efa)) +- **docker:** pushing image to github registry ([ad3dca3](https://github.com/StanGirard/quivr/commit/ad3dca3e2705b87a9c9c0b35f67773bcc182ae88)) +- **gcr:** removed sha and put latest ([2b85a94](https://github.com/StanGirard/quivr/commit/2b85a94e8835861afd9c178b72e59d018d8b956f)) +- **health:** added endpoint for services ([#989](https://github.com/StanGirard/quivr/issues/989)) ([ae7852e](https://github.com/StanGirard/quivr/commit/ae7852ec3f9d6e20b28c3b6fbc0d433d476395ea)) +- **microservices:** split into 4 quivr to better handle long services ([#972](https://github.com/StanGirard/quivr/issues/972)) ([7281fd9](https://github.com/StanGirard/quivr/commit/7281fd905a24b8e4dad7214d7809b8856685fca8)) +- **preview:** added crawl service to ci ([b7f9876](https://github.com/StanGirard/quivr/commit/b7f9876ce20a2c802ccfd7cff35de50ac2fd2226)) +- **preview:** added preview ([#974](https://github.com/StanGirard/quivr/issues/974)) ([9eb25a4](https://github.com/StanGirard/quivr/commit/9eb25a4d1777b9fdbc1c4b93df0b51e8b28d3ae9)) +- **preview:** added service upload ([#979](https://github.com/StanGirard/quivr/issues/979)) ([ce6b45e](https://github.com/StanGirard/quivr/commit/ce6b45e1ac8e9a3d21b7f56ad228351e34179e11)) +- **refacto:** changed a bit of things to make better dx ([#984](https://github.com/StanGirard/quivr/issues/984)) ([d0370ab](https://github.com/StanGirard/quivr/commit/d0370ab499465ee1404d3c1d32878e8da3853441)) +- **Unplug:** chatting without brain streaming ([#970](https://github.com/StanGirard/quivr/issues/970)) ([600ff1e](https://github.com/StanGirard/quivr/commit/600ff1ede02741c66853cc3e4e7f5001aaba3bc2)) ### Bug Fixes -* **settings:** select proper brain model ([#943](https://github.com/StanGirard/quivr/issues/943)) ([3a44f54](https://github.com/StanGirard/quivr/commit/3a44f54d6b75581e3cbc8acf0c1c309c3273e63f)) -* update backend tests ([#975](https://github.com/StanGirard/quivr/issues/975)) ([c746eb1](https://github.com/StanGirard/quivr/commit/c746eb18303945a1736c89427026b509f501e715)) -* **windows:** removed unused start script ([#962](https://github.com/StanGirard/quivr/issues/962)) ([ad7ac15](https://github.com/StanGirard/quivr/commit/ad7ac1516d5c45c833c9e9ba6162012096372fa6)) +- **settings:** select proper brain model ([#943](https://github.com/StanGirard/quivr/issues/943)) ([3a44f54](https://github.com/StanGirard/quivr/commit/3a44f54d6b75581e3cbc8acf0c1c309c3273e63f)) +- update backend tests ([#975](https://github.com/StanGirard/quivr/issues/975)) ([c746eb1](https://github.com/StanGirard/quivr/commit/c746eb18303945a1736c89427026b509f501e715)) +- **windows:** removed unused start script ([#962](https://github.com/StanGirard/quivr/issues/962)) ([ad7ac15](https://github.com/StanGirard/quivr/commit/ad7ac1516d5c45c833c9e9ba6162012096372fa6)) ## [0.0.57](https://github.com/StanGirard/quivr/compare/v0.0.56...v0.0.57) (2023-08-16) - ### Features -* add brain missing message ([#958](https://github.com/StanGirard/quivr/issues/958)) ([f99f81d](https://github.com/StanGirard/quivr/commit/f99f81d10f9c768af00e38249763a252f8db16e3)) -* change messages position ([#946](https://github.com/StanGirard/quivr/issues/946)) ([9235a84](https://github.com/StanGirard/quivr/commit/9235a848d12b96af346cc2cbb1ac50dc2f67b20c)) -* update chat ui ([#907](https://github.com/StanGirard/quivr/issues/907)) ([80be40a](https://github.com/StanGirard/quivr/commit/80be40ad34d07b646d48d2aa0405a92b3de308d7)) - +- add brain missing message ([#958](https://github.com/StanGirard/quivr/issues/958)) ([f99f81d](https://github.com/StanGirard/quivr/commit/f99f81d10f9c768af00e38249763a252f8db16e3)) +- change messages position ([#946](https://github.com/StanGirard/quivr/issues/946)) ([9235a84](https://github.com/StanGirard/quivr/commit/9235a848d12b96af346cc2cbb1ac50dc2f67b20c)) +- update chat ui ([#907](https://github.com/StanGirard/quivr/issues/907)) ([80be40a](https://github.com/StanGirard/quivr/commit/80be40ad34d07b646d48d2aa0405a92b3de308d7)) ### Bug Fixes -* **chat routes:** use brain model, temp, and token ([#902](https://github.com/StanGirard/quivr/issues/902)) ([59ddfb4](https://github.com/StanGirard/quivr/commit/59ddfb48823b56239fe7fc95133274a3bedf49da)) -* **chatMessages:** Fix error on answering question ([#953](https://github.com/StanGirard/quivr/issues/953)) ([1fef9b0](https://github.com/StanGirard/quivr/commit/1fef9b078379c8991f6029c34ac10d4cbdc5a44d)) -* **crawler:** using newspaper and fixed recursive by merging content ([#955](https://github.com/StanGirard/quivr/issues/955)) ([d7c5c79](https://github.com/StanGirard/quivr/commit/d7c5c79043827b2b0949f6fd6c508c4617dcf498)) -* **translations:** pr portuguese translations ([#933](https://github.com/StanGirard/quivr/issues/933)) ([d80178a](https://github.com/StanGirard/quivr/commit/d80178a84802c35b2c13d3eef4d0438fd067da92)) +- **chat routes:** use brain model, temp, and token ([#902](https://github.com/StanGirard/quivr/issues/902)) ([59ddfb4](https://github.com/StanGirard/quivr/commit/59ddfb48823b56239fe7fc95133274a3bedf49da)) +- **chatMessages:** Fix error on answering question ([#953](https://github.com/StanGirard/quivr/issues/953)) ([1fef9b0](https://github.com/StanGirard/quivr/commit/1fef9b078379c8991f6029c34ac10d4cbdc5a44d)) +- **crawler:** using newspaper and fixed recursive by merging content ([#955](https://github.com/StanGirard/quivr/issues/955)) ([d7c5c79](https://github.com/StanGirard/quivr/commit/d7c5c79043827b2b0949f6fd6c508c4617dcf498)) +- **translations:** pr portuguese translations ([#933](https://github.com/StanGirard/quivr/issues/933)) ([d80178a](https://github.com/StanGirard/quivr/commit/d80178a84802c35b2c13d3eef4d0438fd067da92)) ## [0.0.56](https://github.com/StanGirard/quivr/compare/v0.0.55...v0.0.56) (2023-08-10) - ### Bug Fixes -* **chat:** update data keys ([#923](https://github.com/StanGirard/quivr/issues/923)) ([21db719](https://github.com/StanGirard/quivr/commit/21db7197965f1cacd6595ae94d9017fc54d761c3)) +- **chat:** update data keys ([#923](https://github.com/StanGirard/quivr/issues/923)) ([21db719](https://github.com/StanGirard/quivr/commit/21db7197965f1cacd6595ae94d9017fc54d761c3)) ## [0.0.55](https://github.com/StanGirard/quivr/compare/v0.0.54...v0.0.55) (2023-08-10) - ### Features -* **chatMessages:** add brain_id and prompt_id columns ([#912](https://github.com/StanGirard/quivr/issues/912)) ([6e77732](https://github.com/StanGirard/quivr/commit/6e777327aaee7b9f35b20dcd00814f4acbaf448e)) -* **invitation:** add translations ([#909](https://github.com/StanGirard/quivr/issues/909)) ([1360ce8](https://github.com/StanGirard/quivr/commit/1360ce801d8958defa5dd29a481e2e66ac6ae9ac)) -* Russian language translation ([#903](https://github.com/StanGirard/quivr/issues/903)) ([672eec0](https://github.com/StanGirard/quivr/commit/672eec08bc7113e3f4c32a29ae86b2b879262d30)) +- **chatMessages:** add brain_id and prompt_id columns ([#912](https://github.com/StanGirard/quivr/issues/912)) ([6e77732](https://github.com/StanGirard/quivr/commit/6e777327aaee7b9f35b20dcd00814f4acbaf448e)) +- **invitation:** add translations ([#909](https://github.com/StanGirard/quivr/issues/909)) ([1360ce8](https://github.com/StanGirard/quivr/commit/1360ce801d8958defa5dd29a481e2e66ac6ae9ac)) +- Russian language translation ([#903](https://github.com/StanGirard/quivr/issues/903)) ([672eec0](https://github.com/StanGirard/quivr/commit/672eec08bc7113e3f4c32a29ae86b2b879262d30)) ## [0.0.54](https://github.com/StanGirard/quivr/compare/v0.0.53...v0.0.54) (2023-08-08) - ### Features -* add new chat bar ([#896](https://github.com/StanGirard/quivr/issues/896)) ([69a73f5](https://github.com/StanGirard/quivr/commit/69a73f5d5ae58dca9c23c0d8751f8c7326c84f4c)) -* add new chat page ([#890](https://github.com/StanGirard/quivr/issues/890)) ([c43e0c0](https://github.com/StanGirard/quivr/commit/c43e0c01c4ddcf0d97b9bb89784ff004fb7a0a79)) -* deleting brains on brain manager page ([#893](https://github.com/StanGirard/quivr/issues/893)) ([71e142b](https://github.com/StanGirard/quivr/commit/71e142ba3c164e5f14959cd1fd5de38531779034)) - +- add new chat bar ([#896](https://github.com/StanGirard/quivr/issues/896)) ([69a73f5](https://github.com/StanGirard/quivr/commit/69a73f5d5ae58dca9c23c0d8751f8c7326c84f4c)) +- add new chat page ([#890](https://github.com/StanGirard/quivr/issues/890)) ([c43e0c0](https://github.com/StanGirard/quivr/commit/c43e0c01c4ddcf0d97b9bb89784ff004fb7a0a79)) +- deleting brains on brain manager page ([#893](https://github.com/StanGirard/quivr/issues/893)) ([71e142b](https://github.com/StanGirard/quivr/commit/71e142ba3c164e5f14959cd1fd5de38531779034)) ### Bug Fixes -* **es:** spanish translations ([#895](https://github.com/StanGirard/quivr/issues/895)) ([69d0893](https://github.com/StanGirard/quivr/commit/69d08937de1540cf39a6462b4583b2c4c908d0af)) -* **sentry:** some unhandled errors ([#894](https://github.com/StanGirard/quivr/issues/894)) ([9ba7241](https://github.com/StanGirard/quivr/commit/9ba724168eacf4b074ad062f2a58b637597335ba)) +- **es:** spanish translations ([#895](https://github.com/StanGirard/quivr/issues/895)) ([69d0893](https://github.com/StanGirard/quivr/commit/69d08937de1540cf39a6462b4583b2c4c908d0af)) +- **sentry:** some unhandled errors ([#894](https://github.com/StanGirard/quivr/issues/894)) ([9ba7241](https://github.com/StanGirard/quivr/commit/9ba724168eacf4b074ad062f2a58b637597335ba)) ## [0.0.53](https://github.com/StanGirard/quivr/compare/v0.0.52...v0.0.53) (2023-08-07) - ### Features -* **backend:** add custom prompt ([#885](https://github.com/StanGirard/quivr/issues/885)) ([61cd0a6](https://github.com/StanGirard/quivr/commit/61cd0a6bde989bc9f931f47967c3bbddc3b0446b)) -* **fr:** added language ([#884](https://github.com/StanGirard/quivr/issues/884)) ([1160e16](https://github.com/StanGirard/quivr/commit/1160e160141f350a39ae4f73ff88ad79e1b1d874)) -* gpt4 is not available for brains if there is no given openAiKey ([#850](https://github.com/StanGirard/quivr/issues/850)) ([e9ebeef](https://github.com/StanGirard/quivr/commit/e9ebeef72ae2dee40b6bdff58121f9f9e1814577)) -* **qa:** improve code ([#886](https://github.com/StanGirard/quivr/issues/886)) ([7028505](https://github.com/StanGirard/quivr/commit/7028505571a8e1f8569a12b770b3ce99cd2ec4e0)) - +- **backend:** add custom prompt ([#885](https://github.com/StanGirard/quivr/issues/885)) ([61cd0a6](https://github.com/StanGirard/quivr/commit/61cd0a6bde989bc9f931f47967c3bbddc3b0446b)) +- **fr:** added language ([#884](https://github.com/StanGirard/quivr/issues/884)) ([1160e16](https://github.com/StanGirard/quivr/commit/1160e160141f350a39ae4f73ff88ad79e1b1d874)) +- gpt4 is not available for brains if there is no given openAiKey ([#850](https://github.com/StanGirard/quivr/issues/850)) ([e9ebeef](https://github.com/StanGirard/quivr/commit/e9ebeef72ae2dee40b6bdff58121f9f9e1814577)) +- **qa:** improve code ([#886](https://github.com/StanGirard/quivr/issues/886)) ([7028505](https://github.com/StanGirard/quivr/commit/7028505571a8e1f8569a12b770b3ce99cd2ec4e0)) ### Bug Fixes -* **i18n:** update tests for french and spanish ([#878](https://github.com/StanGirard/quivr/issues/878)) ([b0514d6](https://github.com/StanGirard/quivr/commit/b0514d6149d474747de642d12454f6b511a1f947)) +- **i18n:** update tests for french and spanish ([#878](https://github.com/StanGirard/quivr/issues/878)) ([b0514d6](https://github.com/StanGirard/quivr/commit/b0514d6149d474747de642d12454f6b511a1f947)) ## [0.0.52](https://github.com/StanGirard/quivr/compare/v0.0.51...v0.0.52) (2023-08-07) - ### Features -* add custom prompt fields on brain setting pages ([#837](https://github.com/StanGirard/quivr/issues/837)) ([99a3fa9](https://github.com/StanGirard/quivr/commit/99a3fa9b296520a71028194e21bc808a2ec208a0)) -* add public prompts picker ([#841](https://github.com/StanGirard/quivr/issues/841)) ([b3fb8fc](https://github.com/StanGirard/quivr/commit/b3fb8fc3bc2d71a72e73b4f0aa30c84255a77fc0)) -* remove private prompts on related brain delete ([#842](https://github.com/StanGirard/quivr/issues/842)) ([4c15fe2](https://github.com/StanGirard/quivr/commit/4c15fe2bfde7a2fdc59c299ef668f1ba0cd8ffa8)) - +- add custom prompt fields on brain setting pages ([#837](https://github.com/StanGirard/quivr/issues/837)) ([99a3fa9](https://github.com/StanGirard/quivr/commit/99a3fa9b296520a71028194e21bc808a2ec208a0)) +- add public prompts picker ([#841](https://github.com/StanGirard/quivr/issues/841)) ([b3fb8fc](https://github.com/StanGirard/quivr/commit/b3fb8fc3bc2d71a72e73b4f0aa30c84255a77fc0)) +- remove private prompts on related brain delete ([#842](https://github.com/StanGirard/quivr/issues/842)) ([4c15fe2](https://github.com/StanGirard/quivr/commit/4c15fe2bfde7a2fdc59c299ef668f1ba0cd8ffa8)) ### Bug Fixes -* **pg-database:** by default variable is not implemented ([#848](https://github.com/StanGirard/quivr/issues/848)) ([69e2c28](https://github.com/StanGirard/quivr/commit/69e2c289e5a6e4cfd6b7187a3c4fda5c538d5d35)) -* remove typo ([#853](https://github.com/StanGirard/quivr/issues/853)) ([5496e9d](https://github.com/StanGirard/quivr/commit/5496e9d738a1f80f11b6c8fa8606960abcbcd06d)) - +- **pg-database:** by default variable is not implemented ([#848](https://github.com/StanGirard/quivr/issues/848)) ([69e2c28](https://github.com/StanGirard/quivr/commit/69e2c289e5a6e4cfd6b7187a3c4fda5c538d5d35)) +- remove typo ([#853](https://github.com/StanGirard/quivr/issues/853)) ([5496e9d](https://github.com/StanGirard/quivr/commit/5496e9d738a1f80f11b6c8fa8606960abcbcd06d)) ### Performance Improvements -* **deps:** removed ([#873](https://github.com/StanGirard/quivr/issues/873)) ([10d4d65](https://github.com/StanGirard/quivr/commit/10d4d65c1e203aaae1069395ed5066fbfc9c7715)) +- **deps:** removed ([#873](https://github.com/StanGirard/quivr/issues/873)) ([10d4d65](https://github.com/StanGirard/quivr/commit/10d4d65c1e203aaae1069395ed5066fbfc9c7715)) ## [0.0.51](https://github.com/StanGirard/quivr/compare/v0.0.50...v0.0.51) (2023-08-03) - ### Features -* **backend:** implement brain-prompt link ([#831](https://github.com/StanGirard/quivr/issues/831)) ([4ca6c66](https://github.com/StanGirard/quivr/commit/4ca6c667da3d5daf0339c65f077c8956c7ef42e8)) -* **prompt:** add prompt table, entity and repository ([#823](https://github.com/StanGirard/quivr/issues/823)) ([e3b6114](https://github.com/StanGirard/quivr/commit/e3b6114248ee04a9dc6b93093256d82324672925)) - +- **backend:** implement brain-prompt link ([#831](https://github.com/StanGirard/quivr/issues/831)) ([4ca6c66](https://github.com/StanGirard/quivr/commit/4ca6c667da3d5daf0339c65f077c8956c7ef42e8)) +- **prompt:** add prompt table, entity and repository ([#823](https://github.com/StanGirard/quivr/issues/823)) ([e3b6114](https://github.com/StanGirard/quivr/commit/e3b6114248ee04a9dc6b93093256d82324672925)) ### Bug Fixes -* **chat routes:** HTTPException import correction ([#833](https://github.com/StanGirard/quivr/issues/833)) ([68f03b2](https://github.com/StanGirard/quivr/commit/68f03b2416f5b49e9f8e72c5b1c91754792a1233)) -* **chats:** delete chats from correct table ([#834](https://github.com/StanGirard/quivr/issues/834)) ([659e585](https://github.com/StanGirard/quivr/commit/659e585145ea0aa8bf88ecc48d31e0b65098a729)) -* **env:** added pg database url default value to none ([23f50ec](https://github.com/StanGirard/quivr/commit/23f50ec3a37af453f1b8b69592d1a640189d50e8)) +- **chat routes:** HTTPException import correction ([#833](https://github.com/StanGirard/quivr/issues/833)) ([68f03b2](https://github.com/StanGirard/quivr/commit/68f03b2416f5b49e9f8e72c5b1c91754792a1233)) +- **chats:** delete chats from correct table ([#834](https://github.com/StanGirard/quivr/issues/834)) ([659e585](https://github.com/StanGirard/quivr/commit/659e585145ea0aa8bf88ecc48d31e0b65098a729)) +- **env:** added pg database url default value to none ([23f50ec](https://github.com/StanGirard/quivr/commit/23f50ec3a37af453f1b8b69592d1a640189d50e8)) ## [0.0.50](https://github.com/StanGirard/quivr/compare/v0.0.49...v0.0.50) (2023-08-02) - ### Features -* Introduce repository pattern to prepare adding other database providers ([#646](https://github.com/StanGirard/quivr/issues/646)) ([303ba72](https://github.com/StanGirard/quivr/commit/303ba72028d349196b78cc07db627115ec0aff90)) -* **prompt:** added instructions in standalone question & a bit more things ([#826](https://github.com/StanGirard/quivr/issues/826)) ([c217979](https://github.com/StanGirard/quivr/commit/c21797905d7d57dab73f9b7047da1a50aae37b9b)) +- Introduce repository pattern to prepare adding other database providers ([#646](https://github.com/StanGirard/quivr/issues/646)) ([303ba72](https://github.com/StanGirard/quivr/commit/303ba72028d349196b78cc07db627115ec0aff90)) +- **prompt:** added instructions in standalone question & a bit more things ([#826](https://github.com/StanGirard/quivr/issues/826)) ([c217979](https://github.com/StanGirard/quivr/commit/c21797905d7d57dab73f9b7047da1a50aae37b9b)) ## [0.0.49](https://github.com/StanGirard/quivr/compare/v0.0.48...v0.0.49) (2023-08-01) - ### Features -* add chat config modal ([#807](https://github.com/StanGirard/quivr/issues/807)) ([d018ab6](https://github.com/StanGirard/quivr/commit/d018ab6a9334b45b86e0c7fed3a552f5cb202523)) - +- add chat config modal ([#807](https://github.com/StanGirard/quivr/issues/807)) ([d018ab6](https://github.com/StanGirard/quivr/commit/d018ab6a9334b45b86e0c7fed3a552f5cb202523)) ### Bug Fixes -* bugs ([#818](https://github.com/StanGirard/quivr/issues/818)) ([edcbb30](https://github.com/StanGirard/quivr/commit/edcbb30e97535013b61d5a94bb4204d030cba2f2)) +- bugs ([#818](https://github.com/StanGirard/quivr/issues/818)) ([edcbb30](https://github.com/StanGirard/quivr/commit/edcbb30e97535013b61d5a94bb4204d030cba2f2)) ## [0.0.48](https://github.com/StanGirard/quivr/compare/v0.0.47...v0.0.48) (2023-08-01) - ### Bug Fixes -* **openai:** user key now used for llm model ([c01433c](https://github.com/StanGirard/quivr/commit/c01433c84194e1d155ad3917de58257d24c30c38)) +- **openai:** user key now used for llm model ([c01433c](https://github.com/StanGirard/quivr/commit/c01433c84194e1d155ad3917de58257d24c30c38)) ## [0.0.47](https://github.com/StanGirard/quivr/compare/v0.0.46...v0.0.47) (2023-08-01) - ### Features -* add user level open ai key management ([#805](https://github.com/StanGirard/quivr/issues/805)) ([7532b55](https://github.com/StanGirard/quivr/commit/7532b558c74962e5916b951235e8578cc8e882a2)) -* **chat:** added streaming ([#808](https://github.com/StanGirard/quivr/issues/808)) ([3166d08](https://github.com/StanGirard/quivr/commit/3166d089ee82730882c26454bd110a3dfae067c9)) -* **llm:** removing all llms to prepare for genoss ([#804](https://github.com/StanGirard/quivr/issues/804)) ([db40f3c](https://github.com/StanGirard/quivr/commit/db40f3cccd596f4337823e0306e66224d5e1c8c9)) +- add user level open ai key management ([#805](https://github.com/StanGirard/quivr/issues/805)) ([7532b55](https://github.com/StanGirard/quivr/commit/7532b558c74962e5916b951235e8578cc8e882a2)) +- **chat:** added streaming ([#808](https://github.com/StanGirard/quivr/issues/808)) ([3166d08](https://github.com/StanGirard/quivr/commit/3166d089ee82730882c26454bd110a3dfae067c9)) +- **llm:** removing all llms to prepare for genoss ([#804](https://github.com/StanGirard/quivr/issues/804)) ([db40f3c](https://github.com/StanGirard/quivr/commit/db40f3cccd596f4337823e0306e66224d5e1c8c9)) ## [0.0.46](https://github.com/StanGirard/quivr/compare/v0.0.45...v0.0.46) (2023-07-31) - ### Features -* **aws:** increased numer of replicas to 10 ([9809ef4](https://github.com/StanGirard/quivr/commit/9809ef4119a2351b78217c73c545b7e327676135)) -* **aws:** increased size ([56f254a](https://github.com/StanGirard/quivr/commit/56f254a050fcc3b9ee073318bd566e03675658cd)) - +- **aws:** increased numer of replicas to 10 ([9809ef4](https://github.com/StanGirard/quivr/commit/9809ef4119a2351b78217c73c545b7e327676135)) +- **aws:** increased size ([56f254a](https://github.com/StanGirard/quivr/commit/56f254a050fcc3b9ee073318bd566e03675658cd)) ### Bug Fixes -* **frontend:** correctly display document information in explore view details ([#781](https://github.com/StanGirard/quivr/issues/781)) ([87c5e58](https://github.com/StanGirard/quivr/commit/87c5e582a2579ebb68f272cb62175dfa6f2e6dc8)) -* Toast message hidden under the footer ([#761](https://github.com/StanGirard/quivr/issues/761)) ([3e8ed46](https://github.com/StanGirard/quivr/commit/3e8ed463173659ebe599602e97c2d11191144ecb)) -* udpate migration script doc ([#793](https://github.com/StanGirard/quivr/issues/793)) ([a609c01](https://github.com/StanGirard/quivr/commit/a609c01aa8fab10e74eed64edd795c56bece1fdb)) +- **frontend:** correctly display document information in explore view details ([#781](https://github.com/StanGirard/quivr/issues/781)) ([87c5e58](https://github.com/StanGirard/quivr/commit/87c5e582a2579ebb68f272cb62175dfa6f2e6dc8)) +- Toast message hidden under the footer ([#761](https://github.com/StanGirard/quivr/issues/761)) ([3e8ed46](https://github.com/StanGirard/quivr/commit/3e8ed463173659ebe599602e97c2d11191144ecb)) +- udpate migration script doc ([#793](https://github.com/StanGirard/quivr/issues/793)) ([a609c01](https://github.com/StanGirard/quivr/commit/a609c01aa8fab10e74eed64edd795c56bece1fdb)) ## [0.0.45](https://github.com/StanGirard/quivr/compare/v0.0.44...v0.0.45) (2023-07-27) - ### Bug Fixes -* **release-please:** use personal token to be able to trigger release ([#789](https://github.com/StanGirard/quivr/issues/789)) ([2fcff0b](https://github.com/StanGirard/quivr/commit/2fcff0bedab3a53cb3dc395c0e362edb2962aaa7)) +- **release-please:** use personal token to be able to trigger release ([#789](https://github.com/StanGirard/quivr/issues/789)) ([2fcff0b](https://github.com/StanGirard/quivr/commit/2fcff0bedab3a53cb3dc395c0e362edb2962aaa7)) ## [0.0.44](https://github.com/StanGirard/quivr/compare/v0.0.43...v0.0.44) (2023-07-27) - ### Features -* **pr-title:** added pr-title checlk ([b11b2d8](https://github.com/StanGirard/quivr/commit/b11b2d8658fec3940bb0c0280124cbdd77d8d74b)) - +- **pr-title:** added pr-title checlk ([b11b2d8](https://github.com/StanGirard/quivr/commit/b11b2d8658fec3940bb0c0280124cbdd77d8d74b)) ### Bug Fixes -* **release-please:** fixed actions ([16114b2](https://github.com/StanGirard/quivr/commit/16114b2c5271ab299b7e84f5a9e552dab58cd211)) +- **release-please:** fixed actions ([16114b2](https://github.com/StanGirard/quivr/commit/16114b2c5271ab299b7e84f5a9e552dab58cd211)) ## [0.0.43](https://github.com/StanGirard/quivr/compare/v0.0.42...v0.0.43) (2023-07-26) - ### Features -* **workflow:** added release please ([e6ba9e8](https://github.com/StanGirard/quivr/commit/e6ba9e80f48a1d8822c99e5b77e064dc2b18e718)) +- **workflow:** added release please ([e6ba9e8](https://github.com/StanGirard/quivr/commit/e6ba9e80f48a1d8822c99e5b77e064dc2b18e718)) diff --git a/backend/.pre-commit-config.yaml b/backend/.pre-commit-config.yaml new file mode 100644 index 000000000000..e6c5dd4282f4 --- /dev/null +++ b/backend/.pre-commit-config.yaml @@ -0,0 +1,24 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: check-added-large-files + - id: check-toml + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + # Check poetry state + - repo: https://github.com/python-poetry/poetry + rev: "1.5.1" + hooks: + - id: poetry-check + args: ["-C", "./backend"] + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.4.8 + hooks: + # Run the linter. + - id: ruff + args: [--fix] + # Run the formatter. + - id: ruff-format diff --git a/backend/Dockerfile b/backend/Dockerfile index 78b448230558..78b9ea5497d2 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -31,8 +31,6 @@ RUN apt-get clean && apt-get update && apt-get install -y \ pandoc && \ rm -rf /var/lib/apt/lists/* -# Add Rust binaries to the PATH -ENV PATH="/root/.cargo/bin:${PATH}" RUN ARCHITECTURE=$(uname -m) && \ if [ "$ARCHITECTURE" = "x86_64" ]; then \ @@ -46,19 +44,31 @@ RUN ARCHITECTURE=$(uname -m) && \ fi && \ rm -rf /var/lib/apt/lists/* +RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \ + cd /usr/local/bin && \ + ln -s /opt/poetry/bin/poetry && \ + poetry config virtualenvs.create false + + +# Add Rust binaries to the PATH +ENV PATH="/root/.cargo/bin:${PATH}" \ + POETRY_CACHE_DIR=/tmp/poetry_cache \ + PYTHONDONTWRITEBYTECODE=1 + WORKDIR /code -# Copy just the requirements first -COPY ./requirements.txt . +# Copy pyproject and poetry +COPY ./pyproject.toml ./poetry.lock* /code/ + +# Run install +RUN poetry install --no-root && \ + playwright install --with-deps && \ + rm -rf $POETRY_CACHE_DIR -# Upgrade pip and install dependencies -RUN pip install --no-cache-dir --upgrade pip && \ - pip install --no-cache-dir -r requirements.txt && \ - playwright install --with-deps + +ENV PYTHONPATH=/code # Copy the rest of the application COPY . . EXPOSE 5050 - -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5050", "--workers", "6"] \ No newline at end of file diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev index 997baa08e15e..c9148c41aa6e 100644 --- a/backend/Dockerfile.dev +++ b/backend/Dockerfile.dev @@ -10,11 +10,8 @@ RUN apt-get clean && apt-get update && apt-get install -y \ libcurl4-openssl-dev \ libssl-dev \ binutils \ - pandoc \ curl \ git \ - poppler-utils \ - tesseract-ocr \ autoconf \ automake \ build-essential \ @@ -31,24 +28,29 @@ RUN apt-get clean && apt-get update && apt-get install -y \ pandoc && \ rm -rf /var/lib/apt/lists/* && apt-get clean +# TODO(@aminediro) : multistage build. Probably dont neet poetry once its built +# Install Poetry +RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \ + cd /usr/local/bin && \ + ln -s /opt/poetry/bin/poetry && \ + poetry config virtualenvs.create false + # Add Rust binaries to the PATH -ENV PATH="/root/.cargo/bin:${PATH}" +ENV PATH="/root/.cargo/bin:${PATH}" \ + POETRY_CACHE_DIR=/tmp/poetry_cache \ + PYTHONDONTWRITEBYTECODE=1 -# Copy just the requirements first -COPY ./requirements.txt . +WORKDIR /code -# Upgrade pip -RUN pip install --upgrade pip +# Copy pyproject and poetry +COPY ./pyproject.toml ./poetry.lock* /code/ -# Increase timeout to wait for the new installation -RUN pip install --no-cache-dir -r requirements.txt --timeout 200 && \ - playwright install --with-deps +# Run install +RUN poetry install --no-root && \ + playwright install --with-deps && \ + rm -rf $POETRY_CACHE_DIR -WORKDIR /code -# Copy the rest of the application -COPY . . +ENV PYTHONPATH=/code EXPOSE 5050 - -CMD ["uvicorn", "main:app","--reload", "--host", "0.0.0.0", "--port", "5050", "--workers", "6"] \ No newline at end of file diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 000000000000..91c0d1fc4554 --- /dev/null +++ b/backend/README.md @@ -0,0 +1 @@ +# Quivr backend diff --git a/backend/__init__.py b/backend/backend/__init__.py similarity index 100% rename from backend/__init__.py rename to backend/backend/__init__.py diff --git a/backend/celery_config.py b/backend/backend/celery_config.py similarity index 92% rename from backend/celery_config.py rename to backend/backend/celery_config.py index 85d093168f56..2f40d4e8892f 100644 --- a/backend/celery_config.py +++ b/backend/backend/celery_config.py @@ -40,5 +40,4 @@ else: raise ValueError(f"Unsupported broker URL: {CELERY_BROKER_URL}") - -celery.autodiscover_tasks(["modules.sync", "modules", "middlewares", "packages"]) +celery.autodiscover_tasks(["backend.modules.sync.tasks"]) diff --git a/backend/celery_worker.py b/backend/backend/celery_worker.py similarity index 89% rename from backend/celery_worker.py rename to backend/backend/celery_worker.py index 9f12502edc58..6fc8d20686f5 100644 --- a/backend/celery_worker.py +++ b/backend/backend/celery_worker.py @@ -4,24 +4,27 @@ from uuid import UUID from celery.schedules import crontab -from celery_config import celery -from logger import get_logger -from middlewares.auth.auth_bearer import AuthBearer -from models.files import File -from models.settings import get_supabase_client, get_supabase_db -from modules.brain.integrations.Notion.Notion_connector import NotionConnector -from modules.brain.service.brain_service import BrainService -from modules.brain.service.brain_vector_service import BrainVectorService -from modules.notification.dto.inputs import NotificationUpdatableProperties -from modules.notification.entity.notification import NotificationsStatusEnum -from modules.notification.service.notification_service import NotificationService -from modules.onboarding.service.onboarding_service import OnboardingService -from packages.files.crawl.crawler import CrawlWebsite, slugify -from packages.files.parsers.github import process_github -from packages.files.processors import filter_file -from packages.utils.telemetry import maybe_send_telemetry from pytz import timezone +from backend.celery_config import celery +from backend.logger import get_logger +from backend.middlewares.auth.auth_bearer import AuthBearer +from backend.models.files import File +from backend.models.settings import get_supabase_client, get_supabase_db +from backend.modules.brain.integrations.Notion.Notion_connector import NotionConnector +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.brain_vector_service import BrainVectorService +from backend.modules.notification.dto.inputs import NotificationUpdatableProperties +from backend.modules.notification.entity.notification import NotificationsStatusEnum +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.onboarding.service.onboarding_service import OnboardingService +from backend.packages.files.crawl.crawler import CrawlWebsite, slugify +from backend.packages.files.parsers.github import process_github +from backend.packages.files.processors import filter_file +from backend.packages.utils.telemetry import maybe_send_telemetry + logger = get_logger(__name__) onboardingService = OnboardingService() @@ -64,7 +67,7 @@ def process_file_and_notify( file_original_name, only_vectors=True ) - message = filter_file( + filter_file( file=file_instance, brain_id=brain_id, original_file_name=file_original_name, @@ -102,7 +105,6 @@ def process_crawl_and_notify( brain_id: UUID, notification_id=None, ): - crawl_website = CrawlWebsite(url=crawl_website_url) if not crawl_website.checkGithub(): @@ -123,7 +125,7 @@ def process_crawl_and_notify( file_size=len(extracted_content), file_extension=".txt", ) - message = filter_file( + filter_file( file=file_instance, brain_id=brain_id, original_file_name=crawl_website_url, @@ -136,7 +138,7 @@ def process_crawl_and_notify( ), ) else: - message = process_github( + process_github( repo=crawl_website.url, brain_id=brain_id, ) diff --git a/backend/logger.py b/backend/backend/logger.py similarity index 100% rename from backend/logger.py rename to backend/backend/logger.py diff --git a/backend/main.py b/backend/backend/main.py similarity index 71% rename from backend/main.py rename to backend/backend/main.py index ddb9d6f1eb90..b0735f62ac49 100644 --- a/backend/main.py +++ b/backend/backend/main.py @@ -6,29 +6,30 @@ from dotenv import load_dotenv # type: ignore from fastapi import FastAPI, HTTPException, Request from fastapi.responses import HTMLResponse, JSONResponse -from logger import get_logger -from middlewares.cors import add_cors_middleware -from modules.analytics.controller.analytics_routes import analytics_router -from modules.api_key.controller import api_key_router -from modules.assistant.controller import assistant_router -from modules.brain.controller import brain_router -from modules.chat.controller import chat_router -from modules.contact_support.controller import contact_router -from modules.knowledge.controller import knowledge_router -from modules.misc.controller import misc_router -from modules.onboarding.controller import onboarding_router -from modules.prompt.controller import prompt_router -from modules.sync.controller import sync_router -from modules.upload.controller import upload_router -from modules.user.controller import user_router -from packages.utils import handle_request_validation_error -from packages.utils.telemetry import maybe_send_telemetry from pyinstrument import Profiler -from routes.crawl_routes import crawl_router -from routes.subscription_routes import subscription_router from sentry_sdk.integrations.fastapi import FastApiIntegration from sentry_sdk.integrations.starlette import StarletteIntegration +from backend.logger import get_logger +from backend.middlewares.cors import add_cors_middleware +from backend.modules.analytics.controller.analytics_routes import analytics_router +from backend.modules.api_key.controller import api_key_router +from backend.modules.assistant.controller import assistant_router +from backend.modules.brain.controller import brain_router +from backend.modules.chat.controller import chat_router +from backend.modules.contact_support.controller import contact_router +from backend.modules.knowledge.controller import knowledge_router +from backend.modules.misc.controller import misc_router +from backend.modules.onboarding.controller import onboarding_router +from backend.modules.prompt.controller import prompt_router +from backend.modules.sync.controller import sync_router +from backend.modules.upload.controller import upload_router +from backend.modules.user.controller import user_router +from backend.packages.utils import handle_request_validation_error +from backend.packages.utils.telemetry import maybe_send_telemetry +from backend.routes.crawl_routes import crawl_router +from backend.routes.subscription_routes import subscription_router + load_dotenv() # Set the logging level for all loggers to WARNING @@ -68,7 +69,6 @@ def before_send(event, hint): ) app = FastAPI() - add_cors_middleware(app) app.include_router(brain_router) @@ -129,4 +129,4 @@ async def http_exception_handler(_, exc): # run main.py to debug backend import uvicorn - uvicorn.run(app, host="0.0.0.0", port=5050, log_level="warning", access_log=False) + uvicorn.run(app, host="0.0.0.0", port=5050, log_level="debug", access_log=False) diff --git a/backend/middlewares/__init__.py b/backend/backend/middlewares/__init__.py similarity index 100% rename from backend/middlewares/__init__.py rename to backend/backend/middlewares/__init__.py diff --git a/backend/middlewares/auth/__init__.py b/backend/backend/middlewares/auth/__init__.py similarity index 100% rename from backend/middlewares/auth/__init__.py rename to backend/backend/middlewares/auth/__init__.py diff --git a/backend/middlewares/auth/auth_bearer.py b/backend/backend/middlewares/auth/auth_bearer.py similarity index 84% rename from backend/middlewares/auth/auth_bearer.py rename to backend/backend/middlewares/auth/auth_bearer.py index 56da70ea7a8d..eb823318c698 100644 --- a/backend/middlewares/auth/auth_bearer.py +++ b/backend/backend/middlewares/auth/auth_bearer.py @@ -3,9 +3,10 @@ from fastapi import Depends, HTTPException, Request from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer -from middlewares.auth.jwt_token_handler import decode_access_token, verify_token -from modules.api_key.service.api_key_service import ApiKeyService -from modules.user.entity.user_identity import UserIdentity + +from backend.middlewares.auth.jwt_token_handler import decode_access_token, verify_token +from backend.modules.api_key.service.api_key_service import ApiKeyService +from backend.modules.user.entity.user_identity import UserIdentity api_key_service = ApiKeyService() @@ -54,7 +55,7 @@ async def authenticate( def get_test_user(self) -> UserIdentity: return UserIdentity( - email="test@example.com", id="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" # type: ignore + email="admin@quivr.app", id="39418e3b-0258-4452-af60-7acfcc1263ff" # type: ignore ) # replace with test user information diff --git a/backend/middlewares/auth/jwt_token_handler.py b/backend/backend/middlewares/auth/jwt_token_handler.py similarity index 94% rename from backend/middlewares/auth/jwt_token_handler.py rename to backend/backend/middlewares/auth/jwt_token_handler.py index 8a10a64b8372..dc08b7524cee 100644 --- a/backend/middlewares/auth/jwt_token_handler.py +++ b/backend/backend/middlewares/auth/jwt_token_handler.py @@ -4,7 +4,8 @@ from jose import jwt from jose.exceptions import JWTError -from modules.user.entity.user_identity import UserIdentity + +from backend.modules.user.entity.user_identity import UserIdentity SECRET_KEY = os.environ.get("JWT_SECRET_KEY") ALGORITHM = "HS256" diff --git a/backend/middlewares/cors.py b/backend/backend/middlewares/cors.py similarity index 100% rename from backend/middlewares/cors.py rename to backend/backend/middlewares/cors.py diff --git a/backend/models/databases/__init__.py b/backend/backend/models/__init__.py similarity index 100% rename from backend/models/databases/__init__.py rename to backend/backend/models/__init__.py diff --git a/backend/models/brains_subscription_invitations.py b/backend/backend/models/brains_subscription_invitations.py similarity index 72% rename from backend/models/brains_subscription_invitations.py rename to backend/backend/models/brains_subscription_invitations.py index 3691c42841c0..7057a26e23e0 100644 --- a/backend/models/brains_subscription_invitations.py +++ b/backend/backend/models/brains_subscription_invitations.py @@ -1,7 +1,8 @@ from uuid import UUID -from logger import get_logger -from pydantic import ConfigDict, BaseModel +from pydantic import BaseModel, ConfigDict + +from backend.logger import get_logger logger = get_logger(__name__) diff --git a/backend/modules/__init__.py b/backend/backend/models/databases/__init__.py similarity index 100% rename from backend/modules/__init__.py rename to backend/backend/models/databases/__init__.py diff --git a/backend/models/databases/llm_models.py b/backend/backend/models/databases/llm_models.py similarity index 91% rename from backend/models/databases/llm_models.py rename to backend/backend/models/databases/llm_models.py index 9beee133022c..00722817ca77 100644 --- a/backend/models/databases/llm_models.py +++ b/backend/backend/models/databases/llm_models.py @@ -1,7 +1,7 @@ from pydantic import BaseModel -class LLMModels(BaseModel): +class LLMModel(BaseModel): """LLM models stored in the database that are allowed to be used by the users. Args: BaseModel (BaseModel): Pydantic BaseModel diff --git a/backend/models/databases/repository.py b/backend/backend/models/databases/repository.py similarity index 95% rename from backend/models/databases/repository.py rename to backend/backend/models/databases/repository.py index 1c473ff75827..1b19d64ff552 100644 --- a/backend/models/databases/repository.py +++ b/backend/backend/models/databases/repository.py @@ -2,7 +2,7 @@ from datetime import datetime from uuid import UUID -from .llm_models import LLMModels +from .llm_models import LLMModel class Repository(ABC): @@ -15,7 +15,7 @@ def get_user_usage(self, user_id: UUID): pass @abstractmethod - def get_model_settings(self) -> LLMModels | None: + def get_models(self) -> LLMModel | None: pass @abstractmethod diff --git a/backend/backend/models/databases/supabase/__init__.py b/backend/backend/models/databases/supabase/__init__.py new file mode 100644 index 000000000000..e521e2081e12 --- /dev/null +++ b/backend/backend/models/databases/supabase/__init__.py @@ -0,0 +1,6 @@ +from backend.models.databases.supabase.brains_subscription_invitations import ( + BrainSubscription, +) +from backend.models.databases.supabase.files import File +from backend.models.databases.supabase.user_usage import UserUsage +from backend.models.databases.supabase.vectors import Vector diff --git a/backend/models/databases/supabase/brains_subscription_invitations.py b/backend/backend/models/databases/supabase/brains_subscription_invitations.py similarity index 92% rename from backend/models/databases/supabase/brains_subscription_invitations.py rename to backend/backend/models/databases/supabase/brains_subscription_invitations.py index a187d303fa06..0b4f781d7e56 100644 --- a/backend/models/databases/supabase/brains_subscription_invitations.py +++ b/backend/backend/models/databases/supabase/brains_subscription_invitations.py @@ -1,6 +1,5 @@ -from models.databases.repository import Repository - -from logger import get_logger +from backend.logger import get_logger +from backend.models.databases.repository import Repository logger = get_logger(__name__) diff --git a/backend/models/databases/supabase/files.py b/backend/backend/models/databases/supabase/files.py similarity index 93% rename from backend/models/databases/supabase/files.py rename to backend/backend/models/databases/supabase/files.py index 9c7f8bdd4fa9..c83d248f00cd 100644 --- a/backend/models/databases/supabase/files.py +++ b/backend/backend/models/databases/supabase/files.py @@ -1,4 +1,4 @@ -from models.databases.repository import Repository +from backend.models.databases.repository import Repository class File(Repository): diff --git a/backend/models/databases/supabase/supabase.py b/backend/backend/models/databases/supabase/supabase.py similarity index 75% rename from backend/models/databases/supabase/supabase.py rename to backend/backend/models/databases/supabase/supabase.py index ffe8ed54dee5..1b6cb132d0b9 100644 --- a/backend/models/databases/supabase/supabase.py +++ b/backend/backend/models/databases/supabase/supabase.py @@ -1,6 +1,7 @@ -from models.databases.supabase import BrainSubscription, File, UserUsage, Vector +from backend.models.databases.supabase import BrainSubscription, File, UserUsage, Vector +# TODO: REMOVE THIS CLASS ! class SupabaseDB( UserUsage, File, diff --git a/backend/models/databases/supabase/user_usage.py b/backend/backend/models/databases/supabase/user_usage.py similarity index 95% rename from backend/models/databases/supabase/user_usage.py rename to backend/backend/models/databases/supabase/user_usage.py index b335107ce22f..483bbe1a3965 100644 --- a/backend/models/databases/supabase/user_usage.py +++ b/backend/backend/models/databases/supabase/user_usage.py @@ -1,8 +1,8 @@ from datetime import datetime, timedelta from uuid import UUID -from logger import get_logger -from models.databases.repository import Repository +from backend.logger import get_logger +from backend.models.databases.repository import Repository logger = get_logger(__name__) @@ -55,18 +55,15 @@ def get_user_settings(self, user_id): return user_settings - def get_model_settings(self): - """ - Fetch the user settings from the database - """ - + def get_models(self): model_settings_response = (self.db.from_("models").select("*").execute()).data - if len(model_settings_response) == 0: raise ValueError("An issue occured while fetching the model settings") - return model_settings_response + def get_user_monthly(self, user_id): + pass + def get_user_usage(self, user_id): """ Fetch the user request stats from the database diff --git a/backend/models/databases/supabase/vectors.py b/backend/backend/models/databases/supabase/vectors.py similarity index 97% rename from backend/models/databases/supabase/vectors.py rename to backend/backend/models/databases/supabase/vectors.py index 5b16d49cf581..375e5f881b46 100644 --- a/backend/models/databases/supabase/vectors.py +++ b/backend/backend/models/databases/supabase/vectors.py @@ -1,4 +1,4 @@ -from models.databases.repository import Repository +from backend.models.databases.repository import Repository class Vector(Repository): diff --git a/backend/models/files.py b/backend/backend/models/files.py similarity index 90% rename from backend/models/files.py rename to backend/backend/models/files.py index 0ca20d2a3fb7..3fd689a2d0fa 100644 --- a/backend/models/files.py +++ b/backend/backend/models/files.py @@ -3,13 +3,14 @@ from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_core.documents import Document -from logger import get_logger -from models.databases.supabase.supabase import SupabaseDB -from models.settings import get_supabase_db -from modules.brain.service.brain_vector_service import BrainVectorService -from packages.files.file import compute_sha1_from_content from pydantic import BaseModel +from backend.logger import get_logger +from backend.models.databases.supabase.supabase import SupabaseDB +from backend.models.settings import get_supabase_db +from backend.modules.brain.service.brain_vector_service import BrainVectorService +from backend.packages.files.file import compute_sha1_from_content + logger = get_logger(__name__) diff --git a/backend/models/files_in_storage.py b/backend/backend/models/files_in_storage.py similarity index 100% rename from backend/models/files_in_storage.py rename to backend/backend/models/files_in_storage.py diff --git a/backend/models/settings.py b/backend/backend/models/settings.py similarity index 89% rename from backend/models/settings.py rename to backend/backend/models/settings.py index 4584e052fa94..54134a82c04b 100644 --- a/backend/models/settings.py +++ b/backend/backend/models/settings.py @@ -1,15 +1,18 @@ from typing import Optional from uuid import UUID +from langchain.embeddings.base import Embeddings from langchain_community.embeddings.ollama import OllamaEmbeddings +from langchain_community.vectorstores.supabase import SupabaseVectorStore from langchain_openai import OpenAIEmbeddings -from logger import get_logger -from models.databases.supabase.supabase import SupabaseDB from posthog import Posthog from pydantic_settings import BaseSettings, SettingsConfigDict from sqlalchemy import Engine, create_engine + +from backend.logger import get_logger +from backend.models.databases.supabase.supabase import SupabaseDB from supabase.client import Client, create_client -from langchain_community.vectorstores.supabase import SupabaseVectorStore + logger = get_logger(__name__) @@ -111,10 +114,11 @@ class BrainSettings(BaseSettings): supabase_service_key: str = "" resend_api_key: str = "null" resend_email_address: str = "brain@mail.quivr.app" - ollama_api_base_url: str = None - langfuse_public_key: str = None - langfuse_secret_key: str = None - pg_database_url: str = None + ollama_api_base_url: str | None = None + langfuse_public_key: str | None = None + langfuse_secret_key: str | None = None + pg_database_url: str + pg_database_async_url: str class ResendSettings(BaseSettings): @@ -126,22 +130,31 @@ class ResendSettings(BaseSettings): _supabase_client: Optional[Client] = None _supabase_db: Optional[SupabaseDB] = None _db_engine: Optional[Engine] = None +_embedding_service = None + +settings = BrainSettings() def get_pg_database_engine(): global _db_engine if _db_engine is None: logger.info("Creating Postgres DB engine") - settings = BrainSettings() # pyright: ignore reportPrivateUsage=none _db_engine = create_engine(settings.pg_database_url, pool_pre_ping=True) return _db_engine +def get_pg_database_async_engine(): + global _db_engine + if _db_engine is None: + logger.info("Creating Postgres DB engine") + _db_engine = create_engine(settings.pg_database_async_url, pool_pre_ping=True) + return _db_engine + + def get_supabase_client() -> Client: global _supabase_client if _supabase_client is None: logger.info("Creating Supabase client") - settings = BrainSettings() # pyright: ignore reportPrivateUsage=none _supabase_client = create_client( settings.supabase_url, settings.supabase_service_key ) @@ -156,8 +169,8 @@ def get_supabase_db() -> SupabaseDB: return _supabase_db -def get_embeddings(): - settings = BrainSettings() # pyright: ignore reportPrivateUsage=none +def get_embedding_client() -> Embeddings: + global _embedding_service if settings.ollama_api_base_url: embeddings = OllamaEmbeddings( base_url=settings.ollama_api_base_url, @@ -168,8 +181,7 @@ def get_embeddings(): def get_documents_vector_store() -> SupabaseVectorStore: - settings = BrainSettings() # pyright: ignore reportPrivateUsage=none - embeddings = get_embeddings() + embeddings = get_embedding_client() supabase_client: Client = get_supabase_client() documents_vector_store = SupabaseVectorStore( supabase_client, embeddings, table_name="vectors" diff --git a/backend/models/sqlalchemy_repository.py b/backend/backend/models/sqlalchemy_repository.py similarity index 100% rename from backend/models/sqlalchemy_repository.py rename to backend/backend/models/sqlalchemy_repository.py diff --git a/backend/modules/analytics/__init__.py b/backend/backend/modules/__init__.py similarity index 100% rename from backend/modules/analytics/__init__.py rename to backend/backend/modules/__init__.py diff --git a/backend/modules/analytics/controller/__init__.py b/backend/backend/modules/analytics/__init__.py similarity index 100% rename from backend/modules/analytics/controller/__init__.py rename to backend/backend/modules/analytics/__init__.py diff --git a/backend/modules/analytics/entity/__init__.py b/backend/backend/modules/analytics/controller/__init__.py similarity index 100% rename from backend/modules/analytics/entity/__init__.py rename to backend/backend/modules/analytics/controller/__init__.py diff --git a/backend/modules/analytics/controller/analytics_routes.py b/backend/backend/modules/analytics/controller/analytics_routes.py similarity index 61% rename from backend/modules/analytics/controller/analytics_routes.py rename to backend/backend/modules/analytics/controller/analytics_routes.py index ee67443e814f..9c9b51c348f1 100644 --- a/backend/modules/analytics/controller/analytics_routes.py +++ b/backend/backend/modules/analytics/controller/analytics_routes.py @@ -1,22 +1,25 @@ from uuid import UUID + from fastapi import APIRouter, Depends, Query -from middlewares.auth.auth_bearer import AuthBearer, get_current_user -from modules.analytics.entity.analytics import Range -from modules.analytics.service.analytics_service import AnalyticsService + +from backend.middlewares.auth.auth_bearer import AuthBearer, get_current_user +from backend.modules.analytics.entity.analytics import Range +from backend.modules.analytics.service.analytics_service import AnalyticsService analytics_service = AnalyticsService() analytics_router = APIRouter() + @analytics_router.get( "/analytics/brains-usages", dependencies=[Depends(AuthBearer())], tags=["Analytics"] ) async def get_brains_usages( user: UUID = Depends(get_current_user), brain_id: UUID = Query(None), - graph_range: Range = Query(Range.WEEK, alias="graph_range") + graph_range: Range = Query(Range.WEEK, alias="graph_range"), ): """ Get all user brains usages """ - return analytics_service.get_brains_usages(user.id, graph_range, brain_id) \ No newline at end of file + return analytics_service.get_brains_usages(user.id, graph_range, brain_id) diff --git a/backend/modules/analytics/repository/__init__.py b/backend/backend/modules/analytics/entity/__init__.py similarity index 100% rename from backend/modules/analytics/repository/__init__.py rename to backend/backend/modules/analytics/entity/__init__.py diff --git a/backend/modules/analytics/entity/analytics.py b/backend/backend/modules/analytics/entity/analytics.py similarity index 100% rename from backend/modules/analytics/entity/analytics.py rename to backend/backend/modules/analytics/entity/analytics.py diff --git a/backend/modules/analytics/service/__init__.py b/backend/backend/modules/analytics/repository/__init__.py similarity index 100% rename from backend/modules/analytics/service/__init__.py rename to backend/backend/modules/analytics/repository/__init__.py diff --git a/backend/modules/analytics/repository/analytics.py b/backend/backend/modules/analytics/repository/analytics.py similarity index 88% rename from backend/modules/analytics/repository/analytics.py rename to backend/backend/modules/analytics/repository/analytics.py index eafd9e4e845c..6df1987b11f6 100644 --- a/backend/modules/analytics/repository/analytics.py +++ b/backend/backend/modules/analytics/repository/analytics.py @@ -3,9 +3,9 @@ from typing import Optional from uuid import UUID -from models.settings import get_supabase_client -from modules.analytics.entity.analytics import BrainsUsages, Range, Usage -from modules.brain.service.brain_user_service import BrainUserService +from backend.models.settings import get_supabase_client +from backend.modules.analytics.entity.analytics import BrainsUsages, Range, Usage +from backend.modules.brain.service.brain_user_service import BrainUserService brain_user_service = BrainUserService() diff --git a/backend/modules/analytics/repository/analytics_interface.py b/backend/backend/modules/analytics/repository/analytics_interface.py similarity index 55% rename from backend/modules/analytics/repository/analytics_interface.py rename to backend/backend/modules/analytics/repository/analytics_interface.py index 096ae53067b1..9237435fdd93 100644 --- a/backend/modules/analytics/repository/analytics_interface.py +++ b/backend/backend/modules/analytics/repository/analytics_interface.py @@ -1,15 +1,22 @@ from abc import ABC, abstractmethod from typing import Optional from uuid import UUID -from modules.analytics.entity.analytics import BrainsUsages, Range + +from backend.modules.analytics.entity.analytics import BrainsUsages, Range + class AnalyticsInterface(ABC): @abstractmethod - def get_brains_usages(self, user_id: UUID, graph_range: Range = Range.WEEK, brain_id: Optional[UUID] = None) -> BrainsUsages: + def get_brains_usages( + self, + user_id: UUID, + graph_range: Range = Range.WEEK, + brain_id: Optional[UUID] = None, + ) -> BrainsUsages: """ Get user brains usage Args: user_id (UUID): The id of the user brain_id (Optional[UUID]): The id of the brain, optional """ - pass \ No newline at end of file + pass diff --git a/backend/modules/api_key/__init__.py b/backend/backend/modules/analytics/service/__init__.py similarity index 100% rename from backend/modules/api_key/__init__.py rename to backend/backend/modules/analytics/service/__init__.py diff --git a/backend/backend/modules/analytics/service/analytics_service.py b/backend/backend/modules/analytics/service/analytics_service.py new file mode 100644 index 000000000000..82921819d479 --- /dev/null +++ b/backend/backend/modules/analytics/service/analytics_service.py @@ -0,0 +1,13 @@ +from backend.modules.analytics.repository.analytics import Analytics +from backend.modules.analytics.repository.analytics_interface import AnalyticsInterface + + +class AnalyticsService: + repository: AnalyticsInterface + + def __init__(self): + self.repository = Analytics() + + def get_brains_usages(self, user_id, graph_range, brain_id=None): + + return self.repository.get_brains_usages(user_id, graph_range, brain_id) diff --git a/backend/modules/api_key/entity/__init__.py b/backend/backend/modules/api_key/__init__.py similarity index 100% rename from backend/modules/api_key/entity/__init__.py rename to backend/backend/modules/api_key/__init__.py diff --git a/backend/modules/api_key/controller/__init__.py b/backend/backend/modules/api_key/controller/__init__.py similarity index 100% rename from backend/modules/api_key/controller/__init__.py rename to backend/backend/modules/api_key/controller/__init__.py diff --git a/backend/modules/api_key/controller/api_key_routes.py b/backend/backend/modules/api_key/controller/api_key_routes.py similarity index 87% rename from backend/modules/api_key/controller/api_key_routes.py rename to backend/backend/modules/api_key/controller/api_key_routes.py index e252efd7b716..edccc09c92f7 100644 --- a/backend/modules/api_key/controller/api_key_routes.py +++ b/backend/backend/modules/api_key/controller/api_key_routes.py @@ -3,12 +3,13 @@ from uuid import uuid4 from fastapi import APIRouter, Depends -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.api_key.dto.outputs import ApiKeyInfo -from modules.api_key.entity.api_key import ApiKey -from modules.api_key.repository.api_keys import ApiKeys -from modules.user.entity.user_identity import UserIdentity + +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.api_key.dto.outputs import ApiKeyInfo +from backend.modules.api_key.entity.api_key import ApiKey +from backend.modules.api_key.repository.api_keys import ApiKeys +from backend.modules.user.entity.user_identity import UserIdentity logger = get_logger(__name__) diff --git a/backend/modules/api_key/dto/__init__.py b/backend/backend/modules/api_key/dto/__init__.py similarity index 100% rename from backend/modules/api_key/dto/__init__.py rename to backend/backend/modules/api_key/dto/__init__.py diff --git a/backend/modules/api_key/dto/outputs.py b/backend/backend/modules/api_key/dto/outputs.py similarity index 100% rename from backend/modules/api_key/dto/outputs.py rename to backend/backend/modules/api_key/dto/outputs.py diff --git a/backend/modules/api_key/repository/__init__.py b/backend/backend/modules/api_key/entity/__init__.py similarity index 100% rename from backend/modules/api_key/repository/__init__.py rename to backend/backend/modules/api_key/entity/__init__.py diff --git a/backend/modules/api_key/entity/api_key.py b/backend/backend/modules/api_key/entity/api_key.py similarity index 100% rename from backend/modules/api_key/entity/api_key.py rename to backend/backend/modules/api_key/entity/api_key.py diff --git a/backend/modules/api_key/service/__init__.py b/backend/backend/modules/api_key/repository/__init__.py similarity index 100% rename from backend/modules/api_key/service/__init__.py rename to backend/backend/modules/api_key/repository/__init__.py diff --git a/backend/modules/api_key/repository/api_key_interface.py b/backend/backend/modules/api_key/repository/api_key_interface.py similarity index 92% rename from backend/modules/api_key/repository/api_key_interface.py rename to backend/backend/modules/api_key/repository/api_key_interface.py index a53af1ab60b9..e4fb483d25ae 100644 --- a/backend/modules/api_key/repository/api_key_interface.py +++ b/backend/backend/modules/api_key/repository/api_key_interface.py @@ -2,7 +2,7 @@ from typing import List from uuid import UUID -from modules.api_key.entity.api_key import ApiKey +from backend.modules.api_key.entity.api_key import ApiKey class ApiKeysInterface(ABC): diff --git a/backend/modules/api_key/repository/api_keys.py b/backend/backend/modules/api_key/repository/api_keys.py similarity index 92% rename from backend/modules/api_key/repository/api_keys.py rename to backend/backend/modules/api_key/repository/api_keys.py index ea9f96847105..5ae6ebc16e02 100644 --- a/backend/modules/api_key/repository/api_keys.py +++ b/backend/backend/modules/api_key/repository/api_keys.py @@ -2,9 +2,9 @@ from typing import Optional from uuid import UUID -from models.settings import get_supabase_client -from modules.api_key.entity.api_key import ApiKey -from modules.api_key.repository.api_key_interface import ApiKeysInterface +from backend.models.settings import get_supabase_client +from backend.modules.api_key.entity.api_key import ApiKey +from backend.modules.api_key.repository.api_key_interface import ApiKeysInterface class ApiKeys(ApiKeysInterface): diff --git a/backend/modules/assistant/__init__.py b/backend/backend/modules/api_key/service/__init__.py similarity index 100% rename from backend/modules/assistant/__init__.py rename to backend/backend/modules/api_key/service/__init__.py diff --git a/backend/modules/api_key/service/api_key_service.py b/backend/backend/modules/api_key/service/api_key_service.py similarity index 83% rename from backend/modules/api_key/service/api_key_service.py rename to backend/backend/modules/api_key/service/api_key_service.py index 6e7691fa2edf..a16ff1964762 100644 --- a/backend/modules/api_key/service/api_key_service.py +++ b/backend/backend/modules/api_key/service/api_key_service.py @@ -1,11 +1,12 @@ from datetime import datetime from fastapi import HTTPException -from logger import get_logger -from modules.api_key.repository.api_key_interface import ApiKeysInterface -from modules.api_key.repository.api_keys import ApiKeys -from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_service import UserService + +from backend.logger import get_logger +from backend.modules.api_key.repository.api_key_interface import ApiKeysInterface +from backend.modules.api_key.repository.api_keys import ApiKeys +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.service.user_service import UserService logger = get_logger(__name__) diff --git a/backend/modules/api_key/tests/test_api_key.py b/backend/backend/modules/api_key/tests/test_api_key.py similarity index 100% rename from backend/modules/api_key/tests/test_api_key.py rename to backend/backend/modules/api_key/tests/test_api_key.py diff --git a/backend/modules/assistant/dto/__init__.py b/backend/backend/modules/assistant/__init__.py similarity index 100% rename from backend/modules/assistant/dto/__init__.py rename to backend/backend/modules/assistant/__init__.py diff --git a/backend/modules/assistant/controller/__init__.py b/backend/backend/modules/assistant/controller/__init__.py similarity index 100% rename from backend/modules/assistant/controller/__init__.py rename to backend/backend/modules/assistant/controller/__init__.py diff --git a/backend/modules/assistant/controller/assistant_routes.py b/backend/backend/modules/assistant/controller/assistant_routes.py similarity index 76% rename from backend/modules/assistant/controller/assistant_routes.py rename to backend/backend/modules/assistant/controller/assistant_routes.py index 4cdd6f6c8117..45a25bbd58e4 100644 --- a/backend/modules/assistant/controller/assistant_routes.py +++ b/backend/backend/modules/assistant/controller/assistant_routes.py @@ -1,14 +1,15 @@ from typing import List from fastapi import APIRouter, Depends, HTTPException, UploadFile -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.assistant.dto.inputs import InputAssistant -from modules.assistant.dto.outputs import AssistantOutput -from modules.assistant.ito.difference import DifferenceAssistant -from modules.assistant.ito.summary import SummaryAssistant, summary_inputs -from modules.assistant.service.assistant import Assistant -from modules.user.entity.user_identity import UserIdentity + +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.assistant.dto.inputs import InputAssistant +from backend.modules.assistant.dto.outputs import AssistantOutput +from backend.modules.assistant.ito.difference import DifferenceAssistant +from backend.modules.assistant.ito.summary import SummaryAssistant, summary_inputs +from backend.modules.assistant.service.assistant import Assistant +from backend.modules.user.entity.user_identity import UserIdentity assistant_router = APIRouter() logger = get_logger(__name__) diff --git a/backend/modules/assistant/ito/__init__.py b/backend/backend/modules/assistant/dto/__init__.py similarity index 100% rename from backend/modules/assistant/ito/__init__.py rename to backend/backend/modules/assistant/dto/__init__.py diff --git a/backend/modules/assistant/dto/inputs.py b/backend/backend/modules/assistant/dto/inputs.py similarity index 100% rename from backend/modules/assistant/dto/inputs.py rename to backend/backend/modules/assistant/dto/inputs.py diff --git a/backend/modules/assistant/dto/outputs.py b/backend/backend/modules/assistant/dto/outputs.py similarity index 100% rename from backend/modules/assistant/dto/outputs.py rename to backend/backend/modules/assistant/dto/outputs.py diff --git a/backend/modules/assistant/entity/__init__.py b/backend/backend/modules/assistant/entity/__init__.py similarity index 100% rename from backend/modules/assistant/entity/__init__.py rename to backend/backend/modules/assistant/entity/__init__.py diff --git a/backend/modules/assistant/entity/assistant.py b/backend/backend/modules/assistant/entity/assistant.py similarity index 100% rename from backend/modules/assistant/entity/assistant.py rename to backend/backend/modules/assistant/entity/assistant.py diff --git a/backend/modules/assistant/ito/utils/__init__.py b/backend/backend/modules/assistant/ito/__init__.py similarity index 100% rename from backend/modules/assistant/ito/utils/__init__.py rename to backend/backend/modules/assistant/ito/__init__.py diff --git a/backend/modules/assistant/ito/audio_transcript.py b/backend/backend/modules/assistant/ito/audio_transcript.py similarity index 94% rename from backend/modules/assistant/ito/audio_transcript.py rename to backend/backend/modules/assistant/ito/audio_transcript.py index 8ae8c204482f..d13af5096dad 100644 --- a/backend/modules/assistant/ito/audio_transcript.py +++ b/backend/backend/modules/assistant/ito/audio_transcript.py @@ -1,8 +1,10 @@ import os from tempfile import NamedTemporaryFile -from logger import get_logger -from modules.assistant.dto.outputs import ( +from openai import OpenAI + +from backend.logger import get_logger +from backend.modules.assistant.dto.outputs import ( AssistantOutput, InputFile, Inputs, @@ -10,8 +12,7 @@ OutputEmail, Outputs, ) -from modules.assistant.ito.ito import ITO -from openai import OpenAI +from backend.modules.assistant.ito.ito import ITO logger = get_logger(__name__) diff --git a/backend/modules/assistant/ito/crawler.py b/backend/backend/modules/assistant/ito/crawler.py similarity index 92% rename from backend/modules/assistant/ito/crawler.py rename to backend/backend/modules/assistant/ito/crawler.py index 891421e4b2a0..c340f57d9913 100644 --- a/backend/modules/assistant/ito/crawler.py +++ b/backend/backend/modules/assistant/ito/crawler.py @@ -1,7 +1,8 @@ from bs4 import BeautifulSoup as Soup from langchain_community.document_loaders.recursive_url_loader import RecursiveUrlLoader -from logger import get_logger -from modules.assistant.dto.outputs import ( + +from backend.logger import get_logger +from backend.modules.assistant.dto.outputs import ( AssistantOutput, Inputs, InputUrl, @@ -9,7 +10,7 @@ OutputEmail, Outputs, ) -from modules.assistant.ito.ito import ITO +from backend.modules.assistant.ito.ito import ITO logger = get_logger(__name__) diff --git a/backend/modules/assistant/ito/difference.py b/backend/backend/modules/assistant/ito/difference.py similarity index 95% rename from backend/modules/assistant/ito/difference.py rename to backend/backend/modules/assistant/ito/difference.py index 16fddc98cc71..cb47549868b0 100644 --- a/backend/modules/assistant/ito/difference.py +++ b/backend/backend/modules/assistant/ito/difference.py @@ -11,9 +11,10 @@ from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate, PromptTemplate from llama_parse import LlamaParse -from logger import get_logger -from modules.assistant.dto.inputs import InputAssistant -from modules.assistant.dto.outputs import ( + +from backend.logger import get_logger +from backend.modules.assistant.dto.inputs import InputAssistant +from backend.modules.assistant.dto.outputs import ( AssistantOutput, InputFile, Inputs, @@ -21,8 +22,8 @@ OutputEmail, Outputs, ) -from modules.assistant.ito.ito import ITO -from modules.user.entity.user_identity import UserIdentity +from backend.modules.assistant.ito.ito import ITO +from backend.modules.user.entity.user_identity import UserIdentity if not isinstance(asyncio.get_event_loop(), uvloop.Loop): nest_asyncio.apply() diff --git a/backend/modules/assistant/ito/ito.py b/backend/backend/modules/assistant/ito/ito.py similarity index 91% rename from backend/modules/assistant/ito/ito.py rename to backend/backend/modules/assistant/ito/ito.py index dc008178113a..a7ea04d14007 100644 --- a/backend/modules/assistant/ito/ito.py +++ b/backend/backend/modules/assistant/ito/ito.py @@ -8,18 +8,19 @@ from typing import List, Optional from fastapi import UploadFile -from logger import get_logger -from modules.assistant.dto.inputs import InputAssistant -from modules.assistant.ito.utils.pdf_generator import PDFGenerator, PDFModel -from modules.chat.controller.chat.utils import update_user_usage -from modules.contact_support.controller.settings import ContactsSettings -from modules.upload.controller.upload_routes import upload_file -from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_usage import UserUsage -from packages.emails.send_email import send_email from pydantic import BaseModel from unidecode import unidecode +from backend.logger import get_logger +from backend.modules.assistant.dto.inputs import InputAssistant +from backend.modules.assistant.ito.utils.pdf_generator import PDFGenerator, PDFModel +from backend.modules.chat.controller.chat.utils import update_user_usage +from backend.modules.contact_support.controller.settings import ContactsSettings +from backend.modules.upload.controller.upload_routes import upload_file +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.service.user_usage import UserUsage +from backend.packages.emails.send_email import send_email + logger = get_logger(__name__) diff --git a/backend/modules/assistant/ito/summary.py b/backend/backend/modules/assistant/ito/summary.py similarity index 96% rename from backend/modules/assistant/ito/summary.py rename to backend/backend/modules/assistant/ito/summary.py index 4c713aa2f95c..179b6162e27a 100644 --- a/backend/modules/assistant/ito/summary.py +++ b/backend/backend/modules/assistant/ito/summary.py @@ -12,9 +12,10 @@ from langchain_community.document_loaders import UnstructuredPDFLoader from langchain_core.prompts import PromptTemplate from langchain_text_splitters import CharacterTextSplitter -from logger import get_logger -from modules.assistant.dto.inputs import InputAssistant -from modules.assistant.dto.outputs import ( + +from backend.logger import get_logger +from backend.modules.assistant.dto.inputs import InputAssistant +from backend.modules.assistant.dto.outputs import ( AssistantOutput, InputFile, Inputs, @@ -22,8 +23,8 @@ OutputEmail, Outputs, ) -from modules.assistant.ito.ito import ITO -from modules.user.entity.user_identity import UserIdentity +from backend.modules.assistant.ito.ito import ITO +from backend.modules.user.entity.user_identity import UserIdentity logger = get_logger(__name__) diff --git a/backend/modules/assistant/service/__init__.py b/backend/backend/modules/assistant/ito/utils/__init__.py similarity index 100% rename from backend/modules/assistant/service/__init__.py rename to backend/backend/modules/assistant/ito/utils/__init__.py diff --git a/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Bold.ttf b/backend/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Bold.ttf similarity index 100% rename from backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Bold.ttf rename to backend/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Bold.ttf diff --git a/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Oblique.ttf b/backend/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Oblique.ttf similarity index 100% rename from backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Oblique.ttf rename to backend/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed-Oblique.ttf diff --git a/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed.ttf b/backend/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed.ttf similarity index 100% rename from backend/modules/assistant/ito/utils/font/DejaVuSansCondensed.ttf rename to backend/backend/modules/assistant/ito/utils/font/DejaVuSansCondensed.ttf diff --git a/backend/modules/assistant/ito/utils/logo.png b/backend/backend/modules/assistant/ito/utils/logo.png similarity index 100% rename from backend/modules/assistant/ito/utils/logo.png rename to backend/backend/modules/assistant/ito/utils/logo.png diff --git a/backend/modules/assistant/ito/utils/pdf_generator.py b/backend/backend/modules/assistant/ito/utils/pdf_generator.py similarity index 100% rename from backend/modules/assistant/ito/utils/pdf_generator.py rename to backend/backend/modules/assistant/ito/utils/pdf_generator.py diff --git a/backend/modules/assistant/repository/__init__.py b/backend/backend/modules/assistant/repository/__init__.py similarity index 100% rename from backend/modules/assistant/repository/__init__.py rename to backend/backend/modules/assistant/repository/__init__.py diff --git a/backend/modules/assistant/repository/assistant_interface.py b/backend/backend/modules/assistant/repository/assistant_interface.py similarity index 81% rename from backend/modules/assistant/repository/assistant_interface.py rename to backend/backend/modules/assistant/repository/assistant_interface.py index 45eab68bf687..baa8276769a3 100644 --- a/backend/modules/assistant/repository/assistant_interface.py +++ b/backend/backend/modules/assistant/repository/assistant_interface.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import List -from modules.assistant.entity.assistant import AssistantEntity +from backend.modules.assistant.entity.assistant import AssistantEntity class AssistantInterface(ABC): diff --git a/backend/modules/authorization/utils/__init__.py b/backend/backend/modules/assistant/service/__init__.py similarity index 100% rename from backend/modules/authorization/utils/__init__.py rename to backend/backend/modules/assistant/service/__init__.py diff --git a/backend/modules/assistant/service/assistant.py b/backend/backend/modules/assistant/service/assistant.py similarity index 75% rename from backend/modules/assistant/service/assistant.py rename to backend/backend/modules/assistant/service/assistant.py index 2090398349f5..d1ade5b6d955 100644 --- a/backend/modules/assistant/service/assistant.py +++ b/backend/backend/modules/assistant/service/assistant.py @@ -1,6 +1,6 @@ -from models.settings import get_supabase_client -from modules.assistant.entity.assistant import AssistantEntity -from modules.assistant.repository.assistant_interface import AssistantInterface +from backend.models.settings import get_supabase_client +from backend.modules.assistant.entity.assistant import AssistantEntity +from backend.modules.assistant.repository.assistant_interface import AssistantInterface class Assistant(AssistantInterface): diff --git a/backend/modules/brain/__init__.py b/backend/backend/modules/authorization/utils/__init__.py similarity index 100% rename from backend/modules/brain/__init__.py rename to backend/backend/modules/authorization/utils/__init__.py diff --git a/backend/backend/modules/base_repository.py b/backend/backend/modules/base_repository.py new file mode 100644 index 000000000000..39f75256765c --- /dev/null +++ b/backend/backend/modules/base_repository.py @@ -0,0 +1,113 @@ +from typing import Any, Generic, Sequence, TypeVar +from uuid import UUID + +from fastapi import HTTPException +from pydantic import BaseModel +from sqlalchemy import exc +from sqlmodel import SQLModel, col, select +from sqlmodel.ext.asyncio.session import AsyncSession + +from backend.modules.base_uuid_entity import BaseUUIDModel + +ModelType = TypeVar("ModelType", bound=BaseUUIDModel) +CreateSchema = TypeVar("CreateSchema", bound=BaseModel) +UpdateSchema = TypeVar("UpdateSchema", bound=BaseModel) +T = TypeVar("T", bound=SQLModel) + + +class BaseCRUDRepository(Generic[ModelType, CreateSchema, UpdateSchema]): + def __init__(self, model: type[ModelType], session: AsyncSession): + """ + Base repository for default CRUD operations + """ + self.model = model + self.session = session + + def get_db(self) -> AsyncSession: + return self.session + + async def get_by_id( + self, *, id: UUID, db_session: AsyncSession + ) -> ModelType | None: + query = select(self.model).where(self.model.id == id) + response = await db_session.exec(query) + return response.one() + + async def get_by_ids( + self, + *, + list_ids: list[UUID], + db_session: AsyncSession | None = None, + ) -> Sequence[ModelType] | None: + db_session = db_session or self.session + response = await db_session.exec( + select(self.model).where(col(self.model.id).in_(list_ids)) + ) + return response.all() + + async def get_multi( + self, + *, + skip: int = 0, + limit: int = 100, + db_session: AsyncSession | None = None, + ) -> Sequence[ModelType]: + db_session = db_session or self.session + query = select(self.model).offset(skip).limit(limit) + response = await db_session.exec(query) + return response.all() + + async def create( + self, + *, + entity: CreateSchema | ModelType, + db_session: AsyncSession | None = None, + ) -> ModelType: + db_session = db_session or self.session + db_obj = self.model.model_validate(entity) # type: ignore + + try: + db_session.add(db_obj) + await db_session.commit() + except exc.IntegrityError: + await db_session.rollback() + # TODO(@aminediro) : for now, build an exception system + raise HTTPException( + status_code=409, + detail="Resource already exists", + ) + await db_session.refresh(db_obj) + return db_obj + + async def update( + self, + *, + obj_current: ModelType, + obj_new: UpdateSchema | dict[str, Any] | ModelType, + db_session: AsyncSession | None = None, + ) -> ModelType: + db_session = db_session or self.session + + if isinstance(obj_new, dict): + update_data = obj_new + else: + update_data = obj_new.dict( + exclude_unset=True + ) # This tells Pydantic to not include the values that were not sent + for field in update_data: + setattr(obj_current, field, update_data[field]) + + db_session.add(obj_current) + await db_session.commit() + await db_session.refresh(obj_current) + return obj_current + + async def remove( + self, *, id: UUID | str, db_session: AsyncSession | None = None + ) -> ModelType: + db_session = db_session or self.session + response = await db_session.exec(select(self.model).where(self.model.id == id)) + obj = response.one() + await db_session.delete(obj) + await db_session.commit() + return obj diff --git a/backend/backend/modules/base_uuid_entity.py b/backend/backend/modules/base_uuid_entity.py new file mode 100644 index 000000000000..e402ff6dc7b9 --- /dev/null +++ b/backend/backend/modules/base_uuid_entity.py @@ -0,0 +1,11 @@ +from uuid import UUID + +from sqlmodel import Field, SQLModel + + +class BaseUUIDModel(SQLModel, table=True): + id: UUID = Field( + primary_key=True, + index=True, + nullable=False, + ) diff --git a/backend/modules/brain/dto/__init__.py b/backend/backend/modules/brain/__init__.py similarity index 100% rename from backend/modules/brain/dto/__init__.py rename to backend/backend/modules/brain/__init__.py diff --git a/backend/modules/brain/api_brain_qa.py b/backend/backend/modules/brain/api_brain_qa.py similarity index 93% rename from backend/modules/brain/api_brain_qa.py rename to backend/backend/modules/brain/api_brain_qa.py index 1b9512c522ae..19352c7f8b51 100644 --- a/backend/modules/brain/api_brain_qa.py +++ b/backend/backend/modules/brain/api_brain_qa.py @@ -6,21 +6,23 @@ import requests from fastapi import HTTPException from litellm import completion -from modules.brain.service.call_brain_api import call_brain_api -from modules.brain.service.get_api_brain_definition_as_json_schema import ( + +from backend.logger import get_logger +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.brain.qa_interface import QAInterface +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.call_brain_api import call_brain_api +from backend.modules.brain.service.get_api_brain_definition_as_json_schema import ( get_api_brain_definition_as_json_schema, ) -from logger import get_logger -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.brain.qa_interface import QAInterface -from modules.brain.service.brain_service import BrainService -from modules.chat.dto.chats import ChatQuestion -from modules.chat.dto.inputs import CreateChatHistory -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.chat.service.chat_service import ChatService +from backend.modules.chat.dto.chats import ChatQuestion +from backend.modules.chat.dto.inputs import CreateChatHistory +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service brain_service = BrainService() -chat_service = ChatService() +chat_service = get_service(ChatService)() logger = get_logger(__name__) @@ -275,9 +277,9 @@ async def generate_stream( "message_time": streamed_chat_history.message_time, "user_message": question.question, "assistant": "", - "prompt_title": self.prompt_to_use.title - if self.prompt_to_use - else None, + "prompt_title": ( + self.prompt_to_use.title if self.prompt_to_use else None + ), "brain_name": brain.name if brain else None, "brain_id": str(self.brain_id), "metadata": self.metadata, @@ -291,9 +293,9 @@ async def generate_stream( "message_time": None, "user_message": question.question, "assistant": "", - "prompt_title": self.prompt_to_use.title - if self.prompt_to_use - else None, + "prompt_title": ( + self.prompt_to_use.title if self.prompt_to_use else None + ), "brain_name": brain.name if brain else None, "brain_id": str(self.brain_id), "metadata": self.metadata, @@ -474,9 +476,9 @@ def generate_answer( "user_message": question.question, "assistant": answer, "message_time": new_chat.message_time, - "prompt_title": self.prompt_to_use.title - if self.prompt_to_use - else None, + "prompt_title": ( + self.prompt_to_use.title if self.prompt_to_use else None + ), "brain_name": brain.name if brain else None, "message_id": new_chat.message_id, "metadata": self.metadata, diff --git a/backend/modules/brain/composite_brain_qa.py b/backend/backend/modules/brain/composite_brain_qa.py similarity index 96% rename from backend/modules/brain/composite_brain_qa.py rename to backend/backend/modules/brain/composite_brain_qa.py index 643a3caa632a..1234f3cb321d 100644 --- a/backend/modules/brain/composite_brain_qa.py +++ b/backend/backend/modules/brain/composite_brain_qa.py @@ -4,24 +4,26 @@ from fastapi import HTTPException from litellm import completion -from logger import get_logger -from modules.brain.api_brain_qa import APIBrainQA -from modules.brain.entity.brain_entity import BrainEntity, BrainType -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.brain.qa_headless import HeadlessQA -from modules.brain.service.brain_service import BrainService -from modules.chat.dto.chats import ChatQuestion -from modules.chat.dto.inputs import CreateChatHistory -from modules.chat.dto.outputs import ( + +from backend.logger import get_logger +from backend.modules.brain.api_brain_qa import APIBrainQA +from backend.modules.brain.entity.brain_entity import BrainEntity, BrainType +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.brain.qa_headless import HeadlessQA +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.chat.dto.chats import ChatQuestion +from backend.modules.chat.dto.inputs import CreateChatHistory +from backend.modules.chat.dto.outputs import ( BrainCompletionOutput, CompletionMessage, CompletionResponse, GetChatHistoryOutput, ) -from modules.chat.service.chat_service import ChatService +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service brain_service = BrainService() -chat_service = ChatService() +chat_service = get_service(ChatService)() logger = get_logger(__name__) @@ -75,9 +77,9 @@ def __init__( self.user_id = user_id def get_answer_generator_from_brain_type(self, brain: BrainEntity): - if brain.brain_type == BrainType.COMPOSITE: + if brain.brain_type == BrainType.composite: return self.generate_answer - elif brain.brain_type == BrainType.API: + elif brain.brain_type == BrainType.api: return APIBrainQA( brain_id=str(brain.id), chat_id=self.chat_id, @@ -90,7 +92,7 @@ def get_answer_generator_from_brain_type(self, brain: BrainEntity): raw=brain.raw, jq_instructions=brain.jq_instructions, ).generate_answer - elif brain.brain_type == BrainType.DOC: + elif brain.brain_type == BrainType.doc: return KnowledgeBrainQA( brain_id=str(brain.id), chat_id=self.chat_id, diff --git a/backend/modules/brain/controller/__init__.py b/backend/backend/modules/brain/controller/__init__.py similarity index 100% rename from backend/modules/brain/controller/__init__.py rename to backend/backend/modules/brain/controller/__init__.py diff --git a/backend/modules/brain/controller/brain_routes.py b/backend/backend/modules/brain/controller/brain_routes.py similarity index 87% rename from backend/modules/brain/controller/brain_routes.py rename to backend/backend/modules/brain/controller/brain_routes.py index 3d5a2765912c..ad4e5277577f 100644 --- a/backend/modules/brain/controller/brain_routes.py +++ b/backend/backend/modules/brain/controller/brain_routes.py @@ -2,28 +2,31 @@ from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Request -from logger import get_logger -from middlewares.auth.auth_bearer import AuthBearer, get_current_user -from modules.brain.dto.inputs import ( + +from backend.logger import get_logger +from backend.middlewares.auth.auth_bearer import AuthBearer, get_current_user +from backend.modules.brain.dto.inputs import ( BrainQuestionRequest, BrainUpdatableProperties, CreateBrainProperties, ) -from modules.brain.entity.brain_entity import PublicBrain, RoleEnum -from modules.brain.entity.integration_brain import IntegrationDescriptionEntity -from modules.brain.service.brain_authorization_service import has_brain_authorization -from modules.brain.service.brain_service import BrainService -from modules.brain.service.brain_user_service import BrainUserService -from modules.brain.service.get_question_context_from_brain import ( +from backend.modules.brain.entity.brain_entity import PublicBrain, RoleEnum +from backend.modules.brain.entity.integration_brain import IntegrationDescriptionEntity +from backend.modules.brain.service.brain_authorization_service import ( + has_brain_authorization, +) +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.brain_user_service import BrainUserService +from backend.modules.brain.service.get_question_context_from_brain import ( get_question_context_from_brain, ) -from modules.brain.service.integration_brain_service import ( +from backend.modules.brain.service.integration_brain_service import ( IntegrationBrainDescriptionService, ) -from modules.prompt.service.prompt_service import PromptService -from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_usage import UserUsage -from packages.utils.telemetry import maybe_send_telemetry +from backend.modules.prompt.service.prompt_service import PromptService +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.service.user_usage import UserUsage +from backend.packages.utils.telemetry import maybe_send_telemetry logger = get_logger(__name__) brain_router = APIRouter() diff --git a/backend/modules/brain/integrations/Big/__init__.py b/backend/backend/modules/brain/dto/__init__.py similarity index 100% rename from backend/modules/brain/integrations/Big/__init__.py rename to backend/backend/modules/brain/dto/__init__.py diff --git a/backend/modules/brain/dto/inputs.py b/backend/backend/modules/brain/dto/inputs.py similarity index 88% rename from backend/modules/brain/dto/inputs.py rename to backend/backend/modules/brain/dto/inputs.py index ccfd6b96bb5c..ea2970cebe75 100644 --- a/backend/modules/brain/dto/inputs.py +++ b/backend/backend/modules/brain/dto/inputs.py @@ -1,16 +1,17 @@ from typing import Optional from uuid import UUID -from logger import get_logger -from modules.brain.entity.api_brain_definition_entity import ( +from pydantic import BaseModel + +from backend.logger import get_logger +from backend.modules.brain.entity.api_brain_definition_entity import ( ApiBrainAllowedMethods, ApiBrainDefinitionEntity, ApiBrainDefinitionSchema, ApiBrainDefinitionSecret, ) -from modules.brain.entity.brain_entity import BrainType -from modules.brain.entity.integration_brain import IntegrationType -from pydantic import BaseModel, Extra +from backend.modules.brain.entity.brain_entity import BrainType +from backend.modules.brain.entity.integration_brain import IntegrationType logger = get_logger(__name__) @@ -51,7 +52,7 @@ class CreateBrainProperties(BaseModel, extra="ignore"): temperature: Optional[float] = 0.0 max_tokens: Optional[int] = 2000 prompt_id: Optional[UUID] = None - brain_type: Optional[BrainType] = BrainType.DOC + brain_type: Optional[BrainType] = BrainType.doc brain_definition: Optional[CreateApiBrainDefinition] = None brain_secrets_values: Optional[dict] = {} connected_brains_ids: Optional[list[UUID]] = [] @@ -65,7 +66,6 @@ def dict(self, *args, **kwargs): class BrainUpdatableProperties(BaseModel, extra="ignore"): - name: Optional[str] = None description: Optional[str] = None temperature: Optional[float] = None diff --git a/backend/modules/brain/entity/__init__.py b/backend/backend/modules/brain/entity/__init__.py similarity index 100% rename from backend/modules/brain/entity/__init__.py rename to backend/backend/modules/brain/entity/__init__.py diff --git a/backend/modules/brain/entity/api_brain_definition_entity.py b/backend/backend/modules/brain/entity/api_brain_definition_entity.py similarity index 100% rename from backend/modules/brain/entity/api_brain_definition_entity.py rename to backend/backend/modules/brain/entity/api_brain_definition_entity.py diff --git a/backend/backend/modules/brain/entity/brain_entity.py b/backend/backend/modules/brain/entity/brain_entity.py new file mode 100644 index 000000000000..72e6d9917695 --- /dev/null +++ b/backend/backend/modules/brain/entity/brain_entity.py @@ -0,0 +1,135 @@ +from datetime import datetime +from enum import Enum +from typing import List, Optional +from uuid import UUID + +from pydantic import BaseModel + +# from sqlmodel import Enum as PGEnum +from sqlalchemy.dialects.postgresql import ENUM as PGEnum +from sqlalchemy.ext.asyncio import AsyncAttrs +from sqlmodel import TIMESTAMP, Column, Field, Relationship, SQLModel, text +from sqlmodel import UUID as PGUUID + +from backend.modules.brain.entity.api_brain_definition_entity import ( + ApiBrainDefinitionEntity, +) +from backend.modules.brain.entity.integration_brain import ( + IntegrationDescriptionEntity, + IntegrationEntity, +) +from backend.modules.prompt.entity.prompt import Prompt + + +class BrainType(str, Enum): + doc = "doc" + api = "api" + composite = "composite" + integration = "integration" + + +class Brain(AsyncAttrs, SQLModel, table=True): + __tablename__ = "brains" # type: ignore + + brain_id: UUID | None = Field( + default=None, + sa_column=Column( + PGUUID, + server_default=text("uuid_generate_v4()"), + primary_key=True, + ), + ) + name: str + description: str + status: str | None = None + model: str | None = None + max_tokens: int | None = None + temperature: float | None = None + last_update: datetime | None = Field( + default=None, + sa_column=Column( + TIMESTAMP(timezone=False), + server_default=text("CURRENT_TIMESTAMP"), + ), + ) + brain_type: BrainType | None = Field( + sa_column=Column( + PGEnum(BrainType, name="brain_type_enum", create_type=False), + default=BrainType.integration, + ), + ) + brain_chat_history: List["ChatHistory"] = Relationship( # noqa: F821 + back_populates="brain", sa_relationship_kwargs={"lazy": "select"} + ) + prompt_id: UUID | None = Field(default=None, foreign_key="prompts.id") + prompt: Prompt | None = Relationship( # noqa: f821 + back_populates="brain", sa_relationship_kwargs={"lazy": "joined"} + ) + + # TODO : add + # "meaning" "public"."vector", + # "tags" "public"."tags"[] + + +class BrainEntity(BaseModel): + brain_id: UUID + name: str + description: Optional[str] = None + temperature: Optional[float] = None + model: Optional[str] = None + max_tokens: Optional[int] = None + status: Optional[str] = None + prompt_id: Optional[UUID] = None + last_update: datetime + brain_type: BrainType + brain_definition: Optional[ApiBrainDefinitionEntity] = None + connected_brains_ids: Optional[List[UUID]] = None + raw: Optional[bool] = None + jq_instructions: Optional[str] = None + integration: Optional[IntegrationEntity] = None + integration_description: Optional[IntegrationDescriptionEntity] = None + + @property + def id(self) -> UUID: + return self.brain_id + + def dict(self, **kwargs): + data = super().dict( + **kwargs, + ) + data["id"] = self.id + return data + + +class PublicBrain(BaseModel): + id: UUID + name: str + description: Optional[str] = None + number_of_subscribers: int = 0 + last_update: str + brain_type: BrainType + brain_definition: Optional[ApiBrainDefinitionEntity] = None + + +class RoleEnum(str, Enum): + Viewer = "Viewer" + Editor = "Editor" + Owner = "Owner" + + +class BrainUser(BaseModel): + id: UUID + user_id: UUID + rights: RoleEnum + default_brain: bool = False + + +class MinimalUserBrainEntity(BaseModel): + id: UUID + name: str + rights: RoleEnum + status: str + brain_type: BrainType + description: str + integration_logo_url: str + max_files: int diff --git a/backend/modules/brain/entity/composite_brain_connection_entity.py b/backend/backend/modules/brain/entity/composite_brain_connection_entity.py similarity index 100% rename from backend/modules/brain/entity/composite_brain_connection_entity.py rename to backend/backend/modules/brain/entity/composite_brain_connection_entity.py diff --git a/backend/modules/brain/entity/integration_brain.py b/backend/backend/modules/brain/entity/integration_brain.py similarity index 100% rename from backend/modules/brain/entity/integration_brain.py rename to backend/backend/modules/brain/entity/integration_brain.py diff --git a/backend/modules/brain/integrations/Big/Brain.py b/backend/backend/modules/brain/integrations/Big/Brain.py similarity index 97% rename from backend/modules/brain/integrations/Big/Brain.py rename to backend/backend/modules/brain/integrations/Big/Brain.py index beec72272449..026a312533dd 100644 --- a/backend/modules/brain/integrations/Big/Brain.py +++ b/backend/backend/modules/brain/integrations/Big/Brain.py @@ -11,9 +11,10 @@ SystemMessagePromptTemplate, ) from langchain_core.prompts.prompt import PromptTemplate -from logger import get_logger -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.chat.dto.chats import ChatQuestion + +from backend.logger import get_logger +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.chat.dto.chats import ChatQuestion logger = get_logger(__name__) diff --git a/backend/modules/brain/integrations/Claude/__init__.py b/backend/backend/modules/brain/integrations/Big/__init__.py similarity index 100% rename from backend/modules/brain/integrations/Claude/__init__.py rename to backend/backend/modules/brain/integrations/Big/__init__.py diff --git a/backend/modules/brain/integrations/Claude/Brain.py b/backend/backend/modules/brain/integrations/Claude/Brain.py similarity index 95% rename from backend/modules/brain/integrations/Claude/Brain.py rename to backend/backend/modules/brain/integrations/Claude/Brain.py index 7b831665f05f..3c523a942e2f 100644 --- a/backend/modules/brain/integrations/Claude/Brain.py +++ b/backend/backend/modules/brain/integrations/Claude/Brain.py @@ -4,8 +4,9 @@ from langchain_community.chat_models import ChatLiteLLM from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.chat.dto.chats import ChatQuestion + +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.chat.dto.chats import ChatQuestion class ClaudeBrain(KnowledgeBrainQA): @@ -16,6 +17,7 @@ class ClaudeBrain(KnowledgeBrainQA): Attributes: **kwargs: Arbitrary keyword arguments for KnowledgeBrainQA initialization. """ + def __init__( self, **kwargs, diff --git a/backend/modules/brain/integrations/GPT4/__init__.py b/backend/backend/modules/brain/integrations/Claude/__init__.py similarity index 100% rename from backend/modules/brain/integrations/GPT4/__init__.py rename to backend/backend/modules/brain/integrations/Claude/__init__.py diff --git a/backend/modules/brain/integrations/GPT4/Brain.py b/backend/backend/modules/brain/integrations/GPT4/Brain.py similarity index 96% rename from backend/modules/brain/integrations/GPT4/Brain.py rename to backend/backend/modules/brain/integrations/GPT4/Brain.py index 1ecc82463890..15202f6bff78 100644 --- a/backend/modules/brain/integrations/GPT4/Brain.py +++ b/backend/backend/modules/brain/integrations/GPT4/Brain.py @@ -10,12 +10,14 @@ from langchain_openai import ChatOpenAI from langgraph.graph import END, StateGraph from langgraph.prebuilt import ToolExecutor, ToolInvocation -from logger import get_logger -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.chat.dto.chats import ChatQuestion -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.chat.service.chat_service import ChatService -from modules.tools import ( + +from backend.logger import get_logger +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.chat.dto.chats import ChatQuestion +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service +from backend.modules.tools import ( EmailSenderTool, ImageGeneratorTool, URLReaderTool, @@ -29,7 +31,7 @@ class AgentState(TypedDict): logger = get_logger(__name__) -chat_service = ChatService() +chat_service = get_service(ChatService)() class GPT4Brain(KnowledgeBrainQA): diff --git a/backend/modules/brain/integrations/Multi_Contract/__init__.py b/backend/backend/modules/brain/integrations/GPT4/__init__.py similarity index 100% rename from backend/modules/brain/integrations/Multi_Contract/__init__.py rename to backend/backend/modules/brain/integrations/GPT4/__init__.py diff --git a/backend/modules/brain/integrations/Multi_Contract/Brain.py b/backend/backend/modules/brain/integrations/Multi_Contract/Brain.py similarity index 98% rename from backend/modules/brain/integrations/Multi_Contract/Brain.py rename to backend/backend/modules/brain/integrations/Multi_Contract/Brain.py index c0249745d33d..1f8ef0d0de48 100644 --- a/backend/modules/brain/integrations/Multi_Contract/Brain.py +++ b/backend/backend/modules/brain/integrations/Multi_Contract/Brain.py @@ -10,8 +10,9 @@ from langchain_core.pydantic_v1 import Field as FieldV1 from langchain_core.runnables import RunnableLambda, RunnablePassthrough from langchain_openai import ChatOpenAI -from logger import get_logger -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA + +from backend.logger import get_logger +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA logger = get_logger(__name__) diff --git a/backend/modules/brain/integrations/Notion/__init__.py b/backend/backend/modules/brain/integrations/Multi_Contract/__init__.py similarity index 100% rename from backend/modules/brain/integrations/Notion/__init__.py rename to backend/backend/modules/brain/integrations/Multi_Contract/__init__.py diff --git a/backend/modules/brain/integrations/Notion/Brain.py b/backend/backend/modules/brain/integrations/Notion/Brain.py similarity index 88% rename from backend/modules/brain/integrations/Notion/Brain.py rename to backend/backend/modules/brain/integrations/Notion/Brain.py index add2592ab434..decf694ba12a 100644 --- a/backend/modules/brain/integrations/Notion/Brain.py +++ b/backend/backend/modules/brain/integrations/Notion/Brain.py @@ -1,4 +1,4 @@ -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA class NotionBrain(KnowledgeBrainQA): diff --git a/backend/modules/brain/integrations/Notion/Notion_connector.py b/backend/backend/modules/brain/integrations/Notion/Notion_connector.py similarity index 95% rename from backend/modules/brain/integrations/Notion/Notion_connector.py rename to backend/backend/modules/brain/integrations/Notion/Notion_connector.py index 704e62b55312..b73ee8195e7c 100644 --- a/backend/modules/brain/integrations/Notion/Notion_connector.py +++ b/backend/backend/modules/brain/integrations/Notion/Notion_connector.py @@ -5,17 +5,21 @@ from typing import Any, List, Optional import requests -from celery_config import celery from fastapi import UploadFile -from logger import get_logger -from modules.brain.entity.integration_brain import IntegrationEntity -from modules.brain.repository.integration_brains import Integration, IntegrationBrain -from modules.knowledge.dto.inputs import CreateKnowledgeProperties -from modules.knowledge.repository.knowledge_interface import KnowledgeInterface -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.upload.service.upload_file import upload_file_storage from pydantic import BaseModel +from backend.celery_config import celery +from backend.logger import get_logger +from backend.modules.brain.entity.integration_brain import IntegrationEntity +from backend.modules.brain.repository.integration_brains import ( + Integration, + IntegrationBrain, +) +from backend.modules.knowledge.dto.inputs import CreateKnowledgeProperties +from backend.modules.knowledge.repository.knowledge_interface import KnowledgeInterface +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.upload.service.upload_file import upload_file_storage + logger = get_logger(__name__) diff --git a/backend/modules/brain/integrations/Proxy/__init__.py b/backend/backend/modules/brain/integrations/Notion/__init__.py similarity index 100% rename from backend/modules/brain/integrations/Proxy/__init__.py rename to backend/backend/modules/brain/integrations/Notion/__init__.py diff --git a/backend/modules/brain/integrations/Proxy/Brain.py b/backend/backend/modules/brain/integrations/Proxy/Brain.py similarity index 91% rename from backend/modules/brain/integrations/Proxy/Brain.py rename to backend/backend/modules/brain/integrations/Proxy/Brain.py index 4a085181ed81..328a3fbc53ff 100644 --- a/backend/modules/brain/integrations/Proxy/Brain.py +++ b/backend/backend/modules/brain/integrations/Proxy/Brain.py @@ -4,15 +4,17 @@ from langchain_community.chat_models import ChatLiteLLM from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -from logger import get_logger -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.chat.dto.chats import ChatQuestion -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.chat.service.chat_service import ChatService + +from backend.logger import get_logger +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.chat.dto.chats import ChatQuestion +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service logger = get_logger(__name__) -chat_service = ChatService() +chat_service = get_service(ChatService)() class ProxyBrain(KnowledgeBrainQA): diff --git a/backend/modules/brain/integrations/SQL/__init__.py b/backend/backend/modules/brain/integrations/Proxy/__init__.py similarity index 100% rename from backend/modules/brain/integrations/SQL/__init__.py rename to backend/backend/modules/brain/integrations/Proxy/__init__.py diff --git a/backend/modules/brain/integrations/SQL/Brain.py b/backend/backend/modules/brain/integrations/SQL/Brain.py similarity index 91% rename from backend/modules/brain/integrations/SQL/Brain.py rename to backend/backend/modules/brain/integrations/SQL/Brain.py index 326088ea0753..10357534bc20 100644 --- a/backend/modules/brain/integrations/SQL/Brain.py +++ b/backend/backend/modules/brain/integrations/SQL/Brain.py @@ -7,10 +7,11 @@ from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough -from modules.brain.integrations.SQL.SQL_connector import SQLConnector -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.brain.repository.integration_brains import IntegrationBrain -from modules.chat.dto.chats import ChatQuestion + +from backend.modules.brain.integrations.SQL.SQL_connector import SQLConnector +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.brain.repository.integration_brains import IntegrationBrain +from backend.modules.chat.dto.chats import ChatQuestion class SQLBrain(KnowledgeBrainQA, IntegrationBrain): diff --git a/backend/modules/brain/integrations/SQL/SQL_connector.py b/backend/backend/modules/brain/integrations/SQL/SQL_connector.py similarity index 72% rename from backend/modules/brain/integrations/SQL/SQL_connector.py rename to backend/backend/modules/brain/integrations/SQL/SQL_connector.py index ed7264bd7830..63a7c7ef7904 100644 --- a/backend/modules/brain/integrations/SQL/SQL_connector.py +++ b/backend/backend/modules/brain/integrations/SQL/SQL_connector.py @@ -1,8 +1,8 @@ -from logger import get_logger -from modules.brain.entity.integration_brain import IntegrationEntity -from modules.brain.repository.integration_brains import IntegrationBrain -from modules.knowledge.repository.knowledge_interface import KnowledgeInterface -from modules.knowledge.service.knowledge_service import KnowledgeService +from backend.logger import get_logger +from backend.modules.brain.entity.integration_brain import IntegrationEntity +from backend.modules.brain.repository.integration_brains import IntegrationBrain +from backend.modules.knowledge.repository.knowledge_interface import KnowledgeInterface +from backend.modules.knowledge.service.knowledge_service import KnowledgeService logger = get_logger(__name__) @@ -25,9 +25,7 @@ def __init__(self, brain_id: str, user_id: str): def _load_credentials(self) -> dict[str, str]: """Load the Notion credentials""" - self.integration_details = self.get_integration_brain( - self.brain_id - ) + self.integration_details = self.get_integration_brain(self.brain_id) if self.credentials is None: logger.info("Loading Notion credentials") self.integration_details.credentials = { diff --git a/backend/modules/brain/integrations/Self/__init__.py b/backend/backend/modules/brain/integrations/SQL/__init__.py similarity index 100% rename from backend/modules/brain/integrations/Self/__init__.py rename to backend/backend/modules/brain/integrations/SQL/__init__.py diff --git a/backend/modules/brain/integrations/Self/Brain.py b/backend/backend/modules/brain/integrations/Self/Brain.py similarity index 97% rename from backend/modules/brain/integrations/Self/Brain.py rename to backend/backend/modules/brain/integrations/Self/Brain.py index 3911a899335a..d1feb78b948b 100644 --- a/backend/modules/brain/integrations/Self/Brain.py +++ b/backend/backend/modules/brain/integrations/Self/Brain.py @@ -12,13 +12,15 @@ from langchain_core.pydantic_v1 import Field as FieldV1 from langchain_openai import ChatOpenAI from langgraph.graph import END, StateGraph -from logger import get_logger -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.chat.dto.chats import ChatQuestion -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.chat.service.chat_service import ChatService from typing_extensions import TypedDict +from backend.logger import get_logger +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.chat.dto.chats import ChatQuestion +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service + # Post-processing def format_docs(docs): @@ -68,7 +70,7 @@ class GradeAnswer(BaseModelV1): logger = get_logger(__name__) -chat_service = ChatService() +chat_service = get_service(ChatService)() class SelfBrain(KnowledgeBrainQA): diff --git a/backend/modules/brain/integrations/__init__.py b/backend/backend/modules/brain/integrations/Self/__init__.py similarity index 100% rename from backend/modules/brain/integrations/__init__.py rename to backend/backend/modules/brain/integrations/Self/__init__.py diff --git a/backend/modules/brain/rags/__init__.py b/backend/backend/modules/brain/integrations/__init__.py similarity index 100% rename from backend/modules/brain/rags/__init__.py rename to backend/backend/modules/brain/integrations/__init__.py diff --git a/backend/modules/brain/knowledge_brain_qa.py b/backend/backend/modules/brain/knowledge_brain_qa.py similarity index 87% rename from backend/modules/brain/knowledge_brain_qa.py rename to backend/backend/modules/brain/knowledge_brain_qa.py index 9b36d645507e..97c26ea57edf 100644 --- a/backend/modules/brain/knowledge_brain_qa.py +++ b/backend/backend/modules/brain/knowledge_brain_qa.py @@ -3,35 +3,41 @@ from uuid import UUID from langchain.callbacks.streaming_aiter import AsyncIteratorCallbackHandler -from logger import get_logger -from models import BrainSettings -from modules.brain.entity.brain_entity import BrainEntity -from modules.brain.qa_interface import QAInterface -from modules.brain.rags.quivr_rag import QuivrRAG -from modules.brain.rags.rag_interface import RAGInterface -from modules.brain.service.brain_service import BrainService -from modules.brain.service.utils.format_chat_history import format_chat_history -from modules.brain.service.utils.get_prompt_to_use_id import get_prompt_to_use_id -from modules.chat.controller.chat.utils import ( +from pydantic import BaseModel, ConfigDict +from pydantic_settings import BaseSettings + +from backend.logger import get_logger +from backend.models.settings import BrainSettings +from backend.modules.brain.entity.brain_entity import BrainEntity +from backend.modules.brain.qa_interface import ( + QAInterface, + model_compatible_with_function_calling, +) +from backend.modules.brain.rags.quivr_rag import QuivrRAG +from backend.modules.brain.rags.rag_interface import RAGInterface +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.utils.format_chat_history import format_chat_history +from backend.modules.brain.service.utils.get_prompt_to_use_id import ( + get_prompt_to_use_id, +) +from backend.modules.chat.controller.chat.utils import ( find_model_and_generate_metadata, update_user_usage, ) -from modules.chat.dto.chats import ChatQuestion, Sources -from modules.chat.dto.inputs import CreateChatHistory -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.chat.service.chat_service import ChatService -from modules.prompt.service.get_prompt_to_use import get_prompt_to_use -from modules.upload.service.generate_file_signed_url import generate_file_signed_url -from modules.user.service.user_usage import UserUsage -from pydantic import BaseModel, ConfigDict -from pydantic_settings import BaseSettings +from backend.modules.chat.dto.chats import ChatQuestion, Sources +from backend.modules.chat.dto.inputs import CreateChatHistory +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.prompt.service.get_prompt_to_use import get_prompt_to_use +from backend.modules.upload.service.generate_file_signed_url import ( + generate_file_signed_url, +) +from backend.modules.user.service.user_usage import UserUsage logger = get_logger(__name__) QUIVR_DEFAULT_PROMPT = "Your name is Quivr. You're a helpful assistant. If you don't know the answer, just say that you don't know, don't try to make up an answer." - brain_service = BrainService() -chat_service = ChatService() def is_valid_uuid(uuid_to_test, version=4): @@ -43,7 +49,11 @@ def is_valid_uuid(uuid_to_test, version=4): return str(uuid_obj) == uuid_to_test -def generate_source(source_documents, brain_id, citations: List[int] = None): +def generate_source( + source_documents, + brain_id: UUID, + citations: List[int] | None = None, +): """ Generate the sources list for the answer It takes in a list of sources documents and citations that points to the docs index that was used in the answer @@ -137,6 +147,9 @@ class KnowledgeBrainQA(BaseModel, QAInterface): # Instantiate settings brain_settings: BaseSettings = BrainSettings() + # TODO: remove this !!!!! Only added for compatibility + chat_service: ChatService + # Default class attributes model: str = "gpt-3.5-turbo-0125" # pyright: ignore reportPrivateUsage=none temperature: float = 0.1 @@ -164,33 +177,33 @@ def __init__( self, brain_id: str, chat_id: str, + chat_service: ChatService, + user_id: str = None, + user_email: str = None, streaming: bool = False, prompt_id: Optional[UUID] = None, metadata: Optional[dict] = None, - user_id: str = None, - user_email: str = None, cost: int = 100, **kwargs, ): super().__init__( brain_id=brain_id, chat_id=chat_id, + chat_service=chat_service, streaming=streaming, **kwargs, ) + self.chat_service = chat_service self.prompt_id = prompt_id self.user_id = user_id self.user_email = user_email - self.user_usage = UserUsage( - id=user_id, - email=user_email, - ) + self.user_usage = UserUsage(id=user_id, email=user_email) + # TODO: we already have a brain before !!! self.brain = brain_service.get_brain_by_id(brain_id) - self.user_settings = self.user_usage.get_user_settings() # Get Model settings for the user - self.models_settings = self.user_usage.get_model_settings() + self.models_settings = self.user_usage.get_models() self.increase_usage_user() self.knowledge_qa = QuivrRAG( model=self.brain.model if self.brain.model else self.model, @@ -261,9 +274,7 @@ def increase_usage_user(self): ) def calculate_pricing(self): - model_to_use = find_model_and_generate_metadata( - self.chat_id, self.brain.model, self.user_settings, self.models_settings, @@ -279,11 +290,12 @@ def calculate_pricing(self): return user_choosen_model_price - def generate_answer( + # TODO: deprecated + async def generate_answer( self, chat_id: UUID, question: ChatQuestion, save_answer: bool = True ) -> GetChatHistoryOutput: conversational_qa_chain = self.knowledge_qa.get_chain() - transformed_history, _ = self.initialize_streamed_chat_history( + transformed_history, _ = await self.initialize_streamed_chat_history( chat_id, question ) metadata = self.metadata or {} @@ -302,7 +314,7 @@ def generate_answer( config=config, ) - if self.model_compatible_with_function_calling(model=self.model): + if model_compatible_with_function_calling(model=self.model): if model_response["answer"].tool_calls: citations = model_response["answer"].tool_calls[-1]["args"]["citations"] followup_questions = model_response["answer"].tool_calls[-1]["args"][ @@ -318,7 +330,9 @@ def generate_answer( answer = model_response["answer"].tool_calls[-1]["args"]["answer"] else: answer = model_response["answer"].content + sources = model_response["docs"] or [] + if len(sources) > 0: sources_list = generate_source(sources, self.brain_id, citations=citations) serialized_sources_list = [source.dict() for source in sources_list] @@ -331,13 +345,14 @@ def generate_answer( async def generate_stream( self, chat_id: UUID, question: ChatQuestion, save_answer: bool = True ) -> AsyncIterable: - if hasattr(self, "get_chain") and callable(getattr(self, "get_chain")): + if hasattr(self, "get_chain") and callable(self.get_chain): conversational_qa_chain = self.get_chain() else: conversational_qa_chain = self.knowledge_qa.get_chain() - transformed_history, streamed_chat_history = ( - self.initialize_streamed_chat_history(chat_id, question) - ) + ( + transformed_history, + streamed_chat_history, + ) = await self.initialize_streamed_chat_history(chat_id, question) response_tokens = "" sources = [] citations = [] @@ -356,7 +371,7 @@ async def generate_stream( ): if not streamed_chat_history.metadata: streamed_chat_history.metadata = {} - if self.model_compatible_with_function_calling(model=self.model): + if model_compatible_with_function_calling(model=self.model): if chunk.get("answer"): if first: gathered = chunk["answer"] @@ -403,7 +418,7 @@ async def generate_stream( if chunk.get("answer"): response_tokens += chunk["answer"].content streamed_chat_history.assistant = chunk["answer"].content - yield f"data: {json.dumps(streamed_chat_history.dict())}" + yield f"data: {streamed_chat_history.model_dump_json()}" if chunk.get("docs"): sources = chunk["docs"] @@ -413,15 +428,15 @@ async def generate_stream( # Serialize the sources list serialized_sources_list = [source.dict() for source in sources_list] streamed_chat_history.metadata["sources"] = serialized_sources_list - yield f"data: {json.dumps(streamed_chat_history.dict())}" + yield f"data: {streamed_chat_history.model_dump_json()}" self.save_answer(question, response_tokens, streamed_chat_history, save_answer) - def initialize_streamed_chat_history(self, chat_id, question): - history = chat_service.get_chat_history(self.chat_id) + async def initialize_streamed_chat_history(self, chat_id, question): + history = await self.chat_service.get_chat_history(self.chat_id) transformed_history = format_chat_history(history) brain = brain_service.get_brain_by_id(self.brain_id) - streamed_chat_history = chat_service.update_chat_history( + streamed_chat_history = self.chat_service.update_chat_history( CreateChatHistory( **{ "chat_id": chat_id, @@ -458,7 +473,7 @@ def save_answer( try: if save_answer: - chat_service.update_message_by_id( + self.chat_service.update_message_by_id( message_id=str(streamed_chat_history.message_id), user_message=question.question, assistant=assistant, @@ -468,7 +483,7 @@ def save_answer( logger.error("Error updating message by ID: %s", e) def save_non_streaming_answer(self, chat_id, question, answer, metadata): - new_chat = chat_service.update_chat_history( + new_chat = self.chat_service.update_chat_history( CreateChatHistory( **{ "chat_id": chat_id, diff --git a/backend/modules/brain/qa_headless.py b/backend/backend/modules/brain/qa_headless.py similarity index 91% rename from backend/modules/brain/qa_headless.py rename to backend/backend/modules/brain/qa_headless.py index 15c8e85ec733..2eadc61ce503 100644 --- a/backend/modules/brain/qa_headless.py +++ b/backend/backend/modules/brain/qa_headless.py @@ -8,24 +8,30 @@ from langchain.chat_models.base import BaseChatModel from langchain.prompts.chat import ChatPromptTemplate, HumanMessagePromptTemplate from langchain_community.chat_models import ChatLiteLLM -from modules.brain.service.utils.format_chat_history import ( +from pydantic import BaseModel, ConfigDict + +from backend.logger import get_logger +from backend.models.settings import ( + BrainSettings, # Importing settings related to the 'brain' +) +from backend.modules.brain.qa_interface import QAInterface +from backend.modules.brain.service.utils.format_chat_history import ( format_chat_history, format_history_to_openai_mesages, ) -from modules.prompt.service.get_prompt_to_use import get_prompt_to_use -from modules.brain.service.utils.get_prompt_to_use_id import get_prompt_to_use_id -from logger import get_logger -from models import BrainSettings # Importing settings related to the 'brain' -from modules.brain.qa_interface import QAInterface -from modules.chat.dto.chats import ChatQuestion -from modules.chat.dto.inputs import CreateChatHistory -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.chat.service.chat_service import ChatService -from pydantic import BaseModel, ConfigDict +from backend.modules.brain.service.utils.get_prompt_to_use_id import ( + get_prompt_to_use_id, +) +from backend.modules.chat.dto.chats import ChatQuestion +from backend.modules.chat.dto.inputs import CreateChatHistory +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service +from backend.modules.prompt.service.get_prompt_to_use import get_prompt_to_use logger = get_logger(__name__) SYSTEM_MESSAGE = "Your name is Quivr. You're a helpful assistant. If you don't know the answer, just say that you don't know, don't try to make up an answer.When answering use markdown or any other techniques to display the content in a nice and aerated way." -chat_service = ChatService() +chat_service = get_service(ChatService)() class HeadlessQA(BaseModel, QAInterface): diff --git a/backend/modules/brain/qa_interface.py b/backend/backend/modules/brain/qa_interface.py similarity index 58% rename from backend/modules/brain/qa_interface.py rename to backend/backend/modules/brain/qa_interface.py index 14b8087498aa..aac89b09b90a 100644 --- a/backend/modules/brain/qa_interface.py +++ b/backend/backend/modules/brain/qa_interface.py @@ -1,7 +1,24 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.chat.dto.chats import ChatQuestion +from backend.modules.chat.dto.chats import ChatQuestion + + +def model_compatible_with_function_calling(model: str): + return model in [ + "gpt-4o", + "gpt-4-turbo", + "gpt-4-turbo-2024-04-09", + "gpt-4-turbo-preview", + "gpt-4-0125-preview", + "gpt-4-1106-preview", + "gpt-4", + "gpt-4-0613", + "gpt-3.5-turbo", + "gpt-3.5-turbo-0125", + "gpt-3.5-turbo-1106", + "gpt-3.5-turbo-0613", + ] class QAInterface(ABC): @@ -22,38 +39,20 @@ def generate_answer( chat_id: UUID, question: ChatQuestion, save_answer: bool, - *custom_params: tuple + *custom_params: tuple, ): raise NotImplementedError( "generate_answer is an abstract method and must be implemented" ) @abstractmethod - def generate_stream( + async def generate_stream( self, chat_id: UUID, question: ChatQuestion, save_answer: bool, - *custom_params: tuple + *custom_params: tuple, ): raise NotImplementedError( "generate_stream is an abstract method and must be implemented" ) - - def model_compatible_with_function_calling(self, model: str): - if model in [ - "gpt-4o", - "gpt-4-turbo", - "gpt-4-turbo-2024-04-09", - "gpt-4-turbo-preview", - "gpt-4-0125-preview", - "gpt-4-1106-preview", - "gpt-4", - "gpt-4-0613", - "gpt-3.5-turbo", - "gpt-3.5-turbo-0125", - "gpt-3.5-turbo-1106", - "gpt-3.5-turbo-0613", - ]: - return True - return False diff --git a/backend/modules/brain/service/__init__.py b/backend/backend/modules/brain/rags/__init__.py similarity index 100% rename from backend/modules/brain/service/__init__.py rename to backend/backend/modules/brain/rags/__init__.py diff --git a/backend/modules/brain/rags/quivr_rag.py b/backend/backend/modules/brain/rags/quivr_rag.py similarity index 87% rename from backend/modules/brain/rags/quivr_rag.py rename to backend/backend/modules/brain/rags/quivr_rag.py index f7626416ead9..403c0227774a 100644 --- a/backend/modules/brain/rags/quivr_rag.py +++ b/backend/backend/modules/brain/rags/quivr_rag.py @@ -12,24 +12,31 @@ from langchain.schema import format_document from langchain_cohere import CohereRerank from langchain_community.chat_models import ChatLiteLLM -from langchain_community.embeddings import OllamaEmbeddings from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.pydantic_v1 import BaseModel as BaseModelV1 from langchain_core.pydantic_v1 import Field as FieldV1 from langchain_core.runnables import RunnableLambda, RunnablePassthrough -from langchain_openai import ChatOpenAI, OpenAIEmbeddings -from logger import get_logger -from models import BrainSettings # Importing settings related to the 'brain' -from models.settings import get_supabase_client -from modules.brain.service.brain_service import BrainService -from modules.chat.service.chat_service import ChatService -from modules.knowledge.repository.knowledges import Knowledges -from modules.prompt.service.get_prompt_to_use import get_prompt_to_use +from langchain_openai import ChatOpenAI from pydantic import BaseModel, ConfigDict from pydantic_settings import BaseSettings + +from backend.logger import get_logger + +# Importing settings related to the 'brain' +from backend.models.settings import ( + BrainSettings, + get_embedding_client, + get_supabase_client, +) +from backend.modules.brain.qa_interface import model_compatible_with_function_calling +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service +from backend.modules.knowledge.repository.knowledges import KnowledgeRepository +from backend.modules.prompt.service.get_prompt_to_use import get_prompt_to_use +from backend.vectorstore.supabase import CustomSupabaseVectorStore from supabase.client import Client -from vectorstore.supabase import CustomSupabaseVectorStore logger = get_logger(__name__) @@ -39,8 +46,8 @@ class cited_answer(BaseModelV1): thoughts: str = FieldV1( ..., - description="""Description of the thought process, based only on the given sources. - Cite the text as much as possible and give the document name it appears in. In the format : 'Doc_name states : cited_text'. Be the most + description="""Description of the thought process, based only on the given sources. + Cite the text as much as possible and give the document name it appears in. In the format : 'Doc_name states : cited_text'. Be the most procedural as possible. Write all the steps needed to find the answer until you find it.""", ) answer: str = FieldV1( @@ -128,7 +135,7 @@ def is_valid_uuid(uuid_to_test, version=4): brain_service = BrainService() -chat_service = ChatService() +chat_service = get_service(ChatService)() class QuivrRAG(BaseModel): @@ -148,16 +155,7 @@ class QuivrRAG(BaseModel): max_tokens: int = 2000 # Output length max_input: int = 2000 streaming: bool = False - knowledge_service: Knowledges = None - - @property - def embeddings(self): - if self.brain_settings.ollama_api_base_url: - return OllamaEmbeddings( - base_url=self.brain_settings.ollama_api_base_url - ) # pyright: ignore reportPrivateUsage=none - else: - return OpenAIEmbeddings() + knowledge_service: KnowledgeRepository = None def prompt_to_use(self): if self.brain_id and is_valid_uuid(self.brain_id): @@ -165,24 +163,6 @@ def prompt_to_use(self): else: return None - def model_compatible_with_function_calling(self): - if self.model in [ - "gpt-4o", - "gpt-4-turbo", - "gpt-4-turbo-2024-04-09", - "gpt-4-turbo-preview", - "gpt-4-0125-preview", - "gpt-4-1106-preview", - "gpt-4", - "gpt-4-0613", - "gpt-3.5-turbo", - "gpt-3.5-turbo-0125", - "gpt-3.5-turbo-1106", - "gpt-3.5-turbo-0613", - ]: - return True - return False - supabase_client: Optional[Client] = None vector_store: Optional[CustomSupabaseVectorStore] = None qa: Optional[ConversationalRetrievalChain] = None @@ -208,7 +188,7 @@ def __init__( max_input=max_input, **kwargs, ) - self.supabase_client = self._create_supabase_client() + self.supabase_client = get_supabase_client() self.vector_store = self._create_vector_store() self.prompt_id = prompt_id self.max_tokens = max_tokens @@ -217,15 +197,13 @@ def __init__( self.brain_id = brain_id self.chat_id = chat_id self.streaming = streaming - self.knowledge_service = Knowledges() - - def _create_supabase_client(self) -> Client: - return get_supabase_client() + self.knowledge_service = KnowledgeRepository() def _create_vector_store(self) -> CustomSupabaseVectorStore: + embeddings = get_embedding_client() return CustomSupabaseVectorStore( self.supabase_client, - self.embeddings, + embeddings, table_name="vectors", brain_id=self.brain_id, max_input=self.max_input, @@ -309,7 +287,6 @@ def filter_history( return chat_history def get_chain(self): - list_files_array = self.knowledge_service.get_all_knowledge_in_brain( self.brain_id ) # pyright: ignore reportPrivateUsage=none @@ -321,6 +298,7 @@ def get_chain(self): list_files = "\n".join(list_files_array) if list_files_array else "None" + # TODO(@aminediro) : Should be a class level attribute compressor = None if os.getenv("COHERE_API_KEY"): compressor = CohereRerank(top_n=20) @@ -377,8 +355,7 @@ def get_chain(self): temperature=self.temperature, api_base=api_base, ) # pyright: ignore reportPrivateUsage=none - if self.model_compatible_with_function_calling(): - + if model_compatible_with_function_calling(self.model): # And finally, we do the part that returns the answers llm_function = ChatOpenAI( max_tokens=self.max_tokens, diff --git a/backend/modules/brain/rags/rag_interface.py b/backend/backend/modules/brain/rags/rag_interface.py similarity index 100% rename from backend/modules/brain/rags/rag_interface.py rename to backend/backend/modules/brain/rags/rag_interface.py diff --git a/backend/modules/brain/repository/__init__.py b/backend/backend/modules/brain/repository/__init__.py similarity index 100% rename from backend/modules/brain/repository/__init__.py rename to backend/backend/modules/brain/repository/__init__.py diff --git a/backend/modules/brain/repository/api_brain_definitions.py b/backend/backend/modules/brain/repository/api_brain_definitions.py similarity index 84% rename from backend/modules/brain/repository/api_brain_definitions.py rename to backend/backend/modules/brain/repository/api_brain_definitions.py index 33edc321170e..e75af8e17386 100644 --- a/backend/modules/brain/repository/api_brain_definitions.py +++ b/backend/backend/modules/brain/repository/api_brain_definitions.py @@ -1,10 +1,12 @@ from typing import Optional from uuid import UUID -from models.settings import get_supabase_client -from modules.brain.dto.inputs import CreateApiBrainDefinition -from modules.brain.entity.api_brain_definition_entity import ApiBrainDefinitionEntity -from modules.brain.repository.interfaces import ApiBrainDefinitionsInterface +from backend.models.settings import get_supabase_client +from backend.modules.brain.dto.inputs import CreateApiBrainDefinition +from backend.modules.brain.entity.api_brain_definition_entity import ( + ApiBrainDefinitionEntity, +) +from backend.modules.brain.repository.interfaces import ApiBrainDefinitionsInterface class ApiBrainDefinitions(ApiBrainDefinitionsInterface): diff --git a/backend/modules/brain/repository/brains.py b/backend/backend/modules/brain/repository/brains.py similarity index 84% rename from backend/modules/brain/repository/brains.py rename to backend/backend/modules/brain/repository/brains.py index 54b48c204622..b173585380cd 100644 --- a/backend/modules/brain/repository/brains.py +++ b/backend/backend/modules/brain/repository/brains.py @@ -2,11 +2,15 @@ from sqlalchemy import text -from logger import get_logger -from models.settings import get_embeddings, get_pg_database_engine, get_supabase_client -from modules.brain.dto.inputs import BrainUpdatableProperties -from modules.brain.entity.brain_entity import BrainEntity, PublicBrain -from modules.brain.repository.interfaces.brains_interface import BrainsInterface +from backend.logger import get_logger +from backend.models.settings import ( + get_embedding_client, + get_pg_database_engine, + get_supabase_client, +) +from backend.modules.brain.dto.inputs import BrainUpdatableProperties +from backend.modules.brain.entity.brain_entity import BrainEntity, PublicBrain +from backend.modules.brain.repository.interfaces.brains_interface import BrainsInterface logger = get_logger(__name__) @@ -19,7 +23,7 @@ def __init__(self): self.pg_engine = pg_engine def create_brain(self, brain): - embeddings = get_embeddings() + embeddings = get_embedding_client() string_to_embed = f"Name: {brain.name} Description: {brain.description}" brain_meaning = embeddings.embed_query(string_to_embed) brain_dict = brain.dict( @@ -74,7 +78,9 @@ def get_brain_details(self, brain_id): SELECT * FROM brains WHERE brain_id = '{brain_id}' """ - response = connection.execute(text(query.format(brain_id=brain_id))).fetchall() + response = connection.execute( + text(query.format(brain_id=brain_id)) + ).fetchall() if len(response) == 0: return None return BrainEntity(**response[0]._mapping) @@ -90,7 +96,7 @@ def delete_brain(self, brain_id: str): def update_brain_by_id( self, brain_id: UUID, brain: BrainUpdatableProperties ) -> BrainEntity | None: - embeddings = get_embeddings() + embeddings = get_embedding_client() string_to_embed = f"Name: {brain.name} Description: {brain.description}" brain_meaning = embeddings.embed_query(string_to_embed) brain_dict = brain.dict(exclude_unset=True) @@ -116,4 +122,4 @@ def get_brain_by_id(self, brain_id: UUID) -> BrainEntity | None: if len(response) == 0: return None - return BrainEntity(**response[0]._mapping) \ No newline at end of file + return BrainEntity(**response[0]._mapping) diff --git a/backend/modules/brain/repository/brains_users.py b/backend/backend/modules/brain/repository/brains_users.py similarity index 92% rename from backend/modules/brain/repository/brains_users.py rename to backend/backend/modules/brain/repository/brains_users.py index 299f88a6fea4..df0c71e83cc8 100644 --- a/backend/modules/brain/repository/brains_users.py +++ b/backend/backend/modules/brain/repository/brains_users.py @@ -1,9 +1,9 @@ from uuid import UUID -from logger import get_logger -from models.settings import get_embeddings, get_supabase_client -from modules.brain.entity.brain_entity import BrainUser, MinimalUserBrainEntity -from modules.brain.repository.interfaces.brains_users_interface import ( +from backend.logger import get_logger +from backend.models.settings import get_embedding_client, get_supabase_client +from backend.modules.brain.entity.brain_entity import BrainUser, MinimalUserBrainEntity +from backend.modules.brain.repository.interfaces.brains_users_interface import ( BrainsUsersInterface, ) @@ -16,7 +16,7 @@ def __init__(self): self.db = supabase_client def update_meaning(self, brain: MinimalUserBrainEntity): - embeddings = get_embeddings() + embeddings = get_embedding_client() string_to_embed = f"Name: {brain.name} Description: {brain.description}" brain_meaning = embeddings.embed_query(string_to_embed) brain_dict = {"meaning": brain_meaning} @@ -145,13 +145,11 @@ def create_brain_user(self, user_id: UUID, brain_id, rights, default_brain: bool def get_user_default_brain_id(self, user_id: UUID) -> UUID | None: response = ( - ( - self.db.from_("brains_users") - .select("brain_id") - .filter("user_id", "eq", user_id) - .filter("default_brain", "eq", True) - .execute() - ) + self.db.from_("brains_users") + .select("brain_id") + .filter("user_id", "eq", user_id) + .filter("default_brain", "eq", True) + .execute() ).data if len(response) == 0: return None diff --git a/backend/modules/brain/repository/brains_vectors.py b/backend/backend/modules/brain/repository/brains_vectors.py similarity index 94% rename from backend/modules/brain/repository/brains_vectors.py rename to backend/backend/modules/brain/repository/brains_vectors.py index a937652a1091..3fda370e1dc2 100644 --- a/backend/modules/brain/repository/brains_vectors.py +++ b/backend/backend/modules/brain/repository/brains_vectors.py @@ -1,6 +1,6 @@ -from logger import get_logger -from models.settings import get_supabase_client -from modules.brain.repository.interfaces.brains_vectors_interface import ( +from backend.logger import get_logger +from backend.models.settings import get_supabase_client +from backend.modules.brain.repository.interfaces.brains_vectors_interface import ( BrainsVectorsInterface, ) diff --git a/backend/modules/brain/repository/composite_brains_connections.py b/backend/backend/modules/brain/repository/composite_brains_connections.py similarity index 86% rename from backend/modules/brain/repository/composite_brains_connections.py rename to backend/backend/modules/brain/repository/composite_brains_connections.py index edb42ffa365f..ee672ec34148 100644 --- a/backend/modules/brain/repository/composite_brains_connections.py +++ b/backend/backend/modules/brain/repository/composite_brains_connections.py @@ -1,11 +1,13 @@ from uuid import UUID -from logger import get_logger -from models.settings import get_supabase_client -from modules.brain.entity.composite_brain_connection_entity import ( +from backend.logger import get_logger +from backend.models.settings import get_supabase_client +from backend.modules.brain.entity.composite_brain_connection_entity import ( CompositeBrainConnectionEntity, ) -from modules.brain.repository.interfaces import CompositeBrainsConnectionsInterface +from backend.modules.brain.repository.interfaces import ( + CompositeBrainsConnectionsInterface, +) logger = get_logger(__name__) diff --git a/backend/modules/brain/repository/external_api_secrets.py b/backend/backend/modules/brain/repository/external_api_secrets.py similarity index 91% rename from backend/modules/brain/repository/external_api_secrets.py rename to backend/backend/modules/brain/repository/external_api_secrets.py index c5fafedb3584..3022138e0ca7 100644 --- a/backend/modules/brain/repository/external_api_secrets.py +++ b/backend/backend/modules/brain/repository/external_api_secrets.py @@ -1,7 +1,7 @@ from uuid import UUID -from models.settings import get_supabase_client -from modules.brain.repository.interfaces.external_api_secrets_interface import ( +from backend.models.settings import get_supabase_client +from backend.modules.brain.repository.interfaces.external_api_secrets_interface import ( ExternalApiSecretsInterface, ) diff --git a/backend/modules/brain/repository/integration_brains.py b/backend/backend/modules/brain/repository/integration_brains.py similarity index 94% rename from backend/modules/brain/repository/integration_brains.py rename to backend/backend/modules/brain/repository/integration_brains.py index d4f638f205bc..c9df9d4418b3 100644 --- a/backend/modules/brain/repository/integration_brains.py +++ b/backend/backend/modules/brain/repository/integration_brains.py @@ -1,12 +1,12 @@ from abc import ABC, abstractmethod from typing import List -from models.settings import get_supabase_client -from modules.brain.entity.integration_brain import ( +from backend.models.settings import get_supabase_client +from backend.modules.brain.entity.integration_brain import ( IntegrationDescriptionEntity, IntegrationEntity, ) -from modules.brain.repository.interfaces.integration_brains_interface import ( +from backend.modules.brain.repository.interfaces.integration_brains_interface import ( IntegrationBrainInterface, IntegrationDescriptionInterface, ) @@ -33,7 +33,7 @@ class IntegrationBrain(IntegrationBrainInterface): def __init__(self): self.db = get_supabase_client() - def get_integration_brain(self, brain_id, user_id = None): + def get_integration_brain(self, brain_id, user_id=None): query = ( self.db.table("integrations_user") .select("*") diff --git a/backend/modules/brain/repository/interfaces/__init__.py b/backend/backend/modules/brain/repository/interfaces/__init__.py similarity index 100% rename from backend/modules/brain/repository/interfaces/__init__.py rename to backend/backend/modules/brain/repository/interfaces/__init__.py diff --git a/backend/modules/brain/repository/interfaces/api_brain_definitions_interface.py b/backend/backend/modules/brain/repository/interfaces/api_brain_definitions_interface.py similarity index 83% rename from backend/modules/brain/repository/interfaces/api_brain_definitions_interface.py rename to backend/backend/modules/brain/repository/interfaces/api_brain_definitions_interface.py index db3036a82938..aa4b1226490e 100644 --- a/backend/modules/brain/repository/interfaces/api_brain_definitions_interface.py +++ b/backend/backend/modules/brain/repository/interfaces/api_brain_definitions_interface.py @@ -2,8 +2,10 @@ from typing import Optional from uuid import UUID -from modules.brain.dto.inputs import CreateApiBrainDefinition -from modules.brain.entity.api_brain_definition_entity import ApiBrainDefinitionEntity +from backend.modules.brain.dto.inputs import CreateApiBrainDefinition +from backend.modules.brain.entity.api_brain_definition_entity import ( + ApiBrainDefinitionEntity, +) class ApiBrainDefinitionsInterface(ABC): diff --git a/backend/modules/brain/repository/interfaces/brains_interface.py b/backend/backend/modules/brain/repository/interfaces/brains_interface.py similarity index 86% rename from backend/modules/brain/repository/interfaces/brains_interface.py rename to backend/backend/modules/brain/repository/interfaces/brains_interface.py index 8236869457a8..6133be2b4c66 100644 --- a/backend/modules/brain/repository/interfaces/brains_interface.py +++ b/backend/backend/modules/brain/repository/interfaces/brains_interface.py @@ -1,8 +1,11 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.brain.dto.inputs import BrainUpdatableProperties, CreateBrainProperties -from modules.brain.entity.brain_entity import BrainEntity, PublicBrain +from backend.modules.brain.dto.inputs import ( + BrainUpdatableProperties, + CreateBrainProperties, +) +from backend.modules.brain.entity.brain_entity import BrainEntity, PublicBrain class BrainsInterface(ABC): diff --git a/backend/modules/brain/repository/interfaces/brains_users_interface.py b/backend/backend/modules/brain/repository/interfaces/brains_users_interface.py similarity index 95% rename from backend/modules/brain/repository/interfaces/brains_users_interface.py rename to backend/backend/modules/brain/repository/interfaces/brains_users_interface.py index a3fabb4e002c..7dab3fcf5762 100644 --- a/backend/modules/brain/repository/interfaces/brains_users_interface.py +++ b/backend/backend/modules/brain/repository/interfaces/brains_users_interface.py @@ -2,7 +2,7 @@ from typing import List from uuid import UUID -from modules.brain.entity.brain_entity import BrainUser, MinimalUserBrainEntity +from backend.modules.brain.entity.brain_entity import BrainUser, MinimalUserBrainEntity class BrainsUsersInterface(ABC): diff --git a/backend/modules/brain/repository/interfaces/brains_vectors_interface.py b/backend/backend/modules/brain/repository/interfaces/brains_vectors_interface.py similarity index 100% rename from backend/modules/brain/repository/interfaces/brains_vectors_interface.py rename to backend/backend/modules/brain/repository/interfaces/brains_vectors_interface.py diff --git a/backend/modules/brain/repository/interfaces/composite_brains_connections_interface.py b/backend/backend/modules/brain/repository/interfaces/composite_brains_connections_interface.py similarity index 92% rename from backend/modules/brain/repository/interfaces/composite_brains_connections_interface.py rename to backend/backend/modules/brain/repository/interfaces/composite_brains_connections_interface.py index 90e758d8d4ae..bfa4ceaa4ff8 100644 --- a/backend/modules/brain/repository/interfaces/composite_brains_connections_interface.py +++ b/backend/backend/modules/brain/repository/interfaces/composite_brains_connections_interface.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.brain.entity.composite_brain_connection_entity import ( +from backend.modules.brain.entity.composite_brain_connection_entity import ( CompositeBrainConnectionEntity, ) diff --git a/backend/modules/brain/repository/interfaces/external_api_secrets_interface.py b/backend/backend/modules/brain/repository/interfaces/external_api_secrets_interface.py similarity index 100% rename from backend/modules/brain/repository/interfaces/external_api_secrets_interface.py rename to backend/backend/modules/brain/repository/interfaces/external_api_secrets_interface.py diff --git a/backend/modules/brain/repository/interfaces/integration_brains_interface.py b/backend/backend/modules/brain/repository/interfaces/integration_brains_interface.py similarity index 96% rename from backend/modules/brain/repository/interfaces/integration_brains_interface.py rename to backend/backend/modules/brain/repository/interfaces/integration_brains_interface.py index 346400a83b6d..faed386db987 100644 --- a/backend/modules/brain/repository/interfaces/integration_brains_interface.py +++ b/backend/backend/modules/brain/repository/interfaces/integration_brains_interface.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.brain.entity.integration_brain import ( +from backend.modules.brain.entity.integration_brain import ( IntegrationDescriptionEntity, IntegrationEntity, ) diff --git a/backend/modules/chat/__init__.py b/backend/backend/modules/brain/service/__init__.py similarity index 100% rename from backend/modules/chat/__init__.py rename to backend/backend/modules/brain/service/__init__.py diff --git a/backend/modules/brain/service/api_brain_definition_service.py b/backend/backend/modules/brain/service/api_brain_definition_service.py similarity index 74% rename from backend/modules/brain/service/api_brain_definition_service.py rename to backend/backend/modules/brain/service/api_brain_definition_service.py index cd1489d20302..bd6ac1ef0fcb 100644 --- a/backend/modules/brain/service/api_brain_definition_service.py +++ b/backend/backend/modules/brain/service/api_brain_definition_service.py @@ -1,10 +1,12 @@ from typing import Optional from uuid import UUID -from modules.brain.dto.inputs import CreateApiBrainDefinition -from modules.brain.entity.api_brain_definition_entity import ApiBrainDefinitionEntity -from modules.brain.repository.api_brain_definitions import ApiBrainDefinitions -from modules.brain.repository.interfaces import ApiBrainDefinitionsInterface +from backend.modules.brain.dto.inputs import CreateApiBrainDefinition +from backend.modules.brain.entity.api_brain_definition_entity import ( + ApiBrainDefinitionEntity, +) +from backend.modules.brain.repository.api_brain_definitions import ApiBrainDefinitions +from backend.modules.brain.repository.interfaces import ApiBrainDefinitionsInterface class ApiBrainDefinitionService: diff --git a/backend/modules/brain/service/brain_authorization_service.py b/backend/backend/modules/brain/service/brain_authorization_service.py similarity index 87% rename from backend/modules/brain/service/brain_authorization_service.py rename to backend/backend/modules/brain/service/brain_authorization_service.py index c0c2c5e2c4d8..2644db636061 100644 --- a/backend/modules/brain/service/brain_authorization_service.py +++ b/backend/backend/modules/brain/service/brain_authorization_service.py @@ -2,11 +2,12 @@ from uuid import UUID from fastapi import Depends, HTTPException, status -from middlewares.auth.auth_bearer import get_current_user -from modules.brain.entity.brain_entity import RoleEnum -from modules.brain.service.brain_service import BrainService -from modules.brain.service.brain_user_service import BrainUserService -from modules.user.entity.user_identity import UserIdentity + +from backend.middlewares.auth.auth_bearer import get_current_user +from backend.modules.brain.entity.brain_entity import RoleEnum +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.brain_user_service import BrainUserService +from backend.modules.user.entity.user_identity import UserIdentity brain_user_service = BrainUserService() brain_service = BrainService() diff --git a/backend/modules/brain/service/brain_service.py b/backend/backend/modules/brain/service/brain_service.py similarity index 87% rename from backend/modules/brain/service/brain_service.py rename to backend/backend/modules/brain/service/brain_service.py index 68157d9dc4a3..2adca7e57e5c 100644 --- a/backend/modules/brain/service/brain_service.py +++ b/backend/backend/modules/brain/service/brain_service.py @@ -1,49 +1,50 @@ from typing import Optional from uuid import UUID -from celery_config import celery from fastapi import HTTPException -from logger import get_logger -from modules.brain.dto.inputs import BrainUpdatableProperties, CreateBrainProperties -from modules.brain.entity.brain_entity import BrainEntity, BrainType, PublicBrain -from modules.brain.entity.integration_brain import IntegrationEntity -from modules.brain.repository import ( + +from backend.celery_config import celery +from backend.logger import get_logger +from backend.modules.brain.dto.inputs import ( + BrainUpdatableProperties, + CreateBrainProperties, +) +from backend.modules.brain.entity.brain_entity import ( + BrainEntity, + BrainType, + PublicBrain, +) +from backend.modules.brain.entity.integration_brain import IntegrationEntity +from backend.modules.brain.repository import ( Brains, BrainsUsers, BrainsVectors, IntegrationBrain, IntegrationDescription, ) -from modules.brain.repository.interfaces import ( - BrainsInterface, - BrainsUsersInterface, - BrainsVectorsInterface, - ExternalApiSecretsInterface, - IntegrationBrainInterface, - IntegrationDescriptionInterface, +from backend.modules.brain.service.api_brain_definition_service import ( + ApiBrainDefinitionService, ) -from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService -from modules.brain.service.utils.validate_brain import validate_api_brain -from modules.knowledge.service.knowledge_service import KnowledgeService -from vectorstore.supabase import CustomSupabaseVectorStore +from backend.modules.brain.service.utils.validate_brain import validate_api_brain +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.vectorstore.supabase import CustomSupabaseVectorStore logger = get_logger(__name__) knowledge_service = KnowledgeService() -# TODO: directly user api_brain_definition repository api_brain_definition_service = ApiBrainDefinitionService() class BrainService: - brain_repository: BrainsInterface - brain_user_repository: BrainsUsersInterface - brain_vector_repository: BrainsVectorsInterface - external_api_secrets_repository: ExternalApiSecretsInterface - integration_brains_repository: IntegrationBrainInterface - integration_description_repository: IntegrationDescriptionInterface + # brain_repository: BrainsInterface + # brain_user_repository: BrainsUsersInterface + # brain_vector_repository: BrainsVectorsInterface + # external_api_secrets_repository: ExternalApiSecretsInterface + # integration_brains_repository: IntegrationBrainInterface + # integration_description_repository: IntegrationDescriptionInterface def __init__(self): - self.brain_repository = Brains() + self.brain_repository: Brains = Brains() self.brain_user_repository = BrainsUsers() self.brain_vector = BrainsVectors() self.integration_brains_repository = IntegrationBrain() @@ -122,17 +123,17 @@ def create_brain( user_id: UUID, brain: Optional[CreateBrainProperties], ) -> BrainEntity: - if brain == None: + if brain is None: brain = CreateBrainProperties() # type: ignore model and brain_definition - if brain.brain_type == BrainType.API: + if brain.brain_type == BrainType.api: validate_api_brain(brain) return self.create_brain_api(user_id, brain) - if brain.brain_type == BrainType.COMPOSITE: + if brain.brain_type == BrainType.composite: return self.create_brain_composite(brain) - if brain.brain_type == BrainType.INTEGRATION: + if brain.brain_type == BrainType.integration: return self.create_brain_integration(user_id, brain) created_brain = self.brain_repository.create_brain(brain) @@ -228,7 +229,7 @@ def delete_brain(self, brain_id: UUID) -> dict[str, str]: if brain_to_delete is None: raise HTTPException(status_code=404, detail="Brain not found.") - if brain_to_delete.brain_type == BrainType.API: + if brain_to_delete.brain_type == BrainType.api: self.delete_brain_secrets_values( brain_id=brain_id, ) @@ -276,7 +277,7 @@ def update_brain_by_id( ) if ( - brain_update_answer.brain_type == BrainType.API + brain_update_answer.brain_type == BrainType.api and brain_new_values.brain_definition ): existing_brain_secrets_definition = ( @@ -320,10 +321,11 @@ def get_brain_details( self, brain_id: UUID, user_id: UUID = None ) -> BrainEntity | None: brain = self.brain_repository.get_brain_details(brain_id) - if brain == None: + if brain is None: return None - if brain.brain_type == BrainType.INTEGRATION: + # TODO: N+1 here !! + if brain.brain_type == BrainType.integration: brain.integration = ( self.integration_brains_repository.get_integration_brain( brain_id, user_id diff --git a/backend/modules/brain/service/brain_subscription/__init__.py b/backend/backend/modules/brain/service/brain_subscription/__init__.py similarity index 100% rename from backend/modules/brain/service/brain_subscription/__init__.py rename to backend/backend/modules/brain/service/brain_subscription/__init__.py diff --git a/backend/modules/brain/service/brain_subscription/resend_invitation_email.py b/backend/backend/modules/brain/service/brain_subscription/resend_invitation_email.py similarity index 82% rename from backend/modules/brain/service/brain_subscription/resend_invitation_email.py rename to backend/backend/modules/brain/service/brain_subscription/resend_invitation_email.py index 6e0ffdd6c12d..defa615bdf19 100644 --- a/backend/modules/brain/service/brain_subscription/resend_invitation_email.py +++ b/backend/backend/modules/brain/service/brain_subscription/resend_invitation_email.py @@ -1,9 +1,10 @@ from uuid import UUID -from logger import get_logger -from models import BrainSettings, BrainSubscription -from modules.brain.service.brain_service import BrainService -from packages.emails.send_email import send_email +from backend.logger import get_logger +from backend.models.brains_subscription_invitations import BrainSubscription +from backend.models.settings import BrainSettings +from backend.modules.brain.service.brain_service import BrainService +from backend.packages.emails.send_email import send_email logger = get_logger(__name__) diff --git a/backend/modules/brain/service/brain_subscription/subscription_invitation_service.py b/backend/backend/modules/brain/service/brain_subscription/subscription_invitation_service.py similarity index 91% rename from backend/modules/brain/service/brain_subscription/subscription_invitation_service.py rename to backend/backend/modules/brain/service/brain_subscription/subscription_invitation_service.py index a9172b9afd5f..478fdf3cbee6 100644 --- a/backend/modules/brain/service/brain_subscription/subscription_invitation_service.py +++ b/backend/backend/modules/brain/service/brain_subscription/subscription_invitation_service.py @@ -1,7 +1,10 @@ -from logger import get_logger -from models import BrainSubscription, get_supabase_client -from modules.brain.service.brain_user_service import BrainUserService -from modules.user.service.user_service import UserService +from backend.logger import get_logger +from backend.models.brains_subscription_invitations import ( + BrainSubscription, +) +from backend.models.settings import get_supabase_client +from backend.modules.brain.service.brain_user_service import BrainUserService +from backend.modules.user.service.user_service import UserService logger = get_logger(__name__) diff --git a/backend/modules/brain/service/brain_user_service.py b/backend/backend/modules/brain/service/brain_user_service.py similarity index 80% rename from backend/modules/brain/service/brain_user_service.py rename to backend/backend/modules/brain/service/brain_user_service.py index 6c879faacbb3..2e31f6201e7d 100644 --- a/backend/modules/brain/service/brain_user_service.py +++ b/backend/backend/modules/brain/service/brain_user_service.py @@ -2,26 +2,29 @@ from uuid import UUID from fastapi import HTTPException -from logger import get_logger -from modules.brain.entity.brain_entity import ( + +from backend.logger import get_logger +from backend.modules.brain.entity.brain_entity import ( BrainEntity, BrainType, BrainUser, MinimalUserBrainEntity, RoleEnum, ) -from modules.brain.repository.brains import Brains -from modules.brain.repository.brains_users import BrainsUsers -from modules.brain.repository.external_api_secrets import ExternalApiSecrets -from modules.brain.repository.interfaces.brains_interface import BrainsInterface -from modules.brain.repository.interfaces.brains_users_interface import ( +from backend.modules.brain.repository.brains import Brains +from backend.modules.brain.repository.brains_users import BrainsUsers +from backend.modules.brain.repository.external_api_secrets import ExternalApiSecrets +from backend.modules.brain.repository.interfaces.brains_interface import BrainsInterface +from backend.modules.brain.repository.interfaces.brains_users_interface import ( BrainsUsersInterface, ) -from modules.brain.repository.interfaces.external_api_secrets_interface import ( +from backend.modules.brain.repository.interfaces.external_api_secrets_interface import ( ExternalApiSecretsInterface, ) -from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService -from modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.api_brain_definition_service import ( + ApiBrainDefinitionService, +) +from backend.modules.brain.service.brain_service import BrainService logger = get_logger(__name__) @@ -52,7 +55,7 @@ def delete_brain_user(self, user_id: UUID, brain_id: UUID) -> None: if brain_to_delete_user_from is None: raise HTTPException(status_code=404, detail="Brain not found.") - if brain_to_delete_user_from.brain_type == BrainType.API: + if brain_to_delete_user_from.brain_type == BrainType.api: brain_definition = api_brain_definition_service.get_api_brain_definition( brain_id=brain_id ) diff --git a/backend/modules/brain/service/brain_vector_service.py b/backend/backend/modules/brain/service/brain_vector_service.py similarity index 85% rename from backend/modules/brain/service/brain_vector_service.py rename to backend/backend/modules/brain/service/brain_vector_service.py index 3617e50d4799..54aad23311a7 100644 --- a/backend/modules/brain/service/brain_vector_service.py +++ b/backend/backend/modules/brain/service/brain_vector_service.py @@ -1,13 +1,13 @@ from typing import Any, List from uuid import UUID -from logger import get_logger -from modules.brain.repository.brains_vectors import BrainsVectors -from modules.brain.repository.interfaces.brains_vectors_interface import ( +from backend.logger import get_logger +from backend.modules.brain.repository.brains_vectors import BrainsVectors +from backend.modules.brain.repository.interfaces.brains_vectors_interface import ( BrainsVectorsInterface, ) -from modules.knowledge.repository.storage import Storage -from packages.embeddings.vectors import get_unique_files_from_vector_ids +from backend.modules.knowledge.repository.storage import Storage +from backend.packages.embeddings.vectors import get_unique_files_from_vector_ids logger = get_logger(__name__) diff --git a/backend/modules/brain/service/call_brain_api.py b/backend/backend/modules/brain/service/call_brain_api.py similarity index 91% rename from backend/modules/brain/service/call_brain_api.py rename to backend/backend/modules/brain/service/call_brain_api.py index 63a589d76d66..1afda2c30fdb 100644 --- a/backend/modules/brain/service/call_brain_api.py +++ b/backend/backend/modules/brain/service/call_brain_api.py @@ -1,13 +1,20 @@ from uuid import UUID + import requests -from logger import get_logger + +from backend.logger import get_logger + logger = get_logger(__name__) from fastapi import HTTPException -from modules.brain.entity.api_brain_definition_entity import ApiBrainDefinitionSchema -from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService -from modules.brain.service.brain_service import BrainService +from backend.modules.brain.entity.api_brain_definition_entity import ( + ApiBrainDefinitionSchema, +) +from backend.modules.brain.service.api_brain_definition_service import ( + ApiBrainDefinitionService, +) +from backend.modules.brain.service.brain_service import BrainService brain_service = BrainService() api_brain_definition_service = ApiBrainDefinitionService() diff --git a/backend/modules/brain/service/get_api_brain_definition_as_json_schema.py b/backend/backend/modules/brain/service/get_api_brain_definition_as_json_schema.py similarity index 84% rename from backend/modules/brain/service/get_api_brain_definition_as_json_schema.py rename to backend/backend/modules/brain/service/get_api_brain_definition_as_json_schema.py index e2b05fcd2f74..a99c404ca01d 100644 --- a/backend/modules/brain/service/get_api_brain_definition_as_json_schema.py +++ b/backend/backend/modules/brain/service/get_api_brain_definition_as_json_schema.py @@ -2,9 +2,13 @@ from fastapi import HTTPException -from modules.brain.entity.api_brain_definition_entity import ApiBrainDefinitionSchemaProperty -from modules.brain.entity.brain_entity import BrainEntity -from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService +from backend.modules.brain.entity.api_brain_definition_entity import ( + ApiBrainDefinitionSchemaProperty, +) +from backend.modules.brain.entity.brain_entity import BrainEntity +from backend.modules.brain.service.api_brain_definition_service import ( + ApiBrainDefinitionService, +) api_brain_definition_service = ApiBrainDefinitionService() diff --git a/backend/modules/brain/service/get_question_context_from_brain.py b/backend/backend/modules/brain/service/get_question_context_from_brain.py similarity index 84% rename from backend/modules/brain/service/get_question_context_from_brain.py rename to backend/backend/modules/brain/service/get_question_context_from_brain.py index da7b9aa44da9..b528150becab 100644 --- a/backend/modules/brain/service/get_question_context_from_brain.py +++ b/backend/backend/modules/brain/service/get_question_context_from_brain.py @@ -1,10 +1,13 @@ from uuid import UUID from attr import dataclass -from logger import get_logger -from models.settings import get_embeddings, get_supabase_client -from modules.upload.service.generate_file_signed_url import generate_file_signed_url -from vectorstore.supabase import CustomSupabaseVectorStore + +from backend.logger import get_logger +from backend.models.settings import get_embedding_client, get_supabase_client +from backend.modules.upload.service.generate_file_signed_url import ( + generate_file_signed_url, +) +from backend.vectorstore.supabase import CustomSupabaseVectorStore logger = get_logger(__name__) @@ -31,7 +34,7 @@ def get_question_context_from_brain(brain_id: UUID, question: str) -> str: """ # TODO: Move to AnswerGenerator service supabase_client = get_supabase_client() - embeddings = get_embeddings() + embeddings = get_embedding_client() vector_store = CustomSupabaseVectorStore( supabase_client, diff --git a/backend/modules/brain/service/integration_brain_service.py b/backend/backend/modules/brain/service/integration_brain_service.py similarity index 73% rename from backend/modules/brain/service/integration_brain_service.py rename to backend/backend/modules/brain/service/integration_brain_service.py index c330d7262c82..8b9ab394cb1e 100644 --- a/backend/modules/brain/service/integration_brain_service.py +++ b/backend/backend/modules/brain/service/integration_brain_service.py @@ -1,6 +1,6 @@ -from modules.brain.entity.integration_brain import IntegrationDescriptionEntity -from modules.brain.repository.integration_brains import IntegrationDescription -from modules.brain.repository.interfaces import IntegrationDescriptionInterface +from backend.modules.brain.entity.integration_brain import IntegrationDescriptionEntity +from backend.modules.brain.repository.integration_brains import IntegrationDescription +from backend.modules.brain.repository.interfaces import IntegrationDescriptionInterface class IntegrationBrainDescriptionService: diff --git a/backend/modules/brain/service/test_brain_service.py b/backend/backend/modules/brain/service/test_brain_service.py similarity index 100% rename from backend/modules/brain/service/test_brain_service.py rename to backend/backend/modules/brain/service/test_brain_service.py diff --git a/backend/modules/brain/service/utils/__init__.py b/backend/backend/modules/brain/service/utils/__init__.py similarity index 100% rename from backend/modules/brain/service/utils/__init__.py rename to backend/backend/modules/brain/service/utils/__init__.py diff --git a/backend/modules/brain/service/utils/format_chat_history.py b/backend/backend/modules/brain/service/utils/format_chat_history.py similarity index 75% rename from backend/modules/brain/service/utils/format_chat_history.py rename to backend/backend/modules/brain/service/utils/format_chat_history.py index 38de22609a45..164f5e5e949e 100644 --- a/backend/modules/brain/service/utils/format_chat_history.py +++ b/backend/backend/modules/brain/service/utils/format_chat_history.py @@ -1,7 +1,8 @@ from typing import Dict, List, Tuple from langchain.schema import AIMessage, BaseMessage, HumanMessage, SystemMessage -from modules.chat.dto.outputs import GetChatHistoryOutput + +from backend.modules.chat.dto.outputs import GetChatHistoryOutput def format_chat_history( @@ -10,8 +11,10 @@ def format_chat_history( """Format the chat history into a list of HumanMessage and AIMessage""" formatted_history = [] for chat in history: - formatted_history.append(HumanMessage(chat.user_message)) - formatted_history.append(AIMessage(chat.assistant)) + if chat.user_message: + formatted_history.append(HumanMessage(content=chat.user_message)) + if chat.assistant: + formatted_history.append(AIMessage(content=chat.assistant)) return formatted_history diff --git a/backend/modules/brain/service/utils/get_prompt_to_use_id.py b/backend/backend/modules/brain/service/utils/get_prompt_to_use_id.py similarity index 66% rename from backend/modules/brain/service/utils/get_prompt_to_use_id.py rename to backend/backend/modules/brain/service/utils/get_prompt_to_use_id.py index acb5ac2e98b3..6e2b5bcfbe65 100644 --- a/backend/modules/brain/service/utils/get_prompt_to_use_id.py +++ b/backend/backend/modules/brain/service/utils/get_prompt_to_use_id.py @@ -1,7 +1,7 @@ from typing import Optional from uuid import UUID -from modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.brain_service import BrainService brain_service = BrainService() @@ -15,7 +15,5 @@ def get_prompt_to_use_id( return ( prompt_id if prompt_id - else brain_service.get_brain_prompt_id(brain_id) - if brain_id - else None + else brain_service.get_brain_prompt_id(brain_id) if brain_id else None ) diff --git a/backend/modules/brain/service/utils/validate_brain.py b/backend/backend/modules/brain/service/utils/validate_brain.py similarity index 86% rename from backend/modules/brain/service/utils/validate_brain.py rename to backend/backend/modules/brain/service/utils/validate_brain.py index 299a52fcb4f8..42012a3ada55 100644 --- a/backend/modules/brain/service/utils/validate_brain.py +++ b/backend/backend/modules/brain/service/utils/validate_brain.py @@ -1,5 +1,6 @@ from fastapi import HTTPException -from modules.brain.dto.inputs import CreateBrainProperties + +from backend.modules.brain.dto.inputs import CreateBrainProperties def validate_api_brain(brain: CreateBrainProperties): diff --git a/backend/modules/brain/tests/test_brains_interface.py b/backend/backend/modules/brain/tests/test_brains_interface.py similarity index 100% rename from backend/modules/brain/tests/test_brains_interface.py rename to backend/backend/modules/brain/tests/test_brains_interface.py diff --git a/backend/backend/modules/chat/__init__.py b/backend/backend/modules/chat/__init__.py new file mode 100644 index 000000000000..e5724e407093 --- /dev/null +++ b/backend/backend/modules/chat/__init__.py @@ -0,0 +1,6 @@ +# noqa: +from backend.modules.brain.entity.brain_entity import Brain +from backend.modules.prompt.entity.prompt import Prompt +from backend.modules.user.entity.user_identity import User + +__all__ = ["Brain", "User", "Prompt"] diff --git a/backend/modules/chat/controller/__init__.py b/backend/backend/modules/chat/controller/__init__.py similarity index 100% rename from backend/modules/chat/controller/__init__.py rename to backend/backend/modules/chat/controller/__init__.py diff --git a/backend/modules/chat/controller/chat/__init_.py b/backend/backend/modules/chat/controller/chat/__init_.py similarity index 100% rename from backend/modules/chat/controller/chat/__init_.py rename to backend/backend/modules/chat/controller/chat/__init_.py diff --git a/backend/modules/chat/controller/chat/brainful_chat.py b/backend/backend/modules/chat/controller/chat/brainful_chat.py similarity index 53% rename from backend/modules/chat/controller/chat/brainful_chat.py rename to backend/backend/modules/chat/controller/chat/brainful_chat.py index 582e8992423f..b6f9677bd074 100644 --- a/backend/modules/chat/controller/chat/brainful_chat.py +++ b/backend/backend/modules/chat/controller/chat/brainful_chat.py @@ -1,25 +1,28 @@ -from logger import get_logger -from modules.brain.entity.brain_entity import BrainType, RoleEnum -from modules.brain.integrations.Big.Brain import BigBrain -from modules.brain.integrations.GPT4.Brain import GPT4Brain -from modules.brain.integrations.Multi_Contract.Brain import MultiContractBrain -from modules.brain.integrations.Notion.Brain import NotionBrain -from modules.brain.integrations.Proxy.Brain import ProxyBrain -from modules.brain.integrations.Self.Brain import SelfBrain -from modules.brain.integrations.SQL.Brain import SQLBrain -from modules.brain.knowledge_brain_qa import KnowledgeBrainQA -from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService -from modules.brain.service.brain_authorization_service import ( +from backend.logger import get_logger +from backend.modules.brain.entity.brain_entity import BrainType, RoleEnum +from backend.modules.brain.integrations.Big.Brain import BigBrain +from backend.modules.brain.integrations.GPT4.Brain import GPT4Brain +from backend.modules.brain.integrations.Multi_Contract.Brain import MultiContractBrain +from backend.modules.brain.integrations.Notion.Brain import NotionBrain +from backend.modules.brain.integrations.Proxy.Brain import ProxyBrain +from backend.modules.brain.integrations.Self.Brain import SelfBrain +from backend.modules.brain.integrations.SQL.Brain import SQLBrain +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.brain.service.api_brain_definition_service import ( + ApiBrainDefinitionService, +) +from backend.modules.brain.service.brain_authorization_service import ( validate_brain_authorization, ) -from modules.brain.service.brain_service import BrainService -from modules.brain.service.integration_brain_service import ( +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.integration_brain_service import ( IntegrationBrainDescriptionService, ) -from modules.chat.controller.chat.interface import ChatInterface -from modules.chat.service.chat_service import ChatService +from backend.modules.chat.controller.chat.interface import ChatInterface +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service -chat_service = ChatService() +chat_service = get_service(ChatService)() api_brain_definition_service = ApiBrainDefinitionService() integration_brain_description_service = IntegrationBrainDescriptionService() @@ -53,19 +56,22 @@ brain_service = BrainService() -class BrainfulChat(ChatInterface): - def validate_authorization(self, user_id, brain_id): - if brain_id: - validate_brain_authorization( - brain_id=brain_id, - user_id=user_id, - required_roles=[RoleEnum.Viewer, RoleEnum.Editor, RoleEnum.Owner], - ) +def validate_authorization(user_id, brain_id): + if brain_id: + validate_brain_authorization( + brain_id=brain_id, + user_id=user_id, + required_roles=[RoleEnum.Viewer, RoleEnum.Editor, RoleEnum.Owner], + ) + +# TODO: redo this +class BrainfulChat(ChatInterface): def get_answer_generator( self, brain, chat_id, + chat_service, model, temperature, streaming, @@ -73,8 +79,9 @@ def get_answer_generator( user_id, user_email, ): - if brain and brain.brain_type == BrainType.DOC: + if brain and brain.brain_type == BrainType.doc: return KnowledgeBrainQA( + chat_service=chat_service, chat_id=chat_id, brain_id=str(brain.brain_id), streaming=streaming, @@ -83,7 +90,7 @@ def get_answer_generator( user_email=user_email, ) - if brain.brain_type == BrainType.INTEGRATION: + if brain.brain_type == BrainType.integration: integration_brain = integration_brain_description_service.get_integration_description_by_user_brain_id( brain.brain_id, user_id ) @@ -93,6 +100,7 @@ def get_answer_generator( ) if integration_class: return integration_class( + chat_service=chat_service, chat_id=chat_id, temperature=temperature, brain_id=str(brain.brain_id), diff --git a/backend/modules/chat/controller/chat/brainless_chat.py b/backend/backend/modules/chat/controller/chat/brainless_chat.py similarity index 88% rename from backend/modules/chat/controller/chat/brainless_chat.py rename to backend/backend/modules/chat/controller/chat/brainless_chat.py index c5dcec220175..5dd5d0bd9f16 100644 --- a/backend/modules/chat/controller/chat/brainless_chat.py +++ b/backend/backend/modules/chat/controller/chat/brainless_chat.py @@ -1,5 +1,6 @@ from llm.qa_headless import HeadlessQA -from modules.chat.controller.chat.interface import ChatInterface + +from backend.modules.chat.controller.chat.interface import ChatInterface class BrainlessChat(ChatInterface): diff --git a/backend/modules/chat/controller/chat/factory.py b/backend/backend/modules/chat/controller/chat/factory.py similarity index 100% rename from backend/modules/chat/controller/chat/factory.py rename to backend/backend/modules/chat/controller/chat/factory.py diff --git a/backend/modules/chat/controller/chat/interface.py b/backend/backend/modules/chat/controller/chat/interface.py similarity index 75% rename from backend/modules/chat/controller/chat/interface.py rename to backend/backend/modules/chat/controller/chat/interface.py index 73745df7f283..a0bbc95c89c5 100644 --- a/backend/modules/chat/controller/chat/interface.py +++ b/backend/backend/modules/chat/controller/chat/interface.py @@ -2,10 +2,6 @@ class ChatInterface(ABC): - @abstractmethod - def validate_authorization(self, user_id, required_roles): - pass - @abstractmethod def get_answer_generator( self, diff --git a/backend/modules/chat/controller/chat/test_utils.py b/backend/backend/modules/chat/controller/chat/test_utils.py similarity index 100% rename from backend/modules/chat/controller/chat/test_utils.py rename to backend/backend/modules/chat/controller/chat/test_utils.py diff --git a/backend/modules/chat/controller/chat/utils.py b/backend/backend/modules/chat/controller/chat/utils.py similarity index 83% rename from backend/modules/chat/controller/chat/utils.py rename to backend/backend/modules/chat/controller/chat/utils.py index 9632e7dddf5c..12df20e994b6 100644 --- a/backend/modules/chat/controller/chat/utils.py +++ b/backend/backend/modules/chat/controller/chat/utils.py @@ -2,15 +2,12 @@ from uuid import UUID from fastapi import HTTPException -from logger import get_logger -from models.databases.llm_models import LLMModels -from modules.brain.service.brain_service import BrainService -from modules.chat.service.chat_service import ChatService -from modules.user.service.user_usage import UserUsage + +from backend.logger import get_logger +from backend.models.databases.llm_models import LLMModel +from backend.modules.user.service.user_usage import UserUsage logger = get_logger(__name__) -brain_service = BrainService() -chat_service = ChatService() class NullableUUID(UUID): @@ -29,16 +26,25 @@ def validate(v, values, **kwargs): return None +# TODO: rewrite +def compute_cost(model_to_use, models_settings): + model = model_to_use.name + user_choosen_model_price = 1000 + for model_setting in models_settings: + if model_setting["name"] == model: + user_choosen_model_price = model_setting["price"] + return user_choosen_model_price + + +# TODO: rewrite def find_model_and_generate_metadata( - chat_id: UUID, - brain_model: str, + brain_model: str | None, user_settings, models_settings, ): - # Default model is gpt-3.5-turbo-0125 default_model = "gpt-3.5-turbo-0125" - model_to_use = LLMModels( # TODO Implement default models in database + model_to_use = LLMModel( # TODO Implement default models in database name=default_model, price=1, max_input=4000, max_output=1000 ) @@ -88,7 +94,6 @@ def update_user_usage(usage: UserUsage, user_settings, cost: int = 100): Raises: HTTPException: Raises a 429 error if the user has reached the limit. """ - usage date = time.strftime("%Y%m%d") diff --git a/backend/modules/chat/controller/chat_routes.py b/backend/backend/modules/chat/controller/chat_routes.py similarity index 59% rename from backend/modules/chat/controller/chat_routes.py rename to backend/backend/modules/chat/controller/chat_routes.py index 5eaa951952e0..48ce44e01271 100644 --- a/backend/modules/chat/controller/chat_routes.py +++ b/backend/backend/modules/chat/controller/chat_routes.py @@ -3,83 +3,81 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Request from fastapi.responses import StreamingResponse -from langchain_community.embeddings import OllamaEmbeddings -from langchain_openai import OpenAIEmbeddings -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from models.settings import BrainSettings, get_supabase_client -from modules.brain.service.brain_service import BrainService -from modules.chat.controller.chat.brainful_chat import BrainfulChat -from modules.chat.dto.chats import ChatItem, ChatQuestion -from modules.chat.dto.inputs import ( + +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.models.settings import get_embedding_client, get_supabase_client +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.chat.controller.chat.brainful_chat import ( + BrainfulChat, + validate_authorization, +) +from backend.modules.chat.dto.chats import ChatItem, ChatQuestion +from backend.modules.chat.dto.inputs import ( ChatMessageProperties, ChatUpdatableProperties, CreateChatProperties, QuestionAndAnswer, ) -from modules.chat.entity.chat import Chat -from modules.chat.service.chat_service import ChatService -from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_usage import UserUsage -from packages.utils.telemetry import maybe_send_telemetry -from vectorstore.supabase import CustomSupabaseVectorStore +from backend.modules.chat.entity.chat import Chat +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.dependencies import get_service +from backend.modules.knowledge.repository.knowledges import KnowledgeRepository +from backend.modules.prompt.service.prompt_service import PromptService +from backend.modules.user.entity.user_identity import UserIdentity +from backend.packages.quivr_core.brain_factory import RAGService +from backend.packages.utils.telemetry import maybe_send_telemetry +from backend.vectorstore.supabase import CustomSupabaseVectorStore logger = get_logger(__name__) chat_router = APIRouter() - brain_service = BrainService() -chat_service = ChatService() +knowledge_service = KnowledgeRepository() +prompt_service = PromptService() + + +ChatServiceDep = Annotated[ChatService, Depends(get_service(ChatService))] +UserIdentityDep = Annotated[UserIdentity, Depends(get_current_user)] def init_vector_store(user_id: UUID) -> CustomSupabaseVectorStore: """ Initialize the vector store """ - brain_settings = BrainSettings() supabase_client = get_supabase_client() - embeddings = None - if brain_settings.ollama_api_base_url: - embeddings = OllamaEmbeddings( - base_url=brain_settings.ollama_api_base_url - ) # pyright: ignore reportPrivateUsage=none - else: - embeddings = OpenAIEmbeddings() + embedding_service = get_embedding_client() vector_store = CustomSupabaseVectorStore( - supabase_client, embeddings, table_name="vectors", user_id=user_id + supabase_client, embedding_service, table_name="vectors", user_id=user_id ) return vector_store -def get_answer_generator( +async def get_answer_generator( chat_id: UUID, chat_question: ChatQuestion, - brain_id: UUID, + chat_service: ChatService, + brain_id: UUID | None, current_user: UserIdentity, ): chat_instance = BrainfulChat() - - user_usage = UserUsage( - id=current_user.id, - email=current_user.email, - ) - vector_store = init_vector_store(user_id=current_user.id) # Get History only if needed if not brain_id: - history = chat_service.get_chat_history(chat_id) + history = await chat_service.get_chat_history(chat_id) else: history = [] - # Generic + # TODO(@aminediro) : NOT USED anymore brain, metadata_brain = brain_service.find_brain_from_question( brain_id, chat_question.question, current_user, chat_id, history, vector_store ) gpt_answer_generator = chat_instance.get_answer_generator( brain=brain, chat_id=str(chat_id), + chat_service=chat_service, model=brain.model, temperature=0.1, streaming=True, @@ -98,7 +96,7 @@ async def healthz(): # get all chats @chat_router.get("/chat", dependencies=[Depends(AuthBearer())], tags=["Chat"]) -async def get_chats(current_user: UserIdentity = Depends(get_current_user)): +async def get_chats(current_user: UserIdentityDep, chat_service: ChatServiceDep): """ Retrieve all chats for the current user. @@ -108,7 +106,7 @@ async def get_chats(current_user: UserIdentity = Depends(get_current_user)): This endpoint retrieves all the chats associated with the current authenticated user. It returns a list of chat objects containing the chat ID and chat name for each chat. """ - chats = chat_service.get_user_chats(str(current_user.id)) + chats = await chat_service.get_user_chats(current_user.id) return {"chats": chats} @@ -116,7 +114,7 @@ async def get_chats(current_user: UserIdentity = Depends(get_current_user)): @chat_router.delete( "/chat/{chat_id}", dependencies=[Depends(AuthBearer())], tags=["Chat"] ) -async def delete_chat(chat_id: UUID): +async def delete_chat(chat_id: UUID, chat_service: ChatServiceDep): """ Delete a specific chat by chat ID. """ @@ -132,15 +130,14 @@ async def delete_chat(chat_id: UUID): async def update_chat_metadata_handler( chat_data: ChatUpdatableProperties, chat_id: UUID, - current_user: UserIdentity = Depends(get_current_user), + current_user: UserIdentityDep, + chat_service: ChatServiceDep, ): """ Update chat attributes """ - chat = chat_service.get_chat_by_id( - chat_id # pyright: ignore reportPrivateUsage=none - ) + chat = await chat_service.get_chat_by_id(chat_id) if str(current_user.id) != chat.user_id: raise HTTPException( status_code=403, # pyright: ignore reportPrivateUsage=none @@ -150,17 +147,15 @@ async def update_chat_metadata_handler( # update existing message -@chat_router.put( - "/chat/{chat_id}/{message_id}", dependencies=[Depends(AuthBearer())], tags=["Chat"] -) +@chat_router.put("/chat/{chat_id}/{message_id}", tags=["Chat"]) async def update_chat_message( chat_message_properties: ChatMessageProperties, chat_id: UUID, message_id: UUID, - current_user: UserIdentity = Depends(get_current_user), + current_user: UserIdentityDep, + chat_service: ChatServiceDep, ): - - chat = chat_service.get_chat_by_id( + chat = await chat_service.get_chat_by_id( chat_id # pyright: ignore reportPrivateUsage=none ) if str(current_user.id) != chat.user_id: @@ -179,13 +174,16 @@ async def update_chat_message( @chat_router.post("/chat", dependencies=[Depends(AuthBearer())], tags=["Chat"]) async def create_chat_handler( chat_data: CreateChatProperties, - current_user: UserIdentity = Depends(get_current_user), + current_user: UserIdentityDep, + chat_service: ChatServiceDep, ): """ Create a new chat with initial chat messages. """ - return chat_service.create_chat(user_id=current_user.id, chat_data=chat_data) + return await chat_service.create_chat( + user_id=current_user.id, new_chat_data=chat_data + ) # add new question to chat @@ -202,23 +200,32 @@ async def create_question_handler( request: Request, chat_question: ChatQuestion, chat_id: UUID, + current_user: UserIdentityDep, + chat_service: ChatServiceDep, brain_id: Annotated[UUID | None, Query()] = None, - current_user: UserIdentity = Depends(get_current_user), ): + # TODO: check logic into middleware + validate_authorization(user_id=current_user.id, brain_id=brain_id) try: - logger.info( - f"Creating question for chat {chat_id} with brain {brain_id} of type {type(brain_id)}" - ) - gpt_answer_generator = get_answer_generator( - chat_id, chat_question, brain_id, current_user + rag_service = RAGService( + current_user, + brain_id, + chat_id, + brain_service, + prompt_service, + chat_service, + knowledge_service, ) + chat_answer = await rag_service.generate_answer(chat_question.question) - chat_answer = gpt_answer_generator.generate_answer( - chat_id, chat_question, save_answer=True - ) maybe_send_telemetry("question_asked", {"streaming": False}, request) - return chat_answer + + except AssertionError: + raise HTTPException( + status_code=422, + detail="inprocessable entity", + ) except HTTPException as e: raise e @@ -237,32 +244,31 @@ async def create_stream_question_handler( request: Request, chat_question: ChatQuestion, chat_id: UUID, + chat_service: ChatServiceDep, + current_user: UserIdentityDep, brain_id: Annotated[UUID | None, Query()] = None, - current_user: UserIdentity = Depends(get_current_user), ) -> StreamingResponse: - - chat_instance = BrainfulChat() - chat_instance.validate_authorization(user_id=current_user.id, brain_id=brain_id) + validate_authorization(user_id=current_user.id, brain_id=brain_id) logger.info( f"Creating question for chat {chat_id} with brain {brain_id} of type {type(brain_id)}" ) - gpt_answer_generator = get_answer_generator( - chat_id, chat_question, brain_id, current_user + rag_service = RAGService( + current_user, + brain_id, + chat_id, + brain_service, + prompt_service, + chat_service, + knowledge_service, ) maybe_send_telemetry("question_asked", {"streaming": True}, request) - try: - return StreamingResponse( - gpt_answer_generator.generate_stream( - chat_id, chat_question, save_answer=True - ), - media_type="text/event-stream", - ) - - except HTTPException as e: - raise e + return StreamingResponse( + rag_service.generate_answer_stream(chat_question.question), + media_type="text/event-stream", + ) # get chat history @@ -271,9 +277,9 @@ async def create_stream_question_handler( ) async def get_chat_history_handler( chat_id: UUID, + chat_service: ChatServiceDep, ) -> List[ChatItem]: - # TODO: RBAC with current_user - return chat_service.get_chat_history_with_notifications(chat_id) + return await chat_service.get_chat_history_with_notifications(chat_id) @chat_router.post( @@ -284,8 +290,11 @@ async def get_chat_history_handler( async def add_question_and_answer_handler( chat_id: UUID, question_and_answer: QuestionAndAnswer, + chat_service: ChatServiceDep, ) -> Optional[Chat]: """ Add a new question and anwser to the chat. """ - return chat_service.add_question_and_answer(chat_id, question_and_answer) + history = await chat_service.add_question_and_answer(chat_id, question_and_answer) + # TODO(@aminediro) : Do we need to return the chat ?? + return history.chat diff --git a/backend/modules/chat/dto/__init__.py b/backend/backend/modules/chat/dto/__init__.py similarity index 100% rename from backend/modules/chat/dto/__init__.py rename to backend/backend/modules/chat/dto/__init__.py diff --git a/backend/modules/chat/dto/chats.py b/backend/backend/modules/chat/dto/chats.py similarity index 87% rename from backend/modules/chat/dto/chats.py rename to backend/backend/modules/chat/dto/chats.py index ad03a510f7e2..38e0ca856bcb 100644 --- a/backend/modules/chat/dto/chats.py +++ b/backend/backend/modules/chat/dto/chats.py @@ -2,10 +2,11 @@ from typing import List, Optional, Tuple, Union from uuid import UUID -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.notification.entity.notification import Notification from pydantic import BaseModel +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.notification.entity.notification import Notification + class ChatMessage(BaseModel): model: str diff --git a/backend/modules/chat/dto/inputs.py b/backend/backend/modules/chat/dto/inputs.py similarity index 100% rename from backend/modules/chat/dto/inputs.py rename to backend/backend/modules/chat/dto/inputs.py diff --git a/backend/modules/chat/dto/outputs.py b/backend/backend/modules/chat/dto/outputs.py similarity index 79% rename from backend/modules/chat/dto/outputs.py rename to backend/backend/modules/chat/dto/outputs.py index 132f35240a21..86ee1fd6adba 100644 --- a/backend/modules/chat/dto/outputs.py +++ b/backend/backend/modules/chat/dto/outputs.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import List, Optional from uuid import UUID @@ -6,15 +7,13 @@ class GetChatHistoryOutput(BaseModel): chat_id: UUID - message_id: Optional[UUID] | str + message_id: UUID user_message: str - assistant: str - message_time: Optional[str] = None - prompt_title: Optional[str] | None = None - brain_name: Optional[str] | None = None - brain_id: Optional[str] | None = ( - None # string because UUID is not JSON serializable - ) + message_time: datetime + assistant: str | None = None + prompt_title: str | None = None + brain_name: str | None = None + brain_id: UUID | None = None # string because UUID is not JSON serializable metadata: Optional[dict] | None = None thumbs: Optional[bool] | None = None diff --git a/backend/modules/chat/entity/__init__.py b/backend/backend/modules/chat/entity/__init__.py similarity index 100% rename from backend/modules/chat/entity/__init__.py rename to backend/backend/modules/chat/entity/__init__.py diff --git a/backend/backend/modules/chat/entity/chat.py b/backend/backend/modules/chat/entity/chat.py new file mode 100644 index 000000000000..b79599bc9f24 --- /dev/null +++ b/backend/backend/modules/chat/entity/chat.py @@ -0,0 +1,81 @@ +from datetime import datetime +from typing import List +from uuid import UUID + +from sqlalchemy.ext.asyncio import AsyncAttrs +from sqlmodel import JSON, TIMESTAMP, Column, Field, Relationship, SQLModel, text +from sqlmodel import UUID as PGUUID + +from backend.modules.brain.entity.brain_entity import Brain +from backend.modules.user.entity.user_identity import User + + +class Chat(SQLModel, table=True): + __tablename__ = "chats" # type: ignore + chat_id: UUID | None = Field( + default=None, + sa_column=Column( + PGUUID, + server_default=text("uuid_generate_v4()"), + primary_key=True, + ), + ) + chat_name: str | None + creation_time: datetime | None = Field( + default=None, + sa_column=Column( + TIMESTAMP(timezone=False), + server_default=text("CURRENT_TIMESTAMP"), + ), + ) + user_id: UUID | None = Field(default=None, foreign_key="users.id") + user: User | None = Relationship(back_populates="chats") # type: ignore + chat_history: List["ChatHistory"] | None = Relationship(back_populates="chat") # type: ignore + + +class ChatHistory(AsyncAttrs, SQLModel, table=True): + __tablename__ = "chat_history" # type: ignore # type : ignore + + message_id: UUID | None = Field( + default=None, + sa_column=Column( + PGUUID, + server_default=text("uuid_generate_v4()"), + primary_key=True, + ), + ) + chat_id: UUID | None = Field( + default=None, + foreign_key="chats.chat_id", + primary_key=True, + nullable=False, # Added nullable constraint + ) + chat: Chat | None = Relationship( + back_populates="chat_history", sa_relationship_kwargs={"lazy": "select"} + ) # type: ignore + user_message: str | None = None + assistant: str | None = None + message_time: datetime | None = Field( + default=None, + sa_column=Column( + TIMESTAMP(timezone=False), + server_default=text("CURRENT_TIMESTAMP"), + ), + ) + metadata_: dict | None = Field( + default=None, sa_column=Column("metadata", JSON, default=None) + ) + prompt_id: UUID | None = Field(default=None, foreign_key="prompts.id") + brain_id: UUID | None = Field( + default=None, + foreign_key="brains.brain_id", + ) + + thumbs: bool | None = None + brain: Brain | None = Relationship( + back_populates="brain_chat_history", sa_relationship_kwargs={"lazy": "select"} + ) # type: ignore + + class Config: + # Note: Pydantic can't generate schema for arbitrary types + arbitrary_types_allowed = True diff --git a/backend/modules/chat/repository/__init__.py b/backend/backend/modules/chat/repository/__init__.py similarity index 100% rename from backend/modules/chat/repository/__init__.py rename to backend/backend/modules/chat/repository/__init__.py diff --git a/backend/backend/modules/chat/repository/chats.py b/backend/backend/modules/chat/repository/chats.py new file mode 100644 index 000000000000..2f5d0fc8b59e --- /dev/null +++ b/backend/backend/modules/chat/repository/chats.py @@ -0,0 +1,124 @@ +from typing import Sequence +from uuid import UUID + +from sqlalchemy import exc +from sqlmodel import select +from sqlmodel.ext.asyncio.session import AsyncSession + +from backend.models.settings import get_supabase_client +from backend.modules.chat.dto.inputs import ChatMessageProperties, QuestionAndAnswer +from backend.modules.chat.entity.chat import Chat, ChatHistory +from backend.modules.dependencies import BaseRepository + + +class ChatRepository(BaseRepository): + def __init__(self, session: AsyncSession): + super().__init__(session) + # TODO: for now use it instead of session + self.db = get_supabase_client() + + async def get_user_chats(self, user_id: UUID) -> Sequence[Chat]: + query = select(Chat).where(Chat.user_id == user_id) + response = await self.session.exec(query) + return response.all() + + async def create_chat(self, new_chat: Chat) -> Chat: + try: + self.session.add(new_chat) + await self.session.commit() + except exc.IntegrityError: + await self.session.rollback() + # TODO(@aminediro): Custom exceptions + raise Exception() + + await self.session.refresh(new_chat) + return new_chat + + async def get_chat_by_id(self, chat_id: UUID): + query = select(Chat).where(Chat.chat_id == chat_id) + response = await self.session.exec(query) + return response.one() + + async def get_chat_history(self, chat_id: UUID) -> Sequence[ChatHistory]: + query = ( + select(ChatHistory) + .where(ChatHistory.chat_id == chat_id) + # TODO: type hints of sqlmodel arent stable for order_by + .order_by(ChatHistory.message_time) # type: ignore + ) + response = await self.session.exec(query) + return response.all() + + async def add_question_and_answer( + self, chat_id: UUID, question_and_answer: QuestionAndAnswer + ) -> ChatHistory: + chat = ChatHistory( + chat_id=chat_id, + user_message=question_and_answer.question, + assistant=question_and_answer.answer, + ) + try: + self.session.add(chat) + await self.session.commit() + except exc.IntegrityError: + await self.session.rollback() + # TODO(@aminediro) : for now, build an exception system + raise Exception("can't create chat_history ") + await self.session.refresh(chat) + return chat + + def update_chat_history(self, chat_history): + response = ( + self.db.table("chat_history") + .insert( + { + "chat_id": str(chat_history.chat_id), + "user_message": chat_history.user_message, + "assistant": chat_history.assistant, + "prompt_id": ( + str(chat_history.prompt_id) if chat_history.prompt_id else None + ), + "brain_id": ( + str(chat_history.brain_id) if chat_history.brain_id else None + ), + "metadata": chat_history.metadata if chat_history.metadata else {}, + } + ) + .execute() + ) + return response + + def update_chat(self, chat_id, updates): + response = ( + self.db.table("chats").update(updates).match({"chat_id": chat_id}).execute() + ) + + return response + + def update_message_by_id(self, message_id, updates): + response = ( + self.db.table("chat_history") + .update(updates) + .match({"message_id": message_id}) + .execute() + ) + + return response + + def delete_chat(self, chat_id): + self.db.table("chats").delete().match({"chat_id": chat_id}).execute() + + def delete_chat_history(self, chat_id): + self.db.table("chat_history").delete().match({"chat_id": chat_id}).execute() + + def update_chat_message( + self, chat_id, message_id, chat_message_properties: ChatMessageProperties + ): + response = ( + self.db.table("chat_history") + .update(chat_message_properties) + .match({"message_id": message_id, "chat_id": chat_id}) + .execute() + ) + + return response diff --git a/backend/modules/chat/repository/chats_interface.py b/backend/backend/modules/chat/repository/chats_interface.py similarity index 85% rename from backend/modules/chat/repository/chats_interface.py rename to backend/backend/modules/chat/repository/chats_interface.py index beef55444efa..681fa36352ce 100644 --- a/backend/modules/chat/repository/chats_interface.py +++ b/backend/backend/modules/chat/repository/chats_interface.py @@ -2,8 +2,12 @@ from typing import Optional from uuid import UUID -from modules.chat.dto.inputs import ChatMessageProperties, CreateChatHistory, QuestionAndAnswer -from modules.chat.entity.chat import Chat +from backend.modules.chat.dto.inputs import ( + ChatMessageProperties, + CreateChatHistory, + QuestionAndAnswer, +) +from backend.modules.chat.entity.chat import Chat class ChatsInterface(ABC): @@ -80,7 +84,9 @@ def delete_chat_history(self, chat_id): pass @abstractmethod - def update_chat_message(self, chat_id, message_id, chat_message_properties: ChatMessageProperties): + def update_chat_message( + self, chat_id, message_id, chat_message_properties: ChatMessageProperties + ): """ Update chat message """ diff --git a/backend/modules/chat/service/__init__.py b/backend/backend/modules/chat/service/__init__.py similarity index 100% rename from backend/modules/chat/service/__init__.py rename to backend/backend/modules/chat/service/__init__.py diff --git a/backend/modules/chat/service/chat_service.py b/backend/backend/modules/chat/service/chat_service.py similarity index 51% rename from backend/modules/chat/service/chat_service.py rename to backend/backend/modules/chat/service/chat_service.py index c8c629e58704..84038087549e 100644 --- a/backend/modules/chat/service/chat_service.py +++ b/backend/backend/modules/chat/service/chat_service.py @@ -1,25 +1,30 @@ import random -from typing import List, Optional +from typing import List from uuid import UUID from fastapi import HTTPException -from logger import get_logger -from modules.brain.service.brain_service import BrainService -from modules.chat.dto.chats import ChatItem -from modules.chat.dto.inputs import ( + +from backend.logger import get_logger +from backend.modules.brain.entity.brain_entity import Brain +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.chat.dto.chats import ChatItem +from backend.modules.chat.dto.inputs import ( ChatMessageProperties, ChatUpdatableProperties, CreateChatHistory, CreateChatProperties, QuestionAndAnswer, ) -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.chat.entity.chat import Chat, ChatHistory -from modules.chat.repository.chats import Chats -from modules.chat.repository.chats_interface import ChatsInterface -from modules.chat.service.utils import merge_chat_history_and_notifications -from modules.notification.service.notification_service import NotificationService -from modules.prompt.service.prompt_service import PromptService +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.entity.chat import Chat, ChatHistory +from backend.modules.chat.repository.chats import ChatRepository +from backend.modules.chat.service.utils import merge_chat_history_and_notifications +from backend.modules.dependencies import BaseService +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.prompt.entity.prompt import Prompt +from backend.modules.prompt.service.prompt_service import PromptService logger = get_logger(__name__) @@ -28,25 +33,24 @@ notification_service = NotificationService() -class ChatService: - repository: ChatsInterface +class ChatService(BaseService[ChatRepository]): + repository_cls = ChatRepository - def __init__(self): - self.repository = Chats() + def __init__(self, repository: ChatRepository): + self.repository = repository - def create_chat(self, user_id: UUID, chat_data: CreateChatProperties) -> Chat: + async def create_chat( + self, user_id: UUID, new_chat_data: CreateChatProperties + ) -> Chat: # Chat is created upon the user's first question asked logger.info(f"New chat entry in chats table for user {user_id}") - # Insert a new row into the chats table - new_chat = { - "user_id": str(user_id), - "chat_name": chat_data.name, - } - insert_response = self.repository.create_chat(new_chat) - logger.info(f"Insert response {insert_response.data}") + inserted_chat = await self.repository.create_chat( + Chat(chat_name=new_chat_data.name, user_id=user_id) + ) + logger.info(f"Insert response {inserted_chat}") - return insert_response.data[0] + return inserted_chat def get_follow_up_question( self, brain_id: UUID = None, question: str = None @@ -67,69 +71,52 @@ def get_follow_up_question( random3 = random.sample(follow_up, 3) return random3 - def add_question_and_answer( + async def add_question_and_answer( self, chat_id: UUID, question_and_answer: QuestionAndAnswer - ) -> Optional[Chat]: - return self.repository.add_question_and_answer(chat_id, question_and_answer) - - def get_chat_by_id(self, chat_id: str) -> Chat: - response = self.repository.get_chat_by_id(chat_id) - return Chat(response.data[0]) - - def get_chat_history(self, chat_id: str) -> List[GetChatHistoryOutput]: - history: List[dict] = self.repository.get_chat_history(chat_id).data - if history is None: - return [] - else: - enriched_history: List[GetChatHistoryOutput] = [] - brain_cache = {} - prompt_cache = {} - for message in history: - message = ChatHistory(message) - brain = None - if message.brain_id: - if message.brain_id in brain_cache: - brain = brain_cache[message.brain_id] - else: - brain = brain_service.get_brain_by_id(message.brain_id) - brain_cache[message.brain_id] = brain - - prompt = None - if message.prompt_id: - if message.prompt_id in prompt_cache: - prompt = prompt_cache[message.prompt_id] - else: - prompt = prompt_service.get_prompt_by_id(message.prompt_id) - prompt_cache[message.prompt_id] = prompt - - enriched_history.append( - GetChatHistoryOutput( - chat_id=(UUID(message.chat_id)), - message_id=(UUID(message.message_id)), - user_message=message.user_message, - assistant=message.assistant, - message_time=message.message_time, - brain_name=brain.name if brain else None, - brain_id=str(brain.id) if brain else None, - prompt_title=prompt.title if prompt else None, - metadata=message.metadata, - thumbs=message.thumbs, - ) - ) + ) -> ChatHistory: + return await self.repository.add_question_and_answer( + chat_id, question_and_answer + ) + + async def get_chat_by_id(self, chat_id: UUID) -> Chat: + chat = await self.repository.get_chat_by_id(chat_id) + return chat + + async def get_chat_history(self, chat_id: UUID) -> List[GetChatHistoryOutput]: + history = await self.repository.get_chat_history(chat_id) + enriched_history: List[GetChatHistoryOutput] = [] + if len(history) == 0: return enriched_history + brain: Brain = await history[0].awaitable_attrs.brain + prompt: Prompt = await brain.awaitable_attrs.prompt + for message in history: + enriched_history.append( + # TODO : WHY bother with having ids here ?? + GetChatHistoryOutput( + chat_id=(message.chat_id), + message_id=message.message_id, + user_message=message.user_message, + assistant=message.assistant, + message_time=message.message_time, + brain_name=brain.name if brain else None, + brain_id=brain.brain_id if brain else None, + prompt_title=(prompt.title if prompt else None), + metadata=message.metadata_, + thumbs=message.thumbs, + ) + ) + return enriched_history - def get_chat_history_with_notifications( + async def get_chat_history_with_notifications( self, chat_id: UUID, ) -> List[ChatItem]: - chat_history = self.get_chat_history(str(chat_id)) + chat_history = await self.get_chat_history(chat_id) chat_notifications = [] return merge_chat_history_and_notifications(chat_history, chat_notifications) - def get_user_chats(self, user_id: str) -> List[Chat]: - response = self.repository.get_user_chats(user_id) - chats = [Chat(chat_dict) for chat_dict in response.data] - return chats + async def get_user_chats(self, user_id: UUID) -> List[Chat]: + return list(await self.repository.get_user_chats(user_id)) def update_chat_history(self, chat_history: CreateChatHistory) -> ChatHistory: response: List[ChatHistory] = ( @@ -140,7 +127,7 @@ def update_chat_history(self, chat_history: CreateChatHistory) -> ChatHistory: status_code=500, detail="An exception occurred while updating chat history.", ) - return ChatHistory(response[0]) # pyright: ignore reportPrivateUsage=none + return ChatHistory(**response[0]) # pyright: ignore reportPrivateUsage=none def update_chat(self, chat_id, chat_data: ChatUpdatableProperties) -> Chat: if not chat_id: @@ -186,13 +173,15 @@ def update_message_by_id( updated_message = None if updates: - updated_message = (self.repository.update_message_by_id(message_id, updates)).data[ # type: ignore + updated_message = ( + self.repository.update_message_by_id(message_id, updates) + ).data[ # type: ignore 0 ] logger.info(f"Message {message_id} updated") else: logger.info(f"No updates to apply for message {message_id}") - return ChatHistory(updated_message) # pyright: ignore reportPrivateUsage=none + return ChatHistory(**updated_message) # pyright: ignore reportPrivateUsage=none def delete_chat_from_db(self, chat_id): try: diff --git a/backend/modules/chat/service/utils.py b/backend/backend/modules/chat/service/utils.py similarity index 57% rename from backend/modules/chat/service/utils.py rename to backend/backend/modules/chat/service/utils.py index 5776fa25b443..b3d83d4ff86d 100644 --- a/backend/modules/chat/service/utils.py +++ b/backend/backend/modules/chat/service/utils.py @@ -1,13 +1,14 @@ from typing import List -from logger import get_logger -from modules.brain.service.brain_service import BrainService -from modules.chat.dto.chats import ChatItem, ChatItemType -from modules.chat.dto.outputs import GetChatHistoryOutput -from modules.notification.entity.notification import Notification -from modules.notification.service.notification_service import NotificationService -from modules.prompt.service.prompt_service import PromptService -from packages.utils import parse_message_time +from backend.logger import get_logger +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.chat.dto.chats import ChatItem, ChatItemType +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.notification.entity.notification import Notification +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.prompt.service.prompt_service import PromptService logger = get_logger(__name__) @@ -22,9 +23,11 @@ def merge_chat_history_and_notifications( chat_history_and_notifications = chat_history + notifications chat_history_and_notifications.sort( - key=lambda x: parse_message_time(x.message_time) - if isinstance(x, GetChatHistoryOutput) - else parse_message_time(x.datetime) + key=lambda x: ( + x.message_time + if isinstance(x, GetChatHistoryOutput) and x.message_time + else x.datetime + ) ) transformed_data = [] diff --git a/backend/modules/chat/tests/test_chats.py b/backend/backend/modules/chat/tests/conftest.py similarity index 100% rename from backend/modules/chat/tests/test_chats.py rename to backend/backend/modules/chat/tests/conftest.py diff --git a/backend/backend/modules/chat/tests/test_chats.py b/backend/backend/modules/chat/tests/test_chats.py new file mode 100644 index 000000000000..11a541a0b2f7 --- /dev/null +++ b/backend/backend/modules/chat/tests/test_chats.py @@ -0,0 +1,177 @@ +import asyncio +import os +from typing import List, Tuple +from uuid import uuid4 + +import pytest +import pytest_asyncio +import sqlalchemy +from sqlalchemy.ext.asyncio import create_async_engine +from sqlmodel import create_engine, select +from sqlmodel.ext.asyncio.session import AsyncSession + +from backend.modules.brain.entity.brain_entity import Brain, BrainType +from backend.modules.chat.dto.inputs import QuestionAndAnswer +from backend.modules.chat.entity.chat import Chat, ChatHistory +from backend.modules.chat.repository.chats import ChatRepository +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.user.entity.user_identity import User + +pg_database_url = "postgres:postgres@localhost:54322/postgres" + + +@pytest.fixture(scope="session", autouse=True) +def db_setup(): + # setup + sync_engine = create_engine( + "postgresql://" + pg_database_url, + echo=True if os.getenv("ORM_DEBUG") else False, + ) + # TODO(@amine) : for now don't drop anything + yield sync_engine + # teardown + # NOTE: For now we rely on Supabase migrations for defining schemas + # SQLModel.metadata.create_all(sync_engine, checkfirst=True) + # SQLModel.metadata.drop_all(sync_engine) + + +@pytest_asyncio.fixture(scope="session") +async def async_engine(): + engine = create_async_engine( + "postgresql+asyncpg://" + pg_database_url, + echo=True if os.getenv("ORM_DEBUG") else False, + ) + yield engine + + +@pytest.fixture(scope="session") +def event_loop(request: pytest.FixtureRequest): + loop = asyncio.get_event_loop_policy().new_event_loop() + yield loop + loop.close() + + +@pytest_asyncio.fixture() +async def session(async_engine): + async with async_engine.connect() as conn: + await conn.begin() + await conn.begin_nested() + async_session = AsyncSession(conn, expire_on_commit=False) + + @sqlalchemy.event.listens_for( + async_session.sync_session, "after_transaction_end" + ) + def end_savepoint(session, transaction): + if conn.closed: + return + if not conn.in_nested_transaction(): + conn.sync_connection.begin_nested() + + yield async_session + + +TestData = Tuple[Brain, User, List[Chat], List[ChatHistory]] + + +@pytest_asyncio.fixture() +async def test_data( + session: AsyncSession, +) -> TestData: + # User data + user_1 = ( + await session.exec(select(User).where(User.email == "admin@quivr.app")) + ).one() + # Brain data + brain_1 = Brain(name="test_brain", description="this is a test brain") + # Chat data + chat_1 = Chat(chat_name="chat1", user=user_1) + chat_2 = Chat(chat_name="chat2", user=user_1) + + chat_history_1 = ChatHistory( + user_message="Hello", + assistant="Hello! How can I assist you today?", + chat=chat_1, + brain=brain_1, + ) + chat_history_2 = ChatHistory( + user_message="Hello", + assistant="Hello! How can I assist you today?", + chat=chat_1, + brain=brain_1, + ) + session.add(brain_1) + session.add(chat_1) + session.add(chat_2) + session.add(chat_history_1) + session.add(chat_history_2) + + await session.refresh(user_1) + await session.commit() + return brain_1, user_1, [chat_1, chat_2], [chat_history_1, chat_history_2] + + +@pytest.mark.asyncio +async def test_get_user_chats_empty(session): + repo = ChatRepository(session) + chats = await repo.get_user_chats(user_id=uuid4()) + assert len(chats) == 0 + + +@pytest.mark.asyncio +async def test_get_user_chats(session: AsyncSession, test_data: TestData): + _, local_user, chats, _ = test_data + repo = ChatRepository(session) + assert local_user.id is not None + query_chats = await repo.get_user_chats(local_user.id) + assert len(query_chats) == len(chats) + + +@pytest.mark.asyncio +async def test_get_chat_history(session: AsyncSession, test_data: TestData): + brain_1, _, chats, chat_history = test_data + assert chats[0].chat_id + assert len(chat_history) > 0 + assert chat_history[-1].message_time + assert chat_history[0].message_time + + repo = ChatRepository(session) + query_chat_history = await repo.get_chat_history(chats[0].chat_id) + assert chat_history == query_chat_history + assert query_chat_history[-1].message_time + assert query_chat_history[0].message_time + assert query_chat_history[-1].message_time >= query_chat_history[0].message_time + + # TODO: Should be tested in test_brain_repository + # Checks that brain is correct + assert query_chat_history[-1].brain is not None + assert query_chat_history[-1].brain.brain_type == BrainType.integration + + +@pytest.mark.asyncio +async def test_add_qa(session: AsyncSession, test_data: TestData): + _, _, [chat, *_], __ = test_data + assert chat.chat_id + qa = QuestionAndAnswer(question="question", answer="answer") + repo = ChatRepository(session) + resp_chat = await repo.add_question_and_answer(chat.chat_id, qa) + + assert resp_chat.chat_id == chat.chat_id + assert resp_chat.user_message == qa.question + assert resp_chat.assistant == qa.answer + + +## CHAT SERVICE + + +@pytest.mark.asyncio +async def test_service_get_chat_history(session: AsyncSession, test_data: TestData): + brain, _, [chat, *_], __ = test_data + assert chat.chat_id + repo = ChatRepository(session) + service = ChatService(repo) + history = await service.get_chat_history(chat.chat_id) + + assert len(history) > 0 + assert all(h.chat_id == chat.chat_id for h in history) + assert history[0].brain_name == brain.name + assert history[0].brain_id == brain.brain_id diff --git a/backend/modules/contact_support/__init__.py b/backend/backend/modules/contact_support/__init__.py similarity index 100% rename from backend/modules/contact_support/__init__.py rename to backend/backend/modules/contact_support/__init__.py diff --git a/backend/modules/contact_support/controller/__init__.py b/backend/backend/modules/contact_support/controller/__init__.py similarity index 100% rename from backend/modules/contact_support/controller/__init__.py rename to backend/backend/modules/contact_support/controller/__init__.py diff --git a/backend/modules/contact_support/controller/contact_routes.py b/backend/backend/modules/contact_support/controller/contact_routes.py similarity index 84% rename from backend/modules/contact_support/controller/contact_routes.py rename to backend/backend/modules/contact_support/controller/contact_routes.py index a48d6be93a32..4d2ab3c79589 100644 --- a/backend/modules/contact_support/controller/contact_routes.py +++ b/backend/backend/modules/contact_support/controller/contact_routes.py @@ -1,9 +1,10 @@ from fastapi import APIRouter -from logger import get_logger -from modules.contact_support.controller.settings import ContactsSettings -from packages.emails.send_email import send_email from pydantic import BaseModel +from backend.logger import get_logger +from backend.modules.contact_support.controller.settings import ContactsSettings +from backend.packages.emails.send_email import send_email + class ContactMessage(BaseModel): customer_email: str diff --git a/backend/modules/contact_support/controller/settings.py b/backend/backend/modules/contact_support/controller/settings.py similarity index 100% rename from backend/modules/contact_support/controller/settings.py rename to backend/backend/modules/contact_support/controller/settings.py diff --git a/backend/backend/modules/dependencies.py b/backend/backend/modules/dependencies.py new file mode 100644 index 000000000000..d7e1984cb949 --- /dev/null +++ b/backend/backend/modules/dependencies.py @@ -0,0 +1,61 @@ +import os +from typing import AsyncGenerator, Callable, Generic, Type, TypeVar + +from fastapi import Depends +from sqlalchemy.ext.asyncio import create_async_engine +from sqlmodel.ext.asyncio.session import AsyncSession + +from backend.models.settings import settings + + +class BaseRepository: + def __init__(self, session: AsyncSession): + self.session = session + + +R = TypeVar("R", bound=BaseRepository) + + +class BaseService(Generic[R]): + # associated repository type + repository_cls: Type[R] + + def __init__(self, repository: R): + self.repository = repository + + @classmethod + def get_repository_cls(cls) -> Type[R]: + return cls.repository_cls # type: ignore + + +S = TypeVar("S", bound=BaseService) + +# TODO: env variable debug sql_alchemy +async_engine = create_async_engine( + settings.pg_database_async_url, + echo=True if os.getenv("ORM_DEBUG") else False, + future=True, +) + + +async def get_async_session() -> AsyncGenerator[AsyncSession, None]: + async with AsyncSession(async_engine) as session: + yield session + + +def get_repository(repository_model: Type[R]) -> Callable[..., R]: + def _get_repository(session: AsyncSession = Depends(get_async_session)) -> R: + return repository_model(session) + + return _get_repository + + +def get_service(service: Type[S]) -> Callable[..., S]: + def _get_service( + repository: BaseRepository = Depends( + get_repository(service.get_repository_cls()) + ), + ) -> S: + return service(repository) + + return _get_service diff --git a/backend/modules/knowledge/__init__.py b/backend/backend/modules/knowledge/__init__.py similarity index 100% rename from backend/modules/knowledge/__init__.py rename to backend/backend/modules/knowledge/__init__.py diff --git a/backend/modules/knowledge/controller/__init__.py b/backend/backend/modules/knowledge/controller/__init__.py similarity index 100% rename from backend/modules/knowledge/controller/__init__.py rename to backend/backend/modules/knowledge/controller/__init__.py diff --git a/backend/modules/knowledge/controller/knowledge_routes.py b/backend/backend/modules/knowledge/controller/knowledge_routes.py similarity index 82% rename from backend/modules/knowledge/controller/knowledge_routes.py rename to backend/backend/modules/knowledge/controller/knowledge_routes.py index cb9b5d162dfd..601e230c342c 100644 --- a/backend/modules/knowledge/controller/knowledge_routes.py +++ b/backend/backend/modules/knowledge/controller/knowledge_routes.py @@ -1,17 +1,20 @@ from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.brain.entity.brain_entity import RoleEnum -from modules.brain.service.brain_authorization_service import ( + +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.brain.entity.brain_entity import RoleEnum +from backend.modules.brain.service.brain_authorization_service import ( has_brain_authorization, validate_brain_authorization, ) -from modules.brain.service.brain_vector_service import BrainVectorService -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.upload.service.generate_file_signed_url import generate_file_signed_url -from modules.user.entity.user_identity import UserIdentity +from backend.modules.brain.service.brain_vector_service import BrainVectorService +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.upload.service.generate_file_signed_url import ( + generate_file_signed_url, +) +from backend.modules.user.entity.user_identity import UserIdentity knowledge_router = APIRouter() logger = get_logger(__name__) diff --git a/backend/modules/knowledge/dto/__init__.py b/backend/backend/modules/knowledge/dto/__init__.py similarity index 100% rename from backend/modules/knowledge/dto/__init__.py rename to backend/backend/modules/knowledge/dto/__init__.py diff --git a/backend/modules/knowledge/dto/inputs.py b/backend/backend/modules/knowledge/dto/inputs.py similarity index 100% rename from backend/modules/knowledge/dto/inputs.py rename to backend/backend/modules/knowledge/dto/inputs.py diff --git a/backend/modules/knowledge/dto/outputs.py b/backend/backend/modules/knowledge/dto/outputs.py similarity index 100% rename from backend/modules/knowledge/dto/outputs.py rename to backend/backend/modules/knowledge/dto/outputs.py diff --git a/backend/modules/knowledge/entity/__init__.py b/backend/backend/modules/knowledge/entity/__init__.py similarity index 100% rename from backend/modules/knowledge/entity/__init__.py rename to backend/backend/modules/knowledge/entity/__init__.py diff --git a/backend/modules/knowledge/entity/knowledge.py b/backend/backend/modules/knowledge/entity/knowledge.py similarity index 100% rename from backend/modules/knowledge/entity/knowledge.py rename to backend/backend/modules/knowledge/entity/knowledge.py diff --git a/backend/backend/modules/knowledge/repository/__init__.py b/backend/backend/modules/knowledge/repository/__init__.py new file mode 100644 index 000000000000..80f13aa5f77f --- /dev/null +++ b/backend/backend/modules/knowledge/repository/__init__.py @@ -0,0 +1 @@ +from .knowledges import KnowledgeRepository diff --git a/backend/modules/knowledge/repository/knowledge_interface.py b/backend/backend/modules/knowledge/repository/knowledge_interface.py similarity index 86% rename from backend/modules/knowledge/repository/knowledge_interface.py rename to backend/backend/modules/knowledge/repository/knowledge_interface.py index beaac48d41e8..dcdbede1409a 100644 --- a/backend/modules/knowledge/repository/knowledge_interface.py +++ b/backend/backend/modules/knowledge/repository/knowledge_interface.py @@ -2,9 +2,9 @@ from typing import List from uuid import UUID -from modules.knowledge.dto.inputs import CreateKnowledgeProperties -from modules.knowledge.dto.outputs import DeleteKnowledgeResponse -from modules.knowledge.entity.knowledge import Knowledge +from backend.modules.knowledge.dto.inputs import CreateKnowledgeProperties +from backend.modules.knowledge.dto.outputs import DeleteKnowledgeResponse +from backend.modules.knowledge.entity.knowledge import Knowledge class KnowledgeInterface(ABC): diff --git a/backend/modules/knowledge/repository/knowledges.py b/backend/backend/modules/knowledge/repository/knowledges.py similarity index 87% rename from backend/modules/knowledge/repository/knowledges.py rename to backend/backend/modules/knowledge/repository/knowledges.py index 35082aa47498..6cabd0c69810 100644 --- a/backend/modules/knowledge/repository/knowledges.py +++ b/backend/backend/modules/knowledge/repository/knowledges.py @@ -1,11 +1,14 @@ +from uuid import UUID + from fastapi import HTTPException -from models.settings import get_supabase_client -from modules.knowledge.dto.outputs import DeleteKnowledgeResponse -from modules.knowledge.entity.knowledge import Knowledge -from modules.knowledge.repository.knowledge_interface import KnowledgeInterface + +from backend.models.settings import get_supabase_client +from backend.modules.knowledge.dto.outputs import DeleteKnowledgeResponse +from backend.modules.knowledge.entity.knowledge import Knowledge +from backend.modules.knowledge.repository.knowledge_interface import KnowledgeInterface -class Knowledges(KnowledgeInterface): +class KnowledgeRepository(KnowledgeInterface): def __init__(self): supabase_client = get_supabase_client() self.db = supabase_client @@ -73,7 +76,7 @@ def get_knowledge_by_id(self, knowledge_id): return Knowledge(**knowledge[0]) - def get_all_knowledge_in_brain(self, brain_id): + def get_all_knowledge_in_brain(self, brain_id: UUID) -> list[Knowledge]: """ Get all the knowledge in a brain Args: diff --git a/backend/modules/knowledge/repository/storage.py b/backend/backend/modules/knowledge/repository/storage.py similarity index 77% rename from backend/modules/knowledge/repository/storage.py rename to backend/backend/modules/knowledge/repository/storage.py index 6bdcb9a4c96a..c0150e62a014 100644 --- a/backend/modules/knowledge/repository/storage.py +++ b/backend/backend/modules/knowledge/repository/storage.py @@ -1,9 +1,10 @@ -from logger import get_logger -from models.settings import get_supabase_client -from modules.knowledge.repository.storage_interface import StorageInterface +from backend.logger import get_logger +from backend.models.settings import get_supabase_client +from backend.modules.knowledge.repository.storage_interface import StorageInterface logger = get_logger(__name__) + class Storage(StorageInterface): def __init__(self): supabase_client = get_supabase_client() diff --git a/backend/modules/knowledge/repository/storage_interface.py b/backend/backend/modules/knowledge/repository/storage_interface.py similarity index 100% rename from backend/modules/knowledge/repository/storage_interface.py rename to backend/backend/modules/knowledge/repository/storage_interface.py diff --git a/backend/modules/knowledge/service/__init__.py b/backend/backend/modules/knowledge/service/__init__.py similarity index 100% rename from backend/modules/knowledge/service/__init__.py rename to backend/backend/modules/knowledge/service/__init__.py diff --git a/backend/modules/knowledge/service/knowledge_service.py b/backend/backend/modules/knowledge/service/knowledge_service.py similarity index 71% rename from backend/modules/knowledge/service/knowledge_service.py rename to backend/backend/modules/knowledge/service/knowledge_service.py index 4718ac943a22..7799d102665b 100644 --- a/backend/modules/knowledge/service/knowledge_service.py +++ b/backend/backend/modules/knowledge/service/knowledge_service.py @@ -1,10 +1,10 @@ from uuid import UUID -from logger import get_logger -from modules.knowledge.dto.inputs import CreateKnowledgeProperties -from modules.knowledge.entity.knowledge import Knowledge -from modules.knowledge.repository.knowledge_interface import KnowledgeInterface -from modules.knowledge.repository.knowledges import Knowledges +from backend.logger import get_logger +from backend.modules.knowledge.dto.inputs import CreateKnowledgeProperties +from backend.modules.knowledge.entity.knowledge import Knowledge +from backend.modules.knowledge.repository.knowledge_interface import KnowledgeInterface +from backend.modules.knowledge.repository.knowledges import KnowledgeRepository logger = get_logger(__name__) @@ -13,7 +13,7 @@ class KnowledgeService: repository: KnowledgeInterface def __init__(self): - self.repository = Knowledges() + self.repository = KnowledgeRepository() def add_knowledge(self, knowledge_to_add: CreateKnowledgeProperties): knowledge = self.repository.insert_knowledge(knowledge_to_add) diff --git a/backend/modules/misc/controller/__init__.py b/backend/backend/modules/misc/controller/__init__.py similarity index 100% rename from backend/modules/misc/controller/__init__.py rename to backend/backend/modules/misc/controller/__init__.py diff --git a/backend/modules/misc/controller/misc_routes.py b/backend/backend/modules/misc/controller/misc_routes.py similarity index 100% rename from backend/modules/misc/controller/misc_routes.py rename to backend/backend/modules/misc/controller/misc_routes.py diff --git a/backend/modules/notification/__init__.py b/backend/backend/modules/notification/__init__.py similarity index 100% rename from backend/modules/notification/__init__.py rename to backend/backend/modules/notification/__init__.py diff --git a/backend/modules/notification/controller/__init__.py b/backend/backend/modules/notification/controller/__init__.py similarity index 100% rename from backend/modules/notification/controller/__init__.py rename to backend/backend/modules/notification/controller/__init__.py diff --git a/backend/modules/notification/dto/__init__.py b/backend/backend/modules/notification/dto/__init__.py similarity index 100% rename from backend/modules/notification/dto/__init__.py rename to backend/backend/modules/notification/dto/__init__.py diff --git a/backend/modules/notification/dto/inputs.py b/backend/backend/modules/notification/dto/inputs.py similarity index 89% rename from backend/modules/notification/dto/inputs.py rename to backend/backend/modules/notification/dto/inputs.py index 65366ced0b65..1f33352130aa 100644 --- a/backend/modules/notification/dto/inputs.py +++ b/backend/backend/modules/notification/dto/inputs.py @@ -1,9 +1,10 @@ from typing import Optional from uuid import UUID -from modules.notification.entity.notification import NotificationsStatusEnum from pydantic import BaseModel +from backend.modules.notification.entity.notification import NotificationsStatusEnum + class CreateNotification(BaseModel): """Properties that can be received on notification creation""" diff --git a/backend/modules/notification/dto/outputs.py b/backend/backend/modules/notification/dto/outputs.py similarity index 100% rename from backend/modules/notification/dto/outputs.py rename to backend/backend/modules/notification/dto/outputs.py diff --git a/backend/modules/notification/entity/__init__.py b/backend/backend/modules/notification/entity/__init__.py similarity index 100% rename from backend/modules/notification/entity/__init__.py rename to backend/backend/modules/notification/entity/__init__.py diff --git a/backend/modules/notification/entity/notification.py b/backend/backend/modules/notification/entity/notification.py similarity index 100% rename from backend/modules/notification/entity/notification.py rename to backend/backend/modules/notification/entity/notification.py diff --git a/backend/modules/notification/repository/__init__.py b/backend/backend/modules/notification/repository/__init__.py similarity index 100% rename from backend/modules/notification/repository/__init__.py rename to backend/backend/modules/notification/repository/__init__.py diff --git a/backend/modules/notification/repository/notifications.py b/backend/backend/modules/notification/repository/notifications.py similarity index 86% rename from backend/modules/notification/repository/notifications.py rename to backend/backend/modules/notification/repository/notifications.py index ae4dcfcbce8d..6e3152869bfa 100644 --- a/backend/modules/notification/repository/notifications.py +++ b/backend/backend/modules/notification/repository/notifications.py @@ -1,7 +1,7 @@ -from logger import get_logger -from modules.notification.dto.inputs import CreateNotification -from modules.notification.entity.notification import Notification -from modules.notification.repository.notifications_interface import ( +from backend.logger import get_logger +from backend.modules.notification.dto.inputs import CreateNotification +from backend.modules.notification.entity.notification import Notification +from backend.modules.notification.repository.notifications_interface import ( NotificationInterface, ) diff --git a/backend/modules/notification/repository/notifications_interface.py b/backend/backend/modules/notification/repository/notifications_interface.py similarity index 79% rename from backend/modules/notification/repository/notifications_interface.py rename to backend/backend/modules/notification/repository/notifications_interface.py index b7f023428244..fbd4bda24643 100644 --- a/backend/modules/notification/repository/notifications_interface.py +++ b/backend/backend/modules/notification/repository/notifications_interface.py @@ -1,8 +1,11 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.notification.dto.inputs import NotificationUpdatableProperties, CreateNotification -from modules.notification.entity.notification import Notification +from backend.modules.notification.dto.inputs import ( + CreateNotification, + NotificationUpdatableProperties, +) +from backend.modules.notification.entity.notification import Notification class NotificationInterface(ABC): diff --git a/backend/modules/notification/service/__init__.py b/backend/backend/modules/notification/service/__init__.py similarity index 100% rename from backend/modules/notification/service/__init__.py rename to backend/backend/modules/notification/service/__init__.py diff --git a/backend/modules/notification/service/notification_service.py b/backend/backend/modules/notification/service/notification_service.py similarity index 74% rename from backend/modules/notification/service/notification_service.py rename to backend/backend/modules/notification/service/notification_service.py index c84a8f990694..770be4e8ec93 100644 --- a/backend/modules/notification/service/notification_service.py +++ b/backend/backend/modules/notification/service/notification_service.py @@ -1,10 +1,10 @@ -from models.settings import get_supabase_client -from modules.notification.dto.inputs import ( +from backend.models.settings import get_supabase_client +from backend.modules.notification.dto.inputs import ( CreateNotification, NotificationUpdatableProperties, ) -from modules.notification.repository.notifications import Notifications -from modules.notification.repository.notifications_interface import ( +from backend.modules.notification.repository.notifications import Notifications +from backend.modules.notification.repository.notifications_interface import ( NotificationInterface, ) diff --git a/backend/modules/notification/tests/test_notification.py b/backend/backend/modules/notification/tests/test_notification.py similarity index 100% rename from backend/modules/notification/tests/test_notification.py rename to backend/backend/modules/notification/tests/test_notification.py diff --git a/backend/modules/onboarding/__init__.py b/backend/backend/modules/onboarding/__init__.py similarity index 100% rename from backend/modules/onboarding/__init__.py rename to backend/backend/modules/onboarding/__init__.py diff --git a/backend/modules/onboarding/controller/__init__.py b/backend/backend/modules/onboarding/controller/__init__.py similarity index 100% rename from backend/modules/onboarding/controller/__init__.py rename to backend/backend/modules/onboarding/controller/__init__.py diff --git a/backend/modules/onboarding/controller/onboarding_routes.py b/backend/backend/modules/onboarding/controller/onboarding_routes.py similarity index 71% rename from backend/modules/onboarding/controller/onboarding_routes.py rename to backend/backend/modules/onboarding/controller/onboarding_routes.py index 39d6dc5c4d9f..80107d86c855 100644 --- a/backend/modules/onboarding/controller/onboarding_routes.py +++ b/backend/backend/modules/onboarding/controller/onboarding_routes.py @@ -1,12 +1,13 @@ from fastapi import APIRouter, Depends -from middlewares.auth import ( # Assuming you have a get_current_user function + +from backend.middlewares.auth import ( # Assuming you have a get_current_user function AuthBearer, get_current_user, ) -from modules.onboarding.dto.inputs import OnboardingUpdatableProperties -from modules.onboarding.entity.onboarding import OnboardingStates -from modules.onboarding.service.onboarding_service import OnboardingService -from modules.user.entity.user_identity import UserIdentity +from backend.modules.onboarding.dto.inputs import OnboardingUpdatableProperties +from backend.modules.onboarding.entity.onboarding import OnboardingStates +from backend.modules.onboarding.service.onboarding_service import OnboardingService +from backend.modules.user.entity.user_identity import UserIdentity onboarding_router = APIRouter() diff --git a/backend/modules/onboarding/dto/__init__.py b/backend/backend/modules/onboarding/dto/__init__.py similarity index 100% rename from backend/modules/onboarding/dto/__init__.py rename to backend/backend/modules/onboarding/dto/__init__.py diff --git a/backend/modules/onboarding/dto/inputs.py b/backend/backend/modules/onboarding/dto/inputs.py similarity index 100% rename from backend/modules/onboarding/dto/inputs.py rename to backend/backend/modules/onboarding/dto/inputs.py diff --git a/backend/modules/onboarding/entity/__init__.py b/backend/backend/modules/onboarding/entity/__init__.py similarity index 100% rename from backend/modules/onboarding/entity/__init__.py rename to backend/backend/modules/onboarding/entity/__init__.py diff --git a/backend/modules/onboarding/entity/onboarding.py b/backend/backend/modules/onboarding/entity/onboarding.py similarity index 100% rename from backend/modules/onboarding/entity/onboarding.py rename to backend/backend/modules/onboarding/entity/onboarding.py diff --git a/backend/modules/onboarding/repository/__init__.py b/backend/backend/modules/onboarding/repository/__init__.py similarity index 100% rename from backend/modules/onboarding/repository/__init__.py rename to backend/backend/modules/onboarding/repository/__init__.py diff --git a/backend/modules/onboarding/repository/onboardings.py b/backend/backend/modules/onboarding/repository/onboardings.py similarity index 95% rename from backend/modules/onboarding/repository/onboardings.py rename to backend/backend/modules/onboarding/repository/onboardings.py index b1649b8a32df..d1fbcca3879d 100644 --- a/backend/modules/onboarding/repository/onboardings.py +++ b/backend/backend/modules/onboarding/repository/onboardings.py @@ -1,8 +1,9 @@ from datetime import datetime, timedelta from fastapi import HTTPException -from models.settings import get_supabase_client -from modules.onboarding.entity.onboarding import OnboardingStates + +from backend.models.settings import get_supabase_client +from backend.modules.onboarding.entity.onboarding import OnboardingStates from .onboardings_interface import OnboardingInterface diff --git a/backend/modules/onboarding/repository/onboardings_interface.py b/backend/backend/modules/onboarding/repository/onboardings_interface.py similarity index 87% rename from backend/modules/onboarding/repository/onboardings_interface.py rename to backend/backend/modules/onboarding/repository/onboardings_interface.py index a3a9729252ef..6225628f6621 100644 --- a/backend/modules/onboarding/repository/onboardings_interface.py +++ b/backend/backend/modules/onboarding/repository/onboardings_interface.py @@ -1,8 +1,8 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.onboarding.dto.inputs import OnboardingUpdatableProperties -from modules.onboarding.entity.onboarding import OnboardingStates +from backend.modules.onboarding.dto.inputs import OnboardingUpdatableProperties +from backend.modules.onboarding.entity.onboarding import OnboardingStates class OnboardingInterface(ABC): diff --git a/backend/modules/onboarding/service/__init__.py b/backend/backend/modules/onboarding/service/__init__.py similarity index 100% rename from backend/modules/onboarding/service/__init__.py rename to backend/backend/modules/onboarding/service/__init__.py diff --git a/backend/modules/onboarding/service/onboarding_service.py b/backend/backend/modules/onboarding/service/onboarding_service.py similarity index 80% rename from backend/modules/onboarding/service/onboarding_service.py rename to backend/backend/modules/onboarding/service/onboarding_service.py index cabf6ecf24ed..7ff9f52520b7 100644 --- a/backend/modules/onboarding/service/onboarding_service.py +++ b/backend/backend/modules/onboarding/service/onboarding_service.py @@ -1,9 +1,11 @@ from uuid import UUID -from modules.onboarding.dto.inputs import OnboardingUpdatableProperties -from modules.onboarding.entity.onboarding import OnboardingStates -from modules.onboarding.repository.onboardings import Onboarding -from modules.onboarding.repository.onboardings_interface import OnboardingInterface +from backend.modules.onboarding.dto.inputs import OnboardingUpdatableProperties +from backend.modules.onboarding.entity.onboarding import OnboardingStates +from backend.modules.onboarding.repository.onboardings import Onboarding +from backend.modules.onboarding.repository.onboardings_interface import ( + OnboardingInterface, +) class OnboardingService: diff --git a/backend/modules/onboarding/tests/test_onboarding.py b/backend/backend/modules/onboarding/tests/test_onboarding.py similarity index 100% rename from backend/modules/onboarding/tests/test_onboarding.py rename to backend/backend/modules/onboarding/tests/test_onboarding.py diff --git a/backend/modules/prompt/__init__.py b/backend/backend/modules/prompt/__init__.py similarity index 100% rename from backend/modules/prompt/__init__.py rename to backend/backend/modules/prompt/__init__.py diff --git a/backend/modules/prompt/controller/__init__.py b/backend/backend/modules/prompt/controller/__init__.py similarity index 100% rename from backend/modules/prompt/controller/__init__.py rename to backend/backend/modules/prompt/controller/__init__.py diff --git a/backend/modules/prompt/controller/prompt_routes.py b/backend/backend/modules/prompt/controller/prompt_routes.py similarity index 88% rename from backend/modules/prompt/controller/prompt_routes.py rename to backend/backend/modules/prompt/controller/prompt_routes.py index bfddbda9ad84..83eda458420c 100644 --- a/backend/modules/prompt/controller/prompt_routes.py +++ b/backend/backend/modules/prompt/controller/prompt_routes.py @@ -1,13 +1,14 @@ from uuid import UUID from fastapi import APIRouter, Depends -from middlewares.auth import AuthBearer -from modules.prompt.entity.prompt import ( + +from backend.middlewares.auth import AuthBearer +from backend.modules.prompt.entity.prompt import ( CreatePromptProperties, Prompt, PromptUpdatableProperties, ) -from modules.prompt.service import PromptService +from backend.modules.prompt.service import PromptService prompt_router = APIRouter() diff --git a/backend/modules/prompt/entity/__init__.py b/backend/backend/modules/prompt/entity/__init__.py similarity index 100% rename from backend/modules/prompt/entity/__init__.py rename to backend/backend/modules/prompt/entity/__init__.py diff --git a/backend/modules/prompt/entity/prompt.py b/backend/backend/modules/prompt/entity/prompt.py similarity index 50% rename from backend/modules/prompt/entity/prompt.py rename to backend/backend/modules/prompt/entity/prompt.py index 32e8a57d750a..2e91ee7bd4ce 100644 --- a/backend/modules/prompt/entity/prompt.py +++ b/backend/backend/modules/prompt/entity/prompt.py @@ -1,8 +1,10 @@ from enum import Enum -from typing import Optional +from typing import List, Optional from uuid import UUID from pydantic import BaseModel +from sqlmodel import UUID as PGUUID +from sqlmodel import Column, Field, Relationship, SQLModel, text class PromptStatusEnum(str, Enum): @@ -10,11 +12,22 @@ class PromptStatusEnum(str, Enum): public = "public" -class Prompt(BaseModel): - title: str - content: str - status: PromptStatusEnum = PromptStatusEnum.private - id: UUID +class Prompt(SQLModel, table=True): + __tablename__ = "prompts" # type: ignore + id: UUID | None = Field( + default=None, + sa_column=Column( + PGUUID, + server_default=text("uuid_generate_v4()"), + primary_key=True, + ), + ) + content: str | None = None + title: str | None = Field(default=None, max_length=255) + status: str = Field(default="private", max_length=255) + brain: List["Brain"] = Relationship( # noqa: F821 + back_populates="prompt", sa_relationship_kwargs={"lazy": "joined"} + ) class CreatePromptProperties(BaseModel): diff --git a/backend/modules/prompt/repository/__init__.py b/backend/backend/modules/prompt/repository/__init__.py similarity index 100% rename from backend/modules/prompt/repository/__init__.py rename to backend/backend/modules/prompt/repository/__init__.py diff --git a/backend/modules/prompt/repository/prompts.py b/backend/backend/modules/prompt/repository/prompts.py similarity index 93% rename from backend/modules/prompt/repository/prompts.py rename to backend/backend/modules/prompt/repository/prompts.py index b31739e0b018..bf2b2bc9e3d2 100644 --- a/backend/modules/prompt/repository/prompts.py +++ b/backend/backend/modules/prompt/repository/prompts.py @@ -1,7 +1,8 @@ from fastapi import HTTPException -from models.settings import get_supabase_client -from modules.prompt.entity.prompt import Prompt -from modules.prompt.repository.prompts_interface import ( + +from backend.models.settings import get_supabase_client +from backend.modules.prompt.entity.prompt import Prompt +from backend.modules.prompt.repository.prompts_interface import ( DeletePromptResponse, PromptsInterface, ) diff --git a/backend/modules/prompt/repository/prompts_interface.py b/backend/backend/modules/prompt/repository/prompts_interface.py similarity index 96% rename from backend/modules/prompt/repository/prompts_interface.py rename to backend/backend/modules/prompt/repository/prompts_interface.py index 7c9df05eedad..95cb0c694e77 100644 --- a/backend/modules/prompt/repository/prompts_interface.py +++ b/backend/backend/modules/prompt/repository/prompts_interface.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.prompt.entity import ( +from backend.modules.prompt.entity import ( CreatePromptProperties, DeletePromptResponse, Prompt, diff --git a/backend/modules/prompt/service/__init__.py b/backend/backend/modules/prompt/service/__init__.py similarity index 100% rename from backend/modules/prompt/service/__init__.py rename to backend/backend/modules/prompt/service/__init__.py diff --git a/backend/modules/prompt/service/get_prompt_to_use.py b/backend/backend/modules/prompt/service/get_prompt_to_use.py similarity index 69% rename from backend/modules/prompt/service/get_prompt_to_use.py rename to backend/backend/modules/prompt/service/get_prompt_to_use.py index 8e33008a5ed9..b5ed34560a79 100644 --- a/backend/modules/prompt/service/get_prompt_to_use.py +++ b/backend/backend/modules/prompt/service/get_prompt_to_use.py @@ -1,8 +1,10 @@ from typing import Optional from uuid import UUID -from modules.brain.service.utils.get_prompt_to_use_id import get_prompt_to_use_id -from modules.prompt.service import PromptService +from backend.modules.brain.service.utils.get_prompt_to_use_id import ( + get_prompt_to_use_id, +) +from backend.modules.prompt.service import PromptService promptService = PromptService() diff --git a/backend/modules/prompt/service/prompt_service.py b/backend/backend/modules/prompt/service/prompt_service.py similarity index 89% rename from backend/modules/prompt/service/prompt_service.py rename to backend/backend/modules/prompt/service/prompt_service.py index 86b1893c6d96..59d718a3d94f 100644 --- a/backend/modules/prompt/service/prompt_service.py +++ b/backend/backend/modules/prompt/service/prompt_service.py @@ -1,14 +1,14 @@ from typing import List from uuid import UUID -from models.settings import get_supabase_client -from modules.prompt.entity.prompt import ( +from backend.models.settings import get_supabase_client +from backend.modules.prompt.entity.prompt import ( CreatePromptProperties, DeletePromptResponse, Prompt, PromptUpdatableProperties, ) -from modules.prompt.repository.prompts import Prompts +from backend.modules.prompt.repository.prompts import Prompts class PromptService: diff --git a/backend/modules/prompt/tests/test_prompt.py b/backend/backend/modules/prompt/tests/test_prompt.py similarity index 100% rename from backend/modules/prompt/tests/test_prompt.py rename to backend/backend/modules/prompt/tests/test_prompt.py diff --git a/backend/modules/sync/__init__.py b/backend/backend/modules/sync/__init__.py similarity index 100% rename from backend/modules/sync/__init__.py rename to backend/backend/modules/sync/__init__.py diff --git a/backend/modules/sync/controller/__init__.py b/backend/backend/modules/sync/controller/__init__.py similarity index 100% rename from backend/modules/sync/controller/__init__.py rename to backend/backend/modules/sync/controller/__init__.py diff --git a/backend/modules/sync/controller/azure_sync_routes.py b/backend/backend/modules/sync/controller/azure_sync_routes.py similarity index 93% rename from backend/modules/sync/controller/azure_sync_routes.py rename to backend/backend/modules/sync/controller/azure_sync_routes.py index 9257bcfa673a..e8df33aa6802 100644 --- a/backend/modules/sync/controller/azure_sync_routes.py +++ b/backend/backend/modules/sync/controller/azure_sync_routes.py @@ -3,13 +3,14 @@ import requests from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import HTMLResponse -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.sync.dto.inputs import SyncsUserInput, SyncUserUpdateInput -from modules.sync.service.sync_service import SyncService, SyncUserService -from modules.user.entity.user_identity import UserIdentity from msal import PublicClientApplication +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.sync.dto.inputs import SyncsUserInput, SyncUserUpdateInput +from backend.modules.sync.service.sync_service import SyncService, SyncUserService +from backend.modules.user.entity.user_identity import UserIdentity + from .successfull_connection import successfullConnectionPage # Initialize logger diff --git a/backend/modules/sync/controller/google_sync_routes.py b/backend/backend/modules/sync/controller/google_sync_routes.py similarity index 93% rename from backend/modules/sync/controller/google_sync_routes.py rename to backend/backend/modules/sync/controller/google_sync_routes.py index d59278e85660..8481f39aa4e2 100644 --- a/backend/modules/sync/controller/google_sync_routes.py +++ b/backend/backend/modules/sync/controller/google_sync_routes.py @@ -5,11 +5,12 @@ from fastapi.responses import HTMLResponse from google_auth_oauthlib.flow import Flow from googleapiclient.discovery import build -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.sync.dto.inputs import SyncsUserInput, SyncUserUpdateInput -from modules.sync.service.sync_service import SyncService, SyncUserService -from modules.user.entity.user_identity import UserIdentity + +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.sync.dto.inputs import SyncsUserInput, SyncUserUpdateInput +from backend.modules.sync.service.sync_service import SyncService, SyncUserService +from backend.modules.user.entity.user_identity import UserIdentity from .successfull_connection import successfullConnectionPage diff --git a/backend/modules/sync/controller/successfull_connection.py b/backend/backend/modules/sync/controller/successfull_connection.py similarity index 100% rename from backend/modules/sync/controller/successfull_connection.py rename to backend/backend/modules/sync/controller/successfull_connection.py diff --git a/backend/modules/sync/controller/sync_routes.py b/backend/backend/modules/sync/controller/sync_routes.py similarity index 89% rename from backend/modules/sync/controller/sync_routes.py rename to backend/backend/modules/sync/controller/sync_routes.py index 54b1df504894..d51634861c63 100644 --- a/backend/modules/sync/controller/sync_routes.py +++ b/backend/backend/modules/sync/controller/sync_routes.py @@ -2,19 +2,22 @@ from typing import List from fastapi import APIRouter, Depends, status -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.notification.dto.inputs import CreateNotification -from modules.notification.entity.notification import NotificationsStatusEnum -from modules.notification.service.notification_service import NotificationService -from modules.sync.controller.azure_sync_routes import azure_sync_router -from modules.sync.controller.google_sync_routes import google_sync_router -from modules.sync.dto import SyncsDescription -from modules.sync.dto.inputs import SyncsActiveInput, SyncsActiveUpdateInput -from modules.sync.dto.outputs import AuthMethodEnum -from modules.sync.entity.sync import SyncsActive -from modules.sync.service.sync_service import SyncService, SyncUserService -from modules.user.entity.user_identity import UserIdentity + +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.notification.dto.inputs import CreateNotification +from backend.modules.notification.entity.notification import NotificationsStatusEnum +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.sync.controller.azure_sync_routes import azure_sync_router +from backend.modules.sync.controller.google_sync_routes import google_sync_router +from backend.modules.sync.dto import SyncsDescription +from backend.modules.sync.dto.inputs import SyncsActiveInput, SyncsActiveUpdateInput +from backend.modules.sync.dto.outputs import AuthMethodEnum +from backend.modules.sync.entity.sync import SyncsActive +from backend.modules.sync.service.sync_service import SyncService, SyncUserService +from backend.modules.user.entity.user_identity import UserIdentity notification_service = NotificationService() diff --git a/backend/modules/sync/dto/__init__.py b/backend/backend/modules/sync/dto/__init__.py similarity index 100% rename from backend/modules/sync/dto/__init__.py rename to backend/backend/modules/sync/dto/__init__.py diff --git a/backend/modules/sync/dto/inputs.py b/backend/backend/modules/sync/dto/inputs.py similarity index 100% rename from backend/modules/sync/dto/inputs.py rename to backend/backend/modules/sync/dto/inputs.py diff --git a/backend/modules/sync/dto/outputs.py b/backend/backend/modules/sync/dto/outputs.py similarity index 100% rename from backend/modules/sync/dto/outputs.py rename to backend/backend/modules/sync/dto/outputs.py diff --git a/backend/modules/sync/entity/__init__.py b/backend/backend/modules/sync/entity/__init__.py similarity index 100% rename from backend/modules/sync/entity/__init__.py rename to backend/backend/modules/sync/entity/__init__.py diff --git a/backend/modules/sync/entity/sync.py b/backend/backend/modules/sync/entity/sync.py similarity index 100% rename from backend/modules/sync/entity/sync.py rename to backend/backend/modules/sync/entity/sync.py diff --git a/backend/modules/sync/repository/__init__.py b/backend/backend/modules/sync/repository/__init__.py similarity index 100% rename from backend/modules/sync/repository/__init__.py rename to backend/backend/modules/sync/repository/__init__.py diff --git a/backend/modules/sync/repository/sync.py b/backend/backend/modules/sync/repository/sync.py similarity index 93% rename from backend/modules/sync/repository/sync.py rename to backend/backend/modules/sync/repository/sync.py index f87ef092ab6c..753bb88dc91b 100644 --- a/backend/modules/sync/repository/sync.py +++ b/backend/backend/modules/sync/repository/sync.py @@ -1,13 +1,15 @@ from datetime import datetime, timedelta from typing import List -from logger import get_logger -from models.settings import get_supabase_client -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.notification.service.notification_service import NotificationService -from modules.sync.dto.inputs import SyncsActiveInput, SyncsActiveUpdateInput -from modules.sync.entity.sync import SyncsActive -from modules.sync.repository.sync_interfaces import SyncInterface +from backend.logger import get_logger +from backend.models.settings import get_supabase_client +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.sync.dto.inputs import SyncsActiveInput, SyncsActiveUpdateInput +from backend.modules.sync.entity.sync import SyncsActive +from backend.modules.sync.repository.sync_interfaces import SyncInterface notification_service = NotificationService() knowledge_service = KnowledgeService() diff --git a/backend/modules/sync/repository/sync_files.py b/backend/backend/modules/sync/repository/sync_files.py similarity index 91% rename from backend/modules/sync/repository/sync_files.py rename to backend/backend/modules/sync/repository/sync_files.py index d7d166970b56..7b867906e348 100644 --- a/backend/modules/sync/repository/sync_files.py +++ b/backend/backend/modules/sync/repository/sync_files.py @@ -1,8 +1,8 @@ -from logger import get_logger -from models.settings import get_supabase_client -from modules.sync.dto.inputs import SyncFileInput, SyncFileUpdateInput -from modules.sync.entity.sync import SyncsFiles -from modules.sync.repository.sync_interfaces import SyncFileInterface +from backend.logger import get_logger +from backend.models.settings import get_supabase_client +from backend.modules.sync.dto.inputs import SyncFileInput, SyncFileUpdateInput +from backend.modules.sync.entity.sync import SyncsFiles +from backend.modules.sync.repository.sync_interfaces import SyncFileInterface logger = get_logger(__name__) diff --git a/backend/modules/sync/repository/sync_interfaces.py b/backend/backend/modules/sync/repository/sync_interfaces.py similarity index 95% rename from backend/modules/sync/repository/sync_interfaces.py rename to backend/backend/modules/sync/repository/sync_interfaces.py index e0ef1ba72e2d..1e9d1dce738d 100644 --- a/backend/modules/sync/repository/sync_interfaces.py +++ b/backend/backend/modules/sync/repository/sync_interfaces.py @@ -2,7 +2,7 @@ from typing import List from uuid import UUID -from modules.sync.dto.inputs import ( +from backend.modules.sync.dto.inputs import ( SyncFileInput, SyncFileUpdateInput, SyncsActiveInput, @@ -10,7 +10,7 @@ SyncsUserInput, SyncUserUpdateInput, ) -from modules.sync.entity.sync import SyncsActive, SyncsFiles +from backend.modules.sync.entity.sync import SyncsActive, SyncsFiles class SyncUserInterface(ABC): diff --git a/backend/modules/sync/repository/sync_user.py b/backend/backend/modules/sync/repository/sync_user.py similarity index 92% rename from backend/modules/sync/repository/sync_user.py rename to backend/backend/modules/sync/repository/sync_user.py index 387b2a194fda..722d48b71723 100644 --- a/backend/modules/sync/repository/sync_user.py +++ b/backend/backend/modules/sync/repository/sync_user.py @@ -1,12 +1,17 @@ import json -from logger import get_logger -from models.settings import get_supabase_client -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.notification.service.notification_service import NotificationService -from modules.sync.dto.inputs import SyncsUserInput, SyncUserUpdateInput -from modules.sync.repository.sync_interfaces import SyncUserInterface -from modules.sync.utils.list_files import get_google_drive_files, list_azure_files +from backend.logger import get_logger +from backend.models.settings import get_supabase_client +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.sync.dto.inputs import SyncsUserInput, SyncUserUpdateInput +from backend.modules.sync.repository.sync_interfaces import SyncUserInterface +from backend.modules.sync.utils.list_files import ( + get_google_drive_files, + list_azure_files, +) notification_service = NotificationService() knowledge_service = KnowledgeService() diff --git a/backend/modules/sync/service/__init__.py b/backend/backend/modules/sync/service/__init__.py similarity index 100% rename from backend/modules/sync/service/__init__.py rename to backend/backend/modules/sync/service/__init__.py diff --git a/backend/modules/sync/service/sync_service.py b/backend/backend/modules/sync/service/sync_service.py similarity index 84% rename from backend/modules/sync/service/sync_service.py rename to backend/backend/modules/sync/service/sync_service.py index 6e2ad6f915ca..6a578049e9e3 100644 --- a/backend/modules/sync/service/sync_service.py +++ b/backend/backend/modules/sync/service/sync_service.py @@ -1,17 +1,20 @@ from typing import List -from logger import get_logger -from modules.sync.dto.inputs import ( +from backend.logger import get_logger +from backend.modules.sync.dto.inputs import ( SyncsActiveInput, SyncsActiveUpdateInput, SyncsUserInput, SyncUserUpdateInput, ) -from modules.sync.entity.sync import SyncsActive -from modules.sync.repository.sync import Sync, SyncInterface -from modules.sync.repository.sync_interfaces import SyncInterface, SyncUserInterface -from modules.sync.repository.sync_user import SyncUser -from modules.user.service.user_service import UserService +from backend.modules.sync.entity.sync import SyncsActive +from backend.modules.sync.repository.sync import Sync, SyncInterface +from backend.modules.sync.repository.sync_interfaces import ( + SyncInterface, + SyncUserInterface, +) +from backend.modules.sync.repository.sync_user import SyncUser +from backend.modules.user.service.user_service import UserService logger = get_logger(__name__) diff --git a/backend/modules/sync/tasks.py b/backend/backend/modules/sync/tasks.py similarity index 79% rename from backend/modules/sync/tasks.py rename to backend/backend/modules/sync/tasks.py index 9420c9432cee..a4b6d01133b8 100644 --- a/backend/modules/sync/tasks.py +++ b/backend/backend/modules/sync/tasks.py @@ -1,12 +1,12 @@ import asyncio -from celery_config import celery -from logger import get_logger -from modules.knowledge.repository.storage import Storage -from modules.sync.repository.sync_files import SyncFiles -from modules.sync.service.sync_service import SyncService, SyncUserService -from modules.sync.utils.googleutils import GoogleSyncUtils -from modules.sync.utils.sharepointutils import AzureSyncUtils +from backend.celery_config import celery +from backend.logger import get_logger +from backend.modules.knowledge.repository.storage import Storage +from backend.modules.sync.repository.sync_files import SyncFiles +from backend.modules.sync.service.sync_service import SyncService, SyncUserService +from backend.modules.sync.utils.googleutils import GoogleSyncUtils +from backend.modules.sync.utils.sharepointutils import AzureSyncUtils logger = get_logger(__name__) diff --git a/backend/modules/sync/tests/test_api_key.py b/backend/backend/modules/sync/tests/test_api_key.py similarity index 100% rename from backend/modules/sync/tests/test_api_key.py rename to backend/backend/modules/sync/tests/test_api_key.py diff --git a/backend/modules/sync/utils/LICENSE b/backend/backend/modules/sync/utils/LICENSE similarity index 100% rename from backend/modules/sync/utils/LICENSE rename to backend/backend/modules/sync/utils/LICENSE diff --git a/backend/modules/sync/utils/__init__.py b/backend/backend/modules/sync/utils/__init__.py similarity index 100% rename from backend/modules/sync/utils/__init__.py rename to backend/backend/modules/sync/utils/__init__.py diff --git a/backend/modules/sync/utils/googleutils.py b/backend/backend/modules/sync/utils/googleutils.py similarity index 92% rename from backend/modules/sync/utils/googleutils.py rename to backend/backend/modules/sync/utils/googleutils.py index 6b4e1d6433f0..8fa731aac86d 100644 --- a/backend/modules/sync/utils/googleutils.py +++ b/backend/backend/modules/sync/utils/googleutils.py @@ -5,23 +5,24 @@ from google.auth.transport.requests import Request as GoogleRequest from google.oauth2.credentials import Credentials from googleapiclient.discovery import build -from logger import get_logger -from modules.brain.repository.brains_vectors import BrainsVectors -from modules.knowledge.repository.storage import Storage -from modules.sync.dto.inputs import ( +from pydantic import BaseModel, ConfigDict + +from backend.logger import get_logger +from backend.modules.brain.repository.brains_vectors import BrainsVectors +from backend.modules.knowledge.repository.storage import Storage +from backend.modules.sync.dto.inputs import ( SyncFileInput, SyncFileUpdateInput, SyncsActiveUpdateInput, ) -from modules.sync.repository.sync_files import SyncFiles -from modules.sync.service.sync_service import SyncService, SyncUserService -from modules.sync.utils.list_files import ( +from backend.modules.sync.repository.sync_files import SyncFiles +from backend.modules.sync.service.sync_service import SyncService, SyncUserService +from backend.modules.sync.utils.list_files import ( get_google_drive_files, get_google_drive_files_by_id, ) -from modules.sync.utils.upload import upload_file -from modules.upload.service.upload_file import check_file_exists -from pydantic import BaseModel, ConfigDict +from backend.modules.sync.utils.upload import upload_file +from backend.modules.upload.service.upload_file import check_file_exists logger = get_logger(__name__) @@ -126,7 +127,6 @@ async def _upload_files( logger.debug("🔥 File already exists in the storage: %s", file_name) self.storage.remove_file(brain_id + "/" + file_name) BrainsVectors().delete_file_from_brain(brain_id, file_name) - to_upload_file = UploadFile( file=BytesIO(file_data), @@ -327,25 +327,3 @@ async def sync(self, sync_active_id: int, user_id: str): "Google Drive sync completed for sync_active_id: %s", sync_active_id ) return downloaded_files - - -import asyncio - - -async def main(): - sync_user_service = SyncUserService() - sync_active_service = SyncService() - sync_files_repo = SyncFiles() - storage = Storage() - - google_sync_utils = GoogleSyncUtils( - sync_user_service=sync_user_service, - sync_active_service=sync_active_service, - sync_files_repo=sync_files_repo, - storage=storage, - ) - await google_sync_utils.sync(2, "39418e3b-0258-4452-af60-7acfcc1263ff") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/backend/modules/sync/utils/list_files.py b/backend/backend/modules/sync/utils/list_files.py similarity index 98% rename from backend/modules/sync/utils/list_files.py rename to backend/backend/modules/sync/utils/list_files.py index 6c1201ea80f7..3e8c78267aeb 100644 --- a/backend/modules/sync/utils/list_files.py +++ b/backend/backend/modules/sync/utils/list_files.py @@ -7,10 +7,11 @@ from google.auth.transport.requests import Request as GoogleRequest from google.oauth2.credentials import Credentials from googleapiclient.discovery import build -from modules.sync.utils.normalize import remove_special_characters -from logger import get_logger from requests import HTTPError +from backend.logger import get_logger +from backend.modules.sync.utils.normalize import remove_special_characters + logger = get_logger(__name__) @@ -141,7 +142,7 @@ def get_google_drive_files( break logger.info("Google Drive files retrieved successfully: %s", len(files)) - + for file in files: file["name"] = remove_special_characters(file["name"]) return files @@ -201,7 +202,7 @@ def fetch_files(endpoint, headers): token_data = get_azure_token_data(credentials) headers = get_azure_headers(token_data) - endpoint = f"https://graph.microsoft.com/v1.0/me/drive/root/children" + endpoint = "https://graph.microsoft.com/v1.0/me/drive/root/children" if folder_id: endpoint = ( f"https://graph.microsoft.com/v1.0/me/drive/items/{folder_id}/children" @@ -277,7 +278,7 @@ def get_azure_files_by_id(credentials: dict, file_ids: List[str]): "mime_type": result.get("file", {}).get("mimeType", "folder"), } ) - + for file in files: file["name"] = remove_special_characters(file["name"]) logger.info("Azure Drive files retrieved successfully: %s", len(files)) diff --git a/backend/modules/sync/utils/normalize.py b/backend/backend/modules/sync/utils/normalize.py similarity index 62% rename from backend/modules/sync/utils/normalize.py rename to backend/backend/modules/sync/utils/normalize.py index 154e8eb10b60..c6c1d877bddf 100644 --- a/backend/modules/sync/utils/normalize.py +++ b/backend/backend/modules/sync/utils/normalize.py @@ -1,15 +1,17 @@ -import unicodedata import re -from logger import get_logger +import unicodedata + +from backend.logger import get_logger logger = get_logger(__name__) + def remove_special_characters(input): try: - normalized_string = unicodedata.normalize('NFD', input) - normalized_string = re.sub(r'[^\w\s.]', '', normalized_string) + normalized_string = unicodedata.normalize("NFD", input) + normalized_string = re.sub(r"[^\w\s.]", "", normalized_string) logger.info(f"Input: {input}, Normalized: {normalized_string}") return normalized_string except Exception as e: logger.error(f"Error removing special characters: {e}") - return input \ No newline at end of file + return input diff --git a/backend/modules/sync/utils/sharepointutils.py b/backend/backend/modules/sync/utils/sharepointutils.py similarity index 92% rename from backend/modules/sync/utils/sharepointutils.py rename to backend/backend/modules/sync/utils/sharepointutils.py index d3ba896b49f0..92cee535bd92 100644 --- a/backend/modules/sync/utils/sharepointutils.py +++ b/backend/backend/modules/sync/utils/sharepointutils.py @@ -5,20 +5,24 @@ import msal import requests from fastapi import HTTPException, UploadFile -from logger import get_logger -from modules.brain.repository.brains_vectors import BrainsVectors -from modules.knowledge.repository.storage import Storage -from modules.sync.dto.inputs import ( +from pydantic import BaseModel, ConfigDict + +from backend.logger import get_logger +from backend.modules.brain.repository.brains_vectors import BrainsVectors +from backend.modules.knowledge.repository.storage import Storage +from backend.modules.sync.dto.inputs import ( SyncFileInput, SyncFileUpdateInput, SyncsActiveUpdateInput, ) -from modules.sync.repository.sync_files import SyncFiles -from modules.sync.service.sync_service import SyncService, SyncUserService -from modules.sync.utils.list_files import get_azure_files_by_id, list_azure_files -from modules.sync.utils.upload import upload_file -from modules.upload.service.upload_file import check_file_exists -from pydantic import BaseModel, ConfigDict +from backend.modules.sync.repository.sync_files import SyncFiles +from backend.modules.sync.service.sync_service import SyncService, SyncUserService +from backend.modules.sync.utils.list_files import ( + get_azure_files_by_id, + list_azure_files, +) +from backend.modules.sync.utils.upload import upload_file +from backend.modules.upload.service.upload_file import check_file_exists logger = get_logger(__name__) @@ -333,25 +337,3 @@ async def sync(self, sync_active_id: int, user_id: str): ) logger.info("Azure sync completed for sync_active_id: %s", sync_active_id) return downloaded_files - - -import asyncio - - -async def main(): - sync_user_service = SyncUserService() - sync_active_service = SyncService() - sync_files_repo = SyncFiles() - storage = Storage() - - azure_sync_utils = AzureSyncUtils( - sync_user_service=sync_user_service, - sync_active_service=sync_active_service, - sync_files_repo=sync_files_repo, - storage=storage, - ) - await azure_sync_utils.sync(3, "39418e3b-0258-4452-af60-7acfcc1263ff") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/backend/modules/sync/utils/upload.py b/backend/backend/modules/sync/utils/upload.py similarity index 76% rename from backend/modules/sync/utils/upload.py rename to backend/backend/modules/sync/utils/upload.py index 5664c90b5ec4..6f143b5503aa 100644 --- a/backend/modules/sync/utils/upload.py +++ b/backend/backend/modules/sync/utils/upload.py @@ -1,24 +1,27 @@ import os from uuid import UUID -from celery_worker import process_file_and_notify from fastapi import HTTPException, UploadFile -from modules.brain.entity.brain_entity import RoleEnum -from modules.brain.service.brain_authorization_service import ( + +from backend.celery_worker import process_file_and_notify +from backend.modules.brain.entity.brain_entity import RoleEnum +from backend.modules.brain.service.brain_authorization_service import ( validate_brain_authorization, ) -from modules.knowledge.dto.inputs import CreateKnowledgeProperties -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.notification.dto.inputs import ( +from backend.modules.knowledge.dto.inputs import CreateKnowledgeProperties +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.notification.dto.inputs import ( CreateNotification, NotificationUpdatableProperties, ) -from modules.notification.entity.notification import NotificationsStatusEnum -from modules.notification.service.notification_service import NotificationService -from modules.upload.service.upload_file import upload_file_storage -from modules.user.service.user_usage import UserUsage -from packages.files.file import convert_bytes, get_file_size -from packages.utils.telemetry import maybe_send_telemetry +from backend.modules.notification.entity.notification import NotificationsStatusEnum +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.upload.service.upload_file import upload_file_storage +from backend.modules.user.service.user_usage import UserUsage +from backend.packages.files.file import convert_bytes, get_file_size +from backend.packages.utils.telemetry import maybe_send_telemetry knowledge_service = KnowledgeService() notification_service = NotificationService() diff --git a/backend/modules/tools/__init__.py b/backend/backend/modules/tools/__init__.py similarity index 100% rename from backend/modules/tools/__init__.py rename to backend/backend/modules/tools/__init__.py diff --git a/backend/modules/tools/email_sender.py b/backend/backend/modules/tools/email_sender.py similarity index 91% rename from backend/modules/tools/email_sender.py rename to backend/backend/modules/tools/email_sender.py index 2806702a0323..752ac242030d 100644 --- a/backend/modules/tools/email_sender.py +++ b/backend/backend/modules/tools/email_sender.py @@ -9,12 +9,13 @@ from langchain.pydantic_v1 import Field as FieldV1 from langchain_community.document_loaders import PlaywrightURLLoader from langchain_core.tools import BaseTool -from logger import get_logger -from models import BrainSettings -from modules.contact_support.controller.settings import ContactsSettings -from packages.emails.send_email import send_email from pydantic import BaseModel +from backend.logger import get_logger +from backend.models.settings import BrainSettings +from backend.modules.contact_support.controller.settings import ContactsSettings +from backend.packages.emails.send_email import send_email + logger = get_logger(__name__) @@ -37,8 +38,7 @@ class EmailSenderTool(BaseTool): def _run( self, text: str, run_manager: Optional[CallbackManagerForToolRun] = None ) -> Dict: - - html_body = f""" + html_body = """
Quivr Logo
diff --git a/backend/modules/tools/image_generator.py b/backend/backend/modules/tools/image_generator.py similarity index 100% rename from backend/modules/tools/image_generator.py rename to backend/backend/modules/tools/image_generator.py diff --git a/backend/modules/tools/url_reader.py b/backend/backend/modules/tools/url_reader.py similarity index 97% rename from backend/modules/tools/url_reader.py rename to backend/backend/modules/tools/url_reader.py index 1eb6b2f8c51e..f61b8e45233b 100644 --- a/backend/modules/tools/url_reader.py +++ b/backend/backend/modules/tools/url_reader.py @@ -10,9 +10,10 @@ from langchain.pydantic_v1 import Field as FieldV1 from langchain_community.document_loaders import PlaywrightURLLoader from langchain_core.tools import BaseTool -from logger import get_logger from pydantic import BaseModel +from backend.logger import get_logger + logger = get_logger(__name__) diff --git a/backend/modules/tools/web_search.py b/backend/backend/modules/tools/web_search.py similarity index 98% rename from backend/modules/tools/web_search.py rename to backend/backend/modules/tools/web_search.py index 9b0d086e242a..e8c4ef7751f7 100644 --- a/backend/modules/tools/web_search.py +++ b/backend/backend/modules/tools/web_search.py @@ -9,9 +9,10 @@ from langchain.pydantic_v1 import BaseModel as BaseModelV1 from langchain.pydantic_v1 import Field as FieldV1 from langchain_core.tools import BaseTool -from logger import get_logger from pydantic import BaseModel +from backend.logger import get_logger + logger = get_logger(__name__) diff --git a/backend/modules/upload/__init__.py b/backend/backend/modules/upload/__init__.py similarity index 100% rename from backend/modules/upload/__init__.py rename to backend/backend/modules/upload/__init__.py diff --git a/backend/modules/upload/controller/__init__.py b/backend/backend/modules/upload/controller/__init__.py similarity index 100% rename from backend/modules/upload/controller/__init__.py rename to backend/backend/modules/upload/controller/__init__.py diff --git a/backend/modules/upload/controller/upload_routes.py b/backend/backend/modules/upload/controller/upload_routes.py similarity index 76% rename from backend/modules/upload/controller/upload_routes.py rename to backend/backend/modules/upload/controller/upload_routes.py index 4524cfc29b71..4926e716a4d6 100644 --- a/backend/modules/upload/controller/upload_routes.py +++ b/backend/backend/modules/upload/controller/upload_routes.py @@ -2,27 +2,30 @@ from typing import Optional from uuid import UUID -from celery_worker import process_file_and_notify from fastapi import APIRouter, Depends, HTTPException, Query, UploadFile -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.brain.entity.brain_entity import RoleEnum -from modules.brain.service.brain_authorization_service import ( + +from backend.celery_worker import process_file_and_notify +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.brain.entity.brain_entity import RoleEnum +from backend.modules.brain.service.brain_authorization_service import ( validate_brain_authorization, ) -from modules.knowledge.dto.inputs import CreateKnowledgeProperties -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.notification.dto.inputs import ( +from backend.modules.knowledge.dto.inputs import CreateKnowledgeProperties +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.notification.dto.inputs import ( CreateNotification, NotificationUpdatableProperties, ) -from modules.notification.entity.notification import NotificationsStatusEnum -from modules.notification.service.notification_service import NotificationService -from modules.upload.service.upload_file import upload_file_storage -from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_usage import UserUsage -from packages.files.file import convert_bytes, get_file_size -from packages.utils.telemetry import maybe_send_telemetry +from backend.modules.notification.entity.notification import NotificationsStatusEnum +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.upload.service.upload_file import upload_file_storage +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.service.user_usage import UserUsage +from backend.packages.files.file import convert_bytes, get_file_size +from backend.packages.utils.telemetry import maybe_send_telemetry logger = get_logger(__name__) upload_router = APIRouter() diff --git a/backend/modules/upload/service/__init__.py b/backend/backend/modules/upload/service/__init__.py similarity index 100% rename from backend/modules/upload/service/__init__.py rename to backend/backend/modules/upload/service/__init__.py diff --git a/backend/modules/upload/service/generate_file_signed_url.py b/backend/backend/modules/upload/service/generate_file_signed_url.py similarity index 91% rename from backend/modules/upload/service/generate_file_signed_url.py rename to backend/backend/modules/upload/service/generate_file_signed_url.py index ebb5e5919f19..fa5109053f6f 100644 --- a/backend/modules/upload/service/generate_file_signed_url.py +++ b/backend/backend/modules/upload/service/generate_file_signed_url.py @@ -1,6 +1,6 @@ from multiprocessing import get_logger -from models import get_supabase_client +from backend.models.settings import get_supabase_client from supabase.client import Client logger = get_logger() diff --git a/backend/modules/upload/service/list_files.py b/backend/backend/modules/upload/service/list_files.py similarity index 85% rename from backend/modules/upload/service/list_files.py rename to backend/backend/modules/upload/service/list_files.py index 405d10e2ac4b..048eacca98d6 100644 --- a/backend/modules/upload/service/list_files.py +++ b/backend/backend/modules/upload/service/list_files.py @@ -1,6 +1,6 @@ from multiprocessing import get_logger -from models import get_supabase_client +from backend.models.settings import get_supabase_client from supabase.client import Client logger = get_logger() diff --git a/backend/modules/upload/service/upload_file.py b/backend/backend/modules/upload/service/upload_file.py similarity index 97% rename from backend/modules/upload/service/upload_file.py rename to backend/backend/modules/upload/service/upload_file.py index b33dc520429e..37599a567af8 100644 --- a/backend/modules/upload/service/upload_file.py +++ b/backend/backend/modules/upload/service/upload_file.py @@ -4,8 +4,9 @@ from langchain.pydantic_v1 import Field from langchain.schema import Document -from logger import get_logger -from models import get_supabase_client + +from backend.logger import get_logger +from backend.models.settings import get_supabase_client from supabase.client import Client logger = get_logger(__name__) @@ -39,7 +40,6 @@ def check_file_exists(brain_id: str, file_identifier: str) -> bool: - supabase_client: Client = get_supabase_client() try: # Check if the file exists diff --git a/backend/modules/upload/tests/test_files/test.bib b/backend/backend/modules/upload/tests/test_files/test.bib similarity index 100% rename from backend/modules/upload/tests/test_files/test.bib rename to backend/backend/modules/upload/tests/test_files/test.bib diff --git a/backend/modules/upload/tests/test_files/test.csv b/backend/backend/modules/upload/tests/test_files/test.csv similarity index 100% rename from backend/modules/upload/tests/test_files/test.csv rename to backend/backend/modules/upload/tests/test_files/test.csv diff --git a/backend/modules/upload/tests/test_files/test.pdf b/backend/backend/modules/upload/tests/test_files/test.pdf similarity index 100% rename from backend/modules/upload/tests/test_files/test.pdf rename to backend/backend/modules/upload/tests/test_files/test.pdf diff --git a/backend/modules/upload/tests/test_files/test.txt b/backend/backend/modules/upload/tests/test_files/test.txt similarity index 100% rename from backend/modules/upload/tests/test_files/test.txt rename to backend/backend/modules/upload/tests/test_files/test.txt diff --git a/backend/modules/upload/tests/test_upload.py b/backend/backend/modules/upload/tests/test_upload.py similarity index 100% rename from backend/modules/upload/tests/test_upload.py rename to backend/backend/modules/upload/tests/test_upload.py diff --git a/backend/modules/user/__init__.py b/backend/backend/modules/user/__init__.py similarity index 100% rename from backend/modules/user/__init__.py rename to backend/backend/modules/user/__init__.py diff --git a/backend/modules/user/controller/__init__.py b/backend/backend/modules/user/controller/__init__.py similarity index 100% rename from backend/modules/user/controller/__init__.py rename to backend/backend/modules/user/controller/__init__.py diff --git a/backend/modules/user/controller/user_controller.py b/backend/backend/modules/user/controller/user_controller.py similarity index 88% rename from backend/modules/user/controller/user_controller.py rename to backend/backend/modules/user/controller/user_controller.py index c734b6ef0576..afdd2b07adf6 100644 --- a/backend/modules/user/controller/user_controller.py +++ b/backend/backend/modules/user/controller/user_controller.py @@ -1,10 +1,11 @@ from fastapi import APIRouter, Depends, Request -from middlewares.auth import AuthBearer, get_current_user -from modules.brain.service.brain_user_service import BrainUserService -from modules.user.dto.inputs import UserUpdatableProperties -from modules.user.entity.user_identity import UserIdentity -from modules.user.repository.users import Users -from modules.user.service.user_usage import UserUsage + +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.brain.service.brain_user_service import BrainUserService +from backend.modules.user.dto.inputs import UserUpdatableProperties +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.repository.users import Users +from backend.modules.user.service.user_usage import UserUsage user_router = APIRouter() brain_user_service = BrainUserService() @@ -79,6 +80,7 @@ def get_user_identity_route( """ return user_repository.get_user_identity(current_user.id) + @user_router.delete( "/user_data", dependencies=[Depends(AuthBearer())], @@ -99,6 +101,7 @@ async def delete_user_data_route( return {"message": "User deleted successfully"} + @user_router.get( "/user/credits", dependencies=[Depends(AuthBearer())], diff --git a/backend/modules/user/dto/inputs.py b/backend/backend/modules/user/dto/inputs.py similarity index 100% rename from backend/modules/user/dto/inputs.py rename to backend/backend/modules/user/dto/inputs.py diff --git a/backend/backend/modules/user/entity/user_identity.py b/backend/backend/modules/user/entity/user_identity.py new file mode 100644 index 000000000000..8feaccfe0c2e --- /dev/null +++ b/backend/backend/modules/user/entity/user_identity.py @@ -0,0 +1,28 @@ +from typing import List, Optional +from uuid import UUID, uuid4 + +from pydantic import BaseModel +from sqlmodel import Field, Relationship, SQLModel + + +class User(SQLModel, table=True): + __tablename__ = "users" # type: ignore + + id: UUID | None = Field( + primary_key=True, + nullable=False, + default_factory=uuid4, + ) + email: str + onboarded: bool | None = None + chats: List["Chat"] | None = Relationship(back_populates="user") # type: ignore + + +class UserIdentity(BaseModel): + id: UUID + email: Optional[str] = None + username: Optional[str] = None + company: Optional[str] = None + onboarded: Optional[bool] = None + company_size: Optional[str] = None + usage_purpose: Optional[str] = None diff --git a/backend/modules/user/repository/__init__.py b/backend/backend/modules/user/repository/__init__.py similarity index 100% rename from backend/modules/user/repository/__init__.py rename to backend/backend/modules/user/repository/__init__.py diff --git a/backend/modules/user/repository/users.py b/backend/backend/modules/user/repository/users.py similarity index 71% rename from backend/modules/user/repository/users.py rename to backend/backend/modules/user/repository/users.py index a65d3188ea8d..a1a9243d79f0 100644 --- a/backend/modules/user/repository/users.py +++ b/backend/backend/modules/user/repository/users.py @@ -1,8 +1,9 @@ import time -from models.settings import get_supabase_client -from modules.user.entity.user_identity import UserIdentity -from modules.user.repository.users_interface import UsersInterface -from modules.user.service import user_usage + +from backend.models.settings import get_supabase_client +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.repository.users_interface import UsersInterface +from backend.modules.user.service import user_usage class Users(UsersInterface): @@ -75,7 +76,7 @@ def get_user_email_by_user_id(self, user_id): "get_user_email_by_user_id", {"user_id": str(user_id)} ).execute() return response.data[0]["email"] - + def delete_user_data(self, user_id): response = ( self.db.from_("brains_users") @@ -87,23 +88,40 @@ def delete_user_data(self, user_id): brain_ids = [row["brain_id"] for row in response.data] for brain_id in brain_ids: - self.db.table("brains").delete().filter("brain_id", "eq", brain_id).execute() + self.db.table("brains").delete().filter( + "brain_id", "eq", brain_id + ).execute() for brain_id in brain_ids: - self.db.table("brains_vectors").delete().filter("brain_id", "eq", brain_id).execute() + self.db.table("brains_vectors").delete().filter( + "brain_id", "eq", brain_id + ).execute() for brain_id in brain_ids: - self.db.table("chat_history").delete().filter("brain_id", "eq", brain_id).execute() + self.db.table("chat_history").delete().filter( + "brain_id", "eq", brain_id + ).execute() - self.db.table("user_settings").delete().filter("user_id", "eq", str(user_id)).execute() - self.db.table("user_identity").delete().filter("user_id", "eq", str(user_id)).execute() + self.db.table("user_settings").delete().filter( + "user_id", "eq", str(user_id) + ).execute() + self.db.table("user_identity").delete().filter( + "user_id", "eq", str(user_id) + ).execute() self.db.table("users").delete().filter("id", "eq", str(user_id)).execute() - def get_user_credits(self, user_id): user_usage_instance = user_usage.UserUsage(id=user_id) - - user_monthly_usage = user_usage_instance.get_user_monthly_usage(time.strftime("%Y%m%d")) - monthly_chat_credit = self.db.from_("user_settings").select("monthly_chat_credit").filter("user_id", "eq", str(user_id)).execute().data[0]["monthly_chat_credit"] + + user_monthly_usage = user_usage_instance.get_user_monthly_usage( + time.strftime("%Y%m%d") + ) + monthly_chat_credit = ( + self.db.from_("user_settings") + .select("monthly_chat_credit") + .filter("user_id", "eq", str(user_id)) + .execute() + .data[0]["monthly_chat_credit"] + ) return monthly_chat_credit - user_monthly_usage diff --git a/backend/modules/user/repository/users_interface.py b/backend/backend/modules/user/repository/users_interface.py similarity index 85% rename from backend/modules/user/repository/users_interface.py rename to backend/backend/modules/user/repository/users_interface.py index 5c0e2b47c03b..28c6ed6b3d0b 100644 --- a/backend/modules/user/repository/users_interface.py +++ b/backend/backend/modules/user/repository/users_interface.py @@ -1,8 +1,8 @@ from abc import ABC, abstractmethod from uuid import UUID -from modules.user.dto.inputs import UserUpdatableProperties -from modules.user.entity.user_identity import UserIdentity +from backend.modules.user.dto.inputs import UserUpdatableProperties +from backend.modules.user.entity.user_identity import UserIdentity class UsersInterface(ABC): @@ -52,9 +52,10 @@ def delete_user_data(self, user_id: str): - `user_id`: The ID of the user to delete. - This endpoint deletes a user from the system. + This endpoint deletes a user from the system. """ - @abstractmethod + + @abstractmethod def get_user_credits(self, user_id: UUID) -> int: """ Get user remaining credits diff --git a/backend/modules/user/service/__init__.py b/backend/backend/modules/user/service/__init__.py similarity index 100% rename from backend/modules/user/service/__init__.py rename to backend/backend/modules/user/service/__init__.py diff --git a/backend/modules/user/service/user_service.py b/backend/backend/modules/user/service/user_service.py similarity index 75% rename from backend/modules/user/service/user_service.py rename to backend/backend/modules/user/service/user_service.py index 8147eaaf95d3..c29234b9d6e2 100644 --- a/backend/modules/user/service/user_service.py +++ b/backend/backend/modules/user/service/user_service.py @@ -1,7 +1,7 @@ from uuid import UUID -from modules.user.repository.users import Users -from modules.user.repository.users_interface import UsersInterface +from backend.modules.user.repository.users import Users +from backend.modules.user.repository.users_interface import UsersInterface class UserService: diff --git a/backend/modules/user/service/user_usage.py b/backend/backend/modules/user/service/user_usage.py similarity index 86% rename from backend/modules/user/service/user_usage.py rename to backend/backend/modules/user/service/user_usage.py index dc73df7503b9..f644342e067d 100644 --- a/backend/modules/user/service/user_usage.py +++ b/backend/backend/modules/user/service/user_usage.py @@ -1,7 +1,7 @@ -from logger import get_logger -from models.databases.supabase.supabase import SupabaseDB -from models.settings import PostHogSettings, get_supabase_db -from modules.user.entity.user_identity import UserIdentity +from backend.logger import get_logger +from backend.models.databases.supabase.supabase import SupabaseDB +from backend.models.settings import PostHogSettings, get_supabase_db +from backend.modules.user.entity.user_identity import UserIdentity logger = get_logger(__name__) @@ -16,19 +16,18 @@ def __init__(self, **data): def supabase_db(self) -> SupabaseDB: return get_supabase_db() - def get_user_usage(self): + def get_user_daily_usage(self): """ Fetch the user request stats from the database """ request = self.supabase_db.get_user_usage(self.id) - return request - def get_model_settings(self): + def get_models(self): """ Fetch the user request stats from the database """ - request = self.supabase_db.get_model_settings() + request = self.supabase_db.get_models() return request @@ -76,6 +75,7 @@ def handle_increment_user_request_count(self, date, number=1): self.id, date ) + # BUG: could be a bug, we are assuming that 0 means no records ! if daily_requests_count == 0: logger.info("Request count is 0, creating new record") if self.email is None: diff --git a/backend/modules/user/tests/test_user_controller.py b/backend/backend/modules/user/tests/test_user_controller.py similarity index 100% rename from backend/modules/user/tests/test_user_controller.py rename to backend/backend/modules/user/tests/test_user_controller.py diff --git a/backend/packages/__init__.py b/backend/backend/packages/__init__.py similarity index 100% rename from backend/packages/__init__.py rename to backend/backend/packages/__init__.py diff --git a/backend/packages/emails/__init__.py b/backend/backend/packages/emails/__init__.py similarity index 100% rename from backend/packages/emails/__init__.py rename to backend/backend/packages/emails/__init__.py diff --git a/backend/packages/emails/send_email.py b/backend/backend/packages/emails/send_email.py similarity index 78% rename from backend/packages/emails/send_email.py rename to backend/backend/packages/emails/send_email.py index aeba717715a1..feaf42b8c3d0 100644 --- a/backend/packages/emails/send_email.py +++ b/backend/backend/packages/emails/send_email.py @@ -1,7 +1,8 @@ from typing import Dict import resend -from models import ResendSettings + +from backend.models.settings import ResendSettings def send_email(params: Dict): diff --git a/backend/packages/embeddings/__init__.py b/backend/backend/packages/embeddings/__init__.py similarity index 100% rename from backend/packages/embeddings/__init__.py rename to backend/backend/packages/embeddings/__init__.py diff --git a/backend/packages/embeddings/vectors.py b/backend/backend/packages/embeddings/vectors.py similarity index 90% rename from backend/packages/embeddings/vectors.py rename to backend/backend/packages/embeddings/vectors.py index b0ba4bd0e305..d1854a60e1bd 100644 --- a/backend/packages/embeddings/vectors.py +++ b/backend/backend/packages/embeddings/vectors.py @@ -2,10 +2,15 @@ from typing import List from uuid import UUID -from logger import get_logger -from models.settings import get_documents_vector_store, get_embeddings, get_supabase_db from pydantic import BaseModel +from backend.logger import get_logger +from backend.models.settings import ( + get_documents_vector_store, + get_embedding_client, + get_supabase_db, +) + logger = get_logger(__name__) @@ -23,7 +28,7 @@ def create_vector(self, docs): logger.error(f"Error creating vector for document {e}") def create_embedding(self, content): - embeddings = get_embeddings() + embeddings = get_embedding_client() return embeddings.embed_query(content) diff --git a/backend/packages/files/__init__.py b/backend/backend/packages/files/__init__.py similarity index 100% rename from backend/packages/files/__init__.py rename to backend/backend/packages/files/__init__.py diff --git a/backend/packages/files/crawl/__init__.py b/backend/backend/packages/files/crawl/__init__.py similarity index 100% rename from backend/packages/files/crawl/__init__.py rename to backend/backend/packages/files/crawl/__init__.py diff --git a/backend/packages/files/crawl/crawler.py b/backend/backend/packages/files/crawl/crawler.py similarity index 96% rename from backend/packages/files/crawl/crawler.py rename to backend/backend/packages/files/crawl/crawler.py index 60dd1697f73e..38dd5152a076 100644 --- a/backend/packages/files/crawl/crawler.py +++ b/backend/backend/packages/files/crawl/crawler.py @@ -3,9 +3,10 @@ import unicodedata from langchain_community.document_loaders import PlaywrightURLLoader -from logger import get_logger from pydantic import BaseModel +from backend.logger import get_logger + logger = get_logger(__name__) diff --git a/backend/packages/files/file.py b/backend/backend/packages/files/file.py similarity index 100% rename from backend/packages/files/file.py rename to backend/backend/packages/files/file.py diff --git a/backend/packages/files/loaders/__init__.py b/backend/backend/packages/files/loaders/__init__.py similarity index 100% rename from backend/packages/files/loaders/__init__.py rename to backend/backend/packages/files/loaders/__init__.py diff --git a/backend/packages/files/loaders/telegram.py b/backend/backend/packages/files/loaders/telegram.py similarity index 100% rename from backend/packages/files/loaders/telegram.py rename to backend/backend/packages/files/loaders/telegram.py diff --git a/backend/packages/files/parsers/__init__.py b/backend/backend/packages/files/parsers/__init__.py similarity index 100% rename from backend/packages/files/parsers/__init__.py rename to backend/backend/packages/files/parsers/__init__.py diff --git a/backend/packages/files/parsers/audio.py b/backend/backend/packages/files/parsers/audio.py similarity index 90% rename from backend/packages/files/parsers/audio.py rename to backend/backend/packages/files/parsers/audio.py index 6324fae5947a..d03b4dbe4bab 100644 --- a/backend/packages/files/parsers/audio.py +++ b/backend/backend/packages/files/parsers/audio.py @@ -3,8 +3,10 @@ import openai from langchain.schema import Document from langchain.text_splitter import RecursiveCharacterTextSplitter -from models import File, get_documents_vector_store -from packages.files.file import compute_sha1_from_content + +from backend.models.files import File +from backend.models.settings import get_documents_vector_store +from backend.packages.files.file import compute_sha1_from_content def process_audio(file: File, **kwargs): diff --git a/backend/packages/files/parsers/bibtex.py b/backend/backend/packages/files/parsers/bibtex.py similarity index 91% rename from backend/packages/files/parsers/bibtex.py rename to backend/backend/packages/files/parsers/bibtex.py index 0426f2a49c39..3973db05a907 100644 --- a/backend/packages/files/parsers/bibtex.py +++ b/backend/backend/packages/files/parsers/bibtex.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import BibtexLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/code_python.py b/backend/backend/packages/files/parsers/code_python.py similarity index 91% rename from backend/packages/files/parsers/code_python.py rename to backend/backend/packages/files/parsers/code_python.py index b3d9af076a12..d5991f117fcc 100644 --- a/backend/packages/files/parsers/code_python.py +++ b/backend/backend/packages/files/parsers/code_python.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import PythonLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/common.py b/backend/backend/packages/files/parsers/common.py similarity index 85% rename from backend/packages/files/parsers/common.py rename to backend/backend/packages/files/parsers/common.py index 6b56aeb30a65..a9345fcb887e 100644 --- a/backend/packages/files/parsers/common.py +++ b/backend/backend/packages/files/parsers/common.py @@ -9,11 +9,12 @@ from langchain.schema import Document from langchain.text_splitter import RecursiveCharacterTextSplitter from llama_parse import LlamaParse -from logger import get_logger -from models import File -from modules.brain.service.brain_vector_service import BrainVectorService -from modules.upload.service.upload_file import DocumentSerializable -from packages.embeddings.vectors import Neurons + +from backend.logger import get_logger +from backend.models.files import File +from backend.modules.brain.service.brain_vector_service import BrainVectorService +from backend.modules.upload.service.upload_file import DocumentSerializable +from backend.packages.embeddings.vectors import Neurons if not isinstance(asyncio.get_event_loop(), uvloop.Loop): nest_asyncio.apply() @@ -61,7 +62,6 @@ def process_file( ) file.documents = text_splitter.split_documents([document_to_langchain]) else: - file.compute_documents(loader_class) metadata = { @@ -81,9 +81,7 @@ def process_file( if file.documents is not None: logger.info("Coming here?") - for index, doc in enumerate( - file.documents, start=1 - ): # pyright: ignore reportPrivateUsage=none + for index, doc in enumerate(file.documents, start=1): # pyright: ignore reportPrivateUsage=none new_metadata = metadata.copy() logger.info(f"Processing document {doc}") # Add filename at beginning of page content @@ -108,13 +106,13 @@ def process_file( created_vector = neurons.create_vector(docs) brain_vector_service = BrainVectorService(brain_id) - for created_vector_id in created_vector: - result = brain_vector_service.create_brain_vector( - created_vector_id, metadata["file_sha1"] - ) - logger.debug(f"Brain vector created: {result}") - if created_vector: + if created_vector is not None: + for created_vector_id in created_vector: + result = brain_vector_service.create_brain_vector( + created_vector_id, metadata["file_sha1"] + ) + logger.debug(f"Brain vector created: {result}") return len(created_vector) else: return 0 diff --git a/backend/packages/files/parsers/csv.py b/backend/backend/packages/files/parsers/csv.py similarity index 91% rename from backend/packages/files/parsers/csv.py rename to backend/backend/packages/files/parsers/csv.py index a3201683a8bc..625ff5718cfa 100644 --- a/backend/packages/files/parsers/csv.py +++ b/backend/backend/packages/files/parsers/csv.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import CSVLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/docx.py b/backend/backend/packages/files/parsers/docx.py similarity index 91% rename from backend/packages/files/parsers/docx.py rename to backend/backend/packages/files/parsers/docx.py index e9d64792503b..a325f26fc154 100644 --- a/backend/packages/files/parsers/docx.py +++ b/backend/backend/packages/files/parsers/docx.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import Docx2txtLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/epub.py b/backend/backend/packages/files/parsers/epub.py similarity index 92% rename from backend/packages/files/parsers/epub.py rename to backend/backend/packages/files/parsers/epub.py index 97c67050a287..fe55b1c4389f 100644 --- a/backend/packages/files/parsers/epub.py +++ b/backend/backend/packages/files/parsers/epub.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders.epub import UnstructuredEPubLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/github.py b/backend/backend/packages/files/parsers/github.py similarity index 93% rename from backend/packages/files/parsers/github.py rename to backend/backend/packages/files/parsers/github.py index aa47ea7ce02f..9150140e180a 100644 --- a/backend/packages/files/parsers/github.py +++ b/backend/backend/packages/files/parsers/github.py @@ -4,9 +4,10 @@ from langchain.schema import Document from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import GitLoader -from models.files import File -from packages.embeddings.vectors import Neurons -from packages.files.file import compute_sha1_from_content + +from backend.models.files import File +from backend.packages.embeddings.vectors import Neurons +from backend.packages.files.file import compute_sha1_from_content def process_github( diff --git a/backend/packages/files/parsers/html.py b/backend/backend/packages/files/parsers/html.py similarity index 92% rename from backend/packages/files/parsers/html.py rename to backend/backend/packages/files/parsers/html.py index 998a7fa5cdcf..9fee93cf69f8 100644 --- a/backend/packages/files/parsers/html.py +++ b/backend/backend/packages/files/parsers/html.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import UnstructuredHTMLLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/markdown.py b/backend/backend/packages/files/parsers/markdown.py similarity index 92% rename from backend/packages/files/parsers/markdown.py rename to backend/backend/packages/files/parsers/markdown.py index 459f83f197cb..a52c2cc1ea35 100644 --- a/backend/packages/files/parsers/markdown.py +++ b/backend/backend/packages/files/parsers/markdown.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import UnstructuredMarkdownLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/notebook.py b/backend/backend/packages/files/parsers/notebook.py similarity index 91% rename from backend/packages/files/parsers/notebook.py rename to backend/backend/packages/files/parsers/notebook.py index fd967bc9cfd6..e18fa1bb3937 100644 --- a/backend/packages/files/parsers/notebook.py +++ b/backend/backend/packages/files/parsers/notebook.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import NotebookLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/odt.py b/backend/backend/packages/files/parsers/odt.py similarity index 92% rename from backend/packages/files/parsers/odt.py rename to backend/backend/packages/files/parsers/odt.py index 8a551f55cce9..d317a04d1fc2 100644 --- a/backend/packages/files/parsers/odt.py +++ b/backend/backend/packages/files/parsers/odt.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import UnstructuredPDFLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/pdf.py b/backend/backend/packages/files/parsers/pdf.py similarity index 92% rename from backend/packages/files/parsers/pdf.py rename to backend/backend/packages/files/parsers/pdf.py index e43ec96a9e1e..71472d5fe402 100644 --- a/backend/packages/files/parsers/pdf.py +++ b/backend/backend/packages/files/parsers/pdf.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import UnstructuredPDFLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/powerpoint.py b/backend/backend/packages/files/parsers/powerpoint.py similarity index 92% rename from backend/packages/files/parsers/powerpoint.py rename to backend/backend/packages/files/parsers/powerpoint.py index 7e292aafbd3c..a653d1f18ce6 100644 --- a/backend/packages/files/parsers/powerpoint.py +++ b/backend/backend/packages/files/parsers/powerpoint.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import UnstructuredFileLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/telegram.py b/backend/backend/packages/files/parsers/telegram.py similarity index 77% rename from backend/packages/files/parsers/telegram.py rename to backend/backend/packages/files/parsers/telegram.py index 2eaa76bf24f0..ced97c62d623 100644 --- a/backend/packages/files/parsers/telegram.py +++ b/backend/backend/packages/files/parsers/telegram.py @@ -1,5 +1,5 @@ -from models import File -from packages.files.loaders.telegram import TelegramChatFileLoader +from backend.models.files import File +from backend.packages.files.loaders.telegram import TelegramChatFileLoader from .common import process_file diff --git a/backend/packages/files/parsers/txt.py b/backend/backend/packages/files/parsers/txt.py similarity index 91% rename from backend/packages/files/parsers/txt.py rename to backend/backend/packages/files/parsers/txt.py index 336662419643..b7afece81fb4 100644 --- a/backend/packages/files/parsers/txt.py +++ b/backend/backend/packages/files/parsers/txt.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import TextLoader -from models import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/parsers/xlsx.py b/backend/backend/packages/files/parsers/xlsx.py similarity index 92% rename from backend/packages/files/parsers/xlsx.py rename to backend/backend/packages/files/parsers/xlsx.py index 96e36971278e..29c52cc188ac 100644 --- a/backend/packages/files/parsers/xlsx.py +++ b/backend/backend/packages/files/parsers/xlsx.py @@ -1,5 +1,6 @@ from langchain_community.document_loaders import UnstructuredExcelLoader -from models.files import File + +from backend.models.files import File from .common import process_file diff --git a/backend/packages/files/processors.py b/backend/backend/packages/files/processors.py similarity index 96% rename from backend/packages/files/processors.py rename to backend/backend/packages/files/processors.py index 04e70a976e1c..6ab428a1a08d 100644 --- a/backend/packages/files/processors.py +++ b/backend/backend/packages/files/processors.py @@ -1,4 +1,4 @@ -from modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.brain_service import BrainService from .parsers.audio import process_audio from .parsers.bibtex import process_bibtex @@ -50,7 +50,7 @@ def create_response(message, type): brain_service = BrainService() -# TODO: Move filter_file to a file service to avoid circular imports from models/files.py for File class +# TODO: Move filter_file to a file service to avoid circular imports from backend.models/files.py for File class def filter_file( file, brain_id, diff --git a/backend/routes/__init__.py b/backend/backend/packages/quivr_core/__init__.py similarity index 100% rename from backend/routes/__init__.py rename to backend/backend/packages/quivr_core/__init__.py diff --git a/backend/backend/packages/quivr_core/brain_factory.py b/backend/backend/packages/quivr_core/brain_factory.py new file mode 100644 index 000000000000..eaf46a49fde9 --- /dev/null +++ b/backend/backend/packages/quivr_core/brain_factory.py @@ -0,0 +1,292 @@ +import datetime +from typing import Type +from uuid import UUID, uuid4 + +from backend.logger import get_logger +from backend.models.settings import get_embedding_client, get_supabase_client +from backend.modules.brain.entity.brain_entity import BrainEntity +from backend.modules.brain.entity.integration_brain import IntegrationEntity +from backend.modules.brain.integrations.Big.Brain import BigBrain +from backend.modules.brain.integrations.GPT4.Brain import GPT4Brain +from backend.modules.brain.integrations.Multi_Contract.Brain import MultiContractBrain +from backend.modules.brain.integrations.Notion.Brain import NotionBrain +from backend.modules.brain.integrations.Proxy.Brain import ProxyBrain +from backend.modules.brain.integrations.Self.Brain import SelfBrain +from backend.modules.brain.integrations.SQL.Brain import SQLBrain +from backend.modules.brain.knowledge_brain_qa import KnowledgeBrainQA +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.utils.format_chat_history import format_chat_history +from backend.modules.chat.controller.chat.utils import ( + compute_cost, + find_model_and_generate_metadata, + update_user_usage, +) +from backend.modules.chat.dto.inputs import CreateChatHistory +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.chat.service.chat_service import ChatService +from backend.modules.knowledge.repository.knowledges import KnowledgeRepository +from backend.modules.prompt.entity.prompt import Prompt +from backend.modules.prompt.service.prompt_service import PromptService +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.service.user_usage import UserUsage +from backend.packages.quivr_core.config import RAGConfig +from backend.packages.quivr_core.models import ParsedRAGResponse, RAGResponseMetadata +from backend.packages.quivr_core.quivr_rag import QuivrQARAG +from backend.packages.quivr_core.utils import generate_source +from backend.vectorstore.supabase import CustomSupabaseVectorStore + +logger = get_logger(__name__) + + +class RAGServiceFactory: + integration_list: dict[str, Type[KnowledgeBrainQA]] = { + "notion": NotionBrain, + "gpt4": GPT4Brain, + "sql": SQLBrain, + "big": BigBrain, + "doc": KnowledgeBrainQA, + "proxy": ProxyBrain, + "self": SelfBrain, + "multi-contract": MultiContractBrain, + } + + def get_brain_cls(self, integration: IntegrationEntity): + pass + + +class RAGService: + def __init__( + self, + current_user: UserIdentity, + brain_id: UUID | None, + chat_id: UUID, + brain_service: BrainService, + prompt_service: PromptService, + chat_service: ChatService, + knowledge_service: KnowledgeRepository, + ): + # Services + self.brain_service = brain_service + self.prompt_service = prompt_service + self.chat_service = chat_service + self.knowledge_service = knowledge_service + + # Base models + self.current_user = current_user + self.chat_id = chat_id + self.brain = self.get_or_create_brain(brain_id, self.current_user.id) + self.prompt = self.get_brain_prompt(self.brain) + + # check at init time + self.model_to_use = self.check_and_update_user_usage( + self.current_user, self.brain + ) + + def get_brain_prompt(self, brain: BrainEntity) -> Prompt | None: + return ( + self.prompt_service.get_prompt_by_id(brain.prompt_id) + if brain.prompt_id + else None + ) + + def get_or_create_brain(self, brain_id: UUID | None, user_id: UUID) -> BrainEntity: + brain = None + if brain_id is not None: + brain = self.brain_service.get_brain_details(brain_id, user_id) + + # TODO: Create if doesn't exist + assert brain + + if brain.integration: + assert brain.integration.user_id == user_id + return brain + + def check_and_update_user_usage(self, user: UserIdentity, brain: BrainEntity): + """Check user limits and raises if user reached his limits: + 1. Raise if one of the conditions : + - User doesn't have access to brains + - Model of brain is not is user_settings.models + - Latest sum_30d(user_daily_user) < user_settings.max_monthly_usage + - Check sum(user_settings.daily_user_count)+ model_price < user_settings.monthly_chat_credits + 2. Updates user usage + """ + # TODO(@aminediro) : THIS is bug prone, should retrieve it from DB here + user_usage = UserUsage(id=user.id, email=user.email) + user_settings = user_usage.get_user_settings() + all_models = user_usage.get_models() + + # TODO(@aminediro): refactor this function + model_to_use = find_model_and_generate_metadata( + brain.model, + user_settings, + all_models, + ) + cost = compute_cost(model_to_use, all_models) + # Raises HTTP if user usage exceeds limits + update_user_usage(user_usage, user_settings, cost) # noqa: F821 + return model_to_use + + def create_vector_store( + self, brain_id: UUID, max_input: int + ) -> CustomSupabaseVectorStore: + supabase_client = get_supabase_client() + embeddings = get_embedding_client() + return CustomSupabaseVectorStore( + supabase_client, + embeddings, + table_name="vectors", + brain_id=brain_id, + max_input=max_input, + ) + + def save_answer(self, question: str, answer: ParsedRAGResponse): + return self.chat_service.update_chat_history( + CreateChatHistory( + **{ + "chat_id": self.chat_id, + "user_message": question, + "assistant": answer.answer, + "brain_id": self.brain.brain_id, + # TODO: prompt_id should always be not None + "prompt_id": self.prompt.id if self.prompt else None, + "metadata": answer.metadata.model_dump() if answer.metadata else {}, + } + ) + ) + + async def generate_answer( + self, + question: str, + ): + logger.info( + f"Creating question for chat {self.chat_id} with brain {self.brain.brain_id} " + ) + rag_config = RAGConfig( + model=self.model_to_use.name, + temperature=self.brain.temperature, + max_input=self.model_to_use.max_input, + max_tokens=self.brain.max_tokens, + prompt=self.prompt.content if self.prompt else None, + streaming=False, + ) + history = await self.chat_service.get_chat_history(self.chat_id) + # Get list of files + list_files = self.knowledge_service.get_all_knowledge_in_brain( + self.brain.brain_id + ) + vector_store = self.create_vector_store( + self.brain.brain_id, rag_config.max_input + ) + # Initialize the rag pipline + rag_pipeline = QuivrQARAG(rag_config, vector_store) + # Format the history, sanitize the input + transformed_history = format_chat_history(history) + + parsed_response = rag_pipeline.answer(question, transformed_history, list_files) + + # Save the answer to db + new_chat_entry = self.save_answer(question, parsed_response) + + # Format output to be correct + return GetChatHistoryOutput( + **{ + "chat_id": self.chat_id, + "user_message": question, + "assistant": parsed_response.answer, + "message_time": new_chat_entry.message_time, + "prompt_title": (self.prompt.title if self.prompt else None), + "brain_name": self.brain.name if self.brain else None, + "message_id": new_chat_entry.message_id, + "brain_id": str(self.brain.brain_id) if self.brain else None, + "metadata": ( + parsed_response.metadata.model_dump() + if parsed_response.metadata + else {} + ), + } + ) + + async def generate_answer_stream( + self, + question: str, + ): + logger.info( + f"Creating question for chat {self.chat_id} with brain {self.brain.brain_id} " + ) + # Build the rag config + rag_config = RAGConfig( + model=self.model_to_use.name, + temperature=self.brain.temperature, + max_input=self.model_to_use.max_input, + max_tokens=self.brain.max_tokens, + prompt=self.prompt.content if self.prompt else "", + streaming=True, + ) + # Getting chat history + history = await self.chat_service.get_chat_history(self.chat_id) + # Format the history, sanitize the input + transformed_history = format_chat_history(history) + + # Get list of files urls + # TODO: Why do we get ALL the files ? + list_files = self.knowledge_service.get_all_knowledge_in_brain( + self.brain.brain_id + ) + vector_store = self.create_vector_store( + self.brain.brain_id, rag_config.max_input + ) + # Initialize the rag pipline + rag_pipeline = QuivrQARAG(rag_config, vector_store) + + full_answer = "" + + message_metadata = { + "chat_id": self.chat_id, + "message_id": uuid4(), # do we need it ?, + "user_message": question, # TODO: define result + "message_time": datetime.datetime.now(), # TODO: define result + "prompt_title": (self.prompt.title if self.prompt else ""), + "brain_name": self.brain.name if self.brain else None, + "brain_id": self.brain.brain_id if self.brain else None, + } + + async for response in rag_pipeline.answer_astream( + question, transformed_history, list_files + ): + # Format output to be correct servicedf;j + if not response.last_chunk: + streamed_chat_history = GetChatHistoryOutput( + assistant=response.answer, + metadata=response.metadata.model_dump(), + **message_metadata, + ) + full_answer += response.answer + yield f"data: {streamed_chat_history.model_dump_json()}" + + # For last chunk parse the sources, and the full answer + streamed_chat_history = GetChatHistoryOutput( + assistant=response.answer, + metadata=response.metadata.model_dump(), + **message_metadata, + ) + + sources_urls = generate_source( + response.metadata.sources, + self.brain.brain_id, + ( + streamed_chat_history.metadata["citations"] + if streamed_chat_history.metadata + else None + ), + ) + if streamed_chat_history.metadata: + streamed_chat_history.metadata["sources"] = sources_urls + + self.save_answer( + question, + ParsedRAGResponse( + answer=full_answer, + metadata=RAGResponseMetadata(**streamed_chat_history.metadata), + ), + ) + yield f"data: {streamed_chat_history.model_dump_json()}" diff --git a/backend/backend/packages/quivr_core/config.py b/backend/backend/packages/quivr_core/config.py new file mode 100644 index 000000000000..1f6c5619b661 --- /dev/null +++ b/backend/backend/packages/quivr_core/config.py @@ -0,0 +1,23 @@ +from pydantic import BaseModel, field_validator + + +class RAGConfig(BaseModel): + model: str = "gpt-3.5-turbo-0125" # pyright: ignore reportPrivateUsage=none + temperature: float | None = 0.1 + max_tokens: int | None = 2000 + max_input: int = 2000 + streaming: bool = False + max_files: int = 20 + prompt: str | None = None + + @field_validator("temperature", mode="before") + def set_default_temperature(cls, v): + if v is None: + return 0.1 + return v + + @field_validator("max_tokens", mode="before") + def set_default_max_tokens(cls, v): + if v is None: + return 2000 + return v diff --git a/backend/backend/packages/quivr_core/models.py b/backend/backend/packages/quivr_core/models.py new file mode 100644 index 000000000000..47db70ce940c --- /dev/null +++ b/backend/backend/packages/quivr_core/models.py @@ -0,0 +1,66 @@ +from typing import Any + +from langchain_core.pydantic_v1 import BaseModel as BaseModelV1 +from langchain_core.pydantic_v1 import Field as FieldV1 +from pydantic import BaseModel +from typing_extensions import TypedDict + + +class cited_answer(BaseModelV1): + """Answer the user question based only on the given sources, and cite the sources used.""" + + answer: str = FieldV1( + ..., + description="The answer to the user question, which is based only on the given sources.", + ) + thoughts: str = FieldV1( + ..., + description="""Description of the thought process, based only on the given sources. + Cite the text as much as possible and give the document name it appears in. In the format : 'Doc_name states : cited_text'. Be the most + procedural as possible. Write all the steps needed to find the answer until you find it.""", + ) + citations: list[int] = FieldV1( + ..., + description="The integer IDs of the SPECIFIC sources which justify the answer.", + ) + + followup_questions: list[str] = FieldV1( + ..., + description="Generate up to 3 follow-up questions that could be asked based on the answer given or context provided.", + ) + + +class Source(BaseModel): + name: str + source_url: str + type: str + original_file_name: str + citation: str + + +class RawRAGChunkResponse(TypedDict): + answer: dict[str, Any] + docs: dict[str, Any] + + +class RawRAGResponse(TypedDict): + answer: dict[str, Any] + docs: dict[str, Any] + + +class RAGResponseMetadata(BaseModel): + citations: list[int] | None = None + thoughts: str | list[str] | None = None + followup_questions: list[str] | None = None + sources: list[Any] | None = None + + +class ParsedRAGResponse(BaseModel): + answer: str + metadata: RAGResponseMetadata | None = None + + +class ParsedRAGChunkResponse(BaseModel): + answer: str + metadata: RAGResponseMetadata + last_chunk: bool = False diff --git a/backend/backend/packages/quivr_core/prompts.py b/backend/backend/packages/quivr_core/prompts.py new file mode 100644 index 000000000000..d0fb80cca13c --- /dev/null +++ b/backend/backend/packages/quivr_core/prompts.py @@ -0,0 +1,58 @@ +import datetime + +from langchain.prompts import HumanMessagePromptTemplate, SystemMessagePromptTemplate +from langchain_core.prompts import ChatPromptTemplate, PromptTemplate + +# First step is to create the Rephrasing Prompt +_template = """Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question, in its original language. Keep as much details as possible from previous messages. Keep entity names and all. + +Chat History: +{chat_history} +Follow Up Input: {question} +Standalone question:""" +CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template) + +# Next is the answering prompt + +template_answer = """ +Context: +{context} + +User Question: {question} +Answer: +""" + +today_date = datetime.datetime.now().strftime("%B %d, %Y") + +system_message_template = ( + f"Your name is Quivr. You're a helpful assistant. Today's date is {today_date}." +) + +system_message_template += """ +When answering use markdown. +Use markdown code blocks for code snippets. +Answer in a concise and clear manner. +Use the following pieces of context from files provided by the user to answer the users. +Answer in the same language as the user question. +If you don't know the answer with the context provided from the files, just say that you don't know, don't try to make up an answer. +Don't cite the source id in the answer objects, but you can use the source to answer the question. +You have access to the files to answer the user question (limited to first 20 files): +{files} + +If not None, User instruction to follow to answer: {custom_instructions} +Don't cite the source id in the answer objects, but you can use the source to answer the question. +""" + + +ANSWER_PROMPT = ChatPromptTemplate.from_messages( + [ + SystemMessagePromptTemplate.from_template(system_message_template), + HumanMessagePromptTemplate.from_template(template_answer), + ] +) + + +# How we format documents +DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template( + template="Source: {index} \n {page_content}" +) diff --git a/backend/backend/packages/quivr_core/quivr_rag.py b/backend/backend/packages/quivr_core/quivr_rag.py new file mode 100644 index 000000000000..1b53e84e29d6 --- /dev/null +++ b/backend/backend/packages/quivr_core/quivr_rag.py @@ -0,0 +1,246 @@ +import os +from operator import itemgetter +from typing import AsyncGenerator + +from flashrank import Ranker +from langchain.retrievers import ContextualCompressionRetriever +from langchain.retrievers.document_compressors.flashrank_rerank import FlashrankRerank +from langchain_cohere import CohereRerank +from langchain_community.chat_models import ChatLiteLLM +from langchain_core.messages.ai import AIMessageChunk +from langchain_core.output_parsers import StrOutputParser +from langchain_core.runnables import RunnableLambda, RunnablePassthrough +from langchain_openai import ChatOpenAI + +from backend.logger import get_logger +from backend.models.settings import settings +from backend.modules.brain.qa_interface import model_compatible_with_function_calling +from backend.modules.brain.rags.quivr_rag import ( + ANSWER_PROMPT, + CONDENSE_QUESTION_PROMPT, + cited_answer, +) +from backend.modules.knowledge.entity.knowledge import Knowledge +from backend.packages.quivr_core.config import RAGConfig +from backend.packages.quivr_core.models import ( + ParsedRAGChunkResponse, + ParsedRAGResponse, +) +from backend.packages.quivr_core.utils import ( + combine_documents, + format_file_list, + get_chunk_metadata, + parse_chunk_response, + parse_response, +) +from backend.vectorstore.supabase import CustomSupabaseVectorStore + +logger = get_logger(__name__) + + +class QuivrQARAG: + def __init__(self, rag_config: RAGConfig, vector_store: CustomSupabaseVectorStore): + self.rag_config = rag_config + # TODO(@aminediro) + # RAG hard dependencies : Should be injected + self.vector_store = vector_store + self.llm = self._get_llm() + self.reranker = self._create_reranker() + + self.supports_func_calling = model_compatible_with_function_calling( + self.rag_config.model + ) + + @property + def retriever(self): + return self.vector_store.as_retriever() + + def _create_reranker(self): + # TODO: reranker config + if os.getenv("COHERE_API_KEY"): + compressor = CohereRerank(top_n=20) + else: + ranker_model_name = "ms-marco-TinyBERT-L-2-v2" + flashrank_client = Ranker(model_name=ranker_model_name) + compressor = FlashrankRerank( + client=flashrank_client, model=ranker_model_name, top_n=20 + ) + return compressor + + def _get_llm(self): + api_base = ( + settings.ollama_api_base_url + if settings.ollama_api_base_url + and self.rag_config.model.startswith("ollama") + else None + ) + return ChatLiteLLM( + temperature=self.rag_config.temperature, + max_tokens=self.rag_config.max_tokens, + model=self.rag_config.model, + streaming=self.rag_config.streaming, + verbose=False, + api_base=api_base, + ) # pyright: ignore reportPrivateUsage=none + + # TODO : refactor and simplify + def filter_history( + self, chat_history, max_history: int = 10, max_tokens: int = 2000 + ): + """ + Filter out the chat history to only include the messages that are relevant to the current question + + Takes in a chat_history= [HumanMessage(content='Qui est Chloé ? '), AIMessage(content="Chloé est une salariée travaillant pour l'entreprise Quivr en tant qu'AI Engineer, sous la direction de son supérieur hiérarchique, Stanislas Girard."), HumanMessage(content='Dis moi en plus sur elle'), AIMessage(content=''), HumanMessage(content='Dis moi en plus sur elle'), AIMessage(content="Désolé, je n'ai pas d'autres informations sur Chloé à partir des fichiers fournis.")] + Returns a filtered chat_history with in priority: first max_tokens, then max_history where a Human message and an AI message count as one pair + a token is 4 characters + """ + chat_history = chat_history[::-1] + total_tokens = 0 + total_pairs = 0 + filtered_chat_history = [] + for i in range(0, len(chat_history), 2): + if i + 1 < len(chat_history): + human_message = chat_history[i] + ai_message = chat_history[i + 1] + message_tokens = ( + len(human_message.content) + len(ai_message.content) + ) // 4 + if ( + total_tokens + message_tokens > max_tokens + or total_pairs >= max_history + ): + break + filtered_chat_history.append(human_message) + filtered_chat_history.append(ai_message) + total_tokens += message_tokens + total_pairs += 1 + chat_history = filtered_chat_history[::-1] + + return chat_history + + def build_chain(self, files: str): + compression_retriever = ContextualCompressionRetriever( + base_compressor=self.reranker, base_retriever=self.retriever + ) + + loaded_memory = RunnablePassthrough.assign( + chat_history=RunnableLambda( + lambda x: self.filter_history(x["chat_history"]), + ), + question=lambda x: x["question"], + ) + + standalone_question = { + "standalone_question": { + "question": lambda x: x["question"], + "chat_history": itemgetter("chat_history"), + } + | CONDENSE_QUESTION_PROMPT + | self.llm + | StrOutputParser(), + } + + # Now we retrieve the documents + retrieved_documents = { + "docs": itemgetter("standalone_question") | compression_retriever, + "question": lambda x: x["standalone_question"], + "custom_instructions": lambda x: self.rag_config.prompt, + } + + final_inputs = { + "context": lambda x: combine_documents(x["docs"]), + "question": itemgetter("question"), + "custom_instructions": itemgetter("custom_instructions"), + "files": lambda _: files, # TODO: shouldn't be here + } + + # Override llm if we have a OpenAI model + llm = self.llm + if model_compatible_with_function_calling(self.rag_config.model): + if self.rag_config.temperature: + llm_function = ChatOpenAI( + max_tokens=self.rag_config.max_tokens, + model=self.rag_config.model, + temperature=self.rag_config.temperature, + ) + else: + llm_function = ChatOpenAI( + max_tokens=self.rag_config.max_tokens, + model=self.rag_config.model, + ) + + llm = llm_function.bind_tools( + [cited_answer], + tool_choice="any", + ) + + answer = { + "answer": final_inputs | ANSWER_PROMPT | llm, + "docs": itemgetter("docs"), + } + + return loaded_memory | standalone_question | retrieved_documents | answer + + def answer( + self, + question: str, + history: list[dict[str, str]], + list_files: list[Knowledge], + metadata: dict[str, str] = {}, + ) -> ParsedRAGResponse: + concat_list_files = format_file_list(list_files, self.rag_config.max_files) + conversational_qa_chain = self.build_chain(concat_list_files) + raw_llm_response = conversational_qa_chain.invoke( + { + "question": question, + "chat_history": history, + "custom_instructions": (self.rag_config.prompt), + }, + config={"metadata": metadata}, + ) + response = parse_response(raw_llm_response, self.rag_config.model) + return response + + async def answer_astream( + self, + question: str, + history: list[dict[str, str]], + list_files: list[Knowledge], + metadata: dict[str, str] = {}, + ) -> AsyncGenerator[ParsedRAGChunkResponse, ParsedRAGChunkResponse]: + concat_list_files = format_file_list(list_files, self.rag_config.max_files) + conversational_qa_chain = self.build_chain(concat_list_files) + + rolling_message = AIMessageChunk(content="") + sources = [] + + async for chunk in conversational_qa_chain.astream( + { + "question": question, + "chat_history": history, + "custom_personality": (self.rag_config.prompt), + }, + config={"metadata": metadata}, + ): + # Could receive this anywhere so we need to save it for the last chunk + if "docs" in chunk: + sources = chunk["docs"] if "docs" in chunk else [] + + if "answer" in chunk: + rolling_message, parsed_chunk = parse_chunk_response( + rolling_message, + chunk, + self.supports_func_calling, + ) + + if self.supports_func_calling and len(parsed_chunk.answer) > 0: + yield parsed_chunk + else: + yield parsed_chunk + + # Last chunk provies + yield ParsedRAGChunkResponse( + answer="", + metadata=get_chunk_metadata(rolling_message, sources), + last_chunk=True, + ) diff --git a/backend/backend/packages/quivr_core/utils.py b/backend/backend/packages/quivr_core/utils.py new file mode 100644 index 000000000000..d87701e2b0e7 --- /dev/null +++ b/backend/backend/packages/quivr_core/utils.py @@ -0,0 +1,271 @@ +from typing import Any, Dict, List, Tuple +from uuid import UUID + +from langchain.schema import ( + AIMessage, + BaseMessage, + HumanMessage, + SystemMessage, + format_document, +) +from langchain_core.messages.ai import AIMessageChunk + +from backend.logger import get_logger + +# TODO(@aminediro): define a types packages where we clearly define IO types +# This should be used for serialization/deseriallization later +from backend.modules.brain.rags.quivr_rag import DEFAULT_DOCUMENT_PROMPT +from backend.modules.chat.dto.chats import Sources +from backend.modules.chat.dto.outputs import GetChatHistoryOutput +from backend.modules.knowledge.entity.knowledge import Knowledge +from backend.modules.upload.service.generate_file_signed_url import ( + generate_file_signed_url, +) +from backend.packages.quivr_core.models import ( + ParsedRAGChunkResponse, + ParsedRAGResponse, + RAGResponseMetadata, + RawRAGResponse, +) + +logger = get_logger(__name__) + + +def model_supports_function_calling(model_name: str): + models_supporting_function_calls = [ + "gpt-4", + "gpt-4-1106-preview", + "gpt-4-0613", + "gpt-3.5-turbo-0125", + "gpt-3.5-turbo-1106", + "gpt-3.5-turbo-0613", + "gpt-4-0125-preview", + "gpt-3.5-turbo", + "gpt-4-turbo", + "gpt-4o", + ] + return model_name in models_supporting_function_calls + + +def format_chat_history( + history: List[GetChatHistoryOutput], +) -> List[Dict[str, str]]: + """Format the chat history into a list of HumanMessage and AIMessage""" + formatted_history = [] + for chat in history: + if chat.user_message: + formatted_history.append(HumanMessage(content=chat.user_message)) + if chat.assistant: + formatted_history.append(AIMessage(content=chat.assistant)) + return formatted_history + + +def format_history_to_openai_mesages( + tuple_history: List[Tuple[str, str]], system_message: str, question: str +) -> List[BaseMessage]: + """Format the chat history into a list of Base Messages""" + messages = [] + messages.append(SystemMessage(content=system_message)) + for human, ai in tuple_history: + messages.append(HumanMessage(content=human)) + messages.append(AIMessage(content=ai)) + messages.append(HumanMessage(content=question)) + return messages + + +def cited_answer_filter(tool): + return tool["name"] == "cited_answer" + + +def get_prev_message_str(msg: AIMessageChunk) -> str: + if msg.tool_calls: + cited_answer = next(x for x in msg.tool_calls if cited_answer_filter(x)) + if "args" in cited_answer and "answer" in cited_answer["args"]: + return cited_answer["args"]["answer"] + return "" + + +def get_chunk_metadata( + msg: AIMessageChunk, sources: list[Any] = [] +) -> RAGResponseMetadata: + # Initiate the source + metadata = {"sources": sources} + if msg.tool_calls: + cited_answer = next(x for x in msg.tool_calls if cited_answer_filter(x)) + + if "args" in cited_answer: + gathered_args = cited_answer["args"] + if "citations" in gathered_args: + citations = gathered_args["citations"] + metadata["citations"] = citations + + if "followup_questions" in gathered_args: + followup_questions = gathered_args["followup_questions"] + metadata["followup_questions"] = followup_questions + + if "thoughts" in gathered_args: + thoughts = gathered_args["thoughts"] + metadata["thoughts"] = thoughts + + return RAGResponseMetadata(**metadata) + + +# TODO: CONVOLUTED LOGIC ! +# TODO(@aminediro): redo this +def parse_chunk_response( + gathered_msg: AIMessageChunk, + raw_chunk: dict[str, Any], + supports_func_calling: bool, +) -> Tuple[AIMessageChunk, ParsedRAGChunkResponse]: + # Init with sources + answer_str = "" + # Get the previously parsed answer + prev_answer = get_prev_message_str(gathered_msg) + + if supports_func_calling: + gathered_msg += raw_chunk["answer"] + if gathered_msg.tool_calls: + cited_answer = next( + x for x in gathered_msg.tool_calls if cited_answer_filter(x) + ) + if "args" in cited_answer: + gathered_args = cited_answer["args"] + if "answer" in gathered_args: + # Only send the difference between answer and response_tokens which was the previous answer + gathered_answer = gathered_args["answer"] + answer_str: str = gathered_answer[len(prev_answer) :] + + return gathered_msg, ParsedRAGChunkResponse( + answer=answer_str, metadata=RAGResponseMetadata() + ) + else: + return gathered_msg, ParsedRAGChunkResponse( + answer=raw_chunk["answer"].content, metadata=RAGResponseMetadata() + ) + + +def parse_response(raw_response: RawRAGResponse, model_name: str) -> ParsedRAGResponse: + answer = raw_response["answer"].content + sources = raw_response["docs"] or [] + + metadata = {"sources": sources} + + if model_supports_function_calling(model_name): + if raw_response["answer"].tool_calls: + citations = raw_response["answer"].tool_calls[-1]["args"]["citations"] + metadata["citations"] = citations + followup_questions = raw_response["answer"].tool_calls[-1]["args"][ + "followup_questions" + ] + thoughts = raw_response["answer"].tool_calls[-1]["args"]["thoughts"] + if followup_questions: + metadata["followup_questions"] = followup_questions + if thoughts: + metadata["thoughts"] = thoughts + answer = raw_response["answer"].tool_calls[-1]["args"]["answer"] + + parsed_response = ParsedRAGResponse( + answer=answer, metadata=RAGResponseMetadata(**metadata) + ) + return parsed_response + + +def combine_documents( + docs, document_prompt=DEFAULT_DOCUMENT_PROMPT, document_separator="\n\n" +): + # for each docs, add an index in the metadata to be able to cite the sources + for doc, index in zip(docs, range(len(docs))): + doc.metadata["index"] = index + doc_strings = [format_document(doc, document_prompt) for doc in docs] + return document_separator.join(doc_strings) + + +def format_file_list(list_files_array: list[Knowledge], max_files: int = 20) -> str: + list_files = [file.file_name or file.url for file in list_files_array] + files: list[str] = list(filter(lambda n: n is not None, list_files)) # type: ignore + files = files[:max_files] + + files_str = "\n".join(files) if list_files_array else "None" + return files_str + + +# TODO: REFACTOR THIS, it does call the DB , so maybe a service +def generate_source( + source_documents: List[Any] | None, + brain_id: UUID, + citations: List[int] | None = None, +) -> List[Sources]: + """ + Generate the sources list for the answer + It takes in a list of sources documents and citations that points to the docs index that was used in the answer + """ + # Initialize an empty list for sources + sources_list: List[Sources] = [] + + # Initialize a dictionary for storing generated URLs + generated_urls = {} + + # remove duplicate sources with same name and create a list of unique sources + sources_url_cache = {} + + # Get source documents from the result, default to an empty list if not found + # If source documents exist + if source_documents: + logger.info(f"Citations {citations}") + for index, doc in enumerate(source_documents): + logger.info(f"Processing source document {doc.metadata['file_name']}") + if citations is not None: + if index not in citations: + logger.info(f"Skipping source document {doc.metadata['file_name']}") + continue + # Check if 'url' is in the document metadata + is_url = ( + "original_file_name" in doc.metadata + and doc.metadata["original_file_name"] is not None + and doc.metadata["original_file_name"].startswith("http") + ) + + # Determine the name based on whether it's a URL or a file + name = ( + doc.metadata["original_file_name"] + if is_url + else doc.metadata["file_name"] + ) + + # Determine the type based on whether it's a URL or a file + type_ = "url" if is_url else "file" + + # Determine the source URL based on whether it's a URL or a file + if is_url: + source_url = doc.metadata["original_file_name"] + else: + file_path = f"{brain_id}/{doc.metadata['file_name']}" + # Check if the URL has already been generated + if file_path in generated_urls: + source_url = generated_urls[file_path] + else: + # Generate the URL + if file_path in sources_url_cache: + source_url = sources_url_cache[file_path] + else: + generated_url = generate_file_signed_url(file_path) + if generated_url is not None: + source_url = generated_url.get("signedURL", "") + else: + source_url = "" + # Store the generated URL + generated_urls[file_path] = source_url + + # Append a new Sources object to the list + sources_list.append( + Sources( + name=name, + type=type_, + source_url=source_url, + original_file_name=name, + citation=doc.page_content, + ) + ) + else: + logger.info("No source documents found or source_documents is not a list.") + return sources_list diff --git a/backend/packages/utils/__init__.py b/backend/backend/packages/utils/__init__.py similarity index 100% rename from backend/packages/utils/__init__.py rename to backend/backend/packages/utils/__init__.py diff --git a/backend/packages/utils/handle_request_validation_error.py b/backend/backend/packages/utils/handle_request_validation_error.py similarity index 95% rename from backend/packages/utils/handle_request_validation_error.py rename to backend/backend/packages/utils/handle_request_validation_error.py index af7676109bd8..4bff77e1d184 100644 --- a/backend/packages/utils/handle_request_validation_error.py +++ b/backend/backend/packages/utils/handle_request_validation_error.py @@ -1,7 +1,8 @@ from fastapi import FastAPI, Request, status from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse -from logger import get_logger + +from backend.logger import get_logger logger = get_logger(__name__) diff --git a/backend/packages/utils/parse_message_time.py b/backend/backend/packages/utils/parse_message_time.py similarity index 68% rename from backend/packages/utils/parse_message_time.py rename to backend/backend/packages/utils/parse_message_time.py index 94387b0acb9c..4aa18a3b8759 100644 --- a/backend/packages/utils/parse_message_time.py +++ b/backend/backend/packages/utils/parse_message_time.py @@ -1,5 +1,5 @@ from datetime import datetime -def parse_message_time(message_time_str): +def parse_message_time(message_time_str: str): return datetime.strptime(message_time_str, "%Y-%m-%dT%H:%M:%S.%f") diff --git a/backend/packages/utils/telemetry.py b/backend/backend/packages/utils/telemetry.py similarity index 88% rename from backend/packages/utils/telemetry.py rename to backend/backend/packages/utils/telemetry.py index 0cd71d2654e9..e1e0db28f076 100644 --- a/backend/packages/utils/telemetry.py +++ b/backend/backend/packages/utils/telemetry.py @@ -5,7 +5,8 @@ import httpx from fastapi import Request -from logger import get_logger + +from backend.logger import get_logger logger = get_logger(__name__) @@ -57,14 +58,3 @@ def maybe_send_telemetry(event_name: str, event_data: dict, request: Request = N threading.Thread( target=send_telemetry, args=(event_name, event_data, request) ).start() - - -async def main(): - await send_telemetry("user_login", {"login_success": True}) - - -# Run the example -if __name__ == "__main__": - import asyncio - - asyncio.run(main()) diff --git a/backend/playground/auth-azure.py b/backend/backend/playground/auth-azure.py similarity index 100% rename from backend/playground/auth-azure.py rename to backend/backend/playground/auth-azure.py diff --git a/backend/playground/auth.py b/backend/backend/playground/auth.py similarity index 100% rename from backend/playground/auth.py rename to backend/backend/playground/auth.py diff --git a/backend/vectorstore/__init__.py b/backend/backend/routes/__init__.py similarity index 100% rename from backend/vectorstore/__init__.py rename to backend/backend/routes/__init__.py diff --git a/backend/routes/crawl_routes.py b/backend/backend/routes/crawl_routes.py similarity index 70% rename from backend/routes/crawl_routes.py rename to backend/backend/routes/crawl_routes.py index 28ffefb4ab08..74e9d193ec3b 100644 --- a/backend/routes/crawl_routes.py +++ b/backend/backend/routes/crawl_routes.py @@ -1,23 +1,26 @@ from typing import Optional from uuid import UUID -from celery_worker import process_crawl_and_notify from fastapi import APIRouter, Depends, Query, Request -from logger import get_logger -from middlewares.auth import AuthBearer, get_current_user -from modules.brain.entity.brain_entity import RoleEnum -from modules.brain.service.brain_authorization_service import ( + +from backend.celery_worker import process_crawl_and_notify +from backend.logger import get_logger +from backend.middlewares.auth import AuthBearer, get_current_user +from backend.modules.brain.entity.brain_entity import RoleEnum +from backend.modules.brain.service.brain_authorization_service import ( validate_brain_authorization, ) -from modules.knowledge.dto.inputs import CreateKnowledgeProperties -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.notification.dto.inputs import CreateNotification -from modules.notification.entity.notification import NotificationsStatusEnum -from modules.notification.service.notification_service import NotificationService -from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_usage import UserUsage -from packages.files.crawl.crawler import CrawlWebsite -from packages.files.file import convert_bytes +from backend.modules.knowledge.dto.inputs import CreateKnowledgeProperties +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.notification.dto.inputs import CreateNotification +from backend.modules.notification.entity.notification import NotificationsStatusEnum +from backend.modules.notification.service.notification_service import ( + NotificationService, +) +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.service.user_usage import UserUsage +from backend.packages.files.crawl.crawler import CrawlWebsite +from backend.packages.files.file import convert_bytes logger = get_logger(__name__) crawl_router = APIRouter() diff --git a/backend/routes/headers/__init_.py b/backend/backend/routes/headers/__init_.py similarity index 100% rename from backend/routes/headers/__init_.py rename to backend/backend/routes/headers/__init_.py diff --git a/backend/routes/headers/get_origin_header.py b/backend/backend/routes/headers/get_origin_header.py similarity index 100% rename from backend/routes/headers/get_origin_header.py rename to backend/backend/routes/headers/get_origin_header.py diff --git a/backend/routes/subscription_routes.py b/backend/backend/routes/subscription_routes.py similarity index 93% rename from backend/routes/subscription_routes.py rename to backend/backend/routes/subscription_routes.py index c864e37a78a0..fe75018f6f59 100644 --- a/backend/routes/subscription_routes.py +++ b/backend/backend/routes/subscription_routes.py @@ -2,30 +2,31 @@ from uuid import UUID from fastapi import APIRouter, Depends, HTTPException -from middlewares.auth.auth_bearer import AuthBearer, get_current_user -from models import BrainSubscription -from modules.brain.entity.brain_entity import RoleEnum -from modules.brain.service.api_brain_definition_service import ApiBrainDefinitionService -from modules.brain.service.brain_authorization_service import ( +from pydantic import BaseModel + +from backend.logger import get_logger +from backend.middlewares.auth.auth_bearer import AuthBearer, get_current_user +from backend.models.brains_subscription_invitations import BrainSubscription +from backend.modules.brain.entity.brain_entity import RoleEnum +from backend.modules.brain.repository import IntegrationBrain +from backend.modules.brain.service.api_brain_definition_service import ( + ApiBrainDefinitionService, +) +from backend.modules.brain.service.brain_authorization_service import ( has_brain_authorization, validate_brain_authorization, ) -from modules.brain.service.brain_service import BrainService -from modules.brain.service.brain_user_service import BrainUserService -from modules.prompt.entity.prompt import PromptStatusEnum -from modules.prompt.service.prompt_service import PromptService -from modules.user.entity.user_identity import UserIdentity -from modules.user.service.user_service import UserService -from pydantic import BaseModel -from modules.brain.service.brain_subscription import ( +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.brain.service.brain_subscription import ( SubscriptionInvitationService, resend_invitation_email, ) -from modules.brain.repository import ( - IntegrationBrain, -) -from routes.headers.get_origin_header import get_origin_header -from logger import get_logger +from backend.modules.brain.service.brain_user_service import BrainUserService +from backend.modules.prompt.entity.prompt import PromptStatusEnum +from backend.modules.prompt.service.prompt_service import PromptService +from backend.modules.user.entity.user_identity import UserIdentity +from backend.modules.user.service.user_service import UserService +from backend.routes.headers.get_origin_header import get_origin_header logger = get_logger(__name__) diff --git a/backend/backend/vectorstore/__init__.py b/backend/backend/vectorstore/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/backend/vectorstore/supabase.py b/backend/backend/vectorstore/supabase.py similarity index 93% rename from backend/vectorstore/supabase.py rename to backend/backend/vectorstore/supabase.py index cf143b55e9f4..07ffd2ff51b2 100644 --- a/backend/vectorstore/supabase.py +++ b/backend/backend/vectorstore/supabase.py @@ -1,9 +1,11 @@ from typing import Any, List +from uuid import UUID from langchain.docstore.document import Document from langchain.embeddings.base import Embeddings from langchain_community.vectorstores import SupabaseVectorStore -from logger import get_logger + +from backend.logger import get_logger from supabase.client import Client logger = get_logger(__name__) @@ -12,18 +14,13 @@ class CustomSupabaseVectorStore(SupabaseVectorStore): """A custom vector store that uses the match_vectors table instead of the vectors table.""" - brain_id: str = "none" - user_id: str = "none" - number_docs: int = 35 - max_input: int = 2000 - def __init__( self, client: Client, embedding: Embeddings, table_name: str, - brain_id: str = "none", - user_id: str = "none", + brain_id: UUID | None = None, + user_id: UUID | None = None, number_docs: int = 35, max_input: int = 2000, ): @@ -40,7 +37,7 @@ def find_brain_closest_query( k: int = 6, table: str = "match_brain", threshold: float = 0.5, - ) -> [dict]: + ) -> list[dict[str, Any]]: vectors = self._embedding.embed_documents([query]) query_embedding = vectors[0] diff --git a/backend/models/__init__.py b/backend/models/__init__.py deleted file mode 100644 index 9a53a8e6de09..000000000000 --- a/backend/models/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .brains_subscription_invitations import BrainSubscription -from .files import File -from .settings import (BrainRateLimiting, BrainSettings, ResendSettings, - get_documents_vector_store, get_embeddings, - get_supabase_client, get_supabase_db) diff --git a/backend/models/databases/supabase/__init__.py b/backend/models/databases/supabase/__init__.py deleted file mode 100644 index f916f29c4213..000000000000 --- a/backend/models/databases/supabase/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from models.databases.supabase.brains_subscription_invitations import \ - BrainSubscription -from models.databases.supabase.files import File -from models.databases.supabase.user_usage import UserUsage -from models.databases.supabase.vectors import Vector diff --git a/backend/modules/analytics/service/analytics_service.py b/backend/modules/analytics/service/analytics_service.py deleted file mode 100644 index c2a48ec2eed2..000000000000 --- a/backend/modules/analytics/service/analytics_service.py +++ /dev/null @@ -1,13 +0,0 @@ - -from modules.analytics.repository.analytics import Analytics -from modules.analytics.repository.analytics_interface import AnalyticsInterface - -class AnalyticsService: - repository: AnalyticsInterface - - def __init__(self): - self.repository = Analytics() - - def get_brains_usages(self, user_id, graph_range, brain_id = None): - - return self.repository.get_brains_usages(user_id, graph_range, brain_id) \ No newline at end of file diff --git a/backend/modules/brain/entity/brain_entity.py b/backend/modules/brain/entity/brain_entity.py deleted file mode 100644 index a7ce90aa29c1..000000000000 --- a/backend/modules/brain/entity/brain_entity.py +++ /dev/null @@ -1,82 +0,0 @@ -from datetime import datetime -from enum import Enum -from typing import List, Optional -from uuid import UUID - -from modules.brain.entity.api_brain_definition_entity import ApiBrainDefinitionEntity -from modules.brain.entity.integration_brain import ( - IntegrationDescriptionEntity, - IntegrationEntity, -) -from pydantic import BaseModel - - -class BrainType(str, Enum): - DOC = "doc" - API = "api" - COMPOSITE = "composite" - INTEGRATION = "integration" - - -class BrainEntity(BaseModel): - brain_id: UUID - name: str - description: Optional[str] = None - temperature: Optional[float] = None - model: Optional[str] = None - max_tokens: Optional[int] = None - status: Optional[str] = None - prompt_id: Optional[UUID] = None - last_update: datetime - brain_type: BrainType - brain_definition: Optional[ApiBrainDefinitionEntity] = None - connected_brains_ids: Optional[List[UUID]] = None - raw: Optional[bool] = None - jq_instructions: Optional[str] = None - integration: Optional[IntegrationEntity] = None - integration_description: Optional[IntegrationDescriptionEntity] = None - - @property - def id(self) -> UUID: - return self.brain_id - - def dict(self, **kwargs): - data = super().dict( - **kwargs, - ) - data["id"] = self.id - return data - - -class PublicBrain(BaseModel): - id: UUID - name: str - description: Optional[str] = None - number_of_subscribers: int = 0 - last_update: str - brain_type: BrainType - brain_definition: Optional[ApiBrainDefinitionEntity] = None - - -class RoleEnum(str, Enum): - Viewer = "Viewer" - Editor = "Editor" - Owner = "Owner" - - -class BrainUser(BaseModel): - id: UUID - user_id: UUID - rights: RoleEnum - default_brain: bool = False - - -class MinimalUserBrainEntity(BaseModel): - id: UUID - name: str - rights: RoleEnum - status: str - brain_type: BrainType - description: str - integration_logo_url: str - max_files: int diff --git a/backend/modules/chat/entity/chat.py b/backend/modules/chat/entity/chat.py deleted file mode 100644 index b8725d82bf03..000000000000 --- a/backend/modules/chat/entity/chat.py +++ /dev/null @@ -1,45 +0,0 @@ -from dataclasses import asdict, dataclass -from typing import Optional -from uuid import UUID - - -@dataclass -class Chat: - chat_id: str - user_id: str - creation_time: str - chat_name: str - - def __init__(self, chat_dict: dict): - self.chat_id = chat_dict.get("chat_id", "") - self.user_id = chat_dict.get("user_id", "") - self.creation_time = chat_dict.get("creation_time", "") - self.chat_name = chat_dict.get("chat_name", "") - - -@dataclass -class ChatHistory: - chat_id: str - message_id: str - user_message: str - assistant: str - message_time: str - prompt_id: Optional[UUID] - brain_id: Optional[UUID] - metadata: Optional[dict] = None - thumbs: Optional[bool] = None - - def __init__(self, chat_dict: dict): - self.chat_id = chat_dict.get("chat_id", "") - self.message_id = chat_dict.get("message_id", "") - self.user_message = chat_dict.get("user_message", "") - self.assistant = chat_dict.get("assistant", "") - self.message_time = chat_dict.get("message_time", "") - - self.prompt_id = chat_dict.get("prompt_id") - self.brain_id = chat_dict.get("brain_id") - self.metadata = chat_dict.get("metadata") - self.thumbs = chat_dict.get("thumbs") - - def to_dict(self): - return asdict(self) diff --git a/backend/modules/chat/repository/chats.py b/backend/modules/chat/repository/chats.py deleted file mode 100644 index 3e32772d5095..000000000000 --- a/backend/modules/chat/repository/chats.py +++ /dev/null @@ -1,118 +0,0 @@ -from models.settings import get_supabase_client -from modules.chat.dto.inputs import ChatMessageProperties -from modules.chat.entity.chat import Chat -from modules.chat.repository.chats_interface import ChatsInterface - - -class Chats(ChatsInterface): - def __init__(self): - supabase_client = get_supabase_client() - self.db = supabase_client - - def create_chat(self, new_chat): - response = self.db.table("chats").insert(new_chat).execute() - return response - - def get_chat_by_id(self, chat_id: str): - response = ( - self.db.from_("chats") - .select("*") - .filter("chat_id", "eq", chat_id) - .execute() - ) - return response - - def add_question_and_answer(self, chat_id, question_and_answer): - response = ( - self.db.table("chat_history") - .insert( - { - "chat_id": str(chat_id), - "user_message": question_and_answer.question, - "assistant": question_and_answer.answer, - } - ) - .execute() - ).data - if len(response) > 0: - response = Chat(response[0]) - - return None - - def get_chat_history(self, chat_id: str): - response = ( - self.db.from_("chat_history") - .select("*") - .filter("chat_id", "eq", chat_id) - .order("message_time", desc=False) # Add the ORDER BY clause - .execute() - ) - - return response - - def get_user_chats(self, user_id): - response = ( - self.db.from_("chats") - .select("chat_id,user_id,creation_time,chat_name") - .filter("user_id", "eq", user_id) - .order("creation_time", desc=False) - .execute() - ) - return response - - def update_chat_history(self, chat_history): - response = ( - self.db.table("chat_history") - .insert( - { - "chat_id": str(chat_history.chat_id), - "user_message": chat_history.user_message, - "assistant": chat_history.assistant, - "prompt_id": ( - str(chat_history.prompt_id) if chat_history.prompt_id else None - ), - "brain_id": ( - str(chat_history.brain_id) if chat_history.brain_id else None - ), - "metadata": chat_history.metadata if chat_history.metadata else {}, - } - ) - .execute() - ) - - return response - - def update_chat(self, chat_id, updates): - response = ( - self.db.table("chats").update(updates).match({"chat_id": chat_id}).execute() - ) - - return response - - def update_message_by_id(self, message_id, updates): - response = ( - self.db.table("chat_history") - .update(updates) - .match({"message_id": message_id}) - .execute() - ) - - return response - - def delete_chat(self, chat_id): - self.db.table("chats").delete().match({"chat_id": chat_id}).execute() - - def delete_chat_history(self, chat_id): - self.db.table("chat_history").delete().match({"chat_id": chat_id}).execute() - - def update_chat_message( - self, chat_id, message_id, chat_message_properties: ChatMessageProperties - ): - response = ( - self.db.table("chat_history") - .update(chat_message_properties) - .match({"message_id": message_id, "chat_id": chat_id}) - .execute() - ) - - return response diff --git a/backend/modules/knowledge/repository/__init__.py b/backend/modules/knowledge/repository/__init__.py deleted file mode 100644 index a69273cf5473..000000000000 --- a/backend/modules/knowledge/repository/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .knowledges import Knowledges diff --git a/backend/modules/user/entity/user_identity.py b/backend/modules/user/entity/user_identity.py deleted file mode 100644 index 06c8ab466a8d..000000000000 --- a/backend/modules/user/entity/user_identity.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import Optional -from uuid import UUID - -from pydantic import BaseModel - - -class UserIdentity(BaseModel): - id: UUID - email: Optional[str] = None - username: Optional[str] = None - company: Optional[str] = None - onboarded: Optional[bool] = None - company_size: Optional[str] = None - usage_purpose: Optional[str] = None diff --git a/backend/poetry.lock b/backend/poetry.lock new file mode 100644 index 000000000000..a6b7bf8e11f4 --- /dev/null +++ b/backend/poetry.lock @@ -0,0 +1,9074 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.9.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "amqp" +version = "5.2.0" +description = "Low-level AMQP client for Python (fork of amqplib)." +optional = false +python-versions = ">=3.6" +files = [ + {file = "amqp-5.2.0-py3-none-any.whl", hash = "sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637"}, + {file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"}, +] + +[package.dependencies] +vine = ">=5.0.0,<6.0.0" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +description = "ANTLR 4.9.3 runtime for Python 3.7" +optional = false +python-versions = "*" +files = [ + {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, +] + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[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)"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "astor" +version = "0.8.1" +description = "Read/rewrite/write Python ASTs" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, + {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-generator" +version = "1.10" +description = "Async generators and context managers for Python 3.5+" +optional = false +python-versions = ">=3.5" +files = [ + {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, + {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, +] + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "asyncpg" +version = "0.29.0" +description = "An asyncio PostgreSQL driver" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "asyncpg-0.29.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72fd0ef9f00aeed37179c62282a3d14262dbbafb74ec0ba16e1b1864d8a12169"}, + {file = "asyncpg-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52e8f8f9ff6e21f9b39ca9f8e3e33a5fcdceaf5667a8c5c32bee158e313be385"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e6823a7012be8b68301342ba33b4740e5a166f6bbda0aee32bc01638491a22"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746e80d83ad5d5464cfbf94315eb6744222ab00aa4e522b704322fb182b83610"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ff8e8109cd6a46ff852a5e6bab8b0a047d7ea42fcb7ca5ae6eaae97d8eacf397"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97eb024685b1d7e72b1972863de527c11ff87960837919dac6e34754768098eb"}, + {file = "asyncpg-0.29.0-cp310-cp310-win32.whl", hash = "sha256:5bbb7f2cafd8d1fa3e65431833de2642f4b2124be61a449fa064e1a08d27e449"}, + {file = "asyncpg-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:76c3ac6530904838a4b650b2880f8e7af938ee049e769ec2fba7cd66469d7772"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4900ee08e85af01adb207519bb4e14b1cae8fd21e0ccf80fac6aa60b6da37b4"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a65c1dcd820d5aea7c7d82a3fdcb70e096f8f70d1a8bf93eb458e49bfad036ac"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b52e46f165585fd6af4863f268566668407c76b2c72d366bb8b522fa66f1870"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc600ee8ef3dd38b8d67421359779f8ccec30b463e7aec7ed481c8346decf99f"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:039a261af4f38f949095e1e780bae84a25ffe3e370175193174eb08d3cecab23"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6feaf2d8f9138d190e5ec4390c1715c3e87b37715cd69b2c3dfca616134efd2b"}, + {file = "asyncpg-0.29.0-cp311-cp311-win32.whl", hash = "sha256:1e186427c88225ef730555f5fdda6c1812daa884064bfe6bc462fd3a71c4b675"}, + {file = "asyncpg-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfe73ffae35f518cfd6e4e5f5abb2618ceb5ef02a2365ce64f132601000587d3"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6011b0dc29886ab424dc042bf9eeb507670a3b40aece3439944006aafe023178"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b544ffc66b039d5ec5a7454667f855f7fec08e0dfaf5a5490dfafbb7abbd2cfb"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d84156d5fb530b06c493f9e7635aa18f518fa1d1395ef240d211cb563c4e2364"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54858bc25b49d1114178d65a88e48ad50cb2b6f3e475caa0f0c092d5f527c106"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bde17a1861cf10d5afce80a36fca736a86769ab3579532c03e45f83ba8a09c59"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:37a2ec1b9ff88d8773d3eb6d3784dc7e3fee7756a5317b67f923172a4748a175"}, + {file = "asyncpg-0.29.0-cp312-cp312-win32.whl", hash = "sha256:bb1292d9fad43112a85e98ecdc2e051602bce97c199920586be83254d9dafc02"}, + {file = "asyncpg-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:2245be8ec5047a605e0b454c894e54bf2ec787ac04b1cb7e0d3c67aa1e32f0fe"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0009a300cae37b8c525e5b449233d59cd9868fd35431abc470a3e364d2b85cb9"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cad1324dbb33f3ca0cd2074d5114354ed3be2b94d48ddfd88af75ebda7c43cc"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012d01df61e009015944ac7543d6ee30c2dc1eb2f6b10b62a3f598beb6531548"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000c996c53c04770798053e1730d34e30cb645ad95a63265aec82da9093d88e7"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e0bfe9c4d3429706cf70d3249089de14d6a01192d617e9093a8e941fea8ee775"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:642a36eb41b6313ffa328e8a5c5c2b5bea6ee138546c9c3cf1bffaad8ee36dd9"}, + {file = "asyncpg-0.29.0-cp38-cp38-win32.whl", hash = "sha256:a921372bbd0aa3a5822dd0409da61b4cd50df89ae85150149f8c119f23e8c408"}, + {file = "asyncpg-0.29.0-cp38-cp38-win_amd64.whl", hash = "sha256:103aad2b92d1506700cbf51cd8bb5441e7e72e87a7b3a2ca4e32c840f051a6a3"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5340dd515d7e52f4c11ada32171d87c05570479dc01dc66d03ee3e150fb695da"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e17b52c6cf83e170d3d865571ba574577ab8e533e7361a2b8ce6157d02c665d3"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f100d23f273555f4b19b74a96840aa27b85e99ba4b1f18d4ebff0734e78dc090"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48e7c58b516057126b363cec8ca02b804644fd012ef8e6c7e23386b7d5e6ce83"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9ea3f24eb4c49a615573724d88a48bd1b7821c890c2effe04f05382ed9e8810"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8d36c7f14a22ec9e928f15f92a48207546ffe68bc412f3be718eedccdf10dc5c"}, + {file = "asyncpg-0.29.0-cp39-cp39-win32.whl", hash = "sha256:797ab8123ebaed304a1fad4d7576d5376c3a006a4100380fb9d517f0b59c1ab2"}, + {file = "asyncpg-0.29.0-cp39-cp39-win_amd64.whl", hash = "sha256:cce08a178858b426ae1aa8409b5cc171def45d4293626e7aa6510696d46decd8"}, + {file = "asyncpg-0.29.0.tar.gz", hash = "sha256:d1c49e1f44fffafd9a55e1a9b101590859d881d639ea2922516f5d9c512d354e"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_version < \"3.12.0\""} + +[package.extras] +docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "billiard" +version = "4.2.0" +description = "Python multiprocessing fork with improvements and bugfixes" +optional = false +python-versions = ">=3.7" +files = [ + {file = "billiard-4.2.0-py3-none-any.whl", hash = "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d"}, + {file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"}, +] + +[[package]] +name = "black" +version = "24.4.2" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +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 = "boto3" +version = "1.34.132" +description = "The AWS SDK for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "boto3-1.34.132-py3-none-any.whl", hash = "sha256:b5d1681a0d8bf255787c8b37f911d706672d5722c9ace5342cd283a3cdb04820"}, + {file = "boto3-1.34.132.tar.gz", hash = "sha256:3b2964060620f1bbe9574b5f8d3fb2a4e087faacfc6023c24154b184f1b16443"}, +] + +[package.dependencies] +botocore = ">=1.34.132,<1.35.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.10.0,<0.11.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.34.132" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">=3.8" +files = [ + {file = "botocore-1.34.132-py3-none-any.whl", hash = "sha256:06ef8b4bd3b3cb5a9b9a4273a543b257be3304030978ba51516b576a65156c39"}, + {file = "botocore-1.34.132.tar.gz", hash = "sha256:372a6cfce29e5de9bcf8c95af901d0bc3e27d8aa2295fadee295424f95f43f16"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.20.11)"] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + +[[package]] +name = "celery" +version = "5.4.0" +description = "Distributed Task Queue." +optional = false +python-versions = ">=3.8" +files = [ + {file = "celery-5.4.0-py3-none-any.whl", hash = "sha256:369631eb580cf8c51a82721ec538684994f8277637edde2dfc0dacd73ed97f64"}, + {file = "celery-5.4.0.tar.gz", hash = "sha256:504a19140e8d3029d5acad88330c541d4c3f64c789d85f94756762d8bca7e706"}, +] + +[package.dependencies] +billiard = ">=4.2.0,<5.0" +boto3 = {version = ">=1.26.143", optional = true, markers = "extra == \"sqs\""} +click = ">=8.1.2,<9.0" +click-didyoumean = ">=0.3.0" +click-plugins = ">=1.1.1" +click-repl = ">=0.2.0" +kombu = [ + {version = ">=5.3.4,<6.0"}, + {version = ">=5.3.4", extras = ["sqs"], optional = true, markers = "extra == \"sqs\""}, +] +pycurl = {version = ">=7.43.0.5", optional = true, markers = "sys_platform != \"win32\" and platform_python_implementation == \"CPython\" and extra == \"sqs\""} +python-dateutil = ">=2.8.2" +redis = {version = ">=4.5.2,<4.5.5 || >4.5.5,<6.0.0", optional = true, markers = "extra == \"redis\""} +tzdata = ">=2022.7" +urllib3 = {version = ">=1.26.16", optional = true, markers = "extra == \"sqs\""} +vine = ">=5.1.0,<6.0" + +[package.extras] +arangodb = ["pyArango (>=2.0.2)"] +auth = ["cryptography (==42.0.5)"] +azureblockblob = ["azure-storage-blob (>=12.15.0)"] +brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] +cassandra = ["cassandra-driver (>=3.25.0,<4)"] +consul = ["python-consul2 (==0.1.5)"] +cosmosdbsql = ["pydocumentdb (==2.3.5)"] +couchbase = ["couchbase (>=3.0.0)"] +couchdb = ["pycouchdb (==1.14.2)"] +django = ["Django (>=2.2.28)"] +dynamodb = ["boto3 (>=1.26.143)"] +elasticsearch = ["elastic-transport (<=8.13.0)", "elasticsearch (<=8.13.0)"] +eventlet = ["eventlet (>=0.32.0)"] +gcs = ["google-cloud-storage (>=2.10.0)"] +gevent = ["gevent (>=1.5.0)"] +librabbitmq = ["librabbitmq (>=2.0.0)"] +memcache = ["pylibmc (==1.6.3)"] +mongodb = ["pymongo[srv] (>=4.0.2)"] +msgpack = ["msgpack (==1.0.8)"] +pymemcache = ["python-memcached (>=1.61)"] +pyro = ["pyro4 (==4.82)"] +pytest = ["pytest-celery[all] (>=1.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +s3 = ["boto3 (>=1.26.143)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +solar = ["ephem (==4.1.5)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.4)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=1.3.1)"] +zstd = ["zstandard (==0.22.0)"] + +[[package]] +name = "certifi" +version = "2024.6.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-didyoumean" +version = "0.3.1" +description = "Enables git-like *did-you-mean* feature in click" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"}, + {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"}, +] + +[package.dependencies] +click = ">=7" + +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +optional = false +python-versions = "*" +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] + +[[package]] +name = "click-repl" +version = "0.3.0" +description = "REPL plugin for Click" +optional = false +python-versions = ">=3.6" +files = [ + {file = "click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"}, + {file = "click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"}, +] + +[package.dependencies] +click = ">=7.0" +prompt-toolkit = ">=3.0.36" + +[package.extras] +testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] + +[[package]] +name = "cohere" +version = "5.5.8" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "cohere-5.5.8-py3-none-any.whl", hash = "sha256:e1ed84b90eadd13c6a68ee28e378a0bb955f8945eadc6eb7ee126b3399cafd54"}, + {file = "cohere-5.5.8.tar.gz", hash = "sha256:84ce7666ff8fbdf4f41fb5f6ca452ab2639a514bc88967a2854a9b1b820d6ea0"}, +] + +[package.dependencies] +boto3 = ">=1.34.0,<2.0.0" +fastavro = ">=1.9.4,<2.0.0" +httpx = ">=0.21.2" +httpx-sse = ">=0.4.0,<0.5.0" +parameterized = ">=0.9.0,<0.10.0" +pydantic = ">=1.9.2" +requests = ">=2.0.0,<3.0.0" +tokenizers = ">=0.15,<1" +types-requests = ">=2.0.0,<3.0.0" +typing_extensions = ">=4.0.0" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coloredlogs" +version = "15.0.1" +description = "Colored terminal output for Python's logging module" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, + {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, +] + +[package.dependencies] +humanfriendly = ">=9.1" + +[package.extras] +cron = ["capturer (>=2.4)"] + +[[package]] +name = "colorlog" +version = "6.8.2" +description = "Add colours to the output of Python's logging module." +optional = false +python-versions = ">=3.6" +files = [ + {file = "colorlog-6.8.2-py3-none-any.whl", hash = "sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33"}, + {file = "colorlog-6.8.2.tar.gz", hash = "sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "contourpy" +version = "1.2.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, +] + +[package.dependencies] +numpy = ">=1.20" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cryptography" +version = "42.0.8" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cssselect" +version = "1.2.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, + {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "datasets" +version = "2.20.0" +description = "HuggingFace community-driven open-source library of datasets" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "datasets-2.20.0-py3-none-any.whl", hash = "sha256:76ac02e3bdfff824492e20678f0b6b1b6d080515957fe834b00c2ba8d6b18e5e"}, + {file = "datasets-2.20.0.tar.gz", hash = "sha256:3c4dbcd27e0f642b9d41d20ff2efa721a5e04b32b2ca4009e0fc9139e324553f"}, +] + +[package.dependencies] +aiohttp = "*" +dill = ">=0.3.0,<0.3.9" +filelock = "*" +fsspec = {version = ">=2023.1.0,<=2024.5.0", extras = ["http"]} +huggingface-hub = ">=0.21.2" +multiprocess = "*" +numpy = ">=1.17" +packaging = "*" +pandas = "*" +pyarrow = ">=15.0.0" +pyarrow-hotfix = "*" +pyyaml = ">=5.1" +requests = ">=2.32.2" +tqdm = ">=4.66.3" +xxhash = "*" + +[package.extras] +apache-beam = ["apache-beam (>=2.26.0)"] +audio = ["librosa", "soundfile (>=0.12.1)"] +benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] +dev = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] +jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] +metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] +quality = ["ruff (>=0.3.0)"] +s3 = ["s3fs"] +tensorflow = ["tensorflow (>=2.6.0)"] +tensorflow-gpu = ["tensorflow (>=2.6.0)"] +tests = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +torch = ["torch"] +vision = ["Pillow (>=9.4.0)"] + +[[package]] +name = "debugpy" +version = "1.8.1" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "deepdiff" +version = "7.0.1" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +optional = false +python-versions = ">=3.8" +files = [ + {file = "deepdiff-7.0.1-py3-none-any.whl", hash = "sha256:447760081918216aa4fd4ca78a4b6a848b81307b2ea94c810255334b759e1dc3"}, + {file = "deepdiff-7.0.1.tar.gz", hash = "sha256:260c16f052d4badbf60351b4f77e8390bee03a0b516246f6839bc813fb429ddf"}, +] + +[package.dependencies] +ordered-set = ">=4.1.0,<4.2.0" + +[package.extras] +cli = ["click (==8.1.7)", "pyyaml (==6.0.1)"] +optimize = ["orjson"] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +optional = false +python-versions = "*" +files = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] + +[package.dependencies] +packaging = "*" + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "dirtyjson" +version = "1.0.8" +description = "JSON decoder for Python that can extract data from the muck" +optional = false +python-versions = "*" +files = [ + {file = "dirtyjson-1.0.8-py3-none-any.whl", hash = "sha256:125e27248435a58acace26d5c2c4c11a1c0de0a9c5124c5a94ba78e517d74f53"}, + {file = "dirtyjson-1.0.8.tar.gz", hash = "sha256:90ca4a18f3ff30ce849d100dcf4a003953c79d3a2348ef056f1d9c22231a25fd"}, +] + +[[package]] +name = "diskcache" +version = "5.6.3" +description = "Disk Cache -- Disk and file backed persistent cache." +optional = false +python-versions = ">=3" +files = [ + {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, + {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, +] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "docker" +version = "7.1.0" +description = "A Python library for the Docker Engine API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, + {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, +] + +[package.dependencies] +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" + +[package.extras] +dev = ["coverage (==7.2.7)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.1.0)", "ruff (==0.1.8)"] +docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"] +ssh = ["paramiko (>=2.4.3)"] +websockets = ["websocket-client (>=1.3.0)"] + +[[package]] +name = "docx2txt" +version = "0.8" +description = "A pure python-based utility to extract text and images from docx files." +optional = false +python-versions = "*" +files = [ + {file = "docx2txt-0.8.tar.gz", hash = "sha256:2c06d98d7cfe2d3947e5760a57d924e3ff07745b379c8737723922e7009236e5"}, +] + +[[package]] +name = "duckdb" +version = "0.10.3" +description = "DuckDB in-process database" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "duckdb-0.10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd25cc8d001c09a19340739ba59d33e12a81ab285b7a6bed37169655e1cefb31"}, + {file = "duckdb-0.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f9259c637b917ca0f4c63887e8d9b35ec248f5d987c886dfc4229d66a791009"}, + {file = "duckdb-0.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48f5f1542f1e4b184e6b4fc188f497be8b9c48127867e7d9a5f4a3e334f88b0"}, + {file = "duckdb-0.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e327f7a3951ea154bb56e3fef7da889e790bd9a67ca3c36afc1beb17d3feb6d6"}, + {file = "duckdb-0.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d8b20ed67da004b4481973f4254fd79a0e5af957d2382eac8624b5c527ec48c"}, + {file = "duckdb-0.10.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d37680b8d7be04e4709db3a66c8b3eb7ceba2a5276574903528632f2b2cc2e60"}, + {file = "duckdb-0.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d34b86d6a2a6dfe8bb757f90bfe7101a3bd9e3022bf19dbddfa4b32680d26a9"}, + {file = "duckdb-0.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:73b1cb283ca0f6576dc18183fd315b4e487a545667ffebbf50b08eb4e8cdc143"}, + {file = "duckdb-0.10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d917dde19fcec8cadcbef1f23946e85dee626ddc133e1e3f6551f15a61a03c61"}, + {file = "duckdb-0.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46757e0cf5f44b4cb820c48a34f339a9ccf83b43d525d44947273a585a4ed822"}, + {file = "duckdb-0.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:338c14d8ac53ac4aa9ec03b6f1325ecfe609ceeb72565124d489cb07f8a1e4eb"}, + {file = "duckdb-0.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:651fcb429602b79a3cf76b662a39e93e9c3e6650f7018258f4af344c816dab72"}, + {file = "duckdb-0.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3ae3c73b98b6215dab93cc9bc936b94aed55b53c34ba01dec863c5cab9f8e25"}, + {file = "duckdb-0.10.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56429b2cfe70e367fb818c2be19f59ce2f6b080c8382c4d10b4f90ba81f774e9"}, + {file = "duckdb-0.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b46c02c2e39e3676b1bb0dc7720b8aa953734de4fd1b762e6d7375fbeb1b63af"}, + {file = "duckdb-0.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:bcd460feef56575af2c2443d7394d405a164c409e9794a4d94cb5fdaa24a0ba4"}, + {file = "duckdb-0.10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e229a7c6361afbb0d0ab29b1b398c10921263c52957aefe3ace99b0426fdb91e"}, + {file = "duckdb-0.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:732b1d3b6b17bf2f32ea696b9afc9e033493c5a3b783c292ca4b0ee7cc7b0e66"}, + {file = "duckdb-0.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5380d4db11fec5021389fb85d614680dc12757ef7c5881262742250e0b58c75"}, + {file = "duckdb-0.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:468a4e0c0b13c55f84972b1110060d1b0f854ffeb5900a178a775259ec1562db"}, + {file = "duckdb-0.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa1e7ff8d18d71defa84e79f5c86aa25d3be80d7cb7bc259a322de6d7cc72da"}, + {file = "duckdb-0.10.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed1063ed97c02e9cf2e7fd1d280de2d1e243d72268330f45344c69c7ce438a01"}, + {file = "duckdb-0.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:22f2aad5bb49c007f3bfcd3e81fdedbc16a2ae41f2915fc278724ca494128b0c"}, + {file = "duckdb-0.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:8f9e2bb00a048eb70b73a494bdc868ce7549b342f7ffec88192a78e5a4e164bd"}, + {file = "duckdb-0.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6c2fc49875b4b54e882d68703083ca6f84b27536d57d623fc872e2f502b1078"}, + {file = "duckdb-0.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66c125d0c30af210f7ee599e7821c3d1a7e09208196dafbf997d4e0cfcb81ab"}, + {file = "duckdb-0.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99dd7a1d901149c7a276440d6e737b2777e17d2046f5efb0c06ad3b8cb066a6"}, + {file = "duckdb-0.10.3-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ec3bbdb209e6095d202202893763e26c17c88293b88ef986b619e6c8b6715bd"}, + {file = "duckdb-0.10.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:2b3dec4ef8ed355d7b7230b40950b30d0def2c387a2e8cd7efc80b9d14134ecf"}, + {file = "duckdb-0.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:04129f94fb49bba5eea22f941f0fb30337f069a04993048b59e2811f52d564bc"}, + {file = "duckdb-0.10.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d75d67024fc22c8edfd47747c8550fb3c34fb1cbcbfd567e94939ffd9c9e3ca7"}, + {file = "duckdb-0.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3796e9507c02d0ddbba2e84c994fae131da567ce3d9cbb4cbcd32fadc5fbb26"}, + {file = "duckdb-0.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:78e539d85ebd84e3e87ec44d28ad912ca4ca444fe705794e0de9be3dd5550c11"}, + {file = "duckdb-0.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a99b67ac674b4de32073e9bc604b9c2273d399325181ff50b436c6da17bf00a"}, + {file = "duckdb-0.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1209a354a763758c4017a1f6a9f9b154a83bed4458287af9f71d84664ddb86b6"}, + {file = "duckdb-0.10.3-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b735cea64aab39b67c136ab3a571dbf834067f8472ba2f8bf0341bc91bea820"}, + {file = "duckdb-0.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:816ffb9f758ed98eb02199d9321d592d7a32a6cb6aa31930f4337eb22cfc64e2"}, + {file = "duckdb-0.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:1631184b94c3dc38b13bce4045bf3ae7e1b0ecbfbb8771eb8d751d8ffe1b59b3"}, + {file = "duckdb-0.10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb98c35fc8dd65043bc08a2414dd9f59c680d7e8656295b8969f3f2061f26c52"}, + {file = "duckdb-0.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e75c9f5b6a92b2a6816605c001d30790f6d67ce627a2b848d4d6040686efdf9"}, + {file = "duckdb-0.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae786eddf1c2fd003466e13393b9348a44b6061af6fe7bcb380a64cac24e7df7"}, + {file = "duckdb-0.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9387da7b7973707b0dea2588749660dd5dd724273222680e985a2dd36787668"}, + {file = "duckdb-0.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:538f943bf9fa8a3a7c4fafa05f21a69539d2c8a68e557233cbe9d989ae232899"}, + {file = "duckdb-0.10.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6930608f35025a73eb94252964f9f19dd68cf2aaa471da3982cf6694866cfa63"}, + {file = "duckdb-0.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:03bc54a9cde5490918aad82d7d2a34290e3dfb78d5b889c6626625c0f141272a"}, + {file = "duckdb-0.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:372b6e3901d85108cafe5df03c872dfb6f0dbff66165a0cf46c47246c1957aa0"}, + {file = "duckdb-0.10.3.tar.gz", hash = "sha256:c5bd84a92bc708d3a6adffe1f554b94c6e76c795826daaaf482afc3d9c636971"}, +] + +[[package]] +name = "duckduckgo-search" +version = "6.1.7" +description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." +optional = false +python-versions = ">=3.8" +files = [ + {file = "duckduckgo_search-6.1.7-py3-none-any.whl", hash = "sha256:ec7d5becb8c392c0293ff9464938c1014896e1e14725c05adc306290a636fab2"}, + {file = "duckduckgo_search-6.1.7.tar.gz", hash = "sha256:c6fd8ba17fe9cd0a4f32e5b96984e959c3da865f9c2864bfcf82bf7ff9b7e8f0"}, +] + +[package.dependencies] +click = ">=8.1.7" +orjson = ">=3.10.5" +pyreqwest-impersonate = ">=0.4.8" + +[package.extras] +dev = ["mypy (>=1.10.0)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.4.8)"] +lxml = ["lxml (>=5.2.2)"] + +[[package]] +name = "ecdsa" +version = "0.19.0" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" +files = [ + {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, + {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "effdet" +version = "0.4.1" +description = "EfficientDet for PyTorch" +optional = false +python-versions = ">=3.7" +files = [ + {file = "effdet-0.4.1-py3-none-any.whl", hash = "sha256:10889a226228d515c948e3fcf811e64c0d78d7aa94823a300045653b9c284cb7"}, + {file = "effdet-0.4.1.tar.gz", hash = "sha256:ac5589fd304a5650c201986b2ef5f8e10c111093a71b1c49fa6b8817710812b5"}, +] + +[package.dependencies] +omegaconf = ">=2.0" +pycocotools = ">=2.0.2" +timm = ">=0.9.2" +torch = ">=1.12.1" +torchvision = "*" + +[[package]] +name = "email-validator" +version = "2.2.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "emoji" +version = "2.12.1" +description = "Emoji for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "emoji-2.12.1-py3-none-any.whl", hash = "sha256:a00d62173bdadc2510967a381810101624a2f0986145b8da0cffa42e29430235"}, + {file = "emoji-2.12.1.tar.gz", hash = "sha256:4aa0488817691aa58d83764b6c209f8a27c0b3ab3f89d1b8dceca1a62e4973eb"}, +] + +[package.dependencies] +typing-extensions = ">=4.7.0" + +[package.extras] +dev = ["coverage", "pytest (>=7.4.4)"] + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "faker" +version = "19.13.0" +description = "Faker is a Python package that generates fake data for you." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Faker-19.13.0-py3-none-any.whl", hash = "sha256:da880a76322db7a879c848a0771e129338e0a680a9f695fd9a3e7a6ac82b45e1"}, + {file = "Faker-19.13.0.tar.gz", hash = "sha256:14ccb0aec342d33aa3889a864a56e5b3c2d56bce1b89f9189f4fbc128b9afc1e"}, +] + +[package.dependencies] +python-dateutil = ">=2.4" + +[[package]] +name = "fastapi" +version = "0.111.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.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, + {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, +] + +[package.dependencies] +email_validator = ">=2.0.0" +fastapi-cli = ">=0.0.2" +httpx = ">=0.23.0" +jinja2 = ">=2.11.2" +orjson = ">=3.2.1" +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" +python-multipart = ">=0.0.7" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" +ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0" +uvicorn = {version = ">=0.12.0", extras = ["standard"]} + +[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)"] + +[[package]] +name = "fastapi-cli" +version = "0.0.4" +description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, + {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, +] + +[package.dependencies] +typer = ">=0.12.3" + +[package.extras] +standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] + +[[package]] +name = "fastavro" +version = "1.9.4" +description = "Fast read/write of AVRO files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastavro-1.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:60cb38f07462a7fb4e4440ed0de67d3d400ae6b3d780f81327bebde9aa55faef"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063d01d197fc929c20adc09ca9f0ca86d33ac25ee0963ce0b438244eee8315ae"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a9053fcfbc895f2a16a4303af22077e3a8fdcf1cd5d6ed47ff2ef22cbba2f0"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:02bf1276b7326397314adf41b34a4890f6ffa59cf7e0eb20b9e4ab0a143a1598"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56bed9eca435389a8861e6e2d631ec7f8f5dda5b23f93517ac710665bd34ca29"}, + {file = "fastavro-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:0cd2099c8c672b853e0b20c13e9b62a69d3fbf67ee7c59c7271ba5df1680310d"}, + {file = "fastavro-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af8c6d8c43a02b5569c093fc5467469541ac408c79c36a5b0900d3dd0b3ba838"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a138710bd61580324d23bc5e3df01f0b82aee0a76404d5dddae73d9e4c723f"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:903d97418120ca6b6a7f38a731166c1ccc2c4344ee5e0470d09eb1dc3687540a"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c443eeb99899d062dbf78c525e4614dd77e041a7688fa2710c224f4033f193ae"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ac26ab0774d1b2b7af6d8f4300ad20bbc4b5469e658a02931ad13ce23635152f"}, + {file = "fastavro-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:cf7247874c22be856ba7d1f46a0f6e0379a6025f1a48a7da640444cbac6f570b"}, + {file = "fastavro-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68912f2020e1b3d70557260b27dd85fb49a4fc6bfab18d384926127452c1da4c"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6925ce137cdd78e109abdb0bc33aad55de6c9f2d2d3036b65453128f2f5f5b92"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b928cd294e36e35516d0deb9e104b45be922ba06940794260a4e5dbed6c192a"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:90c9838bc4c991ffff5dd9d88a0cc0030f938b3fdf038cdf6babde144b920246"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eca6e54da571b06a3c5a72dbb7212073f56c92a6fbfbf847b91c347510f8a426"}, + {file = "fastavro-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4b02839ac261100cefca2e2ad04cdfedc556cb66b5ec735e0db428e74b399de"}, + {file = "fastavro-1.9.4-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4451ee9a305a73313a1558d471299f3130e4ecc10a88bf5742aa03fb37e042e6"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8524fccfb379565568c045d29b2ebf71e1f2c0dd484aeda9fe784ef5febe1a8"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d0a00a6e09baa20f6f038d7a2ddcb7eef0e7a9980e947a018300cb047091b8"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23d7e5b29c9bf6f26e8be754b2c8b919838e506f78ef724de7d22881696712fc"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e6ab3ee53944326460edf1125b2ad5be2fadd80f7211b13c45fa0c503b4cf8d"}, + {file = "fastavro-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:64d335ec2004204c501f8697c385d0a8f6b521ac82d5b30696f789ff5bc85f3c"}, + {file = "fastavro-1.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:7e05f44c493e89e73833bd3ff3790538726906d2856f59adc8103539f4a1b232"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:253c63993250bff4ee7b11fb46cf3a4622180a783bedc82a24c6fdcd1b10ca2a"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d6942eb1db14640c2581e0ecd1bbe0afc8a83731fcd3064ae7f429d7880cb7"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d47bb66be6091cd48cfe026adcad11c8b11d7d815a2949a1e4ccf03df981ca65"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c293897f12f910e58a1024f9c77f565aa8e23b36aafda6ad8e7041accc57a57f"}, + {file = "fastavro-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:f05d2afcb10a92e2a9e580a3891f090589b3e567fdc5641f8a46a0b084f120c3"}, + {file = "fastavro-1.9.4.tar.gz", hash = "sha256:56b8363e360a1256c94562393dc7f8611f3baf2b3159f64fb2b9c6b87b14e876"}, +] + +[package.extras] +codecs = ["cramjam", "lz4", "zstandard"] +lz4 = ["lz4"] +snappy = ["cramjam"] +zstandard = ["zstandard"] + +[[package]] +name = "feedfinder2" +version = "0.0.4" +description = "Find the feed URLs for a website." +optional = false +python-versions = "*" +files = [ + {file = "feedfinder2-0.0.4.tar.gz", hash = "sha256:3701ee01a6c85f8b865a049c30ba0b4608858c803fe8e30d1d289fdbe89d0efe"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +requests = "*" +six = "*" + +[[package]] +name = "feedparser" +version = "6.0.11" +description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds" +optional = false +python-versions = ">=3.6" +files = [ + {file = "feedparser-6.0.11-py3-none-any.whl", hash = "sha256:0be7ee7b395572b19ebeb1d6aafb0028dee11169f1c934e0ed67d54992f4ad45"}, + {file = "feedparser-6.0.11.tar.gz", hash = "sha256:c9d0407b64c6f2a065d0ebb292c2b35c01050cc0dc33757461aaabdc4c4184d5"}, +] + +[package.dependencies] +sgmllib3k = "*" + +[[package]] +name = "filelock" +version = "3.15.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "filetype" +version = "1.2.0" +description = "Infer file type and MIME type of any file/buffer. No external dependencies." +optional = false +python-versions = "*" +files = [ + {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, + {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, +] + +[[package]] +name = "flake8" +version = "7.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.1.0-py2.py3-none-any.whl", hash = "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a"}, + {file = "flake8-7.1.0.tar.gz", hash = "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.12.0,<2.13.0" +pyflakes = ">=3.2.0,<3.3.0" + +[[package]] +name = "flake8-black" +version = "0.3.6" +description = "flake8 plugin to call black as a code style validator" +optional = false +python-versions = ">=3.7" +files = [ + {file = "flake8-black-0.3.6.tar.gz", hash = "sha256:0dfbca3274777792a5bcb2af887a4cad72c72d0e86c94e08e3a3de151bb41c34"}, + {file = "flake8_black-0.3.6-py3-none-any.whl", hash = "sha256:fe8ea2eca98d8a504f22040d9117347f6b367458366952862ac3586e7d4eeaca"}, +] + +[package.dependencies] +black = ">=22.1.0" +flake8 = ">=3" + +[package.extras] +develop = ["build", "twine"] + +[[package]] +name = "flashrank" +version = "0.2.6" +description = "Ultra lite & Super fast SoTA cross-encoder based re-ranking for your search & retrieval pipelines." +optional = false +python-versions = ">=3.6" +files = [ + {file = "FlashRank-0.2.6-py3-none-any.whl", hash = "sha256:afe3a8db9909b375b7a0805ae653e8ec8beaf0cf0b3ea908250ff05b67dbe953"}, + {file = "FlashRank-0.2.6.tar.gz", hash = "sha256:46c3763d23f5de6fa8d11df699adef2578168686b724b5adc873fe5ee4525822"}, +] + +[package.dependencies] +llama-cpp-python = "0.2.76" +numpy = "*" +onnxruntime = "*" +requests = "*" +tokenizers = "*" +tqdm = "*" + +[[package]] +name = "flatbuffers" +version = "24.3.25" +description = "The FlatBuffers serialization format for Python" +optional = false +python-versions = "*" +files = [ + {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, + {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, +] + +[[package]] +name = "flower" +version = "2.0.1" +description = "Celery Flower" +optional = false +python-versions = ">=3.7" +files = [ + {file = "flower-2.0.1-py2.py3-none-any.whl", hash = "sha256:9db2c621eeefbc844c8dd88be64aef61e84e2deb29b271e02ab2b5b9f01068e2"}, + {file = "flower-2.0.1.tar.gz", hash = "sha256:5ab717b979530770c16afb48b50d2a98d23c3e9fe39851dcf6bc4d01845a02a0"}, +] + +[package.dependencies] +celery = ">=5.0.5" +humanize = "*" +prometheus-client = ">=0.8.0" +pytz = "*" +tornado = ">=5.0.0,<7.0.0" + +[[package]] +name = "fonttools" +version = "4.53.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, + {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, + {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, + {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, + {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, + {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, + {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, + {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, + {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, + {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, + {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, + {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, + {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "fpdf2" +version = "2.7.9" +description = "Simple & fast PDF generation for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fpdf2-2.7.9-py2.py3-none-any.whl", hash = "sha256:1f176aea4a1cc0fa1da5c799fce8f8bcfe2e936b9d2298a75514c9efc7528bfa"}, + {file = "fpdf2-2.7.9.tar.gz", hash = "sha256:f364c0d816a5e364eeeda9761cf5c961bae8c946f080cf87fed7f38ab773b318"}, +] + +[package.dependencies] +defusedxml = "*" +fonttools = ">=4.34.0" +Pillow = ">=6.2.2,<9.2.dev0 || >=9.3.dev0" + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2024.5.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, +] + +[package.dependencies] +aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +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.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["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", "typing-extensions"] + +[[package]] +name = "google-api-core" +version = "2.19.1" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, + {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-api-python-client" +version = "2.134.0" +description = "Google API Client Library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.134.0.tar.gz", hash = "sha256:4a8f0bea651a212997cc83c0f271fc86f80ef93d1cee9d84de7dfaeef2a858b6"}, + {file = "google_api_python_client-2.134.0-py2.py3-none-any.whl", hash = "sha256:ba05d60f6239990b7994f6328f17bb154c602d31860fb553016dc9f8ce886945"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + +[[package]] +name = "google-auth" +version = "2.30.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +description = "Google Authentication Library: httplib2 transport" +optional = false +python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, +] + +[package.dependencies] +google-auth = "*" +httplib2 = ">=0.19.0" + +[[package]] +name = "google-auth-oauthlib" +version = "1.2.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-1.2.0.tar.gz", hash = "sha256:292d2d3783349f2b0734a0a0207b1e1e322ac193c2c09d8f7c613fb7cc501ea8"}, + {file = "google_auth_oauthlib-1.2.0-py2.py3-none-any.whl", hash = "sha256:297c1ce4cb13a99b5834c74a1fe03252e1e499716718b190f56bcb9c4abc4faf"}, +] + +[package.dependencies] +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.63.2" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, +] + +[package.dependencies] +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "gotrue" +version = "2.5.4" +description = "Python Client Library for Supabase Auth" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "gotrue-2.5.4-py3-none-any.whl", hash = "sha256:6f45003bc73cdee612a2d0be79cffed39c91cc8ad43a7440c02c320c7ad03a8e"}, + {file = "gotrue-2.5.4.tar.gz", hash = "sha256:acf0644a2e5d1bd70f66452361bfea4ba9621a0354a13154a333671a4c751c53"}, +] + +[package.dependencies] +httpx = ">=0.23,<0.28" +pydantic = ">=1.10,<3" + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["chardet (>=2.2)", "genshi", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "httpx-sse" +version = "0.4.0" +description = "Consume Server-Sent Event (SSE) messages with HTTPX." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721"}, + {file = "httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"}, +] + +[[package]] +name = "huggingface-hub" +version = "0.23.4" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, + {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[package]] +name = "humanfriendly" +version = "10.0" +description = "Human friendly output for text interfaces using Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, + {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, +] + +[package.dependencies] +pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} + +[[package]] +name = "humanize" +version = "4.9.0" +description = "Python humanize utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, + {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, +] + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + +[[package]] +name = "identify" +version = "2.5.36" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, + {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "ijson" +version = "3.3.0" +description = "Iterative JSON parser with standard Python iterator interfaces" +optional = false +python-versions = "*" +files = [ + {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, + {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, + {file = "ijson-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b73b493af9e947caed75d329676b1b801d673b17481962823a3e55fe529c8b8b"}, + {file = "ijson-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5576415f3d76290b160aa093ff968f8bf6de7d681e16e463a0134106b506f49"}, + {file = "ijson-3.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e9ffe358d5fdd6b878a8a364e96e15ca7ca57b92a48f588378cef315a8b019e"}, + {file = "ijson-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8643c255a25824ddd0895c59f2319c019e13e949dc37162f876c41a283361527"}, + {file = "ijson-3.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:df3ab5e078cab19f7eaeef1d5f063103e1ebf8c26d059767b26a6a0ad8b250a3"}, + {file = "ijson-3.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3dc1fb02c6ed0bae1b4bf96971258bf88aea72051b6e4cebae97cff7090c0607"}, + {file = "ijson-3.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e9afd97339fc5a20f0542c971f90f3ca97e73d3050cdc488d540b63fae45329a"}, + {file = "ijson-3.3.0-cp310-cp310-win32.whl", hash = "sha256:844c0d1c04c40fd1b60f148dc829d3f69b2de789d0ba239c35136efe9a386529"}, + {file = "ijson-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d654d045adafdcc6c100e8e911508a2eedbd2a1b5f93f930ba13ea67d7704ee9"}, + {file = "ijson-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:501dce8eaa537e728aa35810656aa00460a2547dcb60937c8139f36ec344d7fc"}, + {file = "ijson-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:658ba9cad0374d37b38c9893f4864f284cdcc7d32041f9808fba8c7bcaadf134"}, + {file = "ijson-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2636cb8c0f1023ef16173f4b9a233bcdb1df11c400c603d5f299fac143ca8d70"}, + {file = "ijson-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd174b90db68c3bcca273e9391934a25d76929d727dc75224bf244446b28b03b"}, + {file = "ijson-3.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97a9aea46e2a8371c4cf5386d881de833ed782901ac9f67ebcb63bb3b7d115af"}, + {file = "ijson-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c594c0abe69d9d6099f4ece17763d53072f65ba60b372d8ba6de8695ce6ee39e"}, + {file = "ijson-3.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8e0ff16c224d9bfe4e9e6bd0395826096cda4a3ef51e6c301e1b61007ee2bd24"}, + {file = "ijson-3.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0015354011303175eae7e2ef5136414e91de2298e5a2e9580ed100b728c07e51"}, + {file = "ijson-3.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034642558afa57351a0ffe6de89e63907c4cf6849070cc10a3b2542dccda1afe"}, + {file = "ijson-3.3.0-cp311-cp311-win32.whl", hash = "sha256:192e4b65495978b0bce0c78e859d14772e841724d3269fc1667dc6d2f53cc0ea"}, + {file = "ijson-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:72e3488453754bdb45c878e31ce557ea87e1eb0f8b4fc610373da35e8074ce42"}, + {file = "ijson-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:988e959f2f3d59ebd9c2962ae71b97c0df58323910d0b368cc190ad07429d1bb"}, + {file = "ijson-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2f73f0d0fce5300f23a1383d19b44d103bb113b57a69c36fd95b7c03099b181"}, + {file = "ijson-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ee57a28c6bf523d7cb0513096e4eb4dac16cd935695049de7608ec110c2b751"}, + {file = "ijson-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0155a8f079c688c2ccaea05de1ad69877995c547ba3d3612c1c336edc12a3a5"}, + {file = "ijson-3.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ab00721304af1ae1afa4313ecfa1bf16b07f55ef91e4a5b93aeaa3e2bd7917c"}, + {file = "ijson-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40ee3821ee90be0f0e95dcf9862d786a7439bd1113e370736bfdf197e9765bfb"}, + {file = "ijson-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3b6987a0bc3e6d0f721b42c7a0198ef897ae50579547b0345f7f02486898f5"}, + {file = "ijson-3.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:63afea5f2d50d931feb20dcc50954e23cef4127606cc0ecf7a27128ed9f9a9e6"}, + {file = "ijson-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b5c3e285e0735fd8c5a26d177eca8b52512cdd8687ca86ec77a0c66e9c510182"}, + {file = "ijson-3.3.0-cp312-cp312-win32.whl", hash = "sha256:907f3a8674e489abdcb0206723e5560a5cb1fa42470dcc637942d7b10f28b695"}, + {file = "ijson-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f890d04ad33262d0c77ead53c85f13abfb82f2c8f078dfbf24b78f59534dfdd"}, + {file = "ijson-3.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b9d85a02e77ee8ea6d9e3fd5d515bcc3d798d9c1ea54817e5feb97a9bc5d52fe"}, + {file = "ijson-3.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6576cdc36d5a09b0c1a3d81e13a45d41a6763188f9eaae2da2839e8a4240bce"}, + {file = "ijson-3.3.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5589225c2da4bb732c9c370c5961c39a6db72cf69fb2a28868a5413ed7f39e6"}, + {file = "ijson-3.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad04cf38164d983e85f9cba2804566c0160b47086dcca4cf059f7e26c5ace8ca"}, + {file = "ijson-3.3.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:a3b730ef664b2ef0e99dec01b6573b9b085c766400af363833e08ebc1e38eb2f"}, + {file = "ijson-3.3.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:4690e3af7b134298055993fcbea161598d23b6d3ede11b12dca6815d82d101d5"}, + {file = "ijson-3.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:aaa6bfc2180c31a45fac35d40e3312a3d09954638ce0b2e9424a88e24d262a13"}, + {file = "ijson-3.3.0-cp36-cp36m-win32.whl", hash = "sha256:44367090a5a876809eb24943f31e470ba372aaa0d7396b92b953dda953a95d14"}, + {file = "ijson-3.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7e2b3e9ca957153557d06c50a26abaf0d0d6c0ddf462271854c968277a6b5372"}, + {file = "ijson-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47c144117e5c0e2babb559bc8f3f76153863b8dd90b2d550c51dab5f4b84a87f"}, + {file = "ijson-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ce02af5fbf9ba6abb70765e66930aedf73311c7d840478f1ccecac53fefbf3"}, + {file = "ijson-3.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ac6c3eeed25e3e2cb9b379b48196413e40ac4e2239d910bb33e4e7f6c137745"}, + {file = "ijson-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d92e339c69b585e7b1d857308ad3ca1636b899e4557897ccd91bb9e4a56c965b"}, + {file = "ijson-3.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:8c85447569041939111b8c7dbf6f8fa7a0eb5b2c4aebb3c3bec0fb50d7025121"}, + {file = "ijson-3.3.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:542c1e8fddf082159a5d759ee1412c73e944a9a2412077ed00b303ff796907dc"}, + {file = "ijson-3.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:30cfea40936afb33b57d24ceaf60d0a2e3d5c1f2335ba2623f21d560737cc730"}, + {file = "ijson-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:6b661a959226ad0d255e49b77dba1d13782f028589a42dc3172398dd3814c797"}, + {file = "ijson-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0b003501ee0301dbf07d1597482009295e16d647bb177ce52076c2d5e64113e0"}, + {file = "ijson-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e8d8de44effe2dbd0d8f3eb9840344b2d5b4cc284a14eb8678aec31d1b6bea8"}, + {file = "ijson-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9cd5c03c63ae06d4f876b9844c5898d0044c7940ff7460db9f4cd984ac7862b5"}, + {file = "ijson-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04366e7e4a4078d410845e58a2987fd9c45e63df70773d7b6e87ceef771b51ee"}, + {file = "ijson-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de7c1ddb80fa7a3ab045266dca169004b93f284756ad198306533b792774f10a"}, + {file = "ijson-3.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8851584fb931cffc0caa395f6980525fd5116eab8f73ece9d95e6f9c2c326c4c"}, + {file = "ijson-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdcfc88347fd981e53c33d832ce4d3e981a0d696b712fbcb45dcc1a43fe65c65"}, + {file = "ijson-3.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3917b2b3d0dbbe3296505da52b3cb0befbaf76119b2edaff30bd448af20b5400"}, + {file = "ijson-3.3.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e10c14535abc7ddf3fd024aa36563cd8ab5d2bb6234a5d22c77c30e30fa4fb2b"}, + {file = "ijson-3.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3aba5c4f97f4e2ce854b5591a8b0711ca3b0c64d1b253b04ea7b004b0a197ef6"}, + {file = "ijson-3.3.0-cp38-cp38-win32.whl", hash = "sha256:b325f42e26659df1a0de66fdb5cde8dd48613da9c99c07d04e9fb9e254b7ee1c"}, + {file = "ijson-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:ff835906f84451e143f31c4ce8ad73d83ef4476b944c2a2da91aec8b649570e1"}, + {file = "ijson-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3c556f5553368dff690c11d0a1fb435d4ff1f84382d904ccc2dc53beb27ba62e"}, + {file = "ijson-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e4396b55a364a03ff7e71a34828c3ed0c506814dd1f50e16ebed3fc447d5188e"}, + {file = "ijson-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6850ae33529d1e43791b30575070670070d5fe007c37f5d06aebc1dd152ab3f"}, + {file = "ijson-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36aa56d68ea8def26778eb21576ae13f27b4a47263a7a2581ab2ef58b8de4451"}, + {file = "ijson-3.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7ec759c4a0fc820ad5dc6a58e9c391e7b16edcb618056baedbedbb9ea3b1524"}, + {file = "ijson-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b51bab2c4e545dde93cb6d6bb34bf63300b7cd06716f195dd92d9255df728331"}, + {file = "ijson-3.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:92355f95a0e4da96d4c404aa3cff2ff033f9180a9515f813255e1526551298c1"}, + {file = "ijson-3.3.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8795e88adff5aa3c248c1edce932db003d37a623b5787669ccf205c422b91e4a"}, + {file = "ijson-3.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8f83f553f4cde6d3d4eaf58ec11c939c94a0ec545c5b287461cafb184f4b3a14"}, + {file = "ijson-3.3.0-cp39-cp39-win32.whl", hash = "sha256:ead50635fb56577c07eff3e557dac39533e0fe603000684eea2af3ed1ad8f941"}, + {file = "ijson-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:c8a9befb0c0369f0cf5c1b94178d0d78f66d9cebb9265b36be6e4f66236076b8"}, + {file = "ijson-3.3.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2af323a8aec8a50fa9effa6d640691a30a9f8c4925bd5364a1ca97f1ac6b9b5c"}, + {file = "ijson-3.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f64f01795119880023ba3ce43072283a393f0b90f52b66cc0ea1a89aa64a9ccb"}, + {file = "ijson-3.3.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a716e05547a39b788deaf22725490855337fc36613288aa8ae1601dc8c525553"}, + {file = "ijson-3.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473f5d921fadc135d1ad698e2697025045cd8ed7e5e842258295012d8a3bc702"}, + {file = "ijson-3.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd26b396bc3a1e85f4acebeadbf627fa6117b97f4c10b177d5779577c6607744"}, + {file = "ijson-3.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:25fd49031cdf5fd5f1fd21cb45259a64dad30b67e64f745cc8926af1c8c243d3"}, + {file = "ijson-3.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b72178b1e565d06ab19319965022b36ef41bcea7ea153b32ec31194bec032a2"}, + {file = "ijson-3.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d0b6b637d05dbdb29d0bfac2ed8425bb369e7af5271b0cc7cf8b801cb7360c2"}, + {file = "ijson-3.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378d0baa59ae422905c5f182ea0fd74fe7e52a23e3821067a7d58c8306b2191"}, + {file = "ijson-3.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:99f5c8ab048ee4233cc4f2b461b205cbe01194f6201018174ac269bf09995749"}, + {file = "ijson-3.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:45ff05de889f3dc3d37a59d02096948ce470699f2368b32113954818b21aa74a"}, + {file = "ijson-3.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efb521090dd6cefa7aafd120581947b29af1713c902ff54336b7c7130f04c47"}, + {file = "ijson-3.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c727691858fd3a1c085d9980d12395517fcbbf02c69fbb22dede8ee03422da"}, + {file = "ijson-3.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0420c24e50389bc251b43c8ed379ab3e3ba065ac8262d98beb6735ab14844460"}, + {file = "ijson-3.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8fdf3721a2aa7d96577970f5604bd81f426969c1822d467f07b3d844fa2fecc7"}, + {file = "ijson-3.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:891f95c036df1bc95309951940f8eea8537f102fa65715cdc5aae20b8523813b"}, + {file = "ijson-3.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed1336a2a6e5c427f419da0154e775834abcbc8ddd703004108121c6dd9eba9d"}, + {file = "ijson-3.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0c819f83e4f7b7f7463b2dc10d626a8be0c85fbc7b3db0edc098c2b16ac968e"}, + {file = "ijson-3.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33afc25057377a6a43c892de34d229a86f89ea6c4ca3dd3db0dcd17becae0dbb"}, + {file = "ijson-3.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7914d0cf083471856e9bc2001102a20f08e82311dfc8cf1a91aa422f9414a0d6"}, + {file = "ijson-3.3.0.tar.gz", hash = "sha256:7f172e6ba1bee0d4c8f8ebd639577bfe429dee0f3f96775a067b8bae4492d8a0"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.2.1" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.2.1-py3-none-any.whl", hash = "sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8"}, + {file = "importlib_metadata-7.2.1.tar.gz", hash = "sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "intel-openmp" +version = "2021.4.0" +description = "Intel OpenMP* Runtime Library" +optional = false +python-versions = "*" +files = [ + {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, +] + +[[package]] +name = "iopath" +version = "0.1.10" +description = "A library for providing I/O abstraction." +optional = false +python-versions = ">=3.6" +files = [ + {file = "iopath-0.1.10.tar.gz", hash = "sha256:3311c16a4d9137223e20f141655759933e1eda24f8bff166af834af3c645ef01"}, +] + +[package.dependencies] +portalocker = "*" +tqdm = "*" +typing_extensions = "*" + +[package.extras] +aws = ["boto3"] + +[[package]] +name = "ipykernel" +version = "6.29.4" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.25.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.25.0-py3-none-any.whl", hash = "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab"}, + {file = "ipython-8.25.0.tar.gz", hash = "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +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 = "jieba3k" +version = "0.35.1" +description = "Chinese Words Segementation Utilities" +optional = false +python-versions = "*" +files = [ + {file = "jieba3k-0.35.1.zip", hash = "sha256:980a4f2636b778d312518066be90c7697d410dd5a472385f5afced71a2db1c10"}, +] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "jq" +version = "1.7.0" +description = "jq is a lightweight and flexible JSON processor." +optional = false +python-versions = ">=3.5" +files = [ + {file = "jq-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d8fae014fa8b2704322a5baa39c112176d9acb71e22ebdb8e21c1c864ecff654"}, + {file = "jq-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:40fe068d1fdf2c712885b69be90ddb3e61bca3e4346ab3994641a4fbbeb7be82"}, + {file = "jq-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ec105a0057f2f922d195e1d75d4b0ae41c4b38655ead04d1a3a47988fcb1939"}, + {file = "jq-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38e2041ca578275334eff9e1d913ae386210345e5ae71cd9c16e3f208dc81deb"}, + {file = "jq-1.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce1df1b6fffeeeb265d4ea3397e9875ab170ba5a7af6b7997c2fd755934df065"}, + {file = "jq-1.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05ebdaa868f068967d9e7cbf76e59e61fbdafa565dbc3579c387fb1f248592bb"}, + {file = "jq-1.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b3f916cb812fcd26bb1b006634d9c0eff240090196ca0ebb5d229b344f624e53"}, + {file = "jq-1.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9ad7749a16a16bafd6cebafd5e40990b641b4b6b7b661326864677effc44a500"}, + {file = "jq-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e99ea17b708f55e8bed2f4f68c022119184b17eb15987b384db12e8b6702bd5"}, + {file = "jq-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76735cd19de65c15964d330adbc2c84add8e55dea35ebfe17b9acf88a06a7d57"}, + {file = "jq-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b841ddd9089429fc0621d07d1c34ff24f7d6a6245c10125b82806f61e36ae8"}, + {file = "jq-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d6b1fc2515b7be92195d50b68f82329cc0250c7fbca790b887d74902ba33870"}, + {file = "jq-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb6546a57a3ceeed41961be2f1417b4e7a5b3170cca7bb82f5974d2ba9acaab6"}, + {file = "jq-1.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3427ad0f377f188953958e36b76167c8d11b8c8c61575c22deafa4aba58d601f"}, + {file = "jq-1.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:79b9603219fa5082df97d265d71c426613286bd0e5378a8739ce39056fa1e2dc"}, + {file = "jq-1.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2981a24765a747163e0daa23648372b72a006e727895b95d032632aa51094bd"}, + {file = "jq-1.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a0cc15b2ed511a1a8784c7c7dc07781e28d84a65934062de52487578732e0514"}, + {file = "jq-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90032c2c4e710157d333d166818ede8b9c8ef0f697e59c9427304edc47146f3d"}, + {file = "jq-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e715d5f0bdfc0be0ff33cd0a3f6f51f8bc5ad464fab737e2048a1b46b45bb582"}, + {file = "jq-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cc5a1ca3a540a5753dbd592f701c1ec7c9cc256becba604490283c055f3f1c"}, + {file = "jq-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:293b6e8e4b652d96fdeae7dd5ffb1644199d8b6fc1f95d528c16451925c0482e"}, + {file = "jq-1.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f103868b8902d4ee7f643248bdd7a2de9f9396e4b262f42745b9f624c834d07a"}, + {file = "jq-1.7.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e9c5ccfa3cf65f92b60c5805ef725f7cd799f2dc16e8601c6e8f12f38a9f48f3"}, + {file = "jq-1.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0ca25608d51fdbf8bd5c682b433e1cb9f497155a7c1ea5901524df099f1ceff3"}, + {file = "jq-1.7.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6a2d34d962ce2da5136dab2664fc7efad9f71024d0dc328702f2dc70b4e2735c"}, + {file = "jq-1.7.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:757e8c4cb0cb1175f0aaa227f0a26e4765ba5da04d0bc875b0bd933eff6bd0a0"}, + {file = "jq-1.7.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d097098a628171b87961fb0400117ac340b1eb40cbbee2e58208c4254c23c20"}, + {file = "jq-1.7.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45bc842806d71bd5839c190a88fd071ac5a0a8a1dd601e83228494a19f14559c"}, + {file = "jq-1.7.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0629743417f8709305d1f77d3929493912efdc3fd1cce3a7fcc76b81bc6b82d"}, + {file = "jq-1.7.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:9b9a49e8b14d3a368011ed1412c8c3e193a7135d5eb4310d77ee643470112b47"}, + {file = "jq-1.7.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a10e3f88b6d2bbb4c47b368f919ec7b648196bf9c60a5cc921d04239d68240c2"}, + {file = "jq-1.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aa85b47effb4152e1cf1120607f475a1c11395d072323ff23e8bb59ce6752713"}, + {file = "jq-1.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9413f67ea28037e37ccf8951f9f0b380f31d79162f33e216faa6bd0d8eca0dc7"}, + {file = "jq-1.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3daf3b3443c4e871c23ac1e698eb70d1225b46a4ac79c73968234adcd70f3ed8"}, + {file = "jq-1.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbe03f95ab02dc045691c3b5c7da8d8c2128e60450fb2124ea8b49034c74f158"}, + {file = "jq-1.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a6b2e9f4e63644a30726c58c25d80015f9b83325b125615a46e10d4439b9dc99"}, + {file = "jq-1.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9fffcffc8e56585223878edd7c5d719eb8547281d64af2bac43911f1bb9e7029"}, + {file = "jq-1.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:95d4bcd5a999ce0aaadaadcaca967989f0efc96c1097a81746b21b6126cf7aaf"}, + {file = "jq-1.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0137445eb67c43eb0eb46933aff7e8afbbd6c5aaf8574efd5df536dc9d177d1d"}, + {file = "jq-1.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ee0e9307b6d4fe89a8556a92c1db65e0d66218bcc13fdeb92a09645a55ff87a"}, + {file = "jq-1.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e0f95cecb690df66f23a8d76c746d2ed15671de3f6101140e3fe2b98b97e0a8"}, + {file = "jq-1.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95e472aa54efe418d3627dcd2a369ac0b21e1a5e352550144fd5f0c40585a5b7"}, + {file = "jq-1.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4be2a2b56fa139f3235cdb8422ea16eccdd48d62bf91d9fac10761cd55d26c84"}, + {file = "jq-1.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7db8260ecb57827bb3fb6f44d4a6f0db0570ded990eee95a5fd3ac9ba14f60d7"}, + {file = "jq-1.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fdbb7ff2dfce2cc0f421f498dcb64176997bd9d9e6cab474e59577e7bff3090d"}, + {file = "jq-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:396bef4b4c9c1ebe3e0e04e287bc79a861b991e12db45681c398d3906ee85468"}, + {file = "jq-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18d8a81c6e241585a0bf748903082d65c4eaa6ba80248f507e5cebda36e05c6c"}, + {file = "jq-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade00a39990fdfe0acc7d2a900e3e5e6b11a71eb5289954ff0df31ac0afae25b"}, + {file = "jq-1.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c777e88f3cce496c17f5c3bdbc7d74ff12b5cbdaea30f3a374f3cc92e5bba8d"}, + {file = "jq-1.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79957008c67d8f1d9134cd0e01044bff5d795f7e94db9532a9fe9212e1f88a77"}, + {file = "jq-1.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2bc5cb77dd12e861296cfa69587aa6797ccfee4f5f3aa571b02f0273ab1efec1"}, + {file = "jq-1.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8e10a5937aab9c383632ab151f73d43dc0c4be99f62221a7044988dc8ddd4bdc"}, + {file = "jq-1.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e6e13e0f8d3204aefe861159160116e822c90bae773a3ccdd4d9e79a06e086e"}, + {file = "jq-1.7.0-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:0cdbd32463ef632b0b4ca6dab434e2387342bc5c895b411ec6b2a14bbf4b2c12"}, + {file = "jq-1.7.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:558a5c6b4430e05fa59c4b5631c0d3fc0f163100390c03edc1993663f59d8a9b"}, + {file = "jq-1.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bbf77138cdd8d306bf335d998525a0477e4cb6f00eb6f361288f5b82274e84c"}, + {file = "jq-1.7.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e6919481ff43754ae9b17a98c877995d5e1346be114c71cd0dfd8ff7d0cd60"}, + {file = "jq-1.7.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b0584ff33b2a9cc021edec325af4e0fa9fbd54cce80c1f7b8e0ba4cf2d75508"}, + {file = "jq-1.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a6e7259880ab7e75e845fb4d56c6d18922c68789d25d7cdbb6f433d9e714613a"}, + {file = "jq-1.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d472cdd0bcb3d47c87b00ff841edff41c79fe4422523c4a7c8bf913fb950f7f"}, + {file = "jq-1.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a3430de179f8a7b0baf5675d5ee400f97344085d79f190a90fc0c7df990cbcc"}, + {file = "jq-1.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb375bdb2a44f1a643123b8ec57563bb5542673f0399799ab5662ce90bf4a5"}, + {file = "jq-1.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39a0c71ed2f1ec0462d54678333f1b14d9f25fd62a9f46df140d68552f79d204"}, + {file = "jq-1.7.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:306c1e3ba531d7dc3284e128689f0b75409a4e8e8a3bdac2c51cc26f2d3cca58"}, + {file = "jq-1.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88b8b0cc838c7387dc5e8c45b192c7504acd0510514658d2d5cd1716fcf15fe3"}, + {file = "jq-1.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c75e16e542f4abaae25727b9fc4eeaf69cb07122be8a2a7672d02feb3a1cc9a"}, + {file = "jq-1.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4828ac689a67fd9c021796bcacd95811bab806939dd6316eb0c2d3de016c584"}, + {file = "jq-1.7.0-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:c94f95b27720d2db7f1039fdd371f70bc0cac8e204cbfd0626176d7b8a3053d6"}, + {file = "jq-1.7.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d5ff445fc9b1eb4623a914e04bea9511e654e9143cde82b039383af4f7dc36f2"}, + {file = "jq-1.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07e369ff021fad38a29d6a7a3fc24f7d313e9a239b15ce4eefaffee637466400"}, + {file = "jq-1.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553dfbf674069cb20533d7d74cd8a9d7982bab8e4a5b473fde105d99278df09f"}, + {file = "jq-1.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9fbc76f6fec66e5e58cc84f20a5de80addd3c64ad87a748f5c5f6b4ef01bc8c"}, + {file = "jq-1.7.0.tar.gz", hash = "sha256:f460d1f2c3791617e4fb339fa24efbdbebe672b02c861f057358553642047040"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpath-python" +version = "1.0.6" +description = "A more powerful JSONPath implementation in modern python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jsonpath-python-1.0.6.tar.gz", hash = "sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666"}, + {file = "jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jupyter-client" +version = "8.6.2" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "kombu" +version = "5.3.7" +description = "Messaging library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "kombu-5.3.7-py3-none-any.whl", hash = "sha256:5634c511926309c7f9789f1433e9ed402616b56836ef9878f01bd59267b4c7a9"}, + {file = "kombu-5.3.7.tar.gz", hash = "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf"}, +] + +[package.dependencies] +amqp = ">=5.1.1,<6.0.0" +boto3 = {version = ">=1.26.143", optional = true, markers = "extra == \"sqs\""} +pycurl = {version = ">=7.43.0.5", optional = true, markers = "sys_platform != \"win32\" and platform_python_implementation == \"CPython\" and extra == \"sqs\""} +urllib3 = {version = ">=1.26.16", optional = true, markers = "extra == \"sqs\""} +vine = "*" + +[package.extras] +azureservicebus = ["azure-servicebus (>=7.10.0)"] +azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] +confluentkafka = ["confluent-kafka (>=2.2.0)"] +consul = ["python-consul2"] +librabbitmq = ["librabbitmq (>=2.0.0)"] +mongodb = ["pymongo (>=4.1.1)"] +msgpack = ["msgpack"] +pyro = ["pyro4"] +qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] +redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=2.8.0)"] + +[[package]] +name = "langchain" +version = "0.2.5" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, + {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +langchain-core = ">=0.2.7,<0.3.0" +langchain-text-splitters = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.17,<0.2.0" +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[[package]] +name = "langchain-cohere" +version = "0.1.8" +description = "An integration package connecting Cohere and LangChain" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_cohere-0.1.8-py3-none-any.whl", hash = "sha256:d3ef73d5050513ff3ca0f07c8f3f73b7773eec182312aae92138d3a0ad33e631"}, + {file = "langchain_cohere-0.1.8.tar.gz", hash = "sha256:edbeca8d041186d2831b495d9a392a0a94d15b0e2c98863e0a0cd001fc888842"}, +] + +[package.dependencies] +cohere = ">=5.5.6,<6.0" +langchain-core = ">=0.2.0,<0.3" + +[[package]] +name = "langchain-community" +version = "0.2.5" +description = "Community contributed LangChain integrations." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"}, + {file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain = ">=0.2.5,<0.3.0" +langchain-core = ">=0.2.7,<0.3.0" +langsmith = ">=0.1.0,<0.2.0" +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[[package]] +name = "langchain-core" +version = "0.2.9" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_core-0.2.9-py3-none-any.whl", hash = "sha256:426a5a4fea95a5db995ba5ab560b76edd4998fb6fe52ccc28ac987092a4cbfcd"}, + {file = "langchain_core-0.2.9.tar.gz", hash = "sha256:f1c59082642921727844e1cd0eb36d451edd1872c20e193aa3142aac03495986"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.75,<0.2.0" +packaging = ">=23.2,<25" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" + +[[package]] +name = "langchain-openai" +version = "0.1.9" +description = "An integration package connecting OpenAI and LangChain" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_openai-0.1.9-py3-none-any.whl", hash = "sha256:afae71ef315c967685e53fe061470438000946739a9492d5f2d53bd4ae9d495a"}, + {file = "langchain_openai-0.1.9.tar.gz", hash = "sha256:730a94d68208678b9b9f64e4959a87057e021d6600754ea8b954e7765c7a62f1"}, +] + +[package.dependencies] +langchain-core = ">=0.2.2,<0.3" +openai = ">=1.26.0,<2.0.0" +tiktoken = ">=0.7,<1" + +[[package]] +name = "langchain-text-splitters" +version = "0.2.1" +description = "LangChain text splitting utilities" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, + {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, +] + +[package.dependencies] +langchain-core = ">=0.2.0,<0.3.0" + +[package.extras] +extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] + +[[package]] +name = "langdetect" +version = "1.0.9" +description = "Language detection library ported from Google's language-detection." +optional = false +python-versions = "*" +files = [ + {file = "langdetect-1.0.9-py2-none-any.whl", hash = "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a"}, + {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "langfuse" +version = "2.36.2" +description = "A client library for accessing langfuse" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langfuse-2.36.2-py3-none-any.whl", hash = "sha256:66728feddcec0974e4eb31612151a282fcce2e333b5a61474182b5e67e78e090"}, + {file = "langfuse-2.36.2.tar.gz", hash = "sha256:3e784505d408aa2c9c2da79487b64d185d8f7fa8a855e5303bcce678454c715b"}, +] + +[package.dependencies] +backoff = ">=1.10.0" +httpx = ">=0.15.4,<1.0" +idna = ">=3.7,<4.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1.10.7,<3.0" +wrapt = ">=1.14,<2.0" + +[package.extras] +langchain = ["langchain (>=0.0.309)"] +llama-index = ["llama-index (>=0.10.12,<2.0.0)"] +openai = ["openai (>=0.27.8)"] + +[[package]] +name = "langgraph" +version = "0.1.1" +description = "Building stateful, multi-actor applications with LLMs" +optional = false +python-versions = "<4.0,>=3.9.0" +files = [ + {file = "langgraph-0.1.1-py3-none-any.whl", hash = "sha256:6d798072625fd23ff155d40ee823b4e5eb00731ad8a64e2551fd6ae0cb53aec4"}, + {file = "langgraph-0.1.1.tar.gz", hash = "sha256:cea9831c334f36bae9caa66637422e37f76f069b47233ceb253be6cfb3ecb35e"}, +] + +[package.dependencies] +langchain-core = ">=0.2,<0.3" + +[[package]] +name = "langsmith" +version = "0.1.82" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langsmith-0.1.82-py3-none-any.whl", hash = "sha256:9b3653e7d316036b0c60bf0bc3e280662d660f485a4ebd8e5c9d84f9831ae79c"}, + {file = "langsmith-0.1.82.tar.gz", hash = "sha256:c02e2bbc488c10c13b52c69d271eb40bd38da078d37b6ae7ae04a18bd48140be"}, +] + +[package.dependencies] +orjson = ">=3.9.14,<4.0.0" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] +requests = ">=2,<3" + +[[package]] +name = "layoutparser" +version = "0.3.4" +description = "A unified toolkit for Deep Learning Based Document Image Analysis" +optional = false +python-versions = ">=3.6" +files = [ + {file = "layoutparser-0.3.4-py3-none-any.whl", hash = "sha256:269aedfab8a0caa50aef8d0fa62740fbee1f2964880daae3a0e6a0415363126a"}, + {file = "layoutparser-0.3.4.tar.gz", hash = "sha256:0dfb2194c36a5ad1075b8310f3cbc280c00306d1758cef127d20283f7ce085ea"}, +] + +[package.dependencies] +effdet = {version = "*", optional = true, markers = "extra == \"layoutmodels\""} +iopath = "*" +numpy = "*" +opencv-python = "*" +pandas = "*" +pdf2image = "*" +pdfplumber = "*" +pillow = "*" +pytesseract = {version = "*", optional = true, markers = "extra == \"tesseract\""} +pyyaml = ">=5.1" +scipy = "*" +torch = {version = "*", optional = true, markers = "extra == \"layoutmodels\""} +torchvision = {version = "*", optional = true, markers = "extra == \"layoutmodels\""} + +[package.extras] +effdet = ["effdet", "torch", "torchvision"] +gcv = ["google-cloud-vision (==1)"] +layoutmodels = ["effdet", "torch", "torchvision"] +ocr = ["google-cloud-vision (==1)", "pytesseract"] +paddledetection = ["paddlepaddle (==2.1.0)"] +tesseract = ["pytesseract"] + +[[package]] +name = "litellm" +version = "1.40.26" +description = "Library to easily interface with LLM API providers" +optional = false +python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" +files = [ + {file = "litellm-1.40.26-py3-none-any.whl", hash = "sha256:5daedec00a3a8e32f55b3099190ccd9d550177f6e516823002831e6620ae771c"}, + {file = "litellm-1.40.26.tar.gz", hash = "sha256:4dfd4ca3eb50a62600e60303c4975ba9fe7c52d07882d0d2b6bad2d474d88758"}, +] + +[package.dependencies] +aiohttp = "*" +click = "*" +ijson = "*" +importlib-metadata = ">=6.8.0" +jinja2 = ">=3.1.2,<4.0.0" +openai = ">=1.27.0" +pydantic = ">=2.0.0,<3.0.0" +python-dotenv = ">=0.2.0" +requests = ">=2.31.0,<3.0.0" +tiktoken = ">=0.7.0" +tokenizers = "*" + +[package.extras] +extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "resend (>=0.8.0,<0.9.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.111.0,<0.112.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] + +[[package]] +name = "llama-cloud" +version = "0.0.6" +description = "" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "llama_cloud-0.0.6-py3-none-any.whl", hash = "sha256:0f07c8a865be632b543dec2bcad350a68a61f13413a7421b4b03de32c36f0194"}, + {file = "llama_cloud-0.0.6.tar.gz", hash = "sha256:33b94cd119133dcb2899c9b69e8e1c36aec7bc7e80062c55c65f15618722e091"}, +] + +[package.dependencies] +httpx = ">=0.20.0" +pydantic = ">=1.10" + +[[package]] +name = "llama-cpp-python" +version = "0.2.76" +description = "Python bindings for the llama.cpp library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "llama_cpp_python-0.2.76.tar.gz", hash = "sha256:a4e2ab6b74dc87f565a21e4f1617c030f92d5b341375d7173876d238613a50ab"}, +] + +[package.dependencies] +diskcache = ">=5.6.1" +jinja2 = ">=2.11.3" +numpy = ">=1.20.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["llama_cpp_python[dev,server,test]"] +dev = ["black (>=23.3.0)", "httpx (>=0.24.1)", "mkdocs (>=1.4.3)", "mkdocs-material (>=9.1.18)", "mkdocstrings[python] (>=0.22.0)", "pytest (>=7.4.0)", "twine (>=4.0.2)"] +server = ["PyYAML (>=5.1)", "fastapi (>=0.100.0)", "pydantic-settings (>=2.0.1)", "sse-starlette (>=1.6.1)", "starlette-context (>=0.3.6,<0.4)", "uvicorn (>=0.22.0)"] +test = ["httpx (>=0.24.1)", "pytest (>=7.4.0)", "scipy (>=1.10)"] + +[[package]] +name = "llama-index" +version = "0.10.50" +description = "Interface between LLMs and your data" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index-0.10.50-py3-none-any.whl", hash = "sha256:18426f1f23378bde506646a6e016c11b7e99f947bcc9c768384ae776da2aeab7"}, + {file = "llama_index-0.10.50.tar.gz", hash = "sha256:57f8cbd3d981f68ebafff97268f4afb53a1f9f4af0bb748858b14310336b2a4d"}, +] + +[package.dependencies] +llama-index-agent-openai = ">=0.1.4,<0.3.0" +llama-index-cli = ">=0.1.2,<0.2.0" +llama-index-core = "0.10.50" +llama-index-embeddings-openai = ">=0.1.5,<0.2.0" +llama-index-indices-managed-llama-cloud = ">=0.2.0" +llama-index-legacy = ">=0.9.48,<0.10.0" +llama-index-llms-openai = ">=0.1.13,<0.2.0" +llama-index-multi-modal-llms-openai = ">=0.1.3,<0.2.0" +llama-index-program-openai = ">=0.1.3,<0.2.0" +llama-index-question-gen-openai = ">=0.1.2,<0.2.0" +llama-index-readers-file = ">=0.1.4,<0.2.0" +llama-index-readers-llama-parse = ">=0.1.2,<0.2.0" + +[[package]] +name = "llama-index-agent-openai" +version = "0.2.7" +description = "llama-index agent openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_agent_openai-0.2.7-py3-none-any.whl", hash = "sha256:34be65011a508dd8cab0c9a606594f28075b98b0cebe69e3c543adc8564fee0d"}, + {file = "llama_index_agent_openai-0.2.7.tar.gz", hash = "sha256:13ce535f03e32c821763c01e26af4222f3981178622414d3868013a1946e8124"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.41,<0.11.0" +llama-index-llms-openai = ">=0.1.5,<0.2.0" +openai = ">=1.14.0" + +[[package]] +name = "llama-index-cli" +version = "0.1.12" +description = "llama-index cli" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_cli-0.1.12-py3-none-any.whl", hash = "sha256:d80d546786f02d3f16f6183b8e86b22b8b5c33a1500923659f2ccbff8d5df634"}, + {file = "llama_index_cli-0.1.12.tar.gz", hash = "sha256:3cf1f706c3c69c6b1aab07fca7faad3959db1709808efd50491b669d38b0b580"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.11.post1,<0.11.0" +llama-index-embeddings-openai = ">=0.1.1,<0.2.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-core" +version = "0.10.50" +description = "Interface between LLMs and your data" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_core-0.10.50-py3-none-any.whl", hash = "sha256:8a1fc49d65156002bb7f4c82458385ee440bd11f81d1bc39ed03ce94f53c9c74"}, + {file = "llama_index_core-0.10.50.tar.gz", hash = "sha256:9e64dd54b19aca235b360b2f81d6f93014f1439304cc9369a0e53e4cba9e33aa"}, +] + +[package.dependencies] +aiohttp = ">=3.8.6,<4.0.0" +dataclasses-json = "*" +deprecated = ">=1.2.9.3" +dirtyjson = ">=1.0.8,<2.0.0" +fsspec = ">=2023.5.0" +httpx = "*" +llama-cloud = ">=0.0.6,<0.0.7" +nest-asyncio = ">=1.5.8,<2.0.0" +networkx = ">=3.0" +nltk = ">=3.8.1,<4.0.0" +numpy = "<2.0.0" +openai = ">=1.1.0" +pandas = "*" +pillow = ">=9.0.0" +PyYAML = ">=6.0.1" +requests = ">=2.31.0" +SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]} +tenacity = ">=8.2.0,<8.4.0 || >8.4.0,<9.0.0" +tiktoken = ">=0.3.3" +tqdm = ">=4.66.1,<5.0.0" +typing-extensions = ">=4.5.0" +typing-inspect = ">=0.8.0" +wrapt = "*" + +[[package]] +name = "llama-index-embeddings-openai" +version = "0.1.10" +description = "llama-index embeddings openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_embeddings_openai-0.1.10-py3-none-any.whl", hash = "sha256:c3cfa83b537ded34d035fc172a945dd444c87fb58a89b02dfbf785b675f9f681"}, + {file = "llama_index_embeddings_openai-0.1.10.tar.gz", hash = "sha256:1bc1fc9b46773a12870c5d3097d3735d7ca33805f12462a8e35ae8a6e5ce1cf6"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.1,<0.11.0" + +[[package]] +name = "llama-index-indices-managed-llama-cloud" +version = "0.2.1" +description = "llama-index indices llama-cloud integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_indices_managed_llama_cloud-0.2.1-py3-none-any.whl", hash = "sha256:69abd37bc7b57abcea841eea2a89cb0adee29bce3fd05c61e3082ae50f047b87"}, + {file = "llama_index_indices_managed_llama_cloud-0.2.1.tar.gz", hash = "sha256:b07fa606f1085e22918d2d45e00ab86f3430f36057e115322bd360b695eef565"}, +] + +[package.dependencies] +llama-cloud = ">=0.0.6,<0.0.7" +llama-index-core = ">=0.10.48.post1,<0.11.0" + +[[package]] +name = "llama-index-legacy" +version = "0.9.48" +description = "Interface between LLMs and your data" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "llama_index_legacy-0.9.48-py3-none-any.whl", hash = "sha256:714ada95beac179b4acefa4d2deff74bb7b2f22b0f699ac247d4cb67738d16d4"}, + {file = "llama_index_legacy-0.9.48.tar.gz", hash = "sha256:82ddc4691edbf49533d65582c249ba22c03fe96fbd3e92f7758dccef28e43834"}, +] + +[package.dependencies] +aiohttp = ">=3.8.6,<4.0.0" +dataclasses-json = "*" +deprecated = ">=1.2.9.3" +dirtyjson = ">=1.0.8,<2.0.0" +fsspec = ">=2023.5.0" +httpx = "*" +nest-asyncio = ">=1.5.8,<2.0.0" +networkx = ">=3.0" +nltk = ">=3.8.1,<4.0.0" +numpy = "*" +openai = ">=1.1.0" +pandas = "*" +requests = ">=2.31.0" +SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]} +tenacity = ">=8.2.0,<9.0.0" +tiktoken = ">=0.3.3" +typing-extensions = ">=4.5.0" +typing-inspect = ">=0.8.0" + +[package.extras] +gradientai = ["gradientai (>=1.4.0)"] +html = ["beautifulsoup4 (>=4.12.2,<5.0.0)"] +langchain = ["langchain (>=0.0.303)"] +local-models = ["optimum[onnxruntime] (>=1.13.2,<2.0.0)", "sentencepiece (>=0.1.99,<0.2.0)", "transformers[torch] (>=4.33.1,<5.0.0)"] +postgres = ["asyncpg (>=0.28.0,<0.29.0)", "pgvector (>=0.1.0,<0.2.0)", "psycopg2-binary (>=2.9.9,<3.0.0)"] +query-tools = ["guidance (>=0.0.64,<0.0.65)", "jsonpath-ng (>=1.6.0,<2.0.0)", "lm-format-enforcer (>=0.4.3,<0.5.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "scikit-learn", "spacy (>=3.7.1,<4.0.0)"] + +[[package]] +name = "llama-index-llms-openai" +version = "0.1.23" +description = "llama-index llms openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_llms_openai-0.1.23-py3-none-any.whl", hash = "sha256:38753baac823a0459b8f6511258d84020219cb6b223a9866ec526e83ddbc94e1"}, + {file = "llama_index_llms_openai-0.1.23.tar.gz", hash = "sha256:b40289c47fda9df86c8177999d6af0a47fce14fe4324572ea2fe25bbdbd05021"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.24,<0.11.0" + +[[package]] +name = "llama-index-multi-modal-llms-openai" +version = "0.1.6" +description = "llama-index multi-modal-llms openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_multi_modal_llms_openai-0.1.6-py3-none-any.whl", hash = "sha256:0b6950a6cf98d16ade7d3b9dd0821ecfe457ca103819ae6c3e66cfc9634ca646"}, + {file = "llama_index_multi_modal_llms_openai-0.1.6.tar.gz", hash = "sha256:10de75a877a444af35306385faad9b9f0624391e55309970564114a080a0578c"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.1,<0.11.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-program-openai" +version = "0.1.6" +description = "llama-index program openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_program_openai-0.1.6-py3-none-any.whl", hash = "sha256:4660b338503537c5edca1e0dab606af6ce372b4f1b597e2833c6b602447c5d8d"}, + {file = "llama_index_program_openai-0.1.6.tar.gz", hash = "sha256:c6a4980c5ea826088b28b4dee3367edb20221e6d05eb0e05019049190131d772"}, +] + +[package.dependencies] +llama-index-agent-openai = ">=0.1.1,<0.3.0" +llama-index-core = ">=0.10.1,<0.11.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-question-gen-openai" +version = "0.1.3" +description = "llama-index question_gen openai integration" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "llama_index_question_gen_openai-0.1.3-py3-none-any.whl", hash = "sha256:1f83b49e8b2e665030d1ec8c54687d6985d9fa8426147b64e46628a9e489b302"}, + {file = "llama_index_question_gen_openai-0.1.3.tar.gz", hash = "sha256:4486198117a45457d2e036ae60b93af58052893cc7d78fa9b6f47dd47b81e2e1"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.1,<0.11.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" +llama-index-program-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-readers-file" +version = "0.1.25" +description = "llama-index readers file integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_readers_file-0.1.25-py3-none-any.whl", hash = "sha256:bc659e432d441c445e110580340675aa60abae1d82add4f65e559dfe8add541b"}, + {file = "llama_index_readers_file-0.1.25.tar.gz", hash = "sha256:238ddd98aa377d6a44322013eb848056037c80ad84571ea5bf451a640fff4d5c"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.12.3,<5.0.0" +llama-index-core = ">=0.10.37.post1,<0.11.0" +pypdf = ">=4.0.1,<5.0.0" +striprtf = ">=0.0.26,<0.0.27" + +[package.extras] +pymupdf = ["pymupdf (>=1.23.21,<2.0.0)"] + +[[package]] +name = "llama-index-readers-llama-parse" +version = "0.1.4" +description = "llama-index readers llama-parse integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_readers_llama_parse-0.1.4-py3-none-any.whl", hash = "sha256:c4914b37d12cceee56fbd185cca80f87d60acbf8ea7a73f9719610180be1fcdd"}, + {file = "llama_index_readers_llama_parse-0.1.4.tar.gz", hash = "sha256:78608b193c818894aefeee0aa303f02b7f80f2e4caf13866c2fd3b0b1023e2c0"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.7,<0.11.0" +llama-parse = ">=0.4.0,<0.5.0" + +[[package]] +name = "llama-parse" +version = "0.4.4" +description = "Parse files into RAG-Optimized formats." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_parse-0.4.4-py3-none-any.whl", hash = "sha256:bb9724d04fd31ed037000896c7cef7fcb9051325497db4592a15f8144754cd00"}, + {file = "llama_parse-0.4.4.tar.gz", hash = "sha256:b45c2db33a0d6b7a2d5f59e3d0ec7ee7f8227a852eaa56b04aa12b12f2c0d521"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.29" + +[[package]] +name = "lxml" +version = "5.2.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, +] + +[package.dependencies] +lxml-html-clean = {version = "*", optional = true, markers = "extra == \"html-clean\""} + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.10)"] + +[[package]] +name = "lxml-html-clean" +version = "0.1.1" +description = "HTML cleaner from lxml project" +optional = false +python-versions = "*" +files = [ + {file = "lxml_html_clean-0.1.1-py3-none-any.whl", hash = "sha256:58c04176593c9caf72ec92e033d2f38859e918b3eff0cc0f8051ad27dc2ab8ef"}, + {file = "lxml_html_clean-0.1.1.tar.gz", hash = "sha256:8a644ed01dbbe132fabddb9467f077f6dad12a1d4f3a6a553e280f3815fa46df"}, +] + +[package.dependencies] +lxml = "*" + +[[package]] +name = "markdown" +version = "3.6" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, +] + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +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.21.3" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "matplotlib" +version = "3.9.0" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, + {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, + {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, + {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, + {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, + {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, + {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, + {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, + {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, + {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, + {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, + {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, + {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, + {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, + {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, + {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, + {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, + {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, + {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, + {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, + {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, + {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, + {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, + {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, + {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mkl" +version = "2021.4.0" +description = "Intel® oneAPI Math Kernel Library" +optional = false +python-versions = "*" +files = [ + {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, + {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, + {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, +] + +[package.dependencies] +intel-openmp = "==2021.*" +tbb = "==2021.*" + +[[package]] +name = "monotonic" +version = "1.6" +description = "An implementation of time.monotonic() for Python 2 & < 3.3" +optional = false +python-versions = "*" +files = [ + {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"}, + {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"}, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "msal" +version = "1.29.0" +description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." +optional = false +python-versions = ">=3.7" +files = [ + {file = "msal-1.29.0-py3-none-any.whl", hash = "sha256:6b301e63f967481f0cc1a3a3bac0cf322b276855bc1b0955468d9deb3f33d511"}, + {file = "msal-1.29.0.tar.gz", hash = "sha256:8f6725f099752553f9b2fe84125e2a5ebe47b49f92eacca33ebedd3a9ebaae25"}, +] + +[package.dependencies] +cryptography = ">=2.5,<45" +PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} +requests = ">=2.0.0,<3" + +[package.extras] +broker = ["pymsalruntime (>=0.13.2,<0.17)"] + +[[package]] +name = "msg-parser" +version = "1.2.0" +description = "This module enables reading, parsing and converting Microsoft Outlook MSG E-Mail files." +optional = false +python-versions = ">=3.4" +files = [ + {file = "msg_parser-1.2.0-py2.py3-none-any.whl", hash = "sha256:d47a2f0b2a359cb189fad83cc991b63ea781ecc70d91410324273fbf93e95375"}, + {file = "msg_parser-1.2.0.tar.gz", hash = "sha256:0de858d4fcebb6c8f6f028da83a17a20fe01cdce67c490779cf43b3b0162aa66"}, +] + +[package.dependencies] +olefile = ">=0.46" + +[package.extras] +rtf = ["compressed-rtf (>=1.0.5)"] + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "multiprocess" +version = "0.70.16" +description = "better multiprocessing and multithreading in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37b55f71c07e2d741374998c043b9520b626a8dddc8b3129222ca4f1a06ef67a"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba8c31889abf4511c7308a8c52bb4a30b9d590e7f58523302ba00237702ca054"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:0dfd078c306e08d46d7a8d06fb120313d87aa43af60d66da43ffff40b44d2f41"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e7b9d0f307cd9bd50851afaac0dba2cb6c44449efff697df7c7645f7d3f2be3a"}, + {file = "multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02"}, + {file = "multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a"}, + {file = "multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e"}, + {file = "multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435"}, + {file = "multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3"}, + {file = "multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1"}, +] + +[package.dependencies] +dill = ">=0.3.8" + +[[package]] +name = "mypy" +version = "1.10.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, + {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, + {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, + {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, + {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, + {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, + {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, + {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, + {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, + {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, + {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, + {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, + {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, + {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, + {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, + {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, + {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, + {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "newspaper3k" +version = "0.2.8" +description = "Simplified python article discovery & extraction." +optional = false +python-versions = "*" +files = [ + {file = "newspaper3k-0.2.8-py3-none-any.whl", hash = "sha256:44a864222633d3081113d1030615991c3dbba87239f6bbf59d91240f71a22e3e"}, + {file = "newspaper3k-0.2.8.tar.gz", hash = "sha256:9f1bd3e1fb48f400c715abf875cc7b0a67b7ddcd87f50c9aeeb8fcbbbd9004fb"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.4.1" +cssselect = ">=0.9.2" +feedfinder2 = ">=0.0.4" +feedparser = ">=5.2.1" +jieba3k = ">=0.35.1" +lxml = ">=3.6.0" +nltk = ">=3.2.1" +Pillow = ">=3.3.0" +python-dateutil = ">=2.5.3" +PyYAML = ">=3.11" +requests = ">=2.10.0" +tinysegmenter = "0.3" +tldextract = ">=2.0.1" + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, + {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.20.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.5.40" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "olefile" +version = "0.47" +description = "Python package to parse, read and write Microsoft OLE2 files (Structured Storage or Compound Document, Microsoft Office)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "olefile-0.47-py2.py3-none-any.whl", hash = "sha256:543c7da2a7adadf21214938bb79c83ea12b473a4b6ee4ad4bf854e7715e13d1f"}, + {file = "olefile-0.47.zip", hash = "sha256:599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "omegaconf" +version = "2.3.0" +description = "A flexible configuration library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b"}, + {file = "omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7"}, +] + +[package.dependencies] +antlr4-python3-runtime = "==4.9.*" +PyYAML = ">=5.1.0" + +[[package]] +name = "onnx" +version = "1.16.1" +description = "Open Neural Network Exchange" +optional = false +python-versions = ">=3.8" +files = [ + {file = "onnx-1.16.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:bb2d392e5b7060082c2fb38eb5c44f67eb34ff5f0681bd6f45beff9abc6f7094"}, + {file = "onnx-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15abf94a7868eed6db15a8b5024ba570c891cae77ca4d0e7258dabdad76980df"}, + {file = "onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251910e554f811fdd070164b0bc76d76b067b95576cb9dad4d52ae64fe014b5"}, + {file = "onnx-1.16.1-cp310-cp310-win32.whl", hash = "sha256:c11e3b15eee46cd20767e505cc3ba97457ef5ac93c3e459cdfb77943ff8fe9a7"}, + {file = "onnx-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:b3d10405706807ec2ef493b2a78519fa0264cf190363e89478585aac1179b596"}, + {file = "onnx-1.16.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:006ba5059c85ce43e89a1486cc0276d0f1a8ec9c6efd1a9334fd3fa0f6e33b64"}, + {file = "onnx-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1521ea7cd3497ecaf57d3b5e72d637ca5ebca632122a0806a9df99bedbeecdf8"}, + {file = "onnx-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cf20421aeac03872bea5fd6ebf92abe15c4d1461a2572eb839add5059e2a09"}, + {file = "onnx-1.16.1-cp311-cp311-win32.whl", hash = "sha256:f98e275b4f46a617a9c527e60c02531eae03cf67a04c26db8a1c20acee539533"}, + {file = "onnx-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:95aa20aa65a9035d7543e81713e8b0f611e213fc02171959ef4ee09311d1bf28"}, + {file = "onnx-1.16.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:32e11d39bee04f927fab09f74c46cf76584094462311bab1aca9ccdae6ed3366"}, + {file = "onnx-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8884bf53b552873c0c9b072cb8625e7d4e8f3cc0529191632d24e3de58a3b93a"}, + {file = "onnx-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595b2830093f81361961295f7b0ebb6000423bcd04123d516d081c306002e387"}, + {file = "onnx-1.16.1-cp312-cp312-win32.whl", hash = "sha256:2fde4dd5bc278b3fc8148f460bce8807b2874c66f48529df9444cdbc9ecf456b"}, + {file = "onnx-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:e69ad8c110d8c37d759cad019d498fdf3fd24e0bfaeb960e52fed0469a5d2974"}, + {file = "onnx-1.16.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0fc189195a40b5862fb77d97410c89823197fe19c1088ce150444eec72f200c1"}, + {file = "onnx-1.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:496ba17b16a74711081772e1b03f3207959972e351298e51abdc600051027a22"}, + {file = "onnx-1.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3faf239b48418b3ea6fe73bd4d86807b903d0b2ebd20b8b8c84f83741b0f18"}, + {file = "onnx-1.16.1-cp38-cp38-win32.whl", hash = "sha256:18b22143836838591f6551b089196e69f60c47fabce52b4b72b4cb37522645aa"}, + {file = "onnx-1.16.1-cp38-cp38-win_amd64.whl", hash = "sha256:8c2b70d602acfb90056fbdc60ef26f4658f964591212a4e9dbbda922ff43061b"}, + {file = "onnx-1.16.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2bed6fe05905b073206cabbb4463c58050cf8d544192303c09927b229f93ac14"}, + {file = "onnx-1.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5798414332534a41404a7ff83677d49ced01d70160e1541484cce647f2295051"}, + {file = "onnx-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa7518d6d27f357261a4014079dec364cad6fef827d0b3fe1d3ff59939a68394"}, + {file = "onnx-1.16.1-cp39-cp39-win32.whl", hash = "sha256:67f372db4fe8fe61e00b762af5b0833aa72b5baa37e7e2f47d8668964ebff411"}, + {file = "onnx-1.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c059fea6229c44d2d39c8f6e2f2f0d676d587c97f4c854c86f3e7bc97e0b31c"}, + {file = "onnx-1.16.1.tar.gz", hash = "sha256:8299193f0f2a3849bfc069641aa8e4f93696602da8d165632af8ee48ec7556b6"}, +] + +[package.dependencies] +numpy = ">=1.20" +protobuf = ">=3.20.2" + +[package.extras] +reference = ["Pillow", "google-re2"] + +[[package]] +name = "onnxruntime" +version = "1.15.1" +description = "ONNX Runtime is a runtime accelerator for Machine Learning models" +optional = false +python-versions = "*" +files = [ + {file = "onnxruntime-1.15.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:baad59e6a763237fa39545325d29c16f98b8a45d2dfc524c67631e2e3ba44d16"}, + {file = "onnxruntime-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:568c2db848f619a0a93e843c028e9fb4879929d40b04bd60f9ba6eb8d2e93421"}, + {file = "onnxruntime-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69088d7784bb04dedfd9e883e2c96e4adf8ae0451acdd0abb78d68f59ecc6d9d"}, + {file = "onnxruntime-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cef43737b2cd886d5d718d100f56ec78c9c476c5db5f8f946e95024978fe754"}, + {file = "onnxruntime-1.15.1-cp310-cp310-win32.whl", hash = "sha256:79d7e65abb44a47c633ede8e53fe7b9756c272efaf169758c482c983cca98d7e"}, + {file = "onnxruntime-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:8bc4c47682933a7a2c79808688aad5f12581305e182be552de50783b5438e6bd"}, + {file = "onnxruntime-1.15.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:652b2cb777f76446e3cc41072dd3d1585a6388aeff92b9de656724bc22e241e4"}, + {file = "onnxruntime-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89b86dbed15740abc385055a29c9673a212600248d702737ce856515bdeddc88"}, + {file = "onnxruntime-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed5cdd9ee748149a57f4cdfa67187a0d68f75240645a3c688299dcd08742cc98"}, + {file = "onnxruntime-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f748cce6a70ed38c19658615c55f4eedb9192765a4e9c4bd2682adfe980698d"}, + {file = "onnxruntime-1.15.1-cp311-cp311-win32.whl", hash = "sha256:e0312046e814c40066e7823da58075992d51364cbe739eeeb2345ec440c3ac59"}, + {file = "onnxruntime-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:f0980969689cb956c22bd1318b271e1be260060b37f3ddd82c7d63bd7f2d9a79"}, + {file = "onnxruntime-1.15.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:345986cfdbd6f4b20a89b6a6cd9abd3e2ced2926ae0b6e91fefa8149f95c0f09"}, + {file = "onnxruntime-1.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d7b3ad75e040f1e95757f69826a11051737b31584938a26d466a0234c6de98"}, + {file = "onnxruntime-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3603d07b829bcc1c14963a76103e257aade8861eb208173b300cc26e118ec2f8"}, + {file = "onnxruntime-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3df0625b9295daf1f7409ea55f72e1eeb38d54f5769add53372e79ddc3cf98d"}, + {file = "onnxruntime-1.15.1-cp38-cp38-win32.whl", hash = "sha256:f68b47fdf1a0406c0292f81ac993e2a2ae3e8b166b436d590eb221f64e8e187a"}, + {file = "onnxruntime-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:52d762d297cc3f731f54fa65a3e329b813164970671547bef6414d0ed52765c9"}, + {file = "onnxruntime-1.15.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:99228f9f03dc1fc8af89a28c9f942e8bd3e97e894e263abe1a32e4ddb1f6363b"}, + {file = "onnxruntime-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:45db7f96febb0cf23e3af147f35c4f8de1a37dd252d1cef853c242c2780250cd"}, + {file = "onnxruntime-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bafc112a36db25c821b90ab747644041cb4218f6575889775a2c12dd958b8c3"}, + {file = "onnxruntime-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:985693d18f2d46aa34fd44d7f65ff620660b2c8fa4b8ec365c2ca353f0fbdb27"}, + {file = "onnxruntime-1.15.1-cp39-cp39-win32.whl", hash = "sha256:708eb31b0c04724bf0f01c1309a9e69bbc09b85beb750e5662c8aed29f1ff9fd"}, + {file = "onnxruntime-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:73d6de4c42dfde1e9dbea04773e6dc23346c8cda9c7e08c6554fafc97ac60138"}, +] + +[package.dependencies] +coloredlogs = "*" +flatbuffers = "*" +numpy = ">=1.21.6" +packaging = "*" +protobuf = "*" +sympy = "*" + +[[package]] +name = "openai" +version = "1.35.3" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.35.3-py3-none-any.whl", hash = "sha256:7b26544cef80f125431c073ffab3811d2421fbb9e30d3bd5c2436aba00b042d5"}, + {file = "openai-1.35.3.tar.gz", hash = "sha256:d6177087f150b381d49499be782d764213fdf638d391b29ca692b84dd675a389"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "opencv-python" +version = "4.10.0.84" +description = "Wrapper package for OpenCV python bindings." +optional = false +python-versions = ">=3.6" +files = [ + {file = "opencv-python-4.10.0.84.tar.gz", hash = "sha256:72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:71e575744f1d23f79741450254660442785f45a0797212852ee5199ef12eed98"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09a332b50488e2dda866a6c5573ee192fe3583239fb26ff2f7f9ceb0bc119ea6"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ace140fc6d647fbe1c692bcb2abce768973491222c067c131d80957c595b71f"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win32.whl", hash = "sha256:2db02bb7e50b703f0a2d50c50ced72e95c574e1e5a0bb35a8a86d0b35c98c236"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win_amd64.whl", hash = "sha256:32dbbd94c26f611dc5cc6979e6b7aa1f55a64d6b463cc1dcd3c95505a63e48fe"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] + +[[package]] +name = "openpyxl" +version = "3.1.4" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "openpyxl-3.1.4-py2.py3-none-any.whl", hash = "sha256:ec17f6483f2b8f7c88c57e5e5d3b0de0e3fb9ac70edc084d28e864f5b33bbefd"}, + {file = "openpyxl-3.1.4.tar.gz", hash = "sha256:8d2c8adf5d20d6ce8f9bca381df86b534835e974ed0156dacefa76f68c1d69fb"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] + +[package.extras] +dev = ["black", "mypy", "pytest"] + +[[package]] +name = "orjson" +version = "3.10.5" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "1.5.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] + +[package.dependencies] +numpy = {version = ">=1.23.2", markers = "python_version >= \"3.11\""} +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "pandasai" +version = "2.2.6" +description = "Chat with your database (SQL, CSV, pandas, polars, mongodb, noSQL, etc). PandasAI makes data analysis conversational using LLMs (GPT 3.5 / 4, Anthropic, VertexAI) and RAG." +optional = false +python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,!=3.8.*,>=3.9" +files = [ + {file = "pandasai-2.2.6-py3-none-any.whl", hash = "sha256:b4577a72644f745926cb414a8b085ee9fbef75ea3a08156694e27e67e0d78e9b"}, + {file = "pandasai-2.2.6.tar.gz", hash = "sha256:d6cfec3feba499f905cfd6340f0a2efcf8ed3569fa61588238686ab80fc2cfc5"}, +] + +[package.dependencies] +astor = ">=0.8.1,<0.9.0" +duckdb = "<1" +faker = ">=19.12.0,<20.0.0" +jinja2 = ">=3.1.3,<4.0.0" +matplotlib = ">=3.7.1,<4.0.0" +openai = "<2" +pandas = "1.5.3" +pillow = ">=10.1.0,<11.0.0" +pydantic = ">=1,<3" +python-dotenv = ">=1.0.0,<2.0.0" +requests = ">=2.31.0,<3.0.0" +scipy = ">=1.9.0,<2.0.0" +sqlalchemy = ">=1.4,<3" +sqlglot = {version = ">=25.0.3,<26.0.0", extras = ["rs"]} + +[package.extras] +bedrock = ["boto3 (>=1.34.59)"] +chromadb = ["chromadb (>=0.4.22,<0.5.0)"] +connectors = ["cx-Oracle (>=8.3.0,<9.0.0)", "psycopg2-binary (>=2.9.7,<3.0.0)", "pymysql (>=1.1.0,<2.0.0)", "snowflake-sqlalchemy (>=1.5.0,<2.0.0)", "sqlalchemy-bigquery (>=1.8.0,<2.0.0)", "sqlalchemy-cockroachdb (>=2.0.2,<3.0.0)", "sqlalchemy-databricks (>=0.2.0,<0.3.0)"] +excel = ["openpyxl (>=3.0.7,<4.0.0)"] +flask = ["flask (>=3.0.2,<4.0.0)"] +ggplot = ["ggplot (>=0.11.5,<0.12.0)"] +google-ai = ["google-cloud-aiplatform (>=1.26.1,<2.0.0)", "google-generativeai (>=0.3.2,<0.4.0)"] +google-sheets = ["beautifulsoup4 (>=4.12.2,<5.0.0)"] +ibm-watsonx-ai = ["ibm-watsonx-ai (>=0.2.3,<0.3.0)"] +langchain = ["langchain (>=0.1.0,<0.2.0)"] +modin = ["modin[ray] (==0.18.1)"] +numpy = ["numpy (>=1.17,<2.0)"] +pinecone = ["pinecone-client (>=4.1.0,<5.0.0)"] +plotly = ["kaleido (==0.2.0)", "plotly (>=5.15.0,<6.0.0)"] +polars = ["polars (>=0.18.15,<0.19.0)"] +qdrant = ["qdrant-client[fastembed] (>=1.8.0,<2.0.0)"] +scikit-learn = ["scikit-learn (>=1.2.2,<2.0.0)"] +seaborn = ["seaborn (>=0.12.2,<0.13.0)"] +statsmodels = ["statsmodels (>=0.14.0,<0.15.0)"] +streamlit = ["streamlit (>=1.23.1,<2.0.0)"] +text-generation = ["text-generation (>=0.6.0)"] +yfinance = ["yfinance (>=0.2.28,<0.3.0)"] + +[[package]] +name = "parameterized" +version = "0.9.0" +description = "Parameterized testing with any Python test framework" +optional = false +python-versions = ">=3.7" +files = [ + {file = "parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b"}, + {file = "parameterized-0.9.0.tar.gz", hash = "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1"}, +] + +[package.extras] +dev = ["jinja2"] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pdf2image" +version = "1.17.0" +description = "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list." +optional = false +python-versions = "*" +files = [ + {file = "pdf2image-1.17.0-py3-none-any.whl", hash = "sha256:ecdd58d7afb810dffe21ef2b1bbc057ef434dabbac6c33778a38a3f7744a27e2"}, + {file = "pdf2image-1.17.0.tar.gz", hash = "sha256:eaa959bc116b420dd7ec415fcae49b98100dda3dd18cd2fdfa86d09f112f6d57"}, +] + +[package.dependencies] +pillow = "*" + +[[package]] +name = "pdfminer-six" +version = "20231228" +description = "PDF parser and analyzer" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pdfminer.six-20231228-py3-none-any.whl", hash = "sha256:e8d3c3310e6fbc1fe414090123ab01351634b4ecb021232206c4c9a8ca3e3b8f"}, + {file = "pdfminer.six-20231228.tar.gz", hash = "sha256:6004da3ad1a7a4d45930cb950393df89b068e73be365a6ff64a838d37bcb08c4"}, +] + +[package.dependencies] +charset-normalizer = ">=2.0.0" +cryptography = ">=36.0.0" + +[package.extras] +dev = ["black", "mypy (==0.931)", "nox", "pytest"] +docs = ["sphinx", "sphinx-argparse"] +image = ["Pillow"] + +[[package]] +name = "pdfplumber" +version = "0.11.1" +description = "Plumb a PDF for detailed information about each char, rectangle, and line." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pdfplumber-0.11.1-py3-none-any.whl", hash = "sha256:8f3f087001fc3ec72d2c8be23d4ad59a763356e70d659a9180b5250919a3e5a8"}, + {file = "pdfplumber-0.11.1.tar.gz", hash = "sha256:cb95b4369fa94c3901bc6bce89d81e098afd2bd8d88e0d9706152f4c57e82349"}, +] + +[package.dependencies] +"pdfminer.six" = "20231228" +Pillow = ">=9.1" +pypdfium2 = ">=4.18.0" + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pikepdf" +version = "9.0.0" +description = "Read and write PDFs with Python, powered by qpdf" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pikepdf-9.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:c0851e88c21f13ddce16655e9f0ca9e8d684d3d362b370917d282f70b465aece"}, + {file = "pikepdf-9.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:36cfa4e415539ee9d9bf389ab5f1a46b351334ad4bac47d978850f7d954a4f7c"}, + {file = "pikepdf-9.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b124471b1ab5635062fd0586c8c633a1cafb2ddb3168287ec3acce3e23395c9d"}, + {file = "pikepdf-9.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcdc0d02a92a727740ef84d2f7512e05ea36657e132674764d303c60f3298a1f"}, + {file = "pikepdf-9.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e89f7a00742315198fce5e0c9597ecad5f475bc88129afc07677cdf72a00e3ba"}, + {file = "pikepdf-9.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8a3fb77c77d3d93ea14fcb57d5365845cf064009b5125605abd9344a35cd73ae"}, + {file = "pikepdf-9.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a96f7fc82cde95511d28a9a4e4eb1277a3e600859a7405aabb9692f280e762eb"}, + {file = "pikepdf-9.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:3936ba5492bda7fea840f2d17d4f720ce3e7fb8dc30c8d7c72ae6712571642f9"}, + {file = "pikepdf-9.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ac4310b751fb71e136a7bd613a2b4060823423fbe481d968e19c9a3425353346"}, + {file = "pikepdf-9.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e68aa6717d2faaa193aa41f2b00af9e205164a7e852e900019955776f3c62e8"}, + {file = "pikepdf-9.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18534b8b2d9e4d16fa97433e6f0b10dc6eaf8a743608e5313b2a0f6c0ceadd2f"}, + {file = "pikepdf-9.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b794d2ada55062d3a1c1c2cbbe8d6d054e8316547977a7b9a1027e66e14e1e99"}, + {file = "pikepdf-9.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1618ace0625a91ed4841a67ff70b1f8b59bab6389fcbd4c1611352e0b3fc55e"}, + {file = "pikepdf-9.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:81711d03207ae92e4db2300d12e16e19570383c7f62bb75a1d6194fc753655a9"}, + {file = "pikepdf-9.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:2ddb0eade682ed0c3a2270db3741dca7a19e85d8d09d9227525d4343a21e084b"}, + {file = "pikepdf-9.0.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:d49cd2bada9cb9f849bc3d5f09b89c3e29e9629d4f234218eb59d749c0b8a4f8"}, + {file = "pikepdf-9.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db53bacda92bf80686e962111b3eaf24322880e039ba7452663bea404df625a3"}, + {file = "pikepdf-9.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e2fdfb216f1d03da1b46d683abcf73611a1972f1808e182d07f9362ad28c7b7"}, + {file = "pikepdf-9.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:447938e30fa22461da340a0a7adbd3c90c0a7f68051dd1b0b9b7c6f64fb17dfe"}, + {file = "pikepdf-9.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41a71dfd567eeddd9bd43bba99bf2fd48acd2057486e9ed07399f8ab1a19486e"}, + {file = "pikepdf-9.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:2b17d0a0f64cf886bc975458da0e8e5b81ea0c40f1909c5aefa6da550d7cc9db"}, + {file = "pikepdf-9.0.0-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:088491103d5e167c7906ead59c1b7310bb98a5a74228ca76b1e9c190b3086f03"}, + {file = "pikepdf-9.0.0-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:f80d6d40fc6dc17eb4a7ed532a9cffc55d5ad2ee12dd50ccd01c678978ab74b0"}, + {file = "pikepdf-9.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be94c2e5ab6621b95e0377ef2e707722419aa478bbf47cc1d83f98c8e6a9fd2"}, + {file = "pikepdf-9.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4af5c18a2ddbd5f16b0b35f4693edff68cbf69aecf19773b90f12804af4fc6e4"}, + {file = "pikepdf-9.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:19f5fa063a76cbde5f3e39f785131afdd2336aae7a3b5bb8ae0fbbe377a8c3e3"}, + {file = "pikepdf-9.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:e16b1b7b9727b22e51b46240a17ab3c7afef79cff9391d4fe16b3b3f53d434d4"}, + {file = "pikepdf-9.0.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:23196e1437acd72dd90989ebd2c21deb39e7602203dd7faad2acf9e12242f02d"}, + {file = "pikepdf-9.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47145a7f564b123cc3d0f2a1b72bfe96defb42441534e3ec8697f3e7163398de"}, + {file = "pikepdf-9.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c19d9d0d3703e35a0d4a75a81208360ae3eaec47b86bf92a0395f5c0a0fabad"}, + {file = "pikepdf-9.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:979e9a878b222fa1a5cfd37c9b2a49056f51f7ba0bf8e1c2f26f4520d8fd2abf"}, + {file = "pikepdf-9.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:416c0d3d8a927a5213ed71c5529f98e4c9fef489588e1af434c955a4bb66f5f3"}, + {file = "pikepdf-9.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b8d374a91d7a1e92f0b3b7e1e5e00cfb0f324562200b991b719e037f5cc6ed54"}, + {file = "pikepdf-9.0.0-pp310-pypy310_pp73-macosx_12_0_x86_64.whl", hash = "sha256:cae32c7294caab59f5b14ecc36f1340cb471f19f7199f33997a0bbc102a08b61"}, + {file = "pikepdf-9.0.0-pp310-pypy310_pp73-macosx_14_0_arm64.whl", hash = "sha256:d2fd3686ac5dd6a3889459b0fdd86f3254077dc74ce225de20e4c282e4a2d19a"}, + {file = "pikepdf-9.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc45f05a72697199539c985cb07ff216a40bf1eb95a5b42205d1c8808d63e332"}, + {file = "pikepdf-9.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b2e18cab189d45457b4a4d2ee1f823be4ccdeff8fafd0150b2a0332863f1a9a6"}, + {file = "pikepdf-9.0.0-pp39-pypy39_pp73-macosx_12_0_x86_64.whl", hash = "sha256:110c1509e2dfcf3a6375f3012342973d5fc7ea8fe5c4db0a0940c69f1b86d6d3"}, + {file = "pikepdf-9.0.0-pp39-pypy39_pp73-macosx_14_0_arm64.whl", hash = "sha256:8f5c8b4ef2f96b3d319c0b2600c21d277cf4d3e4173240ea174b0472d7d39650"}, + {file = "pikepdf-9.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e48a7d120a17961229fe10392158d5a93c60d98261d4b129a4381413b5e7eb1"}, + {file = "pikepdf-9.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9ea9d134220cc72d7c60010b9d6ca807369900e477aeede39b69c8fbbae3b51b"}, + {file = "pikepdf-9.0.0.tar.gz", hash = "sha256:40f37da54bc02f3714c17454e1aee28d02fdc28ea0b7903240eae9d53c360b2b"}, +] + +[package.dependencies] +Deprecated = "*" +lxml = ">=4.8" +packaging = "*" +Pillow = ">=10.0.1" + +[package.extras] +dev = ["pre-commit", "typer[all]"] +docs = ["Sphinx (>=3)", "sphinx-autoapi", "sphinx-design", "sphinx-issues", "sphinx-rtd-theme", "tomli"] +mypy = ["lxml-stubs", "types-Pillow", "types-requests", "types-setuptools"] +test = ["attrs (>=20.2.0)", "coverage[toml]", "hypothesis (>=6.36)", "numpy (>=1.21.0)", "psutil (>=5.9)", "pybind11", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)", "pytest-timeout (>=2.1.0)", "pytest-xdist (>=2.5.0)", "python-dateutil (>=2.8.1)", "python-xmp-toolkit (>=2.0.1)", "tomli"] + +[[package]] +name = "pillow" +version = "10.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "playwright" +version = "1.44.0" +description = "A high-level API to automate web browsers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "playwright-1.44.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:c2317a80896796fdeb03d60f06cc229e775ff2e19b80c64b1bb9b29c8a59d992"}, + {file = "playwright-1.44.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54d44fb634d870839301c2326e1e12a178a1be0de76d0caaec230ab075c2e077"}, + {file = "playwright-1.44.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:64b67194e73b47ae72acf25f1a9cfacfef38ca2b52e4bb8b0abd385c5deeaadf"}, + {file = "playwright-1.44.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:29161b1fae71f7c402df5b15f0bd3deaeecd8b3d1ecd9ff01271700c66210e7b"}, + {file = "playwright-1.44.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8c8a3bfea17576d3f94a2363eee195cbda8dbba86975588c7eaac7792b25eee"}, + {file = "playwright-1.44.0-py3-none-win32.whl", hash = "sha256:235e37832deaa9af8a629d09955396259ab757533cc1922f9b0308b4ee0d9cdf"}, + {file = "playwright-1.44.0-py3-none-win_amd64.whl", hash = "sha256:5b8a4a1d4d50f4ff99b47965576322a8c4e34631854b862a25c1feb824be22a8"}, +] + +[package.dependencies] +greenlet = "3.0.3" +pyee = "11.1.0" + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "portalocker" +version = "2.10.0" +description = "Wraps the portalocker recipe for easy usage" +optional = false +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.10.0-py3-none-any.whl", hash = "sha256:48944147b2cd42520549bc1bb8fe44e220296e56f7c3d551bc6ecce69d9b0de1"}, + {file = "portalocker-2.10.0.tar.gz", hash = "sha256:49de8bc0a2f68ca98bf9e219c81a3e6b27097c7bf505a87c5a112ce1aaeb9b81"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + +[[package]] +name = "postgrest" +version = "0.16.8" +description = "PostgREST client for Python. This library provides an ORM interface to PostgREST." +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "postgrest-0.16.8-py3-none-any.whl", hash = "sha256:c353a24452f51ab9760cf2b884c4b7457a2653ff36444e66b12615bc4cc8e23e"}, + {file = "postgrest-0.16.8.tar.gz", hash = "sha256:7b3802a514dc1e0fc8b5bbdeb2c99af35a0bd910e4ddb17855ca4e3422350c84"}, +] + +[package.dependencies] +deprecation = ">=2.1.0,<3.0.0" +httpx = ">=0.24,<0.28" +pydantic = ">=1.9,<3.0" +strenum = ">=0.4.9,<0.5.0" + +[[package]] +name = "posthog" +version = "3.5.0" +description = "Integrate PostHog into any python application." +optional = false +python-versions = "*" +files = [ + {file = "posthog-3.5.0-py2.py3-none-any.whl", hash = "sha256:3c672be7ba6f95d555ea207d4486c171d06657eb34b3ce25eb043bfe7b6b5b76"}, + {file = "posthog-3.5.0.tar.gz", hash = "sha256:8f7e3b2c6e8714d0c0c542a2109b83a7549f63b7113a133ab2763a89245ef2ef"}, +] + +[package.dependencies] +backoff = ">=1.10.0" +monotonic = ">=1.5" +python-dateutil = ">2.1" +requests = ">=2.7,<3.0" +six = ">=1.5" + +[package.extras] +dev = ["black", "flake8", "flake8-print", "isort", "pre-commit"] +sentry = ["django", "sentry-sdk"] +test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint", "pytest", "pytest-timeout"] + +[[package]] +name = "pre-commit" +version = "3.7.1" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, + {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prometheus-client" +version = "0.20.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.47" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "proto-plus" +version = "1.24.0" +description = "Beautiful, Pythonic protocol buffers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, + {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<6.0.0dev" + +[package.extras] +testing = ["google-api-core (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "5.27.1" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.27.1-cp310-abi3-win32.whl", hash = "sha256:3adc15ec0ff35c5b2d0992f9345b04a540c1e73bfee3ff1643db43cc1d734333"}, + {file = "protobuf-5.27.1-cp310-abi3-win_amd64.whl", hash = "sha256:25236b69ab4ce1bec413fd4b68a15ef8141794427e0b4dc173e9d5d9dffc3bcd"}, + {file = "protobuf-5.27.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4e38fc29d7df32e01a41cf118b5a968b1efd46b9c41ff515234e794011c78b17"}, + {file = "protobuf-5.27.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:917ed03c3eb8a2d51c3496359f5b53b4e4b7e40edfbdd3d3f34336e0eef6825a"}, + {file = "protobuf-5.27.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:ee52874a9e69a30271649be88ecbe69d374232e8fd0b4e4b0aaaa87f429f1631"}, + {file = "protobuf-5.27.1-cp38-cp38-win32.whl", hash = "sha256:7a97b9c5aed86b9ca289eb5148df6c208ab5bb6906930590961e08f097258107"}, + {file = "protobuf-5.27.1-cp38-cp38-win_amd64.whl", hash = "sha256:f6abd0f69968792da7460d3c2cfa7d94fd74e1c21df321eb6345b963f9ec3d8d"}, + {file = "protobuf-5.27.1-cp39-cp39-win32.whl", hash = "sha256:dfddb7537f789002cc4eb00752c92e67885badcc7005566f2c5de9d969d3282d"}, + {file = "protobuf-5.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:39309898b912ca6febb0084ea912e976482834f401be35840a008da12d189340"}, + {file = "protobuf-5.27.1-py3-none-any.whl", hash = "sha256:4ac7249a1530a2ed50e24201d6630125ced04b30619262f06224616e0030b6cf"}, + {file = "protobuf-5.27.1.tar.gz", hash = "sha256:df5e5b8e39b7d1c25b186ffdf9f44f40f810bbcc9d2b71d9d3156fee5a9adf15"}, +] + +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "pyarrow" +version = "16.1.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-16.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9"}, + {file = "pyarrow-16.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd"}, + {file = "pyarrow-16.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b"}, + {file = "pyarrow-16.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7"}, + {file = "pyarrow-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed"}, + {file = "pyarrow-16.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3"}, + {file = "pyarrow-16.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a"}, + {file = "pyarrow-16.1.0.tar.gz", hash = "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + +[[package]] +name = "pyarrow-hotfix" +version = "0.6" +description = "" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyarrow_hotfix-0.6-py3-none-any.whl", hash = "sha256:dcc9ae2d220dff0083be6a9aa8e0cdee5182ad358d4931fce825c545e5c89178"}, + {file = "pyarrow_hotfix-0.6.tar.gz", hash = "sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + +[[package]] +name = "pycocotools" +version = "2.0.8" +description = "Official APIs for the MS-COCO dataset" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pycocotools-2.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a66886f45b04cee1ff0492e9f5e25d430d8aa3eb63e63c4ebc620945caa11b9"}, + {file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257130b65b7b0f122ce1ed62942867ca9789e56a68109682796cc85c9770c74a"}, + {file = "pycocotools-2.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:663c14cd471913aabecb17ddb52b3b254a65dcaba26ccfea408c52c75cc3862c"}, + {file = "pycocotools-2.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:35a6ef931448632efe1c83eb2ac3c37c53b3c080a5432bc6ff1858944a603a2d"}, + {file = "pycocotools-2.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e7b4ee8b15539d6f789857faefe7d3eef81755f7b17f60903798524e4f321a5c"}, + {file = "pycocotools-2.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:889edd2dbf61f4d2fe77c2e8e5608476903d1911d2ed00f9911354eff23f2423"}, + {file = "pycocotools-2.0.8-cp310-cp310-win_arm64.whl", hash = "sha256:52e06a833fad735485cad5c1f8fe40e2b586261b2856806b5d6923b0b5a3c971"}, + {file = "pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd"}, + {file = "pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc"}, + {file = "pycocotools-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5968a1e5421719af9eb7ccee4c540bfb18b1fc95d30d9a48571d0aaeb159a1ae"}, + {file = "pycocotools-2.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:59eb7b1839f269262456347b6fe2bb88a8be56b32d87fab946483746e1f18a07"}, + {file = "pycocotools-2.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:05480f731fcd7c5d05389081f84198f3b8117f4560227185bc462cccb5c79181"}, + {file = "pycocotools-2.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:e680e27e58b840c105fa09a3bb1d91706038c5c8d7b7bf09c2e5ecbd1b05ad7f"}, + {file = "pycocotools-2.0.8-cp311-cp311-win_arm64.whl", hash = "sha256:16c5a1d2c8726149b5a0e6fe95095ffc172d4012ece5dee9b5beeef708fc0284"}, + {file = "pycocotools-2.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:dd4616621d062882db677de5c64b1b0f6efbcaed9fd284b61e7ba4b16ab24d7a"}, + {file = "pycocotools-2.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5683ba2612c39094a2e8453d40349768a3da6673376786651481d6f553ff7b50"}, + {file = "pycocotools-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b89f399eb851d18f68dfa7f126380394ec0820915c7b3831dd37563bc58daa95"}, + {file = "pycocotools-2.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e6d528c4f35580347ee3cd57f92cf0926e9b6a688d0904b2ea8a814ae2e57a47"}, + {file = "pycocotools-2.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56bbe8be608def61da0b4430562b8d5ff14525f509631a667cfd8405325193da"}, + {file = "pycocotools-2.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:d004033e760a172b2ccbdf4a62d20d2bcf0c9b40dc3c0d1d724045b0a6944862"}, + {file = "pycocotools-2.0.8-cp312-cp312-win_arm64.whl", hash = "sha256:87853ca11e9b130e461d6b5284ea475efe35429060a915844e1998d206ba028e"}, + {file = "pycocotools-2.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b432353a20ce9dd44d85d093c4520fa941cd6cd8a5346443f2056eb0cbdae2b"}, + {file = "pycocotools-2.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b53d36452ec0f1069d94a311aea051a36e8c7f8f63411db372e0ac89e826149"}, + {file = "pycocotools-2.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aba650cc2e0472cc773a994f196c24937c8da1be87e02e72c180c8144aea11f"}, + {file = "pycocotools-2.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a7029806ceea48379ee2f33cc33d79bbaf64b627df444641f123a00f70e8609a"}, + {file = "pycocotools-2.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fa750afead393671f6c6e40e22d8fd197157f9fa5ee1fa4aba325bbe86c0de1b"}, + {file = "pycocotools-2.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:5ecb969dd07390b593893dbc45fc361d9b1f2cb3abd5dc7ff68afb0803f71b29"}, + {file = "pycocotools-2.0.8-cp39-cp39-win_arm64.whl", hash = "sha256:26b329c27e42e092f412faa5ff5bf6e1c4286a8e1709e474b640d356d1d0ae07"}, + {file = "pycocotools-2.0.8.tar.gz", hash = "sha256:8f2bcedb786ba26c367a3680f9c4eb5b2ad9dccb2b34eaeb205e0a021e1dfb8d"}, +] + +[package.dependencies] +matplotlib = ">=2.1.0" +numpy = "*" + +[[package]] +name = "pycodestyle" +version = "2.12.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.12.0-py2.py3-none-any.whl", hash = "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4"}, + {file = "pycodestyle-2.12.0.tar.gz", hash = "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pycurl" +version = "7.45.3" +description = "PycURL -- A Python Interface To The cURL library" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pycurl-7.45.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86f66d334deaaab20a576fb785587566081407adc703318203fe26e43277ef12"}, + {file = "pycurl-7.45.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:205983e87d6aa0b6e93ec7320060de44efaa905ecc5d13f70cbe38c65684c5c4"}, + {file = "pycurl-7.45.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbd4a6b8654b779089c5a44af1c65c1419c2cd60718780df6d8f354eb35d6d55"}, + {file = "pycurl-7.45.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:5ebc6a0ac60c371a9efaf7d55dec5820f76fdafb43a3be1e390011339dc329ae"}, + {file = "pycurl-7.45.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:2facab1c35600088cb82b5b093bd700bfbd1e3191deab24f7d1803d9dc5b76fc"}, + {file = "pycurl-7.45.3-cp310-cp310-win32.whl", hash = "sha256:7cfca02d70579853041063e53ca713d31161b8831b98d4f68c3554dc0448beec"}, + {file = "pycurl-7.45.3-cp310-cp310-win_amd64.whl", hash = "sha256:8451e8475051f16eb4776380384699cb8ddd10ea8410bcbfaee5a6fc4c046de6"}, + {file = "pycurl-7.45.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1610cc45b5bc8b39bc18b981d0473e59ef41226ee467eaa8fbfc7276603ef5af"}, + {file = "pycurl-7.45.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c854885398410fa6e88fc29f7a420a3c13b88bae9b4e10a804437b582e24f58b"}, + {file = "pycurl-7.45.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:921c9db0c3128481954f625b3b1bc10c730100aa944d54643528f716676439ee"}, + {file = "pycurl-7.45.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:483f3aa5d1bc8cff5657ad96f68e1d89281f971a7b6aa93408a31e3199981ea9"}, + {file = "pycurl-7.45.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1e0d32d6ed3a7ba13dbbd3a6fb50ca76c40c70e6bc6fe347f90677478d3422c7"}, + {file = "pycurl-7.45.3-cp311-cp311-win32.whl", hash = "sha256:beaaa4450e23d41dd0c2f2f47a4f8a171210271543550c2c556090c7eeea88f5"}, + {file = "pycurl-7.45.3-cp311-cp311-win_amd64.whl", hash = "sha256:dd33fd9de8907a6275c70113124aeb7eea672c1324f5d5423f203738b341697d"}, + {file = "pycurl-7.45.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0c41a172d5e8a5cdd8328cc8134f47b2a57960ac677f7cda8520eaa9fbe7d990"}, + {file = "pycurl-7.45.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13006b62c157bb4483c58e1abdced6df723c9399255a4f5f6bb7f8e425106679"}, + {file = "pycurl-7.45.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27f4c5c20c86a9a823677316724306fb1ce3b25ec568efd52026dc6c563e5b29"}, + {file = "pycurl-7.45.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c2c246bc29e8762ff4c8a833ac5b4da4c797d16ab138286e8aec9b0c0a0da2d4"}, + {file = "pycurl-7.45.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3d07c5daef2d0d85949e32ec254ee44232bb57febb0634194379dd14d1ff4f87"}, + {file = "pycurl-7.45.3-cp312-cp312-win32.whl", hash = "sha256:9f7afe5ef0e4750ac4515baebc251ee94aaefe5de6e2e8a24668473128d69904"}, + {file = "pycurl-7.45.3-cp312-cp312-win_amd64.whl", hash = "sha256:3648ed9a57a6b704673faeab3dc64d1469cc69f2bc1ed8227ffa0f84e147c500"}, + {file = "pycurl-7.45.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c0915ea139f66a289edc4f9de10cb45078af1bb950491c5612969864236a2e7e"}, + {file = "pycurl-7.45.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43c5e61a58783ddf78ef84949f6bb6e52e092a13ec67678e9a9e21071ecf5b80"}, + {file = "pycurl-7.45.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf613844a1647fe3d2bba1f5c9c96a62a85280123a57a8a0c8d2f37d518bc10a"}, + {file = "pycurl-7.45.3-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:936afd9c5ff7fe7457065e878a279811787778f472f9a4e8c5df79e7728358e2"}, + {file = "pycurl-7.45.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:dbf816a6d0cb71e7fd06609246bbea4eaf100649d9decf49e4eb329594f70be7"}, + {file = "pycurl-7.45.3-cp38-cp38-win32.whl", hash = "sha256:2c8a2ce568193f9f84763717d8961cec0db4ec1aa08c6bcf4d90da5eb72bec86"}, + {file = "pycurl-7.45.3-cp38-cp38-win_amd64.whl", hash = "sha256:80ac7c17e69ca6b76ccccb4255f7c29a2a36e5b69eb10c2adba82135d43afe8c"}, + {file = "pycurl-7.45.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fa7751b614d9aa82d7a0f49ca90924c29c6cedf85a2f8687fb6a772dbfe48711"}, + {file = "pycurl-7.45.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b129e9ee07f80b4af957607917af46ab517b0c4e746692f6d9e50e973edba8d8"}, + {file = "pycurl-7.45.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a0f920582b8713ca87d5a288a7532607bc4454275d733fc880650d602dbe3c67"}, + {file = "pycurl-7.45.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c7c13e4268550cde14a6f4743cc8bd8c035d4cd36514d58eff70276d68954b6f"}, + {file = "pycurl-7.45.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:0f0e1251a608ffd75fc502f4014442e554c67d3d7a1b0a839c35efb6ad2f8bf8"}, + {file = "pycurl-7.45.3-cp39-cp39-win32.whl", hash = "sha256:51a40a56c58e63dac6145829f9e9bd66e5867a9f0741bcb9ffefab619851d44f"}, + {file = "pycurl-7.45.3-cp39-cp39-win_amd64.whl", hash = "sha256:e08a06802c8c8a9d04cf3319f9230ec09062c55d2550bd48f8ada1df1431adcf"}, + {file = "pycurl-7.45.3.tar.gz", hash = "sha256:8c2471af9079ad798e1645ec0b0d3d4223db687379d17dd36a70637449f81d6b"}, +] + +[[package]] +name = "pydantic" +version = "2.7.4" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.4" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.3.4" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.3.4-py3-none-any.whl", hash = "sha256:11ad8bacb68a045f00e4f862c7a718c8a9ec766aa8fd4c32e39a0594b207b53a"}, + {file = "pydantic_settings-2.3.4.tar.gz", hash = "sha256:c5802e3d62b78e82522319bbc9b8f8ffb28ad1c988a99311d04f2a6051fca0a7"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pyee" +version = "11.1.0" +description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, + {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, +] + +[package.dependencies] +typing-extensions = "*" + +[package.extras] +dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] + +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyinstrument" +version = "4.6.2" +description = "Call stack profiler for Python. Shows you why your code is slow!" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyinstrument-4.6.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7a1b1cd768ea7ea9ab6f5490f7e74431321bcc463e9441dbc2f769617252d9e2"}, + {file = "pyinstrument-4.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a386b9d09d167451fb2111eaf86aabf6e094fed42c15f62ec51d6980bce7d96"}, + {file = "pyinstrument-4.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c3e3ca8553b9aac09bd978c73d21b9032c707ac6d803bae6a20ecc048df4a8"}, + {file = "pyinstrument-4.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f329f5534ca069420246f5ce57270d975229bcb92a3a3fd6b2ca086527d9764"}, + {file = "pyinstrument-4.6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4dcdcc7ba224a0c5edfbd00b0f530f5aed2b26da5aaa2f9af5519d4aa8c7e41"}, + {file = "pyinstrument-4.6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73db0c2c99119c65b075feee76e903b4ed82e59440fe8b5724acf5c7cb24721f"}, + {file = "pyinstrument-4.6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:da58f265326f3cf3975366ccb8b39014f1e69ff8327958a089858d71c633d654"}, + {file = "pyinstrument-4.6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:feebcf860f955401df30d029ec8de7a0c5515d24ea809736430fd1219686fe14"}, + {file = "pyinstrument-4.6.2-cp310-cp310-win32.whl", hash = "sha256:b2b66ff0b16c8ecf1ec22de001cfff46872b2c163c62429055105564eef50b2e"}, + {file = "pyinstrument-4.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:8d104b7a7899d5fa4c5bf1ceb0c1a070615a72c5dc17bc321b612467ad5c5d88"}, + {file = "pyinstrument-4.6.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:62f6014d2b928b181a52483e7c7b82f2c27e22c577417d1681153e5518f03317"}, + {file = "pyinstrument-4.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dcb5c8d763c5df55131670ba2a01a8aebd0d490a789904a55eb6a8b8d497f110"}, + {file = "pyinstrument-4.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ed4e8c6c84e0e6429ba7008a66e435ede2d8cb027794c20923c55669d9c5633"}, + {file = "pyinstrument-4.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c0f0e1d8f8c70faa90ff57f78ac0dda774b52ea0bfb2d9f0f41ce6f3e7c869e"}, + {file = "pyinstrument-4.6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3c44cb037ad0d6e9d9a48c14d856254ada641fbd0ae9de40da045fc2226a2a"}, + {file = "pyinstrument-4.6.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:be9901f17ac2f527c352f2fdca3d717c1d7f2ce8a70bad5a490fc8cc5d2a6007"}, + {file = "pyinstrument-4.6.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8a9791bf8916c1cf439c202fded32de93354b0f57328f303d71950b0027c7811"}, + {file = "pyinstrument-4.6.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d6162615e783c59e36f2d7caf903a7e3ecb6b32d4a4ae8907f2760b2ef395bf6"}, + {file = "pyinstrument-4.6.2-cp311-cp311-win32.whl", hash = "sha256:28af084aa84bbfd3620ebe71d5f9a0deca4451267f363738ca824f733de55056"}, + {file = "pyinstrument-4.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:dd6007d3c2e318e09e582435dd8d111cccf30d342af66886b783208813caf3d7"}, + {file = "pyinstrument-4.6.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e3813c8ecfab9d7d855c5f0f71f11793cf1507f40401aa33575c7fd613577c23"}, + {file = "pyinstrument-4.6.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6c761372945e60fc1396b7a49f30592e8474e70a558f1a87346d27c8c4ce50f7"}, + {file = "pyinstrument-4.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fba3244e94c117bf4d9b30b8852bbdcd510e7329fdd5c7c8b3799e00a9215a8"}, + {file = "pyinstrument-4.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:803ac64e526473d64283f504df3b0d5c2c203ea9603cab428641538ffdc753a7"}, + {file = "pyinstrument-4.6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2e554b1bb0df78f5ce8a92df75b664912ca93aa94208386102af454ec31b647"}, + {file = "pyinstrument-4.6.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7c671057fad22ee3ded897a6a361204ea2538e44c1233cad0e8e30f6d27f33db"}, + {file = "pyinstrument-4.6.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d02f31fa13a9e8dc702a113878419deba859563a32474c9f68e04619d43d6f01"}, + {file = "pyinstrument-4.6.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b55983a884f083f93f0fc6d12ff8df0acd1e2fb0580d2f4c7bfe6def33a84b58"}, + {file = "pyinstrument-4.6.2-cp312-cp312-win32.whl", hash = "sha256:fdc0a53b27e5d8e47147489c7dab596ddd1756b1e053217ef5bc6718567099ff"}, + {file = "pyinstrument-4.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:dd5c53a0159126b5ce7cbc4994433c9c671e057c85297ff32645166a06ad2c50"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b082df0bbf71251a7f4880a12ed28421dba84ea7110bb376e0533067a4eaff40"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90350533396071cb2543affe01e40bf534c35cb0d4b8fa9fdb0f052f9ca2cfe3"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67268bb0d579330cff40fd1c90b8510363ca1a0e7204225840614068658dab77"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e15b4e1d29ba0b7fc81aac50351e0dc0d7e911e93771ebc3f408e864a2c93b"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e625fc6ffcd4fd420493edd8276179c3f784df207bef4c2192725c1b310534c"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:113d2fc534c9ca7b6b5661d6ada05515bf318f6eb34e8d05860fe49eb7cfe17e"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3098cd72b71a322a72dafeb4ba5c566465e193d2030adad4c09566bd2f89bf4f"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-win32.whl", hash = "sha256:08fdc7f88c989316fa47805234c37a40fafe7b614afd8ae863f0afa9d1707b37"}, + {file = "pyinstrument-4.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5ebeba952c0056dcc9b9355328c78c4b5c2a33b4b4276a9157a3ab589f3d1bac"}, + {file = "pyinstrument-4.6.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:34e59e91c88ec9ad5630c0964eca823949005e97736bfa838beb4789e94912a2"}, + {file = "pyinstrument-4.6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cd0320c39e99e3c0a3129d1ed010ac41e5a7eb96fb79900d270080a97962e995"}, + {file = "pyinstrument-4.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46992e855d630575ec635eeca0068a8ddf423d4fd32ea0875a94e9f8688f0b95"}, + {file = "pyinstrument-4.6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e474c56da636253dfdca7cd1998b240d6b39f7ed34777362db69224fcf053b1"}, + {file = "pyinstrument-4.6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4b559322f30509ad8f082561792352d0805b3edfa508e492a36041fdc009259"}, + {file = "pyinstrument-4.6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:06a8578b2943eb1dbbf281e1e59e44246acfefd79e1b06d4950f01b693de12af"}, + {file = "pyinstrument-4.6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7bd3da31c46f1c1cb7ae89031725f6a1d1015c2041d9c753fe23980f5f9fd86c"}, + {file = "pyinstrument-4.6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e63f4916001aa9c625976a50779282e0a5b5e9b17c52a50ef4c651e468ed5b88"}, + {file = "pyinstrument-4.6.2-cp38-cp38-win32.whl", hash = "sha256:32ec8db6896b94af790a530e1e0edad4d0f941a0ab8dd9073e5993e7ea46af7d"}, + {file = "pyinstrument-4.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:a59fc4f7db738a094823afe6422509fa5816a7bf74e768ce5a7a2ddd91af40ac"}, + {file = "pyinstrument-4.6.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3a165e0d2deb212d4cf439383982a831682009e1b08733c568cac88c89784e62"}, + {file = "pyinstrument-4.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7ba858b3d6f6e5597c641edcc0e7e464f85aba86d71bc3b3592cb89897bf43f6"}, + {file = "pyinstrument-4.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fd8e547cf3df5f0ec6e4dffbe2e857f6b28eda51b71c3c0b5a2fc0646527835"}, + {file = "pyinstrument-4.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de2c1714a37a820033b19cf134ead43299a02662f1379140974a9ab733c5f3a"}, + {file = "pyinstrument-4.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01fc45dedceec3df81668d702bca6d400d956c8b8494abc206638c167c78dfd9"}, + {file = "pyinstrument-4.6.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5b6e161ef268d43ee6bbfae7fd2cdd0a52c099ddd21001c126ca1805dc906539"}, + {file = "pyinstrument-4.6.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6ba8e368d0421f15ba6366dfd60ec131c1b46505d021477e0f865d26cf35a605"}, + {file = "pyinstrument-4.6.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edca46f04a573ac2fb11a84b937844e6a109f38f80f4b422222fb5be8ecad8cb"}, + {file = "pyinstrument-4.6.2-cp39-cp39-win32.whl", hash = "sha256:baf375953b02fe94d00e716f060e60211ede73f49512b96687335f7071adb153"}, + {file = "pyinstrument-4.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:af1a953bce9fd530040895d01ff3de485e25e1576dccb014f76ba9131376fcad"}, + {file = "pyinstrument-4.6.2.tar.gz", hash = "sha256:0002ee517ed8502bbda6eb2bb1ba8f95a55492fcdf03811ba13d4806e50dd7f6"}, +] + +[package.extras] +bin = ["click", "nox"] +docs = ["furo (==2021.6.18b36)", "myst-parser (==0.15.1)", "sphinx (==4.2.0)", "sphinxcontrib-programoutput (==0.17)"] +examples = ["django", "numpy"] +test = ["flaky", "greenlet (>=3.0.0a1)", "ipython", "pytest", "pytest-asyncio (==0.12.0)", "sphinx-autobuild (==2021.3.14)", "trio"] +types = ["typing-extensions"] + +[[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.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[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 = "pypandoc" +version = "1.13" +description = "Thin wrapper for pandoc." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypandoc-1.13-py3-none-any.whl", hash = "sha256:4c7d71bf2f1ed122aac287113b5c4d537a33bbc3c1df5aed11a7d4a7ac074681"}, + {file = "pypandoc-1.13.tar.gz", hash = "sha256:31652073c7960c2b03570bd1e94f602ca9bc3e70099df5ead4cea98ff5151c1e"}, +] + +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pypdf" +version = "4.2.0" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypdf-4.2.0-py3-none-any.whl", hash = "sha256:dc035581664e0ad717e3492acebc1a5fc23dba759e788e3d4a9fc9b1a32e72c1"}, + {file = "pypdf-4.2.0.tar.gz", hash = "sha256:fe63f3f7d1dcda1c9374421a94c1bba6c6f8c4a62173a59b64ffd52058f846b1"}, +] + +[package.extras] +crypto = ["PyCryptodome", "cryptography"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] +image = ["Pillow (>=8.0.0)"] + +[[package]] +name = "pypdfium2" +version = "4.30.0" +description = "Python bindings to PDFium" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypdfium2-4.30.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b33ceded0b6ff5b2b93bc1fe0ad4b71aa6b7e7bd5875f1ca0cdfb6ba6ac01aab"}, + {file = "pypdfium2-4.30.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4e55689f4b06e2d2406203e771f78789bd4f190731b5d57383d05cf611d829de"}, + {file = "pypdfium2-4.30.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e6e50f5ce7f65a40a33d7c9edc39f23140c57e37144c2d6d9e9262a2a854854"}, + {file = "pypdfium2-4.30.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3d0dd3ecaffd0b6dbda3da663220e705cb563918249bda26058c6036752ba3a2"}, + {file = "pypdfium2-4.30.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc3bf29b0db8c76cdfaac1ec1cde8edf211a7de7390fbf8934ad2aa9b4d6dfad"}, + {file = "pypdfium2-4.30.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1f78d2189e0ddf9ac2b7a9b9bd4f0c66f54d1389ff6c17e9fd9dc034d06eb3f"}, + {file = "pypdfium2-4.30.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:5eda3641a2da7a7a0b2f4dbd71d706401a656fea521b6b6faa0675b15d31a163"}, + {file = "pypdfium2-4.30.0-py3-none-musllinux_1_1_i686.whl", hash = "sha256:0dfa61421b5eb68e1188b0b2231e7ba35735aef2d867d86e48ee6cab6975195e"}, + {file = "pypdfium2-4.30.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:f33bd79e7a09d5f7acca3b0b69ff6c8a488869a7fab48fdf400fec6e20b9c8be"}, + {file = "pypdfium2-4.30.0-py3-none-win32.whl", hash = "sha256:ee2410f15d576d976c2ab2558c93d392a25fb9f6635e8dd0a8a3a5241b275e0e"}, + {file = "pypdfium2-4.30.0-py3-none-win_amd64.whl", hash = "sha256:90dbb2ac07be53219f56be09961eb95cf2473f834d01a42d901d13ccfad64b4c"}, + {file = "pypdfium2-4.30.0-py3-none-win_arm64.whl", hash = "sha256:119b2969a6d6b1e8d55e99caaf05290294f2d0fe49c12a3f17102d01c441bd29"}, + {file = "pypdfium2-4.30.0.tar.gz", hash = "sha256:48b5b7e5566665bc1015b9d69c1ebabe21f6aee468b509531c3c8318eeee2e16"}, +] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +optional = false +python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] + +[[package]] +name = "pyreqwest-impersonate" +version = "0.4.8" +description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:45cad57afe4e6f56078ed9a7a90d0dc839d19d3e7a70175c80af21017f383bfb"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1986600253baf38f25fd07b8bdc1903359c26e5d34beb7d7d084845554b5664d"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cca4e6e59b9ad0cd20bad6caed3ac96992cd9c1d3126ecdfcab2c0ac2b75376"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab6b32544491ee655264dab86fc8a58e47c4f87d196b28022d4007faf971a50"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64bd6299e7fc888bb7f7292cf3e29504c406e5d5d04afd37ca994ab8142d8ee4"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e914b650dd953b8d9b24ef56aa4ecbfc16e399227b68accd818f8bf159e0c558"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-none-win_amd64.whl", hash = "sha256:cb56a2149b0c4548a8e0158b071a943f33dae9b717f92b5c9ac34ccd1f5a958c"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f62620e023490902feca0109f306e122e427feff7d59e03ecd22c69a89452367"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08d4c01d76da88cfe3d7d03b311b375ce3fb5a59130f93f0637bb755d6e56ff1"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524e276bc460176c79d7ba4b9131d9db73c534586660371ebdf067749252a33"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22863bc0aaf02ca2f5d76c8130929ae680b7d82dfc1c28c1ed5f306ff626928"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8cc82d57f6a91037e64a7aa9122f909576ef2a141a42ce599958ef9f8c4bc033"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:da8a053308210e44fd8349f07f45442a0691ac932f2881e98b05cf9ac404b091"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-none-win_amd64.whl", hash = "sha256:4baf3916c14364a815a64ead7f728afb61b37541933b2771f18dbb245029bb55"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:78db05deed0b32c9c75f2b3168a3a9b7d5e36487b218cb839bfe7e2a143450cb"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9af9446d605903c2b4e94621a9093f8d8a403729bc9cbfbcb62929f8238c838f"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c55890181d8d81e66cac25a95e215dc9680645d01e9091b64449d5407ad9bc6"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69344e7ae9964502a8693da7ad77ebc3e1418ee197e2e394bc23c5d4970772a"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b5db5c957a10d8cc2815085ba0b8fe09245b2f94c2225d9653a854a03b4217e1"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03c19c21f63f9c91c590c4bbcc32cc2d8066b508c683a1d163b8c7d9816a01d5"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-none-win_amd64.whl", hash = "sha256:0230610779129f74ff802c744643ce7589b1d07cba21d046fe3b574281c29581"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b8cb9471ab4b2fa7e80d3ac4e580249ff988d782f2938ad1f0428433652b170d"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8081a5ace2658be91519902bde9ddc5f94e1f850a39be196007a25e3da5bbfdc"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69eababfa3200459276acd780a0f3eaf41d1fe7c02bd169e714cba422055b5b9"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632957fa671ebb841166e40913015de457225cb73600ef250c436c280e68bf45"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2ce7ddef334b4e5c68f5ea1da1d65f686b8d84f4443059d128e0f069d3fa499a"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6ce333d450b158d582e36317089a006440b4e66739a8e8849d170e4cb15e8c8d"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-none-win_amd64.whl", hash = "sha256:9d9c85ce19db92362854f534807e470f03e905f283a7de6826dc79b790a8788e"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2503277f2a95a30e28e498570e2ed03ef4302f873054e8e21d6c0e607cbbc1d1"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8260395ef4ddae325e8b30cef0391adde7bd35e1a1decf8c729e26391f09b52d"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d8066b46d82bbaff5402d767e2f13d3449b8191c37bf8283e91d301a7159869"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9c42f6343cfbd6663fb53edc9eb9feb4ebf6186b284e22368adc1eeb6a33854"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ff534f491a059e74fb7f994876df86078b4b125dbecc53c098a298ecd55fa9c6"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b8fbf73b3ac513ddadafd338d61f79cd2370f0691d9175b2b92a45920920d6b"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-none-win_amd64.whl", hash = "sha256:a26447c82665d0e361207c1a15e56b0ca54974aa6c1fdfa18c68f908dec78cbe"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24a16b8d55309f0af0db9d04ff442b0c91afccf078a94809e7c3a71747a5c214"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c8fada56465fc19179404cc9d5d5e1064f5dfe27405cb052f57a5b4fe06aed1"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a3d48d5abc146fd804395713427d944757a99254350e6a651e7d776818074aee"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:475829fe9994c66258157a8d4adb1c038f44f79f901208ba656d547842337227"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef1ec0e97623bc0e18469418cc4dd2c59a2d5fddcae944de61e13c0b46f910e"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91857b196de89e9b36d3f8629aa8772c0bbe7efef8334fe266956b1c192ec31c"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:63831e407487b8a21bb51f97cd86a616c291d5138f8caec16ab6019cf6423935"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c30e61de93bcd0a9d3ca226b1ae5475002afde61e9d85018a6a4a040eeb86567"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c72c37b03bce9900f5dbb4f476af17253ec60c13bf7a7259f71a8dc1b036cb"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f1096165741b5c2178ab15b0eb09b5de16dd39b1cc135767d72471f0a69ce"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:70c940c0e4ef335e22a6c705b01f286ee44780b5909065d212d94d82ea2580cb"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81c06f21757602d85f16dbc1cbaee1121cd65455f65aed4c048b7dcda7be85c4"}, + {file = "pyreqwest_impersonate-0.4.8.tar.gz", hash = "sha256:1eba11d47bd17244c64fec1502cc26ee66cc5c8a3be131e408101ae2b455e5bc"}, +] + +[package.extras] +dev = ["pytest (>=8.1.1)"] + +[[package]] +name = "pyright" +version = "1.1.368" +description = "Command line wrapper for pyright" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyright-1.1.368-py3-none-any.whl", hash = "sha256:4a86e34b61c755b43b367af7fbf927fc6466fff6b81a9dcea07d42416c640af3"}, + {file = "pyright-1.1.368.tar.gz", hash = "sha256:9b2aa48142d9d9fc9a6aedff743c76873cc4e615f3297cdbf893d5793f75b306"}, +] + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + +[[package]] +name = "pysbd" +version = "0.3.4" +description = "pysbd (Python Sentence Boundary Disambiguation) is a rule-based sentence boundary detection that works out-of-the-box across many languages." +optional = false +python-versions = ">=3" +files = [ + {file = "pysbd-0.3.4-py3-none-any.whl", hash = "sha256:cd838939b7b0b185fcf86b0baf6636667dfb6e474743beeff878e9f42e022953"}, +] + +[[package]] +name = "pytesseract" +version = "0.3.10" +description = "Python-tesseract is a python wrapper for Google's Tesseract-OCR" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytesseract-0.3.10-py3-none-any.whl", hash = "sha256:8f22cc98f765bf13517ead0c70effedb46c153540d25783e04014f28b55a5fc6"}, + {file = "pytesseract-0.3.10.tar.gz", hash = "sha256:f1c3a8b0f07fd01a1085d451f5b8315be6eec1d5577a6796d46dc7a62bd4120f"}, +] + +[package.dependencies] +packaging = ">=21.3" +Pillow = ">=8.0.0" + +[[package]] +name = "pytest" +version = "8.2.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2.0" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.23.7" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, +] + +[package.dependencies] +pytest = ">=7.0.0,<9" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + +[[package]] +name = "pytest-celery" +version = "1.0.0" +description = "Pytest plugin for Celery" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pytest_celery-1.0.0-py3-none-any.whl", hash = "sha256:c10bc7d16daa3ae4a5784efcbd1855d610c0e087c21d185e52fa018b3a6c4249"}, + {file = "pytest_celery-1.0.0.tar.gz", hash = "sha256:17a066b1554d4fa8797d4928e8b8cda1bfb441dae4688ca29fdbde28ffa49ff7"}, +] + +[package.dependencies] +celery = "*" +debugpy = ">=1.8.1,<2.0.0" +docker = ">=7.0.0,<8.0.0" +psutil = ">=5.9.7" +pytest-docker-tools = ">=3.1.3" +retry = ">=0.9.2" +setuptools = ">=69.1.0" + +[package.extras] +all = ["python-memcached", "redis"] +memcached = ["python-memcached"] +redis = ["redis"] + +[[package]] +name = "pytest-docker-tools" +version = "3.1.3" +description = "Docker integration tests for pytest" +optional = false +python-versions = ">=3.7.0,<4.0.0" +files = [ + {file = "pytest_docker_tools-3.1.3-py3-none-any.whl", hash = "sha256:63e659043160f41d89f94ea42616102594bcc85682aac394fcbc14f14cd1b189"}, + {file = "pytest_docker_tools-3.1.3.tar.gz", hash = "sha256:c7e28841839d67b3ac80ad7b345b953701d5ae61ffda97586114244292aeacc0"}, +] + +[package.dependencies] +docker = ">=4.3.1" +pytest = ">=6.0.1" + +[[package]] +name = "pytest-dotenv" +version = "0.5.2" +description = "A py.test plugin that parses environment files before running tests" +optional = false +python-versions = "*" +files = [ + {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, + {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, +] + +[package.dependencies] +pytest = ">=5.0.0" +python-dotenv = ">=0.9.1" + +[[package]] +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-docx" +version = "1.1.2" +description = "Create, read, and update Microsoft Word .docx files." +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, + {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, +] + +[package.dependencies] +lxml = ">=3.1.0" +typing-extensions = ">=4.9.0" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-iso639" +version = "2024.4.27" +description = "ISO 639 language codes, names, and other associated information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_iso639-2024.4.27-py3-none-any.whl", hash = "sha256:27526a84cebc4c4d53fea9d1ebbc7209c8d279bebaa343e6765a1fc8780565ab"}, + {file = "python_iso639-2024.4.27.tar.gz", hash = "sha256:97e63b5603e085c6a56a12a95740010e75d9134e0aab767e0978b53fd8824f13"}, +] + +[package.extras] +dev = ["black (==24.4.2)", "build (==1.2.1)", "flake8 (==7.0.0)", "pytest (==8.1.2)", "requests (==2.31.0)", "twine (==5.0.0)"] + +[[package]] +name = "python-jose" +version = "3.3.0" +description = "JOSE implementation in Python" +optional = false +python-versions = "*" +files = [ + {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, + {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, +] + +[package.dependencies] +ecdsa = "!=0.15" +pyasn1 = "*" +rsa = "*" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] + +[[package]] +name = "python-magic" +version = "0.4.27" +description = "File type identification using libmagic" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, + {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-pptx" +version = "0.6.23" +description = "Generate and manipulate Open XML PowerPoint (.pptx) files" +optional = false +python-versions = "*" +files = [ + {file = "python-pptx-0.6.23.tar.gz", hash = "sha256:587497ff28e779ab18dbb074f6d4052893c85dedc95ed75df319364f331fedee"}, + {file = "python_pptx-0.6.23-py3-none-any.whl", hash = "sha256:dd0527194627a2b7cc05f3ba23ecaa2d9a0d5ac9b6193a28ed1b7a716f4217d4"}, +] + +[package.dependencies] +lxml = ">=3.1.0" +Pillow = ">=3.3.2" +XlsxWriter = ">=0.5.7" + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyzmq" +version = "26.0.3" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, + {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, + {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, + {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, + {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, + {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, + {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, + {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "ragas" +version = "0.1.9" +description = "" +optional = false +python-versions = "*" +files = [ + {file = "ragas-0.1.9-py3-none-any.whl", hash = "sha256:acdf7ef0868a1dd00b2bdf03d13bc9877425e4b0e0040938105503dd932615df"}, +] + +[package.dependencies] +appdirs = "*" +datasets = "*" +langchain = "*" +langchain-community = "*" +langchain-core = "*" +langchain-openai = "*" +nest-asyncio = "*" +numpy = "*" +openai = ">1" +pysbd = ">=0.3.4" +tiktoken = "*" + +[package.extras] +all = ["sentence-transformers"] + +[[package]] +name = "rapidfuzz" +version = "3.9.3" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdb8c5b8e29238ec80727c2ba3b301efd45aa30c6a7001123a6647b8e6f77ea4"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3bd0d9632088c63a241f217742b1cf86e2e8ae573e01354775bd5016d12138c"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:153f23c03d4917f6a1fc2fb56d279cc6537d1929237ff08ee7429d0e40464a18"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96c5225e840f1587f1bac8fa6f67562b38e095341576e82b728a82021f26d62"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b777cd910ceecd738adc58593d6ed42e73f60ad04ecdb4a841ae410b51c92e0e"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53e06e4b81f552da04940aa41fc556ba39dee5513d1861144300c36c33265b76"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7ca5b6050f18fdcacdada2dc5fb7619ff998cd9aba82aed2414eee74ebe6cd"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:87bb8d84cb41446a808c4b5f746e29d8a53499381ed72f6c4e456fe0f81c80a8"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:959a15186d18425d19811bea86a8ffbe19fd48644004d29008e636631420a9b7"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a24603dd05fb4e3c09d636b881ce347e5f55f925a6b1b4115527308a323b9f8e"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d055da0e801c71dd74ba81d72d41b2fa32afa182b9fea6b4b199d2ce937450d"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:875b581afb29a7213cf9d98cb0f98df862f1020bce9d9b2e6199b60e78a41d14"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win32.whl", hash = "sha256:6073a46f61479a89802e3f04655267caa6c14eb8ac9d81a635a13805f735ebc1"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:119c010e20e561249b99ca2627f769fdc8305b07193f63dbc07bca0a6c27e892"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win_arm64.whl", hash = "sha256:790b0b244f3213581d42baa2fed8875f9ee2b2f9b91f94f100ec80d15b140ba9"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f57e8305c281e8c8bc720515540e0580355100c0a7a541105c6cafc5de71daae"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4fc7b784cf987dbddc300cef70e09a92ed1bce136f7bb723ea79d7e297fe76d"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b422c0a6fe139d5447a0766268e68e6a2a8c2611519f894b1f31f0a392b9167"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f50fed4a9b0c9825ff37cf0bccafd51ff5792090618f7846a7650f21f85579c9"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b80eb7cbe62348c61d3e67e17057cddfd6defab168863028146e07d5a8b24a89"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f45be77ec82da32ce5709a362e236ccf801615cc7163b136d1778cf9e31b14"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd84b7f652a5610733400307dc732f57c4a907080bef9520412e6d9b55bc9adc"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e6d27dad8c990218b8cd4a5c99cbc8834f82bb46ab965a7265d5aa69fc7ced7"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05ee0696ebf0dfe8f7c17f364d70617616afc7dafe366532730ca34056065b8a"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2bc8391749e5022cd9e514ede5316f86e332ffd3cfceeabdc0b17b7e45198a8c"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:93981895602cf5944d89d317ae3b1b4cc684d175a8ae2a80ce5b65615e72ddd0"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:754b719a4990735f66653c9e9261dcf52fd4d925597e43d6b9069afcae700d21"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win32.whl", hash = "sha256:14c9f268ade4c88cf77ab007ad0fdf63699af071ee69378de89fff7aa3cae134"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc1991b4cde6c9d3c0bbcb83d5581dc7621bec8c666c095c65b4277233265a82"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win_arm64.whl", hash = "sha256:0c34139df09a61b1b557ab65782ada971b4a3bce7081d1b2bee45b0a52231adb"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d6a210347d6e71234af5c76d55eeb0348b026c9bb98fe7c1cca89bac50fb734"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b300708c917ce52f6075bdc6e05b07c51a085733650f14b732c087dc26e0aaad"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83ea7ca577d76778250421de61fb55a719e45b841deb769351fc2b1740763050"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8319838fb5b7b5f088d12187d91d152b9386ce3979ed7660daa0ed1bff953791"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:505d99131afd21529293a9a7b91dfc661b7e889680b95534756134dc1cc2cd86"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c52970f7784518d7c82b07a62a26e345d2de8c2bd8ed4774e13342e4b3ff4200"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:143caf7247449055ecc3c1e874b69e42f403dfc049fc2f3d5f70e1daf21c1318"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b8ab0fa653d9225195a8ff924f992f4249c1e6fa0aea563f685e71b81b9fcccf"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57e7c5bf7b61c7320cfa5dde1e60e678d954ede9bb7da8e763959b2138391401"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51fa1ba84653ab480a2e2044e2277bd7f0123d6693051729755addc0d015c44f"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:17ff7f7eecdb169f9236e3b872c96dbbaf116f7787f4d490abd34b0116e3e9c8"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afe7c72d3f917b066257f7ff48562e5d462d865a25fbcabf40fca303a9fa8d35"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win32.whl", hash = "sha256:e53ed2e9b32674ce96eed80b3b572db9fd87aae6742941fb8e4705e541d861ce"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:35b7286f177e4d8ba1e48b03612f928a3c4bdac78e5651379cec59f95d8651e6"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win_arm64.whl", hash = "sha256:e6e4b9380ed4758d0cb578b0d1970c3f32dd9e87119378729a5340cb3169f879"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a39890013f6d5b056cc4bfdedc093e322462ece1027a57ef0c636537bdde7531"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b5bc0fdbf419493163c5c9cb147c5fbe95b8e25844a74a8807dcb1a125e630cf"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe6e200a75a792d37b960457904c4fce7c928a96ae9e5d21d2bd382fe39066e"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de077c468c225d4c18f7188c47d955a16d65f21aab121cbdd98e3e2011002c37"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f917eaadf5388466a95f6a236f678a1588d231e52eda85374077101842e794e"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858ba57c05afd720db8088a8707079e8d024afe4644001fe0dbd26ef7ca74a65"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d36447d21b05f90282a6f98c5a33771805f9222e5d0441d03eb8824e33e5bbb4"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:acbe4b6f1ccd5b90c29d428e849aa4242e51bb6cab0448d5f3c022eb9a25f7b1"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:53c7f27cdf899e94712972237bda48cfd427646aa6f5d939bf45d084780e4c16"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6175682a829c6dea4d35ed707f1dadc16513270ef64436568d03b81ccb6bdb74"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5276df395bd8497397197fca2b5c85f052d2e6a66ffc3eb0544dd9664d661f95"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:77b5c4f3e72924d7845f0e189c304270066d0f49635cf8a3938e122c437e58de"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-win32.whl", hash = "sha256:8add34061e5cd561c72ed4febb5c15969e7b25bda2bb5102d02afc3abc1f52d0"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:604e0502a39cf8e67fa9ad239394dddad4cdef6d7008fdb037553817d420e108"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21047f55d674614eb4b0ab34e35c3dc66f36403b9fbfae645199c4a19d4ed447"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a56da3aff97cb56fe85d9ca957d1f55dbac7c27da927a86a2a86d8a7e17f80aa"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c08481aec2fe574f0062e342924db2c6b321391aeb73d68853ed42420fd6d"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e2b827258beefbe5d3f958243caa5a44cf46187eff0c20e0b2ab62d1550327a"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6e65a301fcd19fbfbee3a514cc0014ff3f3b254b9fd65886e8a9d6957fb7bca"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbe93ba1725a8d47d2b9dca6c1f435174859427fbc054d83de52aea5adc65729"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca21c0a34adee582775da997a600283e012a608a107398d80a42f9a57ad323d"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:256e07d3465173b2a91c35715a2277b1ee3ae0b9bbab4e519df6af78570741d0"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:802ca2cc8aa6b8b34c6fdafb9e32540c1ba05fca7ad60b3bbd7ec89ed1797a87"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:dd789100fc852cffac1449f82af0da139d36d84fd9faa4f79fc4140a88778343"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5d0abbacdb06e27ff803d7ae0bd0624020096802758068ebdcab9bd49cf53115"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:378d1744828e27490a823fc6fe6ebfb98c15228d54826bf4e49e4b76eb5f5579"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win32.whl", hash = "sha256:5d0cb272d43e6d3c0dedefdcd9d00007471f77b52d2787a4695e9dd319bb39d2"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:15e4158ac4b3fb58108072ec35b8a69165f651ba1c8f43559a36d518dbf9fb3f"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win_arm64.whl", hash = "sha256:58c6a4936190c558d5626b79fc9e16497e5df7098589a7e80d8bff68148ff096"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5410dc848c947a603792f4f51b904a3331cf1dc60621586bfbe7a6de72da1091"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:282d55700a1a3d3a7980746eb2fcd48c9bbc1572ebe0840d0340d548a54d01fe"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc1037507810833646481f5729901a154523f98cbebb1157ba3a821012e16402"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e33f779391caedcba2ba3089fb6e8e557feab540e9149a5c3f7fea7a3a7df37"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41a81a9f311dc83d22661f9b1a1de983b201322df0c4554042ffffd0f2040c37"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a93250bd8fae996350c251e1752f2c03335bb8a0a5b0c7e910a593849121a435"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3617d1aa7716c57d120b6adc8f7c989f2d65bc2b0cbd5f9288f1fc7bf469da11"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad04a3f5384b82933213bba2459f6424decc2823df40098920856bdee5fd6e88"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8709918da8a88ad73c9d4dd0ecf24179a4f0ceba0bee21efc6ea21a8b5290349"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b770f85eab24034e6ef7df04b2bfd9a45048e24f8a808e903441aa5abde8ecdd"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930b4e6fdb4d914390141a2b99a6f77a52beacf1d06aa4e170cba3a98e24c1bc"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c8444e921bfc3757c475c4f4d7416a7aa69b2d992d5114fe55af21411187ab0d"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c1d3ef3878f871abe6826e386c3d61b5292ef5f7946fe646f4206b85836b5da"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d861bf326ee7dabc35c532a40384541578cd1ec1e1b7db9f9ecbba56eb76ca22"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cde6b9d9ba5007077ee321ec722fa714ebc0cbd9a32ccf0f4dd3cc3f20952d71"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb6546e7b6bed1aefbe24f68a5fb9b891cc5aef61bca6c1a7b1054b7f0359bb"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d8a57261ef7996d5ced7c8cba9189ada3fbeffd1815f70f635e4558d93766cb"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:67201c02efc596923ad950519e0b75ceb78d524177ea557134d6567b9ac2c283"}, + {file = "rapidfuzz-3.9.3.tar.gz", hash = "sha256:b398ea66e8ed50451bce5997c430197d5e4b06ac4aa74602717f792d8d8d06e2"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "realtime" +version = "1.0.6" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "realtime-1.0.6-py3-none-any.whl", hash = "sha256:c66918a106d8ef348d1821f2dbf6683d8833825580d95b2fdea9995406b42838"}, + {file = "realtime-1.0.6.tar.gz", hash = "sha256:2be0d8a6305513d423604ee319216108fc20105cb7438922d5c8958c48f40a47"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1,<3.0.0" +typing-extensions = ">=4.12.2,<5.0.0" +websockets = ">=11,<13" + +[[package]] +name = "redis" +version = "5.0.6" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.7" +files = [ + {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, + {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "regex" +version = "2024.5.15" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-file" +version = "2.1.0" +description = "File transport adapter for Requests" +optional = false +python-versions = "*" +files = [ + {file = "requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c"}, + {file = "requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658"}, +] + +[package.dependencies] +requests = ">=1.0.0" + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=3.4" +files = [ + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "resend" +version = "2.1.0" +description = "Resend Python SDK" +optional = false +python-versions = ">=3.7" +files = [ + {file = "resend-2.1.0-py2.py3-none-any.whl", hash = "sha256:7f2a221983fab74a09f669c0c14a75daf547ffa4b4930141626d9cca55bca767"}, + {file = "resend-2.1.0.tar.gz", hash = "sha256:92dc8e035c2ce8cf8210c1c322e86b0a4f509e0c82a80932d3323cd2f3a43d2d"}, +] + +[package.dependencies] +requests = ">=2.31.0" +typing-extensions = "*" + +[[package]] +name = "retry" +version = "0.9.2" +description = "Easy to use retry decorator." +optional = false +python-versions = "*" +files = [ + {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, + {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, +] + +[package.dependencies] +decorator = ">=3.4.2" +py = ">=1.4.26,<2.0.0" + +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "ruff" +version = "0.4.10" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, + {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, + {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, + {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, + {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, + {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, +] + +[[package]] +name = "s3transfer" +version = "0.10.2" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">=3.8" +files = [ + {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, + {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, +] + +[package.dependencies] +botocore = ">=1.33.2,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] + +[[package]] +name = "safetensors" +version = "0.4.3" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, + {file = "safetensors-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf"}, + {file = "safetensors-0.4.3-cp310-none-win32.whl", hash = "sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9"}, + {file = "safetensors-0.4.3-cp310-none-win_amd64.whl", hash = "sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c"}, + {file = "safetensors-0.4.3-cp311-none-win32.whl", hash = "sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61"}, + {file = "safetensors-0.4.3-cp311-none-win_amd64.whl", hash = "sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e"}, + {file = "safetensors-0.4.3-cp312-none-win32.whl", hash = "sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3"}, + {file = "safetensors-0.4.3-cp312-none-win_amd64.whl", hash = "sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d"}, + {file = "safetensors-0.4.3-cp37-none-win32.whl", hash = "sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50"}, + {file = "safetensors-0.4.3-cp37-none-win_amd64.whl", hash = "sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270"}, + {file = "safetensors-0.4.3-cp38-none-win32.whl", hash = "sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac"}, + {file = "safetensors-0.4.3-cp38-none-win_amd64.whl", hash = "sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35"}, + {file = "safetensors-0.4.3-cp39-none-win32.whl", hash = "sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3"}, + {file = "safetensors-0.4.3-cp39-none-win_amd64.whl", hash = "sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65"}, + {file = "safetensors-0.4.3.tar.gz", hash = "sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2"}, +] + +[package.extras] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +mlx = ["mlx (>=0.0.9)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] + +[[package]] +name = "scipy" +version = "1.14.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"}, + {file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"}, + {file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"}, + {file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"}, + {file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, + {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, + {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, + {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.3" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "sentry-sdk" +version = "2.6.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.6.0-py2.py3-none-any.whl", hash = "sha256:422b91cb49378b97e7e8d0e8d5a1069df23689d45262b86f54988a7db264e874"}, + {file = "sentry_sdk-2.6.0.tar.gz", hash = "sha256:65cc07e9c6995c5e316109f138570b32da3bd7ff8d0d0ee4aaf2628c3dd8127d"}, +] + +[package.dependencies] +certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] + +[[package]] +name = "setuptools" +version = "70.1.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, + {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "sgmllib3k" +version = "1.0.0" +description = "Py3k port of sgmllib." +optional = false +python-versions = "*" +files = [ + {file = "sgmllib3k-1.0.0.tar.gz", hash = "sha256:7868fb1c8bfa764c1ac563d3cf369c381d1325d36124933a726f29fcdaa812e9"}, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {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" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.31" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, + {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, + {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", optional = true, markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") or extra == \"asyncio\""} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "sqlglot" +version = "25.3.0" +description = "An easily customizable SQL parser and transpiler" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sqlglot-25.3.0-py3-none-any.whl", hash = "sha256:1cca732e7c2ba4fe86665d8e05d7af49b3f2a5e7ec45a8f3ab0649d4207351b9"}, + {file = "sqlglot-25.3.0.tar.gz", hash = "sha256:c4ce5e38148c29f3bb19d8dcf1bfaaa4833eb283e9e6771e39a7e90dd6b79a0c"}, +] + +[package.dependencies] +sqlglotrs = {version = "0.2.7", optional = true, markers = "extra == \"rs\""} + +[package.extras] +dev = ["duckdb (>=0.6)", "maturin (>=1.4,<2.0)", "mypy", "pandas", "pandas-stubs", "pdoc", "pre-commit", "python-dateutil", "ruff (==0.4.3)", "types-python-dateutil", "typing-extensions"] +rs = ["sqlglotrs (==0.2.7)"] + +[[package]] +name = "sqlglotrs" +version = "0.2.7" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sqlglotrs-0.2.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5a0da518bf770a5bb7d1cb2deb481e573e43caf939f73912a848ae9a87c44ab6"}, + {file = "sqlglotrs-0.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a91d829054d2eb798ea77c2d9385f2ec1226ce913b66b3c2053a9c00b19fd688"}, + {file = "sqlglotrs-0.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251e940961b0b438adaf5fabcb57155af5e8dc6fe5e13e8bdf5f03dfaed024dd"}, + {file = "sqlglotrs-0.2.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:021e176635b04fc58394a4d44f208eb80ccda81f3e26e85ec73973dc1db35495"}, + {file = "sqlglotrs-0.2.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3904aef51ca645a2c809e71fab121848035b4a1673deb2a8f984a138fa242ef6"}, + {file = "sqlglotrs-0.2.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1b2daf2a2a223a50f93345a2dba443f8fc0f038618acae2619f2ecfd51d0def"}, + {file = "sqlglotrs-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84179adceb6b97fc30561d8b8ade21bd390f5e634da7ec6ca857bac46d9bb870"}, + {file = "sqlglotrs-0.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:07f07eaa98ea695c27c40527788d8e284a57d54c56b8bcb0e1f9cfd20115c978"}, + {file = "sqlglotrs-0.2.7-cp310-none-win32.whl", hash = "sha256:ae0b323fc9809aa116984965b3c7ae9a20ba3ce2328b69cbfa0b0db6f47a9727"}, + {file = "sqlglotrs-0.2.7-cp310-none-win_amd64.whl", hash = "sha256:0177eeb07b5d6ff90255710e01c067d1fcac74432b62eb6da8765c70bedb4cb1"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4d4f3f740f88e1ed8c32ef3f43dde61290eeaec34443b06abb3aa917a2e5b859"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c4088c8d849654e6b1219a9e44d672e28dbb786dd5b85aae58aa4adf13426c0a"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13c67477054a9e43a86927808ee3e86dfef4d4cdd3559686345c7214b1ac2fa0"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:002f137b7d77ec485c497a23f1b6e7a602d89db0587c0ce990538b40d73f25db"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5a75f149a418d4f88caf142aea4551229dddfb78176788dc1027cbfb9fcad63"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bca6cec48b45a667c5dd364ff8a688ff78dd1fa9f9ae69716285fdc8dc011b0"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fbab7f478b943d27f67a1f181d4aaed2132bc1577b3a6d6140a5361ea741927"}, + {file = "sqlglotrs-0.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aee2331e3fa9fa6a7f59fcf7751629cfeb468293a8b124b157012448f92455f"}, + {file = "sqlglotrs-0.2.7-cp311-none-win32.whl", hash = "sha256:029581f92852201c55ad5bac1f618faa372b89842ea68d2dd351478a4138dd09"}, + {file = "sqlglotrs-0.2.7-cp311-none-win_amd64.whl", hash = "sha256:65e5f9cf57c0360985e7704e8022fa42fec7962b032bac9d8deb32cf59503830"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:32eca057b43a9f2d82c2e20b5d07825e93e83db0345c6d0ed1b766dcc3603a54"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:872e3f677d852e1680fa96780179de976b931b3f505985004c82d367132c10bc"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d0a83dc8a4f423d27b1be5dcb9f4b39f39fee79525f4e11e2f5b792e233a03a"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c08d129471579b79685188e0ba5bbe9d6394f1a75e95837daca14a08fd1556f4"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24436f74bf5b3a5e4c6030b072bb0ddf6e285b976e00cf602ceeadcb174eac48"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42bea3099a4d0a92f86683560acff357a2638f953def429246d9bb8acd93f412"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821be1e2738e6e912fcb3c52afdd6abfd2092b10b098dcf18abe3380eb0b51ee"}, + {file = "sqlglotrs-0.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ade72a8b1ec14b8d73d54c6a7c1643e3fb8a63f76963c29413a3aad68c927ffe"}, + {file = "sqlglotrs-0.2.7-cp312-none-win32.whl", hash = "sha256:d9b492ec69d48afe3f9d24318ab9bfc43cea652b1bd59312d98488324544f497"}, + {file = "sqlglotrs-0.2.7-cp312-none-win_amd64.whl", hash = "sha256:840414231558b1f78591744e6d30cff3a4fc8376d2ae23f641d2e61afa5636cc"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:e1f6ea47e2cd20f7cd679be87f1b28526753dd766b53d56f097754d97ac3034d"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:4f19e5256e0a57642a842bef697346faabd7c2feb2b01b74c008be619db52318"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27c9eb092b76f5c3a2af22a67223f9c034f4e22bd12c5a6bffe0a89381decebd"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8d3d40101e9b2d4cdbdaee2b229763c2ea3eede46ac7e3c148881cb1e1f4c0c3"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:190db21cb406210b1b449448efbb2f80018c9abb98c2375e117bd00767e0d1df"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f33ff8db8158a367c1b482a2a2ad8b8ca4f22f6489fc6b890281f868c3b15121"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c73d3e4468f10b62d6749c1ba29f7f51858ade51a5140a4e629e91abf706d1"}, + {file = "sqlglotrs-0.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:01555cb6bce0185bde5d4149a5a7a75b5f8a5bedff8c144a16a9e29eaa50fc4b"}, + {file = "sqlglotrs-0.2.7-cp37-none-win32.whl", hash = "sha256:9178226771887b088ba84371c15d4e360f9e2c4b5a5841dcae759ff1760cebcc"}, + {file = "sqlglotrs-0.2.7-cp37-none-win_amd64.whl", hash = "sha256:ff5e3f3454208d81c7379f81d42ac3d74cd64d9f1317a8724f56d8536b372507"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f32dc36ff396414b43ddac3b0a43893b5dae42513c2181a4826402b2c96bf9ac"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:78c21fe0c292f68cc4c8da1b80cbf0616067df54d966d1be348a9e19a14a1046"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b74eb4e3b858ba4aa2e2c44a79895071a99cda5450a5b58dd8a247bd31c62c2"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a2ad6426bb9f55e08bb2fa44e0bbd0592c53d5eaed3306474238699286633be1"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a10215dd19a047adf8351b8f683a913228be5d050b0a27062fed02658a35f8b"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2082ff5b829cbee9515468d57186850169bd549a4351fec2682a59abb4f47a58"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3594ec8f00d17620be5f63c59a209a60680614e71fe1386d711e894f2068c43"}, + {file = "sqlglotrs-0.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d613d6523a544e75bcc9ea6076f3793579896e3ab175bc6a4fc73fc5f3f27518"}, + {file = "sqlglotrs-0.2.7-cp38-none-win32.whl", hash = "sha256:da077b5086605b9b94296691df461006031b8d4c90164be7de7f20008429f011"}, + {file = "sqlglotrs-0.2.7-cp38-none-win_amd64.whl", hash = "sha256:cef791d00780d6430dc514238b32481616f8f2c38d33689e3764b132ee35a3ef"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3eb9c25809b89cabdd25c45eb231774ca6691a721b574fb4d0f28bf067c08d8b"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c77c4cf860f5fc48aa74b688647f3fa04bb5d78137d1136c6ac15b09a6b0c24"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d78591febb9677f4706af44c08d37cc2af57007fa8f7ae22fd9aa534711c69d4"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5681458f50eb7777bca811d6c99c117d620ad47e7a999573795b46e03438c5b0"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c1b84a8fc4ab3bbf570cae485e0411b4c1dedf0a38d3b7c0a4080d9b4289578c"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdcf6bdc64723071230c37fd8ddb95e32f191ea9595a0867c9fd9e953893c8c4"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4285a08f5a34751f672a2dbef34823eac365b68feefa1f3d2d62a420057c153b"}, + {file = "sqlglotrs-0.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61e2fa205331af8dea943427bfa9b01f10bb83b893db9b1f98fe63080f8f4daf"}, + {file = "sqlglotrs-0.2.7-cp39-none-win32.whl", hash = "sha256:851ec7a573051dc85e4796347809a0e17c327c238b6ccd70349c577fb31bdcc5"}, + {file = "sqlglotrs-0.2.7-cp39-none-win_amd64.whl", hash = "sha256:764030e72c6bbf57f33157aaaa3837c3db0a591e1cd9d153cbab49925bdbee2c"}, + {file = "sqlglotrs-0.2.7.tar.gz", hash = "sha256:c858c250d3e2631afd06cfa9ee01096dcb810a0c96b39635a29058dc024b5496"}, +] + +[[package]] +name = "sqlmodel" +version = "0.0.19" +description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sqlmodel-0.0.19-py3-none-any.whl", hash = "sha256:6c8125d4101970d031e9aae970b20cbeaf44149989f8366d939f4ab21aab8763"}, + {file = "sqlmodel-0.0.19.tar.gz", hash = "sha256:95449b0b48a40a3eecf0a629fa5735b9dfc8a5574a91090d24ca17f02246ad96"}, +] + +[package.dependencies] +pydantic = ">=1.10.13,<3.0.0" +SQLAlchemy = ">=2.0.14,<2.1.0" + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "storage3" +version = "0.7.6" +description = "Supabase Storage client for Python." +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "storage3-0.7.6-py3-none-any.whl", hash = "sha256:d8c23bf87b3a88cafb03761b7f936e4e49daca67741d571513edf746e0f8ba72"}, + {file = "storage3-0.7.6.tar.gz", hash = "sha256:0b7781cea7fe6382e6b9349b84395808c5f4203dfcac31478304eedc2f81acf6"}, +] + +[package.dependencies] +httpx = ">=0.24,<0.28" +python-dateutil = ">=2.8.2,<3.0.0" +typing-extensions = ">=4.2.0,<5.0.0" + +[[package]] +name = "strenum" +version = "0.4.15" +description = "An Enum that inherits from str." +optional = false +python-versions = "*" +files = [ + {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, + {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, +] + +[package.extras] +docs = ["myst-parser[linkify]", "sphinx", "sphinx-rtd-theme"] +release = ["twine"] +test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"] + +[[package]] +name = "striprtf" +version = "0.0.26" +description = "A simple library to convert rtf to text" +optional = false +python-versions = "*" +files = [ + {file = "striprtf-0.0.26-py3-none-any.whl", hash = "sha256:8c8f9d32083cdc2e8bfb149455aa1cc5a4e0a035893bedc75db8b73becb3a1bb"}, + {file = "striprtf-0.0.26.tar.gz", hash = "sha256:fdb2bba7ac440072d1c41eab50d8d74ae88f60a8b6575c6e2c7805dc462093aa"}, +] + +[[package]] +name = "supabase" +version = "2.5.1" +description = "Supabase client for Python." +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "supabase-2.5.1-py3-none-any.whl", hash = "sha256:74a1f24f04fede1967ef084b50dea688228f7b10eb2f9d73350fe2251a865188"}, + {file = "supabase-2.5.1.tar.gz", hash = "sha256:c50e0eba5b03de3abd5ac0f887957ca43558ba44c4d17bb44e73ec454b41734c"}, +] + +[package.dependencies] +gotrue = ">=1.3,<3.0" +httpx = ">=0.24,<0.28" +postgrest = ">=0.14,<0.17.0" +realtime = ">=1.0.0,<2.0.0" +storage3 = ">=0.5.3,<0.8.0" +supafunc = ">=0.3.1,<0.5.0" + +[[package]] +name = "supafunc" +version = "0.4.6" +description = "Library for Supabase Functions" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "supafunc-0.4.6-py3-none-any.whl", hash = "sha256:f7ca7b244365e171da7055a64edb462c2ec449cdaa210fc418cfccd132f4cf98"}, + {file = "supafunc-0.4.6.tar.gz", hash = "sha256:92db51f8f8568d1430285219c9c0072e44207409c416622d7387f609e31928a6"}, +] + +[package.dependencies] +httpx = ">=0.24,<0.28" + +[[package]] +name = "sympy" +version = "1.12.1" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, + {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4.0" + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tavily-python" +version = "0.3.3" +description = "Python wrapper for the Tavily API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tavily-python-0.3.3.tar.gz", hash = "sha256:14ac3d0cb5d2ce05487e7e8020460cd7b88d83c9916f46e344bcf25577acd346"}, + {file = "tavily_python-0.3.3-py3-none-any.whl", hash = "sha256:032d598fe855d77c61e75ddd1faafd3b2c3aff37e88f43431a728610e26dcc4d"}, +] + +[package.dependencies] +requests = "*" +tiktoken = ">=0.5.2,<1" + +[[package]] +name = "tbb" +version = "2021.13.0" +description = "Intel® oneAPI Threading Building Blocks (oneTBB)" +optional = false +python-versions = "*" +files = [ + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:a2567725329639519d46d92a2634cf61e76601dac2f777a05686fea546c4fe4f"}, + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:aaf667e92849adb012b8874d6393282afc318aca4407fc62f912ee30a22da46a"}, + {file = "tbb-2021.13.0-py3-none-win32.whl", hash = "sha256:6669d26703e9943f6164c6407bd4a237a45007e79b8d3832fe6999576eaaa9ef"}, + {file = "tbb-2021.13.0-py3-none-win_amd64.whl", hash = "sha256:3528a53e4bbe64b07a6112b4c5a00ff3c61924ee46c9c68e004a1ac7ad1f09c3"}, +] + +[[package]] +name = "tenacity" +version = "8.4.2" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, + {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "timm" +version = "1.0.7" +description = "PyTorch Image Models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "timm-1.0.7-py3-none-any.whl", hash = "sha256:942ced65b47b5ec12b8df07eb8ee929f1bb310402155b28931ab7a85ecc1cef2"}, + {file = "timm-1.0.7.tar.gz", hash = "sha256:d1d26d906b5e188d7e7d536a6a0999568bb184f884f9a334c48d46fc6dc166c8"}, +] + +[package.dependencies] +huggingface_hub = "*" +pyyaml = "*" +safetensors = "*" +torch = "*" +torchvision = "*" + +[[package]] +name = "tinysegmenter" +version = "0.3" +description = "Very compact Japanese tokenizer" +optional = false +python-versions = "*" +files = [ + {file = "tinysegmenter-0.3.tar.gz", hash = "sha256:ed1f6d2e806a4758a73be589754384cbadadc7e1a414c81a166fc9adf2d40c6d"}, +] + +[[package]] +name = "tldextract" +version = "5.1.2" +description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tldextract-5.1.2-py3-none-any.whl", hash = "sha256:4dfc4c277b6b97fa053899fcdb892d2dc27295851ab5fac4e07797b6a21b2e46"}, + {file = "tldextract-5.1.2.tar.gz", hash = "sha256:c9e17f756f05afb5abac04fe8f766e7e70f9fe387adb1859f0f52408ee060200"}, +] + +[package.dependencies] +filelock = ">=3.0.8" +idna = "*" +requests = ">=2.1.0" +requests-file = ">=1.4" + +[package.extras] +release = ["build", "twine"] +testing = ["black", "mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ruff", "syrupy", "tox", "types-filelock", "types-requests"] + +[[package]] +name = "tokenizers" +version = "0.19.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + +[[package]] +name = "torch" +version = "2.3.1" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, + {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, + {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, + {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, + {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, + {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, + {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, + {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, + {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, + {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, + {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, + {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, + {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, + {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, + {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, + {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, + {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, + {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, + {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, + {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + +[[package]] +name = "torchvision" +version = "0.18.1" +description = "image and video datasets and models for torch deep learning" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torchvision-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e694e54b0548dad99c12af6bf0c8e4f3350137d391dcd19af22a1c5f89322b3"}, + {file = "torchvision-0.18.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:0b3bda0aa5b416eeb547143b8eeaf17720bdba9cf516dc991aacb81811aa96a5"}, + {file = "torchvision-0.18.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:573ff523c739405edb085f65cb592f482d28a30e29b0be4c4ba08040b3ae785f"}, + {file = "torchvision-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:ef7bbbc60b38e831a75e547c66ca1784f2ac27100f9e4ddbe9614cef6cbcd942"}, + {file = "torchvision-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80b5d794dd0fdba787adc22f1a367a5ead452327686473cb260dd94364bc56a6"}, + {file = "torchvision-0.18.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:9077cf590cdb3a5e8fdf5cdb71797f8c67713f974cf0228ecb17fcd670ab42f9"}, + {file = "torchvision-0.18.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ceb993a882f1ae7ae373ed39c28d7e3e802205b0e59a7ed84ef4028f0bba8d7f"}, + {file = "torchvision-0.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:52f7436140045dc2239cdc502aa76b2bd8bd676d64244ff154d304aa69852046"}, + {file = "torchvision-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2be6f0bf7c455c89a51a1dbb6f668d36c6edc479f49ac912d745d10df5715657"}, + {file = "torchvision-0.18.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:f118d887bfde3a948a41d56587525401e5cac1b7db2eaca203324d6ed2b1caca"}, + {file = "torchvision-0.18.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:13d24d904f65e62d66a1e0c41faec630bc193867b8a4a01166769e8a8e8df8e9"}, + {file = "torchvision-0.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ed6340b69a63a625e512a66127210d412551d9c5f2ad2978130c6a45bf56cd4a"}, + {file = "torchvision-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b1c3864fa9378c88bce8ad0ef3599f4f25397897ce612e1c245c74b97092f35e"}, + {file = "torchvision-0.18.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:02085a2ffc7461f5c0edb07d6f3455ee1806561f37736b903da820067eea58c7"}, + {file = "torchvision-0.18.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9726c316a2501df8503e5a5dc46a631afd4c515a958972e5b7f7b9c87d2125c0"}, + {file = "torchvision-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:64a2662dbf30db9055d8b201d6e56f312a504e5ccd9d144c57c41622d3c524cb"}, + {file = "torchvision-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:975b8594c0f5288875408acbb74946eea786c5b008d129c0d045d0ead23742bc"}, + {file = "torchvision-0.18.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:da83c8bbd34d8bee48bfa1d1b40e0844bc3cba10ed825a5a8cbe3ce7b62264cd"}, + {file = "torchvision-0.18.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:54bfcd352abb396d5c9c237d200167c178bd136051b138e1e8ef46ce367c2773"}, + {file = "torchvision-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:5c8366a1aeee49e9ea9e64b30d199debdf06b1bd7610a76165eb5d7869c3bde5"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" +torch = "2.3.1" + +[package.extras] +scipy = ["scipy"] + +[[package]] +name = "tornado" +version = "6.4.1" +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.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "tqdm" +version = "4.66.4" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "transformers" +version = "4.41.2" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "transformers-4.41.2-py3-none-any.whl", hash = "sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67"}, + {file = "transformers-4.41.2.tar.gz", hash = "sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.23.0,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.4.1" +tokenizers = ">=0.19,<0.20" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.21.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6,<0.15.0)"] +onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +ray = ["ray[tune] (>=2.7.0)"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic", "starlette", "uvicorn"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm"] +tokenizers = ["tokenizers (>=0.19,<0.20)"] +torch = ["accelerate (>=0.21.0)", "torch"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.23.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +video = ["av (==9.2.0)", "decord (==0.6.0)"] +vision = ["Pillow (>=10.0.1,<=15.0)"] + +[[package]] +name = "triton" +version = "2.3.1" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, + {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, + {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, + {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, + {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, + {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] + +[[package]] +name = "typer" +version = "0.12.3" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, + {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + +[[package]] +name = "types-requests" +version = "2.32.0.20240622" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-requests-2.32.0.20240622.tar.gz", hash = "sha256:ed5e8a412fcc39159d6319385c009d642845f250c63902718f605cd90faade31"}, + {file = "types_requests-2.32.0.20240622-py3-none-any.whl", hash = "sha256:97bac6b54b5bd4cf91d407e62f0932a74821bc2211f22116d9ee1dd643826caf"}, +] + +[package.dependencies] +urllib3 = ">=2" + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "ujson" +version = "5.10.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, +] + +[[package]] +name = "unidecode" +version = "1.3.8" +description = "ASCII transliterations of Unicode text" +optional = false +python-versions = ">=3.5" +files = [ + {file = "Unidecode-1.3.8-py3-none-any.whl", hash = "sha256:d130a61ce6696f8148a3bd8fe779c99adeb4b870584eeb9526584e9aa091fd39"}, + {file = "Unidecode-1.3.8.tar.gz", hash = "sha256:cfdb349d46ed3873ece4586b96aa75258726e2fa8ec21d6f00a591d98806c2f4"}, +] + +[[package]] +name = "unstructured" +version = "0.11.8" +description = "A library that prepares raw documents for downstream ML tasks." +optional = false +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 = "*" +markdown = {version = "*", optional = true, markers = "extra == \"all-docs\""} +msg-parser = {version = "*", optional = true, markers = "extra == \"all-docs\""} +networkx = {version = "*", optional = true, markers = "extra == \"all-docs\""} +nltk = "*" +numpy = "*" +onnx = {version = "*", optional = true, markers = "extra == \"all-docs\""} +openpyxl = {version = "*", optional = true, markers = "extra == \"all-docs\""} +pandas = {version = "*", optional = true, markers = "extra == \"all-docs\""} +pdf2image = {version = "*", optional = true, markers = "extra == \"all-docs\""} +"pdfminer.six" = {version = "*", optional = true, markers = "extra == \"all-docs\""} +pikepdf = {version = "*", optional = true, markers = "extra == \"all-docs\""} +pypandoc = {version = "*", optional = true, markers = "extra == \"all-docs\""} +pypdf = {version = "*", optional = true, markers = "extra == \"all-docs\""} +python-docx = {version = ">=1.1.0", optional = true, markers = "extra == \"all-docs\""} +python-iso639 = "*" +python-magic = "*" +python-pptx = {version = "<=0.6.23", optional = true, markers = "extra == \"all-docs\""} +rapidfuzz = "*" +requests = "*" +tabulate = "*" +typing-extensions = "*" +unstructured-client = "*" +unstructured-inference = {version = "0.7.18", optional = true, markers = "extra == \"all-docs\""} +"unstructured.pytesseract" = {version = ">=0.3.12", optional = true, markers = "extra == \"all-docs\""} +wrapt = "*" +xlrd = {version = "*", optional = true, markers = "extra == \"all-docs\""} + +[package.extras] +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" +version = "0.23.7" +description = "Python Client SDK for Unstructured API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "unstructured-client-0.23.7.tar.gz", hash = "sha256:9161ca25365764712b66cbb50e7cb22bc59a89a613de2bb2e2b171ef7b17e5b0"}, + {file = "unstructured_client-0.23.7-py3-none-any.whl", hash = "sha256:95df14697b1f79cc2a4580c7f143bd463d3dd5fab605220d2e4888321342decb"}, +] + +[package.dependencies] +certifi = ">=2023.7.22" +charset-normalizer = ">=3.2.0" +dataclasses-json = ">=0.6.4" +deepdiff = ">=6.0" +httpx = ">=0.27.0" +idna = ">=3.4" +jsonpath-python = ">=1.0.6" +marshmallow = ">=3.19.0" +mypy-extensions = ">=1.0.0" +nest-asyncio = ">=1.6.0" +packaging = ">=23.1" +pypdf = ">=4.0" +python-dateutil = ">=2.8.2" +requests = ">=2.31.0" +requests-toolbelt = ">=1.0.0" +six = ">=1.16.0" +typing-extensions = ">=4.7.1" +typing-inspect = ">=0.9.0" +urllib3 = ">=1.26.18" + +[package.extras] +dev = ["pylint (==3.1.0)"] + +[[package]] +name = "unstructured-inference" +version = "0.7.18" +description = "A library for performing inference using trained models." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "unstructured_inference-0.7.18-py3-none-any.whl", hash = "sha256:86e1e5bfab0c1729d7309eb847cde743c4a32924ef1bdeb9043f99e06ec9fd9f"}, + {file = "unstructured_inference-0.7.18.tar.gz", hash = "sha256:ad4d4c94cb40525456b5857348004b077bc0b27d6acce3ccb1a12b66017d5d26"}, +] + +[package.dependencies] +huggingface-hub = "*" +layoutparser = {version = "*", extras = ["layoutmodels", "tesseract"]} +onnx = "*" +onnxruntime = "<1.16" +opencv-python = "!=4.7.0.68" +python-multipart = "*" +rapidfuzz = "*" +transformers = ">=4.25.1" + +[[package]] +name = "unstructured-pytesseract" +version = "0.3.12" +description = "Python-tesseract is a python wrapper for Google's Tesseract-OCR" +optional = false +python-versions = ">=3.8" +files = [ + {file = "unstructured.pytesseract-0.3.12-py3-none-any.whl", hash = "sha256:6ed42530fc697bb08d1ae4884cc517ee808620c1c1414efe8d5d90334da068d3"}, + {file = "unstructured.pytesseract-0.3.12.tar.gz", hash = "sha256:751a21d67b1f109036bf4daf796d3e04631697a355efd650f3373412b249de2e"}, +] + +[package.dependencies] +packaging = ">=21.3" +Pillow = ">=8.0.0" + +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.30.1" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, + {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +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 = "vine" +version = "5.1.0" +description = "Python promises." +optional = false +python-versions = ">=3.6" +files = [ + {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, + {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, +] + +[[package]] +name = "virtualenv" +version = "20.26.3" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "watchdog" +version = "4.0.1" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, + {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, + {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, + {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, + {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "watchfiles" +version = "0.22.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, + {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, + {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, + {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, + {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, + {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, + {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, + {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, + {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, + {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, + {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, + {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, + {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, + {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "xlrd" +version = "2.0.1" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, +] + +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "xlsxwriter" +version = "3.2.0" +description = "A Python module for creating Excel XLSX files." +optional = false +python-versions = ">=3.6" +files = [ + {file = "XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e"}, + {file = "XlsxWriter-3.2.0.tar.gz", hash = "sha256:9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c"}, +] + +[[package]] +name = "xxhash" +version = "3.4.1" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +files = [ + {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, + {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, + {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, + {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, + {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, + {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, + {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, + {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, + {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, + {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, + {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, + {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, + {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, + {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, + {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, + {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, + {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, + {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, + {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, + {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zipp" +version = "3.19.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, +] + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "29e667d6875051ee8603be3916a6b81e524b57046df3dc937df13e42b821712a" diff --git a/backend/pyproject.toml b/backend/pyproject.toml new file mode 100644 index 000000000000..9066b2df3af5 --- /dev/null +++ b/backend/pyproject.toml @@ -0,0 +1,129 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.ruff] +line-length = 88 +exclude = [".git", "__pycache__", ".mypy_cache", ".pytest_cache"] + +[tool.ruff.lint] +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "C", # flake8-comprehensions + "B", # flake8-bugbear +] +ignore = [ + "B904", + "B006", + "E501", # line too long, handled by black + "B008", # do not perform function calls in argument defaults + "C901", # too complex +] + + +[tool.ruff.lint.isort] +order-by-type = true +relative-imports-order = "closest-to-furthest" +extra-standard-library = ["typing"] +section-order = [ + "future", + "standard-library", + "third-party", + "first-party", + "local-folder", +] +known-first-party = [] + +[tool.poetry] +name = "backend" +version = "0.1.0" +description = "quivr backend" +authors = ["aminediro "] +readme = "README.md" + +[tool.pytest.ini_options] +addopts = "--tb=short -ra -v" +filterwarnings = ["ignore::DeprecationWarning"] + + +[tool.poetry.dependencies] +python = "^3.11" +torch = "^2.3.1" +langchain = "*" +litellm = "*" +openai = "*" +gitpython = "*" +pdf2image = "*" +nest-asyncio = "*" +pypdf = "*" +supabase = "*" +tiktoken = "*" +fastapi = "*" +python-multipart = "*" +uvicorn = "*" +pypandoc = "*" +docx2txt = "*" +python-jose = "*" +asyncpg = "*" +flake8 = "*" +flake8-black = "*" +pyright = "*" +resend = "*" +html5lib = "*" +beautifulsoup4 = "*" +newspaper3k = "*" +xlrd = "*" +redis = "*" +flower = "*" +boto3 = "*" +botocore = "*" +python-dotenv = "*" +pytest-mock = "*" +pytest-celery = "*" +pytesseract = "*" +async-generator = "*" +posthog = "*" +jq = "*" +pytest = "*" +watchdog = "*" +langchain-community = "*" +langchain-openai = "*" +pydantic-settings = "*" +langfuse = "*" +pandasai = "*" +colorlog = "*" +psycopg2-binary = "*" +celery = { extras = ["redis", "sqs"], version = "*" } +unstructured = { extras = ["all-docs"], version = "*" } +llama-parse = "*" +llama-index = "*" +lxml = { extras = ["html_clean"], version = "*" } +ragas = "*" +datasets = "*" +pytest-dotenv = "*" +fpdf2 = "*" +unidecode = "*" +flashrank = "*" +langchain-cohere = "*" +pyinstrument = "*" +playwright = "*" +langgraph = "*" +tavily-python = "*" +duckduckgo-search = "*" +google-api-python-client = "*" +google-auth-httplib2 = "*" +google-auth-oauthlib = "*" +msal = "*" +sentry-sdk = { version = "^2.5.0", extras = ["fastapi"] } +sqlmodel = "^0.0.19" + +[tool.poetry.group.dev.dependencies] +pytest = "*" +mypy = "^1.10.0" +pre-commit = "^3.7.1" +ipykernel = "*" +ruff = "^0.4.8" +pytest-asyncio = "^0.23.7" diff --git a/backend/supabase/20240103191539_private.sql b/backend/supabase/20240103191539_private.sql index 97c65e86f1d1..070f94a556b9 100644 --- a/backend/supabase/20240103191539_private.sql +++ b/backend/supabase/20240103191539_private.sql @@ -55,4 +55,4 @@ create schema if not exists extensions; create table if not exists extensions.wrappers_fdw_stats (); -grant all on extensions.wrappers_fdw_stats to service_role; \ No newline at end of file +grant all on extensions.wrappers_fdw_stats to service_role; diff --git a/backend/supabase/config.toml b/backend/supabase/config.toml index 360df1142295..a33a68527c73 100644 --- a/backend/supabase/config.toml +++ b/backend/supabase/config.toml @@ -158,4 +158,4 @@ s3_region = "env(S3_REGION)" # Configures AWS_ACCESS_KEY_ID for S3 bucket s3_access_key = "env(S3_ACCESS_KEY)" # Configures AWS_SECRET_ACCESS_KEY for S3 bucket -s3_secret_key = "env(S3_SECRET_KEY)" \ No newline at end of file +s3_secret_key = "env(S3_SECRET_KEY)" diff --git a/backend/supabase/migrations/20240103173626_init.sql b/backend/supabase/migrations/20240103173626_init.sql index afee9fd24885..1dfc09f1a1c9 100644 --- a/backend/supabase/migrations/20240103173626_init.sql +++ b/backend/supabase/migrations/20240103173626_init.sql @@ -549,7 +549,7 @@ BEGIN END IF; UPDATE user_settings - SET + SET max_brains = 30, max_brain_size = 10000000, models = NEW.models @@ -594,7 +594,7 @@ BEGIN END IF; UPDATE user_settings - SET + SET max_brains = 30, max_brain_size = 100000000, @@ -613,13 +613,13 @@ CREATE OR REPLACE FUNCTION public.update_user_settings() AS $function$ BEGIN IF NEW.email LIKE '%@theodo.fr' THEN - -- This checks if the models key is present and is of type jsonb array, + -- This checks if the models key is present and is of type jsonb array, -- if not it initializes it with an empty array. IF NEW.models IS NULL OR NOT jsonb_typeof(NEW.models) = 'array' THEN NEW.models := '[]'::jsonb; END IF; - -- Append new values to the JSONB array. + -- Append new values to the JSONB array. -- This does not check for duplicates, so you might get repeated values. NEW.models := NEW.models || '["gpt-4", "gpt-3.5-turbo"]'::jsonb; END IF; @@ -1754,7 +1754,7 @@ $$; CREATE TABLE IF NOT EXISTS api_keys( key_id UUID DEFAULT gen_random_uuid() PRIMARY KEY, user_id UUID REFERENCES auth.users (id), - name TEXT DEFAULT 'API_KEY', + name TEXT DEFAULT 'API_KEY', days INT DEFAULT 30, only_chat BOOLEAN DEFAULT false, api_key TEXT UNIQUE, @@ -1771,8 +1771,8 @@ CREATE TABLE IF NOT EXISTS prompts ( status VARCHAR(255) DEFAULT 'private' ); -DO $$ -BEGIN +DO $$ +BEGIN IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'brain_type_enum') THEN -- Create the ENUM type 'brain_type' if it doesn't exist CREATE TYPE brain_type_enum AS ENUM ('doc', 'api', 'composite'); @@ -1959,11 +1959,11 @@ CREATE TABLE IF NOT EXISTS onboardings ( CREATE EXTENSION IF NOT EXISTS wrappers; -- Create foreign data wrapper 'stripe_wrapper' if it doesn't exist -DO $$ +DO $$ BEGIN IF NOT EXISTS ( - SELECT 1 - FROM information_schema.foreign_data_wrappers + SELECT 1 + FROM information_schema.foreign_data_wrappers WHERE foreign_data_wrapper_name = 'stripe_wrapper' ) THEN CREATE FOREIGN DATA WRAPPER stripe_wrapper @@ -1972,7 +1972,7 @@ BEGIN END $$; -- Check if the server 'stripe_server' exists before creating it -DO $$ +DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_foreign_server WHERE srvname = 'stripe_server') THEN CREATE SERVER stripe_server @@ -1984,12 +1984,12 @@ BEGIN END $$; -- Create foreign table 'public.customers' if it doesn't exist -DO $$ +DO $$ BEGIN IF NOT EXISTS ( - SELECT 1 - FROM information_schema.tables - WHERE table_name = 'customers' + SELECT 1 + FROM information_schema.tables + WHERE table_name = 'customers' ) THEN CREATE FOREIGN TABLE public.customers ( id text, @@ -2013,8 +2013,8 @@ CREATE TABLE IF NOT EXISTS public.users ( email text ); --- Create or replace function 'public.handle_new_user' -CREATE OR REPLACE FUNCTION public.handle_new_user() +-- Create or replace function 'public.handle_new_user' +CREATE OR REPLACE FUNCTION public.handle_new_user() RETURNS TRIGGER AS $$ BEGIN INSERT INTO public.users (id, email) @@ -2024,7 +2024,7 @@ END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Check if the trigger 'on_auth_user_created' exists before creating it -DO $$ +DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'on_auth_user_created') THEN CREATE TRIGGER on_auth_user_created @@ -2097,6 +2097,3 @@ create table if not exists extensions.wrappers_fdw_stats (); grant all on extensions.wrappers_fdw_stats to service_role; - - - diff --git a/backend/supabase/migrations/20240103175048_prod.sql b/backend/supabase/migrations/20240103175048_prod.sql index 88e41300edd8..c1b4efda9c9b 100644 --- a/backend/supabase/migrations/20240103175048_prod.sql +++ b/backend/supabase/migrations/20240103175048_prod.sql @@ -145,7 +145,7 @@ BEGIN END IF; UPDATE user_settings - SET + SET max_brains = 30, max_brain_size = 100000000, daily_chat_credit = 200, @@ -201,5 +201,3 @@ grant truncate on table "public"."documents" to "service_role"; grant update on table "public"."documents" to "service_role"; CREATE TRIGGER update_max_brains_theodo_trigger AFTER INSERT ON public.user_settings FOR EACH ROW EXECUTE FUNCTION update_max_brains_theodo(); - - diff --git a/backend/supabase/migrations/20240103181249_premium.sql b/backend/supabase/migrations/20240103181249_premium.sql index a95b2eb54f95..57f3edb1ce15 100644 --- a/backend/supabase/migrations/20240103181249_premium.sql +++ b/backend/supabase/migrations/20240103181249_premium.sql @@ -3,5 +3,3 @@ alter table "public"."user_settings" add column "is_premium" boolean not null de alter table "public"."user_settings" alter column "max_brain_size" set not null; alter table "public"."user_settings" alter column "max_brain_size" set data type bigint using "max_brain_size"::bigint; - - diff --git a/backend/supabase/migrations/20240103181925_cleanup.sql b/backend/supabase/migrations/20240103181925_cleanup.sql index c6f7cbcdaaa5..7f8b2c12238c 100644 --- a/backend/supabase/migrations/20240103181925_cleanup.sql +++ b/backend/supabase/migrations/20240103181925_cleanup.sql @@ -1,3 +1 @@ drop function if exists "public"."match_summaries"(query_embedding vector, match_count integer, match_threshold double precision); - - diff --git a/backend/supabase/migrations/20240103193921_stripe_customers.sql b/backend/supabase/migrations/20240103193921_stripe_customers.sql index 75b60a7de74c..9d8b04c2a730 100644 --- a/backend/supabase/migrations/20240103193921_stripe_customers.sql +++ b/backend/supabase/migrations/20240103193921_stripe_customers.sql @@ -27,4 +27,4 @@ create foreign table public.subscriptions ( options ( object 'products', rowid_column 'id' - ); \ No newline at end of file + ); diff --git a/backend/supabase/migrations/20240103194255_api.sql b/backend/supabase/migrations/20240103194255_api.sql index 01df0f691005..ae741de5a6d5 100644 --- a/backend/supabase/migrations/20240103194255_api.sql +++ b/backend/supabase/migrations/20240103194255_api.sql @@ -1,3 +1 @@ alter table "public"."user_settings" add column "API_ACCESS" boolean not null default false; - - diff --git a/backend/supabase/migrations/20240103204741_product_to_features.sql b/backend/supabase/migrations/20240103204741_product_to_features.sql index e148d7b6b526..739e1bf0fa73 100644 --- a/backend/supabase/migrations/20240103204741_product_to_features.sql +++ b/backend/supabase/migrations/20240103204741_product_to_features.sql @@ -62,5 +62,3 @@ grant trigger on table "public"."product_to_features" to "service_role"; grant truncate on table "public"."product_to_features" to "service_role"; grant update on table "public"."product_to_features" to "service_role"; - - diff --git a/backend/supabase/migrations/20240103231656_product.sql b/backend/supabase/migrations/20240103231656_product.sql index a310673be342..796c8459d16a 100644 --- a/backend/supabase/migrations/20240103231656_product.sql +++ b/backend/supabase/migrations/20240103231656_product.sql @@ -1,3 +1 @@ alter table "public"."product_to_features" alter column "models" set not null; - - diff --git a/backend/supabase/migrations/20240103234423_models.sql b/backend/supabase/migrations/20240103234423_models.sql index 10f70d7979ad..3b53727ff55d 100644 --- a/backend/supabase/migrations/20240103234423_models.sql +++ b/backend/supabase/migrations/20240103234423_models.sql @@ -51,5 +51,3 @@ grant trigger on table "public"."models" to "service_role"; grant truncate on table "public"."models" to "service_role"; grant update on table "public"."models" to "service_role"; - - diff --git a/backend/supabase/migrations/20240107231636_policies.sql b/backend/supabase/migrations/20240107231636_policies.sql index 6475635765d1..72516fe5a9ec 100644 --- a/backend/supabase/migrations/20240107231636_policies.sql +++ b/backend/supabase/migrations/20240107231636_policies.sql @@ -484,6 +484,3 @@ on "public"."vectors" as permissive for all to service_role; - - - diff --git a/backend/supabase/migrations/20240119070124_search.sql b/backend/supabase/migrations/20240119070124_search.sql index ffe47c035b94..514957ef8d08 100644 --- a/backend/supabase/migrations/20240119070124_search.sql +++ b/backend/supabase/migrations/20240119070124_search.sql @@ -23,5 +23,3 @@ begin end; $function$ ; - - diff --git a/backend/supabase/migrations/20240119222036_metadata.sql b/backend/supabase/migrations/20240119222036_metadata.sql index 48ad0ae8430e..d139f5394dfb 100644 --- a/backend/supabase/migrations/20240119222036_metadata.sql +++ b/backend/supabase/migrations/20240119222036_metadata.sql @@ -1,5 +1,3 @@ drop function if exists "public"."match_documents"(query_embedding vector, match_count integer); alter table "public"."chat_history" add column "metadata" jsonb; - - diff --git a/backend/supabase/migrations/20240120004107_tags.sql b/backend/supabase/migrations/20240120004107_tags.sql index 964c984ffa8e..fe6f2fdf6426 100644 --- a/backend/supabase/migrations/20240120004107_tags.sql +++ b/backend/supabase/migrations/20240120004107_tags.sql @@ -1,5 +1,3 @@ create type "public"."tags" as enum ('Finance', 'Legal', 'Health', 'Technology', 'Education', 'Resources', 'Marketing', 'Strategy', 'Operations', 'Compliance', 'Research', 'Innovation', 'Sustainability', 'Management', 'Communication', 'Data', 'Quality', 'Logistics', 'Policy', 'Design', 'Safety', 'Customer', 'Development', 'Reporting', 'Collaboration'); alter table "public"."brains" add column "tags" tags[]; - - diff --git a/backend/supabase/migrations/20240121195523_fix-public.sql b/backend/supabase/migrations/20240121195523_fix-public.sql index 1f2454e81c4b..0b664134a39e 100644 --- a/backend/supabase/migrations/20240121195523_fix-public.sql +++ b/backend/supabase/migrations/20240121195523_fix-public.sql @@ -21,7 +21,7 @@ BEGIN LEFT JOIN brains_users bu ON b.brain_id = bu.brain_id WHERE - (b.status = 'public') OR + (b.status = 'public') OR (bu.user_id = p_user_id AND bu.rights IN ('Owner', 'Editor', 'Viewer')) ORDER BY b.meaning <=> query_embedding @@ -30,5 +30,3 @@ BEGIN END; $function$ ; - - diff --git a/backend/supabase/migrations/20240122194117_monthly-credit.sql b/backend/supabase/migrations/20240122194117_monthly-credit.sql index fb0de78986ad..b8ed42a0c5ba 100644 --- a/backend/supabase/migrations/20240122194117_monthly-credit.sql +++ b/backend/supabase/migrations/20240122194117_monthly-credit.sql @@ -5,5 +5,3 @@ alter table "public"."product_to_features" add column "monthly_chat_credit" inte alter table "public"."user_settings" drop column "daily_chat_credit"; alter table "public"."user_settings" add column "monthly_chat_credit" integer default 100; - - diff --git a/backend/supabase/migrations/20240125230346_raw.sql b/backend/supabase/migrations/20240125230346_raw.sql index c51bc8a48e9d..5717dd73f2bc 100644 --- a/backend/supabase/migrations/20240125230346_raw.sql +++ b/backend/supabase/migrations/20240125230346_raw.sql @@ -7,5 +7,3 @@ alter table "public"."api_brain_definition" alter column "brain_id" set not null CREATE UNIQUE INDEX api_brain_definition_pkey ON public.api_brain_definition USING btree (brain_id); alter table "public"."api_brain_definition" add constraint "api_brain_definition_pkey" PRIMARY KEY using index "api_brain_definition_pkey"; - - diff --git a/backend/supabase/migrations/20240206040636_notion.sql b/backend/supabase/migrations/20240206040636_notion.sql index 905ee000b44f..33873acd658a 100644 --- a/backend/supabase/migrations/20240206040636_notion.sql +++ b/backend/supabase/migrations/20240206040636_notion.sql @@ -161,5 +161,3 @@ grant trigger on table "public"."integrations_user" to "service_role"; grant truncate on table "public"."integrations_user" to "service_role"; grant update on table "public"."integrations_user" to "service_role"; - - diff --git a/backend/supabase/migrations/20240207034043_related.sql b/backend/supabase/migrations/20240207034043_related.sql index a5a13b1ff7ea..2933515e3e9a 100644 --- a/backend/supabase/migrations/20240207034043_related.sql +++ b/backend/supabase/migrations/20240207034043_related.sql @@ -35,5 +35,3 @@ BEGIN END; $function$ ; - - diff --git a/backend/supabase/migrations/20240207071108_chunk.sql b/backend/supabase/migrations/20240207071108_chunk.sql index 53dd497522a9..67e1db7942bb 100644 --- a/backend/supabase/migrations/20240207071108_chunk.sql +++ b/backend/supabase/migrations/20240207071108_chunk.sql @@ -57,5 +57,3 @@ BEGIN END; $function$ ; - - diff --git a/backend/supabase/migrations/20240216192826_integration.sql b/backend/supabase/migrations/20240216192826_integration.sql index 3528b1d0f553..582fb877e78b 100644 --- a/backend/supabase/migrations/20240216192826_integration.sql +++ b/backend/supabase/migrations/20240216192826_integration.sql @@ -4,4 +4,4 @@ alter table "public"."integrations" add column "description" text not null defau alter table "public"."integrations" add column "integration_type" integration_type not null default 'custom'::integration_type; -alter table "public"."integrations" add column "max_files" integer not null default 0; \ No newline at end of file +alter table "public"."integrations" add column "max_files" integer not null default 0; diff --git a/backend/supabase/migrations/20240228182948_notion.sql b/backend/supabase/migrations/20240228182948_notion.sql index d9000625bfdf..c031df8a7dc2 100644 --- a/backend/supabase/migrations/20240228182948_notion.sql +++ b/backend/supabase/migrations/20240228182948_notion.sql @@ -40,6 +40,3 @@ as permissive for all to service_role with check (true); - - - diff --git a/backend/supabase/migrations/20240304223646_integrations-all.sql b/backend/supabase/migrations/20240304223646_integrations-all.sql index 872fce44cc7a..90307ab9b5ee 100644 --- a/backend/supabase/migrations/20240304223646_integrations-all.sql +++ b/backend/supabase/migrations/20240304223646_integrations-all.sql @@ -9,5 +9,3 @@ alter table "public"."integrations" alter column integration_type type "public". alter table "public"."integrations" alter column "integration_type" set default 'custom'::integration_type; drop type "public"."integration_type__old_version_to_be_dropped"; - - diff --git a/backend/supabase/migrations/20240305225452_tags-integration.sql b/backend/supabase/migrations/20240305225452_tags-integration.sql index c30ef962ae9f..20efd2c44877 100644 --- a/backend/supabase/migrations/20240305225452_tags-integration.sql +++ b/backend/supabase/migrations/20240305225452_tags-integration.sql @@ -3,5 +3,3 @@ create type "public"."brain_tags" as enum ('new', 'recommended', 'most_popular', alter table "public"."integrations" add column "information" text; alter table "public"."integrations" add column "tags" brain_tags[]; - - diff --git a/backend/supabase/migrations/20240306013910_allow_model_change.sql b/backend/supabase/migrations/20240306013910_allow_model_change.sql index 21ef8afe0f6b..0c112e02a592 100644 --- a/backend/supabase/migrations/20240306013910_allow_model_change.sql +++ b/backend/supabase/migrations/20240306013910_allow_model_change.sql @@ -1,3 +1 @@ alter table "public"."integrations" add column "allow_model_change" boolean not null default true; - - diff --git a/backend/supabase/migrations/20240306205133_integration_display_name.sql b/backend/supabase/migrations/20240306205133_integration_display_name.sql index 97047501bcb2..d9aa394fb5e9 100644 --- a/backend/supabase/migrations/20240306205133_integration_display_name.sql +++ b/backend/supabase/migrations/20240306205133_integration_display_name.sql @@ -1,3 +1 @@ alter table "public"."integrations" add column "integration_display_name" text not null default 'Brain'::text; - - diff --git a/backend/supabase/migrations/20240313024244_onboarding-user.sql b/backend/supabase/migrations/20240313024244_onboarding-user.sql index 09ab5b41379d..30e5053bdcf9 100644 --- a/backend/supabase/migrations/20240313024244_onboarding-user.sql +++ b/backend/supabase/migrations/20240313024244_onboarding-user.sql @@ -11,5 +11,3 @@ alter table "public"."users" add column "onboarded" boolean not null default fal alter table "public"."user_identity" add constraint "public_user_identity_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE not valid; alter table "public"."user_identity" validate constraint "public_user_identity_user_id_fkey"; - - diff --git a/backend/supabase/migrations/20240314005817_user_identity_company_info.sql b/backend/supabase/migrations/20240314005817_user_identity_company_info.sql index 93323709b534..488a79241592 100644 --- a/backend/supabase/migrations/20240314005817_user_identity_company_info.sql +++ b/backend/supabase/migrations/20240314005817_user_identity_company_info.sql @@ -3,5 +3,3 @@ create type "public"."user_identity_company_size" as enum ('1-10', '10-25', '25- alter table "public"."user_identity" add column "company_size" user_identity_company_size; alter table "public"."user_identity" add column "role_in_company" text; - - diff --git a/backend/supabase/migrations/20240316195514_usage_purpose.sql b/backend/supabase/migrations/20240316195514_usage_purpose.sql index 657e89e4396e..861f3cc6210b 100644 --- a/backend/supabase/migrations/20240316195514_usage_purpose.sql +++ b/backend/supabase/migrations/20240316195514_usage_purpose.sql @@ -1,5 +1,3 @@ alter table "public"."user_identity" drop column "role_in_company"; alter table "public"."user_identity" add column "usage_purpose" text; - - diff --git a/backend/supabase/migrations/20240320215813_fix_match_vector_function.sql b/backend/supabase/migrations/20240320215813_fix_match_vector_function.sql index 95a1833cd0a1..aef608832566 100644 --- a/backend/supabase/migrations/20240320215813_fix_match_vector_function.sql +++ b/backend/supabase/migrations/20240320215813_fix_match_vector_function.sql @@ -47,4 +47,4 @@ BEGIN WHERE running_total <= max_chunk_sum; END; $function$ -; \ No newline at end of file +; diff --git a/backend/supabase/migrations/20240329212126_onboarding_brain.sql b/backend/supabase/migrations/20240329212126_onboarding_brain.sql index a2e01442b845..1c7e9e4e94c0 100644 --- a/backend/supabase/migrations/20240329212126_onboarding_brain.sql +++ b/backend/supabase/migrations/20240329212126_onboarding_brain.sql @@ -1,3 +1 @@ alter table "public"."integrations" add column "onboarding_brain" boolean default false; - - diff --git a/backend/supabase/migrations/20240330233534_ingestion.sql b/backend/supabase/migrations/20240330233534_ingestion.sql index 22cd051e5888..836759b2c7f1 100644 --- a/backend/supabase/migrations/20240330233534_ingestion.sql +++ b/backend/supabase/migrations/20240330233534_ingestion.sql @@ -64,6 +64,3 @@ on "public"."integrations" as permissive for all to service_role; - - - diff --git a/backend/supabase/migrations/20240402005455_ingestion.sql b/backend/supabase/migrations/20240402005455_ingestion.sql index fde81c328ad7..70168f3b00ae 100644 --- a/backend/supabase/migrations/20240402005455_ingestion.sql +++ b/backend/supabase/migrations/20240402005455_ingestion.sql @@ -1,5 +1,3 @@ alter table "public"."ingestions" add column "brain_id_required" boolean not null default true; alter table "public"."ingestions" add column "file_1_required" boolean not null default false; - - diff --git a/backend/supabase/migrations/20240402013303_ingestion_url.sql b/backend/supabase/migrations/20240402013303_ingestion_url.sql index 389317062280..cdd1cd670457 100644 --- a/backend/supabase/migrations/20240402013303_ingestion_url.sql +++ b/backend/supabase/migrations/20240402013303_ingestion_url.sql @@ -1,3 +1 @@ alter table "public"."ingestions" add column "url_required" boolean default false; - - diff --git a/backend/supabase/migrations/20240402015128_seed-ingestions.sql b/backend/supabase/migrations/20240402015128_seed-ingestions.sql index 1db2d55462a6..6d34cb68b08d 100644 --- a/backend/supabase/migrations/20240402015128_seed-ingestions.sql +++ b/backend/supabase/migrations/20240402015128_seed-ingestions.sql @@ -14,4 +14,4 @@ INSERT INTO "public"."ingestions" ("name", "id", "brain_id_required", "file_1_re SELECT 'crawler', '948ae685-5710-4dde-bb80-36ce0097ca7b', true, false, true WHERE NOT EXISTS ( SELECT 1 FROM "public"."ingestions" WHERE "id" = '948ae685-5710-4dde-bb80-36ce0097ca7b' -); \ No newline at end of file +); diff --git a/backend/supabase/migrations/20240410112108_assistant.sql b/backend/supabase/migrations/20240410112108_assistant.sql index 64f19222fb39..5c22cfb01100 100644 --- a/backend/supabase/migrations/20240410112108_assistant.sql +++ b/backend/supabase/migrations/20240410112108_assistant.sql @@ -110,6 +110,3 @@ on "public"."assistants" as permissive for all to service_role; - - - diff --git a/backend/supabase/migrations/20240501180719_notifications.sql b/backend/supabase/migrations/20240501180719_notifications.sql index 6f098a2df51e..43f7308475f0 100644 --- a/backend/supabase/migrations/20240501180719_notifications.sql +++ b/backend/supabase/migrations/20240501180719_notifications.sql @@ -30,6 +30,3 @@ as permissive for all to public using ((user_id = auth.uid())); - - - diff --git a/backend/supabase/migrations/20240506150059_timestampz.sql b/backend/supabase/migrations/20240506150059_timestampz.sql index 0db154892430..4dcecd12e602 100644 --- a/backend/supabase/migrations/20240506150059_timestampz.sql +++ b/backend/supabase/migrations/20240506150059_timestampz.sql @@ -4,5 +4,3 @@ alter table "public"."notifications" alter column "datetime" set data type times alter publication supabase_realtime add table notifications - - diff --git a/backend/supabase/migrations/20240514080520_rls_optim.sql b/backend/supabase/migrations/20240514080520_rls_optim.sql index 64b74d3968d2..cbb000b5880a 100644 --- a/backend/supabase/migrations/20240514080520_rls_optim.sql +++ b/backend/supabase/migrations/20240514080520_rls_optim.sql @@ -6,6 +6,3 @@ as permissive for all to public using ((user_id = ( SELECT auth.uid() AS uid))); - - - diff --git a/backend/supabase/migrations/20240516143634_syncs.sql b/backend/supabase/migrations/20240516143634_syncs.sql index b6af113e8c28..3ceee412b7d3 100644 --- a/backend/supabase/migrations/20240516143634_syncs.sql +++ b/backend/supabase/migrations/20240516143634_syncs.sql @@ -126,5 +126,3 @@ grant trigger on table "public"."syncs_user" to "service_role"; grant truncate on table "public"."syncs_user" to "service_role"; grant update on table "public"."syncs_user" to "service_role"; - - diff --git a/backend/supabase/migrations/20240521144817_syncs-files.sql b/backend/supabase/migrations/20240521144817_syncs-files.sql index df200ef77d69..80f70fa97e30 100644 --- a/backend/supabase/migrations/20240521144817_syncs-files.sql +++ b/backend/supabase/migrations/20240521144817_syncs-files.sql @@ -81,6 +81,3 @@ on "public"."syncs_user" as permissive for all to service_role; - - - diff --git a/backend/supabase/migrations/20240529132812_syncs-emails.sql b/backend/supabase/migrations/20240529132812_syncs-emails.sql index 4138d1c1770c..83c569665510 100644 --- a/backend/supabase/migrations/20240529132812_syncs-emails.sql +++ b/backend/supabase/migrations/20240529132812_syncs-emails.sql @@ -1,3 +1 @@ alter table "public"."syncs_user" add column "email" text; - - diff --git a/backend/supabase/migrations/local_20240107152745_ollama.sql b/backend/supabase/migrations/local_20240107152745_ollama.sql index 59fd5dade72e..ded05c75fe95 100644 --- a/backend/supabase/migrations/local_20240107152745_ollama.sql +++ b/backend/supabase/migrations/local_20240107152745_ollama.sql @@ -1,5 +1,3 @@ alter table "public"."vectors" alter column "embedding" set not null; alter table "public"."vectors" alter column "embedding" set data type vector using "embedding"::vector; - - diff --git a/backend/tests/crawl/__init__.py b/backend/tests/crawl/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/backend/tests/crawl/test_crawl.py b/backend/tests/crawl/test_crawl.py new file mode 100644 index 000000000000..a926dbedd470 --- /dev/null +++ b/backend/tests/crawl/test_crawl.py @@ -0,0 +1,9 @@ +from backend.packages.files.crawl.crawler import CrawlWebsite + + +def test_crawl(): + url = "https://en.wikipedia.org/wiki/Python_(programming_language)" + crawl_website = CrawlWebsite(url=url) + extracted_content = crawl_website.process() + + assert len(extracted_content) > 1 diff --git a/backend/tests/file_process/__init__.py b/backend/tests/file_process/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/backend/tests/file_process/dummy.pdf b/backend/tests/file_process/dummy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8da27b526712a5e417279d7dd2fd7e913b45d47e GIT binary patch literal 7478 zcmeHMYj7LY6?ULN5jF{h@<^C+qmYSBkoT=!30YuER^njUjwE6S$HA-JYkOm9SM08^ zoGFF!h8fzD5HOFS;nfLKIt_#wTA(2v5*~$82y}o1b}3Q@h9j%8EZh*iW; zy-4ImiRwp;NOdEY@iSB(kW)xxIEGq@h7m9N5#tv|!r>OIt3(EBbhUU2CLVKU3bc4= z_hS6WxkGxHCedO&jiDua7L5(CvuL~+m_?I#rk=*q5?@cF{j>RKVp~~1+my8oHd{P^ zQ4-)mEKd!X_%eWkrKzC=9!uI;1Y)R!Vc38PK$@U>^f3dux6$EHObP^IkpRQ_J7b(b z7ULPFONw>!T#Sy05iuGL@li1#M51CO&@FYce0M;M_`AC4F0o691tKvaOpx|iwrtu( zMClgK(xu(~u@(=(y~V?FRldafxIKYHfr=nWpki9a#wHcZ$Tp5*#ZWQTgBV%_H~Rxr z5^+*EY}qE3v*50M>Cw?qJUV*MOHJQ9_qOJ3SDtkC^SfR}SDyW>XHRqU&gQ#c-f`M* zS2bBPr=Ko;biu^2%Wqh7kXvx)mq)GR79D-{t*xn4GuqX3*Rtcp77s**E7y$?7MxcO zxT2B(VgvmKhZzK)5dc!fg<%m%BUDlK0olx2;ERZn$!B#7al{*{rr3sw7&aU(I*Ade z)N~Fz{;4r8omNM|!rj--JF2;9-l3*N4YYK8=%z(nHYbTQNrqq>V6<|wf&t2L3(*uA zg@m!qJcgO$*p^k*4fXeDCczE_?$@;244tub&xy2=~x^A1v17s%%YFC9{zVz zcT-=JuW3b7SKEJ?*qtbiGZrFlN>oytA@W^7BBqh+G77_xnn(x;?ch?0XGh>^6YI9C zb5Xq_iQp75bQ?x3#7K^&3B!h1BmjczEiHjizV+ z-uVODA9?jq{-C{@9@xIaGA~{8-rlMC{(+U$hkNHA&kWG1@AtgFS9pb^=_Ypb4@Vz1 zkBKbVdg{>&u(own-*E4^Ha7b3f=w?zxIb~{UBeG8c<;ckezED2dv4$S%bEMOp0R1q z2cMq6|4q2&1jwRurWb8(6rThHSM_8*ZIeJxK?pil60oA!QcNvJQi3IZN;s~MOvoff z7-~>c?Fnm`70B4P@e!T876el8>OYOCwOl+;LLK6XuBC$yMG1-UM@DK#i@)5NX?ld} zk}XV(r&3xLTYY#cVPs`}AQ?}AQ%%cu%;#9DTZam$>Ei%{-l88x;ji< zBn^CmUqU_(7DFft5biWBj!>ONPAR}Rj4?T@Wu{x5*%8=@97Efvh@4wloX9WusUi2? zC-DAa{MSYX)dO`xQ#$qW3?yQe$s}uBlluqau1vj5GN=koFSpN?;M^xiL--7_18a<_E6eBVch zUU+8n;@DRY?YsEqmFX{fTTkh3rw<=^{ha4_T)en<%ej}YzbtprXV)Ed=?ll~{%Yr{ zi`IX7;%(awAGc}CiVrs*^X%q-e!U34-SOJClc%rK4j+9>YT5c-3&#$i2V$OAmTg^Z zd>lD*;O!@pf8E};sB7y#j*s7Q-Y2i`T>9Aicb@oX?TPs6EvNk9{@9*}PkZtCFK-In z-^mXyT=UqY7cM!N{2+MRTZtbnIQ5*j9>4MA(5h>%xMT5+C-1vp;r_GOJ^GvZ$G^Dz zvIllO`KNhL5AV8rtu1}D@pt<2Gj?46o6j$qcWl#{=l$`l29>93`R>bSEm#Cd*O92| z0;{@^Bo(bh0!eT;sv<@n;vTw5Qn#Fyj=E4&tzl=Csg_mMotDbnP`tMkKs?RSMH!`a zw-PL&^9!&{PhuOT@wldUc>n(7(_W;h9o|79PRDZ*JfW@JXyW9?zLc_YQVFQu^TVD{ zAy~-fvapJyLN=pY!9s^uhTawj;hvBwFLGGy$qsKP89+nv0TeMzjQDoir*P0Y@O(Qf zZ~>M%7bWvL>Q`(;GbEd#UlxN5ALIhwFzMMsraBf(L}Tt;@TokX?K_pkvs9e=V zy4CI&*sd5^3I-^qoukT<;gJv!gRs`Bc?Fx{PQ^6RvW=peWosGeijmaLw9}{+N~vm0 zS#2RAq{8pc9-@d!RVq666X|vIIj9aUaY3rrz0gqkLNH=vbFw}iPDXoC540hsF53W; zoN<(`j8~u{Mi+ufr~fE5YT>FzjpKNpbDyr``nD}D$hpP_!vNSz*E$P`!3gy6(B{Km zm~@stTJo_%io~4|WTfRZ6Qt=7RmWLndwIk#Q-+Z#`yBeLxI9^OIU0k`V$d+vDnTxL zog@do>BicyOtm&uob@u?wt7xds(HTyXT;;*?2c@9mPg|8VAN3ZSy=3QqTzgAQ-dNj z{G6yVK2?!eACCpeCrbgpPsB{xF9fhGs(uIB+GlHVfw3MPHiSBCGF-Wm$g9wd%RZ4y zb3R^@Ri8X2U>~o@GB2fNX)I9meeJWeL$Y^1vnCEa; z5lDue?5};WWL(`u-&&zim9m?1c{AfwQdOaF1`{_}kU31PpHw9XF`bp|u$;?5TjZ1o zQp`eBWvF6S2#5+vG{dYjmQ=J_TM2e9dH@adYZqDA{9mAII2X~t*6a*!Fn?#J&UKaf z$r=#Mz}B$CTkxrPOwMO)Z#bIIW~UKkID#s!XABtfNC^p?8PD#);m~d zsq#WwtG$ENckr*`xbHxCN#v19N=VG<`v_cff~mxG1g;VibNW64*PLJ~F&%-cgv6Y_ zkH9r2m`Y6F1ed3>RfjWz4(}9f#2dVLAa52+uMbGy1sgcB9jJSK?(A=t(e$!5sxxm- z7-p;6Zo$j3Vz<^>+QK&6&a{!&%Fb4|%vZnFU02%cu4`+fV9(M(3uj+b)WY3+w$9pn zwo$bk$7(~I?PVLhU4-tgb#`k8Cj_O}Ywk%9VubQJ8hLBz7X(f~aO&n9V$tOIu5zB` z()=vET_IQH4334Z$84GeZ*=PTM37!b^TW2Ip5{DNr_28bZPu9{BLJw?r)v!3FQ2dd E2LO^uS^xk5 literal 0 HcmV?d00001 diff --git a/backend/tests/file_process/test_pdf_process.py b/backend/tests/file_process/test_pdf_process.py new file mode 100644 index 000000000000..8592446c918a --- /dev/null +++ b/backend/tests/file_process/test_pdf_process.py @@ -0,0 +1,34 @@ +import os +from tempfile import NamedTemporaryFile + +import pytest +from langchain_community.document_loaders import UnstructuredPDFLoader + +from backend.models.files import File + + +@pytest.fixture +def pdf_file(): + file_path = "tests/file_process/dummy.pdf" + file_name = os.path.basename(file_path) + with NamedTemporaryFile( + suffix="_" + file_name, # pyright: ignore reportPrivateUsage=none + ) as tmp_file: + with open(file_path, "rb") as f: + content = f.read() + tmp_file.write(content) + tmp_file.flush() + yield File( + file_name="dummy", + tmp_file_path=tmp_file.name, + file_extension="pdf", + bytes_content=content, + file_size=len(content), + ) + + +def test_pdf_process(pdf_file): + pdf_file.compute_documents(UnstructuredPDFLoader) + + assert len(pdf_file.documents) > 0 + assert pdf_file.documents[0].page_content == "Dummy PDF download" diff --git a/backend/tests/ragas_evaluation/run_evaluation.py b/backend/tests/ragas_evaluation/run_evaluation.py index 376b7de29165..7f8e7021f305 100644 --- a/backend/tests/ragas_evaluation/run_evaluation.py +++ b/backend/tests/ragas_evaluation/run_evaluation.py @@ -15,18 +15,19 @@ import pandas as pd import ragas -from celery_worker import process_file_and_notify from datasets import Dataset from langchain_core.runnables.base import RunnableSerializable from langchain_openai import ChatOpenAI, OpenAIEmbeddings -from modules.brain.rags.quivr_rag import QuivrRAG -from modules.brain.service.brain_service import BrainService -from modules.knowledge.dto.inputs import CreateKnowledgeProperties -from modules.knowledge.service.knowledge_service import KnowledgeService -from modules.upload.service.upload_file import upload_file_storage from ragas import evaluate from ragas.embeddings.base import LangchainEmbeddingsWrapper +from backend.celery_worker import process_file_and_notify +from backend.modules.brain.rags.quivr_rag import QuivrRAG +from backend.modules.brain.service.brain_service import BrainService +from backend.modules.knowledge.dto.inputs import CreateKnowledgeProperties +from backend.modules.knowledge.service.knowledge_service import KnowledgeService +from backend.modules.upload.service.upload_file import upload_file_storage + def main( testset_path, input_folder, output_folder, model, context_size, metrics, brain_id @@ -158,7 +159,7 @@ def generate_replies( { "question": test_questions, "answer": answers, - "thoughs" : thoughts, + "thoughs": thoughts, "contexts": contexts, "ground_truth": test_groundtruths, } diff --git a/backend/tests/test_brains.py b/backend/tests/test_brains.py index 12a21bfcc6f8..fe6552db1c20 100644 --- a/backend/tests/test_brains.py +++ b/backend/tests/test_brains.py @@ -1,9 +1,13 @@ import pytest -from modules.brain.dto.inputs import BrainIntegrationSettings, CreateBrainProperties -from modules.brain.entity.brain_entity import BrainEntity, BrainType -from modules.brain.service.brain_service import BrainService from pydantic import ValidationError +from backend.modules.brain.dto.inputs import ( + BrainIntegrationSettings, + CreateBrainProperties, +) +from backend.modules.brain.entity.brain_entity import BrainEntity, BrainType +from backend.modules.brain.service.brain_service import BrainService + @pytest.fixture def brain_service(): @@ -31,7 +35,7 @@ def test_create_brain_with_user_id(brain_service, user_id, integration_id): name="Innovative Brain", description="A brain representing innovative ideas", # Add other necessary fields and values - brain_type="integration", + brain_type=BrainType.doc, integration=BrainIntegrationSettings( integration_id=integration_id, settings={}, @@ -72,12 +76,11 @@ def test_create_brain_with_invalid_user_id(brain_service): # Generate a test that checks CreateBrainProperties with invalid data def test_create_brain_with_invalid_brain_type(brain_service): - with pytest.raises(ValidationError): invalid_brain_data = CreateBrainProperties( name="Invalid Brain", description="Should fail due to invalid data", - brain_type="invalid-brain-type", + brain_type="invalid-brain-type", # type: ignore integration=BrainIntegrationSettings( integration_id="valid-integration-id", settings={}, @@ -105,7 +108,7 @@ def test_create_brain_with_valid_brain_type_integration( brain_id = created_brain.brain_id # Assert - assert created_brain.brain_type == BrainType.INTEGRATION + assert created_brain.brain_type == BrainType.integration finally: # Teardown step: delete the brain if it was created if brain_id: @@ -122,7 +125,7 @@ def test_create_brain_with_valid_brain_type_doc(brain_service, user_id): brain_type="doc", ) created_brain = brain_service.create_brain(user_id, valid_brain_data) - assert created_brain.brain_type == BrainType.DOC + assert created_brain.brain_type == BrainType.doc finally: # Teardown step: delete the brain if it was created if brain_id: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 6f009fc84e84..b227fc34b69a 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -20,7 +20,7 @@ services: - ./backend/:/code/ command: - "uvicorn" - - "main:app" + - "backend.main:app" - "--reload" - "--host" - "0.0.0.0" @@ -51,9 +51,9 @@ services: env_file: - .env container_name: worker - # volumes: - # - ./backend/:/code/ - command: celery -A celery_worker worker -l info + volumes: + - ./backend/:/code/ + command: "watchfiles 'celery -A backend.celery_worker worker -l info' " restart: always depends_on: - redis @@ -67,7 +67,9 @@ services: - .env container_name: beat - command: celery -A celery_worker beat -l info + command: celery -A backend.celery_worker beat -l info + volumes: + - ./backend/:/code/ restart: always depends_on: - redis @@ -79,9 +81,10 @@ services: - "host.docker.internal:host-gateway" env_file: - .env - container_name: flower - command: celery -A celery_worker flower -l info --port=5555 + command: celery -A backend.celery_worker flower -l info --port=5555 + volumes: + - ./backend/:/code/ restart: always depends_on: - redis diff --git a/docker-compose.yml b/docker-compose.yml index 7713d5f4e3e5..e4c4d5c615dd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,8 +16,8 @@ services: - NEXT_PUBLIC_FRONTEND_URL=${NEXT_PUBLIC_FRONTEND_URL} - NEXT_PUBLIC_AUTH_MODES=${NEXT_PUBLIC_AUTH_MODES} container_name: web - depends_on: - - backend-core + # depends_on: + # - backend-core restart: always ports: - 3000:3000 @@ -37,7 +37,7 @@ services: test: [ "CMD", "curl", "http://localhost:5050/healthz" ] command: - "uvicorn" - - "main:app" + - "backend.main:app" - "--host" - "0.0.0.0" - "--port" @@ -68,7 +68,7 @@ services: container_name: worker extra_hosts: - "host.docker.internal:host-gateway" - command: celery -A celery_worker worker -l info + command: celery -A backend.celery_worker worker -l info restart: always depends_on: - redis @@ -84,7 +84,7 @@ services: container_name: beat extra_hosts: - "host.docker.internal:host-gateway" - command: celery -A celery_worker beat -l info + command: celery -A backend.celery_worker beat -l info restart: always depends_on: - redis @@ -100,7 +100,7 @@ services: container_name: flower extra_hosts: - "host.docker.internal:host-gateway" - command: celery -A celery_worker flower -l info --port=5555 + command: celery -A backend.celery_worker flower -l info --port=5555 restart: always depends_on: - redis diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/FromConnections.module.scss b/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/FromConnections.module.scss index 7cd11968cbb9..7a053dbed540 100644 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/FromConnections.module.scss +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/FromConnections.module.scss @@ -33,4 +33,4 @@ } } } -} \ No newline at end of file +} diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/SyncElementLine/SyncElementLine.module.scss b/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/SyncElementLine/SyncElementLine.module.scss index 287b633f2812..dd2fdabc4474 100644 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/SyncElementLine/SyncElementLine.module.scss +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/SyncElementLine/SyncElementLine.module.scss @@ -25,4 +25,4 @@ background-color: var(--background-0); } } -} \ No newline at end of file +} diff --git a/frontend/app/user/components/Connections/Connections.module.scss b/frontend/app/user/components/Connections/Connections.module.scss index f90d51ddaa2a..03fcf4e323ec 100644 --- a/frontend/app/user/components/Connections/Connections.module.scss +++ b/frontend/app/user/components/Connections/Connections.module.scss @@ -12,4 +12,4 @@ .title { @include Typography.H2; } -} \ No newline at end of file +} diff --git a/frontend/app/user/components/Settings/Settings.module.scss b/frontend/app/user/components/Settings/Settings.module.scss index 23da89034dd4..a6be8aec39c5 100644 --- a/frontend/app/user/components/Settings/Settings.module.scss +++ b/frontend/app/user/components/Settings/Settings.module.scss @@ -12,4 +12,4 @@ .title { @include Typography.H2; } -} \ No newline at end of file +} diff --git a/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapCard/BrainRecapCard.module.scss b/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapCard/BrainRecapCard.module.scss index 01a1b9b465dd..e48548da8749 100644 --- a/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapCard/BrainRecapCard.module.scss +++ b/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapCard/BrainRecapCard.module.scss @@ -21,4 +21,4 @@ .type { @include Typography.H1; } -} \ No newline at end of file +} diff --git a/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapStep.module.scss b/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapStep.module.scss index 3343e259dce2..06c266e155c2 100644 --- a/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapStep.module.scss +++ b/frontend/lib/components/AddBrainModal/components/BrainRecapStep/BrainRecapStep.module.scss @@ -73,4 +73,4 @@ display: flex; justify-content: space-between; } -} \ No newline at end of file +} diff --git a/frontend/lib/components/ConnectionCards/ConnectionCards.module.scss b/frontend/lib/components/ConnectionCards/ConnectionCards.module.scss index 2c3d1f0ddcbc..9b8f3f07879c 100644 --- a/frontend/lib/components/ConnectionCards/ConnectionCards.module.scss +++ b/frontend/lib/components/ConnectionCards/ConnectionCards.module.scss @@ -10,4 +10,4 @@ &.spaced { justify-content: space-between; } -} \ No newline at end of file +} diff --git a/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionButton/ConnectionButton.module.scss b/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionButton/ConnectionButton.module.scss index e5259172f4f5..003ca6f6e34e 100644 --- a/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionButton/ConnectionButton.module.scss +++ b/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionButton/ConnectionButton.module.scss @@ -23,4 +23,4 @@ display: flex; gap: Spacings.$spacing02; } -} \ No newline at end of file +} diff --git a/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionLine/ConnectionLine.module.scss b/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionLine/ConnectionLine.module.scss index cf82d4bc93ef..09ae57601971 100644 --- a/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionLine/ConnectionLine.module.scss +++ b/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionLine/ConnectionLine.module.scss @@ -22,4 +22,4 @@ display: flex; gap: Spacings.$spacing02; } -} \ No newline at end of file +} diff --git a/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionSection.module.scss b/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionSection.module.scss index a317e8e6af1c..026a2e08621a 100644 --- a/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionSection.module.scss +++ b/frontend/lib/components/ConnectionCards/ConnectionSection/ConnectionSection.module.scss @@ -81,4 +81,4 @@ } } } -} \ No newline at end of file +} diff --git a/frontend/lib/components/ui/ConnectionIcon/ConnectionIcon.module.scss b/frontend/lib/components/ui/ConnectionIcon/ConnectionIcon.module.scss index 08dbc9580448..60c9928d2024 100644 --- a/frontend/lib/components/ui/ConnectionIcon/ConnectionIcon.module.scss +++ b/frontend/lib/components/ui/ConnectionIcon/ConnectionIcon.module.scss @@ -15,4 +15,4 @@ align-items: center; justify-content: center; border: 2px solid var(--background-0); -} \ No newline at end of file +} diff --git a/frontend/lib/components/ui/Icon/Icon.module.scss b/frontend/lib/components/ui/Icon/Icon.module.scss index ac95c17cb67b..223c052d7af1 100644 --- a/frontend/lib/components/ui/Icon/Icon.module.scss +++ b/frontend/lib/components/ui/Icon/Icon.module.scss @@ -91,4 +91,4 @@ .hovered { cursor: pointer; -} \ No newline at end of file +} diff --git a/frontend/lib/components/ui/SwitchButton/SwitchButton.module.scss b/frontend/lib/components/ui/SwitchButton/SwitchButton.module.scss index 65298a952023..33a77e974af0 100644 --- a/frontend/lib/components/ui/SwitchButton/SwitchButton.module.scss +++ b/frontend/lib/components/ui/SwitchButton/SwitchButton.module.scss @@ -35,4 +35,4 @@ transition: margin-left 0.2s ease-in-out; } } -} \ No newline at end of file +}