codegrunt 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +351 -0
- package/dist/cli/at-resolver.d.ts +10 -0
- package/dist/cli/at-resolver.js +138 -0
- package/dist/cli/at-resolver.js.map +1 -0
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +111 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/commands.d.ts +25 -0
- package/dist/cli/commands.js +799 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +142 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/input.d.ts +14 -0
- package/dist/cli/input.js +742 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/repl.d.ts +2 -0
- package/dist/cli/repl.js +217 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/setup.d.ts +7 -0
- package/dist/cli/setup.js +82 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/skills.d.ts +28 -0
- package/dist/cli/skills.js +299 -0
- package/dist/cli/skills.js.map +1 -0
- package/dist/cli/update.d.ts +7 -0
- package/dist/cli/update.js +135 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +93 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent/loop.d.ts +17 -0
- package/dist/core/agent/loop.js +353 -0
- package/dist/core/agent/loop.js.map +1 -0
- package/dist/core/context/manager.d.ts +26 -0
- package/dist/core/context/manager.js +98 -0
- package/dist/core/context/manager.js.map +1 -0
- package/dist/core/context/project-guide.d.ts +1 -0
- package/dist/core/context/project-guide.js +17 -0
- package/dist/core/context/project-guide.js.map +1 -0
- package/dist/core/tools/edit_file.d.ts +2 -0
- package/dist/core/tools/edit_file.js +54 -0
- package/dist/core/tools/edit_file.js.map +1 -0
- package/dist/core/tools/execute_shell.d.ts +2 -0
- package/dist/core/tools/execute_shell.js +67 -0
- package/dist/core/tools/execute_shell.js.map +1 -0
- package/dist/core/tools/executor.d.ts +3 -0
- package/dist/core/tools/executor.js +86 -0
- package/dist/core/tools/executor.js.map +1 -0
- package/dist/core/tools/list_directory.d.ts +2 -0
- package/dist/core/tools/list_directory.js +74 -0
- package/dist/core/tools/list_directory.js.map +1 -0
- package/dist/core/tools/read_file.d.ts +2 -0
- package/dist/core/tools/read_file.js +40 -0
- package/dist/core/tools/read_file.js.map +1 -0
- package/dist/core/tools/registry.d.ts +4 -0
- package/dist/core/tools/registry.js +24 -0
- package/dist/core/tools/registry.js.map +1 -0
- package/dist/core/tools/search_files.d.ts +2 -0
- package/dist/core/tools/search_files.js +88 -0
- package/dist/core/tools/search_files.js.map +1 -0
- package/dist/core/tools/write_file.d.ts +2 -0
- package/dist/core/tools/write_file.js +43 -0
- package/dist/core/tools/write_file.js.map +1 -0
- package/dist/providers/deepseek/client.d.ts +8 -0
- package/dist/providers/deepseek/client.js +27 -0
- package/dist/providers/deepseek/client.js.map +1 -0
- package/dist/providers/deepseek/provider.d.ts +8 -0
- package/dist/providers/deepseek/provider.js +165 -0
- package/dist/providers/deepseek/provider.js.map +1 -0
- package/dist/types.d.ts +111 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/billing.d.ts +40 -0
- package/dist/utils/billing.js +165 -0
- package/dist/utils/billing.js.map +1 -0
- package/dist/utils/confirm.d.ts +3 -0
- package/dist/utils/confirm.js +242 -0
- package/dist/utils/confirm.js.map +1 -0
- package/dist/utils/display.d.ts +10 -0
- package/dist/utils/display.js +121 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/interrupt.d.ts +5 -0
- package/dist/utils/interrupt.js +13 -0
- package/dist/utils/interrupt.js.map +1 -0
- package/dist/utils/markdown.d.ts +18 -0
- package/dist/utils/markdown.js +223 -0
- package/dist/utils/markdown.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { createOpenAIClient } from './client.js';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { addUsage } from '../../core/agent/loop.js';
|
|
4
|
+
import { recordUsage } from '../../utils/billing.js';
|
|
5
|
+
export class DeepSeekProvider {
|
|
6
|
+
id = 'deepseek';
|
|
7
|
+
client;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.client = createOpenAIClient(config);
|
|
10
|
+
}
|
|
11
|
+
async *stream(messages, options) {
|
|
12
|
+
// Convert our Message[] to OpenAI format, preserving reasoning_content
|
|
13
|
+
const openaiMessages = messages.map(toOpenAIMessage);
|
|
14
|
+
const tools = options.tools?.map(toOpenAITool);
|
|
15
|
+
const stream = await this.client.chat.completions.create({
|
|
16
|
+
model: options.model,
|
|
17
|
+
max_tokens: options.maxTokens,
|
|
18
|
+
// temperature is intentionally undefined for reasoner models
|
|
19
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
20
|
+
// DeepSeek-specific parameters
|
|
21
|
+
...(options.topP !== undefined ? { top_p: options.topP } : {}),
|
|
22
|
+
...(options.frequencyPenalty !== undefined ? { frequency_penalty: options.frequencyPenalty } : {}),
|
|
23
|
+
...(options.presencePenalty !== undefined ? { presence_penalty: options.presencePenalty } : {}),
|
|
24
|
+
// R1 reasoning effort: controls how long the model thinks
|
|
25
|
+
...(options.reasoningEffort !== undefined
|
|
26
|
+
? { reasoning_effort: options.reasoningEffort }
|
|
27
|
+
: {}),
|
|
28
|
+
messages: openaiMessages,
|
|
29
|
+
tools: tools && tools.length > 0 ? tools : undefined,
|
|
30
|
+
tool_choice: tools && tools.length > 0 ? 'auto' : undefined,
|
|
31
|
+
stream: true,
|
|
32
|
+
stream_options: { include_usage: true },
|
|
33
|
+
}, { signal: options.signal });
|
|
34
|
+
const accumulator = new Map();
|
|
35
|
+
for await (const chunk of stream) {
|
|
36
|
+
const choice = chunk.choices[0];
|
|
37
|
+
// Usage stats arrive in the final chunk (choices may be empty)
|
|
38
|
+
if (chunk.usage) {
|
|
39
|
+
printUsage(chunk.usage, options.model);
|
|
40
|
+
}
|
|
41
|
+
if (!choice)
|
|
42
|
+
continue;
|
|
43
|
+
const delta = choice.delta;
|
|
44
|
+
if (delta.content) {
|
|
45
|
+
yield { type: 'text_delta', text: delta.content };
|
|
46
|
+
}
|
|
47
|
+
// DeepSeek reasoning_content — chain of thought (V4 & R1 both emit this)
|
|
48
|
+
const reasoning = delta.reasoning_content;
|
|
49
|
+
if (reasoning) {
|
|
50
|
+
yield { type: 'reasoning_delta', text: reasoning };
|
|
51
|
+
}
|
|
52
|
+
if (delta.tool_calls) {
|
|
53
|
+
for (const tc of delta.tool_calls) {
|
|
54
|
+
const existing = accumulator.get(tc.index) ?? { id: '', name: '', arguments: '' };
|
|
55
|
+
if (tc.id)
|
|
56
|
+
existing.id = tc.id;
|
|
57
|
+
if (tc.function?.name)
|
|
58
|
+
existing.name = tc.function.name;
|
|
59
|
+
if (tc.function?.arguments)
|
|
60
|
+
existing.arguments += tc.function.arguments;
|
|
61
|
+
accumulator.set(tc.index, existing);
|
|
62
|
+
yield {
|
|
63
|
+
type: 'tool_call_delta',
|
|
64
|
+
index: tc.index,
|
|
65
|
+
id: tc.id,
|
|
66
|
+
name: tc.function?.name,
|
|
67
|
+
arguments_delta: tc.function?.arguments ?? '',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (choice.finish_reason) {
|
|
72
|
+
yield {
|
|
73
|
+
type: 'finish',
|
|
74
|
+
finish_reason: choice.finish_reason,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Serialize our internal Message to OpenAI-compatible format, preserving reasoning_content */
|
|
81
|
+
function toOpenAIMessage(msg) {
|
|
82
|
+
if (msg.role === 'tool') {
|
|
83
|
+
return {
|
|
84
|
+
role: 'tool',
|
|
85
|
+
tool_call_id: msg.tool_call_id,
|
|
86
|
+
content: msg.content,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (msg.role === 'assistant' && 'tool_calls' in msg && msg.tool_calls) {
|
|
90
|
+
const tcMsg = msg;
|
|
91
|
+
return {
|
|
92
|
+
role: 'assistant',
|
|
93
|
+
content: null,
|
|
94
|
+
tool_calls: tcMsg.tool_calls.map((tc) => ({
|
|
95
|
+
id: tc.id,
|
|
96
|
+
type: 'function',
|
|
97
|
+
function: {
|
|
98
|
+
name: tc.function.name,
|
|
99
|
+
arguments: tc.function.arguments,
|
|
100
|
+
},
|
|
101
|
+
})),
|
|
102
|
+
// Preserve reasoning_content so the model sees its own chain of thought
|
|
103
|
+
...(tcMsg.reasoning_content ? { reasoning_content: tcMsg.reasoning_content } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Regular text message (system / user / assistant with content)
|
|
107
|
+
const textMsg = msg;
|
|
108
|
+
return {
|
|
109
|
+
role: textMsg.role,
|
|
110
|
+
content: textMsg.content,
|
|
111
|
+
// Preserve reasoning_content in assistant messages for multi-turn continuity
|
|
112
|
+
...(textMsg.role === 'assistant' && textMsg.reasoning_content
|
|
113
|
+
? { reasoning_content: textMsg.reasoning_content }
|
|
114
|
+
: {}),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ── DeepSeek pricing (USD per 1M tokens) ────────────────────────────────────
|
|
118
|
+
const PRICING = {
|
|
119
|
+
chat: { prompt: 0.27, completion: 1.10, cacheHit: 0.07 },
|
|
120
|
+
reasoner: { prompt: 0.55, completion: 2.19, cacheHit: 0.14 },
|
|
121
|
+
};
|
|
122
|
+
function detectModelType(model) {
|
|
123
|
+
return model.includes('reasoner') || model.toLowerCase().includes('r1') ? 'reasoner' : 'chat';
|
|
124
|
+
}
|
|
125
|
+
function printUsage(usage, model) {
|
|
126
|
+
const cached = usage?.prompt_cache_hit_tokens;
|
|
127
|
+
const miss = usage?.prompt_cache_miss_tokens;
|
|
128
|
+
const modelType = detectModelType(model);
|
|
129
|
+
const p = modelType === 'reasoner' ? PRICING.reasoner : PRICING.chat;
|
|
130
|
+
const inputTokens = usage.prompt_tokens ?? 0;
|
|
131
|
+
const outputTokens = usage.completion_tokens ?? 0;
|
|
132
|
+
const cacheHits = cached ?? 0;
|
|
133
|
+
if (cached !== undefined) {
|
|
134
|
+
const total = inputTokens;
|
|
135
|
+
const hitPct = total > 0 ? Math.round((cached / total) * 100) : 0;
|
|
136
|
+
const hitColor = hitPct >= 50 ? chalk.green : hitPct > 0 ? chalk.yellow : chalk.gray;
|
|
137
|
+
process.stderr.write(chalk.gray(` tokens: prompt=${total} (`) +
|
|
138
|
+
hitColor(`cache_hit=${cached} ${hitPct}%`) +
|
|
139
|
+
chalk.gray(` miss=${miss ?? 0}) output=${outputTokens}\n`));
|
|
140
|
+
}
|
|
141
|
+
// Session tracking (in-memory)
|
|
142
|
+
addUsage({
|
|
143
|
+
inputTokens,
|
|
144
|
+
outputTokens,
|
|
145
|
+
cacheHitTokens: cacheHits,
|
|
146
|
+
cacheMissTokens: miss ?? 0,
|
|
147
|
+
});
|
|
148
|
+
// Persist to local usage log (fire-and-forget — don't block the stream)
|
|
149
|
+
const inputCost = (inputTokens / 1_000_000) * p.prompt;
|
|
150
|
+
const outputCost = (outputTokens / 1_000_000) * p.completion;
|
|
151
|
+
const cacheSavings = (cacheHits / 1_000_000) * (p.prompt - p.cacheHit);
|
|
152
|
+
const totalCost = inputCost + outputCost - cacheSavings;
|
|
153
|
+
recordUsage(inputTokens, outputTokens, cacheHits, totalCost).catch(() => { });
|
|
154
|
+
}
|
|
155
|
+
function toOpenAITool(def) {
|
|
156
|
+
return {
|
|
157
|
+
type: 'function',
|
|
158
|
+
function: {
|
|
159
|
+
name: def.function.name,
|
|
160
|
+
description: def.function.description,
|
|
161
|
+
parameters: def.function.parameters,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/deepseek/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export interface TextMessage {
|
|
2
|
+
role: 'system' | 'user' | 'assistant';
|
|
3
|
+
content: string;
|
|
4
|
+
/** DeepSeek reasoning / chain-of-thought — persisted across turns for continuity */
|
|
5
|
+
reasoning_content?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ToolCallMessage {
|
|
8
|
+
role: 'assistant';
|
|
9
|
+
content: null;
|
|
10
|
+
tool_calls: ToolCall[];
|
|
11
|
+
/** DeepSeek reasoning that led to the tool calls */
|
|
12
|
+
reasoning_content?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ToolResultMessage {
|
|
15
|
+
role: 'tool';
|
|
16
|
+
tool_call_id: string;
|
|
17
|
+
content: string;
|
|
18
|
+
}
|
|
19
|
+
export type Message = TextMessage | ToolCallMessage | ToolResultMessage;
|
|
20
|
+
export interface ToolCall {
|
|
21
|
+
id: string;
|
|
22
|
+
type: 'function';
|
|
23
|
+
function: {
|
|
24
|
+
name: string;
|
|
25
|
+
arguments: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export type StreamChunk = {
|
|
29
|
+
type: 'text_delta';
|
|
30
|
+
text: string;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'reasoning_delta';
|
|
33
|
+
text: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'tool_call_delta';
|
|
36
|
+
index: number;
|
|
37
|
+
id?: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
arguments_delta: string;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'finish';
|
|
42
|
+
finish_reason: 'stop' | 'tool_calls' | 'length';
|
|
43
|
+
};
|
|
44
|
+
export interface ToolDefinition {
|
|
45
|
+
type: 'function';
|
|
46
|
+
function: {
|
|
47
|
+
name: string;
|
|
48
|
+
description: string;
|
|
49
|
+
parameters: Record<string, unknown>;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface ToolResult {
|
|
53
|
+
success: boolean;
|
|
54
|
+
output: string;
|
|
55
|
+
error?: string;
|
|
56
|
+
userRejected?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface Tool {
|
|
59
|
+
definition: ToolDefinition;
|
|
60
|
+
execute(args: Record<string, unknown>): Promise<ToolResult>;
|
|
61
|
+
}
|
|
62
|
+
export interface RequestOptions {
|
|
63
|
+
model: string;
|
|
64
|
+
maxTokens: number;
|
|
65
|
+
/** Omit for DeepSeek reasoner (R1) models — they don't support temperature */
|
|
66
|
+
temperature?: number;
|
|
67
|
+
/** DeepSeek R1 reasoning effort: 'low' | 'medium' | 'high' (default: 'medium') */
|
|
68
|
+
reasoningEffort?: 'low' | 'medium' | 'high';
|
|
69
|
+
/** Nucleus sampling — DeepSeek supports top_p alongside temperature */
|
|
70
|
+
topP?: number;
|
|
71
|
+
/** Penalize token repetition (DeepSeek: -2.0 to 2.0) */
|
|
72
|
+
frequencyPenalty?: number;
|
|
73
|
+
/** Penalize new tokens based on presence so far (DeepSeek: -2.0 to 2.0) */
|
|
74
|
+
presencePenalty?: number;
|
|
75
|
+
tools?: ToolDefinition[];
|
|
76
|
+
signal?: AbortSignal;
|
|
77
|
+
}
|
|
78
|
+
export interface LLMProvider {
|
|
79
|
+
readonly id: string;
|
|
80
|
+
stream(messages: Message[], options: RequestOptions): AsyncIterable<StreamChunk>;
|
|
81
|
+
}
|
|
82
|
+
export interface CodeGruntConfig {
|
|
83
|
+
provider: string;
|
|
84
|
+
model: string;
|
|
85
|
+
maxTokens: number;
|
|
86
|
+
temperature: number;
|
|
87
|
+
apiKey: string;
|
|
88
|
+
baseURL: string;
|
|
89
|
+
/** DeepSeek R1 reasoning effort: 'low' | 'medium' | 'high' */
|
|
90
|
+
reasoningEffort?: 'low' | 'medium' | 'high';
|
|
91
|
+
/** Nucleus sampling */
|
|
92
|
+
topP?: number;
|
|
93
|
+
/** Penalize token repetition */
|
|
94
|
+
frequencyPenalty?: number;
|
|
95
|
+
/** Penalize new tokens based on presence */
|
|
96
|
+
presencePenalty?: number;
|
|
97
|
+
}
|
|
98
|
+
export interface AgentRunOptions {
|
|
99
|
+
task: string;
|
|
100
|
+
cwd: string;
|
|
101
|
+
config: CodeGruntConfig;
|
|
102
|
+
provider: LLMProvider;
|
|
103
|
+
context?: import('./core/context/manager.js').ContextManager;
|
|
104
|
+
/** When provided, replaces the default coding-assistant system prompt.
|
|
105
|
+
* Used by skills to define a completely different role/identity. */
|
|
106
|
+
systemPromptOverride?: string;
|
|
107
|
+
onText?: (text: string) => void;
|
|
108
|
+
onToolCall?: (name: string, args: Record<string, unknown>) => void;
|
|
109
|
+
onToolResult?: (name: string, result: ToolResult) => void;
|
|
110
|
+
signal?: AbortSignal;
|
|
111
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8EAA8E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface BalanceInfo {
|
|
2
|
+
currency: string;
|
|
3
|
+
total_balance: string;
|
|
4
|
+
granted_balance: string;
|
|
5
|
+
topped_up_balance: string;
|
|
6
|
+
}
|
|
7
|
+
interface BalanceResponse {
|
|
8
|
+
is_available: boolean;
|
|
9
|
+
balance_infos: BalanceInfo[];
|
|
10
|
+
}
|
|
11
|
+
export interface DailyUsage {
|
|
12
|
+
[date: string]: {
|
|
13
|
+
inputTokens: number;
|
|
14
|
+
outputTokens: number;
|
|
15
|
+
cacheHitTokens: number;
|
|
16
|
+
cost: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function fetchBalance(apiKey: string, baseURL: string): Promise<BalanceResponse>;
|
|
20
|
+
/** Record a completed API call to local usage log */
|
|
21
|
+
export declare function recordUsage(inputTokens: number, outputTokens: number, cacheHitTokens: number, cost: number): Promise<void>;
|
|
22
|
+
export declare const USD_TO_CNY = 7.25;
|
|
23
|
+
export declare function formatDualCurrency(usdAmount: number): string;
|
|
24
|
+
export declare const PRICING: Record<string, {
|
|
25
|
+
prompt: number;
|
|
26
|
+
completion: number;
|
|
27
|
+
cacheHit: number;
|
|
28
|
+
}>;
|
|
29
|
+
export interface UsageStats {
|
|
30
|
+
inputTokens: number;
|
|
31
|
+
outputTokens: number;
|
|
32
|
+
cacheHitTokens: number;
|
|
33
|
+
cost: number;
|
|
34
|
+
}
|
|
35
|
+
/** Get today's usage summary */
|
|
36
|
+
export declare function getTodayUsage(): Promise<UsageStats>;
|
|
37
|
+
/** Get this month's usage summary */
|
|
38
|
+
export declare function getMonthUsage(): Promise<UsageStats>;
|
|
39
|
+
export declare function printBalanceAndUsage(apiKey: string, baseURL: string, model: string): Promise<void>;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const CONFIG_DIR = join(homedir(), '.codegrunt');
|
|
6
|
+
const USAGE_PATH = join(CONFIG_DIR, 'usage.json');
|
|
7
|
+
// ── Fetch balance from DeepSeek API ───────────────────────────────────────
|
|
8
|
+
export async function fetchBalance(apiKey, baseURL) {
|
|
9
|
+
const url = `${baseURL}/user/balance`;
|
|
10
|
+
const resp = await fetch(url, {
|
|
11
|
+
method: 'GET',
|
|
12
|
+
headers: {
|
|
13
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
if (!resp.ok) {
|
|
18
|
+
const body = await resp.text().catch(() => '');
|
|
19
|
+
throw new Error(`Balance API returned ${resp.status}: ${body || resp.statusText}`);
|
|
20
|
+
}
|
|
21
|
+
return (await resp.json());
|
|
22
|
+
}
|
|
23
|
+
// ── Local usage persistence ───────────────────────────────────────────────
|
|
24
|
+
async function loadUsageFile() {
|
|
25
|
+
try {
|
|
26
|
+
const raw = await readFile(USAGE_PATH, 'utf-8');
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function saveUsageFile(record) {
|
|
34
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
35
|
+
await writeFile(USAGE_PATH, JSON.stringify(record, null, 2), 'utf-8');
|
|
36
|
+
}
|
|
37
|
+
/** Record a completed API call to local usage log */
|
|
38
|
+
export async function recordUsage(inputTokens, outputTokens, cacheHitTokens, cost) {
|
|
39
|
+
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
40
|
+
const month = today.slice(0, 7); // YYYY-MM
|
|
41
|
+
const record = await loadUsageFile();
|
|
42
|
+
if (!record[month])
|
|
43
|
+
record[month] = {};
|
|
44
|
+
if (!record[month][today]) {
|
|
45
|
+
record[month][today] = { inputTokens: 0, outputTokens: 0, cacheHitTokens: 0, cost: 0 };
|
|
46
|
+
}
|
|
47
|
+
record[month][today].inputTokens += inputTokens;
|
|
48
|
+
record[month][today].outputTokens += outputTokens;
|
|
49
|
+
record[month][today].cacheHitTokens += cacheHitTokens;
|
|
50
|
+
record[month][today].cost += cost;
|
|
51
|
+
// Clean up old months (keep only last 6)
|
|
52
|
+
const months = Object.keys(record).sort();
|
|
53
|
+
while (months.length > 6) {
|
|
54
|
+
delete record[months.shift()];
|
|
55
|
+
}
|
|
56
|
+
await saveUsageFile(record);
|
|
57
|
+
}
|
|
58
|
+
// ── Exchange rate: USD → CNY ( RMB ) ─────────────────────────────────────
|
|
59
|
+
export const USD_TO_CNY = 7.25;
|
|
60
|
+
export function formatDualCurrency(usdAmount) {
|
|
61
|
+
const cnyAmount = usdAmount * USD_TO_CNY;
|
|
62
|
+
return `${chalk.yellow(`${usdAmount.toFixed(4)}`)} ${chalk.gray(`(¥${cnyAmount.toFixed(2)} RMB)`)}`;
|
|
63
|
+
}
|
|
64
|
+
// ── DEEPSEEK pricing (USD per 1M tokens) ──────────────────────────────────
|
|
65
|
+
export const PRICING = {
|
|
66
|
+
'deepseek-chat': { prompt: 0.27, completion: 1.10, cacheHit: 0.07 },
|
|
67
|
+
'deepseek-v4-flash': { prompt: 0.27, completion: 1.10, cacheHit: 0.07 },
|
|
68
|
+
'deepseek-v4-pro': { prompt: 0.27, completion: 1.10, cacheHit: 0.07 },
|
|
69
|
+
'deepseek-reasoner': { prompt: 0.55, completion: 2.19, cacheHit: 0.14 },
|
|
70
|
+
};
|
|
71
|
+
function zeroStats() {
|
|
72
|
+
return { inputTokens: 0, outputTokens: 0, cacheHitTokens: 0, cost: 0 };
|
|
73
|
+
}
|
|
74
|
+
/** Get today's usage summary */
|
|
75
|
+
export async function getTodayUsage() {
|
|
76
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
77
|
+
const month = today.slice(0, 7);
|
|
78
|
+
const record = await loadUsageFile();
|
|
79
|
+
const dayData = record[month]?.[today];
|
|
80
|
+
if (!dayData)
|
|
81
|
+
return zeroStats();
|
|
82
|
+
return { ...dayData };
|
|
83
|
+
}
|
|
84
|
+
/** Get this month's usage summary */
|
|
85
|
+
export async function getMonthUsage() {
|
|
86
|
+
const month = new Date().toISOString().slice(0, 7);
|
|
87
|
+
const record = await loadUsageFile();
|
|
88
|
+
const monthData = record[month];
|
|
89
|
+
if (!monthData)
|
|
90
|
+
return zeroStats();
|
|
91
|
+
const result = zeroStats();
|
|
92
|
+
for (const day of Object.values(monthData)) {
|
|
93
|
+
result.inputTokens += day.inputTokens;
|
|
94
|
+
result.outputTokens += day.outputTokens;
|
|
95
|
+
result.cacheHitTokens += day.cacheHitTokens;
|
|
96
|
+
result.cost += day.cost;
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
// ── Display ───────────────────────────────────────────────────────────────
|
|
101
|
+
export async function printBalanceAndUsage(apiKey, baseURL, model) {
|
|
102
|
+
// Fetch balance in parallel with reading local usage
|
|
103
|
+
const [balanceResult, todayUsage, monthUsage] = await Promise.allSettled([
|
|
104
|
+
fetchBalance(apiKey, baseURL),
|
|
105
|
+
getTodayUsage(),
|
|
106
|
+
getMonthUsage(),
|
|
107
|
+
]);
|
|
108
|
+
console.log();
|
|
109
|
+
// ── Balance ─────────────────────────────────────────────────────────
|
|
110
|
+
if (balanceResult.status === 'fulfilled') {
|
|
111
|
+
const balance = balanceResult.value;
|
|
112
|
+
if (balance.is_available && balance.balance_infos.length > 0) {
|
|
113
|
+
console.log(chalk.bold('💰 Account Balance'));
|
|
114
|
+
for (const info of balance.balance_infos) {
|
|
115
|
+
console.log(` ${chalk.gray('Total:')} ${chalk.green(info.total_balance)} ${info.currency}`);
|
|
116
|
+
if (info.granted_balance && info.granted_balance !== '0.00') {
|
|
117
|
+
console.log(` ${chalk.gray('Granted:')} ${chalk.cyan(info.granted_balance)} ${info.currency}`);
|
|
118
|
+
}
|
|
119
|
+
if (info.topped_up_balance && info.topped_up_balance !== '0.00') {
|
|
120
|
+
console.log(` ${chalk.gray('Topped Up:')} ${chalk.cyan(info.topped_up_balance)} ${info.currency}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
console.log();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log(chalk.gray('Balance info not available.\n'));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log(chalk.yellow(`Balance: Failed to fetch — ${balanceResult.reason}\n`));
|
|
131
|
+
}
|
|
132
|
+
// ── Today's usage ───────────────────────────────────────────────────
|
|
133
|
+
console.log(formatUsageSection('📆 Today\'s Usage', todayUsage));
|
|
134
|
+
// ── This month's usage ──────────────────────────────────────────────
|
|
135
|
+
console.log(formatUsageSection('📅 This Month\'s Usage', monthUsage));
|
|
136
|
+
}
|
|
137
|
+
function formatUsageSection(title, result) {
|
|
138
|
+
const lines = [chalk.bold(title)];
|
|
139
|
+
if (result.status === 'rejected') {
|
|
140
|
+
lines.push(chalk.gray(` (not available)`));
|
|
141
|
+
return lines.join('\n') + '\n';
|
|
142
|
+
}
|
|
143
|
+
const stats = result.value;
|
|
144
|
+
if (stats.inputTokens === 0 && stats.outputTokens === 0) {
|
|
145
|
+
lines.push(chalk.gray(` 0 tokens · $0.0000 (¥0.00 RMB)`));
|
|
146
|
+
return lines.join('\n') + '\n';
|
|
147
|
+
}
|
|
148
|
+
const totalTokens = stats.inputTokens + stats.outputTokens;
|
|
149
|
+
lines.push(` ${chalk.gray('Input:')} ${formatNumber(stats.inputTokens)} tokens`);
|
|
150
|
+
lines.push(` ${chalk.gray('Output:')} ${formatNumber(stats.outputTokens)} tokens`);
|
|
151
|
+
if (stats.cacheHitTokens > 0) {
|
|
152
|
+
lines.push(` ${chalk.gray('Cache hits:')} ${formatNumber(stats.cacheHitTokens)} tokens`);
|
|
153
|
+
}
|
|
154
|
+
lines.push(` ${chalk.gray('Total tokens:')} ${formatNumber(totalTokens)} tokens`);
|
|
155
|
+
lines.push(` ${chalk.gray('Cost:')} ${formatDualCurrency(stats.cost)}`);
|
|
156
|
+
return lines.join('\n') + '\n';
|
|
157
|
+
}
|
|
158
|
+
function formatNumber(n) {
|
|
159
|
+
if (n >= 1_000_000)
|
|
160
|
+
return (n / 1_000_000).toFixed(1) + 'M';
|
|
161
|
+
if (n >= 1_000)
|
|
162
|
+
return (n / 1_000).toFixed(1) + 'K';
|
|
163
|
+
return n.toString();
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/utils/billing.ts"],"names":[],"mappings":"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"}
|