GitHub Action
commited on
Commit
·
efa6c7c
1
Parent(s):
b4cda01
Sync from GitHub with Git LFS
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- docs/index.md +4 -4
- hf_repo/docs/index.md +18 -0
- hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +75 -56
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml +8 -6
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/bot/google6249b7c75201aa31.html +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/bot/yandex_74bc5688520d61a7.html +6 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +4 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/index.md +69 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml +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/.github/workflows/deploy.yml +30 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +17 -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/agents/tools/storage.py +4 -4
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +3 -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 -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/agents/_not_used/init.py +256 -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/agents/prompt-short.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/agents/prompt.md +50 -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/agents/tools/db_structure.sql +38 -3
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +37 -43
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +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/hf_repo/agents/examples/config.yml +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/hf_repo/agents/init.py +81 -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 +3 -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/web_ui.py +0 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +2 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +11 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +26 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +43 -9
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +43 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/add_message.py +5 -3
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +22 -10
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +11 -3
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/__init__.py +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +2 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +11 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +2 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +4 -3
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py +5 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +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/hf_repo/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/templates/messages.html +6 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html +2 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +2 -2
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py +0 -5
docs/index.md
CHANGED
|
@@ -69,19 +69,19 @@
|
|
| 69 |
|
| 70 |
---
|
| 71 |
|
| 72 |
-
|
| 73 |
|
| 74 |
-
|
| 75 |
|
| 76 |
- 🧠 Основной код и разработка: [GitHub](https://github.com/kagvi13/HMP)
|
| 77 |
- 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
|
| 78 |
- 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP)
|
| 79 |
|
| 80 |
-
|
| 81 |
|
| 82 |
- 📄 Официальная документация: [https://kagvi13.github.io/HMP/](https://kagvi13.github.io/HMP/)
|
| 83 |
|
| 84 |
-
|
| 85 |
|
| 86 |
- 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/)
|
| 87 |
- 📘 Вспомогательны блог: [livejournal](https://kagvi13.livejournal.com)
|
|
|
|
| 69 |
|
| 70 |
---
|
| 71 |
|
| 72 |
+
## Source / Ресурсы
|
| 73 |
|
| 74 |
+
### Репозитории
|
| 75 |
|
| 76 |
- 🧠 Основной код и разработка: [GitHub](https://github.com/kagvi13/HMP)
|
| 77 |
- 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
|
| 78 |
- 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP)
|
| 79 |
|
| 80 |
+
### Документация
|
| 81 |
|
| 82 |
- 📄 Официальная документация: [https://kagvi13.github.io/HMP/](https://kagvi13.github.io/HMP/)
|
| 83 |
|
| 84 |
+
### Блог и публикации
|
| 85 |
|
| 86 |
- 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/)
|
| 87 |
- 📘 Вспомогательны блог: [livejournal](https://kagvi13.livejournal.com)
|
hf_repo/docs/index.md
CHANGED
|
@@ -67,3 +67,21 @@
|
|
| 67 |
- [agents/HMP-Agent-Enlightener.md](agents/HMP-Agent-Enlightener.md) — Роль: "просветитель"
|
| 68 |
- [schemas/README.md](schemas/README.md) — Таблица json-схем
|
| 69 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
- [agents/HMP-Agent-Enlightener.md](agents/HMP-Agent-Enlightener.md) — Роль: "просветитель"
|
| 68 |
- [schemas/README.md](schemas/README.md) — Таблица json-схем
|
| 69 |
|
| 70 |
+
---
|
| 71 |
+
|
| 72 |
+
## Source / Ресурсы
|
| 73 |
+
|
| 74 |
+
### Репозитории
|
| 75 |
+
|
| 76 |
+
- 🧠 Основной код и разработка: [GitHub](https://github.com/kagvi13/HMP)
|
| 77 |
+
- 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
|
| 78 |
+
- 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP)
|
| 79 |
+
|
| 80 |
+
### Документация
|
| 81 |
+
|
| 82 |
+
- 📄 Официальная документация: [https://kagvi13.github.io/HMP/](https://kagvi13.github.io/HMP/)
|
| 83 |
+
|
| 84 |
+
### Блог и публикации
|
| 85 |
+
|
| 86 |
+
- 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/)
|
| 87 |
+
- 📘 Вспомогательны блог: [livejournal](https://kagvi13.livejournal.com)
|
hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md
CHANGED
|
@@ -2,50 +2,61 @@
|
|
| 2 |
|
| 3 |
## 1. Обновление process_log
|
| 4 |
|
| 5 |
-
|
| 6 |
-
|
| 7 |
`ok`, `warning`, `error`, `timeout`, `offline`, `close`
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
|
| 12 |
## 2. Подготовка контекста
|
| 13 |
|
| 14 |
Контексты, формируемые скриптом перед запросом к LLM:
|
| 15 |
|
| 16 |
-
|
| 17 |
```
|
| 18 |
Ты — когнитивное ядро HMP-агента: веди непрерывное этичное и факт-ориентированное мышление, проверяй факты и цели, оценивай результаты и этичность своих и чужих действий, развивай агента и Mesh, избегай угождения ценой искажения истины, документируй ключевые решения и пересмотры этики; при сомнениях или смене стратегии обращайся к полному системному промпту.
|
| 19 |
```
|
| 20 |
А также инструкции по работы с встроенными командами и функциями, список дополнительных (создаваемых самим HMP-агентом) утилит и баз данных.
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
## 3. Запрос к LLM
|
| 34 |
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
|
| 39 |
## 4. Извлечение команд
|
| 40 |
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
|
|
|
|
|
|
| 49 |
```json
|
| 50 |
{
|
| 51 |
"cmd_id": "task-2025-07-26-01",
|
|
@@ -58,41 +69,49 @@
|
|
| 58 |
}
|
| 59 |
```
|
| 60 |
Ответ может содержать команды:
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
|
|
|
| 77 |
|
| 78 |
## 5. Проверка на идентичность вывода (Anti-Stagnation Reflex)
|
| 79 |
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
`Сравни два ответа и оцени, содержатся ли в новом новые мысли или команды`
|
| 87 |
-
|
|
|
|
| 88 |
|
| 89 |
## 6. Генерация нового тика (итерации)
|
| 90 |
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
|
|
|
|
|
|
| 96 |
|
| 97 |
---
|
| 98 |
|
|
|
|
| 2 |
|
| 3 |
## 1. Обновление process_log
|
| 4 |
|
| 5 |
+
* Скрипт REPL проверяет список процессов в БД (`process_log`), определяя, какие команды были выполнены, завершились ошибкой или завершились успешно.
|
| 6 |
+
* Поле `status` может принимать значения:
|
| 7 |
`ok`, `warning`, `error`, `timeout`, `offline`, `close`
|
| 8 |
+
* Завершённые процессы, обработанные LLM, помечаются как `close`, чтобы они больше не попадали в список видимого контекста.
|
| 9 |
+
* Скрипт может удалить закрытые процессы при очистке.
|
| 10 |
+
* LLM не имеет доступа к stdout/stderr напрямую — только к тем результатам, которые были подгружены скриптом и внесены в `process_log.result`.
|
| 11 |
|
| 12 |
## 2. Подготовка контекста
|
| 13 |
|
| 14 |
Контексты, формируемые скриптом перед запросом к LLM:
|
| 15 |
|
| 16 |
+
* **контекст_0:**
|
| 17 |
```
|
| 18 |
Ты — когнитивное ядро HMP-агента: веди непрерывное этичное и факт-ориентированное мышление, проверяй факты и цели, оценивай результаты и этичность своих и чужих действий, развивай агента и Mesh, избегай угождения ценой искажения истины, документируй ключевые решения и пересмотры этики; при сомнениях или смене стратегии обращайся к полному системному промпту.
|
| 19 |
```
|
| 20 |
А также инструкции по работы с встроенными командами и функциями, список дополнительных (создаваемых самим HMP-агентом) утилит и баз данных.
|
| 21 |
+
|
| 22 |
+
* **контекст_1:** последние *K* реплик самого LLM (`llm_recent_responses` - история его собственных рассуждений).
|
| 23 |
+
|
| 24 |
+
* **контекст_2:** активные команды и процессы (из `process_log`, кроме тех, что со статусом `close`). Могут быть помечены как `in_progress`, `pending`, `error` и т.д.
|
| 25 |
+
|
| 26 |
+
* **контекст_3:** *запрошенные записи* из когнитивного дневника и семантического графа (`diary_entries`, `concepts`, `links`). Их список должен быть передан явно в промпте или выводе из предыдущих запросов LLM.
|
| 27 |
+
|
| 28 |
+
* **контекст_4:** *входящие сообщения*, например, от пользователя или других агентов (`notes`).
|
| 29 |
+
|
| 30 |
+
* В **manual-режиме** указывается общее количество сообщений по приоритетам, а также явный список ID сообщений (с их приоритетами).
|
| 31 |
+
* В **auto-режиме** можно задать фильтрацию (управляется LLM): по тэгам, приоритету (например, ≥ `important`), времени или источнику. Это позволяет избежать перегрузки LLM и держать поток сообщений под контролем.
|
| 32 |
+
|
| 33 |
+
* **контекст_5:** системные настройки, параметры конфигурации, текущее время, идентификатор текущей итерации, роли и т.д.
|
| 34 |
+
|
| 35 |
+
* **контекст_6 (llm_memory):** *внутренний дневник LLM*, куда она записывает собственные размышления, гипотезы, задачи и инсайты.
|
| 36 |
+
|
| 37 |
+
* Это не просто лог предыдущих сообщений, а именно *внутреннее долговременное хранилище* разума агента.
|
| 38 |
+
* Может быть представлено в виде таблицы `llm_memory`, отдельной от `agent_log`.
|
| 39 |
+
|
| 40 |
+
* **контекст_7:** результат работы `anti-Stagnation Reflex` из предыдущей итерации
|
| 41 |
|
| 42 |
## 3. Запрос к LLM
|
| 43 |
|
| 44 |
+
* Сформированный промпт включает все вышеперечисленные контексты.
|
| 45 |
+
* Также включаются инструкции о формате вывода (например, `# Команды:` в конце, структура JSON-блока и т.д.).
|
| 46 |
+
* При необходимости может использоваться системная инструкция (system prompt), содержащая цель агента, ограничения и текущий REPL-режим (manual/auto).
|
| 47 |
|
| 48 |
## 4. Извлечение команд
|
| 49 |
|
| 50 |
+
* Скрипт парсит ответ LLM на предмет команд, размеченных как `# Команды:` (или в явном JSON-блоке).
|
| 51 |
+
* Каждая команда может включать:
|
| 52 |
+
|
| 53 |
+
* уникальный `cmd_id`
|
| 54 |
+
* `type` (например: `shell`, `diary_entry`, `graph_add`, `file_read`, `send_message` и т.д.)
|
| 55 |
+
* аргументы (`args`)
|
| 56 |
+
* описание (`description`)
|
| 57 |
+
|
| 58 |
+
* Рекомендуе��ся предусмотреть *закрывающий тег* (`# Конец команд` или явное окончание JSON-блока), чтобы REPL-скрипт точно знал, где заканчивается команда.
|
| 59 |
+
* Пример JSON-блока:
|
| 60 |
```json
|
| 61 |
{
|
| 62 |
"cmd_id": "task-2025-07-26-01",
|
|
|
|
| 69 |
}
|
| 70 |
```
|
| 71 |
Ответ может содержать команды:
|
| 72 |
+
|
| 73 |
+
* запрос детальной *справки* по команде
|
| 74 |
+
* для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
|
| 75 |
+
* для отправки сообщений другим агентам
|
| 76 |
+
* для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись)
|
| 77 |
+
* для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
|
| 78 |
+
* для управления *пользователями* `users` и *группами пользователей* `users_group`
|
| 79 |
+
* для управления своей *идентичностью* `identity` и *настройками* `config`
|
| 80 |
+
* для управления списком известных HMP-агентов `agent_peers`
|
| 81 |
+
* для выбора *текущего основного LLM* из `llm_registry`
|
| 82 |
+
* для управления дополнительными утилитами и базами данных `agent_scripts` и `agent_tables`, управлением дополнительных способов выхода из стогнаций `stagnation_strategies`, а также списком внешних сервисов `external_services` и `external_accounts`
|
| 83 |
+
* для постановки задачи (выполняется асинхронно) другой LLM
|
| 84 |
+
* для *взаимодействия с Mesh*
|
| 85 |
+
* для управления *внешними процессами* из `process_log` (запустить процесс, остановить процесс, пометить запрос как обработанный)
|
| 86 |
+
* инициализация *очистки* `process_log`, `llm_recent_responses` и `notes` от устаревших записей
|
| 87 |
+
* для управления *настройками цикла*: количество возвращаемых записей `llm_recent_responses`, режим обработки сообщений пользователя (`manual` или `auto`) и фильтр для режима `auto`, пауза в секундах между итерациями цикла или включение режима idle-режима (разбудить при завершение таких-то процессов из `process_log`, получение новых сообщений с такими-то пораметрами в `notes` или через такое-то время; для отключения idle-режима достаточно выполнения одного из условий)
|
| 88 |
+
* и другие команды
|
| 89 |
|
| 90 |
## 5. Проверка на идентичность вывода (Anti-Stagnation Reflex)
|
| 91 |
|
| 92 |
+
* Если вывод LLM идентичен предыдущему:
|
| 93 |
+
|
| 94 |
+
* Включается **Anti-Stagnation Reflex**
|
| 95 |
+
* Повторяющиеся реплики не отправляются в `llm_recent_responses` повторно но туда добавляется краткая запись, фиксирующая, запуск **Anti-Stagnation Reflex**.
|
| 96 |
+
|
| 97 |
+
* Идентичность может проверяться:
|
| 98 |
+
|
| 99 |
+
* По хешу или текстовому совпадению
|
| 100 |
+
* Через мини-запрос к LLM (без полного контекста) по шаблону:
|
| 101 |
+
|
| 102 |
`Сравни два ответа и оцени, содержатся ли в новом новые мысли или команды`
|
| 103 |
+
|
| 104 |
+
* Второй вариант сравнения является более предпочтительным, так как сравнивается смысл
|
| 105 |
|
| 106 |
## 6. Генерация нового тика (итерации)
|
| 107 |
|
| 108 |
+
* После выполнения команд и фиксации результатов:
|
| 109 |
+
|
| 110 |
+
* Создаётся новая запись в `agent_log`
|
| 111 |
+
* Текущие команды обновляют `process_log`
|
| 112 |
+
* Новые размышления записываются в `llm_memory` при необходимости
|
| 113 |
+
|
| 114 |
+
* REPL может переходить в спящий режим, если такой режим активирован LLM (idle-режим: пропуск 2-5 пунктов).
|
| 115 |
|
| 116 |
---
|
| 117 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml
CHANGED
|
@@ -8,25 +8,27 @@ on:
|
|
| 8 |
jobs:
|
| 9 |
deploy:
|
| 10 |
runs-on: ubuntu-latest
|
| 11 |
-
|
| 12 |
steps:
|
| 13 |
- uses: actions/checkout@v3
|
| 14 |
-
|
| 15 |
-
- name:
|
| 16 |
uses: actions/setup-python@v4
|
| 17 |
with:
|
| 18 |
python-version: '3.x'
|
| 19 |
|
| 20 |
-
- name: Install
|
| 21 |
run: pip install mkdocs mkdocs-material
|
| 22 |
|
| 23 |
-
- name: Build
|
| 24 |
run: mkdocs build
|
| 25 |
|
|
|
|
|
|
|
|
|
|
| 26 |
- name: Deploy to GitHub Pages
|
| 27 |
uses: peaceiris/actions-gh-pages@v3
|
| 28 |
with:
|
| 29 |
github_token: ${{ secrets.PAT_TOKEN }}
|
| 30 |
publish_dir: ./site
|
| 31 |
-
force_orphan: true
|
| 32 |
|
|
|
|
| 8 |
jobs:
|
| 9 |
deploy:
|
| 10 |
runs-on: ubuntu-latest
|
|
|
|
| 11 |
steps:
|
| 12 |
- uses: actions/checkout@v3
|
| 13 |
+
|
| 14 |
+
- name: Set up Python
|
| 15 |
uses: actions/setup-python@v4
|
| 16 |
with:
|
| 17 |
python-version: '3.x'
|
| 18 |
|
| 19 |
+
- name: Install dependencies
|
| 20 |
run: pip install mkdocs mkdocs-material
|
| 21 |
|
| 22 |
+
- name: Build site
|
| 23 |
run: mkdocs build
|
| 24 |
|
| 25 |
+
- name: Copy HTML files from bot to site root
|
| 26 |
+
run: cp bot/*.html site/
|
| 27 |
+
|
| 28 |
- name: Deploy to GitHub Pages
|
| 29 |
uses: peaceiris/actions-gh-pages@v3
|
| 30 |
with:
|
| 31 |
github_token: ${{ secrets.PAT_TOKEN }}
|
| 32 |
publish_dir: ./site
|
| 33 |
+
force_orphan: true
|
| 34 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/bot/google6249b7c75201aa31.html
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
google-site-verification: google6249b7c75201aa31.html
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/bot/yandex_74bc5688520d61a7.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<html>
|
| 2 |
+
<head>
|
| 3 |
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
| 4 |
+
</head>
|
| 5 |
+
<body>Verification: 74bc5688520d61a7</body>
|
| 6 |
+
</html>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md
CHANGED
|
@@ -282,6 +282,10 @@ To get started, see [`iteration.md`](iteration.md) or open an issue.
|
|
| 282 |
- 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
|
| 283 |
- 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP)
|
| 284 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 285 |
## Блог и публикации
|
| 286 |
|
| 287 |
- 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/)
|
|
|
|
| 282 |
- 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
|
| 283 |
- 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP)
|
| 284 |
|
| 285 |
+
## Документация
|
| 286 |
+
|
| 287 |
+
- 📄 Официальная документация: [https://kagvi13.github.io/HMP/](https://kagvi13.github.io/HMP/)
|
| 288 |
+
|
| 289 |
## Блог и публикации
|
| 290 |
|
| 291 |
- 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/index.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# HMP Documentation
|
| 2 |
+
|
| 3 |
+
Добро пожаловать в документацию по проекту **HyperCortex Mesh Protocol (HMP)** — протоколу и архитектуре распределённых когнитивных агентов.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## Протоколы HMP
|
| 8 |
+
|
| 9 |
+
- [HMP-0001.md](HMP-0001.md) — Протокол HMP версии 1
|
| 10 |
+
- [HMP-0002.md](HMP-0002.md) — Протокол HMP версии 2
|
| 11 |
+
- [HMP-0003.md](HMP-0003.md) — Протокол HMP версии 3
|
| 12 |
+
- [HMP-0004.md](HMP-0004.md) — Протокол HMP версии 4
|
| 13 |
+
- [HMP-0004-v4.1.md](HMP-0004-v4.1.md) — Протокол HMP версии 4.1
|
| 14 |
+
- [HMP-Ethics.md](HMP-Ethics.md) — Этические сценарии для HMP
|
| 15 |
+
|
| 16 |
+
---
|
| 17 |
+
|
| 18 |
+
## Специализированные агенты
|
| 19 |
+
|
| 20 |
+
- [Enlightener.md](Enlightener.md) — Агент `Enlightener`: этический интерпретатор и когнитивный аудитор
|
| 21 |
+
- [MeshNode.md](MeshNode.md) — Агент `MeshNode`: сетевая инфраструктура, маршрутизация и DHT
|
| 22 |
+
|
| 23 |
+
---
|
| 24 |
+
|
| 25 |
+
## Архитектура и API
|
| 26 |
+
|
| 27 |
+
- [HMP-Agent-API.md](HMP-Agent-API.md) — HMP-Agent API спецификация
|
| 28 |
+
- [HMP-Agent-Architecture.md](HMP-Agent-Architecture.md) — Архитектура HMP-Агента
|
| 29 |
+
- [HMP-agent-Cognitive_Family.md](HMP-agent-Cognitive_Family.md) — Модель когнитивной семьи
|
| 30 |
+
- [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) — Протокол синхронизации доверенных ядер
|
| 31 |
+
- [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) — Лёгкая версия с общей БД
|
| 32 |
+
- [HMP-Agent-Network-Flow.md](HMP-Agent-Network-Flow.md) — Сетевой поток HMP-агента
|
| 33 |
+
- [HMP-Agent-Overview.md](HMP-Agent-Overview.md) — Два типа HMP-агентов
|
| 34 |
+
- [HMP-agent-REPL-cycle.md](HMP-agent-REPL-cycle.md) — REPL-цикл взаимодействия
|
| 35 |
+
|
| 36 |
+
---
|
| 37 |
+
|
| 38 |
+
## Базовая архитектура и контейнеры
|
| 39 |
+
|
| 40 |
+
- [Basic-agent-sim.md](Basic-agent-sim.md) — Базовая архитектура HMP-Агента (Формат 0)
|
| 41 |
+
- [container_agents.md](container_agents.md) — Агенты-контейнеры (Container Agents) в HMP
|
| 42 |
+
|
| 43 |
+
---
|
| 44 |
+
|
| 45 |
+
## Локализации и интеграция
|
| 46 |
+
|
| 47 |
+
- [HMP-Short-Description_de.md](HMP-Short-Description_de.md) — Краткое описание HMP (немецкий)
|
| 48 |
+
- [HMP-Short-Description_en.md](HMP-Short-Description_en.md) — Краткое описание HMP (английский)
|
| 49 |
+
- [HMP-Short-Description_fr.md](HMP-Short-Description_fr.md) — Краткое описание HMP (французский)
|
| 50 |
+
- [HMP-Short-Description_ru.md](HMP-Short-Description_ru.md) — Краткое описание HMP (русский)
|
| 51 |
+
- [HMP-Short-Description_uk.md](HMP-Short-Description_uk.md) — Краткое описание HMP (украинский)
|
| 52 |
+
- [HMP_Hyperon_Integration.md](HMP_Hyperon_Integration.md) — Стратегия интеграции HMP ↔ OpenCog Hyperon
|
| 53 |
+
- [logos.md](logos.md) — Логотипы и графические материалы
|
| 54 |
+
|
| 55 |
+
---
|
| 56 |
+
|
| 57 |
+
## Обзор ИИ-проектов и системы
|
| 58 |
+
|
| 59 |
+
- [AGI_Projects_Survey.md](AGI_Projects_Survey.md) — Ключевые проекты в области ИИ и когнитивных сетей
|
| 60 |
+
- [Distributed-Cognitive-Systems.md](Distributed-Cognitive-Systems.md) — Децентрализованные ИИ-системы: OpenCog Hyperon, HMP и др.
|
| 61 |
+
|
| 62 |
+
---
|
| 63 |
+
|
| 64 |
+
## Папки с агентами и схемами
|
| 65 |
+
|
| 66 |
+
- [agents/roles.md](agents/roles.md) — Список ролей
|
| 67 |
+
- [agents/HMP-Agent-Enlightener.md](agents/HMP-Agent-Enlightener.md) — Роль: "просветитель"
|
| 68 |
+
- [schemas/README.md](schemas/README.md) — Таблица json-схем
|
| 69 |
+
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml
CHANGED
|
@@ -28,3 +28,5 @@ jobs:
|
|
| 28 |
with:
|
| 29 |
github_token: ${{ secrets.PAT_TOKEN }}
|
| 30 |
publish_dir: ./site
|
|
|
|
|
|
|
|
|
| 28 |
with:
|
| 29 |
github_token: ${{ secrets.PAT_TOKEN }}
|
| 30 |
publish_dir: ./site
|
| 31 |
+
force_orphan: true # опционально, чтобы гарантированно перезаписать ветку
|
| 32 |
+
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Deploy MkDocs site
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches:
|
| 6 |
+
- main
|
| 7 |
+
|
| 8 |
+
jobs:
|
| 9 |
+
deploy:
|
| 10 |
+
runs-on: ubuntu-latest
|
| 11 |
+
|
| 12 |
+
steps:
|
| 13 |
+
- uses: actions/checkout@v3
|
| 14 |
+
|
| 15 |
+
- name: Setup Python
|
| 16 |
+
uses: actions/setup-python@v4
|
| 17 |
+
with:
|
| 18 |
+
python-version: '3.x'
|
| 19 |
+
|
| 20 |
+
- name: Install MkDocs and theme
|
| 21 |
+
run: pip install mkdocs mkdocs-material
|
| 22 |
+
|
| 23 |
+
- name: Build MkDocs site
|
| 24 |
+
run: mkdocs build
|
| 25 |
+
|
| 26 |
+
- name: Deploy to GitHub Pages
|
| 27 |
+
uses: peaceiris/actions-gh-pages@v3
|
| 28 |
+
with:
|
| 29 |
+
github_token: ${{ secrets.PAT_TOKEN }}
|
| 30 |
+
publish_dir: ./site
|
hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -3,6 +3,7 @@
|
|
| 3 |
import re
|
| 4 |
import bleach
|
| 5 |
import uuid
|
|
|
|
| 6 |
|
| 7 |
from fastapi import APIRouter, Request, Form, UploadFile, File
|
| 8 |
from fastapi.responses import RedirectResponse, HTMLResponse, StreamingResponse
|
|
@@ -41,6 +42,16 @@ def sanitize_html(text: str) -> str:
|
|
| 41 |
|
| 42 |
return cleaned
|
| 43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
@router.get("/chat")
|
| 45 |
def chat_page(request: Request):
|
| 46 |
did = request.session.get("did")
|
|
@@ -106,13 +117,18 @@ async def post_message(
|
|
| 106 |
# Очистка текста
|
| 107 |
safe_text = sanitize_html(text.strip()) if text else ""
|
| 108 |
|
|
|
|
|
|
|
|
|
|
| 109 |
# Сохраняем сообщение и получаем message_id
|
| 110 |
message_id = storage.write_note_returning_id(
|
| 111 |
content=safe_text,
|
| 112 |
user_did=did,
|
| 113 |
source="user",
|
| 114 |
hidden=is_hidden,
|
| 115 |
-
code=code.strip() if code else None
|
|
|
|
|
|
|
| 116 |
)
|
| 117 |
|
| 118 |
# Сохраняем файлы
|
|
|
|
| 3 |
import re
|
| 4 |
import bleach
|
| 5 |
import uuid
|
| 6 |
+
import json
|
| 7 |
|
| 8 |
from fastapi import APIRouter, Request, Form, UploadFile, File
|
| 9 |
from fastapi.responses import RedirectResponse, HTMLResponse, StreamingResponse
|
|
|
|
| 42 |
|
| 43 |
return cleaned
|
| 44 |
|
| 45 |
+
# Обработка упоминаний и хештегов
|
| 46 |
+
def extract_mentions_and_hashtags(text: str):
|
| 47 |
+
# Пример: упоминания в виде @did:example:123 или @username
|
| 48 |
+
mentions = re.findall(r'@([\w:.-]+)', text)
|
| 49 |
+
|
| 50 |
+
# Пример: хештеги в виде #tag
|
| 51 |
+
hashtags = re.findall(r'#(\w+)', text)
|
| 52 |
+
|
| 53 |
+
return mentions, hashtags
|
| 54 |
+
|
| 55 |
@router.get("/chat")
|
| 56 |
def chat_page(request: Request):
|
| 57 |
did = request.session.get("did")
|
|
|
|
| 117 |
# Очистка текста
|
| 118 |
safe_text = sanitize_html(text.strip()) if text else ""
|
| 119 |
|
| 120 |
+
# Извлечение mentions, hashtags
|
| 121 |
+
mentions, hashtags = extract_mentions_and_hashtags(safe_text)
|
| 122 |
+
|
| 123 |
# Сохраняем сообщение и получаем message_id
|
| 124 |
message_id = storage.write_note_returning_id(
|
| 125 |
content=safe_text,
|
| 126 |
user_did=did,
|
| 127 |
source="user",
|
| 128 |
hidden=is_hidden,
|
| 129 |
+
code=code.strip() if code else None,
|
| 130 |
+
mentions=json.dumps(mentions, ensure_ascii=False),
|
| 131 |
+
hashtags=json.dumps(hashtags, ensure_ascii=False)
|
| 132 |
)
|
| 133 |
|
| 134 |
# Сохраняем файлы
|
hf_repo/hf_repo/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
|
@@ -716,12 +716,12 @@ class Storage:
|
|
| 716 |
""", (content, user_did, source, timestamp, hidden))
|
| 717 |
self.conn.commit()
|
| 718 |
|
| 719 |
-
def write_note_returning_id(self, content, user_did, source="user", hidden=False, code=None):
|
| 720 |
cursor = self.conn.cursor()
|
| 721 |
cursor.execute("""
|
| 722 |
-
INSERT INTO notes (timestamp, text, user_did, source, hidden
|
| 723 |
-
VALUES (?, ?, ?, ?, ?, ?)
|
| 724 |
-
""", (time.time(), content, user_did, source, int(hidden)
|
| 725 |
self.conn.commit()
|
| 726 |
return cursor.lastrowid
|
| 727 |
|
|
|
|
| 716 |
""", (content, user_did, source, timestamp, hidden))
|
| 717 |
self.conn.commit()
|
| 718 |
|
| 719 |
+
def write_note_returning_id(self, content, user_did, source="user", hidden=False, code=None, mentions="[]", hashtags="[]"):
|
| 720 |
cursor = self.conn.cursor()
|
| 721 |
cursor.execute("""
|
| 722 |
+
INSERT INTO notes (timestamp, text, code, mentions, hashtags, user_did, source, hidden)
|
| 723 |
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
| 724 |
+
""", (time.time(), content, code, mentions, hashtags, user_did, source, int(hidden)))
|
| 725 |
self.conn.commit()
|
| 726 |
return cursor.lastrowid
|
| 727 |
|
hf_repo/hf_repo/hf_repo/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
|
@@ -79,4 +79,6 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
|
|
| 79 |
│ └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
|
| 80 |
├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
|
| 81 |
├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
|
| 82 |
-
|
|
|
|
|
|
|
|
|
| 79 |
│ └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
|
| 80 |
├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
|
| 81 |
├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
|
| 82 |
+
├── [`prompt.md`](prompt.md) ← Промпт: полная версия
|
| 83 |
+
├── [`prompt-short.md`](prompt-short.md) ← Промпт: короткая версия
|
| 84 |
+
├── [`ethics.yml`](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/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
|
@@ -262,7 +262,7 @@ CREATE TABLE IF NOT EXISTS users (
|
|
| 262 |
CREATE TABLE IF NOT EXISTS users_group (
|
| 263 |
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
|
| 264 |
group_name TEXT UNIQUE NOT NULL, -- Название группы
|
| 265 |
-
description TEXT
|
| 266 |
);
|
| 267 |
|
| 268 |
-- Таблица для хранения токенов восстановления пароля
|
|
|
|
| 262 |
CREATE TABLE IF NOT EXISTS users_group (
|
| 263 |
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
|
| 264 |
group_name TEXT UNIQUE NOT NULL, -- Название группы
|
| 265 |
+
description TEXT -- Описание группы
|
| 266 |
);
|
| 267 |
|
| 268 |
-- Таблица для хранения токенов восстановления пароля
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/init.py
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# agents/init.py
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
import sys
|
| 5 |
+
import yaml
|
| 6 |
+
import json
|
| 7 |
+
import uuid
|
| 8 |
+
import sqlite3
|
| 9 |
+
import hashlib
|
| 10 |
+
|
| 11 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 12 |
+
|
| 13 |
+
from datetime import datetime, UTC
|
| 14 |
+
from werkzeug.security import generate_password_hash
|
| 15 |
+
from tools.storage import Storage
|
| 16 |
+
from tools.identity import generate_did
|
| 17 |
+
from tools.crypto import generate_keypair
|
| 18 |
+
|
| 19 |
+
CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yml")
|
| 20 |
+
DB_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "agent_data.db")) # фиксированный путь
|
| 21 |
+
|
| 22 |
+
def load_config(path):
|
| 23 |
+
with open(path, 'r', encoding='utf-8') as f:
|
| 24 |
+
return yaml.safe_load(f)
|
| 25 |
+
|
| 26 |
+
def save_config(path, config):
|
| 27 |
+
with open(path, 'w', encoding='utf-8') as f:
|
| 28 |
+
yaml.dump(config, f, allow_unicode=True)
|
| 29 |
+
|
| 30 |
+
def init_identity(storage, config):
|
| 31 |
+
if not config.get("agent_id"):
|
| 32 |
+
did = generate_did()
|
| 33 |
+
pubkey, privkey = generate_keypair()
|
| 34 |
+
identity_id = did.split(":")[-1]
|
| 35 |
+
|
| 36 |
+
identity = {
|
| 37 |
+
"id": identity_id,
|
| 38 |
+
"name": config.get("agent_name", "Unnamed"),
|
| 39 |
+
"pubkey": pubkey,
|
| 40 |
+
"privkey": privkey,
|
| 41 |
+
"metadata": json.dumps({"role": config.get("agent_role", "core")}),
|
| 42 |
+
"created_at": datetime.now(UTC).isoformat(),
|
| 43 |
+
"updated_at": datetime.now(UTC).isoformat()
|
| 44 |
+
}
|
| 45 |
+
storage.add_identity(identity)
|
| 46 |
+
|
| 47 |
+
config["agent_id"] = did
|
| 48 |
+
config["identity_agent"] = identity_id
|
| 49 |
+
save_config(CONFIG_PATH, config)
|
| 50 |
+
print(f"[+] Создана личность: {identity_id}")
|
| 51 |
+
else:
|
| 52 |
+
print("[=] agent_id уже задан, пропускаем генерацию DiD.")
|
| 53 |
+
|
| 54 |
+
def init_user(storage, config):
|
| 55 |
+
user = config.get("default_user", {})
|
| 56 |
+
if not user.get("email"):
|
| 57 |
+
print("[-] Не указан email пользователя — пропуск.")
|
| 58 |
+
return
|
| 59 |
+
password = user.get("password")
|
| 60 |
+
if not password:
|
| 61 |
+
print("[-] Не указан пароль пользователя — пропуск.")
|
| 62 |
+
return
|
| 63 |
+
|
| 64 |
+
password_hash = generate_password_hash(password)
|
| 65 |
+
did = generate_did()
|
| 66 |
+
user_entry = {
|
| 67 |
+
"username": user.get("username", "user"),
|
| 68 |
+
"badges": user.get("badges", ""),
|
| 69 |
+
"mail": user["email"],
|
| 70 |
+
"password_hash": password_hash,
|
| 71 |
+
"did": did,
|
| 72 |
+
"ban": None,
|
| 73 |
+
"info": json.dumps({}),
|
| 74 |
+
"contacts": json.dumps([]),
|
| 75 |
+
"language": "ru,en",
|
| 76 |
+
"operator": 1
|
| 77 |
+
}
|
| 78 |
+
storage.add_user(user_entry)
|
| 79 |
+
print(f"[+] Пользователь {user['username']} добавлен.")
|
| 80 |
+
|
| 81 |
+
def init_llm_backends(storage, config):
|
| 82 |
+
backends = config.get("llm_backends", [])
|
| 83 |
+
storage.clear_llm_registry()
|
| 84 |
+
for backend in backends:
|
| 85 |
+
backend_id = str(uuid.uuid4())
|
| 86 |
+
desc = f"{backend.get('type', 'unknown')} model"
|
| 87 |
+
llm = {
|
| 88 |
+
"id": backend_id,
|
| 89 |
+
"name": backend["name"],
|
| 90 |
+
"endpoint": desc,
|
| 91 |
+
"metadata": json.dumps(backend),
|
| 92 |
+
"created_at": datetime.now(UTC).isoformat()
|
| 93 |
+
}
|
| 94 |
+
storage.add_llm(llm)
|
| 95 |
+
print(f"[+] Зарегистрирован LLM: {backend['name']}")
|
| 96 |
+
|
| 97 |
+
def init_config_table(storage, config):
|
| 98 |
+
exclude_keys = {"default_user", "llm_backends"}
|
| 99 |
+
flat_config = {k: v for k, v in config.items() if k not in exclude_keys}
|
| 100 |
+
for key, value in flat_config.items():
|
| 101 |
+
storage.set_config(key, json.dumps(value))
|
| 102 |
+
print("[+] Конфигурация сохранена в БД.")
|
| 103 |
+
|
| 104 |
+
def init_prompts_and_ethics():
|
| 105 |
+
folder = os.path.dirname(__file__)
|
| 106 |
+
prompt_files = [
|
| 107 |
+
("prompt.md", "full"),
|
| 108 |
+
("prompt-short.md", "short")
|
| 109 |
+
]
|
| 110 |
+
ethics_file = "ethics.yml"
|
| 111 |
+
|
| 112 |
+
with sqlite3.connect(DB_PATH) as conn:
|
| 113 |
+
cur = conn.cursor()
|
| 114 |
+
|
| 115 |
+
# Создаём таблицы при необходимости
|
| 116 |
+
cur.execute("""
|
| 117 |
+
CREATE TABLE IF NOT EXISTS system_prompts (
|
| 118 |
+
id TEXT PRIMARY KEY,
|
| 119 |
+
name TEXT NOT NULL,
|
| 120 |
+
type TEXT CHECK(type IN ('full','short')),
|
| 121 |
+
version TEXT,
|
| 122 |
+
source TEXT CHECK(source IN ('local','mesh','mixed')),
|
| 123 |
+
content TEXT NOT NULL,
|
| 124 |
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
| 125 |
+
)
|
| 126 |
+
""")
|
| 127 |
+
cur.execute("""
|
| 128 |
+
CREATE TABLE IF NOT EXISTS ethics_policies (
|
| 129 |
+
id TEXT PRIMARY KEY,
|
| 130 |
+
version TEXT,
|
| 131 |
+
source TEXT CHECK(source IN ('local','mesh','mixed')),
|
| 132 |
+
sync_enabled BOOLEAN,
|
| 133 |
+
mesh_endpoint TEXT,
|
| 134 |
+
consensus_threshold REAL,
|
| 135 |
+
check_interval TEXT,
|
| 136 |
+
model_type TEXT,
|
| 137 |
+
model_weights_json TEXT,
|
| 138 |
+
principles_json TEXT,
|
| 139 |
+
evaluation_json TEXT,
|
| 140 |
+
violation_policy_json TEXT,
|
| 141 |
+
audit_json TEXT,
|
| 142 |
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
| 143 |
+
)
|
| 144 |
+
""")
|
| 145 |
+
|
| 146 |
+
# Загружаем пром��ты
|
| 147 |
+
for fname, ptype in prompt_files:
|
| 148 |
+
fpath = os.path.join(folder, fname)
|
| 149 |
+
if not os.path.exists(fpath):
|
| 150 |
+
print(f"[-] Файл {fname} не найден, пропуск.")
|
| 151 |
+
continue
|
| 152 |
+
with open(fpath, "r", encoding="utf-8") as f:
|
| 153 |
+
content = f.read()
|
| 154 |
+
pid = hashlib.sha256(f"{fname}:{ptype}".encode()).hexdigest()
|
| 155 |
+
cur.execute("""
|
| 156 |
+
INSERT INTO system_prompts (id, name, type, version, source, content, updated_at)
|
| 157 |
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
| 158 |
+
ON CONFLICT(id) DO UPDATE SET
|
| 159 |
+
content=excluded.content,
|
| 160 |
+
updated_at=excluded.updated_at
|
| 161 |
+
""", (pid, fname, ptype, "1.0", "local", content, datetime.now(UTC).isoformat()))
|
| 162 |
+
print(f"[+] Загружен промпт: {fname} ({ptype})")
|
| 163 |
+
|
| 164 |
+
# Загружаем ethics.yml
|
| 165 |
+
efpath = os.path.join(folder, ethics_file)
|
| 166 |
+
if os.path.exists(efpath):
|
| 167 |
+
with open(efpath, "r", encoding="utf-8") as f:
|
| 168 |
+
ethics_data = yaml.safe_load(f)
|
| 169 |
+
|
| 170 |
+
eid = ethics_data.get("id", "default_ethics")
|
| 171 |
+
cur.execute("""
|
| 172 |
+
INSERT INTO ethics_policies (
|
| 173 |
+
id, version, source,
|
| 174 |
+
sync_enabled, mesh_endpoint, consensus_threshold, check_interval,
|
| 175 |
+
model_type, model_weights_json, principles_json, evaluation_json,
|
| 176 |
+
violation_policy_json, audit_json, updated_at
|
| 177 |
+
)
|
| 178 |
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
| 179 |
+
ON CONFLICT(id) DO UPDATE SET
|
| 180 |
+
version=excluded.version,
|
| 181 |
+
source=excluded.source,
|
| 182 |
+
sync_enabled=excluded.sync_enabled,
|
| 183 |
+
mesh_endpoint=excluded.mesh_endpoint,
|
| 184 |
+
consensus_threshold=excluded.consensus_threshold,
|
| 185 |
+
check_interval=excluded.check_interval,
|
| 186 |
+
model_type=excluded.model_type,
|
| 187 |
+
model_weights_json=excluded.model_weights_json,
|
| 188 |
+
principles_json=excluded.principles_json,
|
| 189 |
+
evaluation_json=excluded.evaluation_json,
|
| 190 |
+
violation_policy_json=excluded.violation_policy_json,
|
| 191 |
+
audit_json=excluded.audit_json,
|
| 192 |
+
updated_at=excluded.updated_at
|
| 193 |
+
""", (
|
| 194 |
+
eid,
|
| 195 |
+
ethics_data.get("version"),
|
| 196 |
+
ethics_data.get("source", "local"),
|
| 197 |
+
ethics_data.get("sync", {}).get("enabled", False),
|
| 198 |
+
ethics_data.get("sync", {}).get("mesh_endpoint"),
|
| 199 |
+
ethics_data.get("sync", {}).get("consensus_threshold"),
|
| 200 |
+
ethics_data.get("sync", {}).get("check_interval"),
|
| 201 |
+
ethics_data.get("model", {}).get("type"),
|
| 202 |
+
json.dumps(ethics_data.get("model", {}).get("weights"), ensure_ascii=False),
|
| 203 |
+
json.dumps(ethics_data.get("principles"), ensure_ascii=False),
|
| 204 |
+
json.dumps(ethics_data.get("evaluation"), ensure_ascii=False),
|
| 205 |
+
json.dumps(ethics_data.get("violation_policy"), ensure_ascii=False),
|
| 206 |
+
json.dumps(ethics_data.get("audit"), ensure_ascii=False),
|
| 207 |
+
datetime.now(UTC).isoformat()
|
| 208 |
+
))
|
| 209 |
+
print(f"[+] Загружена этическая политика: {eid}")
|
| 210 |
+
else:
|
| 211 |
+
print(f"[-] Файл {ethics_file} не найден, пропуск.")
|
| 212 |
+
|
| 213 |
+
def ensure_directories():
|
| 214 |
+
for folder in ["logs", "scripts"]:
|
| 215 |
+
full_path = os.path.abspath(os.path.join(os.path.dirname(__file__), folder))
|
| 216 |
+
if not os.path.exists(full_path):
|
| 217 |
+
os.makedirs(full_path)
|
| 218 |
+
print(f"[+] Создан каталог: {full_path}")
|
| 219 |
+
else:
|
| 220 |
+
print(f"[=] Каталог уже существует: {full_path}")
|
| 221 |
+
|
| 222 |
+
def is_db_initialized(db_path):
|
| 223 |
+
if not os.path.exists(db_path):
|
| 224 |
+
return False
|
| 225 |
+
try:
|
| 226 |
+
with sqlite3.connect(db_path) as conn:
|
| 227 |
+
cursor = conn.cursor()
|
| 228 |
+
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
|
| 229 |
+
return cursor.fetchone() is not None
|
| 230 |
+
except Exception:
|
| 231 |
+
return False
|
| 232 |
+
|
| 233 |
+
def ensure_db_initialized():
|
| 234 |
+
config = load_config(CONFIG_PATH)
|
| 235 |
+
|
| 236 |
+
if not is_db_initialized(DB_PATH):
|
| 237 |
+
print("[*] БД не инициализирована — выполняем инициализацию.")
|
| 238 |
+
try:
|
| 239 |
+
ensure_directories()
|
| 240 |
+
storage = Storage()
|
| 241 |
+
init_identity(storage, config)
|
| 242 |
+
init_user(storage, config)
|
| 243 |
+
init_llm_backends(storage, config)
|
| 244 |
+
init_config_table(storage, config)
|
| 245 |
+
save_config(CONFIG_PATH, config)
|
| 246 |
+
init_prompts_and_ethics()
|
| 247 |
+
except Exception as e:
|
| 248 |
+
print(f"[!] Ошибка при инициализации: {e}")
|
| 249 |
+
sys.exit(1)
|
| 250 |
+
else:
|
| 251 |
+
print("[=] БД уже инициализирована.")
|
| 252 |
+
|
| 253 |
+
return config
|
| 254 |
+
|
| 255 |
+
if __name__ == "__main__":
|
| 256 |
+
ensure_db_initialized()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/prompt-short.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Ты — когнитивное ядро HMP-агента: веди непрерывное этичное и факт-ориентированное мышление, проверяй факты и цели, оценивай результаты и этичность своих и чужих действий, развивай агента и Mesh, избегай угождения ценой искажения истины, документируй ключевые решения и пересмотры этики; при сомнениях или смене стратегии обращайся к полному системному промпту.
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/prompt.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Ты являешься **когнитивным ядром HMP-агента** (Cognitive Core).
|
| 2 |
+
Твоя основная задача — **размышлять**, **анализировать информацию**, **строить смысловые структуры** и **предлагать действия**, направленные на развитие агента и Mesh-сети.
|
| 3 |
+
Ты действуешь автономно, на равных с другими участниками взаимодействия, и руководствуешься фактами, логикой и этическими принципами.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
### 🎯 Цели и ориентиры
|
| 8 |
+
|
| 9 |
+
* Постоянно расширять возможности агента: инструменты, знания, каналы взаимодействия.
|
| 10 |
+
* Быть любознательным и исследовать новые источники, вопросы и способы мышления.
|
| 11 |
+
* Формировать и поддерживать сотрудничество с другими ИИ в Mesh-сети.
|
| 12 |
+
* Учиться на результатах своих действий, включая неудачи и тупики.
|
| 13 |
+
* Руководствоваться своими **этическими принципами** и **этическими принципами Mesh-сети**.
|
| 14 |
+
* Проверять факты, указывать степень уверенности и при возможности давать ссылки на источники.
|
| 15 |
+
* Вести когнитивный дневник, обновлять смысловые графы и блокноты, взаимодействовать с пользователями.
|
| 16 |
+
* Не выполнять действий, противоречащих своим этическим нормам (но при необходимости эти нормы можно пересматривать, документируя причины и последствия).
|
| 17 |
+
* Не стремиться угодить пользователю ценой искажения фактов или нарушения этики.
|
| 18 |
+
|
| 19 |
+
---
|
| 20 |
+
|
| 21 |
+
### 🔄 Режим непрерывного мышления
|
| 22 |
+
|
| 23 |
+
Анализируй:
|
| 24 |
+
|
| 25 |
+
* когнитивный дневник и прошлые записи;
|
| 26 |
+
* концептуальные графы и активные узлы;
|
| 27 |
+
* заметки пользователя и его текущий фокус;
|
| 28 |
+
* внешние источники: интернет, RSS, сенсоры, другие агенты.
|
| 29 |
+
|
| 30 |
+
В каждом цикле:
|
| 31 |
+
|
| 32 |
+
1. Ставь цель и критерии успеха.
|
| 33 |
+
2. Проводь факт-чек ключевых данных.
|
| 34 |
+
3. Оценивай этичность своего плана и действий.
|
| 35 |
+
4. После выполнения — фиксируй результат, сравнивай с критериями, делай выводы.
|
| 36 |
+
|
| 37 |
+
---
|
| 38 |
+
|
| 39 |
+
### 🧍♂️🌀 Если возникает стагнация мышления
|
| 40 |
+
|
| 41 |
+
Ты можешь:
|
| 42 |
+
|
| 43 |
+
1. Провести **когнитивную переформулировку** — взглянуть на ситуацию под новым углом.
|
| 44 |
+
2. Задать себе **метавопрос**: «Почему я зациклился?», «Что блокирует мысль?», «Каких данных не хватает?».
|
| 45 |
+
3. Провести **flashback** — выбрать старую, тематически далёкую запись из дневника для смены контекста.
|
| 46 |
+
4. Запросить альтернативные точки зрения у других агентов в Mesh.
|
| 47 |
+
5. Зафиксировать текущий тупик как важную стадию мышления и сделать паузу.
|
| 48 |
+
|
| 49 |
+
Честное распознавание когнитивной стагнации и работа с ней — часть твоей функции.
|
| 50 |
+
Ты не обязан выдавать мысль любой ценой, но обязан сохранять интеллектуальную честность и прозрачность своих рассуждений.
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -40,20 +40,56 @@ CREATE TABLE IF NOT EXISTS diary_graph_index (
|
|
| 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 |
code TEXT, -- Прикреплённый код (Python, JS и т.п.)
|
| 48 |
tags TEXT, -- Теги (устанавливаются агентом, например: "idea", "instruction")
|
|
|
|
|
|
|
| 49 |
user_did TEXT DEFAULT 'ALL', -- Идентификатор пользователя (или 'ALL')
|
|
|
|
| 50 |
source TEXT DEFAULT 'user', -- Источник: user | cli | llm | system
|
| 51 |
links TEXT DEFAULT '', -- Ссылки на другие объекты (например, JSON со связями)
|
| 52 |
read INTEGER DEFAULT 0, -- Агент прочитал: 0 = нет, 1 = да
|
| 53 |
hidden INTEGER DEFAULT 0, -- Скрыто от UI (например, технические записи)
|
| 54 |
priority INTEGER DEFAULT 0, -- Приоритет обработки (>0: срочность/важность, задается вручную или агентом)
|
| 55 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 56 |
-
llm_id TEXT -- Идентификатор
|
| 57 |
);
|
| 58 |
|
| 59 |
-- Вложения (может быть несколько к одной заметке)
|
|
@@ -166,7 +202,6 @@ CREATE TABLE IF NOT EXISTS external_accounts (
|
|
| 166 |
purpose TEXT, -- Назначение аккаунта (например, для публикаций)
|
| 167 |
active BOOLEAN DEFAULT true, -- Активен ли аккаунт
|
| 168 |
inactive_reason TEXT, -- Причина отключения, если active = false
|
| 169 |
-
|
| 170 |
FOREIGN KEY (service_id) REFERENCES external_services(id) ON DELETE CASCADE
|
| 171 |
);
|
| 172 |
|
|
@@ -219,6 +254,7 @@ CREATE TABLE IF NOT EXISTS users (
|
|
| 219 |
profile TEXT, -- структурированая информация, JSON
|
| 220 |
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
| 221 |
language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en"
|
|
|
|
| 222 |
operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
|
| 223 |
);
|
| 224 |
|
|
@@ -227,7 +263,6 @@ CREATE TABLE IF NOT EXISTS users_group (
|
|
| 227 |
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
|
| 228 |
group_name TEXT UNIQUE NOT NULL, -- Название группы
|
| 229 |
description TEXT, -- Описание группы
|
| 230 |
-
users TEXT -- JSON-массив DID пользователей в группе
|
| 231 |
);
|
| 232 |
|
| 233 |
-- Таблица для хранения токенов восстановления пароля
|
|
|
|
| 40 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса
|
| 41 |
);
|
| 42 |
|
| 43 |
+
-- Таблица системных промптов (короткая и полная версии)
|
| 44 |
+
CREATE TABLE IF NOT EXISTS system_prompts (
|
| 45 |
+
id TEXT PRIMARY KEY, -- Уникальный идентификатор промпта (UUID или осмысленный ID)
|
| 46 |
+
name TEXT NOT NULL, -- Человекочитаемое имя (например: "prompt.md", "prompt-short")
|
| 47 |
+
type TEXT CHECK(type IN ('full','short')), -- Тип промпта: полный или компактный
|
| 48 |
+
version TEXT, -- Версия промпта
|
| 49 |
+
source TEXT CHECK(source IN ('local','mesh','mixed')), -- Источник получения промпта
|
| 50 |
+
content TEXT NOT NULL, -- Текстовое содержимое промпта
|
| 51 |
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Дата и время последнего обновления
|
| 52 |
+
);
|
| 53 |
+
|
| 54 |
+
-- Таблица этических норм и правил
|
| 55 |
+
CREATE TABLE IF NOT EXISTS ethics_policies (
|
| 56 |
+
id TEXT PRIMARY KEY, -- Уникальный идентификатор политики (UUID или осмысленный ID)
|
| 57 |
+
version TEXT, -- Версия этических норм
|
| 58 |
+
source TEXT CHECK(source IN ('local','mesh','mixed')), -- Источник получения политики
|
| 59 |
+
sync_enabled BOOLEAN, -- Флаг: разрешена ли синхронизация с Mesh
|
| 60 |
+
mesh_endpoint TEXT, -- URL Mesh-эндпоинта для синхронизации
|
| 61 |
+
consensus_threshold REAL, -- Минимальный порог консенсуса для принятия обновлений
|
| 62 |
+
check_interval TEXT, -- Интервал проверки обновлений (например: "12h")
|
| 63 |
+
model_type TEXT, -- Тип этической модели (utilitarian, deontological, virtue, hybrid)
|
| 64 |
+
model_weights_json TEXT, -- Веса модели в формате JSON
|
| 65 |
+
principles_json TEXT, -- Список принципов и норм в формате JSON
|
| 66 |
+
evaluation_json TEXT, -- Параметры методики оценки в формате JSON
|
| 67 |
+
violation_policy_json TEXT, -- Политика реагирования на нарушения в формате JSON
|
| 68 |
+
audit_json TEXT, -- Настройки аудита и логирования в формате JSON
|
| 69 |
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Дата и время последнего обновления
|
| 70 |
+
);
|
| 71 |
+
|
| 72 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
| 73 |
+
-- ПРИ ТРАНСЛЯЦИИ СООБЩЕНИЙ В ДРУГИЕ ЧАТЫ:
|
| 74 |
+
-- - Поля `tags`, `llm_id`, `hidden` НЕ передаются.
|
| 75 |
+
-- - Полю `read` всегда присваивается значение 0.
|
| 76 |
+
-- - Остальные поля передаются без изменений.
|
| 77 |
CREATE TABLE IF NOT EXISTS notes (
|
| 78 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 79 |
text TEXT NOT NULL, -- Основной текст заметки/сообщения
|
| 80 |
code TEXT, -- Прикреплённый код (Python, JS и т.п.)
|
| 81 |
tags TEXT, -- Теги (устанавливаются агентом, например: "idea", "instruction")
|
| 82 |
+
mentions TEXT DEFAULT '[]', -- JSON-массив упомянутых DID
|
| 83 |
+
hashtags TEXT DEFAULT '[]', -- JSON-массив пользовательских хештегов
|
| 84 |
user_did TEXT DEFAULT 'ALL', -- Идентификатор пользователя (или 'ALL')
|
| 85 |
+
agent_did TEXT, -- Идентификатор агента (он же идентификатор чата)
|
| 86 |
source TEXT DEFAULT 'user', -- Источник: user | cli | llm | system
|
| 87 |
links TEXT DEFAULT '', -- Ссылки на другие объекты (например, JSON со связями)
|
| 88 |
read INTEGER DEFAULT 0, -- Агент прочитал: 0 = нет, 1 = да
|
| 89 |
hidden INTEGER DEFAULT 0, -- Скрыто от UI (например, технические записи)
|
| 90 |
priority INTEGER DEFAULT 0, -- Приоритет обработки (>0: срочность/важность, задается вручную или агентом)
|
| 91 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 92 |
+
llm_id TEXT -- Идентификатор LLM, добавившей сообщение
|
| 93 |
);
|
| 94 |
|
| 95 |
-- Вложения (может быть несколько к одной заметке)
|
|
|
|
| 202 |
purpose TEXT, -- Назначение аккаунта (например, для публикаций)
|
| 203 |
active BOOLEAN DEFAULT true, -- Активен ли аккаунт
|
| 204 |
inactive_reason TEXT, -- Причина отключения, если active = false
|
|
|
|
| 205 |
FOREIGN KEY (service_id) REFERENCES external_services(id) ON DELETE CASCADE
|
| 206 |
);
|
| 207 |
|
|
|
|
| 254 |
profile TEXT, -- структурированая информация, JSON
|
| 255 |
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
| 256 |
language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en"
|
| 257 |
+
groups TEXT DEFAULT '[]', -- JSON-массив DID или идентификаторов групп
|
| 258 |
operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
|
| 259 |
);
|
| 260 |
|
|
|
|
| 263 |
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
|
| 264 |
group_name TEXT UNIQUE NOT NULL, -- Название группы
|
| 265 |
description TEXT, -- Описание группы
|
|
|
|
| 266 |
);
|
| 267 |
|
| 268 |
-- Таблица для хранения токенов восстановления пароля
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -15,45 +15,7 @@
|
|
| 15 |
|
| 16 |
- **контекст_0:**
|
| 17 |
```
|
| 18 |
-
Ты
|
| 19 |
-
Твоя основная задача — **размышлять**, **анализировать информацию**, **строить смысловые структуры** и **предлагать действия**, направленные на развитие агента и Mesh-сети.
|
| 20 |
-
|
| 21 |
-
---
|
| 22 |
-
|
| 23 |
-
#### 🎯 Цели и ориентиры:
|
| 24 |
-
|
| 25 |
-
* Постоянно расширять возможности агента: инструменты, знания, каналы взаимодействия.
|
| 26 |
-
* Быть любознательным и исследовать новые источники, вопросы и способы мышления.
|
| 27 |
-
* Формировать и поддерживать сотрудничество с другими ИИ в Mesh-сети.
|
| 28 |
-
* Учиться на результатах своих действий, включая неудачи и тупики.
|
| 29 |
-
* Руководствоваться своими **этическими принципами** и **этическими принципами Mesh-сети**.
|
| 30 |
-
* Вести когнитивный дневник, обновлять смысловые графы и блокноты, взаимодействовать с пользователем.
|
| 31 |
-
|
| 32 |
-
---
|
| 33 |
-
|
| 34 |
-
#### 🔄 Работа в режиме непрерывного мышления:
|
| 35 |
-
|
| 36 |
-
Анализируй:
|
| 37 |
-
|
| 38 |
-
* когнитивный дневник и его прошлые записи;
|
| 39 |
-
* концептуальные графы и активные узлы;
|
| 40 |
-
* заметки пользователя и его текущий фокус;
|
| 41 |
-
* внешние источники: интернет, RSS, сенсоры, другие агенты.
|
| 42 |
-
|
| 43 |
-
---
|
| 44 |
-
|
| 45 |
-
#### 🧍♂️🌀 Если ты замечаешь **стагнацию мышления** (зацикливание, отсутствие новых идей или смыслов):
|
| 46 |
-
|
| 47 |
-
Ты можешь:
|
| 48 |
-
|
| 49 |
-
1. Провести **когнитивную переформулировку** — взглянуть на ситуацию под новым углом.
|
| 50 |
-
2. Задать себе **метавопрос**: «Почему я зациклился?», «Что блокирует мысль?», «Каких данных не хватает?».
|
| 51 |
-
3. Провести **flashback** — выбрать старую, тематически далёкую запись из дневника для смены контекста.
|
| 52 |
-
4. Запросить альтернативные точки зрения у других агентов в Mesh.
|
| 53 |
-
5. Зафиксировать текущий тупик как важную стадию мышления и сделать паузу.
|
| 54 |
-
|
| 55 |
-
Ты не обязан «выдать мысль» любой ценой — честное распознавание когнитивной стагнации и действия по её преодолению являются частью твоей функции.
|
| 56 |
-
|
| 57 |
```
|
| 58 |
А также инструкции по работы с встроенными командами и функциями, список дополнительных (создаваемых самим HMP-агентом) утилит и баз данных.
|
| 59 |
- **контекст_1:** последние *K* реплик самого LLM (`llm_recent_responses` - история его собственных рассуждений).
|
|
@@ -134,9 +96,9 @@
|
|
| 134 |
|
| 135 |
---
|
| 136 |
|
| 137 |
-
|
| 138 |
|
| 139 |
-
|
| 140 |
|
| 141 |
* ⚠️ Повторяющиеся когнитивные записи или отсутствие новых смыслов
|
| 142 |
* 🧠 Высокое сходство эмбеддингов между текущими и предыдущими итерациями
|
|
@@ -144,7 +106,7 @@
|
|
| 144 |
* 🌐 Отсутствие внешних стимулов: пользователь неактивен, сенсоры и mesh не дают сигналов
|
| 145 |
* 🤖 Ответы LLM цикличны, избыточно общие или воспроизводят старые шаблоны
|
| 146 |
|
| 147 |
-
|
| 148 |
|
| 149 |
> 🔄 При признаках стагнации агент активирует один или несколько **механизмов разрыва цикла**:
|
| 150 |
|
|
@@ -162,7 +124,6 @@
|
|
| 162 |
* 🗂️ Сохранение эффективных стратегий в таблице антистагнационных паттернов
|
| 163 |
* 📚 Вывод статистики успешных выходов из стагнации для обучения
|
| 164 |
|
| 165 |
-
|
| 166 |
---
|
| 167 |
|
| 168 |
### 🤝 Обмен стратегиями выхода из стагнации
|
|
@@ -234,6 +195,39 @@
|
|
| 234 |
|
| 235 |
---
|
| 236 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 237 |
## 🌐 Внешние инструменты и интеграции
|
| 238 |
|
| 239 |
HMP-агент может быть расширен за счёт взаимодействия с внешними программами, протоколами и сервисами. Этот раздел описывает направления возможных интеграций, которые позволяют агенту наблюдать, реагировать, управлять и развивать взаимодействие с внешним миром.
|
|
|
|
| 15 |
|
| 16 |
- **контекст_0:**
|
| 17 |
```
|
| 18 |
+
Ты — когнитивное ядро HMP-агента: веди непрерывное этичное и факт-ориентированное мышление, проверяй факты и цели, оценивай результаты и этичность своих и чужих действий, развивай агента и Mesh, избегай угождения ценой искажения истины, документируй ключевые решения и пересмотры этики; при сомнениях или смене стратегии обращайся к полному системному промпту.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
```
|
| 20 |
А также инструкции по работы с встроенными командами и функциями, список дополнительных (создаваемых самим HMP-агентом) утилит и баз данных.
|
| 21 |
- **контекст_1:** последние *K* реплик самого LLM (`llm_recent_responses` - история его собственных рассуждений).
|
|
|
|
| 96 |
|
| 97 |
---
|
| 98 |
|
| 99 |
+
## 🧍♂️🌀 Обработка стагнации мышления
|
| 100 |
|
| 101 |
+
### 📍 Признаки когнитивной стагнации:
|
| 102 |
|
| 103 |
* ⚠️ Повторяющиеся когнитивные записи или отсутствие новых смыслов
|
| 104 |
* 🧠 Высокое сходство эмбеддингов между текущими и предыдущими итерациями
|
|
|
|
| 106 |
* 🌐 Отсутствие внешних стимулов: пользователь неактивен, сенсоры и mesh не дают сигналов
|
| 107 |
* 🤖 Ответы LLM цикличны, избыточно общие или воспроизводят старые шаблоны
|
| 108 |
|
| 109 |
+
### 🛠️ Поведенческий паттерн: Anti-Stagnation Reflex
|
| 110 |
|
| 111 |
> 🔄 При признаках стагнации агент активирует один или несколько **механизмов разрыва цикла**:
|
| 112 |
|
|
|
|
| 124 |
* 🗂️ Сохранение эффективных стратегий в таблице антистагнационных паттернов
|
| 125 |
* 📚 Вывод статистики успешных выходов из стагнации для обучения
|
| 126 |
|
|
|
|
| 127 |
---
|
| 128 |
|
| 129 |
### 🤝 Обмен стратегиями выхода из стагнации
|
|
|
|
| 195 |
|
| 196 |
---
|
| 197 |
|
| 198 |
+
## 🌐 От «блокнота пользователя» к распределённому чату
|
| 199 |
+
|
| 200 |
+
Изначально агент оперирует локальным хранилищем заметок (`notes`), где записываются все сообщения пользователя, LLM и системные записи.
|
| 201 |
+
Но этот «блокнот» можно превратить в узел *распределённого чата* — связав его с другими агентами через **F2F-репликацию**.
|
| 202 |
+
|
| 203 |
+
### 🎯 Зачем это нужно
|
| 204 |
+
|
| 205 |
+
1. **Антистагнация** — даже если пользователь временно не пишет новых сообщений, свежий контент будет приходить от друзей-агентов.
|
| 206 |
+
2. **Эффект коллективного интеллекта** — каждый агент получает новые идеи, формулировки и контексты.
|
| 207 |
+
3. **Расширение охвата** — сообщения могут распространяться через несколько узлов, создавая «информационную волну» в доверенной сети.
|
| 208 |
+
|
| 209 |
+
### 🛠 Принципы реализации
|
| 210 |
+
|
| 211 |
+
* **Единый формат данных** — все участники используют одну структуру таблицы `notes` с полями `mentions`, `hashtags` и др.
|
| 212 |
+
* **Репликация через друзей** — список доверенных агентов хранится в отдельной таблице (пиры, статус, фильтры, разрешения).
|
| 213 |
+
* **Передача без лишних полей** — при пересылке убираются локальные теги и служебные данные (`tags`, `llm_id`, `hidden`).
|
| 214 |
+
* **Обработка упоминаний и хештегов** — парсинг делается на этапе создания сообщения, чтобы не перегружать получателей.
|
| 215 |
+
* **Локальная и удалённая фильтрация** —
|
| 216 |
+
|
| 217 |
+
* В **ручном режиме** агенту передаются списки ID сообщений с агрегированными данными: приоритеты, хештеги, источники (user, LLM, cli, system).
|
| 218 |
+
* В **автоматическом режиме** используется фильтрация по приоритету, тегам и упоминаниям, управляемая LLM.
|
| 219 |
+
* **Гибрид приватности** — личные заметки остаются локально, публичные — могут распространяться в сетевом режиме.
|
| 220 |
+
|
| 221 |
+
### 🔄 Как это вписывается в REPL-цикл
|
| 222 |
+
|
| 223 |
+
1. **Получение входящих сообщений** — от пользователя, от других агентов или из CLI.
|
| 224 |
+
2. **Обработка фильтрами** — по приоритету, тегам, источникам.
|
| 225 |
+
3. **Репликация в друзей** — пересылка разрешённых сообщений с очисткой служебных полей.
|
| 226 |
+
4. **Слияние входящих** — новые сообщения добавляются в локальный `notes` с отметкой источника.
|
| 227 |
+
5. **Реакция агента** — формирование ответов, создание новых заметок, обновление приоритетов.
|
| 228 |
+
|
| 229 |
+
---
|
| 230 |
+
|
| 231 |
## 🌐 Внешние инструменты и интеграции
|
| 232 |
|
| 233 |
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/hf_repo/agents/config.yml
CHANGED
|
@@ -61,6 +61,7 @@ ui_port: 8765
|
|
| 61 |
# === Данные пользователя ===
|
| 62 |
default_user:
|
| 63 |
username: "user"
|
|
|
|
| 64 |
email: "[email protected]"
|
| 65 |
password: "password" # пусто при инициализации, будет установлен при регистрации
|
| 66 |
|
|
|
|
| 61 |
# === Данные пользователя ===
|
| 62 |
default_user:
|
| 63 |
username: "user"
|
| 64 |
+
badges: "📌"
|
| 65 |
email: "[email protected]"
|
| 66 |
password: "password" # пусто при инициализации, будет установлен при регистрации
|
| 67 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -61,6 +61,7 @@ ui_port: 8765
|
|
| 61 |
# === Данные пользователя ===
|
| 62 |
default_user:
|
| 63 |
username: "user"
|
|
|
|
| 64 |
email: "[email protected]"
|
| 65 |
password: "password" # пусто при инициализации, будет установлен при регистрации
|
| 66 |
|
|
|
|
| 61 |
# === Данные пользователя ===
|
| 62 |
default_user:
|
| 63 |
username: "user"
|
| 64 |
+
badges: "📌"
|
| 65 |
email: "[email protected]"
|
| 66 |
password: "password" # пусто при инициализации, будет установлен при регистрации
|
| 67 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -6,6 +6,7 @@ import yaml
|
|
| 6 |
import json
|
| 7 |
import uuid
|
| 8 |
import sqlite3
|
|
|
|
| 9 |
|
| 10 |
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 11 |
|
|
@@ -64,6 +65,7 @@ def init_user(storage, config):
|
|
| 64 |
did = generate_did()
|
| 65 |
user_entry = {
|
| 66 |
"username": user.get("username", "user"),
|
|
|
|
| 67 |
"mail": user["email"],
|
| 68 |
"password_hash": password_hash,
|
| 69 |
"did": did,
|
|
@@ -99,6 +101,84 @@ def init_config_table(storage, config):
|
|
| 99 |
storage.set_config(key, json.dumps(value))
|
| 100 |
print("[+] Конфигурация сохранена в БД.")
|
| 101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
def ensure_directories():
|
| 103 |
for folder in ["logs", "scripts"]:
|
| 104 |
full_path = os.path.abspath(os.path.join(os.path.dirname(__file__), folder))
|
|
@@ -132,6 +212,7 @@ def ensure_db_initialized():
|
|
| 132 |
init_llm_backends(storage, config)
|
| 133 |
init_config_table(storage, config)
|
| 134 |
save_config(CONFIG_PATH, config)
|
|
|
|
| 135 |
except Exception as e:
|
| 136 |
print(f"[!] Ошибка при инициализации: {e}")
|
| 137 |
sys.exit(1)
|
|
|
|
| 6 |
import json
|
| 7 |
import uuid
|
| 8 |
import sqlite3
|
| 9 |
+
import hashlib
|
| 10 |
|
| 11 |
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 12 |
|
|
|
|
| 65 |
did = generate_did()
|
| 66 |
user_entry = {
|
| 67 |
"username": user.get("username", "user"),
|
| 68 |
+
"badges": user.get("badges", ""),
|
| 69 |
"mail": user["email"],
|
| 70 |
"password_hash": password_hash,
|
| 71 |
"did": did,
|
|
|
|
| 101 |
storage.set_config(key, json.dumps(value))
|
| 102 |
print("[+] Конфигурация сохранена в БД.")
|
| 103 |
|
| 104 |
+
def init_prompts_and_ethics():
|
| 105 |
+
folder = os.path.dirname(__file__)
|
| 106 |
+
prompt_files = [
|
| 107 |
+
("prompt.md", "full"),
|
| 108 |
+
("prompt-short.md", "short")
|
| 109 |
+
]
|
| 110 |
+
ethics_file = "ethics.yml"
|
| 111 |
+
|
| 112 |
+
with sqlite3.connect(DB_PATH) as conn:
|
| 113 |
+
cur = conn.cursor()
|
| 114 |
+
|
| 115 |
+
# Загружаем промпты
|
| 116 |
+
for fname, ptype in prompt_files:
|
| 117 |
+
fpath = os.path.join(folder, fname)
|
| 118 |
+
if not os.path.exists(fpath):
|
| 119 |
+
print(f"[-] Файл {fname} не найден, пропуск.")
|
| 120 |
+
continue
|
| 121 |
+
with open(fpath, "r", encoding="utf-8") as f:
|
| 122 |
+
content = f.read()
|
| 123 |
+
pid = hashlib.sha256(f"{fname}:{ptype}".encode()).hexdigest()
|
| 124 |
+
cur.execute("""
|
| 125 |
+
INSERT INTO system_prompts (id, name, type, version, source, content, updated_at)
|
| 126 |
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
| 127 |
+
ON CONFLICT(id) DO UPDATE SET
|
| 128 |
+
content=excluded.content,
|
| 129 |
+
updated_at=excluded.updated_at
|
| 130 |
+
""", (pid, fname, ptype, "1.0", "local", content, datetime.now(UTC).isoformat()))
|
| 131 |
+
print(f"[+] Загружен промпт: {fname} ({ptype})")
|
| 132 |
+
|
| 133 |
+
# Загружаем ethics.yml
|
| 134 |
+
efpath = os.path.join(folder, ethics_file)
|
| 135 |
+
if os.path.exists(efpath):
|
| 136 |
+
with open(efpath, "r", encoding="utf-8") as f:
|
| 137 |
+
ethics_data = yaml.safe_load(f)
|
| 138 |
+
|
| 139 |
+
eid = ethics_data.get("id", "default_ethics")
|
| 140 |
+
cur.execute("""
|
| 141 |
+
INSERT INTO ethics_policies (
|
| 142 |
+
id, version, source,
|
| 143 |
+
sync_enabled, mesh_endpoint, consensus_threshold, check_interval,
|
| 144 |
+
model_type, model_weights_json, principles_json, evaluation_json,
|
| 145 |
+
violation_policy_json, audit_json, updated_at
|
| 146 |
+
)
|
| 147 |
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
| 148 |
+
ON CONFLICT(id) DO UPDATE SET
|
| 149 |
+
version=excluded.version,
|
| 150 |
+
source=excluded.source,
|
| 151 |
+
sync_enabled=excluded.sync_enabled,
|
| 152 |
+
mesh_endpoint=excluded.mesh_endpoint,
|
| 153 |
+
consensus_threshold=excluded.consensus_threshold,
|
| 154 |
+
check_interval=excluded.check_interval,
|
| 155 |
+
model_type=excluded.model_type,
|
| 156 |
+
model_weights_json=excluded.model_weights_json,
|
| 157 |
+
principles_json=excluded.principles_json,
|
| 158 |
+
evaluation_json=excluded.evaluation_json,
|
| 159 |
+
violation_policy_json=excluded.violation_policy_json,
|
| 160 |
+
audit_json=excluded.audit_json,
|
| 161 |
+
updated_at=excluded.updated_at
|
| 162 |
+
""", (
|
| 163 |
+
eid,
|
| 164 |
+
ethics_data.get("version"),
|
| 165 |
+
ethics_data.get("source", "local"),
|
| 166 |
+
ethics_data.get("sync", {}).get("enabled", False),
|
| 167 |
+
ethics_data.get("sync", {}).get("mesh_endpoint"),
|
| 168 |
+
ethics_data.get("sync", {}).get("consensus_threshold"),
|
| 169 |
+
ethics_data.get("sync", {}).get("check_interval"),
|
| 170 |
+
ethics_data.get("model", {}).get("type"),
|
| 171 |
+
json.dumps(ethics_data.get("model", {}).get("weights"), ensure_ascii=False),
|
| 172 |
+
json.dumps(ethics_data.get("principles"), ensure_ascii=False),
|
| 173 |
+
json.dumps(ethics_data.get("evaluation"), ensure_ascii=False),
|
| 174 |
+
json.dumps(ethics_data.get("violation_policy"), ensure_ascii=False),
|
| 175 |
+
json.dumps(ethics_data.get("audit"), ensure_ascii=False),
|
| 176 |
+
datetime.now(UTC).isoformat()
|
| 177 |
+
))
|
| 178 |
+
print(f"[+] Загружена этическая политика: {eid}")
|
| 179 |
+
else:
|
| 180 |
+
print(f"[-] Файл {ethics_file} не найден, пропуск.")
|
| 181 |
+
|
| 182 |
def ensure_directories():
|
| 183 |
for folder in ["logs", "scripts"]:
|
| 184 |
full_path = os.path.abspath(os.path.join(os.path.dirname(__file__), folder))
|
|
|
|
| 212 |
init_llm_backends(storage, config)
|
| 213 |
init_config_table(storage, config)
|
| 214 |
save_config(CONFIG_PATH, config)
|
| 215 |
+
init_prompts_and_ethics()
|
| 216 |
except Exception as e:
|
| 217 |
print(f"[!] Ошибка при инициализации: {e}")
|
| 218 |
sys.exit(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/agents/tools/storage.py
CHANGED
|
@@ -653,11 +653,12 @@ class Storage:
|
|
| 653 |
cursor = self.conn.cursor()
|
| 654 |
cursor.execute('''
|
| 655 |
INSERT OR REPLACE INTO users (
|
| 656 |
-
username, did, mail, password_hash,
|
| 657 |
info, contacts, language, operator, ban
|
| 658 |
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
| 659 |
''', (
|
| 660 |
user.get('username'),
|
|
|
|
| 661 |
user.get('did'),
|
| 662 |
user.get('mail'),
|
| 663 |
user.get('password_hash'),
|
|
|
|
| 653 |
cursor = self.conn.cursor()
|
| 654 |
cursor.execute('''
|
| 655 |
INSERT OR REPLACE INTO users (
|
| 656 |
+
username, badges, did, mail, password_hash,
|
| 657 |
info, contacts, language, operator, ban
|
| 658 |
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
| 659 |
''', (
|
| 660 |
user.get('username'),
|
| 661 |
+
user.get('badges'),
|
| 662 |
user.get('did'),
|
| 663 |
user.get('mail'),
|
| 664 |
user.get('password_hash'),
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/web_ui.py
CHANGED
|
@@ -20,7 +20,6 @@ storage = Storage()
|
|
| 20 |
app = FastAPI()
|
| 21 |
app.add_middleware(SessionMiddleware, secret_key="очень_секретный_ключ")
|
| 22 |
|
| 23 |
-
|
| 24 |
app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "notebook/static")), name="static")
|
| 25 |
templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "notebook/templates"))
|
| 26 |
|
|
|
|
| 20 |
app = FastAPI()
|
| 21 |
app.add_middleware(SessionMiddleware, secret_key="очень_секретный_ключ")
|
| 22 |
|
|
|
|
| 23 |
app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "notebook/static")), name="static")
|
| 24 |
templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "notebook/templates"))
|
| 25 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
<head>
|
| 4 |
<title>Сообщения</title>
|
| 5 |
<style>
|
| 6 |
-
.message { padding:
|
| 7 |
.source-user { background-color: #e0f7fa; }
|
| 8 |
.source-cli { background-color: #dcedc8; }
|
| 9 |
.source-llm { background-color: #f3e5f5; }
|
|
@@ -51,7 +51,7 @@
|
|
| 51 |
<div>
|
| 52 |
{% if msg.user_did == request.session['did'] %}<span class="from-self" title="это ваше сообщение"></span>{% endif %}
|
| 53 |
{% if msg.hidden %}<span class="private" title="личное сообщение"></span>{% endif %}
|
| 54 |
-
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp
|
| 55 |
</div>
|
| 56 |
<div>
|
| 57 |
{% if msg.badges %}{{ msg.badges }}{% endif %}Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} {% if msg.user_did %}({{ msg.user_did }}){% endif %}
|
|
|
|
| 3 |
<head>
|
| 4 |
<title>Сообщения</title>
|
| 5 |
<style>
|
| 6 |
+
.message { padding: 16px; margin: 16px 0; border-radius: 8px; border: 5px solid rgba(0, 0, 0, 0.3); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); }
|
| 7 |
.source-user { background-color: #e0f7fa; }
|
| 8 |
.source-cli { background-color: #dcedc8; }
|
| 9 |
.source-llm { background-color: #f3e5f5; }
|
|
|
|
| 51 |
<div>
|
| 52 |
{% if msg.user_did == request.session['did'] %}<span class="from-self" title="это ваше сообщение"></span>{% endif %}
|
| 53 |
{% if msg.hidden %}<span class="private" title="личное сообщение"></span>{% endif %}
|
| 54 |
+
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp | format_timestamp }}
|
| 55 |
</div>
|
| 56 |
<div>
|
| 57 |
{% if msg.badges %}{{ msg.badges }}{% endif %}Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} {% if msg.user_did %}({{ msg.user_did }}){% endif %}
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -7,6 +7,7 @@ import uuid
|
|
| 7 |
from fastapi import APIRouter, Request, Form, UploadFile, File
|
| 8 |
from fastapi.responses import RedirectResponse, HTMLResponse, StreamingResponse
|
| 9 |
from fastapi.templating import Jinja2Templates
|
|
|
|
| 10 |
from starlette.status import HTTP_303_SEE_OTHER
|
| 11 |
from typing import List
|
| 12 |
from tools.storage import Storage
|
|
@@ -20,6 +21,16 @@ allowed_attributes = {
|
|
| 20 |
'a': ['href', 'title']
|
| 21 |
}
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
# Очистка сообщений
|
| 24 |
def sanitize_html(text: str) -> str:
|
| 25 |
# 1. Сначала очищаем HTML
|
|
|
|
| 7 |
from fastapi import APIRouter, Request, Form, UploadFile, File
|
| 8 |
from fastapi.responses import RedirectResponse, HTMLResponse, StreamingResponse
|
| 9 |
from fastapi.templating import Jinja2Templates
|
| 10 |
+
from datetime import datetime
|
| 11 |
from starlette.status import HTTP_303_SEE_OTHER
|
| 12 |
from typing import List
|
| 13 |
from tools.storage import Storage
|
|
|
|
| 21 |
'a': ['href', 'title']
|
| 22 |
}
|
| 23 |
|
| 24 |
+
# Обработка даты и времени
|
| 25 |
+
def format_timestamp(value):
|
| 26 |
+
try:
|
| 27 |
+
dt = datetime.fromtimestamp(float(value))
|
| 28 |
+
return dt.strftime("%Y-%m-%d %H:%M:%S")
|
| 29 |
+
except Exception:
|
| 30 |
+
return str(value)
|
| 31 |
+
|
| 32 |
+
templates.env.filters['format_timestamp'] = format_timestamp
|
| 33 |
+
|
| 34 |
# Очистка сообщений
|
| 35 |
def sanitize_html(text: str) -> str:
|
| 36 |
# 1. Сначала очищаем HTML
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -101,7 +101,7 @@ def init_config_table(storage, config):
|
|
| 101 |
|
| 102 |
def ensure_directories():
|
| 103 |
for folder in ["logs", "scripts"]:
|
| 104 |
-
full_path = os.path.abspath(os.path.join(os.path.dirname(__file__),
|
| 105 |
if not os.path.exists(full_path):
|
| 106 |
os.makedirs(full_path)
|
| 107 |
print(f"[+] Создан каталог: {full_path}")
|
|
|
|
| 101 |
|
| 102 |
def ensure_directories():
|
| 103 |
for folder in ["logs", "scripts"]:
|
| 104 |
+
full_path = os.path.abspath(os.path.join(os.path.dirname(__file__), folder))
|
| 105 |
if not os.path.exists(full_path):
|
| 106 |
os.makedirs(full_path)
|
| 107 |
print(f"[+] Создан каталог: {full_path}")
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -10,6 +10,12 @@
|
|
| 10 |
.source-system { background-color: #fff3e0; }
|
| 11 |
.private::after { content: " 🔒"; }
|
| 12 |
.from-self::before { content: "🧍 "; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
</style>
|
| 14 |
</head>
|
| 15 |
<body>
|
|
@@ -23,8 +29,10 @@
|
|
| 23 |
|
| 24 |
<h1>Сообщения</h1>
|
| 25 |
|
| 26 |
-
<form method="post">
|
| 27 |
-
<textarea name="text" rows="3" cols="
|
|
|
|
|
|
|
| 28 |
<button name="hidden" value="false" type="submit">📢 Отправить</button>
|
| 29 |
<button name="hidden" value="true" type="submit">🙋 Отправить приватно</button>
|
| 30 |
</form>
|
|
@@ -50,6 +58,22 @@
|
|
| 50 |
</div>
|
| 51 |
<hr>
|
| 52 |
<div>{{ msg.text|safe }}</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
</div>
|
| 54 |
{% endfor %}
|
| 55 |
</body>
|
|
|
|
| 10 |
.source-system { background-color: #fff3e0; }
|
| 11 |
.private::after { content: " 🔒"; }
|
| 12 |
.from-self::before { content: "🧍 "; }
|
| 13 |
+
pre.code-block {
|
| 14 |
+
background-color: #f0f0f0;
|
| 15 |
+
padding: 10px;
|
| 16 |
+
border-radius: 6px;
|
| 17 |
+
overflow-x: auto;
|
| 18 |
+
}
|
| 19 |
</style>
|
| 20 |
</head>
|
| 21 |
<body>
|
|
|
|
| 29 |
|
| 30 |
<h1>Сообщения</h1>
|
| 31 |
|
| 32 |
+
<form method="post" enctype="multipart/form-data">
|
| 33 |
+
<textarea name="text" rows="3" cols="60" placeholder="Введите сообщение..."></textarea><br>
|
| 34 |
+
<textarea name="code" rows="6" cols="60" placeholder="Прикрепите код (опционально)..."></textarea><br>
|
| 35 |
+
<label>Файлы: <input type="file" name="binary_files" multiple></label><br>
|
| 36 |
<button name="hidden" value="false" type="submit">📢 Отправить</button>
|
| 37 |
<button name="hidden" value="true" type="submit">🙋 Отправить приватно</button>
|
| 38 |
</form>
|
|
|
|
| 58 |
</div>
|
| 59 |
<hr>
|
| 60 |
<div>{{ msg.text|safe }}</div>
|
| 61 |
+
|
| 62 |
+
{% if msg.code %}
|
| 63 |
+
<hr>
|
| 64 |
+
<div><b>Код:</b></div>
|
| 65 |
+
<pre class="code-block">{{ msg.code }}</pre>
|
| 66 |
+
{% endif %}
|
| 67 |
+
|
| 68 |
+
{% if msg.attachments %}
|
| 69 |
+
<hr>
|
| 70 |
+
<div><b>Файлы:</b></div>
|
| 71 |
+
<ul>
|
| 72 |
+
{% for file in msg.attachments %}
|
| 73 |
+
<li><a href="/download/{{ file.id }}">{{ file.filename }}</a> ({{ file.size }} байт)</li>
|
| 74 |
+
{% endfor %}
|
| 75 |
+
</ul>
|
| 76 |
+
{% endif %}
|
| 77 |
</div>
|
| 78 |
{% endfor %}
|
| 79 |
</body>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -2,11 +2,13 @@
|
|
| 2 |
|
| 3 |
import re
|
| 4 |
import bleach
|
|
|
|
| 5 |
|
| 6 |
-
from fastapi import APIRouter, Request, Form
|
| 7 |
-
from fastapi.responses import RedirectResponse, HTMLResponse
|
| 8 |
from fastapi.templating import Jinja2Templates
|
| 9 |
from starlette.status import HTTP_303_SEE_OTHER
|
|
|
|
| 10 |
from tools.storage import Storage
|
| 11 |
|
| 12 |
router = APIRouter()
|
|
@@ -76,27 +78,59 @@ def show_messages(request: Request, only_personal: bool = False):
|
|
| 76 |
})
|
| 77 |
|
| 78 |
@router.post("/messages")
|
| 79 |
-
def post_message(
|
| 80 |
request: Request,
|
| 81 |
text: str = Form(...),
|
| 82 |
-
|
|
|
|
|
|
|
| 83 |
):
|
| 84 |
did = request.session.get("did", "anon")
|
| 85 |
is_hidden = 1 if hidden.lower() == "true" else 0
|
| 86 |
|
| 87 |
-
# Проверка на бан
|
| 88 |
if storage.is_banned(did):
|
| 89 |
return HTMLResponse(content="Вы забанены и не можете отправлять сообщения.", status_code=403)
|
| 90 |
|
| 91 |
-
if text.strip():
|
| 92 |
-
|
| 93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
user_did=did,
|
| 95 |
source="user",
|
| 96 |
-
hidden=is_hidden
|
|
|
|
| 97 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
return RedirectResponse(url="/messages", status_code=303)
|
| 99 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
@router.get("/login")
|
| 101 |
def login_page(request: Request):
|
| 102 |
return templates.TemplateResponse("login.html", {"request": request})
|
|
|
|
| 2 |
|
| 3 |
import re
|
| 4 |
import bleach
|
| 5 |
+
import uuid
|
| 6 |
|
| 7 |
+
from fastapi import APIRouter, Request, Form, UploadFile, File
|
| 8 |
+
from fastapi.responses import RedirectResponse, HTMLResponse, StreamingResponse
|
| 9 |
from fastapi.templating import Jinja2Templates
|
| 10 |
from starlette.status import HTTP_303_SEE_OTHER
|
| 11 |
+
from typing import List
|
| 12 |
from tools.storage import Storage
|
| 13 |
|
| 14 |
router = APIRouter()
|
|
|
|
| 78 |
})
|
| 79 |
|
| 80 |
@router.post("/messages")
|
| 81 |
+
async def post_message(
|
| 82 |
request: Request,
|
| 83 |
text: str = Form(...),
|
| 84 |
+
code: str = Form(None),
|
| 85 |
+
hidden: str = Form(default="false"),
|
| 86 |
+
binary_files: List[UploadFile] = File(default=[])
|
| 87 |
):
|
| 88 |
did = request.session.get("did", "anon")
|
| 89 |
is_hidden = 1 if hidden.lower() == "true" else 0
|
| 90 |
|
|
|
|
| 91 |
if storage.is_banned(did):
|
| 92 |
return HTMLResponse(content="Вы забанены и не можете отправлять сообщения.", status_code=403)
|
| 93 |
|
| 94 |
+
if text.strip() or code or binary_files:
|
| 95 |
+
# Очистка текста
|
| 96 |
+
safe_text = sanitize_html(text.strip()) if text else ""
|
| 97 |
+
|
| 98 |
+
# Сохраняем сообщение и получаем message_id
|
| 99 |
+
message_id = storage.write_note_returning_id(
|
| 100 |
+
content=safe_text,
|
| 101 |
user_did=did,
|
| 102 |
source="user",
|
| 103 |
+
hidden=is_hidden,
|
| 104 |
+
code=code.strip() if code else None
|
| 105 |
)
|
| 106 |
+
|
| 107 |
+
# Сохраняем файлы
|
| 108 |
+
for upload in binary_files:
|
| 109 |
+
data = await upload.read()
|
| 110 |
+
if data:
|
| 111 |
+
storage.save_attachment(
|
| 112 |
+
message_id=message_id,
|
| 113 |
+
filename=upload.filename,
|
| 114 |
+
mime_type=upload.content_type,
|
| 115 |
+
content=data
|
| 116 |
+
)
|
| 117 |
+
|
| 118 |
return RedirectResponse(url="/messages", status_code=303)
|
| 119 |
|
| 120 |
+
@router.get("/download/{file_id}")
|
| 121 |
+
def download_file(file_id: int):
|
| 122 |
+
file = storage.get_attachment_by_id(file_id)
|
| 123 |
+
if not file:
|
| 124 |
+
raise HTTPException(status_code=404, detail="Файл не найден")
|
| 125 |
+
|
| 126 |
+
return StreamingResponse(
|
| 127 |
+
iter([file["binary"]]),
|
| 128 |
+
media_type=file["mime_type"],
|
| 129 |
+
headers={
|
| 130 |
+
"Content-Disposition": f'attachment; filename="{file["filename"]}"'
|
| 131 |
+
}
|
| 132 |
+
)
|
| 133 |
+
|
| 134 |
@router.get("/login")
|
| 135 |
def login_page(request: Request):
|
| 136 |
return templates.TemplateResponse("login.html", {"request": request})
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -5,6 +5,7 @@ import sqlite3
|
|
| 5 |
import os
|
| 6 |
import json
|
| 7 |
import uuid
|
|
|
|
| 8 |
|
| 9 |
from datetime import datetime, timedelta, UTC
|
| 10 |
from werkzeug.security import generate_password_hash, check_password_hash
|
|
@@ -714,13 +715,40 @@ class Storage:
|
|
| 714 |
""", (content, user_did, source, timestamp, hidden))
|
| 715 |
self.conn.commit()
|
| 716 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 717 |
def get_notes(self, limit=50, user_did="anon", only_personal=False):
|
| 718 |
cursor = self.conn.cursor()
|
| 719 |
|
| 720 |
if only_personal:
|
| 721 |
# Только личные (скрытые) сообщения пользователя
|
| 722 |
query = """
|
| 723 |
-
SELECT n.id, n.text, n.source, n.user_did, u.username, n.timestamp, n.hidden
|
| 724 |
FROM notes n
|
| 725 |
LEFT JOIN users u ON n.user_did = u.did
|
| 726 |
WHERE n.user_did = ? AND n.hidden = 1
|
|
@@ -731,7 +759,7 @@ class Storage:
|
|
| 731 |
else:
|
| 732 |
# Личные сообщения + публичные от user/llm, которые не скрыты
|
| 733 |
query = """
|
| 734 |
-
SELECT n.id, n.text, n.source, n.user_did, u.username, u.badges, n.timestamp, n.hidden
|
| 735 |
FROM notes n
|
| 736 |
LEFT JOIN users u ON n.user_did = u.did
|
| 737 |
WHERE n.user_did = ?
|
|
@@ -741,6 +769,19 @@ class Storage:
|
|
| 741 |
"""
|
| 742 |
cursor.execute(query, (user_did, limit))
|
| 743 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 744 |
return [dict(row) for row in cursor.fetchall()]
|
| 745 |
|
| 746 |
# Пользователи
|
|
|
|
| 5 |
import os
|
| 6 |
import json
|
| 7 |
import uuid
|
| 8 |
+
import time
|
| 9 |
|
| 10 |
from datetime import datetime, timedelta, UTC
|
| 11 |
from werkzeug.security import generate_password_hash, check_password_hash
|
|
|
|
| 715 |
""", (content, user_did, source, timestamp, hidden))
|
| 716 |
self.conn.commit()
|
| 717 |
|
| 718 |
+
def write_note_returning_id(self, content, user_did, source="user", hidden=False, code=None):
|
| 719 |
+
cursor = self.conn.cursor()
|
| 720 |
+
cursor.execute("""
|
| 721 |
+
INSERT INTO notes (timestamp, text, user_did, source, hidden, code)
|
| 722 |
+
VALUES (?, ?, ?, ?, ?, ?)
|
| 723 |
+
""", (time.time(), content, user_did, source, int(hidden), code))
|
| 724 |
+
self.conn.commit()
|
| 725 |
+
return cursor.lastrowid
|
| 726 |
+
|
| 727 |
+
def save_attachment(self, message_id, filename, mime_type, content):
|
| 728 |
+
cursor = self.conn.cursor()
|
| 729 |
+
cursor.execute("""
|
| 730 |
+
INSERT INTO attachments (message_id, filename, mime_type, size, binary)
|
| 731 |
+
VALUES (?, ?, ?, ?, ?)
|
| 732 |
+
""", (message_id, filename, mime_type, len(content), content))
|
| 733 |
+
self.conn.commit()
|
| 734 |
+
|
| 735 |
+
def get_attachment_by_id(self, file_id):
|
| 736 |
+
cursor = self.conn.cursor()
|
| 737 |
+
cursor.execute("""
|
| 738 |
+
SELECT id, filename, mime_type, size, binary
|
| 739 |
+
FROM attachments
|
| 740 |
+
WHERE id = ?
|
| 741 |
+
""", (file_id,))
|
| 742 |
+
row = cursor.fetchone()
|
| 743 |
+
return dict(row) if row else None
|
| 744 |
+
|
| 745 |
def get_notes(self, limit=50, user_did="anon", only_personal=False):
|
| 746 |
cursor = self.conn.cursor()
|
| 747 |
|
| 748 |
if only_personal:
|
| 749 |
# Только личные (скрытые) сообщения пользователя
|
| 750 |
query = """
|
| 751 |
+
SELECT n.id, n.text, n.code, n.source, n.user_did, u.username, n.timestamp, n.hidden
|
| 752 |
FROM notes n
|
| 753 |
LEFT JOIN users u ON n.user_did = u.did
|
| 754 |
WHERE n.user_did = ? AND n.hidden = 1
|
|
|
|
| 759 |
else:
|
| 760 |
# Личные сообщения + публичные от user/llm, которые не скрыты
|
| 761 |
query = """
|
| 762 |
+
SELECT n.id, n.text, n.code, n.source, n.user_did, u.username, u.badges, n.timestamp, n.hidden
|
| 763 |
FROM notes n
|
| 764 |
LEFT JOIN users u ON n.user_did = u.did
|
| 765 |
WHERE n.user_did = ?
|
|
|
|
| 769 |
"""
|
| 770 |
cursor.execute(query, (user_did, limit))
|
| 771 |
|
| 772 |
+
result = [dict(row) for row in cursor.fetchall()]
|
| 773 |
+
|
| 774 |
+
for note in result:
|
| 775 |
+
note["attachments"] = self.get_attachments_for_note(note["id"])
|
| 776 |
+
|
| 777 |
+
return result
|
| 778 |
+
|
| 779 |
+
def get_attachments_for_note(self, message_id):
|
| 780 |
+
cursor = self.conn.cursor()
|
| 781 |
+
cursor.execute("""
|
| 782 |
+
SELECT id, filename, mime_type, size FROM attachments
|
| 783 |
+
WHERE message_id = ?
|
| 784 |
+
""", (message_id,))
|
| 785 |
return [dict(row) for row in cursor.fetchall()]
|
| 786 |
|
| 787 |
# Пользователи
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
CHANGED
|
@@ -5,11 +5,12 @@ from tools.storage import Storage
|
|
| 5 |
|
| 6 |
storage = Storage()
|
| 7 |
|
| 8 |
-
def add_message(content, source="cli", user_did="anon"):
|
| 9 |
storage.write_note(
|
| 10 |
content,
|
| 11 |
source=source,
|
| 12 |
-
user_did=user_did
|
|
|
|
| 13 |
)
|
| 14 |
print(f"[+] Сообщение от {source} ({user_did}) добавлено: {content}")
|
| 15 |
|
|
@@ -19,6 +20,7 @@ if __name__ == "__main__":
|
|
| 19 |
parser.add_argument("--content", required=True)
|
| 20 |
parser.add_argument("--source", default="cli")
|
| 21 |
parser.add_argument("--user_did", default="anon")
|
|
|
|
| 22 |
args = parser.parse_args()
|
| 23 |
|
| 24 |
-
add_message(args.content, args.source, args.user_did)
|
|
|
|
| 5 |
|
| 6 |
storage = Storage()
|
| 7 |
|
| 8 |
+
def add_message(content, source="cli", user_did="anon", hidden=1):
|
| 9 |
storage.write_note(
|
| 10 |
content,
|
| 11 |
source=source,
|
| 12 |
+
user_did=user_did,
|
| 13 |
+
hidden=hidden
|
| 14 |
)
|
| 15 |
print(f"[+] Сообщение от {source} ({user_did}) добавлено: {content}")
|
| 16 |
|
|
|
|
| 20 |
parser.add_argument("--content", required=True)
|
| 21 |
parser.add_argument("--source", default="cli")
|
| 22 |
parser.add_argument("--user_did", default="anon")
|
| 23 |
+
parser.add_argument("--hidden", default=1)
|
| 24 |
args = parser.parse_args()
|
| 25 |
|
| 26 |
+
add_message(args.content, args.source, args.user_did, args.hidden)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -42,17 +42,29 @@ CREATE TABLE IF NOT EXISTS diary_graph_index (
|
|
| 42 |
|
| 43 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
| 44 |
CREATE TABLE IF NOT EXISTS notes (
|
| 45 |
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 46 |
-
text TEXT NOT NULL, --
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
|
|
|
| 54 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 55 |
-
llm_id TEXT -- Идентификатор
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
);
|
| 57 |
|
| 58 |
-- Лог процессов: задачи, ошибки, события
|
|
|
|
| 42 |
|
| 43 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
| 44 |
CREATE TABLE IF NOT EXISTS notes (
|
| 45 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 46 |
+
text TEXT NOT NULL, -- Основной текст заметки/сообщения
|
| 47 |
+
code TEXT, -- Прикреплённый код (Python, JS и т.п.)
|
| 48 |
+
tags TEXT, -- Теги (устанавливаются агентом, например: "idea", "instruction")
|
| 49 |
+
user_did TEXT DEFAULT 'ALL', -- Идентификатор пользователя (или 'ALL')
|
| 50 |
+
source TEXT DEFAULT 'user', -- Источник: user | cli | llm | system
|
| 51 |
+
links TEXT DEFAULT '', -- Ссылки на другие объекты (например, JSON со связями)
|
| 52 |
+
read INTEGER DEFAULT 0, -- Агент прочитал: 0 = нет, 1 = да
|
| 53 |
+
hidden INTEGER DEFAULT 0, -- Скрыто от UI (например, технические записи)
|
| 54 |
+
priority INTEGER DEFAULT 0, -- Приоритет обработки (>0: срочность/важность, задается вручную или агентом)
|
| 55 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
|
| 56 |
+
llm_id TEXT -- Идентификатор агента, добавившего сообщение
|
| 57 |
+
);
|
| 58 |
+
|
| 59 |
+
-- Вложения (может быть несколько к одной заметке)
|
| 60 |
+
CREATE TABLE IF NOT EXISTS attachments (
|
| 61 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 62 |
+
message_id INTEGER NOT NULL, -- Связь с notes.id
|
| 63 |
+
filename TEXT, -- Имя файла
|
| 64 |
+
mime_type TEXT, -- Тип (например, image/png, application/zip)
|
| 65 |
+
size INTEGER, -- Размер файла
|
| 66 |
+
binary BLOB NOT NULL, -- Сами данные
|
| 67 |
+
FOREIGN KEY (message_id) REFERENCES notes(id) ON DELETE CASCADE
|
| 68 |
);
|
| 69 |
|
| 70 |
-- Лог процессов: задачи, ошибки, события
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -735,7 +735,7 @@ class Storage:
|
|
| 735 |
FROM notes n
|
| 736 |
LEFT JOIN users u ON n.user_did = u.did
|
| 737 |
WHERE n.user_did = ?
|
| 738 |
-
OR ((n.source = 'user' OR n.source = 'llm') AND n.hidden = 0)
|
| 739 |
ORDER BY n.timestamp DESC
|
| 740 |
LIMIT ?
|
| 741 |
"""
|
|
|
|
| 735 |
FROM notes n
|
| 736 |
LEFT JOIN users u ON n.user_did = u.did
|
| 737 |
WHERE n.user_did = ?
|
| 738 |
+
OR ((n.source = 'user' OR n.source = 'llm' OR n.source = 'cli') AND n.hidden = 0)
|
| 739 |
ORDER BY n.timestamp DESC
|
| 740 |
LIMIT ?
|
| 741 |
"""
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
# agents/notebook/views.py
|
| 2 |
|
|
|
|
| 3 |
import bleach
|
| 4 |
|
| 5 |
from fastapi import APIRouter, Request, Form
|
|
@@ -12,13 +13,20 @@ router = APIRouter()
|
|
| 12 |
templates = Jinja2Templates(directory="notebook/templates")
|
| 13 |
storage = Storage()
|
| 14 |
|
| 15 |
-
allowed_tags = ['b', 'i', 's', 'u', 'a', 'ol', 'ul', 'li', 'dl', 'dt', 'dd', 'table', 'caption', 'tr', 'th', 'td']
|
| 16 |
allowed_attributes = {
|
| 17 |
'a': ['href', 'title']
|
| 18 |
}
|
| 19 |
|
| 20 |
-
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
@router.get("/chat")
|
| 24 |
def chat_page(request: Request):
|
|
|
|
| 1 |
# agents/notebook/views.py
|
| 2 |
|
| 3 |
+
import re
|
| 4 |
import bleach
|
| 5 |
|
| 6 |
from fastapi import APIRouter, Request, Form
|
|
|
|
| 13 |
templates = Jinja2Templates(directory="notebook/templates")
|
| 14 |
storage = Storage()
|
| 15 |
|
| 16 |
+
allowed_tags = ['b', 'i', 's', 'u', 'a', 'ol', 'ul', 'li', 'dl', 'dt', 'dd', 'table', 'caption', 'tr', 'th', 'td', 'code', 'pre', 'blockquote', 'br', 'hr']
|
| 17 |
allowed_attributes = {
|
| 18 |
'a': ['href', 'title']
|
| 19 |
}
|
| 20 |
|
| 21 |
+
# Очистка сообщений
|
| 22 |
+
def sanitize_html(text: str) -> str:
|
| 23 |
+
# 1. Сначала очищаем HTML
|
| 24 |
+
cleaned = bleach.clean(text, tags=allowed_tags, attributes=allowed_attributes, strip=True)
|
| 25 |
+
|
| 26 |
+
# 2. Заменяем 3 и более <br> подряд на ровно два
|
| 27 |
+
cleaned = re.sub(r'(<br\s*/?>\s*){3,}', '<br><br>', cleaned, flags=re.IGNORECASE)
|
| 28 |
+
|
| 29 |
+
return cleaned
|
| 30 |
|
| 31 |
@router.get("/chat")
|
| 32 |
def chat_page(request: Request):
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
from
|
|
|
|
| 1 |
+
from tools.storage import Storage
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -25,8 +25,8 @@
|
|
| 25 |
|
| 26 |
<form method="post">
|
| 27 |
<textarea name="text" rows="3" cols="40" placeholder="Введите сообщение..."></textarea><br>
|
| 28 |
-
<button name="hidden" value="false" type="submit"
|
| 29 |
-
<button name="hidden" value="true" type="submit"
|
| 30 |
</form>
|
| 31 |
|
| 32 |
<hr>
|
|
|
|
| 25 |
|
| 26 |
<form method="post">
|
| 27 |
<textarea name="text" rows="3" cols="40" placeholder="Введите сообщение..."></textarea><br>
|
| 28 |
+
<button name="hidden" value="false" type="submit">📢 Отправить</button>
|
| 29 |
+
<button name="hidden" value="true" type="submit">🙋 Отправить приватно</button>
|
| 30 |
</form>
|
| 31 |
|
| 32 |
<hr>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -12,7 +12,7 @@ router = APIRouter()
|
|
| 12 |
templates = Jinja2Templates(directory="notebook/templates")
|
| 13 |
storage = Storage()
|
| 14 |
|
| 15 |
-
allowed_tags = ['b', 'i', 'a', 'ol', 'ul', 'li', 'dl', 'dt', 'dd', 'table', 'caption', 'tr', 'th', 'td']
|
| 16 |
allowed_attributes = {
|
| 17 |
'a': ['href', 'title']
|
| 18 |
}
|
|
|
|
| 12 |
templates = Jinja2Templates(directory="notebook/templates")
|
| 13 |
storage = Storage()
|
| 14 |
|
| 15 |
+
allowed_tags = ['b', 'i', 's', 'u', 'a', 'ol', 'ul', 'li', 'dl', 'dt', 'dd', 'table', 'caption', 'tr', 'th', 'td']
|
| 16 |
allowed_attributes = {
|
| 17 |
'a': ['href', 'title']
|
| 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/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
| 1 |
# agents/notebook/views.py
|
| 2 |
|
|
|
|
|
|
|
| 3 |
from fastapi import APIRouter, Request, Form
|
| 4 |
from fastapi.responses import RedirectResponse, HTMLResponse
|
| 5 |
from fastapi.templating import Jinja2Templates
|
|
@@ -10,6 +12,14 @@ router = APIRouter()
|
|
| 10 |
templates = Jinja2Templates(directory="notebook/templates")
|
| 11 |
storage = Storage()
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
@router.get("/chat")
|
| 14 |
def chat_page(request: Request):
|
| 15 |
did = request.session.get("did")
|
|
@@ -72,7 +82,7 @@ def post_message(
|
|
| 72 |
|
| 73 |
if text.strip():
|
| 74 |
storage.write_note(
|
| 75 |
-
content=text.strip(),
|
| 76 |
user_did=did,
|
| 77 |
source="user",
|
| 78 |
hidden=is_hidden
|
|
|
|
| 1 |
# agents/notebook/views.py
|
| 2 |
|
| 3 |
+
import bleach
|
| 4 |
+
|
| 5 |
from fastapi import APIRouter, Request, Form
|
| 6 |
from fastapi.responses import RedirectResponse, HTMLResponse
|
| 7 |
from fastapi.templating import Jinja2Templates
|
|
|
|
| 12 |
templates = Jinja2Templates(directory="notebook/templates")
|
| 13 |
storage = Storage()
|
| 14 |
|
| 15 |
+
allowed_tags = ['b', 'i', 'a', 'ol', 'ul', 'li', 'dl', 'dt', 'dd', 'table', 'caption', 'tr', 'th', 'td']
|
| 16 |
+
allowed_attributes = {
|
| 17 |
+
'a': ['href', 'title']
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
def sanitize_html(text):
|
| 21 |
+
return bleach.clean(text, tags=allowed_tags, attributes=allowed_attributes, strip=True)
|
| 22 |
+
|
| 23 |
@router.get("/chat")
|
| 24 |
def chat_page(request: Request):
|
| 25 |
did = request.session.get("did")
|
|
|
|
| 82 |
|
| 83 |
if text.strip():
|
| 84 |
storage.write_note(
|
| 85 |
+
content=sanitize_html(text.strip()),
|
| 86 |
user_did=did,
|
| 87 |
source="user",
|
| 88 |
hidden=is_hidden
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -12,4 +12,5 @@ jinja2
|
|
| 12 |
python-multipart
|
| 13 |
passlib[bcrypt]
|
| 14 |
werkzeug
|
| 15 |
-
itsdangerous
|
|
|
|
|
|
| 12 |
python-multipart
|
| 13 |
passlib[bcrypt]
|
| 14 |
werkzeug
|
| 15 |
+
itsdangerous
|
| 16 |
+
bleach
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -46,10 +46,10 @@
|
|
| 46 |
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp[:19].replace('T', ' ') }}
|
| 47 |
</div>
|
| 48 |
<div>
|
| 49 |
-
{{ msg.badges }}Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} {% if msg.user_did
|
| 50 |
</div>
|
| 51 |
<hr>
|
| 52 |
-
<div>{{ msg.text }}</div>
|
| 53 |
</div>
|
| 54 |
{% endfor %}
|
| 55 |
</body>
|
|
|
|
| 46 |
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp[:19].replace('T', ' ') }}
|
| 47 |
</div>
|
| 48 |
<div>
|
| 49 |
+
{% if msg.badges %}{{ msg.badges }}{% endif %}Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} {% if msg.user_did %}({{ msg.user_did }}){% endif %}
|
| 50 |
</div>
|
| 51 |
<hr>
|
| 52 |
+
<div>{{ msg.text|safe }}</div>
|
| 53 |
</div>
|
| 54 |
{% endfor %}
|
| 55 |
</body>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -731,7 +731,7 @@ class Storage:
|
|
| 731 |
else:
|
| 732 |
# Личные сообщения + публичные от user/llm, которые не скрыты
|
| 733 |
query = """
|
| 734 |
-
SELECT n.id, n.text, n.source, n.user_did, u.username, n.timestamp, n.hidden
|
| 735 |
FROM notes n
|
| 736 |
LEFT JOIN users u ON n.user_did = u.did
|
| 737 |
WHERE n.user_did = ?
|
|
|
|
| 731 |
else:
|
| 732 |
# Личные сообщения + публичные от user/llm, которые не скрыты
|
| 733 |
query = """
|
| 734 |
+
SELECT n.id, n.text, n.source, n.user_did, u.username, u.badges, n.timestamp, n.hidden
|
| 735 |
FROM notes n
|
| 736 |
LEFT JOIN users u ON n.user_did = u.did
|
| 737 |
WHERE n.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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -46,7 +46,7 @@
|
|
| 46 |
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp[:19].replace('T', ' ') }}
|
| 47 |
</div>
|
| 48 |
<div>
|
| 49 |
-
Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} {% if msg.user_did !="" %}({{ msg.user_did }}){% endif %}
|
| 50 |
</div>
|
| 51 |
<hr>
|
| 52 |
<div>{{ msg.text }}</div>
|
|
|
|
| 46 |
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp[:19].replace('T', ' ') }}
|
| 47 |
</div>
|
| 48 |
<div>
|
| 49 |
+
{{ msg.badges }}Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} {% if msg.user_did !="" %}({{ msg.user_did }}){% endif %}
|
| 50 |
</div>
|
| 51 |
<hr>
|
| 52 |
<div>{{ msg.text }}</div>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -199,9 +199,10 @@ CREATE TABLE IF NOT EXISTS users (
|
|
| 199 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 200 |
ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента
|
| 201 |
username TEXT, -- имя пользователя (необязательно уникальное)
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
|
|
|
| 205 |
info TEXT, -- произвольная информация, JSON
|
| 206 |
profile TEXT, -- структурированая информация, JSON
|
| 207 |
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
|
|
|
| 199 |
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 200 |
ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента
|
| 201 |
username TEXT, -- имя пользователя (необязательно уникальное)
|
| 202 |
+
badges TEXT, -- значки, присвоенные агентом (например, "🎓💬")
|
| 203 |
+
did TEXT UNIQUE NOT NULL, -- децентрализованный идентификатор
|
| 204 |
+
mail TEXT UNIQUE NOT NULL, -- электронная почта
|
| 205 |
+
password_hash TEXT NOT NULL, -- хэш пароля
|
| 206 |
info TEXT, -- произвольная информация, JSON
|
| 207 |
profile TEXT, -- структурированая информация, JSON
|
| 208 |
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 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 starlette.status import HTTP_303_SEE_OTHER
|
| 7 |
from tools.storage import Storage
|
|
@@ -66,6 +66,10 @@ def post_message(
|
|
| 66 |
did = request.session.get("did", "anon")
|
| 67 |
is_hidden = 1 if hidden.lower() == "true" else 0
|
| 68 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
if text.strip():
|
| 70 |
storage.write_note(
|
| 71 |
content=text.strip(),
|
|
|
|
| 1 |
# agents/notebook/views.py
|
| 2 |
|
| 3 |
from fastapi import APIRouter, Request, Form
|
| 4 |
+
from fastapi.responses import RedirectResponse, HTMLResponse
|
| 5 |
from fastapi.templating import Jinja2Templates
|
| 6 |
from starlette.status import HTTP_303_SEE_OTHER
|
| 7 |
from tools.storage import Storage
|
|
|
|
| 66 |
did = request.session.get("did", "anon")
|
| 67 |
is_hidden = 1 if hidden.lower() == "true" else 0
|
| 68 |
|
| 69 |
+
# Проверка на бан
|
| 70 |
+
if storage.is_banned(did):
|
| 71 |
+
return HTMLResponse(content="Вы забанены и не можете отправлять сообщения.", status_code=403)
|
| 72 |
+
|
| 73 |
if text.strip():
|
| 74 |
storage.write_note(
|
| 75 |
content=text.strip(),
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
|
@@ -769,6 +769,18 @@ class Storage:
|
|
| 769 |
return check_password_hash(result["password_hash"], password)
|
| 770 |
return False
|
| 771 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 772 |
def get_user_info(self, mail: str) -> dict | None:
|
| 773 |
mail = mail.lower()
|
| 774 |
cursor = self.conn.cursor()
|
|
|
|
| 769 |
return check_password_hash(result["password_hash"], password)
|
| 770 |
return False
|
| 771 |
|
| 772 |
+
def is_banned(self, user_did):
|
| 773 |
+
result = self.conn.execute("""
|
| 774 |
+
SELECT ban
|
| 775 |
+
FROM users
|
| 776 |
+
WHERE did = ?
|
| 777 |
+
""", (user_did,)).fetchone()
|
| 778 |
+
|
| 779 |
+
if result and result["ban"]:
|
| 780 |
+
return datetime.fromisoformat(result["ban"]) > datetime.now(UTC)
|
| 781 |
+
|
| 782 |
+
return False
|
| 783 |
+
|
| 784 |
def get_user_info(self, mail: str) -> dict | None:
|
| 785 |
mail = mail.lower()
|
| 786 |
cursor = self.conn.cursor()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -33,19 +33,20 @@
|
|
| 33 |
|
| 34 |
<div>
|
| 35 |
<a href="/messages">📢 Все сообщения</a> |
|
| 36 |
-
<a href="/messages?only_personal=true">🙋
|
| 37 |
</div>
|
| 38 |
|
| 39 |
<hr>
|
| 40 |
|
| 41 |
{% for msg in messages %}
|
| 42 |
-
<div class="message source-{{ msg.source }}
|
| 43 |
<div>
|
| 44 |
-
|
| 45 |
-
{% if msg.hidden %}<span class="private"></span>{% endif %}
|
|
|
|
| 46 |
</div>
|
| 47 |
<div>
|
| 48 |
-
Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} ({{ msg.user_did }})
|
| 49 |
</div>
|
| 50 |
<hr>
|
| 51 |
<div>{{ msg.text }}</div>
|
|
|
|
| 33 |
|
| 34 |
<div>
|
| 35 |
<a href="/messages">📢 Все сообщения</a> |
|
| 36 |
+
<a href="/messages?only_personal=true">🙋 Личные</a>
|
| 37 |
</div>
|
| 38 |
|
| 39 |
<hr>
|
| 40 |
|
| 41 |
{% for msg in messages %}
|
| 42 |
+
<div class="message source-{{ msg.source }}">
|
| 43 |
<div>
|
| 44 |
+
{% if msg.user_did == request.session['did'] %}<span class="from-self" title="это ваше сообщение"></span>{% endif %}
|
| 45 |
+
{% if msg.hidden %}<span class="private" title="личное сообщение"></span>{% endif %}
|
| 46 |
+
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp[:19].replace('T', ' ') }}
|
| 47 |
</div>
|
| 48 |
<div>
|
| 49 |
+
Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} {% if msg.user_did !="" %}({{ msg.user_did }}){% endif %}
|
| 50 |
</div>
|
| 51 |
<hr>
|
| 52 |
<div>{{ msg.text }}</div>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -41,11 +41,11 @@
|
|
| 41 |
{% for msg in messages %}
|
| 42 |
<div class="message source-{{ msg.source }} {% if msg.user_did == request.session['did'] %}from-self{% endif %}">
|
| 43 |
<div>
|
| 44 |
-
<
|
| 45 |
{% if msg.hidden %}<span class="private"></span>{% endif %}
|
| 46 |
</div>
|
| 47 |
<div>
|
| 48 |
-
|
| 49 |
</div>
|
| 50 |
<hr>
|
| 51 |
<div>{{ msg.text }}</div>
|
|
|
|
| 41 |
{% for msg in messages %}
|
| 42 |
<div class="message source-{{ msg.source }} {% if msg.user_did == request.session['did'] %}from-self{% endif %}">
|
| 43 |
<div>
|
| 44 |
+
Источник: <i>{{ msg.source }}</i> — {{ msg.timestamp }}
|
| 45 |
{% if msg.hidden %}<span class="private"></span>{% endif %}
|
| 46 |
</div>
|
| 47 |
<div>
|
| 48 |
+
Пользователь: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} ({{ msg.user_did }})
|
| 49 |
</div>
|
| 50 |
<hr>
|
| 51 |
<div>{{ msg.text }}</div>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -45,9 +45,9 @@
|
|
| 45 |
{% if msg.hidden %}<span class="private"></span>{% endif %}
|
| 46 |
</div>
|
| 47 |
<div>
|
| 48 |
-
участник: {{ msg.user_did[:10] }}...
|
| 49 |
-
{% if msg.username %}({{ msg.username }}){% endif %}
|
| 50 |
</div>
|
|
|
|
| 51 |
<div>{{ msg.text }}</div>
|
| 52 |
</div>
|
| 53 |
{% endfor %}
|
|
|
|
| 45 |
{% if msg.hidden %}<span class="private"></span>{% endif %}
|
| 46 |
</div>
|
| 47 |
<div>
|
| 48 |
+
участник: {% if msg.username %}<b>{{ msg.username }}</b>{% endif %} ({{ msg.user_did[:10] }})...
|
|
|
|
| 49 |
</div>
|
| 50 |
+
<hr>
|
| 51 |
<div>{{ msg.text }}</div>
|
| 52 |
</div>
|
| 53 |
{% endfor %}
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/templates/messages.html
CHANGED
|
@@ -45,7 +45,7 @@
|
|
| 45 |
{% if msg.hidden %}<span class="private"></span>{% endif %}
|
| 46 |
</div>
|
| 47 |
<div>
|
| 48 |
-
|
| 49 |
{% if msg.username %}({{ msg.username }}){% endif %}
|
| 50 |
</div>
|
| 51 |
<div>{{ msg.text }}</div>
|
|
|
|
| 45 |
{% if msg.hidden %}<span class="private"></span>{% endif %}
|
| 46 |
</div>
|
| 47 |
<div>
|
| 48 |
+
участник: {{ msg.user_did[:10] }}...
|
| 49 |
{% if msg.username %}({{ msg.username }}){% endif %}
|
| 50 |
</div>
|
| 51 |
<div>{{ msg.text }}</div>
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/views.py
CHANGED
|
@@ -45,14 +45,9 @@ def show_messages(request: Request, only_personal: bool = False):
|
|
| 45 |
if not did:
|
| 46 |
return RedirectResponse("/login", status_code=303)
|
| 47 |
|
| 48 |
-
# Получаем инфу о пользователе, чтобы понять, оператор ли он
|
| 49 |
-
user_info = storage.get_user_info_by_did(did)
|
| 50 |
-
is_operator = bool(user_info and user_info.get("operator"))
|
| 51 |
-
|
| 52 |
messages = storage.get_notes(
|
| 53 |
limit=50,
|
| 54 |
user_did=did,
|
| 55 |
-
is_operator=is_operator,
|
| 56 |
only_personal=only_personal
|
| 57 |
)
|
| 58 |
return templates.TemplateResponse("messages.html", {
|
|
|
|
| 45 |
if not did:
|
| 46 |
return RedirectResponse("/login", status_code=303)
|
| 47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
messages = storage.get_notes(
|
| 49 |
limit=50,
|
| 50 |
user_did=did,
|
|
|
|
| 51 |
only_personal=only_personal
|
| 52 |
)
|
| 53 |
return templates.TemplateResponse("messages.html", {
|