From 6a28c52b504a441edf1b13db9ad41e9b1bb6e2f0 Mon Sep 17 00:00:00 2001 From: Ashley Johnson <61059402+PapaRascal2020@users.noreply.github.com> Date: Tue, 17 Sep 2024 09:55:03 +0100 Subject: [PATCH] feat(SK): Add the Streamed Completion feature --- src/Features/StreamedCompletion.php | 113 ++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/Features/StreamedCompletion.php diff --git a/src/Features/StreamedCompletion.php b/src/Features/StreamedCompletion.php new file mode 100644 index 0000000..4c6b315 --- /dev/null +++ b/src/Features/StreamedCompletion.php @@ -0,0 +1,113 @@ +requestRules + $request = []; + foreach ($this->requestRules as $key => $value) { + if (is_array($value)) { + $arrayMap = []; + foreach ($value as $k => $val) { + if ($eval = eval("return $val;")) { + if(isset($eval['role'])) { + $arrayMap[] = $eval; + } else { + $arrayMap = [ + ...$arrayMap, + ...$eval + ]; + } + } else { + unset($value[$k]); + } + } + $request[$key] = [...$arrayMap]; + } else { + $request[$key] = eval("return $value;"); + } + } + + $request['stream'] = true; + + $response = Http::withHeaders($this->headers) + ->withOptions(['stream' => true]) + ->post($this->url, $request); + + if (!($response instanceof \Illuminate\Http\Client\Response)) { + throw new \Exception('Unexpected response type'); + } + + $body = $response->getBody(); + + while (!$body->eof()) { + $line = $this->readLine($body); + + // Get rid of data: (if present) + if (str_starts_with($line, 'data:')) { + $line = trim(substr($line, strlen('data:'))); + } + + // Format to array + $response = json_decode($line, true) ?? []; + + // Yield for processing + yield $response; + } + } + + private function readLine($stream): string + { + $buffer = ''; + + while (!$stream->eof()) { + $byte = $stream->read(1); + if ($byte === false) { + return $buffer; + } + $buffer .= $byte; + if ($byte === "\n") { + break; + } + } + + return $buffer; + } +}