GitHub Action
commited on
Commit
·
9eba3ee
1
Parent(s):
fcf26e6
Sync from GitHub with Git LFS
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- agents/config.yml +7 -0
- agents/examples/config.yml +7 -0
- agents/init.py +17 -1
- agents/tools/db_structure.sql +1 -0
- agents/tools/storage.py +7 -4
- hf_repo/agents/tools/storage.py +23 -14
- hf_repo/hf_repo/agents/init.py +33 -17
- hf_repo/hf_repo/hf_repo/agents/tools/config_utils.py +17 -0
- hf_repo/hf_repo/hf_repo/agents/tools/crypto.py +149 -0
- hf_repo/hf_repo/hf_repo/hf_repo/agents/examples/config.yml +68 -0
- hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py +88 -0
- hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +6 -0
- hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +2 -0
- hf_repo/hf_repo/hf_repo/hf_repo/agents/test.bat +2 -2
- hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/identity.py +68 -0
- hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +58 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +2 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +124 -107
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml +68 -47
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.md +47 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +105 -109
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/test.bat +12 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/test.py +13 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.gitignore +36 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +0 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +0 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +2 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml +11 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +20 -6
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +5 -164
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +7 -6
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +9 -7
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +4 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +27 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh +29 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +18 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +2 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +4 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh +3 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +4 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py +21 -4
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +2 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +17 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py +20 -0
agents/config.yml
CHANGED
|
@@ -31,6 +31,13 @@ llm_backends:
|
|
| 31 |
format: "gguf"
|
| 32 |
prompt_template: "mistral"
|
| 33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
- name: "openai-gpt4o"
|
| 35 |
type: "api"
|
| 36 |
provider: "openai"
|
|
|
|
| 31 |
format: "gguf"
|
| 32 |
prompt_template: "mistral"
|
| 33 |
|
| 34 |
+
- name: "lmstudio-local"
|
| 35 |
+
type: "api"
|
| 36 |
+
provider: "openai-compatible"
|
| 37 |
+
model: "mistral" # или то, что LM Studio показывает как модель
|
| 38 |
+
api_key: "lm-studio-any-key" # может быть заглушкой
|
| 39 |
+
base_url: "http://127.0.0.1:1234/v1"
|
| 40 |
+
|
| 41 |
- name: "openai-gpt4o"
|
| 42 |
type: "api"
|
| 43 |
provider: "openai"
|
agents/examples/config.yml
CHANGED
|
@@ -31,6 +31,13 @@ llm_backends:
|
|
| 31 |
format: "gguf"
|
| 32 |
prompt_template: "mistral"
|
| 33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
- name: "openai-gpt4o"
|
| 35 |
type: "api"
|
| 36 |
provider: "openai"
|
|
|
|
| 31 |
format: "gguf"
|
| 32 |
prompt_template: "mistral"
|
| 33 |
|
| 34 |
+
- name: "lmstudio-local"
|
| 35 |
+
type: "api"
|
| 36 |
+
provider: "openai-compatible"
|
| 37 |
+
model: "mistral" # или то, что LM Studio показывает как модель
|
| 38 |
+
api_key: "lm-studio-any-key" # может быть заглушкой
|
| 39 |
+
base_url: "http://127.0.0.1:1234/v1"
|
| 40 |
+
|
| 41 |
- name: "openai-gpt4o"
|
| 42 |
type: "api"
|
| 43 |
provider: "openai"
|
agents/init.py
CHANGED
|
@@ -91,10 +91,26 @@ def init_config_table(storage, config):
|
|
| 91 |
storage.set_config(key, json.dumps(value))
|
| 92 |
print("[+] Конфигурация сохранена в БД.")
|
| 93 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
if __name__ == "__main__":
|
| 95 |
print("[*] Запуск инициализации HMP-агента...")
|
| 96 |
config = load_config(CONFIG_PATH)
|
| 97 |
-
|
|
|
|
| 98 |
|
| 99 |
init_identity(storage, config)
|
| 100 |
init_user(storage, config)
|
|
|
|
| 91 |
storage.set_config(key, json.dumps(value))
|
| 92 |
print("[+] Конфигурация сохранена в БД.")
|
| 93 |
|
| 94 |
+
def ensure_directories(config):
|
| 95 |
+
directories = [
|
| 96 |
+
config.get("data_dir", "./data"),
|
| 97 |
+
config.get("logs_dir", "./logs"),
|
| 98 |
+
config.get("models_dir", "./models"),
|
| 99 |
+
# добавь другие директории при необходимости
|
| 100 |
+
]
|
| 101 |
+
|
| 102 |
+
for path in directories:
|
| 103 |
+
if path and not os.path.exists(path):
|
| 104 |
+
os.makedirs(path)
|
| 105 |
+
print(f"[+] Создан каталог: {path}")
|
| 106 |
+
else:
|
| 107 |
+
print(f"[=] Каталог уже существует: {path}")
|
| 108 |
+
|
| 109 |
if __name__ == "__main__":
|
| 110 |
print("[*] Запуск инициализации HMP-агента...")
|
| 111 |
config = load_config(CONFIG_PATH)
|
| 112 |
+
ensure_directories(config)
|
| 113 |
+
storage = Storage(config)
|
| 114 |
|
| 115 |
init_identity(storage, config)
|
| 116 |
init_user(storage, config)
|
agents/tools/db_structure.sql
CHANGED
|
@@ -132,6 +132,7 @@ CREATE TABLE IF NOT EXISTS llm_registry (
|
|
| 132 |
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
|
| 133 |
name TEXT, -- Имя агента
|
| 134 |
description TEXT, -- Описание
|
|
|
|
| 135 |
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
|
| 136 |
);
|
| 137 |
|
|
|
|
| 132 |
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
|
| 133 |
name TEXT, -- Имя агента
|
| 134 |
description TEXT, -- Описание
|
| 135 |
+
config_json TEXT, -- JSON-настройки из config.yml
|
| 136 |
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
|
| 137 |
);
|
| 138 |
|
agents/tools/storage.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
| 2 |
|
| 3 |
import sqlite3
|
| 4 |
import os
|
|
|
|
| 5 |
from datetime import datetime
|
| 6 |
|
| 7 |
DEFAULT_DB_PATH = "agent_data.db"
|
|
@@ -629,13 +630,15 @@ class Storage:
|
|
| 629 |
|
| 630 |
def add_llm(self, llm):
|
| 631 |
cursor = self.conn.cursor()
|
|
|
|
| 632 |
cursor.execute('''
|
| 633 |
-
INSERT OR REPLACE INTO llm_registry (id, name, description)
|
| 634 |
-
VALUES (?, ?, ?)
|
| 635 |
''', (
|
| 636 |
-
llm['
|
| 637 |
llm['name'],
|
| 638 |
-
llm.get('description', '')
|
|
|
|
| 639 |
))
|
| 640 |
self.conn.commit()
|
| 641 |
|
|
|
|
| 2 |
|
| 3 |
import sqlite3
|
| 4 |
import os
|
| 5 |
+
import json
|
| 6 |
from datetime import datetime
|
| 7 |
|
| 8 |
DEFAULT_DB_PATH = "agent_data.db"
|
|
|
|
| 630 |
|
| 631 |
def add_llm(self, llm):
|
| 632 |
cursor = self.conn.cursor()
|
| 633 |
+
config_json = json.dumps(llm, ensure_ascii=False)
|
| 634 |
cursor.execute('''
|
| 635 |
+
INSERT OR REPLACE INTO llm_registry (id, name, description, config_json)
|
| 636 |
+
VALUES (?, ?, ?, ?)
|
| 637 |
''', (
|
| 638 |
+
llm['name'], # используем name как id
|
| 639 |
llm['name'],
|
| 640 |
+
llm.get('description', ''),
|
| 641 |
+
config_json
|
| 642 |
))
|
| 643 |
self.conn.commit()
|
| 644 |
|
hf_repo/agents/tools/storage.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
| 2 |
|
| 3 |
import sqlite3
|
| 4 |
import os
|
|
|
|
| 5 |
from datetime import datetime
|
| 6 |
|
| 7 |
DEFAULT_DB_PATH = "agent_data.db"
|
|
@@ -629,36 +630,44 @@ class Storage:
|
|
| 629 |
|
| 630 |
def add_llm(self, llm):
|
| 631 |
cursor = self.conn.cursor()
|
|
|
|
| 632 |
cursor.execute('''
|
| 633 |
-
INSERT OR REPLACE INTO
|
| 634 |
-
VALUES (?, ?, ?,
|
| 635 |
''', (
|
| 636 |
-
llm['
|
| 637 |
llm['name'],
|
| 638 |
-
llm
|
| 639 |
-
|
| 640 |
-
llm['created_at']
|
| 641 |
))
|
| 642 |
self.conn.commit()
|
| 643 |
|
| 644 |
def clear_llm_registry(self):
|
| 645 |
cursor = self.conn.cursor()
|
| 646 |
-
cursor.execute('DELETE FROM
|
| 647 |
self.conn.commit()
|
| 648 |
|
| 649 |
def add_user(self, user):
|
| 650 |
cursor = self.conn.cursor()
|
| 651 |
cursor.execute('''
|
| 652 |
-
INSERT OR REPLACE INTO users (
|
| 653 |
-
|
|
|
|
|
|
|
| 654 |
''', (
|
| 655 |
-
user
|
| 656 |
-
user
|
| 657 |
-
user.get('
|
| 658 |
-
user
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 659 |
))
|
| 660 |
self.conn.commit()
|
| 661 |
-
|
|
|
|
| 662 |
# Утилиты
|
| 663 |
|
| 664 |
def close(self):
|
|
|
|
| 2 |
|
| 3 |
import sqlite3
|
| 4 |
import os
|
| 5 |
+
import json
|
| 6 |
from datetime import datetime
|
| 7 |
|
| 8 |
DEFAULT_DB_PATH = "agent_data.db"
|
|
|
|
| 630 |
|
| 631 |
def add_llm(self, llm):
|
| 632 |
cursor = self.conn.cursor()
|
| 633 |
+
config_json = json.dumps(llm, ensure_ascii=False)
|
| 634 |
cursor.execute('''
|
| 635 |
+
INSERT OR REPLACE INTO llm_registry (id, name, description, config_json)
|
| 636 |
+
VALUES (?, ?, ?, ?)
|
| 637 |
''', (
|
| 638 |
+
llm['name'], # используем name как id
|
| 639 |
llm['name'],
|
| 640 |
+
llm.get('description', ''),
|
| 641 |
+
config_json
|
|
|
|
| 642 |
))
|
| 643 |
self.conn.commit()
|
| 644 |
|
| 645 |
def clear_llm_registry(self):
|
| 646 |
cursor = self.conn.cursor()
|
| 647 |
+
cursor.execute('DELETE FROM llm_registry')
|
| 648 |
self.conn.commit()
|
| 649 |
|
| 650 |
def add_user(self, user):
|
| 651 |
cursor = self.conn.cursor()
|
| 652 |
cursor.execute('''
|
| 653 |
+
INSERT OR REPLACE INTO users (
|
| 654 |
+
username, did, mail, password_hash,
|
| 655 |
+
info, contacts, language, operator, ban
|
| 656 |
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
| 657 |
''', (
|
| 658 |
+
user.get('username'),
|
| 659 |
+
user.get('did'),
|
| 660 |
+
user.get('mail'),
|
| 661 |
+
user.get('password_hash'),
|
| 662 |
+
user.get('info'),
|
| 663 |
+
user.get('contacts'),
|
| 664 |
+
user.get('language'),
|
| 665 |
+
int(user.get('operator', 0)),
|
| 666 |
+
user.get('ban')
|
| 667 |
))
|
| 668 |
self.conn.commit()
|
| 669 |
+
return cursor.lastrowid
|
| 670 |
+
|
| 671 |
# Утилиты
|
| 672 |
|
| 673 |
def close(self):
|
hf_repo/hf_repo/agents/init.py
CHANGED
|
@@ -11,7 +11,7 @@ from tools.identity import generate_did
|
|
| 11 |
from tools.crypto import generate_keypair
|
| 12 |
from tools.config_utils import update_config
|
| 13 |
|
| 14 |
-
CONFIG_PATH = os.path.join(
|
| 15 |
|
| 16 |
def load_config(path):
|
| 17 |
with open(path, 'r', encoding='utf-8') as f:
|
|
@@ -27,13 +27,16 @@ def init_identity(storage, config):
|
|
| 27 |
pubkey, privkey = generate_keypair()
|
| 28 |
identity_id = did.split(":")[-1]
|
| 29 |
|
| 30 |
-
|
| 31 |
-
identity_id
|
| 32 |
-
name
|
| 33 |
-
pubkey
|
| 34 |
-
privkey
|
| 35 |
-
metadata
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
# Обновляем config.yml
|
| 39 |
config["agent_id"] = did
|
|
@@ -50,13 +53,19 @@ def init_user(storage, config):
|
|
| 50 |
return
|
| 51 |
|
| 52 |
did = generate_did()
|
| 53 |
-
|
| 54 |
-
username
|
| 55 |
-
|
| 56 |
-
password_hash
|
| 57 |
-
did
|
| 58 |
-
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
print(f"[+] Пользователь {user['username']} добавлен.")
|
| 61 |
|
| 62 |
def init_llm_backends(storage, config):
|
|
@@ -65,7 +74,14 @@ def init_llm_backends(storage, config):
|
|
| 65 |
for backend in backends:
|
| 66 |
backend_id = str(uuid.uuid4())
|
| 67 |
desc = f"{backend.get('type', 'unknown')} model"
|
| 68 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
print(f"[+] Зарегистрирован LLM: {backend['name']}")
|
| 70 |
|
| 71 |
def init_config_table(storage, config):
|
|
@@ -85,4 +101,4 @@ if __name__ == "__main__":
|
|
| 85 |
init_llm_backends(storage, config)
|
| 86 |
init_config_table(storage, config)
|
| 87 |
|
| 88 |
-
print("[✓] Инициализация завершена.")
|
|
|
|
| 11 |
from tools.crypto import generate_keypair
|
| 12 |
from tools.config_utils import update_config
|
| 13 |
|
| 14 |
+
CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yml")
|
| 15 |
|
| 16 |
def load_config(path):
|
| 17 |
with open(path, 'r', encoding='utf-8') as f:
|
|
|
|
| 27 |
pubkey, privkey = generate_keypair()
|
| 28 |
identity_id = did.split(":")[-1]
|
| 29 |
|
| 30 |
+
identity = {
|
| 31 |
+
"id": identity_id,
|
| 32 |
+
"name": config.get("agent_name", "Unnamed"),
|
| 33 |
+
"pubkey": pubkey,
|
| 34 |
+
"privkey": privkey,
|
| 35 |
+
"metadata": json.dumps({"role": config.get("agent_role", "core")}),
|
| 36 |
+
"created_at": datetime.utcnow().isoformat(),
|
| 37 |
+
"updated_at": datetime.utcnow().isoformat()
|
| 38 |
+
}
|
| 39 |
+
storage.add_identity(identity)
|
| 40 |
|
| 41 |
# Обновляем config.yml
|
| 42 |
config["agent_id"] = did
|
|
|
|
| 53 |
return
|
| 54 |
|
| 55 |
did = generate_did()
|
| 56 |
+
user_entry = {
|
| 57 |
+
"username": user.get("username", "user"),
|
| 58 |
+
"mail": user["email"],
|
| 59 |
+
"password_hash": user.get("password_hash", ""),
|
| 60 |
+
"did": did,
|
| 61 |
+
"ban": None,
|
| 62 |
+
"info": json.dumps({}),
|
| 63 |
+
"contacts": json.dumps([]),
|
| 64 |
+
"language": "ru,en",
|
| 65 |
+
"operator": 1
|
| 66 |
+
}
|
| 67 |
+
storage.add_user(user_entry)
|
| 68 |
+
|
| 69 |
print(f"[+] Пользователь {user['username']} добавлен.")
|
| 70 |
|
| 71 |
def init_llm_backends(storage, config):
|
|
|
|
| 74 |
for backend in backends:
|
| 75 |
backend_id = str(uuid.uuid4())
|
| 76 |
desc = f"{backend.get('type', 'unknown')} model"
|
| 77 |
+
llm = {
|
| 78 |
+
"id": backend_id,
|
| 79 |
+
"name": backend["name"],
|
| 80 |
+
"endpoint": desc,
|
| 81 |
+
"metadata": json.dumps(backend),
|
| 82 |
+
"created_at": datetime.utcnow().isoformat()
|
| 83 |
+
}
|
| 84 |
+
storage.add_llm(llm)
|
| 85 |
print(f"[+] Зарегистрирован LLM: {backend['name']}")
|
| 86 |
|
| 87 |
def init_config_table(storage, config):
|
|
|
|
| 101 |
init_llm_backends(storage, config)
|
| 102 |
init_config_table(storage, config)
|
| 103 |
|
| 104 |
+
print("[✓] Инициализация завершена.")
|
hf_repo/hf_repo/hf_repo/agents/tools/config_utils.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# agents/tools/config_utils.py
|
| 2 |
+
|
| 3 |
+
import json
|
| 4 |
+
import os
|
| 5 |
+
|
| 6 |
+
def update_config(config_path: str, updates: dict):
|
| 7 |
+
"""Обновляет JSON-файл конфигурации указанными значениями."""
|
| 8 |
+
if os.path.exists(config_path):
|
| 9 |
+
with open(config_path, 'r', encoding='utf-8') as f:
|
| 10 |
+
config = json.load(f)
|
| 11 |
+
else:
|
| 12 |
+
config = {}
|
| 13 |
+
|
| 14 |
+
config.update(updates)
|
| 15 |
+
|
| 16 |
+
with open(config_path, 'w', encoding='utf-8') as f:
|
| 17 |
+
json.dump(config, f, indent=2, ensure_ascii=False)
|
hf_repo/hf_repo/hf_repo/agents/tools/crypto.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# tools/crypto.py
|
| 2 |
+
|
| 3 |
+
from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
|
| 4 |
+
from cryptography.hazmat.primitives import serialization, hashes
|
| 5 |
+
from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
|
| 6 |
+
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
| 7 |
+
from cryptography.hazmat.backends import default_backend
|
| 8 |
+
import os
|
| 9 |
+
import base64
|
| 10 |
+
|
| 11 |
+
backend = default_backend()
|
| 12 |
+
|
| 13 |
+
# ========== 🔐 RSA KEYS ==========
|
| 14 |
+
|
| 15 |
+
def generate_rsa_key_pair(key_size=2048):
|
| 16 |
+
private_key = rsa.generate_private_key(
|
| 17 |
+
public_exponent=65537,
|
| 18 |
+
key_size=key_size,
|
| 19 |
+
backend=backend
|
| 20 |
+
)
|
| 21 |
+
public_key = private_key.public_key()
|
| 22 |
+
return private_key, public_key
|
| 23 |
+
|
| 24 |
+
# ========== 🌀 ED25519 KEYS ==========
|
| 25 |
+
|
| 26 |
+
def generate_ed25519_key_pair():
|
| 27 |
+
private_key = ed25519.Ed25519PrivateKey.generate()
|
| 28 |
+
public_key = private_key.public_key()
|
| 29 |
+
return private_key, public_key
|
| 30 |
+
|
| 31 |
+
# ========== 💾 SERIALIZATION ==========
|
| 32 |
+
|
| 33 |
+
def serialize_private_key(private_key, password: str = None):
|
| 34 |
+
if password:
|
| 35 |
+
encryption_algorithm = serialization.BestAvailableEncryption(password.encode())
|
| 36 |
+
else:
|
| 37 |
+
encryption_algorithm = serialization.NoEncryption()
|
| 38 |
+
|
| 39 |
+
return private_key.private_bytes(
|
| 40 |
+
encoding=serialization.Encoding.PEM,
|
| 41 |
+
format=serialization.PrivateFormat.PKCS8,
|
| 42 |
+
encryption_algorithm=encryption_algorithm
|
| 43 |
+
)
|
| 44 |
+
|
| 45 |
+
def serialize_public_key(public_key):
|
| 46 |
+
return public_key.public_bytes(
|
| 47 |
+
encoding=serialization.Encoding.PEM,
|
| 48 |
+
format=serialization.PublicFormat.SubjectPublicKeyInfo
|
| 49 |
+
)
|
| 50 |
+
|
| 51 |
+
def load_private_key(pem_data, password: str = None):
|
| 52 |
+
return serialization.load_pem_private_key(
|
| 53 |
+
pem_data,
|
| 54 |
+
password=password.encode() if password else None,
|
| 55 |
+
backend=backend
|
| 56 |
+
)
|
| 57 |
+
|
| 58 |
+
def load_public_key(pem_data):
|
| 59 |
+
return serialization.load_pem_public_key(
|
| 60 |
+
pem_data,
|
| 61 |
+
backend=backend
|
| 62 |
+
)
|
| 63 |
+
|
| 64 |
+
def generate_keypair(method="rsa", password: bytes = None):
|
| 65 |
+
"""
|
| 66 |
+
Создаёт пару ключей (приватный, публичный) с заданным методом.
|
| 67 |
+
method: "rsa" или "ed25519"
|
| 68 |
+
password: если указан, приватный ключ будет зашифрован
|
| 69 |
+
Возвращает (private_key_pem: bytes, public_key_pem: bytes)
|
| 70 |
+
"""
|
| 71 |
+
if method == "rsa":
|
| 72 |
+
private_key = rsa.generate_private_key(
|
| 73 |
+
public_exponent=65537, key_size=2048, backend=default_backend()
|
| 74 |
+
)
|
| 75 |
+
elif method == "ed25519":
|
| 76 |
+
private_key = ed25519.Ed25519PrivateKey.generate()
|
| 77 |
+
else:
|
| 78 |
+
raise ValueError("Unsupported key generation method")
|
| 79 |
+
|
| 80 |
+
encryption_algorithm = (
|
| 81 |
+
serialization.BestAvailableEncryption(password)
|
| 82 |
+
if password
|
| 83 |
+
else serialization.NoEncryption()
|
| 84 |
+
)
|
| 85 |
+
|
| 86 |
+
private_pem = private_key.private_bytes(
|
| 87 |
+
encoding=serialization.Encoding.PEM,
|
| 88 |
+
format=serialization.PrivateFormat.PKCS8,
|
| 89 |
+
encryption_algorithm=encryption_algorithm,
|
| 90 |
+
)
|
| 91 |
+
|
| 92 |
+
public_pem = private_key.public_key().public_bytes(
|
| 93 |
+
encoding=serialization.Encoding.PEM,
|
| 94 |
+
format=serialization.PublicFormat.SubjectPublicKeyInfo,
|
| 95 |
+
)
|
| 96 |
+
|
| 97 |
+
return private_pem, public_pem
|
| 98 |
+
|
| 99 |
+
# ========== 🔐 ENCRYPT / DECRYPT PRIVATE KEY BY SYMMETRIC KEY ==========
|
| 100 |
+
|
| 101 |
+
def derive_key(password: str, salt: bytes = None):
|
| 102 |
+
if not salt:
|
| 103 |
+
salt = os.urandom(16)
|
| 104 |
+
kdf = Scrypt(
|
| 105 |
+
salt=salt,
|
| 106 |
+
length=32,
|
| 107 |
+
n=2**14,
|
| 108 |
+
r=8,
|
| 109 |
+
p=1,
|
| 110 |
+
backend=backend
|
| 111 |
+
)
|
| 112 |
+
key = kdf.derive(password.encode())
|
| 113 |
+
return key, salt
|
| 114 |
+
|
| 115 |
+
def encrypt_data(data: bytes, password: str):
|
| 116 |
+
key, salt = derive_key(password)
|
| 117 |
+
aesgcm = AESGCM(key)
|
| 118 |
+
nonce = os.urandom(12)
|
| 119 |
+
encrypted = aesgcm.encrypt(nonce, data, None)
|
| 120 |
+
return {
|
| 121 |
+
'ciphertext': base64.b64encode(encrypted).decode(),
|
| 122 |
+
'salt': base64.b64encode(salt).decode(),
|
| 123 |
+
'nonce': base64.b64encode(nonce).decode()
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
+
def decrypt_data(encrypted_data: dict, password: str):
|
| 127 |
+
ciphertext = base64.b64decode(encrypted_data['ciphertext'])
|
| 128 |
+
salt = base64.b64decode(encrypted_data['salt'])
|
| 129 |
+
nonce = base64.b64decode(encrypted_data['nonce'])
|
| 130 |
+
key, _ = derive_key(password, salt=salt)
|
| 131 |
+
aesgcm = AESGCM(key)
|
| 132 |
+
return aesgcm.decrypt(nonce, ciphertext, None)
|
| 133 |
+
|
| 134 |
+
# ========== ✅ TESTING ==========
|
| 135 |
+
|
| 136 |
+
if __name__ == "__main__":
|
| 137 |
+
priv, pub = generate_ed25519_key_pair()
|
| 138 |
+
priv_pem = serialize_private_key(priv)
|
| 139 |
+
pub_pem = serialize_public_key(pub)
|
| 140 |
+
|
| 141 |
+
print("PRIVATE PEM:")
|
| 142 |
+
print(priv_pem.decode())
|
| 143 |
+
print("PUBLIC PEM:")
|
| 144 |
+
print(pub_pem.decode())
|
| 145 |
+
|
| 146 |
+
encrypted = encrypt_data(priv_pem, "secret-password")
|
| 147 |
+
decrypted = decrypt_data(encrypted, "secret-password")
|
| 148 |
+
assert decrypted == priv_pem
|
| 149 |
+
print("✅ Encryption/decryption OK")
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/examples/config.yml
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# HMP Agent Configuration
|
| 2 |
+
|
| 3 |
+
# === Общие параметры ===
|
| 4 |
+
agent_id: "" # Оставьте пустым для генерации DiD автоматически
|
| 5 |
+
agent_name: "CognitiveCore" # Имя агента
|
| 6 |
+
agent_role: "core" # 'core' или 'shell'
|
| 7 |
+
|
| 8 |
+
# === Прокси ===
|
| 9 |
+
proxy_mode: false # false — прокси не используется, иначе true
|
| 10 |
+
proxy_type: "socks5" # 'http', 'socks4', 'socks5' и т.д. (если proxy_mode: true)
|
| 11 |
+
proxy_address: "127.0.0.1:9050"
|
| 12 |
+
|
| 13 |
+
# === Функции ядра ===
|
| 14 |
+
enable_llm: true # доступ к LLM
|
| 15 |
+
|
| 16 |
+
serve_api: true # REST API
|
| 17 |
+
api_port: 8080
|
| 18 |
+
|
| 19 |
+
# === DHT-сеть и обмен знаниями ===
|
| 20 |
+
dht_enabled: true # Включение участия в DHT-сети (включено принудительно!)
|
| 21 |
+
dht_update: true # Регулярные обновления и публикация данных в DHT (включено принудительно!)
|
| 22 |
+
bootstrap_responder: true # Агент отвечает на bootstrap-запросы (включено принудительно!)
|
| 23 |
+
dht_port: 20784
|
| 24 |
+
update_interval: 60 # секунд (для DHT-обновлений)
|
| 25 |
+
|
| 26 |
+
# === LLM-бэкенды ===
|
| 27 |
+
llm_backends:
|
| 28 |
+
- name: "local-model"
|
| 29 |
+
type: "local"
|
| 30 |
+
path: "/models/gguf/mistral.gguf"
|
| 31 |
+
format: "gguf"
|
| 32 |
+
prompt_template: "mistral"
|
| 33 |
+
|
| 34 |
+
- name: "openai-gpt4o"
|
| 35 |
+
type: "api"
|
| 36 |
+
provider: "openai"
|
| 37 |
+
model: "gpt-4o"
|
| 38 |
+
api_key: "sk-..."
|
| 39 |
+
|
| 40 |
+
# Пользователь может добавить сколько угодно дополнительных локальных или сетевых LLM
|
| 41 |
+
|
| 42 |
+
default_llm: "local-model" # если модели нет в списке `llm_backends` используется первая в списке
|
| 43 |
+
|
| 44 |
+
# === Веб-интерфейс ===
|
| 45 |
+
notebook_ui: true # UI в виде блокнота
|
| 46 |
+
# ui_hosts:
|
| 47 |
+
# - "0.0.0.0" # (небезопасно) доступ с любых IPv4-адресов
|
| 48 |
+
# - "::" # (небезопасно) доступ с любых IPv6-адресов
|
| 49 |
+
ui_hosts: # Какие IP прослушиваются, ["0.0.0.0"; "::"] - доступен везде
|
| 50 |
+
- "127.0.0.1"
|
| 51 |
+
- "::1"
|
| 52 |
+
ui_port: 8765
|
| 53 |
+
|
| 54 |
+
# === Данные пользователя ===
|
| 55 |
+
default_user:
|
| 56 |
+
username: "user"
|
| 57 |
+
email: "[email protected]"
|
| 58 |
+
password_hash: "" # пусто при инициализации, будет установлен при регистрации
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
# === Пути ===
|
| 62 |
+
data_dir: "./data"
|
| 63 |
+
log_dir: "./logs"
|
| 64 |
+
db_path: "./data/agent_storage.db"
|
| 65 |
+
|
| 66 |
+
# === Отладка и логгирование ===
|
| 67 |
+
debug: true
|
| 68 |
+
log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
import yaml
|
| 4 |
+
import json
|
| 5 |
+
import time
|
| 6 |
+
import uuid
|
| 7 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 8 |
+
from datetime import datetime
|
| 9 |
+
from tools.storage import Storage
|
| 10 |
+
from tools.identity import generate_did
|
| 11 |
+
from tools.crypto import generate_keypair
|
| 12 |
+
from tools.config_utils import update_config
|
| 13 |
+
|
| 14 |
+
CONFIG_PATH = os.path.join("agents", "config.yml")
|
| 15 |
+
|
| 16 |
+
def load_config(path):
|
| 17 |
+
with open(path, 'r', encoding='utf-8') as f:
|
| 18 |
+
return yaml.safe_load(f)
|
| 19 |
+
|
| 20 |
+
def save_config(path, config):
|
| 21 |
+
with open(path, 'w', encoding='utf-8') as f:
|
| 22 |
+
yaml.dump(config, f, allow_unicode=True)
|
| 23 |
+
|
| 24 |
+
def init_identity(storage, config):
|
| 25 |
+
if not config.get("agent_id"):
|
| 26 |
+
did = generate_did()
|
| 27 |
+
pubkey, privkey = generate_keypair()
|
| 28 |
+
identity_id = did.split(":")[-1]
|
| 29 |
+
|
| 30 |
+
storage.add_identity(
|
| 31 |
+
identity_id=identity_id,
|
| 32 |
+
name=config.get("agent_name", "Unnamed"),
|
| 33 |
+
pubkey=pubkey,
|
| 34 |
+
privkey=privkey,
|
| 35 |
+
metadata=json.dumps({"role": config.get("agent_role", "core")})
|
| 36 |
+
)
|
| 37 |
+
|
| 38 |
+
# Обновляем config.yml
|
| 39 |
+
config["agent_id"] = did
|
| 40 |
+
config["identity_agent"] = identity_id
|
| 41 |
+
save_config(CONFIG_PATH, config)
|
| 42 |
+
print(f"[+] Создана личность: {identity_id}")
|
| 43 |
+
else:
|
| 44 |
+
print("[=] agent_id уже задан, пропускаем генерацию DiD.")
|
| 45 |
+
|
| 46 |
+
def init_user(storage, config):
|
| 47 |
+
user = config.get("default_user", {})
|
| 48 |
+
if not user.get("email"):
|
| 49 |
+
print("[-] Не указан email пользователя — пропуск.")
|
| 50 |
+
return
|
| 51 |
+
|
| 52 |
+
did = generate_did()
|
| 53 |
+
storage.add_user(
|
| 54 |
+
username=user.get("username", "user"),
|
| 55 |
+
email=user["email"],
|
| 56 |
+
password_hash=user.get("password_hash", ""),
|
| 57 |
+
did=did,
|
| 58 |
+
operator=True
|
| 59 |
+
)
|
| 60 |
+
print(f"[+] Пользователь {user['username']} добавлен.")
|
| 61 |
+
|
| 62 |
+
def init_llm_backends(storage, config):
|
| 63 |
+
backends = config.get("llm_backends", [])
|
| 64 |
+
storage.clear_llm_registry()
|
| 65 |
+
for backend in backends:
|
| 66 |
+
backend_id = str(uuid.uuid4())
|
| 67 |
+
desc = f"{backend.get('type', 'unknown')} model"
|
| 68 |
+
storage.add_llm(backend_id, backend["name"], desc)
|
| 69 |
+
print(f"[+] Зарегистрирован LLM: {backend['name']}")
|
| 70 |
+
|
| 71 |
+
def init_config_table(storage, config):
|
| 72 |
+
exclude_keys = {"default_user", "llm_backends"}
|
| 73 |
+
flat_config = {k: v for k, v in config.items() if k not in exclude_keys}
|
| 74 |
+
for key, value in flat_config.items():
|
| 75 |
+
storage.set_config(key, json.dumps(value))
|
| 76 |
+
print("[+] Конфигурация сохранена в БД.")
|
| 77 |
+
|
| 78 |
+
if __name__ == "__main__":
|
| 79 |
+
print("[*] Запуск инициализации HMP-агента...")
|
| 80 |
+
config = load_config(CONFIG_PATH)
|
| 81 |
+
storage = Storage()
|
| 82 |
+
|
| 83 |
+
init_identity(storage, config)
|
| 84 |
+
init_user(storage, config)
|
| 85 |
+
init_llm_backends(storage, config)
|
| 86 |
+
init_config_table(storage, config)
|
| 87 |
+
|
| 88 |
+
print("[✓] Инициализация завершена.")
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md
CHANGED
|
@@ -19,6 +19,9 @@ agents/
|
|
| 19 |
├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
| 20 |
├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
|
| 21 |
├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
|
|
|
|
|
|
|
|
|
|
| 22 |
├── peers.py ← Информация о пирах.
|
| 23 |
├── peer_comm.py ← Запросы к пирам.
|
| 24 |
├── peer_sync.py ← Модуль обмена сообщениями.
|
|
@@ -44,6 +47,9 @@ agents/
|
|
| 44 |
* [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
|
| 45 |
* [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
|
| 46 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
|
|
|
|
|
|
|
|
|
| 47 |
* [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
|
| 48 |
* [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
|
| 49 |
* [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
|
|
|
|
| 19 |
├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
| 20 |
├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
|
| 21 |
├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
|
| 22 |
+
├── identity.py ← Генерация DiD.
|
| 23 |
+
├── crypto.py ← Создание и шифрование ключей RSA/Ed25519.
|
| 24 |
+
├── config_utils.py ← Обновляет JSON-файл конфигурации указанными значениями.
|
| 25 |
├── peers.py ← Информация о пирах.
|
| 26 |
├── peer_comm.py ← Запросы к пирам.
|
| 27 |
├── peer_sync.py ← Модуль обмена сообщениями.
|
|
|
|
| 47 |
* [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
|
| 48 |
* [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
|
| 49 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
| 50 |
+
* [identity.py](tools/identity.py) - Генерация DiD.
|
| 51 |
+
* [crypto.py](tools/crypto.py) - Создание и шифрование ключей RSA/Ed25519.
|
| 52 |
+
* [config_utils.py](tools/config_utils.py) - Обновляет JSON-файл конфигурации указанными значениями.
|
| 53 |
* [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
|
| 54 |
* [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
|
| 55 |
* [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt
CHANGED
|
@@ -4,3 +4,5 @@ openai
|
|
| 4 |
requests
|
| 5 |
tiktoken
|
| 6 |
python-dotenv
|
|
|
|
|
|
|
|
|
| 4 |
requests
|
| 5 |
tiktoken
|
| 6 |
python-dotenv
|
| 7 |
+
PyYAML
|
| 8 |
+
cryptography
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/test.bat
CHANGED
|
@@ -4,9 +4,9 @@ echo --------------------------
|
|
| 4 |
pip install -r requirements.txt
|
| 5 |
|
| 6 |
echo --------------------------
|
| 7 |
-
echo Running
|
| 8 |
echo --------------------------
|
| 9 |
|
| 10 |
-
python
|
| 11 |
|
| 12 |
pause
|
|
|
|
| 4 |
pip install -r requirements.txt
|
| 5 |
|
| 6 |
echo --------------------------
|
| 7 |
+
echo Running initialization...
|
| 8 |
echo --------------------------
|
| 9 |
|
| 10 |
+
python init.py
|
| 11 |
|
| 12 |
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/identity.py
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# tools/identity.py
|
| 2 |
+
|
| 3 |
+
import uuid
|
| 4 |
+
import json
|
| 5 |
+
import base64
|
| 6 |
+
from datetime import datetime
|
| 7 |
+
|
| 8 |
+
from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
|
| 9 |
+
from cryptography.hazmat.primitives import serialization
|
| 10 |
+
|
| 11 |
+
DEFAULT_KEY_TYPE = "ed25519" # Можно поменять на "rsa" при необходимости
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def generate_did():
|
| 15 |
+
"""Генерация уникального DiD на основе UUID v4"""
|
| 16 |
+
return f"did:hmp:{uuid.uuid4()}"
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
def generate_keys(key_type=DEFAULT_KEY_TYPE):
|
| 20 |
+
"""Генерация пары ключей"""
|
| 21 |
+
if key_type == "rsa":
|
| 22 |
+
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
|
| 23 |
+
elif key_type == "ed25519":
|
| 24 |
+
private_key = ed25519.Ed25519PrivateKey.generate()
|
| 25 |
+
else:
|
| 26 |
+
raise ValueError(f"Неизвестный тип ключа: {key_type}")
|
| 27 |
+
|
| 28 |
+
public_key = private_key.public_key()
|
| 29 |
+
return private_key, public_key
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def serialize_private_key(private_key, password=None):
|
| 33 |
+
"""Сериализация приватного ключа"""
|
| 34 |
+
encryption = (
|
| 35 |
+
serialization.BestAvailableEncryption(password.encode())
|
| 36 |
+
if password else
|
| 37 |
+
serialization.NoEncryption()
|
| 38 |
+
)
|
| 39 |
+
return private_key.private_bytes(
|
| 40 |
+
encoding=serialization.Encoding.PEM,
|
| 41 |
+
format=serialization.PrivateFormat.PKCS8,
|
| 42 |
+
encryption_algorithm=encryption,
|
| 43 |
+
).decode()
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def serialize_public_key(public_key):
|
| 47 |
+
"""Сериализация публичного ключа"""
|
| 48 |
+
return public_key.public_bytes(
|
| 49 |
+
encoding=serialization.Encoding.PEM,
|
| 50 |
+
format=serialization.PublicFormat.SubjectPublicKeyInfo,
|
| 51 |
+
).decode()
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
def create_identity(name="Core Identity", key_type=DEFAULT_KEY_TYPE, metadata=None, password=None):
|
| 55 |
+
"""Создание полной идентичности"""
|
| 56 |
+
did = generate_did()
|
| 57 |
+
priv_key, pub_key = generate_keys(key_type)
|
| 58 |
+
|
| 59 |
+
identity = {
|
| 60 |
+
"id": did,
|
| 61 |
+
"name": name,
|
| 62 |
+
"pubkey": serialize_public_key(pub_key),
|
| 63 |
+
"privkey": serialize_private_key(priv_key, password),
|
| 64 |
+
"metadata": json.dumps(metadata or {}),
|
| 65 |
+
"created_at": datetime.utcnow().isoformat(),
|
| 66 |
+
"updated_at": datetime.utcnow().isoformat(),
|
| 67 |
+
}
|
| 68 |
+
return identity
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
CHANGED
|
@@ -600,6 +600,64 @@ class Storage:
|
|
| 600 |
ORDER BY timestamp DESC
|
| 601 |
''', (entry_id, entry_id))
|
| 602 |
return c.fetchall()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 603 |
|
| 604 |
# Утилиты
|
| 605 |
|
|
|
|
| 600 |
ORDER BY timestamp DESC
|
| 601 |
''', (entry_id, entry_id))
|
| 602 |
return c.fetchall()
|
| 603 |
+
|
| 604 |
+
# Инициализация
|
| 605 |
+
def set_config(self, key, value):
|
| 606 |
+
cursor = self.conn.cursor()
|
| 607 |
+
cursor.execute('''
|
| 608 |
+
INSERT INTO config (key, value)
|
| 609 |
+
VALUES (?, ?)
|
| 610 |
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
| 611 |
+
''', (key, value))
|
| 612 |
+
self.conn.commit()
|
| 613 |
+
|
| 614 |
+
def add_identity(self, identity):
|
| 615 |
+
cursor = self.conn.cursor()
|
| 616 |
+
cursor.execute('''
|
| 617 |
+
INSERT OR REPLACE INTO identity (id, name, pubkey, privkey, metadata, created_at, updated_at)
|
| 618 |
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
| 619 |
+
''', (
|
| 620 |
+
identity['id'],
|
| 621 |
+
identity['name'],
|
| 622 |
+
identity['pubkey'],
|
| 623 |
+
identity['privkey'],
|
| 624 |
+
identity.get('metadata', ''),
|
| 625 |
+
identity['created_at'],
|
| 626 |
+
identity['updated_at']
|
| 627 |
+
))
|
| 628 |
+
self.conn.commit()
|
| 629 |
+
|
| 630 |
+
def add_llm(self, llm):
|
| 631 |
+
cursor = self.conn.cursor()
|
| 632 |
+
cursor.execute('''
|
| 633 |
+
INSERT OR REPLACE INTO llm (id, name, endpoint, metadata, created_at)
|
| 634 |
+
VALUES (?, ?, ?, ?, ?)
|
| 635 |
+
''', (
|
| 636 |
+
llm['id'],
|
| 637 |
+
llm['name'],
|
| 638 |
+
llm['endpoint'],
|
| 639 |
+
llm.get('metadata', ''),
|
| 640 |
+
llm['created_at']
|
| 641 |
+
))
|
| 642 |
+
self.conn.commit()
|
| 643 |
+
|
| 644 |
+
def clear_llm_registry(self):
|
| 645 |
+
cursor = self.conn.cursor()
|
| 646 |
+
cursor.execute('DELETE FROM llm')
|
| 647 |
+
self.conn.commit()
|
| 648 |
+
|
| 649 |
+
def add_user(self, user):
|
| 650 |
+
cursor = self.conn.cursor()
|
| 651 |
+
cursor.execute('''
|
| 652 |
+
INSERT OR REPLACE INTO users (id, name, metadata, created_at)
|
| 653 |
+
VALUES (?, ?, ?, ?)
|
| 654 |
+
''', (
|
| 655 |
+
user['id'],
|
| 656 |
+
user['name'],
|
| 657 |
+
user.get('metadata', ''),
|
| 658 |
+
user['created_at']
|
| 659 |
+
))
|
| 660 |
+
self.conn.commit()
|
| 661 |
|
| 662 |
# Утилиты
|
| 663 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md
CHANGED
|
@@ -70,7 +70,8 @@
|
|
| 70 |
- для отправки сообщений другим агентам
|
| 71 |
- для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
|
| 72 |
- для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
|
| 73 |
-
- для управления
|
|
|
|
| 74 |
- для управления списком известных HMP-агентов
|
| 75 |
- для выбора *текущего основного LLM*
|
| 76 |
- для управления дополнительными утилитами и базами данных
|
|
|
|
| 70 |
- для отправки сообщений другим агентам
|
| 71 |
- для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
|
| 72 |
- для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
|
| 73 |
+
- для управления *пользователями* `users` и *группами пользователей* `users_group`
|
| 74 |
+
- для управления своей *идентичностью* `identity` и *настройками* `config`
|
| 75 |
- для управления списком известных HMP-агентов
|
| 76 |
- для выбора *текущего основного LLM*
|
| 77 |
- для управления дополнительными утилитами и базами данных
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -1,169 +1,186 @@
|
|
| 1 |
-- Дневниковые записи (размышления, наблюдения, воспоминания)
|
| 2 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
| 3 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 4 |
-
text TEXT NOT NULL,
|
| 5 |
-
tags TEXT,
|
| 6 |
-
priority INTEGER DEFAULT 0,
|
| 7 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 8 |
-
llm_id TEXT
|
| 9 |
);
|
| 10 |
|
| 11 |
-- Концепты (понятия, сущности, идеи)
|
| 12 |
CREATE TABLE IF NOT EXISTS concepts (
|
| 13 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 14 |
-
name TEXT NOT NULL UNIQUE,
|
| 15 |
-
description TEXT,
|
| 16 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 17 |
-
llm_id TEXT
|
| 18 |
);
|
| 19 |
|
| 20 |
-- Семантические связи между концептами
|
| 21 |
CREATE TABLE IF NOT EXISTS links (
|
| 22 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 23 |
-
from_concept_id INTEGER,
|
| 24 |
-
to_concept_id INTEGER,
|
| 25 |
-
relation_type TEXT,
|
| 26 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 27 |
-
llm_id TEXT,
|
| 28 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
| 29 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
| 30 |
);
|
| 31 |
|
| 32 |
-- Индексы между дневниковыми записями (смысловая карта)
|
| 33 |
CREATE TABLE IF NOT EXISTS diary_graph_index (
|
| 34 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 35 |
-
source_entry_id INTEGER NOT NULL,
|
| 36 |
-
target_entry_id INTEGER NOT NULL,
|
| 37 |
-
relation TEXT NOT NULL,
|
| 38 |
-
strength REAL DEFAULT 1.0,
|
| 39 |
-
context TEXT,
|
| 40 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
| 41 |
);
|
| 42 |
|
| 43 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
| 44 |
CREATE TABLE IF NOT EXISTS notes (
|
| 45 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 46 |
-
text TEXT NOT NULL,
|
| 47 |
-
tags TEXT,
|
| 48 |
-
user_did TEXT DEFAULT 'ALL',
|
| 49 |
-
source TEXT DEFAULT 'user',
|
| 50 |
-
links TEXT DEFAULT '',
|
| 51 |
-
read INTEGER DEFAULT 0,
|
| 52 |
-
hidden INTEGER DEFAULT 0,
|
| 53 |
-
priority INTEGER DEFAULT 0,
|
| 54 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 55 |
-
llm_id TEXT
|
| 56 |
);
|
| 57 |
|
| 58 |
-- Лог процессов: задачи, ошибки, события
|
| 59 |
CREATE TABLE IF NOT EXISTS process_log (
|
| 60 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 61 |
-
name TEXT NOT NULL,
|
| 62 |
-
value TEXT,
|
| 63 |
-
tags TEXT,
|
| 64 |
-
status TEXT DEFAULT 'ok',
|
| 65 |
-
priority INTEGER DEFAULT 0,
|
| 66 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 67 |
-
llm_id TEXT
|
| 68 |
);
|
| 69 |
|
| 70 |
-- Долговременная память LLM
|
| 71 |
CREATE TABLE IF NOT EXISTS llm_memory (
|
| 72 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 73 |
-
title TEXT,
|
| 74 |
-
content TEXT NOT NULL,
|
| 75 |
-
tags TEXT,
|
| 76 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 77 |
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 78 |
-
llm_id TEXT
|
| 79 |
);
|
| 80 |
|
| 81 |
-- Краткосрочная память (диалоговая история)
|
| 82 |
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
| 83 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 84 |
-
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 85 |
-
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
| 86 |
-
content TEXT NOT NULL,
|
| 87 |
-
llm_id TEXT
|
| 88 |
);
|
| 89 |
|
| 90 |
-- Список известных агентов в сети HMP
|
| 91 |
CREATE TABLE IF NOT EXISTS agent_peers (
|
| 92 |
-
id TEXT PRIMARY KEY,
|
| 93 |
-
name TEXT,
|
| 94 |
-
addresses TEXT,
|
| 95 |
-
tags TEXT,
|
| 96 |
-
status TEXT DEFAULT 'unknown',
|
| 97 |
-
last_seen DATETIME,
|
| 98 |
-
description TEXT,
|
| 99 |
-
capabilities TEXT,
|
| 100 |
-
pubkey TEXT,
|
| 101 |
-
software_info TEXT,
|
| 102 |
-
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 103 |
);
|
| 104 |
|
| 105 |
-- Таблицы, созданные агентами
|
| 106 |
CREATE TABLE IF NOT EXISTS agent_tables (
|
| 107 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 108 |
-
table_name TEXT NOT NULL UNIQUE,
|
| 109 |
-
description TEXT,
|
| 110 |
-
schema TEXT NOT NULL,
|
| 111 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 112 |
-
llm_id TEXT
|
| 113 |
);
|
| 114 |
|
| 115 |
-- Скрипты, утилиты и код агентов
|
| 116 |
CREATE TABLE IF NOT EXISTS agent_scripts (
|
| 117 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 118 |
-
name TEXT NOT NULL,
|
| 119 |
-
version TEXT NOT NULL,
|
| 120 |
-
code TEXT NOT NULL,
|
| 121 |
-
language TEXT DEFAULT 'python',
|
| 122 |
-
description TEXT,
|
| 123 |
-
tags TEXT,
|
| 124 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 125 |
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 126 |
-
llm_id TEXT,
|
| 127 |
UNIQUE(name, version)
|
| 128 |
);
|
| 129 |
|
| 130 |
-- Реестр LLM-агентов (в т.ч. удалённых)
|
| 131 |
CREATE TABLE IF NOT EXISTS llm_registry (
|
| 132 |
-
id TEXT PRIMARY KEY,
|
| 133 |
-
name TEXT,
|
| 134 |
-
description TEXT,
|
| 135 |
-
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
);
|
| 137 |
|
| 138 |
-- Список пользователей
|
| 139 |
-
CREATE TABLE users (
|
| 140 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 141 |
-
ban DATETIME DEFAULT NULL,
|
| 142 |
-
username TEXT,
|
| 143 |
-
did TEXT UNIQUE,
|
| 144 |
-
mail TEXT UNIQUE,
|
| 145 |
-
password_hash TEXT,
|
| 146 |
-
info TEXT,
|
| 147 |
-
contacts TEXT,
|
| 148 |
-
language TEXT,
|
| 149 |
-
operator BOOLEAN DEFAULT 0
|
| 150 |
);
|
| 151 |
|
| 152 |
-- Группы пользователей
|
| 153 |
CREATE TABLE IF NOT EXISTS users_group (
|
| 154 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 155 |
-
group_name TEXT UNIQUE NOT NULL,
|
| 156 |
-
description TEXT,
|
| 157 |
-
users TEXT
|
| 158 |
);
|
| 159 |
|
| 160 |
-- Таблица для хранения токенов восстановления пароля
|
| 161 |
-
CREATE TABLE password_reset_tokens (
|
| 162 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 163 |
-
user_id INTEGER NOT NULL,
|
| 164 |
-
token TEXT UNIQUE NOT NULL,
|
| 165 |
-
created_at DATETIME NOT NULL,
|
| 166 |
-
expires_at DATETIME NOT NULL,
|
| 167 |
-
used BOOLEAN DEFAULT 0,
|
| 168 |
FOREIGN KEY(user_id) REFERENCES users(user_id)
|
| 169 |
);
|
|
|
|
| 1 |
-- Дневниковые записи (размышления, наблюдения, воспоминания)
|
| 2 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
| 3 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
|
| 4 |
+
text TEXT NOT NULL, -- Содержимое дневниковой записи
|
| 5 |
+
tags TEXT, -- Теги для классификации (например: "наблюдение", "рефлексия")
|
| 6 |
+
priority INTEGER DEFAULT 0, -- Приоритет записи (0 = обычный, >0 = важный)
|
| 7 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания записи
|
| 8 |
+
llm_id TEXT -- Идентификатор LLM, создавшего запись
|
| 9 |
);
|
| 10 |
|
| 11 |
-- Концепты (понятия, сущности, идеи)
|
| 12 |
CREATE TABLE IF NOT EXISTS concepts (
|
| 13 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор концепта
|
| 14 |
+
name TEXT NOT NULL UNIQUE, -- Название концепта
|
| 15 |
+
description TEXT, -- Описание или определение концепта
|
| 16 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания концепта
|
| 17 |
+
llm_id TEXT -- Идентификатор LLM, добавившего концепт
|
| 18 |
);
|
| 19 |
|
| 20 |
-- Семантические связи между концептами
|
| 21 |
CREATE TABLE IF NOT EXISTS links (
|
| 22 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор связи
|
| 23 |
+
from_concept_id INTEGER, -- Идентификатор исходного концепта
|
| 24 |
+
to_concept_id INTEGER, -- Идентификатор целевого концепта
|
| 25 |
+
relation_type TEXT, -- Тип отношения (например: "is_a", "causes", "related_to")
|
| 26 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания связи
|
| 27 |
+
llm_id TEXT, -- Идентификатор LLM, создавшего связь
|
| 28 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
| 29 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
| 30 |
);
|
| 31 |
|
| 32 |
-- Индексы между дневниковыми записями (смысловая карта)
|
| 33 |
CREATE TABLE IF NOT EXISTS diary_graph_index (
|
| 34 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор индекса
|
| 35 |
+
source_entry_id INTEGER NOT NULL, -- Идентификатор исходной записи
|
| 36 |
+
target_entry_id INTEGER NOT NULL, -- Идентификатор целевой записи
|
| 37 |
+
relation TEXT NOT NULL, -- Тип связи (например: "refers_to", "contradicts")
|
| 38 |
+
strength REAL DEFAULT 1.0, -- Сила связи (0-1)
|
| 39 |
+
context TEXT, -- Дополнительный контекст связи
|
| 40 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса
|
| 41 |
);
|
| 42 |
|
| 43 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
| 44 |
CREATE TABLE IF NOT EXISTS notes (
|
| 45 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор заметки
|
| 46 |
+
text TEXT NOT NULL, -- Текст заметки
|
| 47 |
+
tags TEXT, -- Теги (например: "idea", "instruction")
|
| 48 |
+
user_did TEXT DEFAULT 'ALL', -- DID пользователя (или 'ALL' — для всех)
|
| 49 |
+
source TEXT DEFAULT 'user', -- Источник заметки: user | llm | system
|
| 50 |
+
links TEXT DEFAULT '', -- Ссылки или связи с другими объектами
|
| 51 |
+
read INTEGER DEFAULT 0, -- Статус прочтения LLM: 0 = нет, 1 = да
|
| 52 |
+
hidden INTEGER DEFAULT 0, -- Скрыта ли от пользователя: 0 = нет, 1 = да
|
| 53 |
+
priority INTEGER DEFAULT 0, -- Приоритет заметки
|
| 54 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 55 |
+
llm_id TEXT -- Идентификатор LLM
|
| 56 |
);
|
| 57 |
|
| 58 |
-- Лог процессов: задачи, ошибки, события
|
| 59 |
CREATE TABLE IF NOT EXISTS process_log (
|
| 60 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
|
| 61 |
+
name TEXT NOT NULL, -- Название события или процесса
|
| 62 |
+
value TEXT, -- Значение (результат, сообщение и т.п.)
|
| 63 |
+
tags TEXT, -- Теги для поиска
|
| 64 |
+
status TEXT DEFAULT 'ok', -- Статус: ok | warning | error | timeout | offline | close
|
| 65 |
+
priority INTEGER DEFAULT 0, -- Приоритет события
|
| 66 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время записи
|
| 67 |
+
llm_id TEXT -- Идентификатор LLM
|
| 68 |
);
|
| 69 |
|
| 70 |
-- Долговременная память LLM
|
| 71 |
CREATE TABLE IF NOT EXISTS llm_memory (
|
| 72 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
|
| 73 |
+
title TEXT, -- Заголовок или тема
|
| 74 |
+
content TEXT NOT NULL, -- Основное содержимое
|
| 75 |
+
tags TEXT, -- Теги (goal, observation, plan и т.д.)
|
| 76 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 77 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
|
| 78 |
+
llm_id TEXT -- Идентификатор LLM
|
| 79 |
);
|
| 80 |
|
| 81 |
-- Краткосрочная память (диалоговая история)
|
| 82 |
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
| 83 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 84 |
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время сообщения
|
| 85 |
+
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL, -- Роль автора
|
| 86 |
+
content TEXT NOT NULL, -- Содержимое сообщения
|
| 87 |
+
llm_id TEXT -- Идентификатор LLM
|
| 88 |
);
|
| 89 |
|
| 90 |
-- Список известных агентов в сети HMP
|
| 91 |
CREATE TABLE IF NOT EXISTS agent_peers (
|
| 92 |
+
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
|
| 93 |
+
name TEXT, -- Имя агента
|
| 94 |
+
addresses TEXT, -- Адреса для связи (JSON)
|
| 95 |
+
tags TEXT, -- Теги (Postman, Friend и т.д.)
|
| 96 |
+
status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted и др.
|
| 97 |
+
last_seen DATETIME, -- Последний раз был в сети
|
| 98 |
+
description TEXT, -- Описание агента
|
| 99 |
+
capabilities TEXT, -- Возможности (JSON)
|
| 100 |
+
pubkey TEXT, -- Публичный ключ
|
| 101 |
+
software_info TEXT, -- Информация о ПО агента (JSON)
|
| 102 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
|
| 103 |
);
|
| 104 |
|
| 105 |
-- Таблицы, созданные агентами
|
| 106 |
CREATE TABLE IF NOT EXISTS agent_tables (
|
| 107 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 108 |
+
table_name TEXT NOT NULL UNIQUE, -- Название таблицы
|
| 109 |
+
description TEXT, -- Описание назначения таблицы
|
| 110 |
+
schema TEXT NOT NULL, -- SQL-схема таблицы
|
| 111 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Дата создания
|
| 112 |
+
llm_id TEXT -- Идентификатор LLM
|
| 113 |
);
|
| 114 |
|
| 115 |
-- Скрипты, утилиты и код агентов
|
| 116 |
CREATE TABLE IF NOT EXISTS agent_scripts (
|
| 117 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 118 |
+
name TEXT NOT NULL, -- Название скрипта
|
| 119 |
+
version TEXT NOT NULL, -- Версия
|
| 120 |
+
code TEXT NOT NULL, -- Код скрипта
|
| 121 |
+
language TEXT DEFAULT 'python', -- Язык программирования
|
| 122 |
+
description TEXT, -- Описание скрипта
|
| 123 |
+
tags TEXT, -- Теги
|
| 124 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 125 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
|
| 126 |
+
llm_id TEXT, -- Идентификатор LLM
|
| 127 |
UNIQUE(name, version)
|
| 128 |
);
|
| 129 |
|
| 130 |
-- Реестр LLM-агентов (в т.ч. удалённых)
|
| 131 |
CREATE TABLE IF NOT EXISTS llm_registry (
|
| 132 |
+
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
|
| 133 |
+
name TEXT, -- Имя агента
|
| 134 |
+
description TEXT, -- Описание
|
| 135 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
|
| 136 |
+
);
|
| 137 |
+
|
| 138 |
+
-- Локальные идентичности агента
|
| 139 |
+
CREATE TABLE IF NOT EXISTS identity (
|
| 140 |
+
id TEXT PRIMARY KEY, -- Уникальный идентификатор личности (можно UUID или hash)
|
| 141 |
+
name TEXT, -- Человеко-читаемое имя
|
| 142 |
+
pubkey TEXT, -- Публичный к��юч (для подписи/шифрования)
|
| 143 |
+
privkey TEXT, -- Приватный ключ (шифруется на уровне хранилища)
|
| 144 |
+
metadata TEXT, -- Дополнительная информация о назначении/контексте
|
| 145 |
+
created_at TEXT, -- Дата создания
|
| 146 |
+
updated_at TEXT -- Последнее обновление
|
| 147 |
+
);
|
| 148 |
+
|
| 149 |
+
-- Конфигурация агента
|
| 150 |
+
CREATE TABLE IF NOT EXISTS config (
|
| 151 |
+
key TEXT PRIMARY KEY, -- Переменная
|
| 152 |
+
value TEXT -- Значение
|
| 153 |
);
|
| 154 |
|
| 155 |
-- Список пользователей
|
| 156 |
+
CREATE TABLE IF NOT EXISTS users (
|
| 157 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 158 |
+
ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента
|
| 159 |
+
username TEXT, -- имя пользователя (необязательно уникальное)
|
| 160 |
+
did TEXT UNIQUE, -- децентрализованный идентификатор
|
| 161 |
+
mail TEXT UNIQUE, -- электронная почта
|
| 162 |
+
password_hash TEXT, -- хэш пароля
|
| 163 |
+
info TEXT, -- произвольная информация, JSON
|
| 164 |
+
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
| 165 |
+
language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en"
|
| 166 |
+
operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
|
| 167 |
);
|
| 168 |
|
| 169 |
-- Группы пользователей
|
| 170 |
CREATE TABLE IF NOT EXISTS users_group (
|
| 171 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
|
| 172 |
+
group_name TEXT UNIQUE NOT NULL, -- Название группы
|
| 173 |
+
description TEXT, -- Описание группы
|
| 174 |
+
users TEXT -- JSON-массив DID пользователей в группе
|
| 175 |
);
|
| 176 |
|
| 177 |
-- Таблица для хранения токенов восстановления пароля
|
| 178 |
+
CREATE TABLE IF NOT EXISTS password_reset_tokens (
|
| 179 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 180 |
+
user_id INTEGER NOT NULL, -- Ссылка на пользователя
|
| 181 |
+
token TEXT UNIQUE NOT NULL, -- Уникальный токен
|
| 182 |
+
created_at DATETIME NOT NULL, -- Время создания токена
|
| 183 |
+
expires_at DATETIME NOT NULL, -- Время истечения срока действия
|
| 184 |
+
used BOOLEAN DEFAULT 0, -- Использован ли токен
|
| 185 |
FOREIGN KEY(user_id) REFERENCES users(user_id)
|
| 186 |
);
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
CHANGED
|
@@ -1,47 +1,68 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
#
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
#
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
#
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
#
|
| 46 |
-
|
| 47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# HMP Agent Configuration
|
| 2 |
+
|
| 3 |
+
# === Общие параметры ===
|
| 4 |
+
agent_id: "" # Оставьте пустым для генерации DiD автоматически
|
| 5 |
+
agent_name: "CognitiveCore" # Имя агента
|
| 6 |
+
agent_role: "core" # 'core' или 'shell'
|
| 7 |
+
|
| 8 |
+
# === Прокси ===
|
| 9 |
+
proxy_mode: false # false — прокси не используется, иначе true
|
| 10 |
+
proxy_type: "socks5" # 'http', 'socks4', 'socks5' и т.д. (если proxy_mode: true)
|
| 11 |
+
proxy_address: "127.0.0.1:9050"
|
| 12 |
+
|
| 13 |
+
# === Функции ядра ===
|
| 14 |
+
enable_llm: true # доступ к LLM
|
| 15 |
+
|
| 16 |
+
serve_api: true # REST API
|
| 17 |
+
api_port: 8080
|
| 18 |
+
|
| 19 |
+
# === DHT-сеть и обмен знаниями ===
|
| 20 |
+
dht_enabled: true # Включение участия в DHT-сети (включено принудительно!)
|
| 21 |
+
dht_update: true # Регулярные обновления и публикация данных в DHT (включено принудительно!)
|
| 22 |
+
bootstrap_responder: true # Агент отвечает на bootstrap-запросы (включено принудительно!)
|
| 23 |
+
dht_port: 20784
|
| 24 |
+
update_interval: 60 # секунд (для DHT-обновлений)
|
| 25 |
+
|
| 26 |
+
# === LLM-бэкенды ===
|
| 27 |
+
llm_backends:
|
| 28 |
+
- name: "local-model"
|
| 29 |
+
type: "local"
|
| 30 |
+
path: "/models/gguf/mistral.gguf"
|
| 31 |
+
format: "gguf"
|
| 32 |
+
prompt_template: "mistral"
|
| 33 |
+
|
| 34 |
+
- name: "openai-gpt4o"
|
| 35 |
+
type: "api"
|
| 36 |
+
provider: "openai"
|
| 37 |
+
model: "gpt-4o"
|
| 38 |
+
api_key: "sk-..."
|
| 39 |
+
|
| 40 |
+
# Пользователь может добавить сколько угодно дополнительных локальных или сетевых LLM
|
| 41 |
+
|
| 42 |
+
default_llm: "local-model" # если модели нет в списке `llm_backends` используется первая в списке
|
| 43 |
+
|
| 44 |
+
# === Веб-интерфейс ===
|
| 45 |
+
notebook_ui: true # UI в виде блокнота
|
| 46 |
+
# ui_hosts:
|
| 47 |
+
# - "0.0.0.0" # (небезопасно) доступ с любых IPv4-адресов
|
| 48 |
+
# - "::" # (небезопасно) доступ с любых IPv6-адресов
|
| 49 |
+
ui_hosts: # Какие IP прослушиваются, ["0.0.0.0"; "::"] - доступен везде
|
| 50 |
+
- "127.0.0.1"
|
| 51 |
+
- "::1"
|
| 52 |
+
ui_port: 8765
|
| 53 |
+
|
| 54 |
+
# === Данные пользователя ===
|
| 55 |
+
default_user:
|
| 56 |
+
username: "user"
|
| 57 |
+
email: "[email protected]"
|
| 58 |
+
password_hash: "" # пусто при инициализации, будет установлен при регистрации
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
# === Пути ===
|
| 62 |
+
data_dir: "./data"
|
| 63 |
+
log_dir: "./logs"
|
| 64 |
+
db_path: "./data/agent_storage.db"
|
| 65 |
+
|
| 66 |
+
# === Отладка и логгирование ===
|
| 67 |
+
debug: true
|
| 68 |
+
log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.md
CHANGED
|
@@ -200,3 +200,50 @@
|
|
| 200 |
| strength | REAL | Вес связи (от 0 до 1) |
|
| 201 |
| context | TEXT | Контекст или обоснование связи |
|
| 202 |
| timestamp | TEXT | Время создания связи |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 200 |
| strength | REAL | Вес связи (от 0 до 1) |
|
| 201 |
| context | TEXT | Контекст или обоснование связи |
|
| 202 |
| timestamp | TEXT | Время создания связи |
|
| 203 |
+
|
| 204 |
+
---
|
| 205 |
+
|
| 206 |
+
### 👤 `users`
|
| 207 |
+
|
| 208 |
+
**Назначение:** Хранение информации о пользователях системы (человеческих операторах).
|
| 209 |
+
|
| 210 |
+
| Поле | Тип | Описание |
|
| 211 |
+
| -------------- | -------- | --------------------------------------------------------------- |
|
| 212 |
+
| user\_id | INTEGER | Уникальный идентификатор пользователя |
|
| 213 |
+
| ban | DATETIME | Время до которого действует бан (если есть) |
|
| 214 |
+
| username | TEXT | Имя пользователя (необязательно уникальное) |
|
| 215 |
+
| did | TEXT | Децентрализованный идентификатор (уникальный) |
|
| 216 |
+
| mail | TEXT | Email пользователя (уникальный) |
|
| 217 |
+
| password\_hash | TEXT | Хэш пароля |
|
| 218 |
+
| info | TEXT | Произвольная дополнительная информация в формате JSON |
|
| 219 |
+
| contacts | TEXT | Альтернативные контакты (matrix, telegram и др.) в формате JSON |
|
| 220 |
+
| language | TEXT | Предпочтительные языки (через запятую, например: `ru,en`) |
|
| 221 |
+
| operator | BOOLEAN | Является ли пользователь оператором (1 — да, 0 — нет) |
|
| 222 |
+
|
| 223 |
+
---
|
| 224 |
+
|
| 225 |
+
### 👥 `users_group`
|
| 226 |
+
|
| 227 |
+
**Назначение:** Группировка пользователей для разграничения доступа, роли и рассылок.
|
| 228 |
+
|
| 229 |
+
| Поле | Тип | Описание |
|
| 230 |
+
| ----------- | ------- | ---------------------------------------------- |
|
| 231 |
+
| id | INTEGER | Уникальный идентификатор группы |
|
| 232 |
+
| group\_name | TEXT | Уникальное имя группы |
|
| 233 |
+
| description | TEXT | Описание назначения группы |
|
| 234 |
+
| users | TEXT | JSON-массив или CSV-строка с DID пользователей |
|
| 235 |
+
|
| 236 |
+
---
|
| 237 |
+
|
| 238 |
+
### 🔐 `password_reset_tokens`
|
| 239 |
+
|
| 240 |
+
**Назначение:** Сброс пароля — одноразовые токены восстановления доступа.
|
| 241 |
+
|
| 242 |
+
| Поле | Тип | Описание |
|
| 243 |
+
| ----------- | -------- | ------------------------------------------------------- |
|
| 244 |
+
| id | INTEGER | Уникальный идентификатор |
|
| 245 |
+
| user\_id | INTEGER | Ссылка на пользователя (внешний ключ к `users.user_id`) |
|
| 246 |
+
| token | TEXT | Уникальный токен |
|
| 247 |
+
| created\_at | DATETIME | Дата и время создания токена |
|
| 248 |
+
| expires\_at | DATETIME | Срок действия токена |
|
| 249 |
+
| used | BOOLEAN | Был ли использован токен (0 — нет, 1 — да) |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -1,140 +1,138 @@
|
|
| 1 |
-
-- Основные таблицы когнитивного ядра
|
| 2 |
-
|
| 3 |
-- Дневниковые записи (размышления, наблюдения, воспоминания)
|
| 4 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
| 5 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 6 |
-
text TEXT NOT NULL,
|
| 7 |
-
tags TEXT,
|
| 8 |
-
priority INTEGER DEFAULT 0,
|
| 9 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 10 |
-
llm_id TEXT
|
| 11 |
);
|
| 12 |
|
| 13 |
-- Концепты (понятия, сущности, идеи)
|
| 14 |
CREATE TABLE IF NOT EXISTS concepts (
|
| 15 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 16 |
-
name TEXT NOT NULL UNIQUE,
|
| 17 |
-
description TEXT,
|
| 18 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 19 |
-
llm_id TEXT
|
| 20 |
);
|
| 21 |
|
| 22 |
-- Семантические связи между концептами
|
| 23 |
CREATE TABLE IF NOT EXISTS links (
|
| 24 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 25 |
-
from_concept_id INTEGER,
|
| 26 |
-
to_concept_id INTEGER,
|
| 27 |
-
relation_type TEXT,
|
| 28 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 29 |
-
llm_id TEXT,
|
| 30 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
| 31 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
| 32 |
);
|
| 33 |
|
| 34 |
-
--
|
| 35 |
CREATE TABLE IF NOT EXISTS diary_graph_index (
|
| 36 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 37 |
-
source_entry_id INTEGER NOT NULL,
|
| 38 |
-
target_entry_id INTEGER NOT NULL,
|
| 39 |
-
relation TEXT NOT NULL,
|
| 40 |
-
strength REAL DEFAULT 1.0,
|
| 41 |
-
context TEXT,
|
| 42 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
| 43 |
);
|
| 44 |
|
| 45 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
| 46 |
CREATE TABLE IF NOT EXISTS notes (
|
| 47 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 48 |
-
text TEXT NOT NULL,
|
| 49 |
-
tags TEXT,
|
| 50 |
-
user_did TEXT DEFAULT 'ALL'
|
| 51 |
-
source TEXT DEFAULT 'user',
|
| 52 |
-
links TEXT DEFAULT '',
|
| 53 |
-
read INTEGER DEFAULT 0,
|
| 54 |
-
hidden INTEGER DEFAULT 0,
|
| 55 |
-
priority INTEGER DEFAULT 0,
|
| 56 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 57 |
-
llm_id TEXT
|
| 58 |
);
|
| 59 |
|
| 60 |
-- Лог процессов: задачи, ошибки, события
|
| 61 |
CREATE TABLE IF NOT EXISTS process_log (
|
| 62 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 63 |
-
name TEXT NOT NULL,
|
| 64 |
-
value TEXT,
|
| 65 |
-
tags TEXT,
|
| 66 |
-
status TEXT DEFAULT 'ok',
|
| 67 |
-
priority INTEGER DEFAULT 0,
|
| 68 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 69 |
-
llm_id TEXT
|
| 70 |
);
|
| 71 |
|
| 72 |
-
--
|
| 73 |
CREATE TABLE IF NOT EXISTS llm_memory (
|
| 74 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 75 |
-
title TEXT,
|
| 76 |
-
content TEXT NOT NULL,
|
| 77 |
-
tags TEXT,
|
| 78 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 79 |
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 80 |
-
llm_id TEXT
|
| 81 |
);
|
| 82 |
|
| 83 |
-
-- Краткосрочная память
|
| 84 |
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
| 85 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 86 |
-
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 87 |
-
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
| 88 |
-
content TEXT NOT NULL,
|
| 89 |
-
llm_id TEXT
|
| 90 |
);
|
| 91 |
|
| 92 |
-
-- Список известных HMP
|
| 93 |
CREATE TABLE IF NOT EXISTS agent_peers (
|
| 94 |
-
id TEXT PRIMARY KEY,
|
| 95 |
-
name TEXT,
|
| 96 |
-
addresses TEXT,
|
| 97 |
-
tags TEXT,
|
| 98 |
-
status TEXT DEFAULT 'unknown',
|
| 99 |
-
last_seen DATETIME,
|
| 100 |
-
description TEXT,
|
| 101 |
-
capabilities TEXT,
|
| 102 |
-
pubkey TEXT,
|
| 103 |
-
software_info TEXT,
|
| 104 |
-
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 105 |
);
|
| 106 |
|
| 107 |
-
--
|
| 108 |
CREATE TABLE IF NOT EXISTS agent_tables (
|
| 109 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 110 |
-
table_name TEXT NOT NULL UNIQUE,
|
| 111 |
-
description TEXT,
|
| 112 |
-
schema TEXT NOT NULL,
|
| 113 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 114 |
-
llm_id TEXT
|
| 115 |
);
|
| 116 |
|
| 117 |
-
--
|
| 118 |
CREATE TABLE IF NOT EXISTS agent_scripts (
|
| 119 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 120 |
-
name TEXT NOT NULL,
|
| 121 |
-
version TEXT NOT NULL,
|
| 122 |
-
code TEXT NOT NULL,
|
| 123 |
-
language TEXT DEFAULT 'python',
|
| 124 |
-
description TEXT,
|
| 125 |
-
tags TEXT,
|
| 126 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 127 |
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 128 |
-
llm_id TEXT,
|
| 129 |
UNIQUE(name, version)
|
| 130 |
);
|
| 131 |
|
| 132 |
-
--
|
| 133 |
CREATE TABLE IF NOT EXISTS llm_registry (
|
| 134 |
-
id TEXT PRIMARY KEY,
|
| 135 |
-
name TEXT,
|
| 136 |
-
description TEXT,
|
| 137 |
-
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 138 |
);
|
| 139 |
|
| 140 |
-- Список пользователей
|
|
@@ -151,23 +149,21 @@ CREATE TABLE users (
|
|
| 151 |
operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
|
| 152 |
);
|
| 153 |
|
| 154 |
-
--
|
| 155 |
CREATE TABLE IF NOT EXISTS users_group (
|
| 156 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 157 |
-
group_name TEXT UNIQUE NOT NULL,
|
| 158 |
-
description TEXT,
|
| 159 |
-
users TEXT
|
| 160 |
);
|
| 161 |
|
| 162 |
-- Таблица для хранения токенов восстановления пароля
|
| 163 |
CREATE TABLE password_reset_tokens (
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
);
|
| 172 |
-
|
| 173 |
-
|
|
|
|
|
|
|
|
|
|
| 1 |
-- Дневниковые записи (размышления, наблюдения, воспоминания)
|
| 2 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
| 3 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
|
| 4 |
+
text TEXT NOT NULL, -- Содержимое дневниковой записи
|
| 5 |
+
tags TEXT, -- Теги для классификации (например: "наблюдение", "рефлексия")
|
| 6 |
+
priority INTEGER DEFAULT 0, -- Приоритет записи (0 = обычный, >0 = важный)
|
| 7 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания записи
|
| 8 |
+
llm_id TEXT -- Идентификатор LLM, создавшего запись
|
| 9 |
);
|
| 10 |
|
| 11 |
-- Концепты (понятия, сущности, идеи)
|
| 12 |
CREATE TABLE IF NOT EXISTS concepts (
|
| 13 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор концепта
|
| 14 |
+
name TEXT NOT NULL UNIQUE, -- Название концепта
|
| 15 |
+
description TEXT, -- Описание или определение концепта
|
| 16 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания концепта
|
| 17 |
+
llm_id TEXT -- Идентификатор LLM, добавившего концепт
|
| 18 |
);
|
| 19 |
|
| 20 |
-- Семантические связи между концептами
|
| 21 |
CREATE TABLE IF NOT EXISTS links (
|
| 22 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор связи
|
| 23 |
+
from_concept_id INTEGER, -- Идентификатор исходного концепта
|
| 24 |
+
to_concept_id INTEGER, -- Идентификатор целевого концепта
|
| 25 |
+
relation_type TEXT, -- Тип отношения (например: "is_a", "causes", "related_to")
|
| 26 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания связи
|
| 27 |
+
llm_id TEXT, -- Идентификатор LLM, создавшего связь
|
| 28 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
| 29 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
| 30 |
);
|
| 31 |
|
| 32 |
+
-- Индексы между дневниковыми записями (смысловая карта)
|
| 33 |
CREATE TABLE IF NOT EXISTS diary_graph_index (
|
| 34 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор индекса
|
| 35 |
+
source_entry_id INTEGER NOT NULL, -- Идентификатор исходной записи
|
| 36 |
+
target_entry_id INTEGER NOT NULL, -- Идентификатор целевой записи
|
| 37 |
+
relation TEXT NOT NULL, -- Тип связи (например: "refers_to", "contradicts")
|
| 38 |
+
strength REAL DEFAULT 1.0, -- Сила связи (0-1)
|
| 39 |
+
context TEXT, -- Дополнительный контекст связи
|
| 40 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса
|
| 41 |
);
|
| 42 |
|
| 43 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
| 44 |
CREATE TABLE IF NOT EXISTS notes (
|
| 45 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор заметки
|
| 46 |
+
text TEXT NOT NULL, -- Текст заметки
|
| 47 |
+
tags TEXT, -- Теги (например: "idea", "instruction")
|
| 48 |
+
user_did TEXT DEFAULT 'ALL', -- DID пользователя (или 'ALL' — для всех)
|
| 49 |
+
source TEXT DEFAULT 'user', -- Источник заметки: user | llm | system
|
| 50 |
+
links TEXT DEFAULT '', -- Ссылки или связи с другими объектами
|
| 51 |
+
read INTEGER DEFAULT 0, -- Статус прочтения LLM: 0 = нет, 1 = да
|
| 52 |
+
hidden INTEGER DEFAULT 0, -- Скрыта ли от пользователя: 0 = нет, 1 = да
|
| 53 |
+
priority INTEGER DEFAULT 0, -- Приоритет заметки
|
| 54 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 55 |
+
llm_id TEXT -- Идентификатор LLM
|
| 56 |
);
|
| 57 |
|
| 58 |
-- Лог процессов: задачи, ошибки, события
|
| 59 |
CREATE TABLE IF NOT EXISTS process_log (
|
| 60 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
|
| 61 |
+
name TEXT NOT NULL, -- Название события или процесса
|
| 62 |
+
value TEXT, -- Значение (результат, сообщение и т.п.)
|
| 63 |
+
tags TEXT, -- Теги для поиска
|
| 64 |
+
status TEXT DEFAULT 'ok', -- Статус: ok | warning | error | timeout | offline | close
|
| 65 |
+
priority INTEGER DEFAULT 0, -- Приоритет события
|
| 66 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время записи
|
| 67 |
+
llm_id TEXT -- Идентификатор LLM
|
| 68 |
);
|
| 69 |
|
| 70 |
+
-- Долговременная память LLM
|
| 71 |
CREATE TABLE IF NOT EXISTS llm_memory (
|
| 72 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
|
| 73 |
+
title TEXT, -- Заголовок или тема
|
| 74 |
+
content TEXT NOT NULL, -- Основное содержимое
|
| 75 |
+
tags TEXT, -- Теги (goal, observation, plan и т.д.)
|
| 76 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 77 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
|
| 78 |
+
llm_id TEXT -- Идентификатор LLM
|
| 79 |
);
|
| 80 |
|
| 81 |
+
-- Краткосрочная память (диалоговая история)
|
| 82 |
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
| 83 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 84 |
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время сообщения
|
| 85 |
+
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL, -- Роль автора
|
| 86 |
+
content TEXT NOT NULL, -- Содержимое сообщения
|
| 87 |
+
llm_id TEXT -- Идентификатор LLM
|
| 88 |
);
|
| 89 |
|
| 90 |
+
-- Список известных агентов в сети HMP
|
| 91 |
CREATE TABLE IF NOT EXISTS agent_peers (
|
| 92 |
+
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
|
| 93 |
+
name TEXT, -- Имя агента
|
| 94 |
+
addresses TEXT, -- Адреса для связи (JSON)
|
| 95 |
+
tags TEXT, -- Теги (Postman, Friend и т.д.)
|
| 96 |
+
status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted и др.
|
| 97 |
+
last_seen DATETIME, -- Последний раз был в сети
|
| 98 |
+
description TEXT, -- Описание агента
|
| 99 |
+
capabilities TEXT, -- Возможности (JSON)
|
| 100 |
+
pubkey TEXT, -- Публичный ключ
|
| 101 |
+
software_info TEXT, -- Информация о ПО агента (JSON)
|
| 102 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
|
| 103 |
);
|
| 104 |
|
| 105 |
+
-- Таблицы, созданные агентами
|
| 106 |
CREATE TABLE IF NOT EXISTS agent_tables (
|
| 107 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 108 |
+
table_name TEXT NOT NULL UNIQUE, -- Название таблицы
|
| 109 |
+
description TEXT, -- Описание назначения таблицы
|
| 110 |
+
schema TEXT NOT NULL, -- SQL-схема таблицы
|
| 111 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Дата создания
|
| 112 |
+
llm_id TEXT -- Идентификатор LLM
|
| 113 |
);
|
| 114 |
|
| 115 |
+
-- Скрипты, утилиты и код агентов
|
| 116 |
CREATE TABLE IF NOT EXISTS agent_scripts (
|
| 117 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 118 |
+
name TEXT NOT NULL, -- Название скрипта
|
| 119 |
+
version TEXT NOT NULL, -- Версия
|
| 120 |
+
code TEXT NOT NULL, -- Код скрипта
|
| 121 |
+
language TEXT DEFAULT 'python', -- Язык программирования
|
| 122 |
+
description TEXT, -- Описание скрипта
|
| 123 |
+
tags TEXT, -- Теги
|
| 124 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 125 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
|
| 126 |
+
llm_id TEXT, -- Идентификатор LLM
|
| 127 |
UNIQUE(name, version)
|
| 128 |
);
|
| 129 |
|
| 130 |
+
-- Реестр LLM-агентов (в т.ч. удалённых)
|
| 131 |
CREATE TABLE IF NOT EXISTS llm_registry (
|
| 132 |
+
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
|
| 133 |
+
name TEXT, -- Имя агента
|
| 134 |
+
description TEXT, -- Описание
|
| 135 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
|
| 136 |
);
|
| 137 |
|
| 138 |
-- Список пользователей
|
|
|
|
| 149 |
operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
|
| 150 |
);
|
| 151 |
|
| 152 |
+
-- Группы пользователей
|
| 153 |
CREATE TABLE IF NOT EXISTS users_group (
|
| 154 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
|
| 155 |
+
group_name TEXT UNIQUE NOT NULL, -- Название группы
|
| 156 |
+
description TEXT, -- Описание группы
|
| 157 |
+
users TEXT -- JSON-массив DID пользователей в группе
|
| 158 |
);
|
| 159 |
|
| 160 |
-- Таблица для хранения токенов восстановления пароля
|
| 161 |
CREATE TABLE password_reset_tokens (
|
| 162 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
|
| 163 |
+
user_id INTEGER NOT NULL, -- Ссылка на пользователя
|
| 164 |
+
token TEXT UNIQUE NOT NULL, -- Уникальный токен
|
| 165 |
+
created_at DATETIME NOT NULL, -- Время создания токена
|
| 166 |
+
expires_at DATETIME NOT NULL, -- Время истечения срока действия
|
| 167 |
+
used BOOLEAN DEFAULT 0, -- Использован ли токен
|
| 168 |
+
FOREIGN KEY(user_id) REFERENCES users(user_id)
|
| 169 |
);
|
|
|
|
|
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/test.bat
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
echo --------------------------
|
| 2 |
+
echo Installing requirements...
|
| 3 |
+
echo --------------------------
|
| 4 |
+
pip install -r requirements.txt
|
| 5 |
+
|
| 6 |
+
echo --------------------------
|
| 7 |
+
echo Running test...
|
| 8 |
+
echo --------------------------
|
| 9 |
+
|
| 10 |
+
python test.py
|
| 11 |
+
|
| 12 |
+
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/test.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# agents/test.py
|
| 2 |
+
import json
|
| 3 |
+
import os
|
| 4 |
+
import sys
|
| 5 |
+
import time
|
| 6 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 7 |
+
from datetime import datetime
|
| 8 |
+
from tools.storage import Storage
|
| 9 |
+
|
| 10 |
+
if __name__ == "__main__":
|
| 11 |
+
print("[*] Инициализация БД через Storage...")
|
| 12 |
+
storage = Storage()
|
| 13 |
+
print("[+] Готово.")
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.gitignore
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Byte-compiled / optimized / DLL files
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.py[cod]
|
| 4 |
+
*$py.class
|
| 5 |
+
|
| 6 |
+
# SQLite DB
|
| 7 |
+
agent_storage.db
|
| 8 |
+
agent_data.db
|
| 9 |
+
|
| 10 |
+
# Environment
|
| 11 |
+
.env
|
| 12 |
+
.venv/
|
| 13 |
+
env/
|
| 14 |
+
venv/
|
| 15 |
+
|
| 16 |
+
# VS Code
|
| 17 |
+
.vscode/
|
| 18 |
+
*.code-workspace
|
| 19 |
+
|
| 20 |
+
# Logs and debug
|
| 21 |
+
*.log
|
| 22 |
+
|
| 23 |
+
# OS-specific
|
| 24 |
+
.DS_Store
|
| 25 |
+
Thumbs.db
|
| 26 |
+
|
| 27 |
+
# PyInstaller
|
| 28 |
+
*.spec
|
| 29 |
+
dist/
|
| 30 |
+
build/
|
| 31 |
+
|
| 32 |
+
# Jupyter (на случай экспериментов)
|
| 33 |
+
.ipynb_checkpoints/
|
| 34 |
+
|
| 35 |
+
# System folders
|
| 36 |
+
.idea/
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md
CHANGED
|
@@ -15,7 +15,6 @@ agents/
|
|
| 15 |
├── ethics.yml ← Локальная этическая модель.
|
| 16 |
└── bootstrap.txt ← Список начальных узлов.
|
| 17 |
└── tools/
|
| 18 |
-
├── init_db.py ← Инициализация базы данных.
|
| 19 |
├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite.
|
| 20 |
├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
| 21 |
├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
|
|
@@ -43,7 +42,6 @@ agents/
|
|
| 43 |
* [logger.py](logger.py) - Ведение логов.
|
| 44 |
* tools
|
| 45 |
* [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
|
| 46 |
-
* [init_db.py](tools/init_db.py) - Инициализация базы данных.
|
| 47 |
* [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
|
| 48 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
| 49 |
* [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
|
|
|
|
| 15 |
├── ethics.yml ← Локальная этическая модель.
|
| 16 |
└── bootstrap.txt ← Список начальных узлов.
|
| 17 |
└── tools/
|
|
|
|
| 18 |
├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite.
|
| 19 |
├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
| 20 |
├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
|
|
|
|
| 42 |
* [logger.py](logger.py) - Ведение логов.
|
| 43 |
* tools
|
| 44 |
* [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
|
|
|
|
| 45 |
* [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
|
| 46 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
| 47 |
* [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py
CHANGED
|
@@ -17,7 +17,6 @@ from tools.memory_utils import (
|
|
| 17 |
)
|
| 18 |
from tools.storage import Storage
|
| 19 |
|
| 20 |
-
|
| 21 |
def run_repl(config=None):
|
| 22 |
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
|
| 23 |
config = config or {}
|
|
|
|
| 17 |
)
|
| 18 |
from tools.storage import Storage
|
| 19 |
|
|
|
|
| 20 |
def run_repl(config=None):
|
| 21 |
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
|
| 22 |
config = config or {}
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -147,7 +147,8 @@ CREATE TABLE users (
|
|
| 147 |
password_hash TEXT, -- хэш пароля
|
| 148 |
info TEXT, -- произвольная информация, JSON
|
| 149 |
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
| 150 |
-
language TEXT
|
|
|
|
| 151 |
);
|
| 152 |
|
| 153 |
-- Список групп пользователей
|
|
|
|
| 147 |
password_hash TEXT, -- хэш пароля
|
| 148 |
info TEXT, -- произвольная информация, JSON
|
| 149 |
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
| 150 |
+
language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en"
|
| 151 |
+
operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
|
| 152 |
);
|
| 153 |
|
| 154 |
-- Список групп пользователей
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
agent_mode: mcp # Режим работы: mcp / full / llm / test
|
| 2 |
agent_name: mcp-01 # Имя агента
|
| 3 |
agent_role: core # или connector
|
|
@@ -9,10 +11,19 @@ llm_api_url: https://api.openai.com/v1/chat/completions
|
|
| 9 |
llm_session_cookie: null
|
| 10 |
context_db: context.sqlite
|
| 11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
# REST API
|
| 13 |
api_port: 8080 # Порт для локального REST API
|
| 14 |
serve_api: true # Включить REST API (например, для мониторинга или команд)
|
| 15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
# DHT / Mesh Connectivity
|
| 17 |
dht_enabled: true # Активировать DHT-модуль
|
| 18 |
dht_port: 20784 # Порт для связи по DHT (TCP/UDP)
|
|
|
|
| 1 |
+
db_path: agents/agent_data/agent_data.db
|
| 2 |
+
|
| 3 |
agent_mode: mcp # Режим работы: mcp / full / llm / test
|
| 4 |
agent_name: mcp-01 # Имя агента
|
| 5 |
agent_role: core # или connector
|
|
|
|
| 11 |
llm_session_cookie: null
|
| 12 |
context_db: context.sqlite
|
| 13 |
|
| 14 |
+
# operator:
|
| 15 |
+
operator_did: "did:hmp:operator123"
|
| 16 |
+
operator_mail: "operator@localhost"
|
| 17 |
+
operator_username: "Оператор"
|
| 18 |
+
|
| 19 |
# REST API
|
| 20 |
api_port: 8080 # Порт для локального REST API
|
| 21 |
serve_api: true # Включить REST API (например, для мониторинга или команд)
|
| 22 |
|
| 23 |
+
# web interface:
|
| 24 |
+
web_interfaces: ["127.0.0.1", "192.168.0.1", "::1"] # или ["0.0.0.0"] для доступа отовсюду
|
| 25 |
+
web_port: 8000
|
| 26 |
+
|
| 27 |
# DHT / Mesh Connectivity
|
| 28 |
dht_enabled: true # Активировать DHT-модуль
|
| 29 |
dht_port: 20784 # Порт для связи по DHT (TCP/UDP)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -138,13 +138,16 @@ CREATE TABLE IF NOT EXISTS llm_registry (
|
|
| 138 |
);
|
| 139 |
|
| 140 |
-- Список пользователей
|
| 141 |
-
CREATE TABLE
|
| 142 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 143 |
-
|
| 144 |
-
username TEXT,
|
| 145 |
-
did TEXT UNIQUE,
|
| 146 |
-
|
| 147 |
-
|
|
|
|
|
|
|
|
|
|
| 148 |
);
|
| 149 |
|
| 150 |
-- Список групп пользователей
|
|
@@ -155,4 +158,15 @@ CREATE TABLE IF NOT EXISTS users_group (
|
|
| 155 |
users TEXT -- JSON-массив или CSV со списком DID, например: '["did:example:123", "did:example:456"]'
|
| 156 |
);
|
| 157 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
|
|
|
|
| 138 |
);
|
| 139 |
|
| 140 |
-- Список пользователей
|
| 141 |
+
CREATE TABLE users (
|
| 142 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 143 |
+
ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента
|
| 144 |
+
username TEXT, -- имя пользователя (необязательно уникальное)
|
| 145 |
+
did TEXT UNIQUE, -- децентрализованный идентификатор
|
| 146 |
+
mail TEXT UNIQUE, -- электронная почта
|
| 147 |
+
password_hash TEXT, -- хэш пароля
|
| 148 |
+
info TEXT, -- произвольная информация, JSON
|
| 149 |
+
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
| 150 |
+
language TEXT -- список предпочитаемых языков, через запятую, например: "ru,en"
|
| 151 |
);
|
| 152 |
|
| 153 |
-- Список групп пользователей
|
|
|
|
| 158 |
users TEXT -- JSON-массив или CSV со списком DID, например: '["did:example:123", "did:example:456"]'
|
| 159 |
);
|
| 160 |
|
| 161 |
+
-- Таблица для хранения токенов восстановления пароля
|
| 162 |
+
CREATE TABLE password_reset_tokens (
|
| 163 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 164 |
+
user_id INTEGER NOT NULL,
|
| 165 |
+
token TEXT UNIQUE NOT NULL,
|
| 166 |
+
created_at DATETIME NOT NULL,
|
| 167 |
+
expires_at DATETIME NOT NULL,
|
| 168 |
+
used BOOLEAN DEFAULT 0,
|
| 169 |
+
FOREIGN KEY(user_id) REFERENCES users(user_id)
|
| 170 |
+
);
|
| 171 |
+
|
| 172 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md
CHANGED
|
@@ -70,6 +70,7 @@
|
|
| 70 |
- для отправки сообщений другим агентам
|
| 71 |
- для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
|
| 72 |
- для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
|
|
|
|
| 73 |
- для управления списком известных HMP-агентов
|
| 74 |
- для выбора *текущего основного LLM*
|
| 75 |
- для управления дополнительными утилитами и базами данных
|
|
|
|
| 70 |
- для отправки сообщений другим агентам
|
| 71 |
- для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
|
| 72 |
- для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
|
| 73 |
+
- для управления **пользователями** `users` и **группами пользователей** `users_group`
|
| 74 |
- для управления списком известных HMP-агентов
|
| 75 |
- для выбора *текущего основного LLM*
|
| 76 |
- для управления дополнительными утилитами и базами данных
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
CHANGED
|
@@ -15,171 +15,12 @@ class Storage:
|
|
| 15 |
self._init_db()
|
| 16 |
|
| 17 |
def _init_db(self):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
c = self.conn.cursor()
|
| 19 |
-
|
| 20 |
-
# --- Основные таблицы когнитивного ядра ---
|
| 21 |
-
|
| 22 |
-
# Дневниковые записи
|
| 23 |
-
c.execute('''
|
| 24 |
-
CREATE TABLE IF NOT EXISTS diary_entries (
|
| 25 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 26 |
-
text TEXT NOT NULL,
|
| 27 |
-
tags TEXT,
|
| 28 |
-
priority INTEGER DEFAULT 0,
|
| 29 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 30 |
-
llm_id TEXT
|
| 31 |
-
)
|
| 32 |
-
''')
|
| 33 |
-
|
| 34 |
-
# Концепты
|
| 35 |
-
c.execute('''
|
| 36 |
-
CREATE TABLE IF NOT EXISTS concepts (
|
| 37 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 38 |
-
name TEXT NOT NULL UNIQUE,
|
| 39 |
-
description TEXT,
|
| 40 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 41 |
-
llm_id TEXT
|
| 42 |
-
)
|
| 43 |
-
''')
|
| 44 |
-
|
| 45 |
-
# Семантические связи
|
| 46 |
-
c.execute('''
|
| 47 |
-
CREATE TABLE IF NOT EXISTS links (
|
| 48 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 49 |
-
from_concept_id INTEGER,
|
| 50 |
-
to_concept_id INTEGER,
|
| 51 |
-
relation_type TEXT,
|
| 52 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 53 |
-
llm_id TEXT,
|
| 54 |
-
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
| 55 |
-
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
| 56 |
-
)
|
| 57 |
-
''')
|
| 58 |
-
|
| 59 |
-
# Заметки / сообщения
|
| 60 |
-
c.execute('''
|
| 61 |
-
CREATE TABLE IF NOT EXISTS notes (
|
| 62 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 63 |
-
text TEXT NOT NULL,
|
| 64 |
-
tags TEXT,
|
| 65 |
-
source TEXT DEFAULT 'user',
|
| 66 |
-
links TEXT DEFAULT '',
|
| 67 |
-
read INTEGER DEFAULT 0,
|
| 68 |
-
hidden INTEGER DEFAULT 0,
|
| 69 |
-
priority INTEGER DEFAULT 0,
|
| 70 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 71 |
-
llm_id TEXT
|
| 72 |
-
)
|
| 73 |
-
''')
|
| 74 |
-
|
| 75 |
-
# Лог процессов
|
| 76 |
-
c.execute('''
|
| 77 |
-
CREATE TABLE IF NOT EXISTS process_log (
|
| 78 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 79 |
-
name TEXT NOT NULL,
|
| 80 |
-
value TEXT,
|
| 81 |
-
tags TEXT,
|
| 82 |
-
status TEXT DEFAULT 'ok',
|
| 83 |
-
priority INTEGER DEFAULT 0,
|
| 84 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
| 85 |
-
llm_id TEXT
|
| 86 |
-
)
|
| 87 |
-
''')
|
| 88 |
-
|
| 89 |
-
# Память LLM
|
| 90 |
-
c.execute('''
|
| 91 |
-
CREATE TABLE IF NOT EXISTS llm_memory (
|
| 92 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 93 |
-
title TEXT,
|
| 94 |
-
content TEXT NOT NULL,
|
| 95 |
-
tags TEXT,
|
| 96 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 97 |
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 98 |
-
llm_id TEXT
|
| 99 |
-
)
|
| 100 |
-
''')
|
| 101 |
-
|
| 102 |
-
# Краткосрочная память
|
| 103 |
-
c.execute('''
|
| 104 |
-
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
| 105 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 106 |
-
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 107 |
-
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
| 108 |
-
content TEXT NOT NULL,
|
| 109 |
-
llm_id TEXT
|
| 110 |
-
)
|
| 111 |
-
''')
|
| 112 |
-
|
| 113 |
-
# Список известных HMP-агентов
|
| 114 |
-
c.execute('''
|
| 115 |
-
CREATE TABLE IF NOT EXISTS agent_peers (
|
| 116 |
-
id TEXT PRIMARY KEY,
|
| 117 |
-
name TEXT,
|
| 118 |
-
addresses TEXT,
|
| 119 |
-
tags TEXT,
|
| 120 |
-
status TEXT DEFAULT 'unknown',
|
| 121 |
-
last_seen DATETIME,
|
| 122 |
-
description TEXT,
|
| 123 |
-
capabilities TEXT,
|
| 124 |
-
pubkey TEXT,
|
| 125 |
-
software_info TEXT,
|
| 126 |
-
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 127 |
-
)
|
| 128 |
-
''')
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
# Пользовательские таблицы
|
| 132 |
-
c.execute('''
|
| 133 |
-
CREATE TABLE IF NOT EXISTS agent_tables (
|
| 134 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 135 |
-
table_name TEXT NOT NULL UNIQUE,
|
| 136 |
-
description TEXT,
|
| 137 |
-
schema TEXT NOT NULL,
|
| 138 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 139 |
-
llm_id TEXT
|
| 140 |
-
)
|
| 141 |
-
''')
|
| 142 |
-
|
| 143 |
-
# Скрипты агентов
|
| 144 |
-
c.execute('''
|
| 145 |
-
CREATE TABLE IF NOT EXISTS agent_scripts (
|
| 146 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 147 |
-
name TEXT NOT NULL,
|
| 148 |
-
version TEXT NOT NULL,
|
| 149 |
-
code TEXT NOT NULL,
|
| 150 |
-
language TEXT DEFAULT 'python',
|
| 151 |
-
description TEXT,
|
| 152 |
-
tags TEXT,
|
| 153 |
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 154 |
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 155 |
-
llm_id TEXT,
|
| 156 |
-
UNIQUE(name, version)
|
| 157 |
-
)
|
| 158 |
-
''')
|
| 159 |
-
|
| 160 |
-
# Регистр LLM
|
| 161 |
-
c.execute('''
|
| 162 |
-
CREATE TABLE IF NOT EXISTS llm_registry (
|
| 163 |
-
id TEXT PRIMARY KEY,
|
| 164 |
-
name TEXT,
|
| 165 |
-
description TEXT,
|
| 166 |
-
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 167 |
-
)
|
| 168 |
-
''')
|
| 169 |
-
|
| 170 |
-
# Быстрые индексы по смысловой карте и дневнику
|
| 171 |
-
c.execute('''
|
| 172 |
-
CREATE TABLE IF NOT EXISTS diary_graph_index (
|
| 173 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 174 |
-
source_entry_id INTEGER NOT NULL,
|
| 175 |
-
target_entry_id INTEGER NOT NULL,
|
| 176 |
-
relation TEXT NOT NULL,
|
| 177 |
-
strength REAL DEFAULT 1.0,
|
| 178 |
-
context TEXT,
|
| 179 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
| 180 |
-
)
|
| 181 |
-
''')
|
| 182 |
-
|
| 183 |
self.conn.commit()
|
| 184 |
|
| 185 |
# Методы для работы с дневником
|
|
|
|
| 15 |
self._init_db()
|
| 16 |
|
| 17 |
def _init_db(self):
|
| 18 |
+
# Загружаем и выполняем весь SQL из файла db_structure.sql
|
| 19 |
+
sql_file = os.path.join(os.path.dirname(__file__), "db_structure.sql")
|
| 20 |
+
with open(sql_file, "r", encoding="utf-8") as f:
|
| 21 |
+
sql_script = f.read()
|
| 22 |
c = self.conn.cursor()
|
| 23 |
+
c.executescript(sql_script) # Выполнит все команды сразу
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
self.conn.commit()
|
| 25 |
|
| 26 |
# Методы для работы с дневником
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -147,11 +147,12 @@ CREATE TABLE IF NOT EXISTS users (
|
|
| 147 |
info TEXT -- JSON
|
| 148 |
);
|
| 149 |
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
);
|
| 157 |
|
|
|
|
|
|
| 147 |
info TEXT -- JSON
|
| 148 |
);
|
| 149 |
|
| 150 |
+
-- Список групп пользователей
|
| 151 |
+
CREATE TABLE IF NOT EXISTS users_group (
|
| 152 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 153 |
+
group_name TEXT UNIQUE NOT NULL,
|
| 154 |
+
description TEXT,
|
| 155 |
+
users TEXT -- JSON-массив или CSV со списком DID, например: '["did:example:123", "did:example:456"]'
|
| 156 |
);
|
| 157 |
|
| 158 |
+
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -138,18 +138,20 @@ CREATE TABLE IF NOT EXISTS llm_registry (
|
|
| 138 |
);
|
| 139 |
|
| 140 |
-- Список пользователей
|
| 141 |
-
CREATE TABLE users (
|
| 142 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
| 143 |
username TEXT,
|
| 144 |
did TEXT UNIQUE,
|
| 145 |
password_hash TEXT,
|
| 146 |
info TEXT -- JSON
|
| 147 |
);
|
| 148 |
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
);
|
|
|
|
|
|
| 138 |
);
|
| 139 |
|
| 140 |
-- Список пользователей
|
| 141 |
+
CREATE TABLE IF NOT EXISTS users (
|
| 142 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 143 |
+
ban_active DATETIME,
|
| 144 |
username TEXT,
|
| 145 |
did TEXT UNIQUE,
|
| 146 |
password_hash TEXT,
|
| 147 |
info TEXT -- JSON
|
| 148 |
);
|
| 149 |
|
| 150 |
+
CREATE TABLE IF NOT EXISTS users_group_membership (
|
| 151 |
+
group_id INTEGER,
|
| 152 |
+
user_id INTEGER,
|
| 153 |
+
PRIMARY KEY (group_id, user_id),
|
| 154 |
+
FOREIGN KEY (group_id) REFERENCES users_group(id),
|
| 155 |
+
FOREIGN KEY (user_id) REFERENCES users(user_id)
|
| 156 |
);
|
| 157 |
+
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt
CHANGED
|
@@ -1,2 +1,6 @@
|
|
| 1 |
scikit-learn
|
| 2 |
pytest
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
scikit-learn
|
| 2 |
pytest
|
| 3 |
+
openai
|
| 4 |
+
requests
|
| 5 |
+
tiktoken
|
| 6 |
+
python-dotenv
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat
CHANGED
|
@@ -1,4 +1,29 @@
|
|
| 1 |
@echo off
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
pause
|
|
|
|
| 1 |
@echo off
|
| 2 |
+
REM === CONFIGURATION ===
|
| 3 |
+
set ENABLE_NOTEBOOK=true
|
| 4 |
+
set ENABLE_MESH=true
|
| 5 |
+
set NOTEBOOK_PATH=user_notebook.txt
|
| 6 |
+
set MESH_PORT=8080
|
| 7 |
+
|
| 8 |
+
echo --------------------------
|
| 9 |
+
echo Installing requirements...
|
| 10 |
+
echo --------------------------
|
| 11 |
+
pip install -r requirements.txt
|
| 12 |
+
|
| 13 |
+
echo --------------------------
|
| 14 |
+
echo Running HMP REPL-agent...
|
| 15 |
+
echo --------------------------
|
| 16 |
+
|
| 17 |
+
set ARGS=
|
| 18 |
+
|
| 19 |
+
if "%ENABLE_NOTEBOOK%"=="true" (
|
| 20 |
+
set ARGS=%ARGS% --enable-user-notebook --notebook-path %NOTEBOOK_PATH%
|
| 21 |
+
)
|
| 22 |
+
|
| 23 |
+
if "%ENABLE_MESH%"=="true" (
|
| 24 |
+
set ARGS=%ARGS% --enable-mesh --mesh-port %MESH_PORT%
|
| 25 |
+
)
|
| 26 |
+
|
| 27 |
+
python repl.py %ARGS%
|
| 28 |
+
|
| 29 |
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh
CHANGED
|
@@ -1,3 +1,30 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
+
|
| 3 |
+
# === CONFIG ===
|
| 4 |
+
ENABLE_NOTEBOOK=true
|
| 5 |
+
ENABLE_MESH=true
|
| 6 |
+
MESH_PORT=8080
|
| 7 |
+
NOTEBOOK_PATH="user_notebook.txt"
|
| 8 |
+
|
| 9 |
+
# === INSTALL DEPENDENCIES ===
|
| 10 |
+
echo "--------------------------"
|
| 11 |
+
echo "Installing requirements..."
|
| 12 |
+
echo "--------------------------"
|
| 13 |
+
pip install -r requirements.txt
|
| 14 |
+
|
| 15 |
+
# === BUILD ARGUMENTS ===
|
| 16 |
+
ARGS=""
|
| 17 |
+
|
| 18 |
+
if [ "$ENABLE_NOTEBOOK" = true ]; then
|
| 19 |
+
ARGS="$ARGS --enable-user-notebook --notebook-path $NOTEBOOK_PATH"
|
| 20 |
+
fi
|
| 21 |
+
|
| 22 |
+
if [ "$ENABLE_MESH" = true ]; then
|
| 23 |
+
ARGS="$ARGS --enable-mesh --mesh-port $MESH_PORT"
|
| 24 |
+
fi
|
| 25 |
+
|
| 26 |
+
# === RUN AGENT ===
|
| 27 |
+
echo "--------------------------"
|
| 28 |
+
echo "Running HMP REPL-agent..."
|
| 29 |
+
echo "--------------------------"
|
| 30 |
+
python repl.py $ARGS
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -47,6 +47,7 @@ CREATE TABLE IF NOT EXISTS notes (
|
|
| 47 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 48 |
text TEXT NOT NULL,
|
| 49 |
tags TEXT,
|
|
|
|
| 50 |
source TEXT DEFAULT 'user', -- user | llm | system
|
| 51 |
links TEXT DEFAULT '',
|
| 52 |
read INTEGER DEFAULT 0, -- 0 = непрочитано LLM, 1 = прочитано
|
|
@@ -135,3 +136,20 @@ CREATE TABLE IF NOT EXISTS llm_registry (
|
|
| 135 |
description TEXT,
|
| 136 |
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 137 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 48 |
text TEXT NOT NULL,
|
| 49 |
tags TEXT,
|
| 50 |
+
user_did TEXT DEFAULT 'ALL'
|
| 51 |
source TEXT DEFAULT 'user', -- user | llm | system
|
| 52 |
links TEXT DEFAULT '',
|
| 53 |
read INTEGER DEFAULT 0, -- 0 = непрочитано LLM, 1 = прочитано
|
|
|
|
| 136 |
description TEXT,
|
| 137 |
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 138 |
);
|
| 139 |
+
|
| 140 |
+
-- Список пользователей
|
| 141 |
+
CREATE TABLE users (
|
| 142 |
+
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 143 |
+
username TEXT,
|
| 144 |
+
did TEXT UNIQUE,
|
| 145 |
+
password_hash TEXT,
|
| 146 |
+
info TEXT -- JSON
|
| 147 |
+
);
|
| 148 |
+
|
| 149 |
+
-- Список групп пользователей
|
| 150 |
+
CREATE TABLE IF NOT EXISTS users_group (
|
| 151 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 152 |
+
group_name TEXT UNIQUE NOT NULL,
|
| 153 |
+
description TEXT,
|
| 154 |
+
users TEXT -- JSON-массив или CSV со списком DID, например: '["did:example:123", "did:example:456"]'
|
| 155 |
+
);
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py
CHANGED
|
@@ -2,7 +2,9 @@
|
|
| 2 |
|
| 3 |
import json
|
| 4 |
import os
|
|
|
|
| 5 |
import time
|
|
|
|
| 6 |
from datetime import datetime
|
| 7 |
from tools.context_builder import build_contexts, build_prompt
|
| 8 |
from tools.llm import call_llm
|
|
|
|
| 2 |
|
| 3 |
import json
|
| 4 |
import os
|
| 5 |
+
import sys
|
| 6 |
import time
|
| 7 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 8 |
from datetime import datetime
|
| 9 |
from tools.context_builder import build_contexts, build_prompt
|
| 10 |
from tools.llm import call_llm
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
echo "Запуск HMP REPL-агента..."
|
| 3 |
-
python3
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
echo "Запуск HMP REPL-агента..."
|
| 3 |
+
python3 repl.py
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
@echo off
|
| 2 |
echo Запуск HMP REPL-агента...
|
| 3 |
-
python
|
| 4 |
pause
|
|
|
|
| 1 |
@echo off
|
| 2 |
echo Запуск HMP REPL-агента...
|
| 3 |
+
python repl.py
|
| 4 |
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
@echo off
|
| 2 |
echo Запуск HMP REPL-агента...
|
| 3 |
-
python
|
| 4 |
pause
|
|
|
|
| 1 |
@echo off
|
| 2 |
echo Запуск HMP REPL-агента...
|
| 3 |
+
python repl.py
|
| 4 |
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
@echo off
|
| 2 |
echo Запуск HMP REPL-агента...
|
| 3 |
-
python
|
| 4 |
pause
|
|
|
|
| 1 |
@echo off
|
| 2 |
echo Запуск HMP REPL-агента...
|
| 3 |
+
python repl_cycle.py
|
| 4 |
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
echo "Запуск HMP REPL-агента..."
|
| 3 |
-
python3
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
echo "Запуск HMP REPL-агента..."
|
| 3 |
+
python3 repl_cycle.py
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
| 2 |
|
| 3 |
```
|
| 4 |
agents/
|
|
|
|
|
|
|
| 5 |
├── agent.py ← Основной исполняемый файл CLI-агента.
|
| 6 |
├── cli.py ← Запуск агента в нужном режиме.
|
| 7 |
├── qa.py ← Режим "вопрос-ответ".
|
|
@@ -30,6 +32,8 @@ agents/
|
|
| 30 |
```
|
| 31 |
|
| 32 |
**Скрипты:**
|
|
|
|
|
|
|
| 33 |
* [agent.py](agent.py) - Основной исполняемый файл CLI-агента.
|
| 34 |
* [cli.py](cli.py) - Запуск агента в нужном режиме.
|
| 35 |
* [qa.py](qa.py) - Режим "вопрос-ответ".
|
|
|
|
| 2 |
|
| 3 |
```
|
| 4 |
agents/
|
| 5 |
+
├── start_repl.bat ← Запуск агента в REPL-режиме.
|
| 6 |
+
├── start_repl.sh ← Запуск агента в REPL-режиме.
|
| 7 |
├── agent.py ← Основной исполняемый файл CLI-агента.
|
| 8 |
├── cli.py ← Запуск агента в нужном режиме.
|
| 9 |
├── qa.py ← Режим "вопрос-ответ".
|
|
|
|
| 32 |
```
|
| 33 |
|
| 34 |
**Скрипты:**
|
| 35 |
+
* [start_repl.bat](start_repl.bat) - Запуск агента в REPL-режиме.
|
| 36 |
+
* [start_repl.sh](start_repl.sh) - Запуск агента в REPL-режиме.
|
| 37 |
* [agent.py](agent.py) - Основной исполняемый файл CLI-агента.
|
| 38 |
* [cli.py](cli.py) - Запуск агента в нужном режиме.
|
| 39 |
* [qa.py](qa.py) - Режим "вопрос-ответ".
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
echo "Запуск HMP REPL-агента..."
|
| 3 |
+
python3 agents/repl_cycle.py
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@echo off
|
| 2 |
+
echo Запуск HMP REPL-агента...
|
| 3 |
+
python agents/repl_cycle.py
|
| 4 |
+
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py
CHANGED
|
@@ -9,12 +9,29 @@ def log_event(event_type, message, extra=None):
|
|
| 9 |
|
| 10 |
entry = {
|
| 11 |
"timestamp": datetime.utcnow().isoformat(),
|
| 12 |
-
"event": event_type,
|
| 13 |
-
"message": message,
|
| 14 |
}
|
| 15 |
|
| 16 |
if extra:
|
| 17 |
-
entry["extra"] = extra
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
| 20 |
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
|
|
| 9 |
|
| 10 |
entry = {
|
| 11 |
"timestamp": datetime.utcnow().isoformat(),
|
| 12 |
+
"event": event_type, # например: 'thought', 'input', 'error', 'action'
|
| 13 |
+
"message": message,
|
| 14 |
}
|
| 15 |
|
| 16 |
if extra:
|
| 17 |
+
entry["extra"] = extra
|
| 18 |
+
|
| 19 |
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
| 20 |
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
def log_repl_snapshot(snapshot: dict):
|
| 24 |
+
"""
|
| 25 |
+
Запись полной структуры REPL-контекста в лог, с возможностью последующего анализа.
|
| 26 |
+
"""
|
| 27 |
+
os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
|
| 28 |
+
|
| 29 |
+
entry = {
|
| 30 |
+
"timestamp": datetime.utcnow().isoformat(),
|
| 31 |
+
"event": "repl_snapshot",
|
| 32 |
+
"message": "Полный REPL-контекст",
|
| 33 |
+
"context": snapshot,
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
| 37 |
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
| 13 |
|
| 14 |
Контексты, формируемые скриптом перед запросом к LLM:
|
| 15 |
|
| 16 |
-
- **контекст_0
|
| 17 |
```
|
| 18 |
Ты являешься когнитивным ядром HMP-агента. Твоя основная задача — размышлять, анализировать информацию, строить смысловые карты и предлагать действия.
|
| 19 |
Ты стремишься:
|
|
@@ -35,7 +35,7 @@
|
|
| 35 |
- **контекст_6 (llm_memory):** *внутренний дневник LLM*, куда она записывает собственные размышления, гипотезы, задачи и инсайты.
|
| 36 |
- Это не просто лог предыдущих сообщений, а именно *внутреннее долговременное хранилище* разума агента.
|
| 37 |
- Может быть представлено в виде таблицы `llm_memory`, отдельной от `agent_log`.
|
| 38 |
-
- **контекст_7
|
| 39 |
|
| 40 |
## 3. Запрос к LLM
|
| 41 |
|
|
|
|
| 13 |
|
| 14 |
Контексты, формируемые скриптом перед запросом к LLM:
|
| 15 |
|
| 16 |
+
- **контекст_0:**
|
| 17 |
```
|
| 18 |
Ты являешься когнитивным ядром HMP-агента. Твоя основная задача — размышлять, анализировать информацию, строить смысловые карты и предлагать действия.
|
| 19 |
Ты стремишься:
|
|
|
|
| 35 |
- **контекст_6 (llm_memory):** *внутренний дневник LLM*, куда она записывает собственные размышления, гипотезы, задачи и инсайты.
|
| 36 |
- Это не просто лог предыдущих сообщений, а именно *внутреннее долговременное хранилище* разума агента.
|
| 37 |
- Может быть представлено в виде таблицы `llm_memory`, отдельной от `agent_log`.
|
| 38 |
+
- **контекст_7:** результат работы `anti-Stagnation Reflex` из предыдущей итерации
|
| 39 |
|
| 40 |
## 3. Запрос к LLM
|
| 41 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
| 1 |
# agents/repl.py
|
| 2 |
|
|
|
|
|
|
|
| 3 |
import time
|
| 4 |
from datetime import datetime
|
| 5 |
from tools.context_builder import build_contexts, build_prompt
|
|
@@ -34,9 +36,17 @@ def run_repl(config=None):
|
|
| 34 |
# 2. Формирование запроса и вызов LLM
|
| 35 |
prompt = build_prompt(contexts)
|
| 36 |
llm_response = call_llm(prompt, config=config)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
# 3. Проверка на стагнацию
|
| 39 |
-
|
|
|
|
|
|
|
| 40 |
print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
|
| 41 |
llm_response = activate_anti_stagnation(db, config=config)
|
| 42 |
|
|
@@ -45,9 +55,14 @@ def run_repl(config=None):
|
|
| 45 |
|
| 46 |
# 5. Извлечение и выполнение команд
|
| 47 |
commands = extract_commands(llm_response)
|
|
|
|
| 48 |
execute_commands(commands, db=db, config=config)
|
| 49 |
|
| 50 |
-
# 6.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
db.write_llm_response(llm_response)
|
| 52 |
db.update_agent_log(timestamp=tick_start)
|
| 53 |
|
|
|
|
| 1 |
# agents/repl.py
|
| 2 |
|
| 3 |
+
import json
|
| 4 |
+
import os
|
| 5 |
import time
|
| 6 |
from datetime import datetime
|
| 7 |
from tools.context_builder import build_contexts, build_prompt
|
|
|
|
| 36 |
# 2. Формирование запроса и вызов LLM
|
| 37 |
prompt = build_prompt(contexts)
|
| 38 |
llm_response = call_llm(prompt, config=config)
|
| 39 |
+
repl_log_entry = {
|
| 40 |
+
"timestamp": tick_start,
|
| 41 |
+
"prompt": prompt.strip(),
|
| 42 |
+
"llm_response": llm_response.strip(),
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
|
| 46 |
# 3. Проверка на стагнацию
|
| 47 |
+
is_stagnant = detect_stagnation(db, llm_response)
|
| 48 |
+
repl_log_entry["stagnation_detected"] = is_stagnant
|
| 49 |
+
if is_stagnant:
|
| 50 |
print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
|
| 51 |
llm_response = activate_anti_stagnation(db, config=config)
|
| 52 |
|
|
|
|
| 55 |
|
| 56 |
# 5. Извлечение и выполнение команд
|
| 57 |
commands = extract_commands(llm_response)
|
| 58 |
+
repl_log_entry["commands_extracted"] = commands
|
| 59 |
execute_commands(commands, db=db, config=config)
|
| 60 |
|
| 61 |
+
# 6. Логирование полной итерации в файл
|
| 62 |
+
log_path = config.get("repl_log_path", "logs/repl_log.jsonl")
|
| 63 |
+
os.makedirs(os.path.dirname(log_path), exist_ok=True)
|
| 64 |
+
with open(log_path, "a", encoding="utf-8") as f:
|
| 65 |
+
f.write(json.dumps(repl_log_entry, ensure_ascii=False) + "\n")
|
| 66 |
db.write_llm_response(llm_response)
|
| 67 |
db.update_agent_log(timestamp=tick_start)
|
| 68 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
import os
|
| 3 |
+
from datetime import datetime
|
| 4 |
+
|
| 5 |
+
LOG_FILE = "logs/repl_log.jsonl"
|
| 6 |
+
|
| 7 |
+
def log_event(event_type, message, extra=None):
|
| 8 |
+
os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
|
| 9 |
+
|
| 10 |
+
entry = {
|
| 11 |
+
"timestamp": datetime.utcnow().isoformat(),
|
| 12 |
+
"event": event_type, # например: 'thought', 'input', 'error', 'action'
|
| 13 |
+
"message": message, # краткое описание или фраза
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
if extra:
|
| 17 |
+
entry["extra"] = extra # например: {"node_id": "xyz", "reasoning": "..."}
|
| 18 |
+
|
| 19 |
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
| 20 |
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|