mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2026-07-09 16:09:13 +00:00
Co-authored-by: Shuchang Zheng <wintonzheng0325@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
358 lines
11 KiB
TOML
358 lines
11 KiB
TOML
[project]
|
|
name = "skyvern"
|
|
version = "1.0.46"
|
|
description = ""
|
|
authors = [{ name = "Skyvern AI", email = "info@skyvern.com" }]
|
|
requires-python = ">=3.11,<3.14"
|
|
readme = "README.md"
|
|
|
|
dependencies = [
|
|
"python-dotenv>=1.0.0,<2",
|
|
"pydantic>=2.5.2,<3",
|
|
"pydantic-settings>=2.1.0,<3",
|
|
"cachetools>=5.3.2,<6",
|
|
"orjson>=3.9.10,<4",
|
|
"structlog>=23.2.0,<24",
|
|
"typer>=0.16.0,<0.26",
|
|
"click>=8,<9",
|
|
"httpx[socks]>=0.27.0",
|
|
"rich>=13.7.0,<14",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
# Embedded local mode is currently a Forge-backed compatibility bridge. It is
|
|
# smaller than the full server install because it excludes backend process,
|
|
# Postgres, MCP server, and cloud product packages, but it is not a minimal
|
|
# browser-only runtime until local stops importing Forge internals.
|
|
local = [
|
|
"azure-storage-blob>=12.26.0",
|
|
"google-cloud-storage>=2.18,<4",
|
|
"openai>=1.68.2",
|
|
"yutori>=0.5.0",
|
|
"sqlalchemy>=2.0.29,<3",
|
|
"aiohttp>=3.13.4,<4",
|
|
"python-multipart>=0.0.30,<1",
|
|
"toml>=0.10.2,<0.11",
|
|
"jinja2>=3.1.2,<4",
|
|
"litellm>=1.84.0",
|
|
"playwright>1.46.0 ; python_version >= '3.12' and python_version < '3.14'",
|
|
"playwright==1.46.0 ; python_version >= '3.11' and python_version < '3.12'",
|
|
"greenlet>3.0.3 ; python_version >= '3.12' and python_version < '3.14'",
|
|
"greenlet==3.0.3 ; python_version >= '3.11' and python_version < '3.12'",
|
|
"pillow>=10.2.0",
|
|
"starlette-context>=0.3.6,<0.6",
|
|
"fastapi>=0.136.1,<0.137",
|
|
"alembic>=1.12.1,<2",
|
|
"PyJWT[crypto]>=2.13.0,<3",
|
|
"aioboto3>=14.3.0,<15",
|
|
"asyncache>=0.3.1,<0.4",
|
|
"filetype>=1.2.0,<2",
|
|
"fuzzysearch>=0.8,<1",
|
|
"tldextract>=5.1.2,<6",
|
|
"websockets>=12.0,<15.1",
|
|
"email-validator>=2.2.0,<3",
|
|
"requests-toolbelt>=1.0.0,<2",
|
|
"aiofiles>=24.1.0,<25",
|
|
"pyotp>=2.9.0,<3",
|
|
"json5>=0.13.0,<1",
|
|
"json-repair>=0.59.5,<0.60",
|
|
"pypdf>=6.12.0,<7",
|
|
"pdfplumber>=0.11.0,<0.12",
|
|
"psutil>=7.0.0",
|
|
"tiktoken>=0.9.0",
|
|
"anthropic>=0.97.0,<0.98",
|
|
"google-cloud-aiplatform>=1.149.0,<2",
|
|
"google-auth>=2.49.2,<3",
|
|
"google-auth-oauthlib>=1.3.1,<2",
|
|
"onepassword-sdk==0.4.0",
|
|
"lark>=1.2.2,<2",
|
|
"libcst>=1.8.2,<2",
|
|
"curlparser>=0.1.0,<0.2",
|
|
"pandas>=2.3.1,<4",
|
|
"azure-identity>=1.24.0,<2",
|
|
"azure-keyvault-secrets>=4.2.0,<5",
|
|
"google-cloud-secret-manager>=2.29,<3",
|
|
"jsonschema>=4.23.0",
|
|
"python-calamine>=0.6.1",
|
|
"python-docx>=1.1.0",
|
|
"urllib3>=2.7.0",
|
|
"zstandard>=0.25.0",
|
|
"sse-starlette>=3.4.1,<4",
|
|
"opentelemetry-api>=1.41.1,<2",
|
|
"croniter>=1.3.8,<4",
|
|
"authlib>=1.7.1",
|
|
"pyasn1>=0.6.3",
|
|
"tornado>=6.5.6",
|
|
"cryptography>=48.0.1",
|
|
"starlette>=1.3.1",
|
|
"aiosqlite>=0.21.0,<0.23",
|
|
]
|
|
# Server is intentionally a superset of local. Keep shared runtime deps in sync
|
|
# with local until the embedded runtime is separated from Forge/server internals.
|
|
server = [
|
|
"azure-storage-blob>=12.26.0",
|
|
"google-cloud-storage>=2.18,<4",
|
|
"openai>=1.68.2",
|
|
"yutori>=0.5.0",
|
|
# Plain pip sees LiteLLM's exact openai pin and therefore resolves this
|
|
# range to openai-agents 0.10.x. Cloud/source installs include the cloud
|
|
# group below, where uv overrides let the newer 0.14.x SDK resolve.
|
|
"openai-agents>=0.10.5,<0.15",
|
|
"python-dotenv==1.2.2",
|
|
"sqlalchemy[mypy]>=2.0.29,<3",
|
|
"aiohttp>=3.13.4,<4",
|
|
"python-multipart>=0.0.30,<1",
|
|
"toml>=0.10.2,<0.11",
|
|
"jinja2>=3.1.2,<4",
|
|
"uvicorn[standard]>=0.44.0",
|
|
"litellm>=1.84.0",
|
|
"playwright>1.46.0 ; python_version >= '3.12' and python_version < '3.14'",
|
|
"playwright==1.46.0 ; python_version >= '3.11' and python_version < '3.12'",
|
|
"greenlet>3.0.3 ; python_version >= '3.12' and python_version < '3.14'",
|
|
"greenlet==3.0.3 ; python_version >= '3.11' and python_version < '3.12'",
|
|
"pillow>=10.2.0",
|
|
"starlette-context>=0.3.6,<0.6",
|
|
"fastapi>=0.136.1,<0.137",
|
|
"psycopg[binary, pool]==3.1.18 ; python_version >= '3.11' and python_version < '3.13'",
|
|
"psycopg[binary, pool]>=3.2.2,<3.3.0 ; python_version >= '3.13' and python_version < '3.14'",
|
|
"alembic>=1.12.1,<2",
|
|
"PyJWT[crypto]>=2.13.0,<3",
|
|
"aioboto3>=14.3.0,<15",
|
|
"asyncache>=0.3.1,<0.4",
|
|
"types-toml>=0.10.8.7,<0.11",
|
|
"filetype>=1.2.0,<2",
|
|
"fuzzysearch>=0.8,<1",
|
|
"aioredlock>=0.7.3,<0.8",
|
|
"tldextract>=5.1.2,<6",
|
|
"websockets>=12.0,<15.1",
|
|
"email-validator>=2.2.0,<3",
|
|
"requests-toolbelt>=1.0.0,<2",
|
|
"posthog>=3.7.0,<4",
|
|
"aiofiles>=24.1.0,<25",
|
|
"pyotp>=2.9.0,<3",
|
|
"asyncpg>=0.30.0,<0.32",
|
|
"json5>=0.13.0,<1",
|
|
"json-repair>=0.59.5,<0.60",
|
|
"pypdf>=6.12.0,<7",
|
|
"pdfplumber>=0.11.0,<0.12",
|
|
# <3.4: 3.4.3 enables HostOriginGuardMiddleware by default (421 on public hosts, SKY-12003).
|
|
# cloud_app passes allowed_hosts/allowed_origins when supported; validate against 3.4.x before raising.
|
|
"fastmcp>=3.2.0,<3.4",
|
|
"psutil>=7.0.0",
|
|
"tiktoken>=0.9.0",
|
|
"anthropic>=0.97.0,<0.98",
|
|
"google-cloud-aiplatform>=1.149.0,<2",
|
|
"google-auth>=2.49.2,<3",
|
|
"google-auth-oauthlib>=1.3.1,<2",
|
|
"onepassword-sdk==0.4.0",
|
|
"types-boto3[full]>=1.38.31,<2",
|
|
"lark>=1.2.2,<2",
|
|
"libcst>=1.8.2,<2",
|
|
"curlparser>=0.1.0,<0.2",
|
|
"pandas>=2.3.1,<4",
|
|
"azure-identity>=1.24.0,<2",
|
|
"azure-keyvault-secrets>=4.2.0,<5",
|
|
"google-cloud-secret-manager>=2.29,<3",
|
|
"jsonschema>=4.23.0",
|
|
"python-calamine>=0.6.1",
|
|
"python-docx>=1.1.0",
|
|
"urllib3>=2.7.0",
|
|
"zstandard>=0.25.0",
|
|
"sse-starlette>=3.4.1,<4",
|
|
"opentelemetry-api>=1.41.1,<2",
|
|
"croniter>=1.3.8,<4",
|
|
"authlib>=1.7.1",
|
|
"pyasn1>=0.6.3",
|
|
"tornado>=6.5.6",
|
|
"cryptography>=48.0.1",
|
|
"starlette>=1.3.1",
|
|
"aiosqlite>=0.21.0,<0.23",
|
|
]
|
|
|
|
[dependency-groups]
|
|
cloud = [
|
|
# Remote-browser vendor SDKs used only by cloud-side factories.
|
|
"browser-use-sdk>=3.8,<4",
|
|
"anchorbrowser>=0.11,<0.12",
|
|
# Keep workflow-copilot on the newer Agents SDK for cloud/source installs.
|
|
# uv's override-dependencies below relax LiteLLM's exact transitive pins,
|
|
# but those overrides do not ship in public wheel metadata.
|
|
"openai-agents>=0.14.8,<0.15",
|
|
"stripe>=15.0.1,<16",
|
|
"temporalio[opentelemetry]>=1.6.0,<2",
|
|
"temporalio>=1.6.0,<2",
|
|
"redis>=5.0.3,<6",
|
|
"pyrate-limiter>=3.7.0,<4",
|
|
"opentelemetry-exporter-otlp-proto-grpc>=1.41.1,<2",
|
|
"kr8s>=0.20.14,<1",
|
|
# OpenTelemetry instrumentation
|
|
"opentelemetry-distro>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-fastapi>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-asyncpg>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-sqlalchemy>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-redis>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-httpx>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-aiohttp-client>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-logging>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-asyncio>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-botocore>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-grpc>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-requests>=0.60b1,<1",
|
|
"opentelemetry-instrumentation-urllib3>=0.60b1,<1",
|
|
]
|
|
dev = [
|
|
"isort>=5.13.2",
|
|
"mypy>=1.18.2,<2",
|
|
"types-requests>=2.31.0.2,<3",
|
|
"pytest>=7.4.0,<8",
|
|
"pytest-asyncio>=0.21.1,<0.22",
|
|
"pytest-split>=0.10.0,<1",
|
|
# Needed by tests/unit/test_llm_handler_tracing.py which exercises the LLM
|
|
# chokepoint's OTEL instrumentation. Cloud runtime also uses this via
|
|
# cloud/observability/, but that ships via the `cloud` group's transitive
|
|
# closure (opentelemetry-distro, instrumentation-*). Placing it here keeps
|
|
# the test collectable in OSS envs, which only sync the `dev` group.
|
|
"opentelemetry-sdk>=1.39.0,<2",
|
|
"autoflake>=2.2.0,<3",
|
|
"pydevd-pycharm>=233.6745.319,<234",
|
|
"ipython>=8.17.2,<9",
|
|
"ipykernel>=6.26.0,<8",
|
|
"notebook>=7.5.6,<8",
|
|
"freezegun>=1.2.2,<2",
|
|
"fpdf>=1.7.2,<2",
|
|
"twine>=6.1.0,<7",
|
|
"build>=1.2.2.post1,<2",
|
|
"pre-commit>=4.2.0,<5",
|
|
"ruff>=0.15.12,<0.16",
|
|
"aiosqlite>=0.21.0,<0.23",
|
|
"moto[s3, server]>=5.1.5,<6",
|
|
"curlify>=3.0.0",
|
|
"openpyxl>=3.1.0",
|
|
"gspread>=6",
|
|
"python-pptx>=1.0.2",
|
|
"pyinstrument>=5.1.2",
|
|
"pip-audit>=2.10.0",
|
|
]
|
|
|
|
[tool.hatch.build]
|
|
packages = ["skyvern"]
|
|
|
|
[tool.hatch.build.targets.sdist]
|
|
include = [
|
|
"skyvern",
|
|
"alembic",
|
|
]
|
|
exclude = [
|
|
"skyvern-frontend/.env",
|
|
"skyvern-frontend/.env.*",
|
|
"skyvern-frontend/node_modules",
|
|
"skyvern-frontend/dist",
|
|
]
|
|
[tool.hatch.build.targets.sdist.force-include]
|
|
"alembic" = "alembic"
|
|
[tool.hatch.build.targets.wheel]
|
|
include = [
|
|
"skyvern",
|
|
]
|
|
[tool.hatch.build.targets.wheel.force-include]
|
|
"alembic" = "alembic"
|
|
|
|
[tool.uv]
|
|
# Supply chain quarantine: block packages published less than 7 days ago.
|
|
# Override for urgent cases: uv add <pkg> --exclude-newer ""
|
|
# exclude-newer = "7 days"
|
|
override-dependencies = [
|
|
# litellm 1.83.7+ pins these exactly; relax so they coexist with our deps
|
|
# (openai-agents needs openai>=2.26, fastmcp needs python-dotenv>=1.1).
|
|
"jsonschema>=4.23.0",
|
|
"python-dotenv>=1.0.0",
|
|
"openai>=2.24.0",
|
|
# yutori SDK pins httpx<0.28 but skyvern's fastmcp needs >=0.28.1
|
|
"httpx[socks]>=0.26.0",
|
|
# litellm exact-pins aiohttp; relax so the security-patched
|
|
# 3.14.x resolves for cloud/source installs (plain pip keeps litellm's pin).
|
|
"aiohttp>=3.14.0",
|
|
# A remote-browser vendor SDK declares playwright>=1.55, but the local/server
|
|
# groups pin playwright==1.46.0 on python<3.12 for binary-compat. Skyvern
|
|
# connects to the remote session via its own playwright, so the SDK's
|
|
# playwright dep is unused at runtime. Relax it to match.
|
|
"playwright>=1.46.0",
|
|
]
|
|
constraint-dependencies = [
|
|
"authlib>=1.7.1",
|
|
"cryptography>=48.0.1",
|
|
"flask>=3.1.3",
|
|
"idna>=3.15",
|
|
"joserfc>=1.6.8",
|
|
"jupyter-server>=2.20.0",
|
|
"msgpack>=1.2.1",
|
|
"mako>=1.3.12",
|
|
"mistune>=3.2.1",
|
|
"pyasn1>=0.6.3",
|
|
"starlette>=1.3.1",
|
|
"tornado>=6.5.6",
|
|
"werkzeug>=3.1.6",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.ruff]
|
|
exclude = [
|
|
".bzr",
|
|
".direnv",
|
|
".eggs",
|
|
".git",
|
|
".git-rewrite",
|
|
".hg",
|
|
".ipynb_checkpoints",
|
|
".mypy_cache",
|
|
".nox",
|
|
".pants.d",
|
|
".pyenv",
|
|
".pytest_cache",
|
|
".pytype",
|
|
".ruff_cache",
|
|
".svn",
|
|
".tox",
|
|
".venv",
|
|
".vscode",
|
|
"__pypackages__",
|
|
"_build",
|
|
"buck-out",
|
|
"build",
|
|
"dist",
|
|
"node_modules",
|
|
"site-packages",
|
|
"venv",
|
|
"alembic/env.py",
|
|
"cloud/extensions",
|
|
"skyvern-frontend",
|
|
"skyvern/client",
|
|
"notebooks",
|
|
"internal",
|
|
]
|
|
line-length = 120
|
|
target-version = "py311"
|
|
|
|
[tool.ruff.lint]
|
|
extend-select = ["B009", "B010"] # flake8-bugbear: no getattr/setattr with a constant attribute name
|
|
|
|
[tool.isort]
|
|
profile = "black"
|
|
multi_line_output = 3
|
|
include_trailing_comma = true
|
|
force_grid_wrap = 0
|
|
use_parentheses = true
|
|
ensure_newline_before_comments = true
|
|
line_length = 120
|
|
sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"]
|
|
skip_glob = [".tox", "__pycache__", "*.pyc", "venv*/*", "reports", "venv", "env", "node_modules", ".env", ".venv", "dist"]
|
|
skip = ["webeye/actions/__init__.py", "forge/sdk/__init__.py"]
|
|
|
|
[tool.mypy]
|
|
plugins = "sqlalchemy.ext.mypy.plugin"
|
|
|
|
[project.scripts]
|
|
skyvern = "skyvern.__main__:main"
|