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,395 @@
|
|
|
1
|
+
from typing import (
|
|
2
|
+
Union,
|
|
3
|
+
Optional,
|
|
4
|
+
Callable,
|
|
5
|
+
Dict,
|
|
6
|
+
Any,
|
|
7
|
+
get_origin,
|
|
8
|
+
get_args
|
|
9
|
+
)
|
|
10
|
+
import inspect
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from pydantic import BaseModel
|
|
13
|
+
import aiofiles
|
|
14
|
+
import pandas as pd
|
|
15
|
+
from navconfig import BASE_DIR
|
|
16
|
+
from asyncdb import AsyncDB
|
|
17
|
+
from datamodel.parsers.json import json_encoder, json_decoder # pylint: disable=E0611
|
|
18
|
+
from querysource.conf import default_dsn
|
|
19
|
+
from querysource.queries.qs import QS
|
|
20
|
+
from ..conf import AGENTS_DIR, AGENTS_BOTS_PROMPT_DIR
|
|
21
|
+
from .toolkit import AbstractToolkit
|
|
22
|
+
from ..exceptions import ToolError # pylint: disable=E0611 # noqa
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def is_collection_model(structured_obj: type) -> bool:
|
|
26
|
+
"""
|
|
27
|
+
Determine if a BaseModel is a collection container (single instance with records field)
|
|
28
|
+
or a direct list model (List[SomeModel]).
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
structured_obj: The class/type to inspect
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
bool: True if it's a collection container, False if it's a direct list
|
|
35
|
+
"""
|
|
36
|
+
# Check if it's a List type annotation like List[SomeModel]
|
|
37
|
+
origin = get_origin(structured_obj)
|
|
38
|
+
if origin is list or origin is Union:
|
|
39
|
+
return False
|
|
40
|
+
|
|
41
|
+
# Check if it's a BaseModel subclass with a 'records' field
|
|
42
|
+
if inspect.isclass(structured_obj) and issubclass(structured_obj, BaseModel):
|
|
43
|
+
# Get model fields
|
|
44
|
+
if hasattr(structured_obj, 'model_fields'):
|
|
45
|
+
fields = structured_obj.model_fields
|
|
46
|
+
else:
|
|
47
|
+
# Fallback for older Pydantic versions
|
|
48
|
+
fields = getattr(structured_obj, '__fields__', {})
|
|
49
|
+
|
|
50
|
+
# Check if it has a 'records' field that's a list
|
|
51
|
+
if 'records' in fields:
|
|
52
|
+
field_info = fields['records']
|
|
53
|
+
field_type = field_info.annotation if hasattr(field_info, 'annotation') else field_info.type_
|
|
54
|
+
return get_origin(field_type) is list
|
|
55
|
+
|
|
56
|
+
return False
|
|
57
|
+
|
|
58
|
+
def get_model_from_collection(collection_model: type) -> type:
|
|
59
|
+
"""
|
|
60
|
+
Extract the individual record model from a collection container model.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
collection_model: Collection model like VisitsByManagerOutput
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
type: Individual record model like VisitsByManagerRecord
|
|
67
|
+
"""
|
|
68
|
+
if hasattr(collection_model, 'model_fields'):
|
|
69
|
+
fields = collection_model.model_fields
|
|
70
|
+
else:
|
|
71
|
+
fields = getattr(collection_model, '__fields__', {})
|
|
72
|
+
|
|
73
|
+
if 'records' in fields:
|
|
74
|
+
field_info = fields['records']
|
|
75
|
+
field_type = field_info.annotation if hasattr(field_info, 'annotation') else field_info.type_
|
|
76
|
+
args = get_args(field_type)
|
|
77
|
+
if args:
|
|
78
|
+
return args[0] # Return the type inside List[Type]
|
|
79
|
+
|
|
80
|
+
raise ValueError(
|
|
81
|
+
f"Could not extract record model from {collection_model}"
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class QueryToolkit(AbstractToolkit):
|
|
86
|
+
"""Abstract base class for DB Queries-like Toolkits.
|
|
87
|
+
|
|
88
|
+
Use this class to define a toolkit for interacting with a database
|
|
89
|
+
using a structured query approach. It provides methods for executing
|
|
90
|
+
queries, handling results, and managing database connections.
|
|
91
|
+
|
|
92
|
+
This class provides a foundation for DB Queries-like toolkits, including
|
|
93
|
+
common configurations and methods for interacting with the database.
|
|
94
|
+
It is designed to be extended by specific toolkits that implement
|
|
95
|
+
functionality related to DB Queries-like operations.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
def __init__(
|
|
99
|
+
self,
|
|
100
|
+
dsn: str = None,
|
|
101
|
+
schema: str = None,
|
|
102
|
+
credentials: Optional[Dict[str, Any]] = None,
|
|
103
|
+
driver: Optional[str] = 'pg',
|
|
104
|
+
program: Optional[str] = '',
|
|
105
|
+
agent_id: Optional[str] = None,
|
|
106
|
+
**kwargs
|
|
107
|
+
):
|
|
108
|
+
"""Initialize the QueryToolkit.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
dsn: Default database connection string
|
|
112
|
+
schema: Database schema to use
|
|
113
|
+
**kwargs: Additional configuration options
|
|
114
|
+
"""
|
|
115
|
+
super().__init__(**kwargs)
|
|
116
|
+
self.default_dsn = dsn or default_dsn
|
|
117
|
+
self.schema = schema or 'public'
|
|
118
|
+
self.driver = driver
|
|
119
|
+
self.credentials = credentials or {}
|
|
120
|
+
self._db: Optional[AsyncDB] = None
|
|
121
|
+
self._json_encoder = json_encoder
|
|
122
|
+
self._json_decoder = json_decoder
|
|
123
|
+
self.program = program
|
|
124
|
+
self.agent_id = agent_id or 'default_agent'
|
|
125
|
+
# get Database Driver:
|
|
126
|
+
self._db = self._get_driver()
|
|
127
|
+
|
|
128
|
+
def _set_program(self, program: str):
|
|
129
|
+
"""Set the program slug for the toolkit.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
program: The program slug to set
|
|
133
|
+
"""
|
|
134
|
+
self.program = program
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def program_slug(self) -> str:
|
|
138
|
+
"""Get the program slug."""
|
|
139
|
+
return self.program
|
|
140
|
+
|
|
141
|
+
def _get_driver(self) -> AsyncDB:
|
|
142
|
+
if self._db is None:
|
|
143
|
+
self._db = AsyncDB(
|
|
144
|
+
self.driver,
|
|
145
|
+
dsn=self.default_dsn,
|
|
146
|
+
params=self.credentials
|
|
147
|
+
)
|
|
148
|
+
return self._db
|
|
149
|
+
|
|
150
|
+
async def _open_file(self, file_path: Path) -> str:
|
|
151
|
+
"""Open a file and return its content as a string."""
|
|
152
|
+
try:
|
|
153
|
+
async with aiofiles.open(file_path, mode='r', encoding='utf-8') as f:
|
|
154
|
+
content = await f.read()
|
|
155
|
+
return content
|
|
156
|
+
except FileNotFoundError:
|
|
157
|
+
raise FileNotFoundError(
|
|
158
|
+
f"File not found: {file_path}"
|
|
159
|
+
)
|
|
160
|
+
except Exception as e:
|
|
161
|
+
raise Exception(
|
|
162
|
+
f"Error reading file {file_path}: {e}"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
async def _get_prompt(self, prompt_file: str) -> str:
|
|
166
|
+
"""Fetch the prompt content from the specified file."""
|
|
167
|
+
prompt_path = AGENTS_BOTS_PROMPT_DIR.joinpath(
|
|
168
|
+
self.agent_id,
|
|
169
|
+
self.program if self.program else '',
|
|
170
|
+
'prompts',
|
|
171
|
+
f"{prompt_file}.txt"
|
|
172
|
+
)
|
|
173
|
+
return await self._open_file(prompt_path)
|
|
174
|
+
|
|
175
|
+
async def _get_query(
|
|
176
|
+
self,
|
|
177
|
+
query_name: str
|
|
178
|
+
) -> str:
|
|
179
|
+
"""Fetch a SQL query from the toolkit's queries directory.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
query_name: The name of the SQL query file (without extension)
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
str: The content of the SQL query file
|
|
186
|
+
|
|
187
|
+
Raises:
|
|
188
|
+
FileNotFoundError: If the query file does not exist
|
|
189
|
+
"""
|
|
190
|
+
query_path = AGENTS_DIR.joinpath(
|
|
191
|
+
self.agent_id,
|
|
192
|
+
self.program if self.program else '',
|
|
193
|
+
'queries',
|
|
194
|
+
f"{query_name}.sql"
|
|
195
|
+
)
|
|
196
|
+
if not query_path.exists():
|
|
197
|
+
raise FileNotFoundError(
|
|
198
|
+
f"Query file not found: {query_path}"
|
|
199
|
+
)
|
|
200
|
+
return await self._open_file(query_path)
|
|
201
|
+
|
|
202
|
+
async def _fetch_one(
|
|
203
|
+
self,
|
|
204
|
+
query: str,
|
|
205
|
+
output_format: str = 'pandas',
|
|
206
|
+
structured_obj: Optional[Callable[[Dict[str, Any]], Any]] = None
|
|
207
|
+
) -> Union[pd.DataFrame, Dict[str, Any]]:
|
|
208
|
+
"""Fetch a single record based on the provided query.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
query: The SQL query string to fetch the record
|
|
212
|
+
output_format: Output format ('pandas' or 'dict')
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Union[pd.DataFrame, Dict]: Record in the requested format
|
|
216
|
+
|
|
217
|
+
Raises:
|
|
218
|
+
Exception: If there's an error executing the query
|
|
219
|
+
"""
|
|
220
|
+
frmt = output_format.lower()
|
|
221
|
+
if frmt == 'structured':
|
|
222
|
+
frmt = 'native' # Default to json for structured output
|
|
223
|
+
async with await self._db.connection() as conn: # pylint: disable=E1101 # noqa
|
|
224
|
+
conn.output_format(frmt)
|
|
225
|
+
result, error = await conn.query(query)
|
|
226
|
+
if error:
|
|
227
|
+
raise Exception(
|
|
228
|
+
f"Error fetching record: {error}"
|
|
229
|
+
)
|
|
230
|
+
if isinstance(result, pd.DataFrame) and result.empty:
|
|
231
|
+
raise ValueError(
|
|
232
|
+
"No data found for the provided query."
|
|
233
|
+
)
|
|
234
|
+
elif not result:
|
|
235
|
+
raise ValueError(
|
|
236
|
+
"No data found for the provided query."
|
|
237
|
+
)
|
|
238
|
+
if output_format == "pandas":
|
|
239
|
+
# return the first row as a DataFrame
|
|
240
|
+
return result.iloc[0:1]
|
|
241
|
+
elif output_format == "json":
|
|
242
|
+
return json_encoder(
|
|
243
|
+
result.to_dict(orient='records')
|
|
244
|
+
)
|
|
245
|
+
elif output_format == "structured":
|
|
246
|
+
# Convert to Pydantic model
|
|
247
|
+
return structured_obj(**result[0])
|
|
248
|
+
else:
|
|
249
|
+
raise TypeError(
|
|
250
|
+
f"Unsupported output format: {output_format}"
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
async def _get_dataset(
|
|
254
|
+
self,
|
|
255
|
+
query: str,
|
|
256
|
+
output_format: str = 'pandas',
|
|
257
|
+
structured_obj: Optional[Callable[[Dict[str, Any]], Any]] = None
|
|
258
|
+
) -> Union[pd.DataFrame, Dict[str, Any]]:
|
|
259
|
+
"""Fetch a dataset based on the provided query.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
query: The SQL query string to fetch the dataset
|
|
263
|
+
output_format: Output format ('pandas' or 'dict')
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
Union[pd.DataFrame, Dict]: Dataset in the requested format
|
|
267
|
+
|
|
268
|
+
Raises:
|
|
269
|
+
Exception: If there's an error executing the query
|
|
270
|
+
"""
|
|
271
|
+
frmt = output_format.lower()
|
|
272
|
+
if frmt in ('structured', 'json'):
|
|
273
|
+
frmt = 'pandas' # Default to pandas for structured output
|
|
274
|
+
async with await self._db.connection() as conn: # pylint: disable=E1101 # noqa
|
|
275
|
+
conn.output_format(frmt)
|
|
276
|
+
result, error = await conn.query(query)
|
|
277
|
+
if error:
|
|
278
|
+
raise Exception(
|
|
279
|
+
f"Error fetching dataset: {error}"
|
|
280
|
+
)
|
|
281
|
+
if result.empty:
|
|
282
|
+
raise ValueError(
|
|
283
|
+
"No data found for the provided query."
|
|
284
|
+
)
|
|
285
|
+
if output_format == "pandas":
|
|
286
|
+
return result
|
|
287
|
+
elif output_format == "json":
|
|
288
|
+
return json_encoder(
|
|
289
|
+
result.to_dict(orient='records')
|
|
290
|
+
)
|
|
291
|
+
elif output_format == "structured":
|
|
292
|
+
# Convert DataFrame to Pydantic models
|
|
293
|
+
data = []
|
|
294
|
+
try:
|
|
295
|
+
if structured_obj is None:
|
|
296
|
+
raise ValueError(
|
|
297
|
+
"structured_obj must be provided for structured output"
|
|
298
|
+
)
|
|
299
|
+
# Convert DataFrame rows to dictionaries
|
|
300
|
+
records_data = [row.to_dict() for _, row in result.iterrows()]
|
|
301
|
+
print(
|
|
302
|
+
f"Detected collection model: {structured_obj.__name__}"
|
|
303
|
+
)
|
|
304
|
+
if is_collection_model(structured_obj):
|
|
305
|
+
record_model = get_model_from_collection(structured_obj)
|
|
306
|
+
individual_records = [record_model(**row_dict) for row_dict in records_data]
|
|
307
|
+
# Create the container model with records
|
|
308
|
+
return structured_obj(
|
|
309
|
+
records=individual_records,
|
|
310
|
+
total_records=len(individual_records)
|
|
311
|
+
)
|
|
312
|
+
elif get_origin(structured_obj) is list:
|
|
313
|
+
# Handle direct list types like List[VisitsByManagerRecord]
|
|
314
|
+
record_model = get_args(structured_obj)[0]
|
|
315
|
+
return [record_model(**row_dict) for row_dict in records_data]
|
|
316
|
+
# Convert each row to the structured object
|
|
317
|
+
else:
|
|
318
|
+
for _, row in result.iterrows():
|
|
319
|
+
data.append(structured_obj(**row.to_dict()))
|
|
320
|
+
return data
|
|
321
|
+
except Exception as e:
|
|
322
|
+
raise ValueError(
|
|
323
|
+
f"Error converting to structured output: {e}"
|
|
324
|
+
)
|
|
325
|
+
else:
|
|
326
|
+
raise TypeError(
|
|
327
|
+
f"Unsupported output format: {output_format}"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
async def _get_queryslug(
|
|
331
|
+
self,
|
|
332
|
+
slug: str,
|
|
333
|
+
output_format: str = 'pandas',
|
|
334
|
+
conditions: Optional[Dict[str, Any]] = None,
|
|
335
|
+
structured_obj: Optional[Callable[[Dict[str, Any]], Any]] = None
|
|
336
|
+
) -> Union[pd.DataFrame, Dict[str, Any]]:
|
|
337
|
+
"""Execute a query and return the results in the specified format.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
slug: The Query slug for the query
|
|
341
|
+
output_format: Output format ('pandas', 'json', or 'structured')
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
Union[pd.DataFrame, Dict]: Query results in the requested format
|
|
345
|
+
|
|
346
|
+
Raises:
|
|
347
|
+
Exception: If there's an error executing the query
|
|
348
|
+
"""
|
|
349
|
+
qs = QS(slug=slug, conditions=conditions)
|
|
350
|
+
result, error = await qs.query()
|
|
351
|
+
if error:
|
|
352
|
+
raise ToolError(
|
|
353
|
+
f"Error executing query '{slug}': {error}"
|
|
354
|
+
)
|
|
355
|
+
if isinstance(result, pd.DataFrame) and result.empty:
|
|
356
|
+
raise ValueError(
|
|
357
|
+
f"No data found for query '{slug}'."
|
|
358
|
+
)
|
|
359
|
+
elif not result:
|
|
360
|
+
raise ValueError(
|
|
361
|
+
f"No data found for query '{slug}'."
|
|
362
|
+
)
|
|
363
|
+
if isinstance(result, dict):
|
|
364
|
+
result = [result] # Convert single dict to list for consistency
|
|
365
|
+
if output_format == 'pandas':
|
|
366
|
+
return pd.DataFrame([dict(row) for row in result])
|
|
367
|
+
elif output_format == 'json':
|
|
368
|
+
return json_encoder([dict(row) for row in result])
|
|
369
|
+
elif output_format == 'structured':
|
|
370
|
+
if structured_obj is None:
|
|
371
|
+
raise ValueError(
|
|
372
|
+
"structured_obj must be provided for structured output"
|
|
373
|
+
)
|
|
374
|
+
if is_collection_model(structured_obj):
|
|
375
|
+
record_model = get_model_from_collection(structured_obj)
|
|
376
|
+
individual_records = [record_model(**row_dict) for row_dict in result]
|
|
377
|
+
# Create the container model with records
|
|
378
|
+
return structured_obj(
|
|
379
|
+
records=individual_records,
|
|
380
|
+
total_records=len(individual_records)
|
|
381
|
+
)
|
|
382
|
+
elif get_origin(structured_obj) is list:
|
|
383
|
+
# Handle direct list types like List[VisitsByManagerRecord]
|
|
384
|
+
record_model = get_args(structured_obj)[0]
|
|
385
|
+
return [record_model(**row_dict) for row_dict in result]
|
|
386
|
+
else:
|
|
387
|
+
# Convert each row to the structured object
|
|
388
|
+
data = []
|
|
389
|
+
for row in result:
|
|
390
|
+
data.append(structured_obj(**row))
|
|
391
|
+
return data
|
|
392
|
+
else:
|
|
393
|
+
raise TypeError(
|
|
394
|
+
f"Unsupported output format: {output_format}"
|
|
395
|
+
)
|