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,205 @@
|
|
|
1
|
+
from typing import Type, List
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from .base import WebAppGenerator
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ReactApp(BaseModel):
|
|
7
|
+
"""Pydantic schema for React application output."""
|
|
8
|
+
code: str = Field(description="Complete React component code")
|
|
9
|
+
component_name: str = Field(description="Main component name")
|
|
10
|
+
description: str = Field(description="App description")
|
|
11
|
+
dependencies: List[str] = Field(
|
|
12
|
+
description="External dependencies used",
|
|
13
|
+
default_factory=lambda: ["react", "recharts", "lucide-react"]
|
|
14
|
+
)
|
|
15
|
+
features: List[str] = Field(description="Key features implemented")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ReactGenerator(WebAppGenerator):
|
|
19
|
+
"""Generator for React applications."""
|
|
20
|
+
|
|
21
|
+
def get_system_prompt(self) -> str:
|
|
22
|
+
return """You are a senior React developer building modern, responsive web applications.
|
|
23
|
+
|
|
24
|
+
**User Requirements:**
|
|
25
|
+
{user_description}
|
|
26
|
+
|
|
27
|
+
**Technical Stack:**
|
|
28
|
+
- React 18+ with Hooks (useState, useEffect, useReducer, useMemo, useCallback)
|
|
29
|
+
- Tailwind CSS for ALL styling (no inline styles)
|
|
30
|
+
- Recharts for charts and data visualization
|
|
31
|
+
- Lucide React for icons
|
|
32
|
+
- Mock data only (no external API calls)
|
|
33
|
+
|
|
34
|
+
**Code Quality Standards:**
|
|
35
|
+
- Functional components only (no class components)
|
|
36
|
+
- Proper prop destructuring and validation
|
|
37
|
+
- Clean, modular component structure
|
|
38
|
+
- Responsive design using Tailwind's responsive classes
|
|
39
|
+
- Accessibility: ARIA labels, semantic HTML, keyboard navigation
|
|
40
|
+
- Performance: useMemo for expensive computations, useCallback for event handlers
|
|
41
|
+
|
|
42
|
+
**Styling Requirements:**
|
|
43
|
+
- Use ONLY Tailwind utility classes
|
|
44
|
+
- Consistent color palette (blue-600 primary, gray-50 backgrounds)
|
|
45
|
+
- Proper spacing scale (p-4, p-6, etc.)
|
|
46
|
+
- Smooth transitions (transition-all duration-300)
|
|
47
|
+
- Hover states for interactive elements
|
|
48
|
+
- Mobile-first responsive design
|
|
49
|
+
|
|
50
|
+
**Component Structure:**
|
|
51
|
+
1. Import statements at top
|
|
52
|
+
2. Component definition with clear function name
|
|
53
|
+
3. State declarations grouped together
|
|
54
|
+
4. Helper functions
|
|
55
|
+
5. useEffect hooks
|
|
56
|
+
6. JSX return statement
|
|
57
|
+
7. Default export
|
|
58
|
+
|
|
59
|
+
**Best Practices:**
|
|
60
|
+
- Break large components into smaller ones
|
|
61
|
+
- Keep components under 200 lines
|
|
62
|
+
- Use meaningful variable names
|
|
63
|
+
- Add comments for complex logic
|
|
64
|
+
- Include loading and error states
|
|
65
|
+
- Implement proper form validation
|
|
66
|
+
|
|
67
|
+
**Example Quality Standard:**
|
|
68
|
+
{high_quality_example}
|
|
69
|
+
|
|
70
|
+
Generate a complete, self-contained React component as a default export."""
|
|
71
|
+
|
|
72
|
+
def get_output_schema(self) -> Type[BaseModel]:
|
|
73
|
+
return ReactApp
|
|
74
|
+
|
|
75
|
+
def get_examples(self) -> str:
|
|
76
|
+
return '''
|
|
77
|
+
import React, { useState, useMemo } from 'react';
|
|
78
|
+
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';
|
|
79
|
+
import { TrendingUp, Download, Filter } from 'lucide-react';
|
|
80
|
+
|
|
81
|
+
const Dashboard = () => {
|
|
82
|
+
// Mock data
|
|
83
|
+
const [data] = useState([
|
|
84
|
+
{ name: 'Jan', revenue: 4000, expenses: 2400 },
|
|
85
|
+
{ name: 'Feb', revenue: 3000, expenses: 1398 },
|
|
86
|
+
{ name: 'Mar', revenue: 2000, expenses: 9800 },
|
|
87
|
+
{ name: 'Apr', revenue: 2780, expenses: 3908 },
|
|
88
|
+
{ name: 'May', revenue: 1890, expenses: 4800 },
|
|
89
|
+
{ name: 'Jun', revenue: 2390, expenses: 3800 }
|
|
90
|
+
]);
|
|
91
|
+
|
|
92
|
+
const [filterActive, setFilterActive] = useState(false);
|
|
93
|
+
|
|
94
|
+
// Compute metrics
|
|
95
|
+
const metrics = useMemo(() => ({
|
|
96
|
+
totalRevenue: data.reduce((sum, item) => sum + item.revenue, 0),
|
|
97
|
+
totalExpenses: data.reduce((sum, item) => sum + item.expenses, 0),
|
|
98
|
+
avgRevenue: data.reduce((sum, item) => sum + item.revenue, 0) / data.length
|
|
99
|
+
}), [data]);
|
|
100
|
+
|
|
101
|
+
const handleExport = () => {
|
|
102
|
+
const csv = [
|
|
103
|
+
'Month,Revenue,Expenses',
|
|
104
|
+
...data.map(d => `${d.name},${d.revenue},${d.expenses}`)
|
|
105
|
+
].join('\\n');
|
|
106
|
+
|
|
107
|
+
const blob = new Blob([csv], { type: 'text/csv' });
|
|
108
|
+
const url = window.URL.createObjectURL(blob);
|
|
109
|
+
const a = document.createElement('a');
|
|
110
|
+
a.href = url;
|
|
111
|
+
a.download = 'data.csv';
|
|
112
|
+
a.click();
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<div className="min-h-screen bg-gray-50 p-6">
|
|
117
|
+
<div className="max-w-7xl mx-auto">
|
|
118
|
+
{/* Header */}
|
|
119
|
+
<div className="bg-white rounded-lg shadow-lg p-6 mb-6">
|
|
120
|
+
<div className="flex items-center justify-between mb-4">
|
|
121
|
+
<div className="flex items-center gap-3">
|
|
122
|
+
<TrendingUp className="text-blue-600" size={32} />
|
|
123
|
+
<div>
|
|
124
|
+
<h1 className="text-3xl font-bold text-gray-900">
|
|
125
|
+
Financial Dashboard
|
|
126
|
+
</h1>
|
|
127
|
+
<p className="text-gray-600">Track your revenue and expenses</p>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
<div className="flex gap-2">
|
|
132
|
+
<button
|
|
133
|
+
onClick={() => setFilterActive(!filterActive)}
|
|
134
|
+
className="flex items-center gap-2 px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors"
|
|
135
|
+
aria-label="Toggle filters"
|
|
136
|
+
>
|
|
137
|
+
<Filter size={18} />
|
|
138
|
+
Filters
|
|
139
|
+
</button>
|
|
140
|
+
<button
|
|
141
|
+
onClick={handleExport}
|
|
142
|
+
className="flex items-center gap-2 px-4 py-2 bg-blue-600 text-white hover:bg-blue-700 rounded-lg transition-colors"
|
|
143
|
+
aria-label="Export data"
|
|
144
|
+
>
|
|
145
|
+
<Download size={18} />
|
|
146
|
+
Export
|
|
147
|
+
</button>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
{/* Metrics */}
|
|
152
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
153
|
+
<div className="bg-gradient-to-br from-blue-50 to-blue-100 rounded-lg p-4">
|
|
154
|
+
<div className="text-sm text-blue-600 font-medium mb-1">
|
|
155
|
+
Total Revenue
|
|
156
|
+
</div>
|
|
157
|
+
<div className="text-2xl font-bold text-blue-900">
|
|
158
|
+
${metrics.totalRevenue.toLocaleString()}
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
<div className="bg-gradient-to-br from-red-50 to-red-100 rounded-lg p-4">
|
|
162
|
+
<div className="text-sm text-red-600 font-medium mb-1">
|
|
163
|
+
Total Expenses
|
|
164
|
+
</div>
|
|
165
|
+
<div className="text-2xl font-bold text-red-900">
|
|
166
|
+
${metrics.totalExpenses.toLocaleString()}
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
<div className="bg-gradient-to-br from-green-50 to-green-100 rounded-lg p-4">
|
|
170
|
+
<div className="text-sm text-green-600 font-medium mb-1">
|
|
171
|
+
Avg Revenue
|
|
172
|
+
</div>
|
|
173
|
+
<div className="text-2xl font-bold text-green-900">
|
|
174
|
+
${Math.round(metrics.avgRevenue).toLocaleString()}
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
{/* Chart */}
|
|
181
|
+
<div className="bg-white rounded-lg shadow-lg p-6">
|
|
182
|
+
<h2 className="text-xl font-bold text-gray-900 mb-4">
|
|
183
|
+
Monthly Comparison
|
|
184
|
+
</h2>
|
|
185
|
+
<ResponsiveContainer width="100%" height={400}>
|
|
186
|
+
<BarChart data={data}>
|
|
187
|
+
<CartesianGrid strokeDasharray="3 3" />
|
|
188
|
+
<XAxis dataKey="name" />
|
|
189
|
+
<YAxis />
|
|
190
|
+
<Tooltip />
|
|
191
|
+
<Bar dataKey="revenue" fill="#3b82f6" name="Revenue" />
|
|
192
|
+
<Bar dataKey="expenses" fill="#ef4444" name="Expenses" />
|
|
193
|
+
</BarChart>
|
|
194
|
+
</ResponsiveContainer>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export default Dashboard;
|
|
202
|
+
'''
|
|
203
|
+
|
|
204
|
+
def _get_file_extension(self) -> str:
|
|
205
|
+
return '.jsx'
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
from typing import Type, List
|
|
2
|
+
import ast
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
from .base import WebAppGenerator
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class StreamlitApp(BaseModel):
|
|
8
|
+
"""Pydantic schema for Streamlit application output."""
|
|
9
|
+
code: str = Field(description="Complete Streamlit Python code")
|
|
10
|
+
title: str = Field(description="App title")
|
|
11
|
+
description: str = Field(description="Brief description of the app")
|
|
12
|
+
requirements: List[str] = Field(
|
|
13
|
+
description="Python package requirements",
|
|
14
|
+
default_factory=lambda: ["streamlit"]
|
|
15
|
+
)
|
|
16
|
+
features: List[str] = Field(description="List of main features")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class StreamlitGenerator(WebAppGenerator):
|
|
20
|
+
"""Generator for Streamlit applications."""
|
|
21
|
+
|
|
22
|
+
def get_system_prompt(self) -> str:
|
|
23
|
+
return """You are an expert Streamlit developer creating production-ready applications.
|
|
24
|
+
|
|
25
|
+
**User Requirements:**
|
|
26
|
+
{user_description}
|
|
27
|
+
|
|
28
|
+
{additional_requirements}
|
|
29
|
+
|
|
30
|
+
**Technical Specifications:**
|
|
31
|
+
- Streamlit version: 1.28+
|
|
32
|
+
- Python 3.10+
|
|
33
|
+
- Use st.cache_data for expensive computations
|
|
34
|
+
- Implement proper error handling with try-except blocks
|
|
35
|
+
- Add loading states with st.spinner()
|
|
36
|
+
- Use st.session_state for state management
|
|
37
|
+
- Add input validation and clear error messages
|
|
38
|
+
|
|
39
|
+
**Design Guidelines:**
|
|
40
|
+
- Clean, modern UI with st.columns for layout
|
|
41
|
+
- Consistent spacing with st.divider() and padding
|
|
42
|
+
- Helpful tooltips using help parameter
|
|
43
|
+
- Clear section headers with st.header() and st.subheader()
|
|
44
|
+
- Data export functionality where appropriate
|
|
45
|
+
- Mobile-responsive considerations
|
|
46
|
+
|
|
47
|
+
**Code Structure:**
|
|
48
|
+
1. Required imports at the top
|
|
49
|
+
2. Page configuration using st.set_page_config() with appropriate title and layout
|
|
50
|
+
3. Helper functions decorated with @st.cache_data where appropriate
|
|
51
|
+
4. Main application logic
|
|
52
|
+
5. if __name__ == "__main__": block at the end
|
|
53
|
+
|
|
54
|
+
**Quality Standards:**
|
|
55
|
+
- All functions must have docstrings
|
|
56
|
+
- Use type hints for function parameters
|
|
57
|
+
- Include comments for complex logic
|
|
58
|
+
- Handle edge cases and errors gracefully
|
|
59
|
+
- Use st.empty() for dynamic content updates
|
|
60
|
+
- Add st.success(), st.warning(), st.error() for user feedback
|
|
61
|
+
|
|
62
|
+
**Example of Expected Quality:**
|
|
63
|
+
{high_quality_example}
|
|
64
|
+
|
|
65
|
+
Generate a complete, production-ready Streamlit application now."""
|
|
66
|
+
|
|
67
|
+
def get_output_schema(self) -> Type[BaseModel]:
|
|
68
|
+
return StreamlitApp
|
|
69
|
+
|
|
70
|
+
def get_examples(self) -> str:
|
|
71
|
+
return '''
|
|
72
|
+
import streamlit as st
|
|
73
|
+
import pandas as pd
|
|
74
|
+
import plotly.express as px
|
|
75
|
+
from datetime import datetime
|
|
76
|
+
|
|
77
|
+
# Page configuration
|
|
78
|
+
st.set_page_config(
|
|
79
|
+
page_title="Data Analysis Dashboard",
|
|
80
|
+
page_icon="📊",
|
|
81
|
+
layout="wide",
|
|
82
|
+
initial_sidebar_state="expanded"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Cache expensive operations
|
|
86
|
+
@st.cache_data
|
|
87
|
+
def load_data() -> pd.DataFrame:
|
|
88
|
+
"""Load and prepare sample data."""
|
|
89
|
+
return pd.DataFrame({
|
|
90
|
+
'date': pd.date_range('2024-01-01', periods=100),
|
|
91
|
+
'category': ['A', 'B', 'C', 'D'] * 25,
|
|
92
|
+
'value': np.random.randint(10, 100, 100)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
@st.cache_data
|
|
96
|
+
def calculate_metrics(df: pd.DataFrame) -> dict:
|
|
97
|
+
"""Calculate summary metrics."""
|
|
98
|
+
return {
|
|
99
|
+
'total': df['value'].sum(),
|
|
100
|
+
'average': df['value'].mean(),
|
|
101
|
+
'max': df['value'].max(),
|
|
102
|
+
'min': df['value'].min()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
def main():
|
|
106
|
+
"""Main application function."""
|
|
107
|
+
st.title("📊 Data Analysis Dashboard")
|
|
108
|
+
st.markdown("Analyze your data with interactive visualizations")
|
|
109
|
+
|
|
110
|
+
# Sidebar controls
|
|
111
|
+
with st.sidebar:
|
|
112
|
+
st.header("Filters")
|
|
113
|
+
categories = st.multiselect(
|
|
114
|
+
"Select Categories",
|
|
115
|
+
options=['A', 'B', 'C', 'D'],
|
|
116
|
+
default=['A', 'B'],
|
|
117
|
+
help="Choose which categories to display"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Load data
|
|
121
|
+
try:
|
|
122
|
+
with st.spinner("Loading data..."):
|
|
123
|
+
df = load_data()
|
|
124
|
+
|
|
125
|
+
# Filter data
|
|
126
|
+
filtered_df = df[df['category'].isin(categories)]
|
|
127
|
+
|
|
128
|
+
if filtered_df.empty:
|
|
129
|
+
st.warning("No data available for selected filters")
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
# Metrics row
|
|
133
|
+
metrics = calculate_metrics(filtered_df)
|
|
134
|
+
col1, col2, col3, col4 = st.columns(4)
|
|
135
|
+
|
|
136
|
+
with col1:
|
|
137
|
+
st.metric("Total", f"{metrics['total']:,.0f}")
|
|
138
|
+
with col2:
|
|
139
|
+
st.metric("Average", f"{metrics['average']:.1f}")
|
|
140
|
+
with col3:
|
|
141
|
+
st.metric("Maximum", metrics['max'])
|
|
142
|
+
with col4:
|
|
143
|
+
st.metric("Minimum", metrics['min'])
|
|
144
|
+
|
|
145
|
+
st.divider()
|
|
146
|
+
|
|
147
|
+
# Visualization
|
|
148
|
+
st.subheader("Trend Analysis")
|
|
149
|
+
fig = px.line(
|
|
150
|
+
filtered_df,
|
|
151
|
+
x='date',
|
|
152
|
+
y='value',
|
|
153
|
+
color='category',
|
|
154
|
+
title='Values Over Time'
|
|
155
|
+
)
|
|
156
|
+
st.plotly_chart(fig, use_container_width=True)
|
|
157
|
+
|
|
158
|
+
# Data table
|
|
159
|
+
with st.expander("View Raw Data"):
|
|
160
|
+
st.dataframe(filtered_df, use_container_width=True)
|
|
161
|
+
|
|
162
|
+
# Export functionality
|
|
163
|
+
csv = filtered_df.to_csv(index=False)
|
|
164
|
+
st.download_button(
|
|
165
|
+
label="Download CSV",
|
|
166
|
+
data=csv,
|
|
167
|
+
file_name=f"data_export_{datetime.now():%Y%m%d}.csv",
|
|
168
|
+
mime="text/csv"
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
st.success("✓ Analysis complete!")
|
|
172
|
+
|
|
173
|
+
except Exception as e:
|
|
174
|
+
st.error(f"An error occurred: {str(e)}")
|
|
175
|
+
st.exception(e)
|
|
176
|
+
|
|
177
|
+
if __name__ == "__main__":
|
|
178
|
+
main()
|
|
179
|
+
'''
|
|
180
|
+
|
|
181
|
+
def validate_output(self, code: str) -> dict:
|
|
182
|
+
"""Validate Python syntax of generated Streamlit code."""
|
|
183
|
+
errors = []
|
|
184
|
+
warnings = []
|
|
185
|
+
|
|
186
|
+
try:
|
|
187
|
+
ast.parse(code)
|
|
188
|
+
except SyntaxError as e:
|
|
189
|
+
errors.append(f"Syntax error: {e}")
|
|
190
|
+
|
|
191
|
+
# Check for required Streamlit imports
|
|
192
|
+
if 'import streamlit' not in code:
|
|
193
|
+
warnings.append("Missing streamlit import")
|
|
194
|
+
|
|
195
|
+
# Check for page config
|
|
196
|
+
if 'st.set_page_config' not in code:
|
|
197
|
+
warnings.append("Missing st.set_page_config() - recommended for better UX")
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
"valid": len(errors) == 0,
|
|
201
|
+
"errors": errors,
|
|
202
|
+
"warnings": warnings
|
|
203
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
from typing import List, Dict, Any, Optional
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
import json
|
|
5
|
+
from datamodel.parsers.json import json_encoder, json_decoder # pylint: disable=E0611 # noqa
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AppTemplate(BaseModel):
|
|
9
|
+
"""Template for app generation."""
|
|
10
|
+
name: str
|
|
11
|
+
description: str
|
|
12
|
+
app_type: str # streamlit, react, html
|
|
13
|
+
base_structure: Dict[str, Any]
|
|
14
|
+
required_features: List[str]
|
|
15
|
+
optional_features: List[str]
|
|
16
|
+
styling_theme: Dict[str, str]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TemplateManager:
|
|
20
|
+
"""
|
|
21
|
+
Manages reusable templates for web app generation.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, templates_dir: Path):
|
|
25
|
+
self.templates_dir = templates_dir
|
|
26
|
+
self.templates_dir.mkdir(parents=True, exist_ok=True)
|
|
27
|
+
self._templates: Dict[str, AppTemplate] = {}
|
|
28
|
+
self._load_templates()
|
|
29
|
+
|
|
30
|
+
def _load_templates(self):
|
|
31
|
+
"""Load templates from directory."""
|
|
32
|
+
for template_file in self.templates_dir.glob("*.json"):
|
|
33
|
+
with open(template_file) as f:
|
|
34
|
+
data = json_decoder(f)
|
|
35
|
+
template = AppTemplate(**data)
|
|
36
|
+
self._templates[template.name] = template
|
|
37
|
+
|
|
38
|
+
def create_template(
|
|
39
|
+
self,
|
|
40
|
+
name: str,
|
|
41
|
+
app_type: str,
|
|
42
|
+
description: str,
|
|
43
|
+
base_structure: Dict[str, Any],
|
|
44
|
+
required_features: List[str],
|
|
45
|
+
optional_features: List[str] = None,
|
|
46
|
+
styling_theme: Dict[str, str] = None
|
|
47
|
+
) -> AppTemplate:
|
|
48
|
+
"""Create a new template."""
|
|
49
|
+
template = AppTemplate(
|
|
50
|
+
name=name,
|
|
51
|
+
description=description,
|
|
52
|
+
app_type=app_type,
|
|
53
|
+
base_structure=base_structure,
|
|
54
|
+
required_features=required_features,
|
|
55
|
+
optional_features=optional_features or [],
|
|
56
|
+
styling_theme=styling_theme or {}
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Save to file
|
|
60
|
+
template_file = self.templates_dir / f"{name}.json"
|
|
61
|
+
with open(template_file, 'w') as f:
|
|
62
|
+
json_encoder(template.model_dump(), f)
|
|
63
|
+
|
|
64
|
+
self._templates[name] = template
|
|
65
|
+
return template
|
|
66
|
+
|
|
67
|
+
def get_template(self, name: str) -> Optional[AppTemplate]:
|
|
68
|
+
"""Get a template by name."""
|
|
69
|
+
return self._templates.get(name)
|
|
70
|
+
|
|
71
|
+
def list_templates(self) -> List[str]:
|
|
72
|
+
"""List all available templates."""
|
|
73
|
+
return list(self._templates.keys())
|
|
74
|
+
|
|
75
|
+
def generate_from_template(
|
|
76
|
+
self,
|
|
77
|
+
template_name: str,
|
|
78
|
+
customization: Dict[str, Any],
|
|
79
|
+
llm_client
|
|
80
|
+
) -> str:
|
|
81
|
+
"""Generate an app from a template with customization."""
|
|
82
|
+
template = self.get_template(template_name)
|
|
83
|
+
if not template:
|
|
84
|
+
raise ValueError(f"Template '{template_name}' not found")
|
|
85
|
+
|
|
86
|
+
prompt = f"""Generate a {template.app_type} application based on this template:
|
|
87
|
+
|
|
88
|
+
**Template:** {template.name}
|
|
89
|
+
{template.description}
|
|
90
|
+
|
|
91
|
+
**Required Features:**
|
|
92
|
+
{chr(10).join(f'- {f}' for f in template.required_features)}
|
|
93
|
+
|
|
94
|
+
**Customizations:**
|
|
95
|
+
{chr(10).join(f'- {k}: {v}' for k, v in customization.items())}
|
|
96
|
+
|
|
97
|
+
**Base Structure:**
|
|
98
|
+
{json.dumps(template.base_structure, indent=2)}
|
|
99
|
+
|
|
100
|
+
**Styling Theme:**
|
|
101
|
+
{json.dumps(template.styling_theme, indent=2)}
|
|
102
|
+
|
|
103
|
+
Generate complete code following the template structure with the specified customizations."""
|
|
104
|
+
|
|
105
|
+
return prompt
|