Chris Danis
28f4d6db63
fix(tool-schemas): reactive strip of pattern/format on llama.cpp grammar 400s
...
MCP servers commonly emit JSON Schema `pattern` (e.g. `\\d{4}-\\d{2}-\\d{2}`
for date-time params) and `format` keywords. llama.cpp's
`json-schema-to-grammar` converter rejects regex escape classes
(\\d/\\w/\\s) and most format values, returning HTTP 400
"parse: error parsing grammar: unknown escape at \\d" — the whole request
fails.
Cloud providers (OpenAI, Anthropic, OpenRouter, Gemini) accept these
keywords fine and use them as prompting hints. Stripping unconditionally
loses useful hints for every cloud user to fix a llama.cpp-only bug.
Approach: classify the llama.cpp grammar-parse 400 in the error
classifier, and on match do a one-shot in-place strip of pattern/format
from `self.tools`, then retry. Follows the existing
`thinking_signature` recovery pattern. Cloud users hit zero overhead;
llama.cpp users pay one failed request per session.
Changes
- agent/error_classifier.py: new `FailoverReason.llama_cpp_grammar_pattern`
+ narrow HTTP-400 branch matching "error parsing grammar",
"json-schema-to-grammar", or "unable to generate parser ... template".
- tools/schema_sanitizer.py: new `strip_pattern_and_format()` helper —
reactive, walks schema nodes, skips property names (search_files.pattern
survives). Returns strip count for logging.
- run_agent.py: new one-shot recovery block in the retry loop. Strips,
logs, continues. Falls through to normal retry if nothing to strip.
- tests: 4 classifier tests (3 variants + 1 non-400 negative), 7 strip
tests including the property-name preservation and idempotency checks.
Co-authored-by: Chris Danis <cdanis@gmail.com >
2026-05-05 04:25:18 -07:00
..
2026-04-29 20:05:32 -07:00
2026-03-23 07:43:12 -07:00
2026-04-29 23:18:55 -07:00
2026-04-27 20:08:33 -07:00
2026-04-27 06:42:32 -07:00
2026-05-04 04:45:03 -07:00
2026-04-16 04:07:11 -07:00
2026-04-20 23:20:33 -07:00
2026-04-24 03:46:46 -07:00
2026-04-17 16:05:04 -07:00
2026-04-24 03:46:46 -07:00
2026-04-28 07:03:44 -07:00
2026-04-08 13:44:58 -07:00
2026-04-16 04:19:34 -07:00
2026-04-20 00:32:09 -07:00
2026-03-28 17:25:04 -07:00
2026-04-10 13:05:44 -07:00
2026-05-04 03:12:30 -07:00
2026-04-26 09:57:58 -07:00
2026-04-29 23:18:55 -07:00
2026-04-01 12:03:56 -07:00
2026-04-26 18:27:13 -07:00
2026-04-30 20:33:33 -07:00
2026-04-23 22:23:37 -07:00
2026-04-11 02:58:48 -07:00
2026-04-26 19:05:52 -07:00
2026-04-29 23:18:55 -07:00
2026-04-18 01:46:25 -07:00
2026-04-30 03:31:16 -07:00
2026-04-29 07:22:33 -07:00
2026-03-27 04:03:00 -07:00
2026-04-10 03:44:43 -07:00
2026-04-26 08:32:09 -07:00
2026-04-25 22:07:12 -07:00
2026-04-29 06:35:34 -07:00
2026-04-08 17:23:15 -07:00
2026-03-02 04:34:21 -08:00
2026-04-24 04:58:32 -07:00
2026-03-26 14:50:26 -07:00
2026-05-04 05:22:35 -07:00
2026-04-30 20:37:12 -07:00
2026-04-29 16:16:43 +10:00
2026-04-14 21:20:37 -07:00
2026-04-29 21:56:51 -07:00
2026-04-21 06:14:25 -07:00
2026-04-17 19:04:11 -07:00
2026-05-04 12:37:47 -07:00
2026-05-04 12:37:09 -07:00
2026-04-17 19:26:40 -07:00
2026-04-27 00:17:26 -07:00
2026-04-23 15:11:52 -07:00
2026-04-21 16:41:26 -07:00
2026-04-30 06:36:50 -07:00
2026-04-10 03:01:46 -07:00
2026-04-10 21:14:32 -07:00
2026-04-20 00:58:16 -07:00
2026-04-08 17:23:15 -07:00
2026-05-03 08:52:41 -07:00
2026-04-13 05:15:05 -07:00
2026-03-14 11:27:02 -07:00
2026-04-21 02:03:46 -07:00
2026-04-29 07:22:33 -07:00
2026-05-04 05:08:51 -07:00
2026-03-04 18:34:16 +03:00
2026-04-13 04:45:07 -07:00
2026-04-21 02:04:21 -07:00
2026-04-23 03:01:18 -07:00
2026-04-21 13:35:31 -07:00
2026-04-28 22:16:08 -07:00
2026-04-14 02:18:38 -07:00
2026-05-04 05:04:01 -07:00
2026-03-27 15:28:19 -07:00
2026-04-19 11:27:50 -07:00
2026-04-29 07:22:33 -07:00
2026-05-04 15:31:47 -07:00
2026-04-29 23:18:55 -07:00
2026-04-23 05:15:37 -07:00
2026-04-09 16:24:53 -07:00
2026-04-16 12:36:49 -07:00
2026-04-16 12:36:49 -07:00
2026-04-15 13:29:05 -07:00
2026-04-09 13:17:06 -07:00
2026-04-16 12:36:49 -07:00
2026-04-21 05:19:03 -07:00
2026-04-29 20:05:32 -07:00
2026-04-19 16:31:07 -07:00
2026-04-19 16:31:07 -07:00
2026-04-16 21:57:10 -07:00
2026-04-16 21:57:10 -07:00
2026-05-04 04:42:18 -07:00
2026-04-04 10:18:57 -07:00
2026-04-16 21:57:10 -07:00
2026-04-26 18:21:20 -07:00
2026-04-29 20:05:32 -07:00
2026-04-16 21:57:10 -07:00
2026-04-04 10:18:57 -07:00
2026-05-03 15:23:33 -07:00
2026-04-28 04:58:03 -07:00
2026-04-14 10:18:05 -07:00
2026-04-13 16:32:04 -07:00
2026-04-23 15:14:11 -07:00
2026-04-12 06:18:05 +05:30
2026-04-29 07:22:33 -07:00
2026-04-10 03:01:46 -07:00
2026-04-12 00:36:22 -07:00
2026-04-05 12:46:07 -07:00
2026-04-22 14:45:50 -07:00
2026-04-10 16:47:44 -07:00
2026-04-29 04:59:21 -07:00
2026-04-13 16:32:04 -07:00
2026-04-30 19:43:03 -07:00
2026-04-23 15:11:52 -07:00
2026-03-10 17:09:51 -07:00
2026-05-05 04:25:18 -07:00
2026-03-17 02:02:57 -07:00
2026-04-15 17:37:43 -07:00
2026-04-30 04:28:08 -07:00
2026-05-04 05:07:40 -07:00
2026-04-26 11:55:02 -07:00
2026-04-20 13:24:15 -07:00
2026-03-16 19:01:39 +03:00
2026-04-10 03:44:43 -07:00
2026-04-01 04:19:19 -07:00
2026-05-04 02:42:16 -07:00
2026-05-04 02:42:16 -07:00
2026-04-01 04:19:19 -07:00
2026-05-04 02:19:28 -07:00
2026-03-04 05:30:43 -08:00
2026-03-02 02:00:09 -08:00
2026-04-23 06:20:47 -07:00
2026-03-14 23:15:04 -07:00
2026-05-04 01:28:12 -07:00
2026-04-23 05:09:08 -07:00
2026-04-29 07:22:33 -07:00
2026-04-29 21:56:47 -07:00
2026-04-24 07:06:11 -07:00
2026-04-30 04:32:28 -07:00
2026-04-20 03:07:32 -07:00
2026-03-04 17:23:23 +03:00
2026-04-16 19:39:21 -07:00
2026-04-19 16:53:11 -07:00
2026-04-29 16:16:43 +10:00
2026-04-04 16:57:24 -07:00
2026-04-19 16:47:20 -07:00
2026-04-08 21:37:51 -07:00
2026-04-20 23:20:33 -07:00
2026-04-29 07:22:33 -07:00
2026-03-29 21:51:44 -07:00
2026-04-09 16:24:53 -07:00
2026-04-29 07:22:33 -07:00
2026-04-30 20:38:09 -07:00
2026-04-08 17:23:15 -07:00
2026-04-29 23:18:55 -07:00
2026-04-11 16:22:50 -07:00
2026-04-26 19:02:55 -07:00
2026-04-07 17:19:07 -07:00
2026-04-23 21:51:19 -07:00
2026-05-04 03:14:59 -07:00
2026-04-29 23:18:55 -07:00
2026-05-04 04:41:36 -07:00
2026-04-29 23:18:55 -07:00
2026-04-30 02:53:20 -07:00
2026-04-29 23:18:55 -07:00
2026-04-16 14:23:16 -07:00
2026-04-21 01:28:32 -07:00
2026-04-21 17:49:39 -07:00
2026-04-30 02:53:20 -07:00
2026-04-30 02:53:20 -07:00
2026-05-04 12:36:09 -07:00
2026-04-26 18:27:13 -07:00
2026-04-29 07:22:33 -07:00
2026-05-04 00:04:36 +05:30
2026-04-20 00:32:09 -07:00
2026-05-04 01:36:07 -07:00
2026-04-09 16:24:53 -07:00
2026-04-25 06:41:58 -07:00
2026-04-28 02:09:30 -07:00
2026-04-09 13:17:06 -07:00
2026-03-30 08:10:14 -07:00
2026-04-24 03:46:46 -07:00
2026-04-30 20:37:37 -07:00
2026-04-24 03:46:46 -07:00