[project] name = "griptape" version = "1.13.0" description = "Modular Python framework for LLM workflows, tools, memory, and data." authors = [{ name = "Griptape", email = "hello@griptape.ai" }] requires-python = ">=3.10, <4" readme = "README.md" license = "Apache-2.0" dependencies = [ "openai>=1.1.1", "attrs>=24.3.0", "jinja2>=3.1.4", "marshmallow>=3.21.3,<4", # TODO: Upgrade to 4.0 for griptape 2.0 "marshmallow-enum>=1.5.1", "tiktoken>=0.12", "rich>=13.7.1", "schema>=0.7.7", "pyyaml>=6.0.1", "tenacity>=8.5.0", "numpy>=1.26.4,<3", "requests>=2.32.0", "filetype>=1.2", "urllib3>=1.25.4,!=2.2.0,<3", "pydantic>=2.7.4", "wrapt>=1.16.0", "pip>=25.0.1", "json-schema-to-pydantic>=0.4.6", ] [project.optional-dependencies] drivers-prompt-cohere = ["cohere>=5.11.2"] drivers-prompt-anthropic = ["anthropic>=0.45.1"] drivers-prompt-huggingface-hub = [ "huggingface-hub>=0.28.1", "transformers>=4.41.1", ] drivers-prompt-huggingface-pipeline = ["transformers>=4.41.1"] drivers-prompt-amazon-bedrock = ["boto3>=1.34.119", "anthropic>=0.45.1"] drivers-prompt-amazon-sagemaker = ["boto3>=1.34.119", "transformers>=4.41.1"] drivers-prompt-google = ["google-genai>=1.73.1"] drivers-prompt-ollama = ["ollama>=0.4.1"] drivers-sql = ["sqlalchemy>=2.0.31"] drivers-sql-amazon-redshift = ["boto3>=1.34.119"] drivers-sql-snowflake = [ "sqlalchemy>=2.0.31", "snowflake-sqlalchemy>=1.6.1", "snowflake>=1.0.5", ] drivers-memory-conversation-amazon-dynamodb = ["boto3>=1.34.119"] drivers-memory-conversation-redis = ["redis>=5.1.0"] drivers-vector-marqo = ["marqo>=3.9.2"] drivers-vector-pinecone = ["pinecone>=6.0.1"] drivers-vector-mongodb = ["pymongo>=4.8.0"] drivers-vector-redis = ["redis>=5.1.0"] drivers-vector-opensearch = ["opensearch-py>=2.3.1"] drivers-vector-amazon-opensearch = ["opensearch-py>=2.3.1", "boto3>=1.34.119"] drivers-vector-pgvector = [ "sqlalchemy>=2.0.31", "pgvector>=0.3.4", "psycopg2-binary>=2.9.9", ] drivers-vector-qdrant = ["qdrant-client>=1.10.1"] drivers-vector-astra-db = ["astrapy>=2.0"] drivers-vector-pgai = ["sqlalchemy>=2.0.31"] drivers-embedding-amazon-bedrock = ["boto3>=1.34.119"] drivers-embedding-amazon-sagemaker = ["boto3>=1.34.119"] drivers-embedding-huggingface = [ "huggingface-hub>=0.28.1", "transformers>=4.41.1", ] drivers-embedding-voyageai = ["voyageai>=0.2.1"] drivers-embedding-google = ["google-genai>=1.73.1"] drivers-embedding-cohere = ["cohere>=5.11.2"] drivers-embedding-ollama = ["ollama>=0.4.1"] drivers-web-scraper-trafilatura = ["trafilatura>=2.0"] drivers-web-scraper-markdownify = [ "playwright>=1.42", "beautifulsoup4>=4.12.3", "markdownify>=1.0.0", ] drivers-web-search-duckduckgo = ["ddgs>=9.0.0"] drivers-web-search-tavily = ["tavily-python>=0.5.0"] drivers-web-search-exa = ["exa-py>=1.1.4"] drivers-event-listener-amazon-sqs = ["boto3>=1.34.119"] drivers-event-listener-amazon-iot = ["boto3>=1.34.119"] drivers-event-listener-pusher = ["pusher>=3.3.2"] drivers-text-to-speech-elevenlabs = ["elevenlabs>=1.1.2"] drivers-rerank-cohere = ["cohere>=5.11.2"] drivers-rerank-amazon-bedrock = ["boto3>=1.34.119"] drivers-rerank-voyageai = ["voyageai>=0.2.1"] drivers-observability-opentelemetry = [ "opentelemetry-sdk>=1.25.0", "opentelemetry-api>=1.25.0", "opentelemetry-instrumentation>=0.49b2", "opentelemetry-instrumentation-threading>=0.49b2", "opentelemetry-exporter-otlp-proto-http>=1.25.0", ] drivers-observability-griptape-cloud = [ "opentelemetry-sdk>=1.25.0", "opentelemetry-api>=1.25.0", "opentelemetry-instrumentation>=0.49b2", "opentelemetry-instrumentation-threading>=0.49b2", "opentelemetry-exporter-otlp-proto-http>=1.25.0", ] drivers-observability-datadog = [ "opentelemetry-sdk>=1.25.0", "opentelemetry-api>=1.25.0", "opentelemetry-instrumentation>=0.49b2", "opentelemetry-instrumentation-threading>=0.49b2", "opentelemetry-exporter-otlp-proto-http>=1.25.0", ] drivers-image-generation-huggingface = ["diffusers>=0.32.0", "pillow>=11.0.0"] drivers-file-manager-amazon-s3 = ["boto3>=1.34.119"] loaders-pdf = ["pypdf>=5.0.1"] loaders-image = ["pillow>=11.0.0"] loaders-email = ["mail-parser>=4.0.0"] loaders-sql = ["sqlalchemy>=2.0.31"] all = [ "cohere>=5.11.2", "anthropic>=0.45.1", "huggingface-hub>=0.28.1", "transformers>=4.41.1", "sqlalchemy>=2.0.31", "boto3>=1.34.119", "snowflake-sqlalchemy>=1.6.1", "snowflake>=1.0.5", "marqo>=3.9.2", "pinecone>=6.0.1", "qdrant-client>=1.10.1", "astrapy>=1.4", "pymongo>=4.8.0", "redis>=5.1.0", "opensearch-py>=2.3.1", "pgvector>=0.3.4", "psycopg2-binary>=2.9.9", "google-genai>=1.73.1", "trafilatura>=2.0", "playwright>=1.42", "beautifulsoup4>=4.12.3", "markdownify>=1.0.0", "voyageai>=0.2.1", "elevenlabs>=1.1.2", "pusher>=3.3.2", "ollama>=0.4.1", "ddgs>=9.0.0", "tavily-python>=0.5.0", "exa-py>=1.1.4", "opentelemetry-sdk>=1.25.0", "opentelemetry-api>=1.25.0", "opentelemetry-instrumentation>=0.49b2", "opentelemetry-instrumentation-threading>=0.49b2", "opentelemetry-exporter-otlp-proto-http>=1.25.0", "diffusers>=0.32.0", "pillow>=11.0.0", "pandas>=2.2", "pypdf>=5.0.1", "mail-parser>=4.0.0", ] [project.urls] Repository = "https://github.com/griptape-ai/griptape" [dependency-groups] test = [ "pytest>=8.3.1", "pytest-mock>=3.1.4", "mongomock>=4.1.2", "twine>=6.0.1", "moto[dynamodb, iotdata, sqs]>=5.0.16", "pytest-xdist>=3.3.1", "pytest-cov>=6.0.0", "pytest-env>=1.1.1", "fuzzywuzzy>=0.18.0", "pytest-clarity>=1.0.1", "torch>=2.4.1", # MCPTool installs these from griptape/tools/mcp/requirements.txt at runtime. # Tests need them at collection time, so keep the constraints in sync with that file. "mcp>=2,<3", "httpx2>=2.5.0", "exceptiongroup>=1.2.2", ] dev = [ "ruff>=0.9.1", "pyright>=1.1.376", "pre-commit>=4.0.0", "boto3-stubs[bedrock-runtime, bedrock-agent-runtime, iam, opensearch, s3, sagemaker-runtime, sqs, iot-data, dynamodb, redshift-data]>=1.34.105", "typos>=1.22.9", "mdformat>=0.7.17", "mdformat-gfm>=0.4.1", "mdformat-frontmatter>=2.0.8", "mdformat-footnote>=0.1.1", "mdformat-mkdocs>=4.1.2", ] docs = [ "mkdocs>=1.5.2", "mkdocs-material>=9.2.8", "mkdocs-glightbox>=0.4.0", "mkdocstrings[python]>=0.28.0", "mkdocs-gen-files>=0.5.0", "mkdocs-literate-nav>=0.6.0", "mkdocs-section-index>=0.3.6", "pymdown-extensions>=10.17", "mkdocs-autorefs>=1.3.0", ] [tool.uv] default-groups = ["test", "dev", "docs"] [tool.hatch.build.targets.sdist] include = ["griptape"] [tool.hatch.build.targets.wheel] include = ["griptape"] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.ruff] line-length = 120 [tool.ruff.lint] select = ["ALL"] ignore = [ "E501", # line-too-long "B024", # abstract-base-class-without-abstract-method "B010", # set-attr-with-constant "D100", # undocumented-public-module "D101", # undocumented-public-class "D102", # undocumented-public-method "D103", # undocumented-public-function "D104", # undocumented-public-package "D105", # undocumented-magic-method "D106", # undocumented-public-nested-class "D107", # undocumented-public-init "COM812", # missing-trailing-comma -- See https://github.com/astral-sh/ruff/issues/9216 "ANN002", # missing-type-args "ANN003", # missing-type-kwargs "ANN401", # any-type "PT011", # pytest-raises-too-broad "LOG015", # root-logger-call "EM101", # raw-string-in-exception "BLE001", # blind-except "S", # flake8-bandit "PTH", # flake8-use-pathlib "TRY", # tryceratops "PLR", # pylint-refactor "RUF", # ruff "PERF", # perflint "ARG", # flake8-unused-arguments "DTZ", # flake8-datetimez "FIX002", # flake8-fixme "TD003", # missing-todo-links "TD002", # missing-todo-author "SLF001", # private-member-access "EM102", # f-string-in-exception "PLC0415", # import-outside-top-level "A003", # builtin-attribute-shadowing "FBT001", # boolean-typed-positional-argument ] [tool.ruff.lint.pydocstyle] convention = "google" [tool.ruff.lint.flake8-pytest-style] fixture-parentheses = true [tool.ruff.lint.per-file-ignores] "__init__.py" = [ "I", # isort ] "tests/*" = [ "ANN001", # missing-type-function-argument "ANN201", # missing-return-type-undocumented-public-function "ANN202", # missing-return-type-private-function "S101", # assert "PLR2004", # magic-value-comparison "PYI024", # collections-named-tuple "INP001", # implicit-namespace-package "FIX004", # line-contains-hack ] "docs/*" = [ "T20", # flake8-print "INP001", # implicit-namespace-package ] [tool.ruff.lint.flake8-tidy-imports.banned-api] "attr".msg = "The attr module is deprecated, use attrs instead." [tool.ruff.lint.flake8-type-checking] runtime-evaluated-base-classes = ["pydantic.BaseModel"] [tool.pyright] venvPath = "." venv = ".venv" include = ["griptape"] exclude = ["**/__pycache__"] pythonVersion = "3.10" reportIncompatibleVariableOverride = "none" # see thread: https://github.com/microsoft/pyright/issues/5933 enableExperimentalFeatures = true # https://github.com/microsoft/pyright/issues/7713 strictParameterNoneValue = false [tool.pytest.ini_options] markers = ["skip_mock_config"] [tool.pytest_env] OPENAI_API_KEY = { value = "api-key", skip_if_set = true } AZURE_OPENAI_API_KEY = { value = "api-key", skip_if_set = true }