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,855 @@
1
+ """
2
+ ECharts Geo Extension for AI-Parrot
3
+ Adds geographic visualization capabilities to EChartsRenderer
4
+ """
5
+ from typing import Any, Optional, Dict, List, Tuple, Union
6
+ import json
7
+ import logging
8
+ import uuid
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ # Extended system prompt with geo support
14
+ ECHARTS_GEO_EXTENSION = """
15
+ **GEO/MAP SUPPORT:**
16
+
17
+ ECharts supports powerful geographic visualizations using the `geo` component and map series types.
18
+
19
+ **COORDINATE SYSTEM:**
20
+ ⚠️ IMPORTANT: ECharts uses [longitude, latitude] order (opposite of Leaflet/Folium)
21
+ - Correct: [-80.1918, 25.7617] (Miami, FL)
22
+ - Wrong: [25.7617, -80.1918]
23
+
24
+ **BASIC MAP STRUCTURE:**
25
+ ```json
26
+ {
27
+ "title": {"text": "Map Title"},
28
+ "tooltip": {"trigger": "item"},
29
+ "geo": {
30
+ "map": "USA",
31
+ "roam": true,
32
+ "center": [-95, 38],
33
+ "zoom": 1.2,
34
+ "itemStyle": {
35
+ "areaColor": "#f3f3f3",
36
+ "borderColor": "#999"
37
+ },
38
+ "emphasis": {
39
+ "itemStyle": {
40
+ "areaColor": "#e0e0e0"
41
+ }
42
+ }
43
+ },
44
+ "series": [{
45
+ "type": "scatter",
46
+ "coordinateSystem": "geo",
47
+ "data": [
48
+ {"name": "Location 1", "value": [-80.19, 25.76, 100]},
49
+ {"name": "Location 2", "value": [-118.24, 34.05, 200]}
50
+ ],
51
+ "symbolSize": function(val) { return val[2] / 10; },
52
+ "itemStyle": {"color": "#c23531"}
53
+ }]
54
+ }
55
+ ```
56
+
57
+ **MAP TYPES:**
58
+
59
+ 1. **Scatter Map** (Point locations):
60
+ ```json
61
+ {
62
+ "geo": {"map": "USA", "roam": true},
63
+ "series": [{
64
+ "type": "scatter",
65
+ "coordinateSystem": "geo",
66
+ "data": [
67
+ {"name": "Store A", "value": [-80.19, 25.76, 50]},
68
+ {"name": "Store B", "value": [-118.24, 34.05, 100]}
69
+ ],
70
+ "symbolSize": 10
71
+ }]
72
+ }
73
+ ```
74
+
75
+ 2. **Lines Map** (Routes/Connections):
76
+ ```json
77
+ {
78
+ "geo": {"map": "world", "roam": true},
79
+ "series": [{
80
+ "type": "lines",
81
+ "coordinateSystem": "geo",
82
+ "data": [
83
+ {
84
+ "coords": [[-118.24, 34.05], [-74.01, 40.71]]
85
+ }
86
+ ],
87
+ "lineStyle": {"color": "#c23531", "width": 2}
88
+ }]
89
+ }
90
+ ```
91
+
92
+ 3. **Heatmap** (Density visualization):
93
+ ```json
94
+ {
95
+ "geo": {"map": "USA", "roam": true},
96
+ "visualMap": {
97
+ "min": 0,
98
+ "max": 100,
99
+ "calculable": true,
100
+ "inRange": {"color": ["#50a3ba", "#eac736", "#d94e5d"]}
101
+ },
102
+ "series": [{
103
+ "type": "heatmap",
104
+ "coordinateSystem": "geo",
105
+ "data": [
106
+ [-80.19, 25.76, 75],
107
+ [-118.24, 34.05, 90]
108
+ ]
109
+ }]
110
+ }
111
+ ```
112
+
113
+ 4. **Choropleth** (Colored regions):
114
+ ```json
115
+ {
116
+ "visualMap": {
117
+ "min": 0,
118
+ "max": 1000,
119
+ "text": ["High", "Low"],
120
+ "calculable": true
121
+ },
122
+ "series": [{
123
+ "type": "map",
124
+ "map": "USA",
125
+ "roam": true,
126
+ "data": [
127
+ {"name": "California", "value": 1000},
128
+ {"name": "Texas", "value": 800},
129
+ {"name": "Florida", "value": 600}
130
+ ]
131
+ }]
132
+ }
133
+ ```
134
+
135
+ **AVAILABLE BASE MAPS:**
136
+ - "USA" - United States map
137
+ - "world" - World map (default)
138
+ - Custom GeoJSON can be registered dynamically
139
+
140
+ **DATA VALIDATION FOR MAPS:**
141
+ 1. Extract geographic information from available data
142
+ 2. Validate coordinates are in [lon, lat] order
143
+ 3. Filter invalid coordinates (0, 0) or out-of-range values
144
+ 4. For US locations: lon ~-125 to -65, lat ~25 to 50
145
+ 5. Center map on average of valid coordinates
146
+
147
+ **GEOCODING REFERENCE (US Cities):**
148
+ Remember: [longitude, latitude] order!
149
+ - Miami, FL: [-80.1918, 25.7617]
150
+ - New York, NY: [-74.0060, 40.7128]
151
+ - Los Angeles, CA: [-118.2437, 34.0522]
152
+ - Chicago, IL: [-87.6298, 41.8781]
153
+ - Houston, TX: [-95.3698, 29.7604]
154
+ - Phoenix, AZ: [-112.0740, 33.4484]
155
+ - Philadelphia, PA: [-75.1652, 39.9526]
156
+ - San Antonio, TX: [-98.4936, 29.4241]
157
+ - San Diego, CA: [-117.1611, 32.7157]
158
+ - Dallas, TX: [-96.7970, 32.7767]
159
+
160
+ **EXAMPLE - Complete Map with Data:**
161
+ ```json
162
+ {
163
+ "title": {
164
+ "text": "Retail Locations in Miami Area",
165
+ "left": "center"
166
+ },
167
+ "tooltip": {
168
+ "trigger": "item",
169
+ "formatter": "{b}: {c}"
170
+ },
171
+ "geo": {
172
+ "map": "USA",
173
+ "roam": true,
174
+ "center": [-80.19, 25.76],
175
+ "zoom": 8,
176
+ "itemStyle": {
177
+ "areaColor": "#f3f3f3",
178
+ "borderColor": "#999"
179
+ }
180
+ },
181
+ "series": [{
182
+ "name": "Stores",
183
+ "type": "scatter",
184
+ "coordinateSystem": "geo",
185
+ "data": [
186
+ {"name": "Best Buy 1502", "value": [-80.37, 25.79, 1]},
187
+ {"name": "Costco 1023", "value": [-80.41, 25.65, 1]},
188
+ {"name": "Target 968", "value": [-80.32, 25.74, 1]}
189
+ ],
190
+ "symbolSize": 12,
191
+ "itemStyle": {
192
+ "color": "#c23531"
193
+ },
194
+ "label": {
195
+ "show": false,
196
+ "formatter": "{b}"
197
+ },
198
+ "emphasis": {
199
+ "label": {
200
+ "show": true
201
+ }
202
+ }
203
+ }]
204
+ }
205
+ ```
206
+ """
207
+
208
+
209
+ # US State coordinate reference
210
+ US_STATE_CENTERS = {
211
+ 'Alabama': [-86.9023, 32.3182],
212
+ 'Alaska': [-152.4044, 61.3707],
213
+ 'Arizona': [-111.4312, 34.0489],
214
+ 'Arkansas': [-92.3731, 34.7465],
215
+ 'California': [-119.4179, 36.7783],
216
+ 'Colorado': [-105.7821, 39.5501],
217
+ 'Connecticut': [-72.7554, 41.6032],
218
+ 'Delaware': [-75.5071, 39.3185],
219
+ 'Florida': [-81.5158, 27.6648],
220
+ 'Georgia': [-83.5007, 33.2490],
221
+ 'Hawaii': [-155.5828, 19.8968],
222
+ 'Idaho': [-114.7420, 44.0682],
223
+ 'Illinois': [-89.3985, 40.6331],
224
+ 'Indiana': [-86.1349, 40.2672],
225
+ 'Iowa': [-93.0977, 41.8780],
226
+ 'Kansas': [-98.4842, 39.0119],
227
+ 'Kentucky': [-84.2700, 37.8393],
228
+ 'Louisiana': [-91.9623, 30.9843],
229
+ 'Maine': [-69.4455, 45.2538],
230
+ 'Maryland': [-76.6413, 39.0458],
231
+ 'Massachusetts': [-71.3824, 42.4072],
232
+ 'Michigan': [-85.6024, 44.3148],
233
+ 'Minnesota': [-94.6859, 46.7296],
234
+ 'Mississippi': [-89.3985, 32.3547],
235
+ 'Missouri': [-92.6038, 37.9643],
236
+ 'Montana': [-110.3626, 46.8797],
237
+ 'Nebraska': [-99.9018, 41.4925],
238
+ 'Nevada': [-116.4194, 38.8026],
239
+ 'New Hampshire': [-71.5724, 43.1939],
240
+ 'New Jersey': [-74.4057, 40.0583],
241
+ 'New Mexico': [-105.8701, 34.5199],
242
+ 'New York': [-75.5268, 43.2994],
243
+ 'North Carolina': [-79.0193, 35.7596],
244
+ 'North Dakota': [-101.0020, 47.5515],
245
+ 'Ohio': [-82.9071, 40.4173],
246
+ 'Oklahoma': [-97.0929, 35.4676],
247
+ 'Oregon': [-120.5542, 43.8041],
248
+ 'Pennsylvania': [-77.1945, 41.2033],
249
+ 'Rhode Island': [-71.4774, 41.5801],
250
+ 'South Carolina': [-81.1637, 33.8361],
251
+ 'South Dakota': [-99.9018, 43.9695],
252
+ 'Tennessee': [-86.5804, 35.5175],
253
+ 'Texas': [-99.9018, 31.9686],
254
+ 'Utah': [-111.0937, 39.3200],
255
+ 'Vermont': [-72.5778, 44.5588],
256
+ 'Virginia': [-78.6569, 37.4316],
257
+ 'Washington': [-120.7401, 47.7511],
258
+ 'West Virginia': [-80.4549, 38.5976],
259
+ 'Wisconsin': [-89.6165, 43.7844],
260
+ 'Wyoming': [-107.2903, 43.0760],
261
+ }
262
+
263
+
264
+ class CoordinateValidator:
265
+ """Validates and transforms geographic coordinates for ECharts"""
266
+
267
+ @staticmethod
268
+ def is_valid_coordinate(lon: float, lat: float, region: str = "world") -> bool:
269
+ """
270
+ Validate if coordinates are within acceptable ranges
271
+
272
+ Args:
273
+ lon: Longitude value
274
+ lat: Latitude value
275
+ region: Geographic region for bounds checking ("world", "usa", "europe", etc.)
276
+
277
+ Returns:
278
+ True if coordinates are valid
279
+ """
280
+ # Basic global validation
281
+ if not (-180 <= lon <= 180 and -90 <= lat <= 90):
282
+ return False
283
+
284
+ # Reject obvious invalid values
285
+ if lon == 0 and lat == 0:
286
+ return False
287
+
288
+ # Region-specific validation
289
+ if region.lower() == "usa":
290
+ return -125 <= lon <= -65 and 25 <= lat <= 50
291
+ elif region.lower() == "europe":
292
+ return -25 <= lon <= 40 and 35 <= lat <= 70
293
+
294
+ return True
295
+
296
+ @staticmethod
297
+ def validate_coordinates(
298
+ coordinates: List[Tuple[float, float]],
299
+ region: str = "world"
300
+ ) -> List[Tuple[float, float]]:
301
+ """
302
+ Filter out invalid coordinates from a list
303
+
304
+ Args:
305
+ coordinates: List of (lon, lat) tuples
306
+ region: Geographic region for validation
307
+
308
+ Returns:
309
+ List of valid coordinates
310
+ """
311
+ valid = []
312
+ for lon, lat in coordinates:
313
+ if CoordinateValidator.is_valid_coordinate(lon, lat, region):
314
+ valid.append((lon, lat))
315
+ else:
316
+ logger.warning(f"Invalid coordinate filtered: [{lon}, {lat}]")
317
+
318
+ return valid
319
+
320
+ @staticmethod
321
+ def calculate_center(coordinates: List[Tuple[float, float]]) -> Tuple[float, float]:
322
+ """
323
+ Calculate the center point of a set of coordinates
324
+
325
+ Args:
326
+ coordinates: List of (lon, lat) tuples
327
+
328
+ Returns:
329
+ Center point as (lon, lat)
330
+ """
331
+ if not coordinates:
332
+ return (0, 0)
333
+
334
+ avg_lon = sum(coord[0] for coord in coordinates) / len(coordinates)
335
+ avg_lat = sum(coord[1] for coord in coordinates) / len(coordinates)
336
+
337
+ return (avg_lon, avg_lat)
338
+
339
+ @staticmethod
340
+ def suggest_zoom(coordinates: List[Tuple[float, float]]) -> float:
341
+ """
342
+ Suggest appropriate zoom level based on coordinate spread
343
+
344
+ Args:
345
+ coordinates: List of (lon, lat) tuples
346
+
347
+ Returns:
348
+ Suggested zoom level (1-12)
349
+ """
350
+ if not coordinates or len(coordinates) < 2:
351
+ return 5.0
352
+
353
+ lons = [coord[0] for coord in coordinates]
354
+ lats = [coord[1] for coord in coordinates]
355
+
356
+ lon_range = max(lons) - min(lons)
357
+ lat_range = max(lats) - min(lats)
358
+
359
+ max_range = max(lon_range, lat_range)
360
+
361
+ # Zoom mapping based on coordinate spread
362
+ if max_range > 100:
363
+ return 2.0
364
+ elif max_range > 50:
365
+ return 3.0
366
+ elif max_range > 20:
367
+ return 4.0
368
+ elif max_range > 10:
369
+ return 5.0
370
+ elif max_range > 5:
371
+ return 6.0
372
+ elif max_range > 2:
373
+ return 7.0
374
+ elif max_range > 1:
375
+ return 8.0
376
+ elif max_range > 0.5:
377
+ return 10.0
378
+ else:
379
+ return 12.0
380
+
381
+
382
+ class EChartsGeoBuilder:
383
+ """Helper class to build ECharts geo configurations programmatically"""
384
+
385
+ def __init__(self, map_type: str = "USA"):
386
+ """
387
+ Initialize geo builder
388
+
389
+ Args:
390
+ map_type: Base map to use ("USA", "world", or custom)
391
+ """
392
+ self.map_type = map_type
393
+ self.config = {
394
+ "tooltip": {"trigger": "item"},
395
+ "geo": {
396
+ "map": map_type,
397
+ "roam": True,
398
+ "itemStyle": {
399
+ "areaColor": "#f3f3f3",
400
+ "borderColor": "#999"
401
+ },
402
+ "emphasis": {
403
+ "itemStyle": {
404
+ "areaColor": "#e0e0e0"
405
+ }
406
+ }
407
+ },
408
+ "series": []
409
+ }
410
+
411
+ def set_title(self, text: str, **kwargs) -> 'EChartsGeoBuilder':
412
+ """Set chart title"""
413
+ self.config["title"] = {"text": text, **kwargs}
414
+ return self
415
+
416
+ def set_center(self, lon: float, lat: float) -> 'EChartsGeoBuilder':
417
+ """Set map center point"""
418
+ self.config["geo"]["center"] = [lon, lat]
419
+ return self
420
+
421
+ def set_zoom(self, zoom: float) -> 'EChartsGeoBuilder':
422
+ """Set map zoom level"""
423
+ self.config["geo"]["zoom"] = zoom
424
+ return self
425
+
426
+ def add_scatter_series(
427
+ self,
428
+ data: List[Dict[str, Any]],
429
+ name: str = "Points",
430
+ symbol_size: Union[int, str] = 10,
431
+ color: str = "#c23531",
432
+ **kwargs
433
+ ) -> 'EChartsGeoBuilder':
434
+ """
435
+ Add a scatter plot series to the map
436
+
437
+ Args:
438
+ data: List of point data [{"name": str, "value": [lon, lat, size]}]
439
+ name: Series name
440
+ symbol_size: Point size (int or JS function as string)
441
+ color: Point color
442
+ **kwargs: Additional series options
443
+ """
444
+ series = {
445
+ "name": name,
446
+ "type": "scatter",
447
+ "coordinateSystem": "geo",
448
+ "data": data,
449
+ "symbolSize": symbol_size,
450
+ "itemStyle": {"color": color},
451
+ **kwargs
452
+ }
453
+ self.config["series"].append(series)
454
+ return self
455
+
456
+ def add_lines_series(
457
+ self,
458
+ data: List[Dict[str, Any]],
459
+ name: str = "Routes",
460
+ line_color: str = "#c23531",
461
+ line_width: int = 2,
462
+ **kwargs
463
+ ) -> 'EChartsGeoBuilder':
464
+ """
465
+ Add a lines series to show connections/routes
466
+
467
+ Args:
468
+ data: List of line data [{"coords": [[lon1, lat1], [lon2, lat2]]}]
469
+ name: Series name
470
+ line_color: Line color
471
+ line_width: Line width in pixels
472
+ **kwargs: Additional series options
473
+ """
474
+ series = {
475
+ "name": name,
476
+ "type": "lines",
477
+ "coordinateSystem": "geo",
478
+ "data": data,
479
+ "lineStyle": {
480
+ "color": line_color,
481
+ "width": line_width
482
+ },
483
+ **kwargs
484
+ }
485
+ self.config["series"].append(series)
486
+ return self
487
+
488
+ def add_heatmap_series(
489
+ self,
490
+ data: List[List[float]],
491
+ name: str = "Heatmap",
492
+ color_range: Optional[List[str]] = None,
493
+ **kwargs
494
+ ) -> 'EChartsGeoBuilder':
495
+ """
496
+ Add a heatmap series
497
+
498
+ Args:
499
+ data: List of points [[lon, lat, value], ...]
500
+ name: Series name
501
+ color_range: Color gradient (default: blue-yellow-red)
502
+ **kwargs: Additional series options
503
+ """
504
+ if color_range is None:
505
+ color_range = ["#50a3ba", "#eac736", "#d94e5d"]
506
+
507
+ # Add visual map if not exists
508
+ if "visualMap" not in self.config:
509
+ values = [point[2] for point in data if len(point) >= 3]
510
+ self.config["visualMap"] = {
511
+ "min": min(values) if values else 0,
512
+ "max": max(values) if values else 100,
513
+ "calculable": True,
514
+ "inRange": {"color": color_range}
515
+ }
516
+
517
+ series = {
518
+ "name": name,
519
+ "type": "heatmap",
520
+ "coordinateSystem": "geo",
521
+ "data": data,
522
+ **kwargs
523
+ }
524
+ self.config["series"].append(series)
525
+ return self
526
+
527
+ def add_choropleth_series(
528
+ self,
529
+ data: List[Dict[str, Any]],
530
+ name: str = "Regions",
531
+ color_range: Optional[List[str]] = None,
532
+ **kwargs
533
+ ) -> 'EChartsGeoBuilder':
534
+ """
535
+ Add a choropleth map series (colored regions)
536
+
537
+ Args:
538
+ data: List of region data [{"name": "State/Country", "value": number}]
539
+ name: Series name
540
+ color_range: Color gradient
541
+ **kwargs: Additional series options
542
+ """
543
+ if color_range is None:
544
+ color_range = ["#edf8fb", "#b2e2e2", "#66c2a4", "#2ca25f", "#006d2c"]
545
+
546
+ # Add visual map if not exists
547
+ if "visualMap" not in self.config:
548
+ values = [item["value"] for item in data]
549
+ self.config["visualMap"] = {
550
+ "min": min(values) if values else 0,
551
+ "max": max(values) if values else 100,
552
+ "text": ["High", "Low"],
553
+ "calculable": True,
554
+ "inRange": {"color": color_range}
555
+ }
556
+
557
+ series = {
558
+ "name": name,
559
+ "type": "map",
560
+ "map": self.map_type,
561
+ "roam": True,
562
+ "data": data,
563
+ **kwargs
564
+ }
565
+ self.config["series"].append(series)
566
+ return self
567
+
568
+ def auto_configure_from_data(
569
+ self,
570
+ coordinates: List[Tuple[float, float]],
571
+ region: str = "world"
572
+ ) -> 'EChartsGeoBuilder':
573
+ """
574
+ Automatically configure map center and zoom based on data
575
+
576
+ Args:
577
+ coordinates: List of (lon, lat) tuples
578
+ region: Geographic region for validation
579
+
580
+ Returns:
581
+ Self for chaining
582
+ """
583
+ # Validate coordinates
584
+ valid_coords = CoordinateValidator.validate_coordinates(coordinates, region)
585
+
586
+ if not valid_coords:
587
+ logger.warning("No valid coordinates found for auto-configuration")
588
+ return self
589
+
590
+ # Calculate center
591
+ center_lon, center_lat = CoordinateValidator.calculate_center(valid_coords)
592
+ self.set_center(center_lon, center_lat)
593
+
594
+ # Suggest zoom
595
+ zoom = CoordinateValidator.suggest_zoom(valid_coords)
596
+ self.set_zoom(zoom)
597
+
598
+ return self
599
+
600
+ def build(self) -> Dict[str, Any]:
601
+ """Build and return the complete configuration"""
602
+ return self.config
603
+
604
+ def to_json(self, indent: int = 2) -> str:
605
+ """Export configuration as JSON string"""
606
+ return json.dumps(self.config, indent=indent)
607
+
608
+
609
+ class EChartsMapsMixin:
610
+ """
611
+ Mixin class to add geo/map capabilities to EChartsRenderer
612
+
613
+ This mixin adds methods for creating and validating geographic visualizations
614
+ to the existing EChartsRenderer without breaking existing functionality.
615
+
616
+ Usage in echarts.py:
617
+ from ._echarts_geo_ext import EChartsMapsMixin
618
+
619
+ @register_renderer(OutputMode.ECHARTS, system_prompt=ECHARTS_SYSTEM_PROMPT)
620
+ class EChartsRenderer(EChartsMapsMixin, BaseChart):
621
+ # ... existing methods ...
622
+ """
623
+
624
+ def create_geo_builder(self, map_type: str = "USA") -> EChartsGeoBuilder:
625
+ """
626
+ Factory method to create a geo builder
627
+
628
+ Args:
629
+ map_type: Base map type ("USA", "world", etc.)
630
+
631
+ Returns:
632
+ EChartsGeoBuilder instance
633
+ """
634
+ return EChartsGeoBuilder(map_type)
635
+
636
+ def validate_geo_config(self, config: Dict[str, Any]) -> Tuple[bool, Optional[str]]:
637
+ """
638
+ Validate a geo configuration
639
+
640
+ Args:
641
+ config: ECharts configuration dict
642
+
643
+ Returns:
644
+ Tuple of (is_valid, error_message)
645
+ """
646
+ if not isinstance(config, dict):
647
+ return False, "Configuration must be a dictionary"
648
+
649
+ # Check if it's a geo chart
650
+ has_geo = "geo" in config
651
+ has_geo_series = any(
652
+ s.get("coordinateSystem") == "geo" or s.get("type") == "map"
653
+ for s in config.get("series", [])
654
+ )
655
+
656
+ if not (has_geo or has_geo_series):
657
+ return True, None # Not a geo chart, no validation needed
658
+
659
+ # Validate geo component if present
660
+ if has_geo:
661
+ geo = config["geo"]
662
+ if "map" not in geo:
663
+ return False, "Geo component must specify a 'map'"
664
+
665
+ # Validate series with geo coordinate system
666
+ for idx, series in enumerate(config.get("series", [])):
667
+ if series.get("coordinateSystem") == "geo":
668
+ data = series.get("data", [])
669
+
670
+ # Check coordinate format
671
+ for point_idx, point in enumerate(data):
672
+ if isinstance(point, dict) and "value" in point:
673
+ value = point["value"]
674
+ if isinstance(value, list) and len(value) >= 2:
675
+ lon, lat = value[0], value[1]
676
+ if not CoordinateValidator.is_valid_coordinate(lon, lat):
677
+ logger.warning(
678
+ f"Potentially invalid coordinate in series {idx}, "
679
+ f"point {point_idx}: [{lon}, {lat}]"
680
+ )
681
+ elif isinstance(point, list) and len(point) >= 2:
682
+ lon, lat = point[0], point[1]
683
+ if not CoordinateValidator.is_valid_coordinate(lon, lat):
684
+ logger.warning(
685
+ f"Potentially invalid coordinate in series {idx}, "
686
+ f"point {point_idx}: [{lon}, {lat}]"
687
+ )
688
+
689
+ return True, None
690
+
691
+ def render_geo_map(
692
+ self,
693
+ map_type: str = "USA",
694
+ title: Optional[str] = None,
695
+ scatter_data: Optional[list] = None,
696
+ choropleth_data: Optional[list] = None,
697
+ auto_center: bool = True,
698
+ **kwargs
699
+ ) -> Dict[str, Any]:
700
+ """
701
+ Convenience method to quickly create a geo map
702
+
703
+ Args:
704
+ map_type: Base map ("USA", "world")
705
+ title: Map title
706
+ scatter_data: Point data for scatter plot
707
+ choropleth_data: Region data for choropleth
708
+ auto_center: Auto-calculate center and zoom
709
+ **kwargs: Additional options
710
+
711
+ Returns:
712
+ ECharts configuration dict
713
+ """
714
+ builder = self.create_geo_builder(map_type)
715
+
716
+ if title:
717
+ builder.set_title(title)
718
+
719
+ # Add scatter layer if provided
720
+ if scatter_data:
721
+ # Extract coordinates for auto-centering
722
+ if auto_center:
723
+ coords = []
724
+ for point in scatter_data:
725
+ if isinstance(point, dict) and "value" in point:
726
+ value = point["value"]
727
+ if isinstance(value, list) and len(value) >= 2:
728
+ coords.append((value[0], value[1]))
729
+
730
+ if coords:
731
+ builder.auto_configure_from_data(coords, map_type.lower())
732
+
733
+ builder.add_scatter_series(
734
+ scatter_data,
735
+ name=kwargs.get('scatter_name', 'Locations'),
736
+ symbol_size=kwargs.get('symbol_size', 10),
737
+ color=kwargs.get('scatter_color', '#c23531')
738
+ )
739
+
740
+ # Add choropleth layer if provided
741
+ if choropleth_data:
742
+ builder.add_choropleth_series(
743
+ choropleth_data,
744
+ name=kwargs.get('choropleth_name', 'Regions'),
745
+ color_range=kwargs.get('color_range')
746
+ )
747
+
748
+ return builder.build()
749
+
750
+ def _render_chart_content_geo(
751
+ self,
752
+ config: Dict[str, Any],
753
+ chart_id: str,
754
+ width: str = '100%',
755
+ height: str = '500px'
756
+ ) -> str:
757
+ """
758
+ Enhanced chart rendering that adds USA map loading if needed
759
+
760
+ This can be called from _render_chart_content to add geo support.
761
+
762
+ Args:
763
+ config: ECharts configuration
764
+ chart_id: Unique chart ID
765
+ width: Chart width
766
+ height: Chart height
767
+
768
+ Returns:
769
+ HTML/JS string with map loading support
770
+ """
771
+ # Convert to JSON
772
+ config_json = json.dumps(config, indent=2)
773
+
774
+ # Check if this is a geo chart that needs map data
775
+ needs_usa_map = (
776
+ 'geo' in config and config['geo'].get('map') == 'USA'
777
+ ) or any(
778
+ s.get('type') == 'map' and s.get('map') == 'USA'
779
+ for s in config.get('series', [])
780
+ )
781
+
782
+ # Load USA map data if needed
783
+ map_script = ""
784
+ if needs_usa_map:
785
+ map_script = """
786
+ <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/map/js/usa.js"></script>
787
+ """
788
+
789
+ return f'''
790
+ {map_script}
791
+ <div id="{chart_id}" style="width: {width}; height: {height};"></div>
792
+ <script type="text/javascript">
793
+ (function() {{
794
+ var chartDom = document.getElementById('{chart_id}');
795
+ if (!chartDom) {{
796
+ console.error('Chart container not found: {chart_id}');
797
+ return;
798
+ }}
799
+
800
+ // Check if ECharts is loaded
801
+ if (typeof echarts === 'undefined') {{
802
+ console.error('ECharts library not loaded');
803
+ chartDom.innerHTML = '<div style="color: red; padding: 20px;">ECharts library not loaded</div>';
804
+ return;
805
+ }}
806
+
807
+ var myChart = echarts.init(chartDom);
808
+ var option = {config_json};
809
+
810
+ // Set option with error handling
811
+ try {{
812
+ myChart.setOption(option);
813
+ console.log('ECharts {chart_id} rendered successfully');
814
+ }} catch (error) {{
815
+ console.error('Error setting ECharts option:', error);
816
+ chartDom.innerHTML = '<div style="color: red; padding: 20px;">Error rendering chart: ' + error.message + '</div>';
817
+ return;
818
+ }}
819
+
820
+ // Resize handler
821
+ window.addEventListener('resize', function() {{
822
+ myChart.resize();
823
+ }});
824
+
825
+ // Cleanup on page unload
826
+ window.addEventListener('beforeunload', function() {{
827
+ myChart.dispose();
828
+ }});
829
+ }})();
830
+ </script>
831
+ '''
832
+
833
+
834
+ # Convenience function to get complete system prompt
835
+ def get_echarts_system_prompt_with_geo(base_prompt: str) -> str:
836
+ """
837
+ Combine base ECharts prompt with geo extension
838
+
839
+ Args:
840
+ base_prompt: Original ECHARTS_SYSTEM_PROMPT
841
+
842
+ Returns:
843
+ Combined prompt with geo support
844
+ """
845
+ return f"""{base_prompt}
846
+
847
+ {ECHARTS_GEO_EXTENSION}
848
+
849
+ **IMPORTANT NOTES FOR GEO:**
850
+ - For maps, ALWAYS use [longitude, latitude] order (opposite of Leaflet)
851
+ - Validate coordinates before using them
852
+ - Filter out invalid (0, 0) coordinates
853
+ - Center maps on the average of valid data points
854
+ - Use appropriate zoom levels (5-8 for regions, 8-12 for cities)
855
+ """