feat(ai): add input-based pricing tiers
This commit is contained in:
@@ -1451,8 +1451,8 @@ export interface ProviderModelConfig {
|
||||
thinkingLevelMap?: Model<Api>["thinkingLevelMap"];
|
||||
/** Supported input types. */
|
||||
input: ("text" | "image")[];
|
||||
/** Cost per token (for tracking, can be 0). */
|
||||
cost: { input: number; output: number; cacheRead: number; cacheWrite: number };
|
||||
/** Per-million-token cost rates and optional request-wide input pricing tiers. */
|
||||
cost: Model<Api>["cost"];
|
||||
/** Maximum context window size in tokens. */
|
||||
contextWindow: number;
|
||||
/** Maximum output tokens. */
|
||||
|
||||
@@ -156,6 +156,21 @@ const ProviderCompatSchema = Type.Union([
|
||||
AnthropicMessagesCompatSchema,
|
||||
]);
|
||||
|
||||
const ModelCostRatesSchema = {
|
||||
input: Type.Number(),
|
||||
output: Type.Number(),
|
||||
cacheRead: Type.Number(),
|
||||
cacheWrite: Type.Number(),
|
||||
};
|
||||
const ModelCostTierSchema = Type.Object({
|
||||
inputTokensAbove: Type.Number(),
|
||||
...ModelCostRatesSchema,
|
||||
});
|
||||
const ModelCostSchema = Type.Object({
|
||||
...ModelCostRatesSchema,
|
||||
tiers: Type.Optional(Type.Array(ModelCostTierSchema)),
|
||||
});
|
||||
|
||||
// Schema for custom model definition
|
||||
// Most fields are optional with sensible defaults for local models (Ollama, LM Studio, etc.)
|
||||
const ModelDefinitionSchema = Type.Object({
|
||||
@@ -166,14 +181,7 @@ const ModelDefinitionSchema = Type.Object({
|
||||
reasoning: Type.Optional(Type.Boolean()),
|
||||
thinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),
|
||||
input: Type.Optional(Type.Array(Type.Union([Type.Literal("text"), Type.Literal("image")]))),
|
||||
cost: Type.Optional(
|
||||
Type.Object({
|
||||
input: Type.Number(),
|
||||
output: Type.Number(),
|
||||
cacheRead: Type.Number(),
|
||||
cacheWrite: Type.Number(),
|
||||
}),
|
||||
),
|
||||
cost: Type.Optional(ModelCostSchema),
|
||||
contextWindow: Type.Optional(Type.Number()),
|
||||
maxTokens: Type.Optional(Type.Number()),
|
||||
headers: Type.Optional(Type.Record(Type.String(), Type.String())),
|
||||
@@ -192,6 +200,7 @@ const ModelOverrideSchema = Type.Object({
|
||||
output: Type.Optional(Type.Number()),
|
||||
cacheRead: Type.Optional(Type.Number()),
|
||||
cacheWrite: Type.Optional(Type.Number()),
|
||||
tiers: Type.Optional(Type.Array(ModelCostTierSchema)),
|
||||
}),
|
||||
),
|
||||
contextWindow: Type.Optional(Type.Number()),
|
||||
@@ -335,6 +344,7 @@ function applyModelOverride(model: Model<Api>, override: ModelOverride): Model<A
|
||||
output: override.cost.output ?? model.cost.output,
|
||||
cacheRead: override.cost.cacheRead ?? model.cost.cacheRead,
|
||||
cacheWrite: override.cost.cacheWrite ?? model.cost.cacheWrite,
|
||||
tiers: override.cost.tiers ?? model.cost.tiers,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -999,7 +1009,7 @@ export interface ProviderConfigInput {
|
||||
reasoning: boolean;
|
||||
thinkingLevelMap?: Model<Api>["thinkingLevelMap"];
|
||||
input: ("text" | "image")[];
|
||||
cost: { input: number; output: number; cacheRead: number; cacheWrite: number };
|
||||
cost: Model<Api>["cost"];
|
||||
contextWindow: number;
|
||||
maxTokens: number;
|
||||
headers?: Record<string, string>;
|
||||
|
||||
Reference in New Issue
Block a user