99 lines
2.5 KiB
TypeScript
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!);
|
|
}
|
|
}
|