fix: reject a response missing usage or a usage missing a token count - #14
Merged
Merged
Conversation
…evels read back Score levels are sent as any JSON value and the API echoes them back as sent, but the legend was typed Map<String, String>. A Score with an object or array level, including the one in Score's own javadoc example, failed the whole response and every other answer with it (#11).
Both counts were primitive longs with no presence check, so a missing or null count read as 0, and a missing usage block read as null and surfaced as an NPE at the first caller. Same fail-loud treatment the answer records got in 0.2.0, naming the missing field (#12).
garretpremo
added a commit
that referenced
this pull request
Sep 22, 2026
Choice<E> and ChoiceAnswer<E> carry the label type: build a question from an enum's constants and read the answer back as that enum, with probabilities keyed by it. String labels are unchanged. ChoiceAnswer's type parameter changes the erased return type of choice(), so consumers of 0.4.0 and earlier must recompile (#10, #15). ScoreAnswer.legend is Map<String, Object>, so a Score with an object or array level no longer fails the whole response (#11, #13). A response missing usage, or a usage missing a token count, fails with a TypeSafeException naming the field instead of reading as null or 0 (#12, #14). READMEs point at 0.5.0.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation:
TypeSafeUsagedeclared both counts as primitivelongwith no presence check, andTypeSafeResponsedid not check thatusagewas present. A missing or null count read as0, and a missing block read asnulland surfaced as an NPE at the first caller. This is the same silent-default class 0.2.0 removed from the answer records (#1). The API schema and the JS SDK mark all three as required.Changes:
TypeSafeUsagegains a Jackson creator that rejects a missing or nullinput_tokens/output_tokensby nameTypeSafeResponsecompact constructor rejects a nullusageBoth surface as the existing
TypeSafeException("Could not read response at ...")fromsystemOne.Stacked on #13; merge that first.
Fixes #12