Merge remote-tracking branch 'origin/main' into feat/triggers-v2
🚀 Publish Trigger.dev Docker / e2e (push) Failing after 4s
🚀 Publish Trigger.dev Docker / typecheck (push) Failing after 20s
🚀 Publish Trigger.dev Docker / units (push) Failing after 19s
🚀 Publish Trigger.dev Docker / publish (push) Has been skipped

This commit is contained in:
Matt Aitken
2023-10-24 18:11:14 +01:00
82 changed files with 1718 additions and 670 deletions
-6
View File
@@ -1,6 +0,0 @@
---
"@trigger.dev/sdk": patch
"@trigger.dev/core": patch
---
Auto-yield run execution to help prevent duplicate task executions
-5
View File
@@ -1,5 +0,0 @@
---
"@trigger.dev/cli": patch
---
Detects JSRuntime (Node/Deno at the moment). Adds basic Deno support
-5
View File
@@ -1,5 +0,0 @@
---
"@trigger.dev/cli": patch
---
Improve create-integration output. Use templates and shared configs.
-5
View File
@@ -1,5 +0,0 @@
---
"@trigger.dev/cli": patch
---
add ability to use custom tunnel in dev command
-5
View File
@@ -1,5 +0,0 @@
---
"@trigger.dev/core": patch
---
Updated icon documentation in runTasks
-5
View File
@@ -1,5 +0,0 @@
---
"@trigger.dev/cli": patch
---
Added Next.js `maxDuration` commented out to the api/trigger file using CLI init
-5
View File
@@ -1,5 +0,0 @@
---
"@trigger.dev/airtable": patch
---
Export Base and Table
+1 -1
View File
@@ -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._
+65 -68
View File
@@ -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

+159
View File
@@ -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 thats 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)
);
},
});
```
+22 -83
View File
@@ -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>
+511
View File
@@ -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);
```
+44 -247
View File
@@ -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);
},
});
```
![Perplexity.ai logs](/images/perplexity.png)
+22 -5
View File
@@ -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 thats 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
View File
@@ -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": [
+16
View File
@@ -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
+3 -3
View File
@@ -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"
},
+15
View File
@@ -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
+3 -3
View File
@@ -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"
},
+15
View File
@@ -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
+3 -3
View File
@@ -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": {
+17
View File
@@ -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
+9 -7
View File
@@ -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"
}
}
+36 -31
View File
@@ -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);
+34 -33
View File
@@ -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);
+10 -2
View File
@@ -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;
},
+7 -2
View File
@@ -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;
},
+21 -6
View File
@@ -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",
+42 -20
View 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;
},
+31 -22
View File
@@ -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;
},
+11 -3
View File
@@ -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() {
+12 -6
View File
@@ -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",
+79
View File
@@ -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;
+30
View File
@@ -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;
};
+15
View File
@@ -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
+3 -3
View File
@@ -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": {
+15
View File
@@ -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
+3 -3
View File
@@ -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"
},
+15
View File
@@ -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
+3 -3
View File
@@ -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": {
+15
View File
@@ -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
+3 -3
View File
@@ -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"
+13
View File
@@ -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
+2 -2
View File
@@ -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": {
+15
View File
@@ -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
+3 -3
View File
@@ -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"
},
+15
View File
@@ -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
+3 -3
View File
@@ -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"
},
+15
View File
@@ -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
+3 -3
View File
@@ -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"
},
+13
View File
@@ -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
+2 -2
View File
@@ -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",
+18
View File
@@ -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 -1
View File
@@ -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",
+9
View File
@@ -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 -1
View File
@@ -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",
+4
View File
@@ -1,5 +1,9 @@
# @trigger.dev/eslint-plugin
## 2.2.2
## 2.2.1
## 2.2.0
### Minor Changes
+1 -1
View File
@@ -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",
+13
View File
@@ -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
+3 -3
View File
@@ -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",
+4
View File
@@ -1,5 +1,9 @@
# @trigger.dev/integration-kit
## 2.2.2
## 2.2.1
## 2.2.0
### Minor Changes
+1 -1
View File
@@ -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",
+13
View File
@@ -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
+3 -3
View File
@@ -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",
+13
View File
@@ -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
+2 -2
View File
@@ -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": {
+14
View File
@@ -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
+2 -2
View File
@@ -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"
},
+13
View File
@@ -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
+2 -2
View File
@@ -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": {
+13
View File
@@ -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
+2 -2
View File
@@ -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"
+16
View File
@@ -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 -1
View File
@@ -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",
+15
View File
@@ -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
+2 -2
View File
@@ -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",
+35 -32
View File
@@ -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
+16 -1
View File
@@ -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);
+95 -4
View File
@@ -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);