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,209 @@
|
|
|
1
|
+
|
|
2
|
+
from typing import List, Dict, Any, Optional
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from datamodel.parsers.json import JSONContent # pylint: disable=E0611 # noqa
|
|
7
|
+
from navconfig.logging import logging
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class ConversationTurn:
|
|
12
|
+
"""Represents a single turn in a conversation."""
|
|
13
|
+
turn_id: str
|
|
14
|
+
user_id: str
|
|
15
|
+
user_message: str
|
|
16
|
+
assistant_response: str
|
|
17
|
+
context_used: Optional[str] = None
|
|
18
|
+
tools_used: List[str] = field(default_factory=list)
|
|
19
|
+
timestamp: datetime = field(default_factory=datetime.now)
|
|
20
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
21
|
+
|
|
22
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
23
|
+
"""Serialize turn to dictionary."""
|
|
24
|
+
return {
|
|
25
|
+
'turn_id': self.turn_id,
|
|
26
|
+
'user_id': self.user_id,
|
|
27
|
+
'user_message': self.user_message,
|
|
28
|
+
'assistant_response': self.assistant_response,
|
|
29
|
+
'context_used': self.context_used,
|
|
30
|
+
'tools_used': self.tools_used,
|
|
31
|
+
'timestamp': self.timestamp.isoformat(),
|
|
32
|
+
'metadata': self.metadata
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def from_dict(cls, data: Dict[str, Any]) -> 'ConversationTurn':
|
|
37
|
+
"""Deserialize turn from dictionary."""
|
|
38
|
+
return cls(
|
|
39
|
+
turn_id=data['turn_id'],
|
|
40
|
+
user_id=data['user_id'],
|
|
41
|
+
user_message=data['user_message'],
|
|
42
|
+
assistant_response=data['assistant_response'],
|
|
43
|
+
context_used=data.get('context_used'),
|
|
44
|
+
tools_used=data.get('tools_used', []),
|
|
45
|
+
timestamp=datetime.fromisoformat(data['timestamp']),
|
|
46
|
+
metadata=data.get('metadata', {})
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass
|
|
51
|
+
class ConversationHistory:
|
|
52
|
+
"""Manages conversation history for a session - replaces ConversationSession."""
|
|
53
|
+
session_id: str
|
|
54
|
+
user_id: str
|
|
55
|
+
chatbot_id: Optional[str] = None
|
|
56
|
+
turns: List[ConversationTurn] = field(default_factory=list)
|
|
57
|
+
created_at: datetime = field(default_factory=datetime.now)
|
|
58
|
+
updated_at: datetime = field(default_factory=datetime.now)
|
|
59
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
60
|
+
|
|
61
|
+
def add_turn(self, turn: ConversationTurn) -> None:
|
|
62
|
+
"""Add a new turn to the conversation history."""
|
|
63
|
+
self.turns.append(turn)
|
|
64
|
+
self.updated_at = datetime.now()
|
|
65
|
+
|
|
66
|
+
def get_recent_turns(self, count: int = 5) -> List[ConversationTurn]:
|
|
67
|
+
"""Get the most recent turns for context."""
|
|
68
|
+
return self.turns[-count:] if count > 0 else self.turns
|
|
69
|
+
|
|
70
|
+
def get_messages_for_api(self, model: str = 'claude') -> List[Dict[str, Any]]:
|
|
71
|
+
"""Convert turns to API message format for LLM Model."""
|
|
72
|
+
messages = []
|
|
73
|
+
if model == 'claude':
|
|
74
|
+
# Claude expects messages in a specific format
|
|
75
|
+
for turn in self.turns:
|
|
76
|
+
messages.append({
|
|
77
|
+
"role": "user",
|
|
78
|
+
"content": turn.user_message
|
|
79
|
+
})
|
|
80
|
+
messages.append({
|
|
81
|
+
"role": "assistant",
|
|
82
|
+
"content": turn.assistant_response
|
|
83
|
+
})
|
|
84
|
+
else:
|
|
85
|
+
# Default format for other models
|
|
86
|
+
# This can be adjusted based on the specific model requirements
|
|
87
|
+
for turn in self.turns:
|
|
88
|
+
# Add user message
|
|
89
|
+
messages.append({
|
|
90
|
+
"role": "user",
|
|
91
|
+
"content": [{"type": "text", "text": turn.user_message}]
|
|
92
|
+
})
|
|
93
|
+
# Add assistant response
|
|
94
|
+
messages.append({
|
|
95
|
+
"role": "assistant",
|
|
96
|
+
"content": [{"type": "text", "text": turn.assistant_response}]
|
|
97
|
+
})
|
|
98
|
+
return messages
|
|
99
|
+
|
|
100
|
+
def clear_turns(self) -> None:
|
|
101
|
+
"""Clear all turns from the conversation history."""
|
|
102
|
+
self.turns.clear()
|
|
103
|
+
self.updated_at = datetime.now()
|
|
104
|
+
|
|
105
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
106
|
+
"""Serialize conversation history to dictionary."""
|
|
107
|
+
return {
|
|
108
|
+
'session_id': self.session_id,
|
|
109
|
+
'user_id': self.user_id,
|
|
110
|
+
'chatbot_id': self.chatbot_id,
|
|
111
|
+
'turns': [turn.to_dict() for turn in self.turns],
|
|
112
|
+
'created_at': self.created_at.isoformat(),
|
|
113
|
+
'updated_at': self.updated_at.isoformat(),
|
|
114
|
+
'metadata': self.metadata
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def from_dict(cls, data: Dict[str, Any]) -> 'ConversationHistory':
|
|
119
|
+
"""Deserialize conversation history from dictionary."""
|
|
120
|
+
history = cls(
|
|
121
|
+
session_id=data['session_id'],
|
|
122
|
+
user_id=data['user_id'],
|
|
123
|
+
chatbot_id=data.get('chatbot_id'),
|
|
124
|
+
created_at=datetime.fromisoformat(data['created_at']),
|
|
125
|
+
updated_at=datetime.fromisoformat(data['updated_at']),
|
|
126
|
+
metadata=data.get('metadata', {})
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
for turn_data in data.get('turns', []):
|
|
130
|
+
turn = ConversationTurn.from_dict(turn_data)
|
|
131
|
+
history.turns.append(turn)
|
|
132
|
+
|
|
133
|
+
return history
|
|
134
|
+
|
|
135
|
+
class ConversationMemory(ABC):
|
|
136
|
+
"""Abstract base class for conversation memory storage."""
|
|
137
|
+
|
|
138
|
+
def __init__(self, debug: bool = False):
|
|
139
|
+
self.logger = logging.getLogger(
|
|
140
|
+
f"parrot.Memory.{self.__class__.__name__}"
|
|
141
|
+
)
|
|
142
|
+
self._json = JSONContent()
|
|
143
|
+
self.debug = debug
|
|
144
|
+
|
|
145
|
+
@abstractmethod
|
|
146
|
+
async def create_history(
|
|
147
|
+
self,
|
|
148
|
+
user_id: str,
|
|
149
|
+
session_id: str,
|
|
150
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
151
|
+
chatbot_id: Optional[str] = None
|
|
152
|
+
) -> ConversationHistory:
|
|
153
|
+
"""Create a new conversation history."""
|
|
154
|
+
pass
|
|
155
|
+
|
|
156
|
+
@abstractmethod
|
|
157
|
+
async def get_history(
|
|
158
|
+
self,
|
|
159
|
+
user_id: str,
|
|
160
|
+
session_id: str,
|
|
161
|
+
chatbot_id: Optional[str] = None
|
|
162
|
+
) -> Optional[ConversationHistory]:
|
|
163
|
+
"""Get a conversation history."""
|
|
164
|
+
pass
|
|
165
|
+
|
|
166
|
+
@abstractmethod
|
|
167
|
+
async def update_history(self, history: ConversationHistory) -> None:
|
|
168
|
+
"""Update a conversation history."""
|
|
169
|
+
pass
|
|
170
|
+
|
|
171
|
+
@abstractmethod
|
|
172
|
+
async def add_turn(
|
|
173
|
+
self,
|
|
174
|
+
user_id: str,
|
|
175
|
+
session_id: str,
|
|
176
|
+
turn: ConversationTurn,
|
|
177
|
+
chatbot_id: Optional[str] = None
|
|
178
|
+
) -> None:
|
|
179
|
+
"""Add a turn to the conversation."""
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
@abstractmethod
|
|
183
|
+
async def clear_history(
|
|
184
|
+
self,
|
|
185
|
+
user_id: str,
|
|
186
|
+
session_id: str,
|
|
187
|
+
chatbot_id: Optional[str] = None
|
|
188
|
+
) -> None:
|
|
189
|
+
"""Clear a conversation history."""
|
|
190
|
+
pass
|
|
191
|
+
|
|
192
|
+
@abstractmethod
|
|
193
|
+
async def list_sessions(
|
|
194
|
+
self,
|
|
195
|
+
user_id: str,
|
|
196
|
+
chatbot_id: Optional[str] = None
|
|
197
|
+
) -> List[str]:
|
|
198
|
+
"""List all session IDs for a user."""
|
|
199
|
+
pass
|
|
200
|
+
|
|
201
|
+
@abstractmethod
|
|
202
|
+
async def delete_history(
|
|
203
|
+
self,
|
|
204
|
+
user_id: str,
|
|
205
|
+
session_id: str,
|
|
206
|
+
chatbot_id: Optional[str] = None
|
|
207
|
+
) -> bool:
|
|
208
|
+
"""Delete a conversation history entirely."""
|
|
209
|
+
pass
|
parrot/memory/agent.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Simple in-memory storage for agent interactions keyed by turn_id."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from typing import Any, Dict, Optional
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AgentMemory:
|
|
8
|
+
"""Store and retrieve agent interactions by turn identifier."""
|
|
9
|
+
|
|
10
|
+
def __init__(self, agent_id: str) -> None:
|
|
11
|
+
self.agent_id = agent_id
|
|
12
|
+
self._interactions: Dict[str, Dict[str, Any]] = {self.agent_id: {}}
|
|
13
|
+
self._lock = asyncio.Lock()
|
|
14
|
+
|
|
15
|
+
async def store_interaction(self, turn_id: str, question: str, answer: Any) -> None:
|
|
16
|
+
"""Persist a question/answer pair under the provided turn identifier."""
|
|
17
|
+
if not turn_id:
|
|
18
|
+
raise ValueError("turn_id is required to store an interaction")
|
|
19
|
+
|
|
20
|
+
async with self._lock:
|
|
21
|
+
self._interactions[self.agent_id][turn_id] = {
|
|
22
|
+
"question": question,
|
|
23
|
+
"answer": answer,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async def get(self, turn_id: str) -> Optional[Dict[str, Any]]:
|
|
27
|
+
"""Retrieve a stored interaction by turn identifier."""
|
|
28
|
+
if not turn_id:
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
async with self._lock:
|
|
32
|
+
return self._interactions.get(self.agent_id, {}).get(turn_id)
|
parrot/memory/cache.py
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
from typing import Any, Optional, Callable, TypeVar, ParamSpec
|
|
2
|
+
from functools import wraps
|
|
3
|
+
from abc import ABC
|
|
4
|
+
import asyncio
|
|
5
|
+
import hashlib
|
|
6
|
+
import inspect
|
|
7
|
+
import redis.asyncio as aioredis
|
|
8
|
+
from datamodel.parsers.json import json_encoder, json_decoder # pylint: disable=E0611 # noqa
|
|
9
|
+
from ..conf import REDIS_URL
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
P = ParamSpec('P')
|
|
13
|
+
T = TypeVar('T')
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CacheMixin(ABC):
|
|
17
|
+
"""Mixin to add caching capabilities using Redis."""
|
|
18
|
+
|
|
19
|
+
def __init__(self, redis_url: str = None, **kwargs):
|
|
20
|
+
# Redis connection for caching
|
|
21
|
+
self.redis = aioredis.from_url(
|
|
22
|
+
redis_url or REDIS_URL,
|
|
23
|
+
encoding="utf-8",
|
|
24
|
+
decode_responses=True
|
|
25
|
+
)
|
|
26
|
+
self.default_ttl = kwargs.get('default_ttl', 3600)
|
|
27
|
+
self.key_prefix = "hierarchy:"
|
|
28
|
+
|
|
29
|
+
def _generate_cache_key(self, query_type: str, **params) -> str:
|
|
30
|
+
"""
|
|
31
|
+
Generate a unique cache key based on the query type and parameters.
|
|
32
|
+
"""
|
|
33
|
+
# Ordenar params para consistencia
|
|
34
|
+
sorted_params = json_encoder(params)
|
|
35
|
+
param_hash = hashlib.md5(sorted_params.encode()).hexdigest()
|
|
36
|
+
return f"{self.key_prefix}{query_type}:{param_hash}"
|
|
37
|
+
|
|
38
|
+
async def get(self, query_type: str, **params) -> Optional[Any]:
|
|
39
|
+
"""
|
|
40
|
+
Get a cached value from Redis based on the query type and parameters.
|
|
41
|
+
"""
|
|
42
|
+
key = self._generate_cache_key(query_type, **params)
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
return json_decoder(cached) if (cached := await self.redis.get(key)) else None
|
|
46
|
+
except Exception as e:
|
|
47
|
+
print(f"Cache error (get): {e}")
|
|
48
|
+
return None
|
|
49
|
+
|
|
50
|
+
async def set(
|
|
51
|
+
self,
|
|
52
|
+
query_type: str,
|
|
53
|
+
value: Any,
|
|
54
|
+
ttl: Optional[int] = None,
|
|
55
|
+
**params
|
|
56
|
+
):
|
|
57
|
+
"""
|
|
58
|
+
Save result to cache with TTL (async).
|
|
59
|
+
"""
|
|
60
|
+
key = self._generate_cache_key(query_type, **params)
|
|
61
|
+
ttl = ttl or self.default_ttl
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
await self.redis.setex(
|
|
65
|
+
key,
|
|
66
|
+
ttl,
|
|
67
|
+
json_encoder(value)
|
|
68
|
+
)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
print(f"Cache error (set): {e}")
|
|
71
|
+
|
|
72
|
+
async def invalidate_cache(self, object_oid: str):
|
|
73
|
+
"""
|
|
74
|
+
Invalidate cache related to an object (async).
|
|
75
|
+
"""
|
|
76
|
+
pattern = f"{self.key_prefix}*{object_oid}*"
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
# Use scan_iter to avoid blocking
|
|
80
|
+
keys = []
|
|
81
|
+
async for key in self.redis.scan_iter(match=pattern):
|
|
82
|
+
keys.append(key)
|
|
83
|
+
|
|
84
|
+
if keys:
|
|
85
|
+
await self.redis.delete(*keys)
|
|
86
|
+
print(
|
|
87
|
+
f"Invalidated {len(keys)} keys for {object_oid}"
|
|
88
|
+
)
|
|
89
|
+
except Exception as e:
|
|
90
|
+
print(f"Cache error (invalidate): {e}")
|
|
91
|
+
|
|
92
|
+
async def clear_all(self):
|
|
93
|
+
"""Clear all hierarchy cache (async)."""
|
|
94
|
+
pattern = f"{self.key_prefix}*"
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
keys = []
|
|
98
|
+
async for key in self.redis.scan_iter(match=pattern):
|
|
99
|
+
keys.append(key)
|
|
100
|
+
|
|
101
|
+
if keys:
|
|
102
|
+
await self.redis.delete(*keys)
|
|
103
|
+
print(f"Cleared {len(keys)} cache keys")
|
|
104
|
+
except Exception as e:
|
|
105
|
+
print(f"Cache error (clear): {e}")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def cached_query(
|
|
109
|
+
query_type: str,
|
|
110
|
+
ttl: Optional[int] = None
|
|
111
|
+
) -> Callable[[Callable[P, asyncio.Future[T]]], Callable[P, asyncio.Future[T]]]:
|
|
112
|
+
"""
|
|
113
|
+
Decorator to cache the result of async methods in classes
|
|
114
|
+
that inherit from CacheMixin.
|
|
115
|
+
|
|
116
|
+
Usage:
|
|
117
|
+
```python
|
|
118
|
+
@cached_query("get_superiors", ttl=600)
|
|
119
|
+
def get_all_superiors(self, employee_oid: str):
|
|
120
|
+
...
|
|
121
|
+
```
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
def decorator(
|
|
125
|
+
func: Callable[P, asyncio.Future[T]]
|
|
126
|
+
) -> Callable[P, asyncio.Future[T]]:
|
|
127
|
+
@wraps(func)
|
|
128
|
+
async def wrapper(
|
|
129
|
+
self: CacheMixin,
|
|
130
|
+
*args: P.args,
|
|
131
|
+
**kwargs: P.kwargs
|
|
132
|
+
) -> T:
|
|
133
|
+
|
|
134
|
+
# Build cache parameters
|
|
135
|
+
sig = inspect.signature(func)
|
|
136
|
+
param_names = list(sig.parameters.keys())[1:] # Skip 'self'
|
|
137
|
+
|
|
138
|
+
cache_params = kwargs.copy()
|
|
139
|
+
for i, arg in enumerate(args):
|
|
140
|
+
if i < len(param_names):
|
|
141
|
+
cache_params[param_names[i]] = arg # ✅ Mapping arg → param name
|
|
142
|
+
|
|
143
|
+
# Attempt to get from cache
|
|
144
|
+
cached_result = await self.get(
|
|
145
|
+
query_type,
|
|
146
|
+
**cache_params
|
|
147
|
+
)
|
|
148
|
+
if cached_result is not None:
|
|
149
|
+
return cached_result
|
|
150
|
+
|
|
151
|
+
# Call the original function
|
|
152
|
+
if asyncio.iscoroutinefunction(func):
|
|
153
|
+
result = await func(self, *args, **kwargs)
|
|
154
|
+
else:
|
|
155
|
+
# executing sync method in thread pool
|
|
156
|
+
loop = asyncio.get_running_loop()
|
|
157
|
+
result = await loop.run_in_executor(
|
|
158
|
+
None, lambda: func(self, *args, **kwargs)
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Save to cache, fire and forget:
|
|
162
|
+
asyncio.create_task(
|
|
163
|
+
self.set(
|
|
164
|
+
query_type,
|
|
165
|
+
result,
|
|
166
|
+
ttl,
|
|
167
|
+
**cache_params
|
|
168
|
+
)
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
return result
|
|
172
|
+
|
|
173
|
+
return wrapper
|
|
174
|
+
|
|
175
|
+
return decorator
|