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,172 @@
|
|
|
1
|
+
from typing import Any, Optional, Tuple
|
|
2
|
+
import html as html_module
|
|
3
|
+
import markdown
|
|
4
|
+
from markdown.extensions.codehilite import CodeHiliteExtension
|
|
5
|
+
from . import register_renderer
|
|
6
|
+
from .base import BaseRenderer
|
|
7
|
+
from ...models.outputs import OutputMode
|
|
8
|
+
|
|
9
|
+
try:
|
|
10
|
+
from rich.console import Console
|
|
11
|
+
from rich.markdown import Markdown as RichMarkdown
|
|
12
|
+
from rich.panel import Panel as RichPanel
|
|
13
|
+
RICH_AVAILABLE = True
|
|
14
|
+
except ImportError:
|
|
15
|
+
RICH_AVAILABLE = False
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from ipywidgets import HTML as IPyHTML
|
|
19
|
+
IPYWIDGETS_AVAILABLE = True
|
|
20
|
+
except ImportError:
|
|
21
|
+
IPYWIDGETS_AVAILABLE = False
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
import panel as pn
|
|
25
|
+
from panel.pane import Markdown as PanelMarkdown
|
|
26
|
+
PANEL_AVAILABLE = True
|
|
27
|
+
except ImportError:
|
|
28
|
+
PANEL_AVAILABLE = False
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
from IPython.display import Markdown as IPythonMarkdown
|
|
32
|
+
IPYTHON_AVAILABLE = True
|
|
33
|
+
except ImportError:
|
|
34
|
+
IPYTHON_AVAILABLE = False
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@register_renderer(OutputMode.MARKDOWN, system_prompt="MARKDOWN OUTPUT MODE: **IMPORTANT** Generate markdown formatted text.")
|
|
38
|
+
class MarkdownRenderer(BaseRenderer):
|
|
39
|
+
"""
|
|
40
|
+
Renderer for Markdown output.
|
|
41
|
+
Handles PandasAgentResponse (explanation), AIMessage, and generic text.
|
|
42
|
+
Adapts output format to Terminal (Rich), HTML, Jupyter, and Panel.
|
|
43
|
+
"""
|
|
44
|
+
def _extract_content(self, response: Any) -> str:
|
|
45
|
+
"""
|
|
46
|
+
Extract Markdown text content based on response type rules.
|
|
47
|
+
"""
|
|
48
|
+
# 1. Check for PandasAgentResponse (duck typing)
|
|
49
|
+
# We check for specific attributes that define a PandasAgentResponse
|
|
50
|
+
output = getattr(response, 'output', None)
|
|
51
|
+
|
|
52
|
+
if output is not None:
|
|
53
|
+
# Handle PandasAgentResponse: The 'explanation' is usually the markdown text
|
|
54
|
+
if hasattr(output, 'explanation') and output.explanation:
|
|
55
|
+
return str(output.explanation)
|
|
56
|
+
|
|
57
|
+
# If it has a 'response' attribute (some agent responses)
|
|
58
|
+
if hasattr(output, 'response') and output.response:
|
|
59
|
+
return str(output.response)
|
|
60
|
+
|
|
61
|
+
# 2. Check standard AIMessage response text
|
|
62
|
+
if hasattr(response, 'response') and response.response:
|
|
63
|
+
return str(response.response)
|
|
64
|
+
|
|
65
|
+
# 3. Fallback: Use output if string, or stringify
|
|
66
|
+
if output is not None:
|
|
67
|
+
return output if isinstance(output, str) else str(output)
|
|
68
|
+
|
|
69
|
+
# 4. Last resort: stringify the whole response object
|
|
70
|
+
return str(response)
|
|
71
|
+
|
|
72
|
+
async def render(
|
|
73
|
+
self,
|
|
74
|
+
response: Any,
|
|
75
|
+
environment: str = 'default',
|
|
76
|
+
**kwargs,
|
|
77
|
+
) -> Tuple[str, Any]:
|
|
78
|
+
"""
|
|
79
|
+
Render markdown content.
|
|
80
|
+
"""
|
|
81
|
+
# 1. Extract Content
|
|
82
|
+
content = self._extract_content(response)
|
|
83
|
+
|
|
84
|
+
# 2. Determine Format
|
|
85
|
+
# Allow overriding format via kwargs, else default to environment
|
|
86
|
+
output_format = kwargs.get('format') or kwargs.get('output_format', environment)
|
|
87
|
+
|
|
88
|
+
# 3. Wrap content based on environment/format
|
|
89
|
+
wrapped_output = self._wrap_output(content, output_format, **kwargs)
|
|
90
|
+
|
|
91
|
+
return content, wrapped_output
|
|
92
|
+
|
|
93
|
+
def _wrap_output(self, content: str, environment: str, **kwargs) -> Any:
|
|
94
|
+
"""
|
|
95
|
+
Wrap the Markdown content into an environment-specific container.
|
|
96
|
+
"""
|
|
97
|
+
# --- Terminal (Rich) ---
|
|
98
|
+
if environment == 'terminal':
|
|
99
|
+
if RICH_AVAILABLE:
|
|
100
|
+
show_panel = kwargs.get('show_panel', True)
|
|
101
|
+
panel_title = kwargs.get('panel_title', "📝 Response")
|
|
102
|
+
|
|
103
|
+
console = Console(force_terminal=True)
|
|
104
|
+
md = RichMarkdown(content)
|
|
105
|
+
|
|
106
|
+
# Capture rich output to string/object
|
|
107
|
+
with console.capture() as capture:
|
|
108
|
+
if show_panel:
|
|
109
|
+
console.print(RichPanel(md, title=panel_title, border_style="blue", expand=False))
|
|
110
|
+
else:
|
|
111
|
+
console.print(md)
|
|
112
|
+
return capture.get()
|
|
113
|
+
return content
|
|
114
|
+
|
|
115
|
+
# --- Jupyter / Notebook ---
|
|
116
|
+
elif environment in ('jupyter', 'notebook', 'colab'):
|
|
117
|
+
# Priority 1: Panel (if requested or available and appropriate)
|
|
118
|
+
if environment == 'panel' or (kwargs.get('use_panel', False) and PANEL_AVAILABLE):
|
|
119
|
+
styles = kwargs.get('styles', {
|
|
120
|
+
'background': '#f9f9f9', 'padding': '20px', 'border-radius': '5px',
|
|
121
|
+
'box-shadow': '0 2px 4px rgba(0,0,0,0.1)'
|
|
122
|
+
})
|
|
123
|
+
return PanelMarkdown(content, sizing_mode='stretch_width', styles=styles)
|
|
124
|
+
|
|
125
|
+
# Priority 2: IPyWidgets (if interactive requested)
|
|
126
|
+
use_widget = kwargs.get('use_widget', False)
|
|
127
|
+
if use_widget and IPYWIDGETS_AVAILABLE:
|
|
128
|
+
html_content = self._markdown_to_html(content)
|
|
129
|
+
return IPyHTML(value=html_content)
|
|
130
|
+
|
|
131
|
+
# Priority 3: Standard IPython Display
|
|
132
|
+
if IPYTHON_AVAILABLE:
|
|
133
|
+
return IPythonMarkdown(content)
|
|
134
|
+
|
|
135
|
+
# Fallback
|
|
136
|
+
return self._markdown_to_html(content)
|
|
137
|
+
|
|
138
|
+
# --- HTML ---
|
|
139
|
+
elif environment == 'html':
|
|
140
|
+
return self._markdown_to_html(content)
|
|
141
|
+
|
|
142
|
+
# --- Default / Plain ---
|
|
143
|
+
return content
|
|
144
|
+
|
|
145
|
+
def _markdown_to_html(self, content: str) -> str:
|
|
146
|
+
"""Convert markdown to HTML with syntax highlighting."""
|
|
147
|
+
try:
|
|
148
|
+
html = markdown.markdown(
|
|
149
|
+
content,
|
|
150
|
+
extensions=[
|
|
151
|
+
'fenced_code', 'tables', 'nl2br',
|
|
152
|
+
CodeHiliteExtension(css_class='highlight', linenums=False)
|
|
153
|
+
]
|
|
154
|
+
)
|
|
155
|
+
# Add basic styling for the HTML output
|
|
156
|
+
return f'''
|
|
157
|
+
<div class="markdown-content" style="line-height: 1.6;">
|
|
158
|
+
<style>
|
|
159
|
+
.markdown-content h1, .markdown-content h2, .markdown-content h3 {{ margin-top: 1.5em; }}
|
|
160
|
+
.markdown-content code {{ background: #f4f4f4; padding: 2px 6px; border-radius: 3px; font-family: monospace; }}
|
|
161
|
+
.markdown-content pre {{ background: #2d2d2d; color: #f8f8f2; padding: 15px; border-radius: 5px; overflow-x: auto; }}
|
|
162
|
+
.markdown-content table {{ border-collapse: collapse; width: 100%; margin: 1em 0; }}
|
|
163
|
+
.markdown-content th, .markdown-content td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
|
|
164
|
+
.markdown-content th {{ background-color: #f2f2f2; }}
|
|
165
|
+
</style>
|
|
166
|
+
{html}
|
|
167
|
+
</div>
|
|
168
|
+
'''
|
|
169
|
+
except ImportError:
|
|
170
|
+
# Fallback if markdown lib is missing
|
|
171
|
+
escaped = html_module.escape(content)
|
|
172
|
+
return f'<pre style="white-space: pre-wrap; font-family: sans-serif;">{escaped}</pre>'
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
from typing import Any, Optional, Tuple, Dict
|
|
2
|
+
import io
|
|
3
|
+
import base64
|
|
4
|
+
import uuid
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from .chart import BaseChart
|
|
7
|
+
from . import register_renderer
|
|
8
|
+
from ...models.outputs import OutputMode
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
from rich.panel import Panel
|
|
12
|
+
RICH_AVAILABLE = True
|
|
13
|
+
except ImportError:
|
|
14
|
+
RICH_AVAILABLE = False
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
MATPLOTLIB_SYSTEM_PROMPT = """MATPLOTLIB CHART OUTPUT MODE:
|
|
18
|
+
Generate a chart using Matplotlib.
|
|
19
|
+
|
|
20
|
+
REQUIREMENTS:
|
|
21
|
+
1. Return Python code in a markdown code block (```python)
|
|
22
|
+
2. Use matplotlib.pyplot (import matplotlib.pyplot as plt)
|
|
23
|
+
3. Store the figure in a variable named 'fig' or use plt.gcf()
|
|
24
|
+
4. Make the chart self-contained with inline data
|
|
25
|
+
5. Use appropriate plot types (plot, bar, scatter, hist, pie, etc.)
|
|
26
|
+
6. Add titles, labels, legends, and grid for clarity
|
|
27
|
+
7. Use plt.tight_layout() for better spacing
|
|
28
|
+
8. DO NOT call plt.show() or save files - return code only
|
|
29
|
+
|
|
30
|
+
EXAMPLE:
|
|
31
|
+
```python
|
|
32
|
+
import matplotlib.pyplot as plt
|
|
33
|
+
import numpy as np
|
|
34
|
+
|
|
35
|
+
categories = ['A', 'B', 'C', 'D']
|
|
36
|
+
values = [23, 45, 12, 67]
|
|
37
|
+
|
|
38
|
+
fig, ax = plt.subplots(figsize=(10, 6))
|
|
39
|
+
ax.bar(categories, values, color='steelblue')
|
|
40
|
+
ax.set_title('Sales by Category', fontsize=16, fontweight='bold')
|
|
41
|
+
ax.set_xlabel('Category')
|
|
42
|
+
ax.set_ylabel('Sales')
|
|
43
|
+
ax.grid(axis='y', alpha=0.3)
|
|
44
|
+
plt.tight_layout()
|
|
45
|
+
```
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@register_renderer(OutputMode.MATPLOTLIB, system_prompt=MATPLOTLIB_SYSTEM_PROMPT)
|
|
50
|
+
class MatplotlibRenderer(BaseChart):
|
|
51
|
+
"""Renderer for Matplotlib charts"""
|
|
52
|
+
|
|
53
|
+
def execute_code(
|
|
54
|
+
self,
|
|
55
|
+
code: str,
|
|
56
|
+
pandas_tool: Any = None,
|
|
57
|
+
execution_state: Optional[Dict[str, Any]] = None,
|
|
58
|
+
**kwargs,
|
|
59
|
+
) -> Tuple[Any, Optional[str]]:
|
|
60
|
+
"""Execute Matplotlib code within the shared Python environment."""
|
|
61
|
+
extra_namespace = None
|
|
62
|
+
# If no pandas tool is provided, we need to setup the backend manually
|
|
63
|
+
# to ensure we don't try to open a GUI window
|
|
64
|
+
manual_backend = pandas_tool is None
|
|
65
|
+
|
|
66
|
+
if manual_backend:
|
|
67
|
+
import matplotlib
|
|
68
|
+
matplotlib.use('Agg')
|
|
69
|
+
import matplotlib.pyplot as plt
|
|
70
|
+
extra_namespace = {'plt': plt, 'matplotlib': matplotlib}
|
|
71
|
+
|
|
72
|
+
context, error = super().execute_code(
|
|
73
|
+
code,
|
|
74
|
+
pandas_tool=pandas_tool,
|
|
75
|
+
execution_state=execution_state,
|
|
76
|
+
extra_namespace=extra_namespace,
|
|
77
|
+
**kwargs,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
if error:
|
|
82
|
+
return None, error
|
|
83
|
+
|
|
84
|
+
if not context:
|
|
85
|
+
return None, "Execution context was empty"
|
|
86
|
+
|
|
87
|
+
# Try to find the figure object in the context
|
|
88
|
+
fig = context.get('fig') or context.get('figure')
|
|
89
|
+
|
|
90
|
+
# Fallback: get current figure if available
|
|
91
|
+
if fig is None:
|
|
92
|
+
if 'plt' in context:
|
|
93
|
+
fig = context['plt'].gcf()
|
|
94
|
+
elif not manual_backend and pandas_tool:
|
|
95
|
+
# Try to get plt from tool locals if available
|
|
96
|
+
plt_ref = pandas_tool.locals.get('plt')
|
|
97
|
+
if plt_ref:
|
|
98
|
+
fig = plt_ref.gcf()
|
|
99
|
+
|
|
100
|
+
if fig is None or not hasattr(fig, 'savefig'):
|
|
101
|
+
return None, "Code must create a matplotlib figure (fig) or use plt functions"
|
|
102
|
+
|
|
103
|
+
return fig, None
|
|
104
|
+
finally:
|
|
105
|
+
# Cleanup to avoid memory leaks
|
|
106
|
+
if manual_backend and 'plt' in locals():
|
|
107
|
+
try:
|
|
108
|
+
plt.close('all')
|
|
109
|
+
except Exception:
|
|
110
|
+
pass
|
|
111
|
+
|
|
112
|
+
def _render_chart_content(self, chart_obj: Any, **kwargs) -> str:
|
|
113
|
+
"""Render Matplotlib chart as base64 embedded image."""
|
|
114
|
+
img_id = f"matplotlib-chart-{uuid.uuid4().hex[:8]}"
|
|
115
|
+
|
|
116
|
+
# Get image format and DPI
|
|
117
|
+
img_format = kwargs.get('format', 'png')
|
|
118
|
+
dpi = kwargs.get('dpi', 100)
|
|
119
|
+
|
|
120
|
+
# Save figure to bytes buffer
|
|
121
|
+
buf = io.BytesIO()
|
|
122
|
+
chart_obj.savefig(buf, format=img_format, dpi=dpi, bbox_inches='tight')
|
|
123
|
+
buf.seek(0)
|
|
124
|
+
|
|
125
|
+
# Encode to base64
|
|
126
|
+
img_base64 = base64.b64encode(buf.read()).decode('utf-8')
|
|
127
|
+
buf.close()
|
|
128
|
+
|
|
129
|
+
# Create img tag with base64 data
|
|
130
|
+
return f'''
|
|
131
|
+
<img id="{img_id}"
|
|
132
|
+
src="data:image/{img_format};base64,{img_base64}"
|
|
133
|
+
style="max-width: 100%; height: auto; display: block; margin: 0 auto; border-radius: 4px;"
|
|
134
|
+
alt="Matplotlib Chart" />
|
|
135
|
+
'''
|
|
136
|
+
|
|
137
|
+
def to_html(
|
|
138
|
+
self,
|
|
139
|
+
chart_obj: Any,
|
|
140
|
+
mode: str = 'partial',
|
|
141
|
+
**kwargs
|
|
142
|
+
) -> str:
|
|
143
|
+
"""
|
|
144
|
+
Convert Matplotlib chart to HTML.
|
|
145
|
+
"""
|
|
146
|
+
# Matplotlib doesn't need external scripts in head
|
|
147
|
+
kwargs['extra_head'] = kwargs.get('extra_head', '')
|
|
148
|
+
|
|
149
|
+
# Call parent to_html
|
|
150
|
+
return super().to_html(chart_obj, mode=mode, **kwargs)
|
|
151
|
+
|
|
152
|
+
def to_json(self, chart_obj: Any) -> Optional[Dict]:
|
|
153
|
+
"""Matplotlib figures don't have a standard native JSON representation."""
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
async def render(
|
|
157
|
+
self,
|
|
158
|
+
response: Any,
|
|
159
|
+
theme: str = 'monokai',
|
|
160
|
+
environment: str = 'html',
|
|
161
|
+
include_code: bool = False,
|
|
162
|
+
html_mode: str = 'partial',
|
|
163
|
+
**kwargs
|
|
164
|
+
) -> Tuple[Any, Optional[Any]]:
|
|
165
|
+
"""Render Matplotlib chart."""
|
|
166
|
+
|
|
167
|
+
# 1. Extract Code
|
|
168
|
+
# Check if code is explicitly provided in the structured response
|
|
169
|
+
code = getattr(response, 'code', None)
|
|
170
|
+
|
|
171
|
+
output_format = kwargs.get('output_format', environment)
|
|
172
|
+
|
|
173
|
+
# Fallback to extracting from text content
|
|
174
|
+
if not code:
|
|
175
|
+
content = self._get_content(response)
|
|
176
|
+
code = self._extract_code(content)
|
|
177
|
+
|
|
178
|
+
if not code:
|
|
179
|
+
error_msg = "No chart code found in response"
|
|
180
|
+
if output_format == 'terminal':
|
|
181
|
+
return error_msg, None
|
|
182
|
+
return self._wrap_for_environment(
|
|
183
|
+
f"<div class='error'>{error_msg}</div>",
|
|
184
|
+
output_format
|
|
185
|
+
), None
|
|
186
|
+
|
|
187
|
+
# 2. Execute Code
|
|
188
|
+
chart_obj, error = self.execute_code(
|
|
189
|
+
code,
|
|
190
|
+
pandas_tool=kwargs.pop('pandas_tool', None),
|
|
191
|
+
execution_state=kwargs.pop('execution_state', None),
|
|
192
|
+
**kwargs,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
if error:
|
|
196
|
+
if output_format == 'terminal':
|
|
197
|
+
return f"Error generating chart: {error}", None
|
|
198
|
+
return self._wrap_for_environment(
|
|
199
|
+
self._render_error(error, code, theme),
|
|
200
|
+
output_format
|
|
201
|
+
), None
|
|
202
|
+
|
|
203
|
+
# 3. Handle Terminal Environment (Save to Disk)
|
|
204
|
+
if output_format == 'terminal':
|
|
205
|
+
saved_path = self._save_to_disk(chart_obj)
|
|
206
|
+
msg = f"Chart generated successfully and saved to: {saved_path}"
|
|
207
|
+
|
|
208
|
+
if RICH_AVAILABLE:
|
|
209
|
+
return Panel(msg, title="📊 Chart Generated", border_style="green"), None
|
|
210
|
+
return msg, None
|
|
211
|
+
|
|
212
|
+
# 4. Generate HTML for Web/Jupyter
|
|
213
|
+
html_output = self.to_html(
|
|
214
|
+
chart_obj,
|
|
215
|
+
mode=html_mode,
|
|
216
|
+
include_code=include_code,
|
|
217
|
+
code=code,
|
|
218
|
+
theme=theme,
|
|
219
|
+
title=kwargs.pop('title', 'Matplotlib Chart'),
|
|
220
|
+
icon='📈',
|
|
221
|
+
dpi=kwargs.pop('dpi', 100),
|
|
222
|
+
format=kwargs.pop('img_format', 'png'),
|
|
223
|
+
**kwargs
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# 5. Wrap for Environment
|
|
227
|
+
if output_format in {'jupyter', 'notebook', 'ipython', 'colab'}:
|
|
228
|
+
wrapped_html = self._wrap_for_environment(html_output, output_format)
|
|
229
|
+
else:
|
|
230
|
+
wrapped_html = html_output
|
|
231
|
+
|
|
232
|
+
# 6. Return based on output format
|
|
233
|
+
if output_format == 'html':
|
|
234
|
+
return None, wrapped_html
|
|
235
|
+
else:
|
|
236
|
+
# Default behavior: Return code as content, HTML widget as wrapped
|
|
237
|
+
return code, wrapped_html
|
|
File without changes
|