chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
import rootConfig from '../../eslint.config.mjs'
|
||||
|
||||
export default [
|
||||
...rootConfig,
|
||||
{
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
project: ['./tsconfig.json'],
|
||||
tsconfigRootDir: import.meta.dirname,
|
||||
},
|
||||
},
|
||||
},
|
||||
]
|
||||
@@ -0,0 +1,3 @@
|
||||
# Dalle (Deprecated)
|
||||
|
||||
**Note:** This integration is deprecated in favor of [this one](https://app.botpress.cloud/hub/integrations/intver_01HX9TS0ZX98NAE1AR3D2QBPKM), maintained by _[Simply Great Bots](https://app.botpress.cloud/simplygreatbots)_. We encourage you to install it for better maintenance.
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><title>OpenAI icon</title><path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,46 @@
|
||||
import { z, IntegrationDefinition } from '@botpress/sdk'
|
||||
|
||||
const sizeDescription =
|
||||
'Size of the image to generate. Can be "1024x1024", "1792x1024", or "1024x1792". Defaults to 1024x1024.'
|
||||
const qualityDescription = 'Quality of the image to generate. Can be "standard" or "hd". Defaults to "standard".'
|
||||
const modelDescription = 'Model to use for image generation. Defaults to "dall-e-3".'
|
||||
|
||||
export default new IntegrationDefinition({
|
||||
name: 'dalle',
|
||||
version: '0.3.8',
|
||||
icon: 'icon.svg',
|
||||
title: 'DALL-E (Deprecated)',
|
||||
description: 'Integrate DALL-E to generate images directly within your chatbot conversations.',
|
||||
readme: 'hub.md',
|
||||
configuration: {
|
||||
schema: z.object({
|
||||
apiKey: z.string().title('OpenAI API Key').describe('An API Key for the OpenAI DALL-E service'),
|
||||
}),
|
||||
},
|
||||
channels: {},
|
||||
actions: {
|
||||
generateImage: {
|
||||
title: 'generate Image',
|
||||
description: 'Generate an image',
|
||||
input: {
|
||||
schema: z.object({
|
||||
prompt: z.string().describe('Prompt for image generation.').title('Prompt'),
|
||||
size: z.string().optional().describe(sizeDescription).title('Size'),
|
||||
quality: z.string().optional().describe(qualityDescription).title('Quality'),
|
||||
model: z.string().optional().describe(modelDescription).title('Model'),
|
||||
user: z.string().optional().describe('User ID').title('User'),
|
||||
}),
|
||||
},
|
||||
output: {
|
||||
schema: z.object({
|
||||
url: z.string().url().describe('The url of the generated image').title('Url'),
|
||||
createdDate: z.string().describe('The date the image was created').title('Created Date'),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
attributes: {
|
||||
category: 'AI Models',
|
||||
repo: 'botpress',
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "@botpresshub/dalle",
|
||||
"scripts": {
|
||||
"check:type": "tsc --noEmit",
|
||||
"check:bplint": "bp lint",
|
||||
"version": "bp --version",
|
||||
"build": "bp add -y && bp build",
|
||||
"test": "vitest --run"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@botpress/client": "workspace:*",
|
||||
"@botpress/sdk": "workspace:*",
|
||||
"axios": "^1.6.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@botpress/cli": "workspace:*",
|
||||
"@botpress/common": "workspace:*",
|
||||
"@botpress/sdk": "workspace:*"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import { AxiosResponse } from 'axios'
|
||||
import * as schemas from './schemas'
|
||||
import { ActionArgs } from './types'
|
||||
|
||||
export function buildApiData(args: ActionArgs) {
|
||||
const size = schemas.sizeConfig.safeParse(args, args.input.size)
|
||||
const quality = schemas.qualityConfig.safeParse(args, args.input.quality)
|
||||
const model = schemas.modelConfig.safeParse(args, args.input.model)
|
||||
return {
|
||||
prompt: args.input.prompt,
|
||||
n: 1,
|
||||
model,
|
||||
size,
|
||||
quality,
|
||||
user: args.input.user,
|
||||
}
|
||||
}
|
||||
|
||||
export function getApiConfig(args: ActionArgs) {
|
||||
const apiKey = args.ctx.configuration.apiKey
|
||||
const apiUrl = 'https://api.openai.com/v1/images/generations'
|
||||
const headers = {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${apiKey}`,
|
||||
}
|
||||
return { apiUrl, headers }
|
||||
}
|
||||
|
||||
export function validateResponse(response: AxiosResponse<any, any>) {
|
||||
if (!response.data || !response.data.data || !response.data.data[0] || !response.data.data[0].url) {
|
||||
throw new Error('Invalid response format from API')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import axios from 'axios'
|
||||
import { buildApiData, validateResponse, getApiConfig } from './client'
|
||||
import * as bp from '.botpress'
|
||||
|
||||
type GenerateImageOutput = bp.actions.generateImage.output.Output
|
||||
|
||||
export default new bp.Integration({
|
||||
register: async () => {},
|
||||
unregister: async () => {},
|
||||
actions: {
|
||||
generateImage: async (args): Promise<GenerateImageOutput> => {
|
||||
args.logger.forBot().info('Generating Image')
|
||||
|
||||
const { apiUrl, headers } = getApiConfig(args)
|
||||
const data = buildApiData(args)
|
||||
|
||||
try {
|
||||
const response = await axios.post(apiUrl, data, { headers })
|
||||
validateResponse(response)
|
||||
|
||||
const image = response.data.data[0].url
|
||||
const createdDate = response.data.created.toString()
|
||||
|
||||
return { url: image, createdDate }
|
||||
} catch (error) {
|
||||
args.logger.forBot().error('Error creating image:', error)
|
||||
return { url: '', createdDate: Date.now().toString() }
|
||||
}
|
||||
},
|
||||
},
|
||||
channels: {},
|
||||
handler: async () => {},
|
||||
})
|
||||
@@ -0,0 +1,41 @@
|
||||
import { z } from '@botpress/sdk'
|
||||
import { ActionArgs } from './types'
|
||||
|
||||
type ConfigFieldProps<Z extends z.ZodTypeAny> = {
|
||||
name: string
|
||||
schema: Z
|
||||
default: z.infer<Z>
|
||||
}
|
||||
|
||||
class ConfigField<Z extends z.ZodTypeAny> {
|
||||
public constructor(private _props: ConfigFieldProps<Z>) {}
|
||||
public safeParse(args: ActionArgs, value: unknown): z.infer<Z> {
|
||||
const { default: defaultValue, name, schema } = this._props
|
||||
const parseResult = schema.safeParse(value)
|
||||
if (parseResult.success) {
|
||||
return parseResult.data
|
||||
}
|
||||
args.logger
|
||||
.forBot()
|
||||
.warn(`Invalid value for action input "${name}": "${value}". Falling back on default value: "${defaultValue}".`)
|
||||
return defaultValue
|
||||
}
|
||||
}
|
||||
|
||||
export const sizeConfig = new ConfigField({
|
||||
name: 'size',
|
||||
schema: z.union([z.literal('1024x1024'), z.literal('1792x1024'), z.literal('1024x1792')]),
|
||||
default: '1024x1024',
|
||||
})
|
||||
|
||||
export const qualityConfig = new ConfigField({
|
||||
name: 'quality',
|
||||
schema: z.union([z.literal('standard'), z.literal('hd')]),
|
||||
default: 'standard',
|
||||
})
|
||||
|
||||
export const modelConfig = new ConfigField({
|
||||
name: 'model',
|
||||
schema: z.literal('dall-e-3'),
|
||||
default: 'dall-e-3',
|
||||
})
|
||||
@@ -0,0 +1,5 @@
|
||||
import * as bp from '.botpress'
|
||||
|
||||
type ValueOf<T> = T[keyof T]
|
||||
|
||||
export type ActionArgs = Parameters<ValueOf<bp.IntegrationProps['actions']>>[0]
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"paths": { "*": ["./*"] },
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": [".botpress/**/*", "definitions/**/*", "src/**/*", "*.ts"]
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
import config from '../../vitest.config'
|
||||
export default config
|
||||
Reference in New Issue
Block a user