ai-parrot 0.17.2__cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentui/.prettierrc +15 -0
- agentui/QUICKSTART.md +272 -0
- agentui/README.md +59 -0
- agentui/env.example +16 -0
- agentui/jsconfig.json +14 -0
- agentui/package-lock.json +4242 -0
- agentui/package.json +34 -0
- agentui/scripts/postinstall/apply-patches.mjs +260 -0
- agentui/src/app.css +61 -0
- agentui/src/app.d.ts +13 -0
- agentui/src/app.html +12 -0
- agentui/src/components/LoadingSpinner.svelte +64 -0
- agentui/src/components/ThemeSwitcher.svelte +159 -0
- agentui/src/components/index.js +4 -0
- agentui/src/lib/api/bots.ts +60 -0
- agentui/src/lib/api/chat.ts +22 -0
- agentui/src/lib/api/http.ts +25 -0
- agentui/src/lib/components/BotCard.svelte +33 -0
- agentui/src/lib/components/ChatBubble.svelte +63 -0
- agentui/src/lib/components/Toast.svelte +21 -0
- agentui/src/lib/config.ts +20 -0
- agentui/src/lib/stores/auth.svelte.ts +73 -0
- agentui/src/lib/stores/theme.svelte.js +64 -0
- agentui/src/lib/stores/toast.svelte.ts +31 -0
- agentui/src/lib/utils/conversation.ts +39 -0
- agentui/src/routes/+layout.svelte +20 -0
- agentui/src/routes/+page.svelte +232 -0
- agentui/src/routes/login/+page.svelte +200 -0
- agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
- agentui/src/routes/talk/[agentId]/+page.ts +7 -0
- agentui/static/README.md +1 -0
- agentui/svelte.config.js +11 -0
- agentui/tailwind.config.ts +53 -0
- agentui/tsconfig.json +3 -0
- agentui/vite.config.ts +10 -0
- ai_parrot-0.17.2.dist-info/METADATA +472 -0
- ai_parrot-0.17.2.dist-info/RECORD +535 -0
- ai_parrot-0.17.2.dist-info/WHEEL +6 -0
- ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
- ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
- ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
- crew-builder/.prettierrc +15 -0
- crew-builder/QUICKSTART.md +259 -0
- crew-builder/README.md +113 -0
- crew-builder/env.example +17 -0
- crew-builder/jsconfig.json +14 -0
- crew-builder/package-lock.json +4182 -0
- crew-builder/package.json +37 -0
- crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
- crew-builder/src/app.css +62 -0
- crew-builder/src/app.d.ts +13 -0
- crew-builder/src/app.html +12 -0
- crew-builder/src/components/LoadingSpinner.svelte +64 -0
- crew-builder/src/components/ThemeSwitcher.svelte +149 -0
- crew-builder/src/components/index.js +9 -0
- crew-builder/src/lib/api/bots.ts +60 -0
- crew-builder/src/lib/api/chat.ts +80 -0
- crew-builder/src/lib/api/client.ts +56 -0
- crew-builder/src/lib/api/crew/crew.ts +136 -0
- crew-builder/src/lib/api/index.ts +5 -0
- crew-builder/src/lib/api/o365/auth.ts +65 -0
- crew-builder/src/lib/auth/auth.ts +54 -0
- crew-builder/src/lib/components/AgentNode.svelte +43 -0
- crew-builder/src/lib/components/BotCard.svelte +33 -0
- crew-builder/src/lib/components/ChatBubble.svelte +67 -0
- crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
- crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
- crew-builder/src/lib/components/JsonViewer.svelte +24 -0
- crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
- crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
- crew-builder/src/lib/components/Toast.svelte +67 -0
- crew-builder/src/lib/components/Toolbar.svelte +157 -0
- crew-builder/src/lib/components/index.ts +10 -0
- crew-builder/src/lib/config.ts +8 -0
- crew-builder/src/lib/stores/auth.svelte.ts +228 -0
- crew-builder/src/lib/stores/crewStore.ts +369 -0
- crew-builder/src/lib/stores/theme.svelte.js +145 -0
- crew-builder/src/lib/stores/toast.svelte.ts +69 -0
- crew-builder/src/lib/utils/conversation.ts +39 -0
- crew-builder/src/lib/utils/markdown.ts +122 -0
- crew-builder/src/lib/utils/talkHistory.ts +47 -0
- crew-builder/src/routes/+layout.svelte +20 -0
- crew-builder/src/routes/+page.svelte +539 -0
- crew-builder/src/routes/agents/+page.svelte +247 -0
- crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
- crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
- crew-builder/src/routes/builder/+page.svelte +204 -0
- crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
- crew-builder/src/routes/crew/ask/+page.ts +1 -0
- crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
- crew-builder/src/routes/login/+page.svelte +197 -0
- crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
- crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
- crew-builder/static/README.md +1 -0
- crew-builder/svelte.config.js +11 -0
- crew-builder/tailwind.config.ts +53 -0
- crew-builder/tsconfig.json +3 -0
- crew-builder/vite.config.ts +10 -0
- mcp_servers/calculator_server.py +309 -0
- parrot/__init__.py +27 -0
- parrot/__pycache__/__init__.cpython-310.pyc +0 -0
- parrot/__pycache__/version.cpython-310.pyc +0 -0
- parrot/_version.py +34 -0
- parrot/a2a/__init__.py +48 -0
- parrot/a2a/client.py +658 -0
- parrot/a2a/discovery.py +89 -0
- parrot/a2a/mixin.py +257 -0
- parrot/a2a/models.py +376 -0
- parrot/a2a/server.py +770 -0
- parrot/agents/__init__.py +29 -0
- parrot/bots/__init__.py +12 -0
- parrot/bots/a2a_agent.py +19 -0
- parrot/bots/abstract.py +3139 -0
- parrot/bots/agent.py +1129 -0
- parrot/bots/basic.py +9 -0
- parrot/bots/chatbot.py +669 -0
- parrot/bots/data.py +1618 -0
- parrot/bots/database/__init__.py +5 -0
- parrot/bots/database/abstract.py +3071 -0
- parrot/bots/database/cache.py +286 -0
- parrot/bots/database/models.py +468 -0
- parrot/bots/database/prompts.py +154 -0
- parrot/bots/database/retries.py +98 -0
- parrot/bots/database/router.py +269 -0
- parrot/bots/database/sql.py +41 -0
- parrot/bots/db/__init__.py +6 -0
- parrot/bots/db/abstract.py +556 -0
- parrot/bots/db/bigquery.py +602 -0
- parrot/bots/db/cache.py +85 -0
- parrot/bots/db/documentdb.py +668 -0
- parrot/bots/db/elastic.py +1014 -0
- parrot/bots/db/influx.py +898 -0
- parrot/bots/db/mock.py +96 -0
- parrot/bots/db/multi.py +783 -0
- parrot/bots/db/prompts.py +185 -0
- parrot/bots/db/sql.py +1255 -0
- parrot/bots/db/tools.py +212 -0
- parrot/bots/document.py +680 -0
- parrot/bots/hrbot.py +15 -0
- parrot/bots/kb.py +170 -0
- parrot/bots/mcp.py +36 -0
- parrot/bots/orchestration/README.md +463 -0
- parrot/bots/orchestration/__init__.py +1 -0
- parrot/bots/orchestration/agent.py +155 -0
- parrot/bots/orchestration/crew.py +3330 -0
- parrot/bots/orchestration/fsm.py +1179 -0
- parrot/bots/orchestration/hr.py +434 -0
- parrot/bots/orchestration/storage/__init__.py +4 -0
- parrot/bots/orchestration/storage/memory.py +100 -0
- parrot/bots/orchestration/storage/mixin.py +119 -0
- parrot/bots/orchestration/verify.py +202 -0
- parrot/bots/product.py +204 -0
- parrot/bots/prompts/__init__.py +96 -0
- parrot/bots/prompts/agents.py +155 -0
- parrot/bots/prompts/data.py +216 -0
- parrot/bots/prompts/output_generation.py +8 -0
- parrot/bots/scraper/__init__.py +3 -0
- parrot/bots/scraper/models.py +122 -0
- parrot/bots/scraper/scraper.py +1173 -0
- parrot/bots/scraper/templates.py +115 -0
- parrot/bots/stores/__init__.py +5 -0
- parrot/bots/stores/local.py +172 -0
- parrot/bots/webdev.py +81 -0
- parrot/cli.py +17 -0
- parrot/clients/__init__.py +16 -0
- parrot/clients/base.py +1491 -0
- parrot/clients/claude.py +1191 -0
- parrot/clients/factory.py +129 -0
- parrot/clients/google.py +4567 -0
- parrot/clients/gpt.py +1975 -0
- parrot/clients/grok.py +432 -0
- parrot/clients/groq.py +986 -0
- parrot/clients/hf.py +582 -0
- parrot/clients/models.py +18 -0
- parrot/conf.py +395 -0
- parrot/embeddings/__init__.py +9 -0
- parrot/embeddings/base.py +157 -0
- parrot/embeddings/google.py +98 -0
- parrot/embeddings/huggingface.py +74 -0
- parrot/embeddings/openai.py +84 -0
- parrot/embeddings/processor.py +88 -0
- parrot/exceptions.c +13868 -0
- parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/exceptions.pxd +22 -0
- parrot/exceptions.pxi +15 -0
- parrot/exceptions.pyx +44 -0
- parrot/generators/__init__.py +29 -0
- parrot/generators/base.py +200 -0
- parrot/generators/html.py +293 -0
- parrot/generators/react.py +205 -0
- parrot/generators/streamlit.py +203 -0
- parrot/generators/template.py +105 -0
- parrot/handlers/__init__.py +4 -0
- parrot/handlers/agent.py +861 -0
- parrot/handlers/agents/__init__.py +1 -0
- parrot/handlers/agents/abstract.py +900 -0
- parrot/handlers/bots.py +338 -0
- parrot/handlers/chat.py +915 -0
- parrot/handlers/creation.sql +192 -0
- parrot/handlers/crew/ARCHITECTURE.md +362 -0
- parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
- parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
- parrot/handlers/crew/__init__.py +0 -0
- parrot/handlers/crew/handler.py +801 -0
- parrot/handlers/crew/models.py +229 -0
- parrot/handlers/crew/redis_persistence.py +523 -0
- parrot/handlers/jobs/__init__.py +10 -0
- parrot/handlers/jobs/job.py +384 -0
- parrot/handlers/jobs/mixin.py +627 -0
- parrot/handlers/jobs/models.py +115 -0
- parrot/handlers/jobs/worker.py +31 -0
- parrot/handlers/models.py +596 -0
- parrot/handlers/o365_auth.py +105 -0
- parrot/handlers/stream.py +337 -0
- parrot/interfaces/__init__.py +6 -0
- parrot/interfaces/aws.py +143 -0
- parrot/interfaces/credentials.py +113 -0
- parrot/interfaces/database.py +27 -0
- parrot/interfaces/google.py +1123 -0
- parrot/interfaces/hierarchy.py +1227 -0
- parrot/interfaces/http.py +651 -0
- parrot/interfaces/images/__init__.py +0 -0
- parrot/interfaces/images/plugins/__init__.py +24 -0
- parrot/interfaces/images/plugins/abstract.py +58 -0
- parrot/interfaces/images/plugins/analisys.py +148 -0
- parrot/interfaces/images/plugins/classify.py +150 -0
- parrot/interfaces/images/plugins/classifybase.py +182 -0
- parrot/interfaces/images/plugins/detect.py +150 -0
- parrot/interfaces/images/plugins/exif.py +1103 -0
- parrot/interfaces/images/plugins/hash.py +52 -0
- parrot/interfaces/images/plugins/vision.py +104 -0
- parrot/interfaces/images/plugins/yolo.py +66 -0
- parrot/interfaces/images/plugins/zerodetect.py +197 -0
- parrot/interfaces/o365.py +978 -0
- parrot/interfaces/onedrive.py +822 -0
- parrot/interfaces/sharepoint.py +1435 -0
- parrot/interfaces/soap.py +257 -0
- parrot/loaders/__init__.py +8 -0
- parrot/loaders/abstract.py +1131 -0
- parrot/loaders/audio.py +199 -0
- parrot/loaders/basepdf.py +53 -0
- parrot/loaders/basevideo.py +1568 -0
- parrot/loaders/csv.py +409 -0
- parrot/loaders/docx.py +116 -0
- parrot/loaders/epubloader.py +316 -0
- parrot/loaders/excel.py +199 -0
- parrot/loaders/factory.py +55 -0
- parrot/loaders/files/__init__.py +0 -0
- parrot/loaders/files/abstract.py +39 -0
- parrot/loaders/files/html.py +26 -0
- parrot/loaders/files/text.py +63 -0
- parrot/loaders/html.py +152 -0
- parrot/loaders/markdown.py +442 -0
- parrot/loaders/pdf.py +373 -0
- parrot/loaders/pdfmark.py +320 -0
- parrot/loaders/pdftables.py +506 -0
- parrot/loaders/ppt.py +476 -0
- parrot/loaders/qa.py +63 -0
- parrot/loaders/splitters/__init__.py +10 -0
- parrot/loaders/splitters/base.py +138 -0
- parrot/loaders/splitters/md.py +228 -0
- parrot/loaders/splitters/token.py +143 -0
- parrot/loaders/txt.py +26 -0
- parrot/loaders/video.py +89 -0
- parrot/loaders/videolocal.py +218 -0
- parrot/loaders/videounderstanding.py +377 -0
- parrot/loaders/vimeo.py +167 -0
- parrot/loaders/web.py +599 -0
- parrot/loaders/youtube.py +504 -0
- parrot/manager/__init__.py +5 -0
- parrot/manager/manager.py +1030 -0
- parrot/mcp/__init__.py +28 -0
- parrot/mcp/adapter.py +105 -0
- parrot/mcp/cli.py +174 -0
- parrot/mcp/client.py +119 -0
- parrot/mcp/config.py +75 -0
- parrot/mcp/integration.py +842 -0
- parrot/mcp/oauth.py +933 -0
- parrot/mcp/server.py +225 -0
- parrot/mcp/transports/__init__.py +3 -0
- parrot/mcp/transports/base.py +279 -0
- parrot/mcp/transports/grpc_session.py +163 -0
- parrot/mcp/transports/http.py +312 -0
- parrot/mcp/transports/mcp.proto +108 -0
- parrot/mcp/transports/quic.py +1082 -0
- parrot/mcp/transports/sse.py +330 -0
- parrot/mcp/transports/stdio.py +309 -0
- parrot/mcp/transports/unix.py +395 -0
- parrot/mcp/transports/websocket.py +547 -0
- parrot/memory/__init__.py +16 -0
- parrot/memory/abstract.py +209 -0
- parrot/memory/agent.py +32 -0
- parrot/memory/cache.py +175 -0
- parrot/memory/core.py +555 -0
- parrot/memory/file.py +153 -0
- parrot/memory/mem.py +131 -0
- parrot/memory/redis.py +613 -0
- parrot/models/__init__.py +46 -0
- parrot/models/basic.py +118 -0
- parrot/models/compliance.py +208 -0
- parrot/models/crew.py +395 -0
- parrot/models/detections.py +654 -0
- parrot/models/generation.py +85 -0
- parrot/models/google.py +223 -0
- parrot/models/groq.py +23 -0
- parrot/models/openai.py +30 -0
- parrot/models/outputs.py +285 -0
- parrot/models/responses.py +938 -0
- parrot/notifications/__init__.py +743 -0
- parrot/openapi/__init__.py +3 -0
- parrot/openapi/components.yaml +641 -0
- parrot/openapi/config.py +322 -0
- parrot/outputs/__init__.py +32 -0
- parrot/outputs/formats/__init__.py +108 -0
- parrot/outputs/formats/altair.py +359 -0
- parrot/outputs/formats/application.py +122 -0
- parrot/outputs/formats/base.py +351 -0
- parrot/outputs/formats/bokeh.py +356 -0
- parrot/outputs/formats/card.py +424 -0
- parrot/outputs/formats/chart.py +436 -0
- parrot/outputs/formats/d3.py +255 -0
- parrot/outputs/formats/echarts.py +310 -0
- parrot/outputs/formats/generators/__init__.py +0 -0
- parrot/outputs/formats/generators/abstract.py +61 -0
- parrot/outputs/formats/generators/panel.py +145 -0
- parrot/outputs/formats/generators/streamlit.py +86 -0
- parrot/outputs/formats/generators/terminal.py +63 -0
- parrot/outputs/formats/holoviews.py +310 -0
- parrot/outputs/formats/html.py +147 -0
- parrot/outputs/formats/jinja2.py +46 -0
- parrot/outputs/formats/json.py +87 -0
- parrot/outputs/formats/map.py +933 -0
- parrot/outputs/formats/markdown.py +172 -0
- parrot/outputs/formats/matplotlib.py +237 -0
- parrot/outputs/formats/mixins/__init__.py +0 -0
- parrot/outputs/formats/mixins/emaps.py +855 -0
- parrot/outputs/formats/plotly.py +341 -0
- parrot/outputs/formats/seaborn.py +310 -0
- parrot/outputs/formats/table.py +397 -0
- parrot/outputs/formats/template_report.py +138 -0
- parrot/outputs/formats/yaml.py +125 -0
- parrot/outputs/formatter.py +152 -0
- parrot/outputs/templates/__init__.py +95 -0
- parrot/pipelines/__init__.py +0 -0
- parrot/pipelines/abstract.py +210 -0
- parrot/pipelines/detector.py +124 -0
- parrot/pipelines/models.py +90 -0
- parrot/pipelines/planogram.py +3002 -0
- parrot/pipelines/table.sql +97 -0
- parrot/plugins/__init__.py +106 -0
- parrot/plugins/importer.py +80 -0
- parrot/py.typed +0 -0
- parrot/registry/__init__.py +18 -0
- parrot/registry/registry.py +594 -0
- parrot/scheduler/__init__.py +1189 -0
- parrot/scheduler/models.py +60 -0
- parrot/security/__init__.py +16 -0
- parrot/security/prompt_injection.py +268 -0
- parrot/security/security_events.sql +25 -0
- parrot/services/__init__.py +1 -0
- parrot/services/mcp/__init__.py +8 -0
- parrot/services/mcp/config.py +13 -0
- parrot/services/mcp/server.py +295 -0
- parrot/services/o365_remote_auth.py +235 -0
- parrot/stores/__init__.py +7 -0
- parrot/stores/abstract.py +352 -0
- parrot/stores/arango.py +1090 -0
- parrot/stores/bigquery.py +1377 -0
- parrot/stores/cache.py +106 -0
- parrot/stores/empty.py +10 -0
- parrot/stores/faiss_store.py +1157 -0
- parrot/stores/kb/__init__.py +9 -0
- parrot/stores/kb/abstract.py +68 -0
- parrot/stores/kb/cache.py +165 -0
- parrot/stores/kb/doc.py +325 -0
- parrot/stores/kb/hierarchy.py +346 -0
- parrot/stores/kb/local.py +457 -0
- parrot/stores/kb/prompt.py +28 -0
- parrot/stores/kb/redis.py +659 -0
- parrot/stores/kb/store.py +115 -0
- parrot/stores/kb/user.py +374 -0
- parrot/stores/models.py +59 -0
- parrot/stores/pgvector.py +3 -0
- parrot/stores/postgres.py +2853 -0
- parrot/stores/utils/__init__.py +0 -0
- parrot/stores/utils/chunking.py +197 -0
- parrot/telemetry/__init__.py +3 -0
- parrot/telemetry/mixin.py +111 -0
- parrot/template/__init__.py +3 -0
- parrot/template/engine.py +259 -0
- parrot/tools/__init__.py +23 -0
- parrot/tools/abstract.py +644 -0
- parrot/tools/agent.py +363 -0
- parrot/tools/arangodbsearch.py +537 -0
- parrot/tools/arxiv_tool.py +188 -0
- parrot/tools/calculator/__init__.py +3 -0
- parrot/tools/calculator/operations/__init__.py +38 -0
- parrot/tools/calculator/operations/calculus.py +80 -0
- parrot/tools/calculator/operations/statistics.py +76 -0
- parrot/tools/calculator/tool.py +150 -0
- parrot/tools/cloudwatch.py +988 -0
- parrot/tools/codeinterpreter/__init__.py +127 -0
- parrot/tools/codeinterpreter/executor.py +371 -0
- parrot/tools/codeinterpreter/internals.py +473 -0
- parrot/tools/codeinterpreter/models.py +643 -0
- parrot/tools/codeinterpreter/prompts.py +224 -0
- parrot/tools/codeinterpreter/tool.py +664 -0
- parrot/tools/company_info/__init__.py +6 -0
- parrot/tools/company_info/tool.py +1138 -0
- parrot/tools/correlationanalysis.py +437 -0
- parrot/tools/database/abstract.py +286 -0
- parrot/tools/database/bq.py +115 -0
- parrot/tools/database/cache.py +284 -0
- parrot/tools/database/models.py +95 -0
- parrot/tools/database/pg.py +343 -0
- parrot/tools/databasequery.py +1159 -0
- parrot/tools/db.py +1800 -0
- parrot/tools/ddgo.py +370 -0
- parrot/tools/decorators.py +271 -0
- parrot/tools/dftohtml.py +282 -0
- parrot/tools/document.py +549 -0
- parrot/tools/ecs.py +819 -0
- parrot/tools/edareport.py +368 -0
- parrot/tools/elasticsearch.py +1049 -0
- parrot/tools/employees.py +462 -0
- parrot/tools/epson/__init__.py +96 -0
- parrot/tools/excel.py +683 -0
- parrot/tools/file/__init__.py +13 -0
- parrot/tools/file/abstract.py +76 -0
- parrot/tools/file/gcs.py +378 -0
- parrot/tools/file/local.py +284 -0
- parrot/tools/file/s3.py +511 -0
- parrot/tools/file/tmp.py +309 -0
- parrot/tools/file/tool.py +501 -0
- parrot/tools/file_reader.py +129 -0
- parrot/tools/flowtask/__init__.py +19 -0
- parrot/tools/flowtask/tool.py +761 -0
- parrot/tools/gittoolkit.py +508 -0
- parrot/tools/google/__init__.py +18 -0
- parrot/tools/google/base.py +169 -0
- parrot/tools/google/tools.py +1251 -0
- parrot/tools/googlelocation.py +5 -0
- parrot/tools/googleroutes.py +5 -0
- parrot/tools/googlesearch.py +5 -0
- parrot/tools/googlesitesearch.py +5 -0
- parrot/tools/googlevoice.py +2 -0
- parrot/tools/gvoice.py +695 -0
- parrot/tools/ibisworld/README.md +225 -0
- parrot/tools/ibisworld/__init__.py +11 -0
- parrot/tools/ibisworld/tool.py +366 -0
- parrot/tools/jiratoolkit.py +1718 -0
- parrot/tools/manager.py +1098 -0
- parrot/tools/math.py +152 -0
- parrot/tools/metadata.py +476 -0
- parrot/tools/msteams.py +1621 -0
- parrot/tools/msword.py +635 -0
- parrot/tools/multidb.py +580 -0
- parrot/tools/multistoresearch.py +369 -0
- parrot/tools/networkninja.py +167 -0
- parrot/tools/nextstop/__init__.py +4 -0
- parrot/tools/nextstop/base.py +286 -0
- parrot/tools/nextstop/employee.py +733 -0
- parrot/tools/nextstop/store.py +462 -0
- parrot/tools/notification.py +435 -0
- parrot/tools/o365/__init__.py +42 -0
- parrot/tools/o365/base.py +295 -0
- parrot/tools/o365/bundle.py +522 -0
- parrot/tools/o365/events.py +554 -0
- parrot/tools/o365/mail.py +992 -0
- parrot/tools/o365/onedrive.py +497 -0
- parrot/tools/o365/sharepoint.py +641 -0
- parrot/tools/openapi_toolkit.py +904 -0
- parrot/tools/openweather.py +527 -0
- parrot/tools/pdfprint.py +1001 -0
- parrot/tools/powerbi.py +518 -0
- parrot/tools/powerpoint.py +1113 -0
- parrot/tools/pricestool.py +146 -0
- parrot/tools/products/__init__.py +246 -0
- parrot/tools/prophet_tool.py +171 -0
- parrot/tools/pythonpandas.py +630 -0
- parrot/tools/pythonrepl.py +910 -0
- parrot/tools/qsource.py +436 -0
- parrot/tools/querytoolkit.py +395 -0
- parrot/tools/quickeda.py +827 -0
- parrot/tools/resttool.py +553 -0
- parrot/tools/retail/__init__.py +0 -0
- parrot/tools/retail/bby.py +528 -0
- parrot/tools/sandboxtool.py +703 -0
- parrot/tools/sassie/__init__.py +352 -0
- parrot/tools/scraping/__init__.py +7 -0
- parrot/tools/scraping/docs/select.md +466 -0
- parrot/tools/scraping/documentation.md +1278 -0
- parrot/tools/scraping/driver.py +436 -0
- parrot/tools/scraping/models.py +576 -0
- parrot/tools/scraping/options.py +85 -0
- parrot/tools/scraping/orchestrator.py +517 -0
- parrot/tools/scraping/readme.md +740 -0
- parrot/tools/scraping/tool.py +3115 -0
- parrot/tools/seasonaldetection.py +642 -0
- parrot/tools/shell_tool/__init__.py +5 -0
- parrot/tools/shell_tool/actions.py +408 -0
- parrot/tools/shell_tool/engine.py +155 -0
- parrot/tools/shell_tool/models.py +322 -0
- parrot/tools/shell_tool/tool.py +442 -0
- parrot/tools/site_search.py +214 -0
- parrot/tools/textfile.py +418 -0
- parrot/tools/think.py +378 -0
- parrot/tools/toolkit.py +298 -0
- parrot/tools/webapp_tool.py +187 -0
- parrot/tools/whatif.py +1279 -0
- parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
- parrot/tools/workday/__init__.py +6 -0
- parrot/tools/workday/models.py +1389 -0
- parrot/tools/workday/tool.py +1293 -0
- parrot/tools/yfinance_tool.py +306 -0
- parrot/tools/zipcode.py +217 -0
- parrot/utils/__init__.py +2 -0
- parrot/utils/helpers.py +73 -0
- parrot/utils/parsers/__init__.py +5 -0
- parrot/utils/parsers/toml.c +12078 -0
- parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/parsers/toml.pyx +21 -0
- parrot/utils/toml.py +11 -0
- parrot/utils/types.cpp +20936 -0
- parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/types.pyx +213 -0
- parrot/utils/uv.py +11 -0
- parrot/version.py +10 -0
- parrot/yaml-rs/Cargo.lock +350 -0
- parrot/yaml-rs/Cargo.toml +19 -0
- parrot/yaml-rs/pyproject.toml +19 -0
- parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
- parrot/yaml-rs/src/lib.rs +222 -0
- requirements/docker-compose.yml +24 -0
- requirements/requirements-dev.txt +21 -0
parrot/tools/agent.py
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Complete Fixed AgentTool with Correct Schema Structure
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any, Optional, Literal, Callable
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from datetime import datetime, timezone
|
|
7
|
+
import time
|
|
8
|
+
import json
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
from .abstract import AbstractTool
|
|
11
|
+
from ..models.crew import AgentResult
|
|
12
|
+
from ..bots.abstract import AbstractBot, OutputMode
|
|
13
|
+
from ..models.responses import AIMessage, AgentResponse
|
|
14
|
+
from ..memory import ConversationTurn
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class AgentContext:
|
|
19
|
+
"""Context passed between agents in orchestration."""
|
|
20
|
+
user_id: str
|
|
21
|
+
session_id: str
|
|
22
|
+
original_query: str
|
|
23
|
+
conversation_history: List[ConversationTurn] = field(default_factory=list)
|
|
24
|
+
shared_data: Dict[str, Any] = field(default_factory=dict)
|
|
25
|
+
agent_results: Dict[str, Any] = field(default_factory=dict)
|
|
26
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class QuestionInput(BaseModel):
|
|
30
|
+
"""Input schema for AgentTool - defines the question parameter."""
|
|
31
|
+
question: str = Field(
|
|
32
|
+
...,
|
|
33
|
+
description="The question or task to ask the agent"
|
|
34
|
+
)
|
|
35
|
+
mode: Optional[Literal["replace", "append"]] = Field(
|
|
36
|
+
default="replace",
|
|
37
|
+
description="How to handle results: 'replace' overwrites previous results, 'append' concatenates"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class AgentTool(AbstractTool):
|
|
42
|
+
"""
|
|
43
|
+
Wraps any BasicAgent/AbstractBot as a tool for use by other agents.
|
|
44
|
+
|
|
45
|
+
- Schema includes "parameters" key for Google GenAI compatibility
|
|
46
|
+
- Uses Pydantic args_schema for validation
|
|
47
|
+
- Accepts all args as **kwargs in _execute()
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
# Use Pydantic schema for validation
|
|
51
|
+
args_schema = QuestionInput
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
agent: AbstractBot,
|
|
56
|
+
tool_name: str = None,
|
|
57
|
+
tool_description: str = None,
|
|
58
|
+
use_conversation_method: bool = True,
|
|
59
|
+
context_filter: Optional[Callable[[AgentContext], AgentContext]] = None,
|
|
60
|
+
execution_memory: Optional[Any] = None,
|
|
61
|
+
):
|
|
62
|
+
|
|
63
|
+
self.agent = agent
|
|
64
|
+
self.name = tool_name or f"{agent.name.lower().replace(' ', '_')}"
|
|
65
|
+
|
|
66
|
+
# Build description
|
|
67
|
+
if tool_description:
|
|
68
|
+
self.description = tool_description or getattr(agent, 'description', f"Execute {agent.name} agent")
|
|
69
|
+
else:
|
|
70
|
+
# Auto-generate from agent properties
|
|
71
|
+
desc_parts = []
|
|
72
|
+
if hasattr(agent, 'role') and agent.role:
|
|
73
|
+
desc_parts.append(f"Role: {agent.role}")
|
|
74
|
+
if hasattr(agent, 'goal') and agent.goal:
|
|
75
|
+
desc_parts.append(f"Goal: {agent.goal}")
|
|
76
|
+
if hasattr(agent, 'capabilities') and agent.capabilities:
|
|
77
|
+
desc_parts.append(f"Capabilities: {agent.capabilities}")
|
|
78
|
+
|
|
79
|
+
if desc_parts:
|
|
80
|
+
self.description = f"Agent: {agent.name}. " + ". ".join(desc_parts)
|
|
81
|
+
else:
|
|
82
|
+
self.description = f"Consult {agent.name} for specialized assistance"
|
|
83
|
+
|
|
84
|
+
self.use_conversation_method = use_conversation_method
|
|
85
|
+
self.context_filter = context_filter
|
|
86
|
+
self.execution_memory = execution_memory
|
|
87
|
+
|
|
88
|
+
# Track usage
|
|
89
|
+
self.call_count = 0
|
|
90
|
+
self.last_response = None
|
|
91
|
+
|
|
92
|
+
super().__init__(
|
|
93
|
+
name=self.name,
|
|
94
|
+
description=self.description,
|
|
95
|
+
args_schema=QuestionInput # Uses the modified schema
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# Build schema in the correct format for Google GenAI
|
|
99
|
+
# CRITICAL: Must have "parameters" key at top level
|
|
100
|
+
self._schema = {
|
|
101
|
+
"name": self.name,
|
|
102
|
+
"description": self.description,
|
|
103
|
+
"parameters": { # ← Google GenAI extracts this key
|
|
104
|
+
"type": "object",
|
|
105
|
+
"properties": {
|
|
106
|
+
"question": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"description": f"The question or task to ask {agent.name}"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"required": ["question"],
|
|
112
|
+
"additionalProperties": False
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
def get_tool_schema(self) -> Dict[str, Any]:
|
|
117
|
+
"""
|
|
118
|
+
Return the tool schema in the format expected by Google GenAI.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Schema with structure:
|
|
122
|
+
{
|
|
123
|
+
"name": "tool_name",
|
|
124
|
+
"description": "...",
|
|
125
|
+
"parameters": { # ← Google GenAI looks for this
|
|
126
|
+
"type": "object",
|
|
127
|
+
"properties": {...},
|
|
128
|
+
"required": [...]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
"""
|
|
132
|
+
return self._schema
|
|
133
|
+
|
|
134
|
+
async def _execute(self, **kwargs) -> str:
|
|
135
|
+
"""
|
|
136
|
+
Execute the wrapped agent using the appropriate method.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
**kwargs: Must include 'question' key with the question to ask.
|
|
140
|
+
AbstractTool validates this using args_schema.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
Agent's response as a string
|
|
144
|
+
"""
|
|
145
|
+
self.call_count += 1
|
|
146
|
+
|
|
147
|
+
# Extract question from kwargs (validated by args_schema)
|
|
148
|
+
question = kwargs.pop('question', '')
|
|
149
|
+
mode = kwargs.pop('mode', 'replace')
|
|
150
|
+
context = None
|
|
151
|
+
|
|
152
|
+
if not question:
|
|
153
|
+
return "Error: No question provided to agent tool"
|
|
154
|
+
|
|
155
|
+
# Get context from execution memory if available
|
|
156
|
+
if self.execution_memory:
|
|
157
|
+
context = self.execution_memory.get_context_for_agent(self.agent.name)
|
|
158
|
+
# Create a text description of the context for the prompt
|
|
159
|
+
context_description = self._describe_context(context)
|
|
160
|
+
# Combine context with question
|
|
161
|
+
question = f"{context_description}\n\nAdditional request: {question}"
|
|
162
|
+
|
|
163
|
+
try:
|
|
164
|
+
# Auto-construct context from kwargs
|
|
165
|
+
user_id = kwargs.pop('user_id', 'orchestrator')
|
|
166
|
+
session_id = kwargs.pop('session_id', f'tool_call_{self.call_count}')
|
|
167
|
+
start_time = time.time()
|
|
168
|
+
|
|
169
|
+
# Create AgentContext
|
|
170
|
+
agent_context = AgentContext(
|
|
171
|
+
user_id=user_id,
|
|
172
|
+
session_id=session_id,
|
|
173
|
+
original_query=question,
|
|
174
|
+
shared_data={
|
|
175
|
+
**kwargs,
|
|
176
|
+
'execution_memory': self.execution_memory,
|
|
177
|
+
'previous_result': context
|
|
178
|
+
},
|
|
179
|
+
agent_results={}
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Apply context filter if provided
|
|
183
|
+
if self.context_filter:
|
|
184
|
+
agent_context = self.context_filter(agent_context)
|
|
185
|
+
|
|
186
|
+
# Inject structured data into PythonREPL if agent has it
|
|
187
|
+
await self._inject_context_to_repl(context)
|
|
188
|
+
|
|
189
|
+
# Choose method based on configuration and availability
|
|
190
|
+
if self.use_conversation_method and hasattr(self.agent, 'conversation'):
|
|
191
|
+
response = await self.agent.conversation(
|
|
192
|
+
question=question,
|
|
193
|
+
session_id=agent_context.session_id,
|
|
194
|
+
user_id=agent_context.user_id,
|
|
195
|
+
use_conversation_history=False, # Keep tool calls stateless
|
|
196
|
+
**agent_context.shared_data
|
|
197
|
+
)
|
|
198
|
+
elif hasattr(self.agent, 'ask'):
|
|
199
|
+
response = await self.agent.ask(
|
|
200
|
+
question=question,
|
|
201
|
+
session_id=agent_context.session_id,
|
|
202
|
+
user_id=agent_context.user_id,
|
|
203
|
+
use_conversation_history=True,
|
|
204
|
+
output_mode=OutputMode.DEFAULT,
|
|
205
|
+
**agent_context.shared_data
|
|
206
|
+
)
|
|
207
|
+
elif hasattr(self.agent, 'invoke'):
|
|
208
|
+
response = await self.agent.invoke(
|
|
209
|
+
question=question,
|
|
210
|
+
session_id=agent_context.session_id,
|
|
211
|
+
user_id=agent_context.user_id,
|
|
212
|
+
use_conversation_history=False,
|
|
213
|
+
**agent_context.shared_data
|
|
214
|
+
)
|
|
215
|
+
else:
|
|
216
|
+
return f"Agent {self.agent.name} does not support *ask* methods"
|
|
217
|
+
|
|
218
|
+
execution_time = time.time() - start_time
|
|
219
|
+
|
|
220
|
+
# Extract content from response
|
|
221
|
+
if isinstance(response, (AIMessage, AgentResponse)) or hasattr(
|
|
222
|
+
response, 'content'
|
|
223
|
+
):
|
|
224
|
+
result = response.content
|
|
225
|
+
elif hasattr(response, 'output'):
|
|
226
|
+
result = response.output
|
|
227
|
+
else:
|
|
228
|
+
result = str(response)
|
|
229
|
+
|
|
230
|
+
self.last_response = result
|
|
231
|
+
|
|
232
|
+
if self.execution_memory:
|
|
233
|
+
agent_result = AgentResult(
|
|
234
|
+
agent_id=self.agent.name,
|
|
235
|
+
agent_name=self.agent.name,
|
|
236
|
+
task=question,
|
|
237
|
+
result=result,
|
|
238
|
+
metadata={
|
|
239
|
+
"user_id": user_id,
|
|
240
|
+
"session_id": session_id,
|
|
241
|
+
"call_count": self.call_count,
|
|
242
|
+
"result_type": type(result).__name__
|
|
243
|
+
},
|
|
244
|
+
execution_time=execution_time
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
# Handle mode: replace or append
|
|
248
|
+
if mode == "append" and self.agent.name in self.execution_memory.results:
|
|
249
|
+
existing = self.execution_memory.results[self.agent.name]
|
|
250
|
+
existing.result += f"\n\n{result}"
|
|
251
|
+
existing.timestamp = datetime.now(tz=timezone.utc)
|
|
252
|
+
# Re-vectorize with updated content
|
|
253
|
+
self.execution_memory.add_result(existing, vectorize=True)
|
|
254
|
+
else:
|
|
255
|
+
self.execution_memory.add_result(agent_result, vectorize=True)
|
|
256
|
+
|
|
257
|
+
return result
|
|
258
|
+
|
|
259
|
+
except Exception as e:
|
|
260
|
+
error_msg = f"Error executing {self.name}: {str(e)}"
|
|
261
|
+
self.logger.error(error_msg)
|
|
262
|
+
return error_msg
|
|
263
|
+
|
|
264
|
+
def get_usage_stats(self) -> Dict[str, Any]:
|
|
265
|
+
"""Get usage statistics for this agent tool."""
|
|
266
|
+
return {
|
|
267
|
+
'name': self.name,
|
|
268
|
+
'agent_name': self.agent.name,
|
|
269
|
+
'call_count': self.call_count,
|
|
270
|
+
'last_response_length': len(self.last_response) if self.last_response else 0
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
def _describe_context(self, context: Any) -> str:
|
|
274
|
+
"""Create a textual description of structured context for the prompt"""
|
|
275
|
+
import pandas as pd
|
|
276
|
+
|
|
277
|
+
if context is None:
|
|
278
|
+
return "No previous context available."
|
|
279
|
+
|
|
280
|
+
if isinstance(context, str):
|
|
281
|
+
return f"Previous context:\n{context}"
|
|
282
|
+
|
|
283
|
+
if isinstance(context, pd.DataFrame):
|
|
284
|
+
return f"""Previous agent returned a DataFrame:
|
|
285
|
+
- Shape: {context.shape[0]} rows × {context.shape[1]} columns
|
|
286
|
+
- Columns: {', '.join(context.columns)}
|
|
287
|
+
- Data types: {', '.join(f"{col}: {dtype}" for col, dtype in context.dtypes.items())}
|
|
288
|
+
- Available as variable 'previous_result' for processing
|
|
289
|
+
|
|
290
|
+
Sample data (first 5 rows):
|
|
291
|
+
{context.head(5).to_string()}
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
if isinstance(context, dict):
|
|
295
|
+
keys = list(context.keys())[:10]
|
|
296
|
+
return f"""Previous agent returned a dictionary:
|
|
297
|
+
- Keys ({len(context)} total): {', '.join(keys)}{'...' if len(context) > 10 else ''}
|
|
298
|
+
- Available as variable 'previous_result' for processing
|
|
299
|
+
|
|
300
|
+
Sample content:
|
|
301
|
+
{json.dumps({k: context[k] for k in keys}, indent=2, default=str)}
|
|
302
|
+
"""
|
|
303
|
+
|
|
304
|
+
if isinstance(context, list):
|
|
305
|
+
return f"""Previous agent returned a list:
|
|
306
|
+
- Length: {len(context)} items
|
|
307
|
+
- Type of items: {type(context[0]).__name__ if context else 'empty'}
|
|
308
|
+
- Available as variable 'previous_result' for processing
|
|
309
|
+
|
|
310
|
+
First few items:
|
|
311
|
+
{context[:5]}
|
|
312
|
+
"""
|
|
313
|
+
|
|
314
|
+
# Fallback
|
|
315
|
+
return f"""Previous agent returned: {type(context).__name__}
|
|
316
|
+
Available as variable 'previous_result' for processing
|
|
317
|
+
Preview: {str(context)[:500]}
|
|
318
|
+
"""
|
|
319
|
+
|
|
320
|
+
async def _inject_context_to_repl(self, context: Any):
|
|
321
|
+
"""Inject structured context into agent's PythonREPL if available"""
|
|
322
|
+
if context is None:
|
|
323
|
+
return
|
|
324
|
+
|
|
325
|
+
# Check if agent has PythonREPL tool
|
|
326
|
+
python_repl = None
|
|
327
|
+
if hasattr(self.agent, 'tool_manager'):
|
|
328
|
+
python_repl = self.agent.tool_manager.get_tool('python_repl')
|
|
329
|
+
|
|
330
|
+
if python_repl and hasattr(python_repl, 'globals'):
|
|
331
|
+
# Inject the structured data as a global variable
|
|
332
|
+
python_repl.globals['previous_result'] = context
|
|
333
|
+
|
|
334
|
+
# Also inject all results from execution memory with agent names
|
|
335
|
+
if self.execution_memory:
|
|
336
|
+
for agent_id, agent_result in self.execution_memory.results.items():
|
|
337
|
+
safe_name = agent_id.replace('-', '_').replace(' ', '_')
|
|
338
|
+
python_repl.globals[f'{safe_name}_result'] = agent_result.result
|
|
339
|
+
|
|
340
|
+
def _append_results(self, existing: Any, new: Any) -> Any:
|
|
341
|
+
"""Intelligently append results based on their types"""
|
|
342
|
+
import pandas as pd
|
|
343
|
+
|
|
344
|
+
# Both are strings
|
|
345
|
+
if isinstance(existing, str) and isinstance(new, str):
|
|
346
|
+
return f"{existing}\n\n{new}"
|
|
347
|
+
|
|
348
|
+
# Both are DataFrames
|
|
349
|
+
if isinstance(existing, pd.DataFrame) and isinstance(new, pd.DataFrame):
|
|
350
|
+
return pd.concat([existing, new], ignore_index=True)
|
|
351
|
+
|
|
352
|
+
# Both are dicts
|
|
353
|
+
if isinstance(existing, dict) and isinstance(new, dict):
|
|
354
|
+
return {**existing, **new}
|
|
355
|
+
|
|
356
|
+
# Both are lists
|
|
357
|
+
if isinstance(existing, list) and isinstance(new, list):
|
|
358
|
+
return existing + new
|
|
359
|
+
|
|
360
|
+
# Mixed types - convert to list
|
|
361
|
+
if not isinstance(existing, list):
|
|
362
|
+
existing = [existing]
|
|
363
|
+
return existing + [new]
|