"""ContextEngine 与 Claude Code/OpenClaw 集成示例。
演示如何将 ContextEngine 作为 Agent 的记忆系统。
注意: dev 分支只包含写入路径,读取功能在 phase1 分支。
"""
import os
from typing import List, Dict, Any, Optional
from service.api import MemoryWriteAPI, ReadAPI, init_api
from core.models import RequestContext
from pyagfs import AGFSClient
from fs.agfs_adapter import AGFSContextFS
from providers.llm import OpenAILLM
from providers.vector_index.in_memory_index import InMemoryVectorIndex
class AgentMemory:
"""Agent 记忆管理器 - 为 AI Agent 提供持久化记忆功能 (仅写入).
用法:
memory = AgentMemory(account_id="my-account", user_id="user-123")
memory.remember_conversation([
{"role": "user", "content": "我偏好 Python 编程"},
{"role": "assistant", "content": "记住了"}
])
注意: 搜索功能需要切换到 phase1 分支
"""
def __init__(
self,
account_id: str,
user_id: str,
agent_id: str = "agent-001",
agfs_url: str = "http://localhost:1833",
):
"""初始化记忆系统。
Args:
account_id: 租户ID
user_id: 用户ID
agent_id: Agent ID
agfs_url: AGFS 服务地址
"""
self.account_id = account_id
self.user_id = user_id
self.agent_id = agent_id
client = AGFSClient(api_base_url=agfs_url)
fs = AGFSContextFS(client=client, mount_prefix="/local")
api_key = os.environ.get("OGMEM_API_KEY")
if not api_key:
raise ValueError("OGMEM_API_KEY 环境变量未设置")
llm = OpenAILLM(api_key=api_key, model="gpt-4")
vector_index = InMemoryVectorIndex(dimension=384)
self._read_api, self._write_api = init_api(fs=fs, vector_index=vector_index, llm=llm, outbox_store=None)
def _create_context(self, session_id: str) -> RequestContext:
"""创建请求上下文"""
import uuid
return RequestContext(
account_id=self.account_id,
user_id=self.user_id,
agent_id=self.agent_id,
session_id=session_id,
trace_id=str(uuid.uuid4()),
)
def remember_conversation(
self,
messages: List[Dict[str, str]],
session_id: Optional[str] = None,
) -> Dict[str, Any]:
"""记住对话内容。
Args:
messages: 对话消息列表
session_id: 会话ID(可选)
Returns:
写入结果统计
"""
if session_id is None:
import uuid
session_id = str(uuid.uuid4())
ctx = self._create_context(session_id)
result = self._write_api.commit_session(messages, ctx)
return {
"session_id": session_id,
"candidates_written": result.get("writes_completed", 0),
"candidates_filtered": result.get("candidates_filtered", 0),
}
def search(
self,
query: str,
top_k: int = 5,
category: Optional[List[str]] = None,
session_id: Optional[str] = None,
) -> List[Dict[str, Any]]:
"""搜索相关记忆。
Args:
query: 搜索查询
top_k: 返回结果数量
category: 限制搜索的类别(可选)
session_id: 会话ID(可选)
Returns:
搜索结果列表,每项包含 uri, abstract, score 等
"""
ctx = self._create_context(session_id or "search")
results = self._read_api.search_memory(query, top_k=top_k, category=category, ctx=ctx)
return results
def remember_fact(
self,
content: str,
category: str = "entity",
confidence: float = 0.9,
) -> Dict[str, Any]:
"""记住一条事实(快捷方式)。
Args:
content: 事实内容
category: 类别 (entity/preference/pattern 等)
confidence: 置信度
Returns:
写入结果
"""
import uuid
messages = [
{"role": "user", "content": content}
]
return self.remember_conversation(messages, str(uuid.uuid4()))
def demo_claude_code_integration():
"""Claude Code 集成示例"""
memory = AgentMemory(
account_id="claude-code-user",
user_id="user-001",
agent_id="claude-code",
)
print("=== 记忆对话 ===")
result = memory.remember_conversation([
{"role": "user", "content": "我的名字是李四,是一名前端开发工程师"},
{"role": "assistant", "content": "好的李四,我记住了"},
])
print(f"写入完成: {result['candidates_written']} 条记忆")
print("\n=== 记住偏好 ===")
memory.remember_fact("用户喜欢使用 TypeScript 进行开发", category="preference")
print("\n注意: 搜索功能在 phase1 分支可用")
print("切换到 phase1 分支获取完整的读写功能:")
print(" git checkout phase1")
if __name__ == "__main__":
print("=" * 50)
print("ContextEngine - Claude Code/OpenClaw 集成示例")
print("=" * 50)
demo_claude_code_integration()
print("\n" + "=" * 50 + "\n")