drop table if exists mv_llm_generate_failed;
CREATE TABLE mv_llm_generate_failed (
id BIGINT PRIMARY KEY,
group_id bigint,
group_name varchar,
task_id bigint,
task_name varchar,
provider varchar,
request_url varchar,
request_body jsonb,
response_code int,
response_body jsonb,
exception varchar,
api_key varchar,
elapsed bigint,
status int,
"creator" VARCHAR ( 64 ) DEFAULT '',
"create_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" VARCHAR ( 64 ) DEFAULT '',
"update_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted" SMALLINT DEFAULT 0,
"tenant_id" BIGINT NOT NULL DEFAULT 0
);
package com.vt.mc.qa.proxy;
import java.io.PrintWriter;
import java.io.StringWriter;
import com.litongjava.chat.UniChatClient;
import com.litongjava.chat.UniChatRequest;
import com.litongjava.chat.UniChatResponse;
import com.litongjava.consts.ModelPlatformName;
import com.litongjava.exception.GenerateException;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.manim.dao.MvLlmGenerateFailedDao;
import com.litongjava.manim.dao.MvLlmUsageDao;
import com.litongjava.tio.utils.SystemTimer;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.vt.mc.qa.services.AppConfigUtils;
import com.vt.mc.qa.utils.LarkBotUtils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class UniPredictService {
public UniChatResponse generate(UniChatRequest uniChatRequest) {
String platform = uniChatRequest.getPlatform();
boolean china = AppConfigUtils.isChina();
if (china) {
if (ModelPlatformName.OPENROUTER.equals(platform)) {
String basePrefixUrl = EnvUtils.getStr("OPENROUTER_PROXY_BASE_URL");
uniChatRequest.setApiPrefixUrl(basePrefixUrl);
}
}
for (int i = 0; i < 10; i++) {
try {
long currentTime = SystemTimer.currTime;
UniChatResponse uniChatResponse = UniChatClient.generate(uniChatRequest);
long endTime = SystemTimer.currTime;
Aop.get(MvLlmUsageDao.class).saveUsage(uniChatRequest, uniChatResponse, (endTime - currentTime));
return uniChatResponse;
} catch (GenerateException e) {
log.error(e.getMessage(), e);
String urlPerfix = e.getUrlPerfix();
String requestJson = e.getRequestBody();
Integer statusCode = e.getStatusCode();
String responseBody = e.getResponseBody();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String stackTrace = sw.toString();
try {
Aop.get(MvLlmGenerateFailedDao.class).save(uniChatRequest, e, stackTrace);
} catch (Exception e1) {
log.error(e.getMessage(), e1);
}
String name = "tio-boot";
String warningName = "LlmOcrService Failed to request ExchangeToken:" + uniChatRequest.getTaskName();
LarkBotUtils.sendException(name, warningName, urlPerfix, requestJson, statusCode, responseBody, stackTrace);
}
}
return null;
}
}
package com.litongjava.manim.dao;
import java.util.List;
import com.litongjava.chat.UniChatMessage;
import com.litongjava.chat.UniChatRequest;
import com.litongjava.chat.UniChatResponse;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.db.base.DbBase;
import com.litongjava.gemini.GeminiChatRequest;
import com.litongjava.gemini.GeminiChatResponse;
import com.litongjava.manim.consts.MvTableName;
import com.litongjava.openai.chat.ChatResponseMessage;
import com.litongjava.tio.utils.json.JsonUtils;
import com.litongjava.tio.utils.snowflake.SnowflakeIdUtils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MvLlmUsageDao extends DbBase {
@Override
public String getTableName() {
return MvTableName.mv_llm_usage;
}
public void saveUsage(UniChatRequest uniChatRequest, UniChatResponse uniChatResponse, long elapsed) {
if (uniChatResponse == null) {
log.warn("Skipping saveUsage for task {} as generated response is null", uniChatRequest.getTaskId());
return;
}
String systemPrompt = uniChatRequest.getSystemPrompt();
List<UniChatMessage> messages = uniChatRequest.getMessages();
String skipNullJson = JsonUtils.toSkipNullJson(messages);
Row row = Row.by("id", SnowflakeIdUtils.id()).set("group_id", uniChatRequest.getGroupId())
.set("group_name", uniChatRequest.getGroupName())
.set("task_id", uniChatRequest.getTaskId()).set("task_name", uniChatRequest.getTaskName())
.set("provider", uniChatRequest.getPlatform()).set("api_key", uniChatRequest.getApiKey())
.set("model", uniChatRequest.getModel())
.set("usage", uniChatResponse.getUsage() != null ? JsonUtils.toSkipNullJson(uniChatResponse.getUsage()) : null)
.set("system_prompt", systemPrompt).set("messages", skipNullJson)
.set("elapsed", elapsed);
try {
ChatResponseMessage message = uniChatResponse.getMessage();
if (message != null) {
String content = message.getContent();
row.set("content", content);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
try {
super.save(row);
log.debug("Saved LLM usage for task: {}", uniChatRequest.getTaskId());
} catch (Exception e) {
log.error("Failed to save LLM usage for task: {}", uniChatRequest.getTaskId(), e);
}
}
}
package com.litongjava.manim.dao;
import com.litongjava.chat.UniChatRequest;
import com.litongjava.db.DbJsonObject;
import com.litongjava.db.activerecord.Row;
import com.litongjava.db.base.DbBase;
import com.litongjava.exception.GenerateException;
import com.litongjava.manim.consts.MvTableName;
import com.litongjava.tio.utils.snowflake.SnowflakeIdUtils;
public class MvLlmGenerateFailedDao extends DbBase {
@Override
public String getTableName() {
return MvTableName.mv_llm_generate_failed;
}
public boolean save(UniChatRequest uniChatRequest, GenerateException e, String stackTrace) {
Long groupId = uniChatRequest.getGroupId();
String groupName = uniChatRequest.getGroupName();
Long taskId = uniChatRequest.getTaskId();
String taskName = uniChatRequest.getTaskName();
String apiKey = uniChatRequest.getApiKey();
String provider = e.getProvider();
String urlPerfix = e.getUrlPerfix();
String requestJson = e.getRequestBody();
Integer statusCode = e.getStatusCode();
String responseBody = e.getResponseBody();
return this.save(groupId, groupName, taskId, taskName, apiKey, provider, urlPerfix, requestJson, statusCode,
responseBody, stackTrace, e.getElapsed());
}
public boolean save(Long groupId, String groupName, Long taskId, String taskName, String apiKey, String provider,
String urlPerfix, String requestJson, Integer statusCode, String responseBody, String stackTrace,Long elapsed) {
Row row = Row.by("id", SnowflakeIdUtils.id()).set("group_id", groupId).set("group_name", groupName)
.set("task_id", taskId).set("task_name", taskName)
.set("api_key", apiKey).set("provider", provider)
.set("request_url", urlPerfix).set("request_body", new DbJsonObject(requestJson))
.set("response_code", statusCode).set("response_body", new DbJsonObject(responseBody))
.set("exception", stackTrace).set("elapsed", elapsed);
return super.save(row);
}
}