fix: scope rate-limit detection on stdout to JSON error events only
raw line.contains() on stdout false-positives when the agent's own
text mentions rate_limit_error or similar strings. stderr keeps the
raw match (it is always claude CLI output, not conversation content);
stdout now only fires on parsed {"type":"error"} events.
Closes #69
This commit is contained in:
parent
e6469403ee
commit
5c27ab9d13
1 changed files with 21 additions and 6 deletions
|
|
@ -518,11 +518,19 @@ async fn run_claude(prompt: &str, files: &TurnFiles, bus: &Bus) -> Result<(bool,
|
||||||
if line.contains(PROMPT_TOO_LONG_MARKER) {
|
if line.contains(PROMPT_TOO_LONG_MARKER) {
|
||||||
flag_out.store(true, Ordering::Relaxed);
|
flag_out.store(true, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
if RATE_LIMIT_MARKERS.iter().any(|m| line.contains(m)) {
|
|
||||||
rate_out.store(true, Ordering::Relaxed);
|
|
||||||
}
|
|
||||||
match serde_json::from_str::<serde_json::Value>(&line) {
|
match serde_json::from_str::<serde_json::Value>(&line) {
|
||||||
Ok(v) => {
|
Ok(v) => {
|
||||||
|
// Rate-limit detection: only fire on JSON `error` events,
|
||||||
|
// not on arbitrary text content. An agent discussing a past
|
||||||
|
// rate limit in its response would otherwise trigger a false
|
||||||
|
// positive (the full conversation flows through stdout as
|
||||||
|
// stream-json, so any text the model outputs is visible here).
|
||||||
|
if v.get("type").and_then(|t| t.as_str()) == Some("error") {
|
||||||
|
let raw = v.to_string();
|
||||||
|
if RATE_LIMIT_MARKERS.iter().any(|m| raw.contains(m)) {
|
||||||
|
rate_out.store(true, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(u) = crate::events::TokenUsage::from_assistant_event(&v) {
|
if let Some(u) = crate::events::TokenUsage::from_assistant_event(&v) {
|
||||||
last_inference = Some(u);
|
last_inference = Some(u);
|
||||||
}
|
}
|
||||||
|
|
@ -536,9 +544,16 @@ async fn run_claude(prompt: &str, files: &TurnFiles, bus: &Bus) -> Result<(bool,
|
||||||
bus_out.observe_stream(&v);
|
bus_out.observe_stream(&v);
|
||||||
bus_out.emit(LiveEvent::Stream(v));
|
bus_out.emit(LiveEvent::Stream(v));
|
||||||
}
|
}
|
||||||
Err(_) => bus_out.emit(LiveEvent::Note {
|
Err(_) => {
|
||||||
|
// Non-JSON stdout: raw text check is fine here since these
|
||||||
|
// are claude CLI messages, not conversation content.
|
||||||
|
if RATE_LIMIT_MARKERS.iter().any(|m| line.contains(m)) {
|
||||||
|
rate_out.store(true, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
bus_out.emit(LiveEvent::Note {
|
||||||
text: format!("(non-json) {line}"),
|
text: format!("(non-json) {line}"),
|
||||||
}),
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue