AI

object

%AI

/phlo/resources/AI/AI.phlo
version 1.0
creator q-ai.nl
summary Unified AI facade with engine auto-detect
package ai
frontend false
backend true
requires @OpenAI? @Claude? @Gemini? @DeepSeek? @Grok?
tags ai facade llm streaming tools embeddings
prop

%AI -> model

line 10
'gpt-5.4-mini'
const

AI :: engines

line 11
['claude' => 'Claude', 'gpt' => 'OpenAI', 'chatgpt' => 'OpenAI', 'o1' => 'OpenAI', 'o3' => 'OpenAI', 'o4' => 'OpenAI', 'deepseek' => 'DeepSeek', 'gemini' => 'Gemini', 'grok' => 'Grok']
static

AI :: http (string $url, array $headers, bool $json = true, mixed $post = null):string

line 12
Deze functie initialiseert een cURL-sessie om HTTP-verzoeken te verzenden, waarbij zowel GET- als POST-methoden mogelijk zijn, met optionele JSON-codering voor de aanvraagbody en aangepaste headers.
$curl = curl_init($url)
if ($post !== null){
	curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST')
	if ($json && !is_string($post)) $post = json_encode($post, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
	if ($json) $headers[] = 'Content-Type: application/json'
	curl_setopt($curl, CURLOPT_POSTFIELDS, $post)
}
curl_setopt_array($curl, [CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => 300, CURLOPT_ENCODING => ''])
$res = curl_exec($curl)
if ($res === false) throw new \RuntimeException('HTTP error: '.curl_error($curl))
return $res
method

%AI -> resolve (...$args):array

line 25
$via = $args['via'] ?? void
unset($args['via'])
$args['model'] ??= %app->model ?? $this->model
if ($via) $via = static::engines[strtolower($via)] ?? $via
elseif (isset($args['model'])) $via = static::engines[strtolower(explode('-', $args['model'])[0])] ?? void
return [$via ?: 'OpenAI', $args]
method

%AI -> chat (...$args)

line 33
[$engine, $args] = $this->resolve(...$args)
return phlo($engine)->chat(...$args)
method

%AI -> stream (...$args):Generator

line 37
[$engine, $args] = $this->resolve(...$args)
return phlo($engine)->stream(...$args)
method

%AI -> embedding (...$args)

line 41
[$engine, $args] = $this->resolve(...$args)
return phlo($engine)->embedding(...$args)
method

%AI -> vision (...$args)

line 45
[$engine, $args] = $this->resolve(...$args)
return phlo($engine)->vision(...$args)
method

%AI -> transcribe (...$args)

line 49
[$engine, $args] = $this->resolve(...$args)
return phlo($engine)->transcribe(...$args)
object

%Claude

/phlo/resources/AI/Claude.phlo
version 1.1
creator q-ai.nl
summary Anthropic Claude API
package ai
frontend false
backend true
requires creds:Claude @AI
tags ai claude anthropic chat vision embeddings
const

Claude :: model

line 10
'claude-opus-4-8'
static

Claude :: context (...$args)

line 12
Initialiseert de context voor Claude door berichten en systeemparameters in te stellen, en zorgt ervoor dat gebruikers- en assistentberichten correct zijn opgemaakt en opgeslagen.
$args['messages'] ??= []
if (isset($args['system'])){
	$args['system'] = [['type' => 'text', 'text' => $args['system']]]
}
if (isset($args['assistant']) && array_push($args['messages'], ['role' => 'assistant', 'content' => $args['assistant']])) unset($args['assistant'])
if (isset($args['user']) && array_push($args['messages'], ['role' => 'user', 'content' => $args['user']])) unset($args['user'])
return $args
static

Claude :: tool ($tool):array

line 22
Dit maakt een associatieve array aan met de naam en beschrijving van een tool, samen met het invoerschema, dat de eigenschappen en vereiste argumenten voor de tool definieert.
[
	'name' => $tool->name,
	'description' => $tool->desc,
	'input_schema' => [
		'type' => 'object',
		'properties' => loop($tool->args, fn($data, $arg) => array_filter($data, fn($key) => in_array($key, ['type', 'enum', 'description']), ARRAY_FILTER_USE_KEY)),
		'required' => array_keys($tool->args),
	],
]
method

%Claude -> embedding ($input, $model = 'text-embedding-3-small')

line 32
Genereert een embedding voor de gegeven invoer met behulp van het opgegeven model, standaard 'text-embedding-3-small'.
%OpenAI->embedding($input, $model)
method

%Claude -> vision ($text, $image, $stream = false, ...$args)

line 34
Deze functie stuurt een tekst en een afbeelding naar een visiemodel, met de optie om de reactie te streamen of deze in een chatformaat terug te geven.
$data = is_string($image) && str_starts_with($image, 'http') ? file_get_contents($image) : $image
$messages = [['role' => 'user', 'content' => [['type' => 'text', 'text' => $text], ['type' => 'image', 'source' => ['type' => 'base64', 'media_type' => 'image/jpeg', 'data' => base64_encode($data)]]]]]
if ($stream) return $this->stream(...$args, messages: $messages)
else return $this->chat(...$args, messages: $messages)
method

%Claude -> chat (...$args)

line 41
Deze functie communiceert met de Claude API om een chatverzoek te verzenden en verwerkt de reactie, waarbij een object wordt geretourneerd met het antwoord, modelinformatie, tokengebruik en eventuele gebruikte tools tijdens de interactie.
$args['model'] ??= static::model
$args['max_tokens'] ??= 4096
$token = $args['token'] ?? null
unset($args['token'])
$args = static::context(...$args)
$res = $this->request('messages', token: $token, POST: $args)
$return = new obj(answer: void, model: $res->model, finish: $res->stop_reason, tokens: ($res->usage->input_tokens ?? 0) + ($res->usage->output_tokens ?? 0), tokens_in: $res->usage->input_tokens ?? 0, tokens_out: $res->usage->output_tokens ?? 0)
$tools = []
foreach ($res->content AS $block){
	if ($block->type === 'text') $return->answer = $block->text
	elseif ($block->type === 'tool_use') $tools[] = new obj(name: $block->name, args: (array)$block->input)
}
if ($tools) $return->tools = $tools
return $return
method

%Claude -> parseSSE (string $url, array $headers, array $payload):Generator

line 58
Stelt een Server-Sent Events (SSE) verbinding tot een opgegeven URL in, verzendt een JSON-payload en headers, en geeft de ontvangen gegevens van de stream terug, waarbij fouten en verbindingsstatus op de juiste manier worden afgehandeld.
$json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
$ctx = stream_context_create(['http' => ['method' => 'POST', 'header' => implode("\r\n", [...$headers, 'Content-Type: application/json', 'Content-Length: '.strlen($json)]), 'content' => $json, 'timeout' => 300, 'ignore_errors' => true]])
$stream = fopen($url, 'r', false, $ctx)
$stream || error('SSE connection failed')
$status = (int)explode(' ', $http_response_header[0] ?? 'HTTP/1.1 200')[1]
if ($status >= 400){
	$err = json_decode((string)stream_get_contents($stream))
	fclose($stream)
	error('Claude error '.$status.': '.($err->error->message ?? 'unknown'))
}
$finish = null
$usage = null
while (!feof($stream)){
	$line = fgets($stream)
	if ($line === false) break
	$line = rtrim($line, "\r\n")
	if (!str_starts_with($line, 'data:')) continue
	$data = ltrim(substr($line, 5))
	if ($data === void) continue
	$p = json_decode($data)
	if (!$p) continue
	if (isset($p->error)) error('Claude stream error: '.$p->error->message)
	if (($p->type ?? null) === 'message_delta'){
		$finish = $p->delta->stop_reason ?? $finish
		if (isset($p->usage)) $usage = $p->usage
	}
	if (($p->type ?? null) === 'content_block_delta' && ($p->delta->type ?? null) === 'text_delta' && isset($p->delta->text)) yield obj(text: $p->delta->text)
}
fclose($stream)
yield obj(done: true, finish: $finish, tokens_in: $usage?->input_tokens, tokens_out: $usage?->output_tokens)
method

%Claude -> stream (...$args):Generator

line 90
%res->streaming = true
$args['model'] ??= static::model
$args['max_tokens'] ??= 4096
$token = $args['token'] ?? null
unset($args['token'], $args['cb'])
$args = static::context(...$args)
$args['stream'] = true
if ($token) $headers = ['anthropic-version: 2023-06-01', 'anthropic-beta: oauth-2025-04-20', 'Authorization: Bearer '.$token]
else $headers = ['anthropic-version: 2023-06-01', 'x-api-key: '.%creds->Claude]
return $this->parseSSE('https://api.anthropic.com/v1/messages', $headers, $args)
method

%Claude -> request ($uri, ...$args)

line 103
Verstuurt een verzoek naar de Claude API met de opgegeven URI en argumenten, behandelt authenticatie met een token of API-sleutel, en retourneert de gedecodeerde JSON-respons.
$token = $args['token'] ?? null
if ($token) $headers = ['anthropic-version: 2023-06-01', 'anthropic-beta: oauth-2025-04-20', 'Authorization: Bearer '.$token]
else $headers = ['anthropic-version: 2023-06-01', 'x-api-key: '.%creds->Claude]
$res = json_decode(AI::http("https://api.anthropic.com/v1/$uri", $headers, true, $args['POST'] ?? null))
if (isset($res->error)) error('Claude Request error: '.$res->error->message)
return $res
object

%DeepSeek

/phlo/resources/AI/DeepSeek.phlo
version 2.0
creator q-ai.nl
summary DeepSeek API (OpenAI-compatible, extends OpenAI)
extends OpenAI
package ai
frontend false
backend true
requires creds:DeepSeek @OpenAI @AI
tags ai deepseek chat embeddings
const

DeepSeek :: model

line 11
DeepSeek::model is een component die de creatie en het beheer van modellen binnen het DeepSeek-framework vergemakkelijkt, waardoor efficiënte gegevensverwerking en interactie mogelijk is.
'deepseek-chat'
const

DeepSeek :: endpoint

line 12
'https://api.deepseek.com/v1/'
const

DeepSeek :: cred

line 13
'DeepSeek'
const

DeepSeek :: label

line 14
'DeepSeek'
method

%DeepSeek -> embedding ($input, $model = 'text-embedding-3-small')

line 16
Genereert een embedding voor de gegeven invoer met behulp van het opgegeven model, standaard ingesteld op 'text-embedding-3-small'.
%OpenAI->embedding($input, $model)
object

%Gemini

/phlo/resources/AI/Gemini.phlo
version 1.1
creator q-ai.nl
summary Google Gemini API
package ai
frontend false
backend true
requires creds:Gemini @AI
tags ai gemini google chat vision embeddings
const

Gemini :: model

line 10
Maakt een model in het Gemini-framework, waarmee gegevensstructuren kunnen worden gedefinieerd en gemanipuleerd.
'gemini-2.0-flash'
const

Gemini :: endpoint

line 11
Definieert een eindpunt voor toegang tot de Gemini API, waarmee interactie mogelijk is met het opgegeven model op de gegeven URL.
'https://generativelanguage.googleapis.com/v1beta/models/'
static

Gemini :: context (...$args)

line 13
Gemini::$context verwerkt invoerargumenten om een gestructureerde context voor een gesprek te creëren, waarbij systeem-, assistent- en gebruikersberichten in een inhoudsarray worden georganiseerd.
$args['contents'] ??= []
if (isset($args['system'])){
	$args['systemInstruction'] = ['parts' => [['text' => $args['system']]]]
	unset($args['system'])
}
if (isset($args['assistant']) && array_push($args['contents'], ['role' => 'model', 'parts' => [['text' => $args['assistant']]]])) unset($args['assistant'])
if (isset($args['user']) && array_push($args['contents'], ['role' => 'user', 'parts' => [['text' => $args['user']]]])) unset($args['user'])
return $args
static

Gemini :: tool ($tool):array

line 24
Gemini::$tool haalt de naam en beschrijving van een tool op, samen met de parameters, die type, eigenschappen en vereiste argumenten omvatten.
[
	'name' => $tool->name,
	'description' => $tool->desc,
	'parameters' => [
		'type' => 'object',
		'properties' => loop($tool->args, fn($data, $arg) => array_filter($data, fn($key) => in_array($key, ['type', 'enum', 'description']), ARRAY_FILTER_USE_KEY)),
		'required' => array_keys($tool->args),
	],
]
method

%Gemini -> embedding ($input, $model = 'text-embedding-004')

line 34
Genereert embeddings voor de gegeven invoertekst met behulp van het opgegeven model, standaard 'text-embedding-004'.
$this->request($model.':embedContent', POST: ['content' => ['parts' => [['text' => $input]]]])->embedding->values
method

%Gemini -> vision ($text, $image, $stream = false, ...$args)

line 36
Genereert een vision-reactie door tekst en een afbeelding te combineren, met een optionele streamingfunctie voor realtime-uitvoer.
$model = $args['model'] ?? static::model
unset($args['model'])
$contents = [['role' => 'user', 'parts' => [['text' => $text], ['inline_data' => ['mime_type' => 'image/jpeg', 'data' => base64_encode(is_string($image) && str_starts_with($image, 'http') ? file_get_contents($image) : $image)]]]]]
if ($stream) return $this->stream(...$args, model: $model, contents: $contents)
else return $this->chat(...$args, model: $model, contents: $contents)
method

%Gemini -> chat (...$args)

line 44
Genereert inhoud op basis van het opgegeven model en argumenten, en retourneert een object dat het gegenereerde antwoord, het gebruikte model, de reden voor beëindiging en details over het tokenverbruik bevat.
$model = $args['model'] ?? static::model
unset($args['model'])
$args = static::context(...$args)
$res = $this->request($model.':generateContent', POST: $args)
$return = new obj(answer: void, model: $model, finish: $res->candidates[0]->finishReason ?? void, tokens: ($res->usageMetadata->promptTokenCount ?? 0) + ($res->usageMetadata->candidatesTokenCount ?? 0), tokens_in: $res->usageMetadata->promptTokenCount ?? 0, tokens_out: $res->usageMetadata->candidatesTokenCount ?? 0)
$tools = []
foreach ($res->candidates[0]->content->parts ?? [] AS $part){
	if (isset($part->text)) $return->answer = $part->text
	elseif (isset($part->functionCall)) $tools[] = new obj(name: $part->functionCall->name, args: (array)$part->functionCall->args)
}
if ($tools) $return->tools = $tools
return $return
method

%Gemini -> parseSSE (string $url, array $headers, array $payload):Generator

line 59
Stelt een Server-Sent Events (SSE) verbinding tot een opgegeven URL in, verzendt een JSON-payload en headers, en geeft de ontvangen gegevens van de stream terug.
$json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
$ctx = stream_context_create(['http' => ['method' => 'POST', 'header' => implode("\r\n", [...$headers, 'Content-Type: application/json', 'Content-Length: '.strlen($json)]), 'content' => $json, 'timeout' => 300, 'ignore_errors' => true]])
$stream = fopen($url, 'r', false, $ctx)
$stream || error('SSE connection failed')
$status = (int)explode(' ', $http_response_header[0] ?? 'HTTP/1.1 200')[1]
if ($status >= 400){
	$err = json_decode((string)stream_get_contents($stream))
	fclose($stream)
	error('Gemini error '.$status.': '.($err->error->message ?? 'unknown'))
}
$finish = null
$usage = null
while (!feof($stream)){
	$line = fgets($stream)
	if ($line === false) break
	$line = rtrim($line, "\r\n")
	if (!str_starts_with($line, 'data:')) continue
	$data = ltrim(substr($line, 5))
	if ($data === void) continue
	$p = json_decode($data)
	if (!$p) continue
	if (isset($p->error)) error('Gemini stream error: '.$p->error->message)
	if (isset($p->usageMetadata)) $usage = $p->usageMetadata
	if ($p->candidates[0]->finishReason ?? null) $finish = $p->candidates[0]->finishReason
	$text = $p->candidates[0]->content->parts[0]->text ?? null
	if (!is_null($text)) yield obj(text: $text)
}
fclose($stream)
yield obj(done: true, finish: $finish, tokens_in: $usage?->promptTokenCount, tokens_out: $usage?->candidatesTokenCount)
method

%Gemini -> stream (...$args):Generator

line 90
%res->streaming = true
$model = $args['model'] ?? static::model
unset($args['model'], $args['cb'])
$args = static::context(...$args)
return $this->parseSSE(static::endpoint.$model.':streamGenerateContent?alt=sse', ['x-goog-api-key: '.%creds->Gemini], $args)
method

%Gemini -> request ($path, ...$args)

line 98
Verzendt een verzoek naar de Gemini API op het opgegeven pad met optionele argumenten, behandelt fouten en retourneert de gedecodeerde JSON-respons.
$res = json_decode(AI::http(static::endpoint.$path, ['x-goog-api-key: '.%creds->Gemini], true, $args['POST'] ?? null))
if (isset($res->error)) error('Gemini Request error: '.$res->error->message)
return $res
object

%Grok

/phlo/resources/AI/Grok.phlo
version 1.0
creator q-ai.nl
summary xAI Grok API (OpenAI-compatible, extends OpenAI)
extends OpenAI
package ai
frontend false
backend true
requires creds:Grok @OpenAI @AI
tags ai grok xai chat vision embeddings
const

Grok :: model

line 11
'grok-4'
const

Grok :: endpoint

line 12
'https://api.x.ai/v1/'
const

Grok :: cred

line 13
'Grok'
const

Grok :: label

line 14
'Grok'
method

%Grok -> embedding ($input, $model = 'text-embedding-3-small')

line 16
%OpenAI->embedding($input, $model)
object

%OpenAI

/phlo/resources/AI/OpenAI.phlo
version 1.0
creator q-ai.nl
summary Basic OpenAI functions
package ai
frontend false
backend true
requires creds:OpenAI @AI
tags ai openai llm chat embeddings audio vision
const

OpenAI :: model

line 10
'gpt-5.4-mini'
const

OpenAI :: endpoint

line 11
'https://api.openai.com/v1/'
const

OpenAI :: cred

line 12
'OpenAI'
const

OpenAI :: label

line 13
'OpenAI'
const

OpenAI :: voices

line 14
OpenAI::voices is een vooraf gedefinieerde lijst van stemopties die beschikbaar zijn voor gebruik in Phlo-toepassingen, waaronder 'alloy', 'echo', 'fable', 'onyx', 'nova' en 'shimmer'.
['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer']
static

OpenAI :: context (...$args):array

line 15
Deze functie initialiseert de 'messages'-array in de context van OpenAI en voegt systeem-, assistent- en gebruikersberichten toe zoals gespecificeerd in de invoerargumenten.
$args['messages'] ??= []
if (isset($args['system']) && array_unshift($args['messages'], ['role' => 'system', 'content' => $args['system']])) unset($args['system'])
if (isset($args['assistant']) && array_push($args['messages'], ['role' => 'assistant', 'content' => $args['assistant']])) unset($args['assistant'])
if (isset($args['user']) && array_push($args['messages'], ['role' => 'user', 'content' => $args['user']])) unset($args['user'])
return $args
static

OpenAI :: tool ($tool):array

line 22
Definieert een functie in OpenAI met gespecificeerde parameters, waaronder type, enum en beschrijving, terwijl strikte validatie van de argumenten wordt afgedwongen.
[
	'type' => 'function',
	'function' => [
		'name' => $tool->name,
		'description' => $tool->desc,
		'parameters' => [
			'type' => 'object',
			'properties' => loop($tool->args, fn($data, $arg) => array_filter($data, fn($key) => in_array($key, ['type', 'enum', 'desc']), ARRAY_FILTER_USE_KEY)),
			'additionalProperties' => false,
			'required' => array_keys($tool->args),
		],
		'strict' => true,
	],
]
method

%OpenAI -> chat (...$args):obj

line 36
Deze functie communiceert met de OpenAI API om chatvoltooiingen te genereren op basis van de opgegeven argumenten, en retourneert een object met de responsdetails zoals het gegenereerde antwoord, het gebruikte model en statistieken over het tokengebruik.
$args['model'] ??= static::model
$token = $args['token'] ?? null
unset($args['token'])
$args = static::context(...$args)
$res = $this->request('chat/completions', token: $token, POST: $args)
$return = new obj(answer: $res->choices[0]->message->content, model: $res->model, finish: $res->choices[0]->finish_reason, tokens: $res->usage->total_tokens, tokens_in: $res->usage->prompt_tokens, tokens_out: $res->usage->completion_tokens)
if (isset($res->choices[0]->message->tool_calls)) $return->tools = array_map(fn($tool) => new obj(name: $tool->function->name, args: json_decode($tool->function->arguments, true)), (array)$res->choices[0]->message->tool_calls)
return $return
method

%OpenAI -> embedding ($input, $model = 'text-embedding-3-small')

line 46
Genereert een embedding voor de gegeven invoer met behulp van het opgegeven model van OpenAI.
$this->request('embeddings', POST: ['input' => $input, 'model' => $model])->data[0]->embedding
method

%OpenAI -> parseSSE (string $url, array $headers, array $payload):Generator

line 47
$json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
$ctx = stream_context_create(['http' => ['method' => 'POST', 'header' => implode("\r\n", [...$headers, 'Content-Type: application/json', 'Content-Length: '.strlen($json)]), 'content' => $json, 'timeout' => 300, 'ignore_errors' => true]])
$stream = fopen($url, 'r', false, $ctx)
$stream || error('SSE connection failed')
$status = (int)explode(' ', $http_response_header[0] ?? 'HTTP/1.1 200')[1]
if ($status >= 400){
	$err = json_decode((string)stream_get_contents($stream))
	fclose($stream)
	error(static::label.' error '.$status.': '.($err->error->message ?? 'unknown'))
}
$finish = null
$usage = null
while (!feof($stream)){
	$line = fgets($stream)
	if ($line === false) break
	$line = rtrim($line, "\r\n")
	if (!str_starts_with($line, 'data:')) continue
	$data = ltrim(substr($line, 5))
	if ($data === '[DONE]' || $data === void) continue
	$p = json_decode($data)
	if (!$p) continue
	if (isset($p->error)) error(static::label.' stream error: '.$p->error->message)
	if (isset($p->usage)) $usage = $p->usage
	$text = $p->choices[0]->delta->content ?? null
	if (!is_null($text)) yield obj(text: $text)
	if ($p->choices[0]->finish_reason ?? null) $finish = $p->choices[0]->finish_reason
}
fclose($stream)
yield obj(done: true, finish: $finish, tokens_in: $usage?->prompt_tokens, tokens_out: $usage?->completion_tokens)
method

%OpenAI -> stream (...$args):Generator

line 78
%res->streaming = true
$args['model'] ??= static::model
$token = $args['token'] ?? null
unset($args['token'], $args['cb'])
$args = static::context(...$args)
$args['stream'] = true
$bearer = $token ?? %creds->{static::cred};
return $this->parseSSE(static::endpoint.'chat/completions', ['Authorization: Bearer '.$bearer], $args)
method

%OpenAI -> transcribe ($file, $model = 'whisper-1', ...$args):obj

line 88
Transcribeert audio van een gegeven bestand met behulp van het opgegeven model en retourneert details zoals duur, taal en getranscribeerde tekst.
if (is_string($file)) $file = new CURLFile($file)
elseif (is_a($file, 'file')) $file = $file->curl
$res = $this->request('audio/transcriptions', false, POST: [...$args, 'model' => $model, 'file' => $file, 'response_format' => 'verbose_json'])
return obj (
	model: $model,
	duration: $res->duration,
	lang: $res->language,
	text: $res->text,
)
method

%OpenAI -> vision ($text, $image, $stream = false, ...$args):obj

line 99
Deze functie stuurt een tekst en een afbeelding naar het OpenAI vision-model, met de optie om de reactie te streamen of deze in een chatformaat terug te geven.
$args['model'] ??= static::model
$messages = [['role' => 'user', 'content' => [['type' => 'text', 'text' => $text], ['type' => 'image_url', 'image_url' => ['url' => $image]]]]]
if ($stream) return $this->stream(...$args, messages: $messages)
else return $this->chat(...$args, messages: $messages)
method

%OpenAI -> request ($uri, $JSON = true, $token = null, ...$args)

line 105
$bearer = $token ?? %creds->{static::cred};
$res = json_decode(AI::http(static::endpoint.$uri, ['Authorization: Bearer '.$bearer], $JSON, $args['POST'] ?? null))
if (isset($res->error)) error(static::label.' Request error: '.$res->error->message)
return $res

Functions

function

answer($question, ...$options)

/phlo/resources/AI/answer.phlo line 10
	$prompt = 'You are an AI answer machine. '
	$prompt .= 'You give short, direct answers without repeating the subject. '
	$prompt .= 'You add no explanation, no extra text, and no quotation marks. '
	$prompt .= 'Always answer in the same language as the question.'.lf
	if ($options){
		$prompt .= 'The user asks a question. You choose exactly one of the options below as the answer. '
		$prompt .= 'Your answer matches exactly one of the options, with no extra words or punctuation. '
		$prompt .= 'If none of the options apply, answer with "-".'.lf.lf
		$prompt .= 'Question:'.lf.$question.lf.lf
		$prompt .= 'Options:'.lf
		$prompt .= implode(lf, $options)
	}
	else {
		$prompt .= 'Give a short and precise answer to the question. '
		$prompt .= 'No introduction, no explanation, no list, and no final period.'.lf.lf
		$prompt .= 'Question:'.lf.$question
	}
	$answer = %AI->chat(user: $prompt, temperature: .1)->answer
	return $answer === dash ? null : $answer

We gebruiken essentiële cookies om deze site te laten werken. Met uw toestemming gebruiken we ook analytics om de site te verbeteren.