usage_detailed->prompt_tokens, $input_cost_per_thousand_tokens); $output_cost = self::getCostUsage($obj->usage_detailed->completion_tokens, $output_cost_per_thousand_tokens); $output = $obj->reply; if ($response_format == 'json_object') { $output = json_decode(self::jsonFixer($obj->reply), false, 512, JSON_THROW_ON_ERROR); } return (object) [ 'prompts' => (object) [ 'system_prompt' => $system_prompt, 'user_prompt' => $user_prompt, ], 'cost' => $input_cost + $output_cost, 'output' => $output, 'token_usage' => $obj->usage, 'token_usage_detailed' => $obj->usage_detailed, ]; } catch (Exception $e) { return self::getDefaultFailedResponse($system_prompt, $user_prompt, $e); } return self::getDefaultFailedResponse($system_prompt, $user_prompt); } private static function getDefaultFailedResponse($system_prompt, $user_prompt, $exception = null) { $exception_message = null; if (! is_null($exception)) { $exception_message = $exception->getMessage(); } return (object) [ 'exception' => $exception_message, 'prompts' => (object) [ 'system_prompt' => $system_prompt, 'user_prompt' => $user_prompt, ], 'cost' => 0, 'output' => null, 'token_usage' => 0, 'token_usage_detailed' => (object) [ 'completion_tokens' => 0, 'prompt_tokens' => 0, 'total_tokens' => 0, ], ]; } private static function getCostUsage($token_usage, $cost_per_thousand_tokens) { $calc = $token_usage / 1000; return $calc * $cost_per_thousand_tokens; } private static function jsonFixer($json_string) { $json_string = str_replace("\n", '', $json_string); // try { // return (new JsonFixer)->fix($json_string); // } // catch(Exception $e) { // } return $json_string; } public static function chatCompletionApi($system_prompt, $user_prompt, $model, $max_token = 2500, $response_format = 'text', $timeout = 800) { if ($response_format == 'json_object') { $arr = [ 'model' => $model, 'max_tokens' => $max_token, 'response_format' => (object) [ 'type' => 'json_object', ], 'messages' => [ ['role' => 'system', 'content' => $system_prompt], ['role' => 'user', 'content' => $user_prompt], ], ]; } else { $arr = [ 'model' => $model, 'max_tokens' => $max_token, 'messages' => [ ['role' => 'system', 'content' => $system_prompt], ['role' => 'user', 'content' => $user_prompt], ], ]; } try { $response = Http::timeout($timeout)->withToken(config('platform.ai.openai.api_key')) ->post('https://api.openai.com/v1/chat/completions', $arr); $json_response = json_decode($response->body()); //dump($json_response); if (isset($json_response->error)) { Log::error(serialize($json_response)); throw new Exception(serialize($json_response->error)); } $obj = (object) [ 'usage' => $json_response?->usage?->total_tokens, 'usage_detailed' => $json_response?->usage, 'reply' => $json_response?->choices[0]?->message?->content, ]; return $obj; } catch (Exception $e) { ////dd($response->body()); //inspector()->reportException($e); throw ($e); } return null; } }