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.
- agentui/.prettierrc +15 -0
- agentui/QUICKSTART.md +272 -0
- agentui/README.md +59 -0
- agentui/env.example +16 -0
- agentui/jsconfig.json +14 -0
- agentui/package-lock.json +4242 -0
- agentui/package.json +34 -0
- agentui/scripts/postinstall/apply-patches.mjs +260 -0
- agentui/src/app.css +61 -0
- agentui/src/app.d.ts +13 -0
- agentui/src/app.html +12 -0
- agentui/src/components/LoadingSpinner.svelte +64 -0
- agentui/src/components/ThemeSwitcher.svelte +159 -0
- agentui/src/components/index.js +4 -0
- agentui/src/lib/api/bots.ts +60 -0
- agentui/src/lib/api/chat.ts +22 -0
- agentui/src/lib/api/http.ts +25 -0
- agentui/src/lib/components/BotCard.svelte +33 -0
- agentui/src/lib/components/ChatBubble.svelte +63 -0
- agentui/src/lib/components/Toast.svelte +21 -0
- agentui/src/lib/config.ts +20 -0
- agentui/src/lib/stores/auth.svelte.ts +73 -0
- agentui/src/lib/stores/theme.svelte.js +64 -0
- agentui/src/lib/stores/toast.svelte.ts +31 -0
- agentui/src/lib/utils/conversation.ts +39 -0
- agentui/src/routes/+layout.svelte +20 -0
- agentui/src/routes/+page.svelte +232 -0
- agentui/src/routes/login/+page.svelte +200 -0
- agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
- agentui/src/routes/talk/[agentId]/+page.ts +7 -0
- agentui/static/README.md +1 -0
- agentui/svelte.config.js +11 -0
- agentui/tailwind.config.ts +53 -0
- agentui/tsconfig.json +3 -0
- agentui/vite.config.ts +10 -0
- ai_parrot-0.17.2.dist-info/METADATA +472 -0
- ai_parrot-0.17.2.dist-info/RECORD +535 -0
- ai_parrot-0.17.2.dist-info/WHEEL +6 -0
- ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
- ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
- ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
- crew-builder/.prettierrc +15 -0
- crew-builder/QUICKSTART.md +259 -0
- crew-builder/README.md +113 -0
- crew-builder/env.example +17 -0
- crew-builder/jsconfig.json +14 -0
- crew-builder/package-lock.json +4182 -0
- crew-builder/package.json +37 -0
- crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
- crew-builder/src/app.css +62 -0
- crew-builder/src/app.d.ts +13 -0
- crew-builder/src/app.html +12 -0
- crew-builder/src/components/LoadingSpinner.svelte +64 -0
- crew-builder/src/components/ThemeSwitcher.svelte +149 -0
- crew-builder/src/components/index.js +9 -0
- crew-builder/src/lib/api/bots.ts +60 -0
- crew-builder/src/lib/api/chat.ts +80 -0
- crew-builder/src/lib/api/client.ts +56 -0
- crew-builder/src/lib/api/crew/crew.ts +136 -0
- crew-builder/src/lib/api/index.ts +5 -0
- crew-builder/src/lib/api/o365/auth.ts +65 -0
- crew-builder/src/lib/auth/auth.ts +54 -0
- crew-builder/src/lib/components/AgentNode.svelte +43 -0
- crew-builder/src/lib/components/BotCard.svelte +33 -0
- crew-builder/src/lib/components/ChatBubble.svelte +67 -0
- crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
- crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
- crew-builder/src/lib/components/JsonViewer.svelte +24 -0
- crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
- crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
- crew-builder/src/lib/components/Toast.svelte +67 -0
- crew-builder/src/lib/components/Toolbar.svelte +157 -0
- crew-builder/src/lib/components/index.ts +10 -0
- crew-builder/src/lib/config.ts +8 -0
- crew-builder/src/lib/stores/auth.svelte.ts +228 -0
- crew-builder/src/lib/stores/crewStore.ts +369 -0
- crew-builder/src/lib/stores/theme.svelte.js +145 -0
- crew-builder/src/lib/stores/toast.svelte.ts +69 -0
- crew-builder/src/lib/utils/conversation.ts +39 -0
- crew-builder/src/lib/utils/markdown.ts +122 -0
- crew-builder/src/lib/utils/talkHistory.ts +47 -0
- crew-builder/src/routes/+layout.svelte +20 -0
- crew-builder/src/routes/+page.svelte +539 -0
- crew-builder/src/routes/agents/+page.svelte +247 -0
- crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
- crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
- crew-builder/src/routes/builder/+page.svelte +204 -0
- crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
- crew-builder/src/routes/crew/ask/+page.ts +1 -0
- crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
- crew-builder/src/routes/login/+page.svelte +197 -0
- crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
- crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
- crew-builder/static/README.md +1 -0
- crew-builder/svelte.config.js +11 -0
- crew-builder/tailwind.config.ts +53 -0
- crew-builder/tsconfig.json +3 -0
- crew-builder/vite.config.ts +10 -0
- mcp_servers/calculator_server.py +309 -0
- parrot/__init__.py +27 -0
- parrot/__pycache__/__init__.cpython-310.pyc +0 -0
- parrot/__pycache__/version.cpython-310.pyc +0 -0
- parrot/_version.py +34 -0
- parrot/a2a/__init__.py +48 -0
- parrot/a2a/client.py +658 -0
- parrot/a2a/discovery.py +89 -0
- parrot/a2a/mixin.py +257 -0
- parrot/a2a/models.py +376 -0
- parrot/a2a/server.py +770 -0
- parrot/agents/__init__.py +29 -0
- parrot/bots/__init__.py +12 -0
- parrot/bots/a2a_agent.py +19 -0
- parrot/bots/abstract.py +3139 -0
- parrot/bots/agent.py +1129 -0
- parrot/bots/basic.py +9 -0
- parrot/bots/chatbot.py +669 -0
- parrot/bots/data.py +1618 -0
- parrot/bots/database/__init__.py +5 -0
- parrot/bots/database/abstract.py +3071 -0
- parrot/bots/database/cache.py +286 -0
- parrot/bots/database/models.py +468 -0
- parrot/bots/database/prompts.py +154 -0
- parrot/bots/database/retries.py +98 -0
- parrot/bots/database/router.py +269 -0
- parrot/bots/database/sql.py +41 -0
- parrot/bots/db/__init__.py +6 -0
- parrot/bots/db/abstract.py +556 -0
- parrot/bots/db/bigquery.py +602 -0
- parrot/bots/db/cache.py +85 -0
- parrot/bots/db/documentdb.py +668 -0
- parrot/bots/db/elastic.py +1014 -0
- parrot/bots/db/influx.py +898 -0
- parrot/bots/db/mock.py +96 -0
- parrot/bots/db/multi.py +783 -0
- parrot/bots/db/prompts.py +185 -0
- parrot/bots/db/sql.py +1255 -0
- parrot/bots/db/tools.py +212 -0
- parrot/bots/document.py +680 -0
- parrot/bots/hrbot.py +15 -0
- parrot/bots/kb.py +170 -0
- parrot/bots/mcp.py +36 -0
- parrot/bots/orchestration/README.md +463 -0
- parrot/bots/orchestration/__init__.py +1 -0
- parrot/bots/orchestration/agent.py +155 -0
- parrot/bots/orchestration/crew.py +3330 -0
- parrot/bots/orchestration/fsm.py +1179 -0
- parrot/bots/orchestration/hr.py +434 -0
- parrot/bots/orchestration/storage/__init__.py +4 -0
- parrot/bots/orchestration/storage/memory.py +100 -0
- parrot/bots/orchestration/storage/mixin.py +119 -0
- parrot/bots/orchestration/verify.py +202 -0
- parrot/bots/product.py +204 -0
- parrot/bots/prompts/__init__.py +96 -0
- parrot/bots/prompts/agents.py +155 -0
- parrot/bots/prompts/data.py +216 -0
- parrot/bots/prompts/output_generation.py +8 -0
- parrot/bots/scraper/__init__.py +3 -0
- parrot/bots/scraper/models.py +122 -0
- parrot/bots/scraper/scraper.py +1173 -0
- parrot/bots/scraper/templates.py +115 -0
- parrot/bots/stores/__init__.py +5 -0
- parrot/bots/stores/local.py +172 -0
- parrot/bots/webdev.py +81 -0
- parrot/cli.py +17 -0
- parrot/clients/__init__.py +16 -0
- parrot/clients/base.py +1491 -0
- parrot/clients/claude.py +1191 -0
- parrot/clients/factory.py +129 -0
- parrot/clients/google.py +4567 -0
- parrot/clients/gpt.py +1975 -0
- parrot/clients/grok.py +432 -0
- parrot/clients/groq.py +986 -0
- parrot/clients/hf.py +582 -0
- parrot/clients/models.py +18 -0
- parrot/conf.py +395 -0
- parrot/embeddings/__init__.py +9 -0
- parrot/embeddings/base.py +157 -0
- parrot/embeddings/google.py +98 -0
- parrot/embeddings/huggingface.py +74 -0
- parrot/embeddings/openai.py +84 -0
- parrot/embeddings/processor.py +88 -0
- parrot/exceptions.c +13868 -0
- parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/exceptions.pxd +22 -0
- parrot/exceptions.pxi +15 -0
- parrot/exceptions.pyx +44 -0
- parrot/generators/__init__.py +29 -0
- parrot/generators/base.py +200 -0
- parrot/generators/html.py +293 -0
- parrot/generators/react.py +205 -0
- parrot/generators/streamlit.py +203 -0
- parrot/generators/template.py +105 -0
- parrot/handlers/__init__.py +4 -0
- parrot/handlers/agent.py +861 -0
- parrot/handlers/agents/__init__.py +1 -0
- parrot/handlers/agents/abstract.py +900 -0
- parrot/handlers/bots.py +338 -0
- parrot/handlers/chat.py +915 -0
- parrot/handlers/creation.sql +192 -0
- parrot/handlers/crew/ARCHITECTURE.md +362 -0
- parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
- parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
- parrot/handlers/crew/__init__.py +0 -0
- parrot/handlers/crew/handler.py +801 -0
- parrot/handlers/crew/models.py +229 -0
- parrot/handlers/crew/redis_persistence.py +523 -0
- parrot/handlers/jobs/__init__.py +10 -0
- parrot/handlers/jobs/job.py +384 -0
- parrot/handlers/jobs/mixin.py +627 -0
- parrot/handlers/jobs/models.py +115 -0
- parrot/handlers/jobs/worker.py +31 -0
- parrot/handlers/models.py +596 -0
- parrot/handlers/o365_auth.py +105 -0
- parrot/handlers/stream.py +337 -0
- parrot/interfaces/__init__.py +6 -0
- parrot/interfaces/aws.py +143 -0
- parrot/interfaces/credentials.py +113 -0
- parrot/interfaces/database.py +27 -0
- parrot/interfaces/google.py +1123 -0
- parrot/interfaces/hierarchy.py +1227 -0
- parrot/interfaces/http.py +651 -0
- parrot/interfaces/images/__init__.py +0 -0
- parrot/interfaces/images/plugins/__init__.py +24 -0
- parrot/interfaces/images/plugins/abstract.py +58 -0
- parrot/interfaces/images/plugins/analisys.py +148 -0
- parrot/interfaces/images/plugins/classify.py +150 -0
- parrot/interfaces/images/plugins/classifybase.py +182 -0
- parrot/interfaces/images/plugins/detect.py +150 -0
- parrot/interfaces/images/plugins/exif.py +1103 -0
- parrot/interfaces/images/plugins/hash.py +52 -0
- parrot/interfaces/images/plugins/vision.py +104 -0
- parrot/interfaces/images/plugins/yolo.py +66 -0
- parrot/interfaces/images/plugins/zerodetect.py +197 -0
- parrot/interfaces/o365.py +978 -0
- parrot/interfaces/onedrive.py +822 -0
- parrot/interfaces/sharepoint.py +1435 -0
- parrot/interfaces/soap.py +257 -0
- parrot/loaders/__init__.py +8 -0
- parrot/loaders/abstract.py +1131 -0
- parrot/loaders/audio.py +199 -0
- parrot/loaders/basepdf.py +53 -0
- parrot/loaders/basevideo.py +1568 -0
- parrot/loaders/csv.py +409 -0
- parrot/loaders/docx.py +116 -0
- parrot/loaders/epubloader.py +316 -0
- parrot/loaders/excel.py +199 -0
- parrot/loaders/factory.py +55 -0
- parrot/loaders/files/__init__.py +0 -0
- parrot/loaders/files/abstract.py +39 -0
- parrot/loaders/files/html.py +26 -0
- parrot/loaders/files/text.py +63 -0
- parrot/loaders/html.py +152 -0
- parrot/loaders/markdown.py +442 -0
- parrot/loaders/pdf.py +373 -0
- parrot/loaders/pdfmark.py +320 -0
- parrot/loaders/pdftables.py +506 -0
- parrot/loaders/ppt.py +476 -0
- parrot/loaders/qa.py +63 -0
- parrot/loaders/splitters/__init__.py +10 -0
- parrot/loaders/splitters/base.py +138 -0
- parrot/loaders/splitters/md.py +228 -0
- parrot/loaders/splitters/token.py +143 -0
- parrot/loaders/txt.py +26 -0
- parrot/loaders/video.py +89 -0
- parrot/loaders/videolocal.py +218 -0
- parrot/loaders/videounderstanding.py +377 -0
- parrot/loaders/vimeo.py +167 -0
- parrot/loaders/web.py +599 -0
- parrot/loaders/youtube.py +504 -0
- parrot/manager/__init__.py +5 -0
- parrot/manager/manager.py +1030 -0
- parrot/mcp/__init__.py +28 -0
- parrot/mcp/adapter.py +105 -0
- parrot/mcp/cli.py +174 -0
- parrot/mcp/client.py +119 -0
- parrot/mcp/config.py +75 -0
- parrot/mcp/integration.py +842 -0
- parrot/mcp/oauth.py +933 -0
- parrot/mcp/server.py +225 -0
- parrot/mcp/transports/__init__.py +3 -0
- parrot/mcp/transports/base.py +279 -0
- parrot/mcp/transports/grpc_session.py +163 -0
- parrot/mcp/transports/http.py +312 -0
- parrot/mcp/transports/mcp.proto +108 -0
- parrot/mcp/transports/quic.py +1082 -0
- parrot/mcp/transports/sse.py +330 -0
- parrot/mcp/transports/stdio.py +309 -0
- parrot/mcp/transports/unix.py +395 -0
- parrot/mcp/transports/websocket.py +547 -0
- parrot/memory/__init__.py +16 -0
- parrot/memory/abstract.py +209 -0
- parrot/memory/agent.py +32 -0
- parrot/memory/cache.py +175 -0
- parrot/memory/core.py +555 -0
- parrot/memory/file.py +153 -0
- parrot/memory/mem.py +131 -0
- parrot/memory/redis.py +613 -0
- parrot/models/__init__.py +46 -0
- parrot/models/basic.py +118 -0
- parrot/models/compliance.py +208 -0
- parrot/models/crew.py +395 -0
- parrot/models/detections.py +654 -0
- parrot/models/generation.py +85 -0
- parrot/models/google.py +223 -0
- parrot/models/groq.py +23 -0
- parrot/models/openai.py +30 -0
- parrot/models/outputs.py +285 -0
- parrot/models/responses.py +938 -0
- parrot/notifications/__init__.py +743 -0
- parrot/openapi/__init__.py +3 -0
- parrot/openapi/components.yaml +641 -0
- parrot/openapi/config.py +322 -0
- parrot/outputs/__init__.py +32 -0
- parrot/outputs/formats/__init__.py +108 -0
- parrot/outputs/formats/altair.py +359 -0
- parrot/outputs/formats/application.py +122 -0
- parrot/outputs/formats/base.py +351 -0
- parrot/outputs/formats/bokeh.py +356 -0
- parrot/outputs/formats/card.py +424 -0
- parrot/outputs/formats/chart.py +436 -0
- parrot/outputs/formats/d3.py +255 -0
- parrot/outputs/formats/echarts.py +310 -0
- parrot/outputs/formats/generators/__init__.py +0 -0
- parrot/outputs/formats/generators/abstract.py +61 -0
- parrot/outputs/formats/generators/panel.py +145 -0
- parrot/outputs/formats/generators/streamlit.py +86 -0
- parrot/outputs/formats/generators/terminal.py +63 -0
- parrot/outputs/formats/holoviews.py +310 -0
- parrot/outputs/formats/html.py +147 -0
- parrot/outputs/formats/jinja2.py +46 -0
- parrot/outputs/formats/json.py +87 -0
- parrot/outputs/formats/map.py +933 -0
- parrot/outputs/formats/markdown.py +172 -0
- parrot/outputs/formats/matplotlib.py +237 -0
- parrot/outputs/formats/mixins/__init__.py +0 -0
- parrot/outputs/formats/mixins/emaps.py +855 -0
- parrot/outputs/formats/plotly.py +341 -0
- parrot/outputs/formats/seaborn.py +310 -0
- parrot/outputs/formats/table.py +397 -0
- parrot/outputs/formats/template_report.py +138 -0
- parrot/outputs/formats/yaml.py +125 -0
- parrot/outputs/formatter.py +152 -0
- parrot/outputs/templates/__init__.py +95 -0
- parrot/pipelines/__init__.py +0 -0
- parrot/pipelines/abstract.py +210 -0
- parrot/pipelines/detector.py +124 -0
- parrot/pipelines/models.py +90 -0
- parrot/pipelines/planogram.py +3002 -0
- parrot/pipelines/table.sql +97 -0
- parrot/plugins/__init__.py +106 -0
- parrot/plugins/importer.py +80 -0
- parrot/py.typed +0 -0
- parrot/registry/__init__.py +18 -0
- parrot/registry/registry.py +594 -0
- parrot/scheduler/__init__.py +1189 -0
- parrot/scheduler/models.py +60 -0
- parrot/security/__init__.py +16 -0
- parrot/security/prompt_injection.py +268 -0
- parrot/security/security_events.sql +25 -0
- parrot/services/__init__.py +1 -0
- parrot/services/mcp/__init__.py +8 -0
- parrot/services/mcp/config.py +13 -0
- parrot/services/mcp/server.py +295 -0
- parrot/services/o365_remote_auth.py +235 -0
- parrot/stores/__init__.py +7 -0
- parrot/stores/abstract.py +352 -0
- parrot/stores/arango.py +1090 -0
- parrot/stores/bigquery.py +1377 -0
- parrot/stores/cache.py +106 -0
- parrot/stores/empty.py +10 -0
- parrot/stores/faiss_store.py +1157 -0
- parrot/stores/kb/__init__.py +9 -0
- parrot/stores/kb/abstract.py +68 -0
- parrot/stores/kb/cache.py +165 -0
- parrot/stores/kb/doc.py +325 -0
- parrot/stores/kb/hierarchy.py +346 -0
- parrot/stores/kb/local.py +457 -0
- parrot/stores/kb/prompt.py +28 -0
- parrot/stores/kb/redis.py +659 -0
- parrot/stores/kb/store.py +115 -0
- parrot/stores/kb/user.py +374 -0
- parrot/stores/models.py +59 -0
- parrot/stores/pgvector.py +3 -0
- parrot/stores/postgres.py +2853 -0
- parrot/stores/utils/__init__.py +0 -0
- parrot/stores/utils/chunking.py +197 -0
- parrot/telemetry/__init__.py +3 -0
- parrot/telemetry/mixin.py +111 -0
- parrot/template/__init__.py +3 -0
- parrot/template/engine.py +259 -0
- parrot/tools/__init__.py +23 -0
- parrot/tools/abstract.py +644 -0
- parrot/tools/agent.py +363 -0
- parrot/tools/arangodbsearch.py +537 -0
- parrot/tools/arxiv_tool.py +188 -0
- parrot/tools/calculator/__init__.py +3 -0
- parrot/tools/calculator/operations/__init__.py +38 -0
- parrot/tools/calculator/operations/calculus.py +80 -0
- parrot/tools/calculator/operations/statistics.py +76 -0
- parrot/tools/calculator/tool.py +150 -0
- parrot/tools/cloudwatch.py +988 -0
- parrot/tools/codeinterpreter/__init__.py +127 -0
- parrot/tools/codeinterpreter/executor.py +371 -0
- parrot/tools/codeinterpreter/internals.py +473 -0
- parrot/tools/codeinterpreter/models.py +643 -0
- parrot/tools/codeinterpreter/prompts.py +224 -0
- parrot/tools/codeinterpreter/tool.py +664 -0
- parrot/tools/company_info/__init__.py +6 -0
- parrot/tools/company_info/tool.py +1138 -0
- parrot/tools/correlationanalysis.py +437 -0
- parrot/tools/database/abstract.py +286 -0
- parrot/tools/database/bq.py +115 -0
- parrot/tools/database/cache.py +284 -0
- parrot/tools/database/models.py +95 -0
- parrot/tools/database/pg.py +343 -0
- parrot/tools/databasequery.py +1159 -0
- parrot/tools/db.py +1800 -0
- parrot/tools/ddgo.py +370 -0
- parrot/tools/decorators.py +271 -0
- parrot/tools/dftohtml.py +282 -0
- parrot/tools/document.py +549 -0
- parrot/tools/ecs.py +819 -0
- parrot/tools/edareport.py +368 -0
- parrot/tools/elasticsearch.py +1049 -0
- parrot/tools/employees.py +462 -0
- parrot/tools/epson/__init__.py +96 -0
- parrot/tools/excel.py +683 -0
- parrot/tools/file/__init__.py +13 -0
- parrot/tools/file/abstract.py +76 -0
- parrot/tools/file/gcs.py +378 -0
- parrot/tools/file/local.py +284 -0
- parrot/tools/file/s3.py +511 -0
- parrot/tools/file/tmp.py +309 -0
- parrot/tools/file/tool.py +501 -0
- parrot/tools/file_reader.py +129 -0
- parrot/tools/flowtask/__init__.py +19 -0
- parrot/tools/flowtask/tool.py +761 -0
- parrot/tools/gittoolkit.py +508 -0
- parrot/tools/google/__init__.py +18 -0
- parrot/tools/google/base.py +169 -0
- parrot/tools/google/tools.py +1251 -0
- parrot/tools/googlelocation.py +5 -0
- parrot/tools/googleroutes.py +5 -0
- parrot/tools/googlesearch.py +5 -0
- parrot/tools/googlesitesearch.py +5 -0
- parrot/tools/googlevoice.py +2 -0
- parrot/tools/gvoice.py +695 -0
- parrot/tools/ibisworld/README.md +225 -0
- parrot/tools/ibisworld/__init__.py +11 -0
- parrot/tools/ibisworld/tool.py +366 -0
- parrot/tools/jiratoolkit.py +1718 -0
- parrot/tools/manager.py +1098 -0
- parrot/tools/math.py +152 -0
- parrot/tools/metadata.py +476 -0
- parrot/tools/msteams.py +1621 -0
- parrot/tools/msword.py +635 -0
- parrot/tools/multidb.py +580 -0
- parrot/tools/multistoresearch.py +369 -0
- parrot/tools/networkninja.py +167 -0
- parrot/tools/nextstop/__init__.py +4 -0
- parrot/tools/nextstop/base.py +286 -0
- parrot/tools/nextstop/employee.py +733 -0
- parrot/tools/nextstop/store.py +462 -0
- parrot/tools/notification.py +435 -0
- parrot/tools/o365/__init__.py +42 -0
- parrot/tools/o365/base.py +295 -0
- parrot/tools/o365/bundle.py +522 -0
- parrot/tools/o365/events.py +554 -0
- parrot/tools/o365/mail.py +992 -0
- parrot/tools/o365/onedrive.py +497 -0
- parrot/tools/o365/sharepoint.py +641 -0
- parrot/tools/openapi_toolkit.py +904 -0
- parrot/tools/openweather.py +527 -0
- parrot/tools/pdfprint.py +1001 -0
- parrot/tools/powerbi.py +518 -0
- parrot/tools/powerpoint.py +1113 -0
- parrot/tools/pricestool.py +146 -0
- parrot/tools/products/__init__.py +246 -0
- parrot/tools/prophet_tool.py +171 -0
- parrot/tools/pythonpandas.py +630 -0
- parrot/tools/pythonrepl.py +910 -0
- parrot/tools/qsource.py +436 -0
- parrot/tools/querytoolkit.py +395 -0
- parrot/tools/quickeda.py +827 -0
- parrot/tools/resttool.py +553 -0
- parrot/tools/retail/__init__.py +0 -0
- parrot/tools/retail/bby.py +528 -0
- parrot/tools/sandboxtool.py +703 -0
- parrot/tools/sassie/__init__.py +352 -0
- parrot/tools/scraping/__init__.py +7 -0
- parrot/tools/scraping/docs/select.md +466 -0
- parrot/tools/scraping/documentation.md +1278 -0
- parrot/tools/scraping/driver.py +436 -0
- parrot/tools/scraping/models.py +576 -0
- parrot/tools/scraping/options.py +85 -0
- parrot/tools/scraping/orchestrator.py +517 -0
- parrot/tools/scraping/readme.md +740 -0
- parrot/tools/scraping/tool.py +3115 -0
- parrot/tools/seasonaldetection.py +642 -0
- parrot/tools/shell_tool/__init__.py +5 -0
- parrot/tools/shell_tool/actions.py +408 -0
- parrot/tools/shell_tool/engine.py +155 -0
- parrot/tools/shell_tool/models.py +322 -0
- parrot/tools/shell_tool/tool.py +442 -0
- parrot/tools/site_search.py +214 -0
- parrot/tools/textfile.py +418 -0
- parrot/tools/think.py +378 -0
- parrot/tools/toolkit.py +298 -0
- parrot/tools/webapp_tool.py +187 -0
- parrot/tools/whatif.py +1279 -0
- parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
- parrot/tools/workday/__init__.py +6 -0
- parrot/tools/workday/models.py +1389 -0
- parrot/tools/workday/tool.py +1293 -0
- parrot/tools/yfinance_tool.py +306 -0
- parrot/tools/zipcode.py +217 -0
- parrot/utils/__init__.py +2 -0
- parrot/utils/helpers.py +73 -0
- parrot/utils/parsers/__init__.py +5 -0
- parrot/utils/parsers/toml.c +12078 -0
- parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/parsers/toml.pyx +21 -0
- parrot/utils/toml.py +11 -0
- parrot/utils/types.cpp +20936 -0
- parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/types.pyx +213 -0
- parrot/utils/uv.py +11 -0
- parrot/version.py +10 -0
- parrot/yaml-rs/Cargo.lock +350 -0
- parrot/yaml-rs/Cargo.toml +19 -0
- parrot/yaml-rs/pyproject.toml +19 -0
- parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
- parrot/yaml-rs/src/lib.rs +222 -0
- requirements/docker-compose.yml +24 -0
- 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
|
+
"""
|