Skip to content

fix(ptu): stop per-token billing on a PTU-configured deployment - #36829

Merged
yucheng-berri merged 1 commit into
litellm_internal_stagingfrom
litellm_ptu_zero_per_token_cost
Aug 14, 2026
Merged

fix(ptu): stop per-token billing on a PTU-configured deployment#36829
yucheng-berri merged 1 commit into
litellm_internal_stagingfrom
litellm_ptu_zero_per_token_cost

Conversation

@yucheng-berri

@yucheng-berri yucheng-berri commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • A PTU deployment billed per token on top of its flat capacity cost
  • Unset per-token price fell back to the public cost map
  • So the double charge was the default, not an opt-in

How it solves it:

  • Storing a PTU deployment now writes zero for every pricing field
  • A price the caller sends alongside PTU config is refused with a 400
  • Removing the PTU config hands per-token billing back
  • A closed PTU window now alerts, since capacity is still billed

User Flow

Before: a proxy admin buys reserved Azure capacity for a team, configures it on the deployment, and the team is still charged for every request it sends through that capacity

  1. They open https://litellm-domain/ui/?page=models, add a deployment, and fill in PTU Count 15 and Cost per PTU / Hour 2.00 for their team
  2. They call GET https://litellm-domain/v1/model/info and see input_cost_per_token reading 3e-07 and output_cost_per_token reading 2.5e-06, values they never entered
  3. The team sends 10 requests through the deployment
  4. They call GET https://litellm-domain/team/daily/activity and see the flat capacity cost of $5040.00 and, next to it, $0.0003165 of request spend for the same traffic
  5. At 100k requests a day that second number is roughly $130/day charged on top of capacity the team already paid for

After: the same deployment charges the capacity cost only, and an attempt to price it per token fails immediately with an explanation

  1. They open https://litellm-domain/ui/?page=models, add the same deployment with PTU Count 15 and Cost per PTU / Hour 2.00
  2. GET https://litellm-domain/v1/model/info now reads 0.0 for every per-token and cache rate
  3. The team sends the same 10 requests
  4. GET https://litellm-domain/team/daily/activity shows the flat capacity cost of $5040.00 and $0.0000000 of request spend
  5. If they instead type an Input Cost while PTU Count is filled, the form refuses it inline, and a direct POST to https://litellm-domain/model/new comes back 400 saying a PTU deployment bills by reserved capacity
  6. When they later clear PTU Count and Cost per PTU / Hour, the deployment goes back to the public price and bills per token again

Relevant issues

Linear ticket

Resolves LIT-5508

Pre-Submission checklist

Please complete all items before asking a LiteLLM maintainer to review your PR

  • I have added meaningful tests
  • My PR passes all CI/CD checks (e.g., lint, format, unit tests)
  • My PR's scope is as isolated as possible; it only solves 1 specific problem
  • I have received a Greptile Confidence Score of at least 4/5 before requesting a maintainer review (Greptile reviews automatically once the PR is opened; only comment @greptileai to re-request a review after pushing changes)

Delays in PR merge?

If you're seeing a delay in your PR being merged, ping the LiteLLM Team on Slack (#pr-review).

Screenshots / Proof of Fix

Two proxies on one Postgres, same config, same deployment shape, real Gemini calls. Before at add095b494 (the merge base), after at c39b686e91.

Before, add095b494. The deployment carries no price of its own, so the public cost map supplies one:

$ curl -sS -H "Authorization: Bearer $KEY" http://127.0.0.1:4508/v1/model/info
  ptu_count             15
  cost_per_ptu_per_hour 2.0
  input_cost_per_token  3e-07
  output_cost_per_token 2.5e-06

$ for i in $(seq 1 10); do curl -sS -X POST http://127.0.0.1:4508/v1/chat/completions \
    -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
    -d '{"model":"azure-ptu-base","messages":[{"role":"user","content":"say hi"}],"max_tokens":16}'; done

$ curl -sS -H "Authorization: Bearer $MASTER" \
    "http://127.0.0.1:4508/team/daily/activity?start_date=2020-01-01&end_date=2030-01-01"
  ptu flat cost   $5040.00
  request spend   $0.0003165
  total tokens    153

After, c39b686e91. Same deployment shape, same ten requests, same token count:

$ curl -sS -H "Authorization: Bearer $KEY" http://127.0.0.1:4509/v1/model/info
  ptu_count                        15
  cost_per_ptu_per_hour            2.0
  input_cost_per_token             0.0
  output_cost_per_token            0.0
  cache_read_input_token_cost      0.0
  cache_creation_input_token_cost  0.0

$ curl -sS -H "Authorization: Bearer $MASTER" \
    "http://127.0.0.1:4509/team/daily/activity?start_date=2020-01-01&end_date=2030-01-01&team_ids=$TEAM"
  ptu flat cost   $5040.00
  request spend   $0.0000000
  total tokens    153

A price sent alongside PTU config is refused, and the message names the field:

$ curl -sS -X POST http://127.0.0.1:4509/model/new -H "Authorization: Bearer $MASTER" -d '{
    "model_name":"azure-ptu-priced",
    "litellm_params":{"model":"gemini/gemini-2.5-flash","api_key":"...","input_cost_per_token":0.0000005},
    "model_info":{"team_id":"...","ptu_count":15,"cost_per_ptu_per_hour":2.0,"ptu_effective_from":"..."}}'
HTTP 400
{"error":{"message":"A PTU deployment bills by reserved capacity, so input_cost_per_token cannot be
 charged on top of it. Send 0 or no value, or remove ptu_count and cost_per_ptu_per_hour to bill per token."}}

Removing the PTU config hands per-token billing back:

$ curl -sS -X PATCH http://127.0.0.1:4509/model/$MID/update -H "Authorization: Bearer $MASTER" \
    -d '{"model_info":{"id":"'$MID'","ptu_count":null,"cost_per_ptu_per_hour":null,"ptu_effective_from":null}}'
HTTP 200

  with PTU       ptu_count=15    in=0.0     out=0.0       cache_read=0.0
  PTU removed    ptu_count=None  in=3e-07   out=2.5e-06   cache_read=3e-08

A row mispriced through a path this PR does not cover heals on its next save rather than blocking unrelated edits:

$ curl -sS -X POST http://127.0.0.1:4509/model/update ... input_cost_per_token=0.0000005     HTTP 200
$ curl -sS -X PATCH http://127.0.0.1:4509/model/$MID/update -d '{"blocked": true}'           HTTP 200
  stored price after that PATCH: 0.0

The dashboard round-trips the whole model_info blob that /model/info hands it, and that blob carries cost-map
rates the operator never set. Only the price a caller authors on litellm_params is read as an attempt to charge,
so putting an existing deployment onto PTU from the form works and still stores zeros:

   /model/info hands the form a cost-map price the operator never set: in=3e-07 out=2.5e-06
   PATCH echoing that blob back with PTU overlaid  ->  HTTP 200
   stored: ptu_count=15  input_cost_per_token=0.0

Clearing PTU from the same form releases the zeros, so per-token billing comes back:

   PATCH clearing PTU  ->  HTTP 200
   stored price after the clear: model_info=ABSENT  litellm_params=ABSENT

Deployments without PTU config are untouched, create, reprice and clear, on both sides:

   BASE (no fix)  create=0.000004  repriced=0.000009  cleared=ABSENT
   HEAD (fixed)   create=0.000004  repriced=0.000009  cleared=ABSENT

A closed PTU window raises an operator alert rather than changing what is billed. Reserved capacity is billed by
the provider until the deployment is deleted, so per-token pricing there would invent a charge that does not exist:

   window 2026-07-14 -> 2026-07-24 (capacity ended 20 days ago)
   ALERT: PTU flat-cost attribution has stopped for 1 deployment(s) whose effective window has closed: ptu-lapsed.
          Reserved capacity is billed until the deployment is deleted, so a deployment still serving traffic is
          still being charged for by the provider with nothing attributing it here. Extend the window, or retire
          the deployment.

Budget enforcement still applies to a PTU deployment. A team over its budget, calling the deployment directly:

$ curl -sS -X POST http://127.0.0.1:4509/v1/chat/completions -H "Authorization: Bearer $TEAM_KEY" \
    -d '{"model":"model_name_<team>_<id>","messages":[{"role":"user","content":"hi"}],"max_tokens":8}'
HTTP 429  Budget has been exceeded! Team=... Current cost: 3.34e-05, Max budget: 2e-05

All of the above is the recording below, driven end to end at a9620f1a47

API matrix

The dashboard, same commit. A deployment on reserved capacity prices at $0.00/1M

PTU deployment prices at zero

Typing a cost while PTU Count is set fails inline instead of as a server error, and the other
rates show the 0 they are stored at rather than reading as unset

inline refusal on the edit form

Putting an existing deployment on capacity from Edit Settings now works, where the rates the form
seeded from the cost map used to block the save. It saves, and the deployment prices at $0.00/1M

enabling PTU from the dashboard

The same rule on the Add Model form

inline refusal on the add-model form

Type

🐛 Bug Fix

Caveats (if any)

  • Covers POST /model/new and PATCH /model/{id}/update only
  • Legacy /model/update, config.yaml and the SDK stay uncovered; LIT-5509
  • Those rows heal on their next PATCH through a covered endpoint
  • A PTU deployment now reports 0, not the cost-map price, everywhere
  • Anthropic cache-tier zeroing is unit-verified, not billed live
  • A closed window alerts; it does not resume per-token billing
  • Provider spillover to a standard deployment is billed per token

Final Attestation

  • The tests check the right things, including the edge cases, and regressions in the respective real-world customer use-cases are not possible after this PR

@greptile-apps

greptile-apps Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR prevents PTU deployments from accruing usage-based charges in addition to reserved-capacity costs and preserves budget enforcement for those deployments.

  • Stores zero values across token, cache, and other usage-pricing fields while PTU is configured.
  • Rejects operator-authored nonzero usage rates and adds corresponding dashboard validation.
  • Removes PTU-generated pricing overrides when capacity configuration is cleared.
  • Alerts operators when a PTU attribution window has expired.

Confidence Score: 4/5

The PR is not yet safe to merge because removing PTU can discard an explicitly supplied zero rate and restore unintended public-map billing.

The current release logic treats caller-authored zeros and PTU-generated zeros identically, removes both from persisted pricing blobs, and therefore leaves an operator-requested free rate vulnerable to public pricing fallback.

Files Needing Attention: litellm/proxy/management_endpoints/model_management_endpoints.py

Important Files Changed

Filename Overview
litellm/proxy/management_endpoints/model_management_endpoints.py Adds PTU pricing validation, zeroing, and release behavior, but the release path still cannot preserve an explicit zero supplied while PTU is removed.
litellm/proxy/auth/auth_checks.py Keeps PTU deployments subject to budget checks despite their intentionally zero per-token prices.
litellm/proxy/spend_tracking/ptu_flat_cost_rollup.py Reports closed PTU attribution windows through bounded, Slack-safe alerts.
ui/litellm-dashboard/src/components/add_model/advanced_settings.tsx Adds inline PTU incompatibility validation to visible usage-cost fields, including per-second pricing.
ui/litellm-dashboard/src/components/model_info_view.tsx Updates PTU edit-form pricing display and validation behavior.
ui/litellm-dashboard/src/utils/ptuValidation.ts Centralizes validation that prevents nonzero visible usage rates alongside PTU configuration.
tests/test_litellm/proxy/management_endpoints/test_ptu_model_settings.py Broadly covers PTU zero pricing, budget enforcement, creation, updates, and release, but does not cover an explicit zero supplied during PTU removal.

Reviews (9): Last reviewed commit: "fix(ptu): stop per-token billing on a PT..." | Re-trigger Greptile

greptile-apps[bot]

This comment was marked as resolved.

"""
if not is_ptu_cost_attribution_enabled():
return _NO_PRICING_OVERRIDE
if model_info.get("ptu_count") is None or model_info.get("cost_per_ptu_per_hour") is None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

High: PTU effective windows allow budget bypass

This condition ignores ptu_effective_from and ptu_effective_to, although the flat-cost rollup charges only during that window. A team administrator can configure an expired or future window and continue calling the deployment with zero token rates, so budget reservation and spend tracking record no cost. Preserve normal per-token pricing outside the active PTU window, or prevent the deployment from serving requests there.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

intended

@veria-ai

veria-ai Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

PR overview

This PR changes PTU-configured deployments to use flat PTU billing instead of per-token usage billing. The affected model-management logic determines when token pricing is suppressed for PTU deployments.

Two security issues remain open in the PTU billing logic, despite one issue having been addressed. Administrators can configure inactive PTU billing windows or a zero hourly PTU rate so requests accrue neither token-based nor flat-rate spend, allowing continued provider resource consumption without budget enforcement. The PTU activation conditions should be tightened before merging.

Open issues (2)

Fixed/addressed: 1 · PR risk: 7/10

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 1 additional finding in Devin Review.

Open in Devin Review

Comment on lines +383 to +386
if not is_ptu_cost_attribution_enabled():
return _NO_PRICING_OVERRIDE
if model_info.get("ptu_count") is None or model_info.get("cost_per_ptu_per_hour") is None:
return _NO_PRICING_OVERRIDE

@devin-ai-integration devin-ai-integration Bot Aug 13, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Reserved-capacity deployments serve traffic completely free when their reservation is not active

Per-token prices are set to zero for a reserved-capacity deployment (_ptu_zeroed_pricing at litellm/proxy/management_endpoints/model_management_endpoints.py:385-386) without regard to whether the reservation is actually charging, so during any period when the capacity charge does not apply the deployment's traffic costs nothing at all.

Impact: Requests through such a deployment are recorded as $0 spend, so that usage is never billed and never counts toward team or key budgets.

How the zeroed price outlives the flat capacity charge

The flat capacity charge is only accrued for the overlap of a UTC day with [ptu_effective_from, ptu_effective_to) (litellm/proxy/spend_tracking/ptu_flat_cost_rollup.py:1-12, window parsing at litellm/proxy/spend_tracking/ptu_flat_cost_rollup.py:146-159), and the whole rollup is skipped when the feature flag is off (litellm/proxy/spend_tracking/ptu_flat_cost_rollup.py:522).

The zeroed pricing, by contrast, is written into both model_info and litellm_params permanently and is only released when a patch explicitly nulls ptu_count/cost_per_ptu_per_hour (_ptu_pricing_delta at litellm/proxy/management_endpoints/model_management_endpoints.py:427-434). So:

  • a deployment configured with a future ptu_effective_from bills nothing (no flat cost yet, zero per-token) until the window opens;
  • once ptu_effective_to passes, the flat cost stops but the zeros remain, so all later traffic is free;
  • turning ENABLE_PTU_COST_ATTRIBUTION off stops the rollup while the stored zeros stay, so the documented "disabling pauses PTU" behaviour silently means free serving.

A fix likely needs either to release/repair the zero pricing when the window closes (or the flag is disabled), or to have cost calculation treat a reserved-capacity deployment's zero price as applying only inside the effective window.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@codecov

codecov Bot commented Aug 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@yucheng-berri
yucheng-berri force-pushed the litellm_ptu_zero_per_token_cost branch from c1a90f6 to a3d484d Compare August 13, 2026 21:25
@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai review latest head

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

devin-ai-integration[bot]

This comment was marked as resolved.

cursor[bot]

This comment was marked as resolved.

@codspeed-hq

codspeed-hq Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_ptu_zero_per_token_cost (a9620f1) with litellm_internal_staging (8841cbc)1

Open in CodSpeed

Footnotes

  1. No successful run was found on litellm_internal_staging (86f2f16) during the generation of this report, so 8841cbc was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@yucheng-berri
yucheng-berri force-pushed the litellm_ptu_zero_per_token_cost branch from a3d484d to c39b686 Compare August 13, 2026 23:04
"""
if not is_ptu_cost_attribution_enabled():
return _NO_PRICING_OVERRIDE
if model_info.get("ptu_count") is None or model_info.get("cost_per_ptu_per_hour") is None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium: Zero-rate PTU configuration bypasses budget enforcement

This treats cost_per_ptu_per_hour=0 as active PTU pricing and zeroes all usage prices. Because a zero-value flat charge does not add spend, subsequent requests can consume provider resources without affecting the budget. Require a strictly positive PTU rate before suppressing usage-based pricing, or preserve normal pricing when the flat rate is zero.

devin-ai-integration[bot]

This comment was marked as resolved.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai review latest head

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

greptile-apps[bot]

This comment was marked as resolved.

cursor[bot]

This comment was marked as resolved.

@yucheng-berri
yucheng-berri force-pushed the litellm_ptu_zero_per_token_cost branch from c39b686 to 2f2036d Compare August 13, 2026 23:49
veria-ai[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai review latest head

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 2f2036d. Configure here.

@yucheng-berri
yucheng-berri force-pushed the litellm_ptu_zero_per_token_cost branch 2 times, most recently from 796fadc to 44f793a Compare August 14, 2026 00:22
@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai review latest head

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 44f793a. Configure here.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai releasing the zeros is the ticket's acceptance criterion; keeping them bills nothing and waives budgets, proven live. Per-second only lacks a form field. Please re-review 44f793a

@yucheng-berri
yucheng-berri force-pushed the litellm_ptu_zero_per_token_cost branch from 44f793a to 3f1dc2f Compare August 14, 2026 02:33
A deployment with PTU flat-cost attribution also billed every request per
token, so a team paid for reserved capacity and again for the traffic that
capacity serves. Nothing set the per-token price and an unset price falls
back to the public cost map, which made the double charge the default.

/model/new and /model/{id}/update now store zero for every pricing field the
cost map could otherwise fill, refuse a price the caller supplies alongside
PTU config with a 400 naming the field, zero a price already on the row
rather than rejecting later edits of unrelated fields, and drop the zeros
again when the PTU config goes.

A PTU deployment is no longer read as a free model by the budget checks,
which would have waived every budget for it.
@yucheng-berri
yucheng-berri force-pushed the litellm_ptu_zero_per_token_cost branch from 3f1dc2f to a9620f1 Compare August 14, 2026 02:39

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 3f1dc2f. Configure here.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai releasing the zeros is the ticket's acceptance criterion; keeping them bills nothing and waives budgets, proven live. Per-second only lacks a form field. Please re-review a9620f1

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 4 additional findings in Devin Review.

Open in Devin Review

Comment on lines +455 to +459
return _NO_PRICING_OVERRIDE, frozenset(
field
for field in _CUSTOM_PRICING_FIELDS.union(_PTU_ZEROED_PRICING_FIELDS)
if _is_zero_price(model_info.get(field)) or _is_zero_price(litellm_params.get(field))
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 A new per-token price set in the same edit that turns off reserved-capacity billing is silently thrown away

A price the caller sends in the same edit that removes the reserved-capacity settings is deleted from the deployment (the release set built at litellm/proxy/management_endpoints/model_management_endpoints.py:455-459) instead of being kept, so the deployment silently falls back to the public price list rather than the price the operator just chose.
Impact: An operator who moves a deployment off reserved capacity and sets a new per-token rate in one save ends up with the rate they entered missing and the model billed at the vendor's list price.

Why the release also drops a freshly supplied rate

On such a patch _ptu_zeroed_pricing returns empty (the merged model_info no longer carries ptu_count/cost_per_ptu_per_hour), so _ptu_pricing_delta takes the release branch. The release predicate is _is_zero_price(model_info.get(field)) or _is_zero_price(litellm_params.get(field)). update_db_model merges the patch's litellm_params into merged_litellm_params only (litellm/proxy/management_endpoints/model_management_endpoints.py:509-515); it never copies those values into merged_model_info, so merged_model_info["input_cost_per_token"] is still the 0.0 this feature wrote earlier. The or therefore fires, and the loop at litellm/proxy/management_endpoints/model_management_endpoints.py:554-556 pops the field from both blobs, removing the non-zero rate the caller supplied in this very request. Repro: PATCH with model_info={ptu_count: null, cost_per_ptu_per_hour: null} plus litellm_params={input_cost_per_token: 2.5e-06} on a PTU row; the stored row comes back with no input_cost_per_token at all.

Prompt for agents
In _ptu_pricing_delta (litellm/proxy/management_endpoints/model_management_endpoints.py), the release set returned when a patch clears the PTU pair includes any pricing field that reads as zero in either the merged model_info or the merged litellm_params. Because update_db_model merges the patch's litellm_params into merged_litellm_params only (model_info keeps the previously stored zero), a patch that clears PTU config and supplies a brand-new non-zero rate in the same request has that rate popped out of both blobs, so the deployment silently reverts to the public cost map. The release should exclude any field the patch itself supplies with a non-zero value (i.e. compute `supplied` and skip fields where `_is_nonzero_price(supplied.get(field))`), and ideally consider only fields whose merged litellm_params value is zero rather than OR-ing with the stale model_info copy. Add a regression test in tests/test_litellm/proxy/management_endpoints/test_ptu_model_settings.py covering "clear PTU and set a new per-token price in one PATCH".
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@yucheng-berri

Copy link
Copy Markdown
Contributor Author

@greptileai a per-second rate is operator-authored, so the refusal is correct, and it stays editable in the LiteLLM Params box. Please re-review a9620f1

@yucheng-berri
yucheng-berri enabled auto-merge (squash) August 14, 2026 03:10
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.

2 participants