43 lines
2.3 KiB
Java
43 lines
2.3 KiB
Java
package com.company.agentfoundation.service;
|
|
import com.company.agentfoundation.api.DeepseekChatRequest;
|
|
import com.company.agentfoundation.api.DeepseekChatResponse;
|
|
import com.company.agentfoundation.api.DeepseekClient;
|
|
import com.company.agentfoundation.domain.ChatRequest;
|
|
import com.company.agentfoundation.domain.ChatResponse;
|
|
import com.company.agentfoundation.security.AgentContext;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.stereotype.Service;
|
|
import java.time.Instant;
|
|
import java.util.UUID;
|
|
@Service
|
|
public class ChatService {
|
|
private static final Logger log = LoggerFactory.getLogger(ChatService.class);
|
|
private final DeepseekClient deepseekClient;
|
|
private final ModelRouter modelRouter;
|
|
public ChatService(DeepseekClient deepseekClient, ModelRouter modelRouter) { this.deepseekClient = deepseekClient; this.modelRouter = modelRouter; }
|
|
public ChatResponse chat(AgentContext context, ChatRequest request) {
|
|
String traceId = UUID.randomUUID().toString();
|
|
String model = modelRouter.routeModel(context.agentId(), request.model());
|
|
log.info("chat start traceId={} agentId={} model={} messageCount={}", traceId, context.agentId(), model, request.messages() == null ? 0 : request.messages().size());
|
|
DeepseekChatResponse resp = deepseekClient.chat(new DeepseekChatRequest(
|
|
model,
|
|
request.messages().stream().map(m -> new DeepseekChatRequest.Message(m.role(), m.content())).toList(),
|
|
request.temperature(),
|
|
false));
|
|
String content = "";
|
|
if (resp != null && resp.choices() != null && !resp.choices().isEmpty() && resp.choices().get(0).message() != null) content = resp.choices().get(0).message().content();
|
|
ChatResponse.Usage usage = null;
|
|
if (resp != null && resp.usage() != null) usage = new ChatResponse.Usage(resp.usage().prompt_tokens(), resp.usage().completion_tokens(), resp.usage().total_tokens());
|
|
log.info("chat success traceId={} totalTokens={} replyPreview={}", traceId, usage == null ? null : usage.totalTokens(), preview(content));
|
|
return new ChatResponse(traceId, context.agentId(), model, content, usage, Instant.now());
|
|
}
|
|
|
|
private String preview(String text) {
|
|
if (text == null || text.isBlank()) {
|
|
return "";
|
|
}
|
|
return text.length() <= 80 ? text : text.substring(0, 80) + "...";
|
|
}
|
|
}
|