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/clients/grok.py ADDED
@@ -0,0 +1,432 @@
1
+ from typing import List, Dict, Any, Optional, Union, AsyncIterator
2
+ import os
3
+ import asyncio
4
+ import logging
5
+ import json
6
+ import uuid
7
+ from enum import Enum
8
+ from pathlib import Path
9
+ from dataclasses import is_dataclass
10
+ from pydantic import BaseModel, TypeAdapter
11
+
12
+ from xai_sdk import AsyncClient
13
+ from xai_sdk.chat import user, system, assistant
14
+
15
+ from .base import AbstractClient
16
+ from ..models import (
17
+ MessageResponse,
18
+ CompletionUsage,
19
+ AIMessage,
20
+ StructuredOutputConfig,
21
+ ToolCall,
22
+ OutputFormat
23
+ )
24
+ from ..tools.abstract import AbstractTool
25
+ from ..tools.manager import ToolFormat
26
+
27
+ class GrokModel(str, Enum):
28
+ """Grok model versions."""
29
+ GROK_4_FAST_REASONING = "grok-4-fast-reasoning"
30
+ GROK_4 = "grok-4"
31
+ GROK_4_1_FAST_NON_REASONING = "grok-4-1-fast-non-reasoning"
32
+ GROK_4_1_FAST_REASONING = "grok-4-1-fast-reasoning"
33
+ GROK_3_MINI = "gro-3-mini"
34
+ GROK_CODE_FAST_1 = "grok-code-fast-1"
35
+ GROK_2_IMAGE = "grok-2-image-1212"
36
+ GROK_2_VISION = "grok-2-vision-1212"
37
+
38
+ class GrokClient(AbstractClient):
39
+ """
40
+ Client for interacting with xAI's Grok models.
41
+ """
42
+ client_type: str = "xai"
43
+ client_name: str = "grok"
44
+ _default_model: str = GrokModel.GROK_4.value
45
+
46
+ def __init__(
47
+ self,
48
+ api_key: Optional[str] = None,
49
+ timeout: int = 3600,
50
+ **kwargs
51
+ ):
52
+ """
53
+ Initialize Grok client.
54
+
55
+ Args:
56
+ api_key: xAI API key (defaults to XAI_API_KEY env var)
57
+ timeout: Request timeout in seconds
58
+ **kwargs: Additional arguments for AbstractClient
59
+ """
60
+ super().__init__(**kwargs)
61
+ self.api_key = api_key or os.getenv("XAI_API_KEY")
62
+ if not self.api_key:
63
+ # Try to get from config if available
64
+ try:
65
+ from navconfig import config
66
+ self.api_key = config.get("XAI_API_KEY")
67
+ except ImportError:
68
+ pass
69
+
70
+ if not self.api_key:
71
+ raise ValueError("XAI_API_KEY not found in environment or config")
72
+
73
+ self.timeout = timeout
74
+ self.client: Optional[AsyncClient] = None
75
+
76
+ async def get_client(self) -> AsyncClient:
77
+ """Return the xAI AsyncClient instance."""
78
+ if not self.client:
79
+ self.client = AsyncClient(
80
+ api_key=self.api_key,
81
+ timeout=self.timeout
82
+ )
83
+ return self.client
84
+
85
+ async def close(self):
86
+ """Close the client connection."""
87
+ await super().close()
88
+ self.client = None
89
+
90
+ def _convert_messages(self, messages: List[Dict[str, Any]]) -> Any:
91
+ pass
92
+
93
+ def _prepare_structured_output_format(self, structured_output: type) -> dict:
94
+ """Prepare response format for structured output using full JSON schema."""
95
+ if not structured_output:
96
+ return {}
97
+
98
+ # Normalize instance → class
99
+ if isinstance(structured_output, BaseModel):
100
+ structured_output = structured_output.__class__
101
+ if is_dataclass(structured_output) and not isinstance(structured_output, type):
102
+ structured_output = structured_output.__class__
103
+
104
+ schema = None
105
+ name = "structured_output"
106
+
107
+ # Pydantic models
108
+ if isinstance(structured_output, type) and hasattr(structured_output, 'model_json_schema'):
109
+ schema = structured_output.model_json_schema()
110
+ name = structured_output.__name__.lower()
111
+ # Dataclasses
112
+ elif is_dataclass(structured_output):
113
+ schema = TypeAdapter(structured_output).json_schema()
114
+ name = structured_output.__name__.lower()
115
+
116
+ if schema:
117
+ return {
118
+ "response_format": {
119
+ "type": "json_schema",
120
+ "json_schema": {
121
+ "name": name,
122
+ "schema": schema,
123
+ "strict": True
124
+ }
125
+ }
126
+ }
127
+
128
+ # Fallback
129
+ return {"response_format": {"type": "json_object"}}
130
+
131
+ def _prepare_tools_for_grok(self) -> List[Dict[str, Any]]:
132
+ """Prepare tools using OpenAI format which is compatible with xAI."""
133
+ # Use ToolManager to get OpenAI formatted schemas
134
+ return self.tool_manager.get_tool_schemas(provider_format=ToolFormat.OPENAI)
135
+
136
+ async def ask(
137
+ self,
138
+ prompt: str,
139
+ model: str = None,
140
+ max_tokens: int = 4096,
141
+ temperature: float = 0.7,
142
+ files: Optional[List[Union[str, Path]]] = None,
143
+ system_prompt: Optional[str] = None,
144
+ structured_output: Union[type, StructuredOutputConfig, None] = None,
145
+ user_id: Optional[str] = None,
146
+ session_id: Optional[str] = None,
147
+ tools: Optional[List[Dict[str, Any]]] = None,
148
+ use_tools: Optional[bool] = None,
149
+ ) -> MessageResponse:
150
+ """
151
+ Send a prompt to Grok and return the response.
152
+ """
153
+ client = await self.get_client()
154
+ model = model or self.model or self.default_model
155
+ turn_id = str(uuid.uuid4())
156
+
157
+ # 1. Prepare Structured Output
158
+ response_format = None
159
+ output_config = None
160
+ if structured_output:
161
+ output_config = self._get_structured_config(structured_output)
162
+ if output_config and output_config.output_type:
163
+ fmt = self._prepare_structured_output_format(output_config.output_type)
164
+ if fmt:
165
+ response_format = fmt.get("response_format")
166
+ elif isinstance(structured_output, (type, BaseModel)) or is_dataclass(structured_output):
167
+ fmt = self._prepare_structured_output_format(structured_output)
168
+ if fmt:
169
+ response_format = fmt.get("response_format")
170
+
171
+ # 2. Prepare Tools
172
+ _use_tools = use_tools if use_tools is not None else self.enable_tools
173
+ prepared_tools = []
174
+ if _use_tools:
175
+ if tools:
176
+ # TODO: Normalize manual tools if needed, assuming OpenAI format for now
177
+ prepared_tools = tools
178
+ else:
179
+ prepared_tools = self._prepare_tools_for_grok()
180
+
181
+ # 3. Initialize Chat
182
+ chat_kwargs = {
183
+ "model": model,
184
+ "max_tokens": max_tokens,
185
+ "temperature": temperature
186
+ }
187
+ if response_format:
188
+ chat_kwargs["response_format"] = response_format
189
+
190
+ if prepared_tools:
191
+ chat_kwargs['tools'] = prepared_tools
192
+ chat_kwargs['tool_choice'] = "auto"
193
+
194
+ # Note: xAI SDK stateful 'chat' object might be tricky for tool loops + structured output
195
+ # if we need to modify 'messages' manually.
196
+ # Using chat.create() creates a new conversation container.
197
+ chat = client.chat.create(**chat_kwargs)
198
+
199
+ # 4. Add Context (System, History, User)
200
+ if system_prompt:
201
+ chat.append(system(system_prompt))
202
+
203
+ if self.conversation_memory and user_id and session_id:
204
+ history = await self.get_conversation(user_id, session_id)
205
+ if history:
206
+ for turn in history.turns:
207
+ chat.append(user(turn.input))
208
+ if turn.output:
209
+ chat.append(assistant(turn.output))
210
+
211
+ chat.append(user(prompt))
212
+
213
+ # 5. Execution Loop (Tools)
214
+ final_response = None
215
+ all_tool_calls = []
216
+
217
+ # Limit loops to prevent infinite recursion
218
+ max_turns = 10
219
+ current_turn = 0
220
+
221
+ while current_turn < max_turns:
222
+ current_turn += 1
223
+
224
+ try:
225
+ # Execute request
226
+ response = await chat.sample()
227
+
228
+ # Check for tools
229
+ # xAI SDK response object structure for tool calls needs verification.
230
+ # Assuming standard OpenAI-like or SDK specific attribute.
231
+ # Looking at xai_sdk/chat.py source or behavior would be ideal.
232
+ # Based on `GrokClient` previous implementation attempt and standard patterns:
233
+ # response.tool_calls might exist if using `tool_choice`.
234
+
235
+ # If the SDK handles tool execution automatically, we might not need this loop?
236
+ # Usually client SDKs don't auto-execute.
237
+
238
+ tool_calls = getattr(response, 'tool_calls', [])
239
+ if not tool_calls and hasattr(response, 'message'):
240
+ # Check nested message object if present
241
+ tool_calls = getattr(response.message, 'tool_calls', [])
242
+
243
+ # If no tool calls, we are done
244
+ if not tool_calls:
245
+ final_response = response
246
+ break
247
+
248
+ # Handle Tool Calls
249
+ # response should be added to chat?
250
+ # The SDK might auto-append the assistants reply to its internal history
251
+ # if we use `chat.sample()`?
252
+ # Wait, `chat` is a stateful object. `chat.sample()` returns a response
253
+ # AND likely updates internal state?
254
+ # Let's assume `chat` object maintains state.
255
+ # If we need to add the tool result, we likely check `chat` methods.
256
+ # `chat.append` takes a message.
257
+ # We need to append the tool result.
258
+
259
+ # For each tool call:
260
+ for tc in tool_calls:
261
+ fn = tc.function
262
+ tool_name = fn.name
263
+ tool_args_str = fn.arguments
264
+ tool_id = tc.id
265
+
266
+ try:
267
+ tool_args = json.loads(tool_args_str)
268
+ except json.JSONDecodeError:
269
+ # Try cleaning or fallback
270
+ tool_args = {}
271
+
272
+ # Execute
273
+ tool_exec_result = await self._execute_tool(tool_name, tool_args)
274
+
275
+ # Create ToolCall record for AIMessage
276
+ tool_call_rec = ToolCall(
277
+ id=tool_id,
278
+ name=tool_name,
279
+ arguments=tool_args,
280
+ result=tool_exec_result
281
+ )
282
+ all_tool_calls.append(tool_call_rec)
283
+
284
+ # Append result to chat
285
+ # xAI SDK likely has a `tool` message type
286
+ from xai_sdk.chat import tool_result as ToolResultMsg
287
+ msg = ToolResultMsg(str(tool_exec_result))
288
+ # xAI SDK proto does not have tool_call_id, assuming name or order maps it.
289
+ # Using name field for tool_call_id as best guess for OpenAI compatibility
290
+ msg.name = tool_id
291
+ chat.append(msg)
292
+
293
+ # Loop continues to next sample()
294
+ continue
295
+
296
+ except Exception as e:
297
+ self.logger.error(f"Error in GrokClient loop: {e}")
298
+ # If failure, break and return what we have or re-raise
299
+ raise
300
+
301
+ # 6. Parse Final Response
302
+ if not final_response:
303
+ # Should not happen unless max_turns hit without final response
304
+ # Just return last response
305
+ final_response = response
306
+
307
+ # Local import to avoid circular dependency
308
+ from ..models.responses import AIMessageFactory
309
+
310
+ # Parse structured output if native handling didn't yield an object
311
+ # (xAI SDK might return object if response_format was used? or just JSON string)
312
+ # Assuming JSON string for safely.
313
+ text_content = final_response.content if hasattr(final_response, 'content') else str(final_response)
314
+
315
+ structured_payload = None
316
+ if output_config:
317
+ try:
318
+ # If response_format was used, text_content should be JSON
319
+ if output_config.custom_parser:
320
+ structured_payload = output_config.custom_parser(text_content)
321
+ else:
322
+ structured_payload = await self._parse_structured_output(text_content, output_config)
323
+ except Exception:
324
+ # If parsing failed, keep as text
325
+ pass
326
+
327
+ ai_message = AIMessageFactory.create_message(
328
+ response=final_response,
329
+ input_text=prompt,
330
+ model=model,
331
+ user_id=user_id,
332
+ session_id=session_id,
333
+ usage=CompletionUsage.from_grok(final_response.usage) if hasattr(final_response, 'usage') else None,
334
+ text_response=text_content
335
+ )
336
+
337
+ ai_message.tool_calls = all_tool_calls
338
+ if structured_payload:
339
+ ai_message.structured_output = structured_payload
340
+ ai_message.is_structured = True
341
+ ai_message.output = structured_payload # Swap if structured is primary
342
+
343
+ if user_id and session_id:
344
+ await self.conversation_memory.add_turn(
345
+ user_id,
346
+ session_id,
347
+ prompt,
348
+ ai_message.to_text,
349
+ metadata=ai_message.usage.dict() if ai_message.usage else None
350
+ )
351
+
352
+ return ai_message
353
+
354
+ async def ask_stream(
355
+ self,
356
+ prompt: str,
357
+ model: str = None,
358
+ max_tokens: int = 4096,
359
+ temperature: float = 0.7,
360
+ files: Optional[List[Union[str, Path]]] = None,
361
+ system_prompt: Optional[str] = None,
362
+ structured_output: Union[type, StructuredOutputConfig, None] = None,
363
+ user_id: Optional[str] = None,
364
+ session_id: Optional[str] = None,
365
+ tools: Optional[List[Dict[str, Any]]] = None
366
+ ) -> AsyncIterator[str]:
367
+ """
368
+ Stream response from Grok.
369
+ """
370
+ client = await self.get_client()
371
+ model = model or self.model or self.default_model
372
+
373
+ chat_kwargs = {
374
+ "model": model,
375
+ "max_tokens": max_tokens,
376
+ "temperature": temperature,
377
+ "stream": True
378
+ }
379
+
380
+ if structured_output:
381
+ config = self._get_structured_config(structured_output)
382
+ if config:
383
+ if output_config and output_config.output_type:
384
+ fmt = self._prepare_structured_output_format(output_config.output_type)
385
+ if fmt:
386
+ chat_kwargs["response_format"] = fmt.get("response_format")
387
+ elif isinstance(structured_output, (type, BaseModel)) or is_dataclass(structured_output):
388
+ fmt = self._prepare_structured_output_format(structured_output)
389
+ if fmt:
390
+ chat_kwargs["response_format"] = fmt.get("response_format")
391
+
392
+ chat = client.chat.create(**chat_kwargs)
393
+
394
+ if system_prompt:
395
+ chat.append(system(system_prompt))
396
+
397
+ if self.conversation_memory and user_id and session_id:
398
+ history = await self.get_conversation(user_id, session_id)
399
+ if history:
400
+ for turn in history.turns:
401
+ chat.append(user(turn.input))
402
+ if turn.output:
403
+ chat.append(assistant(turn.output))
404
+
405
+ chat.append(user(prompt))
406
+
407
+ full_response = []
408
+
409
+ async for token in chat.stream():
410
+ content = token
411
+ if hasattr(token, 'choices'):
412
+ delta = token.choices[0].delta
413
+ if hasattr(delta, 'content'):
414
+ content = delta.content
415
+ elif hasattr(token, 'content'):
416
+ content = token.content
417
+
418
+ if content:
419
+ full_response.append(content)
420
+ yield content
421
+
422
+ if user_id and session_id:
423
+ await self.conversation_memory.add_turn(
424
+ user_id,
425
+ session_id,
426
+ prompt,
427
+ "".join(full_response)
428
+ )
429
+
430
+ async def batch_ask(self, requests: List[Any]) -> List[Any]:
431
+ """Batch processing not yet implemented for Grok."""
432
+ raise NotImplementedError("Batch processing not supported for Grok yet")