diff --git a/.changeset/cyan-brooms-cheat.md b/.changeset/cyan-brooms-cheat.md deleted file mode 100644 index 5d3b310fa..000000000 --- a/.changeset/cyan-brooms-cheat.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Auto-yield run execution to help prevent duplicate task executions diff --git a/.changeset/famous-files-talk.md b/.changeset/famous-files-talk.md deleted file mode 100644 index dad0a1a34..000000000 --- a/.changeset/famous-files-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/cli": patch ---- - -Detects JSRuntime (Node/Deno at the moment). Adds basic Deno support diff --git a/.changeset/gorgeous-panthers-run.md b/.changeset/gorgeous-panthers-run.md deleted file mode 100644 index 63a677380..000000000 --- a/.changeset/gorgeous-panthers-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/cli": patch ---- - -Improve create-integration output. Use templates and shared configs. diff --git a/.changeset/orange-cows-tease.md b/.changeset/orange-cows-tease.md deleted file mode 100644 index a37f2ee7a..000000000 --- a/.changeset/orange-cows-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/cli": patch ---- - -add ability to use custom tunnel in dev command diff --git a/.changeset/slimy-moles-smash.md b/.changeset/slimy-moles-smash.md deleted file mode 100644 index 8dea53715..000000000 --- a/.changeset/slimy-moles-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Updated icon documentation in runTasks diff --git a/.changeset/twenty-mangos-hide.md b/.changeset/twenty-mangos-hide.md deleted file mode 100644 index 32ee48b9d..000000000 --- a/.changeset/twenty-mangos-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/cli": patch ---- - -Added Next.js `maxDuration` commented out to the api/trigger file using CLI init diff --git a/.changeset/warm-elephants-battle.md b/.changeset/warm-elephants-battle.md deleted file mode 100644 index 58e9abcd5..000000000 --- a/.changeset/warm-elephants-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/airtable": patch ---- - -Export Base and Table diff --git a/README.md b/README.md index 67aacddea..22e80d7ad 100644 --- a/README.md +++ b/README.md @@ -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._ diff --git a/apps/webapp/app/routes/admin._index.tsx b/apps/webapp/app/routes/admin._index.tsx index 3b98900e6..419a5e755 100644 --- a/apps/webapp/app/routes/admin._index.tsx +++ b/apps/webapp/app/routes/admin._index.tsx @@ -37,76 +37,73 @@ export default function AdminDashboardRoute() { const { users } = useTypedLoaderData(); return ( -
- {/* Primary column */} -
-

Accounts ({users.length})

+
+

Accounts ({users.length})

- - - - - - - - - - - - - {users.map((user) => { - return ( - - - + + + + + + + + + + + {users.map((user) => { + return ( + + + + + + + - - - - - - ); - })} - -
- Email - - GitHub username - - id - - Created At - - Admin? - - Actions -
{user.email} - +
+ Email + + GitHub username + + id + + Created At + + Admin? + + Actions +
{user.email} + + {user.displayName} + + {user.id}{user.createdAt.toISOString()}{user.admin ? "βœ…" : ""} +
+ + +
{user.id}{user.createdAt.toISOString()}{user.admin ? "βœ…" : ""} - - - - - -
-
+ Impersonate + + + + + ); + })} + +
); } diff --git a/apps/webapp/app/services/endpoints/performEndpointIndexService.ts b/apps/webapp/app/services/endpoints/performEndpointIndexService.ts index 556a8526a..775625eb8 100644 --- a/apps/webapp/app/services/endpoints/performEndpointIndexService.ts +++ b/apps/webapp/app/services/endpoints/performEndpointIndexService.ts @@ -113,7 +113,7 @@ export class PerformEndpointIndexService { return updateEndpointIndexWithError(this.#prismaClient, id, { message: friendlyError, - raw: bodyResult.error.issues, + raw: fromZodError(bodyResult.error).message, }); } diff --git a/apps/webapp/app/services/tasks/performTaskOperation.server.ts b/apps/webapp/app/services/tasks/performTaskOperation.server.ts index 987cb56fa..eaf74b197 100644 --- a/apps/webapp/app/services/tasks/performTaskOperation.server.ts +++ b/apps/webapp/app/services/tasks/performTaskOperation.server.ts @@ -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, output: any) { + async #resumeTask(task: NonNullable, 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, + }, + }, + }, }, }); diff --git a/docs/images/perplexity.png b/docs/images/perplexity.png new file mode 100644 index 000000000..557c8fa44 Binary files /dev/null and b/docs/images/perplexity.png differ diff --git a/docs/integrations/apis/airtable-tasks.mdx b/docs/integrations/apis/airtable-tasks.mdx new file mode 100644 index 000000000..a9c9ff2b8 --- /dev/null +++ b/docs/integrations/apis/airtable-tasks.mdx @@ -0,0 +1,159 @@ +--- +title: Airtable tasks +sidebarTitle: Tasks +--- + +Tasks are executed after the job is triggered and are the main building blocks of a job. You can string together as many tasks as you want. + +--- + +## All tasks + +### `base.table.getRecords` + +Gets multiple records for a table. You can filter. [Official Airtable Docs](https://airtable.com/developers/web/api/update-multiple-records). + +```ts example.ts +// Gets multiple records from the table. +// Here we only get the Status fields (columns) +await table.getRecords("multiple records", { + fields: ["Status"], +}); +``` + +### `base.table.getRecord` + +Gets a single record (using the id) for a table. [Official Airtable Docs](https://airtable.com/developers/web/api/get-record). + +```ts example.ts +// Get a single record using the ID of the first record in the fetched records. +await table.getRecord("single", records[0].id); +``` + +### `base.table.createRecords` + +Create one or more records in a table. [Official Airtable Docs](https://airtable.com/developers/web/api/create-records). + +```ts example.ts +// Create newRecords by adding a record to the table. +await table.createRecords("create records", [ + { + // Define the new record to be created + // with field values for "Launch goals" and "Status." + fields: { + "Launch goals": "Created from Trigger.dev", + Status: "In progress", + }, + }, +]); +``` + +### `base.table.updateRecords` + +Update one or more records in a table. [Official Airtable Docs](https://airtable.com/developers/web/api/update-record). + +```ts example.ts +// Update the record that was just created. +await table.updateRecords( + // Specify the table's name as "update records." + "update records", + // Use the `map` method to create an array of records to be updated. + newRecords.map((record) => ({ + // For each record, specify the: ID and the field to update ("Status" to "At risk"). + id: record.id, + fields: { + Status: "At risk", + }, + })) +); +``` + +### `base.table.deleteRecords` + +Delete one or more records in a table (using ids). [Official Airtable Docs](https://airtable.com/developers/web/api/delete-record). + +```ts example.ts +// Delete records from the table. +await table.deleteRecords( + // Specify the table's name as "delete records." + "delete records" +); +``` + +### `runTask` + +Do anything that’s possible with the official Airtable Node SDK. + +## Example Usage + +You can optionally add the types for your Table – this gives you nice type inference and errors when writing your code. + +```ts +// This is the type definition for my Table +type LaunchGoalsAndOkRs = { + "Launch goals"?: string; + DRI?: Collaborator; + Team?: string; + Status?: "On track" | "In progress" | "At risk"; + "Key results"?: Array; + "Features (from πŸ’» Features table)"?: Array; + "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("") gives you nice type inference and errors + // You can leave it out as well table("") + const table = io.airtable.base("").table(""); + + // 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) + ); + }, +}); +``` diff --git a/docs/integrations/apis/airtable.mdx b/docs/integrations/apis/airtable.mdx index 563de2e37..5603bbc27 100644 --- a/docs/integrations/apis/airtable.mdx +++ b/docs/integrations/apis/airtable.mdx @@ -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. - +For examples of some of the things you can do with it, check out our Jobs Showcase: + + + Check out pre-built Airtable jobs in our showcase. + ## 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; - "Features (from πŸ’» Features table)"?: Array; - "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("") gives you nice type inference and errors - //you can leave it out as well table("") - const table = io.airtable.base("").table(""); - - //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. + + + + Perform tasks such as creating / updating / deleting single or multiple records in table. + + diff --git a/docs/integrations/apis/openai-tasks.mdx b/docs/integrations/apis/openai-tasks.mdx new file mode 100644 index 000000000..d372bba8f --- /dev/null +++ b/docs/integrations/apis/openai-tasks.mdx @@ -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); +``` diff --git a/docs/integrations/apis/openai.mdx b/docs/integrations/apis/openai.mdx index c78cf41c5..bef359982 100644 --- a/docs/integrations/apis/openai.mdx +++ b/docs/integrations/apis/openai.mdx @@ -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 - +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 + + Check out pre-built OpenAI jobs in our showcase. + -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 @@ -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. + + + + Perform different AI-powered tasks using OpenAI. + + + +## 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) diff --git a/docs/integrations/apis/slack-tasks.mdx b/docs/integrations/apis/slack-tasks.mdx index 863dc4a04..f8c6f21ff 100644 --- a/docs/integrations/apis/slack-tasks.mdx +++ b/docs/integrations/apis/slack-tasks.mdx @@ -23,7 +23,11 @@ await io.slack.postMessage("post message", { }); ``` -## Example Usage +## Using the underlying client + +If we don't have the task you need listed above, you can use `io.slack.runTask()` function, which lets you do anything that’s possible with the official Slack Node SDK. More information [here](/documentation/concepts/tasks#using-io-integration-runtask). + +Example usage: ```ts client.defineJob({ @@ -32,15 +36,28 @@ client.defineJob({ version: "1.0.0", trigger: eventTrigger({ name: "send.slack.message", - schema: z.object({}), + schema: z.object({ + message: z.string, + }), }), integrations: { slack, }, run: async (payload, io, ctx) => { - const response = await io.slack.postMessage("post message", { - channel: "", - text: "", + // 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, + }); }); }, }); diff --git a/docs/mint.json b/docs/mint.json index 93780c3dc..58228c57e 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -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": [ diff --git a/integrations/airtable/CHANGELOG.md b/integrations/airtable/CHANGELOG.md index ba4997aab..2bf27b3d6 100644 --- a/integrations/airtable/CHANGELOG.md +++ b/integrations/airtable/CHANGELOG.md @@ -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 diff --git a/integrations/airtable/package.json b/integrations/airtable/package.json index 403c2bf95..1679d58e9 100644 --- a/integrations/airtable/package.json +++ b/integrations/airtable/package.json @@ -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" }, diff --git a/integrations/github/CHANGELOG.md b/integrations/github/CHANGELOG.md index 405bcc8c9..800d3f703 100644 --- a/integrations/github/CHANGELOG.md +++ b/integrations/github/CHANGELOG.md @@ -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 diff --git a/integrations/github/package.json b/integrations/github/package.json index d9d9f641d..50a8adfbe 100644 --- a/integrations/github/package.json +++ b/integrations/github/package.json @@ -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" }, diff --git a/integrations/linear/CHANGELOG.md b/integrations/linear/CHANGELOG.md index 25c7d6a61..568fc8c4d 100644 --- a/integrations/linear/CHANGELOG.md +++ b/integrations/linear/CHANGELOG.md @@ -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 diff --git a/integrations/linear/package.json b/integrations/linear/package.json index 909c88ee3..837204763 100644 --- a/integrations/linear/package.json +++ b/integrations/linear/package.json @@ -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": { diff --git a/integrations/openai/CHANGELOG.md b/integrations/openai/CHANGELOG.md index c9fdbb7df..3b2bea7d9 100644 --- a/integrations/openai/CHANGELOG.md +++ b/integrations/openai/CHANGELOG.md @@ -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 diff --git a/integrations/openai/package.json b/integrations/openai/package.json index ccd647c9d..dbd31854b 100644 --- a/integrations/openai/package.json +++ b/integrations/openai/package.json @@ -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" } } \ No newline at end of file diff --git a/integrations/openai/src/chat.ts b/integrations/openai/src/chat.ts index 2cabd4c2a..8c05ab8e7 100644 --- a/integrations/openai/src/chat.ts +++ b/integrations/openai/src/chat.ts @@ -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 + params: Prettify, + options: OpenAIRequestOptions = {} ): Promise => { 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 + params: Prettify, + options: OpenAIRequestOptions = {} ): Promise => { return this.runTask( key, async (client, task, io) => { + const url = createBackgroundFetchUrl( + client, + "/chat/completions", + this.options.defaultQuery, + options + ); + const response = await io.backgroundFetch( "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); diff --git a/integrations/openai/src/completions.ts b/integrations/openai/src/completions.ts index 952fcbac5..0d4198b57 100644 --- a/integrations/openai/src/completions.ts +++ b/integrations/openai/src/completions.ts @@ -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 + params: Prettify, + options: OpenAIRequestOptions = {} ): Promise { 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 + params: Prettify, + options: OpenAIRequestOptions = {} ): Promise { return this.runTask( key, async (client, task, io) => { + const url = createBackgroundFetchUrl( + client, + "/completions", + this.options.defaultQuery, + options + ); + const response = await io.backgroundFetch( "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); diff --git a/integrations/openai/src/edits.ts b/integrations/openai/src/edits.ts index 63c28d0fe..4ba2856e5 100644 --- a/integrations/openai/src/edits.ts +++ b/integrations/openai/src/edits.ts @@ -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): Promise { + create( + key: IntegrationTaskKey, + params: Prettify, + options: OpenAIRequestOptions = {} + ): Promise { 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; }, diff --git a/integrations/openai/src/embeddings.ts b/integrations/openai/src/embeddings.ts index 357bffc6d..ef322476a 100644 --- a/integrations/openai/src/embeddings.ts +++ b/integrations/openai/src/embeddings.ts @@ -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 { 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; }, diff --git a/integrations/openai/src/files.ts b/integrations/openai/src/files.ts index bc6f03d34..a67276e51 100644 --- a/integrations/openai/src/files.ts +++ b/integrations/openai/src/files.ts @@ -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 { + create( + key: IntegrationTaskKey, + params: CreateFileRequest, + options: OpenAIRequestOptions = {} + ): Promise { 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 { + list( + key: IntegrationTaskKey, + options: OpenAIRequestOptions = {} + ): Promise { 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 { 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", diff --git a/integrations/openai/src/fineTunes.ts b/integrations/openai/src/fineTunes.ts index 5f89c669b..c103517ae 100644 --- a/integrations/openai/src/fineTunes.ts +++ b/integrations/openai/src/fineTunes.ts @@ -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 { 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 { + list( + key: IntegrationTaskKey, + options: OpenAIRequestOptions = {} + ): Promise { 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 { 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 { 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 { 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 => { 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 => { 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 => { 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 => { 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 => { 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; }, diff --git a/integrations/openai/src/images.ts b/integrations/openai/src/images.ts index 57ec44cbd..0a2b839d4 100644 --- a/integrations/openai/src/images.ts +++ b/integrations/openai/src/images.ts @@ -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 + params: Prettify, + options: OpenAIRequestOptions = {} ): Promise { 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 { 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 { 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; }, diff --git a/integrations/openai/src/index.ts b/integrations/openai/src/index.ts index 4f3e2283c..ce20ccacf 100644 --- a/integrations/openai/src/index.ts +++ b/integrations/openai/src/index.ts @@ -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() { diff --git a/integrations/openai/src/models.ts b/integrations/openai/src/models.ts index 7f1d37282..cc0afc057 100644 --- a/integrations/openai/src/models.ts +++ b/integrations/openai/src/models.ts @@ -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 { + retrieve( + key: IntegrationTaskKey, + params: { model: string }, + options: OpenAIRequestOptions = {} + ): Promise { 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 { + list(key: IntegrationTaskKey, options: OpenAIRequestOptions = {}): Promise { 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 { return this.runTask( key, async (client) => { - return client.models.del(params.fineTunedModelId); + return client.models.del(params.fineTunedModelId, options); }, { name: "Delete fine tune model", diff --git a/integrations/openai/src/taskUtils.ts b/integrations/openai/src/taskUtils.ts index 9dca5a858..4689f5b4e 100644 --- a/integrations/openai/src/taskUtils.ts +++ b/integrations/openai/src/taskUtils.ts @@ -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; diff --git a/integrations/openai/src/types.ts b/integrations/openai/src/types.ts index 481bf224d..fabc24d71 100644 --- a/integrations/openai/src/types.ts +++ b/integrations/openai/src/types.ts @@ -1,7 +1,37 @@ +type OpenAIHTTPMethod = "get" | "post" | "put" | "patch" | "delete"; +type OpenAIHeaders = Record; +type OpenAIQuery = Record; + 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; + +export type OpenAIRequestOptions = { + method?: OpenAIHTTPMethod; + query?: OpenAIQuery; + path?: string; + headers?: OpenAIHeaders; + idempotencyKey?: string; +}; diff --git a/integrations/plain/CHANGELOG.md b/integrations/plain/CHANGELOG.md index b3beded98..6966b7e8e 100644 --- a/integrations/plain/CHANGELOG.md +++ b/integrations/plain/CHANGELOG.md @@ -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 diff --git a/integrations/plain/package.json b/integrations/plain/package.json index 846dc2376..19a951305 100644 --- a/integrations/plain/package.json +++ b/integrations/plain/package.json @@ -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": { diff --git a/integrations/replicate/CHANGELOG.md b/integrations/replicate/CHANGELOG.md index be38c5d7b..7e6ca3e22 100644 --- a/integrations/replicate/CHANGELOG.md +++ b/integrations/replicate/CHANGELOG.md @@ -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 diff --git a/integrations/replicate/package.json b/integrations/replicate/package.json index 41c4f76a9..3f3a4e268 100644 --- a/integrations/replicate/package.json +++ b/integrations/replicate/package.json @@ -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" }, diff --git a/integrations/resend/CHANGELOG.md b/integrations/resend/CHANGELOG.md index a77c82ce2..a6be1cf55 100644 --- a/integrations/resend/CHANGELOG.md +++ b/integrations/resend/CHANGELOG.md @@ -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 diff --git a/integrations/resend/package.json b/integrations/resend/package.json index 87a825869..003c1affb 100644 --- a/integrations/resend/package.json +++ b/integrations/resend/package.json @@ -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": { diff --git a/integrations/sendgrid/CHANGELOG.md b/integrations/sendgrid/CHANGELOG.md index 9086f33bd..0cc1ca8f9 100644 --- a/integrations/sendgrid/CHANGELOG.md +++ b/integrations/sendgrid/CHANGELOG.md @@ -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 diff --git a/integrations/sendgrid/package.json b/integrations/sendgrid/package.json index 82a18cd82..d7237407c 100644 --- a/integrations/sendgrid/package.json +++ b/integrations/sendgrid/package.json @@ -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" diff --git a/integrations/slack/CHANGELOG.md b/integrations/slack/CHANGELOG.md index 8f52872fa..16f576a52 100644 --- a/integrations/slack/CHANGELOG.md +++ b/integrations/slack/CHANGELOG.md @@ -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 diff --git a/integrations/slack/package.json b/integrations/slack/package.json index 2e6238277..79b4ef382 100644 --- a/integrations/slack/package.json +++ b/integrations/slack/package.json @@ -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": { diff --git a/integrations/stripe/CHANGELOG.md b/integrations/stripe/CHANGELOG.md index 464c73e3c..b558f826b 100644 --- a/integrations/stripe/CHANGELOG.md +++ b/integrations/stripe/CHANGELOG.md @@ -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 diff --git a/integrations/stripe/package.json b/integrations/stripe/package.json index 75e7ce2f1..b5998e8f0 100644 --- a/integrations/stripe/package.json +++ b/integrations/stripe/package.json @@ -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" }, diff --git a/integrations/supabase/CHANGELOG.md b/integrations/supabase/CHANGELOG.md index 6206167ed..c77b3f10e 100644 --- a/integrations/supabase/CHANGELOG.md +++ b/integrations/supabase/CHANGELOG.md @@ -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 diff --git a/integrations/supabase/package.json b/integrations/supabase/package.json index 1bf316418..b7be7d7a0 100644 --- a/integrations/supabase/package.json +++ b/integrations/supabase/package.json @@ -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" }, diff --git a/integrations/typeform/CHANGELOG.md b/integrations/typeform/CHANGELOG.md index 9f89d3fae..adefb556d 100644 --- a/integrations/typeform/CHANGELOG.md +++ b/integrations/typeform/CHANGELOG.md @@ -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 diff --git a/integrations/typeform/package.json b/integrations/typeform/package.json index 689ba1ef4..4bf24421c 100644 --- a/integrations/typeform/package.json +++ b/integrations/typeform/package.json @@ -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" }, diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 840cd2888..b77e8c9f0 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -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 diff --git a/packages/astro/package.json b/packages/astro/package.json index 6f8bf02e2..5a8e85870 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -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", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index a2b8fe86b..2e8b23262 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -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 diff --git a/packages/cli/package.json b/packages/cli/package.json index b87ac8dbe..a3f8ba424 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -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", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 8cce62069..6848abf3d 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -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 diff --git a/packages/core/package.json b/packages/core/package.json index be937d97f..39ab3cfb3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -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", diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index 9585d5522..fe7537502 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,9 @@ # @trigger.dev/eslint-plugin +## 2.2.2 + +## 2.2.1 + ## 2.2.0 ### Minor Changes diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 5cef9a51d..b372aad57 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -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", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index cbf09e178..694496dee 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -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 diff --git a/packages/express/package.json b/packages/express/package.json index 99f807eb9..c26c2cf02 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -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", diff --git a/packages/integration-kit/CHANGELOG.md b/packages/integration-kit/CHANGELOG.md index 732ab9845..f198b3066 100644 --- a/packages/integration-kit/CHANGELOG.md +++ b/packages/integration-kit/CHANGELOG.md @@ -1,5 +1,9 @@ # @trigger.dev/integration-kit +## 2.2.2 + +## 2.2.1 + ## 2.2.0 ### Minor Changes diff --git a/packages/integration-kit/package.json b/packages/integration-kit/package.json index 461091e3c..22fe6711a 100644 --- a/packages/integration-kit/package.json +++ b/packages/integration-kit/package.json @@ -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", diff --git a/packages/nestjs/CHANGELOG.md b/packages/nestjs/CHANGELOG.md index 82417c06b..bf8120e10 100644 --- a/packages/nestjs/CHANGELOG.md +++ b/packages/nestjs/CHANGELOG.md @@ -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 diff --git a/packages/nestjs/package.json b/packages/nestjs/package.json index a7a5ee2db..0a4e611e6 100644 --- a/packages/nestjs/package.json +++ b/packages/nestjs/package.json @@ -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", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 35b288f62..176c27a41 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -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 diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index c2420baf8..fa60cd0de 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -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": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 3007cc327..35487d2b5 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -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 diff --git a/packages/react/package.json b/packages/react/package.json index 063966831..dcd47890c 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -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" }, diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 6da59d203..c9fbe60bd 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -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 diff --git a/packages/remix/package.json b/packages/remix/package.json index d5ef391b7..660f08870 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -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": { diff --git a/packages/sveltekit/CHANGELOG.md b/packages/sveltekit/CHANGELOG.md index 44af09954..fb5b71745 100644 --- a/packages/sveltekit/CHANGELOG.md +++ b/packages/sveltekit/CHANGELOG.md @@ -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 diff --git a/packages/sveltekit/package.json b/packages/sveltekit/package.json index df5044756..b3039431e 100644 --- a/packages/sveltekit/package.json +++ b/packages/sveltekit/package.json @@ -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" diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index fd21caf17..e195e1044 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -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 diff --git a/packages/testing/package.json b/packages/testing/package.json index faa18e8a3..550bc81a8 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -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", diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 211449219..86ae5367b 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -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 diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 9de7e97a4..fb226bb4c 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb006f8e3..b2c50aff1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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 diff --git a/references/job-catalog/src/background-fetch.ts b/references/job-catalog/src/background-fetch.ts index 523686464..80c908e8f 100644 --- a/references/job-catalog/src/background-fetch.ts +++ b/references/job-catalog/src/background-fetch.ts @@ -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("fetch", payload.url); + }, +}); + createExpressServer(client); diff --git a/references/job-catalog/src/openai.ts b/references/job-catalog/src/openai.ts index 35be1fa49..e7b016191 100644 --- a/references/job-catalog/src/openai.ts +++ b/references/job-catalog/src/openai.ts @@ -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);