Merge remote-tracking branch 'origin/main' into feat/triggers-v2
This commit is contained in:
@@ -1,6 +0,0 @@
|
||||
---
|
||||
"@trigger.dev/sdk": patch
|
||||
"@trigger.dev/core": patch
|
||||
---
|
||||
|
||||
Auto-yield run execution to help prevent duplicate task executions
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@trigger.dev/cli": patch
|
||||
---
|
||||
|
||||
Detects JSRuntime (Node/Deno at the moment). Adds basic Deno support
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@trigger.dev/cli": patch
|
||||
---
|
||||
|
||||
Improve create-integration output. Use templates and shared configs.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@trigger.dev/cli": patch
|
||||
---
|
||||
|
||||
add ability to use custom tunnel in dev command
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@trigger.dev/core": patch
|
||||
---
|
||||
|
||||
Updated icon documentation in runTasks
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@trigger.dev/cli": patch
|
||||
---
|
||||
|
||||
Added Next.js `maxDuration` commented out to the api/trigger file using CLI init
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@trigger.dev/airtable": patch
|
||||
---
|
||||
|
||||
Export Base and Table
|
||||
@@ -19,7 +19,7 @@
|
||||
All of October we're participating in Hacktoberfest and invite you to join us! We have a bunch of issues labeled `🎃 Hacktoberfest` that are ready for you to work on which will count towards Hacktoberfest. We are also running our own game, earn 💎 points to win swag!
|
||||
|
||||
- Check out our [Hacktoberfest landing page](https://trigger.dev/hacktoberfest) for how to participate and win swag.
|
||||
- Contribute to either our [/trigger.dev](https://github.com/triggerdotdev/trigger.dev/labels/%F0%9F%8E%83%20hacktoberfest) or [/jobs-showcase](https://github.com/triggerdotdev/jobs-showcase/labels/%F0%9F%8E%83%20hacktoberfest) repositories and complete issues marked `🎃 Hacktoberfest` to be eligible for swag.
|
||||
- Contribute to either our [/trigger.dev](https://github.com/triggerdotdev/trigger.dev/labels/%F0%9F%8E%83%20hacktoberfest), [/api-reference](https://github.com/triggerdotdev/api-reference/issues?q=is%3Aopen+is%3Aissue+label%3A%F0%9F%8E%83hacktoberfest) or [/jobs-showcase](https://github.com/triggerdotdev/jobs-showcase/labels/%F0%9F%8E%83%20hacktoberfest) repositories and complete issues marked `🎃 Hacktoberfest` to be eligible for swag.
|
||||
- Join our [Discord](https://discord.gg/JtBAxBr2m3) and get involved in with the community.
|
||||
|
||||
_New to Hacktober? Check out the [Hacktoberfest website](https://hacktoberfest.digitalocean.com/) for more information._
|
||||
|
||||
@@ -37,76 +37,73 @@ export default function AdminDashboardRoute() {
|
||||
const { users } = useTypedLoaderData<typeof loader>();
|
||||
|
||||
return (
|
||||
<main className="flex flex-1 overflow-hidden">
|
||||
{/* Primary column */}
|
||||
<section
|
||||
aria-labelledby="primary-heading"
|
||||
className="flex h-full min-w-0 flex-1 flex-col overflow-y-auto p-4 lg:order-last"
|
||||
>
|
||||
<h1 className="mb-2 text-2xl">Accounts ({users.length})</h1>
|
||||
<main
|
||||
aria-labelledby="primary-heading"
|
||||
className="flex h-full min-w-0 flex-1 flex-col overflow-y-auto p-4 lg:order-last"
|
||||
>
|
||||
<h1 className="mb-2 text-2xl">Accounts ({users.length})</h1>
|
||||
|
||||
<table className="w-full divide-y divide-border">
|
||||
<thead className="sticky top-0 text-left">
|
||||
<tr>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Email
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
GitHub username
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
id
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Created At
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Admin?
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-border">
|
||||
{users.map((user) => {
|
||||
return (
|
||||
<tr key={user.id} className="w-full px-4 py-2 text-left hover:bg-slate-900">
|
||||
<td className={cellClassName}>{user.email}</td>
|
||||
<td className={cellClassName}>
|
||||
<a
|
||||
href={`https://github.com/${user.displayName}`}
|
||||
target="_blank"
|
||||
className="text-indigo-500 underline"
|
||||
rel="noreferrer"
|
||||
<table className="w-full divide-y divide-border">
|
||||
<thead className="sticky -top-4 bg-midnight-800 text-left">
|
||||
<tr>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Email
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
GitHub username
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
id
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Created At
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Admin?
|
||||
</th>
|
||||
<th scope="col" className={headerClassName}>
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-border">
|
||||
{users.map((user) => {
|
||||
return (
|
||||
<tr key={user.id} className="w-full px-4 py-2 text-left hover:bg-slate-900">
|
||||
<td className={cellClassName}>{user.email}</td>
|
||||
<td className={cellClassName}>
|
||||
<a
|
||||
href={`https://github.com/${user.displayName}`}
|
||||
target="_blank"
|
||||
className="text-indigo-500 underline"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{user.displayName}
|
||||
</a>
|
||||
</td>
|
||||
<td className={cellClassName}>{user.id}</td>
|
||||
<td className={cellClassName}>{user.createdAt.toISOString()}</td>
|
||||
<td className={cellClassName}>{user.admin ? "✅" : ""}</td>
|
||||
<td className={cellClassName}>
|
||||
<Form method="post" reloadDocument>
|
||||
<input type="hidden" name="id" value={user.id} />
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
name="action"
|
||||
value="impersonate"
|
||||
className="mr-2"
|
||||
variant="primary/small"
|
||||
>
|
||||
{user.displayName}
|
||||
</a>
|
||||
</td>
|
||||
<td className={cellClassName}>{user.id}</td>
|
||||
<td className={cellClassName}>{user.createdAt.toISOString()}</td>
|
||||
<td className={cellClassName}>{user.admin ? "✅" : ""}</td>
|
||||
<td className={cellClassName}>
|
||||
<Form method="post" reloadDocument>
|
||||
<input type="hidden" name="id" value={user.id} />
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
name="action"
|
||||
value="impersonate"
|
||||
className="mr-2"
|
||||
variant="primary/small"
|
||||
>
|
||||
Impersonate
|
||||
</Button>
|
||||
</Form>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
Impersonate
|
||||
</Button>
|
||||
</Form>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ export class PerformEndpointIndexService {
|
||||
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: friendlyError,
|
||||
raw: bodyResult.error.issues,
|
||||
raw: fromZodError(bodyResult.error).message,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ export class PerformTaskOperationService {
|
||||
}
|
||||
|
||||
if (!task.operation) {
|
||||
return await this.#resumeTask(task, null);
|
||||
return await this.#resumeTask(task, null, 0);
|
||||
}
|
||||
|
||||
logger.debug("PerformTaskOperationService.call", { task });
|
||||
@@ -53,12 +53,16 @@ export class PerformTaskOperationService {
|
||||
|
||||
const { url, requestInit, retry } = fetchOperation.data;
|
||||
|
||||
const startTimeInMs = performance.now();
|
||||
|
||||
const response = await fetch(url, {
|
||||
method: requestInit?.method ?? "GET",
|
||||
headers: normalizeHeaders(requestInit?.headers ?? {}),
|
||||
body: requestInit?.body,
|
||||
});
|
||||
|
||||
const durationInMs = Math.floor(performance.now() - startTimeInMs);
|
||||
|
||||
const jsonBody = await safeJsonFromResponse(response);
|
||||
|
||||
logger.debug("PerformTaskOperationService.call.fetch", {
|
||||
@@ -68,6 +72,7 @@ export class PerformTaskOperationService {
|
||||
statusCode: response.status,
|
||||
headers: Object.fromEntries(response.headers.entries()),
|
||||
jsonBody,
|
||||
durationInMs,
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
@@ -91,7 +96,7 @@ export class PerformTaskOperationService {
|
||||
}
|
||||
}
|
||||
|
||||
return await this.#resumeTask(task, jsonBody);
|
||||
return await this.#resumeTask(task, jsonBody, durationInMs);
|
||||
}
|
||||
default: {
|
||||
await this.#resumeTaskWithError(task, {
|
||||
@@ -118,6 +123,8 @@ export class PerformTaskOperationService {
|
||||
|
||||
logger.debug("Calculating retry at for strategy", {
|
||||
strategy,
|
||||
status: response.status,
|
||||
retry,
|
||||
});
|
||||
|
||||
switch (strategy.strategy) {
|
||||
@@ -218,7 +225,7 @@ export class PerformTaskOperationService {
|
||||
});
|
||||
}
|
||||
|
||||
async #resumeTask(task: NonNullable<FoundTask>, output: any) {
|
||||
async #resumeTask(task: NonNullable<FoundTask>, output: any, durationInMs: number) {
|
||||
await $transaction(this.#prismaClient, async (tx) => {
|
||||
await tx.taskAttempt.updateMany({
|
||||
where: {
|
||||
@@ -236,6 +243,13 @@ export class PerformTaskOperationService {
|
||||
status: "COMPLETED",
|
||||
completedAt: new Date(),
|
||||
output: output ? output : undefined,
|
||||
run: {
|
||||
update: {
|
||||
executionDuration: {
|
||||
increment: durationInMs,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 385 KiB |
@@ -0,0 +1,159 @@
|
||||
---
|
||||
title: Airtable tasks
|
||||
sidebarTitle: Tasks
|
||||
---
|
||||
|
||||
Tasks are executed after the job is triggered and are the main building blocks of a job. You can string together as many tasks as you want.
|
||||
|
||||
---
|
||||
|
||||
## All tasks
|
||||
|
||||
### `base.table.getRecords`
|
||||
|
||||
Gets multiple records for a table. You can filter. [Official Airtable Docs](https://airtable.com/developers/web/api/update-multiple-records).
|
||||
|
||||
```ts example.ts
|
||||
// Gets multiple records from the table.
|
||||
// Here we only get the Status fields (columns)
|
||||
await table.getRecords("multiple records", {
|
||||
fields: ["Status"],
|
||||
});
|
||||
```
|
||||
|
||||
### `base.table.getRecord`
|
||||
|
||||
Gets a single record (using the id) for a table. [Official Airtable Docs](https://airtable.com/developers/web/api/get-record).
|
||||
|
||||
```ts example.ts
|
||||
// Get a single record using the ID of the first record in the fetched records.
|
||||
await table.getRecord("single", records[0].id);
|
||||
```
|
||||
|
||||
### `base.table.createRecords`
|
||||
|
||||
Create one or more records in a table. [Official Airtable Docs](https://airtable.com/developers/web/api/create-records).
|
||||
|
||||
```ts example.ts
|
||||
// Create newRecords by adding a record to the table.
|
||||
await table.createRecords("create records", [
|
||||
{
|
||||
// Define the new record to be created
|
||||
// with field values for "Launch goals" and "Status."
|
||||
fields: {
|
||||
"Launch goals": "Created from Trigger.dev",
|
||||
Status: "In progress",
|
||||
},
|
||||
},
|
||||
]);
|
||||
```
|
||||
|
||||
### `base.table.updateRecords`
|
||||
|
||||
Update one or more records in a table. [Official Airtable Docs](https://airtable.com/developers/web/api/update-record).
|
||||
|
||||
```ts example.ts
|
||||
// Update the record that was just created.
|
||||
await table.updateRecords(
|
||||
// Specify the table's name as "update records."
|
||||
"update records",
|
||||
// Use the `map` method to create an array of records to be updated.
|
||||
newRecords.map((record) => ({
|
||||
// For each record, specify the: ID and the field to update ("Status" to "At risk").
|
||||
id: record.id,
|
||||
fields: {
|
||||
Status: "At risk",
|
||||
},
|
||||
}))
|
||||
);
|
||||
```
|
||||
|
||||
### `base.table.deleteRecords`
|
||||
|
||||
Delete one or more records in a table (using ids). [Official Airtable Docs](https://airtable.com/developers/web/api/delete-record).
|
||||
|
||||
```ts example.ts
|
||||
// Delete records from the table.
|
||||
await table.deleteRecords(
|
||||
// Specify the table's name as "delete records."
|
||||
"delete records"
|
||||
);
|
||||
```
|
||||
|
||||
### `runTask`
|
||||
|
||||
Do anything that’s possible with the official Airtable Node SDK.
|
||||
|
||||
## Example Usage
|
||||
|
||||
You can optionally add the types for your Table – this gives you nice type inference and errors when writing your code.
|
||||
|
||||
```ts
|
||||
// This is the type definition for my Table
|
||||
type LaunchGoalsAndOkRs = {
|
||||
"Launch goals"?: string;
|
||||
DRI?: Collaborator;
|
||||
Team?: string;
|
||||
Status?: "On track" | "In progress" | "At risk";
|
||||
"Key results"?: Array<string>;
|
||||
"Features (from 💻 Features table)"?: Array<string>;
|
||||
"Status (from 💻 Features)": Array<
|
||||
"Live" | "Complete" | "In progress" | "Planning" | "In reviews"
|
||||
>;
|
||||
};
|
||||
|
||||
client.defineJob({
|
||||
id: "airtable-example",
|
||||
name: "Airtable Example: getRecords",
|
||||
version: "0.1.0",
|
||||
trigger: eventTrigger({
|
||||
name: "airtable.example",
|
||||
}),
|
||||
integrations: {
|
||||
// Make sure to add the integration here
|
||||
airtable,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
// Adding the type to table<YourTableType>("<your table name>") gives you nice type inference and errors
|
||||
// You can leave it out as well table("<your table name>")
|
||||
const table = io.airtable.base("<your base id>").table<LaunchGoalsAndOkRs>("<your table name>");
|
||||
|
||||
// Gets multiple records from the table. Here we only get the Status fields (columns)
|
||||
const records = await table.getRecords("multiple records", {
|
||||
fields: ["Status"],
|
||||
});
|
||||
await io.logger.log(records[0].fields.Status ?? "no status");
|
||||
|
||||
// Get a single record
|
||||
const aRecord = await table.getRecord("single", records[0].id);
|
||||
|
||||
// Create a new record
|
||||
const newRecords = await table.createRecords("create records", [
|
||||
{
|
||||
fields: {
|
||||
"Launch goals": "Created from Trigger.dev",
|
||||
Status: "In progress",
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
// Update the record we just created
|
||||
const updatedRecords = await table.updateRecords(
|
||||
"update records",
|
||||
newRecords.map((record) => ({
|
||||
id: record.id,
|
||||
fields: { Status: "At risk" },
|
||||
}))
|
||||
);
|
||||
|
||||
// Wait for 5 seconds
|
||||
await io.wait("5 secs", 5);
|
||||
|
||||
// Delete the record we just created + updated
|
||||
const deletedRecords = await table.deleteRecords(
|
||||
"delete records",
|
||||
updatedRecords.map((record) => record.id)
|
||||
);
|
||||
},
|
||||
});
|
||||
```
|
||||
@@ -1,12 +1,21 @@
|
||||
---
|
||||
title: Airtable
|
||||
title: Airtable overview & authentication
|
||||
sidebarTitle: Overview & authentication
|
||||
---
|
||||
|
||||
Use the Airtable integration to create, read, update, and delete records in your Airtable bases.
|
||||
## Overview
|
||||
|
||||
Coming soon: subscribing to changes in your Airtable bases using triggers.
|
||||
Our Airtable integration allows you to easily connect to the Airtable API and perform tasks such as creating / updating / deleting single or multiple records in your tables.
|
||||
|
||||
<Snippet file="integration-getting-started.mdx" />
|
||||
For examples of some of the things you can do with it, check out our Jobs Showcase:
|
||||
|
||||
<Card
|
||||
title="Jobs Showcase - Airtable"
|
||||
icon="rocket"
|
||||
href="https://trigger.dev/showcase?tags=&integrations=airtable"
|
||||
>
|
||||
Check out pre-built Airtable jobs in our showcase.
|
||||
</Card>
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -35,6 +44,8 @@ To use the Airtable API with Trigger.dev, you can either use OAuth or a Personal
|
||||
|
||||
### OAuth
|
||||
|
||||
To use OAuth you can connect to Airtable via the Trigger.dev [web app](https://cloud.trigger.dev). Click 'Integrations' in the side panel of any project, and configure Airtable with the ID you want to use in your job and the required [scopes](https://airtable.com/developers/web/api/scopes).
|
||||
|
||||
```ts
|
||||
import { Airtable } from "@trigger.dev/airtable";
|
||||
|
||||
@@ -58,84 +69,12 @@ const airtable = new Airtable({
|
||||
});
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Include the Airtable integration in your Trigger.dev job.
|
||||
|
||||
You can optionally add the types for your Table – this gives you nice type inference and errors when writing your code.
|
||||
|
||||
```ts
|
||||
//this is the type definition for my Table
|
||||
type LaunchGoalsAndOkRs = {
|
||||
"Launch goals"?: string;
|
||||
DRI?: Collaborator;
|
||||
Team?: string;
|
||||
Status?: "On track" | "In progress" | "At risk";
|
||||
"Key results"?: Array<string>;
|
||||
"Features (from 💻 Features table)"?: Array<string>;
|
||||
"Status (from 💻 Features)": Array<
|
||||
"Live" | "Complete" | "In progress" | "Planning" | "In reviews"
|
||||
>;
|
||||
};
|
||||
|
||||
client.defineJob({
|
||||
id: "airtable-example-1",
|
||||
name: "Airtable Example 1: getRecords",
|
||||
version: "0.1.0",
|
||||
trigger: eventTrigger({
|
||||
name: "airtable.example",
|
||||
}),
|
||||
integrations: {
|
||||
//make sure to add the integration here
|
||||
airtable,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
//adding the type to table<YourTableType>("<your table name>") gives you nice type inference and errors
|
||||
//you can leave it out as well table("<your table name>")
|
||||
const table = io.airtable.base("<your base id>").table<LaunchGoalsAndOkRs>("<your table name>");
|
||||
|
||||
//gets multiple records from the table. Here we only get the Status fields (columns)
|
||||
const records = await table.getRecords("muliple records", { fields: ["Status"] });
|
||||
await io.logger.log(records[0].fields.Status ?? "no status");
|
||||
|
||||
//Get a single record
|
||||
const aRecord = await table.getRecord("single", records[0].id);
|
||||
|
||||
//create a new record
|
||||
const newRecords = await table.createRecords("create records", [
|
||||
{
|
||||
fields: { "Launch goals": "Created from Trigger.dev", Status: "In progress" },
|
||||
},
|
||||
]);
|
||||
|
||||
//update the record we just created
|
||||
const updatedRecords = await table.updateRecords(
|
||||
"update records",
|
||||
newRecords.map((record) => ({
|
||||
id: record.id,
|
||||
fields: { Status: "At risk" },
|
||||
}))
|
||||
);
|
||||
|
||||
//wait 5 seconds
|
||||
await io.wait("5 secs", 5);
|
||||
|
||||
//delete the record we just created + updated
|
||||
const deletedRecords = await table.deleteRecords(
|
||||
"delete records",
|
||||
updatedRecords.map((record) => record.id)
|
||||
);
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## Tasks
|
||||
|
||||
| Function Name | Description |
|
||||
| -------------------------- | --------------------------------------------------------------- |
|
||||
| `base.table.getRecords` | Gets multiple records for a table. You can filter |
|
||||
| `base.table.getRecord` | Gets a single record (using the id) for a table. |
|
||||
| `base.table.createRecords` | Create one or more records in a table. |
|
||||
| `base.table.updateRecords` | Update one or more records in a table. |
|
||||
| `base.table.deleteRecords` | Delete one or more records in a table (using ids). |
|
||||
| `runTask` | Do anything that's possible with the official Airtable Node SDK |
|
||||
Once you have set up a Airtable client, you can use it to create tasks.
|
||||
|
||||
<CardGroup>
|
||||
<Card title="Tasks" icon="sparkles" href="/integrations/apis/airtable-tasks">
|
||||
Perform tasks such as creating / updating / deleting single or multiple records in table.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -0,0 +1,511 @@
|
||||
---
|
||||
title: OpenAI tasks
|
||||
sidebarTitle: Tasks
|
||||
---
|
||||
|
||||
Tasks are executed after the job is triggered and are the main building blocks of a job. You can string together as many tasks as you want.
|
||||
|
||||
---
|
||||
|
||||
## All tasks
|
||||
|
||||
### `createCompletion`
|
||||
|
||||
Generates text completions as per given prompt. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/chat)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// This code demonstrates using OpenAI's text completion with the "davinci" model.
|
||||
// It generates text based on the given prompt.
|
||||
await io.openai.createCompletion("completion", {
|
||||
model: "davinci",
|
||||
prompt: "Once upon a time",
|
||||
});
|
||||
},
|
||||
```
|
||||
|
||||
### `backgroundCreateCompletion`
|
||||
|
||||
Generates text completions in the background. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/chat)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// This code showcases background text completion using the "gpt-3.5-turbo" model.
|
||||
// It generates text based on the provided programming task and logs the result.
|
||||
const programmingTask = `Create a function that checks if a string is a palindrome.`;
|
||||
|
||||
const response = await io.openai.backgroundCreateCompletion("background-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
prompt: `Coding task: ${programmingTask}\n\n`,
|
||||
});
|
||||
|
||||
await io.logger.info("codeSnippet", response.choices[0]?.text);
|
||||
},
|
||||
```
|
||||
|
||||
### `createChatCompletion`
|
||||
|
||||
Generates text completions in a conversational context. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/chat/create)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// This code demonstrates chat completion with the "gpt-3.5-turbo" model.
|
||||
// It simulates a conversation by providing messages and receiving a chat response.
|
||||
await io.openai.createChatCompletion("chat-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: "Create a good programming joke about background jobs",
|
||||
},
|
||||
],
|
||||
});
|
||||
},
|
||||
```
|
||||
|
||||
### `backgroundCreateChatCompletion`
|
||||
|
||||
Generates text completions in a conversational context in the background. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/chat/object)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// This code showcases background chat completion using the "gpt-3.5-turbo" model.
|
||||
// It simulates a conversation with a user message and logs the response choices.
|
||||
const response = await io.openai.backgroundCreateChatCompletion("background-chat-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: "Create a good programming joke about background jobs",
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
await io.logger.info("choices", response.choices);
|
||||
},
|
||||
```
|
||||
|
||||
### `retrieveModel`
|
||||
|
||||
Retrieves a specific model by ID. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/models/retrieve)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// In this code snippet, we retrieve detailed information about a specific OpenAI model.
|
||||
|
||||
// Specify the ID of the model you want to retrieve. Replace 'your_model_id' with the actual model ID.
|
||||
const modelIdToRetrieve = "your_model_id";
|
||||
|
||||
try {
|
||||
// Retrieve the model information using the OpenAI API
|
||||
const retrievedModel = await io.openai.retrieveModel("get-model", {
|
||||
model: modelIdToRetrieve,
|
||||
});
|
||||
|
||||
// Log the detailed model information
|
||||
await io.logger.info("retrievedModel", retrievedModel);
|
||||
} catch (error) {
|
||||
// Handle errors, such as if the model with the provided ID does not exist.
|
||||
await io.logger.error("Error retrieving model:", error.message);
|
||||
}
|
||||
},
|
||||
```
|
||||
|
||||
### `listModels`
|
||||
|
||||
Lists the available models. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/models/list)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// This code lists available models without retrieving detailed information.
|
||||
const models = await io.openai.listModels("list-models");
|
||||
},
|
||||
```
|
||||
|
||||
### `createEdit`
|
||||
|
||||
Edits a given text prompt. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/edits/create)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// This code snippet demonstrates using the OpenAI API to create an edit task.
|
||||
|
||||
// Specify the task parameters:
|
||||
const editTaskParams = {
|
||||
model: "text-davinci-edit-001", // Replace with the desired model
|
||||
input: "Thsi is ridddled with erors", // Replace with the input text
|
||||
instruction: "Fix the spelling errors", // Replace with the editing instruction
|
||||
};
|
||||
|
||||
try {
|
||||
// Create an edit task using the OpenAI API
|
||||
const editResponse = await io.openai.createEdit("edit", editTaskParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("editResponse", editResponse);
|
||||
} catch (error) {
|
||||
// Handle any potential errors that may occur during the API request.
|
||||
await io.logger.error("Error creating edit task:", error.message);
|
||||
}
|
||||
},
|
||||
```
|
||||
|
||||
### `createImage`
|
||||
|
||||
Generates images from textual descriptions. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/images/create)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
const imageResults = await io.openai.createImage("image", {
|
||||
prompt: "A hedgehog wearing a party hat",
|
||||
n: 2,
|
||||
size: "256x256",
|
||||
response_format: "url",
|
||||
});
|
||||
```
|
||||
|
||||
### `createImageEdit`
|
||||
|
||||
Creates an edited or extended image given an original image and a prompt. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/images/createEdit)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the parameters for the image edit
|
||||
const imageEditParams = {
|
||||
style: "data:image/png;base64,base64_encoded_style_image",
|
||||
content: "data:image/png;base64,base64_encoded_content_image",
|
||||
};
|
||||
|
||||
// Create the image edit using the OpenAI API
|
||||
const imageEditResponse = await io.openai.createImageEdit(imageEditParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("imageEditResponse", imageEditResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `createImageVariation`
|
||||
|
||||
Creates a variation of a given image. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/images/createVariation)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the parameters for creating an image variation
|
||||
const imageVariationParams = {
|
||||
image: "data:image/png;base64,base64_encoded_image",
|
||||
variation: "brightness(1.2) contrast(0.8) rotate(45deg)",
|
||||
};
|
||||
|
||||
// Create the image variation using the OpenAI API
|
||||
const imageVariationResponse = await io.openai.createImageVariation(imageVariationParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("imageVariationResponse", imageVariationResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `createEmbedding`
|
||||
|
||||
Generates embeddings for a given text. [Official OpenAI Docs](hhttps://platform.openai.com/docs/api-reference/embeddings/object)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// This code snippet demonstrates using the OpenAI API to create a text embedding.
|
||||
|
||||
// Specify the task parameters:
|
||||
const embeddingTaskParams = {
|
||||
model: "text-embedding-ada-002", // Replace with the desired model
|
||||
input: "The food was delicious and the waiter...", // Replace with the input text
|
||||
};
|
||||
|
||||
try {
|
||||
// Create a text embedding using the OpenAI API
|
||||
const embeddingResponse = await io.openai.createEmbedding("embedding", embeddingTaskParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("embeddingResponse", embeddingResponse);
|
||||
} catch (error) {
|
||||
// Handle any potential errors that may occur during the API request.
|
||||
await io.logger.error("Error creating text embedding:", error.message);
|
||||
}
|
||||
},
|
||||
```
|
||||
|
||||
### `createFile`
|
||||
|
||||
Uploads a file to the OpenAI API. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/files/object)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the parameters for creating a file
|
||||
const fileParams = {
|
||||
name: "example.txt",
|
||||
content: "This is the content of the file.",
|
||||
};
|
||||
|
||||
// Create the file using the OpenAI API
|
||||
const fileResponse = await io.openai.createFile(fileParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("fileResponse", fileResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `listFiles`
|
||||
|
||||
Lists the uploaded files. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/files/list)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// List the files available in your OpenAI account
|
||||
const fileListResponse = await io.openai.listFiles();
|
||||
|
||||
// Log the list of files
|
||||
await io.logger.info("fileListResponse", fileListResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `createFineTuneFile`
|
||||
|
||||
Uploads a file for fine-tuning a model. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the parameters for creating a fine-tune file
|
||||
const fineTuneFileParams = {
|
||||
model: "text-davinci-002",
|
||||
prompt: "Translate English to French: 'Hello, world.'",
|
||||
language: "en",
|
||||
description: "Fine-tune file for translation task",
|
||||
};
|
||||
|
||||
// Create the fine-tune file using the OpenAI API
|
||||
const fineTuneFileResponse = await io.openai.createFineTuneFile(fineTuneFileParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("fineTuneFileResponse", fineTuneFileResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `createFineTune`
|
||||
|
||||
Fine-tunes a model on a given task. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/create)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the parameters for creating a fine-tune task
|
||||
const fineTuneParams = {
|
||||
model: "text-davinci-002",
|
||||
dataset: "your_dataset_id",
|
||||
description: "Fine-tune task for custom dataset",
|
||||
};
|
||||
|
||||
// Create the fine-tune task using the OpenAI API
|
||||
const fineTuneResponse = await io.openai.createFineTune(fineTuneParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("fineTuneResponse", fineTuneResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `listFineTunes`
|
||||
|
||||
Lists the available fine-tunes. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/list)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// List the fine-tunes available in your OpenAI account
|
||||
const fineTunesListResponse = await io.openai.listFineTunes();
|
||||
|
||||
// Log the list of fine-tunes
|
||||
await io.logger.info("fineTunesListResponse", fineTunesListResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `retrieveFineTune`
|
||||
|
||||
Retrieves a specific fine-tune by ID. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/retrieve)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the ID of the fine-tune you want to retrieve
|
||||
const fineTuneId = "your_fine_tune_id"; // Replace with the actual fine-tune ID
|
||||
|
||||
// Retrieve the fine-tune using the OpenAI API
|
||||
const retrievedFineTune = await io.openai.retrieveFineTune(fineTuneId);
|
||||
|
||||
// Log the retrieved fine-tune
|
||||
await io.logger.info("retrievedFineTune", retrievedFineTune);
|
||||
},
|
||||
```
|
||||
|
||||
### `cancelFineTune`
|
||||
|
||||
Cancels a specific fine-tune by ID. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/cancel)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the ID of the fine-tune you want to cancel
|
||||
const fineTuneIdToCancel = "your_fine_tune_id"; // Replace with the actual fine-tune ID
|
||||
|
||||
// Cancel the specified fine-tune using the OpenAI API
|
||||
const cancellationResponse = await io.openai.cancelFineTune(fineTuneIdToCancel);
|
||||
|
||||
// Log the cancellation response
|
||||
await io.logger.info("cancellationResponse", cancellationResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `createFineTuningJob`
|
||||
|
||||
Creates a job that fine-tunes a specified model from a given dataset. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/create)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the parameters for creating a fine-tuning job
|
||||
const fineTuningJobParams = {
|
||||
fineTuneId: "your_fine_tune_id", // Replace with the actual fine-tune ID
|
||||
datasetId: "your_dataset_id", // Replace with the ID of your dataset
|
||||
model: "text-davinci-002", // Replace with the model for fine-tuning
|
||||
n_examples: 100, // Replace with the number of examples
|
||||
};
|
||||
|
||||
// Create the fine-tuning job using the OpenAI API
|
||||
const fineTuningJobResponse = await io.openai.createFineTuningJob(fineTuningJobParams);
|
||||
|
||||
// Log the response
|
||||
await io.logger.info("fineTuningJobResponse", fineTuningJobResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `retrieveFineTuningJob`
|
||||
|
||||
Get info about a fine-tuning job. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/retrieve)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the ID of the fine-tuning job you want to retrieve
|
||||
const fineTuningJobId = "your_fine_tuning_job_id"; // Replace with the actual job ID
|
||||
|
||||
// Retrieve the fine-tuning job using the OpenAI API
|
||||
const retrievedJob = await io.openai.retrieveFineTuningJob(fineTuningJobId);
|
||||
|
||||
// Log the retrieved job
|
||||
await io.logger.info("retrievedJob", retrievedJob);
|
||||
},
|
||||
```
|
||||
|
||||
### `cancelFineTuningJob`
|
||||
|
||||
Cancel a fine-tuning job. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/cancel)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the ID of the fine-tuning job you want to cancel
|
||||
const fineTuningJobIdToCancel = "your_fine_tuning_job_id"; // Replace with the actual job ID
|
||||
|
||||
// Cancel the specified fine-tuning job using the OpenAI API
|
||||
const cancellationResponse = await io.openai.cancelFineTuningJob(fineTuningJobIdToCancel);
|
||||
|
||||
// Log the cancellation response
|
||||
await io.logger.info("cancellationResponse", cancellationResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `listFineTuningJobEvents`
|
||||
|
||||
List events for a fine-tuning job. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/list-events)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// Specify the ID of the fine-tuning job for which you want to list events
|
||||
const fineTuningJobId = "your_fine_tuning_job_id"; // Replace with the actual job ID
|
||||
|
||||
// List events for the specified fine-tuning job using the OpenAI API
|
||||
const eventsListResponse = await io.openai.listFineTuningJobEvents(fineTuningJobId);
|
||||
|
||||
// Log the list of events
|
||||
await io.logger.info("eventsListResponse", eventsListResponse);
|
||||
},
|
||||
```
|
||||
|
||||
### `listFineTuningJobs`
|
||||
|
||||
List fine tuning jobs. [Official OpenAI Docs](https://platform.openai.com/docs/api-reference/fine-tuning/list)
|
||||
|
||||
```ts example.ts
|
||||
run: async (payload, io, ctx) => {
|
||||
// List the fine-tuning jobs available in your OpenAI account
|
||||
const jobsListResponse = await io.openai.listFineTuningJobs();
|
||||
|
||||
// Log the list of fine-tuning jobs
|
||||
await io.logger.info("jobsListResponse", jobsListResponse);
|
||||
},
|
||||
```
|
||||
|
||||
## Example usage
|
||||
|
||||
In this example we'll create a task that generates a random joke using OpenAI GPT 3.5 .
|
||||
|
||||
```ts example.ts
|
||||
import { TriggerClient, eventTrigger } from "@trigger.dev/sdk";
|
||||
import { OpenAI } from "@trigger.dev/openai";
|
||||
import { z } from "zod";
|
||||
|
||||
// Initialize a TriggerClient with the ID "jobs-showcase"
|
||||
const client = new TriggerClient({ id: "jobs-showcase" });
|
||||
|
||||
// Create an instance of the OpenAI client and provide the OpenAI API key from environment variables
|
||||
const openai = new OpenAI({
|
||||
id: "openai",
|
||||
apiKey: process.env.OPENAI_API_KEY!, // Replace with your actual OpenAI API key
|
||||
});
|
||||
|
||||
// Define a job that uses OpenAI GPT-3.5 Turbo to tell jokes
|
||||
client.defineJob({
|
||||
id: "openai-tell-me-a-joke",
|
||||
name: "OpenAI: tell me a joke",
|
||||
version: "1.0.0",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.tasks", // Define the trigger event name
|
||||
schema: z.object({
|
||||
jokePrompt: z.string(), // Expect a joke prompt as input
|
||||
}),
|
||||
}),
|
||||
integrations: {
|
||||
openai, // Use the OpenAI integration for this job
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
// Retrieve information about the GPT-3.5 Turbo model
|
||||
await io.openai.retrieveModel("get-model", {
|
||||
model: "gpt-3.5-turbo",
|
||||
});
|
||||
|
||||
// List available models (optional, for reference)
|
||||
const models = await io.openai.listModels("list-models");
|
||||
|
||||
// Generate a joke in the background using the chat conversation format
|
||||
const jokeResult = await io.openai.backgroundCreateChatCompletion(
|
||||
"background-chat-completion",
|
||||
{
|
||||
model: "gpt-3.5-turbo",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: payload.jokePrompt, // User-provided joke prompt
|
||||
},
|
||||
],
|
||||
}
|
||||
);
|
||||
|
||||
// Return the generated joke as the result
|
||||
return {
|
||||
joke: jokeResult.choices[0]?.message?.content,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
// These lines are specific to the Express framework and can be removed if not needed
|
||||
import { createExpressServer } from "@trigger.dev/express";
|
||||
createExpressServer(client);
|
||||
```
|
||||
@@ -1,17 +1,21 @@
|
||||
---
|
||||
title: OpenAI
|
||||
title: OpenAI overview & authentication
|
||||
sidebarTitle: Overview & authentication
|
||||
---
|
||||
|
||||
Trigger.dev has a seamless integration with OpenAI, enabling developers to harness the power of AI
|
||||
language models in their serverless applications. With Trigger.dev's background tasks, long-running
|
||||
OpenAI completions become possible, even within the constraints of serverless timeouts.
|
||||
## Overview
|
||||
|
||||
<Snippet file="integration-getting-started.mdx" />
|
||||
Our OpenAI integration allows you to easily perform AI-powered tasks, such as summarizing text, answering questions, generating images, fine tuning and much more.
|
||||
|
||||
## Installation
|
||||
<Card
|
||||
title="Jobs Showcase - OpenAI"
|
||||
icon="rocket"
|
||||
href="https://trigger.dev/showcase?tags=&integrations=openai"
|
||||
>
|
||||
Check out pre-built OpenAI jobs in our showcase.
|
||||
</Card>
|
||||
|
||||
To get started with the OpenAI integration on Trigger.dev, you need to install the `@trigger.dev/openai` package.
|
||||
You can do this using npm, pnpm, or yarn:
|
||||
## Installing the OpenAI packages
|
||||
|
||||
<CodeGroup>
|
||||
|
||||
@@ -43,84 +47,47 @@ const openai = new OpenAI({
|
||||
});
|
||||
```
|
||||
|
||||
## Usage
|
||||
## Tasks
|
||||
|
||||
Include the OpenAI integration in your Trigger.dev job:
|
||||
Once you have set up a OpenAI client, you can use it to create tasks.
|
||||
|
||||
<CardGroup>
|
||||
<Card title="Tasks" icon="sparkles" href="/integrations/apis/openai-tasks">
|
||||
Perform different AI-powered tasks using OpenAI.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Usage as Universal Client
|
||||
|
||||
You can use our OpenAI integration as a universal client to interact with other OpenAI-compatible APIs, such as [Perplexity.ai](https://docs.perplexity.ai/)
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
id: "openai-tasks",
|
||||
name: "OpenAI Tasks",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.tasks",
|
||||
schema: z.object({}),
|
||||
}),
|
||||
integrations: {
|
||||
openai,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
// Now you can access the OpenAI tasks through the io object
|
||||
await io.openai.createCompletion("completion", {
|
||||
model: "davinci",
|
||||
prompt: "Once upon a time",
|
||||
});
|
||||
},
|
||||
import { OpenAI } from "@trigger.dev/openai";
|
||||
|
||||
const perplexity = new OpenAI({
|
||||
id: "perplexity",
|
||||
apiKey: process.env["PERPLEXITY_API_KEY"]!,
|
||||
baseURL: "https://api.perplexity.ai",
|
||||
icon: "brand-open-source",
|
||||
});
|
||||
```
|
||||
|
||||
## Tasks
|
||||
|
||||
Tasks that are marked as "long-running" can last longer than your serverless timeout – they are performed on one of our background workers.
|
||||
|
||||
| Function Name | Description | Long-running? |
|
||||
| -------------------------------- | ------------------------------------------------------------------------- | ------------- |
|
||||
| `createCompletion` | Generates text completions given a prompt. |
|
||||
| `backgroundCreateCompletion` | Generates text completions in the background. | ✔ |
|
||||
| `createChatCompletion` | Generates text completions in a conversational context. |
|
||||
| `backgroundCreateChatCompletion` | Generates text completions in a conversational context in the background. | ✔ |
|
||||
| `retrieveModel` | Retrieves a specific model by ID. |
|
||||
| `listModels` | Lists the available models. |
|
||||
| `createEdit` | Edits a given text prompt. |
|
||||
| `createImage` | Generates images from textual descriptions. |
|
||||
| `createImageEdit` | Creates an edited or extended image given an original image and a prompt |
|
||||
| `createImageVariation` | Creates a variation of a given image. |
|
||||
| `createEmbedding` | Generates embeddings for a given text. |
|
||||
| `createFile` | Uploads a file to the OpenAI API. |
|
||||
| `listFiles` | Lists the uploaded files. |
|
||||
| `createFineTuneFile` | Uploads a file for fine-tuning a model. |
|
||||
| `createFineTune` | Fine-tunes a model on a given task. |
|
||||
| `listFineTunes` | Lists the available fine-tunes. |
|
||||
| `retrieveFineTune` | Retrieves a specific fine-tune by ID. |
|
||||
| `cancelFineTune` | Cancels a specific fine-tune by ID. |
|
||||
| `createFineTuningJob` | Creates a job that fine-tunes a specified model from a given dataset. |
|
||||
| `retrieveFineTuningJob` | Get info about a fine-tuning job. |
|
||||
| `cancelFineTuningJob` | Cancel a fine-tuning job |
|
||||
| `listFineTuningJobEvents` | List events for a fine-tuning job |
|
||||
| `listFineTuningJobs` | List fine tuning jobs |
|
||||
|
||||
## Examples
|
||||
|
||||
### Generate a joke
|
||||
|
||||
Here's an example of how to use the OpenAI integration in a Trigger.dev job.
|
||||
In this example, we'll create a background task to generate a programming joke.
|
||||
Since [Perplexity.ai](https://docs.perplexity.ai/) is compatible with OpenAI, you can use the same tasks as with OpenAI.
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
id: "openai-tasks",
|
||||
name: "OpenAI Tasks",
|
||||
id: "perplexity-tasks",
|
||||
name: "Perplexity Tasks",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.tasks",
|
||||
schema: z.object({}),
|
||||
name: "perplexity.tasks",
|
||||
}),
|
||||
integrations: {
|
||||
openai,
|
||||
perplexity,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
const response = await io.openai.backgroundCreateChatCompletion("background-chat-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
await io.perplexity.chat.completions.create("chat-completion", {
|
||||
model: "mistral-7b-instruct",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
@@ -129,190 +96,20 @@ client.defineJob({
|
||||
],
|
||||
});
|
||||
|
||||
await io.logger.info("choices", response.choices);
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Generate Code Snippets
|
||||
|
||||
In this example, we'll leverage Trigger.dev's background task to generate code snippets for
|
||||
a given programming task:
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
id: "openai-tasks",
|
||||
name: "OpenAI Tasks",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.tasks",
|
||||
schema: z.object({}),
|
||||
}),
|
||||
integrations: {
|
||||
openai,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
const programmingTask = `Create a function that checks if a string is a palindrome.`;
|
||||
|
||||
const response = await io.openai.backgroundCreateCompletion("background-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
prompt: `Coding task: ${programmingTask}\n\n`,
|
||||
});
|
||||
|
||||
await io.logger.info("codeSnippet", response.choices[0]?.text);
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Summarize Text
|
||||
|
||||
We'll use Trigger.dev's background task to summarize a lengthy article:
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
id: "openai-tasks",
|
||||
name: "OpenAI Tasks",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.tasks",
|
||||
schema: z.object({}),
|
||||
}),
|
||||
integrations: {
|
||||
openai,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
const articleToSummarize = `Lorem ipsum. olor sit amet, consectetur adipiscing elit.
|
||||
Sed nec aliquet sapien. Pellentesque vitae nisi id purus luctus tincidunt.
|
||||
Proin condimentum malesuada turpis, eget tincidunt mauris viverra in.`;
|
||||
|
||||
const response = await io.openai.backgroundCreateCompletion("background-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
prompt: `Please summarize the following article:\n\n${articleToSummarize}`,
|
||||
});
|
||||
|
||||
await io.logger.info("summary", response.choices[0]?.text);
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Draft Email Response
|
||||
|
||||
we'll use Trigger.dev's background task to draft an email response based on a given email content:
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
id: "openai-tasks",
|
||||
name: "OpenAI Tasks",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.tasks",
|
||||
schema: z.object({}),
|
||||
}),
|
||||
integrations: {
|
||||
openai,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
const emailContent = `Dear John,
|
||||
|
||||
Thank you for your inquiry. We appreciate your interest in our products.
|
||||
I have reviewed your request, and I'm pleased to inform you that we can
|
||||
accommodate your requirements. Please find the attached proposal for your
|
||||
reference. If you have any further questions, feel free to ask.
|
||||
|
||||
Best regards,
|
||||
Jane Doe`;
|
||||
|
||||
const response = await io.openai.backgroundCreateChatCompletion("background-chat-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
// Run this in the background
|
||||
await io.perplexity.chat.completions.backgroundCreate("background-chat-completion", {
|
||||
model: "mistral-7b-instruct",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: emailContent,
|
||||
},
|
||||
{
|
||||
role: "assistant",
|
||||
content: "Draft a suitable response to the email above.",
|
||||
content: "If you were a programming language, what would you be and why?",
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
await io.logger.info("draftedEmailResponse", response.choices[0]?.text);
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Chatbot Counseling Session
|
||||
And you'll get the same experience in the Run Dashboard when viewing the logs:
|
||||
|
||||
This job represents a simulated AI counseling session. Leveraging OpenAI's ability to understand context and generate human-like text, it forms empathetic responses to user inputs. Such a system could be part of a mental wellness app.
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
id: "openai-chatbot-counseling",
|
||||
name: "Chatbot Counseling Session",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.startCounselingSession",
|
||||
schema: z.object({}),
|
||||
}),
|
||||
integrations: {
|
||||
openai,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
const response = await io.openai.backgroundCreateChatCompletion(
|
||||
"background-counseling-chat-completion",
|
||||
{
|
||||
model: "gpt-3.5-turbo",
|
||||
messages: [
|
||||
{
|
||||
role: "system",
|
||||
content: "You are a helpful and empathetic AI counselor.",
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
content: "I've been feeling really stressed out lately.",
|
||||
},
|
||||
],
|
||||
}
|
||||
);
|
||||
await io.logger.info("counseling session", response.choices);
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### AI Roleplay Game Session
|
||||
|
||||
This job creates a fantasy AI role-playing game. It could be fun for interactive storytelling or game development contexts.
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
id: "openai-roleplay-game-session",
|
||||
name: "AI Roleplay Game Session",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "openai.startRoleplayGameSession",
|
||||
schema: z.object({}),
|
||||
}),
|
||||
integrations: {
|
||||
openai,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
const response = await io.openai.backgroundCreateChatCompletion(
|
||||
"background-roleplay-game-session-chat-completion",
|
||||
{
|
||||
model: "gpt-3.5-turbo",
|
||||
messages: [
|
||||
{
|
||||
role: "system",
|
||||
content: "You are an intelligent guide in a fantasy role-playing game.",
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
content: "I embark on a quest for the enchanted crown. What's the first step?",
|
||||
},
|
||||
],
|
||||
}
|
||||
);
|
||||
await io.logger.info("roleplay game session", response.choices);
|
||||
},
|
||||
});
|
||||
```
|
||||

|
||||
|
||||
@@ -23,7 +23,11 @@ await io.slack.postMessage("post message", {
|
||||
});
|
||||
```
|
||||
|
||||
## Example Usage
|
||||
## Using the underlying client
|
||||
|
||||
If we don't have the task you need listed above, you can use `io.slack.runTask()` function, which lets you do anything that’s possible with the official Slack Node SDK. More information [here](/documentation/concepts/tasks#using-io-integration-runtask).
|
||||
|
||||
Example usage:
|
||||
|
||||
```ts
|
||||
client.defineJob({
|
||||
@@ -32,15 +36,28 @@ client.defineJob({
|
||||
version: "1.0.0",
|
||||
trigger: eventTrigger({
|
||||
name: "send.slack.message",
|
||||
schema: z.object({}),
|
||||
schema: z.object({
|
||||
message: z.string,
|
||||
}),
|
||||
}),
|
||||
integrations: {
|
||||
slack,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
const response = await io.slack.postMessage("post message", {
|
||||
channel: "<your-channge-id>",
|
||||
text: "<your-slack-message>",
|
||||
// Use the Slack integration to create a task using the "post-message" cacheKey
|
||||
const message = await io.slack.postMessage("post-message", {
|
||||
channel: process.env.SLACK_CHANNEL_ID,
|
||||
message: payload.message,
|
||||
});
|
||||
|
||||
// Use the Slack integration's runTask method to add a reaction to the message
|
||||
await io.slack.runTask("add-reaction", async (client) => {
|
||||
// client here is an authenticated instance of the Slack SDK
|
||||
await client.reactions.add({
|
||||
channel: process.env.SLACK_CHANNEL_ID,
|
||||
name: "thumbsup",
|
||||
timestamp: message.ts,
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
+14
-2
@@ -245,7 +245,13 @@
|
||||
{
|
||||
"group": "Integrations",
|
||||
"pages": [
|
||||
"integrations/apis/airtable",
|
||||
{
|
||||
"group": "Airtable",
|
||||
"pages": [
|
||||
"integrations/apis/airtable",
|
||||
"integrations/apis/airtable-tasks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "GitHub",
|
||||
"pages": [
|
||||
@@ -255,7 +261,13 @@
|
||||
]
|
||||
},
|
||||
"integrations/apis/linear",
|
||||
"integrations/apis/openai",
|
||||
{
|
||||
"group": "OpenAI",
|
||||
"pages": [
|
||||
"integrations/apis/openai",
|
||||
"integrations/apis/openai-tasks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Plain",
|
||||
"pages": [
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
# @trigger.dev/airtable
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- b9eba680: Export Base and Table
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/airtable",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev integration for airtable",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -26,8 +26,8 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"airtable": "^0.12.1",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/github
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/github",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "The official GitHub integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -29,8 +29,8 @@
|
||||
"@octokit/request": "^6.2.5",
|
||||
"@octokit/request-error": "^4.0.1",
|
||||
"@octokit/webhooks": "^10.4.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"octokit": "^2.0.14",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/linear
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/linear",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev integration for @linear/sdk",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -27,8 +27,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@linear/sdk": "^8.0.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,22 @@
|
||||
# @trigger.dev/slack
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 36a39044: Upgrade to openai-node SDK 4.13.0, add support for request options and defaultQuery/defaultHeaders
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 07d28ee4: Add ability to set baseURL to use different APIs (like Perplexity)
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/openai",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "The official OpenAI integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -16,19 +16,21 @@
|
||||
"@trigger.dev/tsconfig": "workspace:*",
|
||||
"@types/node": "18",
|
||||
"rimraf": "^3.0.2",
|
||||
"tsup": "^6.5.0"
|
||||
"tsup": "^6.5.0",
|
||||
"typescript": "^4.9.4"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist",
|
||||
"build": "npm run clean && npm run build:tsup",
|
||||
"build:tsup": "tsup"
|
||||
"build:tsup": "tsup",
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"openai": "^4.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0"
|
||||
"openai": "^4.13.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.8.0"
|
||||
"node": ">=18.0.0"
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,33 @@
|
||||
import { IntegrationTaskKey, Prettify, redactString } from "@trigger.dev/sdk";
|
||||
import { IntegrationTaskKey, Prettify } from "@trigger.dev/sdk";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import { createTaskUsageProperties } from "./taskUtils";
|
||||
import {
|
||||
backgroundTaskRetries,
|
||||
createBackgroundFetchHeaders,
|
||||
createBackgroundFetchUrl,
|
||||
createTaskUsageProperties,
|
||||
} from "./taskUtils";
|
||||
import { OpenAIIntegrationOptions, OpenAIRequestOptions } from "./types";
|
||||
|
||||
export class Chat {
|
||||
constructor(private runTask: OpenAIRunTask) {}
|
||||
constructor(
|
||||
private runTask: OpenAIRunTask,
|
||||
private options: OpenAIIntegrationOptions
|
||||
) {}
|
||||
|
||||
completions = {
|
||||
create: (
|
||||
key: IntegrationTaskKey,
|
||||
params: Prettify<OpenAI.Chat.CompletionCreateParamsNonStreaming>
|
||||
params: Prettify<OpenAI.Chat.ChatCompletionCreateParamsNonStreaming>,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Chat.ChatCompletion> => {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.chat.completions.create(params);
|
||||
const response = await client.chat.completions.create(params, {
|
||||
idempotencyKey: task.idempotencyKey,
|
||||
...options,
|
||||
});
|
||||
task.outputProperties = createTaskUsageProperties(response.usage);
|
||||
return response;
|
||||
},
|
||||
@@ -33,41 +46,33 @@ export class Chat {
|
||||
|
||||
backgroundCreate: (
|
||||
key: IntegrationTaskKey,
|
||||
params: Prettify<OpenAI.Chat.CompletionCreateParamsNonStreaming>
|
||||
params: Prettify<OpenAI.Chat.ChatCompletionCreateParamsNonStreaming>,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Chat.ChatCompletion> => {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task, io) => {
|
||||
const url = createBackgroundFetchUrl(
|
||||
client,
|
||||
"/chat/completions",
|
||||
this.options.defaultQuery,
|
||||
options
|
||||
);
|
||||
|
||||
const response = await io.backgroundFetch<OpenAI.Chat.ChatCompletion>(
|
||||
"background",
|
||||
"https://api.openai.com/v1/chat/completions",
|
||||
url,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: redactString`Bearer ${client.apiKey}`,
|
||||
...(client.organization ? { "OpenAI-Organization": client.organization } : {}),
|
||||
},
|
||||
method: options.method ?? "POST",
|
||||
headers: createBackgroundFetchHeaders(
|
||||
client,
|
||||
task.idempotencyKey,
|
||||
this.options.defaultHeaders,
|
||||
options
|
||||
),
|
||||
body: JSON.stringify(params),
|
||||
},
|
||||
{
|
||||
"500-599": {
|
||||
strategy: "backoff",
|
||||
limit: 5,
|
||||
minTimeoutInMs: 1000,
|
||||
maxTimeoutInMs: 30000,
|
||||
factor: 1.8,
|
||||
randomize: true,
|
||||
},
|
||||
"429": {
|
||||
strategy: "backoff",
|
||||
limit: 10,
|
||||
minTimeoutInMs: 1000,
|
||||
maxTimeoutInMs: 60000,
|
||||
factor: 2,
|
||||
randomize: true,
|
||||
},
|
||||
}
|
||||
backgroundTaskRetries
|
||||
);
|
||||
|
||||
task.outputProperties = createTaskUsageProperties(response.usage);
|
||||
|
||||
@@ -1,23 +1,32 @@
|
||||
import { IntegrationTaskKey, Prettify, redactString } from "@trigger.dev/sdk";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import { createTaskUsageProperties } from "./taskUtils";
|
||||
import {
|
||||
backgroundTaskRetries,
|
||||
createBackgroundFetchHeaders,
|
||||
createBackgroundFetchUrl,
|
||||
createTaskUsageProperties,
|
||||
} from "./taskUtils";
|
||||
import { OpenAIIntegrationOptions, OpenAIRequestOptions } from "./types";
|
||||
|
||||
export class Completions {
|
||||
runTask: OpenAIRunTask;
|
||||
|
||||
constructor(runTask: OpenAIRunTask) {
|
||||
this.runTask = runTask;
|
||||
}
|
||||
constructor(
|
||||
private runTask: OpenAIRunTask,
|
||||
private options: OpenAIIntegrationOptions
|
||||
) {}
|
||||
|
||||
create(
|
||||
key: IntegrationTaskKey,
|
||||
params: Prettify<OpenAI.CompletionCreateParamsNonStreaming>
|
||||
params: Prettify<OpenAI.CompletionCreateParamsNonStreaming>,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Completion> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.completions.create(params);
|
||||
const response = await client.completions.create(params, {
|
||||
idempotencyKey: task.idempotencyKey,
|
||||
...options,
|
||||
});
|
||||
task.outputProperties = createTaskUsageProperties(response.usage);
|
||||
return response;
|
||||
},
|
||||
@@ -36,41 +45,33 @@ export class Completions {
|
||||
|
||||
backgroundCreate(
|
||||
key: IntegrationTaskKey,
|
||||
params: Prettify<OpenAI.CompletionCreateParamsNonStreaming>
|
||||
params: Prettify<OpenAI.CompletionCreateParamsNonStreaming>,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Completion> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task, io) => {
|
||||
const url = createBackgroundFetchUrl(
|
||||
client,
|
||||
"/completions",
|
||||
this.options.defaultQuery,
|
||||
options
|
||||
);
|
||||
|
||||
const response = await io.backgroundFetch<OpenAI.Completion>(
|
||||
"background",
|
||||
"https://api.openai.com/v1/completions",
|
||||
url,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: redactString`Bearer ${client.apiKey}`,
|
||||
...(client.organization ? { "OpenAI-Organization": client.organization } : {}),
|
||||
},
|
||||
headers: createBackgroundFetchHeaders(
|
||||
client,
|
||||
task.idempotencyKey,
|
||||
this.options.defaultHeaders,
|
||||
options
|
||||
),
|
||||
body: JSON.stringify(params),
|
||||
},
|
||||
{
|
||||
"500-599": {
|
||||
strategy: "backoff",
|
||||
limit: 5,
|
||||
minTimeoutInMs: 1000,
|
||||
maxTimeoutInMs: 30000,
|
||||
factor: 1.8,
|
||||
randomize: true,
|
||||
},
|
||||
"429": {
|
||||
strategy: "backoff",
|
||||
limit: 10,
|
||||
minTimeoutInMs: 1000,
|
||||
maxTimeoutInMs: 60000,
|
||||
factor: 2,
|
||||
randomize: true,
|
||||
},
|
||||
}
|
||||
backgroundTaskRetries
|
||||
);
|
||||
|
||||
task.outputProperties = createTaskUsageProperties(response.usage);
|
||||
|
||||
@@ -3,6 +3,7 @@ import { IntegrationTaskKey, Prettify } from "@trigger.dev/sdk";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import { createTaskUsageProperties } from "./taskUtils";
|
||||
import { OpenAIRequestOptions } from "./types";
|
||||
|
||||
export class Edits {
|
||||
runTask: OpenAIRunTask;
|
||||
@@ -14,7 +15,11 @@ export class Edits {
|
||||
/**
|
||||
* @deprecated The Edits API is deprecated; please use Chat Completions instead.
|
||||
*/
|
||||
create(key: IntegrationTaskKey, params: Prettify<OpenAI.EditCreateParams>): Promise<OpenAI.Edit> {
|
||||
create(
|
||||
key: IntegrationTaskKey,
|
||||
params: Prettify<OpenAI.EditCreateParams>,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Edit> {
|
||||
let properties = [
|
||||
{
|
||||
label: "Model",
|
||||
@@ -37,7 +42,10 @@ export class Edits {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.edits.create(params);
|
||||
const response = await client.edits.create(params, {
|
||||
idempotencyKey: task.idempotencyKey,
|
||||
...options,
|
||||
});
|
||||
task.outputProperties = createTaskUsageProperties(response.usage);
|
||||
return response;
|
||||
},
|
||||
|
||||
@@ -2,6 +2,7 @@ import { IntegrationTaskKey } from "@trigger.dev/sdk";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import { createTaskUsageProperties } from "./taskUtils";
|
||||
import { OpenAIRequestOptions } from "./types";
|
||||
|
||||
export class Embeddings {
|
||||
runTask: OpenAIRunTask;
|
||||
@@ -12,12 +13,16 @@ export class Embeddings {
|
||||
|
||||
create(
|
||||
key: IntegrationTaskKey,
|
||||
params: OpenAI.EmbeddingCreateParams
|
||||
params: OpenAI.EmbeddingCreateParams,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Embeddings.CreateEmbeddingResponse> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.embeddings.create(params);
|
||||
const response = await client.embeddings.create(params, {
|
||||
idempotencyKey: task.idempotencyKey,
|
||||
...options,
|
||||
});
|
||||
task.outputProperties = createTaskUsageProperties(response.usage);
|
||||
return response;
|
||||
},
|
||||
|
||||
@@ -2,6 +2,7 @@ import { fileFromString } from "@trigger.dev/integration-kit";
|
||||
import { IntegrationTaskKey } from "@trigger.dev/sdk";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import { OpenAIRequestOptions } from "./types";
|
||||
|
||||
type CreateFileRequest = {
|
||||
file: string | File;
|
||||
@@ -24,7 +25,11 @@ export class Files {
|
||||
this.runTask = runTask;
|
||||
}
|
||||
|
||||
create(key: IntegrationTaskKey, params: CreateFileRequest): Promise<OpenAI.Files.FileObject> {
|
||||
create(
|
||||
key: IntegrationTaskKey,
|
||||
params: CreateFileRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Files.FileObject> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
@@ -36,7 +41,10 @@ export class Files {
|
||||
file = params.file;
|
||||
}
|
||||
|
||||
return client.files.create({ file, purpose: params.purpose });
|
||||
return client.files.create(
|
||||
{ file, purpose: params.purpose },
|
||||
{ idempotencyKey: task.idempotencyKey, ...options }
|
||||
);
|
||||
},
|
||||
{
|
||||
name: "Create file",
|
||||
@@ -55,11 +63,14 @@ export class Files {
|
||||
);
|
||||
}
|
||||
|
||||
list(key: IntegrationTaskKey): Promise<OpenAI.Files.FileObject[]> {
|
||||
list(
|
||||
key: IntegrationTaskKey,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Files.FileObject[]> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.files.list();
|
||||
const response = await client.files.list(options);
|
||||
return response.data;
|
||||
},
|
||||
{
|
||||
@@ -71,7 +82,8 @@ export class Files {
|
||||
|
||||
createFineTune(
|
||||
key: IntegrationTaskKey,
|
||||
params: CreateFineTuneFileRequest
|
||||
params: CreateFineTuneFileRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Files.FileObject> {
|
||||
return this.runTask(
|
||||
key,
|
||||
@@ -81,7 +93,10 @@ export class Files {
|
||||
params.fileName
|
||||
);
|
||||
|
||||
return client.files.create({ file, purpose: "fine-tune" });
|
||||
return client.files.create(
|
||||
{ file, purpose: "fine-tune" },
|
||||
{ idempotencyKey: task.idempotencyKey, ...options }
|
||||
);
|
||||
},
|
||||
{
|
||||
name: "Create fine tune file",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { IntegrationTaskKey } from "@trigger.dev/sdk";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import { OpenAIRequestOptions } from "./types";
|
||||
|
||||
type SpecificFineTuneRequest = {
|
||||
fineTuneId: string;
|
||||
@@ -15,7 +16,8 @@ export class FineTunes {
|
||||
|
||||
create(
|
||||
key: IntegrationTaskKey,
|
||||
params: OpenAI.FineTuneCreateParams
|
||||
params: OpenAI.FineTuneCreateParams,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTunes.FineTune> {
|
||||
let properties = [
|
||||
{
|
||||
@@ -41,7 +43,7 @@ export class FineTunes {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.fineTunes.create(params);
|
||||
return client.fineTunes.create(params, { idempotencyKey: task.idempotencyKey, ...options });
|
||||
},
|
||||
{
|
||||
name: "Create fine tune",
|
||||
@@ -51,11 +53,14 @@ export class FineTunes {
|
||||
);
|
||||
}
|
||||
|
||||
list(key: IntegrationTaskKey): Promise<OpenAI.FineTunes.FineTune[]> {
|
||||
list(
|
||||
key: IntegrationTaskKey,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTunes.FineTune[]> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.fineTunes.list();
|
||||
const response = await client.fineTunes.list(options);
|
||||
return response.data;
|
||||
},
|
||||
{
|
||||
@@ -67,12 +72,13 @@ export class FineTunes {
|
||||
|
||||
retrieve(
|
||||
key: IntegrationTaskKey,
|
||||
params: SpecificFineTuneRequest
|
||||
params: SpecificFineTuneRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTunes.FineTune> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.fineTunes.retrieve(params.fineTuneId);
|
||||
return client.fineTunes.retrieve(params.fineTuneId, options);
|
||||
},
|
||||
{
|
||||
name: "Retrieve fine tune",
|
||||
@@ -89,12 +95,16 @@ export class FineTunes {
|
||||
|
||||
cancel(
|
||||
key: IntegrationTaskKey,
|
||||
params: SpecificFineTuneRequest
|
||||
params: SpecificFineTuneRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTunes.FineTune> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.fineTunes.cancel(params.fineTuneId);
|
||||
return client.fineTunes.cancel(params.fineTuneId, {
|
||||
idempotencyKey: task.idempotencyKey,
|
||||
...options,
|
||||
});
|
||||
},
|
||||
{
|
||||
name: "Cancel fine tune",
|
||||
@@ -111,12 +121,13 @@ export class FineTunes {
|
||||
|
||||
listEvents(
|
||||
key: IntegrationTaskKey,
|
||||
params: SpecificFineTuneRequest
|
||||
params: SpecificFineTuneRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTuneEventsListResponse> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.fineTunes.listEvents(params.fineTuneId, { stream: false });
|
||||
return client.fineTunes.listEvents(params.fineTuneId, { stream: false, ...options });
|
||||
},
|
||||
{
|
||||
name: "List fine tune events",
|
||||
@@ -142,7 +153,8 @@ export class FineTunes {
|
||||
*/
|
||||
create: (
|
||||
key: IntegrationTaskKey,
|
||||
params: OpenAI.FineTuning.JobCreateParams
|
||||
params: OpenAI.FineTuning.JobCreateParams,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTuning.FineTuningJob> => {
|
||||
let properties = [
|
||||
{
|
||||
@@ -168,7 +180,10 @@ export class FineTunes {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.fineTuning.jobs.create(params);
|
||||
return client.fineTuning.jobs.create(params, {
|
||||
idempotencyKey: task.idempotencyKey,
|
||||
...options,
|
||||
});
|
||||
},
|
||||
{
|
||||
name: "Create Fine Tuning Job",
|
||||
@@ -180,12 +195,13 @@ export class FineTunes {
|
||||
|
||||
retrieve: (
|
||||
key: IntegrationTaskKey,
|
||||
params: { id: string }
|
||||
params: { id: string },
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTuning.FineTuningJob> => {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.fineTuning.jobs.retrieve(params.id);
|
||||
return client.fineTuning.jobs.retrieve(params.id, options);
|
||||
},
|
||||
{
|
||||
name: "Retrieve Fine Tuning Job",
|
||||
@@ -202,12 +218,16 @@ export class FineTunes {
|
||||
|
||||
cancel: (
|
||||
key: IntegrationTaskKey,
|
||||
params: { id: string }
|
||||
params: { id: string },
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTuning.FineTuningJob> => {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.fineTuning.jobs.cancel(params.id);
|
||||
return client.fineTuning.jobs.cancel(params.id, {
|
||||
idempotencyKey: task.idempotencyKey,
|
||||
...options,
|
||||
});
|
||||
},
|
||||
{
|
||||
name: "Cancel Fine Tuning Job",
|
||||
@@ -224,12 +244,13 @@ export class FineTunes {
|
||||
|
||||
listEvents: (
|
||||
key: IntegrationTaskKey,
|
||||
params: { id: string }
|
||||
params: { id: string },
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTuning.FineTuningJobEvent[]> => {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.fineTuning.jobs.listEvents(params.id);
|
||||
const response = await client.fineTuning.jobs.listEvents(params.id, options);
|
||||
return response.data;
|
||||
},
|
||||
{
|
||||
@@ -247,12 +268,13 @@ export class FineTunes {
|
||||
|
||||
list: (
|
||||
key: IntegrationTaskKey,
|
||||
params: OpenAI.FineTuning.JobListParams
|
||||
params: OpenAI.FineTuning.JobListParams,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.FineTuning.FineTuningJob[]> => {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
const response = await client.fineTuning.jobs.list(params);
|
||||
const response = await client.fineTuning.jobs.list(params, options);
|
||||
|
||||
return response.data;
|
||||
},
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { fileFromUrl, truncate } from "@trigger.dev/integration-kit";
|
||||
import { fileFromUrl } from "@trigger.dev/integration-kit";
|
||||
import { IntegrationTaskKey, Prettify } from "@trigger.dev/sdk";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import { createTaskUsageProperties } from "./taskUtils";
|
||||
import { OpenAIRequestOptions } from "./types";
|
||||
|
||||
export type CreateImageEditRequest = {
|
||||
image: string | File;
|
||||
@@ -31,7 +31,8 @@ export class Images {
|
||||
|
||||
generate(
|
||||
key: IntegrationTaskKey,
|
||||
params: Prettify<OpenAI.Images.ImageGenerateParams>
|
||||
params: Prettify<OpenAI.Images.ImageGenerateParams>,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Images.ImagesResponse> {
|
||||
let properties = [
|
||||
{
|
||||
@@ -64,7 +65,7 @@ export class Images {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client, task) => {
|
||||
return client.images.generate(params);
|
||||
return client.images.generate(params, { idempotencyKey: task.idempotencyKey, ...options });
|
||||
},
|
||||
{
|
||||
name: "Create image",
|
||||
@@ -76,7 +77,8 @@ export class Images {
|
||||
|
||||
edit(
|
||||
key: IntegrationTaskKey,
|
||||
params: CreateImageEditRequest
|
||||
params: CreateImageEditRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Images.ImagesResponse> {
|
||||
let properties = [];
|
||||
|
||||
@@ -121,15 +123,18 @@ export class Images {
|
||||
typeof params.image === "string" ? await fileFromUrl(params.image) : params.image;
|
||||
const mask = typeof params.mask === "string" ? await fileFromUrl(params.mask) : params.mask;
|
||||
|
||||
const response = await client.images.edit({
|
||||
image: file,
|
||||
prompt: params.prompt,
|
||||
mask: mask,
|
||||
n: params.n,
|
||||
size: params.size,
|
||||
response_format: params.response_format,
|
||||
user: params.user,
|
||||
});
|
||||
const response = await client.images.edit(
|
||||
{
|
||||
image: file,
|
||||
prompt: params.prompt,
|
||||
mask: mask,
|
||||
n: params.n,
|
||||
size: params.size,
|
||||
response_format: params.response_format,
|
||||
user: params.user,
|
||||
},
|
||||
{ idempotencyKey: task.idempotencyKey, ...options }
|
||||
);
|
||||
|
||||
return response;
|
||||
},
|
||||
@@ -143,7 +148,8 @@ export class Images {
|
||||
|
||||
createVariation(
|
||||
key: IntegrationTaskKey,
|
||||
params: CreateImageVariationRequest
|
||||
params: CreateImageVariationRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Images.ImagesResponse> {
|
||||
let properties = [];
|
||||
|
||||
@@ -182,13 +188,16 @@ export class Images {
|
||||
const file =
|
||||
typeof params.image === "string" ? await fileFromUrl(params.image) : params.image;
|
||||
|
||||
const response = await client.images.createVariation({
|
||||
image: file,
|
||||
n: params.n,
|
||||
size: params.size,
|
||||
response_format: params.response_format,
|
||||
user: params.user,
|
||||
});
|
||||
const response = await client.images.createVariation(
|
||||
{
|
||||
image: file,
|
||||
n: params.n,
|
||||
size: params.size,
|
||||
response_format: params.response_format,
|
||||
user: params.user,
|
||||
},
|
||||
{ idempotencyKey: task.idempotencyKey, ...options }
|
||||
);
|
||||
|
||||
return response;
|
||||
},
|
||||
|
||||
@@ -55,6 +55,10 @@ export class OpenAI implements TriggerIntegration {
|
||||
this.native = new OpenAIApi({
|
||||
apiKey: options.apiKey,
|
||||
organization: options.organization,
|
||||
baseURL: options.baseURL,
|
||||
defaultHeaders: options.defaultHeaders,
|
||||
defaultQuery: options.defaultQuery,
|
||||
maxRetries: 0,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -77,6 +81,10 @@ export class OpenAI implements TriggerIntegration {
|
||||
openai._client = new OpenAIApi({
|
||||
apiKey,
|
||||
organization: this._options.organization,
|
||||
baseURL: this._options.baseURL ?? "https://api.openai.com/v1",
|
||||
defaultHeaders: this._options.defaultHeaders,
|
||||
defaultQuery: this._options.defaultQuery,
|
||||
maxRetries: 0,
|
||||
});
|
||||
return openai;
|
||||
}
|
||||
@@ -104,7 +112,7 @@ export class OpenAI implements TriggerIntegration {
|
||||
return callback(this._client, task, io);
|
||||
},
|
||||
{
|
||||
icon: "openai",
|
||||
icon: this._options.icon ?? "openai",
|
||||
retry: retry.standardBackoff,
|
||||
...(options ?? {}),
|
||||
connectionKey: this._connectionKey,
|
||||
@@ -118,11 +126,11 @@ export class OpenAI implements TriggerIntegration {
|
||||
}
|
||||
|
||||
get completions() {
|
||||
return new Completions(this.runTask.bind(this));
|
||||
return new Completions(this.runTask.bind(this), this._options);
|
||||
}
|
||||
|
||||
get chat() {
|
||||
return new Chat(this.runTask.bind(this));
|
||||
return new Chat(this.runTask.bind(this), this._options);
|
||||
}
|
||||
|
||||
get edits() {
|
||||
|
||||
@@ -2,6 +2,7 @@ import { IntegrationTaskKey } from "@trigger.dev/sdk";
|
||||
import { Model } from "openai/resources";
|
||||
import { OpenAIRunTask } from "./index";
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRequestOptions } from "./types";
|
||||
|
||||
type DeleteFineTunedModelRequest = {
|
||||
fineTunedModelId: string;
|
||||
@@ -13,11 +14,15 @@ export class Models {
|
||||
this.runTask = runTask;
|
||||
}
|
||||
|
||||
retrieve(key: IntegrationTaskKey, params: { model: string }): Promise<Model> {
|
||||
retrieve(
|
||||
key: IntegrationTaskKey,
|
||||
params: { model: string },
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<Model> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client) => {
|
||||
return client.models.retrieve(params.model);
|
||||
return client.models.retrieve(params.model, options);
|
||||
},
|
||||
{
|
||||
name: "Retrieve model",
|
||||
@@ -32,11 +37,11 @@ export class Models {
|
||||
);
|
||||
}
|
||||
|
||||
list(key: IntegrationTaskKey): Promise<Model[]> {
|
||||
list(key: IntegrationTaskKey, options: OpenAIRequestOptions = {}): Promise<Model[]> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client) => {
|
||||
const result = await client.models.list();
|
||||
const result = await client.models.list(options);
|
||||
return result.data;
|
||||
},
|
||||
{
|
||||
@@ -48,12 +53,13 @@ export class Models {
|
||||
|
||||
delete(
|
||||
key: IntegrationTaskKey,
|
||||
params: DeleteFineTunedModelRequest
|
||||
params: DeleteFineTunedModelRequest,
|
||||
options: OpenAIRequestOptions = {}
|
||||
): Promise<OpenAI.Models.ModelDeleted> {
|
||||
return this.runTask(
|
||||
key,
|
||||
async (client) => {
|
||||
return client.models.del(params.fineTunedModelId);
|
||||
return client.models.del(params.fineTunedModelId, options);
|
||||
},
|
||||
{
|
||||
name: "Delete fine tune model",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import OpenAI from "openai";
|
||||
import { OpenAIRequestOptions } from "./types";
|
||||
import { redactString } from "@trigger.dev/sdk";
|
||||
|
||||
export function createTaskUsageProperties(
|
||||
usage: OpenAI.Completions.CompletionUsage | OpenAI.CreateEmbeddingResponse.Usage | undefined
|
||||
@@ -30,3 +32,80 @@ export function createTaskUsageProperties(
|
||||
export function onTaskError(error: unknown) {
|
||||
return;
|
||||
}
|
||||
|
||||
export function createBackgroundFetchUrl(
|
||||
client: OpenAI,
|
||||
endpoint: string,
|
||||
defaultQuery: OpenAIRequestOptions["query"] = {},
|
||||
options: OpenAIRequestOptions = {}
|
||||
) {
|
||||
let baseURL = client.baseURL ?? "https://api.openai.com/v1";
|
||||
if (baseURL.endsWith("/")) {
|
||||
baseURL = baseURL.slice(0, -1);
|
||||
}
|
||||
|
||||
const path = options.path ?? endpoint;
|
||||
|
||||
const url = new URL(`${baseURL}${path}`);
|
||||
|
||||
if (options.query) {
|
||||
for (const [key, value] of Object.entries(options.query)) {
|
||||
if (value !== undefined) {
|
||||
url.searchParams.append(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const [key, value] of Object.entries(defaultQuery)) {
|
||||
if (value !== undefined) {
|
||||
url.searchParams.append(key, value);
|
||||
} else {
|
||||
url.searchParams.delete(key);
|
||||
}
|
||||
}
|
||||
|
||||
return url.href;
|
||||
}
|
||||
|
||||
export function createBackgroundFetchHeaders(
|
||||
client: OpenAI,
|
||||
idempotencyKey: string,
|
||||
defaultHeaders: OpenAIRequestOptions["headers"] = {},
|
||||
options: OpenAIRequestOptions = {}
|
||||
) {
|
||||
return {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: redactString`Bearer ${client.apiKey}`,
|
||||
...(client.organization ? { "OpenAI-Organization": client.organization } : {}),
|
||||
"Idempotency-Key": options.idempotencyKey ?? idempotencyKey,
|
||||
...(options.headers ?? {}),
|
||||
...defaultHeaders,
|
||||
};
|
||||
}
|
||||
|
||||
export const backgroundTaskRetries = {
|
||||
"500-599": {
|
||||
strategy: "backoff",
|
||||
limit: 5,
|
||||
minTimeoutInMs: 1000,
|
||||
maxTimeoutInMs: 30000,
|
||||
factor: 1.8,
|
||||
randomize: true,
|
||||
},
|
||||
"429": {
|
||||
strategy: "backoff",
|
||||
limit: 10,
|
||||
minTimeoutInMs: 1000,
|
||||
maxTimeoutInMs: 60000,
|
||||
factor: 2,
|
||||
randomize: true,
|
||||
},
|
||||
"408-409": {
|
||||
strategy: "backoff",
|
||||
limit: 3,
|
||||
minTimeoutInMs: 1000,
|
||||
maxTimeoutInMs: 60000,
|
||||
factor: 2,
|
||||
randomize: true,
|
||||
},
|
||||
} as const;
|
||||
|
||||
@@ -1,7 +1,37 @@
|
||||
type OpenAIHTTPMethod = "get" | "post" | "put" | "patch" | "delete";
|
||||
type OpenAIHeaders = Record<string, string | null | undefined>;
|
||||
type OpenAIQuery = Record<string, string | undefined>;
|
||||
|
||||
export type OpenAIIntegrationOptions = {
|
||||
id: string;
|
||||
apiKey?: string;
|
||||
organization?: string;
|
||||
baseURL?: string;
|
||||
icon?: string;
|
||||
|
||||
/**
|
||||
* Default headers to include with every request to the API.
|
||||
*
|
||||
* These can be removed in individual requests by explicitly setting the
|
||||
* header to `undefined` or `null` in request options.
|
||||
*/
|
||||
defaultHeaders?: OpenAIHeaders;
|
||||
|
||||
/**
|
||||
* Default query parameters to include with every request to the API.
|
||||
*
|
||||
* These can be removed in individual requests by explicitly setting the
|
||||
* param to `undefined` in request options.
|
||||
*/
|
||||
defaultQuery?: OpenAIQuery;
|
||||
};
|
||||
|
||||
export type OpenAIIntegrationAuth = Omit<OpenAIIntegrationOptions, "id">;
|
||||
|
||||
export type OpenAIRequestOptions = {
|
||||
method?: OpenAIHTTPMethod;
|
||||
query?: OpenAIQuery;
|
||||
path?: string;
|
||||
headers?: OpenAIHeaders;
|
||||
idempotencyKey?: string;
|
||||
};
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/plain
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/plain",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "The official Plain.com integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -24,8 +24,8 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"@team-plain/typescript-sdk": "^2.7.0"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/replicate
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/replicate",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev integration for replicate",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -26,8 +26,8 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"replicate": "^0.18.1",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/resend
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/resend",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "The official Resend.com integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -24,8 +24,8 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"resend": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/sendgrid
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/sendgrid",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev integration for @sendgrid/mail",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -27,8 +27,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@sendgrid/mail": "^7.7.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0"
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.8.0"
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @trigger.dev/slack
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/slack",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "The official Slack integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@slack/web-api": "^6.8.1",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/stripe
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/stripe",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev integration for stripe",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -26,8 +26,8 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"stripe": "^12.14.0",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/supabase
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/supabase",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev integration for @supabase/supabase-js",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -27,8 +27,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@supabase/supabase-js": "^2.26.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"supabase-management-js": "^0.1.4",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/typeform
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/integration-kit@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/typeform",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "The official Typeform integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -25,8 +25,8 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^2.2.2",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"@typeform/api-client": "^1.8.0",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @trigger.dev/astro
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@trigger.dev/astro",
|
||||
"description": "An Astro-native integration for Trigger.dev background jobs platform",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
"files": [
|
||||
@@ -20,7 +20,7 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0"
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"astro": "^3.0.12",
|
||||
|
||||
@@ -1,5 +1,23 @@
|
||||
# create-trigger
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/core@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 6769d6b4: Detects JSRuntime (Node/Deno at the moment). Adds basic Deno support
|
||||
- 9df93d07: Improve create-integration output. Use templates and shared configs.
|
||||
- 50e31924: add ability to use custom tunnel in dev command
|
||||
- 0adf41c7: Added Next.js `maxDuration` commented out to the api/trigger file using CLI init
|
||||
- Updated dependencies [044d38e3]
|
||||
- Updated dependencies [abc9737a]
|
||||
- @trigger.dev/core@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/cli",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "The Trigger.dev CLI",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# internal-platform
|
||||
|
||||
## 2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 044d38e3: Auto-yield run execution to help prevent duplicate task executions
|
||||
- abc9737a: Updated icon documentation in runTasks
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/core",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Core code used across the Trigger.dev SDK and platform",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
# @trigger.dev/eslint-plugin
|
||||
|
||||
## 2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/eslint-plugin",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "ESLint plugin with trigger.dev best practices",
|
||||
"keywords": [
|
||||
"eslint",
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @trigger.dev/express
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/express",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Official Express adapter for Trigger.dev",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
@@ -19,7 +19,7 @@
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"@trigger.dev/tsconfig": "workspace:*",
|
||||
"@types/debug": "^4.1.7",
|
||||
"@types/express": "^4.17.13",
|
||||
@@ -33,7 +33,7 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0"
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@remix-run/web-fetch": "^4.3.5",
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
# @trigger.dev/integration-kit
|
||||
|
||||
## 2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/integration-kit",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev Integration Kit has helpers to make creating integrations easier",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @trigger.dev/nestjs
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/nestjs",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Official NestJS adapter for Trigger.dev",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
@@ -19,7 +19,7 @@
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"@trigger.dev/tsconfig": "workspace:*",
|
||||
"@types/debug": "^4.1.7",
|
||||
"@types/express": "^4.17.13",
|
||||
@@ -35,7 +35,7 @@
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@nestjs/common": ">=10.0.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0"
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "^10.2.4",
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @trigger.dev/nextjs
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/nextjs",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev Next.js integration",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
@@ -34,7 +34,7 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"next": ">=12.0.0 <14.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/react
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/core@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- Updated dependencies [abc9737a]
|
||||
- @trigger.dev/core@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/react",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev React SDK",
|
||||
"license": "MIT",
|
||||
"types": "dist/index.d.ts",
|
||||
@@ -27,7 +27,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@tanstack/react-query": "5.0.0-beta.2",
|
||||
"@trigger.dev/core": "workspace:^2.2.0",
|
||||
"@trigger.dev/core": "workspace:^2.2.2",
|
||||
"debug": "^4.3.4",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @trigger.dev/remix
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/remix",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev Remix integration",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
@@ -34,7 +34,7 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0",
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2",
|
||||
"@remix-run/server-runtime": ">1.19.0"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @trigger.dev/sveltekit
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/sveltekit",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "Trigger.dev svelteKit integration",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
@@ -33,7 +33,7 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@trigger.dev/sdk": "workspace:^2.2.0"
|
||||
"@trigger.dev/sdk": "workspace:^2.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": "^4.3.4"
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
# @trigger.dev/testing
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/core@2.2.2
|
||||
- @trigger.dev/sdk@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [044d38e3]
|
||||
- Updated dependencies [abc9737a]
|
||||
- @trigger.dev/sdk@2.2.1
|
||||
- @trigger.dev/core@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@trigger.dev/testing",
|
||||
"description": "A collection of useful tools to write tests for Trigger.dev.",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @trigger.dev/sdk
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/core@2.2.2
|
||||
|
||||
## 2.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 044d38e3: Auto-yield run execution to help prevent duplicate task executions
|
||||
- Updated dependencies [044d38e3]
|
||||
- Updated dependencies [abc9737a]
|
||||
- @trigger.dev/core@2.2.1
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/sdk",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.2",
|
||||
"description": "trigger.dev Node.JS SDK",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
@@ -25,7 +25,7 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/core": "workspace:^2.2.0",
|
||||
"@trigger.dev/core": "workspace:^2.2.2",
|
||||
"chalk": "^5.2.0",
|
||||
"cronstrue": "^2.21.0",
|
||||
"debug": "^4.3.4",
|
||||
|
||||
Generated
+35
-32
@@ -376,8 +376,8 @@ importers:
|
||||
|
||||
integrations/airtable:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': 16.x
|
||||
airtable: ^0.12.1
|
||||
@@ -404,8 +404,8 @@ importers:
|
||||
'@octokit/types': ^9.2.3
|
||||
'@octokit/webhooks': ^10.4.0
|
||||
'@octokit/webhooks-types': ^6.10.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
octokit: ^2.0.14
|
||||
@@ -431,8 +431,8 @@ importers:
|
||||
integrations/linear:
|
||||
specifiers:
|
||||
'@linear/sdk': ^8.0.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': 16.x
|
||||
rimraf: ^3.0.2
|
||||
@@ -453,28 +453,30 @@ importers:
|
||||
|
||||
integrations/openai:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
openai: ^4.2.0
|
||||
openai: ^4.13.0
|
||||
rimraf: ^3.0.2
|
||||
tsup: ^6.5.0
|
||||
typescript: ^4.9.4
|
||||
dependencies:
|
||||
'@trigger.dev/integration-kit': link:../../packages/integration-kit
|
||||
'@trigger.dev/sdk': link:../../packages/trigger-sdk
|
||||
openai: 4.2.0
|
||||
openai: 4.13.0
|
||||
devDependencies:
|
||||
'@trigger.dev/tsconfig': link:../../config-packages/tsconfig
|
||||
'@types/node': 18.15.13
|
||||
rimraf: 3.0.2
|
||||
tsup: 6.6.3
|
||||
tsup: 6.6.3_typescript@4.9.5
|
||||
typescript: 4.9.5
|
||||
|
||||
integrations/plain:
|
||||
specifiers:
|
||||
'@team-plain/typescript-sdk': ^2.7.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
rimraf: ^3.0.2
|
||||
@@ -491,8 +493,8 @@ importers:
|
||||
|
||||
integrations/replicate:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': 16.x
|
||||
replicate: ^0.18.1
|
||||
@@ -514,8 +516,8 @@ importers:
|
||||
|
||||
integrations/resend:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
resend: ^1.0.0
|
||||
@@ -534,8 +536,8 @@ importers:
|
||||
integrations/sendgrid:
|
||||
specifiers:
|
||||
'@sendgrid/mail': ^7.7.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': 16.x
|
||||
rimraf: ^3.0.2
|
||||
@@ -555,7 +557,7 @@ importers:
|
||||
integrations/slack:
|
||||
specifiers:
|
||||
'@slack/web-api': ^6.8.1
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
rimraf: ^3.0.2
|
||||
@@ -573,8 +575,8 @@ importers:
|
||||
|
||||
integrations/stripe:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@types/node': 16.x
|
||||
rimraf: ^3.0.2
|
||||
stripe: ^12.14.0
|
||||
@@ -597,8 +599,8 @@ importers:
|
||||
integrations/supabase:
|
||||
specifiers:
|
||||
'@supabase/supabase-js': ^2.26.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': 18.x
|
||||
rimraf: ^3.0.2
|
||||
@@ -621,8 +623,8 @@ importers:
|
||||
|
||||
integrations/typeform:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.2.2
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@typeform/api-client': ^1.8.0
|
||||
'@types/node': 16.x
|
||||
rimraf: ^3.0.2
|
||||
@@ -857,7 +859,7 @@ importers:
|
||||
packages/express:
|
||||
specifiers:
|
||||
'@remix-run/web-fetch': ^4.3.5
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/debug': ^4.1.7
|
||||
'@types/express': ^4.17.13
|
||||
@@ -904,7 +906,7 @@ importers:
|
||||
specifiers:
|
||||
'@nestjs/common': ^10.2.4
|
||||
'@remix-run/web-fetch': ^4.3.5
|
||||
'@trigger.dev/sdk': workspace:^2.2.0
|
||||
'@trigger.dev/sdk': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/debug': ^4.1.7
|
||||
'@types/express': ^4.17.13
|
||||
@@ -953,7 +955,7 @@ importers:
|
||||
packages/react:
|
||||
specifiers:
|
||||
'@tanstack/react-query': 5.0.0-beta.2
|
||||
'@trigger.dev/core': workspace:^2.2.0
|
||||
'@trigger.dev/core': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/debug': ^4.1.7
|
||||
'@types/react': 18.2.17
|
||||
@@ -1048,7 +1050,7 @@ importers:
|
||||
|
||||
packages/trigger-sdk:
|
||||
specifiers:
|
||||
'@trigger.dev/core': workspace:^2.2.0
|
||||
'@trigger.dev/core': workspace:^2.2.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/debug': ^4.1.7
|
||||
'@types/node': '18'
|
||||
@@ -25374,8 +25376,8 @@ packages:
|
||||
is-docker: 2.2.1
|
||||
is-wsl: 2.2.0
|
||||
|
||||
/openai/4.2.0:
|
||||
resolution: {integrity: sha512-zfvpO2eITIxIjTG8T6Cek7NB2dMvP/LW0TRUJ4P9E8+qbBNKw00DrtfF64b+fAV2+wUYCVyynT6iSycJ//TtbA==}
|
||||
/openai/4.13.0:
|
||||
resolution: {integrity: sha512-EPqHcB0got9cXDZmQae1KytgA4YWtTnUc7tV8hlahZtcO70DMa4kiaXoxnutj9lwmeKQO7ntG+6pmXtrCMejuQ==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
'@types/node': 18.17.1
|
||||
@@ -25386,6 +25388,7 @@ packages:
|
||||
form-data-encoder: 1.7.2
|
||||
formdata-node: 4.4.1
|
||||
node-fetch: 2.6.12
|
||||
web-streams-polyfill: 3.2.1
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
dev: false
|
||||
|
||||
@@ -15,7 +15,7 @@ client.defineJob({
|
||||
name: "Test background fetch retry",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "test.background-fetch",
|
||||
name: "test.background-fetch.retry",
|
||||
schema: z.object({
|
||||
url: z.string(),
|
||||
method: z.string().optional(),
|
||||
@@ -38,4 +38,19 @@ client.defineJob({
|
||||
},
|
||||
});
|
||||
|
||||
client.defineJob({
|
||||
id: "test-background-fetch",
|
||||
name: "Test background fetch",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "test.background-fetch",
|
||||
schema: z.object({
|
||||
url: z.string(),
|
||||
}),
|
||||
}),
|
||||
run: async (payload, io, ctx) => {
|
||||
return await io.backgroundFetch<any>("fetch", payload.url);
|
||||
},
|
||||
});
|
||||
|
||||
createExpressServer(client);
|
||||
|
||||
@@ -13,6 +13,7 @@ export const client = new TriggerClient({
|
||||
const openai = new OpenAI({
|
||||
id: "openai",
|
||||
apiKey: process.env["OPENAI_API_KEY"]!,
|
||||
defaultHeaders: { "user-agent": "trigger.dev job-catalog reference 1.0" },
|
||||
});
|
||||
|
||||
client.defineJob({
|
||||
@@ -34,7 +35,7 @@ client.defineJob({
|
||||
});
|
||||
}
|
||||
|
||||
await io.openai.backgroundCreateChatCompletion("background-chat-completion", {
|
||||
await io.openai.chat.completions.backgroundCreate("background-chat-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
messages: [
|
||||
{
|
||||
@@ -44,7 +45,7 @@ client.defineJob({
|
||||
],
|
||||
});
|
||||
|
||||
await io.openai.createChatCompletion("chat-completion", {
|
||||
await io.openai.chat.completions.create("chat-completion", {
|
||||
model: "gpt-3.5-turbo",
|
||||
messages: [
|
||||
{
|
||||
@@ -54,12 +55,12 @@ client.defineJob({
|
||||
],
|
||||
});
|
||||
|
||||
await io.openai.backgroundCreateCompletion("background-completion", {
|
||||
await io.openai.completions.backgroundCreate("background-completion", {
|
||||
model: "text-davinci-003",
|
||||
prompt: "Create a good programming joke about Tasks",
|
||||
});
|
||||
|
||||
await io.openai.createCompletion("completion", {
|
||||
await io.openai.completions.create("completion", {
|
||||
model: "text-davinci-003",
|
||||
prompt: "Create a good programming joke about Tasks",
|
||||
});
|
||||
@@ -77,4 +78,94 @@ client.defineJob({
|
||||
},
|
||||
});
|
||||
|
||||
const perplexity = new OpenAI({
|
||||
id: "perplexity",
|
||||
apiKey: process.env["PERPLEXITY_API_KEY"]!,
|
||||
baseURL: "https://api.perplexity.ai",
|
||||
icon: "brand-open-source",
|
||||
});
|
||||
|
||||
client.defineJob({
|
||||
id: "perplexity-tasks",
|
||||
name: "Perplexity Tasks",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "perplexity.tasks",
|
||||
}),
|
||||
integrations: {
|
||||
perplexity,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
await io.perplexity.chat.completions.create("chat-completion", {
|
||||
model: "mistral-7b-instruct",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: "Create a good programming joke about background jobs",
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
await io.perplexity.chat.completions.backgroundCreate("background-chat-completion", {
|
||||
model: "mistral-7b-instruct",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: "If you were a programming language, what would you be and why?",
|
||||
},
|
||||
],
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const azureOpenAI = new OpenAI({
|
||||
id: "azure-openai",
|
||||
apiKey: process.env["AZURE_API_KEY"]!,
|
||||
icon: "brand-azure",
|
||||
baseURL: "https://my-resource.openai.azure.com/openai/deployments/my-gpt35-16k-deployment",
|
||||
defaultQuery: { "api-version": "2023-06-01-preview" },
|
||||
defaultHeaders: { "api-key": process.env["AZURE_API_KEY"] },
|
||||
});
|
||||
|
||||
client.defineJob({
|
||||
id: "azure-tasks",
|
||||
name: "azure Tasks",
|
||||
version: "0.0.1",
|
||||
trigger: eventTrigger({
|
||||
name: "azure.tasks",
|
||||
}),
|
||||
integrations: {
|
||||
azureOpenAI,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
await io.azureOpenAI.chat.completions.create(
|
||||
"chat-completion",
|
||||
{
|
||||
model: "my-gpt35-16k-deployment",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: "Create a good programming joke about background jobs",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
headers: {
|
||||
"User-Agent": "Trigger.dev",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
await io.azureOpenAI.chat.completions.backgroundCreate("background-chat-completion", {
|
||||
model: "my-gpt35-16k-deployment",
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: "If you were a programming language, what would you be and why?",
|
||||
},
|
||||
],
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
createExpressServer(client);
|
||||
|
||||
Reference in New Issue
Block a user