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,85 @@
1
+ from typing import Optional
2
+ from pydantic import BaseModel, Field
3
+
4
+
5
+ class VideoGenerationPrompt(BaseModel):
6
+ """Input schema for generating video content with VEO models."""
7
+
8
+ prompt: str = Field(
9
+ ...,
10
+ description="The text prompt describing the desired video content."
11
+ )
12
+
13
+ model: str = Field(
14
+ ...,
15
+ description="The video generation model to use (e.g., 'veo-3.0-generate-001')."
16
+ )
17
+
18
+ aspect_ratio: str = Field(
19
+ default="16:9",
20
+ description="The desired aspect ratio (e.g., '16:9', '9:16', '1:1')."
21
+ )
22
+
23
+ resolution: Optional[str] = Field(
24
+ default="720p",
25
+ description="Video resolution ('720p' or '1080p'). Default is '720p'."
26
+ )
27
+
28
+ negative_prompt: Optional[str] = Field(
29
+ default='',
30
+ description="A description of what to avoid in the video (e.g., 'cartoon, low quality')."
31
+ )
32
+
33
+ number_of_videos: int = Field(
34
+ default=1,
35
+ description="The number of videos to generate per request (typically 1)."
36
+ )
37
+
38
+ duration: Optional[int] = Field(
39
+ None,
40
+ description="Optional duration in seconds for the video (if supported by model)."
41
+ )
42
+
43
+ # Additional metadata fields (optional)
44
+ seed: Optional[int] = Field(
45
+ None,
46
+ description="Optional seed for reproducible generation (if supported)."
47
+ )
48
+
49
+ class Config:
50
+ json_schema_extra = {
51
+ "example": {
52
+ "prompt": "A cinematic shot of a majestic lion in the savannah",
53
+ "model": "veo-3.0-generate-001",
54
+ "aspect_ratio": "16:9",
55
+ "resolution": "1080p",
56
+ "negative_prompt": "cartoon, drawing, low quality",
57
+ "number_of_videos": 1
58
+ }
59
+ }
60
+
61
+ def validate_aspect_ratio(aspect_ratio: str) -> bool:
62
+ """Validate that aspect ratio is in correct format."""
63
+ valid_ratios = ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9"]
64
+ return aspect_ratio in valid_ratios
65
+
66
+
67
+ def validate_resolution(resolution: str) -> bool:
68
+ """Validate that resolution is supported."""
69
+ valid_resolutions = ["720p", "1080p"]
70
+ return resolution in valid_resolutions
71
+
72
+
73
+ # # Example usage:
74
+ # if __name__ == "__main__":
75
+ # # Create a video generation prompt
76
+ # prompt = VideoGenerationPrompt(
77
+ # prompt="A time-lapse of a sunset over the ocean",
78
+ # model="veo-3.0-generate-001",
79
+ # aspect_ratio="16:9",
80
+ # resolution="1080p",
81
+ # negative_prompt="people, buildings, text",
82
+ # number_of_videos=1
83
+ # )
84
+
85
+ # print(prompt.model_dump_json(indent=2))
@@ -0,0 +1,223 @@
1
+ """
2
+ Google Related Models to be used in GenAI.
3
+ """
4
+ from typing import Literal, List, Dict, Optional
5
+ from enum import Enum
6
+ from pydantic import BaseModel, Field
7
+
8
+ class GoogleModel(Enum):
9
+ """Enum for Google AI models."""
10
+ GEMINI_3_PRO_PREVIEW = "gemini-3-pro-preview"
11
+ GEMINI_2_5_FLASH = "gemini-2.5-flash"
12
+ GEMINI_2_5_FLASH_PREVIEW = "gemini-2.5-flash-preview-09-2025"
13
+ GEMINI_2_5_FLASH_LITE_PREVIEW = "gemini-2.5-flash-lite-preview-09-2025"
14
+ GEMINI_2_5_PRO = "gemini-2.5-pro"
15
+ GEMINI_2_0_FLASH = "gemini-2.0-flash-001"
16
+ GEMINI_PRO_LATEST = "gemini-pro-latest"
17
+ GEMINI_FLASH_LATEST = "gemini-flash-latest"
18
+ GEMINI_FLASH_LITE_LATEST = "gemini-flash-lite-latest"
19
+ IMAGEN_3 = "imagen-3.0-generate-002"
20
+ IMAGEN_4 = "imagen-4.0-generate-preview-06-06"
21
+ GEMINI_2_0_IMAGE_GENERATION = "gemini-2.0-flash-preview-image-generation"
22
+ GEMINI_2_5_FLASH_TTS = "gemini-2.5-flash-preview-tts"
23
+ GEMINI_2_5_PRO_TTS = "gemini-2.5-pro-preview-tts"
24
+ GEMINI_2_5_FLASH_IMAGE_PREVIEW = "gemini-2.5-flash-image-preview"
25
+ VEO_3_0 = "veo-3.0-generate-preview"
26
+ VEO_2_0 = "veo-2.0-generate-001"
27
+ VEO_3_0_FAST = "veo-3.0-fast-generate-001"
28
+
29
+ # NEW: Enum for all valid TTS voice names
30
+ class TTSVoice(str, Enum):
31
+ """Google TTS voices."""
32
+ ACHERNAR = "achernar"
33
+ ACHIRD = "achird"
34
+ ALGENIB = "algenib"
35
+ ALGIEBA = "algieba"
36
+ ALNILAM = "alnilam"
37
+ AOEDE = "aoede"
38
+ AUTONOE = "autonoe"
39
+ CALLIRRHOE = "callirrhoe"
40
+ CHARON = "charon"
41
+ DESPINA = "despina"
42
+ ENCELADUS = "enceladus"
43
+ ERINOME = "erinome"
44
+ FENRIR = "fenrir"
45
+ GACRUX = "gacrux"
46
+ IAPETUS = "iapetus"
47
+ KORE = "kore"
48
+ LAOMEDEIA = "laomedeia"
49
+ LEDA = "leda"
50
+ ORUS = "orus"
51
+ PUCK = "puck"
52
+ PULCHERRIMA = "pulcherrima"
53
+ RASALGETHI = "rasalgethi"
54
+ SADACHBIA = "sadachbia"
55
+ SADALTAGER = "sadaltager"
56
+ SCHEDAR = "schedar"
57
+ SULAFAT = "sulafat"
58
+ UMBRIEL = "umbriel"
59
+ VINDEMIATRIX = "vindemiatrix"
60
+ ZEPHYR = "zephyr"
61
+ ZUBENELGENUBI = "zubenelgenubi"
62
+
63
+
64
+ class VertexAIModel(Enum):
65
+ """Enum for Vertex AI models."""
66
+ GEMINI_2_5_FLASH = "gemini-2.5-flash"
67
+ GEMINI_2_5_FLASH_LITE_PREVIEW = "gemini-2.5-flash-lite-preview-06-17"
68
+ GEMINI_2_5_PRO = "gemini-2.5-pro"
69
+ GEMINI_2_0_FLASH = "gemini-2.0-flash-001"
70
+ IMAGEN_3_FAST = "Imagen 3 Fast"
71
+
72
+
73
+ class FictionalSpeaker(BaseModel):
74
+ """Configuration for a fictional character in the generated script."""
75
+ name: str = Field(
76
+ ...,
77
+ description="The name of the fictional speaker (e.g., 'Alex', 'Dr. Evans')."
78
+ )
79
+ characteristic: str = Field(
80
+ ...,
81
+ description="A descriptive personality trait for the voice model, e.g., 'charismatic and engaging', 'skeptical and cautious', 'bored'."
82
+ )
83
+ role: Literal['interviewer', 'interviewee'] = Field(
84
+ ...,
85
+ description="The role of the speaker in the conversation."
86
+ )
87
+ gender: Literal['female', 'male', 'neutral'] = Field(
88
+ default='neutral',
89
+ description="The gender of the speaker.",
90
+ )
91
+
92
+
93
+ class ConversationalScriptConfig(BaseModel):
94
+ """
95
+ Configuration for generating a conversational script with fictional characters.
96
+ """
97
+ report_text: str = Field(
98
+ ...,
99
+ description="The main text content of the script."
100
+ )
101
+ speakers: List[FictionalSpeaker] = Field(
102
+ ...,
103
+ description="A list of fictional speakers to include in the script."
104
+ )
105
+ context: str = Field(
106
+ ...,
107
+ description="Background context for the conversation, e.g., 'Discussing recent scientific discoveries'."
108
+ )
109
+ length: int = Field(
110
+ 1000,
111
+ description="Desired length of the script in words."
112
+ )
113
+ system_prompt: Optional[str] = Field(
114
+ None,
115
+ description="An optional system prompt to guide the AI's behavior during script generation."
116
+ )
117
+ system_instruction: Optional[str] = Field(
118
+ None,
119
+ description="An optional system instruction to provide additional context or constraints for the script generation."
120
+ )
121
+
122
+
123
+ # Define the gender type for clarity and validation
124
+ Gender = Literal["female", "male", "neutral"]
125
+
126
+
127
+ class VoiceProfile(BaseModel):
128
+ """
129
+ Represents a single pre-built generative voice, mapping its name
130
+ to its known characteristics and gender.
131
+ """
132
+ voice_name: str = Field(..., description="The official name of the voice (e.g., 'Erinome').")
133
+ characteristic: str = Field(..., description="The primary characteristic of the voice (e.g., 'Clear', 'Upbeat').")
134
+ gender: Gender = Field(..., description="The perceived gender of the voice.")
135
+
136
+
137
+ # This list is based on the official documentation for Google's generative voices.
138
+ # It represents the "HTML table" data you referred to.
139
+ ALL_VOICE_PROFILES: List[VoiceProfile] = [
140
+ VoiceProfile(voice_name="Zephyr", characteristic="Bright", gender="female"),
141
+ VoiceProfile(voice_name="Puck", characteristic="Upbeat", gender="male"),
142
+ VoiceProfile(voice_name="Charon", characteristic="Informative", gender="male"),
143
+ VoiceProfile(voice_name="Kore", characteristic="Firm", gender="female"),
144
+ VoiceProfile(voice_name="Fenrir", characteristic="Excitable", gender="male"),
145
+ VoiceProfile(voice_name="Leda", characteristic="Youthful", gender="female"),
146
+ VoiceProfile(voice_name="Orus", characteristic="Firm", gender="male"),
147
+ VoiceProfile(voice_name="Aoede", characteristic="Breezy", gender="female"),
148
+ VoiceProfile(voice_name="Callirrhoe", characteristic="Easy-going", gender="female"),
149
+ VoiceProfile(voice_name="Autonoe", characteristic="Bright", gender="female"),
150
+ VoiceProfile(voice_name="Enceladus", characteristic="Breathy", gender="male"),
151
+ VoiceProfile(voice_name="Iapetus", characteristic="Clear", gender="male"),
152
+ VoiceProfile(voice_name="Umbriel", characteristic="Easy-going", gender="male"),
153
+ VoiceProfile(voice_name="Algieba", characteristic="Smooth", gender="male"),
154
+ VoiceProfile(voice_name="Despina", characteristic="Smooth", gender="female"),
155
+ VoiceProfile(voice_name="Erinome", characteristic="Clear", gender="female"),
156
+ VoiceProfile(voice_name="Algenib", characteristic="Gravelly", gender="male"),
157
+ VoiceProfile(voice_name="Rasalgethi", characteristic="Informative", gender="male"),
158
+ VoiceProfile(voice_name="Laomedeia", characteristic="Upbeat", gender="female"),
159
+ VoiceProfile(voice_name="Achernar", characteristic="Soft", gender="female"),
160
+ VoiceProfile(voice_name="Alnilam", characteristic="Firm", gender="female"),
161
+ VoiceProfile(voice_name="Schedar", characteristic="Even", gender="female"),
162
+ VoiceProfile(voice_name="Gacrux", characteristic="Mature", gender="female"),
163
+ VoiceProfile(voice_name="Pulcherrima", characteristic="Forward", gender="female"),
164
+ VoiceProfile(voice_name="Achird", characteristic="Friendly", gender="female"),
165
+ VoiceProfile(voice_name="Zubenelgenubi", characteristic="Casual", gender="male"),
166
+ VoiceProfile(voice_name="Vindemiatrix", characteristic="Gentle", gender="female"),
167
+ VoiceProfile(voice_name="Sadachbia", characteristic="Lively", gender="female"),
168
+ VoiceProfile(voice_name="Sadaltager", characteristic="Knowledgeable", gender="male"),
169
+ VoiceProfile(voice_name="Sulafat", characteristic="Warm", gender="female"),
170
+ ]
171
+
172
+ class VoiceRegistry:
173
+ """
174
+ A comprehensive registry for managing and querying available voice profiles.
175
+ """
176
+ def __init__(self, profiles: List[VoiceProfile]):
177
+ """Initializes the registry with a list of voice profiles."""
178
+ self._voices: Dict[str, VoiceProfile] = {
179
+ profile.voice_name.lower(): profile for profile in profiles
180
+ }
181
+
182
+ def find_voice_by_name(self, name: str) -> Optional[VoiceProfile]:
183
+ """
184
+ Finds a voice profile by its name (case-insensitive).
185
+
186
+ Args:
187
+ name: The name of the voice to find (e.g., 'Erinome', 'puck').
188
+ Returns:
189
+ A VoiceProfile object if found, otherwise None.
190
+ """
191
+ return self._voices.get(name.lower())
192
+
193
+ def get_all_voices(self) -> List[VoiceProfile]:
194
+ """Returns a list of all voice profiles in the registry."""
195
+ return list(self._voices.values())
196
+
197
+ def get_voices_by_gender(self, gender: Gender) -> List[VoiceProfile]:
198
+ """
199
+ Filters and returns all voices matching the specified gender.
200
+
201
+ Args:
202
+ gender: The gender to filter by ('female', 'male', or 'neutral').
203
+ Returns:
204
+ A list of matching VoiceProfile objects.
205
+ """
206
+ return [
207
+ profile for profile in self._voices.values() if profile.gender == gender
208
+ ]
209
+
210
+ def get_voices_by_characteristic(self, characteristic: str) -> List[VoiceProfile]:
211
+ """
212
+ Filters and returns all voices with a specific characteristic (case-insensitive).
213
+
214
+ Args:
215
+ characteristic: The characteristic to search for (e.g., 'Clear', 'upbeat').
216
+ Returns:
217
+ A list of matching VoiceProfile objects.
218
+ """
219
+ search_char = characteristic.lower()
220
+ return [
221
+ profile for profile in self._voices.values()
222
+ if profile.characteristic.lower() == search_char
223
+ ]
parrot/models/groq.py ADDED
@@ -0,0 +1,23 @@
1
+ from enum import Enum
2
+
3
+ class GroqModel(Enum):
4
+ """Description for Enabled Groq models.
5
+
6
+ Only these models are supporting Structured Output:
7
+ - meta-llama/llama-4-maverick-17b-128e-instruct
8
+ - meta-llama/llama-4-scout-17b-16e-instruct
9
+
10
+ Also, streaming output is not supported with structured outputs.
11
+ """
12
+ KIMI_K2_INSTRUCT = "moonshotai/kimi-k2-instruct-0905"
13
+ LLAMA_4_SCOUT_17B = "meta-llama/llama-4-scout-17b-16e-instruct"
14
+ LLAMA_4_MAVERICK_17B = "meta-llama/llama-4-maverick-17b-128e-instruct"
15
+ MISTRAL_SABA_24B = "mistral-saba-24b"
16
+ DEEPSEEK_R1_DISTILL_70B = "deepseek-r1-distill-llama-70b"
17
+ LLAMA_3_3_70B_VERSATILE = "llama-3.3-70b-versatile"
18
+ LLAMA_3_1_8B_INSTANT = "llama-3.1-8b-instant"
19
+ GEMMA2_9B_IT = "gemma2-9b-it"
20
+ QWEN_QWEN3_32B = "qwen/qwen3-32b"
21
+ OPENAI_GPT_OSS_20B = "openai/gpt-oss-20b"
22
+ OPENAI_GPT_OSS_120B = "openai/gpt-oss-120b"
23
+ OPENAI_GPT_OSS_SAFEGUARD_20B = "openai/gpt-oss-safeguard-20b"
@@ -0,0 +1,30 @@
1
+ from enum import Enum
2
+
3
+
4
+ class OpenAIModel(Enum):
5
+ """Enum class for OpenAI models."""
6
+ GPT5_MINI = "gpt-5-mini"
7
+ GPT5 = "gpt-5"
8
+ GPT5_CHAT = "gpt-5-chat-latest"
9
+ GPT5_PRO = "gpt-5-pro"
10
+ GPT5_NANO = "gpt-5-nano"
11
+ GPT4_TURBO = "gpt-4-turbo"
12
+ GPT3_5_TURBO = "gpt-3.5-turbo"
13
+ GPT4_1 = "gpt-4.1"
14
+ GPT_4_1_MINI = "gpt-4.1-mini"
15
+ GPT_4_1_NANO = "gpt-4.1-nano"
16
+ GPT_O4 = "gpt-4o-2024-08-06"
17
+ GPT4 = "gpt-4"
18
+ GPT_4O_MINI = "gpt-4o-mini"
19
+ GPT_4O_SEARCH = "gpt-4o-search-preview"
20
+ GPT_4O_MINI_SEARCH = "gpt-4o-mini-search-preview"
21
+ O4_MINI = "o4-mini"
22
+ O4_MINI_DEEP_RESEARCH = "o4-mini-deep-research"
23
+ O3 = "o3"
24
+ O3_MINI = "o3-mini"
25
+ O3_PRO = "o3-pro"
26
+ O3_DEEP_RESEARCH = "o3-deep-research"
27
+ GPT_4O = "gpt-4o"
28
+ GPT_IMAGE_1 = "gpt-image-1"
29
+ SORA = "sora"
30
+ SORA_2 = "sora-2"
@@ -0,0 +1,285 @@
1
+ from datetime import datetime
2
+ from typing import (
3
+ List,
4
+ Optional,
5
+ Any,
6
+ Union,
7
+ Callable,
8
+ Literal,
9
+ get_type_hints,
10
+ get_origin,
11
+ get_args
12
+ )
13
+ from enum import Enum
14
+ from dataclasses import dataclass, fields, is_dataclass, MISSING
15
+ import json
16
+ from pydantic import BaseModel, Field
17
+ from .basic import OutputFormat
18
+
19
+
20
+ class OutputType(str, Enum):
21
+ """Types of outputs that can be rendered"""
22
+ TEXT = "text"
23
+ MARKDOWN = "markdown"
24
+ DATAFRAME = "dataframe"
25
+ FOLIUM_MAP = "folium_map"
26
+ PLOTLY_CHART = "plotly_chart"
27
+ MATPLOTLIB_FIGURE = "matplotlib_figure"
28
+ BOKEH_PLOT = "bokeh_plot"
29
+ ALTAIR_CHART = "altair_chart"
30
+ PANEL_DASHBOARD = "panel_dashboard"
31
+ HTML_WIDGET = "html_widget"
32
+ IMAGE = "image"
33
+ JSON_DATA = "json_data"
34
+ MIXED = "mixed" # Multiple output types
35
+
36
+
37
+ class OutputMode(str, Enum):
38
+ """Output mode enumeration"""
39
+ DEFAULT = "default" # Keep as-is (BaseModel/dataclass)
40
+ JSON = "json" # Serialize to JSON (using orjson)
41
+ TERMINAL = "terminal" # Render for terminal display (using Rich)
42
+ MARKDOWN = "markdown" # Convert to markdown
43
+ YAML = "yaml" # Serialize to YAML (using yaml-rs)
44
+ HTML = "html" # Convert to HTML elements (using Panel)
45
+ JINJA2 = "jinja2" # Pass to Jinja2 template (using jinja2 templates)
46
+ JUPYTER = "jupyter" # Render for Jupyter notebook
47
+ NOTEBOOK = "notebook" # Render for Jupyter notebook
48
+ TEMPLATE_REPORT = "template_report" # Pass to Jinja2 template (using jinja2 templates)
49
+ APPLICATION = "application" # Wrap in app (Streamlit/React/Svelte/HTML+TS)
50
+ CHART = "chart" # Generate chart visualization
51
+ ALTAIR = "altair" # Generate Altair chart visualization
52
+ PLOTLY = "plotly"
53
+ MATPLOTLIB = "matplotlib"
54
+ BOKEH = "bokeh"
55
+ SEABORN = "seaborn"
56
+ CODE = "code"
57
+ MAP = "map" # Generate map visualization
58
+ IMAGE = "image" # render the image as a base64 embed into HTML <img>
59
+ D3 = "d3" # Generate D3.js visualization
60
+ ECHARTS = "echarts" # Generate ECharts visualization
61
+ TABLE = "table" # Generate table visualization
62
+ HOLOVIEWS = "holoviews" # Generate HoloViews visualization
63
+ CARD = "card"
64
+
65
+ @dataclass
66
+ class StructuredOutputConfig:
67
+ """Configuration for structured output parsing."""
68
+ output_type: type
69
+ format: OutputFormat = OutputFormat.JSON
70
+ custom_parser: Optional[Callable[[str], Any]] = None
71
+
72
+ def get_schema(self) -> dict[str, Any]:
73
+ """
74
+ Extract JSON schema from output_type.
75
+ Supports both Pydantic models and dataclasses.
76
+ """
77
+ # Check if it's a Pydantic model
78
+ if hasattr(self.output_type, 'model_json_schema'):
79
+ # Pydantic v2
80
+ return self.output_type.model_json_schema()
81
+ elif hasattr(self.output_type, 'schema'):
82
+ # Pydantic v1
83
+ return self.output_type.schema()
84
+
85
+ # Check if it's a dataclass
86
+ elif is_dataclass(self.output_type):
87
+ return self._dataclass_to_schema(self.output_type)
88
+
89
+ else:
90
+ raise ValueError(
91
+ f"output_type must be a Pydantic model or dataclass, "
92
+ f"got {type(self.output_type)}"
93
+ )
94
+
95
+ def _dataclass_to_schema(self, dc: type) -> dict[str, Any]:
96
+ """Convert a dataclass to JSON schema."""
97
+ type_hints = get_type_hints(dc)
98
+ properties = {}
99
+ required = []
100
+
101
+ for field in fields(dc):
102
+ field_type = type_hints.get(field.name, Any)
103
+ field_schema = self._python_type_to_json_schema(field_type)
104
+
105
+ # Add description from field metadata if available
106
+ if field.metadata:
107
+ field_schema["description"] = field.metadata.get("description", "")
108
+
109
+ properties[field.name] = field_schema
110
+
111
+ # Check if field is required (no default value)
112
+ if field.default == field.default_factory == MISSING:
113
+ required.append(field.name)
114
+
115
+ schema = {
116
+ "type": "object",
117
+ "properties": properties,
118
+ "required": required,
119
+ "title": dc.__name__
120
+ }
121
+
122
+ # Add docstring as description if available
123
+ if dc.__doc__:
124
+ schema["description"] = dc.__doc__.strip()
125
+
126
+ return schema
127
+
128
+ def _python_type_to_json_schema(self, py_type: Any) -> dict[str, Any]:
129
+ """Convert Python type hints to JSON schema types."""
130
+ origin = get_origin(py_type)
131
+
132
+ # Handle Optional types
133
+ if origin is Union:
134
+ args = get_args(py_type)
135
+ if type(None) in args:
136
+ # It's Optional[T]
137
+ non_none_types = [t for t in args if t is not type(None)]
138
+ if len(non_none_types) == 1:
139
+ return self._python_type_to_json_schema(non_none_types[0])
140
+
141
+ # Handle List types
142
+ if origin is list:
143
+ item_type = get_args(py_type)[0] if get_args(py_type) else Any
144
+ return {
145
+ "type": "array",
146
+ "items": self._python_type_to_json_schema(item_type)
147
+ }
148
+
149
+ # Handle Dict types
150
+ if origin is dict:
151
+ return {"type": "object"}
152
+
153
+ # Basic type mappings
154
+ type_map = {
155
+ str: {"type": "string"},
156
+ int: {"type": "integer"},
157
+ float: {"type": "number"},
158
+ bool: {"type": "boolean"},
159
+ list: {"type": "array"},
160
+ dict: {"type": "object"},
161
+ }
162
+
163
+ return type_map.get(py_type, {"type": "string"})
164
+
165
+ def format_schema_instruction(self) -> str:
166
+ """
167
+ Format the schema as an instruction for the system prompt.
168
+ """
169
+ schema = self.get_schema()
170
+ return f"""Respond with a valid JSON object that strictly matches the requested schema.
171
+
172
+ Schema:
173
+ ```json
174
+ {json.dumps(schema, indent=2)}
175
+ ```
176
+
177
+ Rules:
178
+ - Output ONLY valid JSON matching this schema
179
+ - Do not include any explanatory text before or after the JSON
180
+ - All required fields must be present
181
+ - Field types must match exactly"""
182
+
183
+
184
+ class BoundingBox(BaseModel):
185
+ """Represents a detected object with its location and details."""
186
+ object_id: str = Field(..., description="Unique identifier for this detection")
187
+ brand: str = Field(..., description="Product brand (Epson, HP, Canon, etc.)")
188
+ model: Optional[str] = Field(None, description="Product model if identifiable")
189
+ product_type: str = Field(
190
+ ..., description="Type of product (printer, scanner, ink cartridge, etc.)"
191
+ )
192
+ description: str = Field(..., description="Brief description of the product")
193
+ confidence: float = Field(..., description="Confidence level (0.0 to 1.0)")
194
+ # Simple bounding box as [x1, y1, x2, y2] normalized coordinates (0.0 to 1.0)
195
+ bbox: List[float] = Field(
196
+ ..., description="Bounding box coordinates [x1, y1, x2, y2] as normalized values (0.0-1.0)"
197
+ )
198
+
199
+
200
+ class ObjectDetectionResult(BaseModel):
201
+ """A list of all prominent items detected in the image."""
202
+ analysis: str = Field(
203
+ ...,
204
+ description="A detailed text analysis of the image that answers the user's prompt."
205
+ )
206
+ total_count: int = Field(..., description="Total number of products detected")
207
+ detections: List[BoundingBox] = Field(
208
+ default_factory=list,
209
+ description="A list of bounding boxes for all prominent detected objects."
210
+ )
211
+
212
+ class ImageGenerationPrompt(BaseModel):
213
+ """Input schema for generating an image."""
214
+ prompt: str = Field(..., description="The main text prompt describing the desired image.")
215
+ styles: Optional[List[str]] = Field(default_factory=list, description="Optional list of styles to apply (e.g., 'photorealistic', 'cinematic', 'anime').")
216
+ model: str = Field(description="The image generation model to use.")
217
+ negative_prompt: Optional[str] = Field(None, description="A description of what to avoid in the image.")
218
+ aspect_ratio: str = Field(default="1:1", description="The desired aspect ratio (e.g., '1:1', '16:9', '9:16').")
219
+
220
+
221
+ class SpeakerConfig(BaseModel):
222
+ """Configuration for a single speaker in speech generation."""
223
+ name: str = Field(..., description="The name of the speaker in the script (e.g., 'Joe', 'Narrator').")
224
+ voice: str = Field(..., description="The pre-built voice name to use (e.g., 'Kore', 'Puck', 'Chitose').")
225
+ # Gender is often inferred from the voice, but can be included for clarity
226
+ gender: Optional[str] = Field(None, description="The gender associated with the voice (e.g., 'Male', 'Female').")
227
+
228
+
229
+ class SpeechGenerationPrompt(BaseModel):
230
+ """Input schema for generating speech from text."""
231
+ prompt: str = Field(
232
+ ...,
233
+ description="The text to be converted to speech. For multiple speakers, use their names (e.g., 'Joe: Hello. Jane: Hi there.')."
234
+ )
235
+ speakers: List[SpeakerConfig] = Field(
236
+ ...,
237
+ description="A list of speaker configurations. Use one for a single voice, multiple for a conversation."
238
+ )
239
+ model: Optional[str] = Field(default=None, description="The text-to-speech model to use.")
240
+ language: Optional[str] = Field("en-US", description="Language code for the conversation.")
241
+
242
+
243
+ class VideoGenerationPrompt(BaseModel):
244
+ """Input schema for generating video content."""
245
+ prompt: str = Field(..., description="The text prompt describing the desired video content.")
246
+ number_of_videos: int = Field(
247
+ default=1, description="The number of videos to generated per request."
248
+ )
249
+ model: str = Field(..., description="The video generation model to use.")
250
+ aspect_ratio: str = Field(
251
+ default="16:9", description="The desired aspect ratio (e.g., '16:9', '9:16')."
252
+ )
253
+ duration: Optional[int] = Field(None, description="Optional duration in seconds for the video.")
254
+ negative_prompt: Optional[str] = Field(
255
+ default='',
256
+ description="A description of what to avoid in the video."
257
+ )
258
+
259
+ class SentimentAnalysis(BaseModel):
260
+ """Structured sentiment analysis response."""
261
+ sentiment: Literal["positive", "negative", "neutral", "mixed"] = Field(
262
+ description="Overall sentiment classification"
263
+ )
264
+ confidence_level: float = Field(
265
+ ge=0.0, le=1.0,
266
+ description="Confidence level as decimal between 0 and 1"
267
+ )
268
+ emotional_indicators: List[str] = Field(
269
+ description="List of words/phrases that indicate emotional content"
270
+ )
271
+ reason: str = Field(
272
+ description="Explanation of the sentiment analysis"
273
+ )
274
+
275
+
276
+ class ProductReview(BaseModel):
277
+ """Structured product review response."""
278
+ product_id: str = Field(..., description="Unique identifier for the product being reviewed")
279
+ product_name: str = Field(..., description="Name of the product being reviewed")
280
+ review_text: str = Field(..., description="The text of the product review")
281
+ rating: float = Field(..., description="Rating given to the product")
282
+ sentiment: Literal["positive", "negative", "neutral"] = Field(
283
+ ..., description="Sentiment of the review"
284
+ )
285
+ key_features: list[str] = Field(..., description="Key features highlighted in the review")