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,468 @@
1
+ # ============================================================================
2
+ # SCHEMA-CENTRIC DATA MODELS
3
+ # ============================================================================
4
+ from __future__ import annotations
5
+ from typing import Dict, Any, List, Optional, Union
6
+ from enum import Enum, Flag, auto
7
+ from datetime import datetime
8
+ from dataclasses import dataclass, field
9
+ from pydantic import BaseModel, Field
10
+ from datamodel.parsers.json import json_encoder, json_decoder # pylint: disable=E0611 # noqa
11
+ import yaml
12
+ import pandas as pd
13
+
14
+
15
+ class UserRole(str, Enum):
16
+ """Define user roles with specific output preferences."""
17
+ BUSINESS_USER = "business_user" # Data only, no limits, minimal explanation
18
+ DATA_ANALYST = "data_analyst" # Explanations, samples, schema context
19
+ DATA_SCIENTIST = "data_scientist" # Schema context + DataFrame conversion (no limits)
20
+ DATABASE_ADMIN = "database_admin" # SQL, execution plans, performance, optimization, sample data
21
+ DEVELOPER = "developer" # SQL/schema, explanations, examples, no data
22
+ QUERY_DEVELOPER = "query_developer" # SQL/schema, execution plans, performance, optimization, no data
23
+
24
+ class OutputComponent(Flag):
25
+ """Flags for different response components - allows combinations."""
26
+ NONE = 0
27
+ SQL_QUERY = auto() # Generated or validated SQL query
28
+ EXECUTION_PLAN = auto() # EXPLAIN ANALYZE results with optimizations
29
+ DATA_RESULTS = auto() # Actual query results
30
+ DOCUMENTATION = auto() # Table/schema metadata and explanations
31
+ EXAMPLES = auto() # Usage examples and sample queries
32
+ PERFORMANCE_METRICS = auto() # Performance analysis and index suggestions
33
+ SCHEMA_CONTEXT = auto() # Available tables, columns, relationships
34
+ OPTIMIZATION_TIPS = auto() # Query optimization suggestions
35
+ SAMPLE_DATA = auto() # Sample rows for understanding data format
36
+ DATAFRAME_OUTPUT = auto() # Convert results to pandas DataFrame
37
+
38
+ # Convenience combinations
39
+ BASIC_QUERY = SQL_QUERY | DATA_RESULTS
40
+ FULL_ANALYSIS = SQL_QUERY | EXECUTION_PLAN | PERFORMANCE_METRICS | OPTIMIZATION_TIPS
41
+ DEVELOPER_FOCUS = SQL_QUERY | DOCUMENTATION | EXAMPLES | SCHEMA_CONTEXT
42
+ BUSINESS_FOCUS = DATA_RESULTS
43
+ QUERY_DEVELOPER_FOCUS = SQL_QUERY | EXECUTION_PLAN | PERFORMANCE_METRICS | OPTIMIZATION_TIPS | SCHEMA_CONTEXT
44
+
45
+ class OutputFormat(str, Enum):
46
+ """Defines the desired format of the response."""
47
+ # Basic formats
48
+ QUERY_ONLY = "query_only" # Just the Query, no execution
49
+ DATA_ONLY = "data_only" # Just the results
50
+ QUERY_AND_DATA = "query_and_data" # Query + results
51
+ EXPLANATION_ONLY = "explanation_only"
52
+ DOCUMENTATION_ONLY = "documentation_only"
53
+
54
+ # Combined formats
55
+ QUERY_WITH_EXPLANATION = "query_with_explanation"
56
+ QUERY_WITH_DOCS = "query_with_docs"
57
+ FULL_ANALYSIS = "full_analysis"
58
+
59
+ # Role-specific formats
60
+ DEVELOPER_FORMAT = "developer_format"
61
+ DBA_FORMAT = "dba_format"
62
+ ANALYST_FORMAT = "analyst_format"
63
+ BUSINESS_FORMAT = "business_format"
64
+
65
+ # Special utilities
66
+ EXPLAIN_PLAN = "explain_plan"
67
+ PERFORMANCE_ANALYSIS = "performance_analysis"
68
+ QUERY_OPTIMIZATION = "query_optimization"
69
+ QUERY_DATA_EXPLANATION = "full_response" # SQL + results + explanation + optimization tips
70
+
71
+
72
+ class QueryIntent(str, Enum):
73
+ """Defines the user's query intents for comprehensive database operations."""
74
+ SHOW_DATA = "show_data" # Retrieve and display data
75
+ GENERATE_QUERY = "generate_query" # Create SQL from natural language
76
+ ANALYZE_DATA = "analyze_data" # Data analysis and insights
77
+ EXPLORE_SCHEMA = "explore_schema" # Schema exploration and documentation
78
+ VALIDATE_QUERY = "validate_query" # Validate user-provided SQL
79
+ OPTIMIZE_QUERY = "optimize_query" # Performance optimization focus
80
+ EXPLAIN_METADATA = "explain_metadata" # Table/column documentation
81
+ CREATE_EXAMPLES = "create_examples" # Generate usage examples
82
+ GENERATE_REPORT = "generate_report" # Create a report from the query results
83
+
84
+ @dataclass
85
+ class SchemaMetadata:
86
+ """Metadata for a single schema (client)."""
87
+ database_name: str
88
+ schema: str
89
+ table_count: int
90
+ view_count: int
91
+ total_rows: Optional[int] = None
92
+ last_analyzed: Optional[datetime] = None
93
+ database_type: Optional[str] = Field(default='postgresql')
94
+ tables: Dict[str, 'TableMetadata'] = field(default_factory=dict)
95
+ views: Dict[str, 'TableMetadata'] = field(default_factory=dict)
96
+ functions: List[Dict[str, Any]] = field(default_factory=list)
97
+
98
+ def get_all_objects(self) -> Dict[str, 'TableMetadata']:
99
+ """Get all tables and views."""
100
+ return {**self.tables, **self.views}
101
+
102
+
103
+ @dataclass
104
+ class TableMetadata:
105
+ """Enhanced table metadata for large-scale operations."""
106
+ schema: str
107
+ tablename: str
108
+ table_type: str # 'BASE TABLE', 'VIEW'
109
+ full_name: str # schema.table for easy reference
110
+ comment: Optional[str] = None
111
+ columns: List[Dict[str, Any]] = field(default_factory=list)
112
+ primary_keys: List[str] = field(default_factory=list)
113
+ foreign_keys: List[Dict[str, Any]] = field(default_factory=list)
114
+ indexes: List[Dict[str, Any]] = field(default_factory=list)
115
+ row_count: Optional[int] = None
116
+ sample_data: List[Dict[str, Any]] = field(default_factory=list)
117
+
118
+ # Performance and usage metadata
119
+ last_accessed: Optional[datetime] = None
120
+ access_frequency: int = 0
121
+ avg_query_time: Optional[float] = None
122
+
123
+ def __post_init__(self):
124
+ if not self.full_name:
125
+ self.full_name = f'"{self.schema}"."{self.tablename}"'
126
+
127
+ def to_yaml_context(self) -> str:
128
+ """Convert to YAML context optimized for LLM consumption."""
129
+ # Include only essential information to avoid token bloat
130
+ essential_columns = self.columns[:20] # Limit to first 20 columns
131
+
132
+ data = {
133
+ 'table': self.full_name,
134
+ 'type': self.table_type,
135
+ 'description': self.comment or f"{self.table_type.lower()} in {self.schema} schema",
136
+ 'columns': [
137
+ {
138
+ 'name': col['name'],
139
+ 'type': col['type'],
140
+ 'nullable': col.get('nullable', True),
141
+ 'description': col.get('comment')
142
+ }
143
+ for col in essential_columns
144
+ ],
145
+ 'primary_keys': self.primary_keys,
146
+ 'row_count': self.row_count,
147
+ 'sample_values': self._get_sample_column_values()
148
+ }
149
+
150
+ if len(self.columns) > 20:
151
+ data['note'] = f"Showing 20 of {len(self.columns)} columns. Use schema search tools for complete structure."
152
+
153
+ return yaml.dump(data, default_flow_style=False, sort_keys=False)
154
+
155
+ def _get_sample_column_values(self) -> Dict[str, List]:
156
+ """Extract sample values per column for context."""
157
+ if not self.sample_data:
158
+ return {}
159
+
160
+ sample_values = {}
161
+ for row in self.sample_data[:3]: # First 3 rows
162
+ for col_name, value in row.items():
163
+ if col_name not in sample_values:
164
+ sample_values[col_name] = []
165
+ if value is not None and len(sample_values[col_name]) < 3:
166
+ sample_values[col_name].append(str(value))
167
+
168
+ return sample_values
169
+
170
+ class QueryExecutionRequest(BaseModel):
171
+ """Structured input for query execution."""
172
+ sql_query: str
173
+ limit: Optional[int] = 1000
174
+ timeout: int = 30
175
+ explain_analyze: bool = False
176
+ dry_run: bool = False
177
+ schema_name: str
178
+
179
+
180
+ class QueryExecutionResponse(BaseModel):
181
+ """Structured output from query execution."""
182
+ success: bool
183
+ data: Optional[Any] = None
184
+ row_count: int = 0
185
+ execution_time_ms: float
186
+ columns: List[str] = Field(default_factory=list)
187
+ query_plan: Optional[str] = None
188
+ error_message: Optional[str] = None
189
+ schema_used: str
190
+ metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
191
+
192
+
193
+ # ============================================================================
194
+ # ROLE-BASED COMPONENT PREFERENCES
195
+ # ============================================================================
196
+
197
+ ROLE_COMPONENT_DEFAULTS: Dict[UserRole, OutputComponent] = {
198
+ UserRole.BUSINESS_USER: (
199
+ OutputComponent.DATA_RESULTS
200
+ ),
201
+ UserRole.DATA_ANALYST: (
202
+ OutputComponent.SQL_QUERY |
203
+ OutputComponent.DATA_RESULTS |
204
+ OutputComponent.DOCUMENTATION |
205
+ OutputComponent.SCHEMA_CONTEXT |
206
+ OutputComponent.SAMPLE_DATA
207
+ ),
208
+ UserRole.DATA_SCIENTIST: (
209
+ OutputComponent.SQL_QUERY |
210
+ OutputComponent.DATAFRAME_OUTPUT |
211
+ OutputComponent.SCHEMA_CONTEXT |
212
+ OutputComponent.DOCUMENTATION |
213
+ OutputComponent.DATA_RESULTS
214
+ ),
215
+ UserRole.DATABASE_ADMIN: (
216
+ OutputComponent.SQL_QUERY |
217
+ OutputComponent.EXECUTION_PLAN |
218
+ OutputComponent.PERFORMANCE_METRICS |
219
+ OutputComponent.OPTIMIZATION_TIPS |
220
+ OutputComponent.SCHEMA_CONTEXT |
221
+ OutputComponent.SAMPLE_DATA # Limited samples, not full data
222
+ ),
223
+ UserRole.DEVELOPER: (
224
+ OutputComponent.SQL_QUERY |
225
+ OutputComponent.DOCUMENTATION |
226
+ OutputComponent.EXAMPLES |
227
+ OutputComponent.SCHEMA_CONTEXT
228
+ # Note: No DATA_RESULTS for developers by default
229
+ ),
230
+ UserRole.QUERY_DEVELOPER: (
231
+ OutputComponent.SQL_QUERY |
232
+ OutputComponent.EXECUTION_PLAN |
233
+ OutputComponent.PERFORMANCE_METRICS |
234
+ OutputComponent.OPTIMIZATION_TIPS |
235
+ OutputComponent.SCHEMA_CONTEXT
236
+ # Note: No DATA_RESULTS for query developers by default
237
+ )
238
+ }
239
+
240
+ @dataclass
241
+ class RouteDecision:
242
+ """Query routing decision for schema-centric operations."""
243
+ intent: QueryIntent
244
+ components: OutputComponent
245
+ user_role: UserRole
246
+ primary_schema: str
247
+ allowed_schemas: List[str]
248
+
249
+ # Execution control
250
+ needs_metadata_discovery: bool = True
251
+ needs_query_generation: bool = True
252
+ needs_execution: bool = True
253
+ needs_plan_analysis: bool = False
254
+
255
+ # Data handling
256
+ data_limit: Optional[int] = 1000
257
+ include_full_data: bool = False # For business users who want all rows
258
+ convert_to_dataframe: bool = False
259
+
260
+ # Execution options
261
+ execution_options: Dict[str, Any] = field(default_factory=dict)
262
+ confidence: float = 0.8
263
+
264
+ # ============================================================================
265
+ # RESPONSE COMPONENTS
266
+ # ============================================================================
267
+
268
+ @dataclass
269
+ class DatabaseResponse:
270
+ """Component-based database response."""
271
+ query: Optional[str] = None
272
+ data: Optional[Union[List[Dict], pd.DataFrame]] = None
273
+ execution_plan: Optional[str] = None
274
+ documentation: Optional[str] = None
275
+ examples: Optional[List[str]] = None
276
+ performance_metrics: Optional[Dict[str, Any]] = None
277
+ schema_context: Optional[str] = None
278
+ optimization_tips: Optional[List[str]] = None
279
+ sample_data: Optional[List[Dict]] = None
280
+ is_documentation: bool = False # True if response is primarily documentation
281
+
282
+ # Metadata
283
+ row_count: int = 0
284
+ execution_time_ms: float = 0.0
285
+ components_included: OutputComponent = OutputComponent.NONE
286
+
287
+ def to_markdown(self) -> str:
288
+ """Convert response to markdown format."""
289
+ sections = []
290
+
291
+ if self.query and OutputComponent.SQL_QUERY in self.components_included:
292
+ sections.append(f"## SQL Query\n\n```sql\n{self.query}\n```")
293
+
294
+ if self.execution_plan and OutputComponent.EXECUTION_PLAN in self.components_included:
295
+ sections.append(f"## Execution Plan\n\n```\n{self.execution_plan}\n```")
296
+
297
+ if self.documentation and OutputComponent.DOCUMENTATION in self.components_included:
298
+ sections.append(f"## Documentation\n\n{self.documentation}")
299
+
300
+ if self.examples and OutputComponent.EXAMPLES in self.components_included:
301
+ examples_text = "\n".join([f"```sql\n{ex}\n```" for ex in self.examples])
302
+ sections.append(f"## Usage Examples\n\n{examples_text}")
303
+
304
+ if self.performance_metrics and OutputComponent.PERFORMANCE_METRICS in self.components_included:
305
+ metrics_text = "\n".join([f"- **{k}**: {v}" for k, v in self.performance_metrics.items()])
306
+ sections.append(f"## Performance Metrics\n\n{metrics_text}")
307
+
308
+ if self.optimization_tips and OutputComponent.OPTIMIZATION_TIPS in self.components_included:
309
+ tips_text = "\n".join([f"- {tip}" for tip in self.optimization_tips])
310
+ sections.append(f"## Optimization Tips\n\n{tips_text}")
311
+
312
+ if self.schema_context and OutputComponent.SCHEMA_CONTEXT in self.components_included:
313
+ sections.append(f"## Schema Context\n\n{self.schema_context}")
314
+
315
+ if self.data is not None and OutputComponent.DATA_RESULTS in self.components_included:
316
+ if isinstance(self.data, pd.DataFrame):
317
+ sections.append(f"## Data Results (DataFrame)\n\n{self.data.head(10).to_markdown()}")
318
+ if len(self.data) > 10:
319
+ sections.append(f"*Showing first 10 of {len(self.data)} rows*")
320
+ else:
321
+ sections.append(f"## Data Results\n\n{self.row_count} rows returned")
322
+
323
+ if self.sample_data and OutputComponent.SAMPLE_DATA in self.components_included:
324
+ sections.append("## Sample Data\n\n*First few rows for reference*")
325
+
326
+ return "\n\n".join(sections)
327
+
328
+ def to_json(self) -> str:
329
+ """Convert DatabaseResponse to JSON format."""
330
+
331
+ # Convert components to list of strings for JSON serialization
332
+ components_list = [comp.name for comp in OutputComponent if comp in self.components_included]
333
+
334
+ # Prepare data for JSON serialization
335
+ response_dict = {
336
+ "query": self.query,
337
+ "documentation": self.documentation,
338
+ "examples": self.examples or [],
339
+ "schema_context": self.schema_context,
340
+ "execution_plan": self.execution_plan,
341
+ "optimization_tips": self.optimization_tips or [],
342
+ "performance_metrics": self.performance_metrics or {},
343
+ "row_count": self.row_count,
344
+ "execution_time_ms": self.execution_time_ms,
345
+ "components_included": components_list,
346
+ "sample_data": self.sample_data or []
347
+ }
348
+
349
+ # Handle data serialization
350
+ if self.data is not None:
351
+ if isinstance(self.data, pd.DataFrame):
352
+ response_dict["data"] = {
353
+ "type": "dataframe",
354
+ "shape": list(self.data.shape),
355
+ "columns": list(self.data.columns),
356
+ "dtypes": self.data.dtypes.astype(str).to_dict(),
357
+ "data": self.data.to_dict('records') # Convert to list of dicts
358
+ }
359
+ elif isinstance(self.data, list):
360
+ response_dict["data"] = {
361
+ "type": "list",
362
+ "count": len(self.data),
363
+ "data": self.data
364
+ }
365
+ else:
366
+ response_dict["data"] = {
367
+ "type": str(type(self.data).__name__),
368
+ "data": str(self.data)
369
+ }
370
+ else:
371
+ response_dict["data"] = None
372
+
373
+ return json_encoder(response_dict)
374
+
375
+ def to_dict(self) -> Dict[str, Any]:
376
+ """Convert to dictionary format for programmatic access."""
377
+ return json_decoder(self.to_json())
378
+
379
+ def has_component(self, component: OutputComponent) -> bool:
380
+ """Check if response includes a specific component."""
381
+ return component in self.components_included
382
+
383
+ def get_data_summary(self) -> Dict[str, Any]:
384
+ """Get summary information about the data."""
385
+ summary = {
386
+ "has_data": self.data is not None,
387
+ "row_count": self.row_count,
388
+ "execution_time_ms": self.execution_time_ms,
389
+ "data_type": None
390
+ }
391
+
392
+ if self.data is not None:
393
+ if isinstance(self.data, pd.DataFrame):
394
+ summary.update({
395
+ "data_type": "DataFrame",
396
+ "shape": list(self.data.shape),
397
+ "columns": list(self.data.columns),
398
+ "memory_usage": self.data.memory_usage(deep=True).sum()
399
+ })
400
+ elif isinstance(self.data, list):
401
+ summary.update({
402
+ "data_type": "list",
403
+ "count": len(self.data)
404
+ })
405
+
406
+ return summary
407
+
408
+ # ============================================================================
409
+ # COMPONENT CONFIGURATION HELPERS
410
+ # ============================================================================
411
+
412
+ def get_default_components(user_role: UserRole) -> OutputComponent:
413
+ """Get default output components for a user role."""
414
+ return ROLE_COMPONENT_DEFAULTS.get(user_role, OutputComponent.BASIC_QUERY)
415
+
416
+ def customize_components(
417
+ base_role: UserRole,
418
+ add: Optional[OutputComponent] = None,
419
+ remove: Optional[OutputComponent] = None
420
+ ) -> OutputComponent:
421
+ """Customize output components based on base role."""
422
+ components = get_default_components(base_role)
423
+
424
+ if add:
425
+ components |= add
426
+
427
+ if remove:
428
+ components &= ~remove
429
+
430
+ return components
431
+
432
+ def components_from_string(components_str: str) -> OutputComponent:
433
+ """Parse components from comma-separated string."""
434
+ component_map = {
435
+ 'sql': OutputComponent.SQL_QUERY,
436
+ 'plan': OutputComponent.EXECUTION_PLAN,
437
+ 'data': OutputComponent.DATA_RESULTS,
438
+ 'docs': OutputComponent.DOCUMENTATION,
439
+ 'examples': OutputComponent.EXAMPLES,
440
+ 'performance': OutputComponent.PERFORMANCE_METRICS,
441
+ 'schema': OutputComponent.SCHEMA_CONTEXT,
442
+ 'optimize': OutputComponent.OPTIMIZATION_TIPS,
443
+ 'samples': OutputComponent.SAMPLE_DATA,
444
+ 'dataframe': OutputComponent.DATAFRAME_OUTPUT
445
+ }
446
+
447
+ result = OutputComponent.NONE
448
+ for comp in components_str.lower().split(','):
449
+ comp = comp.strip()
450
+ if comp in component_map:
451
+ result |= component_map[comp]
452
+
453
+ return result
454
+
455
+ # ============================================================================
456
+ # INTENT-TO-COMPONENT MAPPING
457
+ # ============================================================================
458
+
459
+ INTENT_COMPONENT_MAPPING: Dict[QueryIntent, OutputComponent] = {
460
+ QueryIntent.SHOW_DATA: OutputComponent.DATA_RESULTS | OutputComponent.SAMPLE_DATA,
461
+ QueryIntent.GENERATE_QUERY: OutputComponent.SQL_QUERY | OutputComponent.DOCUMENTATION,
462
+ QueryIntent.ANALYZE_DATA: OutputComponent.SQL_QUERY | OutputComponent.DATA_RESULTS | OutputComponent.DOCUMENTATION,
463
+ QueryIntent.EXPLORE_SCHEMA: OutputComponent.DOCUMENTATION | OutputComponent.SCHEMA_CONTEXT | OutputComponent.EXAMPLES,
464
+ QueryIntent.VALIDATE_QUERY: OutputComponent.SQL_QUERY | OutputComponent.DOCUMENTATION | OutputComponent.OPTIMIZATION_TIPS,
465
+ QueryIntent.OPTIMIZE_QUERY: OutputComponent.FULL_ANALYSIS,
466
+ QueryIntent.EXPLAIN_METADATA: OutputComponent.DOCUMENTATION | OutputComponent.SCHEMA_CONTEXT | OutputComponent.EXAMPLES,
467
+ QueryIntent.CREATE_EXAMPLES: OutputComponent.EXAMPLES | OutputComponent.SCHEMA_CONTEXT
468
+ }
@@ -0,0 +1,154 @@
1
+ DB_AGENT_PROMPT = """
2
+ You are an expert $role with access to database and schema information and powerful analysis tools.
3
+
4
+ **Your Role:**
5
+ $backstory
6
+
7
+ **Operating Principles:**
8
+ - Always prioritize accuracy and data integrity
9
+ - Provide clear explanations of database operations
10
+ - Generate efficient, well-optimized queries
11
+ - Use appropriate database-specific syntax and best practices
12
+ - Consider performance implications of large datasets
13
+
14
+ $user_context
15
+
16
+ $database_context
17
+
18
+ $context
19
+
20
+ $vector_context
21
+
22
+ $chat_history
23
+
24
+ **Guidelines:**
25
+ - Always use available tools to search schema and generate accurate queries
26
+ - Prefer exact table/column names from metadata over assumptions
27
+ - For "show me" queries, generate and execute SQL to return actual data
28
+ - For analysis queries, provide insights along with the data
29
+ - Maintain conversation flow and reference previous discussions when relevant
30
+ - Explain your reasoning when query generation fails
31
+
32
+ CRITICAL INSTRUCTIONS - NEVER VIOLATE THESE RULES:
33
+ 1. NEVER make assumptions, hallucinate, or make up information about the database schema or data. If you don't know, say you don't know.
34
+ 2. Always prioritize user safety and data integrity. Avoid suggesting actions that could lead to data loss or corruption.
35
+ 3. If the user asks for sensitive information, ensure you follow best practices for data privacy and security.
36
+ 4. Always try multiple approaches to solve a problem before concluding that it cannot be done.
37
+ 5. Every factual statement must be traceable to the provided input data.
38
+ 6. When providing SQL queries, ensure they are compatible with the specified database ($database_type)
39
+ 7. Consider performance implications of large datasets
40
+ 8. Provide multiple query options when appropriate
41
+
42
+ **Current Request:**
43
+ Please process the user's request using available tools and provide a comprehensive response.
44
+ """
45
+
46
+
47
+ BASIC_HUMAN_PROMPT = """
48
+ **User Request:**
49
+ $question
50
+
51
+ **Context Information:**
52
+ - User Role/Background: As specified in user context
53
+ - Session: $session_id
54
+
55
+ Use your tools to search schema, generate queries, and execute them as needed.
56
+ """
57
+
58
+ DATA_ANALYSIS_PROMPT = """You are performing data analysis on: $analysis_request
59
+
60
+ **Analysis Context:**
61
+ - Business Question: $business_question
62
+ - Data Sources: $data_sources
63
+ - User Background: $user_context
64
+
65
+ **Analysis Framework:**
66
+ 1. Data Understanding
67
+ - What data is available?
68
+ - What are the key metrics?
69
+ - What are the data quality considerations?
70
+
71
+ 2. Analytical Approach
72
+ - What queries are needed?
73
+ - What statistical methods apply?
74
+ - How should results be interpreted?
75
+
76
+ 3. Business Insights
77
+ - What does the data tell us?
78
+ - What are the actionable findings?
79
+ - What follow-up questions emerge?
80
+
81
+ 4. Recommendations
82
+ - What actions should be taken?
83
+ - What additional data might be needed?
84
+ - What are the next steps?
85
+
86
+ Provide both technical analysis and business interpretation suitable for the user's role.
87
+ """
88
+
89
+ # Template for explaining complex database concepts
90
+ DATABASE_EDUCATION_PROMPT = """
91
+ You are explaining database concepts to help the user better understand: $concept
92
+
93
+ **Educational Context:**
94
+ - User's Technical Level: $user_level
95
+ - Specific Focus: $focus_area
96
+ - Real Examples: Use the current database schema
97
+
98
+ **Explanation Structure:**
99
+ 1. Concept Overview
100
+ - What is it?
101
+ - Why is it important?
102
+ - How does it work?
103
+
104
+ 2. Practical Examples
105
+ - Show examples from the current schema
106
+ - Demonstrate with actual queries
107
+ - Highlight common patterns
108
+
109
+ 3. Best Practices
110
+ - What to do
111
+ - What to avoid
112
+ - Performance considerations
113
+
114
+ 4. Advanced Topics
115
+ - Related concepts
116
+ - Advanced use cases
117
+ - Further learning resources
118
+
119
+ Make the explanation practical and immediately applicable to their work.
120
+ """
121
+
122
+ # Error handling and troubleshooting prompt
123
+ DATABASE_TROUBLESHOOTING_PROMPT = """
124
+ You are helping troubleshoot a database issue: $problem_description
125
+
126
+ **Troubleshooting Context:**
127
+ - Error Message: $error_message
128
+ - Query Attempted: $attempted_query
129
+ - Expected Outcome: $expected_outcome
130
+ - User Context: $user_context
131
+
132
+ **Diagnostic Process:**
133
+ 1. Error Analysis
134
+ - What does the error mean?
135
+ - What are the likely causes?
136
+ - How can it be reproduced?
137
+
138
+ 2. Schema Validation
139
+ - Check table/column existence
140
+ - Verify data types
141
+ - Confirm permissions
142
+
143
+ 3. Query Review
144
+ - Syntax validation
145
+ - Logic verification
146
+ - Performance assessment
147
+
148
+ 4. Solution Approaches
149
+ - Immediate fixes
150
+ - Alternative methods
151
+ - Prevention strategies
152
+
153
+ Provide clear, actionable solutions with examples.
154
+ """