
使用 langchain-openviking 在 LangChain/LangGraph 中接入 OpenViking 上下文数据库【免费下载链接】OpenVikingSelf-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.项目地址: https://gitcode.com/GitHub_Trending/op/OpenViking本指南以 OpenViking 官方维护的 LangChain/LangGraph 集成包langchain-openviking为核心介绍如何通过该包在 LangChain 与 LangGraph 应用中统一接入 OpenViking 的 Agent 记忆、知识 RAG 与 Skills 能力。读完本文你将掌握包的安装方式、OpenVikingRetriever检索器的完整参数配置、会话消息历史的接入方法、viking_*工具集的生成规则以及 LangGraph Store 与 Middleware 的使用前提并了解框架适配层与 OpenViking 服务端之间的边界划分。集成架构框架适配与远程访问的边界langchain-openviking是 OpenViking 官方维护的 LangChain 与 LangGraph 集成包遵循一条清晰的分层原则框架适配逻辑不依赖 OpenViking 服务端实现远程访问统一通过轻量级的openviking-sdk完成见 integrations/langchain/README_CN.md。从源码结构看适配层位于 integrations/langchain/src/langchain_openviking/包含以下核心模块retrievers.pyOpenVikingRetriever检索器把 OpenViking 检索结果转换为 LangChainDocumenttools.pycreate_openviking_tools工具工厂把 OpenViking 原语暴露为viking_*前缀的 LangChainStructuredToolhistory.pyOpenVikingChatMessageHistory基于 OpenViking Session 的聊天历史实现middleware.pyOpenVikingContextMiddleware面向 LangGraph Agent 的召回与捕获中间件store.py、context.py、recording.py、messages.py分别承载 Store 适配、上下文组装、会话录制与消息格式转换。依赖关系上基础发行版只依赖langchain-coreLangGraph 中间件仅在安装langgraphextra或兼容依赖后才会被加载见init.py。包的公开 API 通过惰性__getattr__导出只有真正访问某个名称时才导入对应模块从而避免为不使用的功能付出导入成本。服务端版本要求viking://~Home 别名文档中的示例统一使用viking://~Home 别名例如viking://~/memoriesServer 会将其展开为当前调用方自己的用户空间。因此需要安装一个支持viking://~的 OpenViking Server不带 uid 的viking://user/memories旧写法会被新版 Server 拒绝要访问其他用户的空间请显式传入viking://user/uid/...形式的目标 URI。这一约束与仓库中 URI 校验逻辑一脉相承——OpenViking 对peer_id、用户空间等身份概念做了严格的路径级校验使用别名可避免在集成层硬编码用户身份。安装按使用场景选择安装命令# LangChain Retriever、Tools、Message History 和 Context Wrapper pip install langchain-openviking # 额外安装 LangGraph Store 和 Middleware pip install langchain-openviking[langgraph]langgraphextra 是可选依赖的关键分界线基础包不引入 LangGraph 全家桶只有需要OpenVikingStore、OpenVikingContextMiddleware时才需要它。如果直接使用 LangGraph 中间件但未安装对应依赖包会抛出OptionalDependencyError并提示正确的安装命令见 client.py 的missing_dependency实现。快速开始用 OpenVikingRetriever 做语义检索最直接的接入方式是通过OpenVikingRetriever把 OpenViking 上下文检索能力接入 LangChain 的检索链路from langchain_openviking import OpenVikingRetriever from openviking_sdk import SyncHTTPClient client SyncHTTPClient( urlhttp://127.0.0.1:1933, api_keyyour-user-api-key, ) client.initialize() retriever OpenVikingRetriever( clientclient, target_uriviking://~/memories, ) try: documents retriever.invoke(需要记住哪些部署偏好) finally: client.close()这段代码背后OpenVikingRetriever._get_relevant_documents会调用 SDK 客户端的find方法search_modesearch时调用search再把返回结果按context_types默认memory、resource、skill三类拆解为 LangChainDocument列表见 retrievers.py。Document的page_content取决于content_mode而metadata中会携带完整的溯源信息source、openviking_uri、openviking_context_type、openviking_level、openviking_category、openviking_score、openviking_match_reason等见 retrievers.py。这些元数据可以直接喂给 RAG 提示词模板实现带来源标注的问答。检索器参数详解OpenVikingRetriever是 Pydantic 模型构造参数含默认值如下均可在 retrievers.py 中核对参数默认值说明client/async_clientNone外部注入的 SDK 客户端注入后由调用方管理生命周期url/api_keyNone未注入 client 时适配器据此惰性创建内部客户端account/user/user_id/actor_peer_idNone连接的身份维度用于多用户空间路由timeout60.0请求超时秒extra_headersNone附加 HTTP 请求头auto_initializeTrue是否自动执行 SDK 客户端的initialize()target_uri检索范围可为单个 URI 或 URI 列表如[viking://~/memories, viking://resources]search_modefindfind无状态检索或search会话感知检索session_idNone会话感知检索时传入的会话 IDlimit10返回结果数量上限score_thresholdNone后端相关性得分阈值低于阈值的结果被过滤filterNone结构化过滤条件context_types(memory, resource, skill)允许返回的上下文类型集合content_modeauto内容深度auto/abstract/overview/readmax_content_chars12000单条内容最大字符数超出截断并追加...[truncated]metadata_prefixopenvikingDocument 元数据键的前缀tagsNone附加标签过滤content_mode决定page_content的生成策略见 retrievers.pyabstract优先取abstract缺省回退overviewoverview优先取overview缺省回退abstractread按 URI 读取完整内容读取失败时回退到overview/abstractauto默认对 level 2 的条目自动升级为read模式其余取overview/abstract——这是兼顾上下文预算与内容完整度的折中策略。客户端容错与恢复由适配器内部创建的 HTTP 客户端并不是普通包装而是带**一次性恢复one-shot recovery**能力的OpenVikingClientHandle/OpenVikingAsyncClientHandle见 client.py。其行为要点对于find、search、read、glob、ls等只读方法完整清单见 client.py 的_RETRYABLE_READ_METHODS当遇到DEADLINE_EXCEEDED、UNAVAILABLE等可恢复错误ConnectionError、TimeoutError、httpx.TransportError等时会自动重建客户端并重试一次异步客户端是**事件循环局部loop-local**的跨 loop 复用会抛出RuntimeError同步客户端在 retriever 的浅拷贝之间共享同一个惰性缓存避免每次拷贝都新建连接。Client 所有权谁创建谁负责关闭langchain-openviking对客户端生命周期有明确约定通过client或async_client注入的客户端所有权仍归调用方适配器不会主动关闭它通过url创建的客户端由适配器内部管理可按各适配器文档调用close()同步或aclose()异步释放快速开始示例中finally: client.close()的写法正是“外部传入 client 仍由调用方管理”的直接体现。对应到实现retriever 的_get_client()在self.client is None时才创建并标记owned内部客户端aclose()只释放pop_owned()拿到的内部客户端见 retrievers.py。浅拷贝__deepcopy__也不会克隆客户端只会复制配置。会话消息历史OpenVikingChatMessageHistoryOpenVikingChatMessageHistory实现了BaseChatMessageHistory把聊天历史持久化到 OpenViking Session 中可直接配合RunnableWithMessageHistory使用见 history.pyfrom langchain_openviking import OpenVikingChatMessageHistory history OpenVikingChatMessageHistory( session_idlangchain-history-demo, urlhttp://127.0.0.1:1933, api_keyyour-user-api-key, token_budget128_000, )核心行为messages/get_messages()通过get_session_context拉取会话上下文并还原为 LangChain 消息列表add_messages()/aadd_messages()通过内部OpenVikingSessionRecorder把消息写入 Session支持peer_id归属与context_parts附带例如把检索到的上下文 URI 一并关联到会话clear()删除会话后自动重建保证后续写入可用commit_policy控制提交时机见下文token_budget默认128_000用于限制拉取上下文的 token 预算系统消息是运行时策略而非对话记忆因此永远不会被持久化persist_system_messages仅保留构造兼容性内部恒为False。仓库提供可直接运行的确定性示例 examples/langchain-langgraph/langchain/message-history/quick_app.py第一轮让模型记住“deployment color is azure”第二轮查询时通过 OpenViking 历史恢复出该偏好。提交策略Commit PolicyOpenVikingCommitPolicy控制会话消息持久化后的提交行为见 client.py模式说明never不主动提交默认always每次写入后立即commit_sessionpending_tokens当会话待处理 token 达到pending_token_threshold默认 8000时才提交pending_tokens模式优先使用写入接口返回的待处理 token 数若客户端不支持则回退到get_session查询见 client.py。提交与消息持久化是两个独立操作这为批量写入后再统一提交留出了空间。工具集create_openviking_toolscreate_openviking_tools把 OpenViking 的常用 Agent 原语封装为 LangChainStructuredTool。工具名刻意采用viking_*前缀让模型看到与 OpenViking 插件/MCP 一致的语义见 tools.py工具功能关键参数viking_find无状态语义检索query、target_uri、limit默认 8、min_scoreviking_search会话感知语义检索query、target_uri、session_id、limit、min_scoreviking_browse列出命名空间/目录子项或 glob 匹配 URIuri默认viking://、recursive、patternviking_read读取文件/文档 URI目录不可读uris、max_chars、content_modeabstract/overview/readviking_grep对文件内容做 grep 式搜索uri、pattern、case_insensitive、node_limit默认 20viking_archive_search检索已提交的会话归档上下文session_id、query、archive_id、token_budget、max_matchesviking_archive_expand按归档 ID 展开完整归档session_id、archive_id、max_chars默认 20000viking_store追加持久记忆或会话消息写操作messages、session_id、commit默认 Trueviking_add_resource导入显式资源URL/仓库/文件/目录path、to、parent、reason、instruction、wait、timeoutviking_add_skill注册可复用 Skill管理操作data、wait、timeoutviking_health健康状态诊断无viking_forget删除 URI默认不暴露给普通 Agenturi、recursive工具的选择按profile分组默认agent另有retrieval、admin并可用tool_names精确指定见 tools.pyretrieval仅检索类工具 viking_healthagent默认检索类 viking_store、viking_add_resource、viking_add_skill、viking_healthadmin在agent基础上追加viking_forget传入allow_forgetTrue可在任意 profile 中追加viking_forget。几个值得注意的安全语义viking_store、viking_add_resource、viking_add_skill均为写操作面向用户的主机应仅在用户明确表达“记住/保存”意图时暴露见 tools.pyviking_forget删除数据只应暴露给可信 Agent对目录 URI 调用viking_read会返回专门的错误提示指导模型改用viking_browse列目录再viking_read读文件见 tools.py。LangGraph Store 与 Middleware安装langchain-openviking[langgraph]后可以进一步使用OpenVikingStore面向 LangGraph 的持久化 Store 适配OpenVikingContextMiddlewareLangGraph Agent 中间件在模型调用前注入 OpenViking 召回并在 Agent 执行后按需捕获会话。OpenVikingContextMiddleware在 LangGraph 的扩展点上复刻了 OpenClaw 风格的生命周期模型调用前召回Agent 执行后捕获见 middleware.py。构造要点内部组合OpenVikingRetrieversearch_modesearch与OpenVikingSessionContextAssemblertarget_uri、limit默认 5、score_threshold、token_budget默认 128000都可配置召回内容以SystemMessage形式注入模型请求默认头部文案为Relevant OpenViking context:session_id 解析优先使用session_id_resolver否则按state[thread_id]、state[session_id]、runtime.config.configurable.thread_id/session_id依次回退解析不到 session id 会抛出带指引的ValueError见 middleware.py因此使用该中间件时请确保传入config{configurable: {thread_id: ...}}capture_on_after_agent默认True控制是否在 Agent 运行后捕获消息commit_on_after_agent/commit_policy控制提交策略——commit_on_after_agentTrue而未显式指定策略时默认使用always捕获具备去重能力通过消息签名id、role、content、tool_calls、tool_result 的稳定 JSON识别增量避免重复写入中断/取消时按已消费消息数更新进度见 middleware.py提供peer_id、peer_id_resolver、actor_peer_resolver等归属解析维度其中 actor peer 要求 HTTP 客户端支持请求级 actor peer否则构造时即报错见 middleware.py。可运行的 LangGraph 示例位于 examples/langchain-langgraph/langgraph/agent/quick_app.py、agent/live_app.py演示 Agent 场景middleware/quick_app.py演示中间件LangChain 侧的context-backend/quick_app.py演示上下文后端。测试与示例InMemoryOpenVikingClient仓库为集成提供了免服务端的测试手段InMemoryOpenVikingClient见 testing.py在内存中模拟 OpenViking 客户端行为可直接注入各适配器用于单元测试与确定性示例。examples/langchain-langgraph/langchain/rag/quick_app.py用内存数据源viking://~/memories/preferences/deploy_color.md等构建 RAG 链路演示OpenVikingRetrieverChatPromptTemplate 模型 StrOutputParser的完整流水线examples/langchain-langgraph/langchain/message-history/quick_app.py用RunnableWithMessageHistoryOpenVikingChatMessageHistory演示跨轮记忆examples/langchain-langgraph/langchain/context-backend/quick_app.py演示上下文后端适配。集成包的测试覆盖在 integrations/langchain/tests/ 目录涵盖 retriever、history、tools、middleware、store 等模块的同步/异步路径。兼容迁移openviking.integrations.langchain对于已在openviking包中使用openviking.integrations.langchain导入路径的存量应用无需改动代码完整openviking包会继续保留原有的openviking.integrations.langchain导入路径并转发到langchain-openviking包方便现有应用平滑迁移。也就是说集成逻辑整体搬入langchain_openviking旧路径保留为兼容垫片shim。新项目建议直接使用langchain_openviking命名空间逐步淘汰旧路径。小结langchain-openviking是连接 LangChain/LangGraph 生态与 OpenViking 上下文数据库的官方桥梁框架适配层与openviking-sdk清晰分层检索、工具、历史、Store、中间件五大能力覆盖了 Agent 应用“召回记忆—使用工具—持久化会话”的完整闭环。接入时请重点把握三条边界一是服务端必须支持viking://~Home 别名二是外部注入的 client 由调用方管理url创建的 client 由适配器管理三是写操作类工具viking_store、viking_add_resource、viking_add_skill、viking_forget应面向用户确认过的意图才暴露。【免费下载链接】OpenVikingSelf-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.项目地址: https://gitcode.com/GitHub_Trending/op/OpenViking创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考