Route Afia through the platform AI relay when no local API key is set.
Deploy Ladill Frontdesk / deploy (push) Successful in 45s
Deploy Ladill Frontdesk / deploy (push) Successful in 45s
Frontdesk now calls ladill.com/api/afia/chat using IDENTITY_API_KEY_FRONTDESK so production does not need a separate OpenAI key in the frontdesk .env. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -12,7 +12,11 @@ class AfiaService
|
||||
{
|
||||
public function enabled(): bool
|
||||
{
|
||||
return (bool) config('afia.enabled', true) && (string) config('afia.api_key', '') !== '';
|
||||
if (! (bool) config('afia.enabled', true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->hasLocalKey() || $this->hasPlatformRelay();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -25,6 +29,19 @@ class AfiaService
|
||||
throw new RuntimeException('Afia is not configured.');
|
||||
}
|
||||
|
||||
if ($this->hasLocalKey()) {
|
||||
return $this->chatLocally($message, $history, $context);
|
||||
}
|
||||
|
||||
return $this->chatViaPlatform($message, $history, $context);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, array{role: string, text: string}> $history
|
||||
* @param array<string, mixed> $context
|
||||
*/
|
||||
private function chatLocally(string $message, array $history, array $context): string
|
||||
{
|
||||
$provider = (string) config('afia.provider', 'openai');
|
||||
$model = (string) config('afia.model', 'gpt-4o-mini');
|
||||
$apiKey = (string) config('afia.api_key');
|
||||
@@ -44,6 +61,49 @@ class AfiaService
|
||||
: $this->viaOpenAi($model, $apiKey, $messages);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, array{role: string, text: string}> $history
|
||||
* @param array<string, mixed> $context
|
||||
*/
|
||||
private function chatViaPlatform(string $message, array $history, array $context): string
|
||||
{
|
||||
$base = rtrim((string) config('afia.platform_api_url', ''), '/');
|
||||
$token = (string) config('afia.platform_api_key', '');
|
||||
|
||||
$res = Http::withToken($token)->acceptJson()->timeout(50)->post($base.'/afia/chat', [
|
||||
'product' => (string) config('afia.product', 'frontdesk'),
|
||||
'message' => $message,
|
||||
'history' => $history,
|
||||
'system_prompt' => $this->systemPrompt($context),
|
||||
]);
|
||||
|
||||
if ($res->status() === 503) {
|
||||
throw new RuntimeException('Afia is not configured on the platform.');
|
||||
}
|
||||
|
||||
if ($res->failed()) {
|
||||
throw new RuntimeException('Platform Afia relay failed: '.$res->status());
|
||||
}
|
||||
|
||||
$reply = trim((string) $res->json('reply', ''));
|
||||
if ($reply === '') {
|
||||
throw new RuntimeException('Platform Afia relay returned an empty response.');
|
||||
}
|
||||
|
||||
return $reply;
|
||||
}
|
||||
|
||||
private function hasLocalKey(): bool
|
||||
{
|
||||
return (string) config('afia.api_key', '') !== '';
|
||||
}
|
||||
|
||||
private function hasPlatformRelay(): bool
|
||||
{
|
||||
return rtrim((string) config('afia.platform_api_url', ''), '/') !== ''
|
||||
&& (string) config('afia.platform_api_key', '') !== '';
|
||||
}
|
||||
|
||||
private function viaOpenAi(string $model, string $apiKey, array $messages): string
|
||||
{
|
||||
$res = Http::withToken($apiKey)->acceptJson()->timeout(45)
|
||||
@@ -63,7 +123,7 @@ class AfiaService
|
||||
|
||||
private function viaAnthropic(string $model, string $apiKey, array $messages): string
|
||||
{
|
||||
$system = $messages[0]['content'];
|
||||
$system = $messages[0]['content'] ?? '';
|
||||
$turns = array_values(array_filter($messages, fn ($m) => $m['role'] !== 'system'));
|
||||
|
||||
$res = Http::withHeaders([
|
||||
|
||||
Reference in New Issue
Block a user