Skip to content

Commit 869349b

Browse files
Merge pull request #42 from bootstrapguru/feature/adds-open-router-support
Adds Open Router Iintegration
2 parents 84cf151 + eca02c6 commit 869349b

File tree

5 files changed

+127
-0
lines changed

5 files changed

+127
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace App\Integrations\OpenRouter;
4+
5+
use Saloon\Http\Connector;
6+
use Saloon\Http\Response;
7+
use Saloon\Traits\Plugins\AcceptsJson;
8+
9+
class OpenRouterConnector extends Connector
10+
{
11+
use AcceptsJson;
12+
13+
public function resolveBaseUrl(): string
14+
{
15+
return 'https://openrouter.ai/api/v1';
16+
}
17+
18+
/**
19+
* Default headers for every request
20+
*/
21+
protected function defaultHeaders(): array
22+
{
23+
return [
24+
'Authorization' => 'Bearer '.config('aiproviders.openrouter.api_key'),
25+
];
26+
}
27+
28+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace App\Integrations\OpenRouter\Requests;
4+
5+
use App\Data\MessageData;
6+
use App\Data\ToolCallData;
7+
use App\Models\Thread;
8+
use Saloon\Contracts\Body\HasBody;
9+
use Saloon\Enums\Method;
10+
use Saloon\Http\Request;
11+
use Saloon\Http\Response;
12+
use Saloon\Traits\Body\HasJsonBody;
13+
14+
class ChatRequest extends Request implements HasBody
15+
{
16+
use HasJsonBody;
17+
18+
protected Method $method = Method::POST;
19+
20+
public function __construct(
21+
public readonly Thread $thread,
22+
public readonly array $tools,
23+
public readonly ?string $customEndpoint = null
24+
) {}
25+
26+
public function resolveEndpoint(): string
27+
{
28+
return $this->customEndpoint ?? '/chat/completions';
29+
}
30+
31+
public function defaultBody(): array
32+
{
33+
$assistant = $this->thread->project->assistant;
34+
35+
return [
36+
'model' => $assistant->model,
37+
'messages' => $this->formatMessages($assistant),
38+
'tools' => array_values($this->tools)
39+
];
40+
}
41+
42+
private function formatMessages($assistant): array
43+
{
44+
return [
45+
[
46+
'role' => 'system',
47+
'content' => $assistant->prompt,
48+
],
49+
...$this->thread->messages->toArray(),
50+
];
51+
}
52+
53+
public function createDtoFromResponse(Response $response): MessageData
54+
{
55+
$data = $response->json();
56+
$message = $data['choices'][0]['message'] ?? [];
57+
$tools = collect([]);
58+
if (isset($message['tool_calls'])) {
59+
foreach ($message['tool_calls'] as $toolCall) {
60+
$tools->push(ToolCallData::from($toolCall));
61+
}
62+
63+
$message['tool_calls'] = $tools;
64+
}
65+
66+
return MessageData::from($message ?? []);
67+
}
68+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace App\Integrations\OpenRouter\Requests;
4+
5+
use App\Data\AIModelData;
6+
use Illuminate\Support\Collection;
7+
use Saloon\Enums\Method;
8+
use Saloon\Http\Request;
9+
use Saloon\Http\Response;
10+
11+
class ListModelsRequest extends Request
12+
{
13+
protected Method $method = Method::GET;
14+
15+
public function resolveEndpoint(): string
16+
{
17+
return '/models';
18+
}
19+
20+
public function createDtoFromResponse(Response $response): Collection
21+
{
22+
$data = $response->json()['data'];
23+
return collect($data)->map(fn ($model) => AIModelData::from(['name' => $model['id']]));
24+
}
25+
}

builds/dexor

-557 KB
Binary file not shown.

config/aiproviders.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
<?php
22

33
return [
4+
'openrouter' => [
5+
'api_key' => env('OPENROUTER_API_KEY'),
6+
'connector' => \App\Integrations\OpenRouter\OpenRouterConnector::class,
7+
'listModelsRequest' => \App\Integrations\OpenRouter\Requests\ListModelsRequest::class,
8+
'chatRequest' => \App\Integrations\OpenRouter\Requests\ChatRequest::class,
9+
],
410
'openai' => [
511
'api_key' => env('OPENAI_API_KEY'),
612
'connector' => \App\Integrations\OpenAI\OpenAIConnector::class,

0 commit comments

Comments
 (0)