mirror of
https://github.com/enricoros/big-AGI.git
synced 2026-05-11 14:10:15 -07:00
Normalize PricingChatGenerate
This commit is contained in:
@@ -2,7 +2,7 @@ import * as React from 'react';
|
||||
|
||||
import { Badge } from '@mui/joy';
|
||||
|
||||
import type { DChatGeneratePricing } from '~/common/stores/llms/llms.pricing';
|
||||
import type { DPricingChatGenerate } from '~/common/stores/llms/llms.pricing';
|
||||
import { formatModelsCost } from '~/common/util/costUtils';
|
||||
|
||||
import { tokenCountsMathAndMessage, TokenTooltip } from './TokenTooltip';
|
||||
@@ -14,7 +14,7 @@ import { tokenCountsMathAndMessage, TokenTooltip } from './TokenTooltip';
|
||||
export const TokenBadgeMemo = React.memo(TokenBadge);
|
||||
|
||||
function TokenBadge(props: {
|
||||
chatPricing?: DChatGeneratePricing,
|
||||
chatPricing?: DPricingChatGenerate,
|
||||
|
||||
direct: number,
|
||||
history?: number,
|
||||
|
||||
@@ -2,7 +2,7 @@ import * as React from 'react';
|
||||
|
||||
import { Box, useTheme } from '@mui/joy';
|
||||
|
||||
import type { DChatGeneratePricing } from '~/common/stores/llms/llms.pricing';
|
||||
import type { DPricingChatGenerate } from '~/common/stores/llms/llms.pricing';
|
||||
|
||||
import { tokenCountsMathAndMessage, TokenTooltip } from './TokenTooltip';
|
||||
|
||||
@@ -15,7 +15,7 @@ import { tokenCountsMathAndMessage, TokenTooltip } from './TokenTooltip';
|
||||
export const TokenProgressbarMemo = React.memo(TokenProgressbar);
|
||||
|
||||
function TokenProgressbar(props: {
|
||||
chatPricing?: DChatGeneratePricing,
|
||||
chatPricing?: DPricingChatGenerate,
|
||||
|
||||
direct: number,
|
||||
history: number,
|
||||
|
||||
@@ -3,13 +3,13 @@ import * as React from 'react';
|
||||
import type { SxProps } from '@mui/joy/styles/types';
|
||||
import { Box, ColorPaletteProp, Tooltip } from '@mui/joy';
|
||||
|
||||
import { DChatGeneratePricing, getLlmCostForTokens } from '~/common/stores/llms/llms.pricing';
|
||||
import { DPricingChatGenerate, getLlmCostForTokens } from '~/common/stores/llms/llms.pricing';
|
||||
import { adjustContentScaling, themeScalingMap } from '~/common/app.theme';
|
||||
import { formatModelsCost } from '~/common/util/costUtils';
|
||||
import { useUIContentScaling } from '~/common/state/store-ui';
|
||||
|
||||
|
||||
export function tokenCountsMathAndMessage(tokenLimit: number | 0, directTokens: number, historyTokens?: number, responseMaxTokens?: number, chatPricing?: DChatGeneratePricing): {
|
||||
export function tokenCountsMathAndMessage(tokenLimit: number | 0, directTokens: number, historyTokens?: number, responseMaxTokens?: number, chatPricing?: DPricingChatGenerate): {
|
||||
color: ColorPaletteProp,
|
||||
message: string,
|
||||
remainingTokens: number,
|
||||
|
||||
@@ -6,11 +6,11 @@ import type { DLLM } from './llms.types';
|
||||
* Pricing is denominated in $/MegaTokens.
|
||||
*/
|
||||
export type DModelPricing = {
|
||||
chat?: DChatGeneratePricing,
|
||||
chat?: DPricingChatGenerate,
|
||||
}
|
||||
|
||||
// NOTE: (!) keep this in sync with ChatGeneratePricing_schema (modules/llms/server/llm.server.types.ts)
|
||||
export type DChatGeneratePricing = {
|
||||
// NOTE: (!) keep this in sync with PricingChatGenerate_schema (modules/llms/server/llm.server.types.ts)
|
||||
export type DPricingChatGenerate = {
|
||||
// unit: 'USD_Mtok',
|
||||
input?: DTieredPricing;
|
||||
output?: DTieredPricing;
|
||||
@@ -24,7 +24,7 @@ export type DChatGeneratePricing = {
|
||||
read: DTieredPricing;
|
||||
// write: DTieredPricing; // Not needed, as it's automatic
|
||||
};
|
||||
// NOT in AixWire_API_ListModels.ChatGeneratePricing_schema
|
||||
// NOT in AixWire_API_ListModels.PricingChatGenerate_schema
|
||||
_isFree?: boolean; // precomputed, so we avoid recalculating it
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ type DPricePerMToken = number | 'free';
|
||||
|
||||
/// detect Free Pricing
|
||||
|
||||
export function isModelPricingFree(pricingChatGenerate: DChatGeneratePricing): boolean {
|
||||
export function isModelPricingFree(pricingChatGenerate: DPricingChatGenerate): boolean {
|
||||
if (!pricingChatGenerate) return true;
|
||||
return _isPricingFree(pricingChatGenerate.input) && _isPricingFree(pricingChatGenerate.output);
|
||||
}
|
||||
@@ -89,13 +89,13 @@ export function portModelPricingV2toV3(llm: DLLM): void {
|
||||
|
||||
const pretendIsV2 = llm.pricing as Was_DModelPricingV2;
|
||||
if (pretendIsV2.chatIn || pretendIsV2.chatOut) {
|
||||
const V3: DChatGeneratePricing = {};
|
||||
const V3pcg: DPricingChatGenerate = {};
|
||||
if (pretendIsV2.chatIn)
|
||||
V3.input = pretendIsV2.chatIn;
|
||||
V3pcg.input = pretendIsV2.chatIn;
|
||||
if (pretendIsV2.chatOut)
|
||||
V3.output = pretendIsV2.chatOut;
|
||||
V3._isFree = isModelPricingFree(V3);
|
||||
llm.pricing = { chat: V3 };
|
||||
V3pcg.output = pretendIsV2.chatOut;
|
||||
V3pcg._isFree = isModelPricingFree(V3pcg);
|
||||
llm.pricing = { chat: V3pcg };
|
||||
delete pretendIsV2.chatIn;
|
||||
delete pretendIsV2.chatOut;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { DChatGeneratePricing, getLlmCostForTokens, isModelPricingFree } from '~/common/stores/llms/llms.pricing';
|
||||
import { DPricingChatGenerate, getLlmCostForTokens, isModelPricingFree } from '~/common/stores/llms/llms.pricing';
|
||||
|
||||
/**
|
||||
* This is a stored type - IMPORTANT: do not break.
|
||||
@@ -88,7 +88,7 @@ export function finishChatGenerateTokenMetrics(metrics: DChatGenerateMetricsLg |
|
||||
|
||||
const USD_TO_CENTS = 100;
|
||||
|
||||
export function computeChatGenerationCosts(metrics?: Readonly<DChatGenerateMetricsMd>, pricing?: DChatGeneratePricing | undefined, logLlmRefId?: string): ChatGenerateCostMetricsMd | undefined {
|
||||
export function computeChatGenerationCosts(metrics?: Readonly<DChatGenerateMetricsMd>, pricing?: DPricingChatGenerate | undefined, logLlmRefId?: string): ChatGenerateCostMetricsMd | undefined {
|
||||
if (!metrics)
|
||||
return undefined;
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';
|
||||
import VisibilityIcon from '@mui/icons-material/Visibility';
|
||||
import VisibilityOffIcon from '@mui/icons-material/VisibilityOff';
|
||||
|
||||
import type { DChatGeneratePricing } from '~/common/stores/llms/llms.pricing';
|
||||
import type { DPricingChatGenerate } from '~/common/stores/llms/llms.pricing';
|
||||
import type { DLLMId } from '~/common/stores/llms/llms.types';
|
||||
import { FormLabelStart } from '~/common/components/forms/FormLabelStart';
|
||||
import { GoodModal } from '~/common/components/modals/GoodModal';
|
||||
@@ -31,10 +31,10 @@ function VendorLLMOptionsComponent(props: { llmId: DLLMId }) {
|
||||
}
|
||||
|
||||
|
||||
function prettyPricingComponent(chatPricing: DChatGeneratePricing): React.ReactNode {
|
||||
if (!chatPricing) return 'Pricing not available';
|
||||
function prettyPricingComponent(pricingChatGenerate: DPricingChatGenerate): React.ReactNode {
|
||||
if (!pricingChatGenerate) return 'Pricing not available';
|
||||
|
||||
const formatPrice = (price: DChatGeneratePricing['input']): string => {
|
||||
const formatPrice = (price: DPricingChatGenerate['input']): string => {
|
||||
if (!price) return 'N/A';
|
||||
if (price === 'free') return 'Free';
|
||||
if (typeof price === 'number') return `$${price.toFixed(2)}`;
|
||||
@@ -43,19 +43,19 @@ function prettyPricingComponent(chatPricing: DChatGeneratePricing): React.ReactN
|
||||
return 'Unknown';
|
||||
};
|
||||
|
||||
const inputPrice = formatPrice(chatPricing.input);
|
||||
const outputPrice = formatPrice(chatPricing.output);
|
||||
const inputPrice = formatPrice(pricingChatGenerate.input);
|
||||
const outputPrice = formatPrice(pricingChatGenerate.output);
|
||||
|
||||
let cacheInfo = '';
|
||||
if (chatPricing.cache) {
|
||||
switch (chatPricing.cache.cType) {
|
||||
if (pricingChatGenerate.cache) {
|
||||
switch (pricingChatGenerate.cache.cType) {
|
||||
case 'ant-bp': {
|
||||
const { read, write, duration } = chatPricing.cache;
|
||||
const { read, write, duration } = pricingChatGenerate.cache;
|
||||
cacheInfo = `Cache: Read ${formatPrice(read)}, Write ${formatPrice(write)}, Duration: ${duration}s`;
|
||||
break;
|
||||
}
|
||||
case 'oai-ac': {
|
||||
const { read } = chatPricing.cache;
|
||||
const { read } = pricingChatGenerate.cache;
|
||||
cacheInfo = `Cache: Read ${formatPrice(read)}`;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -54,8 +54,8 @@ const TieredPricing_schema = z.union([
|
||||
z.array(PriceUpTo_schema),
|
||||
]);
|
||||
|
||||
// NOTE: (!) keep this in sync with DChatGeneratePricing (llms.pricing.ts)
|
||||
const ChatGeneratePricing_schema = z.object({
|
||||
// NOTE: (!) keep this in sync with DPricingChatGenerate (llms.pricing.ts)
|
||||
const PricingChatGenerate_schema = z.object({
|
||||
input: TieredPricing_schema.optional(),
|
||||
output: TieredPricing_schema.optional(),
|
||||
// Future: Perplexity has a cost per request, consider this for future additions
|
||||
@@ -92,7 +92,7 @@ export const ModelDescription_schema = z.object({
|
||||
// rateLimits: rateLimitsSchema.optional(),
|
||||
trainingDataCutoff: z.string().optional(),
|
||||
benchmark: BenchmarksScores_schema.optional(),
|
||||
chatPrice: ChatGeneratePricing_schema.optional(),
|
||||
chatPrice: PricingChatGenerate_schema.optional(),
|
||||
hidden: z.boolean().optional(),
|
||||
// TODO: add inputTypes/Kinds..
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user