Switch AI to gpt-4.1-nano + add OpenAI key

Model: gpt-4.1-nano (~$0.10/1M input, $0.40/1M output)
Priority: OpenAI (nano) → Gemini Flash (fallback)
Both keys now in server docker-compose.yml
This commit is contained in:
2026-03-05 01:01:24 +08:00
parent ea37d7d090
commit d5347d47a1
2 changed files with 36 additions and 34 deletions

View File

@@ -4,9 +4,10 @@
* Falls back to smart heuristics when no API key is set
*/
const GEMINI_KEY = process.env.GEMINI_API_KEY
const OPENAI_KEY = process.env.OPENAI_API_KEY
const HAS_AI = !!(GEMINI_KEY || OPENAI_KEY)
const GEMINI_KEY = process.env.GEMINI_API_KEY
const HAS_AI = !!(OPENAI_KEY || GEMINI_KEY)
const OPENAI_MODEL = "gpt-4.1-nano" // ~$0.10/1M input, ~$0.40/1M output
interface ChatMessage {
role: "system" | "user" | "assistant"
@@ -16,9 +17,9 @@ interface ChatMessage {
async function chat(messages: ChatMessage[], maxTokens = 300): Promise<string> {
if (!HAS_AI) return ""
// Prefer Gemini (free), fall back to OpenAI
if (GEMINI_KEY) return chatGemini(messages, maxTokens)
return chatOpenAI(messages, maxTokens)
// Prefer OpenAI (gpt-4.1-nano), fall back to Gemini
if (OPENAI_KEY) return chatOpenAI(messages, maxTokens)
return chatGemini(messages, maxTokens)
}
async function chatGemini(messages: ChatMessage[], maxTokens: number): Promise<string> {
@@ -63,7 +64,7 @@ async function chatOpenAI(messages: ChatMessage[], maxTokens: number): Promise<s
"Content-Type": "application/json",
Authorization: `Bearer ${OPENAI_KEY}`,
},
body: JSON.stringify({ model: "gpt-4o-mini", messages, max_tokens: maxTokens, temperature: 0.7 }),
body: JSON.stringify({ model: OPENAI_MODEL, messages, max_tokens: maxTokens, temperature: 0.7 }),
})
const data = await res.json()
return data.choices?.[0]?.message?.content || ""