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
parrot/tools/qsource.py
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
"""
|
|
2
|
+
QuerySource Tool for AI-Parrot
|
|
3
|
+
|
|
4
|
+
A tool that integrates QuerySource QS library to execute queries and return
|
|
5
|
+
structured data as pandas DataFrames or custom structured outputs.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
from typing import Dict, List, Any, Optional, Union, Type
|
|
9
|
+
from datetime import datetime, date, timedelta
|
|
10
|
+
import json
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
import pandas as pd
|
|
13
|
+
from typing import TYPE_CHECKING
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from querysource.queries.qs import QS
|
|
16
|
+
from querysource.exceptions import DataNotFound # pylint: disable=E0611
|
|
17
|
+
from .abstract import AbstractTool, ToolResult
|
|
18
|
+
from ..exceptions import ToolError # pylint: disable=E0611
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class QuerySourceInput(BaseModel):
|
|
22
|
+
"""Input schema for QuerySource tool."""
|
|
23
|
+
|
|
24
|
+
query_slug: Optional[str] = Field(
|
|
25
|
+
None,
|
|
26
|
+
description="Slug identifier for pre-defined queries (e.g. 'epson_stores', 'sales_data')"
|
|
27
|
+
)
|
|
28
|
+
query: Optional[str] = Field(
|
|
29
|
+
None,
|
|
30
|
+
description="Raw SQL query string if no query_slug is provided (e.g. 'SELECT * FROM Account')"
|
|
31
|
+
)
|
|
32
|
+
conditions: Optional[Dict[str, Any]] = Field(
|
|
33
|
+
default_factory=dict,
|
|
34
|
+
description="Query conditions including fields, filters, and group_by clauses"
|
|
35
|
+
)
|
|
36
|
+
additional_filters: Optional[Dict[str, Any]] = Field(
|
|
37
|
+
default_factory=dict,
|
|
38
|
+
description="Additional filters to apply to the query conditions"
|
|
39
|
+
)
|
|
40
|
+
driver: Optional[str] = Field(
|
|
41
|
+
"db",
|
|
42
|
+
description="Driver to use for the query (e.g. 'db', 'salesforce', 'pg', 'bigquery')"
|
|
43
|
+
)
|
|
44
|
+
return_format: Optional[str] = Field(
|
|
45
|
+
"pandas",
|
|
46
|
+
description="Return format: 'pandas', 'dict', 'json', or 'structured'"
|
|
47
|
+
)
|
|
48
|
+
structured_output_class: Optional[str] = Field(
|
|
49
|
+
None,
|
|
50
|
+
description="Name of the structured output class if return_format='structured'"
|
|
51
|
+
)
|
|
52
|
+
lazy: Optional[bool] = Field(
|
|
53
|
+
True,
|
|
54
|
+
description="Whether to use lazy loading for the query"
|
|
55
|
+
)
|
|
56
|
+
limit: Optional[int] = Field(
|
|
57
|
+
None,
|
|
58
|
+
description="Limit the number of rows returned by the query"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class QSourceTool(AbstractTool):
|
|
63
|
+
"""
|
|
64
|
+
Tool for executing QuerySource queries and returning structured data.
|
|
65
|
+
|
|
66
|
+
This tool can:
|
|
67
|
+
- Execute queries using query slugs or raw SQL
|
|
68
|
+
- Apply conditions, filters, and grouping
|
|
69
|
+
- Return results as pandas DataFrames, dictionaries, or structured outputs
|
|
70
|
+
- Handle multiple data sources through different drivers
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
name: str = "QSourceTool"
|
|
74
|
+
description: str = (
|
|
75
|
+
"Execute QuerySource queries to retrieve and analyze data. "
|
|
76
|
+
"Supports query slugs, raw SQL, filtering, grouping, and multiple output formats. "
|
|
77
|
+
"Use this tool to access database content, generate reports, and perform data analysis."
|
|
78
|
+
)
|
|
79
|
+
args_schema = QuerySourceInput
|
|
80
|
+
|
|
81
|
+
def __init__(
|
|
82
|
+
self,
|
|
83
|
+
default_driver: str = "db",
|
|
84
|
+
available_structured_outputs: Optional[Dict[str, Type[BaseModel]]] = None,
|
|
85
|
+
**kwargs
|
|
86
|
+
):
|
|
87
|
+
"""
|
|
88
|
+
Initialize QuerySource tool.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
default_driver: Default driver to use for queries
|
|
92
|
+
available_structured_outputs: Dict mapping class names to Pydantic models
|
|
93
|
+
**kwargs: Additional arguments passed to AbstractTool
|
|
94
|
+
"""
|
|
95
|
+
super().__init__(**kwargs)
|
|
96
|
+
self.default_driver = default_driver
|
|
97
|
+
self.available_structured_outputs = available_structured_outputs or {}
|
|
98
|
+
|
|
99
|
+
def get_input_schema(self) -> Dict[str, Any]:
|
|
100
|
+
"""Return the input schema for this tool."""
|
|
101
|
+
return QuerySourceInput.model_json_schema()
|
|
102
|
+
|
|
103
|
+
def get_date_range(self, days_back: int = 30) -> Dict[str, str]:
|
|
104
|
+
"""Get date range for the last N days."""
|
|
105
|
+
end_date = datetime.now()
|
|
106
|
+
start_date = end_date - timedelta(days=days_back)
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
"start_date": start_date.strftime("%Y-%m-%d"),
|
|
110
|
+
"end_date": end_date.strftime("%Y-%m-%d")
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
def build_date_filter(
|
|
114
|
+
self,
|
|
115
|
+
date_field: str = "date",
|
|
116
|
+
days_back: int = 30
|
|
117
|
+
) -> Dict[str, List[str]]:
|
|
118
|
+
"""Build a date filter for queries."""
|
|
119
|
+
date_range = self.get_date_range(days_back)
|
|
120
|
+
return {
|
|
121
|
+
date_field: [date_range["start_date"], date_range["end_date"]]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
def _is_empty(self, result: Union[List[Dict[str, Any]], pd.DataFrame, None]) -> bool:
|
|
125
|
+
"""
|
|
126
|
+
Safely check if a query result is empty.
|
|
127
|
+
Handles DataFrames, lists, dicts, and None values properly.
|
|
128
|
+
"""
|
|
129
|
+
if result is None:
|
|
130
|
+
return True
|
|
131
|
+
elif isinstance(result, (list, dict, tuple)):
|
|
132
|
+
return len(result) == 0
|
|
133
|
+
elif isinstance(result, pd.DataFrame):
|
|
134
|
+
return result.empty
|
|
135
|
+
else:
|
|
136
|
+
try:
|
|
137
|
+
return not bool(result)
|
|
138
|
+
except ValueError:
|
|
139
|
+
# Handle any other "truth value is ambiguous" errors
|
|
140
|
+
return hasattr(result, '__len__') and len(result) == 0
|
|
141
|
+
|
|
142
|
+
def _get_row_count(self, result):
|
|
143
|
+
"""Safely get row count from any result type."""
|
|
144
|
+
if result is None:
|
|
145
|
+
return 0
|
|
146
|
+
elif isinstance(result, pd.DataFrame):
|
|
147
|
+
return len(result)
|
|
148
|
+
elif isinstance(result, (list, tuple)):
|
|
149
|
+
return len(result)
|
|
150
|
+
elif isinstance(result, dict):
|
|
151
|
+
return 1
|
|
152
|
+
else:
|
|
153
|
+
try:
|
|
154
|
+
return len(result)
|
|
155
|
+
except (TypeError, AttributeError):
|
|
156
|
+
return 1
|
|
157
|
+
|
|
158
|
+
async def _execute(
|
|
159
|
+
self,
|
|
160
|
+
query_slug: Optional[str] = None,
|
|
161
|
+
query: Optional[str] = None,
|
|
162
|
+
conditions: Optional[Dict[str, Any]] = None,
|
|
163
|
+
additional_filters: Optional[Dict[str, Any]] = None,
|
|
164
|
+
driver: Optional[str] = None,
|
|
165
|
+
return_format: str = "json",
|
|
166
|
+
structured_output_class: Optional[str] = None,
|
|
167
|
+
lazy: bool = True,
|
|
168
|
+
limit: Optional[int] = None,
|
|
169
|
+
**kwargs
|
|
170
|
+
) -> ToolResult:
|
|
171
|
+
"""
|
|
172
|
+
Execute a QuerySource query and return structured results.
|
|
173
|
+
"""
|
|
174
|
+
from querysource.queries.qs import QS
|
|
175
|
+
# Validate input
|
|
176
|
+
if not query_slug and not query:
|
|
177
|
+
return ToolResult(
|
|
178
|
+
status="error",
|
|
179
|
+
result=None,
|
|
180
|
+
error="Either query_slug or query must be provided.",
|
|
181
|
+
metadata={}
|
|
182
|
+
)
|
|
183
|
+
# Set defaults
|
|
184
|
+
driver = driver or self.default_driver
|
|
185
|
+
conditions = conditions or {}
|
|
186
|
+
filters = conditions.get('filter', {})
|
|
187
|
+
|
|
188
|
+
# Add additional filters
|
|
189
|
+
if additional_filters:
|
|
190
|
+
filters.update(additional_filters)
|
|
191
|
+
|
|
192
|
+
conditions['filter'] = filters
|
|
193
|
+
if limit:
|
|
194
|
+
conditions['querylimit'] = limit
|
|
195
|
+
try:
|
|
196
|
+
# Create QS instance
|
|
197
|
+
if query_slug:
|
|
198
|
+
qry = QS(
|
|
199
|
+
slug=query_slug,
|
|
200
|
+
lazy=lazy,
|
|
201
|
+
conditions=conditions,
|
|
202
|
+
driver=driver
|
|
203
|
+
)
|
|
204
|
+
self.logger.debug(
|
|
205
|
+
f"Created QS query with slug: {query_slug}"
|
|
206
|
+
)
|
|
207
|
+
else:
|
|
208
|
+
qry = QS(
|
|
209
|
+
query=query,
|
|
210
|
+
lazy=lazy,
|
|
211
|
+
conditions=conditions,
|
|
212
|
+
driver=driver
|
|
213
|
+
)
|
|
214
|
+
self.logger.debug(
|
|
215
|
+
f"Created QS query with raw SQL"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
# Log query details
|
|
219
|
+
self.logger.debug(
|
|
220
|
+
f"Query conditions: {conditions}"
|
|
221
|
+
)
|
|
222
|
+
self.logger.debug(
|
|
223
|
+
f"Using driver: {driver}"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Build provider and execute query
|
|
227
|
+
await qry.build_provider()
|
|
228
|
+
result = None
|
|
229
|
+
try:
|
|
230
|
+
if return_format == 'pandas':
|
|
231
|
+
result, error = await qry.query(output_format='pandas')
|
|
232
|
+
else:
|
|
233
|
+
result, error = await qry.query()
|
|
234
|
+
if error:
|
|
235
|
+
raise ToolError(f"Query execution error: {error}")
|
|
236
|
+
except DataNotFound as e:
|
|
237
|
+
self.logger.error(f"Data not found: {str(e)}")
|
|
238
|
+
return ToolResult(
|
|
239
|
+
status="empty",
|
|
240
|
+
result=None,
|
|
241
|
+
error=f"Data not found: {str(e)}",
|
|
242
|
+
metadata={
|
|
243
|
+
"query_slug": query_slug,
|
|
244
|
+
"driver": driver,
|
|
245
|
+
"conditions": conditions,
|
|
246
|
+
"return_format": return_format
|
|
247
|
+
}
|
|
248
|
+
)
|
|
249
|
+
except Exception as e:
|
|
250
|
+
self.logger.error(
|
|
251
|
+
f"Query execution failed: {str(e)}"
|
|
252
|
+
)
|
|
253
|
+
return ToolResult(
|
|
254
|
+
status="error",
|
|
255
|
+
result=None,
|
|
256
|
+
error=f"Query execution failed: {str(e)}",
|
|
257
|
+
metadata={
|
|
258
|
+
"query_slug": query_slug,
|
|
259
|
+
"driver": driver,
|
|
260
|
+
"conditions": conditions,
|
|
261
|
+
"return_format": return_format,
|
|
262
|
+
}
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
if self._is_empty(result):
|
|
267
|
+
return ToolResult(
|
|
268
|
+
status="empty",
|
|
269
|
+
result=None,
|
|
270
|
+
error="No data returned from query",
|
|
271
|
+
metadata={
|
|
272
|
+
"query_slug": query_slug,
|
|
273
|
+
"driver": driver,
|
|
274
|
+
"conditions": conditions,
|
|
275
|
+
"row_count": 0,
|
|
276
|
+
"return_format": return_format
|
|
277
|
+
}
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
# Process results based on return format
|
|
281
|
+
processed_result = await self._process_results(
|
|
282
|
+
result,
|
|
283
|
+
return_format,
|
|
284
|
+
structured_output_class
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
# Create metadata
|
|
288
|
+
metadata = {
|
|
289
|
+
"query_slug": query_slug,
|
|
290
|
+
"raw_query": query if not query_slug else None,
|
|
291
|
+
"driver": driver,
|
|
292
|
+
"row_count": self._get_row_count(result),
|
|
293
|
+
"return_format": return_format,
|
|
294
|
+
"conditions": conditions
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if return_format == "pandas" and isinstance(processed_result, pd.DataFrame):
|
|
298
|
+
metadata.update({
|
|
299
|
+
"columns": list(processed_result.columns),
|
|
300
|
+
"shape": processed_result.shape,
|
|
301
|
+
"dtypes": processed_result.dtypes.to_dict()
|
|
302
|
+
})
|
|
303
|
+
|
|
304
|
+
return ToolResult(
|
|
305
|
+
status="success",
|
|
306
|
+
result=processed_result,
|
|
307
|
+
error=None,
|
|
308
|
+
metadata=metadata,
|
|
309
|
+
)
|
|
310
|
+
except Exception as e:
|
|
311
|
+
self.logger.error(
|
|
312
|
+
f"QuerySource tool execution failed: {str(e)}"
|
|
313
|
+
)
|
|
314
|
+
return ToolResult(
|
|
315
|
+
status="error",
|
|
316
|
+
result=None,
|
|
317
|
+
error=f"QuerySource tool execution failed: {str(e)}",
|
|
318
|
+
metadata={
|
|
319
|
+
"query_slug": query_slug,
|
|
320
|
+
"driver": driver,
|
|
321
|
+
"conditions": conditions,
|
|
322
|
+
"return_format": return_format
|
|
323
|
+
}
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
async def _process_results(
|
|
327
|
+
self,
|
|
328
|
+
result: List[Dict[str, Any]],
|
|
329
|
+
return_format: str,
|
|
330
|
+
structured_output_class: Optional[str] = None
|
|
331
|
+
) -> Any:
|
|
332
|
+
"""
|
|
333
|
+
Process query results based on the requested return format.
|
|
334
|
+
"""
|
|
335
|
+
if return_format == "dict":
|
|
336
|
+
return result
|
|
337
|
+
|
|
338
|
+
elif return_format == "json":
|
|
339
|
+
return json.dumps(result, default=self._json_serializer, indent=2)
|
|
340
|
+
|
|
341
|
+
elif return_format == "pandas":
|
|
342
|
+
# Convert to pandas DataFrame
|
|
343
|
+
if self._is_empty(result):
|
|
344
|
+
return pd.DataFrame()
|
|
345
|
+
if isinstance(result, pd.DataFrame):
|
|
346
|
+
return result
|
|
347
|
+
|
|
348
|
+
# Ensure result is a list of dictionaries
|
|
349
|
+
if isinstance(result, dict):
|
|
350
|
+
result = [result]
|
|
351
|
+
|
|
352
|
+
# Convert to DataFrame
|
|
353
|
+
df = pd.DataFrame(result)
|
|
354
|
+
|
|
355
|
+
# Convert datetime strings to datetime objects if possible
|
|
356
|
+
for col in df.columns:
|
|
357
|
+
if df[col].dtype == 'object':
|
|
358
|
+
try:
|
|
359
|
+
# Try to convert to datetime
|
|
360
|
+
df[col] = pd.to_datetime(df[col], errors='ignore')
|
|
361
|
+
except:
|
|
362
|
+
pass
|
|
363
|
+
|
|
364
|
+
return df
|
|
365
|
+
|
|
366
|
+
elif return_format == "structured":
|
|
367
|
+
if not structured_output_class:
|
|
368
|
+
raise ValueError(
|
|
369
|
+
"structured_output_class must be provided when return_format='structured'"
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
if structured_output_class not in self.available_structured_outputs:
|
|
373
|
+
raise ValueError(
|
|
374
|
+
f"Unknown structured output class: {structured_output_class}"
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
output_class = self.available_structured_outputs[structured_output_class]
|
|
378
|
+
|
|
379
|
+
# Convert list of dicts to list of structured objects
|
|
380
|
+
structured_results = []
|
|
381
|
+
for item in result:
|
|
382
|
+
try:
|
|
383
|
+
structured_item = output_class(**dict(item))
|
|
384
|
+
structured_results.append(structured_item)
|
|
385
|
+
except Exception as e:
|
|
386
|
+
self.logger.warning(
|
|
387
|
+
f"Failed to convert item to {structured_output_class}: {e}"
|
|
388
|
+
)
|
|
389
|
+
# Keep original dict if conversion fails
|
|
390
|
+
structured_results.append(item)
|
|
391
|
+
|
|
392
|
+
return structured_results
|
|
393
|
+
|
|
394
|
+
else:
|
|
395
|
+
raise ValueError(f"Unknown return_format: {return_format}")
|
|
396
|
+
|
|
397
|
+
def _json_serializer(self, obj):
|
|
398
|
+
"""Custom JSON serializer for datetime objects."""
|
|
399
|
+
if isinstance(obj, (datetime, date)):
|
|
400
|
+
return obj.isoformat()
|
|
401
|
+
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
|
|
402
|
+
|
|
403
|
+
def add_structured_output(self, name: str, model_class: Type[BaseModel]):
|
|
404
|
+
"""Add a structured output class that can be used for result conversion."""
|
|
405
|
+
self.available_structured_outputs[name] = model_class
|
|
406
|
+
self.logger.info(f"Added structured output class: {name}")
|
|
407
|
+
|
|
408
|
+
def list_available_outputs(self) -> List[str]:
|
|
409
|
+
"""List available structured output classes."""
|
|
410
|
+
return list(self.available_structured_outputs.keys())
|
|
411
|
+
|
|
412
|
+
async def execute_with_date_range(
|
|
413
|
+
self,
|
|
414
|
+
query_slug: str,
|
|
415
|
+
date_field: str = "date",
|
|
416
|
+
days_back: int = 30,
|
|
417
|
+
additional_filters: Optional[Dict] = None,
|
|
418
|
+
**kwargs
|
|
419
|
+
) -> ToolResult:
|
|
420
|
+
"""Execute query with automatic date range filtering."""
|
|
421
|
+
|
|
422
|
+
conditions = kwargs.get('conditions', {})
|
|
423
|
+
filters = conditions.get('filter', {})
|
|
424
|
+
|
|
425
|
+
# Add date filter
|
|
426
|
+
date_filter = self.build_date_filter(date_field, days_back)
|
|
427
|
+
filters.update(date_filter)
|
|
428
|
+
|
|
429
|
+
# Add additional filters
|
|
430
|
+
if additional_filters:
|
|
431
|
+
filters.update(additional_filters)
|
|
432
|
+
|
|
433
|
+
conditions['filter'] = filters
|
|
434
|
+
kwargs['conditions'] = conditions
|
|
435
|
+
|
|
436
|
+
return await self._execute(query_slug=query_slug, **kwargs)
|