☰
openJiuwen agent-core GaussDB 异步存储适配:GaussDbStore 用法与 SQLAlchemy Dialect 实现深度解析
2026/10/10 1:51:00 网站建设 项目流程
  • 人工智能
  • AI Agent
  • Agent 框架
  • 大模型
  • 工具调用
  • RAG
  • 提示工程
  • 强化学习

【免费下载链接】agent-core

openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力

项目地址:https://gitcode.com/openJiuwen/agent-core
点击查看免费下载

导读

GaussDbStore是 openJiuwen agent-core 扩展模块(openjiuwen.extensions.store.db)中面向 GaussDB 数据库的异步存储实现。它基于 SQLAlchemy 的方言(Dialect)扩展机制,通过import_dbapi()局部加载async_gaussdb驱动,向上层提供与DefaultDbStore完全一致的AsyncEngine访问接口。阅读本文后,你将掌握:如何配置gaussdb+async_gaussdb连接串、如何用GaussDbStore完成 CRUD 与事务操作、如何将其作为LongTermMemory的db_store替换默认存储,以及该实现避开全局sys.modules污染、实现"最小核心、可选扩展"的设计原理与源码级细节。

一、定位与模块结构:扩展而非核心

GaussDbStore位于扩展模块openjiuwen/extensions/store/db/,与核心模块openjiuwen.core.foundation.store.db中的DefaultDbStore形成对照。这一目录划分本身就是设计的一部分:

  • gauss_db_store.py:GaussDbStore类定义,整个文件仅 31 行,是一个极薄封装;
  • gauss_dialect.py:SQLAlchemy 方言(dialect)注册与驱动适配逻辑,这是本模块的技术核心;
  • init.py:对外导出GaussDbStore一个符号。

从 pyproject.toml 可以看出,gaussdb是独立可选依赖:

gaussdb = ["async-gaussdb~=0.30.0", "asyncpg>=0.29.0"]

而all-storage(pyproject.toml)则将sqlite、postgres、mysql、gaussdb、redis、elasticsearch、obs全部打包,方便一次装齐:

all-storage = ["openjiuwen[sqlite,postgres,mysql,gaussdb,redis,elasticsearch,obs]"]

这正体现了项目的"最小核心、可选扩展"设计哲学:核心模块不因某个特定数据库而膨胀,特定数据库支持以可选扩展方式按需安装。

二、设计哲学:四条核心原则

GaussDbStore的构建遵循四条原则,这四条原则也解释了本模块几乎所有实现细节:

  1. 最小依赖(Minimal Dependencies):只依赖标准的 SQLAlchemy 接口,避免与特定数据库强耦合;
  2. 隔离性(Isolation):不污染全局命名空间,保证与其他数据库驱动兼容共存;
  3. 可扩展性(Extensibility):基于 SQLAlchemy 方言机制实现,易于维护与升级;
  4. 标准合规(Standard Compliance):遵循 Python 与 SQLAlchemy 的最佳实践。

后续的import_dbapi()替代 monkey patch、继承BaseDbStore而非DefaultDbStore等决策,都可以在这四条原则上找到依据。

三、方言实现:为什么用import_dbapi()而不是 Monkey Patching

3.1 旧方案(Monkey Patching)的缺陷

文档中给出了旧实现的示意代码:通过把sys.modules['asyncpg']指向async_gaussdb来"偷梁换柱":

# Old implementation: Global pollution of sys.modules def _apply_monkey_patch(): import async_gaussdb sys.modules['asyncpg'] = async_gaussdb # Global pollution sys.modules['asyncpg.exceptions'] = async_gaussdb.exceptions

这种做法的问题非常明显:

  • ❌全局污染:改写sys.modules会影响进程内后续所有代码;
  • ❌不可预期:其他使用真实asyncpg的代码会被连带影响;
  • ❌不合规:违背 SQLAlchemy 官方推荐的方言实现方式;
  • ❌难调试:隐式修改全局状态,出现问题难以追踪。

3.2 新方案:import_dbapi()局部加载

SQLAlchemy 官方为方言提供了import_dbapi()这个 classmethod 扩展点,方言在真正需要底层驱动时才调用它。新实现正是利用这一机制:

# New implementation: Local driver loading class GaussDialect_asyncpg(PGDialect_asyncpg): @classmethod def import_dbapi(cls): import async_gaussdb from sqlalchemy.dialects.postgresql.asyncpg import AsyncAdapt_asyncpg_dbapi return AsyncAdapt_asyncpg_dbapi(async_gaussdb)

好处:

  • ✅无全局污染:不修改sys.modules,完全隔离;
  • ✅标准合规:使用 SQLAlchemy 官方提供的扩展点;
  • ✅易维护:代码结构清晰,职责明确;
  • ✅类型安全:通过AsyncAdapt_asyncpg_dbapi包装器保证类型兼容。

3.3 源码中的实际实现

仓库中 gauss_dialect.py 的真实实现比文档示意代码更完整,还包含了依赖缺失时的友好报错:

@classmethod def import_dbapi(cls): try: import async_gaussdb patched_driver = _patch_gaussdb_driver(async_gaussdb) logger.info("[GaussDialect] Loaded async_gaussdb via import_dbapi") return AsyncAdapt_asyncpg_dbapi(patched_driver) except ImportError as import_error: raise ImportError( "Please install async-gaussdb to use the gaussdb dialect. " "Run: pip install openjiuwen[gaussdb] or pip install openjiuwen[all-storage]" ) from import_error

如果直接import async_gaussdb失败,异常信息会明确提示安装方式,而不是抛出一个难以理解的底层错误。

3.4 方言类的完整配置

GaussDialectAsyncpg继承自PGDialect_asyncpg,源码中定义了大量方言级属性(gauss_dialect.py):

class GaussDialectAsyncpg(PGDialect_asyncpg): statement_compiler = GaussCompiler name = 'gaussdb' driver = 'async_gaussdb' supports_statement_cache = True supports_native_enum = False supports_native_uuid = False use_insertmanyvalues = False colspecs = { **PGDialect_asyncpg.colspecs, String: GaussString, }

这些配置各有讲究:

属性值含义
namegaussdb方言名称,对应连接串 URL scheme
driverasync_gaussdb驱动名称,与name一起构成gaussdb+async_gaussdb://
supports_statement_cacheTrue启用 SQLAlchemy 语句缓存,提升重复语句执行性能
supports_native_enum/supports_native_uuidFalse不依赖 GaussDB 原生枚举与 UUID 类型,退回通用实现
use_insertmanyvaluesFalse不使用批量 insertmanyvalues 特性,规避 GaussDB 兼容性问题
colspecs扩展String→GaussString自定义类型映射,见下文

此外还重写了三个反射/元数据相关方法:

  • _get_server_version_info固定返回(9, 2),绕过版本探测可能引发的兼容问题;
  • _domain_query与_enum_query返回SELECT 1 WHERE FALSE,告知 SQLAlchemy "GaussDB 没有 domain/enum 类型可查询",避免建表或反射时报错。

3.5 方言注册与模块缓存

在 gauss_dialect.py 末尾,模块导入时自动执行注册:

registry.register("gaussdb.async_gaussdb", __name__, "GaussDialectAsyncpg") registry.register("gaussdb", __name__, "GaussDialectAsyncpg")

同时注册两个名字,保证gaussdb+async_gaussdb://与gaussdb://两种连接串都能被解析。Python 的模块缓存机制保证该注册逻辑在整个进程生命周期中只执行一次——只要任意代码import openjiuwen.extensions.store.db.gauss_dialect(或导入GaussDbStore间接触发),后续所有create_async_engine("gaussdb+...")都会命中已注册的方言,无需手动调用任何初始化函数。

值得注意的容错处理:整个导入过程包在try/except ImportError中(gauss_dialect.py),如果环境缺少 SQLAlchemy 相关依赖,只记录 warning 而不会让导入链崩溃。

四、驱动补丁机制:让 async_gaussdb 符合 DB-API 2.0

async_gaussdb驱动本身缺少部分 DB-API 2.0 标准属性,SQLAlchemy 方言加载时无法直接识别,因此 gauss_dialect.py 提供了_patch_gaussdb_driver:

def _patch_gaussdb_driver(driver_module): if not hasattr(driver_module, 'paramstyle'): driver_module.paramstyle = 'format' if not hasattr(driver_module, 'Error'): driver_module.Error = getattr(driver_module, 'GaussDBError', Exception) if not hasattr(driver_module, 'apilevel'): driver_module.apilevel = '2.0' if not hasattr(driver_module, 'threadsafety'): driver_module.threadsafety = 0 return driver_module

各补丁项的语义:

属性补丁值说明
paramstyle'format'参数占位符风格(%s形式),SQLAlchemy 据此格式化 SQL 参数
ErrorGaussDBError(缺省回退Exception)DB-API 规定的异常基类,供上层统一捕获
apilevel'2.0'声明驱动遵循 DB-API 2.0 规范
threadsafety0标记驱动非线程安全,SQLAlchemy 据此调整连接使用策略

所有补丁都先判断hasattr再赋值,幂等且不覆盖驱动自身已有的属性。补丁完成后,驱动再被AsyncAdapt_asyncpg_dbapi包装:

from sqlalchemy.dialects.postgresql.asyncpg import AsyncAdapt_asyncpg_dbapi return AsyncAdapt_asyncpg_dbapi(patched_driver)

AsyncAdapt_asyncpg_dbapi是 SQLAlchemy 提供的异步连接适配层,负责提供await_()等方法,确保create_async_engine创建的引擎在 async 上下文中正常工作。

五、源码中的三项额外兼容性补丁

除文档明示的驱动补丁外,gauss_dialect.py 还包含三项针对 GaussDB 行为差异的定制,值得实际使用者了解:

1. 反射 SQL 修复(before_cursor_execute 事件)

GaussDB 的pg_type.typcollation子查询可能返回 NULL 导致元数据反射失败,因此在每次游标执行前拦截并替换(gauss_dialect.py):

@event.listens_for(Engine, "before_cursor_execute", retval=True) def _patch_gaussdb_reflection_sql(*args): conn, _cursor, statement, parameters, _context, _executemany = args if getattr(conn.dialect, "name", "") == "gaussdb": if "pg_type.typcollation" in statement: statement = re.sub( r"\(\s*SELECT\s+[^)]*?pg_type\.typcollation[^)]*?\)", "NULL", statement, flags=re.IGNORECASE | re.DOTALL ) return statement, parameters

事件处理器只在dialect.name == "gaussdb"时生效,对 PostgreSQL 等其他方言零影响,符合"隔离性"原则。

2.GaussString类型:入参强制字符串化

确保所有传入String列的数据在进入驱动前被转为字符串,其中对datetime特别处理为%Y-%m-%d %H:%M:%S.%f格式(gauss_dialect.py)。这在 GaussDB 对某些类型绑定比较严格时能避免隐式转换错误。

3.GaussCompiler:FOR UPDATE 子句兼容

PGDialect_asyncpg默认的行锁语法可能带 GaussDB 不接受的子句,因此用子类简化输出(gauss_dialect.py):

class GaussCompiler(PGCompiler): def for_update_clause(self, select, **kw): return " FOR UPDATE"

六、为什么继承BaseDbStore而不是DefaultDbStore

文档明确指出,虽然GaussDbStore与DefaultDbStore当前实现几乎相同(对比 gauss_db_store.py 与 default_db_store.py 可见两者都只是持有async_conn并返回引擎),但继承BaseDbStore是深思熟虑的设计:

  1. 语义清晰:BaseDbStore是抽象基类,定义统一存储接口(base_db_store.py 中get_async_engine()是唯一抽象方法);GaussDbStore由此明确标识自己是 GaussDB 专用实现,便于在代码中区分不同数据库存储。
  2. 模块隔离:DefaultDbStore位于核心模块openjiuwen.core.foundation.store.db,GaussDbStore位于扩展模块openjiuwen.extensions.store.db,核心模块保持干净,具体数据库实现放在扩展侧。
  3. 未来可扩展:GaussDbStore未来可独立增加 GaussDB 专属能力(如连接池配置、监控指标、性能优化),不影响核心模块稳定性。
  4. 依赖管理:DefaultDbStore随核心模块分发;GaussDbStore是可选扩展,通过pip install openjiuwen[gaussdb]或pip install openjiuwen[all-storage]安装,与"最小核心、可选扩展"哲学一致。

从协议层面看,LongTermMemory.register_store要求db_store是BaseDbStore实例(见 long_term_memory.py 的 isinstance 校验),因此任何继承BaseDbStore的存储都可以无缝替换,这也是插件化设计的直接体现。

七、类 API 详解

7.1GaussDbStore

class openjiuwen.extensions.store.db.gauss_db_store.GaussDbStore(async_conn: AsyncEngine)

GaussDB 数据库存储实现,继承自BaseDbStore。它包装一个 SQLAlchemyAsyncEngine,上层业务通过get_async_engine()获取引擎后,即可使用标准 SQLAlchemy async 接口执行 CRUD。

导入该模块会自动触发gauss_dialect注册(通过import_dbapi()局部加载驱动),无需手动调用。

参数:

  • async_conn(AsyncEngine):SQLAlchemy 异步引擎实例,通常由create_async_engine创建。

示例:

>>> from sqlalchemy.ext.asyncio import create_async_engine >>> from openjiuwen.extensions.store.db import GaussDbStore >>> >>> engine = create_async_engine("gaussdb+async_gaussdb://user:password@host:port/database") >>> store = GaussDbStore(async_conn=engine) >>> # Use store.get_async_engine() to get the engine for database operations

7.2get_async_engine

get_async_engine() -> AsyncEngine

返回内部持有的AsyncEngine实例。多次调用返回同一个实例(单例语义,可通过is断言验证):

>>> engine = store.get_async_engine() >>> assert engine is store.get_async_engine() # Same instance

该方法是BaseDbStore定义的抽象接口实现(base_db_store.py),保证所有数据库存储对上层暴露一致的引擎获取入口。

7.3async_conn

async_conn: AsyncEngine,内部持有的AsyncEngine实例属性,由构造时传入并保存(gauss_db_store.py)。

八、调用链与初始化时序

文档给出了清晰的调用链,理解它有助于排查初始化问题:

from openjiuwen.extensions.store.db import GaussDbStore │ ▼ gauss_db_store.py → import gauss_dialect (module load, executed once only) │ ▼ gauss_dialect.py module load automatically completes: ├── registry.register("gaussdb", ...) # Register GaussDialect_asyncpg with SQLAlchemy └── GaussDialect_asyncpg.import_dbapi() # Load async_gaussdb driver locally │ ▼ GaussDbStore(async_conn=engine) # Create store instance │ ▼ store.get_async_engine() # Get AsyncEngine → Execute database operations via SQLAlchemy

两个关键语义值得强调:

  • Python 模块缓存机制保证gauss_dialect.py中的初始化逻辑(含方言注册)只执行一次,无需手动调用;
  • 新实现通过import_dbapi()局部加载驱动,不污染全局sys.modules。

九、完整 CRUD 实战示例

以下示例完整演示了从建引擎、建表到增删改查的全过程,可直接运行(替换连接串为真实 GaussDB 地址):

import asyncio from datetime import datetime from sqlalchemy import String, Integer, Float, DateTime, Text, select, update, delete from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import DeclarativeBase, sessionmaker, Mapped, mapped_column from openjiuwen.extensions.store.db import GaussDbStore class Base(DeclarativeBase): pass class Product(Base): __tablename__ = "products" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) name: Mapped[str] = mapped_column(String(100), nullable=False) price: Mapped[float] = mapped_column(Float, nullable=False) category: Mapped[str] = mapped_column(String(50)) stock: Mapped[int] = mapped_column(Integer, default=0) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now) async def main(): GAUSSDB_URL = "gaussdb+async_gaussdb://user:password@host:port/database" engine = create_async_engine(GAUSSDB_URL, echo=False) store = GaussDbStore(async_conn=engine) engine = store.get_async_engine() async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) # Create tables async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) # Insert async with async_session() as session: product = Product(name="Smartphone", price=6999.00, category="Electronics", stock=50) session.add(product) await session.commit() await session.refresh(product) print(f"Inserted: ID={product.id}") # Query async with async_session() as session: result = await session.execute(select(Product).where(Product.name == "Smartphone")) p = result.scalar_one() print(f"Query result: {p.name}, Price={p.price}") # Update async with async_session() as session: stmt = update(Product).where(Product.name == "Smartphone").values(price=5999.00) await session.execute(stmt) await session.commit() # Delete async with async_session() as session: stmt = delete(Product).where(Product.name == "Smartphone") await session.execute(stmt) await session.commit() await engine.dispose() if __name__ == "__main__": asyncio.run(main())

示例要点:

  • store.get_async_engine()返回的引擎可直接交给sessionmaker使用,说明GaussDbStore与标准 SQLAlchemy async ORM 工作流完全兼容;
  • echo=False关闭 SQL 日志,调试时可改为True;
  • 结尾await engine.dispose()显式释放连接池资源。

十、与 LongTermMemory 内存引擎的集成

GaussDbStore可作为LongTermMemory的db_store参数,替换默认的DefaultDbStore。这正是它在 agent-core 中最典型的应用场景——把记忆持久化到 GaussDB:

>>> from openjiuwen.core.memory import LongTermMemory >>> from openjiuwen.extensions.store.db import GaussDbStore >>> from sqlalchemy.ext.asyncio import create_async_engine >>> >>> engine = create_async_engine("gaussdb+async_gaussdb://user:password@host:port/agentmgr") >>> db_store = GaussDbStore(async_conn=engine) >>> >>> memory = LongTermMemory() >>> await memory.register_store( ... kv_store=kv_store, ... vector_store=vector_store, ... db_store=db_store, ... )

源码层面的集成链路(long_term_memory.py)如下:

  1. register_store首先做类型校验:db_store必须是BaseDbStore实例,否则抛出MEMORY_REGISTER_STORE_EXECUTION_ERROR(long_term_memory.py);
  2. 若提供了db_store,自动调用create_tables初始化持久化表结构(long_term_memory.py);
  3. 若未显式提供message_store,则会用SqlDbStore(db_store)自动构造内部SqlMessageStore(long_term_memory.py)。

SqlDbStore通过db_store.get_async_engine()获取引擎绑定AsyncSession(见 sql_db_store.py),因此上层记忆读写最终都汇聚到GaussDbStore持有的引擎上。这意味着:你只需替换这一个db_store,整个记忆系统的 SQL 持久化层就整体迁移到了 GaussDB。

十一、连接字符串格式

gaussdb+async_gaussdb://username:password@host:port/database

格式解析:方言名+驱动名://用户名:密码@主机:端口/数据库名。其中:

  • gaussdb:方言名,对应GaussDialectAsyncpg.name;
  • async_gaussdb:驱动名,对应GaussDialectAsyncpg.driver,即async-gaussdb包;
  • 该连接串能够被正确解析的前提是gauss_dialect.py已完成注册(导入GaussDbStore时自动完成)。

十二、依赖说明与安装方式

12.1 依赖清单

包版本要求说明
sqlalchemy>= 2.0.41项目主依赖自带
async-gaussdb~= 0.30.0GaussDB 异步驱动(兼容 0.30.x),可选依赖
asyncpg>= 0.29.0PostgreSQL 异步驱动,SQLAlchemyPGDialect_asyncpg的错误翻译(_asyncpg_error_translate)与异步连接适配在运行时必需

12.2 为什么asyncpg是必需依赖

虽然GaussDbStore主驱动是async_gaussdb,但asyncpg仍是运行时硬依赖,原因有三:

  1. SQLAlchemy asyncpg 方言基础设施:GaussDialectAsyncpg继承PGDialect_asyncpg并复用其适配层AsyncAdapt_asyncpg_dbapi。SQLAlchemy asyncpg 方言的错误翻译机制_asyncpg_error_translate在数据库报错时会直接import asyncpg并引用asyncpg.exceptions.*;
  2. 运行时错误处理:查询抛错时,AsyncAdapt_asyncpg_connection._handle_exception会访问_asyncpg_error_translate触发import asyncpg。若未安装asyncpg,错误处理过程本身会抛出ImportError,导致真正的数据库错误信息被掩盖;
  3. 连接适配:AsyncAdapt_asyncpg_dbapi提供的异步连接适配层内部依赖 asyncpg 兼容接口。

这也解释了 pyproject.toml 中gaussdbextra 为何同时包含async-gaussdb与asyncpg两个包。

12.3 安装方式

# Option 1: Install GaussDB optional dependency (includes asyncpg) pip install openjiuwen[gaussdb] # Option 2: Install all storage dependencies (recommended) pip install openjiuwen[all-storage] # Option 3: Install drivers separately pip install async-gaussdb asyncpg
  • 仅使用 GaussDB 存储时,Option 1 最精简;
  • 需要在多种存储后端间切换时,Option 2 一步到位;
  • 手动管理依赖的定制环境可用 Option 3。

十三、使用限制与兼容性边界

13.1 支持的能力

✅标准 SQLAlchemy 操作

  • 基础 CRUD 操作(增删改查);
  • 事务管理;
  • 连接池管理;
  • 异步查询。

✅PostgreSQL 兼容语法

  • GaussDialect_asyncpg继承自PGDialect_asyncpg;
  • 支持大部分 PostgreSQL 数据类型与函数;
  • 适用于标准 SQL 查询与事务操作。

13.2 不支持的能力

❌GaussDB 专属高级语法

  • 不支持 GaussDB 专属存储过程与函数调用;
  • 不支持 GaussDB 专属数据类型扩展;
  • 不支持 GaussDB 专有性能优化特性(如特定索引策略)。

❌asyncpg 专属特性

  • 由于使用async_gaussdb驱动,不支持 asyncpg 自定义类型编码/解码器;
  • 不支持 asyncpg 的通知/监听机制。

❌高级连接特性

  • 不支持服务端游标的某些高级用法;
  • 不支持 PostgreSQL 专属复制特性;
  • 不支持 PostgreSQL 的 LISTEN/NOTIFY 机制。

13.3 兼容性说明

完全兼容场景:

  • 标准 ORM 操作(SQLAlchemy Core 与 ORM);
  • 基础数据类型(INTEGER、VARCHAR、TEXT、TIMESTAMP 等);
  • 标准事务与连接管理;
  • 简单查询与更新操作。

需要适配的场景:

  • 使用 PostgreSQL 专属函数的复杂查询;
  • 需要数据库专属优化的场景;
  • 使用高级并发控制(如高级行级锁)。

十四、最佳实践与优雅降级

14.1 使用标准 SQLAlchemy 接口

# Recommended: Use standard ORM operations async with async_session() as session: user = User(name="Alice") session.add(user) await session.commit()

14.2 避免数据库专属语法

# Avoid: Using PostgreSQL-specific functions # stmt = select(User).where(User.created_at > func.now()) # Recommended: Use standard SQL functions from sqlalchemy import func stmt = select(User).where(User.created_at > func.current_timestamp())

14.3 处理可选依赖:降级策略

由于GaussDbStore依赖可选安装的驱动,生产代码应做好 ImportError 降级,缺依赖时回退到核心模块的DefaultDbStore:

try: from openjiuwen.extensions.store.db import GaussDbStore except ImportError: # Fallback to default storage from openjiuwen.core.foundation.store.db import DefaultDbStore

该模式与项目的"可选扩展"设计呼应:核心功能不因扩展缺失而不可用。

14.4 三条实践小结

  1. 保持标准接口:尽量只使用跨数据库通用的 ORM 能力,可移植性最好;
  2. 关注反射行为:建表/反射依赖元数据查询,若遇异常可确认是否触发pg_type.typcollation相关的自动修复逻辑;
  3. 按需安装:仅 GaussDB 场景用openjiuwen[gaussdb],多存储场景用openjiuwen[all-storage],并始终确保asyncpg同时就位,否则运行时报错时错误翻译链路会失效。

总结

GaussDbStore是 openJiuwen agent-core "最小核心、可选扩展"架构的一个典型样本:核心只暴露BaseDbStore抽象接口,GaussDB 支持完全收敛在openjiuwen.extensions.store.db扩展模块中。通过import_dbapi()局部加载驱动、注册gaussdb方言、并以AsyncAdapt_asyncpg_dbapi做异步适配,它既避免了旧式 monkey patch 的全局污染,又让上层业务可以用完全标准的 SQLAlchemy async 接口读写 GaussDB。配合LongTermMemory.register_store,一行db_store参数即可把整个记忆持久化层切换到 GaussDB——这正是该扩展在 agent-core 中的核心价值所在。

如需进一步研究,建议继续阅读:gauss_dialect.py、gauss_db_store.py、base_db_store.py、long_term_memory.py,以及 pyproject.toml 中gaussdb与all-storage的依赖声明。

  • 人工智能
  • AI Agent
  • Agent 框架
  • 大模型
  • 工具调用
  • RAG
  • 提示工程
  • 强化学习

【免费下载链接】agent-core

openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力

项目地址:https://gitcode.com/openJiuwen/agent-core
点击查看免费下载

相关推荐

上一篇:Pwndbg与SystemTap调试示例:常用调试场景
下一篇:gh_mirrors/ma/materials深度探索:从基础语法到高级框架的完整学习路径

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

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

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

立即咨询