Expand description
Whether a value fits a JSON schema, and where it does not: the check a
tool call’s arguments pass before the tool runs
(arguments_refusal).
use rig_core::tool::validate::{Problem, validate};
use serde_json::json;
let schema = json!({
"type": "object",
"properties": {"path": {"type": "string"}, "limit": {"type": "integer"}},
"required": ["path"],
});
assert_eq!(validate(&schema, &json!({"path": "a.rs", "limit": 3})), Ok(()));
let problems = validate(&schema, &json!({"limit": "3"})).unwrap_err();
assert_eq!(
problems.iter().map(Problem::to_string).collect::<Vec<_>>(),
["/limit: expected an integer, got a string", "/path: missing"],
);It checks a subset of JSON Schema, in plain serde_json:
type(a name or a list;integeris a number with no fraction),enumandconst;properties,requiredandadditionalProperties(falseor a schema);items(a schema, or a list by position as in draft-07),prefixItems,minItemsandmaxItems;minLengthandmaxLength, in characters;minimum,maximum,exclusiveMinimumandexclusiveMaximum;allOf,anyOfandoneOf(exactly one);$refto any local JSON pointer (#,#/$defs/…, draft-07’s#/definitions/…), resolved against the root schema. A remote or unresolvable$ref, or one that loops back without reaching a value, accepts the value there.
A null for a declared property the object does not require counts as
absent, as serde reads an Option field:
args_schema declares an Option optional,
not nullable, and a model may still send null for it.
Every other keyword is ignored, so it accepts: pattern, format,
patternProperties (and so additionalProperties beside it, since
which keys a pattern allows is not checked), and any keyword not listed.
Structs§
- Problem
- Where a value does not fit a schema, and how.
Functions§
- validate
- Checks
valueagainstschema:Okwhen it fits; otherwise every problem, in document order. The module docs list what is checked.