244 lines
6.8 KiB
Markdown
244 lines
6.8 KiB
Markdown
# Skyvern TypeScript Library
|
|
|
|
[](https://www.npmjs.com/package/@skyvern/client)
|
|
|
|
The Skyvern TypeScript library provides convenient access to the Skyvern APIs from TypeScript.
|
|
|
|
## Table of Contents
|
|
|
|
- [Installation](#installation)
|
|
- [Reference](#reference)
|
|
- [Usage](#usage)
|
|
- [Request and Response Types](#request-and-response-types)
|
|
- [Exception Handling](#exception-handling)
|
|
- [File Uploads](#file-uploads)
|
|
- [Advanced](#advanced)
|
|
- [Additional Headers](#additional-headers)
|
|
- [Additional Query String Parameters](#additional-query-string-parameters)
|
|
- [Retries](#retries)
|
|
- [Timeouts](#timeouts)
|
|
- [Aborting Requests](#aborting-requests)
|
|
- [Access Raw Response Data](#access-raw-response-data)
|
|
- [Runtime Compatibility](#runtime-compatibility)
|
|
- [Contributing](#contributing)
|
|
|
|
## Installation
|
|
|
|
```sh
|
|
npm i -s @skyvern/client
|
|
```
|
|
|
|
## Reference
|
|
|
|
A full reference for this library is available [here](https://www.skyvern.com/docs/api-reference/api-reference).
|
|
|
|
## Usage
|
|
|
|
Instantiate and use the client with the following:
|
|
|
|
```typescript
|
|
import { SkyvernClient } from "@skyvern/client";
|
|
|
|
const client = new SkyvernClient({ apiKey: "YOUR_API_KEY" });
|
|
await client.runTask({
|
|
"x-user-agent": "x-user-agent",
|
|
body: {
|
|
prompt: "Find the top 3 posts on Hacker News."
|
|
}
|
|
});
|
|
```
|
|
|
|
## Request and Response Types
|
|
|
|
The SDK exports all request and response types as TypeScript interfaces. Simply import them with the
|
|
following namespace:
|
|
|
|
```typescript
|
|
import { Skyvern } from "@skyvern/client";
|
|
|
|
const request: Skyvern.RunTaskRequest = {
|
|
...
|
|
};
|
|
```
|
|
|
|
## Exception Handling
|
|
|
|
When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error
|
|
will be thrown.
|
|
|
|
```typescript
|
|
import { SkyvernError } from "@skyvern/client";
|
|
|
|
try {
|
|
await client.runTask(...);
|
|
} catch (err) {
|
|
if (err instanceof SkyvernError) {
|
|
console.log(err.statusCode);
|
|
console.log(err.message);
|
|
console.log(err.body);
|
|
console.log(err.rawResponse);
|
|
}
|
|
}
|
|
```
|
|
|
|
## File Uploads
|
|
|
|
You can upload files using the client:
|
|
|
|
```typescript
|
|
import { createReadStream } from "fs";
|
|
import { SkyvernClient } from "@skyvern/client";
|
|
import * as fs from "fs";
|
|
|
|
const client = new SkyvernClient({ apiKey: "YOUR_API_KEY" });
|
|
await client.uploadFile({
|
|
file: fs.createReadStream("/path/to/your/file")
|
|
});
|
|
```
|
|
The client accepts a variety of types for file upload parameters:
|
|
* Stream types: `fs.ReadStream`, `stream.Readable`, and `ReadableStream`
|
|
* Buffered types: `Buffer`, `Blob`, `File`, `ArrayBuffer`, `ArrayBufferView`, and `Uint8Array`
|
|
|
|
### Metadata
|
|
|
|
You can configure metadata when uploading a file:
|
|
```typescript
|
|
const file: Uploadable.WithMetadata = {
|
|
data: createReadStream("path/to/file"),
|
|
filename: "my-file", // optional
|
|
contentType: "audio/mpeg", // optional
|
|
contentLength: 1949, // optional
|
|
};
|
|
```
|
|
|
|
Alternatively, you can upload a file directly from a file path:
|
|
```typescript
|
|
const file : Uploadable.FromPath = {
|
|
path: "path/to/file",
|
|
filename: "my-file", // optional
|
|
contentType: "audio/mpeg", // optional
|
|
contentLength: 1949, // optional
|
|
};
|
|
```
|
|
|
|
The metadata is used to set the `Content-Length`, `Content-Type`, and `Content-Disposition` headers. If not provided, the client will attempt to determine them automatically.
|
|
For example, `fs.ReadStream` has a `path` property which the SDK uses to retrieve the file size from the filesystem without loading it into memory.
|
|
|
|
|
|
## Advanced
|
|
|
|
### Additional Headers
|
|
|
|
If you would like to send additional headers as part of the request, use the `headers` request option.
|
|
|
|
```typescript
|
|
const response = await client.runTask(..., {
|
|
headers: {
|
|
'X-Custom-Header': 'custom value'
|
|
}
|
|
});
|
|
```
|
|
|
|
### Additional Query String Parameters
|
|
|
|
If you would like to send additional query string parameters as part of the request, use the `queryParams` request option.
|
|
|
|
```typescript
|
|
const response = await client.runTask(..., {
|
|
queryParams: {
|
|
'customQueryParamKey': 'custom query param value'
|
|
}
|
|
});
|
|
```
|
|
|
|
### Retries
|
|
|
|
The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long
|
|
as the request is deemed retryable and the number of retry attempts has not grown larger than the configured
|
|
retry limit (default: 2).
|
|
|
|
A request is deemed retryable when any of the following HTTP status codes is returned:
|
|
|
|
- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout)
|
|
- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests)
|
|
- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors)
|
|
|
|
Use the `maxRetries` request option to configure this behavior.
|
|
|
|
```typescript
|
|
const response = await client.runTask(..., {
|
|
maxRetries: 0 // override maxRetries at the request level
|
|
});
|
|
```
|
|
|
|
### Timeouts
|
|
|
|
The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior.
|
|
|
|
```typescript
|
|
const response = await client.runTask(..., {
|
|
timeoutInSeconds: 30 // override timeout to 30s
|
|
});
|
|
```
|
|
|
|
### Aborting Requests
|
|
|
|
The SDK allows users to abort requests at any point by passing in an abort signal.
|
|
|
|
```typescript
|
|
const controller = new AbortController();
|
|
const response = await client.runTask(..., {
|
|
abortSignal: controller.signal
|
|
});
|
|
controller.abort(); // aborts the request
|
|
```
|
|
|
|
### Access Raw Response Data
|
|
|
|
The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method.
|
|
The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property.
|
|
|
|
```typescript
|
|
const { data, rawResponse } = await client.runTask(...).withRawResponse();
|
|
|
|
console.log(data);
|
|
console.log(rawResponse.headers['X-My-Header']);
|
|
```
|
|
|
|
### Runtime Compatibility
|
|
|
|
|
|
The SDK works in the following runtimes:
|
|
|
|
|
|
|
|
- Node.js 18+
|
|
- Vercel
|
|
- Cloudflare Workers
|
|
- Deno v1.25+
|
|
- Bun 1.0+
|
|
- React Native
|
|
|
|
### Customizing Fetch Client
|
|
|
|
The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an
|
|
unsupported environment, this provides a way for you to break glass and ensure the SDK works.
|
|
|
|
```typescript
|
|
import { SkyvernClient } from "@skyvern/client";
|
|
|
|
const client = new SkyvernClient({
|
|
...
|
|
fetcher: // provide your implementation here
|
|
});
|
|
```
|
|
|
|
## Contributing
|
|
|
|
While we value open-source contributions to this SDK, this library is generated programmatically.
|
|
Additions made directly to this library would have to be moved over to our generation code,
|
|
otherwise they would be overwritten upon the next generated release. Feel free to open a PR as
|
|
a proof of concept, but know that we will not be able to merge it as-is. We suggest opening
|
|
an issue first to discuss with us!
|
|
|
|
On the other hand, contributions to the README are always very welcome! |