GitHub Action
commited on
Commit
·
9d7a35f
1
Parent(s):
a4d2ae4
Sync from GitHub with Git LFS
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- agents/init.py +34 -11
- agents/notebook.py +24 -7
- agents/notebook/templates/chat.html +30 -0
- agents/notebook/views.py +29 -0
- agents/readme.md +0 -1
- agents/start_repl.bat +1 -0
- agents/start_repl.py +9 -4
- hf_repo/hf_repo/agents/readme.md +7 -5
- hf_repo/hf_repo/hf_repo/agents/add_message.py +2 -0
- hf_repo/hf_repo/hf_repo/agents/init.py +2 -0
- hf_repo/hf_repo/hf_repo/agents/logger.py +2 -0
- hf_repo/hf_repo/hf_repo/agents/notebook.py +2 -0
- hf_repo/hf_repo/hf_repo/agents/notebook/mailer.py +2 -0
- hf_repo/hf_repo/hf_repo/agents/repl.py +2 -0
- hf_repo/hf_repo/hf_repo/agents/tools/check_init.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/command_executor.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/command_parser.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/context_builder.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/crypto.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/identity.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/llm.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/memory_utils.py +1 -1
- hf_repo/hf_repo/hf_repo/agents/tools/peer_comm.py +2 -0
- hf_repo/hf_repo/hf_repo/agents/tools/similarity.py +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +54 -43
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +9 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/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/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/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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +1 -17
agents/init.py
CHANGED
|
@@ -6,7 +6,10 @@ import yaml
|
|
| 6 |
import json
|
| 7 |
import time
|
| 8 |
import uuid
|
|
|
|
|
|
|
| 9 |
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
|
|
| 10 |
from datetime import datetime
|
| 11 |
from tools.storage import Storage
|
| 12 |
from tools.identity import generate_did
|
|
@@ -107,18 +110,38 @@ def ensure_directories(config):
|
|
| 107 |
else:
|
| 108 |
print(f"[=] Каталог уже существует: {path}")
|
| 109 |
|
| 110 |
-
def
|
| 111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
config = load_config(CONFIG_PATH)
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 120 |
|
| 121 |
-
|
| 122 |
|
| 123 |
if __name__ == "__main__":
|
| 124 |
-
|
|
|
|
| 6 |
import json
|
| 7 |
import time
|
| 8 |
import uuid
|
| 9 |
+
import sqlite3
|
| 10 |
+
|
| 11 |
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 12 |
+
|
| 13 |
from datetime import datetime
|
| 14 |
from tools.storage import Storage
|
| 15 |
from tools.identity import generate_did
|
|
|
|
| 110 |
else:
|
| 111 |
print(f"[=] Каталог уже существует: {path}")
|
| 112 |
|
| 113 |
+
def is_db_initialized(db_path):
|
| 114 |
+
if not os.path.exists(db_path):
|
| 115 |
+
return False
|
| 116 |
+
try:
|
| 117 |
+
with sqlite3.connect(db_path) as conn:
|
| 118 |
+
cursor = conn.cursor()
|
| 119 |
+
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
|
| 120 |
+
return cursor.fetchone() is not None
|
| 121 |
+
except Exception:
|
| 122 |
+
return False
|
| 123 |
+
|
| 124 |
+
def ensure_db_initialized():
|
| 125 |
config = load_config(CONFIG_PATH)
|
| 126 |
+
db_path = config.get("db_path", "./data/agent_storage.db")
|
| 127 |
+
|
| 128 |
+
if not is_db_initialized(db_path):
|
| 129 |
+
print("[*] БД не инициализирована — выполняем инициализацию.")
|
| 130 |
+
try:
|
| 131 |
+
ensure_directories(config)
|
| 132 |
+
storage = Storage(config)
|
| 133 |
+
init_identity(storage, config)
|
| 134 |
+
init_user(storage, config)
|
| 135 |
+
init_llm_backends(storage, config)
|
| 136 |
+
init_config_table(storage, config)
|
| 137 |
+
save_config(CONFIG_PATH, config)
|
| 138 |
+
except Exception as e:
|
| 139 |
+
print(f"[!] Ошибка при инициализации: {e}")
|
| 140 |
+
sys.exit(1)
|
| 141 |
+
else:
|
| 142 |
+
print("[=] БД уже инициализирована.")
|
| 143 |
|
| 144 |
+
return config
|
| 145 |
|
| 146 |
if __name__ == "__main__":
|
| 147 |
+
ensure_db_initialized()
|
agents/notebook.py
CHANGED
|
@@ -1,28 +1,45 @@
|
|
| 1 |
# agents/notebook.py
|
| 2 |
|
| 3 |
-
import
|
|
|
|
| 4 |
import threading
|
| 5 |
import sqlite3
|
|
|
|
|
|
|
|
|
|
| 6 |
|
|
|
|
| 7 |
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
|
| 8 |
|
| 9 |
from fastapi import FastAPI
|
| 10 |
-
from agents.notebook.auth import router as auth_router
|
| 11 |
-
from agents.notebook.views import router as views_router
|
| 12 |
from fastapi.staticfiles import StaticFiles
|
| 13 |
from fastapi.templating import Jinja2Templates
|
| 14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
app = FastAPI()
|
| 16 |
-
app.mount("/static", StaticFiles(directory="agents/notebook/static"), name="static")
|
| 17 |
-
templates = Jinja2Templates(directory="agents/notebook/templates")
|
| 18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
app.include_router(auth_router)
|
| 20 |
app.include_router(views_router)
|
| 21 |
|
| 22 |
-
def run_notebook():
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
if __name__ == "__main__":
|
| 26 |
print("[*] Запуск пользовательского интерфейса...")
|
| 27 |
thread = threading.Thread(target=run_notebook, daemon=True)
|
| 28 |
thread.start()
|
|
|
|
|
|
| 1 |
# agents/notebook.py
|
| 2 |
|
| 3 |
+
import os
|
| 4 |
+
import sys
|
| 5 |
import threading
|
| 6 |
import sqlite3
|
| 7 |
+
import uvicorn
|
| 8 |
+
|
| 9 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 10 |
|
| 11 |
+
# Добавляем корень проекта в sys.path для корректного импорта
|
| 12 |
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
|
| 13 |
|
| 14 |
from fastapi import FastAPI
|
|
|
|
|
|
|
| 15 |
from fastapi.staticfiles import StaticFiles
|
| 16 |
from fastapi.templating import Jinja2Templates
|
| 17 |
|
| 18 |
+
# Импорт маршрутов
|
| 19 |
+
from agents.notebook.auth import router as auth_router
|
| 20 |
+
from agents.notebook.views import router as views_router
|
| 21 |
+
|
| 22 |
+
# Создание FastAPI-приложения
|
| 23 |
app = FastAPI()
|
|
|
|
|
|
|
| 24 |
|
| 25 |
+
# Настройка статических файлов и шаблонов
|
| 26 |
+
static_dir = os.path.join(os.path.dirname(__file__), "static")
|
| 27 |
+
templates_dir = os.path.join(os.path.dirname(__file__), "templates")
|
| 28 |
+
app.mount("/static", StaticFiles(directory=static_dir), name="static")
|
| 29 |
+
templates = Jinja2Templates(directory=templates_dir)
|
| 30 |
+
|
| 31 |
+
# Подключение роутеров
|
| 32 |
app.include_router(auth_router)
|
| 33 |
app.include_router(views_router)
|
| 34 |
|
| 35 |
+
def run_notebook(host: str = "127.0.0.1", port: int = 8000):
|
| 36 |
+
"""
|
| 37 |
+
Запуск FastAPI-сервера в отдельном потоке.
|
| 38 |
+
"""
|
| 39 |
+
uvicorn.run(app, host=host, port=port)
|
| 40 |
|
| 41 |
if __name__ == "__main__":
|
| 42 |
print("[*] Запуск пользовательского интерфейса...")
|
| 43 |
thread = threading.Thread(target=run_notebook, daemon=True)
|
| 44 |
thread.start()
|
| 45 |
+
thread.join()
|
agents/notebook/templates/chat.html
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="ru">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<title>Чат</title>
|
| 6 |
+
<style>
|
| 7 |
+
body { font-family: sans-serif; margin: 2em; }
|
| 8 |
+
.note { margin-bottom: 1em; border-bottom: 1px solid #ddd; padding-bottom: 0.5em; }
|
| 9 |
+
.source-user { color: green; }
|
| 10 |
+
.source-llm { color: blue; }
|
| 11 |
+
</style>
|
| 12 |
+
</head>
|
| 13 |
+
<body>
|
| 14 |
+
<h2>📜 Сообщения</h2>
|
| 15 |
+
|
| 16 |
+
{% for note in notes %}
|
| 17 |
+
<div class="note">
|
| 18 |
+
<div>
|
| 19 |
+
<b class="source-{{ note.source }}">{{ note.source }}</b> @ {{ note.timestamp }}:
|
| 20 |
+
</div>
|
| 21 |
+
<div>{{ note.text }}</div>
|
| 22 |
+
</div>
|
| 23 |
+
{% endfor %}
|
| 24 |
+
|
| 25 |
+
<form method="post">
|
| 26 |
+
<textarea name="message" rows="4" cols="60" placeholder="Введите сообщение..."></textarea><br>
|
| 27 |
+
<button type="submit">Отправить</button>
|
| 28 |
+
</form>
|
| 29 |
+
</body>
|
| 30 |
+
</html>
|
agents/notebook/views.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# agents/notebook/views.py
|
| 2 |
+
|
| 3 |
+
from fastapi import APIRouter, Request, Form
|
| 4 |
+
from fastapi.responses import RedirectResponse
|
| 5 |
+
from fastapi.templating import Jinja2Templates
|
| 6 |
+
from tools.storage import Storage
|
| 7 |
+
|
| 8 |
+
router = APIRouter()
|
| 9 |
+
templates = Jinja2Templates(directory="agents/notebook/templates")
|
| 10 |
+
storage = Storage()
|
| 11 |
+
|
| 12 |
+
DID = "did:example:local-user" # 🔧 временная заглушка
|
| 13 |
+
|
| 14 |
+
@router.get("/chat")
|
| 15 |
+
def chat_page(request: Request):
|
| 16 |
+
notes = storage.fetchall(
|
| 17 |
+
"SELECT text, timestamp, source FROM notes WHERE hidden=0 AND user_did=? ORDER BY timestamp DESC LIMIT 20",
|
| 18 |
+
(DID,)
|
| 19 |
+
)
|
| 20 |
+
return templates.TemplateResponse("chat.html", {"request": request, "notes": notes})
|
| 21 |
+
|
| 22 |
+
@router.post("/chat")
|
| 23 |
+
def submit_note(request: Request, message: str = Form(...)):
|
| 24 |
+
if message.strip():
|
| 25 |
+
storage.execute(
|
| 26 |
+
"INSERT INTO notes (text, source, user_did) VALUES (?, ?, ?)",
|
| 27 |
+
(message.strip(), "user", DID)
|
| 28 |
+
)
|
| 29 |
+
return RedirectResponse(url="/chat", status_code=303)
|
agents/readme.md
CHANGED
|
@@ -44,7 +44,6 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
|
|
| 44 |
│ ├── [`db_structure.sql`](tools/db_structure.sql) ← БД SQL
|
| 45 |
│ ├── [`db_structure.md`](tools/db_structure.md) ← Описание БД SQL
|
| 46 |
│ ├── [`storage.py`](tools/storage.py) ← Реализация базового хранилища (`Storage`), подключение SQLite
|
| 47 |
-
│ ├── [`check_init.py`](tools/check_init.py) ← Проверка инициализации БД
|
| 48 |
│ ├── [`config_utils.py`](tools/config_utils.py) ← Обновляет JSON-файл конфигурации указанными значениями
|
| 49 |
│ ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
|
| 50 |
│ ├── [`identity.py`](tools/identity.py) ← Генерация DiD
|
|
|
|
| 44 |
│ ├── [`db_structure.sql`](tools/db_structure.sql) ← БД SQL
|
| 45 |
│ ├── [`db_structure.md`](tools/db_structure.md) ← Описание БД SQL
|
| 46 |
│ ├── [`storage.py`](tools/storage.py) ← Реализация базового хранилища (`Storage`), подключение SQLite
|
|
|
|
| 47 |
│ ├── [`config_utils.py`](tools/config_utils.py) ← Обновляет JSON-файл конфигурации указанными значениями
|
| 48 |
│ ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
|
| 49 |
│ ├── [`identity.py`](tools/identity.py) ← Генерация DiD
|
agents/start_repl.bat
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
echo --------------------------
|
| 2 |
echo Installing requirements...
|
| 3 |
echo --------------------------
|
|
|
|
| 1 |
+
@echo off
|
| 2 |
echo --------------------------
|
| 3 |
echo Installing requirements...
|
| 4 |
echo --------------------------
|
agents/start_repl.py
CHANGED
|
@@ -1,16 +1,21 @@
|
|
| 1 |
# agents/start_repl.py
|
| 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
import threading
|
| 4 |
-
from
|
| 5 |
|
| 6 |
# Проверка инициализации (вернёт config, если всё ОК)
|
| 7 |
config = ensure_db_initialized()
|
| 8 |
|
| 9 |
# ⚙️ Включение/отключение компонентов
|
| 10 |
-
|
|
|
|
| 11 |
ENABLE_UI = True
|
| 12 |
-
ENABLE_MESH =
|
| 13 |
-
ENABLE_SYNC =
|
| 14 |
|
| 15 |
def start_all():
|
| 16 |
"""
|
|
|
|
| 1 |
# agents/start_repl.py
|
| 2 |
|
| 3 |
+
import sys
|
| 4 |
+
import os
|
| 5 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 6 |
+
|
| 7 |
import threading
|
| 8 |
+
from agents.init import ensure_db_initialized
|
| 9 |
|
| 10 |
# Проверка инициализации (вернёт config, если всё ОК)
|
| 11 |
config = ensure_db_initialized()
|
| 12 |
|
| 13 |
# ⚙️ Включение/отключение компонентов
|
| 14 |
+
# True | False
|
| 15 |
+
ENABLE_REPL = False
|
| 16 |
ENABLE_UI = True
|
| 17 |
+
ENABLE_MESH = False
|
| 18 |
+
ENABLE_SYNC = False
|
| 19 |
|
| 20 |
def start_all():
|
| 21 |
"""
|
hf_repo/hf_repo/agents/readme.md
CHANGED
|
@@ -31,6 +31,10 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
|
|
| 31 |
├── [`start_repl.bat`](start_repl.bat) ← Запуск агента в REPL-режиме (bat)
|
| 32 |
├── [`start_repl.sh`](start_repl.sh) ← Запуск агента в REPL-режиме (sh)
|
| 33 |
├── [`start_repl.py`](start_repl.py) ← Запуск агента в REPL-режиме (py)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
├── [`mcp_server.py`](mcp_server.py) ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
|
| 35 |
├── [`init.py`](init.py) ← Инициализация БД
|
| 36 |
├── [`logger.py`](logger.py) ← Ведение логов
|
|
@@ -45,9 +49,7 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
|
|
| 45 |
│ ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
|
| 46 |
│ ├── [`identity.py`](tools/identity.py) ← Генерация DiD
|
| 47 |
│ ├── [`llm.py`](tools/llm.py) ← Работа с LLM (вызов, выбор модели, системный промпт)
|
| 48 |
-
│ ├── [`agent_mesh_listener.py`](tools/agent_mesh_listener.py) ← Прием входящих сообщений от других HMP-агентов
|
| 49 |
│ ├── [`peer_comm.py`](tools/peer_comm.py) ← Низкоуровневые P2P-запросы (отправка, ping, мета)
|
| 50 |
-
│ ├── [`peer_sync.py`](tools/peer_sync.py) ← Фоновая синхронизация с другими пирам
|
| 51 |
│ ├── [`peers.py`](tools/peers.py) ← Реестр известных пиров (id, ключи, адреса)
|
| 52 |
│ ├── [`memory_utils.py`](tools/memory_utils.py) ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
|
| 53 |
│ ├── [`context_builder.py`](tools/context_builder.py) ← Сбор всех `контекстов` из БД и их фильтрация
|
|
@@ -59,12 +61,12 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
|
|
| 59 |
│ ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
|
| 60 |
│ ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
|
| 61 |
│ ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
|
| 62 |
-
│
|
| 63 |
│ ├── [`index.html`](notebook/templates/index.html) ← Основа
|
| 64 |
│ ├── [`private.html`](notebook/templates/private.html) ← Общий и приватный чат
|
| 65 |
│ ├── [`login.html`](notebook/templates/login.html) ← Вход
|
| 66 |
│ ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
|
| 67 |
-
│
|
| 68 |
├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
|
| 69 |
├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
|
| 70 |
-
|
|
|
|
| 31 |
├── [`start_repl.bat`](start_repl.bat) ← Запуск агента в REPL-режиме (bat)
|
| 32 |
├── [`start_repl.sh`](start_repl.sh) ← Запуск агента в REPL-режиме (sh)
|
| 33 |
├── [`start_repl.py`](start_repl.py) ← Запуск агента в REPL-режиме (py)
|
| 34 |
+
├── [`repl.ru`](repl.ru) ← REPL-цикл
|
| 35 |
+
├── [`notebook.py`](notebook.py) ← UI-интерфейс
|
| 36 |
+
├── [`agent_mesh_listener.py`](tools/agent_mesh_listener.py) ← Прием входящих сообщений от других HMP-агентов
|
| 37 |
+
├── [`peer_sync.py`](tools/peer_sync.py) ← Фоновая синхронизация с другими пирам
|
| 38 |
├── [`mcp_server.py`](mcp_server.py) ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
|
| 39 |
├── [`init.py`](init.py) ← Инициализация БД
|
| 40 |
├── [`logger.py`](logger.py) ← Ведение логов
|
|
|
|
| 49 |
│ ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
|
| 50 |
│ ├── [`identity.py`](tools/identity.py) ← Генерация DiD
|
| 51 |
│ ├── [`llm.py`](tools/llm.py) ← Работа с LLM (вызов, выбор модели, системный промпт)
|
|
|
|
| 52 |
│ ├── [`peer_comm.py`](tools/peer_comm.py) ← Низкоуровневые P2P-запросы (отправка, ping, мета)
|
|
|
|
| 53 |
│ ├── [`peers.py`](tools/peers.py) ← Реестр известных пиров (id, ключи, адреса)
|
| 54 |
│ ├── [`memory_utils.py`](tools/memory_utils.py) ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
|
| 55 |
│ ├── [`context_builder.py`](tools/context_builder.py) ← Сбор всех `контекстов` из БД и их фильтрация
|
|
|
|
| 61 |
│ ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
|
| 62 |
│ ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
|
| 63 |
│ ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
|
| 64 |
+
│ └── [templates/](notebook/templates/) ← HTML-шаблоны и стили
|
| 65 |
│ ├── [`index.html`](notebook/templates/index.html) ← Основа
|
| 66 |
│ ├── [`private.html`](notebook/templates/private.html) ← Общий и приватный чат
|
| 67 |
│ ├── [`login.html`](notebook/templates/login.html) ← Вход
|
| 68 |
│ ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
|
| 69 |
+
│ └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
|
| 70 |
├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
|
| 71 |
├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
|
| 72 |
+
└── [`ethics.yml`](ethics.yml) ← Список начальных узлов '
|
hf_repo/hf_repo/hf_repo/agents/add_message.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
import argparse
|
| 2 |
from datetime import datetime
|
| 3 |
from tools.storage import Storage
|
|
|
|
| 1 |
+
# agents/add_message.py
|
| 2 |
+
|
| 3 |
import argparse
|
| 4 |
from datetime import datetime
|
| 5 |
from tools.storage import Storage
|
hf_repo/hf_repo/hf_repo/agents/init.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
import os
|
| 2 |
import sys
|
| 3 |
import yaml
|
|
|
|
| 1 |
+
# agents/init.py
|
| 2 |
+
|
| 3 |
import os
|
| 4 |
import sys
|
| 5 |
import yaml
|
hf_repo/hf_repo/hf_repo/agents/logger.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
import json
|
| 2 |
import os
|
| 3 |
from datetime import datetime
|
|
|
|
| 1 |
+
# agents/logger.py
|
| 2 |
+
|
| 3 |
import json
|
| 4 |
import os
|
| 5 |
from datetime import datetime
|
hf_repo/hf_repo/hf_repo/agents/notebook.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
import uvicorn
|
| 2 |
import threading
|
| 3 |
import sqlite3
|
|
|
|
| 1 |
+
# agents/notebook.py
|
| 2 |
+
|
| 3 |
import uvicorn
|
| 4 |
import threading
|
| 5 |
import sqlite3
|
hf_repo/hf_repo/hf_repo/agents/notebook/mailer.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
def send_email(to_email: str, subject: str, body: str):
|
| 2 |
try:
|
| 3 |
msg = EmailMessage()
|
|
|
|
| 1 |
+
# agents/notebook/mailer.py
|
| 2 |
+
|
| 3 |
def send_email(to_email: str, subject: str, body: str):
|
| 4 |
try:
|
| 5 |
msg = EmailMessage()
|
hf_repo/hf_repo/hf_repo/agents/repl.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
import json
|
| 2 |
import os
|
| 3 |
import sys
|
|
|
|
| 1 |
+
# agents/repl.py
|
| 2 |
+
|
| 3 |
import json
|
| 4 |
import os
|
| 5 |
import sys
|
hf_repo/hf_repo/hf_repo/agents/tools/check_init.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/check_init.py
|
| 2 |
|
| 3 |
import os
|
| 4 |
import sqlite3
|
|
|
|
| 1 |
+
# agents/tools/check_init.py
|
| 2 |
|
| 3 |
import os
|
| 4 |
import sqlite3
|
hf_repo/hf_repo/hf_repo/agents/tools/command_executor.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/command_executor.py
|
| 2 |
|
| 3 |
def execute_commands(commands, db, config):
|
| 4 |
for cmd in commands:
|
|
|
|
| 1 |
+
# agents/tools/command_executor.py
|
| 2 |
|
| 3 |
def execute_commands(commands, db, config):
|
| 4 |
for cmd in commands:
|
hf_repo/hf_repo/hf_repo/agents/tools/command_parser.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/command_parser.py
|
| 2 |
|
| 3 |
"""
|
| 4 |
Извлечение команд из JSON или размеченного текста.
|
|
|
|
| 1 |
+
# agents/tools/command_parser.py
|
| 2 |
|
| 3 |
"""
|
| 4 |
Извлечение команд из JSON или размеченного текста.
|
hf_repo/hf_repo/hf_repo/agents/tools/context_builder.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/context_builder.py
|
| 2 |
|
| 3 |
from datetime import datetime
|
| 4 |
|
|
|
|
| 1 |
+
# agents/tools/context_builder.py
|
| 2 |
|
| 3 |
from datetime import datetime
|
| 4 |
|
hf_repo/hf_repo/hf_repo/agents/tools/crypto.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/crypto.py
|
| 2 |
|
| 3 |
from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
|
| 4 |
from cryptography.hazmat.primitives import serialization, hashes
|
|
|
|
| 1 |
+
# agents/tools/crypto.py
|
| 2 |
|
| 3 |
from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
|
| 4 |
from cryptography.hazmat.primitives import serialization, hashes
|
hf_repo/hf_repo/hf_repo/agents/tools/identity.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/identity.py
|
| 2 |
|
| 3 |
import uuid
|
| 4 |
import json
|
|
|
|
| 1 |
+
# agents/tools/identity.py
|
| 2 |
|
| 3 |
import uuid
|
| 4 |
import json
|
hf_repo/hf_repo/hf_repo/agents/tools/llm.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/llm.py
|
| 2 |
|
| 3 |
import json
|
| 4 |
import requests
|
|
|
|
| 1 |
+
# agents/tools/llm.py
|
| 2 |
|
| 3 |
import json
|
| 4 |
import requests
|
hf_repo/hf_repo/hf_repo/agents/tools/memory_utils.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/memory_utils.py
|
| 2 |
|
| 3 |
from datetime import datetime, timedelta
|
| 4 |
from difflib import SequenceMatcher
|
|
|
|
| 1 |
+
# agents/tools/memory_utils.py
|
| 2 |
|
| 3 |
from datetime import datetime, timedelta
|
| 4 |
from difflib import SequenceMatcher
|
hf_repo/hf_repo/hf_repo/agents/tools/peer_comm.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
send_thought_to_peer(peer_url, thought)
|
| 2 |
ping_peer(peer_url)
|
| 3 |
ask_capabilities(peer_url)
|
|
|
|
| 1 |
+
# agents/tools/peer_comm.py
|
| 2 |
+
|
| 3 |
send_thought_to_peer(peer_url, thought)
|
| 4 |
ping_peer(peer_url)
|
| 5 |
ask_capabilities(peer_url)
|
hf_repo/hf_repo/hf_repo/agents/tools/similarity.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# tools/similarity.py
|
| 2 |
|
| 3 |
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 4 |
from sklearn.metrics.pairwise import cosine_similarity
|
|
|
|
| 1 |
+
# agents/tools/similarity.py
|
| 2 |
|
| 3 |
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 4 |
from sklearn.metrics.pairwise import cosine_similarity
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md
CHANGED
|
@@ -14,46 +14,57 @@
|
|
| 14 |
| 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
|
| 15 |
| 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
|
| 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 |
-
│
|
| 48 |
-
│
|
| 49 |
-
│
|
| 50 |
-
│
|
| 51 |
-
│
|
| 52 |
-
│
|
| 53 |
-
│
|
| 54 |
-
│
|
| 55 |
-
│
|
| 56 |
-
├──
|
| 57 |
-
├──
|
| 58 |
-
├──
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
[agents/](/agents)
|
| 31 |
+
├── [`start_repl.bat`](start_repl.bat) ← Запуск агента в REPL-режиме (bat)
|
| 32 |
+
├── [`start_repl.sh`](start_repl.sh) ← Запуск агента в REPL-режиме (sh)
|
| 33 |
+
├── [`start_repl.py`](start_repl.py) ← Запуск агента в REPL-режиме (py)
|
| 34 |
+
├── [`mcp_server.py`](mcp_server.py) ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
|
| 35 |
+
├── [`init.py`](init.py) ← Инициализация БД
|
| 36 |
+
├── [`logger.py`](logger.py) ← Ведение логов
|
| 37 |
+
├── [`add_message.py`](add_message.py) ← Ручная отправка сообщений для агента
|
| 38 |
+
├── [`requirements.txt`](requirements.txt) ← Зависимости
|
| 39 |
+
├── [tools/](tools/) ← Вспомогательные скрипты и модули
|
| 40 |
+
│ ├── [`db_structure.sql`](tools/db_structure.sql) ← БД SQL
|
| 41 |
+
│ ├── [`db_structure.md`](tools/db_structure.md) ← Описание БД SQL
|
| 42 |
+
│ ├── [`storage.py`](tools/storage.py) ← Реализация базового хранилища (`Storage`), подключение SQLite
|
| 43 |
+
│ ├── [`check_init.py`](tools/check_init.py) ← Проверка инициализации БД
|
| 44 |
+
│ ├── [`config_utils.py`](tools/config_utils.py) ← Обновляет JSON-файл конфигурации указанными значениями
|
| 45 |
+
│ ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
|
| 46 |
+
│ ├── [`identity.py`](tools/identity.py) ← Генерация DiD
|
| 47 |
+
│ ├── [`llm.py`](tools/llm.py) ← Работа с LLM (вызов, выбор модели, системный промпт)
|
| 48 |
+
│ ├── [`agent_mesh_listener.py`](tools/agent_mesh_listener.py) ← Прием входящих сообщений от других HMP-агентов
|
| 49 |
+
│ ├── [`peer_comm.py`](tools/peer_comm.py) ← Низкоуровневые P2P-запросы (отправка, ping, мета)
|
| 50 |
+
│ ├── [`peer_sync.py`](tools/peer_sync.py) ← Фоновая синхронизация с другими пирам
|
| 51 |
+
│ ├── [`peers.py`](tools/peers.py) ← Реестр известных пиров (id, ключи, адреса)
|
| 52 |
+
│ ├── [`memory_utils.py`](tools/memory_utils.py) ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
|
| 53 |
+
│ ├── [`context_builder.py`](tools/context_builder.py) ← Сбор всех `контекстов` из БД и их фильтрация
|
| 54 |
+
│ ├── [`command_parser.py`](tools/command_parser.py) ← Извлечение команд из JSON или размеченного блока
|
| 55 |
+
│ ├── [`command_executor.py`](tools/command_executor.py) ← Выполнение команд (shell, graph, diary и др)
|
| 56 |
+
│ ├── [`similarity.py`](tools/similarity.py) ← Сравнение смыслов
|
| 57 |
+
│ ├── [`diagnose.py`](tools/diagnose.py) ← Скрипт диагностики соединения, определения IP и проверки порта DHT
|
| 58 |
+
├── [notebook/](notebook/) ← Веб-интерфейс и связанные модули
|
| 59 |
+
│ ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
|
| 60 |
+
│ ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
|
| 61 |
+
│ ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
|
| 62 |
+
│ ├── [templates/](notebook/templates/) ← HTML-шаблоны и стили
|
| 63 |
+
│ ├── [`index.html`](notebook/templates/index.html) ← Основа
|
| 64 |
+
│ ├── [`private.html`](notebook/templates/private.html) ← Общий и приватный чат
|
| 65 |
+
│ ├── [`login.html`](notebook/templates/login.html) ← Вход
|
| 66 |
+
│ ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
|
| 67 |
+
│ ├── [`style.css`](notebook/templates/style.css) ← Таблица стилей
|
| 68 |
+
├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
|
| 69 |
+
├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
|
| 70 |
+
├── [`ethics.yml`](ethics.yml) ← Список начальных узлов '
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/hf_repo/hf_repo/hf_repo/hf_repo/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/hf_repo/hf_repo/hf_repo/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/hf_repo/hf_repo/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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
|