feat: adiciona seletor de modelos de imagem da OpenAI (DALL-E 3 vs DALL-E 2) e do Gemini (Imagen 3)
Build and Deploy (Gitea) / build-and-deploy (push) Successful in 2m4s
Details
Build and Deploy (Gitea) / build-and-deploy (push) Successful in 2m4s
Details
This commit is contained in:
parent
66754cd1c1
commit
25377a9bc7
|
|
@ -38,7 +38,9 @@ const Exams: React.FC<ExamsProps> = ({ data, updateData }) => {
|
||||||
openaiModel: data.aiConfig?.openaiModel || 'gpt-4o-mini',
|
openaiModel: data.aiConfig?.openaiModel || 'gpt-4o-mini',
|
||||||
claudeModel: data.aiConfig?.claudeModel || 'claude-3-5-sonnet-20241022',
|
claudeModel: data.aiConfig?.claudeModel || 'claude-3-5-sonnet-20241022',
|
||||||
openrouterModel: data.aiConfig?.openrouterModel || 'google/gemini-2.5-flash',
|
openrouterModel: data.aiConfig?.openrouterModel || 'google/gemini-2.5-flash',
|
||||||
activeImageProvider: data.aiConfig?.activeImageProvider || 'gemini'
|
activeImageProvider: data.aiConfig?.activeImageProvider || 'gemini',
|
||||||
|
openaiImageModel: data.aiConfig?.openaiImageModel || 'dall-e-3',
|
||||||
|
geminiImageModel: data.aiConfig?.geminiImageModel || 'imagen-3.0-generate-002'
|
||||||
});
|
});
|
||||||
|
|
||||||
const [dynamicModels, setDynamicModels] = useState<{
|
const [dynamicModels, setDynamicModels] = useState<{
|
||||||
|
|
@ -89,7 +91,9 @@ const Exams: React.FC<ExamsProps> = ({ data, updateData }) => {
|
||||||
openaiModel: data.aiConfig?.openaiModel || 'gpt-4o-mini',
|
openaiModel: data.aiConfig?.openaiModel || 'gpt-4o-mini',
|
||||||
claudeModel: data.aiConfig?.claudeModel || 'claude-3-5-sonnet-20241022',
|
claudeModel: data.aiConfig?.claudeModel || 'claude-3-5-sonnet-20241022',
|
||||||
openrouterModel: data.aiConfig?.openrouterModel || 'google/gemini-2.5-flash',
|
openrouterModel: data.aiConfig?.openrouterModel || 'google/gemini-2.5-flash',
|
||||||
activeImageProvider: data.aiConfig?.activeImageProvider || 'gemini'
|
activeImageProvider: data.aiConfig?.activeImageProvider || 'gemini',
|
||||||
|
openaiImageModel: data.aiConfig?.openaiImageModel || 'dall-e-3',
|
||||||
|
geminiImageModel: data.aiConfig?.geminiImageModel || 'imagen-3.0-generate-002'
|
||||||
});
|
});
|
||||||
setShowAIConfigModal(true);
|
setShowAIConfigModal(true);
|
||||||
};
|
};
|
||||||
|
|
@ -160,7 +164,9 @@ const Exams: React.FC<ExamsProps> = ({ data, updateData }) => {
|
||||||
openaiModel: aiForm.openaiModel,
|
openaiModel: aiForm.openaiModel,
|
||||||
claudeModel: aiForm.claudeModel,
|
claudeModel: aiForm.claudeModel,
|
||||||
openrouterModel: aiForm.openrouterModel,
|
openrouterModel: aiForm.openrouterModel,
|
||||||
activeImageProvider: aiForm.activeImageProvider
|
activeImageProvider: aiForm.activeImageProvider,
|
||||||
|
openaiImageModel: aiForm.openaiImageModel,
|
||||||
|
geminiImageModel: aiForm.geminiImageModel
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -1438,6 +1444,35 @@ const Exams: React.FC<ExamsProps> = ({ data, updateData }) => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Modelo da IA de Imagem */}
|
||||||
|
<div className="border-t border-slate-100 pt-4">
|
||||||
|
{aiForm.activeImageProvider === 'openai' && (
|
||||||
|
<div>
|
||||||
|
<label className="block text-sm font-bold text-slate-700 mb-2">Modelo de Imagem OpenAI</label>
|
||||||
|
<select
|
||||||
|
value={aiForm.openaiImageModel}
|
||||||
|
onChange={e => setAiForm({ ...aiForm, openaiImageModel: e.target.value })}
|
||||||
|
className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-indigo-500 focus:outline-none transition-all font-bold text-slate-700 text-sm"
|
||||||
|
>
|
||||||
|
<option value="dall-e-3">DALL-E 3 (Alta Qualidade)</option>
|
||||||
|
<option value="dall-e-2">DALL-E 2 (Mais Econômico)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{aiForm.activeImageProvider === 'gemini' && (
|
||||||
|
<div>
|
||||||
|
<label className="block text-sm font-bold text-slate-700 mb-2">Modelo de Imagem Gemini</label>
|
||||||
|
<select
|
||||||
|
value={aiForm.geminiImageModel}
|
||||||
|
onChange={e => setAiForm({ ...aiForm, geminiImageModel: e.target.value })}
|
||||||
|
className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-indigo-500 focus:outline-none transition-all font-bold text-slate-700 text-sm"
|
||||||
|
>
|
||||||
|
<option value="imagen-3.0-generate-002">Imagen 3.0 Generate 002 (Padrão)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
{aiForm.activeProvider === 'gemini' && (
|
{aiForm.activeProvider === 'gemini' && (
|
||||||
<div className="border-t border-slate-100 pt-4">
|
<div className="border-t border-slate-100 pt-4">
|
||||||
<h4 className="text-xs font-black text-slate-400 uppercase tracking-widest mb-3">Google Gemini</h4>
|
<h4 className="text-xs font-black text-slate-400 uppercase tracking-widest mb-3">Google Gemini</h4>
|
||||||
|
|
|
||||||
|
|
@ -1615,8 +1615,7 @@ app.post('/api/ai/generate-image', async (req, res) => {
|
||||||
let imageUrl = '';
|
let imageUrl = '';
|
||||||
|
|
||||||
if (provider === 'openai') {
|
if (provider === 'openai') {
|
||||||
const modelName = aiConfig.openaiModel || 'gpt-4o-mini';
|
const imageModel = aiConfig.openaiImageModel || 'dall-e-3';
|
||||||
const imageModel = modelName.includes('gpt-4') ? 'dall-e-3' : 'dall-e-2';
|
|
||||||
|
|
||||||
const response = await fetch('https://api.openai.com/v1/images/generations', {
|
const response = await fetch('https://api.openai.com/v1/images/generations', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
|
@ -1663,7 +1662,8 @@ app.post('/api/ai/generate-image', async (req, res) => {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Usar Google Gemini Imagen 3
|
// Usar Google Gemini Imagen 3
|
||||||
const imagenUrl = `https://generativelanguage.googleapis.com/v1beta/models/imagen-3.0-generate-002:predict?key=${apiKey}`;
|
const geminiImageModel = aiConfig.geminiImageModel || 'imagen-3.0-generate-002';
|
||||||
|
const imagenUrl = `https://generativelanguage.googleapis.com/v1beta/models/${geminiImageModel}:predict?key=${apiKey}`;
|
||||||
const payload = {
|
const payload = {
|
||||||
instances: [
|
instances: [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -308,6 +308,8 @@ export interface AIConfig {
|
||||||
claudeModel?: string;
|
claudeModel?: string;
|
||||||
openrouterModel?: string;
|
openrouterModel?: string;
|
||||||
activeImageProvider?: 'gemini' | 'openai';
|
activeImageProvider?: 'gemini' | 'openai';
|
||||||
|
openaiImageModel?: string;
|
||||||
|
geminiImageModel?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SchoolData {
|
export interface SchoolData {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue