diff --git a/packages/backend/src/apps/openai/actions/check-moderation/index.ts b/packages/backend/src/apps/openai/actions/check-moderation/index.ts new file mode 100644 index 00000000..af5a84f7 --- /dev/null +++ b/packages/backend/src/apps/openai/actions/check-moderation/index.ts @@ -0,0 +1,29 @@ +import defineAction from '../../../../helpers/define-action'; + +export default defineAction({ + name: 'Check moderation', + key: 'checkModeration', + description: 'Checks for hate, hate/threatening, self-harm, sexual, sexual/minors, violence, or violence/graphic content in the given text.', + arguments: [ + { + label: 'Input', + key: 'input', + type: 'string' as const, + required: true, + variables: true, + description: 'The text to analyze.' + }, + ], + + async run($) { + const { data } = await $.http.post('/v1/moderations', { + input: $.step.parameters.input as string, + }); + + const result = data?.results[0]; + + $.setActionItem({ + raw: result, + }); + }, +}); diff --git a/packages/backend/src/apps/openai/actions/index.ts b/packages/backend/src/apps/openai/actions/index.ts new file mode 100644 index 00000000..41a12e54 --- /dev/null +++ b/packages/backend/src/apps/openai/actions/index.ts @@ -0,0 +1,3 @@ +import checkModeration from './check-moderation'; + +export default [checkModeration]; diff --git a/packages/backend/src/apps/openai/assets/favicon.svg b/packages/backend/src/apps/openai/assets/favicon.svg new file mode 100644 index 00000000..b62b84eb --- /dev/null +++ b/packages/backend/src/apps/openai/assets/favicon.svg @@ -0,0 +1,6 @@ + + OpenAI + + + + \ No newline at end of file diff --git a/packages/backend/src/apps/openai/auth/index.ts b/packages/backend/src/apps/openai/auth/index.ts new file mode 100644 index 00000000..78d9e38f --- /dev/null +++ b/packages/backend/src/apps/openai/auth/index.ts @@ -0,0 +1,34 @@ +import verifyCredentials from './verify-credentials'; +import isStillVerified from './is-still-verified'; + +export default { + fields: [ + { + key: 'screenName', + label: 'Screen Name', + type: 'string' as const, + required: true, + readOnly: false, + value: null, + placeholder: null, + description: + 'Screen name of your connection to be used on Automatisch UI.', + clickToCopy: false, + }, + { + key: 'apiKey', + label: 'API Key', + type: 'string' as const, + required: true, + readOnly: false, + value: null, + placeholder: null, + description: 'OpenAI API key of your account.', + docUrl: 'https://automatisch.io/docs/openai#api-key', + clickToCopy: false, + }, + ], + + verifyCredentials, + isStillVerified, +}; diff --git a/packages/backend/src/apps/openai/auth/is-still-verified.ts b/packages/backend/src/apps/openai/auth/is-still-verified.ts new file mode 100644 index 00000000..9f5895f0 --- /dev/null +++ b/packages/backend/src/apps/openai/auth/is-still-verified.ts @@ -0,0 +1,8 @@ +import { IGlobalVariable } from '@automatisch/types'; + +const isStillVerified = async ($: IGlobalVariable) => { + await $.http.get('/v1/models'); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/openai/auth/verify-credentials.ts b/packages/backend/src/apps/openai/auth/verify-credentials.ts new file mode 100644 index 00000000..e9fb2540 --- /dev/null +++ b/packages/backend/src/apps/openai/auth/verify-credentials.ts @@ -0,0 +1,7 @@ +import { IGlobalVariable } from '@automatisch/types'; + +const verifyCredentials = async ($: IGlobalVariable) => { + await $.http.get('/v1/models'); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/openai/common/add-auth-header.ts b/packages/backend/src/apps/openai/common/add-auth-header.ts new file mode 100644 index 00000000..2b0de0ce --- /dev/null +++ b/packages/backend/src/apps/openai/common/add-auth-header.ts @@ -0,0 +1,11 @@ +import { TBeforeRequest } from '@automatisch/types'; + +const addAuthHeader: TBeforeRequest = ($, requestConfig) => { + if ($.auth.data?.apiKey) { + requestConfig.headers.Authorization = `Bearer ${$.auth.data.apiKey}`; + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/openai/index.d.ts b/packages/backend/src/apps/openai/index.d.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/backend/src/apps/openai/index.ts b/packages/backend/src/apps/openai/index.ts new file mode 100644 index 00000000..9eb9e595 --- /dev/null +++ b/packages/backend/src/apps/openai/index.ts @@ -0,0 +1,18 @@ +import defineApp from '../../helpers/define-app'; +import addAuthHeader from './common/add-auth-header'; +import auth from './auth'; +import actions from './actions'; + +export default defineApp({ + name: 'OpenAI', + key: 'openai', + baseUrl: 'https://openai.com', + apiBaseUrl: 'https://api.openai.com', + iconUrl: '{BASE_URL}/apps/openai/assets/favicon.svg', + authDocUrl: 'https://automatisch.io/docs/apps/openai/connection', + primaryColor: '000000', + supportsConnections: true, + beforeRequest: [addAuthHeader], + auth, + actions, +}); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 615cf1ef..d9debf65 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -87,6 +87,15 @@ export default defineConfig({ { text: 'Connection', link: '/apps/ntfy/connection' }, ], }, + { + text: 'OpenAI', + collapsible: true, + collapsed: true, + items: [ + { text: 'Actions', link: '/apps/openai/actions' }, + { text: 'Connection', link: '/apps/openai/connection' }, + ], + }, { text: 'RSS', collapsible: true, diff --git a/packages/docs/pages/apps/openai/actions.md b/packages/docs/pages/apps/openai/actions.md new file mode 100644 index 00000000..aafeb453 --- /dev/null +++ b/packages/docs/pages/apps/openai/actions.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/openai.svg +items: + - name: Check moderation Text + desc: Checks for hate, hate/threatening, self-harm, sexual, sexual/minors, violence, or violence/graphic content in text. +--- + + + + diff --git a/packages/docs/pages/apps/openai/connection.md b/packages/docs/pages/apps/openai/connection.md new file mode 100644 index 00000000..f6967eda --- /dev/null +++ b/packages/docs/pages/apps/openai/connection.md @@ -0,0 +1,8 @@ +# OpenAI + +1. Go to [API Keys page](https://beta.openai.com/account/api-keys) on OpenAI. +2. Create a new secret key. +3. Paste the key into the `API Key` field in Automatisch. +4. Write any screen name to be displayed in Automatisch. +5. Click `Save`. +6. Start using OpenAI integration with Automatisch! diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index bf464ca5..01d31cdb 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -13,6 +13,7 @@ Following integrations are currently supported by Automatisch. - [Github](/apps/github/triggers) - [RSS](/apps/rss/triggers) - [Ntfy](/apps/ntfy/triggers) +- [OpenAI](/apps/openai/actions) - [Salesforce](/apps/salesforce/triggers) - [Scheduler](/apps/scheduler/triggers) - [Slack](/apps/slack/actions) diff --git a/packages/docs/pages/public/favicons/openai.svg b/packages/docs/pages/public/favicons/openai.svg new file mode 100644 index 00000000..b62b84eb --- /dev/null +++ b/packages/docs/pages/public/favicons/openai.svg @@ -0,0 +1,6 @@ + + OpenAI + + + + \ No newline at end of file