ai-parrot 0.17.2__cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentui/.prettierrc +15 -0
- agentui/QUICKSTART.md +272 -0
- agentui/README.md +59 -0
- agentui/env.example +16 -0
- agentui/jsconfig.json +14 -0
- agentui/package-lock.json +4242 -0
- agentui/package.json +34 -0
- agentui/scripts/postinstall/apply-patches.mjs +260 -0
- agentui/src/app.css +61 -0
- agentui/src/app.d.ts +13 -0
- agentui/src/app.html +12 -0
- agentui/src/components/LoadingSpinner.svelte +64 -0
- agentui/src/components/ThemeSwitcher.svelte +159 -0
- agentui/src/components/index.js +4 -0
- agentui/src/lib/api/bots.ts +60 -0
- agentui/src/lib/api/chat.ts +22 -0
- agentui/src/lib/api/http.ts +25 -0
- agentui/src/lib/components/BotCard.svelte +33 -0
- agentui/src/lib/components/ChatBubble.svelte +63 -0
- agentui/src/lib/components/Toast.svelte +21 -0
- agentui/src/lib/config.ts +20 -0
- agentui/src/lib/stores/auth.svelte.ts +73 -0
- agentui/src/lib/stores/theme.svelte.js +64 -0
- agentui/src/lib/stores/toast.svelte.ts +31 -0
- agentui/src/lib/utils/conversation.ts +39 -0
- agentui/src/routes/+layout.svelte +20 -0
- agentui/src/routes/+page.svelte +232 -0
- agentui/src/routes/login/+page.svelte +200 -0
- agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
- agentui/src/routes/talk/[agentId]/+page.ts +7 -0
- agentui/static/README.md +1 -0
- agentui/svelte.config.js +11 -0
- agentui/tailwind.config.ts +53 -0
- agentui/tsconfig.json +3 -0
- agentui/vite.config.ts +10 -0
- ai_parrot-0.17.2.dist-info/METADATA +472 -0
- ai_parrot-0.17.2.dist-info/RECORD +535 -0
- ai_parrot-0.17.2.dist-info/WHEEL +6 -0
- ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
- ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
- ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
- crew-builder/.prettierrc +15 -0
- crew-builder/QUICKSTART.md +259 -0
- crew-builder/README.md +113 -0
- crew-builder/env.example +17 -0
- crew-builder/jsconfig.json +14 -0
- crew-builder/package-lock.json +4182 -0
- crew-builder/package.json +37 -0
- crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
- crew-builder/src/app.css +62 -0
- crew-builder/src/app.d.ts +13 -0
- crew-builder/src/app.html +12 -0
- crew-builder/src/components/LoadingSpinner.svelte +64 -0
- crew-builder/src/components/ThemeSwitcher.svelte +149 -0
- crew-builder/src/components/index.js +9 -0
- crew-builder/src/lib/api/bots.ts +60 -0
- crew-builder/src/lib/api/chat.ts +80 -0
- crew-builder/src/lib/api/client.ts +56 -0
- crew-builder/src/lib/api/crew/crew.ts +136 -0
- crew-builder/src/lib/api/index.ts +5 -0
- crew-builder/src/lib/api/o365/auth.ts +65 -0
- crew-builder/src/lib/auth/auth.ts +54 -0
- crew-builder/src/lib/components/AgentNode.svelte +43 -0
- crew-builder/src/lib/components/BotCard.svelte +33 -0
- crew-builder/src/lib/components/ChatBubble.svelte +67 -0
- crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
- crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
- crew-builder/src/lib/components/JsonViewer.svelte +24 -0
- crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
- crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
- crew-builder/src/lib/components/Toast.svelte +67 -0
- crew-builder/src/lib/components/Toolbar.svelte +157 -0
- crew-builder/src/lib/components/index.ts +10 -0
- crew-builder/src/lib/config.ts +8 -0
- crew-builder/src/lib/stores/auth.svelte.ts +228 -0
- crew-builder/src/lib/stores/crewStore.ts +369 -0
- crew-builder/src/lib/stores/theme.svelte.js +145 -0
- crew-builder/src/lib/stores/toast.svelte.ts +69 -0
- crew-builder/src/lib/utils/conversation.ts +39 -0
- crew-builder/src/lib/utils/markdown.ts +122 -0
- crew-builder/src/lib/utils/talkHistory.ts +47 -0
- crew-builder/src/routes/+layout.svelte +20 -0
- crew-builder/src/routes/+page.svelte +539 -0
- crew-builder/src/routes/agents/+page.svelte +247 -0
- crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
- crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
- crew-builder/src/routes/builder/+page.svelte +204 -0
- crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
- crew-builder/src/routes/crew/ask/+page.ts +1 -0
- crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
- crew-builder/src/routes/login/+page.svelte +197 -0
- crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
- crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
- crew-builder/static/README.md +1 -0
- crew-builder/svelte.config.js +11 -0
- crew-builder/tailwind.config.ts +53 -0
- crew-builder/tsconfig.json +3 -0
- crew-builder/vite.config.ts +10 -0
- mcp_servers/calculator_server.py +309 -0
- parrot/__init__.py +27 -0
- parrot/__pycache__/__init__.cpython-310.pyc +0 -0
- parrot/__pycache__/version.cpython-310.pyc +0 -0
- parrot/_version.py +34 -0
- parrot/a2a/__init__.py +48 -0
- parrot/a2a/client.py +658 -0
- parrot/a2a/discovery.py +89 -0
- parrot/a2a/mixin.py +257 -0
- parrot/a2a/models.py +376 -0
- parrot/a2a/server.py +770 -0
- parrot/agents/__init__.py +29 -0
- parrot/bots/__init__.py +12 -0
- parrot/bots/a2a_agent.py +19 -0
- parrot/bots/abstract.py +3139 -0
- parrot/bots/agent.py +1129 -0
- parrot/bots/basic.py +9 -0
- parrot/bots/chatbot.py +669 -0
- parrot/bots/data.py +1618 -0
- parrot/bots/database/__init__.py +5 -0
- parrot/bots/database/abstract.py +3071 -0
- parrot/bots/database/cache.py +286 -0
- parrot/bots/database/models.py +468 -0
- parrot/bots/database/prompts.py +154 -0
- parrot/bots/database/retries.py +98 -0
- parrot/bots/database/router.py +269 -0
- parrot/bots/database/sql.py +41 -0
- parrot/bots/db/__init__.py +6 -0
- parrot/bots/db/abstract.py +556 -0
- parrot/bots/db/bigquery.py +602 -0
- parrot/bots/db/cache.py +85 -0
- parrot/bots/db/documentdb.py +668 -0
- parrot/bots/db/elastic.py +1014 -0
- parrot/bots/db/influx.py +898 -0
- parrot/bots/db/mock.py +96 -0
- parrot/bots/db/multi.py +783 -0
- parrot/bots/db/prompts.py +185 -0
- parrot/bots/db/sql.py +1255 -0
- parrot/bots/db/tools.py +212 -0
- parrot/bots/document.py +680 -0
- parrot/bots/hrbot.py +15 -0
- parrot/bots/kb.py +170 -0
- parrot/bots/mcp.py +36 -0
- parrot/bots/orchestration/README.md +463 -0
- parrot/bots/orchestration/__init__.py +1 -0
- parrot/bots/orchestration/agent.py +155 -0
- parrot/bots/orchestration/crew.py +3330 -0
- parrot/bots/orchestration/fsm.py +1179 -0
- parrot/bots/orchestration/hr.py +434 -0
- parrot/bots/orchestration/storage/__init__.py +4 -0
- parrot/bots/orchestration/storage/memory.py +100 -0
- parrot/bots/orchestration/storage/mixin.py +119 -0
- parrot/bots/orchestration/verify.py +202 -0
- parrot/bots/product.py +204 -0
- parrot/bots/prompts/__init__.py +96 -0
- parrot/bots/prompts/agents.py +155 -0
- parrot/bots/prompts/data.py +216 -0
- parrot/bots/prompts/output_generation.py +8 -0
- parrot/bots/scraper/__init__.py +3 -0
- parrot/bots/scraper/models.py +122 -0
- parrot/bots/scraper/scraper.py +1173 -0
- parrot/bots/scraper/templates.py +115 -0
- parrot/bots/stores/__init__.py +5 -0
- parrot/bots/stores/local.py +172 -0
- parrot/bots/webdev.py +81 -0
- parrot/cli.py +17 -0
- parrot/clients/__init__.py +16 -0
- parrot/clients/base.py +1491 -0
- parrot/clients/claude.py +1191 -0
- parrot/clients/factory.py +129 -0
- parrot/clients/google.py +4567 -0
- parrot/clients/gpt.py +1975 -0
- parrot/clients/grok.py +432 -0
- parrot/clients/groq.py +986 -0
- parrot/clients/hf.py +582 -0
- parrot/clients/models.py +18 -0
- parrot/conf.py +395 -0
- parrot/embeddings/__init__.py +9 -0
- parrot/embeddings/base.py +157 -0
- parrot/embeddings/google.py +98 -0
- parrot/embeddings/huggingface.py +74 -0
- parrot/embeddings/openai.py +84 -0
- parrot/embeddings/processor.py +88 -0
- parrot/exceptions.c +13868 -0
- parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/exceptions.pxd +22 -0
- parrot/exceptions.pxi +15 -0
- parrot/exceptions.pyx +44 -0
- parrot/generators/__init__.py +29 -0
- parrot/generators/base.py +200 -0
- parrot/generators/html.py +293 -0
- parrot/generators/react.py +205 -0
- parrot/generators/streamlit.py +203 -0
- parrot/generators/template.py +105 -0
- parrot/handlers/__init__.py +4 -0
- parrot/handlers/agent.py +861 -0
- parrot/handlers/agents/__init__.py +1 -0
- parrot/handlers/agents/abstract.py +900 -0
- parrot/handlers/bots.py +338 -0
- parrot/handlers/chat.py +915 -0
- parrot/handlers/creation.sql +192 -0
- parrot/handlers/crew/ARCHITECTURE.md +362 -0
- parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
- parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
- parrot/handlers/crew/__init__.py +0 -0
- parrot/handlers/crew/handler.py +801 -0
- parrot/handlers/crew/models.py +229 -0
- parrot/handlers/crew/redis_persistence.py +523 -0
- parrot/handlers/jobs/__init__.py +10 -0
- parrot/handlers/jobs/job.py +384 -0
- parrot/handlers/jobs/mixin.py +627 -0
- parrot/handlers/jobs/models.py +115 -0
- parrot/handlers/jobs/worker.py +31 -0
- parrot/handlers/models.py +596 -0
- parrot/handlers/o365_auth.py +105 -0
- parrot/handlers/stream.py +337 -0
- parrot/interfaces/__init__.py +6 -0
- parrot/interfaces/aws.py +143 -0
- parrot/interfaces/credentials.py +113 -0
- parrot/interfaces/database.py +27 -0
- parrot/interfaces/google.py +1123 -0
- parrot/interfaces/hierarchy.py +1227 -0
- parrot/interfaces/http.py +651 -0
- parrot/interfaces/images/__init__.py +0 -0
- parrot/interfaces/images/plugins/__init__.py +24 -0
- parrot/interfaces/images/plugins/abstract.py +58 -0
- parrot/interfaces/images/plugins/analisys.py +148 -0
- parrot/interfaces/images/plugins/classify.py +150 -0
- parrot/interfaces/images/plugins/classifybase.py +182 -0
- parrot/interfaces/images/plugins/detect.py +150 -0
- parrot/interfaces/images/plugins/exif.py +1103 -0
- parrot/interfaces/images/plugins/hash.py +52 -0
- parrot/interfaces/images/plugins/vision.py +104 -0
- parrot/interfaces/images/plugins/yolo.py +66 -0
- parrot/interfaces/images/plugins/zerodetect.py +197 -0
- parrot/interfaces/o365.py +978 -0
- parrot/interfaces/onedrive.py +822 -0
- parrot/interfaces/sharepoint.py +1435 -0
- parrot/interfaces/soap.py +257 -0
- parrot/loaders/__init__.py +8 -0
- parrot/loaders/abstract.py +1131 -0
- parrot/loaders/audio.py +199 -0
- parrot/loaders/basepdf.py +53 -0
- parrot/loaders/basevideo.py +1568 -0
- parrot/loaders/csv.py +409 -0
- parrot/loaders/docx.py +116 -0
- parrot/loaders/epubloader.py +316 -0
- parrot/loaders/excel.py +199 -0
- parrot/loaders/factory.py +55 -0
- parrot/loaders/files/__init__.py +0 -0
- parrot/loaders/files/abstract.py +39 -0
- parrot/loaders/files/html.py +26 -0
- parrot/loaders/files/text.py +63 -0
- parrot/loaders/html.py +152 -0
- parrot/loaders/markdown.py +442 -0
- parrot/loaders/pdf.py +373 -0
- parrot/loaders/pdfmark.py +320 -0
- parrot/loaders/pdftables.py +506 -0
- parrot/loaders/ppt.py +476 -0
- parrot/loaders/qa.py +63 -0
- parrot/loaders/splitters/__init__.py +10 -0
- parrot/loaders/splitters/base.py +138 -0
- parrot/loaders/splitters/md.py +228 -0
- parrot/loaders/splitters/token.py +143 -0
- parrot/loaders/txt.py +26 -0
- parrot/loaders/video.py +89 -0
- parrot/loaders/videolocal.py +218 -0
- parrot/loaders/videounderstanding.py +377 -0
- parrot/loaders/vimeo.py +167 -0
- parrot/loaders/web.py +599 -0
- parrot/loaders/youtube.py +504 -0
- parrot/manager/__init__.py +5 -0
- parrot/manager/manager.py +1030 -0
- parrot/mcp/__init__.py +28 -0
- parrot/mcp/adapter.py +105 -0
- parrot/mcp/cli.py +174 -0
- parrot/mcp/client.py +119 -0
- parrot/mcp/config.py +75 -0
- parrot/mcp/integration.py +842 -0
- parrot/mcp/oauth.py +933 -0
- parrot/mcp/server.py +225 -0
- parrot/mcp/transports/__init__.py +3 -0
- parrot/mcp/transports/base.py +279 -0
- parrot/mcp/transports/grpc_session.py +163 -0
- parrot/mcp/transports/http.py +312 -0
- parrot/mcp/transports/mcp.proto +108 -0
- parrot/mcp/transports/quic.py +1082 -0
- parrot/mcp/transports/sse.py +330 -0
- parrot/mcp/transports/stdio.py +309 -0
- parrot/mcp/transports/unix.py +395 -0
- parrot/mcp/transports/websocket.py +547 -0
- parrot/memory/__init__.py +16 -0
- parrot/memory/abstract.py +209 -0
- parrot/memory/agent.py +32 -0
- parrot/memory/cache.py +175 -0
- parrot/memory/core.py +555 -0
- parrot/memory/file.py +153 -0
- parrot/memory/mem.py +131 -0
- parrot/memory/redis.py +613 -0
- parrot/models/__init__.py +46 -0
- parrot/models/basic.py +118 -0
- parrot/models/compliance.py +208 -0
- parrot/models/crew.py +395 -0
- parrot/models/detections.py +654 -0
- parrot/models/generation.py +85 -0
- parrot/models/google.py +223 -0
- parrot/models/groq.py +23 -0
- parrot/models/openai.py +30 -0
- parrot/models/outputs.py +285 -0
- parrot/models/responses.py +938 -0
- parrot/notifications/__init__.py +743 -0
- parrot/openapi/__init__.py +3 -0
- parrot/openapi/components.yaml +641 -0
- parrot/openapi/config.py +322 -0
- parrot/outputs/__init__.py +32 -0
- parrot/outputs/formats/__init__.py +108 -0
- parrot/outputs/formats/altair.py +359 -0
- parrot/outputs/formats/application.py +122 -0
- parrot/outputs/formats/base.py +351 -0
- parrot/outputs/formats/bokeh.py +356 -0
- parrot/outputs/formats/card.py +424 -0
- parrot/outputs/formats/chart.py +436 -0
- parrot/outputs/formats/d3.py +255 -0
- parrot/outputs/formats/echarts.py +310 -0
- parrot/outputs/formats/generators/__init__.py +0 -0
- parrot/outputs/formats/generators/abstract.py +61 -0
- parrot/outputs/formats/generators/panel.py +145 -0
- parrot/outputs/formats/generators/streamlit.py +86 -0
- parrot/outputs/formats/generators/terminal.py +63 -0
- parrot/outputs/formats/holoviews.py +310 -0
- parrot/outputs/formats/html.py +147 -0
- parrot/outputs/formats/jinja2.py +46 -0
- parrot/outputs/formats/json.py +87 -0
- parrot/outputs/formats/map.py +933 -0
- parrot/outputs/formats/markdown.py +172 -0
- parrot/outputs/formats/matplotlib.py +237 -0
- parrot/outputs/formats/mixins/__init__.py +0 -0
- parrot/outputs/formats/mixins/emaps.py +855 -0
- parrot/outputs/formats/plotly.py +341 -0
- parrot/outputs/formats/seaborn.py +310 -0
- parrot/outputs/formats/table.py +397 -0
- parrot/outputs/formats/template_report.py +138 -0
- parrot/outputs/formats/yaml.py +125 -0
- parrot/outputs/formatter.py +152 -0
- parrot/outputs/templates/__init__.py +95 -0
- parrot/pipelines/__init__.py +0 -0
- parrot/pipelines/abstract.py +210 -0
- parrot/pipelines/detector.py +124 -0
- parrot/pipelines/models.py +90 -0
- parrot/pipelines/planogram.py +3002 -0
- parrot/pipelines/table.sql +97 -0
- parrot/plugins/__init__.py +106 -0
- parrot/plugins/importer.py +80 -0
- parrot/py.typed +0 -0
- parrot/registry/__init__.py +18 -0
- parrot/registry/registry.py +594 -0
- parrot/scheduler/__init__.py +1189 -0
- parrot/scheduler/models.py +60 -0
- parrot/security/__init__.py +16 -0
- parrot/security/prompt_injection.py +268 -0
- parrot/security/security_events.sql +25 -0
- parrot/services/__init__.py +1 -0
- parrot/services/mcp/__init__.py +8 -0
- parrot/services/mcp/config.py +13 -0
- parrot/services/mcp/server.py +295 -0
- parrot/services/o365_remote_auth.py +235 -0
- parrot/stores/__init__.py +7 -0
- parrot/stores/abstract.py +352 -0
- parrot/stores/arango.py +1090 -0
- parrot/stores/bigquery.py +1377 -0
- parrot/stores/cache.py +106 -0
- parrot/stores/empty.py +10 -0
- parrot/stores/faiss_store.py +1157 -0
- parrot/stores/kb/__init__.py +9 -0
- parrot/stores/kb/abstract.py +68 -0
- parrot/stores/kb/cache.py +165 -0
- parrot/stores/kb/doc.py +325 -0
- parrot/stores/kb/hierarchy.py +346 -0
- parrot/stores/kb/local.py +457 -0
- parrot/stores/kb/prompt.py +28 -0
- parrot/stores/kb/redis.py +659 -0
- parrot/stores/kb/store.py +115 -0
- parrot/stores/kb/user.py +374 -0
- parrot/stores/models.py +59 -0
- parrot/stores/pgvector.py +3 -0
- parrot/stores/postgres.py +2853 -0
- parrot/stores/utils/__init__.py +0 -0
- parrot/stores/utils/chunking.py +197 -0
- parrot/telemetry/__init__.py +3 -0
- parrot/telemetry/mixin.py +111 -0
- parrot/template/__init__.py +3 -0
- parrot/template/engine.py +259 -0
- parrot/tools/__init__.py +23 -0
- parrot/tools/abstract.py +644 -0
- parrot/tools/agent.py +363 -0
- parrot/tools/arangodbsearch.py +537 -0
- parrot/tools/arxiv_tool.py +188 -0
- parrot/tools/calculator/__init__.py +3 -0
- parrot/tools/calculator/operations/__init__.py +38 -0
- parrot/tools/calculator/operations/calculus.py +80 -0
- parrot/tools/calculator/operations/statistics.py +76 -0
- parrot/tools/calculator/tool.py +150 -0
- parrot/tools/cloudwatch.py +988 -0
- parrot/tools/codeinterpreter/__init__.py +127 -0
- parrot/tools/codeinterpreter/executor.py +371 -0
- parrot/tools/codeinterpreter/internals.py +473 -0
- parrot/tools/codeinterpreter/models.py +643 -0
- parrot/tools/codeinterpreter/prompts.py +224 -0
- parrot/tools/codeinterpreter/tool.py +664 -0
- parrot/tools/company_info/__init__.py +6 -0
- parrot/tools/company_info/tool.py +1138 -0
- parrot/tools/correlationanalysis.py +437 -0
- parrot/tools/database/abstract.py +286 -0
- parrot/tools/database/bq.py +115 -0
- parrot/tools/database/cache.py +284 -0
- parrot/tools/database/models.py +95 -0
- parrot/tools/database/pg.py +343 -0
- parrot/tools/databasequery.py +1159 -0
- parrot/tools/db.py +1800 -0
- parrot/tools/ddgo.py +370 -0
- parrot/tools/decorators.py +271 -0
- parrot/tools/dftohtml.py +282 -0
- parrot/tools/document.py +549 -0
- parrot/tools/ecs.py +819 -0
- parrot/tools/edareport.py +368 -0
- parrot/tools/elasticsearch.py +1049 -0
- parrot/tools/employees.py +462 -0
- parrot/tools/epson/__init__.py +96 -0
- parrot/tools/excel.py +683 -0
- parrot/tools/file/__init__.py +13 -0
- parrot/tools/file/abstract.py +76 -0
- parrot/tools/file/gcs.py +378 -0
- parrot/tools/file/local.py +284 -0
- parrot/tools/file/s3.py +511 -0
- parrot/tools/file/tmp.py +309 -0
- parrot/tools/file/tool.py +501 -0
- parrot/tools/file_reader.py +129 -0
- parrot/tools/flowtask/__init__.py +19 -0
- parrot/tools/flowtask/tool.py +761 -0
- parrot/tools/gittoolkit.py +508 -0
- parrot/tools/google/__init__.py +18 -0
- parrot/tools/google/base.py +169 -0
- parrot/tools/google/tools.py +1251 -0
- parrot/tools/googlelocation.py +5 -0
- parrot/tools/googleroutes.py +5 -0
- parrot/tools/googlesearch.py +5 -0
- parrot/tools/googlesitesearch.py +5 -0
- parrot/tools/googlevoice.py +2 -0
- parrot/tools/gvoice.py +695 -0
- parrot/tools/ibisworld/README.md +225 -0
- parrot/tools/ibisworld/__init__.py +11 -0
- parrot/tools/ibisworld/tool.py +366 -0
- parrot/tools/jiratoolkit.py +1718 -0
- parrot/tools/manager.py +1098 -0
- parrot/tools/math.py +152 -0
- parrot/tools/metadata.py +476 -0
- parrot/tools/msteams.py +1621 -0
- parrot/tools/msword.py +635 -0
- parrot/tools/multidb.py +580 -0
- parrot/tools/multistoresearch.py +369 -0
- parrot/tools/networkninja.py +167 -0
- parrot/tools/nextstop/__init__.py +4 -0
- parrot/tools/nextstop/base.py +286 -0
- parrot/tools/nextstop/employee.py +733 -0
- parrot/tools/nextstop/store.py +462 -0
- parrot/tools/notification.py +435 -0
- parrot/tools/o365/__init__.py +42 -0
- parrot/tools/o365/base.py +295 -0
- parrot/tools/o365/bundle.py +522 -0
- parrot/tools/o365/events.py +554 -0
- parrot/tools/o365/mail.py +992 -0
- parrot/tools/o365/onedrive.py +497 -0
- parrot/tools/o365/sharepoint.py +641 -0
- parrot/tools/openapi_toolkit.py +904 -0
- parrot/tools/openweather.py +527 -0
- parrot/tools/pdfprint.py +1001 -0
- parrot/tools/powerbi.py +518 -0
- parrot/tools/powerpoint.py +1113 -0
- parrot/tools/pricestool.py +146 -0
- parrot/tools/products/__init__.py +246 -0
- parrot/tools/prophet_tool.py +171 -0
- parrot/tools/pythonpandas.py +630 -0
- parrot/tools/pythonrepl.py +910 -0
- parrot/tools/qsource.py +436 -0
- parrot/tools/querytoolkit.py +395 -0
- parrot/tools/quickeda.py +827 -0
- parrot/tools/resttool.py +553 -0
- parrot/tools/retail/__init__.py +0 -0
- parrot/tools/retail/bby.py +528 -0
- parrot/tools/sandboxtool.py +703 -0
- parrot/tools/sassie/__init__.py +352 -0
- parrot/tools/scraping/__init__.py +7 -0
- parrot/tools/scraping/docs/select.md +466 -0
- parrot/tools/scraping/documentation.md +1278 -0
- parrot/tools/scraping/driver.py +436 -0
- parrot/tools/scraping/models.py +576 -0
- parrot/tools/scraping/options.py +85 -0
- parrot/tools/scraping/orchestrator.py +517 -0
- parrot/tools/scraping/readme.md +740 -0
- parrot/tools/scraping/tool.py +3115 -0
- parrot/tools/seasonaldetection.py +642 -0
- parrot/tools/shell_tool/__init__.py +5 -0
- parrot/tools/shell_tool/actions.py +408 -0
- parrot/tools/shell_tool/engine.py +155 -0
- parrot/tools/shell_tool/models.py +322 -0
- parrot/tools/shell_tool/tool.py +442 -0
- parrot/tools/site_search.py +214 -0
- parrot/tools/textfile.py +418 -0
- parrot/tools/think.py +378 -0
- parrot/tools/toolkit.py +298 -0
- parrot/tools/webapp_tool.py +187 -0
- parrot/tools/whatif.py +1279 -0
- parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
- parrot/tools/workday/__init__.py +6 -0
- parrot/tools/workday/models.py +1389 -0
- parrot/tools/workday/tool.py +1293 -0
- parrot/tools/yfinance_tool.py +306 -0
- parrot/tools/zipcode.py +217 -0
- parrot/utils/__init__.py +2 -0
- parrot/utils/helpers.py +73 -0
- parrot/utils/parsers/__init__.py +5 -0
- parrot/utils/parsers/toml.c +12078 -0
- parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/parsers/toml.pyx +21 -0
- parrot/utils/toml.py +11 -0
- parrot/utils/types.cpp +20936 -0
- parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/types.pyx +213 -0
- parrot/utils/uv.py +11 -0
- parrot/version.py +10 -0
- parrot/yaml-rs/Cargo.lock +350 -0
- parrot/yaml-rs/Cargo.toml +19 -0
- parrot/yaml-rs/pyproject.toml +19 -0
- parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
- parrot/yaml-rs/src/lib.rs +222 -0
- requirements/docker-compose.yml +24 -0
- requirements/requirements-dev.txt +21 -0
parrot/clients/grok.py
ADDED
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
from typing import List, Dict, Any, Optional, Union, AsyncIterator
|
|
2
|
+
import os
|
|
3
|
+
import asyncio
|
|
4
|
+
import logging
|
|
5
|
+
import json
|
|
6
|
+
import uuid
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from dataclasses import is_dataclass
|
|
10
|
+
from pydantic import BaseModel, TypeAdapter
|
|
11
|
+
|
|
12
|
+
from xai_sdk import AsyncClient
|
|
13
|
+
from xai_sdk.chat import user, system, assistant
|
|
14
|
+
|
|
15
|
+
from .base import AbstractClient
|
|
16
|
+
from ..models import (
|
|
17
|
+
MessageResponse,
|
|
18
|
+
CompletionUsage,
|
|
19
|
+
AIMessage,
|
|
20
|
+
StructuredOutputConfig,
|
|
21
|
+
ToolCall,
|
|
22
|
+
OutputFormat
|
|
23
|
+
)
|
|
24
|
+
from ..tools.abstract import AbstractTool
|
|
25
|
+
from ..tools.manager import ToolFormat
|
|
26
|
+
|
|
27
|
+
class GrokModel(str, Enum):
|
|
28
|
+
"""Grok model versions."""
|
|
29
|
+
GROK_4_FAST_REASONING = "grok-4-fast-reasoning"
|
|
30
|
+
GROK_4 = "grok-4"
|
|
31
|
+
GROK_4_1_FAST_NON_REASONING = "grok-4-1-fast-non-reasoning"
|
|
32
|
+
GROK_4_1_FAST_REASONING = "grok-4-1-fast-reasoning"
|
|
33
|
+
GROK_3_MINI = "gro-3-mini"
|
|
34
|
+
GROK_CODE_FAST_1 = "grok-code-fast-1"
|
|
35
|
+
GROK_2_IMAGE = "grok-2-image-1212"
|
|
36
|
+
GROK_2_VISION = "grok-2-vision-1212"
|
|
37
|
+
|
|
38
|
+
class GrokClient(AbstractClient):
|
|
39
|
+
"""
|
|
40
|
+
Client for interacting with xAI's Grok models.
|
|
41
|
+
"""
|
|
42
|
+
client_type: str = "xai"
|
|
43
|
+
client_name: str = "grok"
|
|
44
|
+
_default_model: str = GrokModel.GROK_4.value
|
|
45
|
+
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
api_key: Optional[str] = None,
|
|
49
|
+
timeout: int = 3600,
|
|
50
|
+
**kwargs
|
|
51
|
+
):
|
|
52
|
+
"""
|
|
53
|
+
Initialize Grok client.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
api_key: xAI API key (defaults to XAI_API_KEY env var)
|
|
57
|
+
timeout: Request timeout in seconds
|
|
58
|
+
**kwargs: Additional arguments for AbstractClient
|
|
59
|
+
"""
|
|
60
|
+
super().__init__(**kwargs)
|
|
61
|
+
self.api_key = api_key or os.getenv("XAI_API_KEY")
|
|
62
|
+
if not self.api_key:
|
|
63
|
+
# Try to get from config if available
|
|
64
|
+
try:
|
|
65
|
+
from navconfig import config
|
|
66
|
+
self.api_key = config.get("XAI_API_KEY")
|
|
67
|
+
except ImportError:
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
if not self.api_key:
|
|
71
|
+
raise ValueError("XAI_API_KEY not found in environment or config")
|
|
72
|
+
|
|
73
|
+
self.timeout = timeout
|
|
74
|
+
self.client: Optional[AsyncClient] = None
|
|
75
|
+
|
|
76
|
+
async def get_client(self) -> AsyncClient:
|
|
77
|
+
"""Return the xAI AsyncClient instance."""
|
|
78
|
+
if not self.client:
|
|
79
|
+
self.client = AsyncClient(
|
|
80
|
+
api_key=self.api_key,
|
|
81
|
+
timeout=self.timeout
|
|
82
|
+
)
|
|
83
|
+
return self.client
|
|
84
|
+
|
|
85
|
+
async def close(self):
|
|
86
|
+
"""Close the client connection."""
|
|
87
|
+
await super().close()
|
|
88
|
+
self.client = None
|
|
89
|
+
|
|
90
|
+
def _convert_messages(self, messages: List[Dict[str, Any]]) -> Any:
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
def _prepare_structured_output_format(self, structured_output: type) -> dict:
|
|
94
|
+
"""Prepare response format for structured output using full JSON schema."""
|
|
95
|
+
if not structured_output:
|
|
96
|
+
return {}
|
|
97
|
+
|
|
98
|
+
# Normalize instance → class
|
|
99
|
+
if isinstance(structured_output, BaseModel):
|
|
100
|
+
structured_output = structured_output.__class__
|
|
101
|
+
if is_dataclass(structured_output) and not isinstance(structured_output, type):
|
|
102
|
+
structured_output = structured_output.__class__
|
|
103
|
+
|
|
104
|
+
schema = None
|
|
105
|
+
name = "structured_output"
|
|
106
|
+
|
|
107
|
+
# Pydantic models
|
|
108
|
+
if isinstance(structured_output, type) and hasattr(structured_output, 'model_json_schema'):
|
|
109
|
+
schema = structured_output.model_json_schema()
|
|
110
|
+
name = structured_output.__name__.lower()
|
|
111
|
+
# Dataclasses
|
|
112
|
+
elif is_dataclass(structured_output):
|
|
113
|
+
schema = TypeAdapter(structured_output).json_schema()
|
|
114
|
+
name = structured_output.__name__.lower()
|
|
115
|
+
|
|
116
|
+
if schema:
|
|
117
|
+
return {
|
|
118
|
+
"response_format": {
|
|
119
|
+
"type": "json_schema",
|
|
120
|
+
"json_schema": {
|
|
121
|
+
"name": name,
|
|
122
|
+
"schema": schema,
|
|
123
|
+
"strict": True
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# Fallback
|
|
129
|
+
return {"response_format": {"type": "json_object"}}
|
|
130
|
+
|
|
131
|
+
def _prepare_tools_for_grok(self) -> List[Dict[str, Any]]:
|
|
132
|
+
"""Prepare tools using OpenAI format which is compatible with xAI."""
|
|
133
|
+
# Use ToolManager to get OpenAI formatted schemas
|
|
134
|
+
return self.tool_manager.get_tool_schemas(provider_format=ToolFormat.OPENAI)
|
|
135
|
+
|
|
136
|
+
async def ask(
|
|
137
|
+
self,
|
|
138
|
+
prompt: str,
|
|
139
|
+
model: str = None,
|
|
140
|
+
max_tokens: int = 4096,
|
|
141
|
+
temperature: float = 0.7,
|
|
142
|
+
files: Optional[List[Union[str, Path]]] = None,
|
|
143
|
+
system_prompt: Optional[str] = None,
|
|
144
|
+
structured_output: Union[type, StructuredOutputConfig, None] = None,
|
|
145
|
+
user_id: Optional[str] = None,
|
|
146
|
+
session_id: Optional[str] = None,
|
|
147
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
148
|
+
use_tools: Optional[bool] = None,
|
|
149
|
+
) -> MessageResponse:
|
|
150
|
+
"""
|
|
151
|
+
Send a prompt to Grok and return the response.
|
|
152
|
+
"""
|
|
153
|
+
client = await self.get_client()
|
|
154
|
+
model = model or self.model or self.default_model
|
|
155
|
+
turn_id = str(uuid.uuid4())
|
|
156
|
+
|
|
157
|
+
# 1. Prepare Structured Output
|
|
158
|
+
response_format = None
|
|
159
|
+
output_config = None
|
|
160
|
+
if structured_output:
|
|
161
|
+
output_config = self._get_structured_config(structured_output)
|
|
162
|
+
if output_config and output_config.output_type:
|
|
163
|
+
fmt = self._prepare_structured_output_format(output_config.output_type)
|
|
164
|
+
if fmt:
|
|
165
|
+
response_format = fmt.get("response_format")
|
|
166
|
+
elif isinstance(structured_output, (type, BaseModel)) or is_dataclass(structured_output):
|
|
167
|
+
fmt = self._prepare_structured_output_format(structured_output)
|
|
168
|
+
if fmt:
|
|
169
|
+
response_format = fmt.get("response_format")
|
|
170
|
+
|
|
171
|
+
# 2. Prepare Tools
|
|
172
|
+
_use_tools = use_tools if use_tools is not None else self.enable_tools
|
|
173
|
+
prepared_tools = []
|
|
174
|
+
if _use_tools:
|
|
175
|
+
if tools:
|
|
176
|
+
# TODO: Normalize manual tools if needed, assuming OpenAI format for now
|
|
177
|
+
prepared_tools = tools
|
|
178
|
+
else:
|
|
179
|
+
prepared_tools = self._prepare_tools_for_grok()
|
|
180
|
+
|
|
181
|
+
# 3. Initialize Chat
|
|
182
|
+
chat_kwargs = {
|
|
183
|
+
"model": model,
|
|
184
|
+
"max_tokens": max_tokens,
|
|
185
|
+
"temperature": temperature
|
|
186
|
+
}
|
|
187
|
+
if response_format:
|
|
188
|
+
chat_kwargs["response_format"] = response_format
|
|
189
|
+
|
|
190
|
+
if prepared_tools:
|
|
191
|
+
chat_kwargs['tools'] = prepared_tools
|
|
192
|
+
chat_kwargs['tool_choice'] = "auto"
|
|
193
|
+
|
|
194
|
+
# Note: xAI SDK stateful 'chat' object might be tricky for tool loops + structured output
|
|
195
|
+
# if we need to modify 'messages' manually.
|
|
196
|
+
# Using chat.create() creates a new conversation container.
|
|
197
|
+
chat = client.chat.create(**chat_kwargs)
|
|
198
|
+
|
|
199
|
+
# 4. Add Context (System, History, User)
|
|
200
|
+
if system_prompt:
|
|
201
|
+
chat.append(system(system_prompt))
|
|
202
|
+
|
|
203
|
+
if self.conversation_memory and user_id and session_id:
|
|
204
|
+
history = await self.get_conversation(user_id, session_id)
|
|
205
|
+
if history:
|
|
206
|
+
for turn in history.turns:
|
|
207
|
+
chat.append(user(turn.input))
|
|
208
|
+
if turn.output:
|
|
209
|
+
chat.append(assistant(turn.output))
|
|
210
|
+
|
|
211
|
+
chat.append(user(prompt))
|
|
212
|
+
|
|
213
|
+
# 5. Execution Loop (Tools)
|
|
214
|
+
final_response = None
|
|
215
|
+
all_tool_calls = []
|
|
216
|
+
|
|
217
|
+
# Limit loops to prevent infinite recursion
|
|
218
|
+
max_turns = 10
|
|
219
|
+
current_turn = 0
|
|
220
|
+
|
|
221
|
+
while current_turn < max_turns:
|
|
222
|
+
current_turn += 1
|
|
223
|
+
|
|
224
|
+
try:
|
|
225
|
+
# Execute request
|
|
226
|
+
response = await chat.sample()
|
|
227
|
+
|
|
228
|
+
# Check for tools
|
|
229
|
+
# xAI SDK response object structure for tool calls needs verification.
|
|
230
|
+
# Assuming standard OpenAI-like or SDK specific attribute.
|
|
231
|
+
# Looking at xai_sdk/chat.py source or behavior would be ideal.
|
|
232
|
+
# Based on `GrokClient` previous implementation attempt and standard patterns:
|
|
233
|
+
# response.tool_calls might exist if using `tool_choice`.
|
|
234
|
+
|
|
235
|
+
# If the SDK handles tool execution automatically, we might not need this loop?
|
|
236
|
+
# Usually client SDKs don't auto-execute.
|
|
237
|
+
|
|
238
|
+
tool_calls = getattr(response, 'tool_calls', [])
|
|
239
|
+
if not tool_calls and hasattr(response, 'message'):
|
|
240
|
+
# Check nested message object if present
|
|
241
|
+
tool_calls = getattr(response.message, 'tool_calls', [])
|
|
242
|
+
|
|
243
|
+
# If no tool calls, we are done
|
|
244
|
+
if not tool_calls:
|
|
245
|
+
final_response = response
|
|
246
|
+
break
|
|
247
|
+
|
|
248
|
+
# Handle Tool Calls
|
|
249
|
+
# response should be added to chat?
|
|
250
|
+
# The SDK might auto-append the assistants reply to its internal history
|
|
251
|
+
# if we use `chat.sample()`?
|
|
252
|
+
# Wait, `chat` is a stateful object. `chat.sample()` returns a response
|
|
253
|
+
# AND likely updates internal state?
|
|
254
|
+
# Let's assume `chat` object maintains state.
|
|
255
|
+
# If we need to add the tool result, we likely check `chat` methods.
|
|
256
|
+
# `chat.append` takes a message.
|
|
257
|
+
# We need to append the tool result.
|
|
258
|
+
|
|
259
|
+
# For each tool call:
|
|
260
|
+
for tc in tool_calls:
|
|
261
|
+
fn = tc.function
|
|
262
|
+
tool_name = fn.name
|
|
263
|
+
tool_args_str = fn.arguments
|
|
264
|
+
tool_id = tc.id
|
|
265
|
+
|
|
266
|
+
try:
|
|
267
|
+
tool_args = json.loads(tool_args_str)
|
|
268
|
+
except json.JSONDecodeError:
|
|
269
|
+
# Try cleaning or fallback
|
|
270
|
+
tool_args = {}
|
|
271
|
+
|
|
272
|
+
# Execute
|
|
273
|
+
tool_exec_result = await self._execute_tool(tool_name, tool_args)
|
|
274
|
+
|
|
275
|
+
# Create ToolCall record for AIMessage
|
|
276
|
+
tool_call_rec = ToolCall(
|
|
277
|
+
id=tool_id,
|
|
278
|
+
name=tool_name,
|
|
279
|
+
arguments=tool_args,
|
|
280
|
+
result=tool_exec_result
|
|
281
|
+
)
|
|
282
|
+
all_tool_calls.append(tool_call_rec)
|
|
283
|
+
|
|
284
|
+
# Append result to chat
|
|
285
|
+
# xAI SDK likely has a `tool` message type
|
|
286
|
+
from xai_sdk.chat import tool_result as ToolResultMsg
|
|
287
|
+
msg = ToolResultMsg(str(tool_exec_result))
|
|
288
|
+
# xAI SDK proto does not have tool_call_id, assuming name or order maps it.
|
|
289
|
+
# Using name field for tool_call_id as best guess for OpenAI compatibility
|
|
290
|
+
msg.name = tool_id
|
|
291
|
+
chat.append(msg)
|
|
292
|
+
|
|
293
|
+
# Loop continues to next sample()
|
|
294
|
+
continue
|
|
295
|
+
|
|
296
|
+
except Exception as e:
|
|
297
|
+
self.logger.error(f"Error in GrokClient loop: {e}")
|
|
298
|
+
# If failure, break and return what we have or re-raise
|
|
299
|
+
raise
|
|
300
|
+
|
|
301
|
+
# 6. Parse Final Response
|
|
302
|
+
if not final_response:
|
|
303
|
+
# Should not happen unless max_turns hit without final response
|
|
304
|
+
# Just return last response
|
|
305
|
+
final_response = response
|
|
306
|
+
|
|
307
|
+
# Local import to avoid circular dependency
|
|
308
|
+
from ..models.responses import AIMessageFactory
|
|
309
|
+
|
|
310
|
+
# Parse structured output if native handling didn't yield an object
|
|
311
|
+
# (xAI SDK might return object if response_format was used? or just JSON string)
|
|
312
|
+
# Assuming JSON string for safely.
|
|
313
|
+
text_content = final_response.content if hasattr(final_response, 'content') else str(final_response)
|
|
314
|
+
|
|
315
|
+
structured_payload = None
|
|
316
|
+
if output_config:
|
|
317
|
+
try:
|
|
318
|
+
# If response_format was used, text_content should be JSON
|
|
319
|
+
if output_config.custom_parser:
|
|
320
|
+
structured_payload = output_config.custom_parser(text_content)
|
|
321
|
+
else:
|
|
322
|
+
structured_payload = await self._parse_structured_output(text_content, output_config)
|
|
323
|
+
except Exception:
|
|
324
|
+
# If parsing failed, keep as text
|
|
325
|
+
pass
|
|
326
|
+
|
|
327
|
+
ai_message = AIMessageFactory.create_message(
|
|
328
|
+
response=final_response,
|
|
329
|
+
input_text=prompt,
|
|
330
|
+
model=model,
|
|
331
|
+
user_id=user_id,
|
|
332
|
+
session_id=session_id,
|
|
333
|
+
usage=CompletionUsage.from_grok(final_response.usage) if hasattr(final_response, 'usage') else None,
|
|
334
|
+
text_response=text_content
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
ai_message.tool_calls = all_tool_calls
|
|
338
|
+
if structured_payload:
|
|
339
|
+
ai_message.structured_output = structured_payload
|
|
340
|
+
ai_message.is_structured = True
|
|
341
|
+
ai_message.output = structured_payload # Swap if structured is primary
|
|
342
|
+
|
|
343
|
+
if user_id and session_id:
|
|
344
|
+
await self.conversation_memory.add_turn(
|
|
345
|
+
user_id,
|
|
346
|
+
session_id,
|
|
347
|
+
prompt,
|
|
348
|
+
ai_message.to_text,
|
|
349
|
+
metadata=ai_message.usage.dict() if ai_message.usage else None
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
return ai_message
|
|
353
|
+
|
|
354
|
+
async def ask_stream(
|
|
355
|
+
self,
|
|
356
|
+
prompt: str,
|
|
357
|
+
model: str = None,
|
|
358
|
+
max_tokens: int = 4096,
|
|
359
|
+
temperature: float = 0.7,
|
|
360
|
+
files: Optional[List[Union[str, Path]]] = None,
|
|
361
|
+
system_prompt: Optional[str] = None,
|
|
362
|
+
structured_output: Union[type, StructuredOutputConfig, None] = None,
|
|
363
|
+
user_id: Optional[str] = None,
|
|
364
|
+
session_id: Optional[str] = None,
|
|
365
|
+
tools: Optional[List[Dict[str, Any]]] = None
|
|
366
|
+
) -> AsyncIterator[str]:
|
|
367
|
+
"""
|
|
368
|
+
Stream response from Grok.
|
|
369
|
+
"""
|
|
370
|
+
client = await self.get_client()
|
|
371
|
+
model = model or self.model or self.default_model
|
|
372
|
+
|
|
373
|
+
chat_kwargs = {
|
|
374
|
+
"model": model,
|
|
375
|
+
"max_tokens": max_tokens,
|
|
376
|
+
"temperature": temperature,
|
|
377
|
+
"stream": True
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if structured_output:
|
|
381
|
+
config = self._get_structured_config(structured_output)
|
|
382
|
+
if config:
|
|
383
|
+
if output_config and output_config.output_type:
|
|
384
|
+
fmt = self._prepare_structured_output_format(output_config.output_type)
|
|
385
|
+
if fmt:
|
|
386
|
+
chat_kwargs["response_format"] = fmt.get("response_format")
|
|
387
|
+
elif isinstance(structured_output, (type, BaseModel)) or is_dataclass(structured_output):
|
|
388
|
+
fmt = self._prepare_structured_output_format(structured_output)
|
|
389
|
+
if fmt:
|
|
390
|
+
chat_kwargs["response_format"] = fmt.get("response_format")
|
|
391
|
+
|
|
392
|
+
chat = client.chat.create(**chat_kwargs)
|
|
393
|
+
|
|
394
|
+
if system_prompt:
|
|
395
|
+
chat.append(system(system_prompt))
|
|
396
|
+
|
|
397
|
+
if self.conversation_memory and user_id and session_id:
|
|
398
|
+
history = await self.get_conversation(user_id, session_id)
|
|
399
|
+
if history:
|
|
400
|
+
for turn in history.turns:
|
|
401
|
+
chat.append(user(turn.input))
|
|
402
|
+
if turn.output:
|
|
403
|
+
chat.append(assistant(turn.output))
|
|
404
|
+
|
|
405
|
+
chat.append(user(prompt))
|
|
406
|
+
|
|
407
|
+
full_response = []
|
|
408
|
+
|
|
409
|
+
async for token in chat.stream():
|
|
410
|
+
content = token
|
|
411
|
+
if hasattr(token, 'choices'):
|
|
412
|
+
delta = token.choices[0].delta
|
|
413
|
+
if hasattr(delta, 'content'):
|
|
414
|
+
content = delta.content
|
|
415
|
+
elif hasattr(token, 'content'):
|
|
416
|
+
content = token.content
|
|
417
|
+
|
|
418
|
+
if content:
|
|
419
|
+
full_response.append(content)
|
|
420
|
+
yield content
|
|
421
|
+
|
|
422
|
+
if user_id and session_id:
|
|
423
|
+
await self.conversation_memory.add_turn(
|
|
424
|
+
user_id,
|
|
425
|
+
session_id,
|
|
426
|
+
prompt,
|
|
427
|
+
"".join(full_response)
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
async def batch_ask(self, requests: List[Any]) -> List[Any]:
|
|
431
|
+
"""Batch processing not yet implemented for Grok."""
|
|
432
|
+
raise NotImplementedError("Batch processing not supported for Grok yet")
|