Usage Meter
TsgcAIUsageMeter 统计您的应用程序发给语言模型的每个请求的令牌数,并把它们换算成金额。把它赋给 TsgcAIChat.UsageMeter,再给它一份价格表和一个预算,达到预算的用户会在下一个请求发出之前被拒绝。
TsgcAIUsageMeter 统计您的应用程序发给语言模型的每个请求的令牌数,并把它们换算成金额。把它赋给 TsgcAIChat.UsageMeter,再给它一份价格表和一个预算,达到预算的用户会在下一个请求发出之前被拒绝。
按提供商和模型设置价格,按用户和会话累计总量,支持总量、每日或每月预算(可拦截请求),并可导出到 CSV、任意 TDataSet 和 OpenTelemetry 收集器。
版本。TsgcAIUsageMeter 随 sgcAI、sgcWebSockets Enterprise 和 All-Access 一同提供,版本范围与 TsgcAIChat 相同。2026.11.0 新增。sgcAI 是自包含的:它包含该组件所基于的 sgcWebSockets Core 运行时。适用于 Delphi 7 至 Delphi 13 和 C++ Builder。
添加价格,添加预算,把用量计关联到聊天组件。该聊天组件以及使用它的智能体发出的每个请求都会被统计。
uses
sgcAI, sgcAI_Chat, sgcAI_UsageMeter;
procedure TForm1.MeterUsage;
var
oPrice: TsgcAIUsagePrice;
oBudget: TsgcAIUsageBudget;
begin
oPrice := sgcAIUsageMeter1.Prices.Add; // or Prices.LoadFromFile('prices.json')
oPrice.Provider := 'openai';
oPrice.Model := 'gpt-5*';
oPrice.InputPerMillion := 1.25;
oPrice.OutputPerMillion := 10;
oPrice.CachedPerMillion := 0.125;
oBudget := sgcAIUsageMeter1.Budgets.Add; // every user can spend 2 USD a day
oBudget.Scope := aubsUser;
oBudget.Period := aubpDay;
oBudget.MaxCost := 2;
sgcAIUsageMeter1.OnBudgetExceeded := DoBudgetExceeded;
// optional: one OpenTelemetry span per request
sgcAIUsageMeter1.OpenTelemetry.Enabled := True;
sgcAIUsageMeter1.OpenTelemetry.Endpoint := 'http://localhost:4318';
sgcAIChat1.UserId := 'user-1';
sgcAIChat1.UsageMeter := sgcAIUsageMeter1;
Memo1.Lines.Add(sgcAIChat1.Chat('Hello'));
Memo1.Lines.Add(Format('user-1 spent %.6f %s and %d tokens',
[sgcAIUsageMeter1.TotalCost('user-1'), sgcAIUsageMeter1.Currency,
sgcAIUsageMeter1.TotalTokens('user-1')]));
sgcAIUsageMeter1.SaveToCSV('usage.csv');
end;
procedure TForm1.DoBudgetExceeded(Sender: TObject;
const aBudget: TsgcAIUsageBudget; const aKey: string; aCost: Double;
aTokens: Int64);
begin
Memo1.Lines.Add(Format('Budget "%s" reached by %s: %.4f USD',
[aBudget.DisplayName, aKey, aCost]));
end;
您最常使用的成员。
Prices 保存每个提供商和模型每百万输入、输出和缓存令牌的价格。允许使用 gpt-5* 这样的模型模式,匹配最具体的一项优先。Prices.LoadFromFile 和 LoadFromJSON 用于加载价格表。缓存令牌按 CachedPerMillion 计费。
TotalCost 和 TotalTokens 返回全部、某个用户、某个会话或某用户在某会话中的总量。Records 和 RecordCount 列出最近的 MaxRecords 个请求,不会改变总量,Clear 会重置全部数据。
Budgets 的每一项都有 Scope(aubsGlobal、aubsUser 或 aubsSession)、可选的 Key、Period(aubpTotal、aubpDay 或 aubpMonth),以及 MaxCost 或 MaxTokens 上限。启用 BlockWhenExceeded 后,下一个请求会在发出之前被拒绝。
SaveToCSV 和 ToCSV 为每个请求写一行,包含时间戳、提供商、模型、用户、会话、令牌数和成本。ExportToDataSet 把记录追加到字段名相符的任意 TDataSet。
启用 OpenTelemetry.Enabled 后,每个请求都会变成一个遵循 GenAI 语义约定的 OTLP/HTTP span:提供商、模型、输入、输出和缓存令牌、用户和会话。由后台线程发送,因此聊天组件无需等待收集器。
每个已计价的请求都会触发 OnRecord。达到上限时,每个预算、键和周期只触发一次 OnBudgetExceeded。由 fallback 提供商回答的请求按实际回答的提供商和模型计价。
该组件所用服务和协议的权威资料来源。