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,209 @@
1
+
2
+ from typing import List, Dict, Any, Optional
3
+ from dataclasses import dataclass, field
4
+ from datetime import datetime
5
+ from abc import ABC, abstractmethod
6
+ from datamodel.parsers.json import JSONContent # pylint: disable=E0611 # noqa
7
+ from navconfig.logging import logging
8
+
9
+
10
+ @dataclass
11
+ class ConversationTurn:
12
+ """Represents a single turn in a conversation."""
13
+ turn_id: str
14
+ user_id: str
15
+ user_message: str
16
+ assistant_response: str
17
+ context_used: Optional[str] = None
18
+ tools_used: List[str] = field(default_factory=list)
19
+ timestamp: datetime = field(default_factory=datetime.now)
20
+ metadata: Dict[str, Any] = field(default_factory=dict)
21
+
22
+ def to_dict(self) -> Dict[str, Any]:
23
+ """Serialize turn to dictionary."""
24
+ return {
25
+ 'turn_id': self.turn_id,
26
+ 'user_id': self.user_id,
27
+ 'user_message': self.user_message,
28
+ 'assistant_response': self.assistant_response,
29
+ 'context_used': self.context_used,
30
+ 'tools_used': self.tools_used,
31
+ 'timestamp': self.timestamp.isoformat(),
32
+ 'metadata': self.metadata
33
+ }
34
+
35
+ @classmethod
36
+ def from_dict(cls, data: Dict[str, Any]) -> 'ConversationTurn':
37
+ """Deserialize turn from dictionary."""
38
+ return cls(
39
+ turn_id=data['turn_id'],
40
+ user_id=data['user_id'],
41
+ user_message=data['user_message'],
42
+ assistant_response=data['assistant_response'],
43
+ context_used=data.get('context_used'),
44
+ tools_used=data.get('tools_used', []),
45
+ timestamp=datetime.fromisoformat(data['timestamp']),
46
+ metadata=data.get('metadata', {})
47
+ )
48
+
49
+
50
+ @dataclass
51
+ class ConversationHistory:
52
+ """Manages conversation history for a session - replaces ConversationSession."""
53
+ session_id: str
54
+ user_id: str
55
+ chatbot_id: Optional[str] = None
56
+ turns: List[ConversationTurn] = field(default_factory=list)
57
+ created_at: datetime = field(default_factory=datetime.now)
58
+ updated_at: datetime = field(default_factory=datetime.now)
59
+ metadata: Dict[str, Any] = field(default_factory=dict)
60
+
61
+ def add_turn(self, turn: ConversationTurn) -> None:
62
+ """Add a new turn to the conversation history."""
63
+ self.turns.append(turn)
64
+ self.updated_at = datetime.now()
65
+
66
+ def get_recent_turns(self, count: int = 5) -> List[ConversationTurn]:
67
+ """Get the most recent turns for context."""
68
+ return self.turns[-count:] if count > 0 else self.turns
69
+
70
+ def get_messages_for_api(self, model: str = 'claude') -> List[Dict[str, Any]]:
71
+ """Convert turns to API message format for LLM Model."""
72
+ messages = []
73
+ if model == 'claude':
74
+ # Claude expects messages in a specific format
75
+ for turn in self.turns:
76
+ messages.append({
77
+ "role": "user",
78
+ "content": turn.user_message
79
+ })
80
+ messages.append({
81
+ "role": "assistant",
82
+ "content": turn.assistant_response
83
+ })
84
+ else:
85
+ # Default format for other models
86
+ # This can be adjusted based on the specific model requirements
87
+ for turn in self.turns:
88
+ # Add user message
89
+ messages.append({
90
+ "role": "user",
91
+ "content": [{"type": "text", "text": turn.user_message}]
92
+ })
93
+ # Add assistant response
94
+ messages.append({
95
+ "role": "assistant",
96
+ "content": [{"type": "text", "text": turn.assistant_response}]
97
+ })
98
+ return messages
99
+
100
+ def clear_turns(self) -> None:
101
+ """Clear all turns from the conversation history."""
102
+ self.turns.clear()
103
+ self.updated_at = datetime.now()
104
+
105
+ def to_dict(self) -> Dict[str, Any]:
106
+ """Serialize conversation history to dictionary."""
107
+ return {
108
+ 'session_id': self.session_id,
109
+ 'user_id': self.user_id,
110
+ 'chatbot_id': self.chatbot_id,
111
+ 'turns': [turn.to_dict() for turn in self.turns],
112
+ 'created_at': self.created_at.isoformat(),
113
+ 'updated_at': self.updated_at.isoformat(),
114
+ 'metadata': self.metadata
115
+ }
116
+
117
+ @classmethod
118
+ def from_dict(cls, data: Dict[str, Any]) -> 'ConversationHistory':
119
+ """Deserialize conversation history from dictionary."""
120
+ history = cls(
121
+ session_id=data['session_id'],
122
+ user_id=data['user_id'],
123
+ chatbot_id=data.get('chatbot_id'),
124
+ created_at=datetime.fromisoformat(data['created_at']),
125
+ updated_at=datetime.fromisoformat(data['updated_at']),
126
+ metadata=data.get('metadata', {})
127
+ )
128
+
129
+ for turn_data in data.get('turns', []):
130
+ turn = ConversationTurn.from_dict(turn_data)
131
+ history.turns.append(turn)
132
+
133
+ return history
134
+
135
+ class ConversationMemory(ABC):
136
+ """Abstract base class for conversation memory storage."""
137
+
138
+ def __init__(self, debug: bool = False):
139
+ self.logger = logging.getLogger(
140
+ f"parrot.Memory.{self.__class__.__name__}"
141
+ )
142
+ self._json = JSONContent()
143
+ self.debug = debug
144
+
145
+ @abstractmethod
146
+ async def create_history(
147
+ self,
148
+ user_id: str,
149
+ session_id: str,
150
+ metadata: Optional[Dict[str, Any]] = None,
151
+ chatbot_id: Optional[str] = None
152
+ ) -> ConversationHistory:
153
+ """Create a new conversation history."""
154
+ pass
155
+
156
+ @abstractmethod
157
+ async def get_history(
158
+ self,
159
+ user_id: str,
160
+ session_id: str,
161
+ chatbot_id: Optional[str] = None
162
+ ) -> Optional[ConversationHistory]:
163
+ """Get a conversation history."""
164
+ pass
165
+
166
+ @abstractmethod
167
+ async def update_history(self, history: ConversationHistory) -> None:
168
+ """Update a conversation history."""
169
+ pass
170
+
171
+ @abstractmethod
172
+ async def add_turn(
173
+ self,
174
+ user_id: str,
175
+ session_id: str,
176
+ turn: ConversationTurn,
177
+ chatbot_id: Optional[str] = None
178
+ ) -> None:
179
+ """Add a turn to the conversation."""
180
+ pass
181
+
182
+ @abstractmethod
183
+ async def clear_history(
184
+ self,
185
+ user_id: str,
186
+ session_id: str,
187
+ chatbot_id: Optional[str] = None
188
+ ) -> None:
189
+ """Clear a conversation history."""
190
+ pass
191
+
192
+ @abstractmethod
193
+ async def list_sessions(
194
+ self,
195
+ user_id: str,
196
+ chatbot_id: Optional[str] = None
197
+ ) -> List[str]:
198
+ """List all session IDs for a user."""
199
+ pass
200
+
201
+ @abstractmethod
202
+ async def delete_history(
203
+ self,
204
+ user_id: str,
205
+ session_id: str,
206
+ chatbot_id: Optional[str] = None
207
+ ) -> bool:
208
+ """Delete a conversation history entirely."""
209
+ pass
parrot/memory/agent.py ADDED
@@ -0,0 +1,32 @@
1
+ """Simple in-memory storage for agent interactions keyed by turn_id."""
2
+
3
+ import asyncio
4
+ from typing import Any, Dict, Optional
5
+
6
+
7
+ class AgentMemory:
8
+ """Store and retrieve agent interactions by turn identifier."""
9
+
10
+ def __init__(self, agent_id: str) -> None:
11
+ self.agent_id = agent_id
12
+ self._interactions: Dict[str, Dict[str, Any]] = {self.agent_id: {}}
13
+ self._lock = asyncio.Lock()
14
+
15
+ async def store_interaction(self, turn_id: str, question: str, answer: Any) -> None:
16
+ """Persist a question/answer pair under the provided turn identifier."""
17
+ if not turn_id:
18
+ raise ValueError("turn_id is required to store an interaction")
19
+
20
+ async with self._lock:
21
+ self._interactions[self.agent_id][turn_id] = {
22
+ "question": question,
23
+ "answer": answer,
24
+ }
25
+
26
+ async def get(self, turn_id: str) -> Optional[Dict[str, Any]]:
27
+ """Retrieve a stored interaction by turn identifier."""
28
+ if not turn_id:
29
+ return None
30
+
31
+ async with self._lock:
32
+ return self._interactions.get(self.agent_id, {}).get(turn_id)
parrot/memory/cache.py ADDED
@@ -0,0 +1,175 @@
1
+ from typing import Any, Optional, Callable, TypeVar, ParamSpec
2
+ from functools import wraps
3
+ from abc import ABC
4
+ import asyncio
5
+ import hashlib
6
+ import inspect
7
+ import redis.asyncio as aioredis
8
+ from datamodel.parsers.json import json_encoder, json_decoder # pylint: disable=E0611 # noqa
9
+ from ..conf import REDIS_URL
10
+
11
+
12
+ P = ParamSpec('P')
13
+ T = TypeVar('T')
14
+
15
+
16
+ class CacheMixin(ABC):
17
+ """Mixin to add caching capabilities using Redis."""
18
+
19
+ def __init__(self, redis_url: str = None, **kwargs):
20
+ # Redis connection for caching
21
+ self.redis = aioredis.from_url(
22
+ redis_url or REDIS_URL,
23
+ encoding="utf-8",
24
+ decode_responses=True
25
+ )
26
+ self.default_ttl = kwargs.get('default_ttl', 3600)
27
+ self.key_prefix = "hierarchy:"
28
+
29
+ def _generate_cache_key(self, query_type: str, **params) -> str:
30
+ """
31
+ Generate a unique cache key based on the query type and parameters.
32
+ """
33
+ # Ordenar params para consistencia
34
+ sorted_params = json_encoder(params)
35
+ param_hash = hashlib.md5(sorted_params.encode()).hexdigest()
36
+ return f"{self.key_prefix}{query_type}:{param_hash}"
37
+
38
+ async def get(self, query_type: str, **params) -> Optional[Any]:
39
+ """
40
+ Get a cached value from Redis based on the query type and parameters.
41
+ """
42
+ key = self._generate_cache_key(query_type, **params)
43
+
44
+ try:
45
+ return json_decoder(cached) if (cached := await self.redis.get(key)) else None
46
+ except Exception as e:
47
+ print(f"Cache error (get): {e}")
48
+ return None
49
+
50
+ async def set(
51
+ self,
52
+ query_type: str,
53
+ value: Any,
54
+ ttl: Optional[int] = None,
55
+ **params
56
+ ):
57
+ """
58
+ Save result to cache with TTL (async).
59
+ """
60
+ key = self._generate_cache_key(query_type, **params)
61
+ ttl = ttl or self.default_ttl
62
+
63
+ try:
64
+ await self.redis.setex(
65
+ key,
66
+ ttl,
67
+ json_encoder(value)
68
+ )
69
+ except Exception as e:
70
+ print(f"Cache error (set): {e}")
71
+
72
+ async def invalidate_cache(self, object_oid: str):
73
+ """
74
+ Invalidate cache related to an object (async).
75
+ """
76
+ pattern = f"{self.key_prefix}*{object_oid}*"
77
+
78
+ try:
79
+ # Use scan_iter to avoid blocking
80
+ keys = []
81
+ async for key in self.redis.scan_iter(match=pattern):
82
+ keys.append(key)
83
+
84
+ if keys:
85
+ await self.redis.delete(*keys)
86
+ print(
87
+ f"Invalidated {len(keys)} keys for {object_oid}"
88
+ )
89
+ except Exception as e:
90
+ print(f"Cache error (invalidate): {e}")
91
+
92
+ async def clear_all(self):
93
+ """Clear all hierarchy cache (async)."""
94
+ pattern = f"{self.key_prefix}*"
95
+
96
+ try:
97
+ keys = []
98
+ async for key in self.redis.scan_iter(match=pattern):
99
+ keys.append(key)
100
+
101
+ if keys:
102
+ await self.redis.delete(*keys)
103
+ print(f"Cleared {len(keys)} cache keys")
104
+ except Exception as e:
105
+ print(f"Cache error (clear): {e}")
106
+
107
+
108
+ def cached_query(
109
+ query_type: str,
110
+ ttl: Optional[int] = None
111
+ ) -> Callable[[Callable[P, asyncio.Future[T]]], Callable[P, asyncio.Future[T]]]:
112
+ """
113
+ Decorator to cache the result of async methods in classes
114
+ that inherit from CacheMixin.
115
+
116
+ Usage:
117
+ ```python
118
+ @cached_query("get_superiors", ttl=600)
119
+ def get_all_superiors(self, employee_oid: str):
120
+ ...
121
+ ```
122
+ """
123
+
124
+ def decorator(
125
+ func: Callable[P, asyncio.Future[T]]
126
+ ) -> Callable[P, asyncio.Future[T]]:
127
+ @wraps(func)
128
+ async def wrapper(
129
+ self: CacheMixin,
130
+ *args: P.args,
131
+ **kwargs: P.kwargs
132
+ ) -> T:
133
+
134
+ # Build cache parameters
135
+ sig = inspect.signature(func)
136
+ param_names = list(sig.parameters.keys())[1:] # Skip 'self'
137
+
138
+ cache_params = kwargs.copy()
139
+ for i, arg in enumerate(args):
140
+ if i < len(param_names):
141
+ cache_params[param_names[i]] = arg # ✅ Mapping arg → param name
142
+
143
+ # Attempt to get from cache
144
+ cached_result = await self.get(
145
+ query_type,
146
+ **cache_params
147
+ )
148
+ if cached_result is not None:
149
+ return cached_result
150
+
151
+ # Call the original function
152
+ if asyncio.iscoroutinefunction(func):
153
+ result = await func(self, *args, **kwargs)
154
+ else:
155
+ # executing sync method in thread pool
156
+ loop = asyncio.get_running_loop()
157
+ result = await loop.run_in_executor(
158
+ None, lambda: func(self, *args, **kwargs)
159
+ )
160
+
161
+ # Save to cache, fire and forget:
162
+ asyncio.create_task(
163
+ self.set(
164
+ query_type,
165
+ result,
166
+ ttl,
167
+ **cache_params
168
+ )
169
+ )
170
+
171
+ return result
172
+
173
+ return wrapper
174
+
175
+ return decorator