Context7
Up-to-date docs for AI agents
作者提供的说明(英文原文)
Persistent decision memory for agents — learns which action works in which context
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
BANDITDB_URL, BANDITDB_API_KEY标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"banditdb": {
"command": "uvx",
"args": [
"banditdb-python"
],
"env": {
"BANDITDB_URL": "your-value",
"BANDITDB_API_KEY": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add banditdb --env BANDITDB_URL=your-value --env BANDITDB_API_KEY=your-value -- uvx banditdb-python运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"banditdb": {
"command": "uvx",
"args": [
"banditdb-python"
],
"env": {
"BANDITDB_URL": "your-value",
"BANDITDB_API_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"banditdb": {
"type": "stdio",
"command": "uvx",
"args": [
"banditdb-python"
],
"env": {
"BANDITDB_URL": "your-value",
"BANDITDB_API_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过域名 banditdb.com 验证(注册中心会核实域名所有权)
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:BANDITDB_URL, BANDITDB_API_KEY
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.3.1)于26天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。
同一分类中有:Context7, Codebase Memory, Exa
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Up-to-date docs for AI agents
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
The official Python client and Model Context Protocol (MCP) server for BanditDB — the ultra-fast, lock-free Contextual Bandit database written in Rust.
BanditDB abstracts away the complex linear algebra of Reinforcement Learning (LinUCB, Thompson Sampling) behind a dead-simple API. Build real-time personalizers, dynamic A/B tests, and give LLM agents mathematically rigorous persistent memory.
mcp-name: com.banditdb/mcp
pip install banditdb-python
Requires the BanditDB Rust server running (default: http://localhost:8080).
The client features automatic connection pooling, exponential backoff retries, and strict timeouts.
from banditdb import Client, BanditDBError
db = Client( url="http://localhost:8080", timeout=2.0, api_key="your-secret-key", # omit if server runs without auth )
try:
db.create_campaign( campaign_id="checkout_upsell", arms=["offer_discount", "offer_free_shipping"], features=["is_mobile", "cart_value", "is_returning_user"], )
arm_id, interaction_id = db.predict("checkout_upsell", { "is_mobile": 1.0, "cart_value": min(cart_total / 200, 1.0), "is_returning_user": 0.0, }) print(f"Showing: {arm_id}") # e.g., "offer_free_shipping"
db.reward(interaction_id, reward=1.0)
except BanditDBError as e: print(f"Database error: {e}")
Named features or a vector. With features=[...] the campaign stores the feature order in its metadata, and predict, batch_predict and interact accept a dict keyed by name. A missing or misspelt name raises ValueError before any request is sent. Campaigns created in the BanditDB console accept dicts too. The order is read once per campaign with campaign_info() and cached on the client. To manage the vector yourself, pass feature_dim instead and send lists — normalize_context() scales one to unit length.
Health
| Method | Description |
|---|---|
health() | Returns True if the server is reachable and the WAL writer is healthy. |
health_detail() | Returns the full health dict including per-campaign entropy and status ("ok" / "warning" / "critical"). |
Campaigns
| Method | Description |
|---|---|
create_campaign(campaign_id, arms, feature_dim=None, alpha=1.0, algorithm="linucb", metadata=None, decay_half_life_hours=None, pacing=None, features=None) | Register a new campaign. Pass features (names, in order) to predict with dicts, or feature_dim to send vectors. algorithm accepts "linucb", "thompson_sampling", NeuralLinUCBConfig, NeuralTSConfig, or ProgressiveConfig. metadata is an arbitrary JSON dict (≤ 64 KB). pacing takes a PacingConfig — see Budget constraints. |
list_campaigns() | Returns a list of all campaigns (active and archived) with alpha, arm_count, and algorithm. |
campaign_info(campaign_id) | Returns full per-arm state: theta, theta_norm, prediction and reward counters. Raises APIError (404) if not found. |
report(campaign_id) | Business-level convergence report. converged=True means one arm has a statistically significant lead at 95% CI — safe to stop. converged=False means leading but CIs still overlap. converged=None means not enough data yet (< 30 rewards per arm). |
diagnostics(campaign_id) | Operator diagnostics: per-arm theta norms, A_inv uncertainty bounds, entropy health (selection_entropy, entropy_status, entropy_trend, likely_cause, suggested_action), tournament traffic, and neural buffer size. |
archive_campaign(campaign_id) | Soft-delete: pauses predictions/rewards but preserves all learned weights. Recoverable with restore_campaign(). |
restore_campaign(campaign_id) | Restore an archived campaign to active status with all weights intact. |
delete_campaign(campaign_id) | Permanently delete a campaign. Returns False if not found. |
pacing(campaign_id) | Budget state of a pacing campaign: per-resource budget, consumed, remaining, utilization, lambda (shadow price), is_exhausted. None if the campaign has no pacing. Server 2.3.0+. |
add_arm(campaign_id, arm_id, group=None, warm_start=None, costs=None) | Add an arm to a live campaign (admin key). costs maps resource name → units consumed per prediction, for pacing campaigns. |
set_arm_status(campaign_id, arm_id, status) | "active", "paused" (not selectable, reversible) or "retired". The arm keeps what it learned. Admin key. |
Predict & Reward
| Method | Description | |
|---|---|---|
predict(campaign_id, context, eligible_arms=None, exclude_arms=None) | context is a dict of feature values (named campaigns) or a vector. Returns (arm_id, interaction_id). Pass interaction_id to reward() to close the loop. The optional filters narrow candidates for this call only. | |
batch_predict(predictions) | Predict for up to 100 campaign/context pairs in a single round-trip. Each item: `{"campaign_id": str, "context": dict | List[float]}. Returns list of {arm_id, interaction_id} or {error}` per item. |
reward(interaction_id, reward) | Record outcome. reward must be in [0.0, 1.0]. Raises APIError if the interaction has already been rewarded or has expired (default TTL: 24 h). |
Data & Export
| Method | Description |
|---|---|
checkpoint() | Flush WAL, snapshot models, write Parquet shards, run neural retrain + tournament eval, rotate WAL. Returns a summary string. |
export() | List Parquet export shards grouped by campaign. Returns {export_dir, shards}. |
Server 2.3.0+. Give a campaign one or more budgeted resources and per-arm costs; the server learns a shadow price per resource and steers spend to last the horizon, choosing costly arms only where their uplift is worth it.
from banditdb import Client, PacingConfig, ResourceConstraint
db.create_campaign( "promos", ["none", "discount_10", "discount_20"], feature_dim=4, pacing=PacingConfig(resources=[ ResourceConstraint( name="promo_budget", budget=5_000.0, # units available over the horizon horizon=100_000, # decisions the budget should last arm_costs={"discount_10": 1.0, "discount_20": 2.0}, # "none" costs 0 ), ]), )
db.add_arm("promos", "discount_30", costs={"promo_budget": 3.0})
for r in db.pacing("promos")["resources"]: print(f"{r['name']}: {r['utilization']:.0%} spent, lambda={r['lambda']:.3f}")
Worth knowing:
arm_costs keys must be campaign arms. The server would silently treat a misspelt arm as free; the SDK raises ValueError instead.Standard LLM agents are stateless — if they route a task to the wrong model and fail, they repeat the same mistake tomorrow. BanditDB's built-in MCP server gives the entire agent swarm shared persistent memory.
# Set environment variables before starting
export BANDITDB_URL=http://localhost:8080 export BANDITDB_API_KEY=your-secret-key # omit if server runs without auth
banditdb-mcp
Add to your Claude configuration file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": { "banditdb": { "command": "banditdb-mcp", "args": [], "env": { "BANDITDB_URL": "http://localhost:8080", "BANDITDB_API_KEY": "your-secret-key" } } } }
The agent swarm now has twelve tools:
| Tool | What it does |
|---|---|
create_campaign | Create a new decision campaign. Accepts algorithm ("linucb" or "thompson_sampling"), alpha, and optional budgets for actions that cost something limited. Use Thompson Sampling for natural Bayesian exploration with no tuning needed. |
list_campaigns | List all active campaigns (shows algorithm and alpha) — useful to check what exists before calling get_intuition. |
campaign_diagnostics | Inspect per-arm learning state: theta_norm, prediction counts, reward rates, and entropy health. Use when a campaign doesn't seem to be learning or one arm is dominating. |
campaign_report | Business-level convergence report. Tells you whether the campaign has statistically converged and which arm is winning with confidence intervals. |
get_intuition | Ask BanditDB which arm to pick for a given context. Optional exclude_arms / eligible_arms narrow the choice for this request only. Returns the arm and an interaction_id to save. |
batch_get_intuition | Get decisions for multiple campaigns in a single round-trip. Pass a list of {campaign_id, context} dicts. |
record_outcome | Report whether the chosen action succeeded (1.0) or failed (0.0). Updates the shared model. |
archive_campaign | Soft-delete a campaign. Pauses predictions/rewards but preserves all learned weights. |
restore_campaign | Restore an archived campaign to active status with all weights intact. |
campaign_budget | Budget spend per resource: consumed, remaining, utilization, shadow price, exhaustion. |
add_arm | Add an action to a live campaign, optionally warm-started from existing arms and with budget costs. |
set_arm_status | Pause, retire, or reactivate an action. It keeps everything it learned. |
Every decision made by any agent in the network improves the routing for all future agents.
BanditDB event-sources every prediction and reward to a Write-Ahead Log (WAL). Calling checkpoint() compiles completed prediction→reward pairs into Snappy-compressed Parquet files — one per campaign — for offline analysis with Polars or Pandas.
Every prediction is guaranteed to appear in the Parquet file even if its reward arrives hours later: BanditDB re-emits in-flight interactions at each checkpoint so delayed rewards are always captured in a future cycle.
# Checkpoint: snapshot models, write Parquet, rotate the WAL.
summary = db.checkpoint() print(summary)
print(db.export())
import polars as pl df = p
只显示了开头部分;其余内容请在仓库中阅读