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,384 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Job Manager for Asynchronous Crew Execution.
|
|
3
|
+
|
|
4
|
+
Manages async execution of AgentCrew operations with job tracking,
|
|
5
|
+
status monitoring, and result retrieval.
|
|
6
|
+
"""
|
|
7
|
+
from typing import Dict, Optional, Callable, Awaitable, Any
|
|
8
|
+
import asyncio
|
|
9
|
+
import uuid
|
|
10
|
+
import contextlib
|
|
11
|
+
from datetime import datetime, timedelta, timezone
|
|
12
|
+
from navconfig.logging import logging
|
|
13
|
+
from .models import JobStatus, Job
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class JobManager:
|
|
17
|
+
"""
|
|
18
|
+
Manages asynchronous job execution for crew operations.
|
|
19
|
+
|
|
20
|
+
Provides:
|
|
21
|
+
- Job creation and tracking
|
|
22
|
+
- Async execution with asyncio.create_task
|
|
23
|
+
- Status monitoring
|
|
24
|
+
- Result retrieval
|
|
25
|
+
- Automatic cleanup of old jobs
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
id: str = "default",
|
|
31
|
+
cleanup_interval: int = 3600, # 1 hour
|
|
32
|
+
job_ttl: int = 86400 # 24 hours
|
|
33
|
+
):
|
|
34
|
+
"""
|
|
35
|
+
Initialize JobManager.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
cleanup_interval: Interval in seconds between cleanup runs
|
|
39
|
+
job_ttl: Time-to-live for completed jobs in seconds
|
|
40
|
+
"""
|
|
41
|
+
self.id = id
|
|
42
|
+
self.jobs: Dict[str, Job] = {}
|
|
43
|
+
self.tasks: Dict[str, asyncio.Task] = {}
|
|
44
|
+
self.logger = logging.getLogger('Parrot.JobManager')
|
|
45
|
+
self.cleanup_interval = cleanup_interval
|
|
46
|
+
self.job_ttl = job_ttl
|
|
47
|
+
self._cleanup_task: Optional[asyncio.Task] = None
|
|
48
|
+
self._running = False
|
|
49
|
+
self._loop = asyncio.get_event_loop()
|
|
50
|
+
|
|
51
|
+
async def start(self):
|
|
52
|
+
"""Start the job manager and cleanup task."""
|
|
53
|
+
if not self._running:
|
|
54
|
+
self._running = True
|
|
55
|
+
self._cleanup_task = asyncio.create_task(self._cleanup_loop())
|
|
56
|
+
self.logger.info("JobManager started")
|
|
57
|
+
|
|
58
|
+
async def stop(self):
|
|
59
|
+
"""Stop the job manager and cleanup task."""
|
|
60
|
+
self._running = False
|
|
61
|
+
if self._cleanup_task:
|
|
62
|
+
self._cleanup_task.cancel()
|
|
63
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
64
|
+
await self._cleanup_task
|
|
65
|
+
# Cancel all running tasks
|
|
66
|
+
for task in self.tasks.values():
|
|
67
|
+
task.cancel()
|
|
68
|
+
self.logger.info("JobManager stopped")
|
|
69
|
+
|
|
70
|
+
def create_job(
|
|
71
|
+
self,
|
|
72
|
+
job_id: str,
|
|
73
|
+
obj_id: str,
|
|
74
|
+
query: Any,
|
|
75
|
+
user_id: Optional[str] = None,
|
|
76
|
+
session_id: Optional[str] = None,
|
|
77
|
+
execution_mode: Optional[str] = None
|
|
78
|
+
) -> Job:
|
|
79
|
+
"""
|
|
80
|
+
Create a new job for crew execution.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
obj_id: ID of the object to execute
|
|
84
|
+
query: Query or task for the object
|
|
85
|
+
user_id: Optional user identifier
|
|
86
|
+
session_id: Optional session identifier
|
|
87
|
+
execution_mode: Execution mode (sequential, parallel, flow)
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
CrewJob: The created job
|
|
91
|
+
"""
|
|
92
|
+
job_id = job_id or str(uuid.uuid4())
|
|
93
|
+
job = Job(
|
|
94
|
+
job_id=job_id,
|
|
95
|
+
obj_id=obj_id,
|
|
96
|
+
query=query,
|
|
97
|
+
status=JobStatus.PENDING,
|
|
98
|
+
user_id=user_id,
|
|
99
|
+
session_id=session_id,
|
|
100
|
+
execution_mode=execution_mode
|
|
101
|
+
)
|
|
102
|
+
self.jobs[job_id] = job
|
|
103
|
+
self.logger.info(f"Created job {job_id} for object {obj_id}")
|
|
104
|
+
return job
|
|
105
|
+
|
|
106
|
+
async def execute_job(
|
|
107
|
+
self,
|
|
108
|
+
job_id: str,
|
|
109
|
+
execution_func: Callable[[], Awaitable[Any]]
|
|
110
|
+
) -> None:
|
|
111
|
+
"""
|
|
112
|
+
Execute a job asynchronously.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
job_id: ID of the job to execute
|
|
116
|
+
execution_func: Async function that executes the crew
|
|
117
|
+
"""
|
|
118
|
+
job = self.jobs.get(job_id)
|
|
119
|
+
if not job:
|
|
120
|
+
self.logger.error(f"Job {job_id} not found")
|
|
121
|
+
return
|
|
122
|
+
|
|
123
|
+
# Create async task
|
|
124
|
+
task = asyncio.create_task(self._run_job(job_id, execution_func))
|
|
125
|
+
self.tasks[job_id] = task
|
|
126
|
+
self.logger.info(f"Started execution of job {job_id}")
|
|
127
|
+
|
|
128
|
+
async def _run_job(
|
|
129
|
+
self,
|
|
130
|
+
job_id: str,
|
|
131
|
+
execution_func: Callable[[], Awaitable[Any]]
|
|
132
|
+
) -> None:
|
|
133
|
+
"""
|
|
134
|
+
Internal method to run a job.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
job_id: ID of the job
|
|
138
|
+
execution_func: Async function to execute
|
|
139
|
+
"""
|
|
140
|
+
job = self.jobs.get(job_id)
|
|
141
|
+
if not job:
|
|
142
|
+
return
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
# Update status to running
|
|
146
|
+
job.status = JobStatus.RUNNING
|
|
147
|
+
job.started_at = datetime.now(timezone.utc)
|
|
148
|
+
self.logger.info(f"Job {job_id} started execution")
|
|
149
|
+
|
|
150
|
+
# Execute the function
|
|
151
|
+
result = await execution_func()
|
|
152
|
+
|
|
153
|
+
# Update job with result
|
|
154
|
+
job.status = JobStatus.COMPLETED
|
|
155
|
+
job.result = result
|
|
156
|
+
job.completed_at = datetime.now(timezone.utc)
|
|
157
|
+
self.logger.info(
|
|
158
|
+
f"Job {job_id} completed successfully in "
|
|
159
|
+
f"{job.elapsed_time:.2f}s"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
except asyncio.CancelledError:
|
|
163
|
+
job.status = JobStatus.CANCELLED
|
|
164
|
+
job.completed_at = datetime.now(timezone.utc)
|
|
165
|
+
job.error = "Job was cancelled"
|
|
166
|
+
self.logger.warning(f"Job {job_id} was cancelled")
|
|
167
|
+
raise
|
|
168
|
+
|
|
169
|
+
except Exception as e:
|
|
170
|
+
job.status = JobStatus.FAILED
|
|
171
|
+
job.completed_at = datetime.now(timezone.utc)
|
|
172
|
+
job.error = str(e)
|
|
173
|
+
self.logger.error(f"Job {job_id} failed: {e}", exc_info=True)
|
|
174
|
+
|
|
175
|
+
finally:
|
|
176
|
+
# Remove from active tasks
|
|
177
|
+
if job_id in self.tasks:
|
|
178
|
+
del self.tasks[job_id]
|
|
179
|
+
|
|
180
|
+
def get_job(self, job_id: str) -> Optional[Job]:
|
|
181
|
+
"""
|
|
182
|
+
Get a job by ID.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
job_id: Job identifier
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
Job if found, None otherwise
|
|
189
|
+
"""
|
|
190
|
+
print('JOBS > ', self.jobs)
|
|
191
|
+
return self.jobs.get(job_id)
|
|
192
|
+
|
|
193
|
+
def list_jobs(
|
|
194
|
+
self,
|
|
195
|
+
obj_id: Optional[str] = None,
|
|
196
|
+
status: Optional[JobStatus] = None,
|
|
197
|
+
limit: int = 100
|
|
198
|
+
) -> list[Job]:
|
|
199
|
+
"""
|
|
200
|
+
List jobs with optional filtering.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
obj_id: Filter by object ID
|
|
204
|
+
status: Filter by status
|
|
205
|
+
limit: Maximum number of jobs to return
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
List of jobs matching criteria
|
|
209
|
+
"""
|
|
210
|
+
jobs = list(self.jobs.values())
|
|
211
|
+
|
|
212
|
+
# Apply filters
|
|
213
|
+
if obj_id:
|
|
214
|
+
jobs = [j for j in jobs if j.obj_id == obj_id]
|
|
215
|
+
if status:
|
|
216
|
+
jobs = [j for j in jobs if j.status == status]
|
|
217
|
+
|
|
218
|
+
# Sort by creation time (newest first)
|
|
219
|
+
jobs.sort(key=lambda j: j.created_at, reverse=True)
|
|
220
|
+
|
|
221
|
+
return jobs[:limit]
|
|
222
|
+
|
|
223
|
+
def delete_job(self, job_id: str) -> bool:
|
|
224
|
+
"""
|
|
225
|
+
Delete a job.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
job_id: Job identifier
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
True if deleted, False if not found
|
|
232
|
+
"""
|
|
233
|
+
if job_id in self.jobs:
|
|
234
|
+
# Cancel task if running
|
|
235
|
+
if job_id in self.tasks:
|
|
236
|
+
self.tasks[job_id].cancel()
|
|
237
|
+
del self.tasks[job_id]
|
|
238
|
+
|
|
239
|
+
del self.jobs[job_id]
|
|
240
|
+
self.logger.info(f"Deleted job {job_id}")
|
|
241
|
+
return True
|
|
242
|
+
return False
|
|
243
|
+
|
|
244
|
+
async def _cleanup_loop(self):
|
|
245
|
+
"""Background task to clean up old jobs."""
|
|
246
|
+
while self._running:
|
|
247
|
+
try:
|
|
248
|
+
await asyncio.sleep(self.cleanup_interval)
|
|
249
|
+
await self._cleanup_old_jobs()
|
|
250
|
+
except asyncio.CancelledError:
|
|
251
|
+
break
|
|
252
|
+
except Exception as e:
|
|
253
|
+
self.logger.error(f"Error in cleanup loop: {e}", exc_info=True)
|
|
254
|
+
|
|
255
|
+
async def _cleanup_old_jobs(self):
|
|
256
|
+
"""Remove jobs older than TTL."""
|
|
257
|
+
now = datetime.now(timezone.utc)
|
|
258
|
+
ttl_delta = timedelta(seconds=self.job_ttl)
|
|
259
|
+
|
|
260
|
+
jobs_to_delete = []
|
|
261
|
+
jobs_to_delete.extend(
|
|
262
|
+
job_id
|
|
263
|
+
for job_id, job in self.jobs.items()
|
|
264
|
+
if job.completed_at
|
|
265
|
+
and (now - job.completed_at) > ttl_delta
|
|
266
|
+
and job.status
|
|
267
|
+
in [JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.CANCELLED]
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
for job_id in jobs_to_delete:
|
|
271
|
+
self.delete_job(job_id)
|
|
272
|
+
|
|
273
|
+
if jobs_to_delete:
|
|
274
|
+
self.logger.info(f"Cleaned up {len(jobs_to_delete)} old jobs")
|
|
275
|
+
|
|
276
|
+
def get_stats(self) -> Dict[str, Any]:
|
|
277
|
+
"""
|
|
278
|
+
Get statistics about job manager.
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
Dictionary with job statistics
|
|
282
|
+
"""
|
|
283
|
+
total_jobs = len(self.jobs)
|
|
284
|
+
running_jobs = sum(j.status == JobStatus.RUNNING for j in self.jobs.values())
|
|
285
|
+
pending_jobs = sum(j.status == JobStatus.PENDING for j in self.jobs.values())
|
|
286
|
+
completed_jobs = sum(j.status == JobStatus.COMPLETED for j in self.jobs.values())
|
|
287
|
+
failed_jobs = sum(j.status == JobStatus.FAILED for j in self.jobs.values())
|
|
288
|
+
|
|
289
|
+
return {
|
|
290
|
+
'total_jobs': total_jobs,
|
|
291
|
+
'running_jobs': running_jobs,
|
|
292
|
+
'pending_jobs': pending_jobs,
|
|
293
|
+
'completed_jobs': completed_jobs,
|
|
294
|
+
'failed_jobs': failed_jobs,
|
|
295
|
+
'active_tasks': len(self.tasks)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
def enqueue(
|
|
299
|
+
self,
|
|
300
|
+
func: Callable,
|
|
301
|
+
args: tuple = None,
|
|
302
|
+
kwargs: dict = None,
|
|
303
|
+
queue: str = "default",
|
|
304
|
+
timeout: Optional[int] = None,
|
|
305
|
+
result_ttl: Optional[int] = None,
|
|
306
|
+
job_id: Optional[str] = None,
|
|
307
|
+
**extra_kwargs
|
|
308
|
+
) -> Job:
|
|
309
|
+
"""
|
|
310
|
+
Enqueue a function for async execution.
|
|
311
|
+
|
|
312
|
+
This method:
|
|
313
|
+
1. Creates a job in your JobManager
|
|
314
|
+
2. Wraps the function in an async wrapper
|
|
315
|
+
3. Schedules it for execution with asyncio.create_task
|
|
316
|
+
4. Returns an adapted job that looks like an RQ job
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
func: Function to execute
|
|
320
|
+
args: Positional arguments for the function
|
|
321
|
+
kwargs: Keyword arguments for the function
|
|
322
|
+
queue: Queue name (stored in metadata)
|
|
323
|
+
timeout: Execution timeout in seconds
|
|
324
|
+
result_ttl: How long to keep results (not used in asyncio version)
|
|
325
|
+
job_id: Optional job ID (generated if not provided)
|
|
326
|
+
**extra_kwargs: Additional parameters
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
AdaptedJob: Wrapper around your Job that looks like an RQ job
|
|
330
|
+
"""
|
|
331
|
+
args = args or ()
|
|
332
|
+
kwargs = kwargs or {}
|
|
333
|
+
job_id = job_id or str(uuid.uuid4())
|
|
334
|
+
|
|
335
|
+
# Create async wrapper for the function
|
|
336
|
+
async def async_execution_wrapper():
|
|
337
|
+
"""Wrapper to execute the function and handle sync/async."""
|
|
338
|
+
if asyncio.iscoroutinefunction(func):
|
|
339
|
+
return await func(*args, **kwargs)
|
|
340
|
+
else:
|
|
341
|
+
# Run sync function in executor to avoid blocking
|
|
342
|
+
return await self._loop.run_in_executor(
|
|
343
|
+
None,
|
|
344
|
+
lambda: func(*args, **kwargs)
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
# Create job in your JobManager
|
|
348
|
+
job = self.create_job(
|
|
349
|
+
job_id=job_id,
|
|
350
|
+
obj_id=func.__name__,
|
|
351
|
+
query={
|
|
352
|
+
'function': func.__name__,
|
|
353
|
+
'args': str(args),
|
|
354
|
+
'kwargs': str(kwargs)
|
|
355
|
+
},
|
|
356
|
+
execution_mode=queue # Store queue as execution_mode
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
# Add timeout and TTL to metadata
|
|
360
|
+
if job.metadata is None:
|
|
361
|
+
job.metadata = {}
|
|
362
|
+
job.metadata['timeout'] = timeout
|
|
363
|
+
job.metadata['result_ttl'] = result_ttl
|
|
364
|
+
job.metadata['queue'] = queue
|
|
365
|
+
|
|
366
|
+
# Schedule async execution
|
|
367
|
+
# Note: We're not awaiting, just scheduling
|
|
368
|
+
asyncio.create_task(
|
|
369
|
+
self.execute_job(job_id, async_execution_wrapper)
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
return job
|
|
373
|
+
|
|
374
|
+
def fetch_job(self, job_id: str) -> Optional[Job]:
|
|
375
|
+
"""
|
|
376
|
+
Fetch a job by ID.
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
job_id: The job identifier
|
|
380
|
+
|
|
381
|
+
Returns:
|
|
382
|
+
AdaptedJob if found, None otherwise
|
|
383
|
+
"""
|
|
384
|
+
return self.get_job(job_id)
|