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

### 1、响应接口 (ChatResponse)

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


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

```java
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 将其标准化为三个核心指标。


```java
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、代码示例

获取清理后的内容


```java
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）：

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