Repository navigation
bug: guard OpenRouter pricing JSON parsing against malformed responses - #46
Open
devin-ai-integration[bot] wants to merge 1 commit into
Open
devin-ai-integration[bot] wants to merge 1 commit into
devin-ai-integration[bot] wants to merge 1 commit into
Conversation
Author
|
I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".
|
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.
Summary
Code scan finding (low):
get_pricing_openrouter()indexed the external OpenRouter catalog JSON directly (model_metadata["data"],model["id"],model["pricing"],float(v)), so any shape change or non-numeric pricing value raisedKeyError/ValueError/TypeErrorout ofset_pricing_attributes()and aborted model init — and since the function is@cached, permanently for the process. The sibling pricing functions degrade to{}/0.0instead.Now the traversal skips malformed records instead of raising:
_to_floatreturnsNonefor non-numeric/Nonevalues.set_pricing_attributes()likewise uses_to_float(model_costs.get("prompt"/"completion"))and falls through to the existing litellm lookup when either is missing or non-numeric, instead ofKeyErroring onmodel_costs["prompt"]. Well-formed responses produce the same dict as before. The non-200raise ValueErroris unchanged (a config/auth error, not a parsing one).Added
test_get_pricing_openrouter_malformed_payloadcovering numeric strings, null pricing values, records missingid/pricing, non-dict records, and a non-dict top-level payload.Verified:
pytest tests/llm/test_tracking.py -m 'not pricy'passes (10 passed, 1 skipped — the live OpenRouter test skips without an API key).blackon the two touched files is clean; 7 other files insrc/were already unformatted onmain.Devin-Org: engineering
Link to Devin session: https://app.devin.ai/sessions/736009401ebb43858f8f468588c5cd0b
Open in Devin Desktop: https://app.devin.ai/desktop/session/736009401ebb43858f8f468588c5cd0b?variant=devin
Devin Review