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) + "..."; } }