ai-parrot 0.17.2__cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentui/.prettierrc +15 -0
- agentui/QUICKSTART.md +272 -0
- agentui/README.md +59 -0
- agentui/env.example +16 -0
- agentui/jsconfig.json +14 -0
- agentui/package-lock.json +4242 -0
- agentui/package.json +34 -0
- agentui/scripts/postinstall/apply-patches.mjs +260 -0
- agentui/src/app.css +61 -0
- agentui/src/app.d.ts +13 -0
- agentui/src/app.html +12 -0
- agentui/src/components/LoadingSpinner.svelte +64 -0
- agentui/src/components/ThemeSwitcher.svelte +159 -0
- agentui/src/components/index.js +4 -0
- agentui/src/lib/api/bots.ts +60 -0
- agentui/src/lib/api/chat.ts +22 -0
- agentui/src/lib/api/http.ts +25 -0
- agentui/src/lib/components/BotCard.svelte +33 -0
- agentui/src/lib/components/ChatBubble.svelte +63 -0
- agentui/src/lib/components/Toast.svelte +21 -0
- agentui/src/lib/config.ts +20 -0
- agentui/src/lib/stores/auth.svelte.ts +73 -0
- agentui/src/lib/stores/theme.svelte.js +64 -0
- agentui/src/lib/stores/toast.svelte.ts +31 -0
- agentui/src/lib/utils/conversation.ts +39 -0
- agentui/src/routes/+layout.svelte +20 -0
- agentui/src/routes/+page.svelte +232 -0
- agentui/src/routes/login/+page.svelte +200 -0
- agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
- agentui/src/routes/talk/[agentId]/+page.ts +7 -0
- agentui/static/README.md +1 -0
- agentui/svelte.config.js +11 -0
- agentui/tailwind.config.ts +53 -0
- agentui/tsconfig.json +3 -0
- agentui/vite.config.ts +10 -0
- ai_parrot-0.17.2.dist-info/METADATA +472 -0
- ai_parrot-0.17.2.dist-info/RECORD +535 -0
- ai_parrot-0.17.2.dist-info/WHEEL +6 -0
- ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
- ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
- ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
- crew-builder/.prettierrc +15 -0
- crew-builder/QUICKSTART.md +259 -0
- crew-builder/README.md +113 -0
- crew-builder/env.example +17 -0
- crew-builder/jsconfig.json +14 -0
- crew-builder/package-lock.json +4182 -0
- crew-builder/package.json +37 -0
- crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
- crew-builder/src/app.css +62 -0
- crew-builder/src/app.d.ts +13 -0
- crew-builder/src/app.html +12 -0
- crew-builder/src/components/LoadingSpinner.svelte +64 -0
- crew-builder/src/components/ThemeSwitcher.svelte +149 -0
- crew-builder/src/components/index.js +9 -0
- crew-builder/src/lib/api/bots.ts +60 -0
- crew-builder/src/lib/api/chat.ts +80 -0
- crew-builder/src/lib/api/client.ts +56 -0
- crew-builder/src/lib/api/crew/crew.ts +136 -0
- crew-builder/src/lib/api/index.ts +5 -0
- crew-builder/src/lib/api/o365/auth.ts +65 -0
- crew-builder/src/lib/auth/auth.ts +54 -0
- crew-builder/src/lib/components/AgentNode.svelte +43 -0
- crew-builder/src/lib/components/BotCard.svelte +33 -0
- crew-builder/src/lib/components/ChatBubble.svelte +67 -0
- crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
- crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
- crew-builder/src/lib/components/JsonViewer.svelte +24 -0
- crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
- crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
- crew-builder/src/lib/components/Toast.svelte +67 -0
- crew-builder/src/lib/components/Toolbar.svelte +157 -0
- crew-builder/src/lib/components/index.ts +10 -0
- crew-builder/src/lib/config.ts +8 -0
- crew-builder/src/lib/stores/auth.svelte.ts +228 -0
- crew-builder/src/lib/stores/crewStore.ts +369 -0
- crew-builder/src/lib/stores/theme.svelte.js +145 -0
- crew-builder/src/lib/stores/toast.svelte.ts +69 -0
- crew-builder/src/lib/utils/conversation.ts +39 -0
- crew-builder/src/lib/utils/markdown.ts +122 -0
- crew-builder/src/lib/utils/talkHistory.ts +47 -0
- crew-builder/src/routes/+layout.svelte +20 -0
- crew-builder/src/routes/+page.svelte +539 -0
- crew-builder/src/routes/agents/+page.svelte +247 -0
- crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
- crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
- crew-builder/src/routes/builder/+page.svelte +204 -0
- crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
- crew-builder/src/routes/crew/ask/+page.ts +1 -0
- crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
- crew-builder/src/routes/login/+page.svelte +197 -0
- crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
- crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
- crew-builder/static/README.md +1 -0
- crew-builder/svelte.config.js +11 -0
- crew-builder/tailwind.config.ts +53 -0
- crew-builder/tsconfig.json +3 -0
- crew-builder/vite.config.ts +10 -0
- mcp_servers/calculator_server.py +309 -0
- parrot/__init__.py +27 -0
- parrot/__pycache__/__init__.cpython-310.pyc +0 -0
- parrot/__pycache__/version.cpython-310.pyc +0 -0
- parrot/_version.py +34 -0
- parrot/a2a/__init__.py +48 -0
- parrot/a2a/client.py +658 -0
- parrot/a2a/discovery.py +89 -0
- parrot/a2a/mixin.py +257 -0
- parrot/a2a/models.py +376 -0
- parrot/a2a/server.py +770 -0
- parrot/agents/__init__.py +29 -0
- parrot/bots/__init__.py +12 -0
- parrot/bots/a2a_agent.py +19 -0
- parrot/bots/abstract.py +3139 -0
- parrot/bots/agent.py +1129 -0
- parrot/bots/basic.py +9 -0
- parrot/bots/chatbot.py +669 -0
- parrot/bots/data.py +1618 -0
- parrot/bots/database/__init__.py +5 -0
- parrot/bots/database/abstract.py +3071 -0
- parrot/bots/database/cache.py +286 -0
- parrot/bots/database/models.py +468 -0
- parrot/bots/database/prompts.py +154 -0
- parrot/bots/database/retries.py +98 -0
- parrot/bots/database/router.py +269 -0
- parrot/bots/database/sql.py +41 -0
- parrot/bots/db/__init__.py +6 -0
- parrot/bots/db/abstract.py +556 -0
- parrot/bots/db/bigquery.py +602 -0
- parrot/bots/db/cache.py +85 -0
- parrot/bots/db/documentdb.py +668 -0
- parrot/bots/db/elastic.py +1014 -0
- parrot/bots/db/influx.py +898 -0
- parrot/bots/db/mock.py +96 -0
- parrot/bots/db/multi.py +783 -0
- parrot/bots/db/prompts.py +185 -0
- parrot/bots/db/sql.py +1255 -0
- parrot/bots/db/tools.py +212 -0
- parrot/bots/document.py +680 -0
- parrot/bots/hrbot.py +15 -0
- parrot/bots/kb.py +170 -0
- parrot/bots/mcp.py +36 -0
- parrot/bots/orchestration/README.md +463 -0
- parrot/bots/orchestration/__init__.py +1 -0
- parrot/bots/orchestration/agent.py +155 -0
- parrot/bots/orchestration/crew.py +3330 -0
- parrot/bots/orchestration/fsm.py +1179 -0
- parrot/bots/orchestration/hr.py +434 -0
- parrot/bots/orchestration/storage/__init__.py +4 -0
- parrot/bots/orchestration/storage/memory.py +100 -0
- parrot/bots/orchestration/storage/mixin.py +119 -0
- parrot/bots/orchestration/verify.py +202 -0
- parrot/bots/product.py +204 -0
- parrot/bots/prompts/__init__.py +96 -0
- parrot/bots/prompts/agents.py +155 -0
- parrot/bots/prompts/data.py +216 -0
- parrot/bots/prompts/output_generation.py +8 -0
- parrot/bots/scraper/__init__.py +3 -0
- parrot/bots/scraper/models.py +122 -0
- parrot/bots/scraper/scraper.py +1173 -0
- parrot/bots/scraper/templates.py +115 -0
- parrot/bots/stores/__init__.py +5 -0
- parrot/bots/stores/local.py +172 -0
- parrot/bots/webdev.py +81 -0
- parrot/cli.py +17 -0
- parrot/clients/__init__.py +16 -0
- parrot/clients/base.py +1491 -0
- parrot/clients/claude.py +1191 -0
- parrot/clients/factory.py +129 -0
- parrot/clients/google.py +4567 -0
- parrot/clients/gpt.py +1975 -0
- parrot/clients/grok.py +432 -0
- parrot/clients/groq.py +986 -0
- parrot/clients/hf.py +582 -0
- parrot/clients/models.py +18 -0
- parrot/conf.py +395 -0
- parrot/embeddings/__init__.py +9 -0
- parrot/embeddings/base.py +157 -0
- parrot/embeddings/google.py +98 -0
- parrot/embeddings/huggingface.py +74 -0
- parrot/embeddings/openai.py +84 -0
- parrot/embeddings/processor.py +88 -0
- parrot/exceptions.c +13868 -0
- parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/exceptions.pxd +22 -0
- parrot/exceptions.pxi +15 -0
- parrot/exceptions.pyx +44 -0
- parrot/generators/__init__.py +29 -0
- parrot/generators/base.py +200 -0
- parrot/generators/html.py +293 -0
- parrot/generators/react.py +205 -0
- parrot/generators/streamlit.py +203 -0
- parrot/generators/template.py +105 -0
- parrot/handlers/__init__.py +4 -0
- parrot/handlers/agent.py +861 -0
- parrot/handlers/agents/__init__.py +1 -0
- parrot/handlers/agents/abstract.py +900 -0
- parrot/handlers/bots.py +338 -0
- parrot/handlers/chat.py +915 -0
- parrot/handlers/creation.sql +192 -0
- parrot/handlers/crew/ARCHITECTURE.md +362 -0
- parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
- parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
- parrot/handlers/crew/__init__.py +0 -0
- parrot/handlers/crew/handler.py +801 -0
- parrot/handlers/crew/models.py +229 -0
- parrot/handlers/crew/redis_persistence.py +523 -0
- parrot/handlers/jobs/__init__.py +10 -0
- parrot/handlers/jobs/job.py +384 -0
- parrot/handlers/jobs/mixin.py +627 -0
- parrot/handlers/jobs/models.py +115 -0
- parrot/handlers/jobs/worker.py +31 -0
- parrot/handlers/models.py +596 -0
- parrot/handlers/o365_auth.py +105 -0
- parrot/handlers/stream.py +337 -0
- parrot/interfaces/__init__.py +6 -0
- parrot/interfaces/aws.py +143 -0
- parrot/interfaces/credentials.py +113 -0
- parrot/interfaces/database.py +27 -0
- parrot/interfaces/google.py +1123 -0
- parrot/interfaces/hierarchy.py +1227 -0
- parrot/interfaces/http.py +651 -0
- parrot/interfaces/images/__init__.py +0 -0
- parrot/interfaces/images/plugins/__init__.py +24 -0
- parrot/interfaces/images/plugins/abstract.py +58 -0
- parrot/interfaces/images/plugins/analisys.py +148 -0
- parrot/interfaces/images/plugins/classify.py +150 -0
- parrot/interfaces/images/plugins/classifybase.py +182 -0
- parrot/interfaces/images/plugins/detect.py +150 -0
- parrot/interfaces/images/plugins/exif.py +1103 -0
- parrot/interfaces/images/plugins/hash.py +52 -0
- parrot/interfaces/images/plugins/vision.py +104 -0
- parrot/interfaces/images/plugins/yolo.py +66 -0
- parrot/interfaces/images/plugins/zerodetect.py +197 -0
- parrot/interfaces/o365.py +978 -0
- parrot/interfaces/onedrive.py +822 -0
- parrot/interfaces/sharepoint.py +1435 -0
- parrot/interfaces/soap.py +257 -0
- parrot/loaders/__init__.py +8 -0
- parrot/loaders/abstract.py +1131 -0
- parrot/loaders/audio.py +199 -0
- parrot/loaders/basepdf.py +53 -0
- parrot/loaders/basevideo.py +1568 -0
- parrot/loaders/csv.py +409 -0
- parrot/loaders/docx.py +116 -0
- parrot/loaders/epubloader.py +316 -0
- parrot/loaders/excel.py +199 -0
- parrot/loaders/factory.py +55 -0
- parrot/loaders/files/__init__.py +0 -0
- parrot/loaders/files/abstract.py +39 -0
- parrot/loaders/files/html.py +26 -0
- parrot/loaders/files/text.py +63 -0
- parrot/loaders/html.py +152 -0
- parrot/loaders/markdown.py +442 -0
- parrot/loaders/pdf.py +373 -0
- parrot/loaders/pdfmark.py +320 -0
- parrot/loaders/pdftables.py +506 -0
- parrot/loaders/ppt.py +476 -0
- parrot/loaders/qa.py +63 -0
- parrot/loaders/splitters/__init__.py +10 -0
- parrot/loaders/splitters/base.py +138 -0
- parrot/loaders/splitters/md.py +228 -0
- parrot/loaders/splitters/token.py +143 -0
- parrot/loaders/txt.py +26 -0
- parrot/loaders/video.py +89 -0
- parrot/loaders/videolocal.py +218 -0
- parrot/loaders/videounderstanding.py +377 -0
- parrot/loaders/vimeo.py +167 -0
- parrot/loaders/web.py +599 -0
- parrot/loaders/youtube.py +504 -0
- parrot/manager/__init__.py +5 -0
- parrot/manager/manager.py +1030 -0
- parrot/mcp/__init__.py +28 -0
- parrot/mcp/adapter.py +105 -0
- parrot/mcp/cli.py +174 -0
- parrot/mcp/client.py +119 -0
- parrot/mcp/config.py +75 -0
- parrot/mcp/integration.py +842 -0
- parrot/mcp/oauth.py +933 -0
- parrot/mcp/server.py +225 -0
- parrot/mcp/transports/__init__.py +3 -0
- parrot/mcp/transports/base.py +279 -0
- parrot/mcp/transports/grpc_session.py +163 -0
- parrot/mcp/transports/http.py +312 -0
- parrot/mcp/transports/mcp.proto +108 -0
- parrot/mcp/transports/quic.py +1082 -0
- parrot/mcp/transports/sse.py +330 -0
- parrot/mcp/transports/stdio.py +309 -0
- parrot/mcp/transports/unix.py +395 -0
- parrot/mcp/transports/websocket.py +547 -0
- parrot/memory/__init__.py +16 -0
- parrot/memory/abstract.py +209 -0
- parrot/memory/agent.py +32 -0
- parrot/memory/cache.py +175 -0
- parrot/memory/core.py +555 -0
- parrot/memory/file.py +153 -0
- parrot/memory/mem.py +131 -0
- parrot/memory/redis.py +613 -0
- parrot/models/__init__.py +46 -0
- parrot/models/basic.py +118 -0
- parrot/models/compliance.py +208 -0
- parrot/models/crew.py +395 -0
- parrot/models/detections.py +654 -0
- parrot/models/generation.py +85 -0
- parrot/models/google.py +223 -0
- parrot/models/groq.py +23 -0
- parrot/models/openai.py +30 -0
- parrot/models/outputs.py +285 -0
- parrot/models/responses.py +938 -0
- parrot/notifications/__init__.py +743 -0
- parrot/openapi/__init__.py +3 -0
- parrot/openapi/components.yaml +641 -0
- parrot/openapi/config.py +322 -0
- parrot/outputs/__init__.py +32 -0
- parrot/outputs/formats/__init__.py +108 -0
- parrot/outputs/formats/altair.py +359 -0
- parrot/outputs/formats/application.py +122 -0
- parrot/outputs/formats/base.py +351 -0
- parrot/outputs/formats/bokeh.py +356 -0
- parrot/outputs/formats/card.py +424 -0
- parrot/outputs/formats/chart.py +436 -0
- parrot/outputs/formats/d3.py +255 -0
- parrot/outputs/formats/echarts.py +310 -0
- parrot/outputs/formats/generators/__init__.py +0 -0
- parrot/outputs/formats/generators/abstract.py +61 -0
- parrot/outputs/formats/generators/panel.py +145 -0
- parrot/outputs/formats/generators/streamlit.py +86 -0
- parrot/outputs/formats/generators/terminal.py +63 -0
- parrot/outputs/formats/holoviews.py +310 -0
- parrot/outputs/formats/html.py +147 -0
- parrot/outputs/formats/jinja2.py +46 -0
- parrot/outputs/formats/json.py +87 -0
- parrot/outputs/formats/map.py +933 -0
- parrot/outputs/formats/markdown.py +172 -0
- parrot/outputs/formats/matplotlib.py +237 -0
- parrot/outputs/formats/mixins/__init__.py +0 -0
- parrot/outputs/formats/mixins/emaps.py +855 -0
- parrot/outputs/formats/plotly.py +341 -0
- parrot/outputs/formats/seaborn.py +310 -0
- parrot/outputs/formats/table.py +397 -0
- parrot/outputs/formats/template_report.py +138 -0
- parrot/outputs/formats/yaml.py +125 -0
- parrot/outputs/formatter.py +152 -0
- parrot/outputs/templates/__init__.py +95 -0
- parrot/pipelines/__init__.py +0 -0
- parrot/pipelines/abstract.py +210 -0
- parrot/pipelines/detector.py +124 -0
- parrot/pipelines/models.py +90 -0
- parrot/pipelines/planogram.py +3002 -0
- parrot/pipelines/table.sql +97 -0
- parrot/plugins/__init__.py +106 -0
- parrot/plugins/importer.py +80 -0
- parrot/py.typed +0 -0
- parrot/registry/__init__.py +18 -0
- parrot/registry/registry.py +594 -0
- parrot/scheduler/__init__.py +1189 -0
- parrot/scheduler/models.py +60 -0
- parrot/security/__init__.py +16 -0
- parrot/security/prompt_injection.py +268 -0
- parrot/security/security_events.sql +25 -0
- parrot/services/__init__.py +1 -0
- parrot/services/mcp/__init__.py +8 -0
- parrot/services/mcp/config.py +13 -0
- parrot/services/mcp/server.py +295 -0
- parrot/services/o365_remote_auth.py +235 -0
- parrot/stores/__init__.py +7 -0
- parrot/stores/abstract.py +352 -0
- parrot/stores/arango.py +1090 -0
- parrot/stores/bigquery.py +1377 -0
- parrot/stores/cache.py +106 -0
- parrot/stores/empty.py +10 -0
- parrot/stores/faiss_store.py +1157 -0
- parrot/stores/kb/__init__.py +9 -0
- parrot/stores/kb/abstract.py +68 -0
- parrot/stores/kb/cache.py +165 -0
- parrot/stores/kb/doc.py +325 -0
- parrot/stores/kb/hierarchy.py +346 -0
- parrot/stores/kb/local.py +457 -0
- parrot/stores/kb/prompt.py +28 -0
- parrot/stores/kb/redis.py +659 -0
- parrot/stores/kb/store.py +115 -0
- parrot/stores/kb/user.py +374 -0
- parrot/stores/models.py +59 -0
- parrot/stores/pgvector.py +3 -0
- parrot/stores/postgres.py +2853 -0
- parrot/stores/utils/__init__.py +0 -0
- parrot/stores/utils/chunking.py +197 -0
- parrot/telemetry/__init__.py +3 -0
- parrot/telemetry/mixin.py +111 -0
- parrot/template/__init__.py +3 -0
- parrot/template/engine.py +259 -0
- parrot/tools/__init__.py +23 -0
- parrot/tools/abstract.py +644 -0
- parrot/tools/agent.py +363 -0
- parrot/tools/arangodbsearch.py +537 -0
- parrot/tools/arxiv_tool.py +188 -0
- parrot/tools/calculator/__init__.py +3 -0
- parrot/tools/calculator/operations/__init__.py +38 -0
- parrot/tools/calculator/operations/calculus.py +80 -0
- parrot/tools/calculator/operations/statistics.py +76 -0
- parrot/tools/calculator/tool.py +150 -0
- parrot/tools/cloudwatch.py +988 -0
- parrot/tools/codeinterpreter/__init__.py +127 -0
- parrot/tools/codeinterpreter/executor.py +371 -0
- parrot/tools/codeinterpreter/internals.py +473 -0
- parrot/tools/codeinterpreter/models.py +643 -0
- parrot/tools/codeinterpreter/prompts.py +224 -0
- parrot/tools/codeinterpreter/tool.py +664 -0
- parrot/tools/company_info/__init__.py +6 -0
- parrot/tools/company_info/tool.py +1138 -0
- parrot/tools/correlationanalysis.py +437 -0
- parrot/tools/database/abstract.py +286 -0
- parrot/tools/database/bq.py +115 -0
- parrot/tools/database/cache.py +284 -0
- parrot/tools/database/models.py +95 -0
- parrot/tools/database/pg.py +343 -0
- parrot/tools/databasequery.py +1159 -0
- parrot/tools/db.py +1800 -0
- parrot/tools/ddgo.py +370 -0
- parrot/tools/decorators.py +271 -0
- parrot/tools/dftohtml.py +282 -0
- parrot/tools/document.py +549 -0
- parrot/tools/ecs.py +819 -0
- parrot/tools/edareport.py +368 -0
- parrot/tools/elasticsearch.py +1049 -0
- parrot/tools/employees.py +462 -0
- parrot/tools/epson/__init__.py +96 -0
- parrot/tools/excel.py +683 -0
- parrot/tools/file/__init__.py +13 -0
- parrot/tools/file/abstract.py +76 -0
- parrot/tools/file/gcs.py +378 -0
- parrot/tools/file/local.py +284 -0
- parrot/tools/file/s3.py +511 -0
- parrot/tools/file/tmp.py +309 -0
- parrot/tools/file/tool.py +501 -0
- parrot/tools/file_reader.py +129 -0
- parrot/tools/flowtask/__init__.py +19 -0
- parrot/tools/flowtask/tool.py +761 -0
- parrot/tools/gittoolkit.py +508 -0
- parrot/tools/google/__init__.py +18 -0
- parrot/tools/google/base.py +169 -0
- parrot/tools/google/tools.py +1251 -0
- parrot/tools/googlelocation.py +5 -0
- parrot/tools/googleroutes.py +5 -0
- parrot/tools/googlesearch.py +5 -0
- parrot/tools/googlesitesearch.py +5 -0
- parrot/tools/googlevoice.py +2 -0
- parrot/tools/gvoice.py +695 -0
- parrot/tools/ibisworld/README.md +225 -0
- parrot/tools/ibisworld/__init__.py +11 -0
- parrot/tools/ibisworld/tool.py +366 -0
- parrot/tools/jiratoolkit.py +1718 -0
- parrot/tools/manager.py +1098 -0
- parrot/tools/math.py +152 -0
- parrot/tools/metadata.py +476 -0
- parrot/tools/msteams.py +1621 -0
- parrot/tools/msword.py +635 -0
- parrot/tools/multidb.py +580 -0
- parrot/tools/multistoresearch.py +369 -0
- parrot/tools/networkninja.py +167 -0
- parrot/tools/nextstop/__init__.py +4 -0
- parrot/tools/nextstop/base.py +286 -0
- parrot/tools/nextstop/employee.py +733 -0
- parrot/tools/nextstop/store.py +462 -0
- parrot/tools/notification.py +435 -0
- parrot/tools/o365/__init__.py +42 -0
- parrot/tools/o365/base.py +295 -0
- parrot/tools/o365/bundle.py +522 -0
- parrot/tools/o365/events.py +554 -0
- parrot/tools/o365/mail.py +992 -0
- parrot/tools/o365/onedrive.py +497 -0
- parrot/tools/o365/sharepoint.py +641 -0
- parrot/tools/openapi_toolkit.py +904 -0
- parrot/tools/openweather.py +527 -0
- parrot/tools/pdfprint.py +1001 -0
- parrot/tools/powerbi.py +518 -0
- parrot/tools/powerpoint.py +1113 -0
- parrot/tools/pricestool.py +146 -0
- parrot/tools/products/__init__.py +246 -0
- parrot/tools/prophet_tool.py +171 -0
- parrot/tools/pythonpandas.py +630 -0
- parrot/tools/pythonrepl.py +910 -0
- parrot/tools/qsource.py +436 -0
- parrot/tools/querytoolkit.py +395 -0
- parrot/tools/quickeda.py +827 -0
- parrot/tools/resttool.py +553 -0
- parrot/tools/retail/__init__.py +0 -0
- parrot/tools/retail/bby.py +528 -0
- parrot/tools/sandboxtool.py +703 -0
- parrot/tools/sassie/__init__.py +352 -0
- parrot/tools/scraping/__init__.py +7 -0
- parrot/tools/scraping/docs/select.md +466 -0
- parrot/tools/scraping/documentation.md +1278 -0
- parrot/tools/scraping/driver.py +436 -0
- parrot/tools/scraping/models.py +576 -0
- parrot/tools/scraping/options.py +85 -0
- parrot/tools/scraping/orchestrator.py +517 -0
- parrot/tools/scraping/readme.md +740 -0
- parrot/tools/scraping/tool.py +3115 -0
- parrot/tools/seasonaldetection.py +642 -0
- parrot/tools/shell_tool/__init__.py +5 -0
- parrot/tools/shell_tool/actions.py +408 -0
- parrot/tools/shell_tool/engine.py +155 -0
- parrot/tools/shell_tool/models.py +322 -0
- parrot/tools/shell_tool/tool.py +442 -0
- parrot/tools/site_search.py +214 -0
- parrot/tools/textfile.py +418 -0
- parrot/tools/think.py +378 -0
- parrot/tools/toolkit.py +298 -0
- parrot/tools/webapp_tool.py +187 -0
- parrot/tools/whatif.py +1279 -0
- parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
- parrot/tools/workday/__init__.py +6 -0
- parrot/tools/workday/models.py +1389 -0
- parrot/tools/workday/tool.py +1293 -0
- parrot/tools/yfinance_tool.py +306 -0
- parrot/tools/zipcode.py +217 -0
- parrot/utils/__init__.py +2 -0
- parrot/utils/helpers.py +73 -0
- parrot/utils/parsers/__init__.py +5 -0
- parrot/utils/parsers/toml.c +12078 -0
- parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/parsers/toml.pyx +21 -0
- parrot/utils/toml.py +11 -0
- parrot/utils/types.cpp +20936 -0
- parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/types.pyx +213 -0
- parrot/utils/uv.py +11 -0
- parrot/version.py +10 -0
- parrot/yaml-rs/Cargo.lock +350 -0
- parrot/yaml-rs/Cargo.toml +19 -0
- parrot/yaml-rs/pyproject.toml +19 -0
- parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
- parrot/yaml-rs/src/lib.rs +222 -0
- requirements/docker-compose.yml +24 -0
- requirements/requirements-dev.txt +21 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"""Utilities to manage remote Office 365 interactive login sessions."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import asyncio
|
|
5
|
+
import contextlib
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from datetime import datetime, timedelta
|
|
8
|
+
from typing import Any, Dict, Optional, List
|
|
9
|
+
from uuid import uuid4
|
|
10
|
+
|
|
11
|
+
from navconfig.logging import logging
|
|
12
|
+
|
|
13
|
+
from ..interfaces.o365 import O365Client
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class RemoteAuthSession:
|
|
18
|
+
"""Metadata for a remote interactive login session."""
|
|
19
|
+
|
|
20
|
+
session_id: str
|
|
21
|
+
status: str = "pending"
|
|
22
|
+
login_url: Optional[str] = None
|
|
23
|
+
device_flow: Optional[Dict[str, Any]] = None
|
|
24
|
+
created_at: datetime = field(default_factory=datetime.utcnow)
|
|
25
|
+
updated_at: datetime = field(default_factory=datetime.utcnow)
|
|
26
|
+
expires_at: Optional[datetime] = None
|
|
27
|
+
result_summary: Optional[Dict[str, Any]] = None
|
|
28
|
+
error: Optional[str] = None
|
|
29
|
+
task: Optional[asyncio.Task] = None
|
|
30
|
+
client: Optional[O365Client] = None
|
|
31
|
+
|
|
32
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
33
|
+
data: Dict[str, Any] = {
|
|
34
|
+
"session_id": self.session_id,
|
|
35
|
+
"status": self.status,
|
|
36
|
+
"created_at": self.created_at.isoformat() + "Z",
|
|
37
|
+
"updated_at": self.updated_at.isoformat() + "Z",
|
|
38
|
+
}
|
|
39
|
+
if self.login_url:
|
|
40
|
+
data["auth_url"] = self.login_url
|
|
41
|
+
if self.device_flow:
|
|
42
|
+
data["device_flow"] = self.device_flow
|
|
43
|
+
if self.expires_at:
|
|
44
|
+
data["expires_at"] = self.expires_at.isoformat() + "Z"
|
|
45
|
+
if self.result_summary:
|
|
46
|
+
data["result"] = self.result_summary
|
|
47
|
+
if self.error:
|
|
48
|
+
data["error"] = self.error
|
|
49
|
+
return data
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class RemoteAuthManager:
|
|
53
|
+
"""Manage remote Office 365 interactive login sessions."""
|
|
54
|
+
|
|
55
|
+
def __init__(self):
|
|
56
|
+
self._sessions: Dict[str, RemoteAuthSession] = {}
|
|
57
|
+
self._lock = asyncio.Lock()
|
|
58
|
+
self.logger = logging.getLogger("Parrot.O365.RemoteAuth")
|
|
59
|
+
|
|
60
|
+
async def start_session(
|
|
61
|
+
self,
|
|
62
|
+
*,
|
|
63
|
+
credentials: Optional[Dict[str, Any]] = None,
|
|
64
|
+
scopes: Optional[List[str]] = None,
|
|
65
|
+
redirect_uri: Optional[str] = None,
|
|
66
|
+
) -> Dict[str, Any]:
|
|
67
|
+
"""Start a new remote interactive login session."""
|
|
68
|
+
|
|
69
|
+
session_id = str(uuid4())
|
|
70
|
+
session = RemoteAuthSession(session_id=session_id)
|
|
71
|
+
async with self._lock:
|
|
72
|
+
self._sessions[session_id] = session
|
|
73
|
+
|
|
74
|
+
client = O365Client(credentials=credentials or {})
|
|
75
|
+
session.client = client
|
|
76
|
+
client.processing_credentials()
|
|
77
|
+
client.set_auth_mode("delegated")
|
|
78
|
+
|
|
79
|
+
loop = asyncio.get_running_loop()
|
|
80
|
+
login_url_future: asyncio.Future = loop.create_future()
|
|
81
|
+
device_flow_future: asyncio.Future = loop.create_future()
|
|
82
|
+
|
|
83
|
+
def _login_callback(url: str) -> bool:
|
|
84
|
+
def _set_login_url() -> None:
|
|
85
|
+
session.login_url = url
|
|
86
|
+
session.updated_at = datetime.utcnow()
|
|
87
|
+
if not login_url_future.done():
|
|
88
|
+
login_url_future.set_result(url)
|
|
89
|
+
|
|
90
|
+
loop.call_soon_threadsafe(_set_login_url)
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
def _device_flow_callback(flow: Dict[str, Any]) -> None:
|
|
94
|
+
def _set_device_flow() -> None:
|
|
95
|
+
session.device_flow = {
|
|
96
|
+
"user_code": flow.get("user_code"),
|
|
97
|
+
"verification_uri": flow.get("verification_uri"),
|
|
98
|
+
"verification_uri_complete": flow.get("verification_uri_complete"),
|
|
99
|
+
"message": flow.get("message"),
|
|
100
|
+
"expires_in": flow.get("expires_in"),
|
|
101
|
+
"interval": flow.get("interval"),
|
|
102
|
+
}
|
|
103
|
+
if flow.get("expires_in"):
|
|
104
|
+
session.expires_at = datetime.utcnow() + timedelta(seconds=int(flow["expires_in"]))
|
|
105
|
+
session.updated_at = datetime.utcnow()
|
|
106
|
+
if not device_flow_future.done():
|
|
107
|
+
device_flow_future.set_result(session.device_flow)
|
|
108
|
+
|
|
109
|
+
loop.call_soon_threadsafe(_set_device_flow)
|
|
110
|
+
|
|
111
|
+
async def _run_login() -> None:
|
|
112
|
+
try:
|
|
113
|
+
result = await client.interactive_login(
|
|
114
|
+
scopes=scopes,
|
|
115
|
+
redirect_uri=redirect_uri or "http://localhost",
|
|
116
|
+
open_browser=False,
|
|
117
|
+
login_callback=_login_callback,
|
|
118
|
+
device_flow_callback=_device_flow_callback,
|
|
119
|
+
)
|
|
120
|
+
summary = self._summarize_result(result)
|
|
121
|
+
session.result_summary = summary if summary else None
|
|
122
|
+
session.status = "authorized"
|
|
123
|
+
session.updated_at = datetime.utcnow()
|
|
124
|
+
except Exception as exc: # pragma: no cover - network/auth errors
|
|
125
|
+
session.status = "failed"
|
|
126
|
+
session.error = str(exc)
|
|
127
|
+
session.updated_at = datetime.utcnow()
|
|
128
|
+
self.logger.error("Remote login session %s failed: %s", session_id, exc)
|
|
129
|
+
finally:
|
|
130
|
+
with contextlib.suppress(Exception):
|
|
131
|
+
await client.close()
|
|
132
|
+
session.client = None
|
|
133
|
+
|
|
134
|
+
session.task = asyncio.create_task(_run_login())
|
|
135
|
+
|
|
136
|
+
waiters = []
|
|
137
|
+
if not login_url_future.done():
|
|
138
|
+
waiters.append(login_url_future)
|
|
139
|
+
if not device_flow_future.done():
|
|
140
|
+
waiters.append(device_flow_future)
|
|
141
|
+
|
|
142
|
+
if waiters:
|
|
143
|
+
try:
|
|
144
|
+
await asyncio.wait(waiters, timeout=5, return_when=asyncio.FIRST_COMPLETED)
|
|
145
|
+
except Exception: # pragma: no cover - defensive
|
|
146
|
+
pass
|
|
147
|
+
|
|
148
|
+
return session.to_dict()
|
|
149
|
+
|
|
150
|
+
async def get_session(self, session_id: str) -> Optional[Dict[str, Any]]:
|
|
151
|
+
async with self._lock:
|
|
152
|
+
session = self._sessions.get(session_id)
|
|
153
|
+
if not session:
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
if session.status == "pending" and session.expires_at and datetime.utcnow() > session.expires_at:
|
|
157
|
+
await self._expire_session(session)
|
|
158
|
+
|
|
159
|
+
return session.to_dict()
|
|
160
|
+
|
|
161
|
+
async def cancel_session(self, session_id: str) -> bool:
|
|
162
|
+
async with self._lock:
|
|
163
|
+
session = self._sessions.get(session_id)
|
|
164
|
+
if not session:
|
|
165
|
+
return False
|
|
166
|
+
|
|
167
|
+
await self._finalize_session(session, status="cancelled", error="Session cancelled by user")
|
|
168
|
+
return True
|
|
169
|
+
|
|
170
|
+
async def shutdown(self) -> None:
|
|
171
|
+
async with self._lock:
|
|
172
|
+
sessions = list(self._sessions.values())
|
|
173
|
+
|
|
174
|
+
for session in sessions:
|
|
175
|
+
await self._finalize_session(session, status=session.status)
|
|
176
|
+
|
|
177
|
+
async def _expire_session(self, session: RemoteAuthSession) -> None:
|
|
178
|
+
await self._finalize_session(
|
|
179
|
+
session,
|
|
180
|
+
status="expired",
|
|
181
|
+
error="Authorization session expired before completion",
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
async def _finalize_session(
|
|
185
|
+
self,
|
|
186
|
+
session: RemoteAuthSession,
|
|
187
|
+
*,
|
|
188
|
+
status: str,
|
|
189
|
+
error: Optional[str] = None,
|
|
190
|
+
) -> None:
|
|
191
|
+
if session.task and not session.task.done():
|
|
192
|
+
session.task.cancel()
|
|
193
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
194
|
+
await session.task
|
|
195
|
+
if session.client:
|
|
196
|
+
with contextlib.suppress(Exception):
|
|
197
|
+
await session.client.close()
|
|
198
|
+
session.client = None
|
|
199
|
+
session.status = status
|
|
200
|
+
session.error = error
|
|
201
|
+
session.updated_at = datetime.utcnow()
|
|
202
|
+
|
|
203
|
+
def _summarize_result(self, result: Dict[str, Any]) -> Dict[str, Any]:
|
|
204
|
+
summary: Dict[str, Any] = {}
|
|
205
|
+
if not result:
|
|
206
|
+
return summary
|
|
207
|
+
|
|
208
|
+
if result.get("expires_on"):
|
|
209
|
+
summary["expires_on"] = result["expires_on"]
|
|
210
|
+
if result.get("scope"):
|
|
211
|
+
summary["scope"] = result["scope"]
|
|
212
|
+
if result.get("token_source"):
|
|
213
|
+
summary["token_source"] = result["token_source"]
|
|
214
|
+
|
|
215
|
+
account = result.get("account")
|
|
216
|
+
if isinstance(account, dict):
|
|
217
|
+
summary["account"] = {
|
|
218
|
+
"home_account_id": account.get("home_account_id"),
|
|
219
|
+
"environment": account.get("environment"),
|
|
220
|
+
"username": account.get("username"),
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
claims = result.get("id_token_claims")
|
|
224
|
+
if isinstance(claims, dict):
|
|
225
|
+
summary["user"] = {
|
|
226
|
+
"name": claims.get("name"),
|
|
227
|
+
"preferred_username": claims.get("preferred_username"),
|
|
228
|
+
"oid": claims.get("oid"),
|
|
229
|
+
"tid": claims.get("tid"),
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return summary
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
__all__ = ["RemoteAuthManager", "RemoteAuthSession"]
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Any, Dict, List, Optional, Union
|
|
3
|
+
import importlib
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
from datamodel.parsers.json import JSONContent # pylint: disable=E0611 # noqa
|
|
6
|
+
from navconfig.logging import logging
|
|
7
|
+
from ..conf import (
|
|
8
|
+
EMBEDDING_DEFAULT_MODEL
|
|
9
|
+
)
|
|
10
|
+
from ..exceptions import ConfigError # pylint: disable=E0611
|
|
11
|
+
from ..embeddings import supported_embeddings
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
logging.getLogger(name='datasets').setLevel(logging.WARNING)
|
|
15
|
+
|
|
16
|
+
class AbstractStore(ABC):
|
|
17
|
+
"""AbstractStore class.
|
|
18
|
+
|
|
19
|
+
Base class for all Database Vector Stores.
|
|
20
|
+
Args:
|
|
21
|
+
embeddings (str): Embedding name.
|
|
22
|
+
|
|
23
|
+
Supported Vector Stores:
|
|
24
|
+
- Qdrant
|
|
25
|
+
- Milvus
|
|
26
|
+
- Faiss
|
|
27
|
+
- Chroma
|
|
28
|
+
- PgVector
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
embedding_model: Union[dict, str] = None,
|
|
34
|
+
embedding: Union[dict, Callable] = None,
|
|
35
|
+
**kwargs
|
|
36
|
+
):
|
|
37
|
+
self.client: Callable = None
|
|
38
|
+
self.vector: Callable = None
|
|
39
|
+
self._embed_: Callable = None
|
|
40
|
+
self._connected: bool = False
|
|
41
|
+
if embedding_model is not None:
|
|
42
|
+
if isinstance(embedding_model, str):
|
|
43
|
+
self.embedding_model = {
|
|
44
|
+
'model_name': embedding_model,
|
|
45
|
+
'model_type': 'huggingface'
|
|
46
|
+
}
|
|
47
|
+
elif isinstance(embedding_model, dict):
|
|
48
|
+
self.embedding_model = embedding_model
|
|
49
|
+
else:
|
|
50
|
+
raise ValueError(
|
|
51
|
+
"Embedding Model must be a string or a dictionary."
|
|
52
|
+
)
|
|
53
|
+
# Use or not connection to a vector database:
|
|
54
|
+
self._use_database: bool = kwargs.get('use_database', True)
|
|
55
|
+
# Database Information:
|
|
56
|
+
self.collection_name: str = kwargs.get('collection_name', 'my_collection')
|
|
57
|
+
self.dimension: int = kwargs.get("dimension", 384)
|
|
58
|
+
self._metric_type: str = kwargs.get("metric_type", 'COSINE')
|
|
59
|
+
self._index_type: str = kwargs.get("index_type", 'IVF_FLAT')
|
|
60
|
+
self.database: str = kwargs.get('database', '')
|
|
61
|
+
self.index_name = kwargs.get("index_name", "my_index")
|
|
62
|
+
if embedding is not None:
|
|
63
|
+
if isinstance(embedding, str):
|
|
64
|
+
self.embedding_model = {
|
|
65
|
+
'model_name': embedding,
|
|
66
|
+
'model_type': 'huggingface'
|
|
67
|
+
}
|
|
68
|
+
elif isinstance(embedding, dict):
|
|
69
|
+
self.embedding_model = embedding
|
|
70
|
+
else:
|
|
71
|
+
# is a callable:
|
|
72
|
+
self.embedding_model = {
|
|
73
|
+
'model_name': EMBEDDING_DEFAULT_MODEL,
|
|
74
|
+
'model_type': 'huggingface'
|
|
75
|
+
}
|
|
76
|
+
self._embed_ = embedding
|
|
77
|
+
self.logger = logging.getLogger(
|
|
78
|
+
f"Store.{__name__}"
|
|
79
|
+
)
|
|
80
|
+
# Client Connection (if required):
|
|
81
|
+
self._connection = None
|
|
82
|
+
# Create the Embedding Model:
|
|
83
|
+
self._embed_ = self.create_embedding(
|
|
84
|
+
embedding_model=self.embedding_model
|
|
85
|
+
)
|
|
86
|
+
# Track context depth
|
|
87
|
+
self._context_depth = 0
|
|
88
|
+
# JSON parser (based on orjson):
|
|
89
|
+
self._json = JSONContent()
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def connected(self) -> bool:
|
|
93
|
+
return self._connected
|
|
94
|
+
|
|
95
|
+
def is_connected(self):
|
|
96
|
+
return self._connected
|
|
97
|
+
|
|
98
|
+
@abstractmethod
|
|
99
|
+
async def connection(self) -> tuple:
|
|
100
|
+
pass
|
|
101
|
+
|
|
102
|
+
def get_connection(self) -> Any:
|
|
103
|
+
return self._connection
|
|
104
|
+
|
|
105
|
+
def engine(self):
|
|
106
|
+
return self._connection
|
|
107
|
+
|
|
108
|
+
@abstractmethod
|
|
109
|
+
async def disconnect(self) -> None:
|
|
110
|
+
pass
|
|
111
|
+
|
|
112
|
+
# Async Context Manager
|
|
113
|
+
async def __aenter__(self):
|
|
114
|
+
if self._use_database:
|
|
115
|
+
if not self._connection:
|
|
116
|
+
await self.connection()
|
|
117
|
+
self._context_depth += 1
|
|
118
|
+
return self
|
|
119
|
+
|
|
120
|
+
async def _free_resources(self):
|
|
121
|
+
if self._embed_:
|
|
122
|
+
self._embed_.free()
|
|
123
|
+
self._embed_ = None
|
|
124
|
+
|
|
125
|
+
async def __aexit__(self, exc_type, exc_value, traceback):
|
|
126
|
+
# closing Embedding
|
|
127
|
+
if self._embed_:
|
|
128
|
+
await self._free_resources()
|
|
129
|
+
try:
|
|
130
|
+
# Only disconnect if we're exiting the outermost context
|
|
131
|
+
if self._context_depth <= 0:
|
|
132
|
+
await self.disconnect()
|
|
133
|
+
self._context_depth = 0
|
|
134
|
+
except RuntimeError:
|
|
135
|
+
pass
|
|
136
|
+
|
|
137
|
+
@abstractmethod
|
|
138
|
+
def get_vector(self, metric_type: str = None, **kwargs):
|
|
139
|
+
pass
|
|
140
|
+
|
|
141
|
+
def get_vectorstore(self):
|
|
142
|
+
return self.get_vector()
|
|
143
|
+
|
|
144
|
+
@abstractmethod
|
|
145
|
+
async def similarity_search(
|
|
146
|
+
self,
|
|
147
|
+
query: str,
|
|
148
|
+
collection: Union[str, None] = None,
|
|
149
|
+
limit: int = 2,
|
|
150
|
+
similarity_threshold: float = 0.0,
|
|
151
|
+
search_strategy: str = "auto",
|
|
152
|
+
metadata_filters: Union[dict, None] = None,
|
|
153
|
+
**kwargs
|
|
154
|
+
) -> list: # noqa
|
|
155
|
+
pass
|
|
156
|
+
|
|
157
|
+
@abstractmethod
|
|
158
|
+
async def from_documents(
|
|
159
|
+
self,
|
|
160
|
+
documents: List[Any],
|
|
161
|
+
collection: Union[str, None] = None,
|
|
162
|
+
**kwargs
|
|
163
|
+
) -> Callable:
|
|
164
|
+
"""
|
|
165
|
+
Create Vector Store from Documents.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
documents (List[Any]): List of Documents.
|
|
169
|
+
collection (str): Collection Name.
|
|
170
|
+
kwargs: Additional Arguments.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Callable VectorStore.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
@abstractmethod
|
|
177
|
+
async def create_collection(self, collection: str) -> None:
|
|
178
|
+
"""
|
|
179
|
+
Create Collection in Vector Store.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
collection (str): Collection Name.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
None.
|
|
186
|
+
"""
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
@abstractmethod
|
|
190
|
+
async def add_documents(
|
|
191
|
+
self,
|
|
192
|
+
documents: List[Any],
|
|
193
|
+
collection: Union[str, None] = None,
|
|
194
|
+
**kwargs
|
|
195
|
+
) -> None:
|
|
196
|
+
"""
|
|
197
|
+
Add Documents to Vector Store.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
documents (List[Any]): List of Documents.
|
|
201
|
+
collection (str): Collection Name.
|
|
202
|
+
kwargs: Additional Arguments.
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
None.
|
|
206
|
+
"""
|
|
207
|
+
|
|
208
|
+
def create_embedding(
|
|
209
|
+
self,
|
|
210
|
+
|
|
211
|
+
embedding_model: dict,
|
|
212
|
+
**kwargs
|
|
213
|
+
):
|
|
214
|
+
"""
|
|
215
|
+
Create Embedding Model.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
embedding_model (dict): Embedding Model Configuration.
|
|
219
|
+
kwargs: Additional Arguments.
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Callable: Embedding Model.
|
|
223
|
+
|
|
224
|
+
"""
|
|
225
|
+
model_type = embedding_model.get('model_type', 'huggingface')
|
|
226
|
+
model_name = embedding_model.get('model', EMBEDDING_DEFAULT_MODEL)
|
|
227
|
+
if model_type not in supported_embeddings:
|
|
228
|
+
raise ConfigError(
|
|
229
|
+
f"Embedding Model Type: {model_type} not supported."
|
|
230
|
+
)
|
|
231
|
+
embed_cls = supported_embeddings[model_type]
|
|
232
|
+
cls_path = f"..embeddings.{model_type}" # Relative module path
|
|
233
|
+
try:
|
|
234
|
+
embed_module = importlib.import_module(
|
|
235
|
+
cls_path,
|
|
236
|
+
package=__package__
|
|
237
|
+
)
|
|
238
|
+
embed_obj = getattr(embed_module, embed_cls)
|
|
239
|
+
return embed_obj(
|
|
240
|
+
model_name=model_name,
|
|
241
|
+
**kwargs
|
|
242
|
+
)
|
|
243
|
+
except ImportError as e:
|
|
244
|
+
raise ConfigError(
|
|
245
|
+
f"Error Importing Embedding Model: {model_type}"
|
|
246
|
+
) from e
|
|
247
|
+
|
|
248
|
+
def get_default_embedding(self):
|
|
249
|
+
embed_model = {
|
|
250
|
+
'model_name': EMBEDDING_DEFAULT_MODEL,
|
|
251
|
+
'model_type': 'huggingface'
|
|
252
|
+
}
|
|
253
|
+
return self.create_embedding(
|
|
254
|
+
embedding_model=embed_model
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
def generate_embedding(self, documents: List[Any]) -> List[Any]:
|
|
258
|
+
if not self._embed_:
|
|
259
|
+
self._embed_ = self.get_default_embedding()
|
|
260
|
+
|
|
261
|
+
# Using the Embed Model to Generate Embeddings:
|
|
262
|
+
embeddings = self._embed_.embed_documents(documents)
|
|
263
|
+
return embeddings
|
|
264
|
+
|
|
265
|
+
@abstractmethod
|
|
266
|
+
async def prepare_embedding_table(
|
|
267
|
+
self,
|
|
268
|
+
tablename: str,
|
|
269
|
+
conn: Any = None,
|
|
270
|
+
embedding_column: str = 'embedding',
|
|
271
|
+
document_column: str = 'document',
|
|
272
|
+
metadata_column: str = 'cmetadata',
|
|
273
|
+
dimension: int = None,
|
|
274
|
+
id_column: str = 'id',
|
|
275
|
+
use_jsonb: bool = True,
|
|
276
|
+
drop_columns: bool = False,
|
|
277
|
+
create_all_indexes: bool = True,
|
|
278
|
+
**kwargs
|
|
279
|
+
):
|
|
280
|
+
"""
|
|
281
|
+
Prepare a Table as an embedding table with advanced features.
|
|
282
|
+
This method prepares a table with the following columns:
|
|
283
|
+
- id: unique identifier (String)
|
|
284
|
+
- embedding: the vector column (Vector(dimension) or JSONB)
|
|
285
|
+
- document: text column containing the document
|
|
286
|
+
- collection_id: UUID column for collection identification.
|
|
287
|
+
- metadata: JSONB column for metadata
|
|
288
|
+
- Additional columns based on the provided `columns` list
|
|
289
|
+
- Enhanced indexing strategies for efficient querying
|
|
290
|
+
- Support for multiple distance strategies (COSINE, L2, IP, etc.)
|
|
291
|
+
Args:
|
|
292
|
+
- tablename (str): Name of the table to create.
|
|
293
|
+
- embedding_column (str): Name of the column for storing embeddings.
|
|
294
|
+
- document_column (str): Name of the column for storing document text.
|
|
295
|
+
- metadata_column (str): Name of the column for storing metadata.
|
|
296
|
+
- dimension (int): Dimension of the embedding vector.
|
|
297
|
+
- id_column (str): Name of the column for storing unique identifiers.
|
|
298
|
+
- use_jsonb (bool): Whether to use JSONB for metadata storage.
|
|
299
|
+
- drop_columns (bool): Whether to drop existing columns.
|
|
300
|
+
- create_all_indexes (bool): Whether to create all distance strategies.
|
|
301
|
+
"""
|
|
302
|
+
pass
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
@abstractmethod
|
|
306
|
+
async def delete_documents(
|
|
307
|
+
self,
|
|
308
|
+
documents: Optional[Any] = None,
|
|
309
|
+
pk: str = 'source_type',
|
|
310
|
+
values: Optional[Union[str, List[str]]] = None,
|
|
311
|
+
table: Optional[str] = None,
|
|
312
|
+
schema: Optional[str] = None,
|
|
313
|
+
collection: Optional[str] = None,
|
|
314
|
+
**kwargs
|
|
315
|
+
) -> int:
|
|
316
|
+
"""
|
|
317
|
+
Delete Documents from the Vector Store.
|
|
318
|
+
Args:
|
|
319
|
+
documents (Optional[Any]): Documents to delete.
|
|
320
|
+
pk (str): Primary key field.
|
|
321
|
+
values (Optional[Union[str, List[str]]]): Values to match for deletion.
|
|
322
|
+
table (Optional[str]): Table name.
|
|
323
|
+
schema (Optional[str]): Schema name.
|
|
324
|
+
collection (Optional[str]): Collection name.
|
|
325
|
+
kwargs: Additional arguments.
|
|
326
|
+
Returns:
|
|
327
|
+
int: Number of deleted documents.
|
|
328
|
+
"""
|
|
329
|
+
pass
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
@abstractmethod
|
|
333
|
+
async def delete_documents_by_filter(
|
|
334
|
+
self,
|
|
335
|
+
search_filter: Dict[str, Union[str, List[str]]],
|
|
336
|
+
table: Optional[str] = None,
|
|
337
|
+
schema: Optional[str] = None,
|
|
338
|
+
collection: Optional[str] = None,
|
|
339
|
+
**kwargs
|
|
340
|
+
) -> int:
|
|
341
|
+
"""
|
|
342
|
+
Delete Documents by filter.
|
|
343
|
+
Args:
|
|
344
|
+
search_filter (Dict[str, Union[str, List[str]]]): Filter criteria.
|
|
345
|
+
table (Optional[str]): Table name.
|
|
346
|
+
schema (Optional[str]): Schema name.
|
|
347
|
+
collection (Optional[str]): Collection name.
|
|
348
|
+
kwargs: Additional arguments.
|
|
349
|
+
Returns:
|
|
350
|
+
int: Number of deleted documents.
|
|
351
|
+
"""
|
|
352
|
+
pass
|