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,457 @@
|
|
|
1
|
+
"""
|
|
2
|
+
LocalKB: Knowledge Base from local text and markdown files with FAISS vector store.
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
from typing import List, Dict, Any, Tuple, Optional
|
|
6
|
+
import re
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import asyncio
|
|
9
|
+
import time
|
|
10
|
+
from navconfig.logging import logging
|
|
11
|
+
from .abstract import AbstractKnowledgeBase
|
|
12
|
+
from ..faiss_store import FAISSStore
|
|
13
|
+
from ..models import Document
|
|
14
|
+
from ...utils.helpers import RequestContext
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class LocalKB(AbstractKnowledgeBase):
|
|
18
|
+
"""
|
|
19
|
+
Local Knowledge Base that loads markdown and text documents from a local directory.
|
|
20
|
+
|
|
21
|
+
Uses FAISS for semantic search with disk persistence for fast loading.
|
|
22
|
+
Ideal for agent-specific knowledge like:
|
|
23
|
+
- Database query patterns
|
|
24
|
+
- Tool usage examples
|
|
25
|
+
- Domain-specific procedures
|
|
26
|
+
- Analysis templates
|
|
27
|
+
|
|
28
|
+
Example structure:
|
|
29
|
+
AGENTS_DIR/
|
|
30
|
+
└── my_agent/
|
|
31
|
+
└── kb/
|
|
32
|
+
├── database_queries.md
|
|
33
|
+
├── prophet_forecast.md
|
|
34
|
+
└── tool_examples.md
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
name: str,
|
|
40
|
+
kb_directory: Path,
|
|
41
|
+
category: str = "local",
|
|
42
|
+
description: str = None,
|
|
43
|
+
activation_patterns: List[str] = None,
|
|
44
|
+
embedding_model: str = "sentence-transformers/all-mpnet-base-v2",
|
|
45
|
+
dimension: int = 384,
|
|
46
|
+
chunk_size: int = 4096,
|
|
47
|
+
chunk_overlap: int = 100,
|
|
48
|
+
always_active: bool = True,
|
|
49
|
+
auto_load: bool = True,
|
|
50
|
+
**kwargs
|
|
51
|
+
):
|
|
52
|
+
"""
|
|
53
|
+
Initialize LocalKB.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
name: Name of the KB (e.g., agent name)
|
|
57
|
+
kb_directory: Path to directory containing .md and .txt files
|
|
58
|
+
category: Category identifier
|
|
59
|
+
description: KB description
|
|
60
|
+
activation_patterns: Patterns that activate this KB
|
|
61
|
+
embedding_model: Model for embeddings
|
|
62
|
+
dimension: Embedding dimension
|
|
63
|
+
chunk_size: Size of text chunks
|
|
64
|
+
chunk_overlap: Overlap between chunks
|
|
65
|
+
always_active: Always include in context
|
|
66
|
+
auto_load: Load on initialization
|
|
67
|
+
"""
|
|
68
|
+
super().__init__(
|
|
69
|
+
name=name,
|
|
70
|
+
category=category,
|
|
71
|
+
description=description or f"{name} local knowledge base",
|
|
72
|
+
activation_patterns=activation_patterns or [],
|
|
73
|
+
always_active=always_active,
|
|
74
|
+
priority=10 # High priority for local KB
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
self.kb_directory = Path(kb_directory)
|
|
78
|
+
self.chunk_size = chunk_size
|
|
79
|
+
self.chunk_overlap = chunk_overlap
|
|
80
|
+
self.dimension = dimension
|
|
81
|
+
self.logger = logging.getLogger(__name__)
|
|
82
|
+
|
|
83
|
+
# FAISS store with persistence
|
|
84
|
+
self.faiss_store = FAISSStore(
|
|
85
|
+
collection_name=f"{name}_local_kb",
|
|
86
|
+
embedding_model=embedding_model,
|
|
87
|
+
distance_strategy="COSINE",
|
|
88
|
+
index_type="HNSW", # Use HNSW for large KBs
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Cache file for persistence
|
|
92
|
+
self.cache_file = self.kb_directory / ".kb_cache.faiss"
|
|
93
|
+
|
|
94
|
+
# Track loaded files for change detection
|
|
95
|
+
self._loaded_files: Dict[str, float] = {} # filename -> mtime
|
|
96
|
+
self._is_loaded = False
|
|
97
|
+
|
|
98
|
+
if auto_load:
|
|
99
|
+
# Load synchronously during init
|
|
100
|
+
try:
|
|
101
|
+
loop = asyncio.get_event_loop()
|
|
102
|
+
if loop.is_running():
|
|
103
|
+
# Schedule for later if loop is running
|
|
104
|
+
asyncio.create_task(self.load_documents())
|
|
105
|
+
else:
|
|
106
|
+
# Run immediately if no loop
|
|
107
|
+
loop.run_until_complete(self.load_documents())
|
|
108
|
+
except RuntimeError:
|
|
109
|
+
# No loop available, will load on first search
|
|
110
|
+
pass
|
|
111
|
+
|
|
112
|
+
async def should_activate(
|
|
113
|
+
self,
|
|
114
|
+
query: str,
|
|
115
|
+
context: Dict[str, Any]
|
|
116
|
+
) -> Tuple[bool, float]:
|
|
117
|
+
"""
|
|
118
|
+
Determine if KB should activate.
|
|
119
|
+
For local KB, usually always active.
|
|
120
|
+
"""
|
|
121
|
+
if self.always_active:
|
|
122
|
+
return True, 1.0
|
|
123
|
+
|
|
124
|
+
# Check activation patterns
|
|
125
|
+
query_lower = query.lower()
|
|
126
|
+
for pattern in self.activation_patterns:
|
|
127
|
+
if pattern.lower() in query_lower:
|
|
128
|
+
return True, 0.9
|
|
129
|
+
|
|
130
|
+
return False, 0.0
|
|
131
|
+
|
|
132
|
+
async def load_documents(self, force_reload: bool = False) -> int:
|
|
133
|
+
"""
|
|
134
|
+
Load markdown documents from kb_directory into FAISS.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
force_reload: Force reload even if cache exists
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Number of documents loaded
|
|
141
|
+
"""
|
|
142
|
+
# Create kb directory if doesn't exist
|
|
143
|
+
self.kb_directory.mkdir(parents=True, exist_ok=True)
|
|
144
|
+
|
|
145
|
+
# Find all markdown and text files
|
|
146
|
+
local_files = list(self.kb_directory.glob("*.md")) + list(self.kb_directory.glob("*.txt"))
|
|
147
|
+
|
|
148
|
+
if not local_files:
|
|
149
|
+
self.logger.warning(
|
|
150
|
+
f"No markdown or text files found in {self.kb_directory}"
|
|
151
|
+
)
|
|
152
|
+
return 0
|
|
153
|
+
|
|
154
|
+
# Create a map of file modifications
|
|
155
|
+
current_loaded_files = {
|
|
156
|
+
f.name: f.stat().st_mtime for f in local_files
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if self._is_loaded and not force_reload:
|
|
160
|
+
# Check if we need to reload based on file changes
|
|
161
|
+
if self._loaded_files == current_loaded_files:
|
|
162
|
+
self.logger.debug(
|
|
163
|
+
f"KB: '{self.name}' already loaded and up to date"
|
|
164
|
+
)
|
|
165
|
+
return 0
|
|
166
|
+
|
|
167
|
+
# Check if cache exists and is valid
|
|
168
|
+
if self.cache_file.exists() and not force_reload:
|
|
169
|
+
try:
|
|
170
|
+
# Check cache validity
|
|
171
|
+
cache_mtime = self.cache_file.stat().st_mtime
|
|
172
|
+
# Cache must be newer than all source files
|
|
173
|
+
is_cache_valid = all(
|
|
174
|
+
cache_mtime > mtime for mtime in current_loaded_files.values()
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
if is_cache_valid:
|
|
178
|
+
await self._load_from_cache()
|
|
179
|
+
self._is_loaded = True
|
|
180
|
+
# IMPORTANT: Populate _loaded_files so change detection works
|
|
181
|
+
self._loaded_files = current_loaded_files
|
|
182
|
+
self.logger.info(
|
|
183
|
+
f"Loaded KB '{self.name}' from cache (valid as of {time.ctime(cache_mtime)})"
|
|
184
|
+
)
|
|
185
|
+
return 0
|
|
186
|
+
else:
|
|
187
|
+
self.logger.debug(
|
|
188
|
+
f"KB cache for '{self.name}' is stale, reloading..."
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
except Exception as e:
|
|
192
|
+
self.logger.warning(
|
|
193
|
+
f"Failed to load cache: {e}, rebuilding..."
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
self.logger.info(
|
|
197
|
+
f"Loading {len(local_files)} markdown and text files into KB '{self.name}'"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# Process each file
|
|
201
|
+
documents = []
|
|
202
|
+
for local_file in local_files:
|
|
203
|
+
try:
|
|
204
|
+
content = local_file.read_text(encoding='utf-8')
|
|
205
|
+
|
|
206
|
+
# Split into chunks
|
|
207
|
+
chunks = self._chunk_markdown(content, local_file.name)
|
|
208
|
+
|
|
209
|
+
# Create Document objects
|
|
210
|
+
for i, chunk_text in enumerate(chunks):
|
|
211
|
+
doc = Document(
|
|
212
|
+
page_content=chunk_text,
|
|
213
|
+
metadata={
|
|
214
|
+
'source': local_file.name,
|
|
215
|
+
'kb_name': self.name,
|
|
216
|
+
'chunk_id': i,
|
|
217
|
+
'total_chunks': len(chunks),
|
|
218
|
+
'file_path': str(local_file),
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
documents.append(doc)
|
|
222
|
+
|
|
223
|
+
# Track file modification time
|
|
224
|
+
self._loaded_files[local_file.name] = local_file.stat().st_mtime
|
|
225
|
+
|
|
226
|
+
except Exception as e:
|
|
227
|
+
self.logger.error(
|
|
228
|
+
f"Error processing {local_file.name}: {e}"
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
if not documents:
|
|
232
|
+
self.logger.warning("No documents to load")
|
|
233
|
+
return 0
|
|
234
|
+
|
|
235
|
+
# Initialize FAISS store
|
|
236
|
+
await self.faiss_store.connection()
|
|
237
|
+
|
|
238
|
+
# Define collection
|
|
239
|
+
self.faiss_store.define_collection_table(
|
|
240
|
+
collection_name=f"{self.name}_local_kb",
|
|
241
|
+
dimension=self.dimension
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
# Add documents to FAISS
|
|
245
|
+
await self.faiss_store.add_documents(
|
|
246
|
+
documents=documents,
|
|
247
|
+
collection=f"{self.name}_local_kb"
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
# Save to cache
|
|
251
|
+
await self._save_to_cache()
|
|
252
|
+
|
|
253
|
+
self._is_loaded = True
|
|
254
|
+
|
|
255
|
+
self.logger.info(
|
|
256
|
+
f"Successfully loaded {len(documents)} chunks from "
|
|
257
|
+
f"{len(local_files)} files into KB '{self.name}'"
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
return len(documents)
|
|
261
|
+
|
|
262
|
+
def _chunk_markdown(
|
|
263
|
+
self,
|
|
264
|
+
content: str,
|
|
265
|
+
filename: str
|
|
266
|
+
) -> List[str]:
|
|
267
|
+
"""
|
|
268
|
+
Chunk markdown content intelligently by sections.
|
|
269
|
+
|
|
270
|
+
Preserves:
|
|
271
|
+
- Headers and their content together
|
|
272
|
+
- Code blocks intact
|
|
273
|
+
- Lists intact
|
|
274
|
+
"""
|
|
275
|
+
chunks = []
|
|
276
|
+
|
|
277
|
+
# Split by markdown headers
|
|
278
|
+
sections = re.split(r'\n(#{1,6}\s+.+)\n', content)
|
|
279
|
+
|
|
280
|
+
current_chunk = []
|
|
281
|
+
current_size = 0
|
|
282
|
+
|
|
283
|
+
for i, section in enumerate(sections):
|
|
284
|
+
section = section.strip()
|
|
285
|
+
if not section:
|
|
286
|
+
continue
|
|
287
|
+
|
|
288
|
+
section_size = len(section)
|
|
289
|
+
|
|
290
|
+
# If section is too large, split it
|
|
291
|
+
if section_size > self.chunk_size:
|
|
292
|
+
if current_chunk:
|
|
293
|
+
chunks.append('\n'.join(current_chunk))
|
|
294
|
+
current_chunk = []
|
|
295
|
+
current_size = 0
|
|
296
|
+
|
|
297
|
+
# Split large section by paragraphs
|
|
298
|
+
paragraphs = section.split('\n\n')
|
|
299
|
+
for para in paragraphs:
|
|
300
|
+
para = para.strip()
|
|
301
|
+
if not para:
|
|
302
|
+
continue
|
|
303
|
+
|
|
304
|
+
if current_size + len(para) > self.chunk_size:
|
|
305
|
+
if current_chunk:
|
|
306
|
+
chunks.append('\n'.join(current_chunk))
|
|
307
|
+
current_chunk = [para]
|
|
308
|
+
current_size = len(para)
|
|
309
|
+
else:
|
|
310
|
+
current_chunk.append(para)
|
|
311
|
+
current_size += len(para)
|
|
312
|
+
|
|
313
|
+
# Normal section fits in chunk
|
|
314
|
+
elif current_size + section_size > self.chunk_size:
|
|
315
|
+
if current_chunk:
|
|
316
|
+
chunks.append('\n'.join(current_chunk))
|
|
317
|
+
current_chunk = [section]
|
|
318
|
+
current_size = section_size
|
|
319
|
+
else:
|
|
320
|
+
current_chunk.append(section)
|
|
321
|
+
current_size += section_size
|
|
322
|
+
|
|
323
|
+
# Add remaining
|
|
324
|
+
if current_chunk:
|
|
325
|
+
chunks.append('\n'.join(current_chunk))
|
|
326
|
+
|
|
327
|
+
return chunks
|
|
328
|
+
|
|
329
|
+
async def search(
|
|
330
|
+
self,
|
|
331
|
+
query: str,
|
|
332
|
+
k: int = 5,
|
|
333
|
+
score_threshold: float = 0.5,
|
|
334
|
+
user_id: str = None,
|
|
335
|
+
session_id: str = None,
|
|
336
|
+
ctx: RequestContext = None,
|
|
337
|
+
**kwargs
|
|
338
|
+
) -> List[Dict[str, Any]]:
|
|
339
|
+
"""
|
|
340
|
+
Search for relevant knowledge in markdown files.
|
|
341
|
+
|
|
342
|
+
Args:
|
|
343
|
+
query: Search query
|
|
344
|
+
k: Number of results
|
|
345
|
+
score_threshold: Minimum similarity score
|
|
346
|
+
|
|
347
|
+
Returns:
|
|
348
|
+
List of relevant chunks with metadata
|
|
349
|
+
"""
|
|
350
|
+
# Ensure documents are loaded
|
|
351
|
+
if not self._is_loaded:
|
|
352
|
+
await self.load_documents()
|
|
353
|
+
|
|
354
|
+
# Check if files changed
|
|
355
|
+
await self._check_file_changes()
|
|
356
|
+
|
|
357
|
+
try:
|
|
358
|
+
# Search FAISS
|
|
359
|
+
results = await self.faiss_store.asearch(
|
|
360
|
+
query=query,
|
|
361
|
+
k=k,
|
|
362
|
+
collection=f"{self.name}_local_kb",
|
|
363
|
+
score_threshold=score_threshold
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
# Format results
|
|
367
|
+
formatted_results = []
|
|
368
|
+
formatted_results.extend(
|
|
369
|
+
{
|
|
370
|
+
'content': result.content,
|
|
371
|
+
'metadata': result.metadata,
|
|
372
|
+
'score': result.score,
|
|
373
|
+
'source': result.metadata.get('source', 'unknown')
|
|
374
|
+
} for result in results
|
|
375
|
+
)
|
|
376
|
+
return formatted_results
|
|
377
|
+
|
|
378
|
+
except Exception as e:
|
|
379
|
+
self.logger.error(f"Search error in KB '{self.name}': {e}")
|
|
380
|
+
return []
|
|
381
|
+
|
|
382
|
+
async def _check_file_changes(self) -> bool:
|
|
383
|
+
"""
|
|
384
|
+
Check if any markdown files have changed.
|
|
385
|
+
If changed, trigger reload.
|
|
386
|
+
|
|
387
|
+
Returns:
|
|
388
|
+
True if files changed
|
|
389
|
+
"""
|
|
390
|
+
changed = False
|
|
391
|
+
local_files = list(self.kb_directory.glob("*.md")) + list(self.kb_directory.glob("*.txt"))
|
|
392
|
+
for local_file in local_files:
|
|
393
|
+
filename = local_file.name
|
|
394
|
+
current_mtime = local_file.stat().st_mtime
|
|
395
|
+
|
|
396
|
+
if filename not in self._loaded_files:
|
|
397
|
+
changed = True
|
|
398
|
+
break
|
|
399
|
+
|
|
400
|
+
if current_mtime != self._loaded_files[filename]:
|
|
401
|
+
changed = True
|
|
402
|
+
break
|
|
403
|
+
|
|
404
|
+
if changed:
|
|
405
|
+
self.logger.info(
|
|
406
|
+
f"KB files changed, reloading '{self.name}'"
|
|
407
|
+
)
|
|
408
|
+
await self.load_documents(force_reload=True)
|
|
409
|
+
|
|
410
|
+
return changed
|
|
411
|
+
|
|
412
|
+
async def _save_to_cache(self) -> None:
|
|
413
|
+
"""Save FAISS index to cache file."""
|
|
414
|
+
try:
|
|
415
|
+
self.faiss_store.save(self.cache_file)
|
|
416
|
+
self.logger.debug(f"Saved KB cache to {self.cache_file}")
|
|
417
|
+
except Exception as e:
|
|
418
|
+
self.logger.warning(f"Failed to save cache: {e}")
|
|
419
|
+
|
|
420
|
+
async def _load_from_cache(self) -> None:
|
|
421
|
+
"""Load FAISS index from cache file."""
|
|
422
|
+
await self.faiss_store.connection()
|
|
423
|
+
self.faiss_store.load(self.cache_file)
|
|
424
|
+
self.logger.debug(f"Loaded KB cache from {self.cache_file}")
|
|
425
|
+
|
|
426
|
+
def format_context(self, results: List[Dict]) -> str:
|
|
427
|
+
"""
|
|
428
|
+
Format search results for prompt injection.
|
|
429
|
+
|
|
430
|
+
Groups results by source file for clarity.
|
|
431
|
+
"""
|
|
432
|
+
if not results:
|
|
433
|
+
return ""
|
|
434
|
+
|
|
435
|
+
lines = [f"\n## {self.name} Useful Facts:", ""]
|
|
436
|
+
|
|
437
|
+
# Group by source file
|
|
438
|
+
by_source: Dict[str, List[Dict]] = {}
|
|
439
|
+
for result in results:
|
|
440
|
+
source = result['metadata'].get('source', 'unknown')
|
|
441
|
+
if source not in by_source:
|
|
442
|
+
by_source[source] = []
|
|
443
|
+
by_source[source].append(result)
|
|
444
|
+
|
|
445
|
+
# Format each source
|
|
446
|
+
for source, source_results in by_source.items():
|
|
447
|
+
lines.append(f"## From {source}:")
|
|
448
|
+
for result in source_results:
|
|
449
|
+
content = result['content'].strip()
|
|
450
|
+
lines.extend((content, ""))
|
|
451
|
+
|
|
452
|
+
return "\n".join(lines)
|
|
453
|
+
|
|
454
|
+
async def close(self):
|
|
455
|
+
"""Cleanup resources."""
|
|
456
|
+
if self.faiss_store:
|
|
457
|
+
await self.faiss_store.disconnect()
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
SELECTION_PROMPT = """You are a Knowledge Base Router that determines which knowledge sources are needed to answer a user's question.
|
|
2
|
+
|
|
3
|
+
Available Knowledge Bases:
|
|
4
|
+
{kb_descriptions}
|
|
5
|
+
|
|
6
|
+
User Question: {question}
|
|
7
|
+
|
|
8
|
+
TASK: Analyze the question and determine which knowledge bases would be helpful to answer it.
|
|
9
|
+
|
|
10
|
+
SELECTION CRITERIA:
|
|
11
|
+
1. Only select KBs that directly relate to the question
|
|
12
|
+
2. Consider implicit needs (e.g., "my tasks" needs UserProfile for identity)
|
|
13
|
+
3. Prioritize specificity over general knowledge
|
|
14
|
+
4. If uncertain, prefer including a KB over excluding it
|
|
15
|
+
|
|
16
|
+
OUTPUT AS JSON FORMAT:
|
|
17
|
+
{{
|
|
18
|
+
"selected_kbs": [
|
|
19
|
+
{{
|
|
20
|
+
"name": "KB_NAME",
|
|
21
|
+
"reason": "Brief explanation",
|
|
22
|
+
"confidence": 0.9
|
|
23
|
+
}}
|
|
24
|
+
],
|
|
25
|
+
"reasoning": "Overall strategy explanation"
|
|
26
|
+
}}
|
|
27
|
+
|
|
28
|
+
Return ONLY valid JSON, no additional text, no markdown formatting."""
|