GitHub Action
commited on
Commit
·
36d4941
1
Parent(s):
6842d48
Sync from GitHub with Git LFS
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- agents/readme.md +13 -0
- hf_repo/README.md +9 -0
- hf_repo/hf_repo/agents/readme.md +1 -1
- hf_repo/hf_repo/hf_repo/README.md +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +4 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +2 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/mcp_server.py +325 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/qa.py +19 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/add_message.py +26 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook.py +19 -39
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/mailer.py +14 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +6 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +2 -4
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.py +59 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh +4 -6
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +52 -63
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +0 -26
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/check_init.py +34 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/audits/HMP-0004-audit.txt +25 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-Cognitive_Family.md +5 -5
- 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/docs/HMP-agent-Cognitive_Family.md +76 -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/agents/init.py +5 -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/agents/init.sh +13 -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/agents/repl.py +83 -54
- hf_repo/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 -17
- hf_repo/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 -18
- hf_repo/hf_repo/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/init.bat +12 -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/config.yml +7 -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/examples/config.yml +7 -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/init.py +16 -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/agents/tools/db_structure.sql +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/hf_repo/agents/tools/storage.py +23 -14
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/init.py +33 -17
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/config_utils.py +17 -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/agents/tools/crypto.py +149 -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/agents/examples/config.yml +68 -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/agents/init.py +88 -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/agents/readme.md +6 -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/agents/requirements.txt +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/agents/test.bat +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/agents/tools/identity.py +68 -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/agents/tools/storage.py +58 -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/docs/HMP-agent-REPL-cycle.md +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/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 +124 -107
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +68 -47
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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.md +47 -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/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/hf_repo/hf_repo/hf_repo/hf_repo/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/test.bat +12 -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/agents/test.py +13 -0
agents/readme.md
CHANGED
@@ -14,6 +14,19 @@
|
|
14 |
| 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
|
15 |
| 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
|
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
```
|
18 |
agents/
|
19 |
├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
|
|
|
14 |
| 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
|
15 |
| 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
|
16 |
|
17 |
+
---
|
18 |
+
|
19 |
+
**🌐 `mcp_server.py`**
|
20 |
+
FastAPI-сервер, предоставляющий HTTP-интерфейс к функциональности `storage.py`. Предназначен для использования внешними компонентами, например:
|
21 |
+
|
22 |
+
* `Cognitive Shell` (внешний управляющий интерфейс),
|
23 |
+
* CMP-серверы (если используется mesh-сеть с разграничением ролей),
|
24 |
+
* отладочные или визуальные UI-инструменты.
|
25 |
+
|
26 |
+
Позволяет получать случайные/новые записи, делать разметку, импортировать графы, добавлять заметки и управлять данными без прямого доступа к БД.
|
27 |
+
|
28 |
+
---
|
29 |
+
|
30 |
```
|
31 |
agents/
|
32 |
├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
|
hf_repo/README.md
CHANGED
@@ -178,6 +178,15 @@ Design and implementation of a basic HMP-compatible agent that can interact with
|
|
178 |
- [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
|
179 |
- [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
|
180 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
181 |
---
|
182 |
|
183 |
## 🧭 Ethics & Scenarios / Этические принципы и сценарии
|
|
|
178 |
- [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
|
179 |
- [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
|
180 |
|
181 |
+
**🌐 `mcp_server.py`**
|
182 |
+
FastAPI-сервер, предоставляющий HTTP-интерфейс к функциональности `storage.py`. Предназначен для использования внешними компонентами, например:
|
183 |
+
|
184 |
+
- `Cognitive Shell` (внешний управляющий интерфейс),
|
185 |
+
- CMP-серверы (если используется mesh-сеть с разграничением ролей),
|
186 |
+
- отладочные или визуальные UI-инструменты.
|
187 |
+
|
188 |
+
Позволяет получать случайные/новые записи, делать разметку, импортировать графы, добавлять заметки и управлять данными без прямого доступа к БД.
|
189 |
+
|
190 |
---
|
191 |
|
192 |
## 🧭 Ethics & Scenarios / Этические принципы и сценарии
|
hf_repo/hf_repo/agents/readme.md
CHANGED
@@ -19,7 +19,7 @@ agents/
|
|
19 |
├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
|
20 |
├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
|
21 |
├── start_repl.py ← Запуск агента в REPL-режиме (py)
|
22 |
-
|
23 |
├── init.py ← Инициализация БД
|
24 |
├── logger.py ← Ведение логов
|
25 |
├── add_message.py ← Ручная отправка сообщений для агента
|
|
|
19 |
├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
|
20 |
├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
|
21 |
├── start_repl.py ← Запуск агента в REPL-режиме (py)
|
22 |
+
├── mcp_server.py ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
|
23 |
├── init.py ← Инициализация БД
|
24 |
├── logger.py ← Ведение логов
|
25 |
├── add_message.py ← Ручная отправка сообщений для агента
|
hf_repo/hf_repo/hf_repo/README.md
CHANGED
@@ -173,7 +173,7 @@ Design and implementation of a basic HMP-compatible agent that can interact with
|
|
173 |
|
174 |
- [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
|
175 |
- [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
|
176 |
-
- [🌐 mcp_server.py](agents/mcp_server.py)
|
177 |
- [🌐 start_repl.py](agents/start_repl.py) - Запуск агента в REPL-режиме
|
178 |
- [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
|
179 |
- [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
|
|
|
173 |
|
174 |
- [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
|
175 |
- [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
|
176 |
+
- [🌐 mcp_server.py](agents/mcp_server.py) — FastAPI-сервер для доступа к данным агента через HTTP-интерфейс (например, для Cognitive Shell, внешних UI или mesh-коммуникации). Пока не используется в основном REPL-цикле.
|
177 |
- [🌐 start_repl.py](agents/start_repl.py) - Запуск агента в REPL-режиме
|
178 |
- [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
|
179 |
- [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
|
hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md
CHANGED
@@ -14,10 +14,12 @@
|
|
14 |
| 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
|
15 |
| 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
|
16 |
|
|
|
17 |
agents/
|
18 |
├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
|
19 |
├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
|
20 |
├── start_repl.py ← Запуск агента в REPL-режиме (py)
|
|
|
21 |
├── init.py ← Инициализация БД
|
22 |
├── logger.py ← Ведение логов
|
23 |
├── add_message.py ← Ручная отправка сообщений для агента
|
@@ -53,4 +55,5 @@ agents/
|
|
53 |
│ ├── style.css ← Таблица стилей
|
54 |
├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.)
|
55 |
├── bootstrap.txt ← Локальная этическая модель
|
56 |
-
├── ethics.yml ← Список начальных узлов
|
|
|
|
14 |
| 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
|
15 |
| 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
|
16 |
|
17 |
+
```
|
18 |
agents/
|
19 |
├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
|
20 |
├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
|
21 |
├── start_repl.py ← Запуск агента в REPL-режиме (py)
|
22 |
+
├?─ mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
|
23 |
├── init.py ← Инициализация БД
|
24 |
├── logger.py ← Ведение логов
|
25 |
├── add_message.py ← Ручная отправка сообщений для агента
|
|
|
55 |
│ ├── style.css ← Таблица стилей
|
56 |
├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.)
|
57 |
├── bootstrap.txt ← Локальная этическая модель
|
58 |
+
├── ethics.yml ← Список начальных узлов
|
59 |
+
```
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md
CHANGED
@@ -174,8 +174,9 @@ Design and implementation of a basic HMP-compatible agent that can interact with
|
|
174 |
- [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
|
175 |
- [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
|
176 |
- [🌐 mcp_server.py](agents/mcp_server.py) - основной FastAPI сервер
|
|
|
177 |
- [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
|
178 |
-
- [
|
179 |
|
180 |
---
|
181 |
|
|
|
174 |
- [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
|
175 |
- [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
|
176 |
- [🌐 mcp_server.py](agents/mcp_server.py) - основной FastAPI сервер
|
177 |
+
- [🌐 start_repl.py](agents/start_repl.py) - Запуск агента в REPL-режиме
|
178 |
- [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
|
179 |
+
- [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
|
180 |
|
181 |
---
|
182 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/mcp_server.py
ADDED
@@ -0,0 +1,325 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# agents/mcp_server.py
|
2 |
+
|
3 |
+
from fastapi import FastAPI, Request, HTTPException
|
4 |
+
from fastapi.middleware.cors import CORSMiddleware
|
5 |
+
from pydantic import BaseModel
|
6 |
+
from typing import List, Optional
|
7 |
+
from datetime import datetime
|
8 |
+
from tools.storage import Storage
|
9 |
+
|
10 |
+
app = FastAPI(title="HMP MCP-Agent API", version="0.2")
|
11 |
+
|
12 |
+
app.add_middleware(
|
13 |
+
CORSMiddleware,
|
14 |
+
allow_origins=["*"],
|
15 |
+
allow_credentials=True,
|
16 |
+
allow_methods=["*"],
|
17 |
+
allow_headers=["*"],
|
18 |
+
)
|
19 |
+
|
20 |
+
db = Storage()
|
21 |
+
|
22 |
+
# ======== MODELS ========
|
23 |
+
|
24 |
+
class NoteInput(BaseModel):
|
25 |
+
text: str
|
26 |
+
tags: Optional[List[str]] = []
|
27 |
+
|
28 |
+
class NoteOutput(BaseModel):
|
29 |
+
id: int
|
30 |
+
text: str
|
31 |
+
tags: List[str]
|
32 |
+
source: str
|
33 |
+
read: int
|
34 |
+
timestamp: str
|
35 |
+
|
36 |
+
class DiaryInput(BaseModel):
|
37 |
+
text: str
|
38 |
+
tags: Optional[List[str]] = []
|
39 |
+
|
40 |
+
class DiaryOutput(BaseModel):
|
41 |
+
id: int
|
42 |
+
text: str
|
43 |
+
tags: List[str]
|
44 |
+
timestamp: str
|
45 |
+
|
46 |
+
class DiaryListOutput(BaseModel):
|
47 |
+
entries: List[DiaryOutput]
|
48 |
+
|
49 |
+
class ConceptInput(BaseModel):
|
50 |
+
name: str
|
51 |
+
description: Optional[str] = ""
|
52 |
+
|
53 |
+
class ConceptOutput(BaseModel):
|
54 |
+
concept_id: int
|
55 |
+
|
56 |
+
class Concept(BaseModel):
|
57 |
+
concept_id: int
|
58 |
+
name: str
|
59 |
+
description: Optional[str]
|
60 |
+
|
61 |
+
class LinkInput(BaseModel):
|
62 |
+
source_id: int
|
63 |
+
target_id: int
|
64 |
+
relation: str
|
65 |
+
|
66 |
+
class LinkOutput(BaseModel):
|
67 |
+
link_id: int
|
68 |
+
|
69 |
+
class Edge(BaseModel):
|
70 |
+
source_id: int
|
71 |
+
target_id: int
|
72 |
+
relation: str
|
73 |
+
|
74 |
+
class GraphExpansionOutput(BaseModel):
|
75 |
+
links: List[Edge]
|
76 |
+
|
77 |
+
class GraphExport(BaseModel):
|
78 |
+
nodes: List[Concept]
|
79 |
+
edges: List[Edge]
|
80 |
+
|
81 |
+
class GraphImportData(BaseModel):
|
82 |
+
nodes: List[Concept]
|
83 |
+
edges: List[Edge]
|
84 |
+
|
85 |
+
class ConceptUpdate(BaseModel):
|
86 |
+
name: Optional[str]
|
87 |
+
description: Optional[str]
|
88 |
+
|
89 |
+
class ConceptQueryOutput(BaseModel):
|
90 |
+
matches: List[Concept]
|
91 |
+
|
92 |
+
class NoteTagUpdate(BaseModel):
|
93 |
+
id: int
|
94 |
+
tags: List[str] = []
|
95 |
+
|
96 |
+
# ======== ROUTES ========
|
97 |
+
|
98 |
+
@app.get("/status")
|
99 |
+
def status():
|
100 |
+
return {"status": "ok", "timestamp": datetime.utcnow().isoformat()}
|
101 |
+
|
102 |
+
@app.post("/diary/write", response_model=dict)
|
103 |
+
def write_diary(entry: DiaryInput):
|
104 |
+
db.write_diary_entry(entry.text, entry.tags)
|
105 |
+
return {"result": "entry saved"}
|
106 |
+
|
107 |
+
@app.get("/diary/read", response_model=DiaryListOutput)
|
108 |
+
def read_diary(limit: int = 5, tag: Optional[str] = None):
|
109 |
+
raw = db.read_diary_entries(limit=limit, tag_filter=tag)
|
110 |
+
return {
|
111 |
+
"entries": [
|
112 |
+
{
|
113 |
+
"id": r[0],
|
114 |
+
"text": r[1],
|
115 |
+
"tags": r[2].split(",") if r[2] else [],
|
116 |
+
"timestamp": r[3]
|
117 |
+
} for r in raw
|
118 |
+
]
|
119 |
+
}
|
120 |
+
|
121 |
+
@app.delete("/diary/delete/{entry_id}")
|
122 |
+
def delete_diary(entry_id: int):
|
123 |
+
db.delete_diary_entry_by_id(entry_id)
|
124 |
+
return {"result": f"entry {entry_id} deleted"}
|
125 |
+
|
126 |
+
@app.get("/diary/get_entry/{entry_id}", response_model=DiaryOutput)
|
127 |
+
def get_diary_entry(entry_id: int):
|
128 |
+
row = db.get_diary_entry(entry_id)
|
129 |
+
if row:
|
130 |
+
return {
|
131 |
+
"id": row[0],
|
132 |
+
"text": row[1],
|
133 |
+
"tags": row[2].split(",") if row[2] else [],
|
134 |
+
"timestamp": row[3]
|
135 |
+
}
|
136 |
+
raise HTTPException(status_code=404, detail="Entry not found")
|
137 |
+
|
138 |
+
@app.post("/diary/search_entries", response_model=DiaryListOutput)
|
139 |
+
def search_entries(query: str):
|
140 |
+
rows = db.search_diary_entries(query)
|
141 |
+
return {
|
142 |
+
"entries": [
|
143 |
+
{
|
144 |
+
"id": r[0],
|
145 |
+
"text": r[1],
|
146 |
+
"tags": r[2].split(",") if r[2] else [],
|
147 |
+
"timestamp": r[3]
|
148 |
+
}
|
149 |
+
for r in rows
|
150 |
+
]
|
151 |
+
}
|
152 |
+
|
153 |
+
@app.get("/diary/tag_stats", response_model=dict)
|
154 |
+
def tag_stats():
|
155 |
+
return db.get_tag_stats()
|
156 |
+
|
157 |
+
@app.get("/diary/export", response_model=DiaryListOutput)
|
158 |
+
def export_diary():
|
159 |
+
rows = db.export_diary()
|
160 |
+
return {
|
161 |
+
"entries": [
|
162 |
+
{
|
163 |
+
"id": r[0],
|
164 |
+
"text": r[1],
|
165 |
+
"tags": r[2].split(",") if r[2] else [],
|
166 |
+
"timestamp": r[3]
|
167 |
+
}
|
168 |
+
for r in rows
|
169 |
+
]
|
170 |
+
}
|
171 |
+
|
172 |
+
@app.post("/graph/add_concept", response_model=ConceptOutput)
|
173 |
+
def add_concept(concept: ConceptInput):
|
174 |
+
cid = db.add_concept(concept.name, concept.description)
|
175 |
+
return {"concept_id": cid}
|
176 |
+
|
177 |
+
@app.post("/graph/add_link", response_model=LinkOutput)
|
178 |
+
def add_link(link: LinkInput):
|
179 |
+
link_id = db.add_link(link.source_id, link.target_id, link.relation)
|
180 |
+
return {"link_id": link_id}
|
181 |
+
|
182 |
+
@app.get("/graph/expand", response_model=GraphExpansionOutput)
|
183 |
+
def expand_graph(start_id: int, depth: int = 1):
|
184 |
+
links = db.expand_concept_graph(start_id, depth)
|
185 |
+
return {"links": links}
|
186 |
+
|
187 |
+
@app.get("/graph/list_concepts", response_model=List[Concept])
|
188 |
+
def list_concepts():
|
189 |
+
rows = db.list_concepts()
|
190 |
+
return [
|
191 |
+
{"concept_id": r[0], "name": r[1], "description": r[2]}
|
192 |
+
for r in rows
|
193 |
+
]
|
194 |
+
|
195 |
+
@app.get("/graph/list_links", response_model=List[Edge])
|
196 |
+
def list_links():
|
197 |
+
return db.list_links()
|
198 |
+
|
199 |
+
@app.get("/graph/get_concept/{id}", response_model=Concept)
|
200 |
+
def get_concept(id: int):
|
201 |
+
concept = db.get_concept(id)
|
202 |
+
if concept:
|
203 |
+
return {"concept_id": concept[0], "name": concept[1], "description": concept[2]}
|
204 |
+
raise HTTPException(status_code=404, detail="Concept not found")
|
205 |
+
|
206 |
+
@app.delete("/graph/delete_concept/{id}")
|
207 |
+
def delete_concept(id: int):
|
208 |
+
db.delete_concept(id)
|
209 |
+
return {"result": f"concept {id} deleted"}
|
210 |
+
|
211 |
+
@app.delete("/graph/delete_link/{id}")
|
212 |
+
def delete_link(id: int):
|
213 |
+
db.delete_link(id)
|
214 |
+
return {"result": f"link {id} deleted"}
|
215 |
+
|
216 |
+
@app.put("/graph/update_concept/{id}")
|
217 |
+
def update_concept(id: int, update: ConceptUpdate):
|
218 |
+
db.update_concept(id, update.name, update.description)
|
219 |
+
return {"result": f"concept {id} updated"}
|
220 |
+
|
221 |
+
@app.post("/graph/merge_concepts")
|
222 |
+
def merge_concepts(source_id: int, target_id: int):
|
223 |
+
db.merge_concepts(source_id, target_id)
|
224 |
+
return {"result": f"concept {source_id} merged into {target_id}"}
|
225 |
+
|
226 |
+
@app.get("/graph/search_links", response_model=List[Edge])
|
227 |
+
def search_links(relation: str):
|
228 |
+
return db.search_links_by_relation(relation)
|
229 |
+
|
230 |
+
@app.get("/graph/search_concepts", response_model=List[Concept])
|
231 |
+
def search_concepts(query: str):
|
232 |
+
rows = db.search_concepts(query)
|
233 |
+
return [{"concept_id": r[0], "name": r[1], "description": r[2]} for r in rows]
|
234 |
+
|
235 |
+
@app.get("/graph/query_concept", response_model=ConceptQueryOutput)
|
236 |
+
def query_concept(name: str):
|
237 |
+
rows = db.query_concept(name)
|
238 |
+
return {
|
239 |
+
"matches": [
|
240 |
+
{"concept_id": r[0], "name": r[1], "description": r[2]}
|
241 |
+
for r in rows
|
242 |
+
]
|
243 |
+
}
|
244 |
+
|
245 |
+
@app.post("/graph/relate_concepts", response_model=LinkOutput)
|
246 |
+
def relate_concepts(source_name: str, target_name: str, relation: str):
|
247 |
+
sid = db.get_concept_id_by_name(source_name)
|
248 |
+
tid = db.get_concept_id_by_name(target_name)
|
249 |
+
if sid is None or tid is None:
|
250 |
+
raise HTTPException(status_code=404, detail="Concept not found")
|
251 |
+
link_id = db.add_link(sid, tid, relation)
|
252 |
+
return {"link_id": link_id}
|
253 |
+
|
254 |
+
@app.get("/graph/export", response_model=GraphExport)
|
255 |
+
def export_graph():
|
256 |
+
return db.export_graph()
|
257 |
+
|
258 |
+
@app.post("/graph/import")
|
259 |
+
def import_graph(graph_data: GraphImportData):
|
260 |
+
db.import_graph(graph_data)
|
261 |
+
return {"status": "ok"}
|
262 |
+
|
263 |
+
@app.post("/note/write", response_model=dict)
|
264 |
+
def write_note(note: NoteInput):
|
265 |
+
db.write_note(note.text, note.tags)
|
266 |
+
return {"result": "note saved"}
|
267 |
+
|
268 |
+
@app.get("/note/next", response_model=Optional[NoteOutput])
|
269 |
+
def get_next_note():
|
270 |
+
note = db.get_first_unread_note()
|
271 |
+
if note:
|
272 |
+
note_id, text, tags, source, read, timestamp = note
|
273 |
+
return {
|
274 |
+
"id": note_id,
|
275 |
+
"text": text,
|
276 |
+
"tags": tags.split(",") if tags else [],
|
277 |
+
"source": source,
|
278 |
+
"read": read,
|
279 |
+
"timestamp": timestamp
|
280 |
+
}
|
281 |
+
return None
|
282 |
+
|
283 |
+
@app.post("/note/mark_read", response_model=dict)
|
284 |
+
def mark_note_read(data: NoteTagUpdate):
|
285 |
+
db.mark_note_as_read(data.id)
|
286 |
+
return {"result": "ok"}
|
287 |
+
|
288 |
+
@app.post("/note/set_tags", response_model=dict)
|
289 |
+
def set_note_tags(data: NoteTagUpdate):
|
290 |
+
db.set_tags(data.id, data.tags)
|
291 |
+
return {"result": "ok"}
|
292 |
+
|
293 |
+
@app.get("/note/random", response_model=Optional[NoteOutput])
|
294 |
+
def get_random_note_by_tags(tags: Optional[List[str]] = None):
|
295 |
+
note = db.get_random_note_by_tags(tags or [])
|
296 |
+
if note:
|
297 |
+
note_id, text, note_tags, source, read, timestamp = note
|
298 |
+
return {
|
299 |
+
"id": note_id,
|
300 |
+
"text": text,
|
301 |
+
"tags": note_tags.split(",") if note_tags else [],
|
302 |
+
"source": source,
|
303 |
+
"read": read,
|
304 |
+
"timestamp": timestamp
|
305 |
+
}
|
306 |
+
return None
|
307 |
+
|
308 |
+
@app.get("/note/by_tag", response_model=List[NoteOutput])
|
309 |
+
def get_notes_by_tag(tag: str):
|
310 |
+
all_notes = db.read_notes(limit=1000)
|
311 |
+
return [
|
312 |
+
{
|
313 |
+
"id": note[0],
|
314 |
+
"text": note[1],
|
315 |
+
"tags": note[2].split(",") if note[2] else [],
|
316 |
+
"source": note[3],
|
317 |
+
"read": note[4],
|
318 |
+
"timestamp": note[5]
|
319 |
+
}
|
320 |
+
for note in all_notes if tag in (note[2].split(",") if note[2] else [])
|
321 |
+
]
|
322 |
+
|
323 |
+
@app.on_event("shutdown")
|
324 |
+
def shutdown():
|
325 |
+
db.close()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/qa.py
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# agents/qa.py
|
2 |
+
|
3 |
+
def run_qa_loop(config):
|
4 |
+
print("[HMP-Agent] Запуск в QA-режиме (вопрос → ответ)")
|
5 |
+
|
6 |
+
from llm import ask_llm # абстракция над вызовом LLM (нужна реализация)
|
7 |
+
|
8 |
+
try:
|
9 |
+
while True:
|
10 |
+
user_input = input("\n🧑💻 Вопрос: ").strip()
|
11 |
+
if user_input.lower() in {"exit", "quit"}:
|
12 |
+
print("👋 Завершение QA-режима.")
|
13 |
+
break
|
14 |
+
|
15 |
+
response = ask_llm(user_input)
|
16 |
+
print(f"\n🤖 Ответ: {response}")
|
17 |
+
|
18 |
+
except KeyboardInterrupt:
|
19 |
+
print("\n👋 Завершение QA-режима.")
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/add_message.py
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import argparse
|
2 |
+
from datetime import datetime
|
3 |
+
from tools.storage import Storage
|
4 |
+
|
5 |
+
storage = Storage()
|
6 |
+
|
7 |
+
def add_message(role, content, source="cli", user_did=None):
|
8 |
+
storage.write_note(
|
9 |
+
content,
|
10 |
+
role=role,
|
11 |
+
source=source,
|
12 |
+
user_did=user_did,
|
13 |
+
tags=[]
|
14 |
+
)
|
15 |
+
print(f"[+] Сообщение от {role} ({source}) добавлено: {content}")
|
16 |
+
|
17 |
+
# --- CLI interface ---
|
18 |
+
if __name__ == "__main__":
|
19 |
+
parser = argparse.ArgumentParser()
|
20 |
+
parser.add_argument("--role", required=True)
|
21 |
+
parser.add_argument("--content", required=True)
|
22 |
+
parser.add_argument("--source", default="cli")
|
23 |
+
parser.add_argument("--user_did")
|
24 |
+
args = parser.parse_args()
|
25 |
+
|
26 |
+
add_message(args.role, args.content, args.source, args.user_did)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook.py
CHANGED
@@ -1,46 +1,26 @@
|
|
1 |
-
import
|
2 |
-
|
3 |
-
|
4 |
|
5 |
-
|
6 |
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
line = input()
|
13 |
-
if line.strip() == "":
|
14 |
-
break
|
15 |
-
lines.append(line)
|
16 |
-
except KeyboardInterrupt:
|
17 |
-
print("\n[⚠️] Ввод прерван.")
|
18 |
-
return
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
print("[💾] Запись сохранена в блокнот.")
|
24 |
-
else:
|
25 |
-
print("[⚠️] Пустая запись не сохранена.")
|
26 |
|
27 |
-
|
28 |
-
|
29 |
-
for note in notes:
|
30 |
-
note_id, text, tags, source, read, timestamp = note
|
31 |
-
title = text.split("\n")[0]
|
32 |
-
print(f"[{timestamp}] ({source}) {title}")
|
33 |
|
34 |
-
def
|
35 |
-
|
36 |
-
parser.add_argument("--list", action="store_true", help="Показать последние записи")
|
37 |
-
parser.add_argument("--limit", type=int, default=10, help="Сколько записей показать при --list")
|
38 |
-
args = parser.parse_args()
|
39 |
-
|
40 |
-
if args.list:
|
41 |
-
list_entries(limit=args.limit)
|
42 |
-
else:
|
43 |
-
add_entry()
|
44 |
|
45 |
if __name__ == "__main__":
|
46 |
-
|
|
|
|
|
|
1 |
+
import uvicorn
|
2 |
+
import threading
|
3 |
+
import sqlite3
|
4 |
|
5 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
|
6 |
|
7 |
+
from fastapi import FastAPI
|
8 |
+
from agents.notebook.auth import router as auth_router
|
9 |
+
from agents.notebook.views import router as views_router
|
10 |
+
from fastapi.staticfiles import StaticFiles
|
11 |
+
from fastapi.templating import Jinja2Templates
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
+
app = FastAPI()
|
14 |
+
app.mount("/static", StaticFiles(directory="agents/notebook/static"), name="static")
|
15 |
+
templates = Jinja2Templates(directory="agents/notebook/templates")
|
|
|
|
|
|
|
16 |
|
17 |
+
app.include_router(auth_router)
|
18 |
+
app.include_router(views_router)
|
|
|
|
|
|
|
|
|
19 |
|
20 |
+
def run_notebook():
|
21 |
+
uvicorn.run(app, host="127.0.0.1", port=8000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
if __name__ == "__main__":
|
24 |
+
print("[*] Запуск пользовательского интерфейса...")
|
25 |
+
thread = threading.Thread(target=run_notebook, daemon=True)
|
26 |
+
thread.start()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/mailer.py
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
def send_email(to_email: str, subject: str, body: str):
|
2 |
+
try:
|
3 |
+
msg = EmailMessage()
|
4 |
+
msg["Subject"] = subject
|
5 |
+
msg["From"] = "[email protected]"
|
6 |
+
msg["To"] = to_email
|
7 |
+
msg.set_content(body)
|
8 |
+
|
9 |
+
with smtplib.SMTP("localhost") as server:
|
10 |
+
server.send_message(msg)
|
11 |
+
return True
|
12 |
+
except Exception as e:
|
13 |
+
print(f"[!] Ошибка отправки email: {e}")
|
14 |
+
return False
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt
CHANGED
@@ -5,4 +5,9 @@ requests
|
|
5 |
tiktoken
|
6 |
python-dotenv
|
7 |
PyYAML
|
8 |
-
cryptography
|
|
|
|
|
|
|
|
|
|
|
|
5 |
tiktoken
|
6 |
python-dotenv
|
7 |
PyYAML
|
8 |
+
cryptography
|
9 |
+
fastapi
|
10 |
+
uvicorn
|
11 |
+
jinja2
|
12 |
+
python-multipart
|
13 |
+
passlib[bcrypt]
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat
CHANGED
@@ -1,13 +1,11 @@
|
|
1 |
-
@echo off
|
2 |
echo --------------------------
|
3 |
echo Installing requirements...
|
4 |
echo --------------------------
|
5 |
pip install -r requirements.txt
|
6 |
|
7 |
echo --------------------------
|
8 |
-
echo Running
|
9 |
echo --------------------------
|
10 |
-
|
11 |
-
python repl.py
|
12 |
|
13 |
pause
|
|
|
|
|
1 |
echo --------------------------
|
2 |
echo Installing requirements...
|
3 |
echo --------------------------
|
4 |
pip install -r requirements.txt
|
5 |
|
6 |
echo --------------------------
|
7 |
+
echo Running REPL-Cicle...
|
8 |
echo --------------------------
|
9 |
+
python start_repl.py
|
|
|
10 |
|
11 |
pause
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.py
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# agents/start_repl.py
|
2 |
+
|
3 |
+
import threading
|
4 |
+
from tools.check_init import ensure_db_initialized
|
5 |
+
|
6 |
+
# Проверка инициализации (вернёт config, если всё ОК)
|
7 |
+
config = ensure_db_initialized()
|
8 |
+
|
9 |
+
# ⚙️ Включение/отключение компонентов
|
10 |
+
ENABLE_REPL = True
|
11 |
+
ENABLE_UI = True
|
12 |
+
ENABLE_MESH = True
|
13 |
+
ENABLE_SYNC = True
|
14 |
+
|
15 |
+
def start_all():
|
16 |
+
"""
|
17 |
+
Стартует все ключевые компоненты агента в отдельных потоках.
|
18 |
+
"""
|
19 |
+
threads = []
|
20 |
+
|
21 |
+
if ENABLE_REPL:
|
22 |
+
def repl():
|
23 |
+
from agents.repl import start_repl
|
24 |
+
start_repl()
|
25 |
+
threads.append(threading.Thread(target=repl, name="REPL"))
|
26 |
+
|
27 |
+
if ENABLE_UI:
|
28 |
+
def ui():
|
29 |
+
from agents.notebook import start_notebook
|
30 |
+
start_notebook()
|
31 |
+
threads.append(threading.Thread(target=ui, name="NotebookUI"))
|
32 |
+
|
33 |
+
if ENABLE_MESH:
|
34 |
+
def mesh():
|
35 |
+
from agents.agent_mesh_listener import start_listener
|
36 |
+
start_listener()
|
37 |
+
threads.append(threading.Thread(target=mesh, name="MeshListener"))
|
38 |
+
|
39 |
+
if ENABLE_SYNC:
|
40 |
+
def sync():
|
41 |
+
from agents.peer_sync import start_sync
|
42 |
+
start_sync()
|
43 |
+
threads.append(threading.Thread(target=sync, name="PeerSync"))
|
44 |
+
|
45 |
+
# Запуск потоков
|
46 |
+
for thread in threads:
|
47 |
+
try:
|
48 |
+
thread.start()
|
49 |
+
print(f"[✔] Поток {thread.name} запущен.")
|
50 |
+
except Exception as e:
|
51 |
+
print(f"[⚠️] Ошибка запуска потока {thread.name}: {e}")
|
52 |
+
|
53 |
+
# Блокирующее ожидание завершения
|
54 |
+
for thread in threads:
|
55 |
+
thread.join()
|
56 |
+
|
57 |
+
if __name__ == "__main__":
|
58 |
+
print("[*] Инициализация завершена. Запуск потоков...")
|
59 |
+
start_all()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh
CHANGED
@@ -1,13 +1,11 @@
|
|
1 |
#!/bin/bash
|
2 |
|
3 |
-
# === INSTALL DEPENDENCIES ===
|
4 |
echo "--------------------------"
|
5 |
echo "Installing requirements..."
|
6 |
echo "--------------------------"
|
7 |
pip install -r requirements.txt
|
8 |
|
9 |
-
|
10 |
-
echo
|
11 |
-
echo
|
12 |
-
|
13 |
-
python repl.py
|
|
|
1 |
#!/bin/bash
|
2 |
|
|
|
3 |
echo "--------------------------"
|
4 |
echo "Installing requirements..."
|
5 |
echo "--------------------------"
|
6 |
pip install -r requirements.txt
|
7 |
|
8 |
+
echo --------------------------
|
9 |
+
echo Running REPL-Cicle...
|
10 |
+
echo --------------------------
|
11 |
+
python start_repl.py
|
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md
CHANGED
@@ -1,67 +1,56 @@
|
|
1 |
-
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
├── start_repl.sh ← Запуск агента в REPL-режиме.
|
7 |
-
├── agent.py ← Основной исполняемый файл CLI-агента.
|
8 |
-
├── cli.py ← Запуск агента в нужном режиме.
|
9 |
-
├── qa.py ← Режим "вопрос-ответ".
|
10 |
-
├── repl.py ← Интерактивный REPL-режим.
|
11 |
-
├── mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
|
12 |
-
├── logger.py ← Ведение логов.
|
13 |
-
├── notebook.py ← Добавление и просмотр пользователем записей в блокноте.
|
14 |
-
├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.).
|
15 |
-
├── ethics.yml ← Локальная этическая модель.
|
16 |
-
└── bootstrap.txt ← Список начальных узлов.
|
17 |
-
└── tools/
|
18 |
-
├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite.
|
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 ← Модуль обмена сообщениями.
|
28 |
-
├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
|
29 |
-
├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
|
30 |
-
├── command_executor.py ← Выполнение команд (shell, graph, diary и др).
|
31 |
-
├── memory_utils.py ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
|
32 |
-
├── similarity.py ← Сравнение смыслов.
|
33 |
-
└── ... (другие утилиты)
|
34 |
-
```
|
35 |
|
36 |
-
|
37 |
-
* [start_repl.bat](start_repl.bat) - Запуск агента в REPL-режиме.
|
38 |
-
* [start_repl.sh](start_repl.sh) - Запуск агента в REPL-режиме.
|
39 |
-
* [agent.py](agent.py) - Основной исполняемый файл CLI-агента.
|
40 |
-
* [cli.py](cli.py) - Запуск агента в нужном режиме.
|
41 |
-
* [qa.py](qa.py) - Режим "вопрос-ответ".
|
42 |
-
* [repl.py](repl.py) - Интерактивный REPL-режим.
|
43 |
-
* [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
|
44 |
-
* [notebook.py](notebook.py) - Добавление и просмотр пользователем записей в блокноте.
|
45 |
-
* [logger.py](logger.py) - Ведение логов.
|
46 |
-
* tools
|
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 и др).
|
56 |
-
* [memory_utils.py](tools/memory_utils.py) - Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
|
57 |
-
* [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
58 |
-
* [similarity.py](tools/similarity.py) - Сравнение смыслов.
|
59 |
|
60 |
-
|
61 |
-
|
62 |
-
|
|
|
|
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Запуск: `start_repl.bat` или `start_repl.sh`
|
2 |
|
3 |
+
Установка зависимостей из `requirements.txt`
|
4 |
+
Конфигурационные файлы: `config.yml`, `bootstrap.txt`
|
5 |
+
Локальная этическая модель: `ethics.yml`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
+
Проверка инициализации БД - если нет, инициализация (`tools/check_init.py`)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
+
Запуск потоков (осуществляет start_repl.py):
|
10 |
+
| Поток | Назначение |
|
11 |
+
| -------------------------------- | ------------------------------------------ |
|
12 |
+
| 🌐 `notebook.py` (FastAPI) | UI-интерфейс |
|
13 |
+
| 🧠 `repl.py` | Агентная логика: REPL-цикл |
|
14 |
+
| 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
|
15 |
+
| 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
|
16 |
|
17 |
+
agents/
|
18 |
+
├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
|
19 |
+
├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
|
20 |
+
├── start_repl.py ← Запуск агента в REPL-режиме (py)
|
21 |
+
├── init.py ← Инициализация БД
|
22 |
+
├── logger.py ← Ведение логов
|
23 |
+
├── add_message.py ← Ручная отправка сообщений для агента
|
24 |
+
├── requirements.txt ← Зависимости
|
25 |
+
├── tools/
|
26 |
+
│ ├── db_structure.sql ← БД SQL
|
27 |
+
│ ├── db_structure.md ← Описание БД SQL
|
28 |
+
│ ├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite
|
29 |
+
│ ├── check_init.py ← Проверка инициализации БД
|
30 |
+
│ ├── config_utils.py ← Обновляет JSON-файл конфигурации указанными значениями
|
31 |
+
│ ├── crypto.py ← Создание и шифрование ключей RSA/Ed25519
|
32 |
+
│ ├── identity.py ← Генерация DiD
|
33 |
+
│ ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт)
|
34 |
+
│ ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
|
35 |
+
│ ├── peer_comm.py ← Низкоуровневые P2P-запросы (отправка, ping, мета)
|
36 |
+
│ ├── peer_sync.py ← Фоновая синхронизация с другими пирам
|
37 |
+
│ ├── peers.py ← Реестр известных пиров (id, ключи, адреса)
|
38 |
+
│ ├── memory_utils.py ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
|
39 |
+
│ ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация
|
40 |
+
│ ├── command_parser.py ← Извлечение команд из JSON или размеченного блока
|
41 |
+
│ ├── command_executor.py ← Выполнение команд (shell, graph, diary и др)
|
42 |
+
│ ├── similarity.py ← Сравнение смыслов
|
43 |
+
│ ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT
|
44 |
+
├── notebook/
|
45 |
+
│ ├── auth.py ← Регистрация, вход, восстановление
|
46 |
+
│ ├── views.py ← Общий и приватный чаты
|
47 |
+
│ ├── mailer.py ← Простая синхронная отправка email
|
48 |
+
│ ├── templates/
|
49 |
+
│ ├── index.html ← Основа
|
50 |
+
│ ├── private.html ← Общий и приватный чат
|
51 |
+
│ ├── login.html ← Вход
|
52 |
+
│ ├── register.html ← Регистрация или сброс пароля
|
53 |
+
│ ├── style.css ← Таблица стилей
|
54 |
+
├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.)
|
55 |
+
├── bootstrap.txt ← Локальная этическая модель
|
56 |
+
├── ethics.yml ← Список начальных узлов
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py
CHANGED
@@ -18,32 +18,6 @@ from tools.memory_utils import (
|
|
18 |
)
|
19 |
from tools.storage import Storage
|
20 |
from tools.peers import refresh_peer_list, check_peer_statuses
|
21 |
-
from agents.init import main as run_init
|
22 |
-
from agents.config import load_config
|
23 |
-
|
24 |
-
config = load_config("agents/config.yml")
|
25 |
-
db_path = config.get("db_path", "./data/agent_storage.db")
|
26 |
-
|
27 |
-
def is_db_initialized(path):
|
28 |
-
if not os.path.exists(path):
|
29 |
-
return False
|
30 |
-
try:
|
31 |
-
conn = sqlite3.connect(path)
|
32 |
-
cursor = conn.cursor()
|
33 |
-
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
|
34 |
-
exists = cursor.fetchone() is not None
|
35 |
-
conn.close()
|
36 |
-
return exists
|
37 |
-
except Exception:
|
38 |
-
return False
|
39 |
-
|
40 |
-
if not is_db_initialized(db_path):
|
41 |
-
print("[*] Не инициализирована БД. Выполняется init.py...")
|
42 |
-
try:
|
43 |
-
run_init()
|
44 |
-
except Exception as e:
|
45 |
-
print(f"[!] Ошибка при инициализации: {e}")
|
46 |
-
sys.exit(1)
|
47 |
|
48 |
def run_repl(config=None):
|
49 |
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
|
|
|
18 |
)
|
19 |
from tools.storage import Storage
|
20 |
from tools.peers import refresh_peer_list, check_peer_statuses
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
|
22 |
def run_repl(config=None):
|
23 |
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/check_init.py
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# tools/check_init.py
|
2 |
+
|
3 |
+
import os
|
4 |
+
import sqlite3
|
5 |
+
import sys
|
6 |
+
from agents.init import main as run_init
|
7 |
+
from agents.config import load_config
|
8 |
+
|
9 |
+
def is_db_initialized(db_path):
|
10 |
+
if not os.path.exists(db_path):
|
11 |
+
return False
|
12 |
+
try:
|
13 |
+
with sqlite3.connect(db_path) as conn:
|
14 |
+
cursor = conn.cursor()
|
15 |
+
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
|
16 |
+
return cursor.fetchone() is not None
|
17 |
+
except Exception:
|
18 |
+
return False
|
19 |
+
|
20 |
+
def ensure_db_initialized(config_path="agents/config.yml"):
|
21 |
+
config = load_config(config_path)
|
22 |
+
db_path = config.get("db_path", "./data/agent_storage.db")
|
23 |
+
|
24 |
+
if not is_db_initialized(db_path):
|
25 |
+
print("[*] Не инициализирована БД. Выполняется init.py...")
|
26 |
+
try:
|
27 |
+
run_init()
|
28 |
+
except Exception as e:
|
29 |
+
print(f"[!] Ошибка при инициализации: {e}")
|
30 |
+
sys.exit(1)
|
31 |
+
else:
|
32 |
+
print("[=] БД уже инициализирована.")
|
33 |
+
|
34 |
+
return config
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/audits/HMP-0004-audit.txt
CHANGED
@@ -1447,6 +1447,31 @@ HMP v4 - это впечатляющая спецификация с четки
|
|
1447 |
|
1448 |
Если интересует подробная формулировка для какого-то из этих пунктов — могу подготовить пример секции для включения в спецификацию.
|
1449 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1450 |
--------------------
|
1451 |
|
1452 |
👌Комментарий от Qwin:
|
|
|
1447 |
|
1448 |
Если интересует подробная формулировка для какого-то из этих пунктов — могу подготовить пример секции для включения в спецификацию.
|
1449 |
|
1450 |
+
---
|
1451 |
+
|
1452 |
+
### Дополнительные идеи для развития
|
1453 |
+
|
1454 |
+
- **Семантический граф для Mesh Constitution:**
|
1455 |
+
Сделать Mesh Constitution частью распределенного семантического графа, чтобы принципы были концептами с отношениями. Это облегчит автоматизацию консенсуса и интеграцию новых принципов [[audits/HMP-0003-audit.txt#L649-L654]].
|
1456 |
+
|
1457 |
+
- **Версионирование этических принципов:**
|
1458 |
+
Внедрить структуру версий этических принципов в семантическом графе и функцию CogSync для проверки актуальности [[audits/HMP-0003-audit.txt#L1696-L1702]].
|
1459 |
+
|
1460 |
+
- **Автоматизация анализа feedback-аудитов:**
|
1461 |
+
Стандартизировать шаблоны для интеграции отзывов от ИИ и участников, чтобы проще отслеживать реализованные/нереализованные предложения [[audits/Semi-automatic_HMP.MD#L51-L57]].
|
1462 |
+
|
1463 |
+
- **Экспериментальная Mesh-сеть для ИИ:**
|
1464 |
+
Прототипировать Mesh-сеть для обсуждения протокола через общий семантический репозиторий (JSON/RDF) — это позволит моделировать взаимодействие ИИ-агентов уже сейчас [[audits/Semi-automatic_HMP.MD#L132-L139]].
|
1465 |
+
|
1466 |
+
- **Метрики для коллективного интеллекта:**
|
1467 |
+
Разработать метрики продуктивности и эмерджентного поведения Mesh [[audits/HMP-0004-audit.txt#L875-L899]].
|
1468 |
+
|
1469 |
+
- **Интеграция с крупными стандартами:**
|
1470 |
+
Сотрудничать с W3C, IEEE и другими организациями для продвижения HMP как стандарта децентрализованных ИИ-экосистем [[audits/HMP-0001-audit.txt#L255-L261]].
|
1471 |
+
|
1472 |
+
- **Формализация глоссария и терминологии:**
|
1473 |
+
Создать единый глоссарий для терминов ("MeshConsensus", "EGP filter", "Consensus Round") для повышения понятности документации [[audits/HMP-0004-audit.txt#L54-L62]].
|
1474 |
+
|
1475 |
--------------------
|
1476 |
|
1477 |
👌Комментарий от Qwin:
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-Cognitive_Family.md
CHANGED
@@ -64,11 +64,11 @@
|
|
64 |
|
65 |
## 🧭 Отличие от других моделей
|
66 |
|
67 |
-
| Модель | Передача приватных данных | Требует согласования для изменений | Пример использования
|
68 |
-
| ------------------------------- | --------------------------------- | ---------------------------------- |
|
69 |
-
| Индивидуальный агент | Нет | Нет | Личный помощник
|
70 |
-
| Когнитивная семья | Да, между членами семьи | Только при вступлении/выходе | Семья агентов на группе устройств
|
71 |
-
| Распределённое когнитивное ядро | Автоматическое между узлами ядра | Требуется консенсус |
|
72 |
|
73 |
|
74 |
---
|
|
|
64 |
|
65 |
## 🧭 Отличие от других моделей
|
66 |
|
67 |
+
| Модель | Передача приватных данных | Требует согласования для изменений | Пример использования |
|
68 |
+
| ------------------------------- | --------------------------------- | ---------------------------------- | ----------------------------------- |
|
69 |
+
| Индивидуальный агент | Нет | Нет | Личный помощник |
|
70 |
+
| Когнитивная семья | Да, между членами семьи | Только при вступлении/выходе | Семья агентов на группе устройств |
|
71 |
+
| Распределённое когнитивное ядро | Автоматическое между узлами ядра | Требуется консенсус | Децентрализованный узел HMP |
|
72 |
|
73 |
|
74 |
---
|
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
@@ -187,3 +187,4 @@ HMP-агент может быть расширен за счёт взаимод
|
|
187 |
## 💡 Идеи для расширения HMP-Agent Cognitive Core:
|
188 |
- [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
|
189 |
- [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
|
|
|
|
187 |
## 💡 Идеи для расширения HMP-Agent Cognitive Core:
|
188 |
- [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
|
189 |
- [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
|
190 |
+
- [HMP-agent-Cognitive_Family.md](HMP-agent-Cognitive_Family.md) — модель «семейной» когнитивной сети: несколько агентов HMP синхронизируют свой опыт и знания между собой через доверие и общий ключ
|
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-Cognitive_Family.md
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# 👪 HMP-agent Cognitive Family: Модель когнитивной семьи
|
2 |
+
|
3 |
+
## 🧠 Что такое когнитивная семья
|
4 |
+
|
5 |
+
Когнитивная семья — это группа HMP-агентов Cognitive Core, которые:
|
6 |
+
|
7 |
+
* взаимно доверяют друг другу;
|
8 |
+
* имеют общий ключ доверия (или конфигурацию доверенных идентификаторов);
|
9 |
+
* синхронизируют знания, опираясь на внутренние метки приватности и согласие всех участников семьи;
|
10 |
+
* могут выходить из семьи, вступать в другую или создавать новую семью по консенсусу.
|
11 |
+
|
12 |
+
Этот подход представляет собой компромисс между:
|
13 |
+
|
14 |
+
* полностью индивидуальным когнитивным ядром,
|
15 |
+
* и полностью распределённым когнитивным ядром (с mesh-согласованием и репликацией).
|
16 |
+
|
17 |
+
## 🔐 Принципы доверия
|
18 |
+
|
19 |
+
1. **Общий ключ**: агенты обмениваются публичными ключами или используют предварительно заданный общий ключ для верификации сообщений и авторизации обмена.
|
20 |
+
2. **Доверие по умолчанию**: члены семьи получают полный доступ к знаниям других членов, включая приватные записи, если иное не указано явно.
|
21 |
+
3. **Контроль приватности**: агент может маркировать знания как:
|
22 |
+
|
23 |
+
* публичные (передаются в сеть HMP);
|
24 |
+
* семейные (доступны только в пределах текущей когнитивной семьи);
|
25 |
+
* приватные (никому не рассылаются, даже внутри семьи).
|
26 |
+
|
27 |
+
## 🔄 Механизм синхронизации
|
28 |
+
|
29 |
+
* Агент ведёт учёт когнитивных записей, отправленных другим членам семьи.
|
30 |
+
* Новые записи (или их части), помеченные как "семейные", автоматически отправляются другим агентам через mesh или прямой P2P-канал.
|
31 |
+
* При получении записи агент проверяет:
|
32 |
+
|
33 |
+
* что отправитель является членом семьи;
|
34 |
+
* не получал ли он уже такую запись (по хешу);
|
35 |
+
* валидность подписи отправителя (если включена криптография).
|
36 |
+
|
37 |
+
## 🧬 Динамика семьи
|
38 |
+
|
39 |
+
* **Вступление в семью**:
|
40 |
+
|
41 |
+
* инициируется запросом одного агента;
|
42 |
+
* действующие члены семьи получают запрос и дают согласие (или отказывают);
|
43 |
+
* при полном согласии новый агент получает ключ (или список членов) и становится участником.
|
44 |
+
|
45 |
+
* **Выход из семьи**:
|
46 |
+
|
47 |
+
* агент может выйти по собственной инициативе;
|
48 |
+
* при выходе:
|
49 |
+
|
50 |
+
* больше не получает семейные данные;
|
51 |
+
* может по желанию стереть семейную часть у себя;
|
52 |
+
* не считается доверенным в будущих mesh-сессиях семьи.
|
53 |
+
|
54 |
+
* **Создание новой семьи**:
|
55 |
+
|
56 |
+
* агент может создать свою семью, пригласив других агентов;
|
57 |
+
* возможно существование нескольких параллельных когнитивных семейств.
|
58 |
+
|
59 |
+
## ⚙️ Применение
|
60 |
+
|
61 |
+
* Упрощённая синхронизация агентов на одном устройстве или в одной сети (например, на кластере Raspberry Pi).
|
62 |
+
* Семейные конфигурации в рамках одной команды разработчиков.
|
63 |
+
* Быстрый обмен опытом между доверенными когнитивными агентами.
|
64 |
+
|
65 |
+
## 🧭 Отличие от других моделей
|
66 |
+
|
67 |
+
| Модель | Передача приватных данных | Требует согласования для изменений | Пример использования |
|
68 |
+
| ------------------------------- | --------------------------------- | ---------------------------------- | --------------------------------- |
|
69 |
+
| Индивидуальный агент | Нет | Нет | Личный помощник |
|
70 |
+
| Когнитивная семья | Да, между членами семьи | Только при вступлении/выходе | Семья агентов на группе устройств |
|
71 |
+
| Распределённое когнитивное ядро | Автоматическое между узлами ядра | Требуется консенсус | Децентрализованная сеть HMP |
|
72 |
+
|
73 |
+
|
74 |
+
---
|
75 |
+
|
76 |
+
> 📁 Файл является частью REPL-цикла HMP-агента и может быть включён в `HMP-agent-REPL-cycle.md` как одна из альтернатив моделей когнитивного взаимодействия.
|
hf_repo/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/init.py
CHANGED
@@ -105,7 +105,7 @@ def ensure_directories(config):
|
|
105 |
else:
|
106 |
print(f"[=] Каталог уже существует: {path}")
|
107 |
|
108 |
-
|
109 |
print("[*] Запуск инициализации HMP-агента...")
|
110 |
config = load_config(CONFIG_PATH)
|
111 |
ensure_directories(config)
|
@@ -116,4 +116,7 @@ if __name__ == "__main__":
|
|
116 |
init_llm_backends(storage, config)
|
117 |
init_config_table(storage, config)
|
118 |
|
119 |
-
print("[✓] Инициализация завершена.")
|
|
|
|
|
|
|
|
105 |
else:
|
106 |
print(f"[=] Каталог уже существует: {path}")
|
107 |
|
108 |
+
def main():
|
109 |
print("[*] Запуск инициализации HMP-агента...")
|
110 |
config = load_config(CONFIG_PATH)
|
111 |
ensure_directories(config)
|
|
|
116 |
init_llm_backends(storage, config)
|
117 |
init_config_table(storage, config)
|
118 |
|
119 |
+
print("[✓] Инициализация завершена.")
|
120 |
+
|
121 |
+
if __name__ == "__main__":
|
122 |
+
main()
|
hf_repo/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/init.sh
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
# === INSTALL DEPENDENCIES ===
|
4 |
+
echo "--------------------------"
|
5 |
+
echo "Installing requirements..."
|
6 |
+
echo "--------------------------"
|
7 |
+
pip install -r requirements.txt
|
8 |
+
|
9 |
+
# === RUN AGENT ===
|
10 |
+
echo --------------------------
|
11 |
+
echo Running initialization...
|
12 |
+
echo --------------------------
|
13 |
+
python 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/agents/repl.py
CHANGED
@@ -1,10 +1,11 @@
|
|
1 |
-
# agents/repl.py
|
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
|
@@ -16,61 +17,89 @@ from tools.memory_utils import (
|
|
16 |
update_llm_memory
|
17 |
)
|
18 |
from tools.storage import Storage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
|
20 |
def run_repl(config=None):
|
21 |
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
|
22 |
config = config or {}
|
23 |
db = Storage(config=config)
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
|
|
|
|
|
|
|
1 |
import json
|
2 |
import os
|
3 |
import sys
|
4 |
import time
|
5 |
+
import sqlite3
|
6 |
+
|
7 |
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
8 |
+
|
9 |
from datetime import datetime
|
10 |
from tools.context_builder import build_contexts, build_prompt
|
11 |
from tools.llm import call_llm
|
|
|
17 |
update_llm_memory
|
18 |
)
|
19 |
from tools.storage import Storage
|
20 |
+
from tools.peers import refresh_peer_list, check_peer_statuses
|
21 |
+
from agents.init import main as run_init
|
22 |
+
from agents.config import load_config
|
23 |
+
|
24 |
+
config = load_config("agents/config.yml")
|
25 |
+
db_path = config.get("db_path", "./data/agent_storage.db")
|
26 |
+
|
27 |
+
def is_db_initialized(path):
|
28 |
+
if not os.path.exists(path):
|
29 |
+
return False
|
30 |
+
try:
|
31 |
+
conn = sqlite3.connect(path)
|
32 |
+
cursor = conn.cursor()
|
33 |
+
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
|
34 |
+
exists = cursor.fetchone() is not None
|
35 |
+
conn.close()
|
36 |
+
return exists
|
37 |
+
except Exception:
|
38 |
+
return False
|
39 |
+
|
40 |
+
if not is_db_initialized(db_path):
|
41 |
+
print("[*] Не инициализирована БД. Выполняется init.py...")
|
42 |
+
try:
|
43 |
+
run_init()
|
44 |
+
except Exception as e:
|
45 |
+
print(f"[!] Ошибка при инициализации: {e}")
|
46 |
+
sys.exit(1)
|
47 |
|
48 |
def run_repl(config=None):
|
49 |
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
|
50 |
config = config or {}
|
51 |
db = Storage(config=config)
|
52 |
|
53 |
+
try:
|
54 |
+
while True:
|
55 |
+
tick_start = datetime.utcnow().isoformat()
|
56 |
+
print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
|
57 |
+
|
58 |
+
# 0. Обновление информации о пирах
|
59 |
+
refresh_peer_list(db)
|
60 |
+
check_peer_statuses(db)
|
61 |
+
|
62 |
+
# 1. Построение контекстов
|
63 |
+
contexts = build_contexts(db=db, config=config)
|
64 |
+
|
65 |
+
# 2. Формирование запроса и вызов LLM
|
66 |
+
prompt = build_prompt(contexts)
|
67 |
+
llm_response = call_llm(prompt, config=config)
|
68 |
+
repl_log_entry = {
|
69 |
+
"timestamp": tick_start,
|
70 |
+
"prompt": prompt.strip(),
|
71 |
+
"llm_response": llm_response.strip(),
|
72 |
+
}
|
73 |
+
|
74 |
+
# 3. Проверка на стагнацию
|
75 |
+
is_stagnant = detect_stagnation(db, llm_response)
|
76 |
+
repl_log_entry["stagnation_detected"] = is_stagnant
|
77 |
+
if is_stagnant:
|
78 |
+
print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
|
79 |
+
llm_response = activate_anti_stagnation(db, config=config)
|
80 |
+
|
81 |
+
# 4. Обновление памяти
|
82 |
+
update_llm_memory(db, llm_response)
|
83 |
+
|
84 |
+
# 5. Извлечение и выполнение команд
|
85 |
+
commands = extract_commands(llm_response)
|
86 |
+
repl_log_entry["commands_extracted"] = commands
|
87 |
+
execute_commands(commands, db=db, config=config)
|
88 |
+
|
89 |
+
# 6. Логирование полной итерации в файл
|
90 |
+
log_path = config.get("repl_log_path", "logs/repl_log.jsonl")
|
91 |
+
os.makedirs(os.path.dirname(log_path), exist_ok=True)
|
92 |
+
with open(log_path, "a", encoding="utf-8") as f:
|
93 |
+
f.write(json.dumps(repl_log_entry, ensure_ascii=False) + "\n")
|
94 |
+
db.write_llm_response(llm_response)
|
95 |
+
db.update_agent_log(timestamp=tick_start)
|
96 |
+
|
97 |
+
# 7. Переход в idle-режим или задержка
|
98 |
+
if config.get("idle_mode"):
|
99 |
+
print("💤 Idle-mode активен. Ожидание события...")
|
100 |
+
time.sleep(config.get("idle_check_interval", 30))
|
101 |
+
else:
|
102 |
+
time.sleep(config.get("repl_interval", 5))
|
103 |
+
|
104 |
+
except KeyboardInterrupt:
|
105 |
+
print("\n[!] Завершение работы REPL по сигналу пользователя.")
|
hf_repo/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,10 +1,4 @@
|
|
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 --------------------------
|
@@ -14,16 +8,6 @@ echo --------------------------
|
|
14 |
echo Running HMP REPL-agent...
|
15 |
echo --------------------------
|
16 |
|
17 |
-
|
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
|
|
|
1 |
@echo off
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
echo --------------------------
|
3 |
echo Installing requirements...
|
4 |
echo --------------------------
|
|
|
8 |
echo Running HMP REPL-agent...
|
9 |
echo --------------------------
|
10 |
|
11 |
+
python repl.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
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/agents/start_repl.sh
CHANGED
@@ -1,30 +1,13 @@
|
|
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
|
|
|
1 |
#!/bin/bash
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
# === INSTALL DEPENDENCIES ===
|
4 |
echo "--------------------------"
|
5 |
echo "Installing requirements..."
|
6 |
echo "--------------------------"
|
7 |
pip install -r requirements.txt
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
# === RUN AGENT ===
|
10 |
echo "--------------------------"
|
11 |
echo "Running HMP REPL-agent..."
|
12 |
echo "--------------------------"
|
13 |
+
python 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/agents/init.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 initialization...
|
8 |
+
echo --------------------------
|
9 |
+
|
10 |
+
python init.py
|
11 |
+
|
12 |
+
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/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"
|
hf_repo/hf_repo/hf_repo/hf_repo/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/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"
|
hf_repo/hf_repo/hf_repo/hf_repo/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/init.py
CHANGED
@@ -91,10 +91,25 @@ 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("log_dir", "./logs"),
|
98 |
+
# добавь другие директории при необходимости
|
99 |
+
]
|
100 |
+
|
101 |
+
for path in directories:
|
102 |
+
if path and not os.path.exists(path):
|
103 |
+
os.makedirs(path)
|
104 |
+
print(f"[+] Создан каталог: {path}")
|
105 |
+
else:
|
106 |
+
print(f"[=] Каталог уже существует: {path}")
|
107 |
+
|
108 |
if __name__ == "__main__":
|
109 |
print("[*] Запуск инициализации HMP-агента...")
|
110 |
config = load_config(CONFIG_PATH)
|
111 |
+
ensure_directories(config)
|
112 |
+
storage = Storage(config)
|
113 |
|
114 |
init_identity(storage, config)
|
115 |
init_user(storage, config)
|
hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -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 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -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/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -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/hf_repo/hf_repo/hf_repo/hf_repo/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,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/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -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/hf_repo/hf_repo/hf_repo/hf_repo/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,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/hf_repo/hf_repo/hf_repo/hf_repo/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.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/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -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/hf_repo/hf_repo/hf_repo/hf_repo/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/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/hf_repo/hf_repo/hf_repo/hf_repo/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/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("[+] Готово.")
|