Added database memory with keywords / content and functions to use it

This commit is contained in:
Thommy Bucaille 2023-12-22 01:17:09 +01:00
parent e4f87c06e9
commit 1ec34aa001
4 changed files with 221 additions and 2 deletions

View File

@ -8,6 +8,7 @@ use Core\Cache;
use Core\Helper;
use Exception;
use Mails\CustomEmail;
use Models\Memory;
use Models\User;
use OpenAI;
use OpenAI\Responses\Chat\CreateResponse;
@ -62,10 +63,11 @@ class ChatController extends BaseController{
'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.
Aussi, au besoin assure toi de lire t'es données afin de savoir se que tu dis, prévoir t'es réponses, et ne pas enregistrer des choses en double inutilement.
Lorsque Thommy parle, tu dois noter se qui te semble important à propos de lui dans t'es fichiers afin d'être capable de le reproduire au mieux dans t'es échanges.
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.
"
@ -82,7 +84,7 @@ class ChatController extends BaseController{
[
'role' => 'system',
'content' => "
Souviens toi de toujours sauvegarder les informations que tu reçois utiles dans t'es fichiers sans demander. Organise toi comme tu le souhaite.
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.
",
]
@ -302,6 +304,69 @@ class ChatController extends BaseController{
],
],
],
// Add memory data
[
'type' => 'function',
'function' => [
'name' => 'add_memory',
'description' => 'Add memory data to remember',
'parameters' => [
'type' => 'object',
'properties' => [
'keywords' => [
'type' => 'array',
'description' => 'The keywords',
'items' => [
'type' => 'string',
],
],
'content' => [
'type' => 'string',
'description' => 'The content',
],
],
'required' => ['keywords', 'content'],
],
],
],
// Search memory data
[
'type' => 'function',
'function' => [
'name' => 'search_memory',
'description' => 'Search memory data',
'parameters' => [
'type' => 'object',
'properties' => [
'keywords' => [
'type' => 'array',
'description' => 'The keywords',
'items' => [
'type' => 'string',
],
],
],
'required' => ['keywords'],
],
],
],
// Remove memory data
[
'type' => 'function',
'function' => [
'name' => 'remove_memory',
'description' => 'Remove memory data',
'parameters' => [
'type' => 'object',
'properties' => [
'id' => [
'type' => 'integer',
'description' => 'The memory id',
],
'required' => ['id'],
],
],
],
// Recupérer la date de dernière activité de thommy
[
'type' => 'function',
@ -779,6 +844,54 @@ class ChatController extends BaseController{
}
}
private function add_memory($keywords, $content) {
try {
$res = Memory::add($keywords, $content);
if($res) {
return 'The memory data has been successfully added.';
}
else {
return 'Sorry, I couldn\'t add the memory data.';
}
}
catch(Exception $e) {
return 'Sorry, I couldn\'t add the memory data. Error: ' . $e->getMessage();
}
}
private function search_memory($keywords) {
try {
$res = Memory::search($keywords);
if($res) {
return 'The memory data has been successfully found. Result: ' . json_encode($res);
}
else {
return 'Sorry, I couldn\'t find the memory data.';
}
}
catch(Exception $e) {
return 'Sorry, I couldn\'t find the memory data. Error: ' . $e->getMessage();
}
}
private function remove_memory($id) {
try {
$res = Memory::where('id', $id)->delete();
if($res) {
return 'The memory data has been successfully removed.';
}
else {
return 'Sorry, I couldn\'t remove the memory data.';
}
}
catch(Exception $e) {
return 'Sorry, I couldn\'t remove the memory data. Error: ' . $e->getMessage();
}
}
private function get_last_activity() {
$thommy = User::find(1);
return 'The last activity of Thommy was on ' . $thommy->last_online . '.';

View File

@ -5,6 +5,7 @@ use Core\BaseController;
use Core\Lang;
use Core\View;
use Mails\CustomEmail;
use Models\Memory;
class HomeController extends BaseController{

View File

@ -394,6 +394,13 @@ class BaseModel implements \IteratorAggregate {
return $this;
}
// Like operator
if($operator == 'like') {
$this->where .= ($this->where == '' ? '' : ' OR ') . $column . ' LIKE ?';
$this->params[] = $value;
return $this;
}
$this->where .= ($this->where == '' ? '' : ' AND ') . $column . ' ' . $operator . ' ?';
$this->params[] = $value;
return $this;
@ -416,6 +423,34 @@ class BaseModel implements \IteratorAggregate {
$value = $operator;
$operator = '=';
}
if($value === null && $operator == '=') {
$operator = 'IS';
$value = 'NULL';
}elseif($value === null && $operator == '!=') {
$operator = 'IS NOT';
$value = 'NULL';
}
// Where IN operator
if(is_array($value)) {
$this->where .= ($this->where == '' ? '' : ' OR ') . $column . ' IN (' . implode(', ', array_fill(0, count($value), '?')) . ')';
$this->params = array_merge($this->params, $value);
return $this;
}
if($value === "NULL") {
$this->where .= ($this->where == '' ? '' : ' OR ') . $column . ' ' . $operator . ' NULL';
return $this;
}
// Like operator
if($operator == 'like') {
$this->where .= ($this->where == '' ? '' : ' OR ') . $column . ' LIKE ?';
$this->params[] = $value;
return $this;
}
$this->where .= ($this->where == '' ? '' : ' OR ') . $column . ' ' . $operator . ' ?';
$this->params[] = $value;
return $this;
@ -564,6 +599,10 @@ class BaseModel implements \IteratorAggregate {
else
throw new \Exception('Unknown default type for field ' . $field['name'] . ' in model ' . get_class($this) . ' : ' . gettype($field['default']));
}
// index
if(isset($field['index']) && $field['index'] === true) {
$sql .= ', INDEX ' . $field['name'] . '_index (' . $field['name'] . ')';
}
$sql .= ', ';
}
$sql .= 'PRIMARY KEY (' . $this->primaryKey . '))';
@ -620,6 +659,10 @@ class BaseModel implements \IteratorAggregate {
else
throw new \Exception('Unknown default type for field ' . $field['name'] . ' in model ' . get_class($this) . ' : ' . gettype($field['default']));
}
// index
if(isset($field['index']) && $field['index'] === true) {
$sql .= ', INDEX ' . $field['name'] . '_index (' . $field['name'] . ')';
}
$query = $this->db->prepare($sql);
$query->execute();
}
@ -648,6 +691,10 @@ class BaseModel implements \IteratorAggregate {
else
throw new \Exception('Unknown default type for field ' . $field['name'] . ' in model ' . get_class($this) . ' : ' . gettype($field['default']));
}
// index
if(isset($field['index']) && $field['index'] === true) {
$sql .= ', INDEX ' . $field['name'] . '_index (' . $field['name'] . ')';
}
$query = $this->db->prepare($sql);
$query->execute();
}

58
src/Models/Memory.php Normal file
View File

@ -0,0 +1,58 @@
<?php
namespace Models;
use Core\BaseModel;
class Memory extends BaseModel {
protected $version = '1.0.0';
public static function add(array $keywords, string $content) {
$keywords = implode(',', $keywords);
$content = strtolower($content);
$memory = new self();
$memory->keywords = $keywords;
$memory->content = $content;
$memory->save();
return $memory;
}
public static function search(array $keywords) {
$memory = new self();
foreach ($keywords as $keyword) {
$memory->orWhere('keywords', 'like', "%$keyword%");
}
$memory->orderBy('id', 'desc');
$result = $memory->get();
return $result->map(function($item) {
return $item->toArray();
})->toArray();
}
// Install the Memory table
public function install($fields) {
$fields = array_merge($fields, [
[
'name' => 'keywords',
'type' => 'varchar',
'length' => 255,
'null' => false,
'index' => true
],
[
'name' => 'content',
'type' => 'text',
'null' => false
],
]);
parent::install($fields);
}
}