- 人工智能
- AI Agent
- Agent 框架
- 大模型
- 工具调用
- RAG
- 提示工程
- 强化学习
【免费下载链接】agent-core
openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力
导读
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的构建遵循四条原则,这四条原则也解释了本模块几乎所有实现细节:
- 最小依赖(Minimal Dependencies):只依赖标准的 SQLAlchemy 接口,避免与特定数据库强耦合;
- 隔离性(Isolation):不污染全局命名空间,保证与其他数据库驱动兼容共存;
- 可扩展性(Extensibility):基于 SQLAlchemy 方言机制实现,易于维护与升级;
- 标准合规(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, }这些配置各有讲究:
| 属性 | 值 | 含义 |
|---|---|---|
name | gaussdb | 方言名称,对应连接串 URL scheme |
driver | async_gaussdb | 驱动名称,与name一起构成gaussdb+async_gaussdb:// |
supports_statement_cache | True | 启用 SQLAlchemy 语句缓存,提升重复语句执行性能 |
supports_native_enum/supports_native_uuid | False | 不依赖 GaussDB 原生枚举与 UUID 类型,退回通用实现 |
use_insertmanyvalues | False | 不使用批量 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 参数 |
Error | GaussDBError(缺省回退Exception) | DB-API 规定的异常基类,供上层统一捕获 |
apilevel | '2.0' | 声明驱动遵循 DB-API 2.0 规范 |
threadsafety | 0 | 标记驱动非线程安全,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是深思熟虑的设计:
- 语义清晰:
BaseDbStore是抽象基类,定义统一存储接口(base_db_store.py 中get_async_engine()是唯一抽象方法);GaussDbStore由此明确标识自己是 GaussDB 专用实现,便于在代码中区分不同数据库存储。 - 模块隔离:
DefaultDbStore位于核心模块openjiuwen.core.foundation.store.db,GaussDbStore位于扩展模块openjiuwen.extensions.store.db,核心模块保持干净,具体数据库实现放在扩展侧。 - 未来可扩展:
GaussDbStore未来可独立增加 GaussDB 专属能力(如连接池配置、监控指标、性能优化),不影响核心模块稳定性。 - 依赖管理:
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 operations7.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)如下:
register_store首先做类型校验:db_store必须是BaseDbStore实例,否则抛出MEMORY_REGISTER_STORE_EXECUTION_ERROR(long_term_memory.py);- 若提供了
db_store,自动调用create_tables初始化持久化表结构(long_term_memory.py); - 若未显式提供
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.0 | GaussDB 异步驱动(兼容 0.30.x),可选依赖 |
asyncpg | >= 0.29.0 | PostgreSQL 异步驱动,SQLAlchemyPGDialect_asyncpg的错误翻译(_asyncpg_error_translate)与异步连接适配在运行时必需 |
12.2 为什么asyncpg是必需依赖
虽然GaussDbStore主驱动是async_gaussdb,但asyncpg仍是运行时硬依赖,原因有三:
- SQLAlchemy asyncpg 方言基础设施:
GaussDialectAsyncpg继承PGDialect_asyncpg并复用其适配层AsyncAdapt_asyncpg_dbapi。SQLAlchemy asyncpg 方言的错误翻译机制_asyncpg_error_translate在数据库报错时会直接import asyncpg并引用asyncpg.exceptions.*; - 运行时错误处理:查询抛错时,
AsyncAdapt_asyncpg_connection._handle_exception会访问_asyncpg_error_translate触发import asyncpg。若未安装asyncpg,错误处理过程本身会抛出ImportError,导致真正的数据库错误信息被掩盖; - 连接适配:
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 三条实践小结
- 保持标准接口:尽量只使用跨数据库通用的 ORM 能力,可移植性最好;
- 关注反射行为:建表/反射依赖元数据查询,若遇异常可确认是否触发
pg_type.typcollation相关的自动修复逻辑; - 按需安装:仅 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能力
相关推荐
openJiuwen agent-core 对象存储实践:AioBotoClient 异步 S3/OBS 客户端全解析
openJiuwen agent core 对象存储实践:AioBotoClient 异步 S3/OBS 客户端全解析 本指南围绕 openJiuwen age
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 存储层完全指南:BaseKVStore / BaseDbStore / BaseVectorStore 抽象与内置实现深度解析
openJiuwen agent core 存储层完全指南:BaseKVStore / BaseDbStore / BaseVectorStore 抽象与内置实
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 对象存储客户端:BaseObjectStorageClient 抽象接口与 AioBotoClient 异步 S3 实现详解
openJiuwen agent core 对象存储客户端:BaseObjectStorageClient 抽象接口与 AioBotoClient 异步 S3
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考