mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-17 13:57:51 +00:00
- Adiciona fluxo de criação em etapas com cards - Implementa Edge Function para geração via GPT-4 - Cria interfaces e tipos para o gerador de histórias - Adiciona seleção de tema, disciplina, personagem e cenário - Integra com Supabase para armazenamento e processamento - Melhora UX com feedback visual e navegação intuitiva
67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
|
|
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
|
|
import { Configuration, OpenAIApi } from 'https://esm.sh/openai@3.1.0'
|
|
|
|
const openaiConfig = new Configuration({
|
|
apiKey: Deno.env.get('OPENAI_API_KEY')
|
|
})
|
|
const openai = new OpenAIApi(openaiConfig)
|
|
|
|
serve(async (req) => {
|
|
const { record } = await req.json()
|
|
const prompt = record.content.prompt
|
|
|
|
try {
|
|
const completion = await openai.createChatCompletion({
|
|
model: "gpt-4",
|
|
messages: [
|
|
{
|
|
role: "system",
|
|
content: `Você é um contador de histórias infantis especializado em criar histórias educativas e envolventes para crianças.
|
|
Crie uma história com 3-5 páginas, cada uma com 2-3 parágrafos curtos.
|
|
A história deve ser apropriada para a idade e incluir elementos dos interesses da criança.
|
|
Use linguagem simples e clara, mas inclua algumas das palavras para prática quando apropriado.`
|
|
},
|
|
{
|
|
role: "user",
|
|
content: `Crie uma história com os seguintes elementos:
|
|
Interesses: ${prompt.studentInterests.join(', ')}
|
|
Personagem Principal: ${prompt.characters.main}
|
|
Cenário: ${prompt.setting.place}
|
|
Palavras para prática: ${prompt.practiceWords?.join(', ') || 'N/A'}
|
|
Características da criança: ${JSON.stringify(prompt.studentCharacteristics)}
|
|
Nível de dificuldade: ${prompt.difficulty}`
|
|
}
|
|
]
|
|
})
|
|
|
|
const story = completion.data.choices[0].message?.content
|
|
if (!story) throw new Error('Falha ao gerar história')
|
|
|
|
// Processar a história em páginas
|
|
const pages = story.split('\n\n').map(text => ({ text }))
|
|
|
|
// Atualizar o registro no banco
|
|
const supabase = createClient(
|
|
Deno.env.get('SUPABASE_URL') ?? '',
|
|
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
|
|
)
|
|
|
|
await supabase
|
|
.from('stories')
|
|
.update({
|
|
content: { pages },
|
|
status: 'published'
|
|
})
|
|
.eq('id', record.id)
|
|
|
|
return new Response(JSON.stringify({ success: true }), {
|
|
headers: { 'Content-Type': 'application/json' }
|
|
})
|
|
} catch (error) {
|
|
return new Response(JSON.stringify({ error: error.message }), {
|
|
headers: { 'Content-Type': 'application/json' },
|
|
status: 500
|
|
})
|
|
}
|
|
})
|