Added database memory with keywords / content and functions to use it
This commit is contained in:
parent
e4f87c06e9
commit
1ec34aa001
|
@ -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 . '.';
|
||||
|
|
|
@ -5,6 +5,7 @@ use Core\BaseController;
|
|||
use Core\Lang;
|
||||
use Core\View;
|
||||
use Mails\CustomEmail;
|
||||
use Models\Memory;
|
||||
|
||||
class HomeController extends BaseController{
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue