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,457 @@
1
+ """
2
+ LocalKB: Knowledge Base from local text and markdown files with FAISS vector store.
3
+ """
4
+ from __future__ import annotations
5
+ from typing import List, Dict, Any, Tuple, Optional
6
+ import re
7
+ from pathlib import Path
8
+ import asyncio
9
+ import time
10
+ from navconfig.logging import logging
11
+ from .abstract import AbstractKnowledgeBase
12
+ from ..faiss_store import FAISSStore
13
+ from ..models import Document
14
+ from ...utils.helpers import RequestContext
15
+
16
+
17
+ class LocalKB(AbstractKnowledgeBase):
18
+ """
19
+ Local Knowledge Base that loads markdown and text documents from a local directory.
20
+
21
+ Uses FAISS for semantic search with disk persistence for fast loading.
22
+ Ideal for agent-specific knowledge like:
23
+ - Database query patterns
24
+ - Tool usage examples
25
+ - Domain-specific procedures
26
+ - Analysis templates
27
+
28
+ Example structure:
29
+ AGENTS_DIR/
30
+ └── my_agent/
31
+ └── kb/
32
+ ├── database_queries.md
33
+ ├── prophet_forecast.md
34
+ └── tool_examples.md
35
+ """
36
+
37
+ def __init__(
38
+ self,
39
+ name: str,
40
+ kb_directory: Path,
41
+ category: str = "local",
42
+ description: str = None,
43
+ activation_patterns: List[str] = None,
44
+ embedding_model: str = "sentence-transformers/all-mpnet-base-v2",
45
+ dimension: int = 384,
46
+ chunk_size: int = 4096,
47
+ chunk_overlap: int = 100,
48
+ always_active: bool = True,
49
+ auto_load: bool = True,
50
+ **kwargs
51
+ ):
52
+ """
53
+ Initialize LocalKB.
54
+
55
+ Args:
56
+ name: Name of the KB (e.g., agent name)
57
+ kb_directory: Path to directory containing .md and .txt files
58
+ category: Category identifier
59
+ description: KB description
60
+ activation_patterns: Patterns that activate this KB
61
+ embedding_model: Model for embeddings
62
+ dimension: Embedding dimension
63
+ chunk_size: Size of text chunks
64
+ chunk_overlap: Overlap between chunks
65
+ always_active: Always include in context
66
+ auto_load: Load on initialization
67
+ """
68
+ super().__init__(
69
+ name=name,
70
+ category=category,
71
+ description=description or f"{name} local knowledge base",
72
+ activation_patterns=activation_patterns or [],
73
+ always_active=always_active,
74
+ priority=10 # High priority for local KB
75
+ )
76
+
77
+ self.kb_directory = Path(kb_directory)
78
+ self.chunk_size = chunk_size
79
+ self.chunk_overlap = chunk_overlap
80
+ self.dimension = dimension
81
+ self.logger = logging.getLogger(__name__)
82
+
83
+ # FAISS store with persistence
84
+ self.faiss_store = FAISSStore(
85
+ collection_name=f"{name}_local_kb",
86
+ embedding_model=embedding_model,
87
+ distance_strategy="COSINE",
88
+ index_type="HNSW", # Use HNSW for large KBs
89
+ )
90
+
91
+ # Cache file for persistence
92
+ self.cache_file = self.kb_directory / ".kb_cache.faiss"
93
+
94
+ # Track loaded files for change detection
95
+ self._loaded_files: Dict[str, float] = {} # filename -> mtime
96
+ self._is_loaded = False
97
+
98
+ if auto_load:
99
+ # Load synchronously during init
100
+ try:
101
+ loop = asyncio.get_event_loop()
102
+ if loop.is_running():
103
+ # Schedule for later if loop is running
104
+ asyncio.create_task(self.load_documents())
105
+ else:
106
+ # Run immediately if no loop
107
+ loop.run_until_complete(self.load_documents())
108
+ except RuntimeError:
109
+ # No loop available, will load on first search
110
+ pass
111
+
112
+ async def should_activate(
113
+ self,
114
+ query: str,
115
+ context: Dict[str, Any]
116
+ ) -> Tuple[bool, float]:
117
+ """
118
+ Determine if KB should activate.
119
+ For local KB, usually always active.
120
+ """
121
+ if self.always_active:
122
+ return True, 1.0
123
+
124
+ # Check activation patterns
125
+ query_lower = query.lower()
126
+ for pattern in self.activation_patterns:
127
+ if pattern.lower() in query_lower:
128
+ return True, 0.9
129
+
130
+ return False, 0.0
131
+
132
+ async def load_documents(self, force_reload: bool = False) -> int:
133
+ """
134
+ Load markdown documents from kb_directory into FAISS.
135
+
136
+ Args:
137
+ force_reload: Force reload even if cache exists
138
+
139
+ Returns:
140
+ Number of documents loaded
141
+ """
142
+ # Create kb directory if doesn't exist
143
+ self.kb_directory.mkdir(parents=True, exist_ok=True)
144
+
145
+ # Find all markdown and text files
146
+ local_files = list(self.kb_directory.glob("*.md")) + list(self.kb_directory.glob("*.txt"))
147
+
148
+ if not local_files:
149
+ self.logger.warning(
150
+ f"No markdown or text files found in {self.kb_directory}"
151
+ )
152
+ return 0
153
+
154
+ # Create a map of file modifications
155
+ current_loaded_files = {
156
+ f.name: f.stat().st_mtime for f in local_files
157
+ }
158
+
159
+ if self._is_loaded and not force_reload:
160
+ # Check if we need to reload based on file changes
161
+ if self._loaded_files == current_loaded_files:
162
+ self.logger.debug(
163
+ f"KB: '{self.name}' already loaded and up to date"
164
+ )
165
+ return 0
166
+
167
+ # Check if cache exists and is valid
168
+ if self.cache_file.exists() and not force_reload:
169
+ try:
170
+ # Check cache validity
171
+ cache_mtime = self.cache_file.stat().st_mtime
172
+ # Cache must be newer than all source files
173
+ is_cache_valid = all(
174
+ cache_mtime > mtime for mtime in current_loaded_files.values()
175
+ )
176
+
177
+ if is_cache_valid:
178
+ await self._load_from_cache()
179
+ self._is_loaded = True
180
+ # IMPORTANT: Populate _loaded_files so change detection works
181
+ self._loaded_files = current_loaded_files
182
+ self.logger.info(
183
+ f"Loaded KB '{self.name}' from cache (valid as of {time.ctime(cache_mtime)})"
184
+ )
185
+ return 0
186
+ else:
187
+ self.logger.debug(
188
+ f"KB cache for '{self.name}' is stale, reloading..."
189
+ )
190
+
191
+ except Exception as e:
192
+ self.logger.warning(
193
+ f"Failed to load cache: {e}, rebuilding..."
194
+ )
195
+
196
+ self.logger.info(
197
+ f"Loading {len(local_files)} markdown and text files into KB '{self.name}'"
198
+ )
199
+
200
+ # Process each file
201
+ documents = []
202
+ for local_file in local_files:
203
+ try:
204
+ content = local_file.read_text(encoding='utf-8')
205
+
206
+ # Split into chunks
207
+ chunks = self._chunk_markdown(content, local_file.name)
208
+
209
+ # Create Document objects
210
+ for i, chunk_text in enumerate(chunks):
211
+ doc = Document(
212
+ page_content=chunk_text,
213
+ metadata={
214
+ 'source': local_file.name,
215
+ 'kb_name': self.name,
216
+ 'chunk_id': i,
217
+ 'total_chunks': len(chunks),
218
+ 'file_path': str(local_file),
219
+ }
220
+ )
221
+ documents.append(doc)
222
+
223
+ # Track file modification time
224
+ self._loaded_files[local_file.name] = local_file.stat().st_mtime
225
+
226
+ except Exception as e:
227
+ self.logger.error(
228
+ f"Error processing {local_file.name}: {e}"
229
+ )
230
+
231
+ if not documents:
232
+ self.logger.warning("No documents to load")
233
+ return 0
234
+
235
+ # Initialize FAISS store
236
+ await self.faiss_store.connection()
237
+
238
+ # Define collection
239
+ self.faiss_store.define_collection_table(
240
+ collection_name=f"{self.name}_local_kb",
241
+ dimension=self.dimension
242
+ )
243
+
244
+ # Add documents to FAISS
245
+ await self.faiss_store.add_documents(
246
+ documents=documents,
247
+ collection=f"{self.name}_local_kb"
248
+ )
249
+
250
+ # Save to cache
251
+ await self._save_to_cache()
252
+
253
+ self._is_loaded = True
254
+
255
+ self.logger.info(
256
+ f"Successfully loaded {len(documents)} chunks from "
257
+ f"{len(local_files)} files into KB '{self.name}'"
258
+ )
259
+
260
+ return len(documents)
261
+
262
+ def _chunk_markdown(
263
+ self,
264
+ content: str,
265
+ filename: str
266
+ ) -> List[str]:
267
+ """
268
+ Chunk markdown content intelligently by sections.
269
+
270
+ Preserves:
271
+ - Headers and their content together
272
+ - Code blocks intact
273
+ - Lists intact
274
+ """
275
+ chunks = []
276
+
277
+ # Split by markdown headers
278
+ sections = re.split(r'\n(#{1,6}\s+.+)\n', content)
279
+
280
+ current_chunk = []
281
+ current_size = 0
282
+
283
+ for i, section in enumerate(sections):
284
+ section = section.strip()
285
+ if not section:
286
+ continue
287
+
288
+ section_size = len(section)
289
+
290
+ # If section is too large, split it
291
+ if section_size > self.chunk_size:
292
+ if current_chunk:
293
+ chunks.append('\n'.join(current_chunk))
294
+ current_chunk = []
295
+ current_size = 0
296
+
297
+ # Split large section by paragraphs
298
+ paragraphs = section.split('\n\n')
299
+ for para in paragraphs:
300
+ para = para.strip()
301
+ if not para:
302
+ continue
303
+
304
+ if current_size + len(para) > self.chunk_size:
305
+ if current_chunk:
306
+ chunks.append('\n'.join(current_chunk))
307
+ current_chunk = [para]
308
+ current_size = len(para)
309
+ else:
310
+ current_chunk.append(para)
311
+ current_size += len(para)
312
+
313
+ # Normal section fits in chunk
314
+ elif current_size + section_size > self.chunk_size:
315
+ if current_chunk:
316
+ chunks.append('\n'.join(current_chunk))
317
+ current_chunk = [section]
318
+ current_size = section_size
319
+ else:
320
+ current_chunk.append(section)
321
+ current_size += section_size
322
+
323
+ # Add remaining
324
+ if current_chunk:
325
+ chunks.append('\n'.join(current_chunk))
326
+
327
+ return chunks
328
+
329
+ async def search(
330
+ self,
331
+ query: str,
332
+ k: int = 5,
333
+ score_threshold: float = 0.5,
334
+ user_id: str = None,
335
+ session_id: str = None,
336
+ ctx: RequestContext = None,
337
+ **kwargs
338
+ ) -> List[Dict[str, Any]]:
339
+ """
340
+ Search for relevant knowledge in markdown files.
341
+
342
+ Args:
343
+ query: Search query
344
+ k: Number of results
345
+ score_threshold: Minimum similarity score
346
+
347
+ Returns:
348
+ List of relevant chunks with metadata
349
+ """
350
+ # Ensure documents are loaded
351
+ if not self._is_loaded:
352
+ await self.load_documents()
353
+
354
+ # Check if files changed
355
+ await self._check_file_changes()
356
+
357
+ try:
358
+ # Search FAISS
359
+ results = await self.faiss_store.asearch(
360
+ query=query,
361
+ k=k,
362
+ collection=f"{self.name}_local_kb",
363
+ score_threshold=score_threshold
364
+ )
365
+
366
+ # Format results
367
+ formatted_results = []
368
+ formatted_results.extend(
369
+ {
370
+ 'content': result.content,
371
+ 'metadata': result.metadata,
372
+ 'score': result.score,
373
+ 'source': result.metadata.get('source', 'unknown')
374
+ } for result in results
375
+ )
376
+ return formatted_results
377
+
378
+ except Exception as e:
379
+ self.logger.error(f"Search error in KB '{self.name}': {e}")
380
+ return []
381
+
382
+ async def _check_file_changes(self) -> bool:
383
+ """
384
+ Check if any markdown files have changed.
385
+ If changed, trigger reload.
386
+
387
+ Returns:
388
+ True if files changed
389
+ """
390
+ changed = False
391
+ local_files = list(self.kb_directory.glob("*.md")) + list(self.kb_directory.glob("*.txt"))
392
+ for local_file in local_files:
393
+ filename = local_file.name
394
+ current_mtime = local_file.stat().st_mtime
395
+
396
+ if filename not in self._loaded_files:
397
+ changed = True
398
+ break
399
+
400
+ if current_mtime != self._loaded_files[filename]:
401
+ changed = True
402
+ break
403
+
404
+ if changed:
405
+ self.logger.info(
406
+ f"KB files changed, reloading '{self.name}'"
407
+ )
408
+ await self.load_documents(force_reload=True)
409
+
410
+ return changed
411
+
412
+ async def _save_to_cache(self) -> None:
413
+ """Save FAISS index to cache file."""
414
+ try:
415
+ self.faiss_store.save(self.cache_file)
416
+ self.logger.debug(f"Saved KB cache to {self.cache_file}")
417
+ except Exception as e:
418
+ self.logger.warning(f"Failed to save cache: {e}")
419
+
420
+ async def _load_from_cache(self) -> None:
421
+ """Load FAISS index from cache file."""
422
+ await self.faiss_store.connection()
423
+ self.faiss_store.load(self.cache_file)
424
+ self.logger.debug(f"Loaded KB cache from {self.cache_file}")
425
+
426
+ def format_context(self, results: List[Dict]) -> str:
427
+ """
428
+ Format search results for prompt injection.
429
+
430
+ Groups results by source file for clarity.
431
+ """
432
+ if not results:
433
+ return ""
434
+
435
+ lines = [f"\n## {self.name} Useful Facts:", ""]
436
+
437
+ # Group by source file
438
+ by_source: Dict[str, List[Dict]] = {}
439
+ for result in results:
440
+ source = result['metadata'].get('source', 'unknown')
441
+ if source not in by_source:
442
+ by_source[source] = []
443
+ by_source[source].append(result)
444
+
445
+ # Format each source
446
+ for source, source_results in by_source.items():
447
+ lines.append(f"## From {source}:")
448
+ for result in source_results:
449
+ content = result['content'].strip()
450
+ lines.extend((content, ""))
451
+
452
+ return "\n".join(lines)
453
+
454
+ async def close(self):
455
+ """Cleanup resources."""
456
+ if self.faiss_store:
457
+ await self.faiss_store.disconnect()
@@ -0,0 +1,28 @@
1
+ SELECTION_PROMPT = """You are a Knowledge Base Router that determines which knowledge sources are needed to answer a user's question.
2
+
3
+ Available Knowledge Bases:
4
+ {kb_descriptions}
5
+
6
+ User Question: {question}
7
+
8
+ TASK: Analyze the question and determine which knowledge bases would be helpful to answer it.
9
+
10
+ SELECTION CRITERIA:
11
+ 1. Only select KBs that directly relate to the question
12
+ 2. Consider implicit needs (e.g., "my tasks" needs UserProfile for identity)
13
+ 3. Prioritize specificity over general knowledge
14
+ 4. If uncertain, prefer including a KB over excluding it
15
+
16
+ OUTPUT AS JSON FORMAT:
17
+ {{
18
+ "selected_kbs": [
19
+ {{
20
+ "name": "KB_NAME",
21
+ "reason": "Brief explanation",
22
+ "confidence": 0.9
23
+ }}
24
+ ],
25
+ "reasoning": "Overall strategy explanation"
26
+ }}
27
+
28
+ Return ONLY valid JSON, no additional text, no markdown formatting."""