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
parrot/tools/resttool.py
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RESTTool - A tool for calling REST APIs with natural language interface.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, Any, Optional, Union, Type, List
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from pydantic import BaseModel, Field, create_model
|
|
7
|
+
from ..interfaces.http import HTTPService
|
|
8
|
+
from .abstract import AbstractTool, AbstractToolArgsSchema, ToolResult
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RESTArgsSchema(AbstractToolArgsSchema):
|
|
12
|
+
"""Base schema for REST API calls."""
|
|
13
|
+
endpoint: str = Field(
|
|
14
|
+
description="The API endpoint to call (e.g., 'get_batch', 'users/list')"
|
|
15
|
+
)
|
|
16
|
+
method: str = Field(
|
|
17
|
+
default="GET",
|
|
18
|
+
description="HTTP method to use (GET, POST, PUT, DELETE, PATCH)"
|
|
19
|
+
)
|
|
20
|
+
params: Optional[Dict[str, Any]] = Field(
|
|
21
|
+
default=None,
|
|
22
|
+
description="Query parameters for GET requests"
|
|
23
|
+
)
|
|
24
|
+
data: Optional[Dict[str, Any]] = Field(
|
|
25
|
+
default=None,
|
|
26
|
+
description="Body data for POST/PUT/PATCH requests"
|
|
27
|
+
)
|
|
28
|
+
headers: Optional[Dict[str, str]] = Field(
|
|
29
|
+
default=None,
|
|
30
|
+
description="Additional HTTP headers"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class RESTTool(AbstractTool):
|
|
35
|
+
"""
|
|
36
|
+
Base class for creating REST API tools.
|
|
37
|
+
|
|
38
|
+
This tool allows LLMs to call REST APIs with natural language instructions like:
|
|
39
|
+
- "please, run via GET get_batch for batch_id=xyz"
|
|
40
|
+
- "create a new user with POST to /users endpoint"
|
|
41
|
+
- "update user 123 with PUT"
|
|
42
|
+
|
|
43
|
+
The tool automatically:
|
|
44
|
+
- Composes URLs from base_url + endpoint
|
|
45
|
+
- Handles JSON inputs/outputs
|
|
46
|
+
- Supports all HTTP methods
|
|
47
|
+
- Provides retry logic via HTTPService
|
|
48
|
+
- Returns structured responses
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
class MyAPITool(RESTTool):
|
|
52
|
+
name = "my_api"
|
|
53
|
+
description = "Tool for accessing MyAPI service"
|
|
54
|
+
base_url = "https://api.example.com/v1"
|
|
55
|
+
|
|
56
|
+
# Usage by LLM
|
|
57
|
+
result = await tool.run(
|
|
58
|
+
endpoint="users/123",
|
|
59
|
+
method="GET"
|
|
60
|
+
)
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
name: str = "rest_api"
|
|
64
|
+
description: str = "Call REST API endpoints"
|
|
65
|
+
args_schema: Type[BaseModel] = RESTArgsSchema
|
|
66
|
+
|
|
67
|
+
# Class-level configuration
|
|
68
|
+
base_url: str = None
|
|
69
|
+
default_headers: Dict[str, str] = {}
|
|
70
|
+
use_auth: bool = True
|
|
71
|
+
auth_header_name: str = "Authorization"
|
|
72
|
+
auth_token_prefix: str = "Bearer"
|
|
73
|
+
|
|
74
|
+
def __init__(
|
|
75
|
+
self,
|
|
76
|
+
base_url: Optional[str] = None,
|
|
77
|
+
api_key: Optional[str] = None,
|
|
78
|
+
credentials: Optional[Dict[str, str]] = None,
|
|
79
|
+
use_http2: bool = False,
|
|
80
|
+
use_proxy: bool = False,
|
|
81
|
+
timeout: int = 30,
|
|
82
|
+
debug: bool = False,
|
|
83
|
+
**kwargs
|
|
84
|
+
):
|
|
85
|
+
"""
|
|
86
|
+
Initialize REST tool.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
base_url: Base URL for the API (e.g., "https://api.example.com/v1")
|
|
90
|
+
api_key: API key for authentication
|
|
91
|
+
credentials: Dictionary with authentication credentials
|
|
92
|
+
use_http2: Enable HTTP/2
|
|
93
|
+
use_proxy: Enable proxy usage
|
|
94
|
+
timeout: Request timeout in seconds
|
|
95
|
+
debug: Enable debug logging
|
|
96
|
+
**kwargs: Additional arguments passed to AbstractTool
|
|
97
|
+
"""
|
|
98
|
+
super().__init__(**kwargs)
|
|
99
|
+
|
|
100
|
+
# Override base_url if provided
|
|
101
|
+
if base_url:
|
|
102
|
+
self.base_url = base_url
|
|
103
|
+
|
|
104
|
+
if not self.base_url:
|
|
105
|
+
raise ValueError("base_url must be provided either as class attribute or __init__ parameter")
|
|
106
|
+
|
|
107
|
+
# Setup authentication
|
|
108
|
+
credentials = credentials or {}
|
|
109
|
+
if api_key:
|
|
110
|
+
credentials['apikey'] = api_key
|
|
111
|
+
|
|
112
|
+
# Prepare headers
|
|
113
|
+
headers = self.default_headers.copy()
|
|
114
|
+
headers.update(kwargs.pop('headers', {}))
|
|
115
|
+
|
|
116
|
+
# Initialize HTTP service
|
|
117
|
+
self.http_service = HTTPService(
|
|
118
|
+
accept='application/json',
|
|
119
|
+
headers=headers,
|
|
120
|
+
credentials=credentials,
|
|
121
|
+
use_http2=use_http2,
|
|
122
|
+
use_proxy=use_proxy,
|
|
123
|
+
timeout=timeout,
|
|
124
|
+
debug=debug,
|
|
125
|
+
**kwargs
|
|
126
|
+
)
|
|
127
|
+
self._debug = debug
|
|
128
|
+
|
|
129
|
+
def _build_url(self, endpoint: str, params: Optional[Dict[str, Any]] = None) -> str:
|
|
130
|
+
"""
|
|
131
|
+
Build complete URL from base_url and endpoint.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
endpoint: API endpoint (e.g., "get_batch", "users/123")
|
|
135
|
+
params: Optional query parameters
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
Complete URL
|
|
139
|
+
"""
|
|
140
|
+
# Remove leading slash from endpoint if present
|
|
141
|
+
endpoint = endpoint.lstrip('/')
|
|
142
|
+
|
|
143
|
+
# Combine base_url and endpoint
|
|
144
|
+
url = f"{self.base_url.rstrip('/')}/{endpoint}"
|
|
145
|
+
|
|
146
|
+
# Add query parameters if provided
|
|
147
|
+
if params:
|
|
148
|
+
url = self.http_service.build_url(url, params=params)
|
|
149
|
+
|
|
150
|
+
if self._debug:
|
|
151
|
+
self.logger.debug(f"Built URL: {url}")
|
|
152
|
+
|
|
153
|
+
return url
|
|
154
|
+
|
|
155
|
+
def _prepare_request(
|
|
156
|
+
self,
|
|
157
|
+
endpoint: str,
|
|
158
|
+
method: str = "GET",
|
|
159
|
+
params: Optional[Dict[str, Any]] = None,
|
|
160
|
+
data: Optional[Dict[str, Any]] = None,
|
|
161
|
+
headers: Optional[Dict[str, str]] = None
|
|
162
|
+
) -> Dict[str, Any]:
|
|
163
|
+
"""
|
|
164
|
+
Prepare request parameters.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
endpoint: API endpoint
|
|
168
|
+
method: HTTP method
|
|
169
|
+
params: Query parameters
|
|
170
|
+
data: Request body data
|
|
171
|
+
headers: Additional headers
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
Dictionary with request parameters
|
|
175
|
+
"""
|
|
176
|
+
method = method.upper()
|
|
177
|
+
url = self._build_url(endpoint, params)
|
|
178
|
+
|
|
179
|
+
request_kwargs = {
|
|
180
|
+
"url": url,
|
|
181
|
+
"method": method,
|
|
182
|
+
"headers": headers or {},
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# For GET/DELETE, params go in URL (already handled)
|
|
186
|
+
# For POST/PUT/PATCH, data goes in body
|
|
187
|
+
if method in ['POST', 'PUT', 'PATCH'] and data:
|
|
188
|
+
request_kwargs["data"] = data
|
|
189
|
+
request_kwargs["use_json"] = True
|
|
190
|
+
|
|
191
|
+
return request_kwargs
|
|
192
|
+
|
|
193
|
+
async def _make_request(
|
|
194
|
+
self,
|
|
195
|
+
endpoint: str,
|
|
196
|
+
method: str = "GET",
|
|
197
|
+
params: Optional[Dict[str, Any]] = None,
|
|
198
|
+
data: Optional[Dict[str, Any]] = None,
|
|
199
|
+
headers: Optional[Dict[str, str]] = None
|
|
200
|
+
) -> ToolResult:
|
|
201
|
+
"""
|
|
202
|
+
Make HTTP request and return structured result.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
endpoint: API endpoint
|
|
206
|
+
method: HTTP method
|
|
207
|
+
params: Query parameters
|
|
208
|
+
data: Request body
|
|
209
|
+
headers: Additional headers
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
ToolResult with response data or error
|
|
213
|
+
"""
|
|
214
|
+
try:
|
|
215
|
+
# Prepare request
|
|
216
|
+
request_kwargs = self._prepare_request(
|
|
217
|
+
endpoint=endpoint,
|
|
218
|
+
method=method,
|
|
219
|
+
params=params,
|
|
220
|
+
data=data,
|
|
221
|
+
headers=headers
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Make request using httpx (default client)
|
|
225
|
+
result, error = await self.http_service.request(
|
|
226
|
+
client='httpx',
|
|
227
|
+
**request_kwargs
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
if error:
|
|
231
|
+
return ToolResult(
|
|
232
|
+
status="error",
|
|
233
|
+
result=None,
|
|
234
|
+
error=str(error),
|
|
235
|
+
metadata={
|
|
236
|
+
"endpoint": endpoint,
|
|
237
|
+
"method": method
|
|
238
|
+
}
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
return ToolResult(
|
|
242
|
+
status="success",
|
|
243
|
+
result=result,
|
|
244
|
+
error=None,
|
|
245
|
+
metadata={
|
|
246
|
+
"endpoint": endpoint,
|
|
247
|
+
"method": method,
|
|
248
|
+
"url": request_kwargs["url"]
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
except Exception as e:
|
|
253
|
+
self.logger.error(f"Request failed: {e}")
|
|
254
|
+
return ToolResult(
|
|
255
|
+
status="error",
|
|
256
|
+
result=None,
|
|
257
|
+
error=str(e),
|
|
258
|
+
metadata={
|
|
259
|
+
"endpoint": endpoint,
|
|
260
|
+
"method": method
|
|
261
|
+
}
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
async def _execute(
|
|
265
|
+
self,
|
|
266
|
+
endpoint: str,
|
|
267
|
+
method: str = "GET",
|
|
268
|
+
params: Optional[Dict[str, Any]] = None,
|
|
269
|
+
data: Optional[Dict[str, Any]] = None,
|
|
270
|
+
headers: Optional[Dict[str, str]] = None,
|
|
271
|
+
**kwargs
|
|
272
|
+
) -> ToolResult:
|
|
273
|
+
"""
|
|
274
|
+
Execute the REST API call.
|
|
275
|
+
|
|
276
|
+
This is the main method called by the LLM when using this tool.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
endpoint: API endpoint to call
|
|
280
|
+
method: HTTP method (GET, POST, PUT, DELETE, PATCH)
|
|
281
|
+
params: Query parameters (for GET)
|
|
282
|
+
data: Body data (for POST/PUT/PATCH)
|
|
283
|
+
headers: Additional headers
|
|
284
|
+
**kwargs: Additional arguments
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
ToolResult with API response
|
|
288
|
+
"""
|
|
289
|
+
return await self._make_request(
|
|
290
|
+
endpoint=endpoint,
|
|
291
|
+
method=method,
|
|
292
|
+
params=params,
|
|
293
|
+
data=data,
|
|
294
|
+
headers=headers
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
def get_tool_schema(self) -> Dict[str, Any]:
|
|
298
|
+
"""
|
|
299
|
+
Get the JSON schema for this tool.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
Tool schema in the format expected by LLMs
|
|
303
|
+
"""
|
|
304
|
+
# Get base schema from args_schema
|
|
305
|
+
if self.args_schema:
|
|
306
|
+
schema = self.args_schema.model_json_schema()
|
|
307
|
+
else:
|
|
308
|
+
schema = {
|
|
309
|
+
"type": "object",
|
|
310
|
+
"properties": {},
|
|
311
|
+
"required": []
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
"name": self.name,
|
|
316
|
+
"description": self.description,
|
|
317
|
+
"parameters": schema
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
class DynamicRESTTool(RESTTool):
|
|
322
|
+
"""
|
|
323
|
+
Dynamic REST tool that can be configured with custom endpoints.
|
|
324
|
+
|
|
325
|
+
This allows creating REST tools without subclassing, by providing
|
|
326
|
+
endpoint definitions at initialization.
|
|
327
|
+
|
|
328
|
+
Example:
|
|
329
|
+
tool = DynamicRESTTool(
|
|
330
|
+
name="github_api",
|
|
331
|
+
description="GitHub API tool",
|
|
332
|
+
base_url="https://api.github.com",
|
|
333
|
+
endpoints={
|
|
334
|
+
"get_user": {
|
|
335
|
+
"path": "users/{username}",
|
|
336
|
+
"method": "GET",
|
|
337
|
+
"description": "Get user information"
|
|
338
|
+
},
|
|
339
|
+
"create_issue": {
|
|
340
|
+
"path": "repos/{owner}/{repo}/issues",
|
|
341
|
+
"method": "POST",
|
|
342
|
+
"description": "Create a new issue"
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
)
|
|
346
|
+
"""
|
|
347
|
+
|
|
348
|
+
def __init__(
|
|
349
|
+
self,
|
|
350
|
+
endpoints: Optional[Dict[str, Dict[str, Any]]] = None,
|
|
351
|
+
**kwargs
|
|
352
|
+
):
|
|
353
|
+
"""
|
|
354
|
+
Initialize dynamic REST tool.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
endpoints: Dictionary of endpoint definitions
|
|
358
|
+
**kwargs: Arguments passed to RESTTool
|
|
359
|
+
"""
|
|
360
|
+
super().__init__(**kwargs)
|
|
361
|
+
self.endpoints = endpoints or {}
|
|
362
|
+
|
|
363
|
+
# Generate dynamic schema based on endpoints
|
|
364
|
+
if self.endpoints:
|
|
365
|
+
self.args_schema = self._generate_dynamic_schema()
|
|
366
|
+
|
|
367
|
+
def _generate_dynamic_schema(self) -> Type[BaseModel]:
|
|
368
|
+
"""Generate Pydantic schema from endpoint definitions."""
|
|
369
|
+
# Build choice of endpoints
|
|
370
|
+
endpoint_choices = list(self.endpoints.keys())
|
|
371
|
+
|
|
372
|
+
# Create dynamic model
|
|
373
|
+
fields = {
|
|
374
|
+
'endpoint': (
|
|
375
|
+
str,
|
|
376
|
+
Field(
|
|
377
|
+
description=f"Choose endpoint: {', '.join(endpoint_choices)}"
|
|
378
|
+
)
|
|
379
|
+
),
|
|
380
|
+
'method': (
|
|
381
|
+
Optional[str],
|
|
382
|
+
Field(
|
|
383
|
+
default=None,
|
|
384
|
+
description="HTTP method (optional, defaults to endpoint's method)"
|
|
385
|
+
)
|
|
386
|
+
),
|
|
387
|
+
'params': (
|
|
388
|
+
Optional[Dict[str, Any]],
|
|
389
|
+
Field(
|
|
390
|
+
default=None,
|
|
391
|
+
description="Query parameters or path variables"
|
|
392
|
+
)
|
|
393
|
+
),
|
|
394
|
+
'data': (
|
|
395
|
+
Optional[Dict[str, Any]],
|
|
396
|
+
Field(
|
|
397
|
+
default=None,
|
|
398
|
+
description="Request body data"
|
|
399
|
+
)
|
|
400
|
+
),
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
return create_model(
|
|
404
|
+
f"{self.name}_schema",
|
|
405
|
+
**fields,
|
|
406
|
+
__base__=AbstractToolArgsSchema
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
def _resolve_endpoint(
|
|
410
|
+
self,
|
|
411
|
+
endpoint: str,
|
|
412
|
+
params: Optional[Dict[str, Any]] = None
|
|
413
|
+
) -> str:
|
|
414
|
+
"""
|
|
415
|
+
Resolve endpoint path with path variables.
|
|
416
|
+
|
|
417
|
+
Args:
|
|
418
|
+
endpoint: Endpoint name
|
|
419
|
+
params: Parameters (may contain path variables)
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
Resolved endpoint path
|
|
423
|
+
"""
|
|
424
|
+
if endpoint not in self.endpoints:
|
|
425
|
+
return endpoint
|
|
426
|
+
|
|
427
|
+
endpoint_config = self.endpoints[endpoint]
|
|
428
|
+
path = endpoint_config.get('path', endpoint)
|
|
429
|
+
|
|
430
|
+
# Replace path variables
|
|
431
|
+
if params:
|
|
432
|
+
try:
|
|
433
|
+
path = path.format(**params)
|
|
434
|
+
except KeyError as e:
|
|
435
|
+
self.logger.warning(f"Missing path variable: {e}")
|
|
436
|
+
|
|
437
|
+
return path
|
|
438
|
+
|
|
439
|
+
async def _run(
|
|
440
|
+
self,
|
|
441
|
+
endpoint: str,
|
|
442
|
+
method: Optional[str] = None,
|
|
443
|
+
params: Optional[Dict[str, Any]] = None,
|
|
444
|
+
data: Optional[Dict[str, Any]] = None,
|
|
445
|
+
headers: Optional[Dict[str, str]] = None,
|
|
446
|
+
**kwargs
|
|
447
|
+
) -> ToolResult:
|
|
448
|
+
"""
|
|
449
|
+
Execute dynamic REST API call.
|
|
450
|
+
|
|
451
|
+
Args:
|
|
452
|
+
endpoint: Endpoint name or path
|
|
453
|
+
method: HTTP method (optional, uses endpoint's default)
|
|
454
|
+
params: Parameters (path variables + query params)
|
|
455
|
+
data: Request body
|
|
456
|
+
headers: Additional headers
|
|
457
|
+
**kwargs: Additional arguments
|
|
458
|
+
|
|
459
|
+
Returns:
|
|
460
|
+
ToolResult with API response
|
|
461
|
+
"""
|
|
462
|
+
# Get endpoint configuration if available
|
|
463
|
+
endpoint_config = self.endpoints.get(endpoint, {})
|
|
464
|
+
|
|
465
|
+
# Use endpoint's method if not specified
|
|
466
|
+
if method is None:
|
|
467
|
+
method = endpoint_config.get('method', 'GET')
|
|
468
|
+
|
|
469
|
+
# Resolve endpoint path with variables
|
|
470
|
+
resolved_path = self._resolve_endpoint(endpoint, params)
|
|
471
|
+
|
|
472
|
+
# Make request
|
|
473
|
+
return await self._make_request(
|
|
474
|
+
endpoint=resolved_path,
|
|
475
|
+
method=method,
|
|
476
|
+
params=params,
|
|
477
|
+
data=data,
|
|
478
|
+
headers=headers
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
class SimpleRESTTool(RESTTool):
|
|
483
|
+
"""
|
|
484
|
+
Simplified REST tool for quick API integrations.
|
|
485
|
+
|
|
486
|
+
Provides convenience methods for common operations.
|
|
487
|
+
|
|
488
|
+
Example:
|
|
489
|
+
class ProductAPI(SimpleRESTTool):
|
|
490
|
+
name = "product_api"
|
|
491
|
+
description = "Product management API"
|
|
492
|
+
base_url = "https://api.example.com/products"
|
|
493
|
+
|
|
494
|
+
# Usage
|
|
495
|
+
tool = ProductAPI(api_key="secret")
|
|
496
|
+
|
|
497
|
+
# Get product
|
|
498
|
+
result = await tool.get("123")
|
|
499
|
+
|
|
500
|
+
# Create product
|
|
501
|
+
result = await tool.post("", data={"name": "Widget"})
|
|
502
|
+
|
|
503
|
+
# Update product
|
|
504
|
+
result = await tool.put("123", data={"price": 9.99})
|
|
505
|
+
|
|
506
|
+
# Delete product
|
|
507
|
+
result = await tool.delete("123")
|
|
508
|
+
"""
|
|
509
|
+
|
|
510
|
+
async def get(
|
|
511
|
+
self,
|
|
512
|
+
endpoint: str,
|
|
513
|
+
params: Optional[Dict[str, Any]] = None,
|
|
514
|
+
**kwargs
|
|
515
|
+
) -> ToolResult:
|
|
516
|
+
"""Convenience method for GET requests."""
|
|
517
|
+
return await self._execute(endpoint=endpoint, method="GET", params=params, **kwargs)
|
|
518
|
+
|
|
519
|
+
async def post(
|
|
520
|
+
self,
|
|
521
|
+
endpoint: str,
|
|
522
|
+
data: Optional[Dict[str, Any]] = None,
|
|
523
|
+
**kwargs
|
|
524
|
+
) -> ToolResult:
|
|
525
|
+
"""Convenience method for POST requests."""
|
|
526
|
+
return await self._execute(endpoint=endpoint, method="POST", data=data, **kwargs)
|
|
527
|
+
|
|
528
|
+
async def put(
|
|
529
|
+
self,
|
|
530
|
+
endpoint: str,
|
|
531
|
+
data: Optional[Dict[str, Any]] = None,
|
|
532
|
+
**kwargs
|
|
533
|
+
) -> ToolResult:
|
|
534
|
+
"""Convenience method for PUT requests."""
|
|
535
|
+
return await self._execute(endpoint=endpoint, method="PUT", data=data, **kwargs)
|
|
536
|
+
|
|
537
|
+
async def patch(
|
|
538
|
+
self,
|
|
539
|
+
endpoint: str,
|
|
540
|
+
data: Optional[Dict[str, Any]] = None,
|
|
541
|
+
**kwargs
|
|
542
|
+
) -> ToolResult:
|
|
543
|
+
"""Convenience method for PATCH requests."""
|
|
544
|
+
return await self._execute(endpoint=endpoint, method="PATCH", data=data, **kwargs)
|
|
545
|
+
|
|
546
|
+
async def delete(
|
|
547
|
+
self,
|
|
548
|
+
endpoint: str,
|
|
549
|
+
params: Optional[Dict[str, Any]] = None,
|
|
550
|
+
**kwargs
|
|
551
|
+
) -> ToolResult:
|
|
552
|
+
"""Convenience method for DELETE requests."""
|
|
553
|
+
return await self._execute(endpoint=endpoint, method="DELETE", params=params, **kwargs)
|
|
File without changes
|