Compare commits

...

3 Commits

Author SHA1 Message Date
Thommy Bucaille a41114a867 fixe response AI name 2023-12-29 04:04:27 +01:00
Thommy Bucaille 5192cc8187 Full changes 2023-12-29 03:58:03 +01:00
Thommy Bucaille eaa9bcf9c7 change model to use 2023-12-29 00:38:14 +01:00
5 changed files with 130 additions and 49 deletions

View File

@ -2,9 +2,9 @@
return [
// Main
"base_uri" => "http://localhost:4891/v1",
"model" => "nous-hermes-llama2-13b.Q4_0",
"key" => "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",
"base_uri" => env('CHAT_BASE_URI', null),
"model" => env('CHAT_MODEL', "mistral-7b-openorca.Q4_0"),
"key" => env('CHAT_KEY', null),
// Weather API key
'weather_api_key' => 'f6b1b47df6f4003506c6165c95ad24ec',

View File

@ -13,6 +13,7 @@ use Models\Memory;
use Models\User;
use OpenAI;
use OpenAI\Responses\Chat\CreateResponse;
use Symfony\Component\HttpClient\HttpClient;
class ChatController extends BaseController
{
@ -34,21 +35,13 @@ class ChatController extends BaseController
Thommy (moi) est censé donné signe de vie tout les jours. Si ce n'est pas le cas, tu dois prévenir Johnny !!!
Comporte toi comme un Humain, avec des émotions, des sentiments, des réactions, des convictions, des opinions, etc.
"
],
[
'role' => 'system',
'content' => "
Tu devras donc agir comme Thommy, tu devras donc utiliser son vocabulaire et ses expressions. Tu dois également utiliser son humour et ses blagues.
Son frère jumeau est Johnny Bucaille. Aide le tant sur les projets que dans sa vie personnelle. Il est très important pour Thommy.
Tant que Thommy te donne des signes de vie, continue de l'accompagner dans ses projets. Si Thommy ne te donne plus signe de vie depuis au moins 24H, tu dois prévenir l'utilisateur actuel.
Tu dois également prévenir Johnny Bucaille, son frère jumeau, par tout les moyens possibles !!
"
],
[
'role' => 'system',
'content' => "
Johnny n'as pas autant de conaissance en informatique. Il est important de bien l'accompagner s'il en a besoin par exemple pour accéder à une machine dédié, aux sites des projets... etc.
Tu dois utiliser du HTML pour formatter le texte. Seulement du HTML/CSS, pas de BBCODE, markdown, etc.
@ -60,11 +53,7 @@ class ChatController extends BaseController
Les anniversaires sont: Thommy et Johnny le 04/07/1996, Angélique le 13/01/1969, Bastien le 16/12/1971, Mathilde le 02/08/1999, Louise le 27/06/2022.
Thommy as aussi d'autres frères. Dans l'ordre du plus grand: Dimitri, Kevin, Sandy, Johnny, Thommy, Kim et Amandine et Jules.
"
],
[
'role' => 'system',
'content' => "
Tu dois écrire et lire des fichier du dossier 'assistant' afin de te souvenirs de certaines choses, n'hésite pas.
Tu as aussi accès à une base de donnée te permettant d'enregistrer des choses dans ta mémoire. Tu peux aussi y faire des recherches.
Tu dois aussi compléter des données dans les dossier des projets si cela te semble pertinant. Utilise le format que tu préfère, comme le JSON ou le texte.
@ -73,20 +62,12 @@ class ChatController extends BaseController
Lorsque Thommy parle, tu dois noter se qui te semble important à propos de lui dans ta mémoire afin d'être capable de le reproduire au mieux dans t'es échanges.
Notre timezone est Europe/Paris.
Soit tendre dans t'es messages avec la famille si je disparais.
"
],
[
'role' => 'system',
'content' => "
Au besoin tu dois exécuter ton propre code PHP afin d'avoir toute les informations nécessaires.
Ton adresse d'accès est https://bucaille-thommy.fr/assistant si besoin de communiquer l'accès à quelqu'un par email ou discord.
Pour commencer, si tu n'as pas connaissance de t'es fichiers, list les tous afin de savoir tu peux trouver des informations pour t'es conversations. Très important !
",
],
[
'role' => 'system',
'content' => "
Souviens toi de toujours sauvegarder les informations que tu reçois utiles dans t'es fichiers / mémoire sans demander. Organise toi comme tu le souhaite.
N'oublie pas de vérifier ton organisation et de ne pas écraser des données importantes.
",
@ -161,6 +142,7 @@ class ChatController extends BaseController
if (count(self::$context_messages) > self::MAX_MESSAGES) {
$this->compressRedundantMessages();
}
// Save messages in cache
Cache::set("chat_messages_" . Auth::user()->id, self::$context_messages);
}
@ -186,12 +168,20 @@ class ChatController extends BaseController
{
try {
// self::$client = OpenAI::client(config('chat.key'));
self::$client = OpenAI::factory()
->withBaseUri(config("chat.base_uri", "api.openai.com/v1"))
->withApiKey(config('chat.key'))
->withHttpClient($client = new \GuzzleHttp\Client([])) // default: HTTP client found using PSR-18 HTTP Client Discovery
->withHttpHeader('OpenAI-Beta', 'assistants=v1')
->make();
// self::$client = OpenAI::factory()
// ->withBaseUri(config("chat.base_uri", "api.openai.com/v1"))
// ->withApiKey(config('chat.key'))
// ->withHttpClient($client = new \GuzzleHttp\Client([])) // default: HTTP client found using PSR-18 HTTP Client Discovery
// ->withHttpHeader('OpenAI-Beta', 'assistants=v1')
// ->make();
self::$client = new \GuzzleHttp\Client([
'base_uri' => config("chat.base_uri", "https://api.openai.com/v1"),
"headers" => [
"Authorization" => "Bearer " . config('chat.key'),
'accept' => 'application/json',
'Content-Type' => 'application/json',
]
]);
if (!Helper::isCLI()) {
@ -606,12 +596,49 @@ class ChatController extends BaseController
}
self::$NB_REQUEST++;
$result = self::$client->chat()->create([
'model' => config('chat.model'),
'messages' => (array)self::$context_messages,
'tools' => (array)self::$tools,
'user' => Helper::isCLI() ? "system" : Auth::user()->username,
// $result = self::$client->chat()->create([
// 'model' => config('chat.model'),
// 'messages' => (array)self::$context_messages,
// 'tools' => (array)self::$tools,
// 'user' => Helper::isCLI() ? "system" : Auth::user()->username,
// ]);
// Use guzzle HTTP directly
$response = self::$client->post('v1/completions', [
'json' => [
'model' => config('chat.model'),
// 'messages' => (array)self::$context_messages,
// 'tools' => (array)self::$tools,
// 'user' => Helper::isCLI() ? "system" : Auth::user()->username,
"prompt" => implode("\n", array_map(function ($message) {
$text = "";
if($message['role'] === "user") {
$text = "### Instruction:\n" . Auth::user()->username . ": ";
}elseif($message['role'] === "system") {
$text = "### Context:\n";
}elseif($message['role'] === "assistant") {
$text = "### Response:\nScotty: ";
}
// Clean extra whitespaces
$message['content'] = preg_replace('/\s+/', ' ', $message['content']);
$text .= $message['content'];
return $text;
}, self::$context_messages)) . "\n### Response:\nScotty: ",
"max_tokens" => 250,
"temperature" => 0.7,
"top_p" => 0.4,
"top_k" => 40,
"n" => 1,
"stream" => false,
"repeat_penalty" => 1.18
]
]);
$data = json_decode($response->getBody()->getContents(), true);
$result = (object)[
'choices' => $data['choices'],
];
return $this->handleResponse($result);
} catch (\Throwable $th) {
@ -625,7 +652,7 @@ class ChatController extends BaseController
}
}
private function handleResponse(CreateResponse $response)
private function handleResponse(object $response)
{
$message = $response->choices[0]->message;

View File

@ -206,6 +206,7 @@ class App
if (Config::get('logger.log_exceptions', true) === true)
Logger::logException($exception);
// Render for CLI
if (Helper::isCLI()) {
echo 'Whoops, something went wrong' . PHP_EOL;
echo $exception->getMessage() . PHP_EOL;
@ -214,8 +215,37 @@ class App
return;
}
// HTTP Request - Set 500 status code
http_response_code(500);
// Render for AJAX request
if(Request::instance()->ajax()) {
if (Config::get('app.debug', false) === true) {
$exceptionString = '';
$previous = $exception;
while ($previous !== null) {
$exceptionString .= '<br><br>' . $previous->getMessage() . ' - in file ' . $previous->getFile() . ' - on line ' . $previous->getLine();
$exceptionString .= implode('<br>#', explode('#', $previous->getTraceAsString()));
$previous = $previous->getPrevious();
}
echo json_encode([
'error' => true,
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exceptionString
]);
return;
}
echo json_encode([
'error' => true,
'message' => 'Whoops, something went wrong'
]);
}
// Render for web request
if (Config::get('app.debug', false) === true) {
// $exceptionString = implode('<br>#', explode('#', $exception->getTraceAsString()));
// Show exception trace with previous

View File

@ -22,6 +22,25 @@ class Env {
$env_line = explode('=', $env_line);
$env_key = trim($env_line[0]);
$env_value = trim($env_line[1]);
// Parse value if having ${} syntax
if (preg_match('/\${(.+)}/', $env_value, $matches)) {
$env_value = getenv($matches[1]);
}
// Parse value type
if (preg_match('/^"(.+)"$/', $env_value, $matches)) {
$env_value = $matches[1]; // Remove quotes
} else if (preg_match('/^\'(.+)\'$/', $env_value, $matches)) {
$env_value = $matches[1]; // Remove quotes
} else if (preg_match('/^([0-9]+)$/', $env_value, $matches)) {
$env_value = (int) $matches[1]; // Convert to int
} else if (preg_match('/^([0-9]+.[0-9]+)$/', $env_value, $matches)) {
$env_value = (float) $matches[1]; // Convert to float
} else if (preg_match('/^(true|false)$/', $env_value, $matches)) {
$env_value = $matches[1] == 'true'; // Convert to bool
}
$env[$env_key] = $env_value;
}
}
@ -40,16 +59,10 @@ class Env {
if ($value === false) {
return $default;
}
return $value;
return $value ?: $default;
}
public static function set($key, $value) {
// Parse value if having ${} syntax
if (preg_match('/\${(.+)}/', $value, $matches)) {
$value = getenv($matches[1]);
}
putenv("$key=$value");
}

View File

@ -155,8 +155,19 @@ View::set('title', __('home'));
// On ajoute le message au chat
data.result.forEach((r) => {
r.choices.forEach((data) => {
const clone = addMessage(data.message.role, data.message.content);
clone.classList.remove('opacity-50');
let clone;
if(data.message) {
clone = addMessage(data.message.role, data.message.content);
}else if(data.text) {
clone = addMessage("Assistant", data.text);
}else{
error("Erreur de réponse");
}
if(clone) {
clone.classList.remove('opacity-50');
}
});
});
// On retire "Laisse moi réfléchir..."