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,52 @@
|
|
|
1
|
+
from PIL import Image
|
|
2
|
+
from imagehash import phash, dhash
|
|
3
|
+
from .abstract import ImagePlugin
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ImageHashPlugin(ImagePlugin):
|
|
7
|
+
"""
|
|
8
|
+
ImageHashPlugin is a plugin for generating perceptual hashes of images.
|
|
9
|
+
It extends the ImagePlugin class and implements the analyze method to generate hashes.
|
|
10
|
+
"""
|
|
11
|
+
column_name: str = "image_hash"
|
|
12
|
+
|
|
13
|
+
def __init__(self, *args, **kwargs):
|
|
14
|
+
super().__init__(*args, **kwargs)
|
|
15
|
+
self._hash_type: str = kwargs.get("model", "phash")
|
|
16
|
+
self._hash_size: int = kwargs.get("hash_size", 8)
|
|
17
|
+
self._hash_func = self._get_hash_function(self._hash_type)
|
|
18
|
+
|
|
19
|
+
def _get_hash_function(self, hash_type: str):
|
|
20
|
+
"""
|
|
21
|
+
Get the hash function based on the specified hash type.
|
|
22
|
+
|
|
23
|
+
:param hash_type: Type of hash to generate (e.g., 'phash', 'dhash').
|
|
24
|
+
:return: Hash function.
|
|
25
|
+
"""
|
|
26
|
+
if hash_type == "phash":
|
|
27
|
+
return phash
|
|
28
|
+
elif hash_type == "dhash":
|
|
29
|
+
return dhash
|
|
30
|
+
else:
|
|
31
|
+
raise ValueError(
|
|
32
|
+
f"Unsupported hash type: {hash_type}"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
async def analyze(self, image: Image.Image, **kwargs) -> str:
|
|
36
|
+
"""
|
|
37
|
+
Generate a perceptual hash of the given image.
|
|
38
|
+
|
|
39
|
+
:param image: Image Bytes opened with PIL Image.open
|
|
40
|
+
:return: Perceptual hash of the image.
|
|
41
|
+
"""
|
|
42
|
+
try:
|
|
43
|
+
hash_value = self._hash_func(image, hash_size=self._hash_size)
|
|
44
|
+
if hash_value:
|
|
45
|
+
return str(hash_value)
|
|
46
|
+
else:
|
|
47
|
+
return ''
|
|
48
|
+
except Exception as e:
|
|
49
|
+
self.logger.error(
|
|
50
|
+
f"Error in ImageHash analysis: {str(e)}"
|
|
51
|
+
)
|
|
52
|
+
return ''
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from io import BytesIO
|
|
3
|
+
from PIL import Image
|
|
4
|
+
import numpy as np
|
|
5
|
+
import torch
|
|
6
|
+
from transformers import AutoImageProcessor, AutoModel
|
|
7
|
+
from .abstract import ImagePlugin
|
|
8
|
+
|
|
9
|
+
SUPPORTED_MODELS = {
|
|
10
|
+
"dinov2-base": {
|
|
11
|
+
"model": "facebook/dinov2-base",
|
|
12
|
+
"vector_dim": 768
|
|
13
|
+
},
|
|
14
|
+
"vit-base": {
|
|
15
|
+
"model": "google/vit-base-patch16-224-in21k",
|
|
16
|
+
"vector_dim": 768
|
|
17
|
+
},
|
|
18
|
+
"dinov2-large": {
|
|
19
|
+
"model": "facebook/dinov2-large",
|
|
20
|
+
"vector_dim": 1024
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class VisionTransformerPlugin(ImagePlugin):
|
|
26
|
+
"""
|
|
27
|
+
VisionTransformerPlugin is a plugin for generating vector representations of images.
|
|
28
|
+
It extends the ImagePlugin class and implements the analyze method to generate vectors.
|
|
29
|
+
"""
|
|
30
|
+
column_name: str = "image_vector"
|
|
31
|
+
|
|
32
|
+
def __init__(self, *args, device: Optional[str] = None, **kwargs):
|
|
33
|
+
super().__init__(*args, **kwargs)
|
|
34
|
+
self._vector_model: str = kwargs.get("model_name", "dinov2-base")
|
|
35
|
+
self._vector_size: int = kwargs.get("vector_size", 768)
|
|
36
|
+
self._model_info = SUPPORTED_MODELS.get(self._vector_model)
|
|
37
|
+
use_gpu: bool = kwargs.get("use_gpu", False)
|
|
38
|
+
if use_gpu and not torch.cuda.is_available():
|
|
39
|
+
raise ValueError("GPU is not available. Please set use_gpu to False.")
|
|
40
|
+
if not self._model_info:
|
|
41
|
+
raise ValueError(
|
|
42
|
+
f"Unsupported model name: {self._vector_model}. "
|
|
43
|
+
f"Supported models are: {list(SUPPORTED_MODELS.keys())}"
|
|
44
|
+
)
|
|
45
|
+
if use_gpu:
|
|
46
|
+
self.device = device or ("cuda" if torch.cuda.is_available() else "cpu")
|
|
47
|
+
else:
|
|
48
|
+
self.device = "cpu"
|
|
49
|
+
|
|
50
|
+
async def start(self):
|
|
51
|
+
self.processor = AutoImageProcessor.from_pretrained(self._model_info["model"])
|
|
52
|
+
self.model = AutoModel.from_pretrained(self._model_info["model"]).to(self.device)
|
|
53
|
+
self.model.eval()
|
|
54
|
+
return self
|
|
55
|
+
|
|
56
|
+
async def dispose(self):
|
|
57
|
+
"""
|
|
58
|
+
Close the model and processor.
|
|
59
|
+
"""
|
|
60
|
+
if hasattr(self, "model"):
|
|
61
|
+
del self.model
|
|
62
|
+
if hasattr(self, "processor"):
|
|
63
|
+
del self.processor
|
|
64
|
+
torch.cuda.empty_cache()
|
|
65
|
+
return self
|
|
66
|
+
|
|
67
|
+
async def analyze(self, image: Image.Image, **kwargs) -> np.ndarray:
|
|
68
|
+
"""
|
|
69
|
+
Generate a vector representation of the given image.
|
|
70
|
+
|
|
71
|
+
:param image: Image Bytes opened with PIL Image.open
|
|
72
|
+
:return: Vector representation of the image.
|
|
73
|
+
"""
|
|
74
|
+
if image is None:
|
|
75
|
+
return None
|
|
76
|
+
try:
|
|
77
|
+
image = image.convert("RGB")
|
|
78
|
+
# Resize and normalize the image
|
|
79
|
+
# image = image.resize((224, 224))
|
|
80
|
+
# image = np.array(image) / 255.0
|
|
81
|
+
# image = np.transpose(image, (2, 0, 1)) # Change to CxHxW format
|
|
82
|
+
# image = torch.tensor(image, dtype=torch.float32).unsqueeze(0).to(self.device)
|
|
83
|
+
# # Normalize the image
|
|
84
|
+
# image = (image - 0.5) / 0.5
|
|
85
|
+
# Convert to tensor and move to device
|
|
86
|
+
inputs = self.processor(images=image, return_tensors="pt").to(self.device)
|
|
87
|
+
with torch.no_grad():
|
|
88
|
+
outputs = self.model(**inputs)
|
|
89
|
+
# Use CLS token representation
|
|
90
|
+
vector = outputs.last_hidden_state[:, 0].squeeze().cpu().numpy()
|
|
91
|
+
vector = vector / np.linalg.norm(vector)
|
|
92
|
+
return vector.tolist()
|
|
93
|
+
except Exception as e:
|
|
94
|
+
self.logger.error(
|
|
95
|
+
f"Error in VisionTransformer analysis: {str(e)}"
|
|
96
|
+
)
|
|
97
|
+
return None
|
|
98
|
+
# features = self.model(**image).last_hidden_state
|
|
99
|
+
# features = features[:, 0, :].cpu().numpy()
|
|
100
|
+
# if features.shape[1] != self._vector_size:
|
|
101
|
+
# raise ValueError(
|
|
102
|
+
# f"Vector size mismatch: expected {self._vector_size}, got {features.shape[1]}"
|
|
103
|
+
# )
|
|
104
|
+
# return features
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from ultralytics import YOLO
|
|
2
|
+
from PIL import Image
|
|
3
|
+
from .abstract import ImagePlugin
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class YOLOPlugin(ImagePlugin):
|
|
7
|
+
"""
|
|
8
|
+
YOLOPlugin is a plugin for performing object detection using the YOLO (You Only Look Once) model.
|
|
9
|
+
It extends the ImagePlugin class and implements the analyze method to perform object detection.
|
|
10
|
+
"""
|
|
11
|
+
column_name: str = "image_features"
|
|
12
|
+
|
|
13
|
+
def __init__(self, *args, **kwargs):
|
|
14
|
+
self._model_name: str = kwargs.get("model_name", "yolov8n")
|
|
15
|
+
self._model_path: str = kwargs.get("model_path", "yolov11l.pt")
|
|
16
|
+
if not self._model_name or not self._model_path:
|
|
17
|
+
raise ValueError(
|
|
18
|
+
"Model name and model path are required."
|
|
19
|
+
)
|
|
20
|
+
super().__init__(*args, **kwargs)
|
|
21
|
+
try:
|
|
22
|
+
self.model = YOLO(self._model_path)
|
|
23
|
+
except Exception as e:
|
|
24
|
+
raise RuntimeError(
|
|
25
|
+
f"Error loading YOLO model: {str(e)}"
|
|
26
|
+
) from e
|
|
27
|
+
|
|
28
|
+
async def dispose(self):
|
|
29
|
+
"""
|
|
30
|
+
Close the YOLO model.
|
|
31
|
+
"""
|
|
32
|
+
if hasattr(self, "model"):
|
|
33
|
+
self.model = None
|
|
34
|
+
|
|
35
|
+
async def analyze(self, image: Image.Image, **kwargs) -> dict:
|
|
36
|
+
"""
|
|
37
|
+
Perform object detection on the given image using the YOLO model.
|
|
38
|
+
|
|
39
|
+
:param image: Image Bytes opened with PIL Image.open
|
|
40
|
+
:return: Dictionary containing detected objects and their bounding boxes.
|
|
41
|
+
"""
|
|
42
|
+
try:
|
|
43
|
+
if image is None:
|
|
44
|
+
return {}
|
|
45
|
+
results = self.model.predict(source=image, conf=0.25, save=False, verbose=False)
|
|
46
|
+
return self._parse_results(results)
|
|
47
|
+
except Exception as e:
|
|
48
|
+
self.logger.error(f"Error in YOLO analysis: {str(e)}")
|
|
49
|
+
return {}
|
|
50
|
+
|
|
51
|
+
def _parse_results(self, results) -> dict:
|
|
52
|
+
"""
|
|
53
|
+
Parse the results from the YOLO model.
|
|
54
|
+
|
|
55
|
+
:param results: Results from the YOLO model.
|
|
56
|
+
:return: Dictionary containing detected objects and their bounding boxes.
|
|
57
|
+
"""
|
|
58
|
+
detections = []
|
|
59
|
+
for r in results:
|
|
60
|
+
for box in r.boxes:
|
|
61
|
+
detections.append({
|
|
62
|
+
"label": r.names[int(box.cls)],
|
|
63
|
+
"conf": float(box.conf),
|
|
64
|
+
"box": box.xyxy[0].tolist()
|
|
65
|
+
})
|
|
66
|
+
return {"detections": detections}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
from collections import Counter
|
|
3
|
+
import torch
|
|
4
|
+
from PIL import Image
|
|
5
|
+
import numpy as np
|
|
6
|
+
from transformers import (
|
|
7
|
+
AutoProcessor,
|
|
8
|
+
AutoModelForZeroShotObjectDetection,
|
|
9
|
+
Owlv2Processor,
|
|
10
|
+
Owlv2ForObjectDetection
|
|
11
|
+
)
|
|
12
|
+
from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_CLIP_STD
|
|
13
|
+
from .abstract import ImagePlugin
|
|
14
|
+
|
|
15
|
+
SUPPORTED_MODELS = {
|
|
16
|
+
"grounding-dino-base": {
|
|
17
|
+
"model": "IDEA-Research/grounding-dino-base",
|
|
18
|
+
"model_object": AutoModelForZeroShotObjectDetection,
|
|
19
|
+
"processor": AutoProcessor,
|
|
20
|
+
"model_type": "grounding-dino"
|
|
21
|
+
},
|
|
22
|
+
"grounding-dino-tiny": {
|
|
23
|
+
"model": "IDEA-Research/grounding-dino-tiny",
|
|
24
|
+
"model_object": AutoModelForZeroShotObjectDetection,
|
|
25
|
+
"processor": AutoProcessor,
|
|
26
|
+
"model_type": "grounding-dino"
|
|
27
|
+
},
|
|
28
|
+
"owlv2-large": {
|
|
29
|
+
"model": "google/owlv2-large-patch14-finetuned",
|
|
30
|
+
"model_object": Owlv2ForObjectDetection,
|
|
31
|
+
"processor": Owlv2Processor,
|
|
32
|
+
"model_type": "google-owlv2"
|
|
33
|
+
},
|
|
34
|
+
"owlv2-base": {
|
|
35
|
+
"model": "google/owlv2-base-patch16",
|
|
36
|
+
"model_object": Owlv2ForObjectDetection,
|
|
37
|
+
"processor": Owlv2Processor,
|
|
38
|
+
"model_type": "google-owlv2"
|
|
39
|
+
},
|
|
40
|
+
"glip-large": {
|
|
41
|
+
"model": "microsoft/glip-large",
|
|
42
|
+
"model_object": AutoModelForZeroShotObjectDetection,
|
|
43
|
+
"processor": AutoProcessor,
|
|
44
|
+
"model_type": "glip"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ZeroShotDetectionPlugin(ImagePlugin):
|
|
50
|
+
"""
|
|
51
|
+
ZeroShotDetectionPlugin is a plugin for performing zero-shot object detection using the Grounding DINO model.
|
|
52
|
+
"""
|
|
53
|
+
column_name: str = "image_detections"
|
|
54
|
+
|
|
55
|
+
def __init__(self, *args, device: Optional[str] = None, **kwargs):
|
|
56
|
+
super().__init__(*args, **kwargs)
|
|
57
|
+
self._vector_model: str = kwargs.get("model_name", "grounding-dino-base")
|
|
58
|
+
self._model_info = SUPPORTED_MODELS.get(self._vector_model)
|
|
59
|
+
self.prompt: List[str] = kwargs.get("prompt", ["person"])
|
|
60
|
+
self._model_type: str = self._model_info.get("model_type", "grounding-dino")
|
|
61
|
+
self._image_threshold: float = kwargs.get("image_threshold", 0.4)
|
|
62
|
+
if not self._model_info:
|
|
63
|
+
raise ValueError(
|
|
64
|
+
f"Unsupported model name: {self._vector_model}. "
|
|
65
|
+
f"Supported models are: {list(SUPPORTED_MODELS.keys())}"
|
|
66
|
+
)
|
|
67
|
+
self.device = device or ("cuda" if torch.cuda.is_available() else "cpu")
|
|
68
|
+
|
|
69
|
+
async def start(self):
|
|
70
|
+
"""
|
|
71
|
+
Initialize the model and processor.
|
|
72
|
+
"""
|
|
73
|
+
processor = self._model_info["processor"]
|
|
74
|
+
model_object = self._model_info["model_object"]
|
|
75
|
+
model_name = self._model_info["model"]
|
|
76
|
+
if model_name == "google/owlvit-base-patch14-ensemble":
|
|
77
|
+
self.processor = processor.from_pretrained(model_name)
|
|
78
|
+
self.model = model_object.from_pretrained(model_name).to(self.device)
|
|
79
|
+
elif model_name == "google/owlv2-base-patch16":
|
|
80
|
+
self.processor = AutoProcessor.from_pretrained(model_name)
|
|
81
|
+
self.model = Owlv2ForObjectDetection.from_pretrained(model_name).to(self.device)
|
|
82
|
+
else:
|
|
83
|
+
self.processor = processor.from_pretrained(model_name)
|
|
84
|
+
self.model = model_object.from_pretrained(model_name).to(self.device)
|
|
85
|
+
self.model.eval()
|
|
86
|
+
return self
|
|
87
|
+
|
|
88
|
+
async def dispose(self):
|
|
89
|
+
"""
|
|
90
|
+
Close the model and processor.
|
|
91
|
+
"""
|
|
92
|
+
if hasattr(self, "model"):
|
|
93
|
+
del self.model
|
|
94
|
+
if hasattr(self, "processor"):
|
|
95
|
+
del self.processor
|
|
96
|
+
torch.cuda.empty_cache()
|
|
97
|
+
return self
|
|
98
|
+
|
|
99
|
+
@staticmethod
|
|
100
|
+
def _to_xyxy(box_tensor):
|
|
101
|
+
"""torch.Tensor([x1,y1,x2,y2]) → rounded python list"""
|
|
102
|
+
return [round(float(x), 2) for x in box_tensor.tolist()]
|
|
103
|
+
|
|
104
|
+
def _unnormalise(self, pixel_values):
|
|
105
|
+
px = pixel_values.squeeze().cpu().numpy() # ★ .cpu()
|
|
106
|
+
unnorm = (px * np.array(OPENAI_CLIP_STD)[:, None, None]) \
|
|
107
|
+
+ np.array(OPENAI_CLIP_MEAN)[:, None, None]
|
|
108
|
+
unnorm = (unnorm * 255).astype(np.uint8)
|
|
109
|
+
h, w = unnorm.shape[1], unnorm.shape[2]
|
|
110
|
+
return h, w
|
|
111
|
+
|
|
112
|
+
async def analyze(self, image: Image.Image, **kwargs) -> dict:
|
|
113
|
+
"""
|
|
114
|
+
Generate a vector representation of the given image.
|
|
115
|
+
|
|
116
|
+
:param image: Image Bytes opened with PIL Image.open
|
|
117
|
+
:return: Vector representation of the image.
|
|
118
|
+
"""
|
|
119
|
+
if image is None:
|
|
120
|
+
return None
|
|
121
|
+
try:
|
|
122
|
+
image = image.convert("RGB")
|
|
123
|
+
text_labels = [self.prompt]
|
|
124
|
+
args = {
|
|
125
|
+
"return_tensors": "pt",
|
|
126
|
+
"images": image,
|
|
127
|
+
"text": text_labels,
|
|
128
|
+
}
|
|
129
|
+
if self._model_type in {'google-owlv2', 'glip'}:
|
|
130
|
+
args['text'] = self.prompt # list of strings
|
|
131
|
+
# ---------- encode ----- #
|
|
132
|
+
inputs = self.processor(
|
|
133
|
+
**args
|
|
134
|
+
).to(self.device)
|
|
135
|
+
with torch.no_grad():
|
|
136
|
+
outputs = self.model(**inputs)
|
|
137
|
+
|
|
138
|
+
if self._model_type == "grounding-dino":
|
|
139
|
+
results = self.processor.post_process_grounded_object_detection(
|
|
140
|
+
outputs,
|
|
141
|
+
threshold=self._image_threshold,
|
|
142
|
+
text_threshold=0.35,
|
|
143
|
+
target_sizes=[(image.height, image.width)]
|
|
144
|
+
)[0] # batch size 1
|
|
145
|
+
boxes = results["boxes"]
|
|
146
|
+
scores = results["scores"]
|
|
147
|
+
# Grounding‑DINO returns phi indexes, map to strings:
|
|
148
|
+
if "text_labels" in results:
|
|
149
|
+
label_texts = results["text_labels"]
|
|
150
|
+
else:
|
|
151
|
+
raw_labels = results["labels"]
|
|
152
|
+
# raw_labels may be tensor, list[int], or list[str]
|
|
153
|
+
if isinstance(raw_labels[0], (int, torch.Tensor)):
|
|
154
|
+
label_texts = [self.prompt[int(i)] for i in raw_labels]
|
|
155
|
+
else: # already strings
|
|
156
|
+
label_texts = list(raw_labels)
|
|
157
|
+
elif self._model_type == "google-owlv2":
|
|
158
|
+
# Convert outputs (bounding boxes and class logits) to final bounding boxes and scores
|
|
159
|
+
h, w = self._unnormalise(inputs.pixel_values)
|
|
160
|
+
target_sizes = [(h, w)]
|
|
161
|
+
results = self.processor.post_process_grounded_object_detection(
|
|
162
|
+
outputs,
|
|
163
|
+
target_sizes=target_sizes,
|
|
164
|
+
threshold=self._image_threshold,
|
|
165
|
+
)[0] # batch size 1
|
|
166
|
+
boxes = results["boxes"]
|
|
167
|
+
scores = results["scores"]
|
|
168
|
+
# OWLv2 returns the actual text index already
|
|
169
|
+
label_ids = results["labels"]
|
|
170
|
+
# label_texts = [text_labels[i] for i in label_ids]
|
|
171
|
+
label_texts = [self.prompt[i] for i in label_ids]
|
|
172
|
+
else:
|
|
173
|
+
raise ValueError(
|
|
174
|
+
f"Unsupported model type: {self._model_type}. "
|
|
175
|
+
f"Supported models are: {list(SUPPORTED_MODELS.keys())}"
|
|
176
|
+
)
|
|
177
|
+
detections = []
|
|
178
|
+
for box, score, label in zip(boxes, scores, label_texts):
|
|
179
|
+
detection = {
|
|
180
|
+
"box": self._to_xyxy(box),
|
|
181
|
+
"score": round(float(score), 2),
|
|
182
|
+
"label": label
|
|
183
|
+
}
|
|
184
|
+
detections.append(detection)
|
|
185
|
+
counts = Counter(d["label"] for d in detections)
|
|
186
|
+
list_of_objects = sorted(counts) # unique labels, alphabetic
|
|
187
|
+
return {
|
|
188
|
+
"total_objects": len(detections),
|
|
189
|
+
"objects_detected": dict(counts),
|
|
190
|
+
"objects": list_of_objects,
|
|
191
|
+
"detections": detections
|
|
192
|
+
}
|
|
193
|
+
except Exception as e:
|
|
194
|
+
self.logger.error(
|
|
195
|
+
f"ZeroShot Detection: Error Processing Image: {e}"
|
|
196
|
+
)
|
|
197
|
+
return None
|