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,359 @@
|
|
|
1
|
+
# parrot/outputs/formats/charts/altair.py
|
|
2
|
+
from typing import Any, Optional, Tuple, Dict
|
|
3
|
+
import json
|
|
4
|
+
import uuid
|
|
5
|
+
from .chart import BaseChart
|
|
6
|
+
from . import register_renderer
|
|
7
|
+
from ...models.outputs import OutputMode
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
ALTAIR_SYSTEM_PROMPT = """ALTAIR CHART OUTPUT MODE:
|
|
11
|
+
Generate an interactive chart using Altair (Vega-Lite).
|
|
12
|
+
|
|
13
|
+
REQUIREMENTS:
|
|
14
|
+
1. Return Python code in a markdown code block (```python)
|
|
15
|
+
2. Use altair library (import altair as alt)
|
|
16
|
+
3. Store the chart in a variable named 'chart', 'fig', 'c', or 'plot'
|
|
17
|
+
4. Make the chart self-contained with inline data when possible
|
|
18
|
+
5. Use appropriate mark types (mark_bar, mark_line, mark_point, etc.)
|
|
19
|
+
6. Include proper encodings (x, y, color, size, etc.)
|
|
20
|
+
7. Add titles and labels for clarity
|
|
21
|
+
8. DO NOT execute the code or save files - return code only
|
|
22
|
+
|
|
23
|
+
EXAMPLE:
|
|
24
|
+
```python
|
|
25
|
+
import altair as alt
|
|
26
|
+
import pandas as pd
|
|
27
|
+
|
|
28
|
+
data = pd.DataFrame({
|
|
29
|
+
'category': ['A', 'B', 'C', 'D'],
|
|
30
|
+
'values': [23, 45, 12, 67]
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
chart = alt.Chart(data).mark_bar().encode(
|
|
34
|
+
x='category',
|
|
35
|
+
y='values',
|
|
36
|
+
color='category'
|
|
37
|
+
).properties(
|
|
38
|
+
title='Sample Bar Chart',
|
|
39
|
+
width=400,
|
|
40
|
+
height=300
|
|
41
|
+
)
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@register_renderer(OutputMode.ALTAIR, system_prompt=ALTAIR_SYSTEM_PROMPT)
|
|
47
|
+
class AltairRenderer(BaseChart):
|
|
48
|
+
"""Renderer for Altair/Vega-Lite charts"""
|
|
49
|
+
|
|
50
|
+
def execute_code(
|
|
51
|
+
self,
|
|
52
|
+
code: str,
|
|
53
|
+
pandas_tool: Any = None,
|
|
54
|
+
execution_state: Optional[Dict[str, Any]] = None,
|
|
55
|
+
**kwargs,
|
|
56
|
+
) -> Tuple[Any, Optional[str]]:
|
|
57
|
+
"""Execute Altair code within the agent's Python environment."""
|
|
58
|
+
extra_namespace = None
|
|
59
|
+
if pandas_tool is None:
|
|
60
|
+
try:
|
|
61
|
+
import altair as alt
|
|
62
|
+
extra_namespace = {'alt': alt}
|
|
63
|
+
except ImportError:
|
|
64
|
+
pass
|
|
65
|
+
|
|
66
|
+
# Execute using BaseRenderer logic
|
|
67
|
+
context, error = super().execute_code(
|
|
68
|
+
code,
|
|
69
|
+
pandas_tool=pandas_tool,
|
|
70
|
+
execution_state=execution_state,
|
|
71
|
+
extra_namespace=extra_namespace,
|
|
72
|
+
**kwargs,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if error:
|
|
76
|
+
return None, error
|
|
77
|
+
|
|
78
|
+
if not context:
|
|
79
|
+
return None, "Execution context was empty"
|
|
80
|
+
|
|
81
|
+
# Find the chart object (Altair typically produces single charts)
|
|
82
|
+
chart, chart_error = self._find_chart_object(context)
|
|
83
|
+
|
|
84
|
+
if chart:
|
|
85
|
+
return chart, None
|
|
86
|
+
|
|
87
|
+
if chart_error:
|
|
88
|
+
return None, chart_error
|
|
89
|
+
|
|
90
|
+
return None, "Code must define a chart variable (chart, fig, c, or plot)"
|
|
91
|
+
|
|
92
|
+
@staticmethod
|
|
93
|
+
def _find_chart_object(context: Dict[str, Any]) -> Tuple[Optional[Any], Optional[str]]:
|
|
94
|
+
"""Locate the Altair chart object in the local namespace.
|
|
95
|
+
|
|
96
|
+
Returns a tuple of (chart_obj, error_message). The error_message is
|
|
97
|
+
populated when a chart-like object is found but fails serialization
|
|
98
|
+
(e.g., ``to_dict`` raises)."""
|
|
99
|
+
|
|
100
|
+
def is_altair_chart(obj: Any) -> bool:
|
|
101
|
+
"""Check if object is an Altair chart."""
|
|
102
|
+
if obj is None:
|
|
103
|
+
return False
|
|
104
|
+
|
|
105
|
+
# Skip renderer / BaseChart instances
|
|
106
|
+
if isinstance(obj, BaseChart):
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
# Altair charts have to_dict method
|
|
110
|
+
if not hasattr(obj, 'to_dict'):
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
# Check by class name
|
|
114
|
+
class_name = obj.__class__.__name__
|
|
115
|
+
altair_classes = ['Chart', 'LayerChart', 'HConcatChart', 'VConcatChart', 'FacetChart']
|
|
116
|
+
if any(ac in class_name for ac in altair_classes):
|
|
117
|
+
return True
|
|
118
|
+
|
|
119
|
+
# Check module
|
|
120
|
+
module = getattr(obj.__class__, '__module__', '')
|
|
121
|
+
if 'altair' in module or 'vega' in module:
|
|
122
|
+
return True
|
|
123
|
+
|
|
124
|
+
return False
|
|
125
|
+
|
|
126
|
+
def is_valid_chart(obj: Any) -> Tuple[bool, Optional[str]]:
|
|
127
|
+
"""Verify the chart can be serialized."""
|
|
128
|
+
try:
|
|
129
|
+
obj.to_dict()
|
|
130
|
+
return True, None
|
|
131
|
+
except Exception as exc:
|
|
132
|
+
return False, str(exc)
|
|
133
|
+
|
|
134
|
+
serialization_error = None
|
|
135
|
+
|
|
136
|
+
# Priority search for common variable names
|
|
137
|
+
priority_vars = ['chart', 'fig', 'c', 'plot', 'figure']
|
|
138
|
+
for var_name in priority_vars:
|
|
139
|
+
if var_name in context:
|
|
140
|
+
obj = context[var_name]
|
|
141
|
+
if is_altair_chart(obj):
|
|
142
|
+
is_valid, err_msg = is_valid_chart(obj)
|
|
143
|
+
if is_valid:
|
|
144
|
+
return obj, None
|
|
145
|
+
serialization_error = serialization_error or f"Chart variable '{var_name}' could not be serialized: {err_msg}"
|
|
146
|
+
|
|
147
|
+
# Scan all locals for chart objects
|
|
148
|
+
for var_name, obj in context.items():
|
|
149
|
+
if var_name.startswith('_'):
|
|
150
|
+
continue
|
|
151
|
+
if is_altair_chart(obj):
|
|
152
|
+
is_valid, err_msg = is_valid_chart(obj)
|
|
153
|
+
if is_valid:
|
|
154
|
+
return obj, None
|
|
155
|
+
serialization_error = serialization_error or f"Found a chart-like object in '{var_name}' but serialization failed: {err_msg}"
|
|
156
|
+
|
|
157
|
+
if serialization_error:
|
|
158
|
+
return None, serialization_error
|
|
159
|
+
|
|
160
|
+
return None, None
|
|
161
|
+
|
|
162
|
+
def _render_chart_content(self, chart_obj: Any, **kwargs) -> str:
|
|
163
|
+
"""Render Altair-specific chart content with vega-embed."""
|
|
164
|
+
embed_options = kwargs.get('embed_options', {})
|
|
165
|
+
|
|
166
|
+
try:
|
|
167
|
+
spec = chart_obj.to_dict()
|
|
168
|
+
|
|
169
|
+
# Ensure charts expand to the available container space
|
|
170
|
+
if not spec.get('autosize'):
|
|
171
|
+
spec['autosize'] = {
|
|
172
|
+
'type': 'fit',
|
|
173
|
+
'contains': 'padding',
|
|
174
|
+
'resize': True
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
config = spec.setdefault('config', {})
|
|
178
|
+
view_config = config.setdefault('view', {})
|
|
179
|
+
view_config.setdefault('continuousWidth', 'container')
|
|
180
|
+
view_config.setdefault('continuousHeight', 400)
|
|
181
|
+
|
|
182
|
+
spec_json = json.dumps(spec, indent=2)
|
|
183
|
+
except Exception as e:
|
|
184
|
+
return f'''
|
|
185
|
+
<div class="error-container">
|
|
186
|
+
<h3>⚠️ Chart Serialization Error</h3>
|
|
187
|
+
<p class="error-message">{str(e)}</p>
|
|
188
|
+
</div>
|
|
189
|
+
'''
|
|
190
|
+
|
|
191
|
+
chart_id = f"altair-chart-{uuid.uuid4().hex[:8]}"
|
|
192
|
+
|
|
193
|
+
default_options = {
|
|
194
|
+
'actions': {'export': True, 'source': False, 'editor': False},
|
|
195
|
+
'theme': kwargs.get('vega_theme', 'latimes')
|
|
196
|
+
}
|
|
197
|
+
default_options |= embed_options
|
|
198
|
+
options_json = json.dumps(default_options)
|
|
199
|
+
|
|
200
|
+
return f'''
|
|
201
|
+
<div class="altair-chart-wrapper" style="margin-bottom: 20px;">
|
|
202
|
+
<div id="{chart_id}" style="width: 100%; min-height: 400px;"></div>
|
|
203
|
+
<script type="text/javascript">
|
|
204
|
+
(function() {{
|
|
205
|
+
if (typeof vegaEmbed === 'undefined') {{
|
|
206
|
+
console.error("Vega-Embed library not loaded");
|
|
207
|
+
document.getElementById('{chart_id}').innerHTML =
|
|
208
|
+
'<div class="error-container">' +
|
|
209
|
+
'<h3>⚠️ Library Error</h3>' +
|
|
210
|
+
'<p class="error-message">Vega-Embed library not loaded</p>' +
|
|
211
|
+
'</div>';
|
|
212
|
+
return;
|
|
213
|
+
}}
|
|
214
|
+
|
|
215
|
+
vegaEmbed('#{chart_id}', {spec_json}, {options_json})
|
|
216
|
+
.then(result => {{
|
|
217
|
+
console.log('Altair chart {chart_id} rendered successfully');
|
|
218
|
+
}})
|
|
219
|
+
.catch(error => {{
|
|
220
|
+
console.error('Error rendering Altair chart:', error);
|
|
221
|
+
document.getElementById('{chart_id}').innerHTML =
|
|
222
|
+
'<div class="error-container">' +
|
|
223
|
+
'<h3>⚠️ Chart Rendering Error</h3>' +
|
|
224
|
+
'<p class="error-message">' + error.message + '</p>' +
|
|
225
|
+
'</div>';
|
|
226
|
+
}});
|
|
227
|
+
}})();
|
|
228
|
+
</script>
|
|
229
|
+
</div>
|
|
230
|
+
'''
|
|
231
|
+
|
|
232
|
+
def to_html(
|
|
233
|
+
self,
|
|
234
|
+
chart_obj: Any,
|
|
235
|
+
mode: str = 'partial',
|
|
236
|
+
**kwargs
|
|
237
|
+
) -> str:
|
|
238
|
+
"""
|
|
239
|
+
Convert Altair chart to HTML.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
chart_obj: Altair chart object
|
|
243
|
+
mode: 'partial' or 'complete'
|
|
244
|
+
**kwargs: Additional parameters
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
HTML string
|
|
248
|
+
"""
|
|
249
|
+
# Vega libraries for <head>
|
|
250
|
+
extra_head = '''
|
|
251
|
+
<!-- Vega/Vega-Lite/Vega-Embed -->
|
|
252
|
+
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
|
|
253
|
+
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
|
|
254
|
+
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
|
|
255
|
+
'''
|
|
256
|
+
|
|
257
|
+
kwargs['extra_head'] = kwargs.get('extra_head', extra_head)
|
|
258
|
+
|
|
259
|
+
# Call parent to_html which uses _render_chart_content
|
|
260
|
+
return super().to_html(chart_obj, mode=mode, **kwargs)
|
|
261
|
+
|
|
262
|
+
def to_json(self, chart_obj: Any) -> Optional[Dict]:
|
|
263
|
+
"""Export Vega-Lite JSON specification."""
|
|
264
|
+
try:
|
|
265
|
+
return chart_obj.to_dict()
|
|
266
|
+
except Exception as e:
|
|
267
|
+
return {'error': str(e)}
|
|
268
|
+
|
|
269
|
+
async def render(
|
|
270
|
+
self,
|
|
271
|
+
response: Any,
|
|
272
|
+
theme: str = 'monokai',
|
|
273
|
+
environment: str = 'html',
|
|
274
|
+
include_code: bool = False,
|
|
275
|
+
html_mode: str = 'partial',
|
|
276
|
+
**kwargs
|
|
277
|
+
) -> Tuple[Any, Optional[Any]]:
|
|
278
|
+
"""
|
|
279
|
+
Render Altair chart.
|
|
280
|
+
|
|
281
|
+
Environments:
|
|
282
|
+
- 'html': Returns HTML with embedded Vega-Embed
|
|
283
|
+
- 'default': Returns JSON specification (Vega-Lite spec)
|
|
284
|
+
- 'json': Returns JSON specification
|
|
285
|
+
- 'jupyter'/'notebook': Returns chart object for native rendering
|
|
286
|
+
- 'terminal': Returns code only
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
Tuple[Any, Optional[Any]]: (code, output)
|
|
290
|
+
- code goes to response.output
|
|
291
|
+
- output goes to response.response
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
# 1. Extract Code
|
|
295
|
+
code = getattr(response, 'code', None)
|
|
296
|
+
output_format = kwargs.get('output_format', environment)
|
|
297
|
+
|
|
298
|
+
# Fallback to extracting from text content
|
|
299
|
+
if not code:
|
|
300
|
+
content = self._get_content(response)
|
|
301
|
+
code = self._extract_code(content)
|
|
302
|
+
|
|
303
|
+
if not code:
|
|
304
|
+
error_msg = "No chart code found in response"
|
|
305
|
+
if output_format == 'terminal':
|
|
306
|
+
return error_msg, None
|
|
307
|
+
return self._wrap_for_environment(
|
|
308
|
+
f"<div class='error'>{error_msg}</div>",
|
|
309
|
+
output_format
|
|
310
|
+
), None
|
|
311
|
+
|
|
312
|
+
# 2. Execute Code
|
|
313
|
+
chart_obj, error = self.execute_code(
|
|
314
|
+
code,
|
|
315
|
+
pandas_tool=kwargs.pop('pandas_tool', None),
|
|
316
|
+
execution_state=kwargs.pop('execution_state', None),
|
|
317
|
+
**kwargs,
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
if error:
|
|
321
|
+
if output_format == 'terminal':
|
|
322
|
+
return f"Error generating chart: {error}", None
|
|
323
|
+
return self._wrap_for_environment(
|
|
324
|
+
self._render_error(error, code, theme),
|
|
325
|
+
output_format
|
|
326
|
+
), None
|
|
327
|
+
|
|
328
|
+
# 3. Handle different output formats
|
|
329
|
+
|
|
330
|
+
# Terminal: just return code
|
|
331
|
+
if output_format == 'terminal':
|
|
332
|
+
return code, None
|
|
333
|
+
|
|
334
|
+
# Jupyter/Notebook: return chart object for native rendering
|
|
335
|
+
if output_format in {'jupyter', 'notebook', 'ipython', 'colab'}:
|
|
336
|
+
return code, chart_obj
|
|
337
|
+
|
|
338
|
+
# Default: return JSON specification (Vega-Lite spec)
|
|
339
|
+
if output_format == 'default':
|
|
340
|
+
json_spec = self.to_json(chart_obj)
|
|
341
|
+
return code, json_spec
|
|
342
|
+
|
|
343
|
+
# JSON: explicit JSON request
|
|
344
|
+
if output_format == 'json':
|
|
345
|
+
return code, self.to_json(chart_obj)
|
|
346
|
+
|
|
347
|
+
# HTML (default): Generate embedded HTML
|
|
348
|
+
html_output = self.to_html(
|
|
349
|
+
chart_obj,
|
|
350
|
+
mode=html_mode,
|
|
351
|
+
include_code=include_code,
|
|
352
|
+
code=code,
|
|
353
|
+
theme=theme,
|
|
354
|
+
title=kwargs.get('title', 'Altair Chart'),
|
|
355
|
+
icon='📊',
|
|
356
|
+
**kwargs
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
return code, html_output
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from typing import Any, Optional, Tuple, Dict, Type
|
|
2
|
+
import json
|
|
3
|
+
import pandas as pd
|
|
4
|
+
from .base import BaseRenderer
|
|
5
|
+
from . import register_renderer
|
|
6
|
+
from ...models.outputs import OutputMode
|
|
7
|
+
from .generators.abstract import AbstractAppGenerator
|
|
8
|
+
from .generators.streamlit import StreamlitGenerator
|
|
9
|
+
from .generators.panel import PanelGenerator
|
|
10
|
+
from .generators.terminal import TerminalGenerator
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# Define available generators mapping
|
|
14
|
+
GENERATORS: Dict[str, Type[AbstractAppGenerator]] = {
|
|
15
|
+
'streamlit': StreamlitGenerator,
|
|
16
|
+
'panel': PanelGenerator,
|
|
17
|
+
'terminal': TerminalGenerator,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
OUTPUT_APPLICATION_PROMPT = """
|
|
22
|
+
**APPLICATION GENERATION MODE**
|
|
23
|
+
|
|
24
|
+
**Objective:**
|
|
25
|
+
Transform the user's query and the agent's analysis into a fully functional, standalone application (Streamlit, Panel, or Terminal Dashboard).
|
|
26
|
+
|
|
27
|
+
**INSTRUCTIONS:**
|
|
28
|
+
1. **Analyze & Compute:**
|
|
29
|
+
- Use the provided Python tools to query the dataframes (`df1`, `df2`, etc.).
|
|
30
|
+
- Ensure all data processing happens within the tool execution.
|
|
31
|
+
|
|
32
|
+
2. **Visualize (Code Generation):**
|
|
33
|
+
- If the user asks for charts, maps, or visual insights, generate the Python code to create them.
|
|
34
|
+
- **Crucial:** The code MUST be self-contained (using `df` as the variable name for the data).
|
|
35
|
+
- Support libraries: `plotly`, `altair`, `matplotlib`, `bokeh`.
|
|
36
|
+
|
|
37
|
+
3. **Structured Response:**
|
|
38
|
+
- Return the response strictly following the `PandasAgentResponse` schema.
|
|
39
|
+
- `explanation`: A clear, formatted text summary of findings.
|
|
40
|
+
- `data`: The relevant subset of data (rows/columns) to display in the app.
|
|
41
|
+
- `code`: The specific Python code block that generates the visualizations.
|
|
42
|
+
|
|
43
|
+
**Example Code Snippet (for 'code' field):**
|
|
44
|
+
```python
|
|
45
|
+
import plotly.express as px
|
|
46
|
+
# Assume 'df' is already loaded in the app context
|
|
47
|
+
fig = px.bar(df, x='Category', y='Sales', title='Sales Performance')
|
|
48
|
+
st.plotly_chart(fig) # For Streamlit
|
|
49
|
+
# or
|
|
50
|
+
fig.show() # For generic
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@register_renderer(OutputMode.APPLICATION, system_prompt=OUTPUT_APPLICATION_PROMPT)
|
|
55
|
+
class ApplicationRenderer(BaseRenderer):
|
|
56
|
+
"""
|
|
57
|
+
Renderer that wraps the Agent Response into a standalone Application.
|
|
58
|
+
Supports: Streamlit, Panel.
|
|
59
|
+
"""
|
|
60
|
+
async def render(
|
|
61
|
+
self,
|
|
62
|
+
response: Any,
|
|
63
|
+
environment: str = 'terminal',
|
|
64
|
+
app_type: str = 'streamlit',
|
|
65
|
+
**kwargs,
|
|
66
|
+
) -> Tuple[Any, Any]:
|
|
67
|
+
"""
|
|
68
|
+
Render response using the requested Application Generator.
|
|
69
|
+
"""
|
|
70
|
+
# 1. Select Generator Class
|
|
71
|
+
output_format = kwargs.get('output_format', environment)
|
|
72
|
+
# If environment is terminal and no specific app_type requested, default to terminal app
|
|
73
|
+
if output_format == 'terminal':
|
|
74
|
+
generator_cls = TerminalGenerator
|
|
75
|
+
else:
|
|
76
|
+
generator_cls = GENERATORS.get(app_type.lower(), StreamlitGenerator)
|
|
77
|
+
|
|
78
|
+
# 2. Instantiate and Generate
|
|
79
|
+
generator = generator_cls(response)
|
|
80
|
+
output = generator.generate()
|
|
81
|
+
|
|
82
|
+
# 3. Wrap Output
|
|
83
|
+
# For TerminalApp, the output IS the renderable object
|
|
84
|
+
if isinstance(generator, TerminalGenerator):
|
|
85
|
+
return "", output
|
|
86
|
+
|
|
87
|
+
# For Code Generators (Streamlit/Panel)
|
|
88
|
+
wrapped = self._wrap_code_instruction(output, app_type, environment)
|
|
89
|
+
|
|
90
|
+
return output, wrapped
|
|
91
|
+
|
|
92
|
+
def _wrap_code_instruction(self, code: str, app_type: str, environment: str) -> Any:
|
|
93
|
+
"""Wraps the generated code with run instructions."""
|
|
94
|
+
filename = f"app_{app_type}.py"
|
|
95
|
+
cmd = f"streamlit run {filename}" if app_type == 'streamlit' else f"panel serve {filename}"
|
|
96
|
+
|
|
97
|
+
if environment == 'terminal':
|
|
98
|
+
try:
|
|
99
|
+
from rich.panel import Panel
|
|
100
|
+
from rich.syntax import Syntax
|
|
101
|
+
from rich.console import Group
|
|
102
|
+
from rich.markdown import Markdown
|
|
103
|
+
|
|
104
|
+
return Panel(
|
|
105
|
+
Group(
|
|
106
|
+
Markdown(f"**To run this {app_type.title()} app:**\n1. Save to `{filename}`\n2. Run `{cmd}`"),
|
|
107
|
+
Syntax(code, "python", theme="monokai")
|
|
108
|
+
),
|
|
109
|
+
title=f"🚀 {app_type.title()} App Generated",
|
|
110
|
+
border_style="green"
|
|
111
|
+
)
|
|
112
|
+
except ImportError:
|
|
113
|
+
return f"Save to {filename} and run: {cmd}\n\n{code}"
|
|
114
|
+
|
|
115
|
+
elif environment in {'jupyter', 'notebook', 'colab'}:
|
|
116
|
+
from ipywidgets import HTML, VBox, Textarea, Layout
|
|
117
|
+
return VBox([
|
|
118
|
+
HTML(f"<b>{app_type.title()} App Generated.</b> Save code below and run: <code>{cmd}</code>"),
|
|
119
|
+
Textarea(value=code, layout=Layout(width='100%', height='300px'))
|
|
120
|
+
])
|
|
121
|
+
|
|
122
|
+
return code
|