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,368 @@
|
|
|
1
|
+
"""
|
|
2
|
+
EDA Report Tool - Comprehensive profiling using ydata_profiling (formerly pandas_profiling).
|
|
3
|
+
"""
|
|
4
|
+
from typing import Any, Dict, Optional
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
import pandas as pd
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
9
|
+
from ydata_profiling import ProfileReport
|
|
10
|
+
from .abstract import AbstractTool
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class EdaReportPresets:
|
|
14
|
+
"""Predefined configuration presets for different use cases."""
|
|
15
|
+
|
|
16
|
+
QUICK_OVERVIEW = {
|
|
17
|
+
"minimal": True,
|
|
18
|
+
"explorative": False,
|
|
19
|
+
"correlations": False,
|
|
20
|
+
"interactions": False,
|
|
21
|
+
"missing_diagrams": True,
|
|
22
|
+
"duplicates": True
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
COMPREHENSIVE = {
|
|
26
|
+
"minimal": False,
|
|
27
|
+
"explorative": True,
|
|
28
|
+
"correlations": True,
|
|
29
|
+
"interactions": True,
|
|
30
|
+
"missing_diagrams": True,
|
|
31
|
+
"duplicates": True,
|
|
32
|
+
"correlation_threshold": 0.8
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
CORRELATION_FOCUSED = {
|
|
36
|
+
"minimal": False,
|
|
37
|
+
"explorative": True,
|
|
38
|
+
"correlations": True,
|
|
39
|
+
"interactions": True,
|
|
40
|
+
"missing_diagrams": False,
|
|
41
|
+
"duplicates": False,
|
|
42
|
+
"correlation_threshold": 0.7
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
DATA_QUALITY = {
|
|
46
|
+
"minimal": False,
|
|
47
|
+
"explorative": False,
|
|
48
|
+
"correlations": False,
|
|
49
|
+
"interactions": False,
|
|
50
|
+
"missing_diagrams": True,
|
|
51
|
+
"duplicates": True
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
class EdaReportArgs(BaseModel):
|
|
55
|
+
"""Arguments schema for EDA Report generation."""
|
|
56
|
+
|
|
57
|
+
dataframe: Any = Field(
|
|
58
|
+
description="Pandas DataFrame to profile and analyze"
|
|
59
|
+
)
|
|
60
|
+
filename: Optional[str] = Field(
|
|
61
|
+
default=None,
|
|
62
|
+
description="Optional filename to save the EDA report (without extension)"
|
|
63
|
+
)
|
|
64
|
+
title: str = Field(
|
|
65
|
+
default="EDA Profiling Report",
|
|
66
|
+
description="Title for the profiling report"
|
|
67
|
+
)
|
|
68
|
+
df_name: str = Field(
|
|
69
|
+
default="DataFrame",
|
|
70
|
+
description="Name to use for the dataset in the report"
|
|
71
|
+
)
|
|
72
|
+
minimal: bool = Field(
|
|
73
|
+
default=False,
|
|
74
|
+
description="Set to True for faster, less detailed reports"
|
|
75
|
+
)
|
|
76
|
+
explorative: bool = Field(
|
|
77
|
+
default=True,
|
|
78
|
+
description="Set to True for detailed explorative analysis with correlations and interactions"
|
|
79
|
+
)
|
|
80
|
+
sample_size: Optional[int] = Field(
|
|
81
|
+
default=None,
|
|
82
|
+
description="Limit analysis to a sample of the data (None for full dataset)"
|
|
83
|
+
)
|
|
84
|
+
dark_mode: bool = Field(
|
|
85
|
+
default=False,
|
|
86
|
+
description="Enable dark mode theme for the report"
|
|
87
|
+
)
|
|
88
|
+
orange_mode: bool = Field(
|
|
89
|
+
default=False,
|
|
90
|
+
description="Enable orange theme for the report"
|
|
91
|
+
)
|
|
92
|
+
correlations: bool = Field(
|
|
93
|
+
default=True,
|
|
94
|
+
description="Include correlation analysis"
|
|
95
|
+
)
|
|
96
|
+
missing_diagrams: bool = Field(
|
|
97
|
+
default=True,
|
|
98
|
+
description="Include missing value diagrams"
|
|
99
|
+
)
|
|
100
|
+
duplicates: bool = Field(
|
|
101
|
+
default=True,
|
|
102
|
+
description="Include duplicate analysis"
|
|
103
|
+
)
|
|
104
|
+
interactions: bool = Field(
|
|
105
|
+
default=True,
|
|
106
|
+
description="Include variable interactions analysis"
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class EdaReportTool(AbstractTool):
|
|
111
|
+
"""
|
|
112
|
+
Tool for generating comprehensive EDA reports using ydata_profiling.
|
|
113
|
+
|
|
114
|
+
This tool creates detailed profiling reports with statistics, visualizations,
|
|
115
|
+
correlations, missing value analysis, and data quality insights.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
name: str = "eda_report"
|
|
119
|
+
description: str = "Generate comprehensive EDA profiling report using ydata_profiling with detailed statistics and visualizations"
|
|
120
|
+
args_schema = EdaReportArgs
|
|
121
|
+
return_direct: bool = False
|
|
122
|
+
|
|
123
|
+
def _default_output_dir(self) -> Optional[Path]:
|
|
124
|
+
"""Default output directory for EDA reports."""
|
|
125
|
+
return self.static_dir / "eda_profiling" if self.static_dir else None
|
|
126
|
+
|
|
127
|
+
async def _execute(
|
|
128
|
+
self,
|
|
129
|
+
dataframe: pd.DataFrame,
|
|
130
|
+
filename: Optional[str] = None,
|
|
131
|
+
title: str = "EDA Profiling Report",
|
|
132
|
+
df_name: str = "DataFrame",
|
|
133
|
+
minimal: bool = False,
|
|
134
|
+
explorative: bool = True,
|
|
135
|
+
sample_size: Optional[int] = None,
|
|
136
|
+
dark_mode: bool = False,
|
|
137
|
+
orange_mode: bool = False,
|
|
138
|
+
correlations: bool = True,
|
|
139
|
+
missing_diagrams: bool = True,
|
|
140
|
+
duplicates: bool = True,
|
|
141
|
+
interactions: bool = True,
|
|
142
|
+
**kwargs
|
|
143
|
+
) -> Dict[str, Any]:
|
|
144
|
+
"""
|
|
145
|
+
Execute the EDA profiling report generation.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
Dictionary containing the HTML report and optional file information
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
# Validate input
|
|
152
|
+
if not isinstance(dataframe, pd.DataFrame):
|
|
153
|
+
raise ValueError("Input must be a pandas DataFrame")
|
|
154
|
+
|
|
155
|
+
if dataframe.empty:
|
|
156
|
+
raise ValueError("DataFrame is empty - cannot generate profiling report")
|
|
157
|
+
|
|
158
|
+
self.logger.info(f"Generating profiling report for DataFrame with shape {dataframe.shape}")
|
|
159
|
+
|
|
160
|
+
# Apply sampling if specified
|
|
161
|
+
df_to_profile = dataframe.copy()
|
|
162
|
+
if sample_size and len(df_to_profile) > sample_size:
|
|
163
|
+
df_to_profile = df_to_profile.sample(n=sample_size, random_state=42)
|
|
164
|
+
self.logger.info(f"Sampling {sample_size} rows from {len(dataframe)} total rows")
|
|
165
|
+
|
|
166
|
+
# Generate timestamp for unique identification
|
|
167
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
168
|
+
|
|
169
|
+
# Configure profiling options with simplified approach
|
|
170
|
+
# Start with basic configuration
|
|
171
|
+
config_kwargs = {
|
|
172
|
+
"title": title,
|
|
173
|
+
"progress_bar": False,
|
|
174
|
+
"minimal": minimal,
|
|
175
|
+
"explorative": explorative,
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
# Only add optional configurations if they differ from defaults
|
|
179
|
+
# This avoids conflicts with ydata_profiling's internal config merging
|
|
180
|
+
|
|
181
|
+
# For minimal reports, disable expensive computations
|
|
182
|
+
if minimal:
|
|
183
|
+
config_kwargs.update({
|
|
184
|
+
"correlations": {
|
|
185
|
+
"auto": {"calculate": True} if correlations else {"calculate": False},
|
|
186
|
+
},
|
|
187
|
+
"missing_diagrams": {"matrix": False, "heatmap": False},
|
|
188
|
+
"interactions": {"continuous": False},
|
|
189
|
+
"duplicates": {"head": 0}
|
|
190
|
+
})
|
|
191
|
+
else:
|
|
192
|
+
# For full reports, use selective enabling
|
|
193
|
+
if not correlations:
|
|
194
|
+
config_kwargs["correlations"] = {
|
|
195
|
+
"auto": {"calculate": False}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if not missing_diagrams:
|
|
199
|
+
config_kwargs["missing_diagrams"] = {
|
|
200
|
+
"bar": False,
|
|
201
|
+
"matrix": False,
|
|
202
|
+
"heatmap": False
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if not interactions:
|
|
206
|
+
config_kwargs["interactions"] = {"continuous": False}
|
|
207
|
+
|
|
208
|
+
if not duplicates:
|
|
209
|
+
config_kwargs["duplicates"] = {"head": 0}
|
|
210
|
+
|
|
211
|
+
# Apply theme settings (simplified)
|
|
212
|
+
if dark_mode or orange_mode:
|
|
213
|
+
# Theme settings are often problematic, so we'll skip them for now
|
|
214
|
+
# and focus on getting the basic report working
|
|
215
|
+
pass
|
|
216
|
+
|
|
217
|
+
try:
|
|
218
|
+
# Generate the profiling report
|
|
219
|
+
self.logger.info("Starting profiling analysis...")
|
|
220
|
+
start_time = datetime.now()
|
|
221
|
+
|
|
222
|
+
# Create ProfileReport with proper configuration
|
|
223
|
+
profile = ProfileReport(df_to_profile, **config_kwargs)
|
|
224
|
+
|
|
225
|
+
# Get HTML content
|
|
226
|
+
html_content = profile.to_html()
|
|
227
|
+
|
|
228
|
+
generation_time = (datetime.now() - start_time).total_seconds()
|
|
229
|
+
self.logger.info(f"Profiling completed in {generation_time:.2f} seconds")
|
|
230
|
+
|
|
231
|
+
# Prepare result
|
|
232
|
+
result = {
|
|
233
|
+
"html": html_content,
|
|
234
|
+
"title": title,
|
|
235
|
+
"timestamp": timestamp,
|
|
236
|
+
"dataset_name": df_name,
|
|
237
|
+
"dataset_shape": df_to_profile.shape,
|
|
238
|
+
"original_shape": dataframe.shape,
|
|
239
|
+
"generation_time_seconds": generation_time,
|
|
240
|
+
"config": {
|
|
241
|
+
"minimal": minimal,
|
|
242
|
+
"explorative": explorative,
|
|
243
|
+
"correlations": {
|
|
244
|
+
"auto": {"calculate": True} if correlations else {"calculate": False},
|
|
245
|
+
},
|
|
246
|
+
"interactions": {
|
|
247
|
+
"auto": {"calculate": True} if interactions else {"calculate": False},
|
|
248
|
+
},
|
|
249
|
+
"sample_size": len(df_to_profile)
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
# Save to file if filename provided
|
|
254
|
+
if filename:
|
|
255
|
+
if not filename.endswith('.html'):
|
|
256
|
+
filename = f"{filename}_{timestamp}.html"
|
|
257
|
+
|
|
258
|
+
# Ensure output directory exists
|
|
259
|
+
if self.output_dir:
|
|
260
|
+
self.output_dir.mkdir(parents=True, exist_ok=True)
|
|
261
|
+
file_path = self.output_dir / filename
|
|
262
|
+
else:
|
|
263
|
+
file_path = Path(filename)
|
|
264
|
+
|
|
265
|
+
try:
|
|
266
|
+
# Save the HTML report
|
|
267
|
+
profile.to_file(file_path)
|
|
268
|
+
|
|
269
|
+
self.logger.info(f"Profiling report saved to: {file_path}")
|
|
270
|
+
|
|
271
|
+
result.update({
|
|
272
|
+
"file_path": str(file_path),
|
|
273
|
+
"file_url": self.to_static_url(file_path),
|
|
274
|
+
"file_size": file_path.stat().st_size,
|
|
275
|
+
"report_url": f"file://{file_path.absolute()}"
|
|
276
|
+
})
|
|
277
|
+
|
|
278
|
+
except Exception as e:
|
|
279
|
+
self.logger.error(f"Failed to save profiling report: {e}")
|
|
280
|
+
result["save_error"] = str(e)
|
|
281
|
+
|
|
282
|
+
# Add profiling statistics
|
|
283
|
+
try:
|
|
284
|
+
result.update({
|
|
285
|
+
"statistics": {
|
|
286
|
+
"variables_count": len(df_to_profile.columns),
|
|
287
|
+
"observations_count": len(df_to_profile),
|
|
288
|
+
"missing_cells": df_to_profile.isna().sum().sum(),
|
|
289
|
+
"missing_cells_percentage": (df_to_profile.isna().sum().sum() / df_to_profile.size) * 100,
|
|
290
|
+
"duplicate_rows": df_to_profile.duplicated().sum(),
|
|
291
|
+
"numeric_variables": len(df_to_profile.select_dtypes(include=['number']).columns),
|
|
292
|
+
"categorical_variables": len(df_to_profile.select_dtypes(include=['object', 'category']).columns),
|
|
293
|
+
"boolean_variables": len(df_to_profile.select_dtypes(include=['bool']).columns),
|
|
294
|
+
"datetime_variables": len(df_to_profile.select_dtypes(include=['datetime']).columns)
|
|
295
|
+
}
|
|
296
|
+
})
|
|
297
|
+
except Exception as e:
|
|
298
|
+
self.logger.warning(f"Failed to generate statistics summary: {e}")
|
|
299
|
+
|
|
300
|
+
return result
|
|
301
|
+
|
|
302
|
+
except Exception as e:
|
|
303
|
+
self.logger.error(f"Error generating profiling report: {e}")
|
|
304
|
+
|
|
305
|
+
# Return a simplified fallback report
|
|
306
|
+
fallback_result = {
|
|
307
|
+
"html": f"<html><body><h1>Error generating report</h1><p>Error: {str(e)}</p></body></html>",
|
|
308
|
+
"title": title,
|
|
309
|
+
"timestamp": timestamp,
|
|
310
|
+
"dataset_name": df_name,
|
|
311
|
+
"dataset_shape": df_to_profile.shape,
|
|
312
|
+
"original_shape": dataframe.shape,
|
|
313
|
+
"generation_time_seconds": 0,
|
|
314
|
+
"error": str(e),
|
|
315
|
+
"config": {
|
|
316
|
+
"minimal": minimal,
|
|
317
|
+
"explorative": explorative,
|
|
318
|
+
"correlations": {
|
|
319
|
+
"auto": {"calculate": True},
|
|
320
|
+
},
|
|
321
|
+
"interactions": {
|
|
322
|
+
"auto": {"calculate": True},
|
|
323
|
+
},
|
|
324
|
+
"sample_size": len(df_to_profile)
|
|
325
|
+
},
|
|
326
|
+
"statistics": {
|
|
327
|
+
"variables_count": len(df_to_profile.columns),
|
|
328
|
+
"observations_count": len(df_to_profile),
|
|
329
|
+
"missing_cells": df_to_profile.isna().sum().sum(),
|
|
330
|
+
"missing_cells_percentage": (df_to_profile.isna().sum().sum() / df_to_profile.size) * 100,
|
|
331
|
+
"duplicate_rows": df_to_profile.duplicated().sum(),
|
|
332
|
+
"numeric_variables": len(df_to_profile.select_dtypes(include=['number']).columns),
|
|
333
|
+
"categorical_variables": len(df_to_profile.select_dtypes(include=['object', 'category']).columns),
|
|
334
|
+
"boolean_variables": len(df_to_profile.select_dtypes(include=['bool']).columns),
|
|
335
|
+
"datetime_variables": len(df_to_profile.select_dtypes(include=['datetime']).columns)
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
# Log the full configuration for debug
|
|
340
|
+
self.logger.debug(f"Failed config_kwargs: {config_kwargs}")
|
|
341
|
+
|
|
342
|
+
return fallback_result
|
|
343
|
+
|
|
344
|
+
def apply_preset(self, preset_name: str, **kwargs) -> Dict[str, Any]:
|
|
345
|
+
"""
|
|
346
|
+
Apply a configuration preset.
|
|
347
|
+
|
|
348
|
+
Args:
|
|
349
|
+
preset_name: Name of the preset ('quick', 'comprehensive', 'correlation', 'quality')
|
|
350
|
+
**kwargs: Additional arguments to override preset settings
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
Combined configuration dictionary
|
|
354
|
+
"""
|
|
355
|
+
preset_map = {
|
|
356
|
+
'quick': EdaReportPresets.QUICK_OVERVIEW,
|
|
357
|
+
'comprehensive': EdaReportPresets.COMPREHENSIVE,
|
|
358
|
+
'correlation': EdaReportPresets.CORRELATION_FOCUSED,
|
|
359
|
+
'quality': EdaReportPresets.DATA_QUALITY
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if preset_name not in preset_map:
|
|
363
|
+
raise ValueError(f"Unknown preset: {preset_name}. Available: {list(preset_map.keys())}")
|
|
364
|
+
|
|
365
|
+
preset_config = preset_map[preset_name].copy()
|
|
366
|
+
preset_config.update(kwargs) # Override with user-provided args
|
|
367
|
+
|
|
368
|
+
return preset_config
|