HMP / hf_repo /agents /agent.py
GitHub Action
Sync from GitHub with Git LFS
376ee15
raw
history blame
5.28 kB
# agents/agent.py
import argparse
import yaml
import time
import threading
import sys
from storage import Storage
def load_config(path="config.yml"):
try:
with open(path, "r", encoding="utf-8") as f:
return yaml.safe_load(f)
except FileNotFoundError:
print(f"[Error] Config file not found: {path}")
return {}
except yaml.YAMLError as e:
print(f"[Error] Failed to parse YAML config: {e}")
return {}
def main():
parser = argparse.ArgumentParser(description="HMP Agent CLI")
parser.add_argument("--config", default="config.yml", help="Путь к конфигурационному файлу")
subparsers = parser.add_subparsers(dest="command")
# 🧠 Diary commands
write_parser = subparsers.add_parser("write_entry", help="Добавить запись в когнитивный дневник")
write_parser.add_argument("text")
write_parser.add_argument("--tags", nargs="*", help="Теги (опционально)")
read_parser = subparsers.add_parser("read_entries", help="Показать последние записи")
read_parser.add_argument("--limit", type=int, default=5)
search_time_parser = subparsers.add_parser("search_entries_by_time", help="Поиск записей по временному диапазону")
search_time_parser.add_argument("--from_ts", required=True)
search_time_parser.add_argument("--to_ts", required=True)
# 🔗 Graph commands
concept_parser = subparsers.add_parser("add_concept", help="Добавить концепт")
concept_parser.add_argument("name")
concept_parser.add_argument("--description", help="Описание (опционально)")
link_parser = subparsers.add_parser("add_link", help="Добавить связь")
link_parser.add_argument("--from_node", type=int, required=True)
link_parser.add_argument("--to_node", type=int, required=True)
link_parser.add_argument("--relation", required=True)
expand_parser = subparsers.add_parser("expand_graph", help="Расширить граф от узла с глубиной")
expand_parser.add_argument("--start_id", type=int, required=True)
expand_parser.add_argument("--depth", type=int, default=1)
args = parser.parse_args()
# Загрузка конфигурации
config = load_config(args.config)
storage = Storage(config=config)
print(f"[Agent] Запущена команда: {args.command}")
# 📓 Diary logic
if args.command == "write_entry":
storage.write_entry(args.text, args.tags)
print("✅ Запись добавлена.")
elif args.command == "read_entries":
for entry in storage.read_entries(limit=args.limit):
print(f"[{entry[0]}] {entry[1]} | tags: {entry[2]} | ts: {entry[3]}")
elif args.command == "search_entries_by_time":
results = storage.search_entries_by_time(args.from_ts, args.to_ts)
for e in results:
print(f"[{e[0]}] {e[1]} | tags: {e[2]} | ts: {e[3]}")
# 🧠 Graph logic
elif args.command == "add_concept":
cid = storage.add_concept(args.name, args.description)
print(f"✅ Концепт добавлен с ID: {cid}")
elif args.command == "add_link":
storage.add_link(args.from_node, args.to_node, args.relation)
print("✅ Связь добавлена.")
elif args.command == "expand_graph":
links = storage.expand_graph(args.start_id, args.depth)
print(f"📐 Подграф (до глубины {args.depth}):")
for src, tgt, rel in links:
print(f"{src} --[{rel}]--> {tgt}")
else:
parser.print_help()
storage.close()
# 🌐 MCP Agent Logic
def run_mcp_agent(config):
print(f"[HMP-MCP] MCP-Agent '{config.get('agent_name', 'unnamed')}' запущен в DHT-режиме")
bootstrap_path = config.get("bootstrap_file", "bootstrap.txt")
update_interval = config.get("update_interval", 30)
enable_api = config.get("serve_api", True)
def load_bootstrap():
try:
with open(bootstrap_path, "r") as f:
return [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print("[Warning] bootstrap.txt не найден. Запуск без исходных узлов.")
return []
def update_dht():
nodes = load_bootstrap()
print(f"[MCP] Найдено {len(nodes)} узлов в bootstrap.txt:")
for node in nodes:
print(f" ↪️ Пинг {node} (заглушка)")
print("[MCP] Обновление DHT завершено.")
def mcp_loop():
while True:
update_dht()
time.sleep(update_interval)
threading.Thread(target=mcp_loop, daemon=True).start()
if enable_api:
print("[MCP] REST API (заглушка) доступен по адресу http://localhost:8000/")
print(" В будущем: /bootstrap, /status, /reputation/:id и пр.")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("\n[MCP] MCP-Agent завершает работу.")
if __name__ == "__main__":
main()