0.2.2 (2026-09-26)
Jev.HTTPretries gateway errors (502, 503, 504) like 429 and 529. A crawler judging thousands of pages met a transient 503 from the API's edge and failed the page for it.
0.2.1 (2026-09-22)
examples/local.exsis a live smoke test against any/v1/systemoneserver, andtest/fixtures/conformancekeeps the bodies real servers return, decoded byJev.ConformanceTest. The first is jeff serving GLiFormer.Jev.Backendand the README name jev_nx, which runs open decision models in-process on Nx.
0.2.0 (2026-09-21)
The /v1/systemone wire format is now served by open decision models as well
as TypeSafe. This release lets one application talk to several of them.
- Named endpoints:
config :jev, endpoints: [laya: [base_url: ...]]andendpoint: :layaper call, fromJev.HTTP.post/3or aJev.Serverreply.config :jev, endpoint:changes the default from:typesafe.Jev.HTTP.endpoint/1returns the resolved settings. - A named endpoint sends no
Authorizationheader unless it has anapi_key, and itsusd_per_million_inputdefaults to zero. Transport settings are inherited from the top-level configuration. Jev.reply/3andJev.cost/2take the price. When a server omitsconfidence, it is computed from the probabilities as TypeSafe defines it.- Telemetry metadata and
Jev.Errorcarry theendpointname. Jev.Wire: the response body asJSONCodecstructs. A 200 whose body does not fit the wire format comes back as{:error, %JSONCodec.Error{}}instead of a crash, integers are accepted where the API documents numbers, unknown fields are ignored, andJev.Wire.Response.schema/0is the JSON Schema of what the client accepts. Adds thejson_codecdependency.Jev.Test:respond/2answers aReq.Teststub from a reply-shaped map, reading the questions from the request;error/3sends a failure;body/2is the pure half;request/1reads the request.:plugbecomes an optional dependency for these.Jev.Backend: a behaviour with one callback,post/3.Jev.HTTPimplements it and stays the default;backend:per request orconfig :jev, backend:picks another, for an in-process model or a fake.Jev.Telemetry.span/4is the shared telemetry every backend wraps its work in, so events carrybackendand are identical whatever answered.Jev.confidence/2is public: TypeSafe's confidence for a distribution.[:jev, :answer]fires only for questions the server answered. A partial reply used to crash the request.
0.1.1 (2026-09-18)
Jev.Serveraccepts{:ok, state, timeout | {:continue, term}}frominit/1. Previously the extra element was passed through unwrapped and the first callback crashed.terminate/2andcode_change/3are delegated to the callback module when defined.use Jev.Servertakes child spec options such asrestart:andshutdown:, asuse GenServerdoes.- Default
handle_call/3andhandle_cast/2stop the server with GenServer's "no clause was provided" error instead of anUndefinedFunctionError, and the defaulthandle_info/2logs the unexpected message instead of dropping it silently.
0.1.0 (2026-09-17)
Jev.Noul,Jev.Choice,Jev.Scorequestion structs with shorthands viaJev.questions/1.Jev.reply/2turns an API response into a plain map with atom labels.Jev.HTTP.post/3transport on Req with retry on 429 and 529.Jev.Server: a GenServer where{:reply, {tag, state, questions}, s}sends to Jev andhandle_answer/3receives the reply.- Telemetry spans per request and one event per answer, with cost from the published price.