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,497 @@
|
|
|
1
|
+
"""
|
|
2
|
+
OneDrive Tools for AI-Parrot.
|
|
3
|
+
|
|
4
|
+
Tools for interacting with OneDrive:
|
|
5
|
+
- List files in folders
|
|
6
|
+
- Search for files
|
|
7
|
+
- Download files
|
|
8
|
+
- Upload files
|
|
9
|
+
"""
|
|
10
|
+
from typing import Dict, Any, Optional, List, Type
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
import shutil
|
|
13
|
+
from pydantic import BaseModel, Field
|
|
14
|
+
from .base import O365Tool, O365ToolArgsSchema
|
|
15
|
+
from ...interfaces.onedrive import OneDriveClient
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ============================================================================
|
|
19
|
+
# LIST ONEDRIVE FILES TOOL
|
|
20
|
+
# ============================================================================
|
|
21
|
+
|
|
22
|
+
class ListOneDriveFilesArgs(O365ToolArgsSchema):
|
|
23
|
+
"""Arguments for listing OneDrive files."""
|
|
24
|
+
folder_path: Optional[str] = Field(
|
|
25
|
+
default="",
|
|
26
|
+
description="Folder path in OneDrive (e.g., 'Documents/Projects'). Empty for root."
|
|
27
|
+
)
|
|
28
|
+
recursive: bool = Field(
|
|
29
|
+
default=False,
|
|
30
|
+
description="Whether to list files recursively in subfolders"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ListOneDriveFilesTool(O365Tool):
|
|
35
|
+
"""
|
|
36
|
+
Tool for listing files in OneDrive.
|
|
37
|
+
|
|
38
|
+
This tool lists all files in a specified OneDrive location, with options
|
|
39
|
+
for recursive listing and filtering.
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
# List files in root
|
|
43
|
+
result = await tool.run()
|
|
44
|
+
|
|
45
|
+
# List files in specific folder
|
|
46
|
+
result = await tool.run(
|
|
47
|
+
folder_path="Documents/Projects"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# Recursive listing
|
|
51
|
+
result = await tool.run(
|
|
52
|
+
folder_path="Work",
|
|
53
|
+
recursive=True
|
|
54
|
+
)
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
name: str = "list_onedrive_files"
|
|
58
|
+
description: str = (
|
|
59
|
+
"List files in OneDrive folder. "
|
|
60
|
+
"Returns file names, paths, sizes, and modification dates."
|
|
61
|
+
)
|
|
62
|
+
args_schema: Type[BaseModel] = ListOneDriveFilesArgs
|
|
63
|
+
|
|
64
|
+
async def _execute_graph_operation(
|
|
65
|
+
self,
|
|
66
|
+
client: OneDriveClient,
|
|
67
|
+
**kwargs
|
|
68
|
+
) -> Dict[str, Any]:
|
|
69
|
+
"""
|
|
70
|
+
List OneDrive files using the OneDriveClient.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
client: Authenticated OneDriveClient instance
|
|
74
|
+
**kwargs: Tool parameters
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Dict with file listing
|
|
78
|
+
"""
|
|
79
|
+
folder_path = kwargs.get('folder_path', '')
|
|
80
|
+
recursive = kwargs.get('recursive', False)
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
self.logger.info(f"Listing OneDrive files in: {folder_path or 'root'}")
|
|
84
|
+
|
|
85
|
+
# Verify access
|
|
86
|
+
await client.verify_onedrive_access()
|
|
87
|
+
|
|
88
|
+
if recursive:
|
|
89
|
+
# Recursive listing
|
|
90
|
+
files = await self._list_recursive(client, folder_path)
|
|
91
|
+
else:
|
|
92
|
+
# Single level listing using the client's file_list method
|
|
93
|
+
files = await client.file_list(folder_path)
|
|
94
|
+
|
|
95
|
+
self.logger.info(f"Found {len(files)} items")
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
"folder_path": folder_path or "root",
|
|
99
|
+
"total_items": len(files),
|
|
100
|
+
"files": files,
|
|
101
|
+
"recursive": recursive
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
except Exception as e:
|
|
105
|
+
self.logger.error(f"Failed to list OneDrive files: {e}")
|
|
106
|
+
raise
|
|
107
|
+
|
|
108
|
+
async def _list_recursive(
|
|
109
|
+
self,
|
|
110
|
+
client: OneDriveClient,
|
|
111
|
+
folder_path: str
|
|
112
|
+
) -> List[Dict[str, Any]]:
|
|
113
|
+
"""Recursively list all files in a folder."""
|
|
114
|
+
all_files = []
|
|
115
|
+
|
|
116
|
+
# Get items in current folder
|
|
117
|
+
items = await client.file_list(folder_path)
|
|
118
|
+
|
|
119
|
+
for item in items:
|
|
120
|
+
all_files.append(item)
|
|
121
|
+
|
|
122
|
+
# Recurse into subfolders
|
|
123
|
+
if item.get('isFolder'):
|
|
124
|
+
subfolder_path = item.get('path', '')
|
|
125
|
+
if subfolder_path:
|
|
126
|
+
subfolder_files = await self._list_recursive(client, subfolder_path)
|
|
127
|
+
all_files.extend(subfolder_files)
|
|
128
|
+
|
|
129
|
+
return all_files
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# ============================================================================
|
|
133
|
+
# SEARCH ONEDRIVE FILES TOOL
|
|
134
|
+
# ============================================================================
|
|
135
|
+
|
|
136
|
+
class SearchOneDriveFilesArgs(O365ToolArgsSchema):
|
|
137
|
+
"""Arguments for searching OneDrive files."""
|
|
138
|
+
query: str = Field(
|
|
139
|
+
description="Search query (filename or content search)"
|
|
140
|
+
)
|
|
141
|
+
max_results: int = Field(
|
|
142
|
+
default=20,
|
|
143
|
+
description="Maximum number of results to return (1-100)"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class SearchOneDriveFilesTool(O365Tool):
|
|
148
|
+
"""
|
|
149
|
+
Tool for searching files in OneDrive.
|
|
150
|
+
|
|
151
|
+
This tool searches for files in OneDrive by name or content.
|
|
152
|
+
|
|
153
|
+
Examples:
|
|
154
|
+
# Search by filename
|
|
155
|
+
result = await tool.run(
|
|
156
|
+
query="budget spreadsheet"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# Search with limit
|
|
160
|
+
result = await tool.run(
|
|
161
|
+
query="meeting notes",
|
|
162
|
+
max_results=10
|
|
163
|
+
)
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
name: str = "search_onedrive_files"
|
|
167
|
+
description: str = (
|
|
168
|
+
"Search for files in OneDrive by name or content. "
|
|
169
|
+
"Returns matching files with their locations."
|
|
170
|
+
)
|
|
171
|
+
args_schema: Type[BaseModel] = SearchOneDriveFilesArgs
|
|
172
|
+
|
|
173
|
+
async def _execute_graph_operation(
|
|
174
|
+
self,
|
|
175
|
+
client: OneDriveClient,
|
|
176
|
+
**kwargs
|
|
177
|
+
) -> Dict[str, Any]:
|
|
178
|
+
"""
|
|
179
|
+
Search OneDrive files using the OneDriveClient.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
client: Authenticated OneDriveClient instance
|
|
183
|
+
**kwargs: Tool parameters
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
Dict with search results
|
|
187
|
+
"""
|
|
188
|
+
query = kwargs.get('query')
|
|
189
|
+
max_results = min(kwargs.get('max_results', 20), 100)
|
|
190
|
+
|
|
191
|
+
try:
|
|
192
|
+
self.logger.info(f"Searching OneDrive for: {query}")
|
|
193
|
+
|
|
194
|
+
# Verify access
|
|
195
|
+
await client.verify_onedrive_access()
|
|
196
|
+
|
|
197
|
+
# Perform search
|
|
198
|
+
search_results = await client.file_search(query)
|
|
199
|
+
|
|
200
|
+
# Limit results
|
|
201
|
+
if len(search_results) > max_results:
|
|
202
|
+
search_results = search_results[:max_results]
|
|
203
|
+
|
|
204
|
+
self.logger.info(f"Found {len(search_results)} matching files")
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
"query": query,
|
|
208
|
+
"total_results": len(search_results),
|
|
209
|
+
"files": search_results
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
except Exception as e:
|
|
213
|
+
self.logger.error(f"Failed to search OneDrive: {e}")
|
|
214
|
+
raise
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
# ============================================================================
|
|
218
|
+
# DOWNLOAD ONEDRIVE FILE TOOL
|
|
219
|
+
# ============================================================================
|
|
220
|
+
|
|
221
|
+
class DownloadOneDriveFileArgs(O365ToolArgsSchema):
|
|
222
|
+
"""Arguments for downloading OneDrive files."""
|
|
223
|
+
file_path: Optional[str] = Field(
|
|
224
|
+
default=None,
|
|
225
|
+
description="Path to file in OneDrive (e.g., 'Documents/report.pdf'). "
|
|
226
|
+
"Use either file_path or file_id."
|
|
227
|
+
)
|
|
228
|
+
file_id: Optional[str] = Field(
|
|
229
|
+
default=None,
|
|
230
|
+
description="OneDrive file ID. Use either file_path or file_id."
|
|
231
|
+
)
|
|
232
|
+
local_destination: Optional[str] = Field(
|
|
233
|
+
default=None,
|
|
234
|
+
description="Local directory to save file. If not provided, saves to current directory."
|
|
235
|
+
)
|
|
236
|
+
rename_as: Optional[str] = Field(
|
|
237
|
+
default=None,
|
|
238
|
+
description="Rename file when downloading"
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class DownloadOneDriveFileTool(O365Tool):
|
|
243
|
+
"""
|
|
244
|
+
Tool for downloading files from OneDrive.
|
|
245
|
+
|
|
246
|
+
This tool downloads a specific file from OneDrive to the local filesystem.
|
|
247
|
+
Can identify files by path or ID.
|
|
248
|
+
|
|
249
|
+
Examples:
|
|
250
|
+
# Download by path
|
|
251
|
+
result = await tool.run(
|
|
252
|
+
file_path="Documents/report.pdf"
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
# Download by ID
|
|
256
|
+
result = await tool.run(
|
|
257
|
+
file_id="01ABCDEF1234567890"
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
# Download and rename
|
|
261
|
+
result = await tool.run(
|
|
262
|
+
file_path="Contracts/agreement.docx",
|
|
263
|
+
rename_as="Client_Agreement.docx"
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
# Download to specific location
|
|
267
|
+
result = await tool.run(
|
|
268
|
+
file_path="Data/export.xlsx",
|
|
269
|
+
local_destination="/tmp/downloads"
|
|
270
|
+
)
|
|
271
|
+
"""
|
|
272
|
+
|
|
273
|
+
name: str = "download_onedrive_file"
|
|
274
|
+
description: str = (
|
|
275
|
+
"Download a file from OneDrive to local storage. "
|
|
276
|
+
"Supports renaming and custom destination paths."
|
|
277
|
+
)
|
|
278
|
+
args_schema: Type[BaseModel] = DownloadOneDriveFileArgs
|
|
279
|
+
|
|
280
|
+
async def _execute_graph_operation(
|
|
281
|
+
self,
|
|
282
|
+
client: OneDriveClient,
|
|
283
|
+
**kwargs
|
|
284
|
+
) -> Dict[str, Any]:
|
|
285
|
+
"""
|
|
286
|
+
Download OneDrive file using the OneDriveClient.
|
|
287
|
+
|
|
288
|
+
Args:
|
|
289
|
+
client: Authenticated OneDriveClient instance
|
|
290
|
+
**kwargs: Tool parameters
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
Dict with download details
|
|
294
|
+
"""
|
|
295
|
+
file_path = kwargs.get('file_path')
|
|
296
|
+
file_id = kwargs.get('file_id')
|
|
297
|
+
local_destination = kwargs.get('local_destination')
|
|
298
|
+
rename_as = kwargs.get('rename_as')
|
|
299
|
+
|
|
300
|
+
try:
|
|
301
|
+
if not file_path and not file_id:
|
|
302
|
+
raise ValueError("Either file_path or file_id must be provided")
|
|
303
|
+
|
|
304
|
+
# Set up download destination
|
|
305
|
+
if local_destination:
|
|
306
|
+
dest_dir = Path(local_destination)
|
|
307
|
+
else:
|
|
308
|
+
dest_dir = Path.cwd()
|
|
309
|
+
|
|
310
|
+
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
311
|
+
|
|
312
|
+
# Verify access
|
|
313
|
+
await client.verify_onedrive_access()
|
|
314
|
+
|
|
315
|
+
if file_id:
|
|
316
|
+
# Download by ID
|
|
317
|
+
self.logger.info(f"Downloading OneDrive file ID: {file_id}")
|
|
318
|
+
|
|
319
|
+
# Get file info first
|
|
320
|
+
drive_info = await client._resolve_drive()
|
|
321
|
+
item = await client.graph_client.drives.by_drive_id(drive_info.id)\
|
|
322
|
+
.items.by_drive_item_id(file_id).get()
|
|
323
|
+
|
|
324
|
+
filename = rename_as or item.name
|
|
325
|
+
destination = dest_dir / filename
|
|
326
|
+
|
|
327
|
+
downloaded_path = await client.file_download(file_id, destination)
|
|
328
|
+
|
|
329
|
+
else:
|
|
330
|
+
# Download by path
|
|
331
|
+
self.logger.info(f"Downloading OneDrive file: {file_path}")
|
|
332
|
+
|
|
333
|
+
# Search for the file
|
|
334
|
+
search_results = await client.file_search(file_path.split('/')[-1])
|
|
335
|
+
|
|
336
|
+
# Find exact match
|
|
337
|
+
matching_file = None
|
|
338
|
+
for result in search_results:
|
|
339
|
+
if result.get('path', '').endswith(file_path):
|
|
340
|
+
matching_file = result
|
|
341
|
+
break
|
|
342
|
+
|
|
343
|
+
if not matching_file:
|
|
344
|
+
raise FileNotFoundError(f"File not found: {file_path}")
|
|
345
|
+
|
|
346
|
+
file_id = matching_file['id']
|
|
347
|
+
filename = rename_as or matching_file['name']
|
|
348
|
+
destination = dest_dir / filename
|
|
349
|
+
|
|
350
|
+
downloaded_path = await client.file_download(file_id, destination)
|
|
351
|
+
|
|
352
|
+
local_path = Path(downloaded_path)
|
|
353
|
+
|
|
354
|
+
self.logger.info(f"Downloaded to: {local_path}")
|
|
355
|
+
|
|
356
|
+
return {
|
|
357
|
+
"file_path": file_path,
|
|
358
|
+
"file_id": file_id,
|
|
359
|
+
"local_path": str(local_path),
|
|
360
|
+
"size": local_path.stat().st_size if local_path.exists() else 0
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
except Exception as e:
|
|
364
|
+
self.logger.error(f"Failed to download OneDrive file: {e}")
|
|
365
|
+
raise
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
# ============================================================================
|
|
369
|
+
# UPLOAD ONEDRIVE FILE TOOL
|
|
370
|
+
# ============================================================================
|
|
371
|
+
|
|
372
|
+
class UploadOneDriveFileArgs(O365ToolArgsSchema):
|
|
373
|
+
"""Arguments for uploading files to OneDrive."""
|
|
374
|
+
local_file_path: str = Field(
|
|
375
|
+
description="Local file path to upload"
|
|
376
|
+
)
|
|
377
|
+
folder_path: Optional[str] = Field(
|
|
378
|
+
default="",
|
|
379
|
+
description="Target folder path in OneDrive (e.g., 'Documents/Projects')"
|
|
380
|
+
)
|
|
381
|
+
rename_as: Optional[str] = Field(
|
|
382
|
+
default=None,
|
|
383
|
+
description="Rename file when uploading"
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
class UploadOneDriveFileTool(O365Tool):
|
|
388
|
+
"""
|
|
389
|
+
Tool for uploading files to OneDrive.
|
|
390
|
+
|
|
391
|
+
This tool uploads a local file to OneDrive.
|
|
392
|
+
Supports folder creation and file renaming.
|
|
393
|
+
|
|
394
|
+
Examples:
|
|
395
|
+
# Upload to root
|
|
396
|
+
result = await tool.run(
|
|
397
|
+
local_file_path="/tmp/report.pdf"
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
# Upload to specific folder
|
|
401
|
+
result = await tool.run(
|
|
402
|
+
local_file_path="/data/export.xlsx",
|
|
403
|
+
folder_path="Documents/Reports"
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
# Upload and rename
|
|
407
|
+
result = await tool.run(
|
|
408
|
+
local_file_path="/tmp/draft.docx",
|
|
409
|
+
folder_path="Work",
|
|
410
|
+
rename_as="Final_Document.docx"
|
|
411
|
+
)
|
|
412
|
+
"""
|
|
413
|
+
|
|
414
|
+
name: str = "upload_onedrive_file"
|
|
415
|
+
description: str = (
|
|
416
|
+
"Upload a file to OneDrive. "
|
|
417
|
+
"Creates folders as needed and supports file renaming."
|
|
418
|
+
)
|
|
419
|
+
args_schema: Type[BaseModel] = UploadOneDriveFileArgs
|
|
420
|
+
|
|
421
|
+
async def _execute_graph_operation(
|
|
422
|
+
self,
|
|
423
|
+
client: OneDriveClient,
|
|
424
|
+
**kwargs
|
|
425
|
+
) -> Dict[str, Any]:
|
|
426
|
+
"""
|
|
427
|
+
Upload file to OneDrive using the OneDriveClient.
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
client: Authenticated OneDriveClient instance
|
|
431
|
+
**kwargs: Tool parameters
|
|
432
|
+
|
|
433
|
+
Returns:
|
|
434
|
+
Dict with upload details
|
|
435
|
+
"""
|
|
436
|
+
local_file_path = kwargs.get('local_file_path')
|
|
437
|
+
folder_path = kwargs.get('folder_path', '')
|
|
438
|
+
rename_as = kwargs.get('rename_as')
|
|
439
|
+
|
|
440
|
+
try:
|
|
441
|
+
# Validate local file
|
|
442
|
+
local_path = Path(local_file_path)
|
|
443
|
+
if not local_path.exists():
|
|
444
|
+
raise FileNotFoundError(f"Local file not found: {local_file_path}")
|
|
445
|
+
|
|
446
|
+
self.logger.info(f"Uploading {local_path.name} to OneDrive:{folder_path or 'root'}")
|
|
447
|
+
|
|
448
|
+
# Verify access
|
|
449
|
+
await client.verify_onedrive_access()
|
|
450
|
+
|
|
451
|
+
# If rename requested, we need to temporarily copy/rename
|
|
452
|
+
if rename_as:
|
|
453
|
+
# Create temporary renamed file
|
|
454
|
+
temp_path = local_path.parent / rename_as
|
|
455
|
+
shutil.copy2(local_path, temp_path)
|
|
456
|
+
upload_path = temp_path
|
|
457
|
+
cleanup_temp = True
|
|
458
|
+
else:
|
|
459
|
+
upload_path = local_path
|
|
460
|
+
cleanup_temp = False
|
|
461
|
+
|
|
462
|
+
try:
|
|
463
|
+
# Upload file
|
|
464
|
+
upload_result = await client.upload_file(
|
|
465
|
+
upload_path,
|
|
466
|
+
folder_path if folder_path else None
|
|
467
|
+
)
|
|
468
|
+
finally:
|
|
469
|
+
# Clean up temporary file if created
|
|
470
|
+
if cleanup_temp and temp_path.exists():
|
|
471
|
+
temp_path.unlink()
|
|
472
|
+
|
|
473
|
+
self.logger.info(f"Uploaded successfully: {upload_result['name']}")
|
|
474
|
+
|
|
475
|
+
return {
|
|
476
|
+
"folder_path": folder_path or "root",
|
|
477
|
+
"uploaded_file": upload_result['name'],
|
|
478
|
+
"file_id": upload_result['id'],
|
|
479
|
+
"size": upload_result['size'],
|
|
480
|
+
"web_url": upload_result.get('webUrl', '')
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
except Exception as e:
|
|
484
|
+
self.logger.error(f"Failed to upload to OneDrive: {e}")
|
|
485
|
+
raise
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
# ============================================================================
|
|
489
|
+
# EXPORT ALL ONEDRIVE TOOLS
|
|
490
|
+
# ============================================================================
|
|
491
|
+
|
|
492
|
+
__all__ = [
|
|
493
|
+
'ListOneDriveFilesTool',
|
|
494
|
+
'SearchOneDriveFilesTool',
|
|
495
|
+
'DownloadOneDriveFileTool',
|
|
496
|
+
'UploadOneDriveFileTool'
|
|
497
|
+
]
|