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,537 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ArangoDB Vector Search Tool for AI-Parrot Framework.
|
|
3
|
+
|
|
4
|
+
Provides comprehensive search capabilities including:
|
|
5
|
+
- Vector similarity search
|
|
6
|
+
- Full-text search (BM25)
|
|
7
|
+
- Hybrid search (combining vector + text)
|
|
8
|
+
- Graph traversal and context enrichment
|
|
9
|
+
"""
|
|
10
|
+
from typing import Any, Dict, List, Optional, Union
|
|
11
|
+
from enum import Enum
|
|
12
|
+
import asyncio
|
|
13
|
+
import inspect
|
|
14
|
+
from pydantic import BaseModel, Field
|
|
15
|
+
from asyncdb import AsyncDB
|
|
16
|
+
from navconfig import config
|
|
17
|
+
from datamodel.parsers.json import json_encoder # pylint: disable=E0611
|
|
18
|
+
from parrot.tools.abstract import AbstractTool, ToolResult
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SearchType(str, Enum):
|
|
22
|
+
"""Supported search types."""
|
|
23
|
+
VECTOR = "vector"
|
|
24
|
+
FULLTEXT = "fulltext"
|
|
25
|
+
HYBRID = "hybrid"
|
|
26
|
+
GRAPH_TRAVERSE = "graph_traverse"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ArangoSearchArgs(BaseModel):
|
|
30
|
+
"""Arguments schema for ArangoDB search operations."""
|
|
31
|
+
|
|
32
|
+
# Common arguments
|
|
33
|
+
search_type: SearchType = Field(
|
|
34
|
+
default=SearchType.VECTOR,
|
|
35
|
+
description="Type of search to perform: vector, fulltext, hybrid, or graph_traverse"
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
# Collection/View arguments
|
|
39
|
+
view_name: str = Field(
|
|
40
|
+
description="ArangoSearch view name for search operations"
|
|
41
|
+
)
|
|
42
|
+
collection: Optional[str] = Field(
|
|
43
|
+
default=None,
|
|
44
|
+
description="Collection name (required for vector search)"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Query arguments
|
|
48
|
+
query_text: Optional[str] = Field(
|
|
49
|
+
default=None,
|
|
50
|
+
description="Text query for full-text or hybrid search"
|
|
51
|
+
)
|
|
52
|
+
query_vector: Optional[List[float]] = Field(
|
|
53
|
+
default=None,
|
|
54
|
+
description="Query embedding vector for vector or hybrid search"
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Search parameters
|
|
58
|
+
top_k: int = Field(
|
|
59
|
+
default=10,
|
|
60
|
+
ge=1,
|
|
61
|
+
le=100,
|
|
62
|
+
description="Number of results to return"
|
|
63
|
+
)
|
|
64
|
+
score_threshold: Optional[float] = Field(
|
|
65
|
+
default=None,
|
|
66
|
+
ge=0.0,
|
|
67
|
+
le=1.0,
|
|
68
|
+
description="Minimum score threshold for results"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Vector search specific
|
|
72
|
+
vector_field: str = Field(
|
|
73
|
+
default="embedding",
|
|
74
|
+
description="Field name containing embeddings"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# Full-text search specific
|
|
78
|
+
text_fields: Optional[List[str]] = Field(
|
|
79
|
+
default=None,
|
|
80
|
+
description="Fields to search for full-text queries"
|
|
81
|
+
)
|
|
82
|
+
analyzer: str = Field(
|
|
83
|
+
default="text_en",
|
|
84
|
+
description="Text analyzer for full-text search"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Hybrid search specific
|
|
88
|
+
text_weight: float = Field(
|
|
89
|
+
default=0.5,
|
|
90
|
+
ge=0.0,
|
|
91
|
+
le=1.0,
|
|
92
|
+
description="Weight for text score in hybrid search"
|
|
93
|
+
)
|
|
94
|
+
vector_weight: float = Field(
|
|
95
|
+
default=0.5,
|
|
96
|
+
ge=0.0,
|
|
97
|
+
le=1.0,
|
|
98
|
+
description="Weight for vector similarity in hybrid search"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Filter conditions
|
|
102
|
+
filter_conditions: Optional[List[str]] = Field(
|
|
103
|
+
default=None,
|
|
104
|
+
description="Additional AQL filter conditions"
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Graph-specific arguments
|
|
108
|
+
graph_name: Optional[str] = Field(
|
|
109
|
+
default=None,
|
|
110
|
+
description="Graph name for graph operations"
|
|
111
|
+
)
|
|
112
|
+
start_vertex: Optional[str] = Field(
|
|
113
|
+
default=None,
|
|
114
|
+
description="Starting vertex for graph traversal"
|
|
115
|
+
)
|
|
116
|
+
include_graph_context: bool = Field(
|
|
117
|
+
default=False,
|
|
118
|
+
description="Include neighboring nodes in results"
|
|
119
|
+
)
|
|
120
|
+
max_depth: int = Field(
|
|
121
|
+
default=2,
|
|
122
|
+
ge=1,
|
|
123
|
+
le=5,
|
|
124
|
+
description="Maximum depth for graph traversal"
|
|
125
|
+
)
|
|
126
|
+
relation_types: Optional[List[str]] = Field(
|
|
127
|
+
default=None,
|
|
128
|
+
description="Filter by specific relationship types"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class ArangoDBSearchTool(AbstractTool):
|
|
133
|
+
"""
|
|
134
|
+
ArangoDB Vector Search Tool.
|
|
135
|
+
|
|
136
|
+
Provides unified search capabilities across vector, full-text, and graph data.
|
|
137
|
+
Supports:
|
|
138
|
+
- Semantic vector search
|
|
139
|
+
- BM25 full-text search
|
|
140
|
+
- Hybrid search combining both approaches
|
|
141
|
+
- Graph-enhanced search with relationship context
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
name = "arangodb_search"
|
|
145
|
+
description = """Search ArangoDB using vector similarity, full-text, or hybrid approaches.
|
|
146
|
+
Can also traverse graph relationships to enrich results with context."""
|
|
147
|
+
args_schema = ArangoSearchArgs
|
|
148
|
+
|
|
149
|
+
def __init__(
|
|
150
|
+
self,
|
|
151
|
+
connection_params: Optional[Dict[str, Any]] = None,
|
|
152
|
+
default_database: str = "_system",
|
|
153
|
+
default_view: Optional[str] = None,
|
|
154
|
+
default_graph: Optional[str] = None,
|
|
155
|
+
embedding_function: Optional[callable] = None,
|
|
156
|
+
**kwargs
|
|
157
|
+
):
|
|
158
|
+
"""
|
|
159
|
+
Initialize ArangoDB search tool.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
connection_params: Connection parameters for ArangoDB
|
|
163
|
+
default_database: Default database name
|
|
164
|
+
default_view: Default ArangoSearch view name
|
|
165
|
+
default_graph: Default graph name for graph operations
|
|
166
|
+
embedding_function: Function to generate embeddings from text
|
|
167
|
+
"""
|
|
168
|
+
super().__init__(**kwargs)
|
|
169
|
+
|
|
170
|
+
self.connection_params = connection_params or {
|
|
171
|
+
"host": config.get('ARANGODB_HOST', 'localhost'),
|
|
172
|
+
"port": config.get('ARANGODB_PORT', 8529),
|
|
173
|
+
"username": config.get('ARANGODB_USERNAME', 'root'),
|
|
174
|
+
"password": config.get('ARANGODB_PASSWORD', '12345678'),
|
|
175
|
+
"database": config.get('ARANGODB_DATABASE', default_database),
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
self.default_database = default_database
|
|
179
|
+
self.default_view = default_view
|
|
180
|
+
self.default_graph = default_graph
|
|
181
|
+
self.embedding_function = embedding_function
|
|
182
|
+
|
|
183
|
+
# ArangoDB connection (lazy initialization)
|
|
184
|
+
self._db: Optional[AsyncDB] = None
|
|
185
|
+
|
|
186
|
+
async def _get_connection(self) -> AsyncDB:
|
|
187
|
+
"""Get or create ArangoDB connection."""
|
|
188
|
+
if self._db is None:
|
|
189
|
+
self._db = AsyncDB("arangodb", params=self.connection_params)
|
|
190
|
+
return self._db
|
|
191
|
+
|
|
192
|
+
async def _execute(
|
|
193
|
+
self,
|
|
194
|
+
search_type: SearchType = SearchType.VECTOR,
|
|
195
|
+
view_name: Optional[str] = None,
|
|
196
|
+
collection: Optional[str] = None,
|
|
197
|
+
query_text: Optional[str] = None,
|
|
198
|
+
query_vector: Optional[List[float]] = None,
|
|
199
|
+
top_k: int = 10,
|
|
200
|
+
score_threshold: Optional[float] = None,
|
|
201
|
+
vector_field: str = "embedding",
|
|
202
|
+
text_fields: Optional[List[str]] = None,
|
|
203
|
+
analyzer: str = "text_en",
|
|
204
|
+
text_weight: float = 0.5,
|
|
205
|
+
vector_weight: float = 0.5,
|
|
206
|
+
filter_conditions: Optional[List[str]] = None,
|
|
207
|
+
graph_name: Optional[str] = None,
|
|
208
|
+
start_vertex: Optional[str] = None,
|
|
209
|
+
include_graph_context: bool = False,
|
|
210
|
+
max_depth: int = 2,
|
|
211
|
+
relation_types: Optional[List[str]] = None,
|
|
212
|
+
**kwargs
|
|
213
|
+
) -> ToolResult:
|
|
214
|
+
"""
|
|
215
|
+
Execute the search operation.
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
ToolResult containing search results and metadata
|
|
219
|
+
"""
|
|
220
|
+
try:
|
|
221
|
+
db = self._get_connection()
|
|
222
|
+
|
|
223
|
+
# Use defaults if not provided
|
|
224
|
+
view_name = view_name or self.default_view
|
|
225
|
+
graph_name = graph_name or self.default_graph
|
|
226
|
+
|
|
227
|
+
# Validate required parameters
|
|
228
|
+
if not view_name and search_type != SearchType.GRAPH_TRAVERSE:
|
|
229
|
+
return ToolResult(
|
|
230
|
+
status="error",
|
|
231
|
+
result=None,
|
|
232
|
+
error="view_name is required for search operations"
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
# Generate embedding if needed and function provided
|
|
236
|
+
if search_type in [SearchType.VECTOR, SearchType.HYBRID]:
|
|
237
|
+
if query_vector is None and query_text and self.embedding_function:
|
|
238
|
+
self.logger.info("Generating embedding from query text")
|
|
239
|
+
query_vector = await self._generate_embedding(query_text)
|
|
240
|
+
|
|
241
|
+
if query_vector is None:
|
|
242
|
+
return ToolResult(
|
|
243
|
+
status="error",
|
|
244
|
+
result=None,
|
|
245
|
+
error="query_vector is required for vector/hybrid search"
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# Execute appropriate search
|
|
249
|
+
results = []
|
|
250
|
+
metadata = {
|
|
251
|
+
"search_type": search_type.value,
|
|
252
|
+
"top_k": top_k,
|
|
253
|
+
"view_name": view_name,
|
|
254
|
+
"collection": collection
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
async with await db.connection() as conn: # pylint: disable=E1101 # noqa
|
|
258
|
+
|
|
259
|
+
if search_type == SearchType.VECTOR:
|
|
260
|
+
results = await self._vector_search(
|
|
261
|
+
conn, view_name, collection, query_vector,
|
|
262
|
+
vector_field, top_k, score_threshold, filter_conditions
|
|
263
|
+
)
|
|
264
|
+
metadata["vector_dimension"] = len(query_vector)
|
|
265
|
+
|
|
266
|
+
elif search_type == SearchType.FULLTEXT:
|
|
267
|
+
results = await self._fulltext_search(
|
|
268
|
+
conn, view_name, query_text,
|
|
269
|
+
text_fields, analyzer, top_k, score_threshold
|
|
270
|
+
)
|
|
271
|
+
metadata["analyzer"] = analyzer
|
|
272
|
+
metadata["text_fields"] = text_fields
|
|
273
|
+
|
|
274
|
+
elif search_type == SearchType.HYBRID:
|
|
275
|
+
results = await self._hybrid_search(
|
|
276
|
+
conn, view_name, collection, query_text, query_vector,
|
|
277
|
+
text_fields, vector_field, text_weight, vector_weight,
|
|
278
|
+
analyzer, top_k, filter_conditions
|
|
279
|
+
)
|
|
280
|
+
metadata["text_weight"] = text_weight
|
|
281
|
+
metadata["vector_weight"] = vector_weight
|
|
282
|
+
|
|
283
|
+
elif search_type == SearchType.GRAPH_TRAVERSE:
|
|
284
|
+
if not start_vertex:
|
|
285
|
+
return ToolResult(
|
|
286
|
+
status="error",
|
|
287
|
+
result=None,
|
|
288
|
+
error="start_vertex is required for graph traversal"
|
|
289
|
+
)
|
|
290
|
+
results = await self._graph_traverse(
|
|
291
|
+
conn, start_vertex, graph_name,
|
|
292
|
+
max_depth, relation_types, top_k
|
|
293
|
+
)
|
|
294
|
+
metadata["graph_name"] = graph_name
|
|
295
|
+
metadata["max_depth"] = max_depth
|
|
296
|
+
|
|
297
|
+
# Enrich with graph context if requested
|
|
298
|
+
if include_graph_context and graph_name and results:
|
|
299
|
+
results = await self._enrich_with_graph_context(
|
|
300
|
+
conn, results, graph_name, max_depth, relation_types
|
|
301
|
+
)
|
|
302
|
+
metadata["graph_context_included"] = True
|
|
303
|
+
|
|
304
|
+
metadata["results_count"] = len(results)
|
|
305
|
+
|
|
306
|
+
return ToolResult(
|
|
307
|
+
status="success",
|
|
308
|
+
result=results,
|
|
309
|
+
metadata=metadata
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
except Exception as e:
|
|
313
|
+
self.logger.error(f"ArangoDB search error: {e}", exc_info=True)
|
|
314
|
+
return ToolResult(
|
|
315
|
+
status="error",
|
|
316
|
+
result=None,
|
|
317
|
+
error=str(e)
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
async def _generate_embedding(self, text: str) -> List[float]:
|
|
321
|
+
"""Generate embedding from text using the configured function."""
|
|
322
|
+
if self.embedding_function is None:
|
|
323
|
+
raise ValueError("No embedding function configured")
|
|
324
|
+
|
|
325
|
+
# Handle both sync and async embedding functions
|
|
326
|
+
if inspect.iscoroutinefunction(self.embedding_function):
|
|
327
|
+
return await self.embedding_function(text)
|
|
328
|
+
else:
|
|
329
|
+
return await asyncio.get_event_loop().run_in_executor(
|
|
330
|
+
None, self.embedding_function, text
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
async def _vector_search(
|
|
334
|
+
self,
|
|
335
|
+
db: AsyncDB,
|
|
336
|
+
view_name: str,
|
|
337
|
+
collection: str,
|
|
338
|
+
query_vector: List[float],
|
|
339
|
+
vector_field: str,
|
|
340
|
+
top_k: int,
|
|
341
|
+
score_threshold: Optional[float],
|
|
342
|
+
filter_conditions: Optional[List[str]]
|
|
343
|
+
) -> List[Dict]:
|
|
344
|
+
"""Execute vector similarity search."""
|
|
345
|
+
results = await db.vector_search(
|
|
346
|
+
view_name=view_name,
|
|
347
|
+
collection=collection,
|
|
348
|
+
query_vector=query_vector,
|
|
349
|
+
vector_field=vector_field,
|
|
350
|
+
top_k=top_k,
|
|
351
|
+
filter_conditions=filter_conditions,
|
|
352
|
+
include_similarity=True
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
# Apply score threshold if specified
|
|
356
|
+
if score_threshold is not None:
|
|
357
|
+
results = [
|
|
358
|
+
r for r in results
|
|
359
|
+
if r.get('similarity', 0) >= score_threshold
|
|
360
|
+
]
|
|
361
|
+
|
|
362
|
+
return results
|
|
363
|
+
|
|
364
|
+
async def _fulltext_search(
|
|
365
|
+
self,
|
|
366
|
+
db: AsyncDB,
|
|
367
|
+
view_name: str,
|
|
368
|
+
query_text: str,
|
|
369
|
+
text_fields: Optional[List[str]],
|
|
370
|
+
analyzer: str,
|
|
371
|
+
top_k: int,
|
|
372
|
+
min_score: Optional[float]
|
|
373
|
+
) -> List[Dict]:
|
|
374
|
+
"""Execute full-text search."""
|
|
375
|
+
results = await db.fulltext_search(
|
|
376
|
+
view_name=view_name,
|
|
377
|
+
query_text=query_text,
|
|
378
|
+
fields=text_fields,
|
|
379
|
+
analyzer=analyzer,
|
|
380
|
+
top_k=top_k,
|
|
381
|
+
min_score=min_score or 0.0
|
|
382
|
+
)
|
|
383
|
+
return results
|
|
384
|
+
|
|
385
|
+
async def _hybrid_search(
|
|
386
|
+
self,
|
|
387
|
+
db: AsyncDB,
|
|
388
|
+
view_name: str,
|
|
389
|
+
collection: str,
|
|
390
|
+
query_text: str,
|
|
391
|
+
query_vector: List[float],
|
|
392
|
+
text_fields: Optional[List[str]],
|
|
393
|
+
vector_field: str,
|
|
394
|
+
text_weight: float,
|
|
395
|
+
vector_weight: float,
|
|
396
|
+
analyzer: str,
|
|
397
|
+
top_k: int,
|
|
398
|
+
filter_conditions: Optional[List[str]]
|
|
399
|
+
) -> List[Dict]:
|
|
400
|
+
"""Execute hybrid search combining vector and text."""
|
|
401
|
+
results = await db.hybrid_search(
|
|
402
|
+
view_name=view_name,
|
|
403
|
+
collection=collection,
|
|
404
|
+
query_text=query_text,
|
|
405
|
+
query_vector=query_vector,
|
|
406
|
+
text_fields=text_fields,
|
|
407
|
+
vector_field=vector_field,
|
|
408
|
+
text_weight=text_weight,
|
|
409
|
+
vector_weight=vector_weight,
|
|
410
|
+
analyzer=analyzer,
|
|
411
|
+
top_k=top_k
|
|
412
|
+
)
|
|
413
|
+
return results
|
|
414
|
+
|
|
415
|
+
async def _graph_traverse(
|
|
416
|
+
self,
|
|
417
|
+
db: AsyncDB,
|
|
418
|
+
start_vertex: str,
|
|
419
|
+
graph_name: Optional[str],
|
|
420
|
+
max_depth: int,
|
|
421
|
+
relation_types: Optional[List[str]],
|
|
422
|
+
limit: int
|
|
423
|
+
) -> List[Dict]:
|
|
424
|
+
"""Execute graph traversal."""
|
|
425
|
+
results = await db.find_related_nodes(
|
|
426
|
+
node_id=start_vertex,
|
|
427
|
+
relation_types=relation_types,
|
|
428
|
+
max_depth=max_depth,
|
|
429
|
+
limit=limit,
|
|
430
|
+
graph_name=graph_name
|
|
431
|
+
)
|
|
432
|
+
return results
|
|
433
|
+
|
|
434
|
+
async def _enrich_with_graph_context(
|
|
435
|
+
self,
|
|
436
|
+
db: AsyncDB,
|
|
437
|
+
results: List[Dict],
|
|
438
|
+
graph_name: str,
|
|
439
|
+
max_depth: int,
|
|
440
|
+
relation_types: Optional[List[str]]
|
|
441
|
+
) -> List[Dict]:
|
|
442
|
+
"""Enrich search results with graph context."""
|
|
443
|
+
enriched = []
|
|
444
|
+
|
|
445
|
+
for result in results:
|
|
446
|
+
# Extract document ID
|
|
447
|
+
doc_id = None
|
|
448
|
+
if 'document' in result:
|
|
449
|
+
doc_id = result['document'].get('_id')
|
|
450
|
+
elif '_id' in result:
|
|
451
|
+
doc_id = result['_id']
|
|
452
|
+
|
|
453
|
+
if doc_id:
|
|
454
|
+
# Get neighboring nodes
|
|
455
|
+
neighbors = await db.find_related_nodes(
|
|
456
|
+
node_id=doc_id,
|
|
457
|
+
relation_types=relation_types,
|
|
458
|
+
max_depth=max_depth,
|
|
459
|
+
limit=10,
|
|
460
|
+
graph_name=graph_name
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
result['graph_context'] = neighbors
|
|
464
|
+
|
|
465
|
+
enriched.append(result)
|
|
466
|
+
|
|
467
|
+
return enriched
|
|
468
|
+
|
|
469
|
+
async def close(self):
|
|
470
|
+
"""Close database connection."""
|
|
471
|
+
self._db = None
|
|
472
|
+
|
|
473
|
+
def __del__(self):
|
|
474
|
+
"""Cleanup on deletion."""
|
|
475
|
+
if self._db:
|
|
476
|
+
try:
|
|
477
|
+
loop = asyncio.get_event_loop()
|
|
478
|
+
if loop.is_running():
|
|
479
|
+
loop.create_task(self.close())
|
|
480
|
+
else:
|
|
481
|
+
loop.run_until_complete(self.close())
|
|
482
|
+
except Exception:
|
|
483
|
+
pass
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
# Example usage and helper functions
|
|
487
|
+
|
|
488
|
+
async def create_arangodb_search_tool(
|
|
489
|
+
connection_params: Optional[Dict] = None,
|
|
490
|
+
embedding_model: Optional[str] = None,
|
|
491
|
+
**kwargs
|
|
492
|
+
) -> ArangoDBSearchTool:
|
|
493
|
+
"""
|
|
494
|
+
Factory function to create ArangoDB search tool with embedding support.
|
|
495
|
+
|
|
496
|
+
Args:
|
|
497
|
+
connection_params: ArangoDB connection parameters
|
|
498
|
+
embedding_model: Hugging Face model name for embeddings
|
|
499
|
+
**kwargs: Additional tool configuration
|
|
500
|
+
|
|
501
|
+
Returns:
|
|
502
|
+
Configured ArangoDBSearchTool instance
|
|
503
|
+
"""
|
|
504
|
+
embedding_function = None
|
|
505
|
+
|
|
506
|
+
if embedding_model:
|
|
507
|
+
from transformers import AutoTokenizer, AutoModel
|
|
508
|
+
import torch
|
|
509
|
+
|
|
510
|
+
# Load model and tokenizer
|
|
511
|
+
tokenizer = AutoTokenizer.from_pretrained(embedding_model)
|
|
512
|
+
model = AutoModel.from_pretrained(embedding_model)
|
|
513
|
+
|
|
514
|
+
def generate_embedding(text: str) -> List[float]:
|
|
515
|
+
"""Generate embedding using transformers."""
|
|
516
|
+
inputs = tokenizer(
|
|
517
|
+
text,
|
|
518
|
+
return_tensors="pt",
|
|
519
|
+
truncation=True,
|
|
520
|
+
max_length=512,
|
|
521
|
+
padding=True
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
with torch.no_grad():
|
|
525
|
+
outputs = model(**inputs)
|
|
526
|
+
|
|
527
|
+
# Use mean pooling
|
|
528
|
+
embeddings = outputs.last_hidden_state.mean(dim=1)
|
|
529
|
+
return embeddings[0].tolist()
|
|
530
|
+
|
|
531
|
+
embedding_function = generate_embedding
|
|
532
|
+
|
|
533
|
+
return ArangoDBSearchTool(
|
|
534
|
+
connection_params=connection_params,
|
|
535
|
+
embedding_function=embedding_function,
|
|
536
|
+
**kwargs
|
|
537
|
+
)
|