postiz/libraries/nestjs-libraries/src/openai/openai.service.ts

99 lines
2.5 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import OpenAI from 'openai';
import { shuffle } from 'lodash';
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY || 'sk-proj-',
});
@Injectable()
export class OpenaiService {
async generateImage(prompt: string) {
return (await openai.images.generate({
prompt,
response_format: 'b64_json',
model: 'dall-e-3',
})).data[0].b64_json;
}
async generatePosts(content: string) {
const posts = (
await Promise.all([
openai.chat.completions.create({
messages: [
{
role: 'assistant',
content:
'Generate a Twitter post from the content without emojis in the following JSON format: { "post": string } put it in an array with one element',
},
{
role: 'user',
content: content!,
},
],
n: 5,
temperature: 1,
model: 'gpt-4o',
}),
openai.chat.completions.create({
messages: [
{
role: 'assistant',
content:
'Generate a thread for social media in the following JSON format: Array<{ "post": string }> without emojis',
},
{
role: 'user',
content: content!,
},
],
n: 5,
temperature: 1,
model: 'gpt-4o',
}),
])
).flatMap((p) => p.choices);
return shuffle(
posts.map((choice) => {
const { content } = choice.message;
const start = content?.indexOf('[')!;
const end = content?.lastIndexOf(']')!;
try {
return JSON.parse(
'[' +
content
?.slice(start + 1, end)
.replace(/\n/g, ' ')
.replace(/ {2,}/g, ' ') +
']'
);
} catch (e) {
console.log(content);
return [];
}
})
);
}
async extractWebsiteText(content: string) {
const websiteContent = await openai.chat.completions.create({
messages: [
{
role: 'assistant',
content:
'Your take a full website text, and extract only the article content',
},
{
role: 'user',
content,
},
],
model: 'gpt-4o',
});
const { content: articleContent } = websiteContent.choices[0].message;
return this.generatePosts(articleContent!);
}
}