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,553 @@
1
+ """
2
+ RESTTool - A tool for calling REST APIs with natural language interface.
3
+ """
4
+ from typing import Dict, Any, Optional, Union, Type, List
5
+ from pathlib import Path
6
+ from pydantic import BaseModel, Field, create_model
7
+ from ..interfaces.http import HTTPService
8
+ from .abstract import AbstractTool, AbstractToolArgsSchema, ToolResult
9
+
10
+
11
+ class RESTArgsSchema(AbstractToolArgsSchema):
12
+ """Base schema for REST API calls."""
13
+ endpoint: str = Field(
14
+ description="The API endpoint to call (e.g., 'get_batch', 'users/list')"
15
+ )
16
+ method: str = Field(
17
+ default="GET",
18
+ description="HTTP method to use (GET, POST, PUT, DELETE, PATCH)"
19
+ )
20
+ params: Optional[Dict[str, Any]] = Field(
21
+ default=None,
22
+ description="Query parameters for GET requests"
23
+ )
24
+ data: Optional[Dict[str, Any]] = Field(
25
+ default=None,
26
+ description="Body data for POST/PUT/PATCH requests"
27
+ )
28
+ headers: Optional[Dict[str, str]] = Field(
29
+ default=None,
30
+ description="Additional HTTP headers"
31
+ )
32
+
33
+
34
+ class RESTTool(AbstractTool):
35
+ """
36
+ Base class for creating REST API tools.
37
+
38
+ This tool allows LLMs to call REST APIs with natural language instructions like:
39
+ - "please, run via GET get_batch for batch_id=xyz"
40
+ - "create a new user with POST to /users endpoint"
41
+ - "update user 123 with PUT"
42
+
43
+ The tool automatically:
44
+ - Composes URLs from base_url + endpoint
45
+ - Handles JSON inputs/outputs
46
+ - Supports all HTTP methods
47
+ - Provides retry logic via HTTPService
48
+ - Returns structured responses
49
+
50
+ Example:
51
+ class MyAPITool(RESTTool):
52
+ name = "my_api"
53
+ description = "Tool for accessing MyAPI service"
54
+ base_url = "https://api.example.com/v1"
55
+
56
+ # Usage by LLM
57
+ result = await tool.run(
58
+ endpoint="users/123",
59
+ method="GET"
60
+ )
61
+ """
62
+
63
+ name: str = "rest_api"
64
+ description: str = "Call REST API endpoints"
65
+ args_schema: Type[BaseModel] = RESTArgsSchema
66
+
67
+ # Class-level configuration
68
+ base_url: str = None
69
+ default_headers: Dict[str, str] = {}
70
+ use_auth: bool = True
71
+ auth_header_name: str = "Authorization"
72
+ auth_token_prefix: str = "Bearer"
73
+
74
+ def __init__(
75
+ self,
76
+ base_url: Optional[str] = None,
77
+ api_key: Optional[str] = None,
78
+ credentials: Optional[Dict[str, str]] = None,
79
+ use_http2: bool = False,
80
+ use_proxy: bool = False,
81
+ timeout: int = 30,
82
+ debug: bool = False,
83
+ **kwargs
84
+ ):
85
+ """
86
+ Initialize REST tool.
87
+
88
+ Args:
89
+ base_url: Base URL for the API (e.g., "https://api.example.com/v1")
90
+ api_key: API key for authentication
91
+ credentials: Dictionary with authentication credentials
92
+ use_http2: Enable HTTP/2
93
+ use_proxy: Enable proxy usage
94
+ timeout: Request timeout in seconds
95
+ debug: Enable debug logging
96
+ **kwargs: Additional arguments passed to AbstractTool
97
+ """
98
+ super().__init__(**kwargs)
99
+
100
+ # Override base_url if provided
101
+ if base_url:
102
+ self.base_url = base_url
103
+
104
+ if not self.base_url:
105
+ raise ValueError("base_url must be provided either as class attribute or __init__ parameter")
106
+
107
+ # Setup authentication
108
+ credentials = credentials or {}
109
+ if api_key:
110
+ credentials['apikey'] = api_key
111
+
112
+ # Prepare headers
113
+ headers = self.default_headers.copy()
114
+ headers.update(kwargs.pop('headers', {}))
115
+
116
+ # Initialize HTTP service
117
+ self.http_service = HTTPService(
118
+ accept='application/json',
119
+ headers=headers,
120
+ credentials=credentials,
121
+ use_http2=use_http2,
122
+ use_proxy=use_proxy,
123
+ timeout=timeout,
124
+ debug=debug,
125
+ **kwargs
126
+ )
127
+ self._debug = debug
128
+
129
+ def _build_url(self, endpoint: str, params: Optional[Dict[str, Any]] = None) -> str:
130
+ """
131
+ Build complete URL from base_url and endpoint.
132
+
133
+ Args:
134
+ endpoint: API endpoint (e.g., "get_batch", "users/123")
135
+ params: Optional query parameters
136
+
137
+ Returns:
138
+ Complete URL
139
+ """
140
+ # Remove leading slash from endpoint if present
141
+ endpoint = endpoint.lstrip('/')
142
+
143
+ # Combine base_url and endpoint
144
+ url = f"{self.base_url.rstrip('/')}/{endpoint}"
145
+
146
+ # Add query parameters if provided
147
+ if params:
148
+ url = self.http_service.build_url(url, params=params)
149
+
150
+ if self._debug:
151
+ self.logger.debug(f"Built URL: {url}")
152
+
153
+ return url
154
+
155
+ def _prepare_request(
156
+ self,
157
+ endpoint: str,
158
+ method: str = "GET",
159
+ params: Optional[Dict[str, Any]] = None,
160
+ data: Optional[Dict[str, Any]] = None,
161
+ headers: Optional[Dict[str, str]] = None
162
+ ) -> Dict[str, Any]:
163
+ """
164
+ Prepare request parameters.
165
+
166
+ Args:
167
+ endpoint: API endpoint
168
+ method: HTTP method
169
+ params: Query parameters
170
+ data: Request body data
171
+ headers: Additional headers
172
+
173
+ Returns:
174
+ Dictionary with request parameters
175
+ """
176
+ method = method.upper()
177
+ url = self._build_url(endpoint, params)
178
+
179
+ request_kwargs = {
180
+ "url": url,
181
+ "method": method,
182
+ "headers": headers or {},
183
+ }
184
+
185
+ # For GET/DELETE, params go in URL (already handled)
186
+ # For POST/PUT/PATCH, data goes in body
187
+ if method in ['POST', 'PUT', 'PATCH'] and data:
188
+ request_kwargs["data"] = data
189
+ request_kwargs["use_json"] = True
190
+
191
+ return request_kwargs
192
+
193
+ async def _make_request(
194
+ self,
195
+ endpoint: str,
196
+ method: str = "GET",
197
+ params: Optional[Dict[str, Any]] = None,
198
+ data: Optional[Dict[str, Any]] = None,
199
+ headers: Optional[Dict[str, str]] = None
200
+ ) -> ToolResult:
201
+ """
202
+ Make HTTP request and return structured result.
203
+
204
+ Args:
205
+ endpoint: API endpoint
206
+ method: HTTP method
207
+ params: Query parameters
208
+ data: Request body
209
+ headers: Additional headers
210
+
211
+ Returns:
212
+ ToolResult with response data or error
213
+ """
214
+ try:
215
+ # Prepare request
216
+ request_kwargs = self._prepare_request(
217
+ endpoint=endpoint,
218
+ method=method,
219
+ params=params,
220
+ data=data,
221
+ headers=headers
222
+ )
223
+
224
+ # Make request using httpx (default client)
225
+ result, error = await self.http_service.request(
226
+ client='httpx',
227
+ **request_kwargs
228
+ )
229
+
230
+ if error:
231
+ return ToolResult(
232
+ status="error",
233
+ result=None,
234
+ error=str(error),
235
+ metadata={
236
+ "endpoint": endpoint,
237
+ "method": method
238
+ }
239
+ )
240
+
241
+ return ToolResult(
242
+ status="success",
243
+ result=result,
244
+ error=None,
245
+ metadata={
246
+ "endpoint": endpoint,
247
+ "method": method,
248
+ "url": request_kwargs["url"]
249
+ }
250
+ )
251
+
252
+ except Exception as e:
253
+ self.logger.error(f"Request failed: {e}")
254
+ return ToolResult(
255
+ status="error",
256
+ result=None,
257
+ error=str(e),
258
+ metadata={
259
+ "endpoint": endpoint,
260
+ "method": method
261
+ }
262
+ )
263
+
264
+ async def _execute(
265
+ self,
266
+ endpoint: str,
267
+ method: str = "GET",
268
+ params: Optional[Dict[str, Any]] = None,
269
+ data: Optional[Dict[str, Any]] = None,
270
+ headers: Optional[Dict[str, str]] = None,
271
+ **kwargs
272
+ ) -> ToolResult:
273
+ """
274
+ Execute the REST API call.
275
+
276
+ This is the main method called by the LLM when using this tool.
277
+
278
+ Args:
279
+ endpoint: API endpoint to call
280
+ method: HTTP method (GET, POST, PUT, DELETE, PATCH)
281
+ params: Query parameters (for GET)
282
+ data: Body data (for POST/PUT/PATCH)
283
+ headers: Additional headers
284
+ **kwargs: Additional arguments
285
+
286
+ Returns:
287
+ ToolResult with API response
288
+ """
289
+ return await self._make_request(
290
+ endpoint=endpoint,
291
+ method=method,
292
+ params=params,
293
+ data=data,
294
+ headers=headers
295
+ )
296
+
297
+ def get_tool_schema(self) -> Dict[str, Any]:
298
+ """
299
+ Get the JSON schema for this tool.
300
+
301
+ Returns:
302
+ Tool schema in the format expected by LLMs
303
+ """
304
+ # Get base schema from args_schema
305
+ if self.args_schema:
306
+ schema = self.args_schema.model_json_schema()
307
+ else:
308
+ schema = {
309
+ "type": "object",
310
+ "properties": {},
311
+ "required": []
312
+ }
313
+
314
+ return {
315
+ "name": self.name,
316
+ "description": self.description,
317
+ "parameters": schema
318
+ }
319
+
320
+
321
+ class DynamicRESTTool(RESTTool):
322
+ """
323
+ Dynamic REST tool that can be configured with custom endpoints.
324
+
325
+ This allows creating REST tools without subclassing, by providing
326
+ endpoint definitions at initialization.
327
+
328
+ Example:
329
+ tool = DynamicRESTTool(
330
+ name="github_api",
331
+ description="GitHub API tool",
332
+ base_url="https://api.github.com",
333
+ endpoints={
334
+ "get_user": {
335
+ "path": "users/{username}",
336
+ "method": "GET",
337
+ "description": "Get user information"
338
+ },
339
+ "create_issue": {
340
+ "path": "repos/{owner}/{repo}/issues",
341
+ "method": "POST",
342
+ "description": "Create a new issue"
343
+ }
344
+ }
345
+ )
346
+ """
347
+
348
+ def __init__(
349
+ self,
350
+ endpoints: Optional[Dict[str, Dict[str, Any]]] = None,
351
+ **kwargs
352
+ ):
353
+ """
354
+ Initialize dynamic REST tool.
355
+
356
+ Args:
357
+ endpoints: Dictionary of endpoint definitions
358
+ **kwargs: Arguments passed to RESTTool
359
+ """
360
+ super().__init__(**kwargs)
361
+ self.endpoints = endpoints or {}
362
+
363
+ # Generate dynamic schema based on endpoints
364
+ if self.endpoints:
365
+ self.args_schema = self._generate_dynamic_schema()
366
+
367
+ def _generate_dynamic_schema(self) -> Type[BaseModel]:
368
+ """Generate Pydantic schema from endpoint definitions."""
369
+ # Build choice of endpoints
370
+ endpoint_choices = list(self.endpoints.keys())
371
+
372
+ # Create dynamic model
373
+ fields = {
374
+ 'endpoint': (
375
+ str,
376
+ Field(
377
+ description=f"Choose endpoint: {', '.join(endpoint_choices)}"
378
+ )
379
+ ),
380
+ 'method': (
381
+ Optional[str],
382
+ Field(
383
+ default=None,
384
+ description="HTTP method (optional, defaults to endpoint's method)"
385
+ )
386
+ ),
387
+ 'params': (
388
+ Optional[Dict[str, Any]],
389
+ Field(
390
+ default=None,
391
+ description="Query parameters or path variables"
392
+ )
393
+ ),
394
+ 'data': (
395
+ Optional[Dict[str, Any]],
396
+ Field(
397
+ default=None,
398
+ description="Request body data"
399
+ )
400
+ ),
401
+ }
402
+
403
+ return create_model(
404
+ f"{self.name}_schema",
405
+ **fields,
406
+ __base__=AbstractToolArgsSchema
407
+ )
408
+
409
+ def _resolve_endpoint(
410
+ self,
411
+ endpoint: str,
412
+ params: Optional[Dict[str, Any]] = None
413
+ ) -> str:
414
+ """
415
+ Resolve endpoint path with path variables.
416
+
417
+ Args:
418
+ endpoint: Endpoint name
419
+ params: Parameters (may contain path variables)
420
+
421
+ Returns:
422
+ Resolved endpoint path
423
+ """
424
+ if endpoint not in self.endpoints:
425
+ return endpoint
426
+
427
+ endpoint_config = self.endpoints[endpoint]
428
+ path = endpoint_config.get('path', endpoint)
429
+
430
+ # Replace path variables
431
+ if params:
432
+ try:
433
+ path = path.format(**params)
434
+ except KeyError as e:
435
+ self.logger.warning(f"Missing path variable: {e}")
436
+
437
+ return path
438
+
439
+ async def _run(
440
+ self,
441
+ endpoint: str,
442
+ method: Optional[str] = None,
443
+ params: Optional[Dict[str, Any]] = None,
444
+ data: Optional[Dict[str, Any]] = None,
445
+ headers: Optional[Dict[str, str]] = None,
446
+ **kwargs
447
+ ) -> ToolResult:
448
+ """
449
+ Execute dynamic REST API call.
450
+
451
+ Args:
452
+ endpoint: Endpoint name or path
453
+ method: HTTP method (optional, uses endpoint's default)
454
+ params: Parameters (path variables + query params)
455
+ data: Request body
456
+ headers: Additional headers
457
+ **kwargs: Additional arguments
458
+
459
+ Returns:
460
+ ToolResult with API response
461
+ """
462
+ # Get endpoint configuration if available
463
+ endpoint_config = self.endpoints.get(endpoint, {})
464
+
465
+ # Use endpoint's method if not specified
466
+ if method is None:
467
+ method = endpoint_config.get('method', 'GET')
468
+
469
+ # Resolve endpoint path with variables
470
+ resolved_path = self._resolve_endpoint(endpoint, params)
471
+
472
+ # Make request
473
+ return await self._make_request(
474
+ endpoint=resolved_path,
475
+ method=method,
476
+ params=params,
477
+ data=data,
478
+ headers=headers
479
+ )
480
+
481
+
482
+ class SimpleRESTTool(RESTTool):
483
+ """
484
+ Simplified REST tool for quick API integrations.
485
+
486
+ Provides convenience methods for common operations.
487
+
488
+ Example:
489
+ class ProductAPI(SimpleRESTTool):
490
+ name = "product_api"
491
+ description = "Product management API"
492
+ base_url = "https://api.example.com/products"
493
+
494
+ # Usage
495
+ tool = ProductAPI(api_key="secret")
496
+
497
+ # Get product
498
+ result = await tool.get("123")
499
+
500
+ # Create product
501
+ result = await tool.post("", data={"name": "Widget"})
502
+
503
+ # Update product
504
+ result = await tool.put("123", data={"price": 9.99})
505
+
506
+ # Delete product
507
+ result = await tool.delete("123")
508
+ """
509
+
510
+ async def get(
511
+ self,
512
+ endpoint: str,
513
+ params: Optional[Dict[str, Any]] = None,
514
+ **kwargs
515
+ ) -> ToolResult:
516
+ """Convenience method for GET requests."""
517
+ return await self._execute(endpoint=endpoint, method="GET", params=params, **kwargs)
518
+
519
+ async def post(
520
+ self,
521
+ endpoint: str,
522
+ data: Optional[Dict[str, Any]] = None,
523
+ **kwargs
524
+ ) -> ToolResult:
525
+ """Convenience method for POST requests."""
526
+ return await self._execute(endpoint=endpoint, method="POST", data=data, **kwargs)
527
+
528
+ async def put(
529
+ self,
530
+ endpoint: str,
531
+ data: Optional[Dict[str, Any]] = None,
532
+ **kwargs
533
+ ) -> ToolResult:
534
+ """Convenience method for PUT requests."""
535
+ return await self._execute(endpoint=endpoint, method="PUT", data=data, **kwargs)
536
+
537
+ async def patch(
538
+ self,
539
+ endpoint: str,
540
+ data: Optional[Dict[str, Any]] = None,
541
+ **kwargs
542
+ ) -> ToolResult:
543
+ """Convenience method for PATCH requests."""
544
+ return await self._execute(endpoint=endpoint, method="PATCH", data=data, **kwargs)
545
+
546
+ async def delete(
547
+ self,
548
+ endpoint: str,
549
+ params: Optional[Dict[str, Any]] = None,
550
+ **kwargs
551
+ ) -> ToolResult:
552
+ """Convenience method for DELETE requests."""
553
+ return await self._execute(endpoint=endpoint, method="DELETE", params=params, **kwargs)
File without changes