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/a2a/discovery.py
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# parrot/a2a/discovery.py
|
|
2
|
+
"""
|
|
3
|
+
Agent Registry for discovering agents in the mesh.
|
|
4
|
+
"""
|
|
5
|
+
from typing import Dict, Optional, List
|
|
6
|
+
import asyncio
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from .models import AgentCard
|
|
10
|
+
from .client import A2AClient
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class RegisteredAgent:
|
|
15
|
+
url: str
|
|
16
|
+
card: AgentCard
|
|
17
|
+
last_seen: datetime = field(default_factory=datetime.utcnow)
|
|
18
|
+
healthy: bool = True
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class AgentRegistry:
|
|
22
|
+
"""
|
|
23
|
+
Simple in-memory agent registry.
|
|
24
|
+
For production, use etcd, Consul, or Redis.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, health_check_interval: float = 30.0):
|
|
28
|
+
self._agents: Dict[str, RegisteredAgent] = {}
|
|
29
|
+
self._health_check_interval = health_check_interval
|
|
30
|
+
self._health_task: Optional[asyncio.Task] = None
|
|
31
|
+
|
|
32
|
+
async def start(self):
|
|
33
|
+
"""Start background health checking."""
|
|
34
|
+
self._health_task = asyncio.create_task(self._health_check_loop())
|
|
35
|
+
|
|
36
|
+
async def stop(self):
|
|
37
|
+
if self._health_task:
|
|
38
|
+
self._health_task.cancel()
|
|
39
|
+
|
|
40
|
+
async def register(self, url: str) -> AgentCard:
|
|
41
|
+
"""Register an agent by URL (fetches its card)."""
|
|
42
|
+
async with A2AClient(url) as client:
|
|
43
|
+
card = await client.discover()
|
|
44
|
+
self._agents[card.name] = RegisteredAgent(url=url, card=card)
|
|
45
|
+
return card
|
|
46
|
+
|
|
47
|
+
def get(self, name: str) -> Optional[RegisteredAgent]:
|
|
48
|
+
"""Get a registered agent by name."""
|
|
49
|
+
return self._agents.get(name)
|
|
50
|
+
|
|
51
|
+
def get_by_skill(self, skill_id: str) -> List[RegisteredAgent]:
|
|
52
|
+
"""Find agents that have a specific skill."""
|
|
53
|
+
results = []
|
|
54
|
+
for agent in self._agents.values():
|
|
55
|
+
if agent.healthy:
|
|
56
|
+
for skill in agent.card.skills:
|
|
57
|
+
if skill.id == skill_id:
|
|
58
|
+
results.append(agent)
|
|
59
|
+
break
|
|
60
|
+
return results
|
|
61
|
+
|
|
62
|
+
def get_by_tag(self, tag: str) -> List[RegisteredAgent]:
|
|
63
|
+
"""Find agents with skills matching a tag."""
|
|
64
|
+
results = []
|
|
65
|
+
for agent in self._agents.values():
|
|
66
|
+
if agent.healthy:
|
|
67
|
+
for skill in agent.card.skills:
|
|
68
|
+
if tag in skill.tags:
|
|
69
|
+
results.append(agent)
|
|
70
|
+
break
|
|
71
|
+
return results
|
|
72
|
+
|
|
73
|
+
async def _health_check_loop(self):
|
|
74
|
+
"""Periodically check agent health."""
|
|
75
|
+
while True:
|
|
76
|
+
await asyncio.sleep(self._health_check_interval)
|
|
77
|
+
|
|
78
|
+
for name, agent in list(self._agents.items()):
|
|
79
|
+
try:
|
|
80
|
+
async with A2AClient(agent.url, timeout=5.0) as client:
|
|
81
|
+
await client.discover()
|
|
82
|
+
agent.healthy = True
|
|
83
|
+
agent.last_seen = datetime.now(timezone.utc)
|
|
84
|
+
except Exception:
|
|
85
|
+
agent.healthy = False
|
|
86
|
+
|
|
87
|
+
def list_healthy(self) -> List[RegisteredAgent]:
|
|
88
|
+
"""Get all healthy agents."""
|
|
89
|
+
return [a for a in self._agents.values() if a.healthy]
|
parrot/a2a/mixin.py
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# parrot/a2a/mixin.py
|
|
2
|
+
"""
|
|
3
|
+
A2A Client Mixin - Add A2A client capabilities to AI-Parrot agents.
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
from typing import Dict, List, Optional, Any, TYPE_CHECKING
|
|
7
|
+
from navconfig.logging import logging
|
|
8
|
+
from .models import TaskState
|
|
9
|
+
from .client import (
|
|
10
|
+
A2AClient,
|
|
11
|
+
A2AAgentConnection,
|
|
12
|
+
A2ARemoteAgentTool,
|
|
13
|
+
A2ARemoteSkillTool
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from ..bots.abstract import AbstractBot
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class A2AClientMixin:
|
|
22
|
+
"""
|
|
23
|
+
Mixin to add A2A client capabilities to any AbstractBot.
|
|
24
|
+
|
|
25
|
+
This allows an agent to communicate with remote A2A agents,
|
|
26
|
+
either directly or by registering them as tools.
|
|
27
|
+
|
|
28
|
+
Example:
|
|
29
|
+
class MyAgent(A2AClientMixin, BasicAgent):
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
agent = MyAgent(name="Orchestrator", llm="openai:gpt-4")
|
|
33
|
+
await agent.configure()
|
|
34
|
+
|
|
35
|
+
# Connect to remote agents
|
|
36
|
+
await agent.add_a2a_agent("https://data-agent:8080")
|
|
37
|
+
await agent.add_a2a_agent("https://search-agent:8081")
|
|
38
|
+
|
|
39
|
+
# Now the agent can use remote agents as tools
|
|
40
|
+
response = await agent.ask("Search for X and analyze the data")
|
|
41
|
+
|
|
42
|
+
# Or call remote agents directly
|
|
43
|
+
result = await agent.ask_remote_agent("data-agent", "What's the total revenue?")
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
_a2a_clients: Dict[str, A2AAgentConnection]
|
|
47
|
+
|
|
48
|
+
def __init__(self, *args, **kwargs):
|
|
49
|
+
super().__init__(*args, **kwargs)
|
|
50
|
+
self._a2a_clients: Dict[str, A2AAgentConnection] = {}
|
|
51
|
+
self._a2a_logger = logging.getLogger(f"A2AClient.{getattr(self, 'name', 'Agent')}")
|
|
52
|
+
|
|
53
|
+
async def add_a2a_agent(
|
|
54
|
+
self,
|
|
55
|
+
url: str,
|
|
56
|
+
*,
|
|
57
|
+
name: Optional[str] = None,
|
|
58
|
+
auth_token: Optional[str] = None,
|
|
59
|
+
api_key: Optional[str] = None,
|
|
60
|
+
headers: Optional[Dict[str, str]] = None,
|
|
61
|
+
register_as_tool: bool = True,
|
|
62
|
+
register_skills_as_tools: bool = False,
|
|
63
|
+
use_streaming: bool = False,
|
|
64
|
+
timeout: float = 60.0,
|
|
65
|
+
) -> A2AAgentConnection:
|
|
66
|
+
"""
|
|
67
|
+
Connect to a remote A2A agent.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
url: Base URL of the remote agent
|
|
71
|
+
name: Optional name override (defaults to agent's name from card)
|
|
72
|
+
auth_token: Bearer token for authentication
|
|
73
|
+
api_key: API key for authentication
|
|
74
|
+
headers: Additional headers
|
|
75
|
+
register_as_tool: If True, register the agent as a callable tool
|
|
76
|
+
register_skills_as_tools: If True, register each skill as a separate tool
|
|
77
|
+
use_streaming: If True, use streaming for tool calls
|
|
78
|
+
timeout: Request timeout
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
A2AAgentConnection with the remote agent info
|
|
82
|
+
"""
|
|
83
|
+
client = A2AClient(
|
|
84
|
+
url,
|
|
85
|
+
auth_token=auth_token,
|
|
86
|
+
api_key=api_key,
|
|
87
|
+
headers=headers,
|
|
88
|
+
timeout=timeout,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
await client.connect()
|
|
92
|
+
|
|
93
|
+
card = client.agent_card
|
|
94
|
+
agent_name = name or card.name.lower().replace(" ", "_")
|
|
95
|
+
|
|
96
|
+
connection = A2AAgentConnection(
|
|
97
|
+
url=url,
|
|
98
|
+
card=card,
|
|
99
|
+
client=client,
|
|
100
|
+
name=agent_name,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
self._a2a_clients[agent_name] = connection
|
|
104
|
+
|
|
105
|
+
# Register as tool(s)
|
|
106
|
+
if register_as_tool:
|
|
107
|
+
tool = A2ARemoteAgentTool(
|
|
108
|
+
client,
|
|
109
|
+
tool_name=f"ask_{agent_name}",
|
|
110
|
+
use_streaming=use_streaming,
|
|
111
|
+
)
|
|
112
|
+
self._register_a2a_tool(tool)
|
|
113
|
+
self._a2a_logger.info(f"Registered remote agent '{agent_name}' as tool: {tool.name}")
|
|
114
|
+
|
|
115
|
+
if register_skills_as_tools:
|
|
116
|
+
for skill in card.skills:
|
|
117
|
+
skill_tool = A2ARemoteSkillTool(client, skill)
|
|
118
|
+
self._register_a2a_tool(skill_tool)
|
|
119
|
+
self._a2a_logger.info(f"Registered remote skill as tool: {skill_tool.name}")
|
|
120
|
+
|
|
121
|
+
self._a2a_logger.info(
|
|
122
|
+
f"Connected to A2A agent '{card.name}' at {url} with {len(card.skills)} skills"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
return connection
|
|
126
|
+
|
|
127
|
+
def _register_a2a_tool(self, tool: Any) -> None:
|
|
128
|
+
"""Register a tool with the agent's tool manager."""
|
|
129
|
+
if hasattr(self, 'tool_manager') and self.tool_manager:
|
|
130
|
+
self.tool_manager.register_tool(tool)
|
|
131
|
+
|
|
132
|
+
# Sync to LLM if method exists
|
|
133
|
+
if hasattr(self, '_sync_tools_to_llm'):
|
|
134
|
+
self._sync_tools_to_llm()
|
|
135
|
+
|
|
136
|
+
async def remove_a2a_agent(self, name: str) -> None:
|
|
137
|
+
"""Disconnect from a remote A2A agent."""
|
|
138
|
+
if name not in self._a2a_clients:
|
|
139
|
+
self._a2a_logger.warning(f"A2A agent '{name}' not found")
|
|
140
|
+
return
|
|
141
|
+
|
|
142
|
+
connection = self._a2a_clients[name]
|
|
143
|
+
|
|
144
|
+
# Remove tools
|
|
145
|
+
if hasattr(self, 'tool_manager') and self.tool_manager:
|
|
146
|
+
tool_name = f"ask_{name}"
|
|
147
|
+
if self.tool_manager.get_tool(tool_name):
|
|
148
|
+
self.tool_manager.unregister_tool(tool_name)
|
|
149
|
+
|
|
150
|
+
# Remove skill tools
|
|
151
|
+
for skill in connection.card.skills:
|
|
152
|
+
skill_tool_name = f"remote_{skill.id}"
|
|
153
|
+
if self.tool_manager.get_tool(skill_tool_name):
|
|
154
|
+
self.tool_manager.unregister_tool(skill_tool_name)
|
|
155
|
+
|
|
156
|
+
await connection.client.disconnect()
|
|
157
|
+
del self._a2a_clients[name]
|
|
158
|
+
|
|
159
|
+
self._a2a_logger.info(f"Disconnected from A2A agent '{name}'")
|
|
160
|
+
|
|
161
|
+
def list_a2a_agents(self) -> List[str]:
|
|
162
|
+
"""List connected A2A agent names."""
|
|
163
|
+
return list(self._a2a_clients.keys())
|
|
164
|
+
|
|
165
|
+
def get_a2a_agent(self, name: str) -> Optional[A2AAgentConnection]:
|
|
166
|
+
"""Get a connected A2A agent by name."""
|
|
167
|
+
return self._a2a_clients.get(name)
|
|
168
|
+
|
|
169
|
+
def get_a2a_client(self, name: str) -> Optional[A2AClient]:
|
|
170
|
+
"""Get the A2A client for a connected agent."""
|
|
171
|
+
conn = self._a2a_clients.get(name)
|
|
172
|
+
return conn.client if conn else None
|
|
173
|
+
|
|
174
|
+
# ─────────────────────────────────────────────────────────────
|
|
175
|
+
# Direct Communication Methods
|
|
176
|
+
# ─────────────────────────────────────────────────────────────
|
|
177
|
+
|
|
178
|
+
async def ask_remote_agent(
|
|
179
|
+
self,
|
|
180
|
+
agent_name: str,
|
|
181
|
+
question: str,
|
|
182
|
+
*,
|
|
183
|
+
context_id: Optional[str] = None,
|
|
184
|
+
stream: bool = False,
|
|
185
|
+
) -> str:
|
|
186
|
+
"""
|
|
187
|
+
Ask a question directly to a remote A2A agent.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
agent_name: Name of the connected agent
|
|
191
|
+
question: The question to ask
|
|
192
|
+
context_id: Optional context for multi-turn
|
|
193
|
+
stream: If True, stream the response
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
The agent's response as text
|
|
197
|
+
"""
|
|
198
|
+
conn = self._a2a_clients.get(agent_name)
|
|
199
|
+
if not conn:
|
|
200
|
+
raise ValueError(f"A2A agent '{agent_name}' not connected")
|
|
201
|
+
|
|
202
|
+
if stream:
|
|
203
|
+
chunks = []
|
|
204
|
+
async for chunk in conn.client.stream_message(question, context_id=context_id):
|
|
205
|
+
chunks.append(chunk)
|
|
206
|
+
return "".join(chunks)
|
|
207
|
+
else:
|
|
208
|
+
task = await conn.client.send_message(question, context_id=context_id)
|
|
209
|
+
|
|
210
|
+
if task.status.state == TaskState.FAILED:
|
|
211
|
+
error = task.status.message.get_text() if task.status.message else "Unknown"
|
|
212
|
+
raise RuntimeError(f"Remote agent error: {error}")
|
|
213
|
+
|
|
214
|
+
if task.artifacts and task.artifacts[0].parts:
|
|
215
|
+
return task.artifacts[0].parts[0].text or ""
|
|
216
|
+
return ""
|
|
217
|
+
|
|
218
|
+
async def invoke_remote_skill(
|
|
219
|
+
self,
|
|
220
|
+
agent_name: str,
|
|
221
|
+
skill_id: str,
|
|
222
|
+
params: Optional[Dict[str, Any]] = None,
|
|
223
|
+
*,
|
|
224
|
+
context_id: Optional[str] = None,
|
|
225
|
+
) -> Any:
|
|
226
|
+
"""
|
|
227
|
+
Invoke a specific skill on a remote agent.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
agent_name: Name of the connected agent
|
|
231
|
+
skill_id: ID of the skill to invoke
|
|
232
|
+
params: Parameters for the skill
|
|
233
|
+
context_id: Optional context
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
The skill result
|
|
237
|
+
"""
|
|
238
|
+
if conn := self._a2a_clients.get(agent_name):
|
|
239
|
+
return await conn.client.invoke_skill(skill_id, params, context_id=context_id)
|
|
240
|
+
|
|
241
|
+
raise ValueError(f"A2A agent '{agent_name}' not connected")
|
|
242
|
+
|
|
243
|
+
# ─────────────────────────────────────────────────────────────
|
|
244
|
+
# Lifecycle
|
|
245
|
+
# ─────────────────────────────────────────────────────────────
|
|
246
|
+
|
|
247
|
+
async def shutdown_a2a(self) -> None:
|
|
248
|
+
"""Disconnect all A2A agents."""
|
|
249
|
+
for name in list(self._a2a_clients.keys()):
|
|
250
|
+
await self.remove_a2a_agent(name)
|
|
251
|
+
|
|
252
|
+
async def shutdown(self, **kwargs) -> None:
|
|
253
|
+
"""Override shutdown to cleanup A2A connections."""
|
|
254
|
+
await self.shutdown_a2a()
|
|
255
|
+
|
|
256
|
+
if hasattr(super(), 'shutdown'):
|
|
257
|
+
await super().shutdown(**kwargs)
|