Skip to content

Commit 6a8b130

Browse files
committed
stub out openai driver
1 parent 2f6b5f8 commit 6a8b130

File tree

6 files changed

+154
-9
lines changed

6 files changed

+154
-9
lines changed

app/LlmDriver/BaseClient.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
namespace App\LlmDriver;
44

5+
use App\LlmDriver\Responses\CompletionResponse;
56
use App\LlmDriver\Responses\EmbeddingsResponseDto;
67
use Illuminate\Support\Facades\Log;
78

89
abstract class BaseClient
910
{
11+
protected string $driver = 'mock';
12+
1013
public function embedData(string $data): EmbeddingsResponseDto
1114
{
1215

@@ -19,4 +22,20 @@ public function embedData(string $data): EmbeddingsResponseDto
1922
1000,
2023
);
2124
}
25+
26+
public function completion(string $prompt): CompletionResponse
27+
{
28+
Log::info('LlmDriver::MockClient::completion');
29+
30+
$data = <<<'EOD'
31+
Voluptate irure cillum dolor anim officia reprehenderit dolor. Eiusmod veniam nostrud consectetur incididunt proident id. Anim adipisicing pariatur amet duis Lorem sunt veniam veniam est. Deserunt ea aliquip cillum pariatur consectetur. Dolor in reprehenderit adipisicing consectetur cupidatat ad cupidatat reprehenderit. Nostrud mollit voluptate aliqua anim pariatur excepteur eiusmod velit quis exercitation tempor quis excepteur.
32+
EOD;
33+
34+
return new CompletionResponse($data);
35+
}
36+
37+
protected function getConfig(string $driver): array
38+
{
39+
return config("llmdriver.drivers.$driver");
40+
}
2241
}

app/LlmDriver/MockClient.php

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,5 @@
77

88
class MockClient extends BaseClient
99
{
10-
public function completion(string $prompt): CompletionResponse
11-
{
12-
Log::info('LlmDriver::MockClient::completion');
1310

14-
$data = <<<'EOD'
15-
Voluptate irure cillum dolor anim officia reprehenderit dolor. Eiusmod veniam nostrud consectetur incididunt proident id. Anim adipisicing pariatur amet duis Lorem sunt veniam veniam est. Deserunt ea aliquip cillum pariatur consectetur. Dolor in reprehenderit adipisicing consectetur cupidatat ad cupidatat reprehenderit. Nostrud mollit voluptate aliqua anim pariatur excepteur eiusmod velit quis exercitation tempor quis excepteur.
16-
EOD;
17-
18-
return new CompletionResponse($data);
19-
}
2011
}

app/LlmDriver/OpenAiClient.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace App\LlmDriver;
4+
5+
use App\LlmDriver\Responses\CompletionResponse;
6+
use App\LlmDriver\Responses\EmbeddingsResponseDto;
7+
use Illuminate\Support\Facades\Log;
8+
use OpenAI\Laravel\Facades\OpenAI;
9+
10+
class OpenAiClient extends BaseClient
11+
{
12+
protected string $driver = 'openai';
13+
14+
public function embedData(string $data): EmbeddingsResponseDto
15+
{
16+
17+
$response = OpenAI::embeddings()->create([
18+
'model' => $this->getConfig('openai')['embedding_model'],
19+
'input' => $data,
20+
]);
21+
22+
$results = [];
23+
24+
foreach ($response->embeddings as $embedding) {
25+
$embedding->object; // 'embedding'
26+
$results = $embedding->embedding; // [0.018990106880664825, -0.0073809814639389515, ...]
27+
$embedding->index; // 0
28+
}
29+
30+
return new EmbeddingsResponseDto(
31+
$results,
32+
$response->usage->totalTokens,
33+
);
34+
}
35+
36+
public function completion(string $prompt, int $temperature = 0): CompletionResponse
37+
{
38+
$response = OpenAI::completions()->create([
39+
'model' => $this->getConfig('openai')['completion_model'],
40+
'prompt' => $prompt,
41+
'temperature' => 0
42+
]);
43+
44+
$results = null;
45+
46+
foreach ($response->choices as $result) {
47+
$results = $result->text; // '\n\nThis is a test'
48+
}
49+
50+
return new CompletionResponse($results);
51+
}
52+
53+
}

config/llmdriver.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
'openai' => [
1111
'api_key' => env('OPENAI_API_KEY'),
1212
'api_url' => env('OPENAI_API_URL', 'https://api.openai.com/v1/engines/davinci-codex/completions'),
13+
'embedding_model' => env('OPENAI_EMBEDDING_MODEL', 'text-embedding-3-large'),
14+
'completion_model' => env('OPENAI_COMPLETION_MODEL', 'gpt-4-turbo-preview'),
1315
],
1416
'azure' => [
1517

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::table('document_chunks', function (Blueprint $table) {
15+
$table->vector('embedding', 3072)->nullable()->change();
16+
});
17+
}
18+
19+
/**
20+
* Reverse the migrations.
21+
*/
22+
public function down(): void
23+
{
24+
//
25+
}
26+
};

tests/Feature/OpenAiClientTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace Tests\Feature;
4+
5+
use Illuminate\Foundation\Testing\RefreshDatabase;
6+
use Illuminate\Foundation\Testing\WithFaker;
7+
use Tests\TestCase;
8+
9+
use App\LlmDriver\Responses\CompletionResponse;
10+
use App\LlmDriver\Responses\EmbeddingsResponseDto;
11+
use Illuminate\Support\Facades\Log;
12+
use OpenAI\Laravel\Facades\OpenAI;
13+
use OpenAI\Responses\Completions\CreateResponse as CompletionsCreateResponse;
14+
use OpenAI\Responses\Embeddings\CreateResponse;
15+
16+
class OpenAiClientTest extends TestCase
17+
{
18+
/**
19+
* A basic feature test example.
20+
*/
21+
public function test_openai_client(): void
22+
{
23+
OpenAI::fake([
24+
CreateResponse::fake([
25+
'embeddings' => [
26+
[
27+
'embedding' => 'awesome!',
28+
],
29+
],
30+
]),
31+
]);
32+
33+
$openaiClient = new \App\LlmDriver\OpenAiClient();
34+
$response = $openaiClient->embedData('test');
35+
$this->assertInstanceOf(EmbeddingsResponseDto::class, $response);
36+
}
37+
38+
public function test_completion(): void
39+
{
40+
OpenAI::fake([
41+
CompletionsCreateResponse::fake([
42+
'choices' => [
43+
[
44+
'choice' => 'awesome!',
45+
],
46+
],
47+
]),
48+
]);
49+
50+
$openaiClient = new \App\LlmDriver\OpenAiClient();
51+
$response = $openaiClient->completion('test');
52+
$this->assertInstanceOf(CompletionResponse::class, $response);
53+
}
54+
}

0 commit comments

Comments
 (0)