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,85 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class VideoGenerationPrompt(BaseModel):
|
|
6
|
+
"""Input schema for generating video content with VEO models."""
|
|
7
|
+
|
|
8
|
+
prompt: str = Field(
|
|
9
|
+
...,
|
|
10
|
+
description="The text prompt describing the desired video content."
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
model: str = Field(
|
|
14
|
+
...,
|
|
15
|
+
description="The video generation model to use (e.g., 'veo-3.0-generate-001')."
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
aspect_ratio: str = Field(
|
|
19
|
+
default="16:9",
|
|
20
|
+
description="The desired aspect ratio (e.g., '16:9', '9:16', '1:1')."
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
resolution: Optional[str] = Field(
|
|
24
|
+
default="720p",
|
|
25
|
+
description="Video resolution ('720p' or '1080p'). Default is '720p'."
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
negative_prompt: Optional[str] = Field(
|
|
29
|
+
default='',
|
|
30
|
+
description="A description of what to avoid in the video (e.g., 'cartoon, low quality')."
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
number_of_videos: int = Field(
|
|
34
|
+
default=1,
|
|
35
|
+
description="The number of videos to generate per request (typically 1)."
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
duration: Optional[int] = Field(
|
|
39
|
+
None,
|
|
40
|
+
description="Optional duration in seconds for the video (if supported by model)."
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Additional metadata fields (optional)
|
|
44
|
+
seed: Optional[int] = Field(
|
|
45
|
+
None,
|
|
46
|
+
description="Optional seed for reproducible generation (if supported)."
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
class Config:
|
|
50
|
+
json_schema_extra = {
|
|
51
|
+
"example": {
|
|
52
|
+
"prompt": "A cinematic shot of a majestic lion in the savannah",
|
|
53
|
+
"model": "veo-3.0-generate-001",
|
|
54
|
+
"aspect_ratio": "16:9",
|
|
55
|
+
"resolution": "1080p",
|
|
56
|
+
"negative_prompt": "cartoon, drawing, low quality",
|
|
57
|
+
"number_of_videos": 1
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
def validate_aspect_ratio(aspect_ratio: str) -> bool:
|
|
62
|
+
"""Validate that aspect ratio is in correct format."""
|
|
63
|
+
valid_ratios = ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9"]
|
|
64
|
+
return aspect_ratio in valid_ratios
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def validate_resolution(resolution: str) -> bool:
|
|
68
|
+
"""Validate that resolution is supported."""
|
|
69
|
+
valid_resolutions = ["720p", "1080p"]
|
|
70
|
+
return resolution in valid_resolutions
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# # Example usage:
|
|
74
|
+
# if __name__ == "__main__":
|
|
75
|
+
# # Create a video generation prompt
|
|
76
|
+
# prompt = VideoGenerationPrompt(
|
|
77
|
+
# prompt="A time-lapse of a sunset over the ocean",
|
|
78
|
+
# model="veo-3.0-generate-001",
|
|
79
|
+
# aspect_ratio="16:9",
|
|
80
|
+
# resolution="1080p",
|
|
81
|
+
# negative_prompt="people, buildings, text",
|
|
82
|
+
# number_of_videos=1
|
|
83
|
+
# )
|
|
84
|
+
|
|
85
|
+
# print(prompt.model_dump_json(indent=2))
|
parrot/models/google.py
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Google Related Models to be used in GenAI.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Literal, List, Dict, Optional
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
class GoogleModel(Enum):
|
|
9
|
+
"""Enum for Google AI models."""
|
|
10
|
+
GEMINI_3_PRO_PREVIEW = "gemini-3-pro-preview"
|
|
11
|
+
GEMINI_2_5_FLASH = "gemini-2.5-flash"
|
|
12
|
+
GEMINI_2_5_FLASH_PREVIEW = "gemini-2.5-flash-preview-09-2025"
|
|
13
|
+
GEMINI_2_5_FLASH_LITE_PREVIEW = "gemini-2.5-flash-lite-preview-09-2025"
|
|
14
|
+
GEMINI_2_5_PRO = "gemini-2.5-pro"
|
|
15
|
+
GEMINI_2_0_FLASH = "gemini-2.0-flash-001"
|
|
16
|
+
GEMINI_PRO_LATEST = "gemini-pro-latest"
|
|
17
|
+
GEMINI_FLASH_LATEST = "gemini-flash-latest"
|
|
18
|
+
GEMINI_FLASH_LITE_LATEST = "gemini-flash-lite-latest"
|
|
19
|
+
IMAGEN_3 = "imagen-3.0-generate-002"
|
|
20
|
+
IMAGEN_4 = "imagen-4.0-generate-preview-06-06"
|
|
21
|
+
GEMINI_2_0_IMAGE_GENERATION = "gemini-2.0-flash-preview-image-generation"
|
|
22
|
+
GEMINI_2_5_FLASH_TTS = "gemini-2.5-flash-preview-tts"
|
|
23
|
+
GEMINI_2_5_PRO_TTS = "gemini-2.5-pro-preview-tts"
|
|
24
|
+
GEMINI_2_5_FLASH_IMAGE_PREVIEW = "gemini-2.5-flash-image-preview"
|
|
25
|
+
VEO_3_0 = "veo-3.0-generate-preview"
|
|
26
|
+
VEO_2_0 = "veo-2.0-generate-001"
|
|
27
|
+
VEO_3_0_FAST = "veo-3.0-fast-generate-001"
|
|
28
|
+
|
|
29
|
+
# NEW: Enum for all valid TTS voice names
|
|
30
|
+
class TTSVoice(str, Enum):
|
|
31
|
+
"""Google TTS voices."""
|
|
32
|
+
ACHERNAR = "achernar"
|
|
33
|
+
ACHIRD = "achird"
|
|
34
|
+
ALGENIB = "algenib"
|
|
35
|
+
ALGIEBA = "algieba"
|
|
36
|
+
ALNILAM = "alnilam"
|
|
37
|
+
AOEDE = "aoede"
|
|
38
|
+
AUTONOE = "autonoe"
|
|
39
|
+
CALLIRRHOE = "callirrhoe"
|
|
40
|
+
CHARON = "charon"
|
|
41
|
+
DESPINA = "despina"
|
|
42
|
+
ENCELADUS = "enceladus"
|
|
43
|
+
ERINOME = "erinome"
|
|
44
|
+
FENRIR = "fenrir"
|
|
45
|
+
GACRUX = "gacrux"
|
|
46
|
+
IAPETUS = "iapetus"
|
|
47
|
+
KORE = "kore"
|
|
48
|
+
LAOMEDEIA = "laomedeia"
|
|
49
|
+
LEDA = "leda"
|
|
50
|
+
ORUS = "orus"
|
|
51
|
+
PUCK = "puck"
|
|
52
|
+
PULCHERRIMA = "pulcherrima"
|
|
53
|
+
RASALGETHI = "rasalgethi"
|
|
54
|
+
SADACHBIA = "sadachbia"
|
|
55
|
+
SADALTAGER = "sadaltager"
|
|
56
|
+
SCHEDAR = "schedar"
|
|
57
|
+
SULAFAT = "sulafat"
|
|
58
|
+
UMBRIEL = "umbriel"
|
|
59
|
+
VINDEMIATRIX = "vindemiatrix"
|
|
60
|
+
ZEPHYR = "zephyr"
|
|
61
|
+
ZUBENELGENUBI = "zubenelgenubi"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class VertexAIModel(Enum):
|
|
65
|
+
"""Enum for Vertex AI models."""
|
|
66
|
+
GEMINI_2_5_FLASH = "gemini-2.5-flash"
|
|
67
|
+
GEMINI_2_5_FLASH_LITE_PREVIEW = "gemini-2.5-flash-lite-preview-06-17"
|
|
68
|
+
GEMINI_2_5_PRO = "gemini-2.5-pro"
|
|
69
|
+
GEMINI_2_0_FLASH = "gemini-2.0-flash-001"
|
|
70
|
+
IMAGEN_3_FAST = "Imagen 3 Fast"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class FictionalSpeaker(BaseModel):
|
|
74
|
+
"""Configuration for a fictional character in the generated script."""
|
|
75
|
+
name: str = Field(
|
|
76
|
+
...,
|
|
77
|
+
description="The name of the fictional speaker (e.g., 'Alex', 'Dr. Evans')."
|
|
78
|
+
)
|
|
79
|
+
characteristic: str = Field(
|
|
80
|
+
...,
|
|
81
|
+
description="A descriptive personality trait for the voice model, e.g., 'charismatic and engaging', 'skeptical and cautious', 'bored'."
|
|
82
|
+
)
|
|
83
|
+
role: Literal['interviewer', 'interviewee'] = Field(
|
|
84
|
+
...,
|
|
85
|
+
description="The role of the speaker in the conversation."
|
|
86
|
+
)
|
|
87
|
+
gender: Literal['female', 'male', 'neutral'] = Field(
|
|
88
|
+
default='neutral',
|
|
89
|
+
description="The gender of the speaker.",
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class ConversationalScriptConfig(BaseModel):
|
|
94
|
+
"""
|
|
95
|
+
Configuration for generating a conversational script with fictional characters.
|
|
96
|
+
"""
|
|
97
|
+
report_text: str = Field(
|
|
98
|
+
...,
|
|
99
|
+
description="The main text content of the script."
|
|
100
|
+
)
|
|
101
|
+
speakers: List[FictionalSpeaker] = Field(
|
|
102
|
+
...,
|
|
103
|
+
description="A list of fictional speakers to include in the script."
|
|
104
|
+
)
|
|
105
|
+
context: str = Field(
|
|
106
|
+
...,
|
|
107
|
+
description="Background context for the conversation, e.g., 'Discussing recent scientific discoveries'."
|
|
108
|
+
)
|
|
109
|
+
length: int = Field(
|
|
110
|
+
1000,
|
|
111
|
+
description="Desired length of the script in words."
|
|
112
|
+
)
|
|
113
|
+
system_prompt: Optional[str] = Field(
|
|
114
|
+
None,
|
|
115
|
+
description="An optional system prompt to guide the AI's behavior during script generation."
|
|
116
|
+
)
|
|
117
|
+
system_instruction: Optional[str] = Field(
|
|
118
|
+
None,
|
|
119
|
+
description="An optional system instruction to provide additional context or constraints for the script generation."
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# Define the gender type for clarity and validation
|
|
124
|
+
Gender = Literal["female", "male", "neutral"]
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class VoiceProfile(BaseModel):
|
|
128
|
+
"""
|
|
129
|
+
Represents a single pre-built generative voice, mapping its name
|
|
130
|
+
to its known characteristics and gender.
|
|
131
|
+
"""
|
|
132
|
+
voice_name: str = Field(..., description="The official name of the voice (e.g., 'Erinome').")
|
|
133
|
+
characteristic: str = Field(..., description="The primary characteristic of the voice (e.g., 'Clear', 'Upbeat').")
|
|
134
|
+
gender: Gender = Field(..., description="The perceived gender of the voice.")
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# This list is based on the official documentation for Google's generative voices.
|
|
138
|
+
# It represents the "HTML table" data you referred to.
|
|
139
|
+
ALL_VOICE_PROFILES: List[VoiceProfile] = [
|
|
140
|
+
VoiceProfile(voice_name="Zephyr", characteristic="Bright", gender="female"),
|
|
141
|
+
VoiceProfile(voice_name="Puck", characteristic="Upbeat", gender="male"),
|
|
142
|
+
VoiceProfile(voice_name="Charon", characteristic="Informative", gender="male"),
|
|
143
|
+
VoiceProfile(voice_name="Kore", characteristic="Firm", gender="female"),
|
|
144
|
+
VoiceProfile(voice_name="Fenrir", characteristic="Excitable", gender="male"),
|
|
145
|
+
VoiceProfile(voice_name="Leda", characteristic="Youthful", gender="female"),
|
|
146
|
+
VoiceProfile(voice_name="Orus", characteristic="Firm", gender="male"),
|
|
147
|
+
VoiceProfile(voice_name="Aoede", characteristic="Breezy", gender="female"),
|
|
148
|
+
VoiceProfile(voice_name="Callirrhoe", characteristic="Easy-going", gender="female"),
|
|
149
|
+
VoiceProfile(voice_name="Autonoe", characteristic="Bright", gender="female"),
|
|
150
|
+
VoiceProfile(voice_name="Enceladus", characteristic="Breathy", gender="male"),
|
|
151
|
+
VoiceProfile(voice_name="Iapetus", characteristic="Clear", gender="male"),
|
|
152
|
+
VoiceProfile(voice_name="Umbriel", characteristic="Easy-going", gender="male"),
|
|
153
|
+
VoiceProfile(voice_name="Algieba", characteristic="Smooth", gender="male"),
|
|
154
|
+
VoiceProfile(voice_name="Despina", characteristic="Smooth", gender="female"),
|
|
155
|
+
VoiceProfile(voice_name="Erinome", characteristic="Clear", gender="female"),
|
|
156
|
+
VoiceProfile(voice_name="Algenib", characteristic="Gravelly", gender="male"),
|
|
157
|
+
VoiceProfile(voice_name="Rasalgethi", characteristic="Informative", gender="male"),
|
|
158
|
+
VoiceProfile(voice_name="Laomedeia", characteristic="Upbeat", gender="female"),
|
|
159
|
+
VoiceProfile(voice_name="Achernar", characteristic="Soft", gender="female"),
|
|
160
|
+
VoiceProfile(voice_name="Alnilam", characteristic="Firm", gender="female"),
|
|
161
|
+
VoiceProfile(voice_name="Schedar", characteristic="Even", gender="female"),
|
|
162
|
+
VoiceProfile(voice_name="Gacrux", characteristic="Mature", gender="female"),
|
|
163
|
+
VoiceProfile(voice_name="Pulcherrima", characteristic="Forward", gender="female"),
|
|
164
|
+
VoiceProfile(voice_name="Achird", characteristic="Friendly", gender="female"),
|
|
165
|
+
VoiceProfile(voice_name="Zubenelgenubi", characteristic="Casual", gender="male"),
|
|
166
|
+
VoiceProfile(voice_name="Vindemiatrix", characteristic="Gentle", gender="female"),
|
|
167
|
+
VoiceProfile(voice_name="Sadachbia", characteristic="Lively", gender="female"),
|
|
168
|
+
VoiceProfile(voice_name="Sadaltager", characteristic="Knowledgeable", gender="male"),
|
|
169
|
+
VoiceProfile(voice_name="Sulafat", characteristic="Warm", gender="female"),
|
|
170
|
+
]
|
|
171
|
+
|
|
172
|
+
class VoiceRegistry:
|
|
173
|
+
"""
|
|
174
|
+
A comprehensive registry for managing and querying available voice profiles.
|
|
175
|
+
"""
|
|
176
|
+
def __init__(self, profiles: List[VoiceProfile]):
|
|
177
|
+
"""Initializes the registry with a list of voice profiles."""
|
|
178
|
+
self._voices: Dict[str, VoiceProfile] = {
|
|
179
|
+
profile.voice_name.lower(): profile for profile in profiles
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
def find_voice_by_name(self, name: str) -> Optional[VoiceProfile]:
|
|
183
|
+
"""
|
|
184
|
+
Finds a voice profile by its name (case-insensitive).
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
name: The name of the voice to find (e.g., 'Erinome', 'puck').
|
|
188
|
+
Returns:
|
|
189
|
+
A VoiceProfile object if found, otherwise None.
|
|
190
|
+
"""
|
|
191
|
+
return self._voices.get(name.lower())
|
|
192
|
+
|
|
193
|
+
def get_all_voices(self) -> List[VoiceProfile]:
|
|
194
|
+
"""Returns a list of all voice profiles in the registry."""
|
|
195
|
+
return list(self._voices.values())
|
|
196
|
+
|
|
197
|
+
def get_voices_by_gender(self, gender: Gender) -> List[VoiceProfile]:
|
|
198
|
+
"""
|
|
199
|
+
Filters and returns all voices matching the specified gender.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
gender: The gender to filter by ('female', 'male', or 'neutral').
|
|
203
|
+
Returns:
|
|
204
|
+
A list of matching VoiceProfile objects.
|
|
205
|
+
"""
|
|
206
|
+
return [
|
|
207
|
+
profile for profile in self._voices.values() if profile.gender == gender
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
def get_voices_by_characteristic(self, characteristic: str) -> List[VoiceProfile]:
|
|
211
|
+
"""
|
|
212
|
+
Filters and returns all voices with a specific characteristic (case-insensitive).
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
characteristic: The characteristic to search for (e.g., 'Clear', 'upbeat').
|
|
216
|
+
Returns:
|
|
217
|
+
A list of matching VoiceProfile objects.
|
|
218
|
+
"""
|
|
219
|
+
search_char = characteristic.lower()
|
|
220
|
+
return [
|
|
221
|
+
profile for profile in self._voices.values()
|
|
222
|
+
if profile.characteristic.lower() == search_char
|
|
223
|
+
]
|
parrot/models/groq.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
class GroqModel(Enum):
|
|
4
|
+
"""Description for Enabled Groq models.
|
|
5
|
+
|
|
6
|
+
Only these models are supporting Structured Output:
|
|
7
|
+
- meta-llama/llama-4-maverick-17b-128e-instruct
|
|
8
|
+
- meta-llama/llama-4-scout-17b-16e-instruct
|
|
9
|
+
|
|
10
|
+
Also, streaming output is not supported with structured outputs.
|
|
11
|
+
"""
|
|
12
|
+
KIMI_K2_INSTRUCT = "moonshotai/kimi-k2-instruct-0905"
|
|
13
|
+
LLAMA_4_SCOUT_17B = "meta-llama/llama-4-scout-17b-16e-instruct"
|
|
14
|
+
LLAMA_4_MAVERICK_17B = "meta-llama/llama-4-maverick-17b-128e-instruct"
|
|
15
|
+
MISTRAL_SABA_24B = "mistral-saba-24b"
|
|
16
|
+
DEEPSEEK_R1_DISTILL_70B = "deepseek-r1-distill-llama-70b"
|
|
17
|
+
LLAMA_3_3_70B_VERSATILE = "llama-3.3-70b-versatile"
|
|
18
|
+
LLAMA_3_1_8B_INSTANT = "llama-3.1-8b-instant"
|
|
19
|
+
GEMMA2_9B_IT = "gemma2-9b-it"
|
|
20
|
+
QWEN_QWEN3_32B = "qwen/qwen3-32b"
|
|
21
|
+
OPENAI_GPT_OSS_20B = "openai/gpt-oss-20b"
|
|
22
|
+
OPENAI_GPT_OSS_120B = "openai/gpt-oss-120b"
|
|
23
|
+
OPENAI_GPT_OSS_SAFEGUARD_20B = "openai/gpt-oss-safeguard-20b"
|
parrot/models/openai.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class OpenAIModel(Enum):
|
|
5
|
+
"""Enum class for OpenAI models."""
|
|
6
|
+
GPT5_MINI = "gpt-5-mini"
|
|
7
|
+
GPT5 = "gpt-5"
|
|
8
|
+
GPT5_CHAT = "gpt-5-chat-latest"
|
|
9
|
+
GPT5_PRO = "gpt-5-pro"
|
|
10
|
+
GPT5_NANO = "gpt-5-nano"
|
|
11
|
+
GPT4_TURBO = "gpt-4-turbo"
|
|
12
|
+
GPT3_5_TURBO = "gpt-3.5-turbo"
|
|
13
|
+
GPT4_1 = "gpt-4.1"
|
|
14
|
+
GPT_4_1_MINI = "gpt-4.1-mini"
|
|
15
|
+
GPT_4_1_NANO = "gpt-4.1-nano"
|
|
16
|
+
GPT_O4 = "gpt-4o-2024-08-06"
|
|
17
|
+
GPT4 = "gpt-4"
|
|
18
|
+
GPT_4O_MINI = "gpt-4o-mini"
|
|
19
|
+
GPT_4O_SEARCH = "gpt-4o-search-preview"
|
|
20
|
+
GPT_4O_MINI_SEARCH = "gpt-4o-mini-search-preview"
|
|
21
|
+
O4_MINI = "o4-mini"
|
|
22
|
+
O4_MINI_DEEP_RESEARCH = "o4-mini-deep-research"
|
|
23
|
+
O3 = "o3"
|
|
24
|
+
O3_MINI = "o3-mini"
|
|
25
|
+
O3_PRO = "o3-pro"
|
|
26
|
+
O3_DEEP_RESEARCH = "o3-deep-research"
|
|
27
|
+
GPT_4O = "gpt-4o"
|
|
28
|
+
GPT_IMAGE_1 = "gpt-image-1"
|
|
29
|
+
SORA = "sora"
|
|
30
|
+
SORA_2 = "sora-2"
|
parrot/models/outputs.py
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import (
|
|
3
|
+
List,
|
|
4
|
+
Optional,
|
|
5
|
+
Any,
|
|
6
|
+
Union,
|
|
7
|
+
Callable,
|
|
8
|
+
Literal,
|
|
9
|
+
get_type_hints,
|
|
10
|
+
get_origin,
|
|
11
|
+
get_args
|
|
12
|
+
)
|
|
13
|
+
from enum import Enum
|
|
14
|
+
from dataclasses import dataclass, fields, is_dataclass, MISSING
|
|
15
|
+
import json
|
|
16
|
+
from pydantic import BaseModel, Field
|
|
17
|
+
from .basic import OutputFormat
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class OutputType(str, Enum):
|
|
21
|
+
"""Types of outputs that can be rendered"""
|
|
22
|
+
TEXT = "text"
|
|
23
|
+
MARKDOWN = "markdown"
|
|
24
|
+
DATAFRAME = "dataframe"
|
|
25
|
+
FOLIUM_MAP = "folium_map"
|
|
26
|
+
PLOTLY_CHART = "plotly_chart"
|
|
27
|
+
MATPLOTLIB_FIGURE = "matplotlib_figure"
|
|
28
|
+
BOKEH_PLOT = "bokeh_plot"
|
|
29
|
+
ALTAIR_CHART = "altair_chart"
|
|
30
|
+
PANEL_DASHBOARD = "panel_dashboard"
|
|
31
|
+
HTML_WIDGET = "html_widget"
|
|
32
|
+
IMAGE = "image"
|
|
33
|
+
JSON_DATA = "json_data"
|
|
34
|
+
MIXED = "mixed" # Multiple output types
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class OutputMode(str, Enum):
|
|
38
|
+
"""Output mode enumeration"""
|
|
39
|
+
DEFAULT = "default" # Keep as-is (BaseModel/dataclass)
|
|
40
|
+
JSON = "json" # Serialize to JSON (using orjson)
|
|
41
|
+
TERMINAL = "terminal" # Render for terminal display (using Rich)
|
|
42
|
+
MARKDOWN = "markdown" # Convert to markdown
|
|
43
|
+
YAML = "yaml" # Serialize to YAML (using yaml-rs)
|
|
44
|
+
HTML = "html" # Convert to HTML elements (using Panel)
|
|
45
|
+
JINJA2 = "jinja2" # Pass to Jinja2 template (using jinja2 templates)
|
|
46
|
+
JUPYTER = "jupyter" # Render for Jupyter notebook
|
|
47
|
+
NOTEBOOK = "notebook" # Render for Jupyter notebook
|
|
48
|
+
TEMPLATE_REPORT = "template_report" # Pass to Jinja2 template (using jinja2 templates)
|
|
49
|
+
APPLICATION = "application" # Wrap in app (Streamlit/React/Svelte/HTML+TS)
|
|
50
|
+
CHART = "chart" # Generate chart visualization
|
|
51
|
+
ALTAIR = "altair" # Generate Altair chart visualization
|
|
52
|
+
PLOTLY = "plotly"
|
|
53
|
+
MATPLOTLIB = "matplotlib"
|
|
54
|
+
BOKEH = "bokeh"
|
|
55
|
+
SEABORN = "seaborn"
|
|
56
|
+
CODE = "code"
|
|
57
|
+
MAP = "map" # Generate map visualization
|
|
58
|
+
IMAGE = "image" # render the image as a base64 embed into HTML <img>
|
|
59
|
+
D3 = "d3" # Generate D3.js visualization
|
|
60
|
+
ECHARTS = "echarts" # Generate ECharts visualization
|
|
61
|
+
TABLE = "table" # Generate table visualization
|
|
62
|
+
HOLOVIEWS = "holoviews" # Generate HoloViews visualization
|
|
63
|
+
CARD = "card"
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class StructuredOutputConfig:
|
|
67
|
+
"""Configuration for structured output parsing."""
|
|
68
|
+
output_type: type
|
|
69
|
+
format: OutputFormat = OutputFormat.JSON
|
|
70
|
+
custom_parser: Optional[Callable[[str], Any]] = None
|
|
71
|
+
|
|
72
|
+
def get_schema(self) -> dict[str, Any]:
|
|
73
|
+
"""
|
|
74
|
+
Extract JSON schema from output_type.
|
|
75
|
+
Supports both Pydantic models and dataclasses.
|
|
76
|
+
"""
|
|
77
|
+
# Check if it's a Pydantic model
|
|
78
|
+
if hasattr(self.output_type, 'model_json_schema'):
|
|
79
|
+
# Pydantic v2
|
|
80
|
+
return self.output_type.model_json_schema()
|
|
81
|
+
elif hasattr(self.output_type, 'schema'):
|
|
82
|
+
# Pydantic v1
|
|
83
|
+
return self.output_type.schema()
|
|
84
|
+
|
|
85
|
+
# Check if it's a dataclass
|
|
86
|
+
elif is_dataclass(self.output_type):
|
|
87
|
+
return self._dataclass_to_schema(self.output_type)
|
|
88
|
+
|
|
89
|
+
else:
|
|
90
|
+
raise ValueError(
|
|
91
|
+
f"output_type must be a Pydantic model or dataclass, "
|
|
92
|
+
f"got {type(self.output_type)}"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
def _dataclass_to_schema(self, dc: type) -> dict[str, Any]:
|
|
96
|
+
"""Convert a dataclass to JSON schema."""
|
|
97
|
+
type_hints = get_type_hints(dc)
|
|
98
|
+
properties = {}
|
|
99
|
+
required = []
|
|
100
|
+
|
|
101
|
+
for field in fields(dc):
|
|
102
|
+
field_type = type_hints.get(field.name, Any)
|
|
103
|
+
field_schema = self._python_type_to_json_schema(field_type)
|
|
104
|
+
|
|
105
|
+
# Add description from field metadata if available
|
|
106
|
+
if field.metadata:
|
|
107
|
+
field_schema["description"] = field.metadata.get("description", "")
|
|
108
|
+
|
|
109
|
+
properties[field.name] = field_schema
|
|
110
|
+
|
|
111
|
+
# Check if field is required (no default value)
|
|
112
|
+
if field.default == field.default_factory == MISSING:
|
|
113
|
+
required.append(field.name)
|
|
114
|
+
|
|
115
|
+
schema = {
|
|
116
|
+
"type": "object",
|
|
117
|
+
"properties": properties,
|
|
118
|
+
"required": required,
|
|
119
|
+
"title": dc.__name__
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
# Add docstring as description if available
|
|
123
|
+
if dc.__doc__:
|
|
124
|
+
schema["description"] = dc.__doc__.strip()
|
|
125
|
+
|
|
126
|
+
return schema
|
|
127
|
+
|
|
128
|
+
def _python_type_to_json_schema(self, py_type: Any) -> dict[str, Any]:
|
|
129
|
+
"""Convert Python type hints to JSON schema types."""
|
|
130
|
+
origin = get_origin(py_type)
|
|
131
|
+
|
|
132
|
+
# Handle Optional types
|
|
133
|
+
if origin is Union:
|
|
134
|
+
args = get_args(py_type)
|
|
135
|
+
if type(None) in args:
|
|
136
|
+
# It's Optional[T]
|
|
137
|
+
non_none_types = [t for t in args if t is not type(None)]
|
|
138
|
+
if len(non_none_types) == 1:
|
|
139
|
+
return self._python_type_to_json_schema(non_none_types[0])
|
|
140
|
+
|
|
141
|
+
# Handle List types
|
|
142
|
+
if origin is list:
|
|
143
|
+
item_type = get_args(py_type)[0] if get_args(py_type) else Any
|
|
144
|
+
return {
|
|
145
|
+
"type": "array",
|
|
146
|
+
"items": self._python_type_to_json_schema(item_type)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
# Handle Dict types
|
|
150
|
+
if origin is dict:
|
|
151
|
+
return {"type": "object"}
|
|
152
|
+
|
|
153
|
+
# Basic type mappings
|
|
154
|
+
type_map = {
|
|
155
|
+
str: {"type": "string"},
|
|
156
|
+
int: {"type": "integer"},
|
|
157
|
+
float: {"type": "number"},
|
|
158
|
+
bool: {"type": "boolean"},
|
|
159
|
+
list: {"type": "array"},
|
|
160
|
+
dict: {"type": "object"},
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return type_map.get(py_type, {"type": "string"})
|
|
164
|
+
|
|
165
|
+
def format_schema_instruction(self) -> str:
|
|
166
|
+
"""
|
|
167
|
+
Format the schema as an instruction for the system prompt.
|
|
168
|
+
"""
|
|
169
|
+
schema = self.get_schema()
|
|
170
|
+
return f"""Respond with a valid JSON object that strictly matches the requested schema.
|
|
171
|
+
|
|
172
|
+
Schema:
|
|
173
|
+
```json
|
|
174
|
+
{json.dumps(schema, indent=2)}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Rules:
|
|
178
|
+
- Output ONLY valid JSON matching this schema
|
|
179
|
+
- Do not include any explanatory text before or after the JSON
|
|
180
|
+
- All required fields must be present
|
|
181
|
+
- Field types must match exactly"""
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class BoundingBox(BaseModel):
|
|
185
|
+
"""Represents a detected object with its location and details."""
|
|
186
|
+
object_id: str = Field(..., description="Unique identifier for this detection")
|
|
187
|
+
brand: str = Field(..., description="Product brand (Epson, HP, Canon, etc.)")
|
|
188
|
+
model: Optional[str] = Field(None, description="Product model if identifiable")
|
|
189
|
+
product_type: str = Field(
|
|
190
|
+
..., description="Type of product (printer, scanner, ink cartridge, etc.)"
|
|
191
|
+
)
|
|
192
|
+
description: str = Field(..., description="Brief description of the product")
|
|
193
|
+
confidence: float = Field(..., description="Confidence level (0.0 to 1.0)")
|
|
194
|
+
# Simple bounding box as [x1, y1, x2, y2] normalized coordinates (0.0 to 1.0)
|
|
195
|
+
bbox: List[float] = Field(
|
|
196
|
+
..., description="Bounding box coordinates [x1, y1, x2, y2] as normalized values (0.0-1.0)"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class ObjectDetectionResult(BaseModel):
|
|
201
|
+
"""A list of all prominent items detected in the image."""
|
|
202
|
+
analysis: str = Field(
|
|
203
|
+
...,
|
|
204
|
+
description="A detailed text analysis of the image that answers the user's prompt."
|
|
205
|
+
)
|
|
206
|
+
total_count: int = Field(..., description="Total number of products detected")
|
|
207
|
+
detections: List[BoundingBox] = Field(
|
|
208
|
+
default_factory=list,
|
|
209
|
+
description="A list of bounding boxes for all prominent detected objects."
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
class ImageGenerationPrompt(BaseModel):
|
|
213
|
+
"""Input schema for generating an image."""
|
|
214
|
+
prompt: str = Field(..., description="The main text prompt describing the desired image.")
|
|
215
|
+
styles: Optional[List[str]] = Field(default_factory=list, description="Optional list of styles to apply (e.g., 'photorealistic', 'cinematic', 'anime').")
|
|
216
|
+
model: str = Field(description="The image generation model to use.")
|
|
217
|
+
negative_prompt: Optional[str] = Field(None, description="A description of what to avoid in the image.")
|
|
218
|
+
aspect_ratio: str = Field(default="1:1", description="The desired aspect ratio (e.g., '1:1', '16:9', '9:16').")
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class SpeakerConfig(BaseModel):
|
|
222
|
+
"""Configuration for a single speaker in speech generation."""
|
|
223
|
+
name: str = Field(..., description="The name of the speaker in the script (e.g., 'Joe', 'Narrator').")
|
|
224
|
+
voice: str = Field(..., description="The pre-built voice name to use (e.g., 'Kore', 'Puck', 'Chitose').")
|
|
225
|
+
# Gender is often inferred from the voice, but can be included for clarity
|
|
226
|
+
gender: Optional[str] = Field(None, description="The gender associated with the voice (e.g., 'Male', 'Female').")
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class SpeechGenerationPrompt(BaseModel):
|
|
230
|
+
"""Input schema for generating speech from text."""
|
|
231
|
+
prompt: str = Field(
|
|
232
|
+
...,
|
|
233
|
+
description="The text to be converted to speech. For multiple speakers, use their names (e.g., 'Joe: Hello. Jane: Hi there.')."
|
|
234
|
+
)
|
|
235
|
+
speakers: List[SpeakerConfig] = Field(
|
|
236
|
+
...,
|
|
237
|
+
description="A list of speaker configurations. Use one for a single voice, multiple for a conversation."
|
|
238
|
+
)
|
|
239
|
+
model: Optional[str] = Field(default=None, description="The text-to-speech model to use.")
|
|
240
|
+
language: Optional[str] = Field("en-US", description="Language code for the conversation.")
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class VideoGenerationPrompt(BaseModel):
|
|
244
|
+
"""Input schema for generating video content."""
|
|
245
|
+
prompt: str = Field(..., description="The text prompt describing the desired video content.")
|
|
246
|
+
number_of_videos: int = Field(
|
|
247
|
+
default=1, description="The number of videos to generated per request."
|
|
248
|
+
)
|
|
249
|
+
model: str = Field(..., description="The video generation model to use.")
|
|
250
|
+
aspect_ratio: str = Field(
|
|
251
|
+
default="16:9", description="The desired aspect ratio (e.g., '16:9', '9:16')."
|
|
252
|
+
)
|
|
253
|
+
duration: Optional[int] = Field(None, description="Optional duration in seconds for the video.")
|
|
254
|
+
negative_prompt: Optional[str] = Field(
|
|
255
|
+
default='',
|
|
256
|
+
description="A description of what to avoid in the video."
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
class SentimentAnalysis(BaseModel):
|
|
260
|
+
"""Structured sentiment analysis response."""
|
|
261
|
+
sentiment: Literal["positive", "negative", "neutral", "mixed"] = Field(
|
|
262
|
+
description="Overall sentiment classification"
|
|
263
|
+
)
|
|
264
|
+
confidence_level: float = Field(
|
|
265
|
+
ge=0.0, le=1.0,
|
|
266
|
+
description="Confidence level as decimal between 0 and 1"
|
|
267
|
+
)
|
|
268
|
+
emotional_indicators: List[str] = Field(
|
|
269
|
+
description="List of words/phrases that indicate emotional content"
|
|
270
|
+
)
|
|
271
|
+
reason: str = Field(
|
|
272
|
+
description="Explanation of the sentiment analysis"
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class ProductReview(BaseModel):
|
|
277
|
+
"""Structured product review response."""
|
|
278
|
+
product_id: str = Field(..., description="Unique identifier for the product being reviewed")
|
|
279
|
+
product_name: str = Field(..., description="Name of the product being reviewed")
|
|
280
|
+
review_text: str = Field(..., description="The text of the product review")
|
|
281
|
+
rating: float = Field(..., description="Rating given to the product")
|
|
282
|
+
sentiment: Literal["positive", "negative", "neutral"] = Field(
|
|
283
|
+
..., description="Sentiment of the review"
|
|
284
|
+
)
|
|
285
|
+
key_features: list[str] = Field(..., description="Key features highlighted in the review")
|