Publish npm package using Trusted Publisher (#3953)

This commit is contained in:
Stanislav Novosad
2025-11-10 13:51:53 -07:00
committed by GitHub
parent af88a7912b
commit e3cd3eeae0
43 changed files with 2143 additions and 290 deletions

View File

@@ -40,6 +40,9 @@ jobs:
runs-on: ubuntu-latest
needs: check-version-change
if: needs.check-version-change.outputs.version_changed == 'true' || github.event_name == 'workflow_dispatch'
permissions:
contents: read
id-token: write
defaults:
run:
working-directory: ./skyvern-ts/client
@@ -49,19 +52,21 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- name: Upgrade npm to a Trusted Publishing-capable version
run: npm i -g npm@^11.5.1
- name: Install Fern dependencies
run: npm install -g patch-package
- name: Install dependencies
run: npm install
run: npm ci
- name: Build CJS
run: npx tsc --project ./tsconfig.cjs.json
- name: Build ESM
run: npx tsc --project ./tsconfig.esm.json
- name: Rename ESM files
run: node scripts/rename-to-esm-files.js dist/esm
- name: Publish to npm
run: npm publish --access public
- name: Publish to npm with provenance via OIDC
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_CONFIG_PROVENANCE: "true"
run: npm publish --access public --provenance

View File

@@ -34,3 +34,8 @@ groups:
description: "The Skyvern TypeScript library provides convenient access to the Skyvern APIs from TypeScript."
publishConfig:
access: "public"
provenance: true
repository:
type: git
url: https://github.com/Skyvern-AI/skyvern.git
directory: skyvern-ts/client

View File

@@ -646,9 +646,9 @@
}
},
"node_modules/@inquirer/ansi": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz",
"integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz",
"integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -656,14 +656,14 @@
}
},
"node_modules/@inquirer/confirm": {
"version": "5.1.19",
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz",
"integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==",
"version": "5.1.20",
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.20.tgz",
"integrity": "sha512-HDGiWh2tyRZa0M1ZnEIUCQro25gW/mN8ODByicQrbR1yHx4hT+IOpozCMi5TgBtUdklLwRI2mv14eNpftDluEw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.3.0",
"@inquirer/type": "^3.0.9"
"@inquirer/core": "^10.3.1",
"@inquirer/type": "^3.0.10"
},
"engines": {
"node": ">=18"
@@ -678,20 +678,20 @@
}
},
"node_modules/@inquirer/core": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz",
"integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==",
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.1.tgz",
"integrity": "sha512-hzGKIkfomGFPgxKmnKEKeA+uCYBqC+TKtRx5LgyHRCrF6S2MliwRIjp3sUaWwVzMp7ZXVs8elB0Tfe682Rpg4w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@inquirer/ansi": "^1.0.1",
"@inquirer/figures": "^1.0.14",
"@inquirer/type": "^3.0.9",
"@inquirer/ansi": "^1.0.2",
"@inquirer/figures": "^1.0.15",
"@inquirer/type": "^3.0.10",
"cli-width": "^4.1.0",
"mute-stream": "^2.0.0",
"mute-stream": "^3.0.0",
"signal-exit": "^4.1.0",
"wrap-ansi": "^6.2.0",
"yoctocolors-cjs": "^2.1.2"
"yoctocolors-cjs": "^2.1.3"
},
"engines": {
"node": ">=18"
@@ -706,9 +706,9 @@
}
},
"node_modules/@inquirer/figures": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz",
"integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==",
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz",
"integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -716,9 +716,9 @@
}
},
"node_modules/@inquirer/type": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz",
"integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==",
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz",
"integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -827,9 +827,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.0.tgz",
"integrity": "sha512-MX3DD/o2W36nlgQb8KA5QtUw/bK5aR9YDzNmX1PRHZAa6LF/MQCWMN477CgBMg8gH1vEiEZsjWRIZeL/7ttUVA==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz",
"integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==",
"cpu": [
"arm"
],
@@ -841,9 +841,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.0.tgz",
"integrity": "sha512-U4/R8ZvikDYLkl+hyAGP23SRHp3LwYSRy9SvJqsnva7TYLhVMy39RTVCYn1DdRNxXl1CyCQgE/mXKm9jaQT4ig==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz",
"integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==",
"cpu": [
"arm64"
],
@@ -855,9 +855,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.0.tgz",
"integrity": "sha512-nBG2BXRU3ifdK0HdqBKaT5VI6ScoIpABYZ+dWwQkIOYd8Suo4iykgPikjhsTd7NeHgJJ3OqlKYCcNkZtB1iLVQ==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz",
"integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==",
"cpu": [
"arm64"
],
@@ -869,9 +869,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.0.tgz",
"integrity": "sha512-QuZ5hYStB/vW7b8zQYtdIPpIfNNlUXtGk8zVTkoTMKzMhE2/6tVvcCWqdWqCVhx6eguJJjKjtZ9lAAG/D3yNeA==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz",
"integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==",
"cpu": [
"x64"
],
@@ -883,9 +883,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.0.tgz",
"integrity": "sha512-4yYPm1PJwK/HKI4FzElAPj2EAAFaaLUWzXV3S3edKy71JcEVzBCpgaXyEcDh3blBIjLml+aMkj6HEVGSuzpz+g==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.2.tgz",
"integrity": "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==",
"cpu": [
"arm64"
],
@@ -897,9 +897,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.0.tgz",
"integrity": "sha512-1SvE5euwWV8JqFc4zEAqHbJbf2yJl00EoHVcnlFqLzjrIExYttLxfZeMDIXY6Yx+bskphrQakpChZKzE2JECEg==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz",
"integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==",
"cpu": [
"x64"
],
@@ -911,9 +911,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.0.tgz",
"integrity": "sha512-9tS4QyfU5NF5CdUugEi7kWbcGD7pbu6Fm8SunuePH6beeQgtcRZ9K9KVwKHEgfBHeeyrr5OvfV1qWs7PMDOf5w==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz",
"integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==",
"cpu": [
"arm"
],
@@ -925,9 +925,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.0.tgz",
"integrity": "sha512-U+0ovxGU9bVJIHfW+oALpHd0ho1YDwhj0yHASDzIj+bOeo+VzEpNtHxcjhFab0YcHUorIMoqyxckC98+81oTJw==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz",
"integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==",
"cpu": [
"arm"
],
@@ -939,9 +939,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.0.tgz",
"integrity": "sha512-Cp/TQ+wLjRTqTuiVwLz4XPZMo3ROl7EJYMF8HhMp8Uf+9kOOATB3/p4gGZPpuQ4BP7qEXG29ET24u9+F0ERYkQ==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz",
"integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==",
"cpu": [
"arm64"
],
@@ -953,9 +953,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.0.tgz",
"integrity": "sha512-SuGoAwhsSonrSTEZTiQOGC3+XZfq7rc/qAdAOBrYYIp8pu+Wh4EFFXl6+QYYNbNrHL3DnVoWACLwnfwlTa0neA==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz",
"integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==",
"cpu": [
"arm64"
],
@@ -967,9 +967,9 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.0.tgz",
"integrity": "sha512-EOKej1x0WoePnJWfg7ZbnUqiuiQunshzsKZSIfTHFDiCY9pnsr3Weit1GjcpGnun7H5HuRREqkT2c9CcKxNwSg==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz",
"integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==",
"cpu": [
"loong64"
],
@@ -981,9 +981,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.0.tgz",
"integrity": "sha512-YAvv2aMFlfiawJ97lutomuehG2Yowd4YgsAqI85XNiMK9eBA1vEMZHt3BShg8cUvak71BM+VFRHddqc+OrRdVA==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz",
"integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==",
"cpu": [
"ppc64"
],
@@ -995,9 +995,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.0.tgz",
"integrity": "sha512-DxZe/sMVaqN+s5kVk3Iq619Rgyl1JCTob7xOLSNC84mbzg3NYTSheqqrtVllYjLYo4wm9YyqjVS57miuzNyXbQ==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz",
"integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==",
"cpu": [
"riscv64"
],
@@ -1009,9 +1009,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.0.tgz",
"integrity": "sha512-N7+iZ0jEhwLY1FEsjbCR9lAxIZP0k+3Cghx9vSQWn+rcW8SgN8VcCmwJDoPDaGKTzWWB791U1s79BSLnEhUa0Q==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz",
"integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==",
"cpu": [
"riscv64"
],
@@ -1023,9 +1023,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.0.tgz",
"integrity": "sha512-MA/NVneZyIskjvXdh2NR9YcPi7eHWBlQOWP2X8OymzyeUEB0JfUpmbKQZngHmOlyleV2IoR5nHIgMSRjLskOnA==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz",
"integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==",
"cpu": [
"s390x"
],
@@ -1037,9 +1037,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.0.tgz",
"integrity": "sha512-iYEYzYpfaSCkunVD0LOYrD9OMc357be7+rBuCxW1qvsjCGl+95iWnYAFfyEoxAm6koasNN3tFxFYze5MKl5S3A==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz",
"integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==",
"cpu": [
"x64"
],
@@ -1051,9 +1051,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.0.tgz",
"integrity": "sha512-FoRekOqhRUKbJMsB5LvhQchDeFeNlS6UGUwi0p3860sxE4zE+lp07FnkuR+yQH0rSn6iLXsnr44jnorgl8mGlQ==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz",
"integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==",
"cpu": [
"x64"
],
@@ -1065,9 +1065,9 @@
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.0.tgz",
"integrity": "sha512-mEN2k1zKO5PUzW8W15hKpLh+zZI2by1onX2GfI93OekGbKN5aTjWGo7yAjwRZLjhAgs2UQcXmEWbIw0R5B4RnQ==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz",
"integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==",
"cpu": [
"arm64"
],
@@ -1079,9 +1079,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.0.tgz",
"integrity": "sha512-V1dEKUXqevG0wxo6ysGrL7g2T6tndmo6Uqw5vzOqCXv+DHc8m0RRgcCm+96iigDniwpvV6o4HZtkRUnuTz9XiA==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz",
"integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==",
"cpu": [
"arm64"
],
@@ -1093,9 +1093,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.0.tgz",
"integrity": "sha512-93mJ8Hm9+vbhtu+A1VtmwptSqCYojtMQkBGDjLytCWC8muxmZLGo/MA/4CMAWf6+QpKlxTTMDAHdTC+kxn9ZcQ==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz",
"integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==",
"cpu": [
"ia32"
],
@@ -1107,9 +1107,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.0.tgz",
"integrity": "sha512-1OrYs0p/deXEFLUW1gvyjIabmsJKY3I/9fCUA1K6demaNc4iEhXDW6RnyPv/BWqb7NRmQ9+i+SKoi1HgJxWcwg==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.2.tgz",
"integrity": "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==",
"cpu": [
"x64"
],
@@ -1121,9 +1121,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.0.tgz",
"integrity": "sha512-xtSei8paPcLy3GzeeOjoRrllJn6EN8PB+/bXnhZ4R0AaviJsRwtKxFZRVnfFXNZTTp0nLeDo+BcEuIfdZS14/A==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz",
"integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==",
"cpu": [
"x64"
],
@@ -1843,9 +1843,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.248",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.248.tgz",
"integrity": "sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q==",
"version": "1.5.249",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz",
"integrity": "sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==",
"dev": true,
"license": "ISC"
},
@@ -2317,13 +2317,13 @@
}
},
"node_modules/mute-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
"integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz",
"integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==",
"dev": true,
"license": "ISC",
"engines": {
"node": "^18.17.0 || >=20.5.0"
"node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/nanoid": {
@@ -2477,11 +2477,10 @@
"license": "MIT"
},
"node_modules/rollup": {
"version": "4.53.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.0.tgz",
"integrity": "sha512-43Z5T+4YTdfYkkA6CStU2DUYh7Ha9dLtvK+K3n0yEE/QS+4i28vSxrQsM59KqpvmT4tbOwJsFnRGMj/tvmQwWw==",
"version": "4.53.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz",
"integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.8"
@@ -2494,28 +2493,28 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.53.0",
"@rollup/rollup-android-arm64": "4.53.0",
"@rollup/rollup-darwin-arm64": "4.53.0",
"@rollup/rollup-darwin-x64": "4.53.0",
"@rollup/rollup-freebsd-arm64": "4.53.0",
"@rollup/rollup-freebsd-x64": "4.53.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.53.0",
"@rollup/rollup-linux-arm-musleabihf": "4.53.0",
"@rollup/rollup-linux-arm64-gnu": "4.53.0",
"@rollup/rollup-linux-arm64-musl": "4.53.0",
"@rollup/rollup-linux-loong64-gnu": "4.53.0",
"@rollup/rollup-linux-ppc64-gnu": "4.53.0",
"@rollup/rollup-linux-riscv64-gnu": "4.53.0",
"@rollup/rollup-linux-riscv64-musl": "4.53.0",
"@rollup/rollup-linux-s390x-gnu": "4.53.0",
"@rollup/rollup-linux-x64-gnu": "4.53.0",
"@rollup/rollup-linux-x64-musl": "4.53.0",
"@rollup/rollup-openharmony-arm64": "4.53.0",
"@rollup/rollup-win32-arm64-msvc": "4.53.0",
"@rollup/rollup-win32-ia32-msvc": "4.53.0",
"@rollup/rollup-win32-x64-gnu": "4.53.0",
"@rollup/rollup-win32-x64-msvc": "4.53.0",
"@rollup/rollup-android-arm-eabi": "4.53.2",
"@rollup/rollup-android-arm64": "4.53.2",
"@rollup/rollup-darwin-arm64": "4.53.2",
"@rollup/rollup-darwin-x64": "4.53.2",
"@rollup/rollup-freebsd-arm64": "4.53.2",
"@rollup/rollup-freebsd-x64": "4.53.2",
"@rollup/rollup-linux-arm-gnueabihf": "4.53.2",
"@rollup/rollup-linux-arm-musleabihf": "4.53.2",
"@rollup/rollup-linux-arm64-gnu": "4.53.2",
"@rollup/rollup-linux-arm64-musl": "4.53.2",
"@rollup/rollup-linux-loong64-gnu": "4.53.2",
"@rollup/rollup-linux-ppc64-gnu": "4.53.2",
"@rollup/rollup-linux-riscv64-gnu": "4.53.2",
"@rollup/rollup-linux-riscv64-musl": "4.53.2",
"@rollup/rollup-linux-s390x-gnu": "4.53.2",
"@rollup/rollup-linux-x64-gnu": "4.53.2",
"@rollup/rollup-linux-x64-musl": "4.53.2",
"@rollup/rollup-openharmony-arm64": "4.53.2",
"@rollup/rollup-win32-arm64-msvc": "4.53.2",
"@rollup/rollup-win32-ia32-msvc": "4.53.2",
"@rollup/rollup-win32-x64-gnu": "4.53.2",
"@rollup/rollup-win32-x64-msvc": "4.53.2",
"fsevents": "~2.3.2"
}
},

View File

@@ -2,7 +2,11 @@
"name": "@skyvern/client",
"version": "0.2.22",
"private": false,
"repository": "github:Skyvern-AI/skyvern",
"repository": {
"type": "git",
"url": "https://github.com/Skyvern-AI/skyvern.git",
"directory": "skyvern-ts/client"
},
"type": "commonjs",
"main": "./dist/cjs/index.js",
"module": "./dist/esm/index.mjs",
@@ -64,6 +68,7 @@
"sideEffects": false,
"description": "The Skyvern TypeScript library provides convenient access to the Skyvern APIs from TypeScript.",
"publishConfig": {
"access": "public"
"access": "public",
"provenance": true
}
}

View File

@@ -475,6 +475,249 @@ await client.workflows.updateWorkflowFolder("wpid_123");
</dl>
</dd>
</dl>
</details>
## BrowserProfiles
<details><summary><code>client.browserProfiles.<a href="/src/api/resources/browserProfiles/client/Client.ts">listBrowserProfiles</a>({ ...params }) -> Skyvern.BrowserProfile[]</code></summary>
<dl>
<dd>
#### 📝 Description
<dl>
<dd>
<dl>
<dd>
Get all browser profiles for the organization
</dd>
</dl>
</dd>
</dl>
#### 🔌 Usage
<dl>
<dd>
<dl>
<dd>
```typescript
await client.browserProfiles.listBrowserProfiles({
include_deleted: true
});
```
</dd>
</dl>
</dd>
</dl>
#### ⚙️ Parameters
<dl>
<dd>
<dl>
<dd>
**request:** `Skyvern.ListBrowserProfilesV1BrowserProfilesGetRequest`
</dd>
</dl>
<dl>
<dd>
**requestOptions:** `BrowserProfiles.RequestOptions`
</dd>
</dl>
</dd>
</dl>
</dd>
</dl>
</details>
<details><summary><code>client.browserProfiles.<a href="/src/api/resources/browserProfiles/client/Client.ts">createBrowserProfile</a>({ ...params }) -> Skyvern.BrowserProfile</code></summary>
<dl>
<dd>
#### 🔌 Usage
<dl>
<dd>
<dl>
<dd>
```typescript
await client.browserProfiles.createBrowserProfile({
name: "name"
});
```
</dd>
</dl>
</dd>
</dl>
#### ⚙️ Parameters
<dl>
<dd>
<dl>
<dd>
**request:** `Skyvern.CreateBrowserProfileRequest`
</dd>
</dl>
<dl>
<dd>
**requestOptions:** `BrowserProfiles.RequestOptions`
</dd>
</dl>
</dd>
</dl>
</dd>
</dl>
</details>
<details><summary><code>client.browserProfiles.<a href="/src/api/resources/browserProfiles/client/Client.ts">getBrowserProfile</a>(profileId) -> Skyvern.BrowserProfile</code></summary>
<dl>
<dd>
#### 📝 Description
<dl>
<dd>
<dl>
<dd>
Get a specific browser profile by ID
</dd>
</dl>
</dd>
</dl>
#### 🔌 Usage
<dl>
<dd>
<dl>
<dd>
```typescript
await client.browserProfiles.getBrowserProfile("bp_123456");
```
</dd>
</dl>
</dd>
</dl>
#### ⚙️ Parameters
<dl>
<dd>
<dl>
<dd>
**profileId:** `string` — The ID of the browser profile. browser_profile_id starts with `bp_`
</dd>
</dl>
<dl>
<dd>
**requestOptions:** `BrowserProfiles.RequestOptions`
</dd>
</dl>
</dd>
</dl>
</dd>
</dl>
</details>
<details><summary><code>client.browserProfiles.<a href="/src/api/resources/browserProfiles/client/Client.ts">deleteBrowserProfile</a>(profileId) -> void</code></summary>
<dl>
<dd>
#### 📝 Description
<dl>
<dd>
<dl>
<dd>
Delete a browser profile (soft delete)
</dd>
</dl>
</dd>
</dl>
#### 🔌 Usage
<dl>
<dd>
<dl>
<dd>
```typescript
await client.browserProfiles.deleteBrowserProfile("bp_123456");
```
</dd>
</dl>
</dd>
</dl>
#### ⚙️ Parameters
<dl>
<dd>
<dl>
<dd>
**profileId:** `string` — The ID of the browser profile to delete. browser_profile_id starts with `bp_`
</dd>
</dl>
<dl>
<dd>
**requestOptions:** `BrowserProfiles.RequestOptions`
</dd>
</dl>
</dd>
</dl>
</dd>
</dl>
</details>

View File

@@ -1,6 +1,7 @@
// This file was auto-generated by Fern from our API Definition.
import * as Skyvern from "./api/index.js";
import { BrowserProfiles } from "./api/resources/browserProfiles/client/Client.js";
import { Scripts } from "./api/resources/scripts/client/Client.js";
import { Workflows } from "./api/resources/workflows/client/Client.js";
import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js";
@@ -18,6 +19,7 @@ export declare namespace SkyvernClient {
export class SkyvernClient {
protected readonly _options: SkyvernClient.Options;
protected _workflows: Workflows | undefined;
protected _browserProfiles: BrowserProfiles | undefined;
protected _scripts: Scripts | undefined;
constructor(_options: SkyvernClient.Options = {}) {
@@ -42,6 +44,10 @@ export class SkyvernClient {
return (this._workflows ??= new Workflows(this._options));
}
public get browserProfiles(): BrowserProfiles {
return (this._browserProfiles ??= new BrowserProfiles(this._options));
}
public get scripts(): Scripts {
return (this._scripts ??= new Scripts(this._options));
}
@@ -530,25 +536,34 @@ export class SkyvernClient {
/**
* Create a new workflow
*
* @param {Skyvern.WorkflowRequest} request
* @param {Skyvern.CreateWorkflowRequest} request
* @param {SkyvernClient.RequestOptions} requestOptions - Request-specific configuration.
*
* @throws {@link Skyvern.UnprocessableEntityError}
*
* @example
* await client.createWorkflow({})
* await client.createWorkflow({
* folder_id: "folder_id",
* body: {}
* })
*/
public createWorkflow(
request: Skyvern.WorkflowRequest,
request: Skyvern.CreateWorkflowRequest,
requestOptions?: SkyvernClient.RequestOptions,
): core.HttpResponsePromise<Skyvern.Workflow> {
return core.HttpResponsePromise.fromPromise(this.__createWorkflow(request, requestOptions));
}
private async __createWorkflow(
request: Skyvern.WorkflowRequest,
request: Skyvern.CreateWorkflowRequest,
requestOptions?: SkyvernClient.RequestOptions,
): Promise<core.WithRawResponse<Skyvern.Workflow>> {
const { folder_id: folderId, body: _body } = request;
const _queryParams: Record<string, string | string[] | object | object[] | null> = {};
if (folderId != null) {
_queryParams.folder_id = folderId;
}
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
this._options?.headers,
mergeOnlyDefinedHeaders({ "x-api-key": requestOptions?.apiKey ?? this._options?.apiKey }),
@@ -564,9 +579,9 @@ export class SkyvernClient {
method: "POST",
headers: _headers,
contentType: "application/json",
queryParameters: requestOptions?.queryParams,
queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
requestType: "json",
body: request,
body: _body,
timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
abortSignal: requestOptions?.abortSignal,

View File

@@ -0,0 +1,16 @@
// This file was auto-generated by Fern from our API Definition.
import type * as Skyvern from "../../index.js";
/**
* @example
* {
* folder_id: "folder_id",
* body: {}
* }
*/
export interface CreateWorkflowRequest {
/** Optional folder ID to assign the workflow to */
folder_id?: string;
body: Skyvern.WorkflowRequest;
}

View File

@@ -1,6 +1,7 @@
export type { CreateBrowserSessionRequest } from "./CreateBrowserSessionRequest.js";
export type { CreateCredentialRequest } from "./CreateCredentialRequest.js";
export type { CreateScriptRequest } from "./CreateScriptRequest.js";
export type { CreateWorkflowRequest } from "./CreateWorkflowRequest.js";
export type { DeployScriptRequest } from "./DeployScriptRequest.js";
export type { GetCredentialsRequest } from "./GetCredentialsRequest.js";
export type { GetRunArtifactsRequest } from "./GetRunArtifactsRequest.js";

View File

@@ -0,0 +1,343 @@
// This file was auto-generated by Fern from our API Definition.
import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js";
import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js";
import * as core from "../../../../core/index.js";
import * as environments from "../../../../environments.js";
import * as errors from "../../../../errors/index.js";
import * as Skyvern from "../../../index.js";
export declare namespace BrowserProfiles {
export interface Options extends BaseClientOptions {}
export interface RequestOptions extends BaseRequestOptions {}
}
export class BrowserProfiles {
protected readonly _options: BrowserProfiles.Options;
constructor(_options: BrowserProfiles.Options = {}) {
this._options = _options;
}
/**
* Get all browser profiles for the organization
*
* @param {Skyvern.ListBrowserProfilesV1BrowserProfilesGetRequest} request
* @param {BrowserProfiles.RequestOptions} requestOptions - Request-specific configuration.
*
* @throws {@link Skyvern.UnprocessableEntityError}
*
* @example
* await client.browserProfiles.listBrowserProfiles({
* include_deleted: true
* })
*/
public listBrowserProfiles(
request: Skyvern.ListBrowserProfilesV1BrowserProfilesGetRequest = {},
requestOptions?: BrowserProfiles.RequestOptions,
): core.HttpResponsePromise<Skyvern.BrowserProfile[]> {
return core.HttpResponsePromise.fromPromise(this.__listBrowserProfiles(request, requestOptions));
}
private async __listBrowserProfiles(
request: Skyvern.ListBrowserProfilesV1BrowserProfilesGetRequest = {},
requestOptions?: BrowserProfiles.RequestOptions,
): Promise<core.WithRawResponse<Skyvern.BrowserProfile[]>> {
const { include_deleted: includeDeleted } = request;
const _queryParams: Record<string, string | string[] | object | object[] | null> = {};
if (includeDeleted != null) {
_queryParams.include_deleted = includeDeleted.toString();
}
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
this._options?.headers,
mergeOnlyDefinedHeaders({ "x-api-key": requestOptions?.apiKey ?? this._options?.apiKey }),
requestOptions?.headers,
);
const _response = await core.fetcher({
url: core.url.join(
(await core.Supplier.get(this._options.baseUrl)) ??
(await core.Supplier.get(this._options.environment)) ??
environments.SkyvernEnvironment.Cloud,
"v1/browser_profiles",
),
method: "GET",
headers: _headers,
queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
abortSignal: requestOptions?.abortSignal,
});
if (_response.ok) {
return { data: _response.body as Skyvern.BrowserProfile[], rawResponse: _response.rawResponse };
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
case 422:
throw new Skyvern.UnprocessableEntityError(_response.error.body as unknown, _response.rawResponse);
default:
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.body,
rawResponse: _response.rawResponse,
});
}
}
switch (_response.error.reason) {
case "non-json":
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.rawBody,
rawResponse: _response.rawResponse,
});
case "timeout":
throw new errors.SkyvernTimeoutError("Timeout exceeded when calling GET /v1/browser_profiles.");
case "unknown":
throw new errors.SkyvernError({
message: _response.error.errorMessage,
rawResponse: _response.rawResponse,
});
}
}
/**
* @param {Skyvern.CreateBrowserProfileRequest} request
* @param {BrowserProfiles.RequestOptions} requestOptions - Request-specific configuration.
*
* @throws {@link Skyvern.UnprocessableEntityError}
*
* @example
* await client.browserProfiles.createBrowserProfile({
* name: "name"
* })
*/
public createBrowserProfile(
request: Skyvern.CreateBrowserProfileRequest,
requestOptions?: BrowserProfiles.RequestOptions,
): core.HttpResponsePromise<Skyvern.BrowserProfile> {
return core.HttpResponsePromise.fromPromise(this.__createBrowserProfile(request, requestOptions));
}
private async __createBrowserProfile(
request: Skyvern.CreateBrowserProfileRequest,
requestOptions?: BrowserProfiles.RequestOptions,
): Promise<core.WithRawResponse<Skyvern.BrowserProfile>> {
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
this._options?.headers,
mergeOnlyDefinedHeaders({ "x-api-key": requestOptions?.apiKey ?? this._options?.apiKey }),
requestOptions?.headers,
);
const _response = await core.fetcher({
url: core.url.join(
(await core.Supplier.get(this._options.baseUrl)) ??
(await core.Supplier.get(this._options.environment)) ??
environments.SkyvernEnvironment.Cloud,
"v1/browser_profiles",
),
method: "POST",
headers: _headers,
contentType: "application/json",
queryParameters: requestOptions?.queryParams,
requestType: "json",
body: request,
timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
abortSignal: requestOptions?.abortSignal,
});
if (_response.ok) {
return { data: _response.body as Skyvern.BrowserProfile, rawResponse: _response.rawResponse };
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
case 422:
throw new Skyvern.UnprocessableEntityError(_response.error.body as unknown, _response.rawResponse);
default:
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.body,
rawResponse: _response.rawResponse,
});
}
}
switch (_response.error.reason) {
case "non-json":
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.rawBody,
rawResponse: _response.rawResponse,
});
case "timeout":
throw new errors.SkyvernTimeoutError("Timeout exceeded when calling POST /v1/browser_profiles.");
case "unknown":
throw new errors.SkyvernError({
message: _response.error.errorMessage,
rawResponse: _response.rawResponse,
});
}
}
/**
* Get a specific browser profile by ID
*
* @param {string} profileId - The ID of the browser profile. browser_profile_id starts with `bp_`
* @param {BrowserProfiles.RequestOptions} requestOptions - Request-specific configuration.
*
* @throws {@link Skyvern.NotFoundError}
* @throws {@link Skyvern.UnprocessableEntityError}
*
* @example
* await client.browserProfiles.getBrowserProfile("bp_123456")
*/
public getBrowserProfile(
profileId: string,
requestOptions?: BrowserProfiles.RequestOptions,
): core.HttpResponsePromise<Skyvern.BrowserProfile> {
return core.HttpResponsePromise.fromPromise(this.__getBrowserProfile(profileId, requestOptions));
}
private async __getBrowserProfile(
profileId: string,
requestOptions?: BrowserProfiles.RequestOptions,
): Promise<core.WithRawResponse<Skyvern.BrowserProfile>> {
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
this._options?.headers,
mergeOnlyDefinedHeaders({ "x-api-key": requestOptions?.apiKey ?? this._options?.apiKey }),
requestOptions?.headers,
);
const _response = await core.fetcher({
url: core.url.join(
(await core.Supplier.get(this._options.baseUrl)) ??
(await core.Supplier.get(this._options.environment)) ??
environments.SkyvernEnvironment.Cloud,
`v1/browser_profiles/${core.url.encodePathParam(profileId)}`,
),
method: "GET",
headers: _headers,
queryParameters: requestOptions?.queryParams,
timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
abortSignal: requestOptions?.abortSignal,
});
if (_response.ok) {
return { data: _response.body as Skyvern.BrowserProfile, rawResponse: _response.rawResponse };
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
case 404:
throw new Skyvern.NotFoundError(_response.error.body as unknown, _response.rawResponse);
case 422:
throw new Skyvern.UnprocessableEntityError(_response.error.body as unknown, _response.rawResponse);
default:
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.body,
rawResponse: _response.rawResponse,
});
}
}
switch (_response.error.reason) {
case "non-json":
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.rawBody,
rawResponse: _response.rawResponse,
});
case "timeout":
throw new errors.SkyvernTimeoutError(
"Timeout exceeded when calling GET /v1/browser_profiles/{profile_id}.",
);
case "unknown":
throw new errors.SkyvernError({
message: _response.error.errorMessage,
rawResponse: _response.rawResponse,
});
}
}
/**
* Delete a browser profile (soft delete)
*
* @param {string} profileId - The ID of the browser profile to delete. browser_profile_id starts with `bp_`
* @param {BrowserProfiles.RequestOptions} requestOptions - Request-specific configuration.
*
* @throws {@link Skyvern.NotFoundError}
* @throws {@link Skyvern.UnprocessableEntityError}
*
* @example
* await client.browserProfiles.deleteBrowserProfile("bp_123456")
*/
public deleteBrowserProfile(
profileId: string,
requestOptions?: BrowserProfiles.RequestOptions,
): core.HttpResponsePromise<void> {
return core.HttpResponsePromise.fromPromise(this.__deleteBrowserProfile(profileId, requestOptions));
}
private async __deleteBrowserProfile(
profileId: string,
requestOptions?: BrowserProfiles.RequestOptions,
): Promise<core.WithRawResponse<void>> {
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
this._options?.headers,
mergeOnlyDefinedHeaders({ "x-api-key": requestOptions?.apiKey ?? this._options?.apiKey }),
requestOptions?.headers,
);
const _response = await core.fetcher({
url: core.url.join(
(await core.Supplier.get(this._options.baseUrl)) ??
(await core.Supplier.get(this._options.environment)) ??
environments.SkyvernEnvironment.Cloud,
`v1/browser_profiles/${core.url.encodePathParam(profileId)}`,
),
method: "DELETE",
headers: _headers,
queryParameters: requestOptions?.queryParams,
timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
abortSignal: requestOptions?.abortSignal,
});
if (_response.ok) {
return { data: undefined, rawResponse: _response.rawResponse };
}
if (_response.error.reason === "status-code") {
switch (_response.error.statusCode) {
case 404:
throw new Skyvern.NotFoundError(_response.error.body as unknown, _response.rawResponse);
case 422:
throw new Skyvern.UnprocessableEntityError(_response.error.body as unknown, _response.rawResponse);
default:
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.body,
rawResponse: _response.rawResponse,
});
}
}
switch (_response.error.reason) {
case "non-json":
throw new errors.SkyvernError({
statusCode: _response.error.statusCode,
body: _response.error.rawBody,
rawResponse: _response.rawResponse,
});
case "timeout":
throw new errors.SkyvernTimeoutError(
"Timeout exceeded when calling DELETE /v1/browser_profiles/{profile_id}.",
);
case "unknown":
throw new errors.SkyvernError({
message: _response.error.errorMessage,
rawResponse: _response.rawResponse,
});
}
}
}

View File

@@ -0,0 +1 @@
export * from "./requests/index.js";

View File

@@ -0,0 +1,18 @@
// This file was auto-generated by Fern from our API Definition.
/**
* @example
* {
* name: "name"
* }
*/
export interface CreateBrowserProfileRequest {
/** Name for the browser profile */
name: string;
/** Optional profile description */
description?: string;
/** Persistent browser session to convert into a profile */
browser_session_id?: string;
/** Workflow run whose persisted session should be captured */
workflow_run_id?: string;
}

View File

@@ -0,0 +1,12 @@
// This file was auto-generated by Fern from our API Definition.
/**
* @example
* {
* include_deleted: true
* }
*/
export interface ListBrowserProfilesV1BrowserProfilesGetRequest {
/** Include deleted browser profiles */
include_deleted?: boolean;
}

View File

@@ -0,0 +1,2 @@
export type { CreateBrowserProfileRequest } from "./CreateBrowserProfileRequest.js";
export type { ListBrowserProfilesV1BrowserProfilesGetRequest } from "./ListBrowserProfilesV1BrowserProfilesGetRequest.js";

View File

@@ -0,0 +1 @@
export * from "./client/index.js";

View File

@@ -1,3 +1,5 @@
export * from "./browserProfiles/client/requests/index.js";
export * as browserProfiles from "./browserProfiles/index.js";
export * as scripts from "./scripts/index.js";
export * from "./workflows/client/requests/index.js";
export * as workflows from "./workflows/index.js";

View File

@@ -0,0 +1,11 @@
// This file was auto-generated by Fern from our API Definition.
export interface BrowserProfile {
browser_profile_id: string;
organization_id: string;
name: string;
description?: string;
created_at: string;
modified_at: string;
deleted_at?: string;
}

View File

@@ -7,4 +7,5 @@ export interface InputOrSelectContext {
is_search_bar?: boolean;
is_location_input?: boolean;
is_date_related?: boolean;
date_format?: string;
}

View File

@@ -10,6 +10,7 @@ export type RunSdkActionRequestAction =
| Skyvern.RunSdkActionRequestAction.AiClick
| Skyvern.RunSdkActionRequestAction.AiInputText
| Skyvern.RunSdkActionRequestAction.AiSelectOption
| Skyvern.RunSdkActionRequestAction.AiUploadFile
| Skyvern.RunSdkActionRequestAction.Extract;
export namespace RunSdkActionRequestAction {
@@ -29,6 +30,10 @@ export namespace RunSdkActionRequestAction {
type: "ai_select_option";
}
export interface AiUploadFile extends Skyvern.UploadFileAction {
type: "ai_upload_file";
}
export interface Extract extends Skyvern.ExtractAction {
type: "extract";
}

View File

@@ -31,6 +31,8 @@ export interface TaskRunResponse {
app_url?: string;
/** ID of the Skyvern persistent browser session used for this run */
browser_session_id?: string;
/** ID of the browser profile used for this run */
browser_profile_id?: string;
/** The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot */
max_screenshot_scrolls?: number;
/** The script run result */

View File

@@ -0,0 +1,24 @@
// This file was auto-generated by Fern from our API Definition.
/**
* Upload file action parameters.
*/
export interface UploadFileAction {
/** CSS selector for the element */
selector?: string;
/** File URL for upload */
file_url?: string;
/** The intention or goal of the upload */
intention?: string;
/** Additional context data */
data?: UploadFileAction.Data;
/** Timeout in milliseconds */
timeout?: number;
}
export namespace UploadFileAction {
/**
* Additional context data
*/
export type Data = string | Record<string, unknown>;
}

View File

@@ -21,4 +21,5 @@ export interface WorkflowCreateYamlRequest {
cache_key?: string;
run_sequentially?: boolean;
sequential_key?: string;
folder_id?: string;
}

View File

@@ -46,6 +46,8 @@ export interface WorkflowRunRequest {
totp_identifier?: string;
/** ID of a Skyvern browser session to reuse, having it continue from the current screen state */
browser_session_id?: string;
/** ID of a browser profile to reuse for this workflow run */
browser_profile_id?: string;
/** The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot. */
max_screenshot_scrolls?: number;
/** The extra HTTP headers for the requests in browser. */

View File

@@ -31,6 +31,8 @@ export interface WorkflowRunResponse {
app_url?: string;
/** ID of the Skyvern persistent browser session used for this run */
browser_session_id?: string;
/** ID of the browser profile used for this run */
browser_profile_id?: string;
/** The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot */
max_screenshot_scrolls?: number;
/** The script run result */

View File

@@ -19,6 +19,7 @@ export * from "./BitwardenLoginCredentialParameterYaml.js";
export * from "./BitwardenSensitiveInformationParameter.js";
export * from "./BitwardenSensitiveInformationParameterYaml.js";
export * from "./BlockType.js";
export * from "./BrowserProfile.js";
export * from "./BrowserSessionResponse.js";
export * from "./ClickAction.js";
export * from "./ClickContext.js";
@@ -113,6 +114,7 @@ export * from "./ThoughtScenario.js";
export * from "./ThoughtType.js";
export * from "./TotpCode.js";
export * from "./TotpType.js";
export * from "./UploadFileAction.js";
export * from "./UploadToS3Block.js";
export * from "./UploadToS3BlockYaml.js";
export * from "./UrlBlock.js";

View File

@@ -0,0 +1,236 @@
// This file was auto-generated by Fern from our API Definition.
import * as Skyvern from "../../src/api/index";
import { SkyvernClient } from "../../src/Client";
import { mockServerPool } from "../mock-server/MockServerPool";
describe("BrowserProfiles", () => {
test("listBrowserProfiles (1)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawResponseBody = [
{
browser_profile_id: "browser_profile_id",
organization_id: "organization_id",
name: "name",
description: "description",
created_at: "2024-01-15T09:30:00Z",
modified_at: "2024-01-15T09:30:00Z",
deleted_at: "2024-01-15T09:30:00Z",
},
];
server
.mockEndpoint()
.get("/v1/browser_profiles")
.respondWith()
.statusCode(200)
.jsonBody(rawResponseBody)
.build();
const response = await client.browserProfiles.listBrowserProfiles({
include_deleted: true,
});
expect(response).toEqual([
{
browser_profile_id: "browser_profile_id",
organization_id: "organization_id",
name: "name",
description: "description",
created_at: "2024-01-15T09:30:00Z",
modified_at: "2024-01-15T09:30:00Z",
deleted_at: "2024-01-15T09:30:00Z",
},
]);
});
test("listBrowserProfiles (2)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawResponseBody = { key: "value" };
server
.mockEndpoint()
.get("/v1/browser_profiles")
.respondWith()
.statusCode(422)
.jsonBody(rawResponseBody)
.build();
await expect(async () => {
return await client.browserProfiles.listBrowserProfiles();
}).rejects.toThrow(Skyvern.UnprocessableEntityError);
});
test("createBrowserProfile (1)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawRequestBody = { name: "name" };
const rawResponseBody = {
browser_profile_id: "browser_profile_id",
organization_id: "organization_id",
name: "name",
description: "description",
created_at: "2024-01-15T09:30:00Z",
modified_at: "2024-01-15T09:30:00Z",
deleted_at: "2024-01-15T09:30:00Z",
};
server
.mockEndpoint()
.post("/v1/browser_profiles")
.jsonBody(rawRequestBody)
.respondWith()
.statusCode(200)
.jsonBody(rawResponseBody)
.build();
const response = await client.browserProfiles.createBrowserProfile({
name: "name",
});
expect(response).toEqual({
browser_profile_id: "browser_profile_id",
organization_id: "organization_id",
name: "name",
description: "description",
created_at: "2024-01-15T09:30:00Z",
modified_at: "2024-01-15T09:30:00Z",
deleted_at: "2024-01-15T09:30:00Z",
});
});
test("createBrowserProfile (2)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawRequestBody = { name: "name" };
const rawResponseBody = { key: "value" };
server
.mockEndpoint()
.post("/v1/browser_profiles")
.jsonBody(rawRequestBody)
.respondWith()
.statusCode(422)
.jsonBody(rawResponseBody)
.build();
await expect(async () => {
return await client.browserProfiles.createBrowserProfile({
name: "name",
});
}).rejects.toThrow(Skyvern.UnprocessableEntityError);
});
test("getBrowserProfile (1)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawResponseBody = {
browser_profile_id: "browser_profile_id",
organization_id: "organization_id",
name: "name",
description: "description",
created_at: "2024-01-15T09:30:00Z",
modified_at: "2024-01-15T09:30:00Z",
deleted_at: "2024-01-15T09:30:00Z",
};
server
.mockEndpoint()
.get("/v1/browser_profiles/bp_123456")
.respondWith()
.statusCode(200)
.jsonBody(rawResponseBody)
.build();
const response = await client.browserProfiles.getBrowserProfile("bp_123456");
expect(response).toEqual({
browser_profile_id: "browser_profile_id",
organization_id: "organization_id",
name: "name",
description: "description",
created_at: "2024-01-15T09:30:00Z",
modified_at: "2024-01-15T09:30:00Z",
deleted_at: "2024-01-15T09:30:00Z",
});
});
test("getBrowserProfile (2)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawResponseBody = { key: "value" };
server
.mockEndpoint()
.get("/v1/browser_profiles/profile_id")
.respondWith()
.statusCode(404)
.jsonBody(rawResponseBody)
.build();
await expect(async () => {
return await client.browserProfiles.getBrowserProfile("profile_id");
}).rejects.toThrow(Skyvern.NotFoundError);
});
test("getBrowserProfile (3)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawResponseBody = { key: "value" };
server
.mockEndpoint()
.get("/v1/browser_profiles/profile_id")
.respondWith()
.statusCode(422)
.jsonBody(rawResponseBody)
.build();
await expect(async () => {
return await client.browserProfiles.getBrowserProfile("profile_id");
}).rejects.toThrow(Skyvern.UnprocessableEntityError);
});
test("deleteBrowserProfile (1)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
server.mockEndpoint().delete("/v1/browser_profiles/bp_123456").respondWith().statusCode(200).build();
const response = await client.browserProfiles.deleteBrowserProfile("bp_123456");
expect(response).toEqual(undefined);
});
test("deleteBrowserProfile (2)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawResponseBody = { key: "value" };
server
.mockEndpoint()
.delete("/v1/browser_profiles/profile_id")
.respondWith()
.statusCode(404)
.jsonBody(rawResponseBody)
.build();
await expect(async () => {
return await client.browserProfiles.deleteBrowserProfile("profile_id");
}).rejects.toThrow(Skyvern.NotFoundError);
});
test("deleteBrowserProfile (3)", async () => {
const server = mockServerPool.createServer();
const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl });
const rawResponseBody = { key: "value" };
server
.mockEndpoint()
.delete("/v1/browser_profiles/profile_id")
.respondWith()
.statusCode(422)
.jsonBody(rawResponseBody)
.build();
await expect(async () => {
return await client.browserProfiles.deleteBrowserProfile("profile_id");
}).rejects.toThrow(Skyvern.UnprocessableEntityError);
});
});

View File

@@ -26,6 +26,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: { ai_fallback_triggered: true },
errors: [{ key: "value" }],
@@ -90,6 +91,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: {
ai_fallback_triggered: true,
@@ -197,6 +199,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: { ai_fallback_triggered: true },
errors: [{ key: "value" }],
@@ -211,6 +214,7 @@ describe("SkyvernClient", () => {
totp_url: "totp_url",
totp_identifier: "totp_identifier",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
extra_http_headers: { key: "value" },
browser_address: "browser_address",
@@ -261,6 +265,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: {
ai_fallback_triggered: true,
@@ -283,6 +288,7 @@ describe("SkyvernClient", () => {
totp_url: "totp_url",
totp_identifier: "totp_identifier",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
extra_http_headers: {
key: "value",
@@ -362,6 +368,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: { ai_fallback_triggered: true },
errors: [{ key: "value" }],
@@ -414,6 +421,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: {
ai_fallback_triggered: true,
@@ -728,7 +736,10 @@ describe("SkyvernClient", () => {
.jsonBody(rawResponseBody)
.build();
const response = await client.createWorkflow({});
const response = await client.createWorkflow({
folder_id: "folder_id",
body: {},
});
expect(response).toEqual({
workflow_id: "workflow_id",
organization_id: "organization_id",
@@ -804,7 +815,9 @@ describe("SkyvernClient", () => {
.build();
await expect(async () => {
return await client.createWorkflow({});
return await client.createWorkflow({
body: {},
});
}).rejects.toThrow(Skyvern.UnprocessableEntityError);
});
@@ -2070,6 +2083,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: { ai_fallback_triggered: true },
errors: [{ key: "value" }],
@@ -2084,6 +2098,7 @@ describe("SkyvernClient", () => {
totp_url: "totp_url",
totp_identifier: "totp_identifier",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
extra_http_headers: { key: "value" },
browser_address: "browser_address",
@@ -2127,6 +2142,7 @@ describe("SkyvernClient", () => {
finished_at: "2024-01-15T09:30:00Z",
app_url: "app_url",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
script_run: {
ai_fallback_triggered: true,
@@ -2149,6 +2165,7 @@ describe("SkyvernClient", () => {
totp_url: "totp_url",
totp_identifier: "totp_identifier",
browser_session_id: "browser_session_id",
browser_profile_id: "browser_profile_id",
max_screenshot_scrolls: 1,
extra_http_headers: {
key: "value",

View File

@@ -41,6 +41,7 @@ if typing.TYPE_CHECKING:
BitwardenSensitiveInformationParameter,
BitwardenSensitiveInformationParameterYaml,
BlockType,
BrowserProfile,
BrowserSessionResponse,
ClickAction,
ClickActionData,
@@ -468,7 +469,7 @@ if typing.TYPE_CHECKING:
WorkflowStatus,
)
from .errors import BadRequestError, ForbiddenError, NotFoundError, UnprocessableEntityError
from . import scripts, workflows
from . import browser_profiles, scripts, workflows
from .client import AsyncSkyvern, Skyvern
from .environment import SkyvernEnvironment
from .version import __version__
@@ -509,6 +510,7 @@ _dynamic_imports: typing.Dict[str, str] = {
"BitwardenSensitiveInformationParameter": ".types",
"BitwardenSensitiveInformationParameterYaml": ".types",
"BlockType": ".types",
"BrowserProfile": ".types",
"BrowserSessionResponse": ".types",
"ClickAction": ".types",
"ClickActionData": ".types",
@@ -940,6 +942,7 @@ _dynamic_imports: typing.Dict[str, str] = {
"WorkflowRunTimelineType": ".types",
"WorkflowStatus": ".types",
"__version__": ".version",
"browser_profiles": ".browser_profiles",
"scripts": ".scripts",
"workflows": ".workflows",
}
@@ -1003,6 +1006,7 @@ __all__ = [
"BitwardenSensitiveInformationParameter",
"BitwardenSensitiveInformationParameterYaml",
"BlockType",
"BrowserProfile",
"BrowserSessionResponse",
"ClickAction",
"ClickActionData",
@@ -1434,6 +1438,7 @@ __all__ = [
"WorkflowRunTimelineType",
"WorkflowStatus",
"__version__",
"browser_profiles",
"scripts",
"workflows",
]

View File

@@ -0,0 +1,4 @@
# This file was auto-generated by Fern from our API Definition.
# isort: skip_file

View File

@@ -0,0 +1,379 @@
# This file was auto-generated by Fern from our API Definition.
import typing
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.request_options import RequestOptions
from ..types.browser_profile import BrowserProfile
from .raw_client import AsyncRawBrowserProfilesClient, RawBrowserProfilesClient
# this is used as the default value for optional parameters
OMIT = typing.cast(typing.Any, ...)
class BrowserProfilesClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
self._raw_client = RawBrowserProfilesClient(client_wrapper=client_wrapper)
@property
def with_raw_response(self) -> RawBrowserProfilesClient:
"""
Retrieves a raw implementation of this client that returns raw responses.
Returns
-------
RawBrowserProfilesClient
"""
return self._raw_client
def list_browser_profiles(
self, *, include_deleted: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None
) -> typing.List[BrowserProfile]:
"""
Get all browser profiles for the organization
Parameters
----------
include_deleted : typing.Optional[bool]
Include deleted browser profiles
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
typing.List[BrowserProfile]
Successful Response
Examples
--------
from skyvern import Skyvern
client = Skyvern(
api_key="YOUR_API_KEY",
)
client.browser_profiles.list_browser_profiles(
include_deleted=True,
)
"""
_response = self._raw_client.list_browser_profiles(
include_deleted=include_deleted, request_options=request_options
)
return _response.data
def create_browser_profile(
self,
*,
name: str,
description: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
workflow_run_id: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> BrowserProfile:
"""
Parameters
----------
name : str
Name for the browser profile
description : typing.Optional[str]
Optional profile description
browser_session_id : typing.Optional[str]
Persistent browser session to convert into a profile
workflow_run_id : typing.Optional[str]
Workflow run whose persisted session should be captured
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
BrowserProfile
Successful Response
Examples
--------
from skyvern import Skyvern
client = Skyvern(
api_key="YOUR_API_KEY",
)
client.browser_profiles.create_browser_profile(
name="name",
)
"""
_response = self._raw_client.create_browser_profile(
name=name,
description=description,
browser_session_id=browser_session_id,
workflow_run_id=workflow_run_id,
request_options=request_options,
)
return _response.data
def get_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> BrowserProfile:
"""
Get a specific browser profile by ID
Parameters
----------
profile_id : str
The ID of the browser profile. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
BrowserProfile
Successfully retrieved browser profile
Examples
--------
from skyvern import Skyvern
client = Skyvern(
api_key="YOUR_API_KEY",
)
client.browser_profiles.get_browser_profile(
profile_id="bp_123456",
)
"""
_response = self._raw_client.get_browser_profile(profile_id, request_options=request_options)
return _response.data
def delete_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> None:
"""
Delete a browser profile (soft delete)
Parameters
----------
profile_id : str
The ID of the browser profile to delete. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
None
Examples
--------
from skyvern import Skyvern
client = Skyvern(
api_key="YOUR_API_KEY",
)
client.browser_profiles.delete_browser_profile(
profile_id="bp_123456",
)
"""
_response = self._raw_client.delete_browser_profile(profile_id, request_options=request_options)
return _response.data
class AsyncBrowserProfilesClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
self._raw_client = AsyncRawBrowserProfilesClient(client_wrapper=client_wrapper)
@property
def with_raw_response(self) -> AsyncRawBrowserProfilesClient:
"""
Retrieves a raw implementation of this client that returns raw responses.
Returns
-------
AsyncRawBrowserProfilesClient
"""
return self._raw_client
async def list_browser_profiles(
self, *, include_deleted: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None
) -> typing.List[BrowserProfile]:
"""
Get all browser profiles for the organization
Parameters
----------
include_deleted : typing.Optional[bool]
Include deleted browser profiles
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
typing.List[BrowserProfile]
Successful Response
Examples
--------
import asyncio
from skyvern import AsyncSkyvern
client = AsyncSkyvern(
api_key="YOUR_API_KEY",
)
async def main() -> None:
await client.browser_profiles.list_browser_profiles(
include_deleted=True,
)
asyncio.run(main())
"""
_response = await self._raw_client.list_browser_profiles(
include_deleted=include_deleted, request_options=request_options
)
return _response.data
async def create_browser_profile(
self,
*,
name: str,
description: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
workflow_run_id: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> BrowserProfile:
"""
Parameters
----------
name : str
Name for the browser profile
description : typing.Optional[str]
Optional profile description
browser_session_id : typing.Optional[str]
Persistent browser session to convert into a profile
workflow_run_id : typing.Optional[str]
Workflow run whose persisted session should be captured
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
BrowserProfile
Successful Response
Examples
--------
import asyncio
from skyvern import AsyncSkyvern
client = AsyncSkyvern(
api_key="YOUR_API_KEY",
)
async def main() -> None:
await client.browser_profiles.create_browser_profile(
name="name",
)
asyncio.run(main())
"""
_response = await self._raw_client.create_browser_profile(
name=name,
description=description,
browser_session_id=browser_session_id,
workflow_run_id=workflow_run_id,
request_options=request_options,
)
return _response.data
async def get_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> BrowserProfile:
"""
Get a specific browser profile by ID
Parameters
----------
profile_id : str
The ID of the browser profile. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
BrowserProfile
Successfully retrieved browser profile
Examples
--------
import asyncio
from skyvern import AsyncSkyvern
client = AsyncSkyvern(
api_key="YOUR_API_KEY",
)
async def main() -> None:
await client.browser_profiles.get_browser_profile(
profile_id="bp_123456",
)
asyncio.run(main())
"""
_response = await self._raw_client.get_browser_profile(profile_id, request_options=request_options)
return _response.data
async def delete_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> None:
"""
Delete a browser profile (soft delete)
Parameters
----------
profile_id : str
The ID of the browser profile to delete. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
None
Examples
--------
import asyncio
from skyvern import AsyncSkyvern
client = AsyncSkyvern(
api_key="YOUR_API_KEY",
)
async def main() -> None:
await client.browser_profiles.delete_browser_profile(
profile_id="bp_123456",
)
asyncio.run(main())
"""
_response = await self._raw_client.delete_browser_profile(profile_id, request_options=request_options)
return _response.data

View File

@@ -0,0 +1,507 @@
# This file was auto-generated by Fern from our API Definition.
import typing
from json.decoder import JSONDecodeError
from ..core.api_error import ApiError
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.http_response import AsyncHttpResponse, HttpResponse
from ..core.jsonable_encoder import jsonable_encoder
from ..core.pydantic_utilities import parse_obj_as
from ..core.request_options import RequestOptions
from ..errors.not_found_error import NotFoundError
from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.browser_profile import BrowserProfile
# this is used as the default value for optional parameters
OMIT = typing.cast(typing.Any, ...)
class RawBrowserProfilesClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
self._client_wrapper = client_wrapper
def list_browser_profiles(
self, *, include_deleted: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None
) -> HttpResponse[typing.List[BrowserProfile]]:
"""
Get all browser profiles for the organization
Parameters
----------
include_deleted : typing.Optional[bool]
Include deleted browser profiles
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
HttpResponse[typing.List[BrowserProfile]]
Successful Response
"""
_response = self._client_wrapper.httpx_client.request(
"v1/browser_profiles",
method="GET",
params={
"include_deleted": include_deleted,
},
request_options=request_options,
)
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
typing.List[BrowserProfile],
parse_obj_as(
type_=typing.List[BrowserProfile], # type: ignore
object_=_response.json(),
),
)
return HttpResponse(response=_response, data=_data)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
def create_browser_profile(
self,
*,
name: str,
description: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
workflow_run_id: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[BrowserProfile]:
"""
Parameters
----------
name : str
Name for the browser profile
description : typing.Optional[str]
Optional profile description
browser_session_id : typing.Optional[str]
Persistent browser session to convert into a profile
workflow_run_id : typing.Optional[str]
Workflow run whose persisted session should be captured
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
HttpResponse[BrowserProfile]
Successful Response
"""
_response = self._client_wrapper.httpx_client.request(
"v1/browser_profiles",
method="POST",
json={
"name": name,
"description": description,
"browser_session_id": browser_session_id,
"workflow_run_id": workflow_run_id,
},
headers={
"content-type": "application/json",
},
request_options=request_options,
omit=OMIT,
)
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
BrowserProfile,
parse_obj_as(
type_=BrowserProfile, # type: ignore
object_=_response.json(),
),
)
return HttpResponse(response=_response, data=_data)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
def get_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> HttpResponse[BrowserProfile]:
"""
Get a specific browser profile by ID
Parameters
----------
profile_id : str
The ID of the browser profile. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
HttpResponse[BrowserProfile]
Successfully retrieved browser profile
"""
_response = self._client_wrapper.httpx_client.request(
f"v1/browser_profiles/{jsonable_encoder(profile_id)}",
method="GET",
request_options=request_options,
)
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
BrowserProfile,
parse_obj_as(
type_=BrowserProfile, # type: ignore
object_=_response.json(),
),
)
return HttpResponse(response=_response, data=_data)
if _response.status_code == 404:
raise NotFoundError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
def delete_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> HttpResponse[None]:
"""
Delete a browser profile (soft delete)
Parameters
----------
profile_id : str
The ID of the browser profile to delete. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
HttpResponse[None]
"""
_response = self._client_wrapper.httpx_client.request(
f"v1/browser_profiles/{jsonable_encoder(profile_id)}",
method="DELETE",
request_options=request_options,
)
try:
if 200 <= _response.status_code < 300:
return HttpResponse(response=_response, data=None)
if _response.status_code == 404:
raise NotFoundError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
class AsyncRawBrowserProfilesClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
self._client_wrapper = client_wrapper
async def list_browser_profiles(
self, *, include_deleted: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[typing.List[BrowserProfile]]:
"""
Get all browser profiles for the organization
Parameters
----------
include_deleted : typing.Optional[bool]
Include deleted browser profiles
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
AsyncHttpResponse[typing.List[BrowserProfile]]
Successful Response
"""
_response = await self._client_wrapper.httpx_client.request(
"v1/browser_profiles",
method="GET",
params={
"include_deleted": include_deleted,
},
request_options=request_options,
)
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
typing.List[BrowserProfile],
parse_obj_as(
type_=typing.List[BrowserProfile], # type: ignore
object_=_response.json(),
),
)
return AsyncHttpResponse(response=_response, data=_data)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
async def create_browser_profile(
self,
*,
name: str,
description: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
workflow_run_id: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[BrowserProfile]:
"""
Parameters
----------
name : str
Name for the browser profile
description : typing.Optional[str]
Optional profile description
browser_session_id : typing.Optional[str]
Persistent browser session to convert into a profile
workflow_run_id : typing.Optional[str]
Workflow run whose persisted session should be captured
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
AsyncHttpResponse[BrowserProfile]
Successful Response
"""
_response = await self._client_wrapper.httpx_client.request(
"v1/browser_profiles",
method="POST",
json={
"name": name,
"description": description,
"browser_session_id": browser_session_id,
"workflow_run_id": workflow_run_id,
},
headers={
"content-type": "application/json",
},
request_options=request_options,
omit=OMIT,
)
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
BrowserProfile,
parse_obj_as(
type_=BrowserProfile, # type: ignore
object_=_response.json(),
),
)
return AsyncHttpResponse(response=_response, data=_data)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
async def get_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[BrowserProfile]:
"""
Get a specific browser profile by ID
Parameters
----------
profile_id : str
The ID of the browser profile. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
AsyncHttpResponse[BrowserProfile]
Successfully retrieved browser profile
"""
_response = await self._client_wrapper.httpx_client.request(
f"v1/browser_profiles/{jsonable_encoder(profile_id)}",
method="GET",
request_options=request_options,
)
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
BrowserProfile,
parse_obj_as(
type_=BrowserProfile, # type: ignore
object_=_response.json(),
),
)
return AsyncHttpResponse(response=_response, data=_data)
if _response.status_code == 404:
raise NotFoundError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
async def delete_browser_profile(
self, profile_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[None]:
"""
Delete a browser profile (soft delete)
Parameters
----------
profile_id : str
The ID of the browser profile to delete. browser_profile_id starts with `bp_`
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
AsyncHttpResponse[None]
"""
_response = await self._client_wrapper.httpx_client.request(
f"v1/browser_profiles/{jsonable_encoder(profile_id)}",
method="DELETE",
request_options=request_options,
)
try:
if 200 <= _response.status_code < 300:
return AsyncHttpResponse(response=_response, data=None)
if _response.status_code == 404:
raise NotFoundError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
if _response.status_code == 422:
raise UnprocessableEntityError(
headers=dict(_response.headers),
body=typing.cast(
typing.Optional[typing.Any],
parse_obj_as(
type_=typing.Optional[typing.Any], # type: ignore
object_=_response.json(),
),
),
)
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)

View File

@@ -35,6 +35,7 @@ from .types.workflow_run_timeline import WorkflowRunTimeline
from .types.workflow_status import WorkflowStatus
if typing.TYPE_CHECKING:
from .browser_profiles.client import AsyncBrowserProfilesClient, BrowserProfilesClient
from .scripts.client import AsyncScriptsClient, ScriptsClient
from .workflows.client import AsyncWorkflowsClient, WorkflowsClient
# this is used as the default value for optional parameters
@@ -108,6 +109,7 @@ class Skyvern:
)
self._raw_client = RawSkyvern(client_wrapper=self._client_wrapper)
self._workflows: typing.Optional[WorkflowsClient] = None
self._browser_profiles: typing.Optional[BrowserProfilesClient] = None
self._scripts: typing.Optional[ScriptsClient] = None
@property
@@ -297,6 +299,7 @@ class Skyvern:
totp_url: typing.Optional[str] = OMIT,
totp_identifier: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
browser_profile_id: typing.Optional[str] = OMIT,
max_screenshot_scrolls: typing.Optional[int] = OMIT,
extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = OMIT,
browser_address: typing.Optional[str] = OMIT,
@@ -363,6 +366,9 @@ class Skyvern:
browser_session_id : typing.Optional[str]
ID of a Skyvern browser session to reuse, having it continue from the current screen state
browser_profile_id : typing.Optional[str]
ID of a browser profile to reuse for this workflow run
max_screenshot_scrolls : typing.Optional[int]
The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot.
@@ -412,6 +418,7 @@ class Skyvern:
totp_url=totp_url,
totp_identifier=totp_identifier,
browser_session_id=browser_session_id,
browser_profile_id=browser_profile_id,
max_screenshot_scrolls=max_screenshot_scrolls,
extra_http_headers=extra_http_headers,
browser_address=browser_address,
@@ -575,6 +582,7 @@ class Skyvern:
def create_workflow(
self,
*,
folder_id: typing.Optional[str] = None,
json_definition: typing.Optional[WorkflowCreateYamlRequest] = OMIT,
yaml_definition: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
@@ -584,6 +592,9 @@ class Skyvern:
Parameters
----------
folder_id : typing.Optional[str]
Optional folder ID to assign the workflow to
json_definition : typing.Optional[WorkflowCreateYamlRequest]
Workflow definition in JSON format
@@ -605,10 +616,15 @@ class Skyvern:
client = Skyvern(
api_key="YOUR_API_KEY",
)
client.create_workflow()
client.create_workflow(
folder_id="folder_id",
)
"""
_response = self._raw_client.create_workflow(
json_definition=json_definition, yaml_definition=yaml_definition, request_options=request_options
folder_id=folder_id,
json_definition=json_definition,
yaml_definition=yaml_definition,
request_options=request_options,
)
return _response.data
@@ -1577,6 +1593,14 @@ class Skyvern:
self._workflows = WorkflowsClient(client_wrapper=self._client_wrapper)
return self._workflows
@property
def browser_profiles(self):
if self._browser_profiles is None:
from .browser_profiles.client import BrowserProfilesClient # noqa: E402
self._browser_profiles = BrowserProfilesClient(client_wrapper=self._client_wrapper)
return self._browser_profiles
@property
def scripts(self):
if self._scripts is None:
@@ -1653,6 +1677,7 @@ class AsyncSkyvern:
)
self._raw_client = AsyncRawSkyvern(client_wrapper=self._client_wrapper)
self._workflows: typing.Optional[AsyncWorkflowsClient] = None
self._browser_profiles: typing.Optional[AsyncBrowserProfilesClient] = None
self._scripts: typing.Optional[AsyncScriptsClient] = None
@property
@@ -1850,6 +1875,7 @@ class AsyncSkyvern:
totp_url: typing.Optional[str] = OMIT,
totp_identifier: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
browser_profile_id: typing.Optional[str] = OMIT,
max_screenshot_scrolls: typing.Optional[int] = OMIT,
extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = OMIT,
browser_address: typing.Optional[str] = OMIT,
@@ -1916,6 +1942,9 @@ class AsyncSkyvern:
browser_session_id : typing.Optional[str]
ID of a Skyvern browser session to reuse, having it continue from the current screen state
browser_profile_id : typing.Optional[str]
ID of a browser profile to reuse for this workflow run
max_screenshot_scrolls : typing.Optional[int]
The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot.
@@ -1973,6 +2002,7 @@ class AsyncSkyvern:
totp_url=totp_url,
totp_identifier=totp_identifier,
browser_session_id=browser_session_id,
browser_profile_id=browser_profile_id,
max_screenshot_scrolls=max_screenshot_scrolls,
extra_http_headers=extra_http_headers,
browser_address=browser_address,
@@ -2160,6 +2190,7 @@ class AsyncSkyvern:
async def create_workflow(
self,
*,
folder_id: typing.Optional[str] = None,
json_definition: typing.Optional[WorkflowCreateYamlRequest] = OMIT,
yaml_definition: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
@@ -2169,6 +2200,9 @@ class AsyncSkyvern:
Parameters
----------
folder_id : typing.Optional[str]
Optional folder ID to assign the workflow to
json_definition : typing.Optional[WorkflowCreateYamlRequest]
Workflow definition in JSON format
@@ -2195,13 +2229,18 @@ class AsyncSkyvern:
async def main() -> None:
await client.create_workflow()
await client.create_workflow(
folder_id="folder_id",
)
asyncio.run(main())
"""
_response = await self._raw_client.create_workflow(
json_definition=json_definition, yaml_definition=yaml_definition, request_options=request_options
folder_id=folder_id,
json_definition=json_definition,
yaml_definition=yaml_definition,
request_options=request_options,
)
return _response.data
@@ -3344,6 +3383,14 @@ class AsyncSkyvern:
self._workflows = AsyncWorkflowsClient(client_wrapper=self._client_wrapper)
return self._workflows
@property
def browser_profiles(self):
if self._browser_profiles is None:
from .browser_profiles.client import AsyncBrowserProfilesClient # noqa: E402
self._browser_profiles = AsyncBrowserProfilesClient(client_wrapper=self._client_wrapper)
return self._browser_profiles
@property
def scripts(self):
if self._scripts is None:

View File

@@ -256,6 +256,7 @@ class RawSkyvern:
totp_url: typing.Optional[str] = OMIT,
totp_identifier: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
browser_profile_id: typing.Optional[str] = OMIT,
max_screenshot_scrolls: typing.Optional[int] = OMIT,
extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = OMIT,
browser_address: typing.Optional[str] = OMIT,
@@ -322,6 +323,9 @@ class RawSkyvern:
browser_session_id : typing.Optional[str]
ID of a Skyvern browser session to reuse, having it continue from the current screen state
browser_profile_id : typing.Optional[str]
ID of a browser profile to reuse for this workflow run
max_screenshot_scrolls : typing.Optional[int]
The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot.
@@ -360,6 +364,7 @@ class RawSkyvern:
"totp_url": totp_url,
"totp_identifier": totp_identifier,
"browser_session_id": browser_session_id,
"browser_profile_id": browser_profile_id,
"max_screenshot_scrolls": max_screenshot_scrolls,
"extra_http_headers": extra_http_headers,
"browser_address": browser_address,
@@ -624,6 +629,7 @@ class RawSkyvern:
def create_workflow(
self,
*,
folder_id: typing.Optional[str] = None,
json_definition: typing.Optional[WorkflowCreateYamlRequest] = OMIT,
yaml_definition: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
@@ -633,6 +639,9 @@ class RawSkyvern:
Parameters
----------
folder_id : typing.Optional[str]
Optional folder ID to assign the workflow to
json_definition : typing.Optional[WorkflowCreateYamlRequest]
Workflow definition in JSON format
@@ -650,6 +659,9 @@ class RawSkyvern:
_response = self._client_wrapper.httpx_client.request(
"v1/workflows",
method="POST",
params={
"folder_id": folder_id,
},
json={
"json_definition": convert_and_respect_annotation_metadata(
object_=json_definition, annotation=WorkflowCreateYamlRequest, direction="write"
@@ -2360,6 +2372,7 @@ class AsyncRawSkyvern:
totp_url: typing.Optional[str] = OMIT,
totp_identifier: typing.Optional[str] = OMIT,
browser_session_id: typing.Optional[str] = OMIT,
browser_profile_id: typing.Optional[str] = OMIT,
max_screenshot_scrolls: typing.Optional[int] = OMIT,
extra_http_headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = OMIT,
browser_address: typing.Optional[str] = OMIT,
@@ -2426,6 +2439,9 @@ class AsyncRawSkyvern:
browser_session_id : typing.Optional[str]
ID of a Skyvern browser session to reuse, having it continue from the current screen state
browser_profile_id : typing.Optional[str]
ID of a browser profile to reuse for this workflow run
max_screenshot_scrolls : typing.Optional[int]
The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot.
@@ -2464,6 +2480,7 @@ class AsyncRawSkyvern:
"totp_url": totp_url,
"totp_identifier": totp_identifier,
"browser_session_id": browser_session_id,
"browser_profile_id": browser_profile_id,
"max_screenshot_scrolls": max_screenshot_scrolls,
"extra_http_headers": extra_http_headers,
"browser_address": browser_address,
@@ -2728,6 +2745,7 @@ class AsyncRawSkyvern:
async def create_workflow(
self,
*,
folder_id: typing.Optional[str] = None,
json_definition: typing.Optional[WorkflowCreateYamlRequest] = OMIT,
yaml_definition: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
@@ -2737,6 +2755,9 @@ class AsyncRawSkyvern:
Parameters
----------
folder_id : typing.Optional[str]
Optional folder ID to assign the workflow to
json_definition : typing.Optional[WorkflowCreateYamlRequest]
Workflow definition in JSON format
@@ -2754,6 +2775,9 @@ class AsyncRawSkyvern:
_response = await self._client_wrapper.httpx_client.request(
"v1/workflows",
method="POST",
params={
"folder_id": folder_id,
},
json={
"json_definition": convert_and_respect_annotation_metadata(
object_=json_definition, annotation=WorkflowCreateYamlRequest, direction="write"

View File

@@ -42,6 +42,7 @@ if typing.TYPE_CHECKING:
from .bitwarden_sensitive_information_parameter import BitwardenSensitiveInformationParameter
from .bitwarden_sensitive_information_parameter_yaml import BitwardenSensitiveInformationParameterYaml
from .block_type import BlockType
from .browser_profile import BrowserProfile
from .browser_session_response import BrowserSessionResponse
from .click_action import ClickAction
from .click_action_data import ClickActionData
@@ -546,6 +547,7 @@ _dynamic_imports: typing.Dict[str, str] = {
"BitwardenSensitiveInformationParameter": ".bitwarden_sensitive_information_parameter",
"BitwardenSensitiveInformationParameterYaml": ".bitwarden_sensitive_information_parameter_yaml",
"BlockType": ".block_type",
"BrowserProfile": ".browser_profile",
"BrowserSessionResponse": ".browser_session_response",
"ClickAction": ".click_action",
"ClickActionData": ".click_action_data",
@@ -1030,6 +1032,7 @@ __all__ = [
"BitwardenSensitiveInformationParameter",
"BitwardenSensitiveInformationParameterYaml",
"BlockType",
"BrowserProfile",
"BrowserSessionResponse",
"ClickAction",
"ClickActionData",

View File

@@ -0,0 +1,26 @@
# This file was auto-generated by Fern from our API Definition.
import datetime as dt
import typing
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
class BrowserProfile(UniversalBaseModel):
browser_profile_id: str
organization_id: str
name: str
description: typing.Optional[str] = None
created_at: dt.datetime
modified_at: dt.datetime
deleted_at: typing.Optional[dt.datetime] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
class Config:
frozen = True
smart_union = True
extra = pydantic.Extra.allow

View File

@@ -32,6 +32,7 @@ class GetRunResponse_TaskV1(UniversalBaseModel):
finished_at: typing.Optional[dt.datetime] = None
app_url: typing.Optional[str] = None
browser_session_id: typing.Optional[str] = None
browser_profile_id: typing.Optional[str] = None
max_screenshot_scrolls: typing.Optional[int] = None
script_run: typing.Optional[ScriptRunResponse] = None
errors: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
@@ -63,6 +64,7 @@ class GetRunResponse_TaskV2(UniversalBaseModel):
finished_at: typing.Optional[dt.datetime] = None
app_url: typing.Optional[str] = None
browser_session_id: typing.Optional[str] = None
browser_profile_id: typing.Optional[str] = None
max_screenshot_scrolls: typing.Optional[int] = None
script_run: typing.Optional[ScriptRunResponse] = None
errors: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
@@ -94,6 +96,7 @@ class GetRunResponse_OpenaiCua(UniversalBaseModel):
finished_at: typing.Optional[dt.datetime] = None
app_url: typing.Optional[str] = None
browser_session_id: typing.Optional[str] = None
browser_profile_id: typing.Optional[str] = None
max_screenshot_scrolls: typing.Optional[int] = None
script_run: typing.Optional[ScriptRunResponse] = None
errors: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
@@ -125,6 +128,7 @@ class GetRunResponse_AnthropicCua(UniversalBaseModel):
finished_at: typing.Optional[dt.datetime] = None
app_url: typing.Optional[str] = None
browser_session_id: typing.Optional[str] = None
browser_profile_id: typing.Optional[str] = None
max_screenshot_scrolls: typing.Optional[int] = None
script_run: typing.Optional[ScriptRunResponse] = None
errors: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
@@ -156,6 +160,7 @@ class GetRunResponse_UiTars(UniversalBaseModel):
finished_at: typing.Optional[dt.datetime] = None
app_url: typing.Optional[str] = None
browser_session_id: typing.Optional[str] = None
browser_profile_id: typing.Optional[str] = None
max_screenshot_scrolls: typing.Optional[int] = None
script_run: typing.Optional[ScriptRunResponse] = None
errors: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None
@@ -187,6 +192,7 @@ class GetRunResponse_WorkflowRun(UniversalBaseModel):
finished_at: typing.Optional[dt.datetime] = None
app_url: typing.Optional[str] = None
browser_session_id: typing.Optional[str] = None
browser_profile_id: typing.Optional[str] = None
max_screenshot_scrolls: typing.Optional[int] = None
script_run: typing.Optional[ScriptRunResponse] = None
errors: typing.Optional[typing.List[typing.Dict[str, typing.Optional[typing.Any]]]] = None

View File

@@ -13,6 +13,7 @@ class InputOrSelectContext(UniversalBaseModel):
is_search_bar: typing.Optional[bool] = None
is_location_input: typing.Optional[bool] = None
is_date_related: typing.Optional[bool] = None
date_format: typing.Optional[str] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2

View File

@@ -1,7 +0,0 @@
# This file was auto-generated by Fern from our API Definition.
import typing
RunSdkActionResponseResult = typing.Union[
str, typing.Dict[str, typing.Optional[typing.Any]], typing.List[typing.Optional[typing.Any]], float, bool
]

View File

@@ -1,129 +0,0 @@
# This file was auto-generated by Fern from our API Definition.
from __future__ import annotations
import typing
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
from .click_action_data import ClickActionData
from .extract_action_data import ExtractActionData
from .extract_action_extract_schema import ExtractActionExtractSchema
from .input_text_action_data import InputTextActionData
from .select_option_action_data import SelectOptionActionData
from .upload_file_action_data import UploadFileActionData
class SdkAction_AiClick(UniversalBaseModel):
type: typing.Literal["ai_click"] = "ai_click"
selector: typing.Optional[str] = None
intention: typing.Optional[str] = None
data: typing.Optional[ClickActionData] = None
timeout: typing.Optional[float] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
class Config:
frozen = True
smart_union = True
extra = pydantic.Extra.allow
class SdkAction_AiInputText(UniversalBaseModel):
type: typing.Literal["ai_input_text"] = "ai_input_text"
selector: typing.Optional[str] = None
value: typing.Optional[str] = None
intention: typing.Optional[str] = None
data: typing.Optional[InputTextActionData] = None
totp_identifier: typing.Optional[str] = None
totp_url: typing.Optional[str] = None
timeout: typing.Optional[float] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
class Config:
frozen = True
smart_union = True
extra = pydantic.Extra.allow
class SdkAction_AiSelectOption(UniversalBaseModel):
type: typing.Literal["ai_select_option"] = "ai_select_option"
selector: typing.Optional[str] = None
value: typing.Optional[str] = None
intention: typing.Optional[str] = None
data: typing.Optional[SelectOptionActionData] = None
timeout: typing.Optional[float] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
class Config:
frozen = True
smart_union = True
extra = pydantic.Extra.allow
class SdkAction_AiUploadFile(UniversalBaseModel):
type: typing.Literal["ai_upload_file"] = "ai_upload_file"
selector: typing.Optional[str] = None
file_url: typing.Optional[str] = None
intention: typing.Optional[str] = None
data: typing.Optional[UploadFileActionData] = None
timeout: typing.Optional[float] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
class Config:
frozen = True
smart_union = True
extra = pydantic.Extra.allow
class SdkAction_AiAct(UniversalBaseModel):
type: typing.Literal["ai_act"] = "ai_act"
intention: typing.Optional[str] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
class Config:
frozen = True
smart_union = True
extra = pydantic.Extra.allow
class SdkAction_Extract(UniversalBaseModel):
type: typing.Literal["extract"] = "extract"
prompt: typing.Optional[str] = None
extract_schema: typing.Optional[ExtractActionExtractSchema] = None
error_code_mapping: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None
intention: typing.Optional[str] = None
data: typing.Optional[ExtractActionData] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
class Config:
frozen = True
smart_union = True
extra = pydantic.Extra.allow
SdkAction = typing.Union[
SdkAction_AiClick,
SdkAction_AiInputText,
SdkAction_AiSelectOption,
SdkAction_AiUploadFile,
SdkAction_AiAct,
SdkAction_Extract,
]

View File

@@ -83,6 +83,11 @@ class TaskRunResponse(UniversalBaseModel):
ID of the Skyvern persistent browser session used for this run
"""
browser_profile_id: typing.Optional[str] = pydantic.Field(default=None)
"""
ID of the browser profile used for this run
"""
max_screenshot_scrolls: typing.Optional[int] = pydantic.Field(default=None)
"""
The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot

View File

@@ -30,6 +30,7 @@ class WorkflowCreateYamlRequest(UniversalBaseModel):
cache_key: typing.Optional[str] = None
run_sequentially: typing.Optional[bool] = None
sequential_key: typing.Optional[str] = None
folder_id: typing.Optional[str] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2

View File

@@ -72,6 +72,11 @@ class WorkflowRunRequest(UniversalBaseModel):
ID of a Skyvern browser session to reuse, having it continue from the current screen state
"""
browser_profile_id: typing.Optional[str] = pydantic.Field(default=None)
"""
ID of a browser profile to reuse for this workflow run
"""
max_screenshot_scrolls: typing.Optional[int] = pydantic.Field(default=None)
"""
The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot.

View File

@@ -83,6 +83,11 @@ class WorkflowRunResponse(UniversalBaseModel):
ID of the Skyvern persistent browser session used for this run
"""
browser_profile_id: typing.Optional[str] = pydantic.Field(default=None)
"""
ID of the browser profile used for this run
"""
max_screenshot_scrolls: typing.Optional[int] = pydantic.Field(default=None)
"""
The maximum number of scrolls for the post action screenshot. When it's None or 0, it takes the current viewpoint screenshot

View File

@@ -2,13 +2,13 @@ from typing import TYPE_CHECKING, Any
from playwright.async_api import Page
from skyvern.client.types.sdk_action import (
SdkAction_AiAct,
SdkAction_AiClick,
SdkAction_AiInputText,
SdkAction_AiSelectOption,
SdkAction_AiUploadFile,
SdkAction_Extract,
from skyvern.client import (
RunSdkActionRequestAction_AiAct,
RunSdkActionRequestAction_AiClick,
RunSdkActionRequestAction_AiInputText,
RunSdkActionRequestAction_AiSelectOption,
RunSdkActionRequestAction_AiUploadFile,
RunSdkActionRequestAction_Extract,
)
from skyvern.config import settings
from skyvern.core.script_generations.skyvern_page_ai import SkyvernPageAi
@@ -43,7 +43,7 @@ class SdkSkyvernPageAi(SkyvernPageAi):
browser_session_id=self._browser.browser_session_id,
browser_address=self._browser.browser_address,
workflow_run_id=self._browser.workflow_run_id,
action=SdkAction_AiClick(
action=RunSdkActionRequestAction_AiClick(
selector=selector,
intention=intention,
data=data,
@@ -68,7 +68,7 @@ class SdkSkyvernPageAi(SkyvernPageAi):
await self._browser.sdk.ensure_has_server()
response = await self._browser.client.run_sdk_action(
url=self._page.url,
action=SdkAction_AiInputText(
action=RunSdkActionRequestAction_AiInputText(
selector=selector,
value=value,
intention=intention,
@@ -97,7 +97,7 @@ class SdkSkyvernPageAi(SkyvernPageAi):
await self._browser.sdk.ensure_has_server()
response = await self._browser.client.run_sdk_action(
url=self._page.url,
action=SdkAction_AiSelectOption(
action=RunSdkActionRequestAction_AiSelectOption(
selector=selector,
value=value,
intention=intention,
@@ -125,7 +125,7 @@ class SdkSkyvernPageAi(SkyvernPageAi):
await self._browser.sdk.ensure_has_server()
response = await self._browser.client.run_sdk_action(
url=self._page.url,
action=SdkAction_AiUploadFile(
action=RunSdkActionRequestAction_AiUploadFile(
selector=selector,
file_url=files,
intention=intention,
@@ -152,7 +152,7 @@ class SdkSkyvernPageAi(SkyvernPageAi):
await self._browser.sdk.ensure_has_server()
response = await self._browser.client.run_sdk_action(
url=self._page.url,
action=SdkAction_Extract(
action=RunSdkActionRequestAction_Extract(
prompt=prompt,
extract_schema=schema,
error_code_mapping=error_code_mapping,
@@ -175,7 +175,7 @@ class SdkSkyvernPageAi(SkyvernPageAi):
await self._browser.sdk.ensure_has_server()
response = await self._browser.client.run_sdk_action(
url=self._page.url,
action=SdkAction_AiAct(
action=RunSdkActionRequestAction_AiAct(
intention=prompt,
),
browser_session_id=self._browser.browser_session_id,