Use admin-configured AI model and add GPT-5/o-series options
Build and Push Docker Image / build (push) Successful in 4m6s
Details
Build and Push Docker Image / build (push) Successful in 4m6s
Details
- Add getConfiguredModel() that reads ai_model from SystemSettings - AI assignment and mentor matching now use the admin-selected model - Remove duplicate OpenAI client in mentor-matching (use shared singleton) - Add GPT-5, GPT-5 Mini, o3, o3 Mini, o4 Mini to model dropdown Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
8c598ba3ee
commit
bfcfd84008
|
|
@ -162,6 +162,11 @@ export function AISettingsForm({ settings }: AISettingsFormProps) {
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
<SelectItem value="gpt-4o">GPT-4o (Recommended)</SelectItem>
|
<SelectItem value="gpt-4o">GPT-4o (Recommended)</SelectItem>
|
||||||
<SelectItem value="gpt-4o-mini">GPT-4o Mini</SelectItem>
|
<SelectItem value="gpt-4o-mini">GPT-4o Mini</SelectItem>
|
||||||
|
<SelectItem value="gpt-5">GPT-5</SelectItem>
|
||||||
|
<SelectItem value="gpt-5-mini">GPT-5 Mini</SelectItem>
|
||||||
|
<SelectItem value="o3">o3</SelectItem>
|
||||||
|
<SelectItem value="o3-mini">o3 Mini</SelectItem>
|
||||||
|
<SelectItem value="o4-mini">o4 Mini</SelectItem>
|
||||||
<SelectItem value="gpt-4-turbo">GPT-4 Turbo</SelectItem>
|
<SelectItem value="gpt-4-turbo">GPT-4 Turbo</SelectItem>
|
||||||
<SelectItem value="gpt-4">GPT-4</SelectItem>
|
<SelectItem value="gpt-4">GPT-4</SelectItem>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
|
|
|
||||||
|
|
@ -107,3 +107,18 @@ export const AI_MODELS = {
|
||||||
ASSIGNMENT: 'gpt-4o', // Best for complex reasoning
|
ASSIGNMENT: 'gpt-4o', // Best for complex reasoning
|
||||||
QUICK: 'gpt-4o-mini', // Faster, cheaper for simple tasks
|
QUICK: 'gpt-4o-mini', // Faster, cheaper for simple tasks
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the admin-configured AI model from SystemSettings.
|
||||||
|
* Falls back to the provided default if not configured.
|
||||||
|
*/
|
||||||
|
export async function getConfiguredModel(fallback: string = AI_MODELS.ASSIGNMENT): Promise<string> {
|
||||||
|
try {
|
||||||
|
const setting = await prisma.systemSettings.findUnique({
|
||||||
|
where: { key: 'ai_model' },
|
||||||
|
})
|
||||||
|
return setting?.value || process.env.OPENAI_MODEL || fallback
|
||||||
|
} catch {
|
||||||
|
return process.env.OPENAI_MODEL || fallback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
* to generate optimal assignment suggestions.
|
* to generate optimal assignment suggestions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { getOpenAI, AI_MODELS } from '@/lib/openai'
|
import { getOpenAI, getConfiguredModel } from '@/lib/openai'
|
||||||
import {
|
import {
|
||||||
anonymizeForAI,
|
anonymizeForAI,
|
||||||
deanonymizeResults,
|
deanonymizeResults,
|
||||||
|
|
@ -153,8 +153,10 @@ async function callAIForAssignments(
|
||||||
// Build the user prompt
|
// Build the user prompt
|
||||||
const userPrompt = buildAssignmentPrompt(anonymizedData, constraints)
|
const userPrompt = buildAssignmentPrompt(anonymizedData, constraints)
|
||||||
|
|
||||||
|
const model = await getConfiguredModel()
|
||||||
|
|
||||||
const response = await openai.chat.completions.create({
|
const response = await openai.chat.completions.create({
|
||||||
model: AI_MODELS.ASSIGNMENT,
|
model,
|
||||||
messages: [
|
messages: [
|
||||||
{ role: 'system', content: ASSIGNMENT_SYSTEM_PROMPT },
|
{ role: 'system', content: ASSIGNMENT_SYSTEM_PROMPT },
|
||||||
{ role: 'user', content: userPrompt },
|
{ role: 'user', content: userPrompt },
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,5 @@
|
||||||
import { PrismaClient, OceanIssue, CompetitionCategory } from '@prisma/client'
|
import { PrismaClient, OceanIssue, CompetitionCategory } from '@prisma/client'
|
||||||
import OpenAI from 'openai'
|
import { getOpenAI, getConfiguredModel } from '@/lib/openai'
|
||||||
|
|
||||||
// Lazy initialization to avoid errors when API key is not set
|
|
||||||
let openaiClient: OpenAI | null = null
|
|
||||||
|
|
||||||
function getOpenAIClient(): OpenAI | null {
|
|
||||||
if (!process.env.OPENAI_API_KEY) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
if (!openaiClient) {
|
|
||||||
openaiClient = new OpenAI({
|
|
||||||
apiKey: process.env.OPENAI_API_KEY,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return openaiClient
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ProjectInfo {
|
interface ProjectInfo {
|
||||||
id: string
|
id: string
|
||||||
|
|
@ -170,13 +155,15 @@ Respond in JSON format:
|
||||||
]
|
]
|
||||||
}`
|
}`
|
||||||
|
|
||||||
const openai = getOpenAIClient()
|
const openai = await getOpenAI()
|
||||||
if (!openai) {
|
if (!openai) {
|
||||||
throw new Error('OpenAI client not available')
|
throw new Error('OpenAI client not available')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const model = await getConfiguredModel()
|
||||||
|
|
||||||
const response = await openai.chat.completions.create({
|
const response = await openai.chat.completions.create({
|
||||||
model: 'gpt-4o-mini',
|
model,
|
||||||
messages: [
|
messages: [
|
||||||
{
|
{
|
||||||
role: 'system',
|
role: 'system',
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue