AmritaCore support for NoneBot2
Project description
LibAmritaCore
LibAmritaCore:把下一代高性能 Agent 内核,带入 NoneBot2 生态。
介绍
此插件为 NoneBot2 生态提供 AmritaCore 原生支持。 AmritaCore 是一套开源、轻量、高性能的下一代 Agent 运行时内核,提供可中断、可自省、可恢复的现代化 AI 执行环境。
了解更多:
快速开始
安装插件
nb plugin install nonebot_plugin_amrita
配置插件
配置均遵循 NoneBot2 标准的配置体系。
Cookie 配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
amrita_cookie_enable |
bool |
False |
是否启用 Cookie 鉴权 |
amrita_cookie |
str |
随机16位字符串 | 插件内部安全密钥(启用后自动生成) |
功能配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
amrita_mcp_enable |
bool |
False |
是否启用 MCP(Model Context Protocol) |
amrita_mcp_clients |
list[str] |
[] |
MCP 客户端脚本路径列表 |
amrita_tool_call_limit |
int |
15 |
单轮工具调用最大次数限制 |
LLM 内存配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
amrita_memory_token_limit |
int |
2048 |
对话记忆窗口 Token 上限 |
amrita_memory_length |
int |
50 |
最大保留对话条数 |
amrita_prompt_token_limit |
int |
256 |
系统提示词 Token 上限 |
内置 Agent 行为配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
amrita_agent_mode |
agent / rag / none |
agent |
运行模式:智能体 / 检索生成 / 纯对话 |
amrita_agent_thought_mode |
reasoning / chat / ... |
reasoning |
思考模式:推理 / 对话 / 强制推理 / 可选推理 |
高性能缓存配置
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
amrita_metadata_cache_size |
int |
2048 |
用户元数据缓存大小 |
amrita_memory_cache_size |
int |
512 |
用户记忆缓存大小 |
amrita_lockpool_size |
int |
1024 |
并发锁池大小(支持动态 resize) |
配置示例(.env)
AMRITA_COOKIE_ENABLE=true
AMRITA_MCP_ENABLE=true
AMRITA_MCP_CLIENTS='["client1","client2"]'
AMRITA_TOOL_CALL_LIMIT=20
AMRITA_MEMORY_TOKEN_LIMIT=3072
AMRITA_MEMORY_LENGTH=100
AMRITA_PROMPT_TOKEN_LIMIT=512
AMRITA_AGENT_MODE=agent
AMRITA_AGENT_THOUGHT_MODE=reasoning
开发指南
基本使用
导入核心组件
from nonebot_plugin_amrita.agent import AgentSession, SessionDepends
from amrita_core import AmritaConfig, ModelPreset, PresetManager
from amrita_core.types import Message
创建 Agent Session
有两种方式创建 AgentSession:
方式一:使用依赖注入装饰器
from nonebot import on_command
from nonebot.params import Depends
matcher = on_command("chat")
@matcher.handle()
async def handle_chat(
session: AgentSession = SessionDepends(
train={"system": "你是一个助手"},
config=None, # 使用默认配置或传入自定义 AmritaConfig
preset=None, # 使用默认预设或传入自定义 ModelPreset
)
):
async with session as agent:
response = await agent.chat("你好")
await matcher.send(response.content)
方式二:手动加载
from nonebot.adapters import Event
@matcher.handle()
async def handle_chat(event: Event):
async with await AgentSession.load_from(
id_or_event=event,
train={"system": "你是一个助手"},
config=None,
preset=None,
) as agent:
response = await agent.chat("你好")
await matcher.send(response.content)
核心 API
AgentSession
AgentSession 继承自 AmRuntime,提供以下核心方法:
-
**
load_from(id_or_event, train, config, preset, **kwargs)**: 类方法,从事件或字符串 ID 加载会话id_or_event:Event对象或字符串 ID(推荐使用event.get_session_id())train: 训练数据,可以是Message[str]或dict[str, str]config: AmritaCore 配置,为None时使用全局配置preset: 模型预设,为None时使用默认预设
-
**
chat(input, **kwargs)**: 发送消息并获取响应 -
save_context(): 手动保存上下文到数据库 -
get_chatobject(input, **kwargs): 获取ChatObject实例(内部使用)
SessionDepends
依赖注入辅助函数,用于在 NoneBot2 处理器中自动注入 AgentSession 实例。
参数与 AgentSession.load_from 相同。
数据持久化
插件自动管理以下数据的持久化:
- 用户记忆 (Memory): 存储对话历史和上下文
- 用户元数据 (Metadata): 记录 Token 使用量、调用次数等统计信息
- 会话归档 (Sessions): 历史会话快照(保留最近 20 条)
- 全局统计 (Insights): 每日全局使用情况
所有数据通过 CachedUserDataRepository 进行缓存,支持:
- LRU 缓存策略
- 线程安全的并发锁机制
- 脏标记追踪(仅保存变更数据)
并发控制
插件实现了多层锁机制确保数据一致性:
- 数据库锁: 基于
user_id的细粒度锁,防止并发写入冲突 - Session 锁: 基于
session_id的操作锁,确保同一会话的串行化处理 - 动态锁池: 使用
WeakValueLRUCache实现可动态调整的锁池(默认容量 1024)
性能优化建议
- 复用 Session: 同一用户的多次请求应使用相同的
session_id,避免重复加载数据 - 合理使用缓存: 调整
amrita_metadata_cache_size和amrita_memory_cache_size以平衡内存占用和性能 - 批量操作:
AgentSession的上下文管理器会在退出时批量保存使用量统计,建议使用async with语法 - 限制工具调用: 根据实际需求设置
amrita_tool_call_limit,避免过度消耗资源
监控与调试
查看统计数据
from nonebot_plugin_amrita.database import InsightsModel
# 获取今日统计
insights = await InsightsModel.get()
print(f"今日输入 Token: {insights.token_input}")
print(f"今日输出 Token: {insights.token_output}")
print(f"今日调用次数:{insights.usage_count}")
# 获取历史统计(最近 7 天)
all_insights = await InsightsModel.get_all(expire_days=7)
查看用户使用排名
from nonebot_plugin_amrita.database import UserDataExecutor
top_users = await UserDataExecutor.get_top_users(limit=10)
for user in top_users:
print(f"用户:{user.user_id}, 调用次数:{user.called_count}")
常见问题
Q: 如何区分不同聊天场景?
A: 使用 event.get_session_id() 作为唯一标识。
Q: 如何清理用户数据?
A: 通过数据库操作清理(需自行引入 ORM):
from nonebot_plugin_orm import get_session
from nonebot_plugin_amrita.database import Memory, UserMetadata, MemorySessions
async with get_session() as session:
# 删除特定用户的记忆
await session.execute(delete(Memory).where(Memory.user_id == "user_id"))
# 删除元数据
await session.execute(delete(UserMetadata).where(UserMetadata.user_id == "user_id"))
# 删除会话归档
await session.execute(delete(MemorySessions).where(MemorySessions.user_id == "user_id"))
await session.commit()
Q: 如何自定义模型预设?
A: 创建自定义 ModelPreset 并传入:
from amrita_core import ModelPreset
custom_preset = ModelPreset(
name="custom",
model_name="gpt-4",
# ... 其他参数
)
async with await AgentSession.load_from(
event,
train={"system": "..."},
preset=custom_preset
) as agent:
...
特别说明(重要)
-
AmritaCore 与 NoneBot2 DI 系统不兼容 两者为完全独立的依赖注入设计。 AmritaCore 注入属于 Agent 运行时内核层,与 NoneBot2 无关。
-
本插件数据库与 AmritaBot 完全隔离 不共享表名、不共享数据、不互相依赖,仅同源设计。
-
本插件不依赖 AmritaBot 可独立安装、独立运行、独立部署。
开发者说明
请注意,在 NoneBot2 环境中使用本插件时,Session 应被当作用户唯一标识使用(即通过 event.get_session_id() 获取),而非某个 Session 归档的 ID,避免因标识混淆导致的用户数据错乱。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nonebot_plugin_amrita-0.1.0.tar.gz.
File metadata
- Download URL: nonebot_plugin_amrita-0.1.0.tar.gz
- Upload date:
- Size: 35.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b45c509f1c9a8da823e8ac8b0f6f87c31278187ccca063045d87c1a386fbe9ef
|
|
| MD5 |
fc1a11cecce1dfc91f51994b28a131bd
|
|
| BLAKE2b-256 |
abbe97e878c92bce56bde233f0c3fb70a744959f59914fef21ac909930f011b8
|
File details
Details for the file nonebot_plugin_amrita-0.1.0-py3-none-any.whl.
File metadata
- Download URL: nonebot_plugin_amrita-0.1.0-py3-none-any.whl
- Upload date:
- Size: 34.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ebd4bd431fc6dec9b73d24ed6ef6f4c660e95e9fbeb3b59a45c5cc592ad7299
|
|
| MD5 |
e2dd1f138e0720e488a560b59ab66844
|
|
| BLAKE2b-256 |
23a348d6332964a41e4f8b5f02d63e2f3733240c04ae95d3506ae943655400e0
|