Обновить memory_client.py
This commit is contained in:
+93
-48
@@ -1,58 +1,103 @@
|
|||||||
# memory_client.py
|
import argparse
|
||||||
"""
|
import json
|
||||||
Асинхронный клиент для тестирования работы MCP-сервера памяти.
|
import sys
|
||||||
Использует FastMCP Client и демонстрирует вызовы инструментов:
|
from pathlib import Path
|
||||||
- save_with_namespace
|
|
||||||
- get_by_namespace
|
|
||||||
- list_keys
|
|
||||||
"""
|
|
||||||
|
|
||||||
from fastmcp import Client
|
import requests
|
||||||
import asyncio
|
from rich import print
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.table import Table
|
||||||
|
|
||||||
async def main() -> None:
|
console = Console()
|
||||||
|
|
||||||
|
|
||||||
|
def _request(method: str, url: str, **kwargs):
|
||||||
"""
|
"""
|
||||||
Основная точка входа: создаём клиент, подключаемся к серверу,
|
Универсальная обёртка над requests для работы с MCP‑сервером.
|
||||||
вызываем инструменты и выводим результаты.
|
|
||||||
"""
|
"""
|
||||||
# Создаём клиента, указывая путь к исполняемому файлу сервера
|
|
||||||
client = Client("python memory_server.py")
|
|
||||||
|
|
||||||
# Подключаемся к серверу (асинхронно)
|
|
||||||
await client.connect()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Сохраняем данные в namespace 'default'
|
resp = requests.request(method, url, timeout=10, **kwargs)
|
||||||
result = await client.call_tool(
|
resp.raise_for_status()
|
||||||
"save_with_namespace",
|
except requests.RequestException as exc:
|
||||||
{"key": "username", "value": "Алексей", "namespace": "default"}
|
console.print(f"[red]Ошибка запроса: {exc}[/red]")
|
||||||
)
|
sys.exit(1)
|
||||||
print(f"Сохранено: {result}")
|
try:
|
||||||
|
return resp.json()
|
||||||
|
except ValueError:
|
||||||
|
console.print("[red]Ответ не в формате JSON[/red]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
# Получаем все записи из namespace 'default'
|
|
||||||
result = await client.call_tool(
|
|
||||||
"get_by_namespace",
|
|
||||||
{"namespace": "default"}
|
|
||||||
)
|
|
||||||
print("Данные namespace 'default':")
|
|
||||||
for item in result:
|
|
||||||
# В ответе ключ хранится как 'namespace:key', но в JSON
|
|
||||||
# сохраняется только значение и timestamp, поэтому выводим
|
|
||||||
# только полезную часть.
|
|
||||||
key = item.get("key", "")
|
|
||||||
value = item.get("value", "")
|
|
||||||
print(f" {key}: {value}")
|
|
||||||
|
|
||||||
# Получаем список ключей с подстрокой 'name'
|
def add_memory(server: str, key: str, value: str):
|
||||||
keys = await client.call_tool(
|
"""
|
||||||
"list_keys",
|
Добавить запись в память агента.
|
||||||
{"pattern": "*name"}
|
"""
|
||||||
)
|
url = f"{server}/memory"
|
||||||
print(f"Ключи с 'name': {keys}")
|
payload = {"key": key, "value": value}
|
||||||
|
result = _request("POST", url, json=payload)
|
||||||
|
console.print(f"[green]Запись добавлена: {result}[/green]")
|
||||||
|
|
||||||
|
|
||||||
|
def get_memory(server: str, key: str):
|
||||||
|
"""
|
||||||
|
Получить значение по ключу.
|
||||||
|
"""
|
||||||
|
url = f"{server}/memory/{key}"
|
||||||
|
result = _request("GET", url)
|
||||||
|
console.print(f"[cyan]Получено: {result}[/cyan]")
|
||||||
|
|
||||||
|
|
||||||
|
def delete_memory(server: str, key: str):
|
||||||
|
"""
|
||||||
|
Удалить запись из памяти.
|
||||||
|
"""
|
||||||
|
url = f"{server}/memory/{key}"
|
||||||
|
result = _request("DELETE", url)
|
||||||
|
console.print(f"[yellow]Удалено: {result}[/yellow]")
|
||||||
|
|
||||||
|
|
||||||
|
def list_memory(server: str):
|
||||||
|
"""
|
||||||
|
Вывести таблицу всех записей в памяти.
|
||||||
|
"""
|
||||||
|
url = f"{server}/memory"
|
||||||
|
result = _request("GET", url)
|
||||||
|
table = Table(title="Память агента")
|
||||||
|
table.add_column("Ключ", style="magenta")
|
||||||
|
table.add_column("Значение", style="green")
|
||||||
|
for item in result.get("items", []):
|
||||||
|
table.add_row(item.get("key", ""), item.get("value", ""))
|
||||||
|
console.print(table)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Клиент MCP‑сервера для управления памятью агента.")
|
||||||
|
parser.add_argument("--server", default="http://localhost:8000", help="URL сервера MCP (по умолчанию http://localhost:8000)")
|
||||||
|
sub = parser.add_subparsers(dest="command", required=True)
|
||||||
|
|
||||||
|
add = sub.add_parser("add", help="Добавить запись")
|
||||||
|
add.add_argument("key", help="Ключ записи")
|
||||||
|
add.add_argument("value", help="Значение записи")
|
||||||
|
|
||||||
|
get = sub.add_parser("get", help="Получить запись")
|
||||||
|
get.add_argument("key", help="Ключ записи")
|
||||||
|
|
||||||
|
delete = sub.add_parser("delete", help="Удалить запись")
|
||||||
|
delete.add_argument("key", help="Ключ записи")
|
||||||
|
|
||||||
|
list_ = sub.add_parser("list", help="Список всех записей")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.command == "add":
|
||||||
|
add_memory(args.server, args.key, args.value)
|
||||||
|
elif args.command == "get":
|
||||||
|
get_memory(args.server, args.key)
|
||||||
|
elif args.command == "delete":
|
||||||
|
delete_memory(args.server, args.key)
|
||||||
|
elif args.command == "list":
|
||||||
|
list_memory(args.server)
|
||||||
|
|
||||||
finally:
|
|
||||||
# Закрываем соединение
|
|
||||||
await client.close()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
asyncio.run(main())
|
main()
|
||||||
Reference in New Issue
Block a user