Skip to content

fix: reject a response missing usage or a usage missing a token count - #14

Merged
garretpremo merged 2 commits into
mainfrom
fix/usage-required
Sep 22, 2026
Merged

garretpremo merged 2 commits into
mainfrom
fix/usage-required

Conversation

@garretpremo

Copy link
Copy Markdown
Contributor

Motivation:
TypeSafeUsage declared both counts as primitive long with no presence check, and TypeSafeResponse did not check that usage was present. A missing or null count read as 0, and a missing block read as null and 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:

  • TypeSafeUsage gains a Jackson creator that rejects a missing or null input_tokens / output_tokens by name
  • TypeSafeResponse compact constructor rejects a null usage
  • Two tests: a response with no usage block, and a usage block with a missing and with a null count
  • CHANGELOG entry

Both surface as the existing TypeSafeException("Could not read response at ...") from systemOne.

Stacked on #13; merge that first.

Fixes #12

…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
garretpremo merged commit db7ed27 into main Sep 22, 2026
1 check passed
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Usage token counts read as 0 when missing, and a missing usage block is a null pointer for callers

1 participant