aiChat->isAvailable()) { return $this->fail('AI service belum dikonfigurasi (OLLAMA_BASE_URL kosong).', 'service_unavailable', 503); } $validated = $request->validate([ 'message' => ['required', 'string', 'min:2', 'max:2000'], 'history' => ['sometimes', 'array', 'max:20'], 'history.*.role' => ['required_with:history', 'string', 'in:user,assistant'], 'history.*.content' => ['required_with:history', 'string', 'max:4000'], ]); /** @var ApiActor|null $actor */ $actor = $request->attributes->get('api_actor'); $username = $actor instanceof ApiActor ? $actor->identifier : 'unknown'; try { $result = $this->aiChat->chat( query: $validated['message'], username: $username, displayName: $username, jobTitle: '', history: $validated['history'] ?? [], ); return $this->ok([ 'answer' => $result['answer'], 'context_count' => $result['meta']['context_count'], 'model' => $result['meta']['model'], ]); } catch (Throwable $e) { return $this->fail('Gagal memproses permintaan AI: '.$e->getMessage(), 'server_error', 500); } } /** * GET /api/v1/ai/status */ public function status(): JsonResponse { return $this->ok([ 'available' => $this->aiChat->isAvailable(), 'base_url' => config('ollama.base_url') ?: null, 'model' => config('ollama.chat_model'), ]); } }