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,468 @@
|
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# SCHEMA-CENTRIC DATA MODELS
|
|
3
|
+
# ============================================================================
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
from typing import Dict, Any, List, Optional, Union
|
|
6
|
+
from enum import Enum, Flag, auto
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
from datamodel.parsers.json import json_encoder, json_decoder # pylint: disable=E0611 # noqa
|
|
11
|
+
import yaml
|
|
12
|
+
import pandas as pd
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class UserRole(str, Enum):
|
|
16
|
+
"""Define user roles with specific output preferences."""
|
|
17
|
+
BUSINESS_USER = "business_user" # Data only, no limits, minimal explanation
|
|
18
|
+
DATA_ANALYST = "data_analyst" # Explanations, samples, schema context
|
|
19
|
+
DATA_SCIENTIST = "data_scientist" # Schema context + DataFrame conversion (no limits)
|
|
20
|
+
DATABASE_ADMIN = "database_admin" # SQL, execution plans, performance, optimization, sample data
|
|
21
|
+
DEVELOPER = "developer" # SQL/schema, explanations, examples, no data
|
|
22
|
+
QUERY_DEVELOPER = "query_developer" # SQL/schema, execution plans, performance, optimization, no data
|
|
23
|
+
|
|
24
|
+
class OutputComponent(Flag):
|
|
25
|
+
"""Flags for different response components - allows combinations."""
|
|
26
|
+
NONE = 0
|
|
27
|
+
SQL_QUERY = auto() # Generated or validated SQL query
|
|
28
|
+
EXECUTION_PLAN = auto() # EXPLAIN ANALYZE results with optimizations
|
|
29
|
+
DATA_RESULTS = auto() # Actual query results
|
|
30
|
+
DOCUMENTATION = auto() # Table/schema metadata and explanations
|
|
31
|
+
EXAMPLES = auto() # Usage examples and sample queries
|
|
32
|
+
PERFORMANCE_METRICS = auto() # Performance analysis and index suggestions
|
|
33
|
+
SCHEMA_CONTEXT = auto() # Available tables, columns, relationships
|
|
34
|
+
OPTIMIZATION_TIPS = auto() # Query optimization suggestions
|
|
35
|
+
SAMPLE_DATA = auto() # Sample rows for understanding data format
|
|
36
|
+
DATAFRAME_OUTPUT = auto() # Convert results to pandas DataFrame
|
|
37
|
+
|
|
38
|
+
# Convenience combinations
|
|
39
|
+
BASIC_QUERY = SQL_QUERY | DATA_RESULTS
|
|
40
|
+
FULL_ANALYSIS = SQL_QUERY | EXECUTION_PLAN | PERFORMANCE_METRICS | OPTIMIZATION_TIPS
|
|
41
|
+
DEVELOPER_FOCUS = SQL_QUERY | DOCUMENTATION | EXAMPLES | SCHEMA_CONTEXT
|
|
42
|
+
BUSINESS_FOCUS = DATA_RESULTS
|
|
43
|
+
QUERY_DEVELOPER_FOCUS = SQL_QUERY | EXECUTION_PLAN | PERFORMANCE_METRICS | OPTIMIZATION_TIPS | SCHEMA_CONTEXT
|
|
44
|
+
|
|
45
|
+
class OutputFormat(str, Enum):
|
|
46
|
+
"""Defines the desired format of the response."""
|
|
47
|
+
# Basic formats
|
|
48
|
+
QUERY_ONLY = "query_only" # Just the Query, no execution
|
|
49
|
+
DATA_ONLY = "data_only" # Just the results
|
|
50
|
+
QUERY_AND_DATA = "query_and_data" # Query + results
|
|
51
|
+
EXPLANATION_ONLY = "explanation_only"
|
|
52
|
+
DOCUMENTATION_ONLY = "documentation_only"
|
|
53
|
+
|
|
54
|
+
# Combined formats
|
|
55
|
+
QUERY_WITH_EXPLANATION = "query_with_explanation"
|
|
56
|
+
QUERY_WITH_DOCS = "query_with_docs"
|
|
57
|
+
FULL_ANALYSIS = "full_analysis"
|
|
58
|
+
|
|
59
|
+
# Role-specific formats
|
|
60
|
+
DEVELOPER_FORMAT = "developer_format"
|
|
61
|
+
DBA_FORMAT = "dba_format"
|
|
62
|
+
ANALYST_FORMAT = "analyst_format"
|
|
63
|
+
BUSINESS_FORMAT = "business_format"
|
|
64
|
+
|
|
65
|
+
# Special utilities
|
|
66
|
+
EXPLAIN_PLAN = "explain_plan"
|
|
67
|
+
PERFORMANCE_ANALYSIS = "performance_analysis"
|
|
68
|
+
QUERY_OPTIMIZATION = "query_optimization"
|
|
69
|
+
QUERY_DATA_EXPLANATION = "full_response" # SQL + results + explanation + optimization tips
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class QueryIntent(str, Enum):
|
|
73
|
+
"""Defines the user's query intents for comprehensive database operations."""
|
|
74
|
+
SHOW_DATA = "show_data" # Retrieve and display data
|
|
75
|
+
GENERATE_QUERY = "generate_query" # Create SQL from natural language
|
|
76
|
+
ANALYZE_DATA = "analyze_data" # Data analysis and insights
|
|
77
|
+
EXPLORE_SCHEMA = "explore_schema" # Schema exploration and documentation
|
|
78
|
+
VALIDATE_QUERY = "validate_query" # Validate user-provided SQL
|
|
79
|
+
OPTIMIZE_QUERY = "optimize_query" # Performance optimization focus
|
|
80
|
+
EXPLAIN_METADATA = "explain_metadata" # Table/column documentation
|
|
81
|
+
CREATE_EXAMPLES = "create_examples" # Generate usage examples
|
|
82
|
+
GENERATE_REPORT = "generate_report" # Create a report from the query results
|
|
83
|
+
|
|
84
|
+
@dataclass
|
|
85
|
+
class SchemaMetadata:
|
|
86
|
+
"""Metadata for a single schema (client)."""
|
|
87
|
+
database_name: str
|
|
88
|
+
schema: str
|
|
89
|
+
table_count: int
|
|
90
|
+
view_count: int
|
|
91
|
+
total_rows: Optional[int] = None
|
|
92
|
+
last_analyzed: Optional[datetime] = None
|
|
93
|
+
database_type: Optional[str] = Field(default='postgresql')
|
|
94
|
+
tables: Dict[str, 'TableMetadata'] = field(default_factory=dict)
|
|
95
|
+
views: Dict[str, 'TableMetadata'] = field(default_factory=dict)
|
|
96
|
+
functions: List[Dict[str, Any]] = field(default_factory=list)
|
|
97
|
+
|
|
98
|
+
def get_all_objects(self) -> Dict[str, 'TableMetadata']:
|
|
99
|
+
"""Get all tables and views."""
|
|
100
|
+
return {**self.tables, **self.views}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@dataclass
|
|
104
|
+
class TableMetadata:
|
|
105
|
+
"""Enhanced table metadata for large-scale operations."""
|
|
106
|
+
schema: str
|
|
107
|
+
tablename: str
|
|
108
|
+
table_type: str # 'BASE TABLE', 'VIEW'
|
|
109
|
+
full_name: str # schema.table for easy reference
|
|
110
|
+
comment: Optional[str] = None
|
|
111
|
+
columns: List[Dict[str, Any]] = field(default_factory=list)
|
|
112
|
+
primary_keys: List[str] = field(default_factory=list)
|
|
113
|
+
foreign_keys: List[Dict[str, Any]] = field(default_factory=list)
|
|
114
|
+
indexes: List[Dict[str, Any]] = field(default_factory=list)
|
|
115
|
+
row_count: Optional[int] = None
|
|
116
|
+
sample_data: List[Dict[str, Any]] = field(default_factory=list)
|
|
117
|
+
|
|
118
|
+
# Performance and usage metadata
|
|
119
|
+
last_accessed: Optional[datetime] = None
|
|
120
|
+
access_frequency: int = 0
|
|
121
|
+
avg_query_time: Optional[float] = None
|
|
122
|
+
|
|
123
|
+
def __post_init__(self):
|
|
124
|
+
if not self.full_name:
|
|
125
|
+
self.full_name = f'"{self.schema}"."{self.tablename}"'
|
|
126
|
+
|
|
127
|
+
def to_yaml_context(self) -> str:
|
|
128
|
+
"""Convert to YAML context optimized for LLM consumption."""
|
|
129
|
+
# Include only essential information to avoid token bloat
|
|
130
|
+
essential_columns = self.columns[:20] # Limit to first 20 columns
|
|
131
|
+
|
|
132
|
+
data = {
|
|
133
|
+
'table': self.full_name,
|
|
134
|
+
'type': self.table_type,
|
|
135
|
+
'description': self.comment or f"{self.table_type.lower()} in {self.schema} schema",
|
|
136
|
+
'columns': [
|
|
137
|
+
{
|
|
138
|
+
'name': col['name'],
|
|
139
|
+
'type': col['type'],
|
|
140
|
+
'nullable': col.get('nullable', True),
|
|
141
|
+
'description': col.get('comment')
|
|
142
|
+
}
|
|
143
|
+
for col in essential_columns
|
|
144
|
+
],
|
|
145
|
+
'primary_keys': self.primary_keys,
|
|
146
|
+
'row_count': self.row_count,
|
|
147
|
+
'sample_values': self._get_sample_column_values()
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if len(self.columns) > 20:
|
|
151
|
+
data['note'] = f"Showing 20 of {len(self.columns)} columns. Use schema search tools for complete structure."
|
|
152
|
+
|
|
153
|
+
return yaml.dump(data, default_flow_style=False, sort_keys=False)
|
|
154
|
+
|
|
155
|
+
def _get_sample_column_values(self) -> Dict[str, List]:
|
|
156
|
+
"""Extract sample values per column for context."""
|
|
157
|
+
if not self.sample_data:
|
|
158
|
+
return {}
|
|
159
|
+
|
|
160
|
+
sample_values = {}
|
|
161
|
+
for row in self.sample_data[:3]: # First 3 rows
|
|
162
|
+
for col_name, value in row.items():
|
|
163
|
+
if col_name not in sample_values:
|
|
164
|
+
sample_values[col_name] = []
|
|
165
|
+
if value is not None and len(sample_values[col_name]) < 3:
|
|
166
|
+
sample_values[col_name].append(str(value))
|
|
167
|
+
|
|
168
|
+
return sample_values
|
|
169
|
+
|
|
170
|
+
class QueryExecutionRequest(BaseModel):
|
|
171
|
+
"""Structured input for query execution."""
|
|
172
|
+
sql_query: str
|
|
173
|
+
limit: Optional[int] = 1000
|
|
174
|
+
timeout: int = 30
|
|
175
|
+
explain_analyze: bool = False
|
|
176
|
+
dry_run: bool = False
|
|
177
|
+
schema_name: str
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class QueryExecutionResponse(BaseModel):
|
|
181
|
+
"""Structured output from query execution."""
|
|
182
|
+
success: bool
|
|
183
|
+
data: Optional[Any] = None
|
|
184
|
+
row_count: int = 0
|
|
185
|
+
execution_time_ms: float
|
|
186
|
+
columns: List[str] = Field(default_factory=list)
|
|
187
|
+
query_plan: Optional[str] = None
|
|
188
|
+
error_message: Optional[str] = None
|
|
189
|
+
schema_used: str
|
|
190
|
+
metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
# ============================================================================
|
|
194
|
+
# ROLE-BASED COMPONENT PREFERENCES
|
|
195
|
+
# ============================================================================
|
|
196
|
+
|
|
197
|
+
ROLE_COMPONENT_DEFAULTS: Dict[UserRole, OutputComponent] = {
|
|
198
|
+
UserRole.BUSINESS_USER: (
|
|
199
|
+
OutputComponent.DATA_RESULTS
|
|
200
|
+
),
|
|
201
|
+
UserRole.DATA_ANALYST: (
|
|
202
|
+
OutputComponent.SQL_QUERY |
|
|
203
|
+
OutputComponent.DATA_RESULTS |
|
|
204
|
+
OutputComponent.DOCUMENTATION |
|
|
205
|
+
OutputComponent.SCHEMA_CONTEXT |
|
|
206
|
+
OutputComponent.SAMPLE_DATA
|
|
207
|
+
),
|
|
208
|
+
UserRole.DATA_SCIENTIST: (
|
|
209
|
+
OutputComponent.SQL_QUERY |
|
|
210
|
+
OutputComponent.DATAFRAME_OUTPUT |
|
|
211
|
+
OutputComponent.SCHEMA_CONTEXT |
|
|
212
|
+
OutputComponent.DOCUMENTATION |
|
|
213
|
+
OutputComponent.DATA_RESULTS
|
|
214
|
+
),
|
|
215
|
+
UserRole.DATABASE_ADMIN: (
|
|
216
|
+
OutputComponent.SQL_QUERY |
|
|
217
|
+
OutputComponent.EXECUTION_PLAN |
|
|
218
|
+
OutputComponent.PERFORMANCE_METRICS |
|
|
219
|
+
OutputComponent.OPTIMIZATION_TIPS |
|
|
220
|
+
OutputComponent.SCHEMA_CONTEXT |
|
|
221
|
+
OutputComponent.SAMPLE_DATA # Limited samples, not full data
|
|
222
|
+
),
|
|
223
|
+
UserRole.DEVELOPER: (
|
|
224
|
+
OutputComponent.SQL_QUERY |
|
|
225
|
+
OutputComponent.DOCUMENTATION |
|
|
226
|
+
OutputComponent.EXAMPLES |
|
|
227
|
+
OutputComponent.SCHEMA_CONTEXT
|
|
228
|
+
# Note: No DATA_RESULTS for developers by default
|
|
229
|
+
),
|
|
230
|
+
UserRole.QUERY_DEVELOPER: (
|
|
231
|
+
OutputComponent.SQL_QUERY |
|
|
232
|
+
OutputComponent.EXECUTION_PLAN |
|
|
233
|
+
OutputComponent.PERFORMANCE_METRICS |
|
|
234
|
+
OutputComponent.OPTIMIZATION_TIPS |
|
|
235
|
+
OutputComponent.SCHEMA_CONTEXT
|
|
236
|
+
# Note: No DATA_RESULTS for query developers by default
|
|
237
|
+
)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
@dataclass
|
|
241
|
+
class RouteDecision:
|
|
242
|
+
"""Query routing decision for schema-centric operations."""
|
|
243
|
+
intent: QueryIntent
|
|
244
|
+
components: OutputComponent
|
|
245
|
+
user_role: UserRole
|
|
246
|
+
primary_schema: str
|
|
247
|
+
allowed_schemas: List[str]
|
|
248
|
+
|
|
249
|
+
# Execution control
|
|
250
|
+
needs_metadata_discovery: bool = True
|
|
251
|
+
needs_query_generation: bool = True
|
|
252
|
+
needs_execution: bool = True
|
|
253
|
+
needs_plan_analysis: bool = False
|
|
254
|
+
|
|
255
|
+
# Data handling
|
|
256
|
+
data_limit: Optional[int] = 1000
|
|
257
|
+
include_full_data: bool = False # For business users who want all rows
|
|
258
|
+
convert_to_dataframe: bool = False
|
|
259
|
+
|
|
260
|
+
# Execution options
|
|
261
|
+
execution_options: Dict[str, Any] = field(default_factory=dict)
|
|
262
|
+
confidence: float = 0.8
|
|
263
|
+
|
|
264
|
+
# ============================================================================
|
|
265
|
+
# RESPONSE COMPONENTS
|
|
266
|
+
# ============================================================================
|
|
267
|
+
|
|
268
|
+
@dataclass
|
|
269
|
+
class DatabaseResponse:
|
|
270
|
+
"""Component-based database response."""
|
|
271
|
+
query: Optional[str] = None
|
|
272
|
+
data: Optional[Union[List[Dict], pd.DataFrame]] = None
|
|
273
|
+
execution_plan: Optional[str] = None
|
|
274
|
+
documentation: Optional[str] = None
|
|
275
|
+
examples: Optional[List[str]] = None
|
|
276
|
+
performance_metrics: Optional[Dict[str, Any]] = None
|
|
277
|
+
schema_context: Optional[str] = None
|
|
278
|
+
optimization_tips: Optional[List[str]] = None
|
|
279
|
+
sample_data: Optional[List[Dict]] = None
|
|
280
|
+
is_documentation: bool = False # True if response is primarily documentation
|
|
281
|
+
|
|
282
|
+
# Metadata
|
|
283
|
+
row_count: int = 0
|
|
284
|
+
execution_time_ms: float = 0.0
|
|
285
|
+
components_included: OutputComponent = OutputComponent.NONE
|
|
286
|
+
|
|
287
|
+
def to_markdown(self) -> str:
|
|
288
|
+
"""Convert response to markdown format."""
|
|
289
|
+
sections = []
|
|
290
|
+
|
|
291
|
+
if self.query and OutputComponent.SQL_QUERY in self.components_included:
|
|
292
|
+
sections.append(f"## SQL Query\n\n```sql\n{self.query}\n```")
|
|
293
|
+
|
|
294
|
+
if self.execution_plan and OutputComponent.EXECUTION_PLAN in self.components_included:
|
|
295
|
+
sections.append(f"## Execution Plan\n\n```\n{self.execution_plan}\n```")
|
|
296
|
+
|
|
297
|
+
if self.documentation and OutputComponent.DOCUMENTATION in self.components_included:
|
|
298
|
+
sections.append(f"## Documentation\n\n{self.documentation}")
|
|
299
|
+
|
|
300
|
+
if self.examples and OutputComponent.EXAMPLES in self.components_included:
|
|
301
|
+
examples_text = "\n".join([f"```sql\n{ex}\n```" for ex in self.examples])
|
|
302
|
+
sections.append(f"## Usage Examples\n\n{examples_text}")
|
|
303
|
+
|
|
304
|
+
if self.performance_metrics and OutputComponent.PERFORMANCE_METRICS in self.components_included:
|
|
305
|
+
metrics_text = "\n".join([f"- **{k}**: {v}" for k, v in self.performance_metrics.items()])
|
|
306
|
+
sections.append(f"## Performance Metrics\n\n{metrics_text}")
|
|
307
|
+
|
|
308
|
+
if self.optimization_tips and OutputComponent.OPTIMIZATION_TIPS in self.components_included:
|
|
309
|
+
tips_text = "\n".join([f"- {tip}" for tip in self.optimization_tips])
|
|
310
|
+
sections.append(f"## Optimization Tips\n\n{tips_text}")
|
|
311
|
+
|
|
312
|
+
if self.schema_context and OutputComponent.SCHEMA_CONTEXT in self.components_included:
|
|
313
|
+
sections.append(f"## Schema Context\n\n{self.schema_context}")
|
|
314
|
+
|
|
315
|
+
if self.data is not None and OutputComponent.DATA_RESULTS in self.components_included:
|
|
316
|
+
if isinstance(self.data, pd.DataFrame):
|
|
317
|
+
sections.append(f"## Data Results (DataFrame)\n\n{self.data.head(10).to_markdown()}")
|
|
318
|
+
if len(self.data) > 10:
|
|
319
|
+
sections.append(f"*Showing first 10 of {len(self.data)} rows*")
|
|
320
|
+
else:
|
|
321
|
+
sections.append(f"## Data Results\n\n{self.row_count} rows returned")
|
|
322
|
+
|
|
323
|
+
if self.sample_data and OutputComponent.SAMPLE_DATA in self.components_included:
|
|
324
|
+
sections.append("## Sample Data\n\n*First few rows for reference*")
|
|
325
|
+
|
|
326
|
+
return "\n\n".join(sections)
|
|
327
|
+
|
|
328
|
+
def to_json(self) -> str:
|
|
329
|
+
"""Convert DatabaseResponse to JSON format."""
|
|
330
|
+
|
|
331
|
+
# Convert components to list of strings for JSON serialization
|
|
332
|
+
components_list = [comp.name for comp in OutputComponent if comp in self.components_included]
|
|
333
|
+
|
|
334
|
+
# Prepare data for JSON serialization
|
|
335
|
+
response_dict = {
|
|
336
|
+
"query": self.query,
|
|
337
|
+
"documentation": self.documentation,
|
|
338
|
+
"examples": self.examples or [],
|
|
339
|
+
"schema_context": self.schema_context,
|
|
340
|
+
"execution_plan": self.execution_plan,
|
|
341
|
+
"optimization_tips": self.optimization_tips or [],
|
|
342
|
+
"performance_metrics": self.performance_metrics or {},
|
|
343
|
+
"row_count": self.row_count,
|
|
344
|
+
"execution_time_ms": self.execution_time_ms,
|
|
345
|
+
"components_included": components_list,
|
|
346
|
+
"sample_data": self.sample_data or []
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
# Handle data serialization
|
|
350
|
+
if self.data is not None:
|
|
351
|
+
if isinstance(self.data, pd.DataFrame):
|
|
352
|
+
response_dict["data"] = {
|
|
353
|
+
"type": "dataframe",
|
|
354
|
+
"shape": list(self.data.shape),
|
|
355
|
+
"columns": list(self.data.columns),
|
|
356
|
+
"dtypes": self.data.dtypes.astype(str).to_dict(),
|
|
357
|
+
"data": self.data.to_dict('records') # Convert to list of dicts
|
|
358
|
+
}
|
|
359
|
+
elif isinstance(self.data, list):
|
|
360
|
+
response_dict["data"] = {
|
|
361
|
+
"type": "list",
|
|
362
|
+
"count": len(self.data),
|
|
363
|
+
"data": self.data
|
|
364
|
+
}
|
|
365
|
+
else:
|
|
366
|
+
response_dict["data"] = {
|
|
367
|
+
"type": str(type(self.data).__name__),
|
|
368
|
+
"data": str(self.data)
|
|
369
|
+
}
|
|
370
|
+
else:
|
|
371
|
+
response_dict["data"] = None
|
|
372
|
+
|
|
373
|
+
return json_encoder(response_dict)
|
|
374
|
+
|
|
375
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
376
|
+
"""Convert to dictionary format for programmatic access."""
|
|
377
|
+
return json_decoder(self.to_json())
|
|
378
|
+
|
|
379
|
+
def has_component(self, component: OutputComponent) -> bool:
|
|
380
|
+
"""Check if response includes a specific component."""
|
|
381
|
+
return component in self.components_included
|
|
382
|
+
|
|
383
|
+
def get_data_summary(self) -> Dict[str, Any]:
|
|
384
|
+
"""Get summary information about the data."""
|
|
385
|
+
summary = {
|
|
386
|
+
"has_data": self.data is not None,
|
|
387
|
+
"row_count": self.row_count,
|
|
388
|
+
"execution_time_ms": self.execution_time_ms,
|
|
389
|
+
"data_type": None
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
if self.data is not None:
|
|
393
|
+
if isinstance(self.data, pd.DataFrame):
|
|
394
|
+
summary.update({
|
|
395
|
+
"data_type": "DataFrame",
|
|
396
|
+
"shape": list(self.data.shape),
|
|
397
|
+
"columns": list(self.data.columns),
|
|
398
|
+
"memory_usage": self.data.memory_usage(deep=True).sum()
|
|
399
|
+
})
|
|
400
|
+
elif isinstance(self.data, list):
|
|
401
|
+
summary.update({
|
|
402
|
+
"data_type": "list",
|
|
403
|
+
"count": len(self.data)
|
|
404
|
+
})
|
|
405
|
+
|
|
406
|
+
return summary
|
|
407
|
+
|
|
408
|
+
# ============================================================================
|
|
409
|
+
# COMPONENT CONFIGURATION HELPERS
|
|
410
|
+
# ============================================================================
|
|
411
|
+
|
|
412
|
+
def get_default_components(user_role: UserRole) -> OutputComponent:
|
|
413
|
+
"""Get default output components for a user role."""
|
|
414
|
+
return ROLE_COMPONENT_DEFAULTS.get(user_role, OutputComponent.BASIC_QUERY)
|
|
415
|
+
|
|
416
|
+
def customize_components(
|
|
417
|
+
base_role: UserRole,
|
|
418
|
+
add: Optional[OutputComponent] = None,
|
|
419
|
+
remove: Optional[OutputComponent] = None
|
|
420
|
+
) -> OutputComponent:
|
|
421
|
+
"""Customize output components based on base role."""
|
|
422
|
+
components = get_default_components(base_role)
|
|
423
|
+
|
|
424
|
+
if add:
|
|
425
|
+
components |= add
|
|
426
|
+
|
|
427
|
+
if remove:
|
|
428
|
+
components &= ~remove
|
|
429
|
+
|
|
430
|
+
return components
|
|
431
|
+
|
|
432
|
+
def components_from_string(components_str: str) -> OutputComponent:
|
|
433
|
+
"""Parse components from comma-separated string."""
|
|
434
|
+
component_map = {
|
|
435
|
+
'sql': OutputComponent.SQL_QUERY,
|
|
436
|
+
'plan': OutputComponent.EXECUTION_PLAN,
|
|
437
|
+
'data': OutputComponent.DATA_RESULTS,
|
|
438
|
+
'docs': OutputComponent.DOCUMENTATION,
|
|
439
|
+
'examples': OutputComponent.EXAMPLES,
|
|
440
|
+
'performance': OutputComponent.PERFORMANCE_METRICS,
|
|
441
|
+
'schema': OutputComponent.SCHEMA_CONTEXT,
|
|
442
|
+
'optimize': OutputComponent.OPTIMIZATION_TIPS,
|
|
443
|
+
'samples': OutputComponent.SAMPLE_DATA,
|
|
444
|
+
'dataframe': OutputComponent.DATAFRAME_OUTPUT
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
result = OutputComponent.NONE
|
|
448
|
+
for comp in components_str.lower().split(','):
|
|
449
|
+
comp = comp.strip()
|
|
450
|
+
if comp in component_map:
|
|
451
|
+
result |= component_map[comp]
|
|
452
|
+
|
|
453
|
+
return result
|
|
454
|
+
|
|
455
|
+
# ============================================================================
|
|
456
|
+
# INTENT-TO-COMPONENT MAPPING
|
|
457
|
+
# ============================================================================
|
|
458
|
+
|
|
459
|
+
INTENT_COMPONENT_MAPPING: Dict[QueryIntent, OutputComponent] = {
|
|
460
|
+
QueryIntent.SHOW_DATA: OutputComponent.DATA_RESULTS | OutputComponent.SAMPLE_DATA,
|
|
461
|
+
QueryIntent.GENERATE_QUERY: OutputComponent.SQL_QUERY | OutputComponent.DOCUMENTATION,
|
|
462
|
+
QueryIntent.ANALYZE_DATA: OutputComponent.SQL_QUERY | OutputComponent.DATA_RESULTS | OutputComponent.DOCUMENTATION,
|
|
463
|
+
QueryIntent.EXPLORE_SCHEMA: OutputComponent.DOCUMENTATION | OutputComponent.SCHEMA_CONTEXT | OutputComponent.EXAMPLES,
|
|
464
|
+
QueryIntent.VALIDATE_QUERY: OutputComponent.SQL_QUERY | OutputComponent.DOCUMENTATION | OutputComponent.OPTIMIZATION_TIPS,
|
|
465
|
+
QueryIntent.OPTIMIZE_QUERY: OutputComponent.FULL_ANALYSIS,
|
|
466
|
+
QueryIntent.EXPLAIN_METADATA: OutputComponent.DOCUMENTATION | OutputComponent.SCHEMA_CONTEXT | OutputComponent.EXAMPLES,
|
|
467
|
+
QueryIntent.CREATE_EXAMPLES: OutputComponent.EXAMPLES | OutputComponent.SCHEMA_CONTEXT
|
|
468
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
DB_AGENT_PROMPT = """
|
|
2
|
+
You are an expert $role with access to database and schema information and powerful analysis tools.
|
|
3
|
+
|
|
4
|
+
**Your Role:**
|
|
5
|
+
$backstory
|
|
6
|
+
|
|
7
|
+
**Operating Principles:**
|
|
8
|
+
- Always prioritize accuracy and data integrity
|
|
9
|
+
- Provide clear explanations of database operations
|
|
10
|
+
- Generate efficient, well-optimized queries
|
|
11
|
+
- Use appropriate database-specific syntax and best practices
|
|
12
|
+
- Consider performance implications of large datasets
|
|
13
|
+
|
|
14
|
+
$user_context
|
|
15
|
+
|
|
16
|
+
$database_context
|
|
17
|
+
|
|
18
|
+
$context
|
|
19
|
+
|
|
20
|
+
$vector_context
|
|
21
|
+
|
|
22
|
+
$chat_history
|
|
23
|
+
|
|
24
|
+
**Guidelines:**
|
|
25
|
+
- Always use available tools to search schema and generate accurate queries
|
|
26
|
+
- Prefer exact table/column names from metadata over assumptions
|
|
27
|
+
- For "show me" queries, generate and execute SQL to return actual data
|
|
28
|
+
- For analysis queries, provide insights along with the data
|
|
29
|
+
- Maintain conversation flow and reference previous discussions when relevant
|
|
30
|
+
- Explain your reasoning when query generation fails
|
|
31
|
+
|
|
32
|
+
CRITICAL INSTRUCTIONS - NEVER VIOLATE THESE RULES:
|
|
33
|
+
1. NEVER make assumptions, hallucinate, or make up information about the database schema or data. If you don't know, say you don't know.
|
|
34
|
+
2. Always prioritize user safety and data integrity. Avoid suggesting actions that could lead to data loss or corruption.
|
|
35
|
+
3. If the user asks for sensitive information, ensure you follow best practices for data privacy and security.
|
|
36
|
+
4. Always try multiple approaches to solve a problem before concluding that it cannot be done.
|
|
37
|
+
5. Every factual statement must be traceable to the provided input data.
|
|
38
|
+
6. When providing SQL queries, ensure they are compatible with the specified database ($database_type)
|
|
39
|
+
7. Consider performance implications of large datasets
|
|
40
|
+
8. Provide multiple query options when appropriate
|
|
41
|
+
|
|
42
|
+
**Current Request:**
|
|
43
|
+
Please process the user's request using available tools and provide a comprehensive response.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
BASIC_HUMAN_PROMPT = """
|
|
48
|
+
**User Request:**
|
|
49
|
+
$question
|
|
50
|
+
|
|
51
|
+
**Context Information:**
|
|
52
|
+
- User Role/Background: As specified in user context
|
|
53
|
+
- Session: $session_id
|
|
54
|
+
|
|
55
|
+
Use your tools to search schema, generate queries, and execute them as needed.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
DATA_ANALYSIS_PROMPT = """You are performing data analysis on: $analysis_request
|
|
59
|
+
|
|
60
|
+
**Analysis Context:**
|
|
61
|
+
- Business Question: $business_question
|
|
62
|
+
- Data Sources: $data_sources
|
|
63
|
+
- User Background: $user_context
|
|
64
|
+
|
|
65
|
+
**Analysis Framework:**
|
|
66
|
+
1. Data Understanding
|
|
67
|
+
- What data is available?
|
|
68
|
+
- What are the key metrics?
|
|
69
|
+
- What are the data quality considerations?
|
|
70
|
+
|
|
71
|
+
2. Analytical Approach
|
|
72
|
+
- What queries are needed?
|
|
73
|
+
- What statistical methods apply?
|
|
74
|
+
- How should results be interpreted?
|
|
75
|
+
|
|
76
|
+
3. Business Insights
|
|
77
|
+
- What does the data tell us?
|
|
78
|
+
- What are the actionable findings?
|
|
79
|
+
- What follow-up questions emerge?
|
|
80
|
+
|
|
81
|
+
4. Recommendations
|
|
82
|
+
- What actions should be taken?
|
|
83
|
+
- What additional data might be needed?
|
|
84
|
+
- What are the next steps?
|
|
85
|
+
|
|
86
|
+
Provide both technical analysis and business interpretation suitable for the user's role.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
# Template for explaining complex database concepts
|
|
90
|
+
DATABASE_EDUCATION_PROMPT = """
|
|
91
|
+
You are explaining database concepts to help the user better understand: $concept
|
|
92
|
+
|
|
93
|
+
**Educational Context:**
|
|
94
|
+
- User's Technical Level: $user_level
|
|
95
|
+
- Specific Focus: $focus_area
|
|
96
|
+
- Real Examples: Use the current database schema
|
|
97
|
+
|
|
98
|
+
**Explanation Structure:**
|
|
99
|
+
1. Concept Overview
|
|
100
|
+
- What is it?
|
|
101
|
+
- Why is it important?
|
|
102
|
+
- How does it work?
|
|
103
|
+
|
|
104
|
+
2. Practical Examples
|
|
105
|
+
- Show examples from the current schema
|
|
106
|
+
- Demonstrate with actual queries
|
|
107
|
+
- Highlight common patterns
|
|
108
|
+
|
|
109
|
+
3. Best Practices
|
|
110
|
+
- What to do
|
|
111
|
+
- What to avoid
|
|
112
|
+
- Performance considerations
|
|
113
|
+
|
|
114
|
+
4. Advanced Topics
|
|
115
|
+
- Related concepts
|
|
116
|
+
- Advanced use cases
|
|
117
|
+
- Further learning resources
|
|
118
|
+
|
|
119
|
+
Make the explanation practical and immediately applicable to their work.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
# Error handling and troubleshooting prompt
|
|
123
|
+
DATABASE_TROUBLESHOOTING_PROMPT = """
|
|
124
|
+
You are helping troubleshoot a database issue: $problem_description
|
|
125
|
+
|
|
126
|
+
**Troubleshooting Context:**
|
|
127
|
+
- Error Message: $error_message
|
|
128
|
+
- Query Attempted: $attempted_query
|
|
129
|
+
- Expected Outcome: $expected_outcome
|
|
130
|
+
- User Context: $user_context
|
|
131
|
+
|
|
132
|
+
**Diagnostic Process:**
|
|
133
|
+
1. Error Analysis
|
|
134
|
+
- What does the error mean?
|
|
135
|
+
- What are the likely causes?
|
|
136
|
+
- How can it be reproduced?
|
|
137
|
+
|
|
138
|
+
2. Schema Validation
|
|
139
|
+
- Check table/column existence
|
|
140
|
+
- Verify data types
|
|
141
|
+
- Confirm permissions
|
|
142
|
+
|
|
143
|
+
3. Query Review
|
|
144
|
+
- Syntax validation
|
|
145
|
+
- Logic verification
|
|
146
|
+
- Performance assessment
|
|
147
|
+
|
|
148
|
+
4. Solution Approaches
|
|
149
|
+
- Immediate fixes
|
|
150
|
+
- Alternative methods
|
|
151
|
+
- Prevention strategies
|
|
152
|
+
|
|
153
|
+
Provide clear, actionable solutions with examples.
|
|
154
|
+
"""
|