Initial SOC memory POC implementation
This commit is contained in:
89
skills/commit_memory_skill/commit_to_openviking.py
Normal file
89
skills/commit_memory_skill/commit_to_openviking.py
Normal file
@ -0,0 +1,89 @@
|
||||
"""Commit normalized SOC memory items to OpenViking as structured resources."""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from memory_gateway.openviking_client import OpenVikingClient
|
||||
|
||||
|
||||
def build_resource_uri(item: dict[str, Any]) -> str:
|
||||
memory_type = item.get("memory_type")
|
||||
item_id = item["id"]
|
||||
|
||||
if memory_type == "case":
|
||||
scenario = item.get("scenario", "general")
|
||||
return f"viking://resources/soc-memory-poc/case/{scenario}/{item_id}.json"
|
||||
|
||||
if memory_type == "knowledge":
|
||||
doc_type = item.get("doc_type", "general")
|
||||
return f"viking://resources/soc-memory-poc/knowledge/{doc_type}/{item_id}.json"
|
||||
|
||||
raise ValueError(f"Unsupported memory_type for commit: {memory_type}")
|
||||
|
||||
|
||||
def load_item(path: str | Path) -> dict[str, Any]:
|
||||
path = Path(path)
|
||||
with path.open("r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
async def commit_file(path: str | Path, client: OpenVikingClient) -> dict[str, Any]:
|
||||
item = load_item(path)
|
||||
uri = build_resource_uri(item)
|
||||
result = await client.add_resource(
|
||||
uri=uri,
|
||||
content=json.dumps(item, ensure_ascii=False, indent=2),
|
||||
resource_type="json",
|
||||
wait=False,
|
||||
)
|
||||
return {
|
||||
"path": str(path),
|
||||
"uri": uri,
|
||||
"result": result,
|
||||
}
|
||||
|
||||
|
||||
async def commit_directory(directory: str | Path, client: OpenVikingClient, limit: int | None = None) -> list[dict[str, Any]]:
|
||||
directory = Path(directory)
|
||||
paths = sorted(directory.rglob("*.json"))
|
||||
if limit is not None:
|
||||
paths = paths[:limit]
|
||||
|
||||
results: list[dict[str, Any]] = []
|
||||
for path in paths:
|
||||
results.append(await commit_file(path, client))
|
||||
return results
|
||||
|
||||
|
||||
async def main_async(args: argparse.Namespace) -> None:
|
||||
client = OpenVikingClient()
|
||||
try:
|
||||
if args.path:
|
||||
result = await commit_file(args.path, client)
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2))
|
||||
else:
|
||||
results = await commit_directory(args.directory, client, limit=args.limit)
|
||||
print(json.dumps(results, ensure_ascii=False, indent=2))
|
||||
finally:
|
||||
await client.close()
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description="Commit normalized SOC items to OpenViking.")
|
||||
parser.add_argument("--path", help="Single normalized JSON file to commit")
|
||||
parser.add_argument("--directory", help="Directory of normalized JSON files to commit")
|
||||
parser.add_argument("--limit", type=int, default=None, help="Optional limit for directory commits")
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.path and not args.directory:
|
||||
parser.error("Either --path or --directory is required")
|
||||
|
||||
asyncio.run(main_async(args))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user