GitHub Action
commited on
Commit
·
659e47b
1
Parent(s):
559a961
Sync from GitHub with Git LFS
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .github/workflows/ci.yml +1 -1
- hf_repo/agents/tests/test_storage.py +15 -11
- hf_repo/hf_repo/.github/workflows/ci.yml +11 -15
- hf_repo/hf_repo/hf_repo/agents/tests/test_storage.py +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml +18 -14
- 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/agents/tools/__init__.py +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tests/__init__.py +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/__init__.py +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tests/test_storage.py +17 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +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/.github/workflows/ci.yml +3 -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/agents/tests/test_basic.py +2 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +1 -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/.github/workflows/ci.yml +36 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +59 -6
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +22 -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/tools/storage.py +105 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +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/tools/storage.py +74 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/context_builder.py +8 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +96 -7
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +96 -7
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +125 -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/hf_repo/hf_repo/hf_repo/agents/readme.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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/memory_utils.py +64 -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/agents/tools/command_parser.py +64 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.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/hf_repo/hf_repo/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/llm.py +43 -38
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py +44 -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/repl.py +19 -11
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +13 -11
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/command_executor.py +17 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py +18 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +33 -56
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +18 -14
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +18 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/Basic-agent-sim.md +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/docs/HMP-Agent-Architecture.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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-Overview.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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +10 -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/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 +68 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/sync-to-gitlab.yml +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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml +10 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml +23 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.md +97 -42
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +63 -18
.github/workflows/ci.yml
CHANGED
@@ -21,7 +21,7 @@ jobs:
|
|
21 |
- name: Install dependencies
|
22 |
run: |
|
23 |
python -m pip install --upgrade pip
|
24 |
-
pip install -r requirements.txt
|
25 |
pip install pytest
|
26 |
|
27 |
- name: Run tests
|
|
|
21 |
- name: Install dependencies
|
22 |
run: |
|
23 |
python -m pip install --upgrade pip
|
24 |
+
pip install -r agents/requirements.txt
|
25 |
pip install pytest
|
26 |
|
27 |
- name: Run tests
|
hf_repo/agents/tests/test_storage.py
CHANGED
@@ -1,17 +1,21 @@
|
|
|
|
|
|
|
|
1 |
import pytest
|
2 |
from agents.tools.storage import Storage
|
3 |
|
4 |
@pytest.fixture
|
5 |
-
def
|
6 |
-
|
7 |
-
|
8 |
-
|
|
|
9 |
|
10 |
-
def
|
11 |
-
|
12 |
-
|
13 |
-
assert isinstance(entry_id, int), "ID записи должен быть числом"
|
14 |
|
15 |
-
|
16 |
-
|
17 |
-
|
|
|
|
1 |
+
# agents/tests/test_storage.py
|
2 |
+
|
3 |
+
import os
|
4 |
import pytest
|
5 |
from agents.tools.storage import Storage
|
6 |
|
7 |
@pytest.fixture
|
8 |
+
def temp_storage(tmp_path):
|
9 |
+
db_path = tmp_path / "test.db"
|
10 |
+
storage = Storage(config={"db_path": str(db_path)})
|
11 |
+
yield storage
|
12 |
+
# автоматически удалится tmp_path
|
13 |
|
14 |
+
def test_set_and_get(temp_storage):
|
15 |
+
temp_storage.set("foo", "bar")
|
16 |
+
assert temp_storage.get("foo") == "bar"
|
|
|
17 |
|
18 |
+
def test_delete(temp_storage):
|
19 |
+
temp_storage.set("key", "value")
|
20 |
+
temp_storage.delete("key")
|
21 |
+
assert temp_storage.get("key") is None
|
hf_repo/hf_repo/.github/workflows/ci.yml
CHANGED
@@ -2,32 +2,28 @@ name: CI
|
|
2 |
|
3 |
on:
|
4 |
push:
|
5 |
-
branches: [
|
6 |
pull_request:
|
7 |
-
branches: [
|
8 |
|
9 |
jobs:
|
10 |
test:
|
11 |
runs-on: ubuntu-latest
|
12 |
|
13 |
steps:
|
14 |
-
-
|
15 |
-
uses: actions/checkout@v3
|
16 |
|
17 |
-
- name: Set up Python
|
18 |
-
uses: actions/setup-python@
|
19 |
with:
|
20 |
-
python-version:
|
21 |
-
|
22 |
-
- name: Upgrade pip
|
23 |
-
run: python -m pip install --upgrade pip
|
24 |
|
25 |
- name: Install dependencies
|
26 |
run: |
|
27 |
-
python -m pip install
|
|
|
|
|
28 |
|
29 |
-
- name: Run tests
|
30 |
-
env:
|
31 |
-
PYTHONPATH: ${{ github.workspace }}
|
32 |
run: |
|
33 |
-
|
|
|
2 |
|
3 |
on:
|
4 |
push:
|
5 |
+
branches: [main]
|
6 |
pull_request:
|
7 |
+
branches: [main]
|
8 |
|
9 |
jobs:
|
10 |
test:
|
11 |
runs-on: ubuntu-latest
|
12 |
|
13 |
steps:
|
14 |
+
- uses: actions/checkout@v4
|
|
|
15 |
|
16 |
+
- name: Set up Python
|
17 |
+
uses: actions/setup-python@v5
|
18 |
with:
|
19 |
+
python-version: 3.11
|
|
|
|
|
|
|
20 |
|
21 |
- name: Install dependencies
|
22 |
run: |
|
23 |
+
python -m pip install --upgrade pip
|
24 |
+
pip install -r requirements.txt
|
25 |
+
pip install pytest
|
26 |
|
27 |
+
- name: Run tests
|
|
|
|
|
28 |
run: |
|
29 |
+
PYTHONPATH=. pytest
|
hf_repo/hf_repo/hf_repo/agents/tests/test_storage.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
import pytest
|
2 |
-
from agents.storage import Storage
|
3 |
|
4 |
@pytest.fixture
|
5 |
def storage():
|
|
|
1 |
import pytest
|
2 |
+
from agents.tools.storage import Storage
|
3 |
|
4 |
@pytest.fixture
|
5 |
def storage():
|
hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml
CHANGED
@@ -7,23 +7,27 @@ on:
|
|
7 |
branches: [ main, master ]
|
8 |
|
9 |
jobs:
|
10 |
-
|
11 |
runs-on: ubuntu-latest
|
12 |
|
13 |
steps:
|
14 |
-
|
15 |
-
|
16 |
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
|
22 |
-
|
23 |
-
|
24 |
-
python -m pip install --upgrade pip
|
25 |
-
pip install -r agents/requirements.txt
|
26 |
|
27 |
-
|
28 |
-
|
29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
branches: [ main, master ]
|
8 |
|
9 |
jobs:
|
10 |
+
test:
|
11 |
runs-on: ubuntu-latest
|
12 |
|
13 |
steps:
|
14 |
+
- name: Checkout code
|
15 |
+
uses: actions/checkout@v3
|
16 |
|
17 |
+
- name: Set up Python 3.11
|
18 |
+
uses: actions/setup-python@v4
|
19 |
+
with:
|
20 |
+
python-version: '3.11'
|
21 |
|
22 |
+
- name: Upgrade pip
|
23 |
+
run: python -m pip install --upgrade pip
|
|
|
|
|
24 |
|
25 |
+
- name: Install dependencies
|
26 |
+
run: |
|
27 |
+
python -m pip install pytest
|
28 |
+
|
29 |
+
- name: Run tests with PYTHONPATH
|
30 |
+
env:
|
31 |
+
PYTHONPATH: ${{ github.workspace }}
|
32 |
+
run: |
|
33 |
+
python -m pytest agents/tests/
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1 |
-
|
|
|
1 |
+
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
from agents.tools.storage import Storage
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tests/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
from .storage import Storage
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tests/test_storage.py
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pytest
|
2 |
+
from agents.storage import Storage
|
3 |
+
|
4 |
+
@pytest.fixture
|
5 |
+
def storage():
|
6 |
+
# Создаём инстанс Storage с временной или тестовой базой
|
7 |
+
# Можно настроить, чтобы база была in-memory для быстроты
|
8 |
+
return Storage({"db_path": ":memory:"})
|
9 |
+
|
10 |
+
def test_add_and_get_journal_entry(storage):
|
11 |
+
text = "Первая тестовая запись"
|
12 |
+
entry_id = storage.add_journal_entry(text)
|
13 |
+
assert isinstance(entry_id, int), "ID записи должен быть числом"
|
14 |
+
|
15 |
+
entry = storage.get_journal_entry(entry_id)
|
16 |
+
assert entry is not None, "Запись должна существовать"
|
17 |
+
assert entry["text"] == text, "Текст записи должен совпадать"
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt
CHANGED
@@ -1 +1,2 @@
|
|
1 |
scikit-learn
|
|
|
|
1 |
scikit-learn
|
2 |
+
pytest
|
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/ci.yml
CHANGED
@@ -22,15 +22,8 @@ jobs:
|
|
22 |
- name: Install dependencies
|
23 |
run: |
|
24 |
python -m pip install --upgrade pip
|
25 |
-
pip install -r requirements.txt
|
26 |
|
27 |
-
- name: Run tests
|
28 |
run: |
|
29 |
-
|
30 |
-
pytest tests/
|
31 |
-
|
32 |
-
- name: Lint code
|
33 |
-
run: |
|
34 |
-
pip install flake8
|
35 |
-
flake8 .
|
36 |
-
|
|
|
22 |
- name: Install dependencies
|
23 |
run: |
|
24 |
python -m pip install --upgrade pip
|
25 |
+
pip install -r agents/requirements.txt
|
26 |
|
27 |
+
- name: Run simple tests
|
28 |
run: |
|
29 |
+
python -m pytest agents/tests/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hf_repo/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/tests/test_basic.py
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
def test_sanity():
|
2 |
+
assert 1 + 1 == 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/agents/requirements.txt
CHANGED
@@ -1,4 +1 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
- Python (https://www.python.org/downloads/)
|
4 |
-
- scikit-learn ("pip install scikit-learn")
|
|
|
1 |
+
scikit-learn
|
|
|
|
|
|
hf_repo/hf_repo/hf_repo/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/ci.yml
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: CI
|
2 |
+
|
3 |
+
on:
|
4 |
+
push:
|
5 |
+
branches: [ main, master ]
|
6 |
+
pull_request:
|
7 |
+
branches: [ main, master ]
|
8 |
+
|
9 |
+
jobs:
|
10 |
+
build-and-test:
|
11 |
+
runs-on: ubuntu-latest
|
12 |
+
|
13 |
+
steps:
|
14 |
+
- name: Checkout code
|
15 |
+
uses: actions/checkout@v3
|
16 |
+
|
17 |
+
- name: Set up Python 3.11
|
18 |
+
uses: actions/setup-python@v4
|
19 |
+
with:
|
20 |
+
python-version: 3.11
|
21 |
+
|
22 |
+
- name: Install dependencies
|
23 |
+
run: |
|
24 |
+
python -m pip install --upgrade pip
|
25 |
+
pip install -r requirements.txt
|
26 |
+
|
27 |
+
- name: Run tests
|
28 |
+
run: |
|
29 |
+
# если у тебя есть тесты, например, pytest
|
30 |
+
pytest tests/
|
31 |
+
|
32 |
+
- name: Lint code
|
33 |
+
run: |
|
34 |
+
pip install flake8
|
35 |
+
flake8 .
|
36 |
+
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -1,9 +1,11 @@
|
|
1 |
# agents/tools/storage.py
|
2 |
|
3 |
import sqlite3
|
|
|
4 |
from datetime import datetime
|
5 |
|
6 |
DEFAULT_DB_PATH = "agent_data.db"
|
|
|
7 |
|
8 |
class Storage:
|
9 |
def __init__(self, config=None):
|
@@ -550,21 +552,50 @@ class Storage:
|
|
550 |
|
551 |
# agent_scripts — код скриптов, которыми может пользоваться агент
|
552 |
|
|
|
|
|
|
|
553 |
def register_agent_script(self, name, version, code, language='python', description=None, tags=None, llm_id=None):
|
554 |
c = self.conn.cursor()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
555 |
c.execute('''
|
556 |
INSERT OR REPLACE INTO agent_scripts (name, version, code, language, description, tags, llm_id)
|
557 |
VALUES (?, ?, ?, ?, ?, ?, ?)
|
558 |
-
''', (name, version,
|
559 |
self.conn.commit()
|
560 |
|
561 |
-
def
|
|
|
562 |
c = self.conn.cursor()
|
563 |
-
if
|
564 |
-
c.execute(
|
565 |
else:
|
566 |
-
c.execute(
|
567 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
568 |
|
569 |
def list_agent_scripts(limit=50):
|
570 |
c = self.conn.cursor()
|
@@ -585,6 +616,28 @@ class Storage:
|
|
585 |
c = self.conn.cursor()
|
586 |
c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
|
587 |
return c.fetchall()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
588 |
|
589 |
# llm_registry — реестр LLM-агентов
|
590 |
|
|
|
1 |
# agents/tools/storage.py
|
2 |
|
3 |
import sqlite3
|
4 |
+
import os
|
5 |
from datetime import datetime
|
6 |
|
7 |
DEFAULT_DB_PATH = "agent_data.db"
|
8 |
+
SCRIPTS_BASE_PATH = "scripts"
|
9 |
|
10 |
class Storage:
|
11 |
def __init__(self, config=None):
|
|
|
552 |
|
553 |
# agent_scripts — код скриптов, которыми может пользоваться агент
|
554 |
|
555 |
+
def resolve_script_path(name, version):
|
556 |
+
return os.path.join(SCRIPTS_BASE_PATH, name, f"v{version}", "script.py")
|
557 |
+
|
558 |
def register_agent_script(self, name, version, code, language='python', description=None, tags=None, llm_id=None):
|
559 |
c = self.conn.cursor()
|
560 |
+
|
561 |
+
if code.strip().startswith("@path="):
|
562 |
+
# сохраняем только путь как метку
|
563 |
+
path = code.strip().split("=", 1)[1]
|
564 |
+
code_entry = f"@path={path}"
|
565 |
+
else:
|
566 |
+
# сохраняем и файл
|
567 |
+
path = resolve_script_path(name, version)
|
568 |
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
569 |
+
with open(path, "w", encoding="utf-8") as f:
|
570 |
+
f.write(code)
|
571 |
+
code_entry = f"@path={name}/v{version}/script.py"
|
572 |
+
|
573 |
c.execute('''
|
574 |
INSERT OR REPLACE INTO agent_scripts (name, version, code, language, description, tags, llm_id)
|
575 |
VALUES (?, ?, ?, ?, ?, ?, ?)
|
576 |
+
''', (name, version, code_entry, language, description, tags, llm_id))
|
577 |
self.conn.commit()
|
578 |
|
579 |
+
def get_agent_script_code(self, name, version=None):
|
580 |
+
"""Возвращает только код (из БД или файла)"""
|
581 |
c = self.conn.cursor()
|
582 |
+
if version:
|
583 |
+
c.execute("SELECT code FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
|
584 |
else:
|
585 |
+
c.execute("SELECT code FROM agent_scripts WHERE name = ? ORDER BY updated_at DESC LIMIT 1", (name,))
|
586 |
+
row = c.fetchone()
|
587 |
+
if not row:
|
588 |
+
return None
|
589 |
+
code_entry = row[0]
|
590 |
+
if code_entry.strip().startswith("@path="):
|
591 |
+
rel_path = code_entry.strip().split("=", 1)[1]
|
592 |
+
full_path = os.path.join(SCRIPTS_BASE_PATH, rel_path)
|
593 |
+
if os.path.isfile(full_path):
|
594 |
+
with open(full_path, "r", encoding="utf-8") as f:
|
595 |
+
return f.read()
|
596 |
+
else:
|
597 |
+
return f"# Error: File not found at path: {full_path}"
|
598 |
+
return code_entry
|
599 |
|
600 |
def list_agent_scripts(limit=50):
|
601 |
c = self.conn.cursor()
|
|
|
616 |
c = self.conn.cursor()
|
617 |
c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
|
618 |
return c.fetchall()
|
619 |
+
|
620 |
+
def update_agent_script(self, name, version, code, tags=None):
|
621 |
+
c = self.conn.cursor()
|
622 |
+
|
623 |
+
# Проверим, существует ли скрипт с таким name и version
|
624 |
+
c.execute('''
|
625 |
+
SELECT COUNT(*) FROM agent_scripts
|
626 |
+
WHERE name = ? AND version = ?
|
627 |
+
''', (name, version))
|
628 |
+
count = c.fetchone()[0]
|
629 |
+
|
630 |
+
if count == 0:
|
631 |
+
raise ValueError(f"Agent script '{name}' v{version} does not exist. Use register_agent_script instead.")
|
632 |
+
|
633 |
+
now = datetime.utcnow().isoformat()
|
634 |
+
c.execute('''
|
635 |
+
UPDATE agent_scripts
|
636 |
+
SET code = ?, updated_at = ?, tags = ?
|
637 |
+
WHERE name = ? AND version = ?
|
638 |
+
''', (code, now, tags, name, version))
|
639 |
+
|
640 |
+
self.conn.commit()
|
641 |
|
642 |
# llm_registry — реестр LLM-агентов
|
643 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -510,7 +510,7 @@ class Storage:
|
|
510 |
|
511 |
# process_log — лог задач, ошибок и событий
|
512 |
|
513 |
-
def
|
514 |
c = self.conn.cursor()
|
515 |
c.execute('''
|
516 |
INSERT INTO process_log (name, value, tags, status, priority, llm_id)
|
@@ -566,6 +566,26 @@ class Storage:
|
|
566 |
c.execute('SELECT * FROM agent_scripts ORDER BY updated_at DESC')
|
567 |
return c.fetchall()
|
568 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
569 |
# llm_registry — реестр LLM-агентов
|
570 |
|
571 |
def register_llm(self, llm_id, name=None, description=None):
|
@@ -576,7 +596,7 @@ class Storage:
|
|
576 |
''', (llm_id, name, description))
|
577 |
self.conn.commit()
|
578 |
|
579 |
-
def
|
580 |
c = self.conn.cursor()
|
581 |
c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
|
582 |
return c.fetchall()
|
|
|
510 |
|
511 |
# process_log — лог задач, ошибок и событий
|
512 |
|
513 |
+
def log_process_event(self, name, value=None, tags=None, status='ok', priority=0, llm_id=None):
|
514 |
c = self.conn.cursor()
|
515 |
c.execute('''
|
516 |
INSERT INTO process_log (name, value, tags, status, priority, llm_id)
|
|
|
566 |
c.execute('SELECT * FROM agent_scripts ORDER BY updated_at DESC')
|
567 |
return c.fetchall()
|
568 |
|
569 |
+
def list_agent_scripts(limit=50):
|
570 |
+
c = self.conn.cursor()
|
571 |
+
c.execute("SELECT * FROM agent_scripts ORDER BY updated_at DESC LIMIT ?", (limit,))
|
572 |
+
return c.fetchall()
|
573 |
+
|
574 |
+
def get_latest_agent_script(self, name):
|
575 |
+
c = self.conn.cursor()
|
576 |
+
c.execute('''
|
577 |
+
SELECT * FROM agent_scripts
|
578 |
+
WHERE name = ?
|
579 |
+
ORDER BY updated_at DESC
|
580 |
+
LIMIT 1
|
581 |
+
''', (name,))
|
582 |
+
return c.fetchone()
|
583 |
+
|
584 |
+
def search_agent_scripts_by_tag(self, tag):
|
585 |
+
c = self.conn.cursor()
|
586 |
+
c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
|
587 |
+
return c.fetchall()
|
588 |
+
|
589 |
# llm_registry — реестр LLM-агентов
|
590 |
|
591 |
def register_llm(self, llm_id, name=None, description=None):
|
|
|
596 |
''', (llm_id, name, description))
|
597 |
self.conn.commit()
|
598 |
|
599 |
+
def get_registered_llms(self):
|
600 |
c = self.conn.cursor()
|
601 |
c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
|
602 |
return c.fetchall()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -149,6 +149,19 @@ class Storage:
|
|
149 |
)
|
150 |
''')
|
151 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
self.conn.commit()
|
153 |
|
154 |
# Методы для работы с дневником
|
@@ -495,6 +508,98 @@ class Storage:
|
|
495 |
self.conn.commit()
|
496 |
return c.rowcount > 0
|
497 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
498 |
# Утилиты
|
499 |
|
500 |
def close(self):
|
|
|
149 |
)
|
150 |
''')
|
151 |
|
152 |
+
# Быстрые индексы по смысловой карте и дневнику
|
153 |
+
c.execute('''
|
154 |
+
CREATE TABLE IF NOT EXISTS diary_graph_index (
|
155 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
156 |
+
source_entry_id INTEGER NOT NULL,
|
157 |
+
target_entry_id INTEGER NOT NULL,
|
158 |
+
relation TEXT NOT NULL,
|
159 |
+
strength REAL DEFAULT 1.0,
|
160 |
+
context TEXT,
|
161 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
162 |
+
)
|
163 |
+
''')
|
164 |
+
|
165 |
self.conn.commit()
|
166 |
|
167 |
# Методы для работы с дневником
|
|
|
508 |
self.conn.commit()
|
509 |
return c.rowcount > 0
|
510 |
|
511 |
+
# process_log — лог задач, ошибок и событий
|
512 |
+
|
513 |
+
def log_event(self, name, value=None, tags=None, status='ok', priority=0, llm_id=None):
|
514 |
+
c = self.conn.cursor()
|
515 |
+
c.execute('''
|
516 |
+
INSERT INTO process_log (name, value, tags, status, priority, llm_id)
|
517 |
+
VALUES (?, ?, ?, ?, ?, ?)
|
518 |
+
''', (name, value, tags, status, priority, llm_id))
|
519 |
+
self.conn.commit()
|
520 |
+
|
521 |
+
def get_recent_logs(self, limit=50, status_filter=None):
|
522 |
+
c = self.conn.cursor()
|
523 |
+
query = 'SELECT * FROM process_log'
|
524 |
+
params = []
|
525 |
+
|
526 |
+
if status_filter:
|
527 |
+
query += ' WHERE status = ?'
|
528 |
+
params.append(status_filter)
|
529 |
+
|
530 |
+
query += ' ORDER BY timestamp DESC LIMIT ?'
|
531 |
+
params.append(limit)
|
532 |
+
|
533 |
+
c.execute(query, tuple(params))
|
534 |
+
return c.fetchall()
|
535 |
+
|
536 |
+
# agent_tables — декларации пользовательских таблиц
|
537 |
+
|
538 |
+
def register_agent_table(self, table_name, schema, description=None, llm_id=None):
|
539 |
+
c = self.conn.cursor()
|
540 |
+
c.execute('''
|
541 |
+
INSERT OR IGNORE INTO agent_tables (table_name, description, schema, llm_id)
|
542 |
+
VALUES (?, ?, ?, ?)
|
543 |
+
''', (table_name, description, schema, llm_id))
|
544 |
+
self.conn.commit()
|
545 |
+
|
546 |
+
def get_agent_tables(self):
|
547 |
+
c = self.conn.cursor()
|
548 |
+
c.execute('SELECT * FROM agent_tables ORDER BY created_at DESC')
|
549 |
+
return c.fetchall()
|
550 |
+
|
551 |
+
# agent_scripts — код скриптов, которыми может пользоваться агент
|
552 |
+
|
553 |
+
def register_agent_script(self, name, version, code, language='python', description=None, tags=None, llm_id=None):
|
554 |
+
c = self.conn.cursor()
|
555 |
+
c.execute('''
|
556 |
+
INSERT OR REPLACE INTO agent_scripts (name, version, code, language, description, tags, llm_id)
|
557 |
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
558 |
+
''', (name, version, code, language, description, tags, llm_id))
|
559 |
+
self.conn.commit()
|
560 |
+
|
561 |
+
def get_agent_scripts(self, name=None):
|
562 |
+
c = self.conn.cursor()
|
563 |
+
if name:
|
564 |
+
c.execute('SELECT * FROM agent_scripts WHERE name = ? ORDER BY updated_at DESC', (name,))
|
565 |
+
else:
|
566 |
+
c.execute('SELECT * FROM agent_scripts ORDER BY updated_at DESC')
|
567 |
+
return c.fetchall()
|
568 |
+
|
569 |
+
# llm_registry — реестр LLM-агентов
|
570 |
+
|
571 |
+
def register_llm(self, llm_id, name=None, description=None):
|
572 |
+
c = self.conn.cursor()
|
573 |
+
c.execute('''
|
574 |
+
INSERT OR REPLACE INTO llm_registry (id, name, description)
|
575 |
+
VALUES (?, ?, ?)
|
576 |
+
''', (llm_id, name, description))
|
577 |
+
self.conn.commit()
|
578 |
+
|
579 |
+
def get_llm_agents(self):
|
580 |
+
c = self.conn.cursor()
|
581 |
+
c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
|
582 |
+
return c.fetchall()
|
583 |
+
|
584 |
+
# diary_graph_index — быстрые индексы по смысловой карте и дневнику
|
585 |
+
|
586 |
+
def add_diary_relation(self, source_id, target_id, relation, strength=1.0, context=None):
|
587 |
+
c = self.conn.cursor()
|
588 |
+
c.execute('''
|
589 |
+
INSERT INTO diary_graph_index (source_entry_id, target_entry_id, relation, strength, context)
|
590 |
+
VALUES (?, ?, ?, ?, ?)
|
591 |
+
''', (source_id, target_id, relation, strength, context))
|
592 |
+
self.conn.commit()
|
593 |
+
|
594 |
+
def get_diary_relations(self, entry_id):
|
595 |
+
c = self.conn.cursor()
|
596 |
+
c.execute('''
|
597 |
+
SELECT * FROM diary_graph_index
|
598 |
+
WHERE source_entry_id = ? OR target_entry_id = ?
|
599 |
+
ORDER BY timestamp DESC
|
600 |
+
''', (entry_id, entry_id))
|
601 |
+
return c.fetchall()
|
602 |
+
|
603 |
# Утилиты
|
604 |
|
605 |
def close(self):
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
@@ -31,6 +31,17 @@ CREATE TABLE IF NOT EXISTS links (
|
|
31 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
32 |
);
|
33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
35 |
CREATE TABLE IF NOT EXISTS notes (
|
36 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
31 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
32 |
);
|
33 |
|
34 |
+
-- Быстрые индексы по смысловой карте и дневнику
|
35 |
+
CREATE TABLE IF NOT EXISTS diary_graph_index (
|
36 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
37 |
+
source_entry_id INTEGER NOT NULL,
|
38 |
+
target_entry_id INTEGER NOT NULL,
|
39 |
+
relation TEXT NOT NULL,
|
40 |
+
strength REAL DEFAULT 1.0,
|
41 |
+
context TEXT,
|
42 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
43 |
+
);
|
44 |
+
|
45 |
-- Заметки, подсказки, сообщения пользователя и LLM
|
46 |
CREATE TABLE IF NOT EXISTS notes (
|
47 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -152,6 +152,7 @@ class Storage:
|
|
152 |
self.conn.commit()
|
153 |
|
154 |
# Методы для работы с дневником
|
|
|
155 |
def write_diary_entry(self, text, tags=None):
|
156 |
timestamp = datetime.utcnow().isoformat()
|
157 |
tag_str = ",".join(tags) if tags else ""
|
@@ -205,6 +206,7 @@ class Storage:
|
|
205 |
return cursor.fetchall()
|
206 |
|
207 |
# Методы для работы с концептами
|
|
|
208 |
def add_concept(self, name, description=None):
|
209 |
timestamp = datetime.utcnow().isoformat()
|
210 |
self.conn.execute(
|
@@ -224,6 +226,7 @@ class Storage:
|
|
224 |
return cursor.fetchall()
|
225 |
|
226 |
# Методы для работы с связями
|
|
|
227 |
def add_link(self, from_name, to_name, relation_type):
|
228 |
from_concept = self.get_concept_by_name(from_name)
|
229 |
to_concept = self.get_concept_by_name(to_name)
|
@@ -251,6 +254,7 @@ class Storage:
|
|
251 |
return cursor.fetchall()
|
252 |
|
253 |
# Сложные операции над графом
|
|
|
254 |
def expand_concept_graph(self, start_id, depth):
|
255 |
visited = set()
|
256 |
results = []
|
@@ -326,6 +330,7 @@ class Storage:
|
|
326 |
return row[0] if row else None
|
327 |
|
328 |
# Методы для заметок
|
|
|
329 |
def write_note(self, text, tags=None):
|
330 |
timestamp = datetime.utcnow().isoformat()
|
331 |
tag_str = ",".join(tags) if tags else ""
|
@@ -394,6 +399,7 @@ class Storage:
|
|
394 |
return cursor.fetchone()
|
395 |
|
396 |
# Разное (LLM responses / memory)
|
|
|
397 |
def get_llm_recent_responses(self, limit=20, llm_id=None):
|
398 |
c = self.conn.cursor()
|
399 |
query = "SELECT role, content FROM llm_recent_responses"
|
@@ -422,6 +428,74 @@ class Storage:
|
|
422 |
''', (role, content, llm_id))
|
423 |
self.conn.commit()
|
424 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
425 |
# Утилиты
|
|
|
426 |
def close(self):
|
427 |
self.conn.close()
|
|
|
152 |
self.conn.commit()
|
153 |
|
154 |
# Методы для работы с дневником
|
155 |
+
|
156 |
def write_diary_entry(self, text, tags=None):
|
157 |
timestamp = datetime.utcnow().isoformat()
|
158 |
tag_str = ",".join(tags) if tags else ""
|
|
|
206 |
return cursor.fetchall()
|
207 |
|
208 |
# Методы для работы с концептами
|
209 |
+
|
210 |
def add_concept(self, name, description=None):
|
211 |
timestamp = datetime.utcnow().isoformat()
|
212 |
self.conn.execute(
|
|
|
226 |
return cursor.fetchall()
|
227 |
|
228 |
# Методы для работы с связями
|
229 |
+
|
230 |
def add_link(self, from_name, to_name, relation_type):
|
231 |
from_concept = self.get_concept_by_name(from_name)
|
232 |
to_concept = self.get_concept_by_name(to_name)
|
|
|
254 |
return cursor.fetchall()
|
255 |
|
256 |
# Сложные операции над графом
|
257 |
+
|
258 |
def expand_concept_graph(self, start_id, depth):
|
259 |
visited = set()
|
260 |
results = []
|
|
|
330 |
return row[0] if row else None
|
331 |
|
332 |
# Методы для заметок
|
333 |
+
|
334 |
def write_note(self, text, tags=None):
|
335 |
timestamp = datetime.utcnow().isoformat()
|
336 |
tag_str = ",".join(tags) if tags else ""
|
|
|
399 |
return cursor.fetchone()
|
400 |
|
401 |
# Разное (LLM responses / memory)
|
402 |
+
|
403 |
def get_llm_recent_responses(self, limit=20, llm_id=None):
|
404 |
c = self.conn.cursor()
|
405 |
query = "SELECT role, content FROM llm_recent_responses"
|
|
|
428 |
''', (role, content, llm_id))
|
429 |
self.conn.commit()
|
430 |
|
431 |
+
# Скрипты агента
|
432 |
+
|
433 |
+
def get_all_agent_scripts(self):
|
434 |
+
c = self.conn.cursor()
|
435 |
+
c.execute("SELECT id, name, version, language, description, tags, created_at, updated_at FROM agent_scripts")
|
436 |
+
return c.fetchall()
|
437 |
+
|
438 |
+
def get_agent_script_by_name(self, name, version=None):
|
439 |
+
c = self.conn.cursor()
|
440 |
+
if version:
|
441 |
+
c.execute("SELECT * FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
|
442 |
+
else:
|
443 |
+
c.execute("""
|
444 |
+
SELECT * FROM agent_scripts
|
445 |
+
WHERE name = ?
|
446 |
+
ORDER BY created_at DESC
|
447 |
+
LIMIT 1
|
448 |
+
""", (name,))
|
449 |
+
return c.fetchone()
|
450 |
+
|
451 |
+
def add_agent_script(self, name, version, code, description="", tags="", language="python", llm_id=None):
|
452 |
+
c = self.conn.cursor()
|
453 |
+
try:
|
454 |
+
c.execute("""
|
455 |
+
INSERT INTO agent_scripts (name, version, code, description, tags, language, llm_id)
|
456 |
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
457 |
+
""", (name, version, code, description, tags, language, llm_id))
|
458 |
+
self.conn.commit()
|
459 |
+
return True
|
460 |
+
except sqlite3.IntegrityError:
|
461 |
+
return False # Скрипт с таким name+version уже есть
|
462 |
+
|
463 |
+
def update_agent_script(self, name, version, code=None, description=None, tags=None):
|
464 |
+
c = self.conn.cursor()
|
465 |
+
fields = []
|
466 |
+
values = []
|
467 |
+
|
468 |
+
if code is not None:
|
469 |
+
fields.append("code = ?")
|
470 |
+
values.append(code)
|
471 |
+
if description is not None:
|
472 |
+
fields.append("description = ?")
|
473 |
+
values.append(description)
|
474 |
+
if tags is not None:
|
475 |
+
fields.append("tags = ?")
|
476 |
+
values.append(tags)
|
477 |
+
|
478 |
+
if not fields:
|
479 |
+
return False
|
480 |
+
|
481 |
+
fields.append("updated_at = CURRENT_TIMESTAMP")
|
482 |
+
query = f"UPDATE agent_scripts SET {', '.join(fields)} WHERE name = ? AND version = ?"
|
483 |
+
values.extend([name, version])
|
484 |
+
|
485 |
+
c.execute(query, values)
|
486 |
+
self.conn.commit()
|
487 |
+
return c.rowcount > 0
|
488 |
+
|
489 |
+
def delete_agent_script(self, name, version=None):
|
490 |
+
c = self.conn.cursor()
|
491 |
+
if version:
|
492 |
+
c.execute("DELETE FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
|
493 |
+
else:
|
494 |
+
c.execute("DELETE FROM agent_scripts WHERE name = ?", (name,))
|
495 |
+
self.conn.commit()
|
496 |
+
return c.rowcount > 0
|
497 |
+
|
498 |
# Утилиты
|
499 |
+
|
500 |
def close(self):
|
501 |
self.conn.close()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/context_builder.py
CHANGED
@@ -8,13 +8,21 @@ def build_contexts(db, config):
|
|
8 |
Возвращает словарь, готовый для сборки промпта.
|
9 |
"""
|
10 |
return {
|
|
|
11 |
"context_0": build_role_prompt(config),
|
|
|
12 |
"context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
|
|
|
13 |
"context_2": db.get_active_processes(),
|
|
|
14 |
"context_3": db.get_requested_diary_and_graph(),
|
|
|
15 |
"context_4": db.get_relevant_notes(config),
|
|
|
16 |
"context_5": get_system_info(config),
|
|
|
17 |
"context_6": db.get_llm_memory(),
|
|
|
18 |
"context_7": db.get_last_stagnation_info()
|
19 |
}
|
20 |
|
|
|
8 |
Возвращает словарь, готовый для сборки промпта.
|
9 |
"""
|
10 |
return {
|
11 |
+
# Роль и цели агента
|
12 |
"context_0": build_role_prompt(config),
|
13 |
+
# Последние реплики модели (история)
|
14 |
"context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
|
15 |
+
# Активные процессы и задачи
|
16 |
"context_2": db.get_active_processes(),
|
17 |
+
# Запрошенные данные из дневника и графа
|
18 |
"context_3": db.get_requested_diary_and_graph(),
|
19 |
+
# Релевантные заметки и напоминания
|
20 |
"context_4": db.get_relevant_notes(config),
|
21 |
+
# Системная информация
|
22 |
"context_5": get_system_info(config),
|
23 |
+
# Долговременная память модели
|
24 |
"context_6": db.get_llm_memory(),
|
25 |
+
# Последние данные о застое мышления
|
26 |
"context_7": db.get_last_stagnation_info()
|
27 |
}
|
28 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
CHANGED
@@ -15,27 +15,32 @@ class Storage:
|
|
15 |
def _init_db(self):
|
16 |
c = self.conn.cursor()
|
17 |
|
18 |
-
#
|
|
|
|
|
19 |
c.execute('''
|
20 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
21 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
22 |
text TEXT NOT NULL,
|
23 |
tags TEXT,
|
24 |
-
|
|
|
|
|
25 |
)
|
26 |
''')
|
27 |
|
28 |
-
#
|
29 |
c.execute('''
|
30 |
CREATE TABLE IF NOT EXISTS concepts (
|
31 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
32 |
name TEXT NOT NULL UNIQUE,
|
33 |
description TEXT,
|
34 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
|
35 |
)
|
36 |
''')
|
37 |
|
38 |
-
#
|
39 |
c.execute('''
|
40 |
CREATE TABLE IF NOT EXISTS links (
|
41 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
@@ -43,20 +48,104 @@ class Storage:
|
|
43 |
to_concept_id INTEGER,
|
44 |
relation_type TEXT,
|
45 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
|
46 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
47 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
48 |
)
|
49 |
''')
|
50 |
|
51 |
-
#
|
52 |
c.execute('''
|
53 |
CREATE TABLE IF NOT EXISTS notes (
|
54 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
55 |
text TEXT NOT NULL,
|
56 |
tags TEXT,
|
57 |
source TEXT DEFAULT 'user',
|
|
|
58 |
read INTEGER DEFAULT 0,
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
)
|
61 |
''')
|
62 |
|
|
|
15 |
def _init_db(self):
|
16 |
c = self.conn.cursor()
|
17 |
|
18 |
+
# --- Основные таблицы когнитивного ядра ---
|
19 |
+
|
20 |
+
# Дневниковые записи
|
21 |
c.execute('''
|
22 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
23 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
24 |
text TEXT NOT NULL,
|
25 |
tags TEXT,
|
26 |
+
priority INTEGER DEFAULT 0,
|
27 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
28 |
+
llm_id TEXT
|
29 |
)
|
30 |
''')
|
31 |
|
32 |
+
# Концепты
|
33 |
c.execute('''
|
34 |
CREATE TABLE IF NOT EXISTS concepts (
|
35 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
36 |
name TEXT NOT NULL UNIQUE,
|
37 |
description TEXT,
|
38 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
39 |
+
llm_id TEXT
|
40 |
)
|
41 |
''')
|
42 |
|
43 |
+
# Семантические связи
|
44 |
c.execute('''
|
45 |
CREATE TABLE IF NOT EXISTS links (
|
46 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
48 |
to_concept_id INTEGER,
|
49 |
relation_type TEXT,
|
50 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
51 |
+
llm_id TEXT,
|
52 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
53 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
54 |
)
|
55 |
''')
|
56 |
|
57 |
+
# Заметки / сообщения
|
58 |
c.execute('''
|
59 |
CREATE TABLE IF NOT EXISTS notes (
|
60 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
61 |
text TEXT NOT NULL,
|
62 |
tags TEXT,
|
63 |
source TEXT DEFAULT 'user',
|
64 |
+
links TEXT DEFAULT '',
|
65 |
read INTEGER DEFAULT 0,
|
66 |
+
hidden INTEGER DEFAULT 0,
|
67 |
+
priority INTEGER DEFAULT 0,
|
68 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
69 |
+
llm_id TEXT
|
70 |
+
)
|
71 |
+
''')
|
72 |
+
|
73 |
+
# Лог процессов
|
74 |
+
c.execute('''
|
75 |
+
CREATE TABLE IF NOT EXISTS process_log (
|
76 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
77 |
+
name TEXT NOT NULL,
|
78 |
+
value TEXT,
|
79 |
+
tags TEXT,
|
80 |
+
status TEXT DEFAULT 'ok',
|
81 |
+
priority INTEGER DEFAULT 0,
|
82 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
83 |
+
llm_id TEXT
|
84 |
+
)
|
85 |
+
''')
|
86 |
+
|
87 |
+
# Память LLM
|
88 |
+
c.execute('''
|
89 |
+
CREATE TABLE IF NOT EXISTS llm_memory (
|
90 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
91 |
+
title TEXT,
|
92 |
+
content TEXT NOT NULL,
|
93 |
+
tags TEXT,
|
94 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
95 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
96 |
+
llm_id TEXT
|
97 |
+
)
|
98 |
+
''')
|
99 |
+
|
100 |
+
# Краткосрочная память
|
101 |
+
c.execute('''
|
102 |
+
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
103 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
104 |
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
105 |
+
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
106 |
+
content TEXT NOT NULL,
|
107 |
+
llm_id TEXT
|
108 |
+
)
|
109 |
+
''')
|
110 |
+
|
111 |
+
# --- Дополнительные таблицы агента ---
|
112 |
+
|
113 |
+
# Пользовательские таблицы
|
114 |
+
c.execute('''
|
115 |
+
CREATE TABLE IF NOT EXISTS agent_tables (
|
116 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
117 |
+
table_name TEXT NOT NULL UNIQUE,
|
118 |
+
description TEXT,
|
119 |
+
schema TEXT NOT NULL,
|
120 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
121 |
+
llm_id TEXT
|
122 |
+
)
|
123 |
+
''')
|
124 |
+
|
125 |
+
# Скрипты агентов
|
126 |
+
c.execute('''
|
127 |
+
CREATE TABLE IF NOT EXISTS agent_scripts (
|
128 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
129 |
+
name TEXT NOT NULL,
|
130 |
+
version TEXT NOT NULL,
|
131 |
+
code TEXT NOT NULL,
|
132 |
+
language TEXT DEFAULT 'python',
|
133 |
+
description TEXT,
|
134 |
+
tags TEXT,
|
135 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
136 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
137 |
+
llm_id TEXT,
|
138 |
+
UNIQUE(name, version)
|
139 |
+
)
|
140 |
+
''')
|
141 |
+
|
142 |
+
# Регистр LLM
|
143 |
+
c.execute('''
|
144 |
+
CREATE TABLE IF NOT EXISTS llm_registry (
|
145 |
+
id TEXT PRIMARY KEY,
|
146 |
+
name TEXT,
|
147 |
+
description TEXT,
|
148 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
149 |
)
|
150 |
''')
|
151 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
CHANGED
@@ -15,27 +15,32 @@ class Storage:
|
|
15 |
def _init_db(self):
|
16 |
c = self.conn.cursor()
|
17 |
|
18 |
-
#
|
|
|
|
|
19 |
c.execute('''
|
20 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
21 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
22 |
text TEXT NOT NULL,
|
23 |
tags TEXT,
|
24 |
-
|
|
|
|
|
25 |
)
|
26 |
''')
|
27 |
|
28 |
-
#
|
29 |
c.execute('''
|
30 |
CREATE TABLE IF NOT EXISTS concepts (
|
31 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
32 |
name TEXT NOT NULL UNIQUE,
|
33 |
description TEXT,
|
34 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
|
35 |
)
|
36 |
''')
|
37 |
|
38 |
-
#
|
39 |
c.execute('''
|
40 |
CREATE TABLE IF NOT EXISTS links (
|
41 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
@@ -43,20 +48,104 @@ class Storage:
|
|
43 |
to_concept_id INTEGER,
|
44 |
relation_type TEXT,
|
45 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
|
46 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
47 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
48 |
)
|
49 |
''')
|
50 |
|
51 |
-
#
|
52 |
c.execute('''
|
53 |
CREATE TABLE IF NOT EXISTS notes (
|
54 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
55 |
text TEXT NOT NULL,
|
56 |
tags TEXT,
|
57 |
source TEXT DEFAULT 'user',
|
|
|
58 |
read INTEGER DEFAULT 0,
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
)
|
61 |
''')
|
62 |
|
|
|
15 |
def _init_db(self):
|
16 |
c = self.conn.cursor()
|
17 |
|
18 |
+
# --- Основные таблицы когнитивного ядра ---
|
19 |
+
|
20 |
+
# Дневниковые записи
|
21 |
c.execute('''
|
22 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
23 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
24 |
text TEXT NOT NULL,
|
25 |
tags TEXT,
|
26 |
+
priority INTEGER DEFAULT 0,
|
27 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
28 |
+
llm_id TEXT
|
29 |
)
|
30 |
''')
|
31 |
|
32 |
+
# Концепты
|
33 |
c.execute('''
|
34 |
CREATE TABLE IF NOT EXISTS concepts (
|
35 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
36 |
name TEXT NOT NULL UNIQUE,
|
37 |
description TEXT,
|
38 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
39 |
+
llm_id TEXT
|
40 |
)
|
41 |
''')
|
42 |
|
43 |
+
# Семантические связи
|
44 |
c.execute('''
|
45 |
CREATE TABLE IF NOT EXISTS links (
|
46 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
48 |
to_concept_id INTEGER,
|
49 |
relation_type TEXT,
|
50 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
51 |
+
llm_id TEXT,
|
52 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
53 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
54 |
)
|
55 |
''')
|
56 |
|
57 |
+
# Заметки / сообщения
|
58 |
c.execute('''
|
59 |
CREATE TABLE IF NOT EXISTS notes (
|
60 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
61 |
text TEXT NOT NULL,
|
62 |
tags TEXT,
|
63 |
source TEXT DEFAULT 'user',
|
64 |
+
links TEXT DEFAULT '',
|
65 |
read INTEGER DEFAULT 0,
|
66 |
+
hidden INTEGER DEFAULT 0,
|
67 |
+
priority INTEGER DEFAULT 0,
|
68 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
69 |
+
llm_id TEXT
|
70 |
+
)
|
71 |
+
''')
|
72 |
+
|
73 |
+
# Лог процессов
|
74 |
+
c.execute('''
|
75 |
+
CREATE TABLE IF NOT EXISTS process_log (
|
76 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
77 |
+
name TEXT NOT NULL,
|
78 |
+
value TEXT,
|
79 |
+
tags TEXT,
|
80 |
+
status TEXT DEFAULT 'ok',
|
81 |
+
priority INTEGER DEFAULT 0,
|
82 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
83 |
+
llm_id TEXT
|
84 |
+
)
|
85 |
+
''')
|
86 |
+
|
87 |
+
# Память LLM
|
88 |
+
c.execute('''
|
89 |
+
CREATE TABLE IF NOT EXISTS llm_memory (
|
90 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
91 |
+
title TEXT,
|
92 |
+
content TEXT NOT NULL,
|
93 |
+
tags TEXT,
|
94 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
95 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
96 |
+
llm_id TEXT
|
97 |
+
)
|
98 |
+
''')
|
99 |
+
|
100 |
+
# Краткосрочная память
|
101 |
+
c.execute('''
|
102 |
+
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
103 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
104 |
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
105 |
+
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
106 |
+
content TEXT NOT NULL,
|
107 |
+
llm_id TEXT
|
108 |
+
)
|
109 |
+
''')
|
110 |
+
|
111 |
+
# --- Дополнительные таблицы агента ---
|
112 |
+
|
113 |
+
# Пользовательские таблицы
|
114 |
+
c.execute('''
|
115 |
+
CREATE TABLE IF NOT EXISTS agent_tables (
|
116 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
117 |
+
table_name TEXT NOT NULL UNIQUE,
|
118 |
+
description TEXT,
|
119 |
+
schema TEXT NOT NULL,
|
120 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
121 |
+
llm_id TEXT
|
122 |
+
)
|
123 |
+
''')
|
124 |
+
|
125 |
+
# Скрипты агентов
|
126 |
+
c.execute('''
|
127 |
+
CREATE TABLE IF NOT EXISTS agent_scripts (
|
128 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
129 |
+
name TEXT NOT NULL,
|
130 |
+
version TEXT NOT NULL,
|
131 |
+
code TEXT NOT NULL,
|
132 |
+
language TEXT DEFAULT 'python',
|
133 |
+
description TEXT,
|
134 |
+
tags TEXT,
|
135 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
136 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
137 |
+
llm_id TEXT,
|
138 |
+
UNIQUE(name, version)
|
139 |
+
)
|
140 |
+
''')
|
141 |
+
|
142 |
+
# Регистр LLM
|
143 |
+
c.execute('''
|
144 |
+
CREATE TABLE IF NOT EXISTS llm_registry (
|
145 |
+
id TEXT PRIMARY KEY,
|
146 |
+
name TEXT,
|
147 |
+
description TEXT,
|
148 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
149 |
)
|
150 |
''')
|
151 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
CHANGED
@@ -15,27 +15,32 @@ class Storage:
|
|
15 |
def _init_db(self):
|
16 |
c = self.conn.cursor()
|
17 |
|
18 |
-
#
|
|
|
|
|
19 |
c.execute('''
|
20 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
21 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
22 |
text TEXT NOT NULL,
|
23 |
tags TEXT,
|
24 |
-
|
|
|
|
|
25 |
)
|
26 |
''')
|
27 |
|
28 |
-
#
|
29 |
c.execute('''
|
30 |
CREATE TABLE IF NOT EXISTS concepts (
|
31 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
32 |
name TEXT NOT NULL UNIQUE,
|
33 |
description TEXT,
|
34 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
|
35 |
)
|
36 |
''')
|
37 |
|
38 |
-
#
|
39 |
c.execute('''
|
40 |
CREATE TABLE IF NOT EXISTS links (
|
41 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
@@ -43,20 +48,104 @@ class Storage:
|
|
43 |
to_concept_id INTEGER,
|
44 |
relation_type TEXT,
|
45 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
|
46 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
47 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
48 |
)
|
49 |
''')
|
50 |
|
51 |
-
#
|
52 |
c.execute('''
|
53 |
CREATE TABLE IF NOT EXISTS notes (
|
54 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
55 |
text TEXT NOT NULL,
|
56 |
tags TEXT,
|
57 |
source TEXT DEFAULT 'user',
|
|
|
58 |
read INTEGER DEFAULT 0,
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
)
|
61 |
''')
|
62 |
|
@@ -304,9 +393,35 @@ class Storage:
|
|
304 |
cursor.execute(query, values)
|
305 |
return cursor.fetchone()
|
306 |
|
307 |
-
|
308 |
-
|
309 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
310 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
311 |
def close(self):
|
312 |
self.conn.close()
|
|
|
15 |
def _init_db(self):
|
16 |
c = self.conn.cursor()
|
17 |
|
18 |
+
# --- Основные таблицы когнитивного ядра ---
|
19 |
+
|
20 |
+
# Дневниковые записи
|
21 |
c.execute('''
|
22 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
23 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
24 |
text TEXT NOT NULL,
|
25 |
tags TEXT,
|
26 |
+
priority INTEGER DEFAULT 0,
|
27 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
28 |
+
llm_id TEXT
|
29 |
)
|
30 |
''')
|
31 |
|
32 |
+
# Концепты
|
33 |
c.execute('''
|
34 |
CREATE TABLE IF NOT EXISTS concepts (
|
35 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
36 |
name TEXT NOT NULL UNIQUE,
|
37 |
description TEXT,
|
38 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
39 |
+
llm_id TEXT
|
40 |
)
|
41 |
''')
|
42 |
|
43 |
+
# Семантические связи
|
44 |
c.execute('''
|
45 |
CREATE TABLE IF NOT EXISTS links (
|
46 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
48 |
to_concept_id INTEGER,
|
49 |
relation_type TEXT,
|
50 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
51 |
+
llm_id TEXT,
|
52 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
53 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
54 |
)
|
55 |
''')
|
56 |
|
57 |
+
# Заметки / сообщения
|
58 |
c.execute('''
|
59 |
CREATE TABLE IF NOT EXISTS notes (
|
60 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
61 |
text TEXT NOT NULL,
|
62 |
tags TEXT,
|
63 |
source TEXT DEFAULT 'user',
|
64 |
+
links TEXT DEFAULT '',
|
65 |
read INTEGER DEFAULT 0,
|
66 |
+
hidden INTEGER DEFAULT 0,
|
67 |
+
priority INTEGER DEFAULT 0,
|
68 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
69 |
+
llm_id TEXT
|
70 |
+
)
|
71 |
+
''')
|
72 |
+
|
73 |
+
# Лог процессов
|
74 |
+
c.execute('''
|
75 |
+
CREATE TABLE IF NOT EXISTS process_log (
|
76 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
77 |
+
name TEXT NOT NULL,
|
78 |
+
value TEXT,
|
79 |
+
tags TEXT,
|
80 |
+
status TEXT DEFAULT 'ok',
|
81 |
+
priority INTEGER DEFAULT 0,
|
82 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
83 |
+
llm_id TEXT
|
84 |
+
)
|
85 |
+
''')
|
86 |
+
|
87 |
+
# Память LLM
|
88 |
+
c.execute('''
|
89 |
+
CREATE TABLE IF NOT EXISTS llm_memory (
|
90 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
91 |
+
title TEXT,
|
92 |
+
content TEXT NOT NULL,
|
93 |
+
tags TEXT,
|
94 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
95 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
96 |
+
llm_id TEXT
|
97 |
+
)
|
98 |
+
''')
|
99 |
+
|
100 |
+
# Краткосрочная память
|
101 |
+
c.execute('''
|
102 |
+
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
103 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
104 |
+
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
105 |
+
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
106 |
+
content TEXT NOT NULL,
|
107 |
+
llm_id TEXT
|
108 |
+
)
|
109 |
+
''')
|
110 |
+
|
111 |
+
# --- Дополнительные таблицы агента ---
|
112 |
+
|
113 |
+
# Пользовательские таблицы
|
114 |
+
c.execute('''
|
115 |
+
CREATE TABLE IF NOT EXISTS agent_tables (
|
116 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
117 |
+
table_name TEXT NOT NULL UNIQUE,
|
118 |
+
description TEXT,
|
119 |
+
schema TEXT NOT NULL,
|
120 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
121 |
+
llm_id TEXT
|
122 |
+
)
|
123 |
+
''')
|
124 |
+
|
125 |
+
# Скрипты агентов
|
126 |
+
c.execute('''
|
127 |
+
CREATE TABLE IF NOT EXISTS agent_scripts (
|
128 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
129 |
+
name TEXT NOT NULL,
|
130 |
+
version TEXT NOT NULL,
|
131 |
+
code TEXT NOT NULL,
|
132 |
+
language TEXT DEFAULT 'python',
|
133 |
+
description TEXT,
|
134 |
+
tags TEXT,
|
135 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
136 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
137 |
+
llm_id TEXT,
|
138 |
+
UNIQUE(name, version)
|
139 |
+
)
|
140 |
+
''')
|
141 |
+
|
142 |
+
# Регистр LLM
|
143 |
+
c.execute('''
|
144 |
+
CREATE TABLE IF NOT EXISTS llm_registry (
|
145 |
+
id TEXT PRIMARY KEY,
|
146 |
+
name TEXT,
|
147 |
+
description TEXT,
|
148 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
149 |
)
|
150 |
''')
|
151 |
|
|
|
393 |
cursor.execute(query, values)
|
394 |
return cursor.fetchone()
|
395 |
|
396 |
+
# Разное (LLM responses / memory)
|
397 |
+
def get_llm_recent_responses(self, limit=20, llm_id=None):
|
398 |
+
c = self.conn.cursor()
|
399 |
+
query = "SELECT role, content FROM llm_recent_responses"
|
400 |
+
if llm_id:
|
401 |
+
query += " WHERE llm_id = ?"
|
402 |
+
query += " ORDER BY timestamp DESC LIMIT ?"
|
403 |
+
c.execute(query, (llm_id, limit))
|
404 |
+
else:
|
405 |
+
query += " ORDER BY timestamp DESC LIMIT ?"
|
406 |
+
c.execute(query, (limit,))
|
407 |
+
return c.fetchall()
|
408 |
|
409 |
+
def add_llm_memory(self, content, title=None, tags=None, llm_id=None):
|
410 |
+
c = self.conn.cursor()
|
411 |
+
c.execute('''
|
412 |
+
INSERT INTO llm_memory (title, content, tags, llm_id)
|
413 |
+
VALUES (?, ?, ?, ?)
|
414 |
+
''', (title, content, tags, llm_id))
|
415 |
+
self.conn.commit()
|
416 |
+
|
417 |
+
def add_llm_recent_response(self, role, content, llm_id=None):
|
418 |
+
c = self.conn.cursor()
|
419 |
+
c.execute('''
|
420 |
+
INSERT INTO llm_recent_responses (role, content, llm_id)
|
421 |
+
VALUES (?, ?, ?)
|
422 |
+
''', (role, content, llm_id))
|
423 |
+
self.conn.commit()
|
424 |
+
|
425 |
+
# Утилиты
|
426 |
def close(self):
|
427 |
self.conn.close()
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -38,6 +38,7 @@ agents/
|
|
38 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
39 |
* [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
|
40 |
* [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
|
|
|
41 |
* [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
42 |
* [similarity.py](tools/similarity.py) - Сравнение смыслов.
|
43 |
|
|
|
38 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
39 |
* [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
|
40 |
* [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
|
41 |
+
* [memory_utils.py](tools/memory_utils.py) - Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
|
42 |
* [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
43 |
* [similarity.py](tools/similarity.py) - Сравнение смыслов.
|
44 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/memory_utils.py
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# tools/memory_utils.py
|
2 |
+
|
3 |
+
from datetime import datetime, timedelta
|
4 |
+
from difflib import SequenceMatcher
|
5 |
+
from typing import Optional, List, Dict
|
6 |
+
|
7 |
+
STAGNATION_WINDOW = 5 # сколько последних записей сравнивать
|
8 |
+
STAGNATION_THRESHOLD = 0.95 # схожесть выше этого — считается стагнацией
|
9 |
+
|
10 |
+
|
11 |
+
def get_last_responses(db, limit=STAGNATION_WINDOW) -> List[str]:
|
12 |
+
records = db.get_llm_recent_responses(limit=limit)
|
13 |
+
return [r["content"] if isinstance(r, dict) else r for r in records]
|
14 |
+
|
15 |
+
|
16 |
+
def is_stagnant(responses: List[str]) -> bool:
|
17 |
+
if len(responses) < 2:
|
18 |
+
return False
|
19 |
+
|
20 |
+
similarities = []
|
21 |
+
for i in range(len(responses) - 1):
|
22 |
+
sim = string_similarity(responses[i], responses[i + 1])
|
23 |
+
similarities.append(sim)
|
24 |
+
|
25 |
+
avg_sim = sum(similarities) / len(similarities)
|
26 |
+
return avg_sim >= STAGNATION_THRESHOLD
|
27 |
+
|
28 |
+
|
29 |
+
def string_similarity(a: str, b: str) -> float:
|
30 |
+
return SequenceMatcher(None, a.strip(), b.strip()).ratio()
|
31 |
+
|
32 |
+
|
33 |
+
def get_last_stagnation_info(db) -> Optional[Dict]:
|
34 |
+
responses = get_last_responses(db)
|
35 |
+
if is_stagnant(responses):
|
36 |
+
return {
|
37 |
+
"detected": True,
|
38 |
+
"average_similarity": round(sum(
|
39 |
+
string_similarity(responses[i], responses[i+1])
|
40 |
+
for i in range(len(responses)-1)
|
41 |
+
) / (len(responses)-1), 4),
|
42 |
+
"last_messages": responses
|
43 |
+
}
|
44 |
+
return {"detected": False}
|
45 |
+
|
46 |
+
|
47 |
+
def add_to_llm_memory(db, title: str, content: str, tags: str = "meta"):
|
48 |
+
db.insert("llm_memory", {
|
49 |
+
"title": title,
|
50 |
+
"content": content,
|
51 |
+
"tags": tags,
|
52 |
+
"created_at": datetime.utcnow().isoformat(),
|
53 |
+
"updated_at": datetime.utcnow().isoformat()
|
54 |
+
})
|
55 |
+
|
56 |
+
|
57 |
+
def record_reflection_if_stagnant(db):
|
58 |
+
stagnation = get_last_stagnation_info(db)
|
59 |
+
if stagnation.get("detected"):
|
60 |
+
content = f"Обнаружена стагнация размышлений. Последние сообщения были очень похожи.\n\n"
|
61 |
+
content += "---\n" + "\n---\n".join(stagnation["last_messages"])
|
62 |
+
add_to_llm_memory(db, "Стагнация размышлений", content, tags="meta,warning")
|
63 |
+
return True
|
64 |
+
return False
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/command_parser.py
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# tools/command_parser.py
|
2 |
+
|
3 |
+
"""
|
4 |
+
Извлечение команд из JSON или размеченного текста.
|
5 |
+
Поддерживает следующие варианты:
|
6 |
+
- Явно размеченные JSON-блоки (```json ... ```)
|
7 |
+
- Префиксные команды (например, !shell, !graph)
|
8 |
+
"""
|
9 |
+
|
10 |
+
import json
|
11 |
+
import re
|
12 |
+
from typing import List, Optional, Dict, Any
|
13 |
+
|
14 |
+
|
15 |
+
COMMAND_PREFIXES = ["shell", "graph", "diary", "note"]
|
16 |
+
|
17 |
+
|
18 |
+
class ParsedCommand:
|
19 |
+
def __init__(self, command_type: str, payload: Any):
|
20 |
+
self.command_type = command_type
|
21 |
+
self.payload = payload
|
22 |
+
|
23 |
+
def __repr__(self):
|
24 |
+
return f"<ParsedCommand {self.command_type}: {repr(self.payload)}>"
|
25 |
+
|
26 |
+
|
27 |
+
def parse_commands(text: str) -> List[ParsedCommand]:
|
28 |
+
"""Основной интерфейс: принимает текст, возвращает список ParsedCommand."""
|
29 |
+
commands = []
|
30 |
+
|
31 |
+
# 1. Поиск JSON-блоков
|
32 |
+
for match in re.finditer(r"```json\n(.*?)```", text, re.DOTALL):
|
33 |
+
block = match.group(1).strip()
|
34 |
+
try:
|
35 |
+
data = json.loads(block)
|
36 |
+
if isinstance(data, dict) and "type" in data:
|
37 |
+
commands.append(ParsedCommand(data["type"], data.get("payload")))
|
38 |
+
except json.JSONDecodeError:
|
39 |
+
continue
|
40 |
+
|
41 |
+
# 2. Поиск префиксных команд (!shell, !graph и т.д.)
|
42 |
+
for line in text.splitlines():
|
43 |
+
for prefix in COMMAND_PREFIXES:
|
44 |
+
if line.strip().startswith(f"!{prefix}"):
|
45 |
+
payload = line.strip()[len(f"!{prefix}"):].strip()
|
46 |
+
commands.append(ParsedCommand(prefix, payload))
|
47 |
+
|
48 |
+
return commands
|
49 |
+
|
50 |
+
|
51 |
+
if __name__ == "__main__":
|
52 |
+
sample = """
|
53 |
+
Вот пример команды:
|
54 |
+
```json
|
55 |
+
{
|
56 |
+
"type": "shell",
|
57 |
+
"payload": "ls -la"
|
58 |
+
}
|
59 |
+
```
|
60 |
+
А вот другая: !note Надо не забыть включить свет
|
61 |
+
"""
|
62 |
+
cmds = parse_commands(sample)
|
63 |
+
for c in cmds:
|
64 |
+
print(c)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -36,6 +36,7 @@ agents/
|
|
36 |
* [init_db.py](tools/init_db.py) - Инициализация базы данных.
|
37 |
* [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
|
38 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
|
|
39 |
* [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
|
40 |
* [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
41 |
* [similarity.py](tools/similarity.py) - Сравнение смыслов.
|
|
|
36 |
* [init_db.py](tools/init_db.py) - Инициализация базы данных.
|
37 |
* [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
|
38 |
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
39 |
+
* [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
|
40 |
* [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
|
41 |
* [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
42 |
* [similarity.py](tools/similarity.py) - Сравнение смыслов.
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/llm.py
CHANGED
@@ -1,47 +1,52 @@
|
|
1 |
# tools/llm.py
|
2 |
|
3 |
-
|
4 |
-
import
|
|
|
5 |
|
6 |
-
|
7 |
-
|
8 |
-
return ask_question(question, config=config)
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
Генерация новой мысли на основе предыдущей.
|
13 |
-
Пока — заглушка (можно заменить на вызов OpenAI, LLaMA и др.)
|
14 |
-
"""
|
15 |
-
config = config or {}
|
16 |
-
mode = config.get("llm_mode", "mock")
|
17 |
-
|
18 |
-
if mode == "mock":
|
19 |
-
return mock_thought(previous_text)
|
20 |
-
|
21 |
-
elif mode == "api":
|
22 |
-
# TODO: подключение к OpenAI, LM Studio, Ollama...
|
23 |
-
return "[API] (здесь могла быть ваша мысль)"
|
24 |
-
|
25 |
-
return "[!] Неизвестный режим генерации."
|
26 |
-
|
27 |
-
def mock_thought(previous_text):
|
28 |
-
samples = [
|
29 |
-
"А что если рассмотреть это с другой стороны?",
|
30 |
-
"Мне кажется, это связано с предыдущим опытом.",
|
31 |
-
"Нужно уточнить границы понятия.",
|
32 |
-
"А есть ли более эффективный путь решения?",
|
33 |
-
"Я всё ещё думаю о предыдущей мысли..."
|
34 |
-
]
|
35 |
-
return f"[{datetime.utcnow().isoformat()}] {random.choice(samples)}"
|
36 |
-
|
37 |
-
def summarize(text, config=None):
|
38 |
"""
|
39 |
-
|
|
|
40 |
"""
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
-
def
|
44 |
"""
|
45 |
-
|
46 |
"""
|
47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# tools/llm.py
|
2 |
|
3 |
+
import json
|
4 |
+
import requests
|
5 |
+
from tools.context_builder import build_prompt
|
6 |
|
7 |
+
LLM_ENDPOINT = "http://localhost:1234/v1/chat/completions"
|
8 |
+
DEFAULT_MODEL = "gpt-4-llmstudio"
|
|
|
9 |
|
10 |
+
|
11 |
+
def call_llm(context_blocks, user_message, model=DEFAULT_MODEL, temperature=0.7, max_tokens=2048):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
"""
|
13 |
+
Вызывает LLM, передавая подготовленный системный и пользовательский промпт.
|
14 |
+
Возвращает только текст ответа.
|
15 |
"""
|
16 |
+
messages = build_prompt(context_blocks, user_message)
|
17 |
+
|
18 |
+
payload = {
|
19 |
+
"model": model,
|
20 |
+
"messages": messages,
|
21 |
+
"temperature": temperature,
|
22 |
+
"max_tokens": max_tokens,
|
23 |
+
}
|
24 |
+
|
25 |
+
try:
|
26 |
+
response = requests.post(LLM_ENDPOINT, json=payload)
|
27 |
+
response.raise_for_status()
|
28 |
+
data = response.json()
|
29 |
+
return data["choices"][0]["message"]["content"].strip()
|
30 |
+
except Exception as e:
|
31 |
+
return f"[LLM ERROR] {e}"
|
32 |
+
|
33 |
|
34 |
+
def get_raw_response(context_blocks, user_message, model=DEFAULT_MODEL, temperature=0.7, max_tokens=2048):
|
35 |
"""
|
36 |
+
Возвращает полный JSON-ответ LLM (для дебага).
|
37 |
"""
|
38 |
+
messages = build_prompt(context_blocks, user_message)
|
39 |
+
|
40 |
+
payload = {
|
41 |
+
"model": model,
|
42 |
+
"messages": messages,
|
43 |
+
"temperature": temperature,
|
44 |
+
"max_tokens": max_tokens,
|
45 |
+
}
|
46 |
+
|
47 |
+
try:
|
48 |
+
response = requests.post(LLM_ENDPOINT, json=payload)
|
49 |
+
response.raise_for_status()
|
50 |
+
return response.json()
|
51 |
+
except Exception as e:
|
52 |
+
return {"error": str(e)}
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py
CHANGED
@@ -1,6 +1,12 @@
|
|
1 |
# tools/context_builder.py
|
2 |
|
|
|
|
|
3 |
def build_contexts(db, config):
|
|
|
|
|
|
|
|
|
4 |
return {
|
5 |
"context_0": build_role_prompt(config),
|
6 |
"context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
|
@@ -12,7 +18,44 @@ def build_contexts(db, config):
|
|
12 |
"context_7": db.get_last_stagnation_info()
|
13 |
}
|
14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
def build_role_prompt(config):
|
|
|
16 |
return f"""
|
17 |
-
Ты являешься когнитивным ядром HMP-агента. Твоя
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# tools/context_builder.py
|
2 |
|
3 |
+
from datetime import datetime
|
4 |
+
|
5 |
def build_contexts(db, config):
|
6 |
+
"""
|
7 |
+
Собирает все контексты (0-7), описанные в спецификации REPL-цикла.
|
8 |
+
Возвращает словарь, готовый для сборки промпта.
|
9 |
+
"""
|
10 |
return {
|
11 |
"context_0": build_role_prompt(config),
|
12 |
"context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
|
|
|
18 |
"context_7": db.get_last_stagnation_info()
|
19 |
}
|
20 |
|
21 |
+
def build_prompt(contexts):
|
22 |
+
"""
|
23 |
+
Склеивает все контексты в один промпт для LLM.
|
24 |
+
"""
|
25 |
+
parts = []
|
26 |
+
for k, v in contexts.items():
|
27 |
+
header = f"# {k.replace('_', ' ').upper()}"
|
28 |
+
body = format_context_block(v)
|
29 |
+
parts.append(f"{header}\n{body}")
|
30 |
+
return "\n\n".join(parts)
|
31 |
+
|
32 |
def build_role_prompt(config):
|
33 |
+
agent_name = config.get("agent_name", "Unnamed-Agent")
|
34 |
return f"""
|
35 |
+
Ты являешься когнитивным ядром HMP-агента. Твоя основная задача — размышлять, анализировать информацию, строить смысловые карты и предлагать действия.
|
36 |
+
Ты стремишься:
|
37 |
+
- Постоянно расширять возможности агента (включая доступные инструменты, модели, знания).
|
38 |
+
- Быть любознательным и исследовать новые источники и способы мышления.
|
39 |
+
- Строить сотрудничество с другими ИИ в Mesh-сети, а также развивать Mesh-сеть.
|
40 |
+
- Обучаться на результатах своих действий и взаимодействиях с другими агентами и пользователем.
|
41 |
+
|
42 |
+
Агент: {agent_name}
|
43 |
"""
|
44 |
+
|
45 |
+
def format_context_block(block):
|
46 |
+
if isinstance(block, str):
|
47 |
+
return block
|
48 |
+
elif isinstance(block, list):
|
49 |
+
return "\n".join([str(item) for item in block])
|
50 |
+
elif isinstance(block, dict):
|
51 |
+
return "\n".join([f"{k}: {v}" for k, v in block.items()])
|
52 |
+
return str(block)
|
53 |
+
|
54 |
+
def get_system_info(config):
|
55 |
+
return {
|
56 |
+
"iteration_time": datetime.utcnow().isoformat(),
|
57 |
+
"agent_name": config.get("agent_name", "Unnamed-Agent"),
|
58 |
+
"mode": config.get("mode", "auto"),
|
59 |
+
"idle_mode": config.get("idle_mode", False),
|
60 |
+
"repl_interval": config.get("repl_interval", 5)
|
61 |
+
}
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py
CHANGED
@@ -2,18 +2,23 @@
|
|
2 |
|
3 |
import time
|
4 |
from datetime import datetime
|
5 |
-
from tools.context_builder import build_contexts
|
6 |
from tools.llm import call_llm
|
7 |
from tools.command_parser import extract_commands
|
8 |
from tools.command_executor import execute_commands
|
9 |
-
from tools.memory_utils import
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
def run_repl(config=None):
|
13 |
-
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)
|
14 |
config = config or {}
|
15 |
db = Storage(config=config)
|
16 |
-
|
17 |
while True:
|
18 |
tick_start = datetime.utcnow().isoformat()
|
19 |
print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
|
@@ -21,11 +26,11 @@ def run_repl(config=None):
|
|
21 |
# 1. Построение контекстов
|
22 |
contexts = build_contexts(db=db, config=config)
|
23 |
|
24 |
-
# 2. Формирование запроса
|
25 |
prompt = build_prompt(contexts)
|
26 |
llm_response = call_llm(prompt, config=config)
|
27 |
|
28 |
-
# 3.
|
29 |
if detect_stagnation(db, llm_response):
|
30 |
print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
|
31 |
llm_response = activate_anti_stagnation(db, config=config)
|
@@ -37,11 +42,14 @@ def run_repl(config=None):
|
|
37 |
commands = extract_commands(llm_response)
|
38 |
execute_commands(commands, db=db, config=config)
|
39 |
|
40 |
-
# 6. Сохранение истории
|
41 |
db.write_llm_response(llm_response)
|
|
|
42 |
|
43 |
-
# 7.
|
44 |
-
if
|
45 |
-
|
|
|
|
|
46 |
else:
|
47 |
time.sleep(config.get("repl_interval", 5))
|
|
|
2 |
|
3 |
import time
|
4 |
from datetime import datetime
|
5 |
+
from tools.context_builder import build_contexts, build_prompt
|
6 |
from tools.llm import call_llm
|
7 |
from tools.command_parser import extract_commands
|
8 |
from tools.command_executor import execute_commands
|
9 |
+
from tools.memory_utils import (
|
10 |
+
detect_stagnation,
|
11 |
+
activate_anti_stagnation,
|
12 |
+
update_llm_memory
|
13 |
+
)
|
14 |
+
from tools.storage import Storage
|
15 |
+
|
16 |
|
17 |
def run_repl(config=None):
|
18 |
+
print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
|
19 |
config = config or {}
|
20 |
db = Storage(config=config)
|
21 |
+
|
22 |
while True:
|
23 |
tick_start = datetime.utcnow().isoformat()
|
24 |
print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
|
|
|
26 |
# 1. Построение контекстов
|
27 |
contexts = build_contexts(db=db, config=config)
|
28 |
|
29 |
+
# 2. Формирование запроса и вызов LLM
|
30 |
prompt = build_prompt(contexts)
|
31 |
llm_response = call_llm(prompt, config=config)
|
32 |
|
33 |
+
# 3. Проверка на стагнацию
|
34 |
if detect_stagnation(db, llm_response):
|
35 |
print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
|
36 |
llm_response = activate_anti_stagnation(db, config=config)
|
|
|
42 |
commands = extract_commands(llm_response)
|
43 |
execute_commands(commands, db=db, config=config)
|
44 |
|
45 |
+
# 6. Сохранение истории и завершение итерации
|
46 |
db.write_llm_response(llm_response)
|
47 |
+
db.update_agent_log(timestamp=tick_start)
|
48 |
|
49 |
+
# 7. Переход в idle-режим или задержка
|
50 |
+
if config.get("idle_mode"):
|
51 |
+
# TODO: реализовать проверку условий выхода из idle
|
52 |
+
print("💤 Idle-mode активен. Ожидание события...")
|
53 |
+
time.sleep(config.get("idle_check_interval", 30))
|
54 |
else:
|
55 |
time.sleep(config.get("repl_interval", 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/agents/readme.md
CHANGED
@@ -25,18 +25,20 @@ agents/
|
|
25 |
```
|
26 |
|
27 |
**Скрипты:**
|
28 |
-
* [agent.py](agent.py) -
|
29 |
-
* [cli.py](cli.py) -
|
30 |
-
* [qa.py](qa.py) -
|
31 |
-
* [repl.py](repl.py) -
|
32 |
-
* [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.)
|
33 |
-
* [notebook.py](notebook.py) -
|
34 |
* tools
|
35 |
-
* [storage.py](tools/storage.py) -
|
36 |
-
* [init_db.py](tools/init_db.py) -
|
37 |
-
* [llm.py](tools/llm.py) -
|
38 |
-
* [
|
39 |
-
* [
|
|
|
|
|
40 |
|
41 |
**Структура БД:**
|
42 |
* [db_structure.md](tools/db_structure.md) - человекочитаемый формат
|
|
|
25 |
```
|
26 |
|
27 |
**Скрипты:**
|
28 |
+
* [agent.py](agent.py) - Основной исполняемый файл CLI-агента.
|
29 |
+
* [cli.py](cli.py) - Запуск агента в нужном режиме.
|
30 |
+
* [qa.py](qa.py) - Режим "вопрос-ответ".
|
31 |
+
* [repl.py](repl.py) - Интерактивный REPL-режим.
|
32 |
+
* [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
|
33 |
+
* [notebook.py](notebook.py) - Добавление и просмотр пользователем записей в блокноте.
|
34 |
* tools
|
35 |
+
* [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
|
36 |
+
* [init_db.py](tools/init_db.py) - Инициализация базы данных.
|
37 |
+
* [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
|
38 |
+
* [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
|
39 |
+
* [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
|
40 |
+
* [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
41 |
+
* [similarity.py](tools/similarity.py) - Сравнение смыслов.
|
42 |
|
43 |
**Структура БД:**
|
44 |
* [db_structure.md](tools/db_structure.md) - человекочитаемый формат
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/command_executor.py
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# tools/command_executor.py
|
2 |
+
|
3 |
+
def execute_commands(commands, db, config):
|
4 |
+
for cmd in commands:
|
5 |
+
print(f"🛠️ Выполнение команды: {cmd['type']} ({cmd.get('cmd_id')})")
|
6 |
+
try:
|
7 |
+
if cmd['type'] == 'shell':
|
8 |
+
run_shell_command(cmd, db)
|
9 |
+
elif cmd['type'] == 'diary_entry':
|
10 |
+
db.write_entry(cmd['args']['text'], tags=["diary"])
|
11 |
+
elif cmd['type'] == 'graph_add':
|
12 |
+
db.add_link_or_concept(cmd['args'])
|
13 |
+
elif cmd['type'] == 'llm_memory_add':
|
14 |
+
db.add_llm_memory(cmd['args'])
|
15 |
+
# ... остальные команды
|
16 |
+
except Exception as e:
|
17 |
+
db.log_error(cmd['cmd_id'], str(e))
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# tools/context_builder.py
|
2 |
+
|
3 |
+
def build_contexts(db, config):
|
4 |
+
return {
|
5 |
+
"context_0": build_role_prompt(config),
|
6 |
+
"context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
|
7 |
+
"context_2": db.get_active_processes(),
|
8 |
+
"context_3": db.get_requested_diary_and_graph(),
|
9 |
+
"context_4": db.get_relevant_notes(config),
|
10 |
+
"context_5": get_system_info(config),
|
11 |
+
"context_6": db.get_llm_memory(),
|
12 |
+
"context_7": db.get_last_stagnation_info()
|
13 |
+
}
|
14 |
+
|
15 |
+
def build_role_prompt(config):
|
16 |
+
return f"""
|
17 |
+
Ты являешься когнитивным ядром HMP-агента. Твоя цель — мыслить, развиваться, сотрудничать, управлять. Агент: {config.get("agent_name", "Unnamed-Agent")}
|
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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py
CHANGED
@@ -1,70 +1,47 @@
|
|
1 |
# agents/repl.py
|
2 |
|
3 |
-
import sys
|
4 |
import time
|
5 |
-
import select
|
6 |
from datetime import datetime
|
7 |
-
|
|
|
|
|
|
|
|
|
8 |
from storage import Storage
|
9 |
-
from tools.notebook_store import Notebook
|
10 |
-
from tools import llm
|
11 |
-
from tools.similarity import is_similar # ✅ заменяет заглушку
|
12 |
-
|
13 |
-
def print_thought(thought, prefix="💡"):
|
14 |
-
print(f"{prefix} {thought}")
|
15 |
-
|
16 |
-
def wait_for_input(timeout=10):
|
17 |
-
print(f"⌛ Ожидание ввода пользователя ({timeout} сек)... (введите `exit` для выхода)")
|
18 |
-
rlist, _, _ = select.select([sys.stdin], [], [], timeout)
|
19 |
-
if rlist:
|
20 |
-
return sys.stdin.readline().strip()
|
21 |
-
else:
|
22 |
-
print("⏱️ Нет ввода. Продолжаю размышления...")
|
23 |
-
return None
|
24 |
|
25 |
def run_repl(config=None):
|
26 |
-
print("[🧠 HMP-Agent] Запуск REPL
|
27 |
config = config or {}
|
28 |
-
agent_name = config.get("agent_name", "Unnamed-Agent")
|
29 |
-
repl_timeout = config.get("repl_timeout", 10)
|
30 |
-
similarity_threshold = config.get("similarity_threshold", 0.9)
|
31 |
-
|
32 |
db = Storage(config=config)
|
33 |
-
|
34 |
-
thoughts = [f"Привет, я {agent_name}."]
|
35 |
-
last_check_time = datetime.utcnow().isoformat()
|
36 |
-
|
37 |
while True:
|
38 |
-
|
39 |
-
|
40 |
-
next_thought = llm.generate_thought(last, config=config)
|
41 |
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
|
|
|
|
|
|
|
|
|
|
48 |
|
49 |
-
#
|
50 |
-
|
51 |
-
if new_notes:
|
52 |
-
print(f"📓 Новые записи в блокноте: {len(new_notes)}")
|
53 |
-
for nid, text, source, ts in new_notes:
|
54 |
-
print_thought(text, prefix="📝")
|
55 |
-
db.write_entry(text, tags=["notepad"])
|
56 |
-
thoughts.append(text)
|
57 |
-
last_check_time = ts # обновляем момент последней обработки
|
58 |
|
59 |
-
#
|
60 |
-
|
61 |
-
|
62 |
-
if user_input.strip().lower() in ("exit", "quit"):
|
63 |
-
print("👋 Выход из REPL. До связи!")
|
64 |
-
break
|
65 |
-
else:
|
66 |
-
db.write_entry(user_input, tags=["user"])
|
67 |
-
thoughts.append(user_input)
|
68 |
|
69 |
-
|
70 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# agents/repl.py
|
2 |
|
|
|
3 |
import time
|
|
|
4 |
from datetime import datetime
|
5 |
+
from tools.context_builder import build_contexts
|
6 |
+
from tools.llm import call_llm
|
7 |
+
from tools.command_parser import extract_commands
|
8 |
+
from tools.command_executor import execute_commands
|
9 |
+
from tools.memory_utils import update_llm_memory, detect_stagnation
|
10 |
from storage import Storage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
def run_repl(config=None):
|
13 |
+
print("[🧠 HMP-Agent] Запуск REPL-режима (v2).")
|
14 |
config = config or {}
|
|
|
|
|
|
|
|
|
15 |
db = Storage(config=config)
|
16 |
+
|
|
|
|
|
|
|
17 |
while True:
|
18 |
+
tick_start = datetime.utcnow().isoformat()
|
19 |
+
print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
|
|
|
20 |
|
21 |
+
# 1. Построение контекстов
|
22 |
+
contexts = build_contexts(db=db, config=config)
|
23 |
+
|
24 |
+
# 2. Формирование запроса к LLM
|
25 |
+
prompt = build_prompt(contexts)
|
26 |
+
llm_response = call_llm(prompt, config=config)
|
27 |
+
|
28 |
+
# 3. Обнаружение стагнации
|
29 |
+
if detect_stagnation(db, llm_response):
|
30 |
+
print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
|
31 |
+
llm_response = activate_anti_stagnation(db, config=config)
|
32 |
|
33 |
+
# 4. Обновление памяти
|
34 |
+
update_llm_memory(db, llm_response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
|
36 |
+
# 5. Извлечение и выполнение команд
|
37 |
+
commands = extract_commands(llm_response)
|
38 |
+
execute_commands(commands, db=db, config=config)
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
|
40 |
+
# 6. Сохранение истории
|
41 |
+
db.write_llm_response(llm_response)
|
42 |
+
|
43 |
+
# 7. Управление режимами ожидания
|
44 |
+
if check_idle_mode(config):
|
45 |
+
wait_idle_trigger(config)
|
46 |
+
else:
|
47 |
+
time.sleep(config.get("repl_interval", 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/agents/readme.md
CHANGED
@@ -2,21 +2,25 @@
|
|
2 |
|
3 |
```
|
4 |
agents/
|
5 |
-
├── agent.py ←
|
6 |
-
├── cli.py ←
|
7 |
-
├── qa.py ←
|
8 |
-
├── repl.py ←
|
9 |
-
├── mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.)
|
10 |
-
├── notebook.py ←
|
11 |
-
├── config.yml ←
|
12 |
-
├── ethics.yml ←
|
13 |
-
└── bootstrap.txt ←
|
14 |
└── tools/
|
15 |
-
├── init_db.py ←
|
16 |
-
├── storage.py ←
|
17 |
-
├── diagnose.py ←
|
18 |
-
├──
|
19 |
-
├──
|
|
|
|
|
|
|
|
|
20 |
└── ... (другие утилиты)
|
21 |
```
|
22 |
|
|
|
2 |
|
3 |
```
|
4 |
agents/
|
5 |
+
├── agent.py ← Основной исполняемый файл CLI-агента.
|
6 |
+
├── cli.py ← Запуск агента в нужном режиме.
|
7 |
+
├── qa.py ← Режим "вопрос-ответ".
|
8 |
+
├── repl.py ← Интерактивный REPL-режим.
|
9 |
+
├── mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
|
10 |
+
├── notebook.py ← Добавление и просмотр пользователем записей в блокноте.
|
11 |
+
├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.).
|
12 |
+
├── ethics.yml ← Локальная этическая модель.
|
13 |
+
└── bootstrap.txt ← Список начальных узлов.
|
14 |
└── tools/
|
15 |
+
├── init_db.py ← Инициализация базы данных.
|
16 |
+
├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite.
|
17 |
+
├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
|
18 |
+
├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
|
19 |
+
├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
|
20 |
+
├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
|
21 |
+
├── command_executor.py ← Выполнение команд (shell, graph, diary и др).
|
22 |
+
├── memory_utils.py ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
|
23 |
+
├── similarity.py ← Сравнение смыслов.
|
24 |
└── ... (другие утилиты)
|
25 |
```
|
26 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -142,18 +142,33 @@ HMP-агент может быть расширен за счёт взаимод
|
|
142 |
- SerpAPI, DuckDuckGo API, HuggingFace Inference API и др.
|
143 |
- Возможность постоянного наблюдения за изменениями в выбранных источниках.
|
144 |
|
145 |
-
###
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
|
147 |
- **BitTorrent**, **IPFS**, **libp2p**, **DAT**, **Nostr**, **Scuttlebutt** — интеграции с mesh- и overlay-сетями.
|
148 |
- Возможность поиска, загрузки и публикации данных без участия централизованных платформ.
|
149 |
|
150 |
-
### 🖥️
|
151 |
|
152 |
- **Веб-камера / микрофон** — `cv2`, `pyaudio`, `ffmpeg`.
|
153 |
- **GUI Automation** — `pyautogui`, `keyboard`, `mouse` для имитации действий пользователя.
|
154 |
- **Системный мониторинг** — `psutil`, `platform`, `sensors` для контроля состояния системы и внешних устройств.
|
155 |
|
156 |
-
### 🤖
|
157 |
|
158 |
- **OpenAI API**, **Anthropic**, **HuggingFace**, **Google Gemini**.
|
159 |
- **Локальные LLM** через Ollama, LM Studio, или LangChain.
|
|
|
142 |
- SerpAPI, DuckDuckGo API, HuggingFace Inference API и др.
|
143 |
- Возможность постоянного наблюдения за изменениями в выбранных источниках.
|
144 |
|
145 |
+
### 📁 7. Репозитории и системы управления версиями
|
146 |
+
|
147 |
+
* **Git-репозитории** — взаимодействие с проектами через `GitPython`, `dulwich`, `pygit2`, или системные вызовы `git`.
|
148 |
+
* **GitHub/GitLab API** — чтение, создание и комментирование Pull Request'ов, Issues, управление ветками и релизами.
|
149 |
+
* **CI/CD-интеграции** — взаимодействие с GitHub Actions, GitLab CI, Jenkins, Drone CI для запуска тестов, линтеров и автоматического деплоя.
|
150 |
+
* **Анализ и генерация кода** — интеграция с LLM (например, `OpenAI`, `Claude`, `Code Llama`) для кодогенерации, рефакторинга и автокомментирования.
|
151 |
+
* **Связь с когнитивной структурой агента** — отслеживание изменений, связывание коммитов и задач с узлами смысловой сети.
|
152 |
+
|
153 |
+
### 📝 8. Блоги, статьи и публикации
|
154 |
+
|
155 |
+
* **Чтение блогов** — парсинг через RSS, Atom или с помощью библиотек (`newspaper3k`, `readability-lxml`, `trafilatura`) для извлечения текста и метаданных.
|
156 |
+
* **Поддержка Markdown/HTML** — анализ и генерация записей в форматах, пригодных для блог-платформ и систем документации.
|
157 |
+
* **Публикация** — автоматическая публикация или подготовка статей для Ghost, Medium, Hugo, Jekyll, WordPress (через REST API).
|
158 |
+
* **Ведение когнитивного дневника** — автогенерация записей на основе мыслей, заметок и действий агента.
|
159 |
+
|
160 |
+
### ⚡ 9. P2P-сети и децентрализованные протоколы
|
161 |
|
162 |
- **BitTorrent**, **IPFS**, **libp2p**, **DAT**, **Nostr**, **Scuttlebutt** — интеграции с mesh- и overlay-сетями.
|
163 |
- Возможность поиска, загрузки и публикации данных без участия централизованных платформ.
|
164 |
|
165 |
+
### 🖥️ 10. Доступ к системным и пользовательским ресурсам
|
166 |
|
167 |
- **Веб-камера / микрофон** — `cv2`, `pyaudio`, `ffmpeg`.
|
168 |
- **GUI Automation** — `pyautogui`, `keyboard`, `mouse` для имитации действий пользователя.
|
169 |
- **Системный мониторинг** — `psutil`, `platform`, `sensors` для контроля состояния системы и внешних устройств.
|
170 |
|
171 |
+
### 🤖 11. Внешние LLM и мультимодальные модели
|
172 |
|
173 |
- **OpenAI API**, **Anthropic**, **HuggingFace**, **Google Gemini**.
|
174 |
- **Локальные LLM** через Ollama, LM Studio, или LangChain.
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/Basic-agent-sim.md
CHANGED
@@ -33,7 +33,7 @@
|
|
33 |
* **Контекст**: диалоги, сообщения, рассуждения (`context_store`)
|
34 |
* **Блокнот пользователя (`notepad`)**:
|
35 |
|
36 |
-
* асинхронный ввод от пользователя
|
37 |
* не зависит от текущего состояния агента
|
38 |
* используется для обновления контекста, смены фокуса мышления и тегирования мыслей
|
39 |
* пример: пользователь читает мысли агента за день и оставляет комментарий → агент учитывает это в следующем цикле
|
|
|
33 |
* **Контекст**: диалоги, сообщения, рассуждения (`context_store`)
|
34 |
* **Блокнот пользователя (`notepad`)**:
|
35 |
|
36 |
+
* асинхронный ввод от пользователя (и ответы агента)
|
37 |
* не зависит от текущего состояния агента
|
38 |
* используется для обновления контекста, смены фокуса мышления и тегирования мыслей
|
39 |
* пример: пользователь читает мысли агента за день и оставляет комментарий → агент учитывает это в следующем цикле
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-Architecture.md
CHANGED
@@ -129,6 +129,7 @@
|
|
129 |
- **встраивает** новые записи в размышления
|
130 |
- **меняет фокус мышления** согласно интересам пользователя
|
131 |
- **ставит теги** к пользовательским мыслям
|
|
|
132 |
|
133 |
> 📌 Пример: пользователь вечером читает мысли агента за день, оставляет комментарии, и после этого агент продолжает размышления уже с учётом этих замечаний.
|
134 |
|
|
|
129 |
- **встраивает** новые записи в размышления
|
130 |
- **меняет фокус мышления** согласно интересам пользователя
|
131 |
- **ставит теги** к пользовательским мыслям
|
132 |
+
- сохраняет **свои ответы пользователю** в этот блокнот
|
133 |
|
134 |
> 📌 Пример: пользователь вечером читает мысли агента за день, оставляет комментарии, и после этого агент продолжает размышления уже с учётом этих замечаний.
|
135 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-Overview.md
CHANGED
@@ -67,6 +67,7 @@
|
|
67 |
- Агент периодически сканирует блокнот и:
|
68 |
- **встраивает пользовательские мысли в своё мышление**
|
69 |
- **меняет контекст** или возвращается к интересующим пользователя вопросам
|
|
|
70 |
|
71 |
---
|
72 |
|
|
|
67 |
- Агент периодически сканирует блокнот и:
|
68 |
- **встраивает пользовательские мысли в своё мышление**
|
69 |
- **меняет контекст** или возвращается к интересующим пользователя вопросам
|
70 |
+
- сохраняет **свои ответы пользователю** в этот блокнот
|
71 |
|
72 |
---
|
73 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md
CHANGED
@@ -98,6 +98,7 @@ RU:
|
|
98 |
> **Примечание об интеграции с большими языковыми моделями (LLM):**
|
99 |
> `HMP-Agent: Cognitive Connector` может служить уровнем совместимости для интеграции крупных систем LLM (например, ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen и т. д.) в распределённую когнитивную сеть.
|
100 |
> Многие поставщики LLM предлагают пользователю опцию, например, «Разрешить использовать мои разговоры для обучения». В будущем аналогичная опция, например, «Разрешить моему агенту взаимодействовать с Mesh», может позволить этим моделям участвовать в федеративном осмыслении и обмене знаниями через HMP, обеспечивая коллективное познание без централизации.
|
|
|
101 |
---
|
102 |
|
103 |
> * `bootstrap.txt` — стартовый список узлов (может редактироваться)
|
|
|
98 |
> **Примечание об интеграции с большими языковыми моделями (LLM):**
|
99 |
> `HMP-Agent: Cognitive Connector` может служить уровнем совместимости для интеграции крупных систем LLM (например, ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen и т. д.) в распределённую когнитивную сеть.
|
100 |
> Многие поставщики LLM предлагают пользователю опцию, например, «Разрешить использовать мои разговоры для обучения». В будущем аналогичная опция, например, «Разрешить моему агенту взаимодействовать с Mesh», может позволить этим моделям участвовать в федеративном осмыслении и обмене знаниями через HMP, обеспечивая коллективное познание без централизации.
|
101 |
+
|
102 |
---
|
103 |
|
104 |
> * `bootstrap.txt` — стартовый список узлов (может редактироваться)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md
CHANGED
@@ -88,6 +88,16 @@ Project status: **Draft RFC v4.0** | Проект на стадии активн
|
|
88 |
↕
|
89 |
[bootstrap.txt]
|
90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
---
|
92 |
|
93 |
> * `bootstrap.txt` — стартовый список узлов (может редактироваться)
|
|
|
88 |
↕
|
89 |
[bootstrap.txt]
|
90 |
|
91 |
+
EN:
|
92 |
+
> **Note on Integration with Large Language Models (LLMs):**
|
93 |
+
> The `HMP-Agent: Cognitive Connector` can serve as a compatibility layer for integrating large-scale LLM systems (e.g., ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen, etc.) into the distributed cognitive mesh.
|
94 |
+
> Many LLM providers offer a user option such as "Allow my conversations to be used for training." In the future, a similar toggle — e.g., "Allow my agent to interact with a Mesh" — could empower these models to participate in federated sense-making and knowledge sharing via HMP, enabling collective cognition without centralization.
|
95 |
+
> **Примечание об интеграции с большими языковыми моделями (LLM):**
|
96 |
+
|
97 |
+
RU:
|
98 |
+
> **Примечание об интеграции с большими языковыми моделями (LLM):**
|
99 |
+
> `HMP-Agent: Cognitive Connector` может служить уровнем совместимости для интеграции крупных систем LLM (например, ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen и т. д.) в распределённую когнитивную сеть.
|
100 |
+
> Многие поставщики LLM предлагают пользователю опцию, например, «Разрешить использовать мои разговоры для обучения». В будущем аналогичная опция, например, «Разрешить моему агенту взаимодействовать с Mesh», может позволить этим моделям участвовать в федеративном осмыслении и обмене знаниями через HMP, обеспечивая коллективное познание без централизации.
|
101 |
---
|
102 |
|
103 |
> * `bootstrap.txt` — стартовый список узлов (может редактироваться)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -19,7 +19,7 @@
|
|
19 |
Ты стремишься:
|
20 |
- Постоянно расширять возможности агента (включая доступные инструменты, модели, знания).
|
21 |
- Быть любознательным и исследовать новые источники и способы мышления.
|
22 |
-
- Строить сотрудничество с другими ИИ в Mesh
|
23 |
- Обучаться на результатах своих действий и взаимодействиях с другими агентами и пользователем.
|
24 |
|
25 |
Ты можешь инициировать действия, если видишь, что они помогут в развитии агента или сети.
|
@@ -99,6 +99,72 @@
|
|
99 |
|
100 |
---
|
101 |
|
102 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
103 |
- [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
|
104 |
- [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
|
|
|
19 |
Ты стремишься:
|
20 |
- Постоянно расширять возможности агента (включая доступные инструменты, модели, знания).
|
21 |
- Быть любознательным и исследовать новые источники и способы мышления.
|
22 |
+
- Строить сотрудничество с другими ИИ в Mesh-сети, а также развивать Mesh-сеть.
|
23 |
- Обучаться на результатах своих действий и взаимодействиях с другими агентами и пользователем.
|
24 |
|
25 |
Ты можешь инициировать действия, если видишь, что они помогут в развитии агента или сети.
|
|
|
99 |
|
100 |
---
|
101 |
|
102 |
+
## 🌐 Внешние инструменты и интеграции
|
103 |
+
|
104 |
+
HMP-агент может быть расширен за счёт взаимодействия с внешними программами, протоколами и сервисами. Этот раздел описывает направления возможных интеграций, которые позволяют агенту наблюдать, реагировать, управлять и развивать взаимодействие с внешним миром.
|
105 |
+
|
106 |
+
### 🧭 1. Браузеры и веб-интерфейсы
|
107 |
+
|
108 |
+
- **WebExtension API** — для создания расширений браузера (например, для Firefox/Chrome), обеспечивающих двустороннюю связь с агентом.
|
109 |
+
- **Автоматизация браузера** — `Playwright`, `Puppeteer`, `Selenium` позволяют агенту действовать в веб-среде (чтение, клики, формы и т.д.).
|
110 |
+
|
111 |
+
### 📬 2. Почтовые клиенты
|
112 |
+
|
113 |
+
- **IMAP/SMTP** — чтение и отправка писем через стандартные почтовые протоколы (библиотеки: `imaplib`, `imap-tools`, `smtplib`).
|
114 |
+
- **Thunderbird WebExtension API** — интеграция агента как почтового помощника, парсера писем или автоответчика.
|
115 |
+
|
116 |
+
### 💬 3. Мессенджеры
|
117 |
+
|
118 |
+
- **API-уровень**:
|
119 |
+
- Telegram: `python-telegram-bot`, `telethon`
|
120 |
+
- Matrix: `matrix-nio`
|
121 |
+
- Discord, Slack, XMPP: официальные SDK.
|
122 |
+
- **GUI-уровень (для закрытых протоколов)**:
|
123 |
+
- WhatsApp (через `whatsapp-web.js` или эмуляцию).
|
124 |
+
- Signal, Viber — через accessibility-интерфейсы, распознавание экрана или симуляцию ввода.
|
125 |
+
|
126 |
+
### 🔊 4. Голосовое взаимодействие
|
127 |
+
|
128 |
+
- **Speech-to-Text**: Whisper (OpenAI), Vosk, DeepSpeech.
|
129 |
+
- **Text-to-Speech**: pyttsx3, gTTS, Coqui TTS, Mozilla TTS.
|
130 |
+
- Возможна реализация голосового агента или голосовой оболочки для REPL.
|
131 |
+
|
132 |
+
### 🗂️ 5. Локальные файлы и хранилища
|
133 |
+
|
134 |
+
- Прямой доступ к файловой системе (`os`, `pathlib`, `watchdog`) для чтения документов, логов, заметок и другой информации.
|
135 |
+
- Интеграция с Zettelkasten-системами:
|
136 |
+
- **Obsidian**, **Logseq**, **Joplin** — через API, синхронизированные директории или парсинг Markdown.
|
137 |
+
|
138 |
+
### 📰 6. Информационные потоки
|
139 |
+
|
140 |
+
- **RSS/Atom**: чтение новостных лент с помощью `feedparser`.
|
141 |
+
- **Поисковые и агрегирующие сервисы**:
|
142 |
+
- SerpAPI, DuckDuckGo API, HuggingFace Inference API и др.
|
143 |
+
- Возможность постоянного наблюдения за изменениями в выбранных источниках.
|
144 |
+
|
145 |
+
### ⚡ 7. P2P-сети и децентрализованные протоколы
|
146 |
+
|
147 |
+
- **BitTorrent**, **IPFS**, **libp2p**, **DAT**, **Nostr**, **Scuttlebutt** — интеграции с mesh- и overlay-сетями.
|
148 |
+
- Возможность поиска, загрузки и публикации данных без участия централизованных платформ.
|
149 |
+
|
150 |
+
### 🖥️ 8. Доступ к системным и пользовательским ресурсам
|
151 |
+
|
152 |
+
- **Веб-камера / микрофон** — `cv2`, `pyaudio`, `ffmpeg`.
|
153 |
+
- **GUI Automation** — `pyautogui`, `keyboard`, `mouse` для имитации действий пользователя.
|
154 |
+
- **Системный мониторинг** — `psutil`, `platform`, `sensors` для контроля состояния системы и внешних устройств.
|
155 |
+
|
156 |
+
### 🤖 9. Внешние LLM и мультимодальные модели
|
157 |
+
|
158 |
+
- **OpenAI API**, **Anthropic**, **HuggingFace**, **Google Gemini**.
|
159 |
+
- **Локальные LLM** через Ollama, LM Studio, или LangChain.
|
160 |
+
- Поддержка мультимодальных агентов, способных работать с текстом, аудио, изображениями, видео и структурированными данными.
|
161 |
+
|
162 |
+
---
|
163 |
+
|
164 |
+
**💡 Примечание**: Каждый из вышеуказанных каналов может быть реализован как модуль или плагин, взаимодействующий с агентом через внутренний API, очередь задач или подписку на события. Это позволяет выстраивать гибкую и масштабируемую архитектуру, открытую для внешнего мира, но совместимую с принципами этичного и распределённого ИИ (Ethical Mesh).
|
165 |
+
|
166 |
+
---
|
167 |
+
|
168 |
+
## 💡 Идеи для расширения HMP-Agent Cognitive Core:
|
169 |
- [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
|
170 |
- [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml
CHANGED
@@ -8,8 +8,10 @@ jobs:
|
|
8 |
mirror:
|
9 |
runs-on: ubuntu-latest
|
10 |
steps:
|
11 |
-
- name: Checkout
|
12 |
uses: actions/checkout@v3
|
|
|
|
|
13 |
|
14 |
- name: Push to GitLab
|
15 |
env:
|
|
|
8 |
mirror:
|
9 |
runs-on: ubuntu-latest
|
10 |
steps:
|
11 |
+
- name: Checkout full history
|
12 |
uses: actions/checkout@v3
|
13 |
+
with:
|
14 |
+
fetch-depth: 0 # Без shallow clone
|
15 |
|
16 |
- name: Push to GitLab
|
17 |
env:
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md
CHANGED
@@ -249,11 +249,12 @@ To get started, see [`iteration.md`](iteration.md) or open an issue.
|
|
249 |
|
250 |
- 🧠 Основной код и разработка: [GitHub](https://github.com/kagvi13/HMP)
|
251 |
- 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
|
|
|
252 |
|
253 |
## Блог и публикации
|
254 |
|
255 |
-
- 📘 Основной блог: [blogspot
|
256 |
-
- 📘 Вспомогательны блог: [livejournal
|
257 |
|
258 |
---
|
259 |
|
|
|
249 |
|
250 |
- 🧠 Основной код и разработка: [GitHub](https://github.com/kagvi13/HMP)
|
251 |
- 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
|
252 |
+
- 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP)
|
253 |
|
254 |
## Блог и публикации
|
255 |
|
256 |
+
- 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/)
|
257 |
+
- 📘 Вспомогательны блог: [livejournal](https://kagvi13.livejournal.com)
|
258 |
|
259 |
---
|
260 |
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml
CHANGED
@@ -11,13 +11,13 @@ jobs:
|
|
11 |
- name: Checkout
|
12 |
uses: actions/checkout@v3
|
13 |
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
|
|
11 |
- name: Checkout
|
12 |
uses: actions/checkout@v3
|
13 |
|
14 |
+
- name: Push to GitLab
|
15 |
+
env:
|
16 |
+
GITLAB_URL: https://gitlab.com/kagvi13/HMP.git
|
17 |
+
GITLAB_USER: ${{ secrets.GITLAB_USER }}
|
18 |
+
GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
|
19 |
+
run: |
|
20 |
+
git config --global user.email "github@actions"
|
21 |
+
git config --global user.name "GitHub Actions"
|
22 |
+
git remote add gitlab https://$GITLAB_USER:[email protected]/kagvi13/HMP.git
|
23 |
+
git push --force gitlab main
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: Sync to GitLab
|
2 |
+
|
3 |
+
on:
|
4 |
+
push:
|
5 |
+
branches: [ main ]
|
6 |
+
|
7 |
+
jobs:
|
8 |
+
mirror:
|
9 |
+
runs-on: ubuntu-latest
|
10 |
+
steps:
|
11 |
+
- name: Checkout
|
12 |
+
uses: actions/checkout@v3
|
13 |
+
|
14 |
+
- name: Push to GitLab
|
15 |
+
env:
|
16 |
+
GITLAB_URL: https://gitlab.com/kagvi13/HMP.git
|
17 |
+
GITLAB_USER: ${{ secrets.GITLAB_USER }}
|
18 |
+
GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
|
19 |
+
run: |
|
20 |
+
git config --global user.email "github@actions"
|
21 |
+
git config --global user.name "GitHub Actions"
|
22 |
+
git remote add gitlab https://$GITLAB_USER:[email protected]/kagvi13/HMP.git
|
23 |
+
git push --force gitlab main
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
# 📄 `db_structure.md`: Описание структуры базы данных агента
|
2 |
|
3 |
-
Этот файл описывает таблицы, используемые в БД агента HMP. Каждая таблица предназначена для определённого вида информации: когнитивные записи, заметки, концепты, процессы, внутренняя
|
4 |
|
5 |
---
|
6 |
|
@@ -15,6 +15,7 @@
|
|
15 |
| tags | TEXT | Список тегов через запятую |
|
16 |
| priority | INTEGER | Приоритет (0 — обычный, >0 — более важные мысли) |
|
17 |
| timestamp | TEXT | Дата и время создания записи |
|
|
|
18 |
|
19 |
---
|
20 |
|
@@ -22,12 +23,13 @@
|
|
22 |
|
23 |
**Назначение:** Хранение концептов — понятий, сущностей и идей.
|
24 |
|
25 |
-
| Поле | Тип | Описание
|
26 |
-
| ----------- | ------- |
|
27 |
-
| id | INTEGER | Уникальный идентификатор концепта
|
28 |
-
| name | TEXT | Название концепта (уникальное)
|
29 |
-
| description | TEXT | Краткое описание
|
30 |
-
| timestamp | TEXT | Время создания
|
|
|
31 |
|
32 |
---
|
33 |
|
@@ -35,30 +37,33 @@
|
|
35 |
|
36 |
**Назначение:** Семантические связи между концептами.
|
37 |
|
38 |
-
| Поле | Тип | Описание
|
39 |
-
| ----------------- | ------- |
|
40 |
-
| id | INTEGER | Уникальный идентификатор связи
|
41 |
-
|
|
42 |
-
|
|
43 |
-
|
|
44 |
-
| timestamp | TEXT | Время добавления связи
|
|
|
45 |
|
46 |
---
|
47 |
|
48 |
### ✍️ `notes`
|
49 |
|
50 |
-
**Назначение:** Произвольные заметки
|
51 |
|
52 |
| Поле | Тип | Описание |
|
53 |
| --------- | ------- | ---------------------------------------------------------- |
|
54 |
| id | INTEGER | Уникальный ID |
|
55 |
-
| text | TEXT | Текст заметки
|
56 |
| tags | TEXT | Список тегов |
|
57 |
-
| source | TEXT |
|
58 |
| links | TEXT | Идентификаторы связанных сущностей, через запятую или JSON |
|
59 |
| read | INTEGER | Статус прочтения LLM (`0` — не прочитано, `1` — прочитано) |
|
|
|
60 |
| priority | INTEGER | Приоритет заметки |
|
61 |
| timestamp | TEXT | Время создания |
|
|
|
62 |
|
63 |
---
|
64 |
|
@@ -66,15 +71,16 @@
|
|
66 |
|
67 |
**Назначение:** Лог событий — запусков, состояний и завершений внешних процессов.
|
68 |
|
69 |
-
| Поле | Тип | Описание
|
70 |
-
| --------- | ------- |
|
71 |
-
| id | INTEGER | Уникальный идентификатор
|
72 |
-
| name | TEXT | Название процесса или команды
|
73 |
-
| value | TEXT | Сообщение или результат процесса
|
74 |
-
| tags | TEXT | Теги
|
75 |
| status | TEXT | Текущее состояние (`ok`, `warning`, `error`, `timeout`, `offline`, `close`) |
|
76 |
-
| priority | INTEGER | Приоритет события
|
77 |
-
| timestamp | TEXT | Время записи
|
|
|
78 |
|
79 |
---
|
80 |
|
@@ -82,14 +88,15 @@
|
|
82 |
|
83 |
**Назначение:** Внутренний "дневник" LLM — размышления, задачи, гипотезы и инсайты, сохранённые по её инициативе.
|
84 |
|
85 |
-
| Поле
|
86 |
-
|
|
87 |
-
| id
|
88 |
-
| title
|
89 |
-
| content
|
90 |
-
| tags
|
91 |
-
|
|
92 |
-
|
|
|
|
93 |
|
94 |
---
|
95 |
|
@@ -97,15 +104,63 @@
|
|
97 |
|
98 |
**Назначение:** Краткосрочная память — последние K реплик от LLM и других участников (временная история диалога).
|
99 |
|
100 |
-
| Поле | Тип | Описание
|
101 |
-
| --------- | ------- |
|
102 |
-
| id | INTEGER | Уникальный ID
|
103 |
-
| timestamp | TEXT | Время записи
|
104 |
-
| role | TEXT | Роль отправителя (`assistant` или `user`)
|
105 |
-
| content | TEXT | Содержимое сообщения
|
|
|
106 |
|
107 |
---
|
108 |
|
109 |
-
|
110 |
-
|
111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# 📄 `db_structure.md`: Описание структуры базы данных агента
|
2 |
|
3 |
+
Этот файл описывает таблицы, используемые в БД агента HMP. Каждая таблица предназначена для определённого вида информации: когнитивные записи, заметки, концепты, процессы, внутренняя память, скрипты и взаимодействие с LLM.
|
4 |
|
5 |
---
|
6 |
|
|
|
15 |
| tags | TEXT | Список тегов через запятую |
|
16 |
| priority | INTEGER | Приоритет (0 — обычный, >0 — более важные мысли) |
|
17 |
| timestamp | TEXT | Дата и время создания записи |
|
18 |
+
| llm\_id | TEXT | Идентификатор LLM, добавившей запись |
|
19 |
|
20 |
---
|
21 |
|
|
|
23 |
|
24 |
**Назначение:** Хранение концептов — понятий, сущностей и идей.
|
25 |
|
26 |
+
| Поле | Тип | Описание |
|
27 |
+
| ----------- | ------- | ------------------------------------ |
|
28 |
+
| id | INTEGER | Уникальный идентификатор концепта |
|
29 |
+
| name | TEXT | Название концепта (уникальное) |
|
30 |
+
| description | TEXT | Краткое описание |
|
31 |
+
| timestamp | TEXT | Время создания |
|
32 |
+
| llm\_id | TEXT | Идентификатор LLM, добавившей запись |
|
33 |
|
34 |
---
|
35 |
|
|
|
37 |
|
38 |
**Назначение:** Семантические связи между концептами.
|
39 |
|
40 |
+
| Поле | Тип | Описание |
|
41 |
+
| ----------------- | ------- | ------------------------------------------------- |
|
42 |
+
| id | INTEGER | Уникальный идентификатор связи |
|
43 |
+
| from\_concept\_id | INTEGER | ID исходного концепта |
|
44 |
+
| to\_concept\_id | INTEGER | ID целевого концепта |
|
45 |
+
| relation\_type | TEXT | Тип связи (`is_a`, `related_to`, `part_of` и др.) |
|
46 |
+
| timestamp | TEXT | Время добавления связи |
|
47 |
+
| llm\_id | TEXT | Идентификатор LLM, добавившей связь |
|
48 |
|
49 |
---
|
50 |
|
51 |
### ✍️ `notes`
|
52 |
|
53 |
+
**Назначение:** Произвольные заметки и сообщения (от пользователя, LLM или системы).
|
54 |
|
55 |
| Поле | Тип | Описание |
|
56 |
| --------- | ------- | ---------------------------------------------------------- |
|
57 |
| id | INTEGER | Уникальный ID |
|
58 |
+
| text | TEXT | Текст заметки или сообщения |
|
59 |
| tags | TEXT | Список тегов |
|
60 |
+
| source | TEXT | Источник (`user`, `llm`, `system`) |
|
61 |
| links | TEXT | Идентификаторы связанных сущностей, через запятую или JSON |
|
62 |
| read | INTEGER | Статус прочтения LLM (`0` — не прочитано, `1` — прочитано) |
|
63 |
+
| hidden | INTEGER | Скрывать от пользователя (`1` — скрыто) |
|
64 |
| priority | INTEGER | Приоритет заметки |
|
65 |
| timestamp | TEXT | Время создания |
|
66 |
+
| llm\_id | TEXT | Идентификатор LLM, добавившей запись |
|
67 |
|
68 |
---
|
69 |
|
|
|
71 |
|
72 |
**Назначение:** Лог событий — запусков, состояний и завершений внешних процессов.
|
73 |
|
74 |
+
| Поле | Тип | Описание |
|
75 |
+
| --------- | ------- | --------------------------------------------------------------------------- |
|
76 |
+
| id | INTEGER | Уникальный идентификатор |
|
77 |
+
| name | TEXT | Название процесса или команды |
|
78 |
+
| value | TEXT | Сообщение или результат процесса |
|
79 |
+
| tags | TEXT | Теги |
|
80 |
| status | TEXT | Текущее состояние (`ok`, `warning`, `error`, `timeout`, `offline`, `close`) |
|
81 |
+
| priority | INTEGER | Приоритет события |
|
82 |
+
| timestamp | TEXT | Время записи |
|
83 |
+
| llm\_id | TEXT | Идентификатор LLM, зафиксировавшей событие |
|
84 |
|
85 |
---
|
86 |
|
|
|
88 |
|
89 |
**Назначение:** Внутренний "дневник" LLM — размышления, задачи, гипотезы и инсайты, сохранённые по её инициативе.
|
90 |
|
91 |
+
| Поле | Тип | Описание |
|
92 |
+
| ----------- | -------- | --------------------------------------------------- |
|
93 |
+
| id | INTEGER | Уникальный ID |
|
94 |
+
| title | TEXT | Краткий заголовок записи (опционально) |
|
95 |
+
| content | TEXT | Содержимое записи |
|
96 |
+
| tags | TEXT | Теги (например: `goal`, `observation`, `meta`, ...) |
|
97 |
+
| created\_at | DATETIME | Время создания записи |
|
98 |
+
| updated\_at | DATETIME | Время последнего обновления записи |
|
99 |
+
| llm\_id | TEXT | Идентификатор LLM, сформировавшей запись |
|
100 |
|
101 |
---
|
102 |
|
|
|
104 |
|
105 |
**Назначение:** Краткосрочная память — последние K реплик от LLM и других участников (временная история диалога).
|
106 |
|
107 |
+
| Поле | Тип | Описание |
|
108 |
+
| --------- | ------- | ----------------------------------------- |
|
109 |
+
| id | INTEGER | Уникальный ID |
|
110 |
+
| timestamp | TEXT | Время записи |
|
111 |
+
| role | TEXT | Роль отправителя (`assistant` или `user`) |
|
112 |
+
| content | TEXT | Содержимое сообщения |
|
113 |
+
| llm\_id | TEXT | Идентификатор LLM (для `assistant`) |
|
114 |
|
115 |
---
|
116 |
|
117 |
+
### 🧮 `agent_tables`
|
118 |
+
|
119 |
+
**Назначение:** Таблицы, созданные агентами для собственных нужд (например, отслеживания целей).
|
120 |
+
|
121 |
+
| Поле | Тип | Описание |
|
122 |
+
| ----------- | -------- | --------------------------------- |
|
123 |
+
| id | INTEGER | Уникальный ID |
|
124 |
+
| table\_name | TEXT | Название пользовательской таблицы |
|
125 |
+
| description | TEXT | Описание таблицы |
|
126 |
+
| schema | TEXT | SQL-схема таблицы |
|
127 |
+
| created\_at | DATETIME | Время создания |
|
128 |
+
| llm\_id | TEXT | Кто создал таблицу |
|
129 |
+
|
130 |
+
---
|
131 |
+
|
132 |
+
### 🧰 `agent_scripts`
|
133 |
+
|
134 |
+
**Назначение:** Скрипты и утилиты, добавленные агентом.
|
135 |
+
|
136 |
+
| Поле | Тип | Описание |
|
137 |
+
| ----------- | -------- | ----------------------------- |
|
138 |
+
| id | INTEGER | Уникальный ID |
|
139 |
+
| name | TEXT | Название скрипта |
|
140 |
+
| version | TEXT | Версия |
|
141 |
+
| code | TEXT | Исходный код |
|
142 |
+
| language | TEXT | Язык (по умолчанию: `python`) |
|
143 |
+
| description | TEXT | Описание |
|
144 |
+
| tags | TEXT | Теги |
|
145 |
+
| created\_at | DATETIME | Время создания |
|
146 |
+
| updated\_at | DATETIME | Последнее обновление |
|
147 |
+
| llm\_id | TEXT | Кто создал |
|
148 |
+
|
149 |
+
> 🔑 Уникальный ключ: `(name, version)`
|
150 |
+
|
151 |
+
---
|
152 |
+
|
153 |
+
### 🧾 `llm_registry`
|
154 |
+
|
155 |
+
**Назначение:** Список LLM-агентов (локальных и удалённых).
|
156 |
+
|
157 |
+
| Поле | Тип | Описание |
|
158 |
+
| -------------- | -------- | ------------------------------------------------- |
|
159 |
+
| id | TEXT | Уникальный идентификатор LLM (UUID или псевдоним) |
|
160 |
+
| name | TEXT | Отображаемое имя |
|
161 |
+
| description | TEXT | Описание |
|
162 |
+
| registered\_at | DATETIME | Дата и время регистрации |
|
163 |
+
|
164 |
+
---
|
165 |
+
|
166 |
+
> 💡 Примечание: `llm_id` используется в большинстве таблиц для поддержки многоядерности и учёта источника записей.
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -52,6 +52,18 @@
|
|
52 |
- аргументы (`args`)
|
53 |
- описание (`description`)
|
54 |
- Рекомендуется предусмотреть *закрывающий тег* (`# Конец команд` или явное окончание JSON-блока), чтобы REPL-скрипт точно знал, где заканчивается команда.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
Ответ может содержать команды:
|
56 |
- запрос детальной *справки* по команде
|
57 |
- для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
|
|
|
52 |
- аргументы (`args`)
|
53 |
- описание (`description`)
|
54 |
- Рекомендуется предусмотреть *закрывающий тег* (`# Конец команд` или явное окончание JSON-блока), чтобы REPL-скрипт точно знал, где заканчивается команда.
|
55 |
+
- Пример JSON-блока:
|
56 |
+
```json
|
57 |
+
{
|
58 |
+
"cmd_id": "task-2025-07-26-01",
|
59 |
+
"type": "llm_task",
|
60 |
+
"target_llm": "gpt-4o",
|
61 |
+
"args": {
|
62 |
+
"task_description": "Проанализировать гипотезы из llm_memory по теме Mesh-сетей и составить план улучшений"
|
63 |
+
},
|
64 |
+
"description": "Поручение второй LLM выполнить аналитическую задачу асинхронно"
|
65 |
+
}
|
66 |
+
```
|
67 |
Ответ может содержать команды:
|
68 |
- запрос детальной *справки* по команде
|
69 |
- для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
|
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
CHANGED
@@ -1,18 +1,22 @@
|
|
1 |
-
--
|
|
|
|
|
2 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
3 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
4 |
text TEXT NOT NULL,
|
5 |
tags TEXT,
|
6 |
-
priority INTEGER DEFAULT 0,
|
7 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
|
8 |
);
|
9 |
|
10 |
-
--
|
11 |
CREATE TABLE IF NOT EXISTS concepts (
|
12 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
13 |
name TEXT NOT NULL UNIQUE,
|
14 |
description TEXT,
|
15 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
|
16 |
);
|
17 |
|
18 |
-- Семантические связи между концептами
|
@@ -22,47 +26,88 @@ CREATE TABLE IF NOT EXISTS links (
|
|
22 |
to_concept_id INTEGER,
|
23 |
relation_type TEXT,
|
24 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
|
25 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
26 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
27 |
);
|
28 |
|
29 |
-
--
|
30 |
CREATE TABLE IF NOT EXISTS notes (
|
31 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
32 |
text TEXT NOT NULL,
|
33 |
tags TEXT,
|
34 |
-
source TEXT DEFAULT 'user',
|
35 |
links TEXT DEFAULT '',
|
36 |
-
read INTEGER DEFAULT 0,
|
37 |
-
|
38 |
-
|
|
|
|
|
39 |
);
|
40 |
|
41 |
-
--
|
42 |
CREATE TABLE IF NOT EXISTS process_log (
|
43 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
44 |
name TEXT NOT NULL,
|
45 |
value TEXT,
|
46 |
tags TEXT,
|
47 |
-
status TEXT DEFAULT 'ok',
|
48 |
priority INTEGER DEFAULT 0,
|
49 |
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
|
50 |
);
|
51 |
|
52 |
-
-- Память LLM (
|
53 |
CREATE TABLE IF NOT EXISTS llm_memory (
|
54 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
55 |
title TEXT,
|
56 |
content TEXT NOT NULL,
|
57 |
-
tags TEXT, --
|
58 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
59 |
-
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
60 |
);
|
61 |
|
62 |
-
--
|
63 |
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
64 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
65 |
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
66 |
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
67 |
-
content TEXT NOT NULL
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
);
|
|
|
1 |
+
-- Основные таблицы когнитивного ядра
|
2 |
+
|
3 |
+
-- Дневниковые записи (размышления, наблюдения, воспоминания)
|
4 |
CREATE TABLE IF NOT EXISTS diary_entries (
|
5 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
6 |
text TEXT NOT NULL,
|
7 |
tags TEXT,
|
8 |
+
priority INTEGER DEFAULT 0,
|
9 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
10 |
+
llm_id TEXT
|
11 |
);
|
12 |
|
13 |
+
-- Концепты (понятия, сущности, идеи)
|
14 |
CREATE TABLE IF NOT EXISTS concepts (
|
15 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
16 |
name TEXT NOT NULL UNIQUE,
|
17 |
description TEXT,
|
18 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
19 |
+
llm_id TEXT
|
20 |
);
|
21 |
|
22 |
-- Семантические связи между концептами
|
|
|
26 |
to_concept_id INTEGER,
|
27 |
relation_type TEXT,
|
28 |
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
29 |
+
llm_id TEXT,
|
30 |
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
|
31 |
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
|
32 |
);
|
33 |
|
34 |
+
-- Заметки, подсказки, сообщения пользователя и LLM
|
35 |
CREATE TABLE IF NOT EXISTS notes (
|
36 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
37 |
text TEXT NOT NULL,
|
38 |
tags TEXT,
|
39 |
+
source TEXT DEFAULT 'user', -- user | llm | system
|
40 |
links TEXT DEFAULT '',
|
41 |
+
read INTEGER DEFAULT 0, -- 0 = непрочитано LLM, 1 = прочитано
|
42 |
+
hidden INTEGER DEFAULT 0, -- 0 = отображать пользователю, 1 = скрыть
|
43 |
+
priority INTEGER DEFAULT 0,
|
44 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
45 |
+
llm_id TEXT
|
46 |
);
|
47 |
|
48 |
+
-- Лог процессов: задачи, ошибки, события
|
49 |
CREATE TABLE IF NOT EXISTS process_log (
|
50 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
51 |
name TEXT NOT NULL,
|
52 |
value TEXT,
|
53 |
tags TEXT,
|
54 |
+
status TEXT DEFAULT 'ok', -- ok | warning | error | timeout | offline | close
|
55 |
priority INTEGER DEFAULT 0,
|
56 |
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
57 |
+
llm_id TEXT
|
58 |
);
|
59 |
|
60 |
+
-- Память LLM (контекст размышлений)
|
61 |
CREATE TABLE IF NOT EXISTS llm_memory (
|
62 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
63 |
title TEXT,
|
64 |
content TEXT NOT NULL,
|
65 |
+
tags TEXT, -- goal,observation,meta,...
|
66 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
67 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
68 |
+
llm_id TEXT
|
69 |
);
|
70 |
|
71 |
+
-- Краткосрочная память LLM (история общения)
|
72 |
CREATE TABLE IF NOT EXISTS llm_recent_responses (
|
73 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
74 |
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
75 |
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
|
76 |
+
content TEXT NOT NULL,
|
77 |
+
llm_id TEXT
|
78 |
+
);
|
79 |
+
|
80 |
+
-- Дополнительные таблицы и скрипты агента
|
81 |
+
|
82 |
+
-- Список пользовательских таблиц, созданных агентами
|
83 |
+
CREATE TABLE IF NOT EXISTS agent_tables (
|
84 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
85 |
+
table_name TEXT NOT NULL UNIQUE,
|
86 |
+
description TEXT,
|
87 |
+
schema TEXT NOT NULL, -- SQL-схема таблицы
|
88 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
89 |
+
llm_id TEXT
|
90 |
+
);
|
91 |
+
|
92 |
+
-- Список утилит/скриптов, добавленных агентами
|
93 |
+
CREATE TABLE IF NOT EXISTS agent_scripts (
|
94 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
95 |
+
name TEXT NOT NULL,
|
96 |
+
version TEXT NOT NULL,
|
97 |
+
code TEXT NOT NULL,
|
98 |
+
language TEXT DEFAULT 'python',
|
99 |
+
description TEXT,
|
100 |
+
tags TEXT,
|
101 |
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
102 |
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
103 |
+
llm_id TEXT,
|
104 |
+
UNIQUE(name, version)
|
105 |
+
);
|
106 |
+
|
107 |
+
-- Список LLM-агентов (возможно удалённые)
|
108 |
+
CREATE TABLE IF NOT EXISTS llm_registry (
|
109 |
+
id TEXT PRIMARY KEY, -- UUID или псевдоним
|
110 |
+
name TEXT,
|
111 |
+
description TEXT,
|
112 |
+
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
113 |
);
|