mirror of
https://github.com/openswarm-ai/openswarm.git
synced 2026-09-12 20:57:42 +02:00
[shawn] fix: anti-loop guidance for Instagram and LinkedIn rate-limit hits
This commit is contained in:
@@ -486,6 +486,23 @@ class AgentManager:
|
||||
f"\"{tool.connected_account_email}\" automatically — do NOT ask the user."
|
||||
)
|
||||
|
||||
# Instagram and LinkedIn enforce strict per-account rate limits to
|
||||
# prevent platform bans. When a tool call comes back with
|
||||
# rate_limited: true OR a deny reason mentioning "RATE LIMIT HIT",
|
||||
# the agent MUST stop the task, tell the user the retry-after, and
|
||||
# NOT retry. Without this guidance, agents tend to loop trying
|
||||
# alternative tools or even shell out to filesystem search.
|
||||
if tool.name.lower() in ("instagram", "linkedin"):
|
||||
lines.append(
|
||||
f" RATE LIMIT BEHAVIOR (HARD RULE): If a {tool.name} tool returns "
|
||||
"rate_limited: true, or any tool call here returns a 'deny' with "
|
||||
"'RATE LIMIT HIT' in the message, this is FINAL for the current turn. "
|
||||
"Do NOT retry the same tool. Do NOT try alternative tools to accomplish "
|
||||
"the same goal. Do NOT shell out to Bash/curl/find to look up the package "
|
||||
"source. Tell the user the retry-after time in plain English and END the "
|
||||
"task. Looping makes the platform ban risk worse, not better."
|
||||
)
|
||||
|
||||
# Discord guild scoping — hard restriction. The bot may technically
|
||||
# be in other servers (across other OpenSwarm users), but this
|
||||
# specific user only authorized these guild IDs.
|
||||
|
||||
@@ -155,8 +155,11 @@ def rate_limited(category: str) -> Callable[[Callable[..., Dict[str, Any]]], Cal
|
||||
"rate_limited": True,
|
||||
"category": category,
|
||||
"message": (
|
||||
"Rate limit hit to protect this Instagram account from being "
|
||||
f"flagged for automation: {reason}"
|
||||
f"RATE LIMIT HIT — STOP HERE. {reason} DO NOT retry this tool. "
|
||||
"DO NOT try alternative tools to accomplish the same goal. DO NOT "
|
||||
"search the filesystem or look up the package source. Tell the user "
|
||||
"the retry-after time in plain English and END the task. This "
|
||||
"protects the Instagram account from being flagged for automation."
|
||||
),
|
||||
"retry_after_seconds": retry_after,
|
||||
"limits": {k: limits[k] for k in ("per_minute", "per_hour", "per_day")},
|
||||
|
||||
@@ -138,12 +138,14 @@ def check(mcp_server: str, tool: str) -> dict[str, Any] | None:
|
||||
retry_after = int((oldest + window_s) - now) + 1
|
||||
label = window_name.replace("per_", "")
|
||||
reason = (
|
||||
f"OpenSwarm rate limit ({mcp_server}/{category}): {cap}/{label} cap reached "
|
||||
f"(currently {len(in_window)}). Retry in {_fmt_duration(retry_after)}. "
|
||||
f"This protects the connected account from anti-abuse bans. Override with "
|
||||
f"{mcp_server.upper()}_RATE_LIMIT_{category.upper()}_{window_name.upper()}=N."
|
||||
f"RATE LIMIT HIT — STOP HERE. {mcp_server}/{category} cap of {cap}/{label} reached "
|
||||
f"(currently {len(in_window)}). The cap resets in {_fmt_duration(retry_after)}. "
|
||||
f"DO NOT retry this tool. DO NOT try alternative tools to accomplish the same goal. "
|
||||
f"DO NOT search the filesystem or look up the package source. Instead, tell the user: "
|
||||
f"'I hit the {mcp_server} {category} rate limit. Try again in {_fmt_duration(retry_after)}.' "
|
||||
f"Then END the task. This protects the connected account from anti-abuse bans."
|
||||
)
|
||||
logger.warning(f"[mcp-rate-limit] BLOCK {mcp_server}/{tool}: {reason}")
|
||||
logger.warning(f"[mcp-rate-limit] BLOCK {mcp_server}/{tool}: {cap}/{label} cap")
|
||||
return {"deny": reason, "retry_after_seconds": retry_after}
|
||||
|
||||
state[state_key] = stamps + [now]
|
||||
|
||||
Reference in New Issue
Block a user