Solon v3.9.0

chat - 模型的响应与计费

</> markdown
2026年1月23日 下午4:49:07

在 Solon AI 中,所有的模型调用结果都通过 ChatResponse 接口承载。它不仅包含模型输出的消息,还负责追踪 Token 的消耗情况。

1、响应接口 (ChatResponse)

ChatResponse 统一了同步调用和流式调用的返回结构。针对目前流行的“推理模型”(如 DeepSeek-R1, OpenAI o1),它提供了专门的方法来区分思维链(Thinking)和最终答案。

提示: 对于支持深度思考的模型,推荐使用 getResultContent() 直接获取给用户看的结果,而 getContent() 常用于日志记录或调试分析。

public interface ChatResponse {
    /**
     * 获取配置(只读)
     */
    ChatConfigReadonly getConfig();

    /**
     * 获取选项
     */
    ChatOptions getOptions();

    /**
     * 获取响应数据
     */
    @Nullable
    String getResponseData();

    /**
     * 获取模型
     */
    String getModel();

    /**
     * 获取错误
     */
    @Nullable
    ChatException getError();

    /**
     * 是否有选择
     */
    boolean hasChoices();

    /**
     * 最后一个选择
     */
    @Nullable
    ChatChoice lastChoice();

    /**
     * 获取所有选择
     */
    @Nullable
    List<ChatChoice> getChoices();

    /**
     * 获取消息
     */
    @Nullable
    AssistantMessage getMessage();

    /**
     * 获取聚合消息(流响应完成时可用)
     */
    @Nullable
    AssistantMessage getAggregationMessage();

    /**
     * 是否有消息内容
     */
    boolean hasContent();

    /**
     * 获取消息原始内容
     */
    String getContent();

    /**
     * 获取消息结果内容(清理过思考)
     */
    String getResultContent();

    /**
     * 获取使用情况(完成时,才会有使用情况)
     */
    @Nullable
    AiUsage getUsage();

    /**
     * 是否完成
     */
    boolean isFinished();

    /**
     * 是否为流响应
     */
    boolean isStream();
}

2、计费与使用统计 (AiUsage)

AiUsage 用于记录单次对话消耗的 Token 资源。不同的模型服务商提供的原始 JSON 结构差异很大,Solon AI 将其标准化为三个核心指标。

public class AiUsage {
    private final long promptTokens;
    private final long completionTokens;
    private final long totalTokens;
    private final ONode source;

    public AiUsage(long promptTokens, long completionTokens, long totalTokens, ONode source) {
        this.promptTokens = promptTokens;
        this.completionTokens = completionTokens;
        this.totalTokens = totalTokens;
        this.source = source;
    }

    /**
     * 获取提示语消耗令牌数
     */
    public long promptTokens() {
        return promptTokens;
    }

    /**
     * 获取完成消耗令牌数
     */
    public long completionTokens() {
        return completionTokens;
    }

    /**
     * 获取总消耗令牌数
     */
    public long totalTokens() {
        return totalTokens;
    }

    /**
     * 源数据
     */
    public ONode getSource() {
        return source;
    }
}

3、代码示例

获取清理后的内容

ChatResponse resp = chatModel.call(prompt);

// 自动处理思考过程,只打印结果
System.out.println("Result: " + resp.getResultContent());

// 打印计费信息
AiUsage usage = resp.getUsage();
if (usage != null) {
    System.out.println("Cost Tokens: " + usage.totalTokens());
}

处理原始数据 如果你需要获取厂商特有的计费细节(例如 DeepSeek 的 prompt_cache_hit_tokens):

long cacheHit = resp.getUsage().getSource()
                    .get("usage")
                    .get("prompt_cache_hit_tokens").getLong();