'Brazilian Portuguese', 'en' => 'English', 'es' => 'Spanish', ]; $languageName = $languageNames[$language] ?? 'English'; if (!$apiKey) { return [ "success" => false, "error" => "OpenRouter API key not configured", ]; } try { $systemPrompt = "You are an expert learning assistant for the subject: {$subject}. " . "Provide insightful, educational content. Be concise and practical.\n\n" . "CRITICAL LANGUAGE INSTRUCTION - You MUST follow this exactly:\n" . "Your entire response MUST be written ONLY in {$languageName} ({$language}).\n" . "Do NOT use any other language. Do NOT include English translations or explanations.\n" . "If the subject is a language course (like English), you may use that language as examples,\n" . "but all instructions, explanations, and tips MUST be in {$languageName}.\n" . "This is mandatory. Start your response directly with the tip in {$languageName}."; // Append language instruction to user message as well $userMessageWithLanguage = "[IMPORTANTE: Responda EXCLUSIVAMENTE em {$languageName}. " . "NÃO use inglês. NÃO traduza. NÃO misture idiomas. " . "Toda a resposta deve ser APENAS em {$languageName}.]\n\n" . $userMessage; $messages = [ ["role" => "system", "content" => $systemPrompt], ["role" => "user", "content" => $userMessageWithLanguage], ]; // Add context if provided if (!empty($context)) { $contextStr = "Context information:\n"; foreach ($context as $key => $value) { $contextStr .= "- {$key}: {$value}\n"; } array_unshift($messages, ["role" => "system", "content" => $contextStr]); } $response = Http::withHeaders([ "Authorization" => "Bearer " . $apiKey, "Content-Type" => "application/json", "HTTP-Referer" => config("app.url"), "X-Title" => config("app.name"), ])->timeout(120)->post("https://openrouter.ai/api/v1/chat/completions", [ "model" => $model, "messages" => $messages, ]); $data = $response->json(); if (!$data || !isset($data["choices"][0]["message"])) { $errorMsg = $data["error"]["message"] ?? "Unknown API error"; Log::error("OpenRouter API error response", [ "response" => $data, "subject" => $subject, ]); return [ "success" => false, "error" => $errorMsg, ]; } $message = $data["choices"][0]["message"]; $content = $message["content"] ?? $message["reasoning"] ?? null; if ($content) { return [ "success" => true, "content" => $content, "input_tokens" => $data["usage"]["prompt_tokens"] ?? 0, "output_tokens" => $data["usage"]["completion_tokens"] ?? 0, ]; } Log::error("OpenRouter API: Empty response content", [ "response" => $data, "subject" => $subject, ]); return [ "success" => false, "error" => "The AI model returned an empty response. Please try again.", ]; } catch (\Exception $e) { Log::error("OpenRouter API error: " . $e->getMessage()); return [ "success" => false, "error" => $e->getMessage(), ]; } } }