Skip to content

Commit 00a8aac

Browse files
authored
feat(token-usage): implement token usage tracking and reporting features (agentscope-ai#775)
1 parent 820f8f5 commit 00a8aac

37 files changed

+1271
-75
lines changed

console/src/api/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { workspaceApi } from "./modules/workspace";
1717
import { localModelApi } from "./modules/localModel";
1818
import { ollamaModelApi } from "./modules/ollamaModel";
1919
import { mcpApi } from "./modules/mcp";
20+
import { tokenUsageApi } from "./modules/tokenUsage";
2021
import { toolsApi } from "./modules/tools";
2122

2223
export const api = {
@@ -62,6 +63,8 @@ export const api = {
6263
// MCP Clients
6364
...mcpApi,
6465

66+
// Token Usage
67+
...tokenUsageApi,
6568
// Tools
6669
...toolsApi,
6770
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { request } from "../request";
2+
import type { TokenUsageSummary } from "../types/tokenUsage";
3+
4+
export interface GetTokenUsageParams {
5+
start_date: string;
6+
end_date: string;
7+
}
8+
9+
function buildQuery(params: GetTokenUsageParams): string {
10+
const search = new URLSearchParams({
11+
start_date: params.start_date,
12+
end_date: params.end_date,
13+
});
14+
return `?${search.toString()}`;
15+
}
16+
17+
export const tokenUsageApi = {
18+
getTokenUsage: (params: GetTokenUsageParams) =>
19+
request<TokenUsageSummary>(`/token-usage${buildQuery(params)}`),
20+
};

console/src/api/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export * from "./mcp";
88
export * from "./provider";
99
export * from "./skill";
1010
export * from "./workspace";
11+
export * from "./tokenUsage";
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/** Per-model (has provider_id, model) or per-date (no provider_id, model) stats. */
2+
export interface TokenUsageStats {
3+
provider_id?: string;
4+
model?: string;
5+
prompt_tokens: number;
6+
completion_tokens: number;
7+
call_count: number;
8+
}
9+
10+
export interface TokenUsageSummary {
11+
total_prompt_tokens: number;
12+
total_completion_tokens: number;
13+
total_calls: number;
14+
by_model: Record<string, TokenUsageStats>;
15+
by_date: Record<string, TokenUsageStats>;
16+
}

console/src/layouts/MainLayout/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import WorkspacePage from "../../pages/Agent/Workspace";
1717
import MCPPage from "../../pages/Agent/MCP";
1818
import ModelsPage from "../../pages/Settings/Models";
1919
import EnvironmentsPage from "../../pages/Settings/Environments";
20+
import TokenUsagePage from "../../pages/Settings/TokenUsage";
2021

2122
const { Content } = Layout;
2223

@@ -34,6 +35,7 @@ const pathToKey: Record<string, string> = {
3435
"/models": "models",
3536
"/environments": "environments",
3637
"/agent-config": "agent-config",
38+
"/token-usage": "token-usage",
3739
};
3840

3941
export default function MainLayout() {
@@ -70,6 +72,7 @@ export default function MainLayout() {
7072
<Route path="/models" element={<ModelsPage />} />
7173
<Route path="/environments" element={<EnvironmentsPage />} />
7274
<Route path="/agent-config" element={<AgentConfigPage />} />
75+
<Route path="/token-usage" element={<TokenUsagePage />} />
7376
<Route path="/" element={<Chat />} />
7477
</Routes>
7578
</div>

console/src/layouts/Sidebar.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
PanelLeftOpen,
3535
Copy,
3636
Check,
37+
BarChart3,
3738
} from "lucide-react";
3839
import api from "../api";
3940
import styles from "./index.module.less";
@@ -62,6 +63,7 @@ const KEY_TO_PATH: Record<string, string> = {
6263
models: "/models",
6364
environments: "/environments",
6465
"agent-config": "/agent-config",
66+
"token-usage": "/token-usage",
6567
};
6668

6769
const UPDATE_MD: Record<string, string> = {
@@ -339,6 +341,11 @@ export default function Sidebar({ selectedKey }: SidebarProps) {
339341
label: t("nav.environments"),
340342
icon: <Globe size={16} />,
341343
},
344+
{
345+
key: "token-usage",
346+
label: t("nav.tokenUsage"),
347+
icon: <BarChart3 size={16} />,
348+
},
342349
],
343350
},
344351
];

console/src/locales/en.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"agentConfig": "Configuration",
3737
"settings": "Settings",
3838
"models": "Models",
39-
"environments": "Environments"
39+
"environments": "Environments",
40+
"tokenUsage": "Token Usage"
4041
},
4142
"workspace": {
4243
"title": "WorkSpace",
@@ -323,6 +324,22 @@
323324
"showValue": "Show value",
324325
"hideValue": "Hide value"
325326
},
327+
"tokenUsage": {
328+
"title": "Token Usage",
329+
"description": "View LLM token consumption over time, by date and model.",
330+
"totalTokens": "Total Tokens",
331+
"totalCalls": "Total Calls",
332+
"promptTokens": "Prompt Tokens",
333+
"completionTokens": "Completion Tokens",
334+
"byModel": "By Model",
335+
"byDate": "By Date",
336+
"provider": "Provider",
337+
"model": "Model",
338+
"date": "Date",
339+
"refresh": "Refresh",
340+
"loadFailed": "Failed to load token usage",
341+
"noData": "No token usage data in the selected period"
342+
},
326343
"models": {
327344
"llmConfiguration": "LLM Configuration",
328345
"providersTitle": "Providers",

console/src/locales/ja.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,22 @@
320320
"showValue": "値を表示",
321321
"hideValue": "値を非表示"
322322
},
323+
"tokenUsage": {
324+
"title": "Token 使用量",
325+
"description": "日付・モデル別の LLM Token 使用量を確認します。",
326+
"totalTokens": "合計 Token 数",
327+
"totalCalls": "総呼び出し回数",
328+
"promptTokens": "入力 Token",
329+
"completionTokens": "出力 Token",
330+
"byModel": "モデル別",
331+
"byDate": "日付別",
332+
"provider": "プロバイダー",
333+
"model": "モデル",
334+
"date": "日付",
335+
"refresh": "更新",
336+
"loadFailed": "Token 使用量の読み込みに失敗しました",
337+
"noData": "選択期間に Token 使用データがありません"
338+
},
323339
"models": {
324340
"llmConfiguration": "LLM設定",
325341
"providersTitle": "プロバイダー",

console/src/locales/ru.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,22 @@
323323
"showValue": "Показать значение",
324324
"hideValue": "Скрыть значение"
325325
},
326+
"tokenUsage": {
327+
"title": "Использование токенов",
328+
"description": "Просмотр расхода LLM-токенов по датам и моделям.",
329+
"totalTokens": "Всего токенов",
330+
"totalCalls": "Всего вызовов",
331+
"promptTokens": "Входные токены",
332+
"completionTokens": "Выходные токены",
333+
"byModel": "По модели",
334+
"byDate": "По дате",
335+
"provider": "Провайдер",
336+
"model": "Модель",
337+
"date": "Дата",
338+
"refresh": "Обновить",
339+
"loadFailed": "Не удалось загрузить данные об использовании токенов",
340+
"noData": "Нет данных об использовании токенов за выбранный период"
341+
},
326342
"models": {
327343
"llmConfiguration": "Конфигурация LLM",
328344
"providersTitle": "Провайдеры",

console/src/locales/zh.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"agentConfig": "运行配置",
3737
"settings": "设置",
3838
"models": "模型",
39-
"environments": "环境变量"
39+
"environments": "环境变量",
40+
"tokenUsage": "Token 消耗"
4041
},
4142
"workspace": {
4243
"title": "工作区",
@@ -323,6 +324,22 @@
323324
"showValue": "显示值",
324325
"hideValue": "隐藏值"
325326
},
327+
"tokenUsage": {
328+
"title": "Token 消耗",
329+
"description": "查看一段时间内的 LLM Token 消耗,按日期和模型统计。",
330+
"totalTokens": "总 Token 数",
331+
"totalCalls": "总调用次数",
332+
"promptTokens": "输入 Token",
333+
"completionTokens": "输出 Token",
334+
"byModel": "按模型",
335+
"byDate": "按日期",
336+
"provider": "提供商",
337+
"model": "模型",
338+
"date": "日期",
339+
"refresh": "刷新",
340+
"loadFailed": "加载 Token 消耗数据失败",
341+
"noData": "所选时间段内暂无 Token 消耗数据"
342+
},
326343
"models": {
327344
"llmConfiguration": "LLM 配置",
328345
"providersTitle": "提供商",

0 commit comments

Comments
 (0)