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/bots/kb.py
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Any, Dict, List, Tuple
|
|
3
|
+
import json
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from ..stores.kb.abstract import AbstractKnowledgeBase
|
|
8
|
+
# from ..stores.kb.prompt import SELECTION_PROMPT
|
|
9
|
+
from ..clients.base import AbstractClient
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class KBSelected(BaseModel):
|
|
13
|
+
"""Model for a selected KB."""
|
|
14
|
+
name: str = Field(..., description="Name of the selected KB")
|
|
15
|
+
reason: str = Field(..., description="Reason for selection")
|
|
16
|
+
confidence: float = Field(..., description="Confidence score for selection")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class KBOutput(BaseModel):
|
|
20
|
+
"""Structured output model for KB selection."""
|
|
21
|
+
selected_kbs: List[KBSelected] = Field(
|
|
22
|
+
..., description="List of selected KBs with name, reason, and confidence"
|
|
23
|
+
)
|
|
24
|
+
reasoning: str = Field(..., description="Overall reasoning for selections")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class KBSelector:
|
|
28
|
+
"""Add KB selection capabilities to a bot."""
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
llm_client: AbstractClient,
|
|
32
|
+
min_confidence: float = 0.6,
|
|
33
|
+
kbs: List[AbstractKnowledgeBase] = None,
|
|
34
|
+
**kwargs: Any
|
|
35
|
+
):
|
|
36
|
+
# TODO: migrate to faster LLM (e.g. Groq)
|
|
37
|
+
self.llm: AbstractClient = llm_client
|
|
38
|
+
self.min_confidence = min_confidence
|
|
39
|
+
self.knowledge_bases: List[AbstractKnowledgeBase] = kbs or []
|
|
40
|
+
self._cache = {}
|
|
41
|
+
if 'selection_prompt' in kwargs:
|
|
42
|
+
self.selection_prompt = kwargs['selection_prompt']
|
|
43
|
+
else:
|
|
44
|
+
from ..stores.kb.prompt import SELECTION_PROMPT
|
|
45
|
+
self.selection_prompt = SELECTION_PROMPT
|
|
46
|
+
# Format KB descriptions
|
|
47
|
+
self.kb_descriptions = self._get_kb_descriptions()
|
|
48
|
+
super().__init__(**kwargs)
|
|
49
|
+
|
|
50
|
+
def _get_kb_descriptions(self) -> str:
|
|
51
|
+
"""Get list of KB descriptions."""
|
|
52
|
+
descriptions = []
|
|
53
|
+
for i, kb in enumerate(self.knowledge_bases, 1):
|
|
54
|
+
from ..stores.kb.abstract import AbstractKnowledgeBase
|
|
55
|
+
if isinstance(kb, AbstractKnowledgeBase):
|
|
56
|
+
descriptions.append(f"{i}. {kb.name}: {kb.description}")
|
|
57
|
+
return "\n".join(descriptions)
|
|
58
|
+
|
|
59
|
+
async def select_kbs(
|
|
60
|
+
self,
|
|
61
|
+
question: str,
|
|
62
|
+
available_kbs: List[Dict[str, str]]
|
|
63
|
+
) -> KBOutput:
|
|
64
|
+
"""
|
|
65
|
+
Select relevant KBs using LLM reasoning.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
question: User's question
|
|
69
|
+
available_kbs: List of dicts with 'name' and 'description'
|
|
70
|
+
use_cache: Whether to use cached selections
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
List of tuples (kb_name, confidence)
|
|
74
|
+
"""
|
|
75
|
+
# Check cache
|
|
76
|
+
cache_key = self._get_cache_key(question)
|
|
77
|
+
if cache_key in self._cache:
|
|
78
|
+
return self._cache[cache_key]
|
|
79
|
+
|
|
80
|
+
# Build prompt
|
|
81
|
+
prompt = self.selection_prompt.format(
|
|
82
|
+
kb_descriptions=self.kb_descriptions,
|
|
83
|
+
question=question
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
async with self.llm:
|
|
88
|
+
# Call LLM for selection
|
|
89
|
+
response = await self.llm.ask(
|
|
90
|
+
prompt=prompt,
|
|
91
|
+
temperature=0.3,
|
|
92
|
+
max_tokens=4096,
|
|
93
|
+
structured_output=KBOutput,
|
|
94
|
+
stateless=True,
|
|
95
|
+
use_tools=False,
|
|
96
|
+
)
|
|
97
|
+
# Parse response
|
|
98
|
+
selections = response.output
|
|
99
|
+
if isinstance(selections, str):
|
|
100
|
+
if "```json" in selections:
|
|
101
|
+
json_str = selections.split("```json")[1].split("```")[0]
|
|
102
|
+
elif "```" in selections:
|
|
103
|
+
json_str = selections.split("```")[1].split("```")[0]
|
|
104
|
+
else:
|
|
105
|
+
json_str = selections
|
|
106
|
+
selections = json.loads(json_str)
|
|
107
|
+
|
|
108
|
+
# Cache result
|
|
109
|
+
self._cache[cache_key] = selections
|
|
110
|
+
# Limit cache size
|
|
111
|
+
if len(self._cache) > 100:
|
|
112
|
+
self._cache.pop(
|
|
113
|
+
next(iter(self._cache))
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
return selections
|
|
117
|
+
|
|
118
|
+
except Exception:
|
|
119
|
+
# Fallback to rule-based selection
|
|
120
|
+
return self._fallback_selection(question, available_kbs)
|
|
121
|
+
|
|
122
|
+
def _format_kb_list(self, kbs: List[Dict]) -> str:
|
|
123
|
+
"""Format KB list for prompt."""
|
|
124
|
+
lines = []
|
|
125
|
+
for i, kb in enumerate(kbs, 1):
|
|
126
|
+
from ..stores.kb.abstract import AbstractKnowledgeBase
|
|
127
|
+
if isinstance(kb, AbstractKnowledgeBase):
|
|
128
|
+
kb = {
|
|
129
|
+
"name": kb.name,
|
|
130
|
+
"description": kb.description
|
|
131
|
+
}
|
|
132
|
+
lines.append(
|
|
133
|
+
f"{i}. {kb['name']}: {kb['description']}"
|
|
134
|
+
)
|
|
135
|
+
return "\n".join(lines)
|
|
136
|
+
|
|
137
|
+
def _fallback_selection(
|
|
138
|
+
self,
|
|
139
|
+
question: str,
|
|
140
|
+
available_kbs: List[Dict]
|
|
141
|
+
) -> List[Tuple[str, float]]:
|
|
142
|
+
"""Rule-based fallback selection."""
|
|
143
|
+
question_lower = question.lower()
|
|
144
|
+
selections = []
|
|
145
|
+
|
|
146
|
+
for kb in available_kbs:
|
|
147
|
+
confidence = 0.0
|
|
148
|
+
kb_name = kb['name']
|
|
149
|
+
|
|
150
|
+
# Check for keyword matches
|
|
151
|
+
keywords = kb.get('keywords', [])
|
|
152
|
+
for keyword in keywords:
|
|
153
|
+
if keyword.lower() in question_lower:
|
|
154
|
+
confidence = max(confidence, 0.8)
|
|
155
|
+
|
|
156
|
+
# Check for pattern matches
|
|
157
|
+
patterns = kb.get('activation_patterns', [])
|
|
158
|
+
for pattern in patterns:
|
|
159
|
+
if pattern.lower() in question_lower:
|
|
160
|
+
confidence = max(confidence, 0.9)
|
|
161
|
+
|
|
162
|
+
if confidence >= self.min_confidence:
|
|
163
|
+
selections.append((kb_name, confidence))
|
|
164
|
+
|
|
165
|
+
return selections
|
|
166
|
+
|
|
167
|
+
def _get_cache_key(self, question: str) -> str:
|
|
168
|
+
"""Generate cache key for question."""
|
|
169
|
+
# Simple normalization for caching
|
|
170
|
+
return question.lower().strip()[:100]
|
parrot/bots/mcp.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Simplified MCPAgent for backward compatibility.
|
|
3
|
+
|
|
4
|
+
Since BasicAgent now has integrated MCP support, MCPAgent is now just
|
|
5
|
+
an alias to BasicAgent. This file maintains backward compatibility for
|
|
6
|
+
existing code that uses MCPAgent.
|
|
7
|
+
"""
|
|
8
|
+
from .agent import BasicAgent
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MCPAgent(BasicAgent):
|
|
12
|
+
"""
|
|
13
|
+
An agent with MCP (Model Context Protocol) capabilities.
|
|
14
|
+
|
|
15
|
+
DEPRECATED: This class is now just an alias to BasicAgent.
|
|
16
|
+
All agents (BasicAgent and subclasses) now have MCP support built-in.
|
|
17
|
+
|
|
18
|
+
For new code, use BasicAgent directly:
|
|
19
|
+
agent = BasicAgent(name="my_agent")
|
|
20
|
+
await agent.add_http_mcp_server(...)
|
|
21
|
+
|
|
22
|
+
This class is maintained for backward compatibility only.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, *args, **kwargs):
|
|
26
|
+
"""
|
|
27
|
+
Initialize MCPAgent.
|
|
28
|
+
|
|
29
|
+
Note: This is now identical to BasicAgent initialization.
|
|
30
|
+
All MCP functionality is available in BasicAgent.
|
|
31
|
+
"""
|
|
32
|
+
super().__init__(*args, **kwargs)
|
|
33
|
+
self.logger.debug(
|
|
34
|
+
f"MCPAgent '{self.name}' initialized. "
|
|
35
|
+
"Note: MCPAgent is deprecated, use BasicAgent instead."
|
|
36
|
+
)
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
# FSM-Based Agent Crew Implementation
|
|
2
|
+
|
|
3
|
+
A sophisticated agent orchestration system using **Finite State Machines** for complex workflow management with conditional transitions, error handling, and automatic parallelization.
|
|
4
|
+
|
|
5
|
+
## ๐ Overview
|
|
6
|
+
|
|
7
|
+
This implementation extends your existing `AgentCrew` with state machine-based orchestration using [python-statemachine](https://github.com/fgmacedo/python-statemachine), providing:
|
|
8
|
+
|
|
9
|
+
- โ
**State-based lifecycle management** for each agent
|
|
10
|
+
- โ
**Conditional transitions** (on_success, on_error, custom predicates)
|
|
11
|
+
- โ
**Automatic retry logic** with configurable limits
|
|
12
|
+
- โ
**Dynamic prompt building** with context-aware templates
|
|
13
|
+
- โ
**Error recovery workflows** with fallback agents
|
|
14
|
+
- โ
**Automatic parallelization** based on dependencies
|
|
15
|
+
- โ
**Workflow visualization** using Mermaid diagrams
|
|
16
|
+
- โ
**Priority-based routing** for complex decision trees
|
|
17
|
+
|
|
18
|
+
## ๐ Files Included
|
|
19
|
+
|
|
20
|
+
### Core Implementation
|
|
21
|
+
- **`orchestation/fsm.py`** - Main FSM-based AgentCrew implementation
|
|
22
|
+
- `AgentTaskMachine` - Finite state machine for agent lifecycle
|
|
23
|
+
- `FlowNode` - Agent wrapper with state and transitions
|
|
24
|
+
- `FlowTransition` - Transition definition with conditions
|
|
25
|
+
- `AgentCrewFSM` - Main orchestration class
|
|
26
|
+
|
|
27
|
+
### Examples & Documentation
|
|
28
|
+
- **`crew_fsm_examples.py`** - Comprehensive usage examples
|
|
29
|
+
- Sequential workflows with error handling
|
|
30
|
+
- Parallel processing with conditional branching
|
|
31
|
+
- Dynamic prompt building
|
|
32
|
+
- Complex multi-stage pipelines
|
|
33
|
+
- Retry and recovery patterns
|
|
34
|
+
|
|
35
|
+
- **`test_crew_fsm.py`** - Comprehensive test suite
|
|
36
|
+
- Unit tests for all components
|
|
37
|
+
- Integration tests for workflows
|
|
38
|
+
- Edge case testing
|
|
39
|
+
- Mock agents for testing
|
|
40
|
+
|
|
41
|
+
## ๐ Quick Start
|
|
42
|
+
|
|
43
|
+
### Basic Sequential Workflow
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from parrot.bots.orchestration.fsm import AgentCrewFSM
|
|
47
|
+
|
|
48
|
+
# Create crew
|
|
49
|
+
crew = AgentCrewFSM(name="MyWorkflow")
|
|
50
|
+
|
|
51
|
+
# Add agents
|
|
52
|
+
crew.add_agent(researcher)
|
|
53
|
+
crew.add_agent(analyzer)
|
|
54
|
+
crew.add_agent(writer)
|
|
55
|
+
|
|
56
|
+
# Define flow
|
|
57
|
+
crew.task_flow(researcher, analyzer)
|
|
58
|
+
crew.task_flow(analyzer, writer)
|
|
59
|
+
|
|
60
|
+
# Execute
|
|
61
|
+
result = await crew.run_flow("Research AI trends in 2025")
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Conditional Branching
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
# Route based on classification
|
|
68
|
+
crew.on_condition(
|
|
69
|
+
source=classifier,
|
|
70
|
+
targets=tech_processor,
|
|
71
|
+
predicate=lambda result: "technical" in result.lower()
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
crew.on_condition(
|
|
75
|
+
source=classifier,
|
|
76
|
+
targets=business_processor,
|
|
77
|
+
predicate=lambda result: "business" in result.lower()
|
|
78
|
+
)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Error Handling
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
# Define main flow
|
|
85
|
+
crew.task_flow(processor, analyzer)
|
|
86
|
+
|
|
87
|
+
# Add error recovery
|
|
88
|
+
crew.on_error(
|
|
89
|
+
source=analyzer,
|
|
90
|
+
targets=error_handler,
|
|
91
|
+
instruction="Handle the error and suggest fixes"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Retry after recovery
|
|
95
|
+
crew.task_flow(error_handler, analyzer)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Dynamic Prompt Building
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
def build_custom_prompt(ctx, deps):
|
|
102
|
+
research = deps.get('researcher', '')
|
|
103
|
+
data = deps.get('data_collector', '')
|
|
104
|
+
|
|
105
|
+
return f"""Analyze this research with the data:
|
|
106
|
+
|
|
107
|
+
Research: {research}
|
|
108
|
+
Data: {data}
|
|
109
|
+
|
|
110
|
+
Requirements: {ctx.original_query}"""
|
|
111
|
+
|
|
112
|
+
crew.task_flow(
|
|
113
|
+
source=[researcher, data_collector],
|
|
114
|
+
targets=analyzer,
|
|
115
|
+
prompt_builder=build_custom_prompt
|
|
116
|
+
)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## ๐ Agent Lifecycle States
|
|
120
|
+
|
|
121
|
+
Each agent progresses through these states:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
idle โ ready โ running โ completed
|
|
125
|
+
โ โ
|
|
126
|
+
blocked failed
|
|
127
|
+
โ
|
|
128
|
+
ready (retry)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
- **idle**: Agent created but not scheduled
|
|
132
|
+
- **ready**: Dependencies satisfied, ready to execute
|
|
133
|
+
- **running**: Currently executing
|
|
134
|
+
- **completed**: Successfully finished
|
|
135
|
+
- **failed**: Execution failed
|
|
136
|
+
- **blocked**: Cannot proceed (missing dependencies)
|
|
137
|
+
|
|
138
|
+
## ๐ฏ Key Features
|
|
139
|
+
|
|
140
|
+
### 1. Conditional Transitions
|
|
141
|
+
|
|
142
|
+
Define when transitions should activate:
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
# Execute on success
|
|
146
|
+
crew.on_success(source, target)
|
|
147
|
+
|
|
148
|
+
# Execute on error
|
|
149
|
+
crew.on_error(source, error_handler)
|
|
150
|
+
|
|
151
|
+
# Execute on custom condition
|
|
152
|
+
crew.on_condition(
|
|
153
|
+
source,
|
|
154
|
+
target,
|
|
155
|
+
predicate=lambda result: "keyword" in result
|
|
156
|
+
)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 2. Automatic Parallelization
|
|
160
|
+
|
|
161
|
+
Agents with no dependencies execute in parallel automatically:
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
# These agents run in parallel (no dependencies)
|
|
165
|
+
crew.add_agent(agent1)
|
|
166
|
+
crew.add_agent(agent2)
|
|
167
|
+
crew.add_agent(agent3)
|
|
168
|
+
|
|
169
|
+
# All converge to synthesizer
|
|
170
|
+
crew.task_flow([agent1, agent2, agent3], synthesizer)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 3. Retry Logic
|
|
174
|
+
|
|
175
|
+
Configure automatic retries per agent:
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
crew.add_agent(
|
|
179
|
+
flaky_agent,
|
|
180
|
+
max_retries=3 # Retry up to 3 times on failure
|
|
181
|
+
)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 4. Workflow Visualization
|
|
185
|
+
|
|
186
|
+
Generate Mermaid diagrams of your workflow:
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
print(crew.visualize_workflow())
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Output:
|
|
193
|
+
```mermaid
|
|
194
|
+
graph TD
|
|
195
|
+
agent1[agent1]
|
|
196
|
+
agent2[agent2]
|
|
197
|
+
agent1 -->|on_success| agent2
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 5. Priority-Based Routing
|
|
201
|
+
|
|
202
|
+
Control transition evaluation order:
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
crew.task_flow(source, fast_path, priority=10) # Evaluated first
|
|
206
|
+
crew.task_flow(source, thorough_path, priority=5) # Evaluated second
|
|
207
|
+
crew.task_flow(source, default_path, priority=1) # Fallback
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## ๐ Common Workflow Patterns
|
|
211
|
+
|
|
212
|
+
### Pattern 1: Fan-Out / Fan-In
|
|
213
|
+
|
|
214
|
+
One agent distributes work to multiple processors:
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
crew.task_flow(collector, [processor1, processor2, processor3])
|
|
218
|
+
crew.task_flow([processor1, processor2, processor3], synthesizer)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Pattern 2: Cascading Error Handlers
|
|
222
|
+
|
|
223
|
+
Multiple levels of error recovery:
|
|
224
|
+
|
|
225
|
+
```python
|
|
226
|
+
crew.task_flow(primary, final)
|
|
227
|
+
crew.on_error(primary, fallback1)
|
|
228
|
+
crew.on_error(fallback1, fallback2)
|
|
229
|
+
crew.on_error(fallback2, final)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Pattern 3: Multi-Stage Pipeline
|
|
233
|
+
|
|
234
|
+
Complex processing with validation:
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
crew.task_flow(stage1, validator1)
|
|
238
|
+
crew.on_success(validator1, stage2, instruction="Validation passed")
|
|
239
|
+
crew.on_error(validator1, stage1, instruction="Fix validation errors")
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Pattern 4: Conditional Routing
|
|
243
|
+
|
|
244
|
+
Route to different processors based on content type:
|
|
245
|
+
|
|
246
|
+
```python
|
|
247
|
+
crew.on_condition(
|
|
248
|
+
classifier,
|
|
249
|
+
[tech_processor, code_reviewer],
|
|
250
|
+
predicate=lambda r: "technical" in r.lower()
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
crew.on_condition(
|
|
254
|
+
classifier,
|
|
255
|
+
business_analyzer,
|
|
256
|
+
predicate=lambda r: "business" in r.lower()
|
|
257
|
+
)
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## ๐ง Configuration Options
|
|
261
|
+
|
|
262
|
+
### AgentCrewFSM Constructor
|
|
263
|
+
|
|
264
|
+
```python
|
|
265
|
+
crew = AgentCrewFSM(
|
|
266
|
+
name="MyWorkflow", # Workflow name
|
|
267
|
+
max_parallel_tasks=10, # Max concurrent agents
|
|
268
|
+
default_max_retries=3, # Default retry limit
|
|
269
|
+
execution_timeout=300, # Timeout in seconds (optional)
|
|
270
|
+
shared_tool_manager=None # Shared tools (optional)
|
|
271
|
+
)
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### task_flow() Parameters
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
crew.task_flow(
|
|
278
|
+
source=agent1, # Source agent(s)
|
|
279
|
+
targets=agent2, # Target agent(s)
|
|
280
|
+
condition=TransitionCondition.ON_SUCCESS, # When to activate
|
|
281
|
+
instruction="Custom prompt", # Static instruction
|
|
282
|
+
prompt_builder=my_builder, # Dynamic prompt function
|
|
283
|
+
predicate=my_condition, # Custom condition
|
|
284
|
+
priority=5, # Evaluation priority
|
|
285
|
+
**metadata # Additional metadata
|
|
286
|
+
)
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## ๐ Performance Considerations
|
|
290
|
+
|
|
291
|
+
### Parallel Execution Tuning
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
# CPU-bound agents
|
|
295
|
+
crew = AgentCrewFSM(max_parallel_tasks=cpu_count())
|
|
296
|
+
|
|
297
|
+
# I/O-bound agents
|
|
298
|
+
crew = AgentCrewFSM(max_parallel_tasks=20-50)
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Prompt Builder Performance
|
|
302
|
+
|
|
303
|
+
Keep prompt builders fast:
|
|
304
|
+
- Avoid expensive computations
|
|
305
|
+
- Cache results when possible
|
|
306
|
+
- Use async only when necessary
|
|
307
|
+
|
|
308
|
+
### Memory Usage
|
|
309
|
+
|
|
310
|
+
For large workflows (100+ agents):
|
|
311
|
+
- Consider clearing old results periodically
|
|
312
|
+
- Use streaming for large data
|
|
313
|
+
- Implement custom cleanup logic
|
|
314
|
+
|
|
315
|
+
## ๐งช Testing
|
|
316
|
+
|
|
317
|
+
Run the test suite:
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
pytest test_crew_fsm.py -v
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Run specific test:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
pytest test_crew_fsm.py::test_simple_sequential_execution -v
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## ๐ Examples
|
|
330
|
+
|
|
331
|
+
See `crew_fsm_examples.py` for comprehensive examples:
|
|
332
|
+
|
|
333
|
+
1. **Sequential with Error Handling** - Basic workflow with recovery
|
|
334
|
+
2. **Parallel Conditional** - Conditional branching with parallel processing
|
|
335
|
+
3. **Dynamic Prompts** - Context-aware prompt building
|
|
336
|
+
4. **Complex Pipeline** - Multi-stage workflow with validation
|
|
337
|
+
5. **Retry and Recovery** - Automatic retry logic demonstration
|
|
338
|
+
|
|
339
|
+
Run all examples:
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
python crew_fsm_examples.py
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## ๐ Debugging and Monitoring
|
|
346
|
+
|
|
347
|
+
### Validate Workflow
|
|
348
|
+
|
|
349
|
+
Check for circular dependencies before execution:
|
|
350
|
+
|
|
351
|
+
```python
|
|
352
|
+
await crew.validate_workflow()
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Visualize Workflow
|
|
356
|
+
|
|
357
|
+
Generate and view workflow diagram:
|
|
358
|
+
|
|
359
|
+
```python
|
|
360
|
+
mermaid_diagram = crew.visualize_workflow()
|
|
361
|
+
print(mermaid_diagram)
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Get Statistics
|
|
365
|
+
|
|
366
|
+
Monitor execution metrics:
|
|
367
|
+
|
|
368
|
+
```python
|
|
369
|
+
stats = crew.get_workflow_stats()
|
|
370
|
+
print(f"Completed: {stats['states']['completed']}")
|
|
371
|
+
print(f"Failed: {stats['states']['failed']}")
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Execution Log
|
|
375
|
+
|
|
376
|
+
Review detailed execution log:
|
|
377
|
+
|
|
378
|
+
```python
|
|
379
|
+
result = await crew.run_flow(task)
|
|
380
|
+
|
|
381
|
+
for log in result['execution_log']:
|
|
382
|
+
print(f"{log['agent_name']}: {log['execution_time']:.2f}s")
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## ๐ Comparison with AgentCrew
|
|
386
|
+
|
|
387
|
+
| Feature | AgentCrew | AgentCrewFSM |
|
|
388
|
+
|---------|-----------|--------------|
|
|
389
|
+
| Sequential execution | โ | โ |
|
|
390
|
+
| Parallel execution | โ | โ |
|
|
391
|
+
| DAG-based flow | โ | โ |
|
|
392
|
+
| State machine lifecycle | โ | โ |
|
|
393
|
+
| Conditional transitions | โ | โ |
|
|
394
|
+
| Error recovery | โ | โ |
|
|
395
|
+
| Automatic retries | โ | โ |
|
|
396
|
+
| Custom prompt builders | โ | โ |
|
|
397
|
+
| Workflow visualization | โ | โ |
|
|
398
|
+
| Priority-based routing | โ | โ |
|
|
399
|
+
|
|
400
|
+
## ๐ Best Practices
|
|
401
|
+
|
|
402
|
+
1. **Use descriptive agent names** - Makes debugging easier
|
|
403
|
+
2. **Validate workflows** - Call `validate_workflow()` before production
|
|
404
|
+
3. **Set appropriate retry limits** - Balance cost vs. reliability
|
|
405
|
+
4. **Monitor execution** - Use logs and stats for optimization
|
|
406
|
+
5. **Keep prompt builders simple** - Extract complex logic to separate agents
|
|
407
|
+
6. **Test workflows thoroughly** - Use the provided test suite as a template
|
|
408
|
+
7. **Visualize before deploying** - Review workflow diagrams for logic errors
|
|
409
|
+
|
|
410
|
+
## ๐ Troubleshooting
|
|
411
|
+
|
|
412
|
+
### Workflow Gets Stuck
|
|
413
|
+
|
|
414
|
+
**Symptom**: RuntimeError about stuck workflow
|
|
415
|
+
|
|
416
|
+
**Solutions**:
|
|
417
|
+
- Check for missing transitions
|
|
418
|
+
- Verify dependencies are satisfiable
|
|
419
|
+
- Look for agents with no outgoing transitions
|
|
420
|
+
- Run `validate_workflow()` to check for cycles
|
|
421
|
+
|
|
422
|
+
### Agents Not Parallel
|
|
423
|
+
|
|
424
|
+
**Symptom**: Sequential execution when expecting parallel
|
|
425
|
+
|
|
426
|
+
**Solutions**:
|
|
427
|
+
- Check for unintended dependencies
|
|
428
|
+
- Verify `max_parallel_tasks` setting
|
|
429
|
+
- Review `task_flow()` calls
|
|
430
|
+
|
|
431
|
+
### Error Handlers Not Triggering
|
|
432
|
+
|
|
433
|
+
**Symptom**: `on_error()` transitions not activating
|
|
434
|
+
|
|
435
|
+
**Solutions**:
|
|
436
|
+
- Verify agent is actually failing
|
|
437
|
+
- Check error transition priority
|
|
438
|
+
- Review execution log for details
|
|
439
|
+
|
|
440
|
+
## ๐ License
|
|
441
|
+
|
|
442
|
+
This implementation is part of the AI-parrot library. See your existing license.
|
|
443
|
+
|
|
444
|
+
## ๐ค Contributing
|
|
445
|
+
|
|
446
|
+
When extending this implementation:
|
|
447
|
+
|
|
448
|
+
1. Add tests to `test_crew_fsm.py`
|
|
449
|
+
2. Update examples in `crew_fsm_examples.py`
|
|
450
|
+
3. Document new features in this README
|
|
451
|
+
4. Update the migration guide if needed
|
|
452
|
+
|
|
453
|
+
## ๐ Support
|
|
454
|
+
|
|
455
|
+
For issues or questions:
|
|
456
|
+
1. Check the migration guide
|
|
457
|
+
2. Review the examples
|
|
458
|
+
3. Run the test suite
|
|
459
|
+
4. Check execution logs and visualization
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
**Built with โค๏ธ for sophisticated agent orchestration**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .crew import AgentCrew, AgentNode, FlowContext
|