ecd050bece
* CLI create-integration command now accepts an Open AI api key * Create integration docs separated into multiple pages * Initial Airtable integration commit, with OpenAI generated code * OAuth page coming soon * Export DisplayProperty from the SDK * TSConfig made to match GitHub’s with paths * getRecords * Removed duplicate Stripe job from the catalog * Renamed Airtable apiKey option to token * First Airtable job * Export Collaborator and Attachment field types * A typesafe example that uses runTask * WIP on new integration tasks… not working yet * Attempt with class * Revert "Attempt with class" This reverts commit 93a48330019f754c3216c5b49964fa4b0218bd3f. * WIP changing how tasks work * Mock of async local storage * Moved client creation from constructor * New approach with a clone method on TriggerIntegration * Added runTask to Airtable which is used by integration tasks * Added the Airtable icon and connection when using runTask * base().table() is working * runTask options moved to the 3rd param, made optional with optional name * Added some generic arguments * Added generic type to table * Removed old comment * We don’t need to repeat the icon * getRecords and getRecord now returning the right data and types * Creating records * Update records * Delete records * The internal properties of integrations are now hidden by the TypeScript types * Sprinkled a Prettify in there * Improved the types * Added Airtable to the integration catalog * Early work on Airtable webhook registration * More progress with webhooks * connectionKey needs to be cloned for webhooks to work * connectionKey needs to be cloned for webhooks to work * It was unclear that the ActivateSourceService was using a graphileJob id * ActivateSourceService optionally takes a jobId, if missing it generate a unique id * When retrying trigger registration, don’t pass an id so it is generated * Removed Airtable webhooks tasks from the job-catalog example * Added TriggerSourceOption, removed TriggerSourceEvent * WIP with new ExternalSource options * ExternalSourceTrigger setup * DynamicTrigger changed to options, will need some more work * filter gets options passed to it * SourceMetadata v2 renamed to SourceMetadataV2, kept original * Started versioning the backend * Moved param order on io.getEvent and io.cancelEvent * The runTask stuff that allows unknown to work is back * Indexing for v1 and v2, with version on “activateSource” schema * Added todos, to deal with Airtable SDK calls inside the webhook handler * “deliverHttpSourceRequest” queueName changed to the source id so they process in order * ActivateSource changes to deal with old and new data formats * Update existing TriggerSources to v2 * Fix for dynamic.ts typescript errors, need to revisit this later * UpdateSourceService v1 and v2, with new v2 API endpoint * Removed unused imports * More progress on v1 and v2 * Airtable webhooks are now triggering a job * Moved webhooks to a new file * You can do API calls in the webhook handler now, Airtable webhook data is being processed * Airtable events coming through * Defined the Airtable table payload type * TriggerSource metadata is being stored and used * Removed some logs * Added filtering and don’t allow any webhooks that use automated sources * Resend switched to new integration * Moved Resend test jobs to the catalog, and tested it worked * WIP on Slack, there are compile errors * Created a generic type that strips out indexes * Slack updated to use new integration * SendGrid migrated over * Integration runTask is now allowing regular types * Changed io.runTask types so it only allows Json-able types * OpenAI models tasks working * Added Airtable changes to runTask * Removed the index signature crap from the Slack integration * Don’t need to cast the callback result * Updated Resend * Re-ordered runTask params * WIP on openai * onAccountUpdated is Connect only * Removed RunTaskResult * Handle Resend errors, the official SDK doesn’t expose them properly at the moment * Removed OmitIndexSignature * OpenAI converted to new integration, with backwards compatible functions * Put the openai catalog back to what it was originally * Export a standard retry with backoff, to be used * Use the standard exponential backoff in the integrations * Retry options moved earlier so they can be overriden by a task * GitHub tasks migrated * Added sources, fixed one bundling issue * Added GitHub jobs to catalog * Remove duplicate options * Deduplicate events * Removed duplicate Job * Switched Plain over * Set the Plain icon * Converted Stripe over * Supabase adapted * Typeform working * Added dynamic-schedule to catalog * Added background-fetch job catalog * Created dynamic-triggers catalog file * Fixed old general file with runTask param order * Dynamic triggers working * SendGrid updated to use the same tsconfig as other integrations * Removed Airtable webhook, until we have batch support * Added OAuth airtable auth example * Created beta changeset tag * Beta changesets for most packages --------- Co-authored-by: Eric Allam <eallam@icloud.com>
100 lines
4.0 KiB
Plaintext
100 lines
4.0 KiB
Plaintext
---
|
|
title: Creating the client
|
|
description: "Each integration has a client that performs the actual HTTP requests. Usually this is a wrapper around an official SDK provided by the service."
|
|
---
|
|
|
|
### `src/index.ts`
|
|
|
|
This is where the client should live.
|
|
|
|
<Tip>
|
|
We're adopting the naming convention of naming the class after the service, without a suffix or
|
|
prefix. We prefer the exported name be `Slack` instead of something like `SlackIntegration` or
|
|
`SlackConnector`
|
|
</Tip>
|
|
|
|
<Accordion title="Example: OpenAI">
|
|
|
|
```ts
|
|
import type { IntegrationClient, TriggerIntegration } from "@trigger.dev/sdk";
|
|
import { Configuration, OpenAIApi } from "openai";
|
|
import * as tasks from "./tasks";
|
|
import { OpenAIIntegrationOptions } from "./types";
|
|
|
|
export class OpenAI implements TriggerIntegration<IntegrationClient<OpenAIApi, typeof tasks>> {
|
|
client: IntegrationClient<OpenAIApi, typeof tasks>;
|
|
|
|
constructor(private options: OpenAIIntegrationOptions) {
|
|
this.client = {
|
|
tasks,
|
|
usesLocalAuth: true,
|
|
client: new OpenAIApi(
|
|
new Configuration({
|
|
apiKey: options.apiKey,
|
|
organization: options.organization,
|
|
})
|
|
),
|
|
auth: {
|
|
apiKey: options.apiKey,
|
|
organization: options.organization,
|
|
},
|
|
};
|
|
}
|
|
|
|
get id() {
|
|
return this.options.id;
|
|
}
|
|
|
|
get metadata() {
|
|
return { id: "openai", name: "OpenAI" };
|
|
}
|
|
}
|
|
```
|
|
|
|
</Accordion>
|
|
|
|
The `TriggerIntegration` interface requires three properties to be implemented:
|
|
|
|
<ParamField body="id" type="string" required>
|
|
The `id` that uniquely identifies the Integration. This should always be passed through the
|
|
constructor options.
|
|
</ParamField>
|
|
|
|
<ParamField body="metadata" type="object" required>
|
|
<Expandable title="properties">
|
|
<ParamField body="id" type="string" required>
|
|
A unique identifier for the Integration. For example, the OpenAI Integration has an id of
|
|
`"openai"`.
|
|
</ParamField>
|
|
<ParamField body="name" type="string" required>
|
|
The name of the Integration. For example, the OpenAI Integration has a name of `"OpenAI"`.
|
|
</ParamField>
|
|
</Expandable>
|
|
</ParamField>
|
|
|
|
<ParamField body="client" type="IntegrationClient" required>
|
|
An IntegrationClient object that contains either the underlying SDK client (if
|
|
using local auth) or a `clientFactory` function to create new clients using
|
|
authenticated credentials.
|
|
|
|
{" "}
|
|
|
|
<Expandable title="properties" defaultOpen>
|
|
<ParamField body="usesLocalAuth" type="boolean" required>
|
|
Specifies whether the client uses local auth or not. If `true`, the `client` property should contain the underlying SDK client. If `false`, the `client` property should contain a `clientFactory` function that can be used to create new clients using authenticated credentials.
|
|
</ParamField>
|
|
<ParamField body="tasks" type="Record<string, AuthenticatedTask>" required>
|
|
An object that contains all of the authenticated tasks that are supported by the Integration. The keys of the object should be the names of the tasks and the values should be the authenticated tasks. More on authenticated tasks below.
|
|
</ParamField>
|
|
<ParamField body="clientFactory" type="function">
|
|
A function that takes in an `auth` object (of type [ConnectionAuth](/sdk/connection-auth)) and returns a new SDK client that is authenticated with the credentials in the `auth` object. This should only be set if `usesLocalAuth` is `false`.
|
|
</ParamField>
|
|
<ParamField body="client" type="SDK Client">
|
|
The underlying SDK client that will be used to make requests to the service. This should only be set if `usesLocalAuth` is `true`.
|
|
</ParamField>
|
|
<ParamField body="auth" type="any">
|
|
The authenticated credentials that were used to create the `client`. This should only be set if `usesLocalAuth` is `true`. This is used to access the credentials inside of authenticated tasks, but is only necessary in specific cases (like when doing a [`backgroundFetch`](/sdk/io/backgroundfetch) as a subtask)
|
|
</ParamField>
|
|
</Expandable>
|
|
</ParamField>
|