request->param('slug', ''); $tier = (string) $this->request->param('tier', ''); $messages = $this->request->param('messages', []); if (!is_array($messages)) { $messages = json_decode((string) $messages, true) ?: []; } $companyId = (int) $this->request->param('companyId', 0); $maxTokens = (int) $this->request->param('maxTokens', 0); // companyId 缺省时从 JWT 兜底 if ($companyId <= 0) { $companyId = $this->companyIdFromToken(); } $userId = $this->userIdFromToken(); if (empty($messages)) { return ResponseHelper::error('messages 不能为空', 400); } $result = AiGatewayService::complete($slug, $messages, $companyId, $userId, $tier, [ 'maxTokens' => $maxTokens, ]); if (!$result['ok']) { return ResponseHelper::error($result['error'] ?? 'AI 调用失败', (int) ($result['code'] ?? 500), [ 'tier' => $result['tier'] ?? '', 'balance' => $result['balance'] ?? null, ]); } return ResponseHelper::success([ 'content' => $result['content'], 'providerId' => $result['providerId'], 'model' => $result['model'], 'tier' => $result['tier'], 'strategy' => $result['strategy'] ?? '', 'deducted' => $result['deducted'], 'balance' => $result['balance'], 'usage' => $result['usage'] ?? [], ]); } protected function companyIdFromToken(): int { $payload = $this->jwtPayload(); if (!$payload) { return 0; } return (int) (is_array($payload) ? ($payload['companyId'] ?? 0) : ($payload->companyId ?? 0)); } protected function userIdFromToken(): int { $payload = $this->jwtPayload(); if (!$payload) { return 0; } return (int) (is_array($payload) ? ($payload['id'] ?? 0) : ($payload->id ?? 0)); } protected function jwtPayload() { try { $token = JwtUtil::getRequestToken(); return $token ? JwtUtil::verifyToken($token) : false; } catch (\Throwable $e) { return false; } } }