diff --git a/pyproject.toml b/pyproject.toml index c332105f..584dec1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "skyvern" -version = "1.0.2" +version = "1.0.3" description = "" authors = [{ name = "Skyvern AI", email = "info@skyvern.com" }] requires-python = ">=3.11,<3.14" diff --git a/scripts/fern_build_ts_sdk.sh b/scripts/fern_build_ts_sdk.sh index dd6fdd2d..31007125 100755 --- a/scripts/fern_build_ts_sdk.sh +++ b/scripts/fern_build_ts_sdk.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -#CURRENT_VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/') +CURRENT_VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/') fern generate --group ts-sdk --log-level debug --version "$CURRENT_VERSION" --preview mkdir -p skyvern-ts/client diff --git a/skyvern-ts/client/README.md b/skyvern-ts/client/README.md index 394fb74e..c8ff4998 100644 --- a/skyvern-ts/client/README.md +++ b/skyvern-ts/client/README.md @@ -56,7 +56,7 @@ following namespace: ```typescript import { Skyvern } from "@skyvern/client"; -const request: Skyvern.GetFoldersV1FoldersGetRequest = { +const request: Skyvern.RunTaskRequest = { ... }; ``` diff --git a/skyvern-ts/client/package-lock.json b/skyvern-ts/client/package-lock.json index b7f3c57b..2dff4771 100644 --- a/skyvern-ts/client/package-lock.json +++ b/skyvern-ts/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "@skyvern/client", - "version": "1.0.2", + "version": "1.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@skyvern/client", - "version": "1.0.2", + "version": "1.0.3", "dependencies": { "playwright": "^1.48.0" }, @@ -1589,9 +1589,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz", - "integrity": "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==", + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz", + "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1860,9 +1860,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2794,9 +2794,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.15", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.15.tgz", - "integrity": "sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3076,9 +3076,9 @@ } }, "node_modules/vite-node/node_modules/@types/node": { - "version": "24.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz", - "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.0.tgz", + "integrity": "sha512-rl78HwuZlaDIUSeUKkmogkhebA+8K1Hy7tddZuJ3D0xV8pZSfsYGTsliGUol1JPzu9EKnTxPC4L1fiWouStRew==", "dev": true, "license": "MIT", "optional": true, diff --git a/skyvern-ts/client/package.json b/skyvern-ts/client/package.json index 195e8363..e0b94a25 100644 --- a/skyvern-ts/client/package.json +++ b/skyvern-ts/client/package.json @@ -1,6 +1,6 @@ { "name": "@skyvern/client", - "version": "1.0.2", + "version": "1.0.3", "private": false, "repository": { "type": "git", diff --git a/skyvern-ts/client/reference.md b/skyvern-ts/client/reference.md index d92184a3..133f9410 100644 --- a/skyvern-ts/client/reference.md +++ b/skyvern-ts/client/reference.md @@ -68,417 +68,6 @@ await client.runSdkAction({ ## -## Workflows -
client.workflows.getFolders({ ...params }) -> Skyvern.Folder[] -
-
- -#### 📝 Description - -
-
- -
-
- -Get all folders for the organization -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.workflows.getFolders({ - page: 1, - page_size: 1, - search: "search" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Skyvern.GetFoldersV1FoldersGetRequest` - -
-
- -
-
- -**requestOptions:** `Workflows.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.workflows.createFolder({ ...params }) -> Skyvern.Folder -
-
- -#### 📝 Description - -
-
- -
-
- -Create a new folder to organize workflows -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.workflows.createFolder({ - title: "title" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Skyvern.FolderCreate` - -
-
- -
-
- -**requestOptions:** `Workflows.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.workflows.getFolder(folderId) -> Skyvern.Folder -
-
- -#### 📝 Description - -
-
- -
-
- -Get a specific folder by ID -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.workflows.getFolder("fld_123"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**folderId:** `string` — Folder ID - -
-
- -
-
- -**requestOptions:** `Workflows.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.workflows.updateFolder(folderId, { ...params }) -> Skyvern.Folder -
-
- -#### 📝 Description - -
-
- -
-
- -Update a folder's title or description -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.workflows.updateFolder("fld_123"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**folderId:** `string` — Folder ID - -
-
- -
-
- -**request:** `Skyvern.FolderUpdate` - -
-
- -
-
- -**requestOptions:** `Workflows.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.workflows.deleteFolder(folderId, { ...params }) -> Record -
-
- -#### 📝 Description - -
-
- -
-
- -Delete a folder. Optionally delete all workflows in the folder. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.workflows.deleteFolder("fld_123", { - delete_workflows: true -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**folderId:** `string` — Folder ID - -
-
- -
-
- -**request:** `Skyvern.DeleteFolderV1FoldersFolderIdDeleteRequest` - -
-
- -
-
- -**requestOptions:** `Workflows.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.workflows.updateWorkflowFolder(workflowPermanentId, { ...params }) -> Skyvern.Workflow -
-
- -#### 📝 Description - -
-
- -
-
- -Update a workflow's folder assignment for the latest version -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.workflows.updateWorkflowFolder("wpid_123"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**workflowPermanentId:** `string` — Workflow permanent ID - -
-
- -
-
- -**request:** `Skyvern.UpdateWorkflowFolderRequest` - -
-
- -
-
- -**requestOptions:** `Workflows.RequestOptions` - -
-
-
-
- - -
-
-
- ## Scripts
client.scripts.runScript(scriptId) -> unknown
diff --git a/skyvern-ts/client/src/Client.ts b/skyvern-ts/client/src/Client.ts index 3635e84b..596546e5 100644 --- a/skyvern-ts/client/src/Client.ts +++ b/skyvern-ts/client/src/Client.ts @@ -2,7 +2,6 @@ import * as Skyvern from "./api/index.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"; import { mergeHeaders, mergeOnlyDefinedHeaders } from "./core/headers.js"; import * as core from "./core/index.js"; @@ -17,7 +16,6 @@ export declare namespace SkyvernClient { export class SkyvernClient { protected readonly _options: SkyvernClient.Options; - protected _workflows: Workflows | undefined; protected _scripts: Scripts | undefined; constructor(_options: SkyvernClient.Options = {}) { @@ -28,8 +26,8 @@ export class SkyvernClient { "x-api-key": _options?.apiKey, "X-Fern-Language": "JavaScript", "X-Fern-SDK-Name": "@skyvern/client", - "X-Fern-SDK-Version": "1.0.2", - "User-Agent": "@skyvern/client/1.0.2", + "X-Fern-SDK-Version": "1.0.3", + "User-Agent": "@skyvern/client/1.0.3", "X-Fern-Runtime": core.RUNTIME.type, "X-Fern-Runtime-Version": core.RUNTIME.version, }, @@ -38,10 +36,6 @@ export class SkyvernClient { }; } - public get workflows(): Workflows { - return (this._workflows ??= new Workflows(this._options)); - } - public get scripts(): Scripts { return (this._scripts ??= new Scripts(this._options)); } diff --git a/skyvern-ts/client/src/api/client/requests/CreateCredentialRequest.ts b/skyvern-ts/client/src/api/client/requests/CreateCredentialRequest.ts index 8df2a356..c08c963c 100644 --- a/skyvern-ts/client/src/api/client/requests/CreateCredentialRequest.ts +++ b/skyvern-ts/client/src/api/client/requests/CreateCredentialRequest.ts @@ -27,5 +27,8 @@ export namespace CreateCredentialRequest { /** * The credential data to store */ - export type Credential = Skyvern.NonEmptyPasswordCredential | Skyvern.NonEmptyCreditCardCredential; + export type Credential = + | Skyvern.NonEmptyPasswordCredential + | Skyvern.NonEmptyCreditCardCredential + | Skyvern.SecretCredential; } diff --git a/skyvern-ts/client/src/api/resources/index.ts b/skyvern-ts/client/src/api/resources/index.ts index 9852fa96..7c69f0c4 100644 --- a/skyvern-ts/client/src/api/resources/index.ts +++ b/skyvern-ts/client/src/api/resources/index.ts @@ -1,3 +1 @@ export * as scripts from "./scripts/index.js"; -export * from "./workflows/client/requests/index.js"; -export * as workflows from "./workflows/index.js"; diff --git a/skyvern-ts/client/src/api/resources/workflows/client/Client.ts b/skyvern-ts/client/src/api/resources/workflows/client/Client.ts deleted file mode 100644 index 8089fcae..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/Client.ts +++ /dev/null @@ -1,540 +0,0 @@ -// 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 Workflows { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class Workflows { - protected readonly _options: Workflows.Options; - - constructor(_options: Workflows.Options = {}) { - this._options = _options; - } - - /** - * Get all folders for the organization - * - * @param {Skyvern.GetFoldersV1FoldersGetRequest} request - * @param {Workflows.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link Skyvern.UnprocessableEntityError} - * - * @example - * await client.workflows.getFolders({ - * page: 1, - * page_size: 1, - * search: "search" - * }) - */ - public getFolders( - request: Skyvern.GetFoldersV1FoldersGetRequest = {}, - requestOptions?: Workflows.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getFolders(request, requestOptions)); - } - - private async __getFolders( - request: Skyvern.GetFoldersV1FoldersGetRequest = {}, - requestOptions?: Workflows.RequestOptions, - ): Promise> { - const { page, page_size: pageSize, search } = request; - const _queryParams: Record = {}; - if (page != null) { - _queryParams.page = page.toString(); - } - - if (pageSize != null) { - _queryParams.page_size = pageSize.toString(); - } - - if (search != null) { - _queryParams.search = search; - } - - 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/folders", - ), - 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.Folder[], 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/folders."); - case "unknown": - throw new errors.SkyvernError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - /** - * Create a new folder to organize workflows - * - * @param {Skyvern.FolderCreate} request - * @param {Workflows.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link Skyvern.BadRequestError} - * @throws {@link Skyvern.UnprocessableEntityError} - * - * @example - * await client.workflows.createFolder({ - * title: "title" - * }) - */ - public createFolder( - request: Skyvern.FolderCreate, - requestOptions?: Workflows.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__createFolder(request, requestOptions)); - } - - private async __createFolder( - request: Skyvern.FolderCreate, - requestOptions?: Workflows.RequestOptions, - ): Promise> { - 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/folders", - ), - 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.Folder, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new Skyvern.BadRequestError(_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 POST /v1/folders."); - case "unknown": - throw new errors.SkyvernError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - /** - * Get a specific folder by ID - * - * @param {string} folderId - Folder ID - * @param {Workflows.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link Skyvern.NotFoundError} - * @throws {@link Skyvern.UnprocessableEntityError} - * - * @example - * await client.workflows.getFolder("fld_123") - */ - public getFolder( - folderId: string, - requestOptions?: Workflows.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getFolder(folderId, requestOptions)); - } - - private async __getFolder( - folderId: string, - requestOptions?: Workflows.RequestOptions, - ): Promise> { - 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/folders/${core.url.encodePathParam(folderId)}`, - ), - 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.Folder, 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/folders/{folder_id}."); - case "unknown": - throw new errors.SkyvernError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - /** - * Update a folder's title or description - * - * @param {string} folderId - Folder ID - * @param {Skyvern.FolderUpdate} request - * @param {Workflows.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link Skyvern.NotFoundError} - * @throws {@link Skyvern.UnprocessableEntityError} - * - * @example - * await client.workflows.updateFolder("fld_123") - */ - public updateFolder( - folderId: string, - request: Skyvern.FolderUpdate = {}, - requestOptions?: Workflows.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateFolder(folderId, request, requestOptions)); - } - - private async __updateFolder( - folderId: string, - request: Skyvern.FolderUpdate = {}, - requestOptions?: Workflows.RequestOptions, - ): Promise> { - 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/folders/${core.url.encodePathParam(folderId)}`, - ), - method: "PUT", - 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.Folder, 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 PUT /v1/folders/{folder_id}."); - case "unknown": - throw new errors.SkyvernError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - /** - * Delete a folder. Optionally delete all workflows in the folder. - * - * @param {string} folderId - Folder ID - * @param {Skyvern.DeleteFolderV1FoldersFolderIdDeleteRequest} request - * @param {Workflows.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link Skyvern.NotFoundError} - * @throws {@link Skyvern.UnprocessableEntityError} - * - * @example - * await client.workflows.deleteFolder("fld_123", { - * delete_workflows: true - * }) - */ - public deleteFolder( - folderId: string, - request: Skyvern.DeleteFolderV1FoldersFolderIdDeleteRequest = {}, - requestOptions?: Workflows.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__deleteFolder(folderId, request, requestOptions)); - } - - private async __deleteFolder( - folderId: string, - request: Skyvern.DeleteFolderV1FoldersFolderIdDeleteRequest = {}, - requestOptions?: Workflows.RequestOptions, - ): Promise>> { - const { delete_workflows: deleteWorkflows } = request; - const _queryParams: Record = {}; - if (deleteWorkflows != null) { - _queryParams.delete_workflows = deleteWorkflows.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/folders/${core.url.encodePathParam(folderId)}`, - ), - method: "DELETE", - 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 Record, 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/folders/{folder_id}."); - case "unknown": - throw new errors.SkyvernError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - /** - * Update a workflow's folder assignment for the latest version - * - * @param {string} workflowPermanentId - Workflow permanent ID - * @param {Skyvern.UpdateWorkflowFolderRequest} request - * @param {Workflows.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link Skyvern.BadRequestError} - * @throws {@link Skyvern.NotFoundError} - * @throws {@link Skyvern.UnprocessableEntityError} - * - * @example - * await client.workflows.updateWorkflowFolder("wpid_123") - */ - public updateWorkflowFolder( - workflowPermanentId: string, - request: Skyvern.UpdateWorkflowFolderRequest = {}, - requestOptions?: Workflows.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__updateWorkflowFolder(workflowPermanentId, request, requestOptions), - ); - } - - private async __updateWorkflowFolder( - workflowPermanentId: string, - request: Skyvern.UpdateWorkflowFolderRequest = {}, - requestOptions?: Workflows.RequestOptions, - ): Promise> { - 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/workflows/${core.url.encodePathParam(workflowPermanentId)}/folder`, - ), - method: "PUT", - 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.Workflow, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new Skyvern.BadRequestError(_response.error.body as unknown, _response.rawResponse); - 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 PUT /v1/workflows/{workflow_permanent_id}/folder.", - ); - case "unknown": - throw new errors.SkyvernError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } -} diff --git a/skyvern-ts/client/src/api/resources/workflows/client/index.ts b/skyvern-ts/client/src/api/resources/workflows/client/index.ts deleted file mode 100644 index 195f9aa8..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/skyvern-ts/client/src/api/resources/workflows/client/requests/DeleteFolderV1FoldersFolderIdDeleteRequest.ts b/skyvern-ts/client/src/api/resources/workflows/client/requests/DeleteFolderV1FoldersFolderIdDeleteRequest.ts deleted file mode 100644 index a0b05aa4..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/requests/DeleteFolderV1FoldersFolderIdDeleteRequest.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * delete_workflows: true - * } - */ -export interface DeleteFolderV1FoldersFolderIdDeleteRequest { - /** If true, also delete all workflows in this folder */ - delete_workflows?: boolean; -} diff --git a/skyvern-ts/client/src/api/resources/workflows/client/requests/FolderCreate.ts b/skyvern-ts/client/src/api/resources/workflows/client/requests/FolderCreate.ts deleted file mode 100644 index 9f8672e6..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/requests/FolderCreate.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * title: "title" - * } - */ -export interface FolderCreate { - /** Folder title */ - title: string; - /** Folder description */ - description?: string; -} diff --git a/skyvern-ts/client/src/api/resources/workflows/client/requests/FolderUpdate.ts b/skyvern-ts/client/src/api/resources/workflows/client/requests/FolderUpdate.ts deleted file mode 100644 index a254c120..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/requests/FolderUpdate.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * {} - */ -export interface FolderUpdate { - /** Folder title */ - title?: string; - /** Folder description */ - description?: string; -} diff --git a/skyvern-ts/client/src/api/resources/workflows/client/requests/GetFoldersV1FoldersGetRequest.ts b/skyvern-ts/client/src/api/resources/workflows/client/requests/GetFoldersV1FoldersGetRequest.ts deleted file mode 100644 index 461926b9..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/requests/GetFoldersV1FoldersGetRequest.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * page: 1, - * page_size: 1, - * search: "search" - * } - */ -export interface GetFoldersV1FoldersGetRequest { - /** Page number */ - page?: number; - /** Number of folders per page */ - page_size?: number; - /** Search folders by title or description */ - search?: string; -} diff --git a/skyvern-ts/client/src/api/resources/workflows/client/requests/UpdateWorkflowFolderRequest.ts b/skyvern-ts/client/src/api/resources/workflows/client/requests/UpdateWorkflowFolderRequest.ts deleted file mode 100644 index 52a60875..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/requests/UpdateWorkflowFolderRequest.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * {} - */ -export interface UpdateWorkflowFolderRequest { - /** Folder ID to assign workflow to. Set to null to remove from folder. */ - folder_id?: string; -} diff --git a/skyvern-ts/client/src/api/resources/workflows/client/requests/index.ts b/skyvern-ts/client/src/api/resources/workflows/client/requests/index.ts deleted file mode 100644 index 521e6501..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/client/requests/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { DeleteFolderV1FoldersFolderIdDeleteRequest } from "./DeleteFolderV1FoldersFolderIdDeleteRequest.js"; -export type { FolderCreate } from "./FolderCreate.js"; -export type { FolderUpdate } from "./FolderUpdate.js"; -export type { GetFoldersV1FoldersGetRequest } from "./GetFoldersV1FoldersGetRequest.js"; -export type { UpdateWorkflowFolderRequest } from "./UpdateWorkflowFolderRequest.js"; diff --git a/skyvern-ts/client/src/api/resources/workflows/index.ts b/skyvern-ts/client/src/api/resources/workflows/index.ts deleted file mode 100644 index 914b8c3c..00000000 --- a/skyvern-ts/client/src/api/resources/workflows/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/skyvern-ts/client/src/api/types/ActionType.ts b/skyvern-ts/client/src/api/types/ActionType.ts index 595c9050..3c67b65d 100644 --- a/skyvern-ts/client/src/api/types/ActionType.ts +++ b/skyvern-ts/client/src/api/types/ActionType.ts @@ -8,6 +8,7 @@ export const ActionType = { SelectOption: "select_option", Checkbox: "checkbox", Wait: "wait", + Hover: "hover", NullAction: "null_action", SolveCaptcha: "solve_captcha", Terminate: "terminate", diff --git a/skyvern-ts/client/src/api/types/CredentialResponse.ts b/skyvern-ts/client/src/api/types/CredentialResponse.ts index d31e48eb..e1432f9e 100644 --- a/skyvern-ts/client/src/api/types/CredentialResponse.ts +++ b/skyvern-ts/client/src/api/types/CredentialResponse.ts @@ -20,5 +20,8 @@ export namespace CredentialResponse { /** * The credential data */ - export type Credential = Skyvern.PasswordCredentialResponse | Skyvern.CreditCardCredentialResponse; + export type Credential = + | Skyvern.PasswordCredentialResponse + | Skyvern.CreditCardCredentialResponse + | Skyvern.SecretCredentialResponse; } diff --git a/skyvern-ts/client/src/api/types/CredentialTypeOutput.ts b/skyvern-ts/client/src/api/types/CredentialTypeOutput.ts index b2abba79..2f799da1 100644 --- a/skyvern-ts/client/src/api/types/CredentialTypeOutput.ts +++ b/skyvern-ts/client/src/api/types/CredentialTypeOutput.ts @@ -4,5 +4,6 @@ export const CredentialTypeOutput = { Password: "password", CreditCard: "credit_card", + Secret: "secret", } as const; export type CredentialTypeOutput = (typeof CredentialTypeOutput)[keyof typeof CredentialTypeOutput]; diff --git a/skyvern-ts/client/src/api/types/Folder.ts b/skyvern-ts/client/src/api/types/Folder.ts deleted file mode 100644 index 57622c34..00000000 --- a/skyvern-ts/client/src/api/types/Folder.ts +++ /dev/null @@ -1,17 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * Response model for a folder - */ -export interface Folder { - /** Folder title */ - title: string; - /** Folder description */ - description?: string; - folder_id: string; - organization_id: string; - /** Number of workflows in this folder */ - workflow_count?: number; - created_at: string; - modified_at: string; -} diff --git a/skyvern-ts/client/src/api/types/HttpRequestBlock.ts b/skyvern-ts/client/src/api/types/HttpRequestBlock.ts index 704dfeda..fb3bf909 100644 --- a/skyvern-ts/client/src/api/types/HttpRequestBlock.ts +++ b/skyvern-ts/client/src/api/types/HttpRequestBlock.ts @@ -16,6 +16,7 @@ export interface HttpRequestBlock { url?: string; headers?: Record; body?: Record; + files?: Record; timeout?: number; follow_redirects?: boolean; parameters?: Skyvern.HttpRequestBlockParametersItem[]; diff --git a/skyvern-ts/client/src/api/types/HttpRequestBlockYaml.ts b/skyvern-ts/client/src/api/types/HttpRequestBlockYaml.ts index b0a7460c..243910c2 100644 --- a/skyvern-ts/client/src/api/types/HttpRequestBlockYaml.ts +++ b/skyvern-ts/client/src/api/types/HttpRequestBlockYaml.ts @@ -12,6 +12,7 @@ export interface HttpRequestBlockYaml { url?: string; headers?: Record; body?: Record; + files?: Record; timeout?: number; follow_redirects?: boolean; parameter_keys?: string[]; diff --git a/skyvern-ts/client/src/api/types/SecretCredential.ts b/skyvern-ts/client/src/api/types/SecretCredential.ts new file mode 100644 index 00000000..29b67377 --- /dev/null +++ b/skyvern-ts/client/src/api/types/SecretCredential.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * Generic secret credential. + */ +export interface SecretCredential { + /** The secret value */ + secret_value: string; + /** Optional label describing the secret */ + secret_label?: string; +} diff --git a/skyvern-ts/client/src/api/types/SecretCredentialResponse.ts b/skyvern-ts/client/src/api/types/SecretCredentialResponse.ts new file mode 100644 index 00000000..5dfed2a6 --- /dev/null +++ b/skyvern-ts/client/src/api/types/SecretCredentialResponse.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * Response model for secret credentials. + */ +export interface SecretCredentialResponse { + /** Optional label for the stored secret */ + secret_label?: string; +} diff --git a/skyvern-ts/client/src/api/types/SkyvernForgeSdkSchemasCredentialsCredentialType.ts b/skyvern-ts/client/src/api/types/SkyvernForgeSdkSchemasCredentialsCredentialType.ts index bc1f52a3..d54cbc15 100644 --- a/skyvern-ts/client/src/api/types/SkyvernForgeSdkSchemasCredentialsCredentialType.ts +++ b/skyvern-ts/client/src/api/types/SkyvernForgeSdkSchemasCredentialsCredentialType.ts @@ -4,6 +4,7 @@ export const SkyvernForgeSdkSchemasCredentialsCredentialType = { Password: "password", CreditCard: "credit_card", + Secret: "secret", } as const; export type SkyvernForgeSdkSchemasCredentialsCredentialType = (typeof SkyvernForgeSdkSchemasCredentialsCredentialType)[keyof typeof SkyvernForgeSdkSchemasCredentialsCredentialType]; diff --git a/skyvern-ts/client/src/api/types/index.ts b/skyvern-ts/client/src/api/types/index.ts index 80ac5600..45bf40eb 100644 --- a/skyvern-ts/client/src/api/types/index.ts +++ b/skyvern-ts/client/src/api/types/index.ts @@ -59,7 +59,6 @@ export * from "./FileStorageType.js"; export * from "./FileType.js"; export * from "./FileUploadBlock.js"; export * from "./FileUploadBlockYaml.js"; -export * from "./Folder.js"; export * from "./ForLoopBlock.js"; export * from "./ForLoopBlockLoopBlocksItem.js"; export * from "./ForLoopBlockLoopOver.js"; @@ -104,6 +103,8 @@ export * from "./RunStatus.js"; export * from "./Script.js"; export * from "./ScriptFileCreate.js"; export * from "./ScriptRunResponse.js"; +export * from "./SecretCredential.js"; +export * from "./SecretCredentialResponse.js"; export * from "./SelectOption.js"; export * from "./SelectOptionAction.js"; export * from "./SendEmailBlock.js"; diff --git a/skyvern-ts/client/src/version.ts b/skyvern-ts/client/src/version.ts index 8c6c1420..9add6892 100644 --- a/skyvern-ts/client/src/version.ts +++ b/skyvern-ts/client/src/version.ts @@ -1 +1 @@ -export const SDK_VERSION = "1.0.2"; +export const SDK_VERSION = "1.0.3"; diff --git a/skyvern-ts/client/tests/wire/workflows.test.ts b/skyvern-ts/client/tests/wire/workflows.test.ts deleted file mode 100644 index 4f9dbd7c..00000000 --- a/skyvern-ts/client/tests/wire/workflows.test.ts +++ /dev/null @@ -1,517 +0,0 @@ -// 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("Workflows", () => { - test("getFolders (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = [ - { - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }, - ]; - server.mockEndpoint().get("/v1/folders").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.workflows.getFolders({ - page: 1, - page_size: 1, - search: "search", - }); - expect(response).toEqual([ - { - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }, - ]); - }); - - test("getFolders (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = { key: "value" }; - server.mockEndpoint().get("/v1/folders").respondWith().statusCode(422).jsonBody(rawResponseBody).build(); - - await expect(async () => { - return await client.workflows.getFolders(); - }).rejects.toThrow(Skyvern.UnprocessableEntityError); - }); - - test("createFolder (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = { title: "title" }; - const rawResponseBody = { - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }; - server - .mockEndpoint() - .post("/v1/folders") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.workflows.createFolder({ - title: "title", - }); - expect(response).toEqual({ - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }); - }); - - test("createFolder (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = { title: "x" }; - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .post("/v1/folders") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.createFolder({ - title: "x", - }); - }).rejects.toThrow(Skyvern.BadRequestError); - }); - - test("createFolder (3)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = { title: "x" }; - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .post("/v1/folders") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(422) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.createFolder({ - title: "x", - }); - }).rejects.toThrow(Skyvern.UnprocessableEntityError); - }); - - test("getFolder (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = { - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }; - server - .mockEndpoint() - .get("/v1/folders/fld_123") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.workflows.getFolder("fld_123"); - expect(response).toEqual({ - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }); - }); - - test("getFolder (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .get("/v1/folders/folder_id") - .respondWith() - .statusCode(404) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.getFolder("folder_id"); - }).rejects.toThrow(Skyvern.NotFoundError); - }); - - test("getFolder (3)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .get("/v1/folders/folder_id") - .respondWith() - .statusCode(422) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.getFolder("folder_id"); - }).rejects.toThrow(Skyvern.UnprocessableEntityError); - }); - - test("updateFolder (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = {}; - const rawResponseBody = { - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }; - server - .mockEndpoint() - .put("/v1/folders/fld_123") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.workflows.updateFolder("fld_123"); - expect(response).toEqual({ - title: "title", - description: "description", - folder_id: "folder_id", - organization_id: "organization_id", - workflow_count: 1, - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }); - }); - - test("updateFolder (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = {}; - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .put("/v1/folders/folder_id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(404) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.updateFolder("folder_id"); - }).rejects.toThrow(Skyvern.NotFoundError); - }); - - test("updateFolder (3)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = {}; - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .put("/v1/folders/folder_id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(422) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.updateFolder("folder_id"); - }).rejects.toThrow(Skyvern.UnprocessableEntityError); - }); - - test("deleteFolder (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .delete("/v1/folders/fld_123") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.workflows.deleteFolder("fld_123", { - delete_workflows: true, - }); - expect(response).toEqual({ - key: "value", - }); - }); - - test("deleteFolder (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .delete("/v1/folders/folder_id") - .respondWith() - .statusCode(404) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.deleteFolder("folder_id"); - }).rejects.toThrow(Skyvern.NotFoundError); - }); - - test("deleteFolder (3)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .delete("/v1/folders/folder_id") - .respondWith() - .statusCode(422) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.deleteFolder("folder_id"); - }).rejects.toThrow(Skyvern.UnprocessableEntityError); - }); - - test("updateWorkflowFolder (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = {}; - const rawResponseBody = { - workflow_id: "workflow_id", - organization_id: "organization_id", - title: "title", - workflow_permanent_id: "workflow_permanent_id", - version: 1, - is_saved_task: true, - description: "description", - workflow_definition: { - version: 1, - parameters: [ - { - parameter_type: "aws_secret", - key: "key", - aws_secret_parameter_id: "aws_secret_parameter_id", - workflow_id: "workflow_id", - aws_key: "aws_key", - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }, - ], - blocks: [ - { - block_type: "action", - label: "label", - output_parameter: { - key: "key", - output_parameter_id: "output_parameter_id", - workflow_id: "workflow_id", - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }, - }, - ], - }, - proxy_location: "RESIDENTIAL", - webhook_callback_url: "webhook_callback_url", - totp_verification_url: "totp_verification_url", - totp_identifier: "totp_identifier", - persist_browser_session: true, - model: { key: "value" }, - status: "published", - max_screenshot_scrolls: 1, - extra_http_headers: { key: "value" }, - run_with: "run_with", - ai_fallback: true, - cache_key: "cache_key", - run_sequentially: true, - sequential_key: "sequential_key", - folder_id: "folder_id", - import_error: "import_error", - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - deleted_at: "2024-01-15T09:30:00Z", - }; - server - .mockEndpoint() - .put("/v1/workflows/wpid_123/folder") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.workflows.updateWorkflowFolder("wpid_123"); - expect(response).toEqual({ - workflow_id: "workflow_id", - organization_id: "organization_id", - title: "title", - workflow_permanent_id: "workflow_permanent_id", - version: 1, - is_saved_task: true, - description: "description", - workflow_definition: { - version: 1, - parameters: [ - { - parameter_type: "aws_secret", - key: "key", - aws_secret_parameter_id: "aws_secret_parameter_id", - workflow_id: "workflow_id", - aws_key: "aws_key", - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }, - ], - blocks: [ - { - block_type: "action", - label: "label", - output_parameter: { - key: "key", - output_parameter_id: "output_parameter_id", - workflow_id: "workflow_id", - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - }, - }, - ], - }, - proxy_location: "RESIDENTIAL", - webhook_callback_url: "webhook_callback_url", - totp_verification_url: "totp_verification_url", - totp_identifier: "totp_identifier", - persist_browser_session: true, - model: { - key: "value", - }, - status: "published", - max_screenshot_scrolls: 1, - extra_http_headers: { - key: "value", - }, - run_with: "run_with", - ai_fallback: true, - cache_key: "cache_key", - run_sequentially: true, - sequential_key: "sequential_key", - folder_id: "folder_id", - import_error: "import_error", - created_at: "2024-01-15T09:30:00Z", - modified_at: "2024-01-15T09:30:00Z", - deleted_at: "2024-01-15T09:30:00Z", - }); - }); - - test("updateWorkflowFolder (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = {}; - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .put("/v1/workflows/workflow_permanent_id/folder") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.updateWorkflowFolder("workflow_permanent_id"); - }).rejects.toThrow(Skyvern.BadRequestError); - }); - - test("updateWorkflowFolder (3)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = {}; - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .put("/v1/workflows/workflow_permanent_id/folder") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(404) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.updateWorkflowFolder("workflow_permanent_id"); - }).rejects.toThrow(Skyvern.NotFoundError); - }); - - test("updateWorkflowFolder (4)", async () => { - const server = mockServerPool.createServer(); - const client = new SkyvernClient({ apiKey: "test", environment: server.baseUrl }); - const rawRequestBody = {}; - const rawResponseBody = { key: "value" }; - server - .mockEndpoint() - .put("/v1/workflows/workflow_permanent_id/folder") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(422) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.workflows.updateWorkflowFolder("workflow_permanent_id"); - }).rejects.toThrow(Skyvern.UnprocessableEntityError); - }); -}); diff --git a/skyvern/client/__init__.py b/skyvern/client/__init__.py index d06242ed..2293b30b 100644 --- a/skyvern/client/__init__.py +++ b/skyvern/client/__init__.py @@ -137,7 +137,6 @@ if typing.TYPE_CHECKING: FileType, FileUploadBlock, FileUploadBlockYaml, - Folder, ForLoopBlock, ForLoopBlockLoopBlocksItem, ForLoopBlockLoopBlocksItem_Action, @@ -300,6 +299,8 @@ if typing.TYPE_CHECKING: Script, ScriptFileCreate, ScriptRunResponse, + SecretCredential, + SecretCredentialResponse, SelectOption, SelectOptionAction, SelectOptionActionData, @@ -495,7 +496,7 @@ if typing.TYPE_CHECKING: WorkflowStatus, ) from .errors import BadRequestError, ConflictError, ForbiddenError, NotFoundError, UnprocessableEntityError - from . import scripts, workflows + from . import scripts from .client import AsyncSkyvern, Skyvern from .environment import SkyvernEnvironment from .version import __version__ @@ -633,7 +634,6 @@ _dynamic_imports: typing.Dict[str, str] = { "FileType": ".types", "FileUploadBlock": ".types", "FileUploadBlockYaml": ".types", - "Folder": ".types", "ForLoopBlock": ".types", "ForLoopBlockLoopBlocksItem": ".types", "ForLoopBlockLoopBlocksItem_Action": ".types", @@ -798,6 +798,8 @@ _dynamic_imports: typing.Dict[str, str] = { "Script": ".types", "ScriptFileCreate": ".types", "ScriptRunResponse": ".types", + "SecretCredential": ".types", + "SecretCredentialResponse": ".types", "SelectOption": ".types", "SelectOptionAction": ".types", "SelectOptionActionData": ".types", @@ -996,7 +998,6 @@ _dynamic_imports: typing.Dict[str, str] = { "WorkflowStatus": ".types", "__version__": ".version", "scripts": ".scripts", - "workflows": ".workflows", } @@ -1155,7 +1156,6 @@ __all__ = [ "FileType", "FileUploadBlock", "FileUploadBlockYaml", - "Folder", "ForLoopBlock", "ForLoopBlockLoopBlocksItem", "ForLoopBlockLoopBlocksItem_Action", @@ -1320,6 +1320,8 @@ __all__ = [ "Script", "ScriptFileCreate", "ScriptRunResponse", + "SecretCredential", + "SecretCredentialResponse", "SelectOption", "SelectOptionAction", "SelectOptionActionData", @@ -1518,5 +1520,4 @@ __all__ = [ "WorkflowStatus", "__version__", "scripts", - "workflows", ] diff --git a/skyvern/client/client.py b/skyvern/client/client.py index 3bc60312..1b77085b 100644 --- a/skyvern/client/client.py +++ b/skyvern/client/client.py @@ -39,7 +39,6 @@ from .types.workflow_status import WorkflowStatus if typing.TYPE_CHECKING: from .scripts.client import AsyncScriptsClient, ScriptsClient - from .workflows.client import AsyncWorkflowsClient, WorkflowsClient # this is used as the default value for optional parameters OMIT = typing.cast(typing.Any, ...) @@ -110,7 +109,6 @@ class Skyvern: timeout=_defaulted_timeout, ) self._raw_client = RawSkyvern(client_wrapper=self._client_wrapper) - self._workflows: typing.Optional[WorkflowsClient] = None self._scripts: typing.Optional[ScriptsClient] = None @property @@ -1851,14 +1849,6 @@ class Skyvern: ) return _response.data - @property - def workflows(self): - if self._workflows is None: - from .workflows.client import WorkflowsClient # noqa: E402 - - self._workflows = WorkflowsClient(client_wrapper=self._client_wrapper) - return self._workflows - @property def scripts(self): if self._scripts is None: @@ -1934,7 +1924,6 @@ class AsyncSkyvern: timeout=_defaulted_timeout, ) self._raw_client = AsyncRawSkyvern(client_wrapper=self._client_wrapper) - self._workflows: typing.Optional[AsyncWorkflowsClient] = None self._scripts: typing.Optional[AsyncScriptsClient] = None @property @@ -3937,14 +3926,6 @@ class AsyncSkyvern: ) return _response.data - @property - def workflows(self): - if self._workflows is None: - from .workflows.client import AsyncWorkflowsClient # noqa: E402 - - self._workflows = AsyncWorkflowsClient(client_wrapper=self._client_wrapper) - return self._workflows - @property def scripts(self): if self._scripts is None: diff --git a/skyvern/client/core/client_wrapper.py b/skyvern/client/core/client_wrapper.py index 250076cb..7513f68e 100644 --- a/skyvern/client/core/client_wrapper.py +++ b/skyvern/client/core/client_wrapper.py @@ -22,10 +22,10 @@ class BaseClientWrapper: def get_headers(self) -> typing.Dict[str, str]: headers: typing.Dict[str, str] = { - "User-Agent": "skyvern/1.0.2", + "User-Agent": "skyvern/1.0.3", "X-Fern-Language": "Python", "X-Fern-SDK-Name": "skyvern", - "X-Fern-SDK-Version": "1.0.2", + "X-Fern-SDK-Version": "1.0.3", **(self.get_custom_headers() or {}), } if self._api_key is not None: diff --git a/skyvern/client/types/__init__.py b/skyvern/client/types/__init__.py index c420eb1a..efa99655 100644 --- a/skyvern/client/types/__init__.py +++ b/skyvern/client/types/__init__.py @@ -148,7 +148,6 @@ if typing.TYPE_CHECKING: from .file_type import FileType from .file_upload_block import FileUploadBlock from .file_upload_block_yaml import FileUploadBlockYaml - from .folder import Folder from .for_loop_block import ForLoopBlock from .for_loop_block_loop_blocks_item import ( ForLoopBlockLoopBlocksItem, @@ -329,6 +328,8 @@ if typing.TYPE_CHECKING: from .script import Script from .script_file_create import ScriptFileCreate from .script_run_response import ScriptRunResponse + from .secret_credential import SecretCredential + from .secret_credential_response import SecretCredentialResponse from .select_option import SelectOption from .select_option_action import SelectOptionAction from .select_option_action_data import SelectOptionActionData @@ -671,7 +672,6 @@ _dynamic_imports: typing.Dict[str, str] = { "FileType": ".file_type", "FileUploadBlock": ".file_upload_block", "FileUploadBlockYaml": ".file_upload_block_yaml", - "Folder": ".folder", "ForLoopBlock": ".for_loop_block", "ForLoopBlockLoopBlocksItem": ".for_loop_block_loop_blocks_item", "ForLoopBlockLoopBlocksItem_Action": ".for_loop_block_loop_blocks_item", @@ -834,6 +834,8 @@ _dynamic_imports: typing.Dict[str, str] = { "Script": ".script", "ScriptFileCreate": ".script_file_create", "ScriptRunResponse": ".script_run_response", + "SecretCredential": ".secret_credential", + "SecretCredentialResponse": ".secret_credential_response", "SelectOption": ".select_option", "SelectOptionAction": ".select_option_action", "SelectOptionActionData": ".select_option_action_data", @@ -1182,7 +1184,6 @@ __all__ = [ "FileType", "FileUploadBlock", "FileUploadBlockYaml", - "Folder", "ForLoopBlock", "ForLoopBlockLoopBlocksItem", "ForLoopBlockLoopBlocksItem_Action", @@ -1345,6 +1346,8 @@ __all__ = [ "Script", "ScriptFileCreate", "ScriptRunResponse", + "SecretCredential", + "SecretCredentialResponse", "SelectOption", "SelectOptionAction", "SelectOptionActionData", diff --git a/skyvern/client/types/action_type.py b/skyvern/client/types/action_type.py index a8105938..1a37282c 100644 --- a/skyvern/client/types/action_type.py +++ b/skyvern/client/types/action_type.py @@ -11,6 +11,7 @@ ActionType = typing.Union[ "select_option", "checkbox", "wait", + "hover", "null_action", "solve_captcha", "terminate", diff --git a/skyvern/client/types/create_credential_request_credential.py b/skyvern/client/types/create_credential_request_credential.py index 76d78fd4..c521366a 100644 --- a/skyvern/client/types/create_credential_request_credential.py +++ b/skyvern/client/types/create_credential_request_credential.py @@ -4,5 +4,8 @@ import typing from .non_empty_credit_card_credential import NonEmptyCreditCardCredential from .non_empty_password_credential import NonEmptyPasswordCredential +from .secret_credential import SecretCredential -CreateCredentialRequestCredential = typing.Union[NonEmptyPasswordCredential, NonEmptyCreditCardCredential] +CreateCredentialRequestCredential = typing.Union[ + NonEmptyPasswordCredential, NonEmptyCreditCardCredential, SecretCredential +] diff --git a/skyvern/client/types/credential_response_credential.py b/skyvern/client/types/credential_response_credential.py index 43e28d3b..c0fa0303 100644 --- a/skyvern/client/types/credential_response_credential.py +++ b/skyvern/client/types/credential_response_credential.py @@ -4,5 +4,8 @@ import typing from .credit_card_credential_response import CreditCardCredentialResponse from .password_credential_response import PasswordCredentialResponse +from .secret_credential_response import SecretCredentialResponse -CredentialResponseCredential = typing.Union[PasswordCredentialResponse, CreditCardCredentialResponse] +CredentialResponseCredential = typing.Union[ + PasswordCredentialResponse, CreditCardCredentialResponse, SecretCredentialResponse +] diff --git a/skyvern/client/types/credential_type_output.py b/skyvern/client/types/credential_type_output.py index 324d9238..9202fc12 100644 --- a/skyvern/client/types/credential_type_output.py +++ b/skyvern/client/types/credential_type_output.py @@ -2,4 +2,4 @@ import typing -CredentialTypeOutput = typing.Union[typing.Literal["password", "credit_card"], typing.Any] +CredentialTypeOutput = typing.Union[typing.Literal["password", "credit_card", "secret"], typing.Any] diff --git a/skyvern/client/types/for_loop_block_loop_blocks_item.py b/skyvern/client/types/for_loop_block_loop_blocks_item.py index d7592317..b4507066 100644 --- a/skyvern/client/types/for_loop_block_loop_blocks_item.py +++ b/skyvern/client/types/for_loop_block_loop_blocks_item.py @@ -355,6 +355,7 @@ class ForLoopBlockLoopBlocksItem_HttpRequest(UniversalBaseModel): url: typing.Optional[str] = None headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None body: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None + files: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None timeout: typing.Optional[int] = None follow_redirects: typing.Optional[bool] = None parameters: typing.Optional[typing.List[HttpRequestBlockParametersItem]] = None diff --git a/skyvern/client/types/for_loop_block_yaml_loop_blocks_item.py b/skyvern/client/types/for_loop_block_yaml_loop_blocks_item.py index ac242e6d..ad16d4f9 100644 --- a/skyvern/client/types/for_loop_block_yaml_loop_blocks_item.py +++ b/skyvern/client/types/for_loop_block_yaml_loop_blocks_item.py @@ -532,6 +532,7 @@ class ForLoopBlockYamlLoopBlocksItem_HttpRequest(UniversalBaseModel): url: typing.Optional[str] = None headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None body: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None + files: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None timeout: typing.Optional[int] = None follow_redirects: typing.Optional[bool] = None parameter_keys: typing.Optional[typing.List[str]] = None diff --git a/skyvern/client/types/http_request_block.py b/skyvern/client/types/http_request_block.py index f9a9257d..f9b05e15 100644 --- a/skyvern/client/types/http_request_block.py +++ b/skyvern/client/types/http_request_block.py @@ -30,6 +30,7 @@ class HttpRequestBlock(UniversalBaseModel): url: typing.Optional[str] = None headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None body: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None + files: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None timeout: typing.Optional[int] = None follow_redirects: typing.Optional[bool] = None parameters: typing.Optional[typing.List[HttpRequestBlockParametersItem]] = None diff --git a/skyvern/client/types/http_request_block_yaml.py b/skyvern/client/types/http_request_block_yaml.py index b3d93566..01544979 100644 --- a/skyvern/client/types/http_request_block_yaml.py +++ b/skyvern/client/types/http_request_block_yaml.py @@ -24,6 +24,7 @@ class HttpRequestBlockYaml(UniversalBaseModel): url: typing.Optional[str] = None headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None body: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None + files: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None timeout: typing.Optional[int] = None follow_redirects: typing.Optional[bool] = None parameter_keys: typing.Optional[typing.List[str]] = None diff --git a/skyvern/client/types/folder.py b/skyvern/client/types/secret_credential.py similarity index 52% rename from skyvern/client/types/folder.py rename to skyvern/client/types/secret_credential.py index c3e4ae78..7411b012 100644 --- a/skyvern/client/types/folder.py +++ b/skyvern/client/types/secret_credential.py @@ -1,37 +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 Folder(UniversalBaseModel): +class SecretCredential(UniversalBaseModel): """ - Response model for a folder + Generic secret credential. """ - title: str = pydantic.Field() + secret_value: str = pydantic.Field() """ - Folder title + The secret value """ - description: typing.Optional[str] = pydantic.Field(default=None) + secret_label: typing.Optional[str] = pydantic.Field(default=None) """ - Folder description + Optional label describing the secret """ - folder_id: str - organization_id: str - workflow_count: typing.Optional[int] = pydantic.Field(default=None) - """ - Number of workflows in this folder - """ - - created_at: dt.datetime - modified_at: dt.datetime - if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: diff --git a/skyvern/client/types/secret_credential_response.py b/skyvern/client/types/secret_credential_response.py new file mode 100644 index 00000000..39ee4440 --- /dev/null +++ b/skyvern/client/types/secret_credential_response.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SecretCredentialResponse(UniversalBaseModel): + """ + Response model for secret credentials. + """ + + secret_label: typing.Optional[str] = pydantic.Field(default=None) + """ + Optional label for the stored secret + """ + + 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 diff --git a/skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py b/skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py index 54351d73..735d67e7 100644 --- a/skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py +++ b/skyvern/client/types/skyvern_forge_sdk_schemas_credentials_credential_type.py @@ -2,4 +2,6 @@ import typing -SkyvernForgeSdkSchemasCredentialsCredentialType = typing.Union[typing.Literal["password", "credit_card"], typing.Any] +SkyvernForgeSdkSchemasCredentialsCredentialType = typing.Union[ + typing.Literal["password", "credit_card", "secret"], typing.Any +] diff --git a/skyvern/client/types/workflow_definition_blocks_item.py b/skyvern/client/types/workflow_definition_blocks_item.py index 05f5403e..fd18267c 100644 --- a/skyvern/client/types/workflow_definition_blocks_item.py +++ b/skyvern/client/types/workflow_definition_blocks_item.py @@ -356,6 +356,7 @@ class WorkflowDefinitionBlocksItem_HttpRequest(UniversalBaseModel): url: typing.Optional[str] = None headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None body: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None + files: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None timeout: typing.Optional[int] = None follow_redirects: typing.Optional[bool] = None parameters: typing.Optional[typing.List[HttpRequestBlockParametersItem]] = None diff --git a/skyvern/client/types/workflow_definition_yaml_blocks_item.py b/skyvern/client/types/workflow_definition_yaml_blocks_item.py index 2d616041..86d04e01 100644 --- a/skyvern/client/types/workflow_definition_yaml_blocks_item.py +++ b/skyvern/client/types/workflow_definition_yaml_blocks_item.py @@ -267,6 +267,7 @@ class WorkflowDefinitionYamlBlocksItem_HttpRequest(UniversalBaseModel): url: typing.Optional[str] = None headers: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None body: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = None + files: typing.Optional[typing.Dict[str, typing.Optional[str]]] = None timeout: typing.Optional[int] = None follow_redirects: typing.Optional[bool] = None parameter_keys: typing.Optional[typing.List[str]] = None diff --git a/skyvern/client/workflows/__init__.py b/skyvern/client/workflows/__init__.py deleted file mode 100644 index 5cde0202..00000000 --- a/skyvern/client/workflows/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -# isort: skip_file - diff --git a/skyvern/client/workflows/client.py b/skyvern/client/workflows/client.py deleted file mode 100644 index b091a973..00000000 --- a/skyvern/client/workflows/client.py +++ /dev/null @@ -1,596 +0,0 @@ -# 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.folder import Folder -from ..types.workflow import Workflow -from .raw_client import AsyncRawWorkflowsClient, RawWorkflowsClient - -# this is used as the default value for optional parameters -OMIT = typing.cast(typing.Any, ...) - - -class WorkflowsClient: - def __init__(self, *, client_wrapper: SyncClientWrapper): - self._raw_client = RawWorkflowsClient(client_wrapper=client_wrapper) - - @property - def with_raw_response(self) -> RawWorkflowsClient: - """ - Retrieves a raw implementation of this client that returns raw responses. - - Returns - ------- - RawWorkflowsClient - """ - return self._raw_client - - def get_folders( - self, - *, - page: typing.Optional[int] = None, - page_size: typing.Optional[int] = None, - search: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> typing.List[Folder]: - """ - Get all folders for the organization - - Parameters - ---------- - page : typing.Optional[int] - Page number - - page_size : typing.Optional[int] - Number of folders per page - - search : typing.Optional[str] - Search folders by title or description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - typing.List[Folder] - Successfully retrieved folders - - Examples - -------- - from skyvern import Skyvern - - client = Skyvern( - api_key="YOUR_API_KEY", - ) - client.workflows.get_folders( - page=1, - page_size=1, - search="search", - ) - """ - _response = self._raw_client.get_folders( - page=page, page_size=page_size, search=search, request_options=request_options - ) - return _response.data - - def create_folder( - self, - *, - title: str, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> Folder: - """ - Create a new folder to organize workflows - - Parameters - ---------- - title : str - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Folder - Successfully created folder - - Examples - -------- - from skyvern import Skyvern - - client = Skyvern( - api_key="YOUR_API_KEY", - ) - client.workflows.create_folder( - title="title", - ) - """ - _response = self._raw_client.create_folder( - title=title, description=description, request_options=request_options - ) - return _response.data - - def get_folder(self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Folder: - """ - Get a specific folder by ID - - Parameters - ---------- - folder_id : str - Folder ID - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Folder - Successfully retrieved folder - - Examples - -------- - from skyvern import Skyvern - - client = Skyvern( - api_key="YOUR_API_KEY", - ) - client.workflows.get_folder( - folder_id="fld_123", - ) - """ - _response = self._raw_client.get_folder(folder_id, request_options=request_options) - return _response.data - - def update_folder( - self, - folder_id: str, - *, - title: typing.Optional[str] = OMIT, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> Folder: - """ - Update a folder's title or description - - Parameters - ---------- - folder_id : str - Folder ID - - title : typing.Optional[str] - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Folder - Successfully updated folder - - Examples - -------- - from skyvern import Skyvern - - client = Skyvern( - api_key="YOUR_API_KEY", - ) - client.workflows.update_folder( - folder_id="fld_123", - ) - """ - _response = self._raw_client.update_folder( - folder_id, title=title, description=description, request_options=request_options - ) - return _response.data - - def delete_folder( - self, - folder_id: str, - *, - delete_workflows: typing.Optional[bool] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> typing.Dict[str, typing.Optional[typing.Any]]: - """ - Delete a folder. Optionally delete all workflows in the folder. - - Parameters - ---------- - folder_id : str - Folder ID - - delete_workflows : typing.Optional[bool] - If true, also delete all workflows in this folder - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - typing.Dict[str, typing.Optional[typing.Any]] - Successfully deleted folder - - Examples - -------- - from skyvern import Skyvern - - client = Skyvern( - api_key="YOUR_API_KEY", - ) - client.workflows.delete_folder( - folder_id="fld_123", - delete_workflows=True, - ) - """ - _response = self._raw_client.delete_folder( - folder_id, delete_workflows=delete_workflows, request_options=request_options - ) - return _response.data - - def update_workflow_folder( - self, - workflow_permanent_id: str, - *, - folder_id: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> Workflow: - """ - Update a workflow's folder assignment for the latest version - - Parameters - ---------- - workflow_permanent_id : str - Workflow permanent ID - - folder_id : typing.Optional[str] - Folder ID to assign workflow to. Set to null to remove from folder. - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Workflow - Successfully updated workflow folder - - Examples - -------- - from skyvern import Skyvern - - client = Skyvern( - api_key="YOUR_API_KEY", - ) - client.workflows.update_workflow_folder( - workflow_permanent_id="wpid_123", - ) - """ - _response = self._raw_client.update_workflow_folder( - workflow_permanent_id, folder_id=folder_id, request_options=request_options - ) - return _response.data - - -class AsyncWorkflowsClient: - def __init__(self, *, client_wrapper: AsyncClientWrapper): - self._raw_client = AsyncRawWorkflowsClient(client_wrapper=client_wrapper) - - @property - def with_raw_response(self) -> AsyncRawWorkflowsClient: - """ - Retrieves a raw implementation of this client that returns raw responses. - - Returns - ------- - AsyncRawWorkflowsClient - """ - return self._raw_client - - async def get_folders( - self, - *, - page: typing.Optional[int] = None, - page_size: typing.Optional[int] = None, - search: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> typing.List[Folder]: - """ - Get all folders for the organization - - Parameters - ---------- - page : typing.Optional[int] - Page number - - page_size : typing.Optional[int] - Number of folders per page - - search : typing.Optional[str] - Search folders by title or description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - typing.List[Folder] - Successfully retrieved folders - - Examples - -------- - import asyncio - - from skyvern import AsyncSkyvern - - client = AsyncSkyvern( - api_key="YOUR_API_KEY", - ) - - - async def main() -> None: - await client.workflows.get_folders( - page=1, - page_size=1, - search="search", - ) - - - asyncio.run(main()) - """ - _response = await self._raw_client.get_folders( - page=page, page_size=page_size, search=search, request_options=request_options - ) - return _response.data - - async def create_folder( - self, - *, - title: str, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> Folder: - """ - Create a new folder to organize workflows - - Parameters - ---------- - title : str - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Folder - Successfully created folder - - Examples - -------- - import asyncio - - from skyvern import AsyncSkyvern - - client = AsyncSkyvern( - api_key="YOUR_API_KEY", - ) - - - async def main() -> None: - await client.workflows.create_folder( - title="title", - ) - - - asyncio.run(main()) - """ - _response = await self._raw_client.create_folder( - title=title, description=description, request_options=request_options - ) - return _response.data - - async def get_folder(self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Folder: - """ - Get a specific folder by ID - - Parameters - ---------- - folder_id : str - Folder ID - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Folder - Successfully retrieved folder - - Examples - -------- - import asyncio - - from skyvern import AsyncSkyvern - - client = AsyncSkyvern( - api_key="YOUR_API_KEY", - ) - - - async def main() -> None: - await client.workflows.get_folder( - folder_id="fld_123", - ) - - - asyncio.run(main()) - """ - _response = await self._raw_client.get_folder(folder_id, request_options=request_options) - return _response.data - - async def update_folder( - self, - folder_id: str, - *, - title: typing.Optional[str] = OMIT, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> Folder: - """ - Update a folder's title or description - - Parameters - ---------- - folder_id : str - Folder ID - - title : typing.Optional[str] - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Folder - Successfully updated folder - - Examples - -------- - import asyncio - - from skyvern import AsyncSkyvern - - client = AsyncSkyvern( - api_key="YOUR_API_KEY", - ) - - - async def main() -> None: - await client.workflows.update_folder( - folder_id="fld_123", - ) - - - asyncio.run(main()) - """ - _response = await self._raw_client.update_folder( - folder_id, title=title, description=description, request_options=request_options - ) - return _response.data - - async def delete_folder( - self, - folder_id: str, - *, - delete_workflows: typing.Optional[bool] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> typing.Dict[str, typing.Optional[typing.Any]]: - """ - Delete a folder. Optionally delete all workflows in the folder. - - Parameters - ---------- - folder_id : str - Folder ID - - delete_workflows : typing.Optional[bool] - If true, also delete all workflows in this folder - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - typing.Dict[str, typing.Optional[typing.Any]] - Successfully deleted folder - - Examples - -------- - import asyncio - - from skyvern import AsyncSkyvern - - client = AsyncSkyvern( - api_key="YOUR_API_KEY", - ) - - - async def main() -> None: - await client.workflows.delete_folder( - folder_id="fld_123", - delete_workflows=True, - ) - - - asyncio.run(main()) - """ - _response = await self._raw_client.delete_folder( - folder_id, delete_workflows=delete_workflows, request_options=request_options - ) - return _response.data - - async def update_workflow_folder( - self, - workflow_permanent_id: str, - *, - folder_id: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> Workflow: - """ - Update a workflow's folder assignment for the latest version - - Parameters - ---------- - workflow_permanent_id : str - Workflow permanent ID - - folder_id : typing.Optional[str] - Folder ID to assign workflow to. Set to null to remove from folder. - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - Workflow - Successfully updated workflow folder - - Examples - -------- - import asyncio - - from skyvern import AsyncSkyvern - - client = AsyncSkyvern( - api_key="YOUR_API_KEY", - ) - - - async def main() -> None: - await client.workflows.update_workflow_folder( - workflow_permanent_id="wpid_123", - ) - - - asyncio.run(main()) - """ - _response = await self._raw_client.update_workflow_folder( - workflow_permanent_id, folder_id=folder_id, request_options=request_options - ) - return _response.data diff --git a/skyvern/client/workflows/raw_client.py b/skyvern/client/workflows/raw_client.py deleted file mode 100644 index 23c97c2c..00000000 --- a/skyvern/client/workflows/raw_client.py +++ /dev/null @@ -1,909 +0,0 @@ -# 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.bad_request_error import BadRequestError -from ..errors.not_found_error import NotFoundError -from ..errors.unprocessable_entity_error import UnprocessableEntityError -from ..types.folder import Folder -from ..types.workflow import Workflow - -# this is used as the default value for optional parameters -OMIT = typing.cast(typing.Any, ...) - - -class RawWorkflowsClient: - def __init__(self, *, client_wrapper: SyncClientWrapper): - self._client_wrapper = client_wrapper - - def get_folders( - self, - *, - page: typing.Optional[int] = None, - page_size: typing.Optional[int] = None, - search: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[typing.List[Folder]]: - """ - Get all folders for the organization - - Parameters - ---------- - page : typing.Optional[int] - Page number - - page_size : typing.Optional[int] - Number of folders per page - - search : typing.Optional[str] - Search folders by title or description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - HttpResponse[typing.List[Folder]] - Successfully retrieved folders - """ - _response = self._client_wrapper.httpx_client.request( - "v1/folders", - method="GET", - params={ - "page": page, - "page_size": page_size, - "search": search, - }, - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - typing.List[Folder], - parse_obj_as( - type_=typing.List[Folder], # 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_folder( - self, - *, - title: str, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[Folder]: - """ - Create a new folder to organize workflows - - Parameters - ---------- - title : str - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - HttpResponse[Folder] - Successfully created folder - """ - _response = self._client_wrapper.httpx_client.request( - "v1/folders", - method="POST", - json={ - "title": title, - "description": description, - }, - headers={ - "content-type": "application/json", - }, - request_options=request_options, - omit=OMIT, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Folder, - parse_obj_as( - type_=Folder, # type: ignore - object_=_response.json(), - ), - ) - return HttpResponse(response=_response, data=_data) - if _response.status_code == 400: - raise BadRequestError( - 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 get_folder( - self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> HttpResponse[Folder]: - """ - Get a specific folder by ID - - Parameters - ---------- - folder_id : str - Folder ID - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - HttpResponse[Folder] - Successfully retrieved folder - """ - _response = self._client_wrapper.httpx_client.request( - f"v1/folders/{jsonable_encoder(folder_id)}", - method="GET", - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Folder, - parse_obj_as( - type_=Folder, # 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 update_folder( - self, - folder_id: str, - *, - title: typing.Optional[str] = OMIT, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[Folder]: - """ - Update a folder's title or description - - Parameters - ---------- - folder_id : str - Folder ID - - title : typing.Optional[str] - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - HttpResponse[Folder] - Successfully updated folder - """ - _response = self._client_wrapper.httpx_client.request( - f"v1/folders/{jsonable_encoder(folder_id)}", - method="PUT", - json={ - "title": title, - "description": description, - }, - headers={ - "content-type": "application/json", - }, - request_options=request_options, - omit=OMIT, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Folder, - parse_obj_as( - type_=Folder, # 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_folder( - self, - folder_id: str, - *, - delete_workflows: typing.Optional[bool] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[typing.Dict[str, typing.Optional[typing.Any]]]: - """ - Delete a folder. Optionally delete all workflows in the folder. - - Parameters - ---------- - folder_id : str - Folder ID - - delete_workflows : typing.Optional[bool] - If true, also delete all workflows in this folder - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - HttpResponse[typing.Dict[str, typing.Optional[typing.Any]]] - Successfully deleted folder - """ - _response = self._client_wrapper.httpx_client.request( - f"v1/folders/{jsonable_encoder(folder_id)}", - method="DELETE", - params={ - "delete_workflows": delete_workflows, - }, - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - typing.Dict[str, typing.Optional[typing.Any]], - parse_obj_as( - type_=typing.Dict[str, typing.Optional[typing.Any]], # 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 update_workflow_folder( - self, - workflow_permanent_id: str, - *, - folder_id: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[Workflow]: - """ - Update a workflow's folder assignment for the latest version - - Parameters - ---------- - workflow_permanent_id : str - Workflow permanent ID - - folder_id : typing.Optional[str] - Folder ID to assign workflow to. Set to null to remove from folder. - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - HttpResponse[Workflow] - Successfully updated workflow folder - """ - _response = self._client_wrapper.httpx_client.request( - f"v1/workflows/{jsonable_encoder(workflow_permanent_id)}/folder", - method="PUT", - json={ - "folder_id": folder_id, - }, - headers={ - "content-type": "application/json", - }, - request_options=request_options, - omit=OMIT, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Workflow, - parse_obj_as( - type_=Workflow, # type: ignore - object_=_response.json(), - ), - ) - return HttpResponse(response=_response, data=_data) - if _response.status_code == 400: - raise BadRequestError( - 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 == 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 AsyncRawWorkflowsClient: - def __init__(self, *, client_wrapper: AsyncClientWrapper): - self._client_wrapper = client_wrapper - - async def get_folders( - self, - *, - page: typing.Optional[int] = None, - page_size: typing.Optional[int] = None, - search: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[typing.List[Folder]]: - """ - Get all folders for the organization - - Parameters - ---------- - page : typing.Optional[int] - Page number - - page_size : typing.Optional[int] - Number of folders per page - - search : typing.Optional[str] - Search folders by title or description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncHttpResponse[typing.List[Folder]] - Successfully retrieved folders - """ - _response = await self._client_wrapper.httpx_client.request( - "v1/folders", - method="GET", - params={ - "page": page, - "page_size": page_size, - "search": search, - }, - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - typing.List[Folder], - parse_obj_as( - type_=typing.List[Folder], # 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_folder( - self, - *, - title: str, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[Folder]: - """ - Create a new folder to organize workflows - - Parameters - ---------- - title : str - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncHttpResponse[Folder] - Successfully created folder - """ - _response = await self._client_wrapper.httpx_client.request( - "v1/folders", - method="POST", - json={ - "title": title, - "description": description, - }, - headers={ - "content-type": "application/json", - }, - request_options=request_options, - omit=OMIT, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Folder, - parse_obj_as( - type_=Folder, # type: ignore - object_=_response.json(), - ), - ) - return AsyncHttpResponse(response=_response, data=_data) - if _response.status_code == 400: - raise BadRequestError( - 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 get_folder( - self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None - ) -> AsyncHttpResponse[Folder]: - """ - Get a specific folder by ID - - Parameters - ---------- - folder_id : str - Folder ID - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncHttpResponse[Folder] - Successfully retrieved folder - """ - _response = await self._client_wrapper.httpx_client.request( - f"v1/folders/{jsonable_encoder(folder_id)}", - method="GET", - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Folder, - parse_obj_as( - type_=Folder, # 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 update_folder( - self, - folder_id: str, - *, - title: typing.Optional[str] = OMIT, - description: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[Folder]: - """ - Update a folder's title or description - - Parameters - ---------- - folder_id : str - Folder ID - - title : typing.Optional[str] - Folder title - - description : typing.Optional[str] - Folder description - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncHttpResponse[Folder] - Successfully updated folder - """ - _response = await self._client_wrapper.httpx_client.request( - f"v1/folders/{jsonable_encoder(folder_id)}", - method="PUT", - json={ - "title": title, - "description": description, - }, - headers={ - "content-type": "application/json", - }, - request_options=request_options, - omit=OMIT, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Folder, - parse_obj_as( - type_=Folder, # 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_folder( - self, - folder_id: str, - *, - delete_workflows: typing.Optional[bool] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[typing.Dict[str, typing.Optional[typing.Any]]]: - """ - Delete a folder. Optionally delete all workflows in the folder. - - Parameters - ---------- - folder_id : str - Folder ID - - delete_workflows : typing.Optional[bool] - If true, also delete all workflows in this folder - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncHttpResponse[typing.Dict[str, typing.Optional[typing.Any]]] - Successfully deleted folder - """ - _response = await self._client_wrapper.httpx_client.request( - f"v1/folders/{jsonable_encoder(folder_id)}", - method="DELETE", - params={ - "delete_workflows": delete_workflows, - }, - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - typing.Dict[str, typing.Optional[typing.Any]], - parse_obj_as( - type_=typing.Dict[str, typing.Optional[typing.Any]], # 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 update_workflow_folder( - self, - workflow_permanent_id: str, - *, - folder_id: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[Workflow]: - """ - Update a workflow's folder assignment for the latest version - - Parameters - ---------- - workflow_permanent_id : str - Workflow permanent ID - - folder_id : typing.Optional[str] - Folder ID to assign workflow to. Set to null to remove from folder. - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncHttpResponse[Workflow] - Successfully updated workflow folder - """ - _response = await self._client_wrapper.httpx_client.request( - f"v1/workflows/{jsonable_encoder(workflow_permanent_id)}/folder", - method="PUT", - json={ - "folder_id": folder_id, - }, - headers={ - "content-type": "application/json", - }, - request_options=request_options, - omit=OMIT, - ) - try: - if 200 <= _response.status_code < 300: - _data = typing.cast( - Workflow, - parse_obj_as( - type_=Workflow, # type: ignore - object_=_response.json(), - ), - ) - return AsyncHttpResponse(response=_response, data=_data) - if _response.status_code == 400: - raise BadRequestError( - 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 == 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) diff --git a/uv.lock b/uv.lock index cc64a2e7..c381eebb 100644 --- a/uv.lock +++ b/uv.lock @@ -5029,7 +5029,7 @@ wheels = [ [[package]] name = "skyvern" -version = "1.0.2" +version = "1.0.3" source = { editable = "." } dependencies = [ { name = "aioboto3" },