mirror of
https://gitee.com/free/claude-code.git
synced 2026-10-26 09:34:35 +08:00
新增基础设施: - TokenTracker: 真实Token使用量追踪和费用估算(按模型定价) - SkillLoader: .claude/skills/ 扫描加载,支持YAML frontmatter元数据 - GitContext: Git分支/状态/最近提交收集,注入系统提示词 新增命令 (4个): - /init: 项目CLAUDE.md初始化向导,自动检测项目类型(Maven/Gradle/Node/Python等) - /status: 会话状态仪表板(模型、Token、内存、运行时间等) - /context: 上下文概览(CLAUDE.md、Skills、Git、系统提示词大小) - /config: 配置查看/设置(支持model快捷切换和API key显示) 增强命令 (3个): - /cost: 从占位→真实Token统计,显示input/output/cache tokens和费用 - /model: 支持快捷名称切换(sonnet/opus/haiku),显示可用模型列表 - /compact: 增强显示压缩前后消息数和Token使用量 系统提示词增强: - 集成Skills摘要和Git上下文到系统提示词 - 新增Shell环境信息和更详细的Guidelines 命令总数: 6 → 10, 工具总数: 11 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
85 lines
2.9 KiB
Java
85 lines
2.9 KiB
Java
package com.claudecode.command.impl;
|
|
|
|
import com.claudecode.command.CommandContext;
|
|
import com.claudecode.command.SlashCommand;
|
|
import com.claudecode.console.AnsiStyle;
|
|
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* /model 命令 —— 显示或切换当前 AI 模型。
|
|
* <p>
|
|
* 支持查看当前模型信息和切换到其他模型。
|
|
*/
|
|
public class ModelCommand implements SlashCommand {
|
|
|
|
private static final Map<String, String> AVAILABLE_MODELS = Map.of(
|
|
"sonnet", "claude-sonnet-4-20250514",
|
|
"opus", "claude-opus-4-20250514",
|
|
"haiku", "claude-haiku-4-20250514",
|
|
"sonnet-3.5", "claude-3-5-sonnet-20241022"
|
|
);
|
|
|
|
@Override
|
|
public String name() {
|
|
return "model";
|
|
}
|
|
|
|
@Override
|
|
public String description() {
|
|
return "Show or switch AI model";
|
|
}
|
|
|
|
@Override
|
|
public List<String> aliases() {
|
|
return List.of("m");
|
|
}
|
|
|
|
@Override
|
|
public String execute(String args, CommandContext context) {
|
|
if (args == null || args.isBlank()) {
|
|
return showCurrentModel(context);
|
|
}
|
|
|
|
return switchModel(args.strip(), context);
|
|
}
|
|
|
|
private String showCurrentModel(CommandContext context) {
|
|
String currentModel = context.agentLoop().getTokenTracker().getModelName();
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("\n");
|
|
sb.append(AnsiStyle.bold(" 🤖 Model Configuration\n"));
|
|
sb.append(" ").append("─".repeat(40)).append("\n\n");
|
|
sb.append(" Current: ").append(AnsiStyle.cyan(currentModel)).append("\n\n");
|
|
|
|
sb.append(AnsiStyle.dim(" Available shortcuts:\n"));
|
|
for (var entry : AVAILABLE_MODELS.entrySet()) {
|
|
String marker = entry.getValue().equals(currentModel) ? " ◀" : "";
|
|
sb.append(AnsiStyle.dim(" " + entry.getKey() + " → " + entry.getValue() + marker)).append("\n");
|
|
}
|
|
sb.append("\n");
|
|
sb.append(AnsiStyle.dim(" Usage: /model <name> (e.g., /model opus, /model claude-3-5-sonnet-20241022)"));
|
|
|
|
return sb.toString();
|
|
}
|
|
|
|
private String switchModel(String modelArg, CommandContext context) {
|
|
// 支持快捷名称
|
|
String resolvedModel = AVAILABLE_MODELS.getOrDefault(modelArg.toLowerCase(), modelArg);
|
|
|
|
String oldModel = context.agentLoop().getTokenTracker().getModelName();
|
|
context.agentLoop().getTokenTracker().setModel(resolvedModel);
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append(AnsiStyle.green(" ✅ Model switched")).append("\n");
|
|
sb.append(" From: ").append(AnsiStyle.dim(oldModel)).append("\n");
|
|
sb.append(" To: ").append(AnsiStyle.cyan(resolvedModel)).append("\n");
|
|
sb.append(AnsiStyle.dim(" Note: Changes take effect on next API call."));
|
|
sb.append("\n").append(AnsiStyle.dim(" Note: Runtime model switch only updates pricing. Actual API model is set in application.yml."));
|
|
|
|
return sb.toString();
|
|
}
|
|
}
|