Recipe catalog / comparable-fit
Check whether a comparable property fits the subject
Is comparable similar enough to subject in type, size, age, condition, and location wording to support a valuation comparison?
You need to screen candidate comparable sales or rentals against a subject property from their descriptions, so that only plausible comparables reach a valuation model or an appraiser's review.
Explore this recipe interactively ยท Source and implementation guide
Use comparable-fit in TypeScript
Install with npm install jev-recipes. Requires Node.js 22.9 or newer and ES modules. Set TYPESAFE_API_KEY in your server environment for live calls, which send input to TypeSafe and use API quota. See the installation guide.
import { comparableFit } from 'jev-recipes/comparable-fit';
const result = await comparableFit({
"subject": "Single-family ranch, 3 bedrooms, 2 baths, 1,650 sq ft, built 1978, updated kitchen and roof (2019), attached 2-car garage, 0.3-acre lot on a quiet suburban cul-de-sac in Maple Grove.",
"comparable": "Condominium, 2 bedrooms, 2 baths, 1,100 sq ft, built 2015, 14th floor of a downtown high-rise with concierge, one deeded parking space, HOA dues $610/month.",
"minConfidence": 0.8
});
console.log(result);
Input contract
| Field | Type | Needed |
|---|---|---|
| subject | string | Required |
| comparable | string | Required |
| minConfidence | number | Optional |
Full input and result schemas
{
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"subject": {
"type": "string"
},
"comparable": {
"type": "string"
},
"minConfidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"subject",
"comparable"
]
},
"result": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"model": {
"type": "string"
},
"usage": {
"type": "object",
"properties": {
"input_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"output_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"input_tokens",
"output_tokens"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"review"
]
},
"probability": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"verdict": {
"type": "string",
"enum": [
"comparable",
"dissimilar"
]
}
},
"required": [
"model",
"usage",
"status",
"probability",
"confidence",
"verdict"
],
"additionalProperties": false
}
}Saved example result
This hand-authored response demonstrates the contract. It is not a model accuracy measurement. Run it without an API key: npx jev-recipes demo comparable-fit.
{
"model": "demo-fixture",
"usage": {
"input_tokens": 0,
"output_tokens": 0
},
"status": "ready",
"probability": 0.04,
"confidence": 0.96,
"verdict": "dissimilar"
}
Evaluation evidence
No verified live accuracy measurement is available. Evaluate representative cases before using this decision in your workflow.
Use the evaluation guide to measure this decision on your own labeled cases.
Limitations
- Judges described attributes only, not market data. Sale prices, dates, distances, and adjustments belong in valuation code.
- Does not know your tolerance bands for size, age, or distance; it applies a general standard of similarity, so encode specific thresholds in code.
- A comparable can fit on described attributes and still be a poor choice because of a stale sale date or unusual sale conditions the description omits.
Related recipes
- entity-match: Use entity-match to decide whether two records describe the same property, rather than whether two different properties are similar enough to compare.
- passage-compare: Use passage-compare to pick which of two passages better answers a question, rather than to judge similarity between two property descriptions.