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,352 @@
|
|
|
1
|
+
from decimal import Decimal
|
|
2
|
+
from typing import List, Optional, Dict, Any, Union
|
|
3
|
+
from datetime import date
|
|
4
|
+
import json
|
|
5
|
+
from typing_extensions import Annotated
|
|
6
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
7
|
+
from datamodel.parsers.json import json_encoder # noqa pylint: disable=E0611
|
|
8
|
+
from ...exceptions import ToolError # pylint: disable=E0611
|
|
9
|
+
from ..decorators import tool_schema
|
|
10
|
+
from ..nextstop.base import BaseNextStop
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RetailerInput(BaseModel):
|
|
14
|
+
"""Input schema for querying retailer evaluation data."""
|
|
15
|
+
program: Optional[str] = Field(
|
|
16
|
+
default='google',
|
|
17
|
+
description="Program name, defaults to current program if not provided"
|
|
18
|
+
)
|
|
19
|
+
retailer: str = Field(
|
|
20
|
+
...,
|
|
21
|
+
description="The name of the retailer to query."
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Add a model_config to prevent additional properties
|
|
25
|
+
model_config = ConfigDict(
|
|
26
|
+
arbitrary_types_allowed=False,
|
|
27
|
+
extra="forbid",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
class RetailerEvaluation(BaseModel):
|
|
31
|
+
"""Schema for retailer evaluation data."""
|
|
32
|
+
account_name: str
|
|
33
|
+
created_at: date
|
|
34
|
+
retailer_evaluation: Dict[str, Any] = Field(
|
|
35
|
+
default_factory=dict,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
@field_validator('retailer_evaluation', mode='before')
|
|
39
|
+
@classmethod
|
|
40
|
+
def parse_retailer_evaluation(cls, v):
|
|
41
|
+
if v is None or v == '':
|
|
42
|
+
return {}
|
|
43
|
+
if isinstance(v, dict):
|
|
44
|
+
return v
|
|
45
|
+
if isinstance(v, (bytes, bytearray)):
|
|
46
|
+
v = v.decode('utf-8', errors='ignore')
|
|
47
|
+
if isinstance(v, str):
|
|
48
|
+
try:
|
|
49
|
+
parsed = json.loads(v)
|
|
50
|
+
except json.JSONDecodeError as e:
|
|
51
|
+
raise ValueError("Evaluations field is not a valid JSON string.") from e
|
|
52
|
+
if not isinstance(parsed, dict):
|
|
53
|
+
raise TypeError("Evaluations JSON must decode to a dictionary.")
|
|
54
|
+
return parsed
|
|
55
|
+
raise TypeError("evaluations must be a dict or a JSON string.")
|
|
56
|
+
|
|
57
|
+
# Add a model_config to prevent additional properties
|
|
58
|
+
model_config = ConfigDict(
|
|
59
|
+
arbitrary_types_allowed=False,
|
|
60
|
+
extra="forbid",
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
class ProductInput(BaseModel):
|
|
64
|
+
"""Input schema for querying Epson product information."""
|
|
65
|
+
model: Optional[str] = Field(
|
|
66
|
+
default=None,
|
|
67
|
+
description="The unique identifier for the Epson product."
|
|
68
|
+
)
|
|
69
|
+
product_name: Optional[str] = Field(
|
|
70
|
+
default=None,
|
|
71
|
+
description="The name of the Epson product."
|
|
72
|
+
)
|
|
73
|
+
output_format: Optional[str] = Field(
|
|
74
|
+
default='structured',
|
|
75
|
+
description="Output format for the employee data"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
# Add a model_config to prevent additional properties
|
|
79
|
+
model_config = ConfigDict(
|
|
80
|
+
arbitrary_types_allowed=False,
|
|
81
|
+
extra="forbid",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ProductInfo(BaseModel):
|
|
86
|
+
"""Schema for the product information returned by the query."""
|
|
87
|
+
name: str
|
|
88
|
+
model: str
|
|
89
|
+
description: str
|
|
90
|
+
picture_url: str
|
|
91
|
+
brand: str
|
|
92
|
+
pricing: Decimal
|
|
93
|
+
customer_satisfaction: Optional[str] = None
|
|
94
|
+
product_evaluation: Optional[str] = None
|
|
95
|
+
product_compliant: Optional[str] = None
|
|
96
|
+
specifications: Dict[str, Union[dict, list]] = Field(
|
|
97
|
+
default_factory=dict,
|
|
98
|
+
description="Specifications of the product, can be a dict or list."
|
|
99
|
+
)
|
|
100
|
+
review_average: float
|
|
101
|
+
reviews: int
|
|
102
|
+
|
|
103
|
+
@field_validator('specifications', mode='before')
|
|
104
|
+
@classmethod
|
|
105
|
+
def parse_specifications(cls, v):
|
|
106
|
+
if v is None or v == '':
|
|
107
|
+
return {}
|
|
108
|
+
if isinstance(v, dict):
|
|
109
|
+
return v
|
|
110
|
+
if isinstance(v, (bytes, bytearray)):
|
|
111
|
+
v = v.decode('utf-8', errors='ignore')
|
|
112
|
+
if isinstance(v, str):
|
|
113
|
+
try:
|
|
114
|
+
parsed = json.loads(v)
|
|
115
|
+
except json.JSONDecodeError as e:
|
|
116
|
+
raise ValueError("Specifications field is not a valid JSON string.") from e
|
|
117
|
+
if not isinstance(parsed, dict):
|
|
118
|
+
raise TypeError("Specifications JSON must decode to a dictionary.")
|
|
119
|
+
return parsed
|
|
120
|
+
raise TypeError("specifications must be a dict or a JSON string.")
|
|
121
|
+
|
|
122
|
+
# Add a model_config to prevent additional properties
|
|
123
|
+
model_config = ConfigDict(
|
|
124
|
+
arbitrary_types_allowed=False,
|
|
125
|
+
extra="forbid",
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
class ClientInput(BaseModel):
|
|
129
|
+
"""Input schema for client-related tools."""
|
|
130
|
+
program: Optional[str] = Field(
|
|
131
|
+
default='google',
|
|
132
|
+
description="Program name, defaults to current program if not provided"
|
|
133
|
+
)
|
|
134
|
+
question: str = Field(
|
|
135
|
+
None,
|
|
136
|
+
description="Question ID to retrieve"
|
|
137
|
+
)
|
|
138
|
+
client: str = Field(default='1400', description="Unique identifier for the client")
|
|
139
|
+
|
|
140
|
+
model_config = ConfigDict(extra="forbid")
|
|
141
|
+
|
|
142
|
+
class VisitData(BaseModel):
|
|
143
|
+
"""Individual visit data entry containing question and answer information."""
|
|
144
|
+
question_id: str = Field(..., description="Unique identifier for the question")
|
|
145
|
+
question: str = Field(..., description="The question made by the survey")
|
|
146
|
+
answer: Optional[str] = Field(default='', description="Answer provided for the question")
|
|
147
|
+
activity_item_id: Optional[int] = Field(
|
|
148
|
+
default=None,
|
|
149
|
+
description="Identifier for the activity item associated with the question"
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
class EvaluationRecord(BaseModel):
|
|
153
|
+
"""Complete evaluation record with visit data and metadata."""
|
|
154
|
+
evaluation_id: str = Field(..., description="Unique evaluation identifier")
|
|
155
|
+
visit_date: date = Field(..., description="Date of the visit")
|
|
156
|
+
account_name: str = Field(..., description="Name of the account associated with the visit")
|
|
157
|
+
visit_data: Dict[str, VisitData] = Field(..., description="Dictionary of question-answer pairs from the visit")
|
|
158
|
+
qty_stores_visited: int = Field(..., description="Number of stores visited")
|
|
159
|
+
qty_retailers_visited: int = Field(..., description="Number of retailers visited")
|
|
160
|
+
qty_total_visits: int = Field(..., description="Total number of visits made")
|
|
161
|
+
qty_states_visited: int = Field(..., description="Number of states visited")
|
|
162
|
+
qty_mystery_shoppers: int = Field(..., description="Number of mystery shoppers involved")
|
|
163
|
+
|
|
164
|
+
class Config:
|
|
165
|
+
# Allow parsing of date strings
|
|
166
|
+
json_encoders = {
|
|
167
|
+
date: lambda v: v.isoformat()
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# Alternative simpler model if you only need the visit_data part
|
|
172
|
+
class VisitDataResponse(BaseModel):
|
|
173
|
+
"""Simplified model containing only the visit data."""
|
|
174
|
+
visit_data: List[VisitData] = Field(..., description="List of question-answer pairs from the visit")
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class VisitsToolkit(BaseNextStop):
|
|
178
|
+
"""Toolkit for managing employee-related operations in Sassie Survey Project.
|
|
179
|
+
|
|
180
|
+
This toolkit provides tools to:
|
|
181
|
+
- visits_survey: Get visit survey data for an specified Client.
|
|
182
|
+
- get_visit_questions: Get visit questions and answers for a specific client.
|
|
183
|
+
- get_product_information: Get basic product information.
|
|
184
|
+
- get_retailer: Get retailer evaluation data.
|
|
185
|
+
"""
|
|
186
|
+
async def _get_visits(
|
|
187
|
+
self,
|
|
188
|
+
program: str,
|
|
189
|
+
client: str,
|
|
190
|
+
question: str,
|
|
191
|
+
**kwargs
|
|
192
|
+
) -> List[Dict[str, Any]]:
|
|
193
|
+
"""Internal method to fetch raw visit data for a specified client.
|
|
194
|
+
"""
|
|
195
|
+
if program:
|
|
196
|
+
self.program = program
|
|
197
|
+
sql = await self._get_query("surveys")
|
|
198
|
+
sql = sql.format(client=client, question=question)
|
|
199
|
+
try:
|
|
200
|
+
return await self._get_dataset(
|
|
201
|
+
sql,
|
|
202
|
+
output_format='structured',
|
|
203
|
+
structured_obj=EvaluationRecord
|
|
204
|
+
)
|
|
205
|
+
except ToolError as te:
|
|
206
|
+
raise ValueError(
|
|
207
|
+
f"No Survey Visit data found for client {client}, error: {te}"
|
|
208
|
+
)
|
|
209
|
+
except Exception as e:
|
|
210
|
+
raise ValueError(f"Error fetching Survey visit data: {e}"
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
@tool_schema(ClientInput)
|
|
214
|
+
async def visits_survey(
|
|
215
|
+
self,
|
|
216
|
+
program: str,
|
|
217
|
+
client: str,
|
|
218
|
+
question: str,
|
|
219
|
+
**kwargs
|
|
220
|
+
) -> List[EvaluationRecord]:
|
|
221
|
+
"""Fetch visit survey data for a specified client.
|
|
222
|
+
"""
|
|
223
|
+
if program:
|
|
224
|
+
self.program = program
|
|
225
|
+
visits = await self._get_visits(
|
|
226
|
+
program=program,
|
|
227
|
+
client=client,
|
|
228
|
+
question=question
|
|
229
|
+
)
|
|
230
|
+
# removing the column "visit_data" from the response
|
|
231
|
+
for visit in visits:
|
|
232
|
+
if hasattr(visit, 'visit_data'):
|
|
233
|
+
delattr(visit, 'visit_data')
|
|
234
|
+
return visits
|
|
235
|
+
|
|
236
|
+
@tool_schema(ClientInput)
|
|
237
|
+
async def get_visit_questions(
|
|
238
|
+
self,
|
|
239
|
+
program: str,
|
|
240
|
+
client: str,
|
|
241
|
+
question: str,
|
|
242
|
+
) -> Dict[str, List[Dict[str, Any]]]:
|
|
243
|
+
"""
|
|
244
|
+
Get visit information for a specific store, focusing on questions and answers.
|
|
245
|
+
"""
|
|
246
|
+
if program:
|
|
247
|
+
self.program = program
|
|
248
|
+
visits = await self._get_visits(
|
|
249
|
+
client=client,
|
|
250
|
+
program=program,
|
|
251
|
+
question=question
|
|
252
|
+
)
|
|
253
|
+
if isinstance(visits, str): # If an error message was returned
|
|
254
|
+
return visits
|
|
255
|
+
|
|
256
|
+
question_data = {}
|
|
257
|
+
for _, visit in enumerate(visits):
|
|
258
|
+
if not visit.visit_data:
|
|
259
|
+
continue
|
|
260
|
+
for question_id, qa_item in visit.visit_data.items():
|
|
261
|
+
idx = f"{question_id}"
|
|
262
|
+
if idx not in question_data:
|
|
263
|
+
question_data[idx] = {
|
|
264
|
+
"all_visit_ids": [],
|
|
265
|
+
"num_responses": 0,
|
|
266
|
+
"question": qa_item.question,
|
|
267
|
+
"answers": {}
|
|
268
|
+
}
|
|
269
|
+
# reduce the size of answer to 100 characters
|
|
270
|
+
if qa_item.answer and len(qa_item.answer) > 100:
|
|
271
|
+
qa_item.answer = qa_item.answer[:100] + "..."
|
|
272
|
+
question_data[idx]["answers"][f"{visit.evaluation_id}"] = qa_item.answer
|
|
273
|
+
question_data[idx]["all_visit_ids"].append(visit.evaluation_id)
|
|
274
|
+
question_data[idx]["num_responses"] += 1
|
|
275
|
+
print('Questions found:', len(question_data))
|
|
276
|
+
return json_encoder(question_data)
|
|
277
|
+
|
|
278
|
+
@tool_schema(ProductInput)
|
|
279
|
+
async def get_product_information(
|
|
280
|
+
self,
|
|
281
|
+
model: str,
|
|
282
|
+
product_name: Optional[str] = None,
|
|
283
|
+
output_format: str = 'structured',
|
|
284
|
+
structured_obj: Optional[ProductInfo] = ProductInfo
|
|
285
|
+
) -> ProductInfo:
|
|
286
|
+
"""
|
|
287
|
+
Retrieve product information for a given Epson product Model.
|
|
288
|
+
"""
|
|
289
|
+
try:
|
|
290
|
+
sql = await self._get_query("product_info")
|
|
291
|
+
sql = sql.format(model=model)
|
|
292
|
+
data = await self._get_dataset(
|
|
293
|
+
sql,
|
|
294
|
+
output_format=output_format,
|
|
295
|
+
structured_obj=structured_obj
|
|
296
|
+
)
|
|
297
|
+
if not data:
|
|
298
|
+
raise ToolError(
|
|
299
|
+
f"No Product data found for model {model}."
|
|
300
|
+
)
|
|
301
|
+
return data
|
|
302
|
+
except ToolError as te:
|
|
303
|
+
raise ValueError(
|
|
304
|
+
f"No Product data found for model {model}, error: {te}"
|
|
305
|
+
)
|
|
306
|
+
except ValueError as ve:
|
|
307
|
+
raise ValueError(
|
|
308
|
+
f"Invalid data format, error: {ve}"
|
|
309
|
+
)
|
|
310
|
+
except Exception as e:
|
|
311
|
+
raise ValueError(
|
|
312
|
+
f"Error fetching Product data: {e}"
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
@tool_schema(RetailerInput)
|
|
316
|
+
async def get_retailer(
|
|
317
|
+
self,
|
|
318
|
+
program: str,
|
|
319
|
+
retailer: str,
|
|
320
|
+
output_format: str = 'structured',
|
|
321
|
+
structured_obj: Optional[RetailerEvaluation] = RetailerEvaluation
|
|
322
|
+
) -> RetailerEvaluation:
|
|
323
|
+
"""
|
|
324
|
+
Retrieve retailer evaluation data for a given retailer name.
|
|
325
|
+
"""
|
|
326
|
+
if program:
|
|
327
|
+
self.program = program
|
|
328
|
+
try:
|
|
329
|
+
sql = await self._get_query("by_retailer")
|
|
330
|
+
sql = sql.format(retailer=retailer)
|
|
331
|
+
data = await self._get_dataset(
|
|
332
|
+
sql,
|
|
333
|
+
output_format=output_format,
|
|
334
|
+
structured_obj=structured_obj
|
|
335
|
+
)
|
|
336
|
+
if not data:
|
|
337
|
+
raise ToolError(
|
|
338
|
+
f"No Retailer data found for retailer {retailer}."
|
|
339
|
+
)
|
|
340
|
+
return data
|
|
341
|
+
except ToolError as te:
|
|
342
|
+
raise ValueError(
|
|
343
|
+
f"No Retailer data found for retailer {retailer}, error: {te}"
|
|
344
|
+
)
|
|
345
|
+
except ValueError as ve:
|
|
346
|
+
raise ValueError(
|
|
347
|
+
f"Invalid data format, error: {ve}"
|
|
348
|
+
)
|
|
349
|
+
except Exception as e:
|
|
350
|
+
raise ValueError(
|
|
351
|
+
f"Error fetching Retailer data: {e}"
|
|
352
|
+
)
|