Agent 权限失控与 API 成本飙升:企业如何堵住两个洞
Agent 权限失控与 API 成本飙升:企业如何堵住两个洞
2026 年,Agent 已经从"聊天机器人"变成了拥有工具、记忆、身份和自主决策权的数字员工。能力半径越大,风险半径越大。过去半年,我帮几家企业把 Agent 接到生产环境,最常踩的两个坑不是模型选型,而是权限失控和 token 费用失控——一个让数据裸奔,一个让账单爆炸。
先说两个真实场景。某制造企业给 Agent 配了 ERP 查询权限,结果它顺着接口把整张客户表拉了出来;某团队部署的客服 Agent 在凌晨对同一个接口疯狂循环调用,一晚上刷掉 2500 块 API 费用。这两个洞不堵,Agent 落地越快,翻车越快。
洞一:权限失控——Agent 越权,系统还觉得"一切正常"
权限失控的本质是:Agent 的请求在系统看来完全"正常"。身份认证通过、接口调用成功、模型顺利返回。等企业从日志里发现异常时,数据已经发出,操作也已生效。
问题出在三个层面。第一,很多团队把权限全塞进 Prompt 里,靠"请你不要访问 XX 接口"来约束 Agent;第二,Agent 复用了人类账号的长期凭证,没有独立的机器身份;第三,缺少调用前的拦截,权限校验发生在事后审计而不是事前控制。
下面这段代码是典型的"裸奔"写法——Agent 拿到一个全量客户端,想调什么就调什么:
# 危险写法:Agent 持有全量客户端
client = InternalApiClient(token=MASTER_TOKEN) # 主 Token,权限全开
def handle_task(task: str):
# Agent 自主决定调哪个接口,无任何白名单校验
result = client.call(task["endpoint"], task["params"])
return result
正确做法是把权限收敛到最小集,并加一道调用前拦截。每个 Agent 只拿自己的服务账号,接口白名单写死在代码里,而不是让模型"自觉":
# 推荐写法:白名单 + 最小权限 + 调用前校验
ALLOWED_ENDPOINTS = {
"order_query": {"method": "GET", "scope": "read:order"},
"inventory_check": {"method": "GET", "scope": "read:inventory"},
# 写操作默认不开放
}
class GuardedClient:
def __init__(self, agent_id: str):
# 每个 Agent 独立服务账号,权限最小化
self.cred = ServiceAccount(agent_id, scopes=set())
def call(self, endpoint: str, params: dict, required_scope: str):
# 调用前拦截,而非事后审计
if endpoint not in ALLOWED_ENDPOINTS:
raise PermissionError(f"{endpoint} 不在白名单")
if required_scope not in self.cred.scopes:
raise PermissionError(f"缺少权限 {required_scope}")
return http_request(endpoint, params, token=self.cred.short_lived_token())
Agent 请求在系统看来"一切正常",认证通过、调用成功,等发现异常时数据已发出。必须把权限校验从"事后审计"前移到"调用前拦截"。
机器身份失效是另一个隐蔽风险。人类访问系统靠会话和短时 Token,但很多 Agent 用的是长期凭证,一旦泄露就是持续性的后门。建议给 Agent 配独立的机器身份,用短期 Token 自动轮换,并让每个 Agent 的权限范围可单独回收。
洞二:API 成本飙升——Token 在你看不见的地方烧钱
比权限失控更疼的是账单。Agent 跟普通 API 调用最大的区别是:它会循环、会重试、会在一次任务里反复调用同一个模型。一个死循环就能让 token 费用失控。
我见过最典型的场景:Agent 调用某个接口失败,没有设置重试上限,于是每隔两秒重试一次,每次重试都带着完整的上下文重新请求模型——token 翻倍烧。等到告警响起来,账单已经刷爆了。
成本治理的核心是三件事:设上限、控重试、分层用模型。
# 成本护栏:硬性限额 + 指数退避重试
from tenacity import retry, stop_after_attempt, wait_exponential
MAX_TOKENS_PER_TASK = 50_000 # 单任务 token 硬上限
MAX_COST_PER_TASK = 2.0 # 单任务费用硬上限(元)
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, max=10))
def call_llm_with_guard(messages, model="qwen-plus"):
# 每次调用前检查累计消耗
if task_token_counter() > MAX_TOKENS_PER_TASK:
raise CostLimitExceeded("任务 token 超限,终止")
if task_cost_counter() > MAX_COST_PER_TASK:
raise CostLimitExceeded("任务费用超限,终止")
return llm_client.chat(messages, model=model)
除了硬性限额,还有两个低成本高收益的手段。一是给不同任务分配合适的模型——简单分类、提取关键词用便宜的小模型,复杂推理才用大模型,别让所有请求都走顶配;二是给 Agent 的每次工具调用设置超时和最大调用次数,防止它在同一个问题上反复打转。
成本治理不是事后看账单,而是事前设护栏。把"最多花多少"写进代码,比任何监控面板都可靠。建议每个 Agent 任务都带上预算上下文,消耗接近上限时自动降级——比如从大模型切到规则引擎,或者直接转人工。
总结:两个洞,一套治理框架
权限失控和成本飙升,表面是两件事,底层是同一个问题:Agent 太自由。它有了工具、记忆和自主决策权,却没有对应的约束边界。
堵住这两个洞,核心是三板斧:最小权限——每个 Agent 独立服务账号,接口白名单写死,调用前校验;成本护栏——单任务 token 和费用设硬上限,重试用指数退避,按任务难度分层用模型;统一治理——所有 Agent 的调用走统一入口,可审计、可限流、可追溯。
2026 年 7 月,国内首部数据接口安全国家标准 GB/T 46796-2025 正式实施,API 安全从"可选项"变成了"必答题"。Agent 越能干,越要管得住——这不是一句口号,而是所有做 AI 应用开发的团队绕不过去的功课。
权限和成本这两个洞,靠人盯是盯不住的,需要一套能自主闭环的治理机制。ClawBrain 正是为龙虾(OpenClaw)打造的智能决策引擎,具备任务闭环、自主规划、错误自愈能力——它能在 Agent 越权或超支时自动拦截、降级、止损,让龙虾真正能独立做事,而不是在失控边缘反复救火。