diff --git a/README.md b/README.md index 795a5d34..62d0e2db 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@

-[Skyvern](https://www.skyvern.com) automates browser-based workflows using LLMs and computer vision. It provides a simple API endpoint to fully automate manual workflows on a large number of websites, replacing brittle or unreliable automation solutions. +[Skyvern](https://www.skyvern.com) automates browser-based workflows using LLMs and computer vision. It provides a Playwright-compatible SDK that adds AI functionality on top of playwright, as well as a no-code workflow builder to help both technical and non-technical users automate manual workflows on any website, replacing brittle or unreliable automation solutions.

@@ -48,32 +48,12 @@ This approach has a few advantages: 1. Skyvern can operate on websites it's never seen before, as it's able to map visual elements to actions necessary to complete a workflow, without any customized code 1. Skyvern is resistant to website layout changes, as there are no pre-determined XPaths or other selectors our system is looking for while trying to navigate 1. Skyvern is able to take a single workflow and apply it to a large number of websites, as it's able to reason through the interactions necessary to complete the workflow -1. Skyvern leverages LLMs to reason through interactions to ensure we can cover complex situations. Examples include: - 1. If you wanted to get an auto insurance quote from Geico, the answer to a common question "Were you eligible to drive at 18?" could be inferred from the driver receiving their license at age 16 - 1. If you were doing competitor analysis, it's understanding that an Arnold Palmer 22 oz can at 7/11 is almost definitely the same product as a 23 oz can at Gopuff (even though the sizes are slightly different, which could be a rounding error!) - A detailed technical report can be found [here](https://www.skyvern.com/blog/skyvern-2-0-state-of-the-art-web-navigation-with-85-8-on-webvoyager-eval/). # Demo https://github.com/user-attachments/assets/5cab4668-e8e2-4982-8551-aab05ff73a7f -# Performance & Evaluation - -Skyvern has SOTA performance on the [WebBench benchmark](webbench.ai) with a 64.4% accuracy. The technical report + evaluation can be found [here](https://www.skyvern.com/blog/web-bench-a-new-way-to-compare-ai-browser-agents/) - -

- -

- -## Performance on WRITE tasks (eg filling out forms, logging in, downloading files, etc) - -Skyvern is the best performing agent on WRITE tasks (eg filling out forms, logging in, downloading files, etc), which is primarily used for RPA (Robotic Process Automation) adjacent tasks. - -

- -

- # Quickstart ## Skyvern Cloud @@ -81,7 +61,11 @@ Skyvern is the best performing agent on WRITE tasks (eg filling out forms, loggi If you'd like to try it out, navigate to [app.skyvern.com](https://app.skyvern.com) and create an account. -## Install & Run +## Run Locally (UI + Server) + +Choose your preferred setup method: + +### Option A: pip install (Recommended) Dependencies needed: - [Python 3.11.x](https://www.python.org/downloads/), works with 3.12, not ready yet for 3.13 @@ -91,14 +75,13 @@ Additionally, for Windows: - [Rust](https://rustup.rs/) - VS Code with C++ dev tools and Windows SDK -### 1. Install Skyvern +#### 1. Install Skyvern ```bash pip install skyvern ``` -### 2. Run Skyvern -This is most helpful for first time run (db setup, db migrations etc). +#### 2. Run Skyvern ```bash skyvern quickstart @@ -111,20 +94,140 @@ local Docker PostgreSQL setup: skyvern quickstart --database-string "postgresql+psycopg://user:password@localhost:5432/skyvern" ``` -### 3. Run task +### Option B: Docker Compose -#### UI (Recommended) +1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop/) +2. Clone the repository: + ```bash + git clone https://github.com/skyvern-ai/skyvern.git && cd skyvern + ``` +3. Run quickstart with Docker Compose: + ```bash + pip install skyvern && skyvern quickstart + ``` + When prompted, choose "Docker Compose" for the full containerized setup. +4. Navigate to http://localhost:8080 -Start the Skyvern service and UI (when DB is up and running) +## SDK +**Skyvern is a Playwright extension that adds AI-powered browser automation.** It gives you the full power of Playwright with additional AI capabilities—use natural language prompts to interact with elements, extract data, and automate complex multi-step workflows. + +**Installation:** +- Python: `pip install skyvern` then run `skyvern quickstart` for local setup +- TypeScript: `npm install @skyvern/client` + +### AI-Powered Page Commands + +Skyvern adds four core AI commands directly on the page object: + +| Command | Description | +|---------|-------------| +| `page.act(prompt)` | Perform actions using natural language (e.g., "Click the login button") | +| `page.extract(prompt, schema)` | Extract structured data from the page with optional JSON schema | +| `page.validate(prompt)` | Validate page state, returns `bool` (e.g., "Check if user is logged in") | +| `page.prompt(prompt, schema)` | Send arbitrary prompts to the LLM with optional response schema | + +Additionally, `page.agent` provides higher-level workflow commands: + +| Command | Description | +|---------|-------------| +| `page.agent.run_task(prompt)` | Execute complex multi-step tasks | +| `page.agent.login(credential_type, credential_id)` | Authenticate with stored credentials (Skyvern, Bitwarden, 1Password) | +| `page.agent.download_files(prompt)` | Navigate and download files | +| `page.agent.run_workflow(workflow_id)` | Execute pre-built workflows | + +### AI-Augmented Playwright Actions + +All standard Playwright actions support an optional `prompt` parameter for AI-powered element location: + +| Action | Playwright | AI-Augmented | +|--------|------------|--------------| +| Click | `page.click("#btn")` | `page.click(prompt="Click login button")` | +| Fill | `page.fill("#email", "a@b.com")` | `page.fill(prompt="Email field", value="a@b.com")` | +| Select | `page.select_option("#country", "US")` | `page.select_option(prompt="Country dropdown", value="US")` | +| Upload | `page.upload_file("#file", "doc.pdf")` | `page.upload_file(prompt="Upload area", files="doc.pdf")` | + +**Three interaction modes:** +```python +# 1. Traditional Playwright - CSS/XPath selectors +await page.click("#submit-button") + +# 2. AI-powered - natural language +await page.click(prompt="Click the green Submit button") + +# 3. AI fallback - tries selector first, falls back to AI if it fails +await page.click("#submit-btn", prompt="Click the Submit button") +``` + +### Core AI Commands - Examples + +```python +# act - Perform actions using natural language +await page.act("Click the login button and wait for the dashboard to load") + +# extract - Extract structured data with optional JSON schema +result = await page.extract("Get the product name and price") +result = await page.extract( + prompt="Extract order details", + schema={"order_id": "string", "total": "number", "items": "array"} +) + +# validate - Check page state (returns bool) +is_logged_in = await page.validate("Check if the user is logged in") + +# prompt - Send arbitrary prompts to the LLM +summary = await page.prompt("Summarize what's on this page") +``` + +### Quick Start Examples + +**Run via UI:** ```bash skyvern run all ``` +Navigate to http://localhost:8080 to run tasks through the web interface. -Go to http://localhost:8080 and use the UI to run a task +**Python SDK:** +```python +from skyvern import Skyvern -#### Code +# Local mode +skyvern = Skyvern.local() +# Or connect to Skyvern Cloud +skyvern = Skyvern(api_key="your-api-key") + +# Launch browser and get page +browser = await skyvern.launch_cloud_browser() +page = await browser.get_working_page() + +# Mix Playwright with AI-powered actions +await page.goto("https://example.com") +await page.click("#login-button") # Traditional Playwright +await page.agent.login(credential_type="skyvern", credential_id="cred_123") # AI login +await page.click(prompt="Add first item to cart") # AI-augmented click +await page.agent.run_task("Complete checkout with: John Snow, 12345") # AI task +``` + +**TypeScript SDK:** +```typescript +import { Skyvern } from "@skyvern/client"; + +const skyvern = new Skyvern({ apiKey: "your-api-key" }); +const browser = await skyvern.launchCloudBrowser(); +const page = await browser.getWorkingPage(); + +// Mix Playwright with AI-powered actions +await page.goto("https://example.com"); +await page.click("#login-button"); // Traditional Playwright +await page.agent.login("skyvern", { credentialId: "cred_123" }); // AI login +await page.click({ prompt: "Add first item to cart" }); // AI-augmented click +await page.agent.runTask("Complete checkout with: John Snow, 12345"); // AI task + +await browser.close(); +``` + +**Simple task execution:** ```python from skyvern import Skyvern @@ -132,88 +235,6 @@ skyvern = Skyvern() task = await skyvern.run_task(prompt="Find the top post on hackernews today") print(task) ``` -Skyvern starts running the task in a browser that pops up and closes it when the task is done. You will be able to view the task from http://localhost:8080/history - -You can also run a task on different targets: -```python -from skyvern import Skyvern - -# Run on Skyvern Cloud -skyvern = Skyvern(api_key="SKYVERN API KEY") - -# Local Skyvern service -skyvern = Skyvern(base_url="http://localhost:8000", api_key="LOCAL SKYVERN API KEY") - -task = await skyvern.run_task(prompt="Find the top post on hackernews today") -print(task) -``` - -## SDK - -**Installation:** -- Python: `pip install skyvern` then run `skyvern quickstart` for local setup -- TypeScript: `npm install @skyvern/client` - -Skyvern provides SDKs for both Python and TypeScript to integrate browser automation into your applications. - -### Python SDK - -```python -from skyvern import Skyvern - -# Connect to Skyvern Cloud -skyvern = Skyvern(api_key="your-api-key") - -# Or run locally -skyvern = Skyvern.local() - -# Launch a cloud browser -browser = await skyvern.launch_cloud_browser() -page = await browser.get_working_page() - -# Use AI-powered actions for complex workflows -await page.agent.run_task("Navigate to the most recent invoice and download it") - -# Or mix with Playwright actions -await page.goto("https://example.com") -await page.click("#button") -``` - -### TypeScript SDK - -```typescript -import { Skyvern } from "@skyvern/client"; - -// Connect to Skyvern Cloud -const skyvern = new Skyvern({ apiKey: "your-api-key" }); - -// Launch a cloud browser -const browser = await skyvern.launchCloudBrowser(); -const page = await browser.getWorkingPage(); - -// Use AI-powered actions for complex workflows -await page.agent.runTask("Navigate to the most recent invoice and download it"); - -// Or mix with Playwright actions -await page.goto("https://example.com"); -await page.click("#button"); -``` - -Skyvern enhances Playwright methods with AI capabilities. Use regular Playwright syntax with a `prompt` parameter to make any action AI-powered: - -```python -# Traditional Playwright - uses selectors -await page.click("#submit-button") - -# AI-augmented Playwright - uses natural language -await page.click(prompt="Click on the Submit button") -await page.fill(prompt="Enter email address", value="user@example.com") - -# Mix both approaches in the same workflow -await page.goto("https://example.com/dashboard") -await page.click(prompt="Click on the most recent unpaid invoice") -await page.click("#download-button") -``` ## Advanced Usage @@ -311,28 +332,21 @@ skyvern stop ui skyvern stop server ``` -## Docker Compose setup +# Performance & Evaluation -1. Make sure you have [Docker Desktop](https://www.docker.com/products/docker-desktop/) installed and running on your machine -1. Make sure you don't have postgres running locally (Run `docker ps` to check) -1. Clone the repository and navigate to the root directory -1. Run `skyvern init llm` to generate a `.env` file. This will be copied into the Docker image. -1. Fill in the LLM provider key on the [docker-compose.yml](./docker-compose.yml). *If you want to run Skyvern on a remote server, make sure you set the correct server ip for the UI container in [docker-compose.yml](./docker-compose.yml).* -2. Run the following command via the commandline: - ```bash - docker compose up -d - ``` -3. Navigate to `http://localhost:8080` in your browser to start using the UI +Skyvern has SOTA performance on the [WebBench benchmark](webbench.ai) with a 64.4% accuracy. The technical report + evaluation can be found [here](https://www.skyvern.com/blog/web-bench-a-new-way-to-compare-ai-browser-agents/) -> [!Important] -> Only one Postgres container can run on port 5432 at a time. If you switch from the CLI-managed Postgres to Docker Compose, you must first remove the original container: -> ```bash -> docker rm -f postgresql-container -> ``` +

+ +

-If you encounter any database related errors while using Docker to run Skyvern, check which Postgres container is running with `docker ps`. +## Performance on WRITE tasks (eg filling out forms, logging in, downloading files, etc) +Skyvern is the best performing agent on WRITE tasks (eg filling out forms, logging in, downloading files, etc), which is primarily used for RPA (Robotic Process Automation) adjacent tasks. +

+ +

# Skyvern Features @@ -494,11 +508,11 @@ More extensive documentation can be found on our [📕 docs page](https://www.sk # Supported LLMs | Provider | Supported Models | | -------- | ------- | -| OpenAI | gpt4-turbo, gpt-4o, gpt-4o-mini | -| Anthropic | Claude 3 (Haiku, Sonnet, Opus), Claude 3.5 (Sonnet) | +| OpenAI | GPT-5, GPT-5.2, GPT-4.1, o3, o4-mini | +| Anthropic | Claude 4 (Sonnet, Opus), Claude 4.5 (Haiku, Sonnet, Opus) | | Azure OpenAI | Any GPT models. Better performance with a multimodal llm (azure/gpt4-o) | -| AWS Bedrock | Anthropic Claude 3 (Haiku, Sonnet, Opus), Claude 3.5 (Sonnet) | -| Gemini | Gemini 2.5 Pro and flash, Gemini 2.0 | +| AWS Bedrock | Claude 3.5, Claude 3.7, Claude 4 (Sonnet, Opus), Claude 4.5 (Sonnet, Opus) | +| Gemini | Gemini 3 Pro/Flash, Gemini 2.5 Pro/Flash | | Ollama | Run any locally hosted model via [Ollama](https://github.com/ollama/ollama) | | OpenRouter | Access models through [OpenRouter](https://openrouter.ai) | | OpenAI-compatible | Any custom API endpoint that follows OpenAI's API format (via [liteLLM](https://docs.litellm.ai/docs/providers/openai_compatible)) | @@ -513,7 +527,7 @@ More extensive documentation can be found on our [📕 docs page](https://www.sk | `OPENAI_API_BASE` | OpenAI API Base, optional | String | `https://openai.api.base` | | `OPENAI_ORGANIZATION` | OpenAI Organization ID, optional | String | `your-org-id` | -Recommended `LLM_KEY`: `OPENAI_GPT4O`, `OPENAI_GPT4O_MINI`, `OPENAI_GPT4_1`, `OPENAI_O4_MINI`, `OPENAI_O3` +Recommended `LLM_KEY`: `OPENAI_GPT5`, `OPENAI_GPT5_2`, `OPENAI_GPT4_1`, `OPENAI_O3`, `OPENAI_O4_MINI` ##### Anthropic | Variable | Description| Type | Sample Value| @@ -521,7 +535,7 @@ Recommended `LLM_KEY`: `OPENAI_GPT4O`, `OPENAI_GPT4O_MINI`, `OPENAI_GPT4_1`, `OP | `ENABLE_ANTHROPIC` | Register Anthropic models| Boolean | `true`, `false` | | `ANTHROPIC_API_KEY` | Anthropic API key| String | `sk-1234567890` | -Recommended`LLM_KEY`: `ANTHROPIC_CLAUDE3.5_SONNET`, `ANTHROPIC_CLAUDE3.7_SONNET`, `ANTHROPIC_CLAUDE4_OPUS`, `ANTHROPIC_CLAUDE4_SONNET` +Recommended `LLM_KEY`: `ANTHROPIC_CLAUDE4.5_OPUS`, `ANTHROPIC_CLAUDE4.5_SONNET`, `ANTHROPIC_CLAUDE4_OPUS`, `ANTHROPIC_CLAUDE4_SONNET` ##### Azure OpenAI | Variable | Description| Type | Sample Value| @@ -539,7 +553,7 @@ Recommended `LLM_KEY`: `AZURE_OPENAI` | -------- | ------- | ------- | ------- | | `ENABLE_BEDROCK` | Register AWS Bedrock models. To use AWS Bedrock, you need to make sure your [AWS configurations](https://github.com/boto/boto3?tab=readme-ov-file#using-boto3) are set up correctly first. | Boolean | `true`, `false` | -Recommended `LLM_KEY`: `BEDROCK_ANTHROPIC_CLAUDE3.7_SONNET_INFERENCE_PROFILE`, `BEDROCK_ANTHROPIC_CLAUDE4_OPUS_INFERENCE_PROFILE`, `BEDROCK_ANTHROPIC_CLAUDE4_SONNET_INFERENCE_PROFILE` +Recommended `LLM_KEY`: `BEDROCK_ANTHROPIC_CLAUDE4.5_OPUS_INFERENCE_PROFILE`, `BEDROCK_ANTHROPIC_CLAUDE4.5_SONNET_INFERENCE_PROFILE`, `BEDROCK_ANTHROPIC_CLAUDE4_OPUS_INFERENCE_PROFILE` ##### Gemini | Variable | Description| Type | Sample Value| @@ -547,7 +561,7 @@ Recommended `LLM_KEY`: `BEDROCK_ANTHROPIC_CLAUDE3.7_SONNET_INFERENCE_PROFILE`, ` | `ENABLE_GEMINI` | Register Gemini models| Boolean | `true`, `false` | | `GEMINI_API_KEY` | Gemini API Key| String | `your_google_gemini_api_key`| -Recommended `LLM_KEY`: `GEMINI_2.5_PRO_PREVIEW`, `GEMINI_2.5_FLASH_PREVIEW` +Recommended `LLM_KEY`: `GEMINI_2.5_PRO`, `GEMINI_2.5_FLASH`, `GEMINI_2.5_PRO_PREVIEW`, `GEMINI_2.5_FLASH_PREVIEW` ##### Ollama | Variable | Description| Type | Sample Value| diff --git a/skyvern/cli/llm_setup.py b/skyvern/cli/llm_setup.py index 4a0f79ed..6dad0c74 100644 --- a/skyvern/cli/llm_setup.py +++ b/skyvern/cli/llm_setup.py @@ -74,12 +74,12 @@ def setup_llm_providers() -> None: update_or_add_env_var("ENABLE_OPENAI", "true") model_options.extend( [ + "OPENAI_GPT5", + "OPENAI_GPT5_2", "OPENAI_GPT4_1", - "OPENAI_GPT4_1_MINI", - "OPENAI_GPT4_1_NANO", - "OPENAI_GPT4O", - "OPENAI_O4_MINI", "OPENAI_O3", + "OPENAI_O4_MINI", + "OPENAI_GPT4O", ] ) else: @@ -97,13 +97,11 @@ def setup_llm_providers() -> None: update_or_add_env_var("ENABLE_ANTHROPIC", "true") model_options.extend( [ - "ANTHROPIC_CLAUDE3.5_SONNET", - "ANTHROPIC_CLAUDE3.7_SONNET", - "ANTHROPIC_CLAUDE3.5_HAIKU", + "ANTHROPIC_CLAUDE4.5_OPUS", + "ANTHROPIC_CLAUDE4.5_SONNET", "ANTHROPIC_CLAUDE4_OPUS", "ANTHROPIC_CLAUDE4_SONNET", "ANTHROPIC_CLAUDE4.5_HAIKU", - "ANTHROPIC_CLAUDE4.5_SONNET", ] ) else: diff --git a/skyvern/cli/quickstart.py b/skyvern/cli/quickstart.py index b36865ae..cb80697c 100644 --- a/skyvern/cli/quickstart.py +++ b/skyvern/cli/quickstart.py @@ -2,14 +2,17 @@ import asyncio import subprocess +from pathlib import Path import typer from rich.panel import Panel from rich.progress import Progress, SpinnerColumn, TextColumn +from rich.prompt import Confirm # Import console after skyvern.cli to ensure proper initialization from skyvern.cli.console import console from skyvern.cli.init_command import init_env # init is used directly +from skyvern.cli.llm_setup import setup_llm_providers from skyvern.cli.utils import start_services quickstart_app = typer.Typer(help="Quickstart command to set up and run Skyvern with one command.") @@ -29,6 +32,78 @@ def check_docker() -> bool: return False +def check_docker_compose_file() -> bool: + """Check if docker-compose.yml exists in the current directory.""" + return Path("docker-compose.yml").exists() or Path("docker-compose.yaml").exists() + + +def check_postgres_container_conflict() -> bool: + """Check if postgresql-container exists and is using port 5432.""" + try: + result = subprocess.run( + ["docker", "ps", "-a", "--filter", "name=postgresql-container", "--format", "{{.Names}}"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + return "postgresql-container" in result.stdout + except (FileNotFoundError, subprocess.SubprocessError): + return False + + +def run_docker_compose_setup() -> None: + """Run the Docker Compose setup for Skyvern.""" + console.print("\n[bold blue]Setting up Skyvern with Docker Compose...[/bold blue]") + + # Check for postgres container conflict + if check_postgres_container_conflict(): + console.print( + Panel( + "[bold yellow]Warning: Existing PostgreSQL container detected![/bold yellow]\n\n" + "A container named 'postgresql-container' already exists, which may conflict\n" + "with the PostgreSQL service in Docker Compose (both use port 5432).\n\n" + "To avoid conflicts, remove the existing container first:\n" + "[cyan]docker rm -f postgresql-container[/cyan]", + border_style="yellow", + ) + ) + proceed = Confirm.ask("Do you want to continue anyway?", default=False) + if not proceed: + console.print("[yellow]Aborting Docker Compose setup. Please remove the container and try again.[/yellow]") + raise typer.Exit(0) + + # Configure LLM provider + console.print("\n[bold blue]Step 1: Configure LLM Provider[/bold blue]") + setup_llm_providers() + + # Run docker compose up + console.print("\n[bold blue]Step 2: Starting Docker Compose...[/bold blue]") + with Progress( + SpinnerColumn(), TextColumn("[progress.description]{task.description}"), transient=True, console=console + ) as progress: + progress.add_task("[bold blue]Starting Docker containers...", total=None) + try: + subprocess.run( + ["docker", "compose", "up", "-d"], + check=True, + capture_output=True, + text=True, + ) + console.print("✅ [green]Docker Compose started successfully.[/green]") + except subprocess.CalledProcessError as e: + console.print(f"[bold red]Error starting Docker Compose: {e.stderr}[/bold red]") + raise typer.Exit(1) + + console.print( + Panel( + "[bold green]Skyvern is now running![/bold green]\n\n" + "Navigate to [link]http://localhost:8080[/link] to start using the UI.\n\n" + "To stop Skyvern, run: [cyan]docker compose down[/cyan]", + border_style="green", + ) + ) + + @quickstart_app.callback(invoke_without_command=True) def quickstart( ctx: typer.Context, @@ -42,12 +117,16 @@ def quickstart( False, "--skip-browser-install", help="Skip Chromium browser installation" ), server_only: bool = typer.Option(False, "--server-only", help="Only start the server, not the UI"), + docker_compose: bool = typer.Option(False, "--docker-compose", help="Use Docker Compose for full setup"), ) -> None: """Quickstart command to set up and run Skyvern with one command.""" - # Check Docker only if not using custom database - if not database_string: - with console.status("Checking Docker installation...") as status: - if not check_docker(): + # Check Docker + with console.status("Checking Docker installation...") as status: + docker_available = check_docker() + if docker_available: + status.update("✅ Docker is installed and running") + else: + if not database_string: console.print( Panel( "[bold red]Docker is not installed or not running.[/bold red]\n" @@ -57,13 +136,45 @@ def quickstart( ) ) raise typer.Exit(1) - status.update("✅ Docker is installed and running") # Run initialization console.print(Panel("[bold green]🚀 Starting Skyvern Quickstart[/bold green]", border_style="green")) + # Check if Docker Compose option was explicitly requested or offer choice + docker_compose_available = check_docker_compose_file() + + if docker_compose: + if not docker_compose_available: + console.print( + Panel( + "[bold red]docker-compose.yml not found in current directory.[/bold red]\n" + "Please clone the Skyvern repository first:\n" + "[cyan]git clone https://github.com/skyvern-ai/skyvern.git && cd skyvern[/cyan]", + border_style="red", + ) + ) + raise typer.Exit(1) + run_docker_compose_setup() + return + + # If Docker Compose file exists, offer the choice + if docker_compose_available and docker_available and not database_string: + console.print("\n[bold blue]Setup Method[/bold blue]") + console.print("Docker Compose file detected. Choose your setup method:\n") + console.print(" [cyan]1.[/cyan] [green]Docker Compose (Recommended)[/green] - Full containerized setup") + console.print(" [cyan]2.[/cyan] pip install - Local Python setup with Docker for PostgreSQL only\n") + + use_docker_compose = Confirm.ask( + "Would you like to use Docker Compose for the full setup?", + default=True, + ) + + if use_docker_compose: + run_docker_compose_setup() + return + try: - # Initialize Skyvern + # Initialize Skyvern (pip install path) console.print("\n[bold blue]Initializing Skyvern...[/bold blue]") run_local = init_env(no_postgres=no_postgres, database_string=database_string) diff --git a/skyvern/forge/sdk/api/llm/config_registry.py b/skyvern/forge/sdk/api/llm/config_registry.py index 16db77f1..80a44217 100644 --- a/skyvern/forge/sdk/api/llm/config_registry.py +++ b/skyvern/forge/sdk/api/llm/config_registry.py @@ -377,6 +377,16 @@ if settings.ENABLE_ANTHROPIC: max_completion_tokens=64000, ), ) + LLMConfigRegistry.register_config( + "ANTHROPIC_CLAUDE4.5_OPUS", + LLMConfig( + "anthropic/claude-opus-4-5-20251101", + ["ANTHROPIC_API_KEY"], + supports_vision=True, + add_assistant_prefix=True, + max_completion_tokens=64000, + ), + ) if settings.ENABLE_BEDROCK: # Supported through AWS IAM authentication @@ -494,6 +504,26 @@ if settings.ENABLE_BEDROCK: max_completion_tokens=32000, ), ) + LLMConfigRegistry.register_config( + "BEDROCK_ANTHROPIC_CLAUDE4.5_SONNET_INFERENCE_PROFILE", + LLMConfig( + "bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0", + ["AWS_REGION"], + supports_vision=True, + add_assistant_prefix=True, + max_completion_tokens=64000, + ), + ) + LLMConfigRegistry.register_config( + "BEDROCK_ANTHROPIC_CLAUDE4.5_OPUS_INFERENCE_PROFILE", + LLMConfig( + "bedrock/us.anthropic.claude-opus-4-5-20251101-v1:0", + ["AWS_REGION"], + supports_vision=True, + add_assistant_prefix=True, + max_completion_tokens=64000, + ), + ) if settings.ENABLE_AZURE: