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
@@ -0,0 +1,424 @@
1
+ """
2
+ Card Renderer for AI-Parrot
3
+ Displays metrics in HTML card format with comparisons (vs last month, vs last year, etc.)
4
+ """
5
+ from typing import Any, Optional, Tuple, Dict, List
6
+ import re
7
+ from . import register_renderer
8
+ from .base import BaseRenderer
9
+ from ...models.outputs import OutputMode
10
+
11
+
12
+ CARD_SYSTEM_PROMPT = """CARD METRIC OUTPUT MODE - CRITICAL INSTRUCTIONS:
13
+
14
+ Generate an HTML card displaying key metrics with comparisons.
15
+
16
+ **CRITICAL RULES:**
17
+ 1. The "explanation" can contain your analysis text
18
+ 2. Format the "value" field appropriately (e.g., "$29.58K", "20.94 minutes", "1,234 users")
19
+ 3. Include at least one comparison if historical data is available
20
+ - Comparison vs Previous Month (if data available)
21
+ - Comparison vs Previous Year (if data available)
22
+ 4. Use "increase" or "decrease" for trend direction
23
+ 5. Choose an appropriate icon: money, dollar, chart, percent, users, growth, target, star, trophy
24
+
25
+ Example: If calculating average for May 2025:
26
+ - Calculate May 2025 average
27
+ - Calculate April 2025 average (previous month)
28
+ - Calculate May 2024 average (previous year)
29
+ - Calculate percentage changes
30
+ - Include ALL in your data table
31
+
32
+ Your data table MUST have these rows:
33
+ | Metric | Value | Change | Trend |
34
+ | Current Period | [value] [unit] | - | - |
35
+ | vs Previous Month | [value] [unit] | +X.X% | increase/decrease |
36
+ | vs Previous Year | [value] [unit] | +X.X% | increase/decrease |
37
+
38
+ If previous data is not available, only include the current value row.
39
+ """
40
+
41
+
42
+ @register_renderer(OutputMode.CARD, system_prompt=CARD_SYSTEM_PROMPT)
43
+ class CardRenderer(BaseRenderer):
44
+ """
45
+ Renderer for metric cards with comparison data.
46
+ Extends BaseRenderer to display metrics in styled HTML cards.
47
+ """
48
+
49
+ CARD_TEMPLATE = """<!DOCTYPE html>
50
+ <html lang="en">
51
+ <head>
52
+ <meta charset="UTF-8">
53
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
54
+ <title>{title}</title>
55
+ <style>
56
+ .ap-card-wrapper {{
57
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
58
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
59
+ min-height: 100vh;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ padding: 20px;
64
+ box-sizing: border-box;
65
+ }}
66
+ .ap-card-wrapper * {{
67
+ box-sizing: border-box;
68
+ }}
69
+ .ap-card-container {{
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ gap: 24px;
73
+ max-width: 1200px;
74
+ width: 100%;
75
+ justify-content: center;
76
+ }}
77
+ .ap-metric-card {{
78
+ background: white;
79
+ border-radius: 16px;
80
+ padding: 28px 32px;
81
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);
82
+ min-width: 280px;
83
+ max-width: 400px;
84
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
85
+ }}
86
+ .ap-metric-card:hover {{
87
+ transform: translateY(-5px);
88
+ box-shadow: 0 15px 50px rgba(0, 0, 0, 0.2);
89
+ }}
90
+ .ap-card-header {{
91
+ display: flex;
92
+ justify-content: space-between;
93
+ align-items: center;
94
+ margin-bottom: 16px;
95
+ }}
96
+ .ap-card-title {{
97
+ font-size: 15px;
98
+ font-weight: 600;
99
+ color: #64748b;
100
+ text-transform: uppercase;
101
+ letter-spacing: 0.5px;
102
+ }}
103
+ .ap-card-icon {{
104
+ width: 48px;
105
+ height: 48px;
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ font-size: 24px;
110
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
111
+ border-radius: 12px;
112
+ color: white;
113
+ }}
114
+ .ap-card-value {{
115
+ font-size: 42px;
116
+ font-weight: 700;
117
+ color: #1e293b;
118
+ margin-bottom: 20px;
119
+ line-height: 1;
120
+ }}
121
+ .ap-comparisons {{
122
+ display: flex;
123
+ flex-direction: column;
124
+ gap: 12px;
125
+ }}
126
+ .ap-comparison-item {{
127
+ display: flex;
128
+ justify-content: space-between;
129
+ align-items: center;
130
+ padding: 10px 0;
131
+ border-top: 1px solid #f1f5f9;
132
+ }}
133
+ .ap-comparison-item:first-child {{
134
+ border-top: none;
135
+ padding-top: 0;
136
+ }}
137
+ .ap-comparison-period {{
138
+ font-size: 14px;
139
+ color: #64748b;
140
+ font-weight: 500;
141
+ }}
142
+ .ap-comparison-value {{
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 6px;
146
+ font-size: 16px;
147
+ font-weight: 700;
148
+ }}
149
+ .ap-comparison-value.increase {{ color: #10b981; }}
150
+ .ap-comparison-value.decrease {{ color: #ef4444; }}
151
+ .ap-trend-icon {{ font-size: 14px; }}
152
+ </style>
153
+ </head>
154
+ <body>
155
+ <div class="ap-card-wrapper">
156
+ <div class="ap-card-container">
157
+ {cards_html}
158
+ </div>
159
+ </div>
160
+ </body>
161
+ </html>
162
+ """
163
+
164
+ SINGLE_CARD_TEMPLATE = """
165
+ <div class="ap-metric-card">
166
+ <div class="ap-card-header">
167
+ <div class="ap-card-title">{title}</div>
168
+ {icon_html}
169
+ </div>
170
+ <div class="ap-card-value">{value}</div>
171
+ <div class="ap-comparisons">
172
+ {comparisons_html}
173
+ </div>
174
+ </div>
175
+ """
176
+
177
+ COMPARISON_ITEM_TEMPLATE = """
178
+ <div class="ap-comparison-item">
179
+ <span class="ap-comparison-period">{period}</span>
180
+ <div class="ap-comparison-value {trend}">
181
+ <span class="ap-trend-icon">{trend_icon}</span>
182
+ <span>{value}%</span>
183
+ </div>
184
+ </div>
185
+ """
186
+
187
+ ICON_MAP = {
188
+ 'money': '💰', 'dollar': '💵', 'chart': '📊', 'percent': '%',
189
+ 'users': '👥', 'growth': '📈', 'target': '🎯', 'time': '⏱️',
190
+ 'default': '📊'
191
+ }
192
+
193
+ def _extract_data(self, response: Any) -> Dict:
194
+ """Extract card data from AIMessage response"""
195
+ # Get the PandasAgentResponse from response.output or response.structured_output
196
+ output = None
197
+ if hasattr(response, 'output'):
198
+ output = response.output
199
+ elif hasattr(response, 'structured_output'):
200
+ output = response.structured_output
201
+ else:
202
+ output = response
203
+
204
+ # Extract explanation and data
205
+ explanation = ""
206
+ data_table = None
207
+
208
+ if hasattr(output, 'explanation'):
209
+ explanation = output.explanation
210
+
211
+ if hasattr(output, 'data'):
212
+ data_table = output.data
213
+
214
+ # Parse the explanation to extract metric info
215
+ card_data = self._parse_explanation_and_data(explanation, data_table)
216
+
217
+ return card_data
218
+
219
+ def _parse_explanation_and_data(self, explanation: str, data_table: Any) -> Dict:
220
+ """Parse explanation and data table to extract card information"""
221
+ # Extract main value from explanation
222
+ title = "Metric"
223
+ value = "N/A"
224
+ icon = "chart"
225
+ comparisons = []
226
+
227
+ # Try to extract value patterns
228
+ value_patterns = [
229
+ (r'(\d+\.?\d*)\s*minutes?', 'time', 'Average Time'),
230
+ (r'\$\s*(\d+[\d,]*\.?\d*[KMB]?)', 'money', 'Revenue'),
231
+ (r'(\d+[\d,]*\.?\d*)\s*users?', 'users', 'Users'),
232
+ (r'(\d+[\d,]*\.?\d*)%', 'percent', 'Percentage'),
233
+ (r'(\d+[\d,]*\.?\d*)', 'chart', 'Value'),
234
+ ]
235
+
236
+ for pattern, icon_type, title_type in value_patterns:
237
+ match = re.search(pattern, explanation, re.IGNORECASE)
238
+ if match:
239
+ value = match.group(0)
240
+ icon = icon_type
241
+ title = title_type
242
+ break
243
+
244
+ # Extract comparisons from explanation
245
+ # Look for patterns like "5.8% increase" or "15.1% decrease"
246
+ comparison_patterns = [
247
+ (r'(\d+\.?\d*)%\s+(increase|growth|higher)', 'increase'),
248
+ (r'(\d+\.?\d*)%\s+(decrease|decline|lower)', 'decrease'),
249
+ ]
250
+
251
+ periods = ["vs Previous Month", "vs Previous Year"]
252
+ period_idx = 0
253
+
254
+ for pattern, trend in comparison_patterns:
255
+ matches = re.finditer(pattern, explanation, re.IGNORECASE)
256
+ for match in matches:
257
+ if period_idx < len(periods):
258
+ comparisons.append({
259
+ "period": periods[period_idx],
260
+ "value": float(match.group(1)),
261
+ "trend": trend
262
+ })
263
+ period_idx += 1
264
+
265
+ # Also try to extract from data table if available
266
+ if data_table and hasattr(data_table, 'rows'):
267
+ rows = data_table.rows
268
+ if rows and len(rows) > 0:
269
+ # First row should be the main value
270
+ main_row = rows[0]
271
+ if len(main_row) >= 2:
272
+ # Try to get a better value from the table
273
+ table_value = str(main_row[1])
274
+ if table_value and table_value != 'Value':
275
+ # Check if we have units in column 2 or 3
276
+ if len(main_row) >= 3:
277
+ unit = str(main_row[2])
278
+ value = f"{table_value} {unit}" if unit not in ['Unit', ''] else table_value
279
+ else:
280
+ value = table_value
281
+
282
+ # Look for comparison rows (skip first row)
283
+ for row in rows[1:]:
284
+ # Handle both 3-column and 5-column tables
285
+ if len(row) >= 5:
286
+ # 5-column: metric, value, unit, change_percentage, trend
287
+ period_name = str(row[0])
288
+ change_pct = str(row[3])
289
+ trend_val = str(row[4]).lower()
290
+
291
+ # Skip if no change data
292
+ if change_pct in ['N/A', '', 'None']:
293
+ continue
294
+
295
+ # Clean up period name to create comparison label
296
+ # "April 2025 Average" -> "vs April 2025"
297
+ if 'vs' not in period_name.lower():
298
+ # Extract the month/year part
299
+ period_match = re.search(
300
+ r'(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{4})', # noqa
301
+ period_name,
302
+ re.IGNORECASE
303
+ )
304
+ if period_match:
305
+ period = f"vs {period_match[1]} {period_match[2]}"
306
+ else:
307
+ period = f"vs {period_name.replace(' Average', '')}"
308
+ else:
309
+ period = period_name
310
+
311
+ # Parse percentage
312
+ try:
313
+ percent = abs(float(change_pct))
314
+ trend = "decrease" if trend_val == 'decrease' or float(change_pct) < 0 else "increase"
315
+ comparisons.append({
316
+ "period": period,
317
+ "value": percent,
318
+ "trend": trend
319
+ })
320
+ except ValueError:
321
+ continue
322
+
323
+ elif len(row) >= 3:
324
+ # 3-column: Metric, Value, Change
325
+ period = str(row[0])
326
+ change_val = str(row[2])
327
+ # Extract percentage and trend
328
+ change_match = re.search(r'([+-]?\d+\.?\d*)%', change_val)
329
+ if change_match:
330
+ percent = abs(float(change_match.group(1)))
331
+ trend = "increase" if '+' in change_val or float(change_match.group(1)) > 0 else "decrease"
332
+ comparisons.append({
333
+ "period": period,
334
+ "value": percent,
335
+ "trend": trend
336
+ })
337
+
338
+ return {
339
+ "title": title,
340
+ "value": value,
341
+ "icon": icon,
342
+ "comparisons": comparisons
343
+ }
344
+
345
+ def _render_icon(self, icon: Optional[str] = None) -> str:
346
+ """Render icon HTML"""
347
+ if not icon:
348
+ return ''
349
+ icon_char = self.ICON_MAP.get(icon.lower(), self.ICON_MAP['default'])
350
+ return f'<div class="ap-card-icon">{icon_char}</div>'
351
+
352
+ def _render_comparison_items(self, comparisons: List[Dict]) -> str:
353
+ """Render comparison items HTML"""
354
+ if not comparisons:
355
+ return ''
356
+
357
+ items_html = []
358
+ for comp in comparisons:
359
+ period = comp.get('period', 'vs Previous')
360
+ value = comp.get('value', 0)
361
+ trend = comp.get('trend', 'increase').lower()
362
+ trend_icon = '▲' if trend == 'increase' else '▼'
363
+
364
+ item_html = self.COMPARISON_ITEM_TEMPLATE.format(
365
+ period=period,
366
+ value=abs(value),
367
+ trend=trend,
368
+ trend_icon=trend_icon
369
+ )
370
+ items_html.append(item_html)
371
+
372
+ return '\n'.join(items_html)
373
+
374
+ def _render_single_card(self, data: Dict) -> str:
375
+ """Render a single metric card"""
376
+ title = data.get('title', 'Metric')
377
+ value = data.get('value', 'N/A')
378
+ icon = data.get('icon')
379
+ comparisons = data.get('comparisons', [])
380
+
381
+ icon_html = self._render_icon(icon)
382
+ comparisons_html = self._render_comparison_items(comparisons)
383
+
384
+ return self.SINGLE_CARD_TEMPLATE.format(
385
+ title=title,
386
+ value=value,
387
+ icon_html=icon_html,
388
+ comparisons_html=comparisons_html
389
+ )
390
+
391
+ async def render(
392
+ self,
393
+ response: Any,
394
+ environment: str = 'html',
395
+ **kwargs
396
+ ) -> Tuple[str, str]:
397
+ """
398
+ Render card(s) as HTML.
399
+
400
+ Args:
401
+ response: AIMessage with PandasAgentResponse output
402
+ environment: Output environment (default: 'html')
403
+ **kwargs: Additional options
404
+
405
+ Returns:
406
+ Tuple[str, str]: (code, html_content)
407
+ """
408
+ # Extract data from AIMessage
409
+ code = response.code if hasattr(response, 'code') else ''
410
+ card_data = self._extract_data(response)
411
+
412
+ # Generate card HTML
413
+ cards_html = self._render_single_card(card_data)
414
+
415
+ # Determine title
416
+ page_title = card_data.get('title', 'Metric Card')
417
+
418
+ # Generate final HTML
419
+ html_content = self.CARD_TEMPLATE.format(
420
+ title=page_title,
421
+ cards_html=cards_html
422
+ )
423
+
424
+ return code, html_content