Banditkeep

io.github.CloudCorpRecords由 GitHub 账号 CloudCorpRecords 发布v0.1.0更新于 Nov 7, 2026

Decision memory for agents: bandit campaigns that learn which action works in which context.

已验证STDIO仅桌面数据与分析AI 与机器学习

概览

AI 生成的概览

BanditDB 上下文赌博机服务器的客户端,让助手创建决策活动、按上下文询问该选哪个动作,并回报结果。

可以做什么
  • 创建、列出、归档与恢复决策活动,添加动作并调整其状态
  • 针对给定上下文询问应选哪个动作,可单次或跨活动批量查询
  • 记录某次交互的成功或失败,以更新共享模型
  • 查看各动作的学习状态,并获取带置信区间的收敛报告
  • 查看每个活动的预算消耗、剩余额度、使用率与耗尽情况
适用场景
适合助手或多个智能体需要在若干动作间反复选择(例如模型路由或方案变体)并从结果中学习的场景,也适合检查已有活动是否已收敛或预算使用情况。
运行要求
通过 npx 或 Docker 在本地运行,需要可访问的 BanditDB 服务器。可选环境变量:BANDITDB_URL(默认 Bearer 令牌发送)、BANDITDB_TIMEOUT_MS(默认 15000)。
安装前请注意
README 说明由于没有公开的 API 文档,HTTP 请求路径是重建推测的,可能与实际服务器不一致。若设置了 BANDITDB_API_KEY,它会在每次请求中发送。相关工具会创建、归档、恢复和修改活动与动作,并记录会改变共享模型的结果。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Banditkeep,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

banditkeep

Give a swarm of agents a memory for decisions. banditkeep is a small client for a BanditDB server: a contextual bandit database that learns, per campaign, which action tends to pay off in which context. An agent asks which arm to pick, acts on the answer, then reports whether it worked — and every later agent pointing at the same server benefits from that outcome immediately, with no retraining step.

Two exploration algorithms anchor the campaigns: LinUCB, deterministic and tunable through alpha, and Thompson Sampling, which explores naturally in a Bayesian way and needs no tuning. Campaigns can also carry budgets for actions that cost something limited, so spend is steered across a horizon instead of running dry on the first day.

Configuration

Three environment variables control the client:

  • BANDITDB_URL (optional) — base URL of your BanditDB server. Defaults to http://localhost:8080.
  • BANDITDB_API_KEY (optional) — when set, it is sent on every request as Authorization: Bearer <key>. Omit it when your server runs without auth; leaving it unset is never an error by itself.
  • BANDITDB_TIMEOUT_MS (optional) — per-request timeout in milliseconds, enforced with an AbortController. Defaults to 15000. (This variable is this rebuild's own addition.)

Tools

  • create_campaign — create a new decision campaign. Requires campaign_id and arms; optionally takes features (names, in order) or feature_dim, alpha, algorithm ("linucb" or "thompson_sampling"), metadata, budgets, and decay_half_life_hours.
  • list_campaigns — list all active campaigns, showing algorithm and alpha; useful to check what exists before calling get_intuition.
  • campaign_diagnostics — inspect per-arm learning state: theta norms, prediction counts, reward rates, and entropy health. Reach for it when a campaign does not seem to be learning or one arm is dominating.
  • campaign_report — a business-level convergence report: whether the campaign has statistically converged, and which arm is winning, with confidence intervals.
  • get_intuition — ask which arm to pick for a given context (an object of feature-name to number, or an array of numbers). Optional eligible_arms / exclude_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 predictions as a list of {campaign_id, context} dicts, at most 100 per call.
  • record_outcome — report whether the chosen action succeeded (1.0) or failed (0.0), closing the loop for an interaction_id. Rewards outside [0, 1] are rejected locally with reward must be between 0 and 1.
  • archive_campaign — soft-delete a campaign: it pauses predictions and 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, and 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 (status is "active", "paused", or "retired"); the arm keeps everything it learned.

Unset optional arguments are omitted from requests entirely. Responses come back exactly as the server returned them. An upstream non-2xx reply fails with banditdb error: HTTP <status> and an unreachable server (including a timeout) with banditdb unreachable.

Endpoint provenance

The original project's README and MCP documentation pin the twelve tools, their arguments, the configuration above, and the decision-loop semantics — but no HTTP API is published in those sources. The request paths below are reconstructions, labelled as such:

  • POST <base>/campaigns with the arguments as the JSON body (used by create_campaign).
  • GET <base>/campaigns (used by list_campaigns).
  • GET <base>/campaigns/{campaign_id}/diagnostics (used by campaign_diagnostics).
  • GET <base>/campaigns/{campaign_id}/report (used by campaign_report).
  • GET <base>/campaigns/{campaign_id}/pacing (used by campaign_budget; the SDK method is named pacing).
  • POST <base>/predict with body {"campaign_id": ..., "context": ...} (used by get_intuition).
  • POST <base>/predict/batch with body {"predictions": [...]} (used by batch_get_intuition).
  • POST <base>/reward with body {"interaction_id": ..., "reward": ...} (used by record_outcome).
  • POST <base>/campaigns/{campaign_id}/archive with body {} (used by archive_campaign).
  • POST <base>/campaigns/{campaign_id}/restore with body {} (used by restore_campaign).
  • POST <base>/campaigns/{campaign_id}/arms with body {"arm_id": ...} (used by add_arm).
  • POST <base>/campaigns/{campaign_id}/arms/{arm_id}/status with body {"status": ...} (used by set_arm_status).

Path segments are sent verbatim. One discrepancy worth knowing: the vendor's MCP docs page lists nine of the twelve tools (it omits campaign_budget, add_arm, and set_arm_status); the package's own MCP table enumerates all twelve, and this rebuild follows the package table.

CLI

Each tool is a subcommand taking one JSON argument string:

bash
npx @reneturcios/banditkeep create_campaign '{"campaign_id":"model-routing","arms":["fast","cheap"],"feature_dim":4}'npx @reneturcios/banditkeep list_campaigns '{}'npx @reneturcios/banditkeep campaign_diagnostics '{"campaign_id":"model-routing"}'npx @reneturcios/banditkeep campaign_report '{"campaign_id":"model-routing"}'npx @reneturcios/banditkeep get_intuition '{"campaign_id":"model-routing","context":[0.8,0.2,0.5,0.1]}'npx @reneturcios/banditkeep batch_get_intuition '{"predictions":[{"campaign_id":"model-routing","context":[0.8,0.2,0.5,0.1]}]}'npx @reneturcios/banditkeep record_outcome '{"interaction_id":"9f2c-4e1a","reward":1.0}'npx @reneturcios/banditkeep archive_campaign '{"campaign_id":"model-routing"}'npx @reneturcios/banditkeep restore_campaign '{"campaign_id":"model-routing"}'npx @reneturcios/banditkeep campaign_budget '{"campaign_id":"model-routing"}'npx @reneturcios/banditkeep add_arm '{"campaign_id":"model-routing","arm_id":"balanced"}'npx @reneturcios/banditkeep set_arm_status '{"campaign_id":"model-routing","arm_id":"cheap","status":"paused"}'npx @reneturcios/banditkeep --version

Output is the tool's result text (the upstream body on success). Exit codes: 0 on success, 1 on a runtime error, 2 on a usage error.

MCP server

bash
npx -y @reneturcios/banditkeep mcp

MCP client config (provide the key through the client's environment when your server uses one):

json
{  "mcpServers": {    "banditkeep": {      "command": "npx",      "args": ["-y", "@reneturcios/banditkeep", "mcp"],      "env": {        "BANDITDB_URL": "http://localhost:8080",        "BANDITDB_API_KEY": "<your key>"      }    }  }}

Docker

bash
docker run -i ghcr.io/cloudcorprecords/banditkeepdocker run --rm ghcr.io/cloudcorprecords/banditkeep list_campaigns '{}'

Development

bash
npm installnpm run build   # tsc -> dist/npm test        # tsx --test test/*.test.ts (fake fetch only, no network)npm run dev     # run the CLI from source

License

MIT — Copyright (c) 2026 Rene Turcios

来源:README.md,提交 1489354

工具

12

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.

输入参数arms必填alphabudgetsfeaturesmetadataalgorithmcampaign_id必填feature_dimdecay_half_life_hours

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_id必填

campaign_report

Business-level convergence report. Tells you whether the campaign has statistically converged and which arm is winning with confidence intervals.

输入参数campaign_id必填

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.

输入参数context必填campaign_id必填exclude_armseligible_arms

batch_get_intuition

Get decisions for multiple campaigns in a single round-trip. Pass a list of {campaign_id, context} dicts.

输入参数predictions必填

record_outcome

Report whether the chosen action succeeded (1.0) or failed (0.0). Updates the shared model.

输入参数reward必填interaction_id必填

archive_campaign

Soft-delete a campaign. Pauses predictions/rewards but preserves all learned weights.

输入参数campaign_id必填

restore_campaign

Restore an archived campaign to active status with all weights intact.

输入参数campaign_id必填

campaign_budget

Budget spend per resource: consumed, remaining, utilization, shadow price, exhaustion.

输入参数campaign_id必填

add_arm

Add an action to a live campaign, optionally warm-started from existing arms and with budget costs.

输入参数costsgrouparm_id必填warm_startcampaign_id必填

set_arm_status

Pause, retire, or reactivate an action. It keeps everything it learned.

输入参数arm_id必填status必填campaign_id必填

版本历史

1
  1. v0.1.0最新Nov 4, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分