Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
new-api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
6f11d198
authored
May 21, 2026
by
yyhhyyyyyy
Committed by
GitHub
May 21, 2026
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: normalize model pricing display drift (#4985)
parent
58ba867d
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
69 additions
and
16 deletions
+69
-16
web/default/src/features/system-settings/models/model-pricing-sheet.tsx
+6
-11
web/default/src/features/system-settings/models/model-ratio-visual-editor.tsx
+2
-5
web/default/src/features/system-settings/models/pricing-format.ts
+61
-0
No files found.
web/default/src/features/system-settings/models/model-pricing-sheet.tsx
View file @
6f11d198
...
@@ -65,6 +65,7 @@ import {
...
@@ -65,6 +65,7 @@ import {
import
{
Switch
}
from
'@/components/ui/switch'
import
{
Switch
}
from
'@/components/ui/switch'
import
{
Tabs
,
TabsContent
,
TabsList
,
TabsTrigger
}
from
'@/components/ui/tabs'
import
{
Tabs
,
TabsContent
,
TabsList
,
TabsTrigger
}
from
'@/components/ui/tabs'
import
{
combineBillingExpr
}
from
'@/features/pricing/lib/billing-expr'
import
{
combineBillingExpr
}
from
'@/features/pricing/lib/billing-expr'
import
{
formatPricingNumber
}
from
'./pricing-format'
import
{
TieredPricingEditor
}
from
'./tiered-pricing-editor'
import
{
TieredPricingEditor
}
from
'./tiered-pricing-editor'
const
createModelPricingSchema
=
(
t
:
(
key
:
string
)
=>
string
)
=>
const
createModelPricingSchema
=
(
t
:
(
key
:
string
)
=>
string
)
=>
...
@@ -216,16 +217,10 @@ function toNumberOrNull(value: unknown): number | null {
...
@@ -216,16 +217,10 @@ function toNumberOrNull(value: unknown): number | null {
return
Number
.
isFinite
(
num
)
?
num
:
null
return
Number
.
isFinite
(
num
)
?
num
:
null
}
}
function
formatNumber
(
value
:
unknown
):
string
{
const
num
=
toNumberOrNull
(
value
)
if
(
num
===
null
)
return
''
return
Number
.
parseFloat
(
num
.
toFixed
(
12
)).
toString
()
}
function
ratioToBasePrice
(
ratio
:
unknown
):
string
{
function
ratioToBasePrice
(
ratio
:
unknown
):
string
{
const
num
=
toNumberOrNull
(
ratio
)
const
num
=
toNumberOrNull
(
ratio
)
if
(
num
===
null
)
return
''
if
(
num
===
null
)
return
''
return
formatNumber
(
num
*
2
)
return
format
Pricing
Number
(
num
*
2
)
}
}
function
deriveLanePrice
(
function
deriveLanePrice
(
...
@@ -236,7 +231,7 @@ function deriveLanePrice(
...
@@ -236,7 +231,7 @@ function deriveLanePrice(
const
ratioNumber
=
toNumberOrNull
(
ratio
)
const
ratioNumber
=
toNumberOrNull
(
ratio
)
const
denominatorNumber
=
toNumberOrNull
(
denominator
)
const
denominatorNumber
=
toNumberOrNull
(
denominator
)
if
(
ratioNumber
===
null
||
denominatorNumber
===
null
)
return
fallback
if
(
ratioNumber
===
null
||
denominatorNumber
===
null
)
return
fallback
return
formatNumber
(
ratioNumber
*
denominatorNumber
)
return
format
Pricing
Number
(
ratioNumber
*
denominatorNumber
)
}
}
function
createInitialLaneState
(
data
?:
ModelRatioData
|
null
)
{
function
createInitialLaneState
(
data
?:
ModelRatioData
|
null
)
{
...
@@ -513,12 +508,12 @@ export function ModelPricingEditorPanel({
...
@@ -513,12 +508,12 @@ export function ModelPricingEditorPanel({
if
(
lane
===
'audioOutput'
)
{
if
(
lane
===
'audioOutput'
)
{
const
audioInputPrice
=
toNumberOrNull
(
nextLanePrices
.
audioInput
)
const
audioInputPrice
=
toNumberOrNull
(
nextLanePrices
.
audioInput
)
if
(
audioInputPrice
===
null
||
audioInputPrice
===
0
)
return
''
if
(
audioInputPrice
===
null
||
audioInputPrice
===
0
)
return
''
return
formatNumber
(
priceNumber
/
audioInputPrice
)
return
format
Pricing
Number
(
priceNumber
/
audioInputPrice
)
}
}
const
inputPrice
=
toNumberOrNull
(
nextPromptPrice
)
const
inputPrice
=
toNumberOrNull
(
nextPromptPrice
)
if
(
inputPrice
===
null
||
inputPrice
===
0
)
return
''
if
(
inputPrice
===
null
||
inputPrice
===
0
)
return
''
return
formatNumber
(
priceNumber
/
inputPrice
)
return
format
Pricing
Number
(
priceNumber
/
inputPrice
)
}
}
const
syncLaneRatios
=
(
const
syncLaneRatios
=
(
...
@@ -529,7 +524,7 @@ export function ModelPricingEditorPanel({
...
@@ -529,7 +524,7 @@ export function ModelPricingEditorPanel({
const
inputPrice
=
toNumberOrNull
(
nextPromptPrice
)
const
inputPrice
=
toNumberOrNull
(
nextPromptPrice
)
setFormValue
(
setFormValue
(
'ratio'
,
'ratio'
,
inputPrice
!==
null
?
formatNumber
(
inputPrice
/
2
)
:
''
inputPrice
!==
null
?
format
Pricing
Number
(
inputPrice
/
2
)
:
''
)
)
laneConfigs
.
forEach
(({
key
})
=>
{
laneConfigs
.
forEach
(({
key
})
=>
{
...
...
web/default/src/features/system-settings/models/model-ratio-visual-editor.tsx
View file @
6f11d198
...
@@ -65,6 +65,7 @@ import {
...
@@ -65,6 +65,7 @@ import {
ModelPricingSheet
,
ModelPricingSheet
,
type
ModelRatioData
,
type
ModelRatioData
,
}
from
'./model-pricing-sheet'
}
from
'./model-pricing-sheet'
import
{
formatPricingNumber
}
from
'./pricing-format'
type
ModelRatioVisualEditorProps
=
{
type
ModelRatioVisualEditorProps
=
{
modelPrice
:
string
modelPrice
:
string
...
@@ -106,15 +107,11 @@ const toNumberOrNull = (value?: string) => {
...
@@ -106,15 +107,11 @@ const toNumberOrNull = (value?: string) => {
return
Number
.
isFinite
(
num
)
?
num
:
null
return
Number
.
isFinite
(
num
)
?
num
:
null
}
}
const
formatPrice
=
(
value
:
number
)
=>
{
return
Number
.
parseFloat
(
value
.
toFixed
(
12
)).
toString
()
}
const
ratioToPrice
=
(
ratio
?:
string
,
denominator
?:
string
)
=>
{
const
ratioToPrice
=
(
ratio
?:
string
,
denominator
?:
string
)
=>
{
const
ratioNumber
=
toNumberOrNull
(
ratio
)
const
ratioNumber
=
toNumberOrNull
(
ratio
)
const
denominatorNumber
=
denominator
?
toNumberOrNull
(
denominator
)
:
2
const
denominatorNumber
=
denominator
?
toNumberOrNull
(
denominator
)
:
2
if
(
ratioNumber
===
null
||
denominatorNumber
===
null
)
return
''
if
(
ratioNumber
===
null
||
denominatorNumber
===
null
)
return
''
return
formatPric
e
(
ratioNumber
*
denominatorNumber
)
return
formatPric
ingNumber
(
ratioNumber
*
denominatorNumber
)
}
}
const
filterBySelectedValues
=
(
const
filterBySelectedValues
=
(
...
...
web/default/src/features/system-settings/models/pricing-format.ts
0 → 100644
View file @
6f11d198
/*
Copyright (C) 2023-2026 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
For commercial licensing, please contact support@quantumnous.com
*/
const
DISPLAY_DECIMALS
=
12
const
SNAP_DECIMALS
=
8
const
SNAP_EPSILON
=
1
e
-
12
function
toNumberOrNull
(
value
:
unknown
):
number
|
null
{
if
(
value
===
''
||
value
===
null
||
value
===
undefined
||
value
===
false
)
{
return
null
}
const
num
=
Number
(
value
)
return
Number
.
isFinite
(
num
)
?
num
:
null
}
function
roundToDecimals
(
value
:
number
,
decimals
:
number
):
number
{
const
factor
=
10
**
decimals
return
Math
.
round
(
value
*
factor
)
/
factor
}
function
snapFloatDrift
(
value
:
number
):
number
{
const
tolerance
=
Math
.
max
(
SNAP_EPSILON
,
Math
.
abs
(
value
)
*
Number
.
EPSILON
*
8
)
for
(
let
decimals
=
0
;
decimals
<=
SNAP_DECIMALS
;
decimals
+=
1
)
{
const
rounded
=
roundToDecimals
(
value
,
decimals
)
if
(
Math
.
abs
(
value
-
rounded
)
<=
tolerance
)
{
return
rounded
}
}
return
value
}
export
function
formatPricingNumber
(
value
:
unknown
):
string
{
const
num
=
toNumberOrNull
(
value
)
if
(
num
===
null
)
return
''
const
normalized
=
snapFloatDrift
(
num
)
return
Number
.
parseFloat
(
normalized
.
toFixed
(
DISPLAY_DECIMALS
)).
toString
()
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment