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.
Files changed (535) hide show
  1. agentui/.prettierrc +15 -0
  2. agentui/QUICKSTART.md +272 -0
  3. agentui/README.md +59 -0
  4. agentui/env.example +16 -0
  5. agentui/jsconfig.json +14 -0
  6. agentui/package-lock.json +4242 -0
  7. agentui/package.json +34 -0
  8. agentui/scripts/postinstall/apply-patches.mjs +260 -0
  9. agentui/src/app.css +61 -0
  10. agentui/src/app.d.ts +13 -0
  11. agentui/src/app.html +12 -0
  12. agentui/src/components/LoadingSpinner.svelte +64 -0
  13. agentui/src/components/ThemeSwitcher.svelte +159 -0
  14. agentui/src/components/index.js +4 -0
  15. agentui/src/lib/api/bots.ts +60 -0
  16. agentui/src/lib/api/chat.ts +22 -0
  17. agentui/src/lib/api/http.ts +25 -0
  18. agentui/src/lib/components/BotCard.svelte +33 -0
  19. agentui/src/lib/components/ChatBubble.svelte +63 -0
  20. agentui/src/lib/components/Toast.svelte +21 -0
  21. agentui/src/lib/config.ts +20 -0
  22. agentui/src/lib/stores/auth.svelte.ts +73 -0
  23. agentui/src/lib/stores/theme.svelte.js +64 -0
  24. agentui/src/lib/stores/toast.svelte.ts +31 -0
  25. agentui/src/lib/utils/conversation.ts +39 -0
  26. agentui/src/routes/+layout.svelte +20 -0
  27. agentui/src/routes/+page.svelte +232 -0
  28. agentui/src/routes/login/+page.svelte +200 -0
  29. agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
  30. agentui/src/routes/talk/[agentId]/+page.ts +7 -0
  31. agentui/static/README.md +1 -0
  32. agentui/svelte.config.js +11 -0
  33. agentui/tailwind.config.ts +53 -0
  34. agentui/tsconfig.json +3 -0
  35. agentui/vite.config.ts +10 -0
  36. ai_parrot-0.17.2.dist-info/METADATA +472 -0
  37. ai_parrot-0.17.2.dist-info/RECORD +535 -0
  38. ai_parrot-0.17.2.dist-info/WHEEL +6 -0
  39. ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
  40. ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
  41. ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
  42. crew-builder/.prettierrc +15 -0
  43. crew-builder/QUICKSTART.md +259 -0
  44. crew-builder/README.md +113 -0
  45. crew-builder/env.example +17 -0
  46. crew-builder/jsconfig.json +14 -0
  47. crew-builder/package-lock.json +4182 -0
  48. crew-builder/package.json +37 -0
  49. crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
  50. crew-builder/src/app.css +62 -0
  51. crew-builder/src/app.d.ts +13 -0
  52. crew-builder/src/app.html +12 -0
  53. crew-builder/src/components/LoadingSpinner.svelte +64 -0
  54. crew-builder/src/components/ThemeSwitcher.svelte +149 -0
  55. crew-builder/src/components/index.js +9 -0
  56. crew-builder/src/lib/api/bots.ts +60 -0
  57. crew-builder/src/lib/api/chat.ts +80 -0
  58. crew-builder/src/lib/api/client.ts +56 -0
  59. crew-builder/src/lib/api/crew/crew.ts +136 -0
  60. crew-builder/src/lib/api/index.ts +5 -0
  61. crew-builder/src/lib/api/o365/auth.ts +65 -0
  62. crew-builder/src/lib/auth/auth.ts +54 -0
  63. crew-builder/src/lib/components/AgentNode.svelte +43 -0
  64. crew-builder/src/lib/components/BotCard.svelte +33 -0
  65. crew-builder/src/lib/components/ChatBubble.svelte +67 -0
  66. crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
  67. crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
  68. crew-builder/src/lib/components/JsonViewer.svelte +24 -0
  69. crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
  70. crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
  71. crew-builder/src/lib/components/Toast.svelte +67 -0
  72. crew-builder/src/lib/components/Toolbar.svelte +157 -0
  73. crew-builder/src/lib/components/index.ts +10 -0
  74. crew-builder/src/lib/config.ts +8 -0
  75. crew-builder/src/lib/stores/auth.svelte.ts +228 -0
  76. crew-builder/src/lib/stores/crewStore.ts +369 -0
  77. crew-builder/src/lib/stores/theme.svelte.js +145 -0
  78. crew-builder/src/lib/stores/toast.svelte.ts +69 -0
  79. crew-builder/src/lib/utils/conversation.ts +39 -0
  80. crew-builder/src/lib/utils/markdown.ts +122 -0
  81. crew-builder/src/lib/utils/talkHistory.ts +47 -0
  82. crew-builder/src/routes/+layout.svelte +20 -0
  83. crew-builder/src/routes/+page.svelte +539 -0
  84. crew-builder/src/routes/agents/+page.svelte +247 -0
  85. crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
  86. crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
  87. crew-builder/src/routes/builder/+page.svelte +204 -0
  88. crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
  89. crew-builder/src/routes/crew/ask/+page.ts +1 -0
  90. crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
  91. crew-builder/src/routes/login/+page.svelte +197 -0
  92. crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
  93. crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
  94. crew-builder/static/README.md +1 -0
  95. crew-builder/svelte.config.js +11 -0
  96. crew-builder/tailwind.config.ts +53 -0
  97. crew-builder/tsconfig.json +3 -0
  98. crew-builder/vite.config.ts +10 -0
  99. mcp_servers/calculator_server.py +309 -0
  100. parrot/__init__.py +27 -0
  101. parrot/__pycache__/__init__.cpython-310.pyc +0 -0
  102. parrot/__pycache__/version.cpython-310.pyc +0 -0
  103. parrot/_version.py +34 -0
  104. parrot/a2a/__init__.py +48 -0
  105. parrot/a2a/client.py +658 -0
  106. parrot/a2a/discovery.py +89 -0
  107. parrot/a2a/mixin.py +257 -0
  108. parrot/a2a/models.py +376 -0
  109. parrot/a2a/server.py +770 -0
  110. parrot/agents/__init__.py +29 -0
  111. parrot/bots/__init__.py +12 -0
  112. parrot/bots/a2a_agent.py +19 -0
  113. parrot/bots/abstract.py +3139 -0
  114. parrot/bots/agent.py +1129 -0
  115. parrot/bots/basic.py +9 -0
  116. parrot/bots/chatbot.py +669 -0
  117. parrot/bots/data.py +1618 -0
  118. parrot/bots/database/__init__.py +5 -0
  119. parrot/bots/database/abstract.py +3071 -0
  120. parrot/bots/database/cache.py +286 -0
  121. parrot/bots/database/models.py +468 -0
  122. parrot/bots/database/prompts.py +154 -0
  123. parrot/bots/database/retries.py +98 -0
  124. parrot/bots/database/router.py +269 -0
  125. parrot/bots/database/sql.py +41 -0
  126. parrot/bots/db/__init__.py +6 -0
  127. parrot/bots/db/abstract.py +556 -0
  128. parrot/bots/db/bigquery.py +602 -0
  129. parrot/bots/db/cache.py +85 -0
  130. parrot/bots/db/documentdb.py +668 -0
  131. parrot/bots/db/elastic.py +1014 -0
  132. parrot/bots/db/influx.py +898 -0
  133. parrot/bots/db/mock.py +96 -0
  134. parrot/bots/db/multi.py +783 -0
  135. parrot/bots/db/prompts.py +185 -0
  136. parrot/bots/db/sql.py +1255 -0
  137. parrot/bots/db/tools.py +212 -0
  138. parrot/bots/document.py +680 -0
  139. parrot/bots/hrbot.py +15 -0
  140. parrot/bots/kb.py +170 -0
  141. parrot/bots/mcp.py +36 -0
  142. parrot/bots/orchestration/README.md +463 -0
  143. parrot/bots/orchestration/__init__.py +1 -0
  144. parrot/bots/orchestration/agent.py +155 -0
  145. parrot/bots/orchestration/crew.py +3330 -0
  146. parrot/bots/orchestration/fsm.py +1179 -0
  147. parrot/bots/orchestration/hr.py +434 -0
  148. parrot/bots/orchestration/storage/__init__.py +4 -0
  149. parrot/bots/orchestration/storage/memory.py +100 -0
  150. parrot/bots/orchestration/storage/mixin.py +119 -0
  151. parrot/bots/orchestration/verify.py +202 -0
  152. parrot/bots/product.py +204 -0
  153. parrot/bots/prompts/__init__.py +96 -0
  154. parrot/bots/prompts/agents.py +155 -0
  155. parrot/bots/prompts/data.py +216 -0
  156. parrot/bots/prompts/output_generation.py +8 -0
  157. parrot/bots/scraper/__init__.py +3 -0
  158. parrot/bots/scraper/models.py +122 -0
  159. parrot/bots/scraper/scraper.py +1173 -0
  160. parrot/bots/scraper/templates.py +115 -0
  161. parrot/bots/stores/__init__.py +5 -0
  162. parrot/bots/stores/local.py +172 -0
  163. parrot/bots/webdev.py +81 -0
  164. parrot/cli.py +17 -0
  165. parrot/clients/__init__.py +16 -0
  166. parrot/clients/base.py +1491 -0
  167. parrot/clients/claude.py +1191 -0
  168. parrot/clients/factory.py +129 -0
  169. parrot/clients/google.py +4567 -0
  170. parrot/clients/gpt.py +1975 -0
  171. parrot/clients/grok.py +432 -0
  172. parrot/clients/groq.py +986 -0
  173. parrot/clients/hf.py +582 -0
  174. parrot/clients/models.py +18 -0
  175. parrot/conf.py +395 -0
  176. parrot/embeddings/__init__.py +9 -0
  177. parrot/embeddings/base.py +157 -0
  178. parrot/embeddings/google.py +98 -0
  179. parrot/embeddings/huggingface.py +74 -0
  180. parrot/embeddings/openai.py +84 -0
  181. parrot/embeddings/processor.py +88 -0
  182. parrot/exceptions.c +13868 -0
  183. parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
  184. parrot/exceptions.pxd +22 -0
  185. parrot/exceptions.pxi +15 -0
  186. parrot/exceptions.pyx +44 -0
  187. parrot/generators/__init__.py +29 -0
  188. parrot/generators/base.py +200 -0
  189. parrot/generators/html.py +293 -0
  190. parrot/generators/react.py +205 -0
  191. parrot/generators/streamlit.py +203 -0
  192. parrot/generators/template.py +105 -0
  193. parrot/handlers/__init__.py +4 -0
  194. parrot/handlers/agent.py +861 -0
  195. parrot/handlers/agents/__init__.py +1 -0
  196. parrot/handlers/agents/abstract.py +900 -0
  197. parrot/handlers/bots.py +338 -0
  198. parrot/handlers/chat.py +915 -0
  199. parrot/handlers/creation.sql +192 -0
  200. parrot/handlers/crew/ARCHITECTURE.md +362 -0
  201. parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
  202. parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
  203. parrot/handlers/crew/__init__.py +0 -0
  204. parrot/handlers/crew/handler.py +801 -0
  205. parrot/handlers/crew/models.py +229 -0
  206. parrot/handlers/crew/redis_persistence.py +523 -0
  207. parrot/handlers/jobs/__init__.py +10 -0
  208. parrot/handlers/jobs/job.py +384 -0
  209. parrot/handlers/jobs/mixin.py +627 -0
  210. parrot/handlers/jobs/models.py +115 -0
  211. parrot/handlers/jobs/worker.py +31 -0
  212. parrot/handlers/models.py +596 -0
  213. parrot/handlers/o365_auth.py +105 -0
  214. parrot/handlers/stream.py +337 -0
  215. parrot/interfaces/__init__.py +6 -0
  216. parrot/interfaces/aws.py +143 -0
  217. parrot/interfaces/credentials.py +113 -0
  218. parrot/interfaces/database.py +27 -0
  219. parrot/interfaces/google.py +1123 -0
  220. parrot/interfaces/hierarchy.py +1227 -0
  221. parrot/interfaces/http.py +651 -0
  222. parrot/interfaces/images/__init__.py +0 -0
  223. parrot/interfaces/images/plugins/__init__.py +24 -0
  224. parrot/interfaces/images/plugins/abstract.py +58 -0
  225. parrot/interfaces/images/plugins/analisys.py +148 -0
  226. parrot/interfaces/images/plugins/classify.py +150 -0
  227. parrot/interfaces/images/plugins/classifybase.py +182 -0
  228. parrot/interfaces/images/plugins/detect.py +150 -0
  229. parrot/interfaces/images/plugins/exif.py +1103 -0
  230. parrot/interfaces/images/plugins/hash.py +52 -0
  231. parrot/interfaces/images/plugins/vision.py +104 -0
  232. parrot/interfaces/images/plugins/yolo.py +66 -0
  233. parrot/interfaces/images/plugins/zerodetect.py +197 -0
  234. parrot/interfaces/o365.py +978 -0
  235. parrot/interfaces/onedrive.py +822 -0
  236. parrot/interfaces/sharepoint.py +1435 -0
  237. parrot/interfaces/soap.py +257 -0
  238. parrot/loaders/__init__.py +8 -0
  239. parrot/loaders/abstract.py +1131 -0
  240. parrot/loaders/audio.py +199 -0
  241. parrot/loaders/basepdf.py +53 -0
  242. parrot/loaders/basevideo.py +1568 -0
  243. parrot/loaders/csv.py +409 -0
  244. parrot/loaders/docx.py +116 -0
  245. parrot/loaders/epubloader.py +316 -0
  246. parrot/loaders/excel.py +199 -0
  247. parrot/loaders/factory.py +55 -0
  248. parrot/loaders/files/__init__.py +0 -0
  249. parrot/loaders/files/abstract.py +39 -0
  250. parrot/loaders/files/html.py +26 -0
  251. parrot/loaders/files/text.py +63 -0
  252. parrot/loaders/html.py +152 -0
  253. parrot/loaders/markdown.py +442 -0
  254. parrot/loaders/pdf.py +373 -0
  255. parrot/loaders/pdfmark.py +320 -0
  256. parrot/loaders/pdftables.py +506 -0
  257. parrot/loaders/ppt.py +476 -0
  258. parrot/loaders/qa.py +63 -0
  259. parrot/loaders/splitters/__init__.py +10 -0
  260. parrot/loaders/splitters/base.py +138 -0
  261. parrot/loaders/splitters/md.py +228 -0
  262. parrot/loaders/splitters/token.py +143 -0
  263. parrot/loaders/txt.py +26 -0
  264. parrot/loaders/video.py +89 -0
  265. parrot/loaders/videolocal.py +218 -0
  266. parrot/loaders/videounderstanding.py +377 -0
  267. parrot/loaders/vimeo.py +167 -0
  268. parrot/loaders/web.py +599 -0
  269. parrot/loaders/youtube.py +504 -0
  270. parrot/manager/__init__.py +5 -0
  271. parrot/manager/manager.py +1030 -0
  272. parrot/mcp/__init__.py +28 -0
  273. parrot/mcp/adapter.py +105 -0
  274. parrot/mcp/cli.py +174 -0
  275. parrot/mcp/client.py +119 -0
  276. parrot/mcp/config.py +75 -0
  277. parrot/mcp/integration.py +842 -0
  278. parrot/mcp/oauth.py +933 -0
  279. parrot/mcp/server.py +225 -0
  280. parrot/mcp/transports/__init__.py +3 -0
  281. parrot/mcp/transports/base.py +279 -0
  282. parrot/mcp/transports/grpc_session.py +163 -0
  283. parrot/mcp/transports/http.py +312 -0
  284. parrot/mcp/transports/mcp.proto +108 -0
  285. parrot/mcp/transports/quic.py +1082 -0
  286. parrot/mcp/transports/sse.py +330 -0
  287. parrot/mcp/transports/stdio.py +309 -0
  288. parrot/mcp/transports/unix.py +395 -0
  289. parrot/mcp/transports/websocket.py +547 -0
  290. parrot/memory/__init__.py +16 -0
  291. parrot/memory/abstract.py +209 -0
  292. parrot/memory/agent.py +32 -0
  293. parrot/memory/cache.py +175 -0
  294. parrot/memory/core.py +555 -0
  295. parrot/memory/file.py +153 -0
  296. parrot/memory/mem.py +131 -0
  297. parrot/memory/redis.py +613 -0
  298. parrot/models/__init__.py +46 -0
  299. parrot/models/basic.py +118 -0
  300. parrot/models/compliance.py +208 -0
  301. parrot/models/crew.py +395 -0
  302. parrot/models/detections.py +654 -0
  303. parrot/models/generation.py +85 -0
  304. parrot/models/google.py +223 -0
  305. parrot/models/groq.py +23 -0
  306. parrot/models/openai.py +30 -0
  307. parrot/models/outputs.py +285 -0
  308. parrot/models/responses.py +938 -0
  309. parrot/notifications/__init__.py +743 -0
  310. parrot/openapi/__init__.py +3 -0
  311. parrot/openapi/components.yaml +641 -0
  312. parrot/openapi/config.py +322 -0
  313. parrot/outputs/__init__.py +32 -0
  314. parrot/outputs/formats/__init__.py +108 -0
  315. parrot/outputs/formats/altair.py +359 -0
  316. parrot/outputs/formats/application.py +122 -0
  317. parrot/outputs/formats/base.py +351 -0
  318. parrot/outputs/formats/bokeh.py +356 -0
  319. parrot/outputs/formats/card.py +424 -0
  320. parrot/outputs/formats/chart.py +436 -0
  321. parrot/outputs/formats/d3.py +255 -0
  322. parrot/outputs/formats/echarts.py +310 -0
  323. parrot/outputs/formats/generators/__init__.py +0 -0
  324. parrot/outputs/formats/generators/abstract.py +61 -0
  325. parrot/outputs/formats/generators/panel.py +145 -0
  326. parrot/outputs/formats/generators/streamlit.py +86 -0
  327. parrot/outputs/formats/generators/terminal.py +63 -0
  328. parrot/outputs/formats/holoviews.py +310 -0
  329. parrot/outputs/formats/html.py +147 -0
  330. parrot/outputs/formats/jinja2.py +46 -0
  331. parrot/outputs/formats/json.py +87 -0
  332. parrot/outputs/formats/map.py +933 -0
  333. parrot/outputs/formats/markdown.py +172 -0
  334. parrot/outputs/formats/matplotlib.py +237 -0
  335. parrot/outputs/formats/mixins/__init__.py +0 -0
  336. parrot/outputs/formats/mixins/emaps.py +855 -0
  337. parrot/outputs/formats/plotly.py +341 -0
  338. parrot/outputs/formats/seaborn.py +310 -0
  339. parrot/outputs/formats/table.py +397 -0
  340. parrot/outputs/formats/template_report.py +138 -0
  341. parrot/outputs/formats/yaml.py +125 -0
  342. parrot/outputs/formatter.py +152 -0
  343. parrot/outputs/templates/__init__.py +95 -0
  344. parrot/pipelines/__init__.py +0 -0
  345. parrot/pipelines/abstract.py +210 -0
  346. parrot/pipelines/detector.py +124 -0
  347. parrot/pipelines/models.py +90 -0
  348. parrot/pipelines/planogram.py +3002 -0
  349. parrot/pipelines/table.sql +97 -0
  350. parrot/plugins/__init__.py +106 -0
  351. parrot/plugins/importer.py +80 -0
  352. parrot/py.typed +0 -0
  353. parrot/registry/__init__.py +18 -0
  354. parrot/registry/registry.py +594 -0
  355. parrot/scheduler/__init__.py +1189 -0
  356. parrot/scheduler/models.py +60 -0
  357. parrot/security/__init__.py +16 -0
  358. parrot/security/prompt_injection.py +268 -0
  359. parrot/security/security_events.sql +25 -0
  360. parrot/services/__init__.py +1 -0
  361. parrot/services/mcp/__init__.py +8 -0
  362. parrot/services/mcp/config.py +13 -0
  363. parrot/services/mcp/server.py +295 -0
  364. parrot/services/o365_remote_auth.py +235 -0
  365. parrot/stores/__init__.py +7 -0
  366. parrot/stores/abstract.py +352 -0
  367. parrot/stores/arango.py +1090 -0
  368. parrot/stores/bigquery.py +1377 -0
  369. parrot/stores/cache.py +106 -0
  370. parrot/stores/empty.py +10 -0
  371. parrot/stores/faiss_store.py +1157 -0
  372. parrot/stores/kb/__init__.py +9 -0
  373. parrot/stores/kb/abstract.py +68 -0
  374. parrot/stores/kb/cache.py +165 -0
  375. parrot/stores/kb/doc.py +325 -0
  376. parrot/stores/kb/hierarchy.py +346 -0
  377. parrot/stores/kb/local.py +457 -0
  378. parrot/stores/kb/prompt.py +28 -0
  379. parrot/stores/kb/redis.py +659 -0
  380. parrot/stores/kb/store.py +115 -0
  381. parrot/stores/kb/user.py +374 -0
  382. parrot/stores/models.py +59 -0
  383. parrot/stores/pgvector.py +3 -0
  384. parrot/stores/postgres.py +2853 -0
  385. parrot/stores/utils/__init__.py +0 -0
  386. parrot/stores/utils/chunking.py +197 -0
  387. parrot/telemetry/__init__.py +3 -0
  388. parrot/telemetry/mixin.py +111 -0
  389. parrot/template/__init__.py +3 -0
  390. parrot/template/engine.py +259 -0
  391. parrot/tools/__init__.py +23 -0
  392. parrot/tools/abstract.py +644 -0
  393. parrot/tools/agent.py +363 -0
  394. parrot/tools/arangodbsearch.py +537 -0
  395. parrot/tools/arxiv_tool.py +188 -0
  396. parrot/tools/calculator/__init__.py +3 -0
  397. parrot/tools/calculator/operations/__init__.py +38 -0
  398. parrot/tools/calculator/operations/calculus.py +80 -0
  399. parrot/tools/calculator/operations/statistics.py +76 -0
  400. parrot/tools/calculator/tool.py +150 -0
  401. parrot/tools/cloudwatch.py +988 -0
  402. parrot/tools/codeinterpreter/__init__.py +127 -0
  403. parrot/tools/codeinterpreter/executor.py +371 -0
  404. parrot/tools/codeinterpreter/internals.py +473 -0
  405. parrot/tools/codeinterpreter/models.py +643 -0
  406. parrot/tools/codeinterpreter/prompts.py +224 -0
  407. parrot/tools/codeinterpreter/tool.py +664 -0
  408. parrot/tools/company_info/__init__.py +6 -0
  409. parrot/tools/company_info/tool.py +1138 -0
  410. parrot/tools/correlationanalysis.py +437 -0
  411. parrot/tools/database/abstract.py +286 -0
  412. parrot/tools/database/bq.py +115 -0
  413. parrot/tools/database/cache.py +284 -0
  414. parrot/tools/database/models.py +95 -0
  415. parrot/tools/database/pg.py +343 -0
  416. parrot/tools/databasequery.py +1159 -0
  417. parrot/tools/db.py +1800 -0
  418. parrot/tools/ddgo.py +370 -0
  419. parrot/tools/decorators.py +271 -0
  420. parrot/tools/dftohtml.py +282 -0
  421. parrot/tools/document.py +549 -0
  422. parrot/tools/ecs.py +819 -0
  423. parrot/tools/edareport.py +368 -0
  424. parrot/tools/elasticsearch.py +1049 -0
  425. parrot/tools/employees.py +462 -0
  426. parrot/tools/epson/__init__.py +96 -0
  427. parrot/tools/excel.py +683 -0
  428. parrot/tools/file/__init__.py +13 -0
  429. parrot/tools/file/abstract.py +76 -0
  430. parrot/tools/file/gcs.py +378 -0
  431. parrot/tools/file/local.py +284 -0
  432. parrot/tools/file/s3.py +511 -0
  433. parrot/tools/file/tmp.py +309 -0
  434. parrot/tools/file/tool.py +501 -0
  435. parrot/tools/file_reader.py +129 -0
  436. parrot/tools/flowtask/__init__.py +19 -0
  437. parrot/tools/flowtask/tool.py +761 -0
  438. parrot/tools/gittoolkit.py +508 -0
  439. parrot/tools/google/__init__.py +18 -0
  440. parrot/tools/google/base.py +169 -0
  441. parrot/tools/google/tools.py +1251 -0
  442. parrot/tools/googlelocation.py +5 -0
  443. parrot/tools/googleroutes.py +5 -0
  444. parrot/tools/googlesearch.py +5 -0
  445. parrot/tools/googlesitesearch.py +5 -0
  446. parrot/tools/googlevoice.py +2 -0
  447. parrot/tools/gvoice.py +695 -0
  448. parrot/tools/ibisworld/README.md +225 -0
  449. parrot/tools/ibisworld/__init__.py +11 -0
  450. parrot/tools/ibisworld/tool.py +366 -0
  451. parrot/tools/jiratoolkit.py +1718 -0
  452. parrot/tools/manager.py +1098 -0
  453. parrot/tools/math.py +152 -0
  454. parrot/tools/metadata.py +476 -0
  455. parrot/tools/msteams.py +1621 -0
  456. parrot/tools/msword.py +635 -0
  457. parrot/tools/multidb.py +580 -0
  458. parrot/tools/multistoresearch.py +369 -0
  459. parrot/tools/networkninja.py +167 -0
  460. parrot/tools/nextstop/__init__.py +4 -0
  461. parrot/tools/nextstop/base.py +286 -0
  462. parrot/tools/nextstop/employee.py +733 -0
  463. parrot/tools/nextstop/store.py +462 -0
  464. parrot/tools/notification.py +435 -0
  465. parrot/tools/o365/__init__.py +42 -0
  466. parrot/tools/o365/base.py +295 -0
  467. parrot/tools/o365/bundle.py +522 -0
  468. parrot/tools/o365/events.py +554 -0
  469. parrot/tools/o365/mail.py +992 -0
  470. parrot/tools/o365/onedrive.py +497 -0
  471. parrot/tools/o365/sharepoint.py +641 -0
  472. parrot/tools/openapi_toolkit.py +904 -0
  473. parrot/tools/openweather.py +527 -0
  474. parrot/tools/pdfprint.py +1001 -0
  475. parrot/tools/powerbi.py +518 -0
  476. parrot/tools/powerpoint.py +1113 -0
  477. parrot/tools/pricestool.py +146 -0
  478. parrot/tools/products/__init__.py +246 -0
  479. parrot/tools/prophet_tool.py +171 -0
  480. parrot/tools/pythonpandas.py +630 -0
  481. parrot/tools/pythonrepl.py +910 -0
  482. parrot/tools/qsource.py +436 -0
  483. parrot/tools/querytoolkit.py +395 -0
  484. parrot/tools/quickeda.py +827 -0
  485. parrot/tools/resttool.py +553 -0
  486. parrot/tools/retail/__init__.py +0 -0
  487. parrot/tools/retail/bby.py +528 -0
  488. parrot/tools/sandboxtool.py +703 -0
  489. parrot/tools/sassie/__init__.py +352 -0
  490. parrot/tools/scraping/__init__.py +7 -0
  491. parrot/tools/scraping/docs/select.md +466 -0
  492. parrot/tools/scraping/documentation.md +1278 -0
  493. parrot/tools/scraping/driver.py +436 -0
  494. parrot/tools/scraping/models.py +576 -0
  495. parrot/tools/scraping/options.py +85 -0
  496. parrot/tools/scraping/orchestrator.py +517 -0
  497. parrot/tools/scraping/readme.md +740 -0
  498. parrot/tools/scraping/tool.py +3115 -0
  499. parrot/tools/seasonaldetection.py +642 -0
  500. parrot/tools/shell_tool/__init__.py +5 -0
  501. parrot/tools/shell_tool/actions.py +408 -0
  502. parrot/tools/shell_tool/engine.py +155 -0
  503. parrot/tools/shell_tool/models.py +322 -0
  504. parrot/tools/shell_tool/tool.py +442 -0
  505. parrot/tools/site_search.py +214 -0
  506. parrot/tools/textfile.py +418 -0
  507. parrot/tools/think.py +378 -0
  508. parrot/tools/toolkit.py +298 -0
  509. parrot/tools/webapp_tool.py +187 -0
  510. parrot/tools/whatif.py +1279 -0
  511. parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
  512. parrot/tools/workday/__init__.py +6 -0
  513. parrot/tools/workday/models.py +1389 -0
  514. parrot/tools/workday/tool.py +1293 -0
  515. parrot/tools/yfinance_tool.py +306 -0
  516. parrot/tools/zipcode.py +217 -0
  517. parrot/utils/__init__.py +2 -0
  518. parrot/utils/helpers.py +73 -0
  519. parrot/utils/parsers/__init__.py +5 -0
  520. parrot/utils/parsers/toml.c +12078 -0
  521. parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
  522. parrot/utils/parsers/toml.pyx +21 -0
  523. parrot/utils/toml.py +11 -0
  524. parrot/utils/types.cpp +20936 -0
  525. parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
  526. parrot/utils/types.pyx +213 -0
  527. parrot/utils/uv.py +11 -0
  528. parrot/version.py +10 -0
  529. parrot/yaml-rs/Cargo.lock +350 -0
  530. parrot/yaml-rs/Cargo.toml +19 -0
  531. parrot/yaml-rs/pyproject.toml +19 -0
  532. parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
  533. parrot/yaml-rs/src/lib.rs +222 -0
  534. requirements/docker-compose.yml +24 -0
  535. 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