Hindsight Go Client 完整指南:用 Go 接入 Agent 记忆 API(Retain / Recall / Reflect)
2026/9/15 1:33:44 网站建设 项目流程

Hindsight Go Client 完整指南:用 Go 接入 Agent 记忆 API(Retain / Recall / Reflect)

【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight

本篇技术指南以 Hindsight 官方文档 Go Client 参考 为主体,系统讲解如何在 Go 项目中安装并接入 Hindsight 记忆服务:从环境准备、客户端初始化,到记忆写入(Retain)、检索(Recall)、生成式回答(Reflect)三大核心操作,再到可空字段处理、错误处理与客户端配置调优。读完本文,你将能够在自己的 Go 应用中通过类型安全的 API 客户端完成 Hindsight 全量记忆能力的集成,并理解客户端背后的生成式实现原理。

前置条件与安装

Go Client 是 Hindsight 官方维护的 Go 语言客户端,由 OpenAPI 3.1 规范通过 OpenAPI Generator 自动生成,因此它天然覆盖了 Hindsight HTTP API 的全部端点与数据模型,且与服务器端保持同步演进。

官方文档要求Go 1.23+运行环境。安装命令十分简单:

go get github.com/vectorize-io/hindsight/hindsight-clients/go

安装完成后,在你的 Go 源文件中引入:

import hindsight "github.com/vectorize-io/hindsight/hindsight-clients/go"

从仓库中可以看到,该模块的 go.mod 声明了模块路径github.com/vectorize-io/hindsight/hindsight-clients/go,运行时依赖仅stretchr/testify(测试用)与gopkg.in/validator.v2(请求参数校验用),整体依赖非常轻量,适合直接嵌入业务服务。

使用前提:先有一个可用的 Hindsight 服务

Go Client 是一个 HTTP 客户端,它本身不包含服务器实现。使用前你需要一个正在运行的 Hindsight 服务实例(本地进程、Docker 容器或托管服务),默认服务地址为http://localhost:8888。启动方式可参考仓库中 docker/docker-compose 目录下的编排模板。

快速开始:三步完成记忆写入与读取

官方示例保存在 hindsight-docs/examples/api/quickstart.go,完整演示了「写入 → 检索 → 生成」的最小闭环。先看最核心的初始化与三连调用:

cfg := hindsight.NewConfiguration() cfg.Servers = hindsight.ServerConfigurations{ {URL: "http://localhost:8888"}, } client := hindsight.NewAPIClient(cfg) ctx := context.Background() // 1. Retain:写入一条记忆 retainReq := hindsight.RetainRequest{ Items: []hindsight.MemoryItem{ {Content: hindsight.TextContent("Alice works at Google")}, }, } client.MemoryAPI.RetainMemories(ctx, "my-bank").RetainRequest(retainReq).Execute() // 2. Recall:按语义检索记忆 recallReq := hindsight.RecallRequest{ Query: "What does Alice do?", } resp, _, _ := client.MemoryAPI.RecallMemories(ctx, "my-bank").RecallRequest(recallReq).Execute() for _, r := range resp.Results { fmt.Println(r.Text) } // 3. Reflect:基于记忆生成上下文回答 reflectReq := hindsight.ReflectRequest{ Query: "Tell me about Alice", } answer, _, _ := client.MemoryAPI.Reflect(ctx, "my-bank").ReflectRequest(reflectReq).Execute() fmt.Println(answer.GetText())

三个操作分别对应 Hindsight 记忆生命周期中的核心阶段:

  • Retain(记忆保留):把原始信息(文本或内容块)写入指定 bank(记忆库)并异步完成抽取、向量化与入库;
  • Recall(记忆召回):以自然语言查询在既有记忆中做语义检索,返回最相关的事实片段;
  • Reflect(反思生成):结合召回结果与 bank 的背景设定,生成一段有上下文支撑的回答——这是 Hindsight "会用记忆" 的关键能力。

注意到这里的调用风格是 OpenAPI Generator 的标准链式写法:先client.MemoryAPI.RetainMemories(ctx, "my-bank")拿到请求构造器,再用.RetainRequest(req)携带请求体,最后.Execute()真正发起 HTTP 请求并返回(响应体, *http.Response, error)三元组。

关于 bank_id 与请求路径

上面所有操作都传入了"my-bank"作为bankId。Hindsight 以bank(记忆库)为隔离单元,记忆、指令、心理模型等都挂在某个 bank 之下。从 api_memory.go 的请求构造逻辑可以看到,bankId会被拼进形如/v1/default/banks/{bank_id}/memories的 URL 路径中(例如POST /v1/default/banks/{bank_id}/memories对应 Retain,POST /v1/default/banks/{bank_id}/memories/recall对应 Recall,POST /v1/default/banks/{bank_id}/reflect对应 Reflect)。

API 结构:按命名空间组织的能力地图

官方文档给出了客户端核心命名空间,每个命名空间对应一个*APIService

命名空间职责
client.MemoryAPIRetain、Recall、Reflect 等记忆核心操作
client.BanksAPIBank 的创建、更新、删除、配置管理
client.DirectivesAPI指令(Directive)管理
client.MentalModelsAPI心理模型(Mental Model)管理
client.DocumentsAPI文档操作(上传、列表、分块)
client.EntitiesAPI实体(Entity)操作
client.OperationsAPI异步操作状态监控

从源码 client.go 可以看到,APIClient实际暴露的服务比文档列举的还要完整,还包含AuditAPI(审计日志)、BankTemplatesAPI(银行模板)、DocumentTransferAPI(文档迁移)、FilesAPI(文件)、KnowledgeBaseAPI(知识库)、LLMTracesAPI(LLM 调用追踪)、MonitoringAPI(版本/健康/指标)与WebhooksAPI(Webhook 管理),这些均由同一份 OpenAPI 规范生成:

type APIClient struct { cfg *Configuration common service AuditAPI *AuditAPIService BankTemplatesAPI *BankTemplatesAPIService BanksAPI *BanksAPIService DirectivesAPI *DirectivesAPIService DocumentTransferAPI *DocumentTransferAPIService DocumentsAPI *DocumentsAPIService EntitiesAPI *EntitiesAPIService FilesAPI *FilesAPIService KnowledgeBaseAPI *KnowledgeBaseAPIService LLMTracesAPI *LLMTracesAPIService MemoryAPI *MemoryAPIService MentalModelsAPI *MentalModelsAPIService MonitoringAPI *MonitoringAPIService OperationsAPI *OperationsAPIService WebhooksAPI *WebhooksAPIService }

各服务共享同一个service基座结构(common client),避免为每个服务单独分配堆对象,这也是生成代码的经典内存优化。每个 API 类的方法与对应 HTTP 端点的完整映射可参考 hindsight-clients/go/README.md,例如MemoryAPI.ListMemories对应GET /v1/default/banks/{bank_id}/memories/listMentalModelsAPI.RefreshMentalModel对应POST /v1/default/banks/{bank_id}/mental-models/{mental_model_id}/refresh

完整调用示例:Bank 管理与异步操作

除记忆三连外,最常用的还有 Bank 创建与异步操作查询。Bank 是隔离单位,先建 bank 再写记忆是推荐路径:

// 创建/更新 bank(幂等,PUT 语义) createReq := hindsight.CreateBankRequest{ Name: hindsight.PtrString("Assistant"), Mission: hindsight.PtrString("Keep track of user preferences and conversation history."), } client.BanksAPI.CreateOrUpdateBank(ctx, "my-bank").CreateBankRequest(createReq).Execute() // Retain 时若使用异步模式,可凭 operationId 轮询进度 retainResp, _, _ := client.MemoryAPI.RetainMemories(ctx, "my-bank"). RetainRequest(retainReq).Execute() if retainResp.HasOperationId() { status, _, _ := client.OperationsAPI.GetOperationStatus(ctx, "my-bank", retainResp.GetOperationId()).Execute() fmt.Printf("operation status: %s\n", status.GetStatus()) }

注意RetainResponse通过HasOperationId()/GetOperationId()这对方法暴露异步操作标识——凡是这类可空字段,客户端都会生成HasXxx()GetXxx()访问器,见下文「可空字段」一节。

客户端配置:从服务器地址到 HTTP 行为

hindsight.NewConfiguration()返回的 Configuration 是客户端行为的唯一入口,其字段包括:

字段作用
Servers服务器地址列表(OpenAPIservers字段的映射)
Host/Scheme覆盖请求的主机与协议
DefaultHeader为所有请求附加的默认 HTTP 头
UserAgent请求 UA,默认OpenAPI-Generator/1.0.0/go
Debug置为true时打印完整请求/响应转储(调试利器)
HTTPClient自定义*http.Client,可注入超时、连接池、缓存等

最常用的配置组合是「指定服务器 + 自定义 HTTP 客户端」:

cfg := hindsight.NewConfiguration() cfg.Servers = hindsight.ServerConfigurations{ {URL: "http://localhost:8888"}, } cfg.HTTPClient = &http.Client{Timeout: 30 * time.Second} cfg.Debug = true // 需要排查请求问题时打开 client := hindsight.NewAPIClient(cfg)

从源码看,NewAPIClientHTTPClient为 nil 时会回退到http.DefaultClient(见 client.go),因此显式设置超时是生产环境的推荐做法。

按操作覆盖服务器地址

除了全局Servers,客户端还支持按操作粒度覆盖服务器。Configuration.OperationServers"{ClassName}Service.{Method}"为键(如"MemoryAPIService.RetainMemories")指定不同端点。运行时还可以通过 context 传递索引或模板变量:

// 指定使用 Servers 列表中的第 1 个(下标 0 起) ctx := context.WithValue(context.Background(), hindsight.ContextServerIndex, 1) // 覆盖服务器模板变量 ctx = context.WithValue(ctx, hindsight.ContextServerVariables, map[string]string{ "basePath": "v2", })

模板变量会做枚举合法性校验,未在枚举内的取值会直接返回错误(configuration.go)。

认证头

Hindsight API 默认无需认证,但需要时可通过cfg.AddDefaultHeader("Authorization", "Bearer <token>")为所有请求统一附加令牌,或在具体请求上使用各 API 生成的Authorization(...)链式方法。

处理可空字段:NullableString 与 Ptr* 工具函数

OpenAPI 生成的 Go 模型中,所有可选字段都是指针类型,且区分「字段缺省」与「显式置空」两种状态。为此客户端提供两类工具:

  • NullableString/NullableTime/NullableInt等包装类型:内置isSet标记,可区分「未设置」与「设置为 null」;
  • PtrString/PtrTime/PtrInt等辅助函数:快速把基本类型转为指针(见 utils.go)。

官方示例演示了带上下文的记忆写入:

timestamp := time.Date(2024, 1, 15, 10, 0, 0, 0, time.UTC) retainReq2 := hindsight.RetainRequest{ Items: []hindsight.MemoryItem{ { Content: hindsight.TextContent("Alice got promoted"), Context: *hindsight.NewNullableString(hindsight.PtrString("career update")), Timestamp: *hindsight.NewNullableTimestamp(&hindsight.Timestamp{TimeTime: hindsight.PtrTime(timestamp)}), Tags: []string{"career"}, }, }, } retainResp, _, _ := client.MemoryAPI.RetainMemories(ctx, "my-bank").RetainRequest(retainReq2).Execute() // 用 HasXxx 判断字段是否真的存在 if retainResp.HasOperationId() { fmt.Println("OperationId:", retainResp.GetOperationId()) }

这里的ContextTimestamp就是典型的可选字段:NewNullableString(PtrString(...))表示「设置一个字符串值」,而NewNullableString(nil)则代表「显式置 null」——两者在 JSON 序列化时行为不同(后者会输出null),这正是区分缺省与置空的关键场景。Timestamp字段本身又是一个带内部TimeTime指针的嵌套模型,与PtrTime配合使用。

对于多态字段(如Content),生成代码采用 anyOf 反序列化:Content结构同时持有*[]ContentAnyOfInner(内容块列表,支持图文混排)与*string(纯文本)两个指针,反序列化时依次尝试匹配并只保留首个成功命中的变体(见 model_content.go)。hindsight.TextContent("...")正是构造纯文本变体的便捷方法,而图片等内容块形式需要 vision 能力的 retain LLM 支持。

错误处理:标准 Go 惯用法

官方示例给出了标准错误处理模式——每次Execute()都返回(模型, *http.Response, error),HTTP 非 2xx 状态码会表现为非 nil 的 error:

_, httpResp2, err := client.MemoryAPI.RecallMemories(ctx, "my-bank"). RecallRequest(recallReq). Execute() if err != nil { log.Fatalf("Recall failed: %v", err) } defer httpResp2.Body.Close()

实践建议:

  1. 始终检查 error:示例中为了简洁用_, _, _丢弃了返回值,但生产代码应检查第三个返回值;
  2. 利用GenericOpenAPIError:当服务器返回错误时,错误类型为GenericOpenAPIError,可通过Body()读取原始响应体、Model()取反序列化后的错误模型(见 client.go)。对符合 RFC 7807 的错误模型,错误信息会自动拼接title (detail)格式;
  3. 注意关闭响应体:即使调用成功,*http.ResponseBody也应defer Close(),避免连接泄漏;
  4. 合理设置超时:通过自定义HTTPClient或 context 的 deadline/cancel 控制请求生命周期,Recall / Reflect 属于 LLM 参与的重操作,尤其需要超时兜底。

通过 Debug 模式快速定位问题

遇到请求异常时,把cfg.Debug = true打开,客户端会在每次请求前httputil.DumpRequestOut、请求后DumpResponse打印完整的请求/响应内容(client.go),对排查 400/422 参数校验错误非常有效。

更多参考与进阶路径

  • 本文所有代码示例的完整可运行版本见 hindsight-docs/examples/api/quickstart.go,示例自带HINDSIGHT_API_URL环境变量支持(默认http://localhost:8888);
  • 客户端源码位于 hindsight-clients/go,API 端点与模型文档见其中的 README.md,仓库还包含 integration_test.go 与 null_test.go 等测试,可作为用法参考;
  • 多语言 SDK 的 API 概念完全一致,可以互相印证:Python SDK 文档、Node.js SDK 文档;
  • 若你的诉求是「在 Go/Python 进程内直接内嵌 Hindsight 服务器(免外部服务)」,可进一步阅读 hindsight-all 嵌入式文档;
  • 完整 REST API 参考以服务器暴露的 OpenAPI 规范为准(/openapi.json),客户端各模型字段定义均可在 hindsight-clients/go 中以model_*.go文件查阅。

小结

Hindsight Go Client 是一条通往 Hindsight 记忆服务的类型安全捷径:一条go get安装命令、一次NewAPIClient初始化,即可通过MemoryAPI/BanksAPI/MentalModelsAPI等命名空间调用全部记忆能力。掌握好链式请求构造、可空字段的两类处理工具(Nullable*Ptr*)、以及(模型, *http.Response, error)三元组的错误处理惯例,你就能在 Go 应用中稳定地集成「写入记忆 → 语义召回 → 上下文生成」的完整闭环,为 Agent 构建真正"会学习"的长期记忆底座。

【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询