(improvement)(auth) Optimize the code to support configurable token timeout duration, with a default value set to 2 hours. (#1077)

This commit is contained in:
lexluo09
2024-06-02 00:08:24 +08:00
committed by GitHub
parent 2da0eb126a
commit 78d8e652cd
6 changed files with 73 additions and 233 deletions

View File

@@ -33,4 +33,6 @@ public class AuthenticationConfig {
@Value("${authentication.app.signature:signature}")
private String signature;
@Value("${authentication.token.timeout:7200000}")
private Long tokenTimeout;
}

View File

@@ -19,10 +19,6 @@ public class UserConstants {
public static final String TOKEN_CREATE_TIME = "token_create_time";
public static final String TOKEN_PREFIX = "Bearer";
public static final Long TOKEN_TIME_OUT = 25920000000L;
public static final String INTERNAL = "internal";
}

View File

@@ -4,12 +4,12 @@ import static com.tencent.supersonic.auth.api.authentication.constant.UserConsta
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_CREATE_TIME;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_IS_ADMIN;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_PREFIX;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_TIME_OUT;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_DISPLAY_NAME;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_EMAIL;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_ID;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_NAME;
import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_PASSWORD;
import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword;
@@ -48,14 +48,13 @@ public class UserTokenUtils {
}
public String generateAdminToken() {
Map<String, Object> claims = new HashMap<>(5);
claims.put(TOKEN_USER_ID, "1");
claims.put(TOKEN_USER_NAME, "admin");
claims.put(TOKEN_USER_PASSWORD, "admin");
claims.put(TOKEN_USER_DISPLAY_NAME, "admin");
claims.put(TOKEN_CREATE_TIME, System.currentTimeMillis());
claims.put(TOKEN_IS_ADMIN, 1);
return generate(claims);
UserWithPassword admin = new UserWithPassword("admin");
admin.setId(1L);
admin.setName("admin");
admin.setPassword("admin");
admin.setDisplayName("admin");
admin.setIsAdmin(1);
return generateToken(admin);
}
public User getUser(HttpServletRequest request) {
@@ -107,13 +106,15 @@ public class UserTokenUtils {
}
private String toTokenString(Map<String, Object> claims) {
long expiration = Long.parseLong(claims.get(TOKEN_CREATE_TIME) + "") + TOKEN_TIME_OUT;
Long tokenTimeout = authenticationConfig.getTokenTimeout();
long expiration = Long.parseLong(claims.get(TOKEN_CREATE_TIME) + "") + tokenTimeout;
Date expirationDate = new Date(expiration);
SignatureAlgorithm.valueOf(TOKEN_ALGORITHM);
return Jwts.builder()
.setClaims(claims)
.setSubject(claims.get(TOKEN_USER_NAME).toString())
.setExpiration(new Date(expiration))
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.valueOf(TOKEN_ALGORITHM),
authenticationConfig.getTokenSecret().getBytes(StandardCharsets.UTF_8))
.compact();

View File

@@ -22,6 +22,7 @@ import java.util.Collections;
import java.util.List;
public class FullOpenAiChatModel implements ChatLanguageModel, TokenCountEstimator {
private final OpenAiClient client;
private final String modelName;
private final Double temperature;
@@ -34,36 +35,36 @@ public class FullOpenAiChatModel implements ChatLanguageModel, TokenCountEstimat
private final Tokenizer tokenizer;
public FullOpenAiChatModel(String baseUrl, String apiKey, String modelName, Double temperature,
Double topP, List<String> stop, Integer maxTokens, Double presencePenalty,
Double frequencyPenalty, Duration timeout, Integer maxRetries, Proxy proxy,
Boolean logRequests, Boolean logResponses, Tokenizer tokenizer) {
baseUrl = (String) Utils.getOrDefault(baseUrl, "https://api.openai.com/v1");
Double topP, List<String> stop, Integer maxTokens, Double presencePenalty,
Double frequencyPenalty, Duration timeout, Integer maxRetries, Proxy proxy,
Boolean logRequests, Boolean logResponses, Tokenizer tokenizer) {
baseUrl = Utils.getOrDefault(baseUrl, "https://api.openai.com/v1");
if ("demo".equals(apiKey)) {
baseUrl = "http://langchain4j.dev/demo/openai/v1";
}
timeout = (Duration) Utils.getOrDefault(timeout, Duration.ofSeconds(60L));
timeout = Utils.getOrDefault(timeout, Duration.ofSeconds(60L));
this.client = OpenAiClient.builder().openAiApiKey(apiKey)
.baseUrl(baseUrl).callTimeout(timeout).connectTimeout(timeout)
.readTimeout(timeout).writeTimeout(timeout).proxy(proxy)
.logRequests(logRequests).logResponses(logResponses).build();
this.modelName = (String) Utils.getOrDefault(modelName, "gpt-3.5-turbo");
this.temperature = (Double) Utils.getOrDefault(temperature, 0.7D);
.baseUrl(baseUrl).callTimeout(timeout).connectTimeout(timeout)
.readTimeout(timeout).writeTimeout(timeout).proxy(proxy)
.logRequests(logRequests).logResponses(logResponses).build();
this.modelName = Utils.getOrDefault(modelName, "gpt-3.5-turbo");
this.temperature = Utils.getOrDefault(temperature, 0.7D);
this.topP = topP;
this.stop = stop;
this.maxTokens = maxTokens;
this.presencePenalty = presencePenalty;
this.frequencyPenalty = frequencyPenalty;
this.maxRetries = (Integer) Utils.getOrDefault(maxRetries, 3);
this.tokenizer = (Tokenizer) Utils.getOrDefault(tokenizer, new OpenAiTokenizer(this.modelName));
this.maxRetries = Utils.getOrDefault(maxRetries, 3);
this.tokenizer = Utils.getOrDefault(tokenizer, new OpenAiTokenizer(this.modelName));
}
public Response<AiMessage> generate(List<ChatMessage> messages) {
return this.generate(messages, (List) null, (ToolSpecification) null);
return this.generate(messages, null, null);
}
public Response<AiMessage> generate(List<ChatMessage> messages, List<ToolSpecification> toolSpecifications) {
return this.generate(messages, toolSpecifications, (ToolSpecification) null);
return this.generate(messages, toolSpecifications, null);
}
public Response<AiMessage> generate(List<ChatMessage> messages, ToolSpecification toolSpecification) {
@@ -71,8 +72,8 @@ public class FullOpenAiChatModel implements ChatLanguageModel, TokenCountEstimat
}
private Response<AiMessage> generate(List<ChatMessage> messages,
List<ToolSpecification> toolSpecifications,
ToolSpecification toolThatMustBeExecuted) {
List<ToolSpecification> toolSpecifications,
ToolSpecification toolThatMustBeExecuted) {
Builder requestBuilder = null;
if (modelName.contains(ChatModel.ZHIPU.toString()) || modelName.contains(ChatModel.ALI.toString())) {
requestBuilder = ChatCompletionRequest.builder()
@@ -107,15 +108,12 @@ public class FullOpenAiChatModel implements ChatLanguageModel, TokenCountEstimat
return this.tokenizer.estimateTokenCountInMessages(messages);
}
public static FullOpenAiChatModel withApiKey(String apiKey) {
return builder().apiKey(apiKey).build();
}
public static FullOpenAiChatModel.FullOpenAiChatModelBuilder builder() {
return new FullOpenAiChatModel.FullOpenAiChatModelBuilder();
}
public static class FullOpenAiChatModelBuilder {
private String baseUrl;
private String apiKey;
private String modelName;

View File

@@ -1,32 +1,18 @@
package dev.langchain4j.model.openai;
import dev.ai4j.openai4j.chat.ChatCompletionChoice;
import dev.ai4j.openai4j.chat.ChatCompletionResponse;
import dev.ai4j.openai4j.chat.Function;
import dev.ai4j.openai4j.chat.FunctionCall;
import dev.ai4j.openai4j.chat.Message;
import dev.ai4j.openai4j.chat.Parameters;
import dev.ai4j.openai4j.chat.Role;
import dev.ai4j.openai4j.shared.Usage;
import dev.langchain4j.agent.tool.ToolExecutionRequest;
import dev.langchain4j.agent.tool.ToolParameters;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.ToolExecutionResultMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.ChatModel;
import dev.langchain4j.model.output.TokenUsage;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
public class ImproveInternalOpenAiHelper {
static final String OPENAI_URL = "https://api.openai.com/v1";
static final String OPENAI_DEMO_API_KEY = "demo";
static final String OPENAI_DEMO_URL = "http://langchain4j.dev/demo/openai/v1";
public ImproveInternalOpenAiHelper() {
}
@@ -77,35 +63,4 @@ public class ImproveInternalOpenAiHelper {
}
}
public static List<Function> toFunctions(Collection<ToolSpecification> toolSpecifications) {
return (List) toolSpecifications.stream().map(ImproveInternalOpenAiHelper::toFunction)
.collect(Collectors.toList());
}
private static Function toFunction(ToolSpecification toolSpecification) {
return Function.builder().name(toolSpecification.name())
.description(toolSpecification.description())
.parameters(toOpenAiParameters(toolSpecification.parameters())).build();
}
private static Parameters toOpenAiParameters(ToolParameters toolParameters) {
return toolParameters == null ? Parameters.builder().build() : Parameters.builder()
.properties(toolParameters.properties()).required(toolParameters.required()).build();
}
public static AiMessage aiMessageFrom(ChatCompletionResponse response) {
if (response.content() != null) {
return AiMessage.aiMessage(response.content());
} else {
FunctionCall functionCall = ((ChatCompletionChoice) response.choices().get(0)).message().functionCall();
ToolExecutionRequest toolExecutionRequest = ToolExecutionRequest.builder()
.name(functionCall.name()).arguments(functionCall.arguments()).build();
return AiMessage.aiMessage(toolExecutionRequest);
}
}
public static TokenUsage tokenUsageFrom(Usage openAiUsage) {
return openAiUsage == null ? null : new TokenUsage(openAiUsage.promptTokens(),
openAiUsage.completionTokens(), openAiUsage.totalTokens());
}
}

194
webapp/pnpm-lock.yaml generated
View File

@@ -427,8 +427,8 @@ importers:
specifier: ^2.3.3
version: 2.3.4
supersonic-chat-sdk:
specifier: ^1.1.7
version: 1.1.7(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1)
specifier: 0.0.0
version: link:../chat-sdk
supersonic-insights-flow-components:
specifier: ^1.4.9
version: 1.4.9(classnames@2.5.1)(moment@2.30.1)(rc-field-form@1.44.0)(reflect-metadata@0.1.14)
@@ -7185,18 +7185,6 @@ packages:
- react-router
dev: true
/@umijs/bundler-utils@3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0):
resolution: {integrity: sha512-irJUU/eWa2GG6JCkz172lMi+jiq7ZXatE2N7Tq/lokZUYu9R9BRaRN7dphgBlAUfOP3aBtjx51/5yZdYAeW0yQ==}
dependencies:
'@umijs/babel-preset-umi': 3.5.41
'@umijs/types': 3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0)
'@umijs/utils': 3.5.41
transitivePeerDependencies:
- react
- react-dom
- react-router
dev: true
/@umijs/bundler-utils@4.2.5:
resolution: {integrity: sha512-Hj8Uda4E/Bf9aIWLfMiixxjFRRXaVDQDU1MbUf7HhDtpgmfeQfIfWhzWRat9B8TfPLDA4KI3yW1EPdlNHGBiSA==}
dependencies:
@@ -7260,31 +7248,6 @@ packages:
- react-router
dev: true
/@umijs/bundler-webpack@3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0):
resolution: {integrity: sha512-n4HIrDUE3QfN5xSTWJlRz5wzsnWggzRJhEDJZ6l23BWiwWasFW6QMGCnFWLwO93ei273LovylD5vZhI221tBtQ==}
hasBin: true
dependencies:
'@umijs/bundler-utils': 3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0)
'@umijs/case-sensitive-paths-webpack-plugin': 1.0.1
'@umijs/deps': 3.5.41
'@umijs/types': 3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0)
'@umijs/utils': 3.5.41
jest-worker: 26.6.2
node-libs-browser: 2.2.1
normalize-url: 1.9.1
postcss: 7.0.32
postcss-flexbugs-fixes: 4.2.1
postcss-loader: 3.0.0
postcss-preset-env: 6.7.0
postcss-safe-parser: 4.0.2
terser: 5.14.2
webpack-chain: 6.5.1
transitivePeerDependencies:
- react
- react-dom
- react-router
dev: true
/@umijs/bundler-webpack@4.2.5(typescript@4.9.5)(webpack@5.91.0):
resolution: {integrity: sha512-kABzFUTbkgccf2XwMiKEEVyfBuvZZSnFFU7E1uu2OQg3x7rv5dnF9yrMGwvul4I0KClPZAabd5eaf7WuKYyBAA==}
hasBin: true
@@ -7729,7 +7692,7 @@ packages:
umi: 3.x
dependencies:
fast-deep-equal: 3.1.1
umi: 3.5.41(react-router@6.23.1)
umi: 3.5.41(react-router@5.2.0)
dev: true
/@umijs/plugin-run@4.2.5:
@@ -7861,7 +7824,7 @@ packages:
mime: 1.4.1
react: 16.14.0
react-refresh: 0.10.0
react-router: 5.2.0(react@16.14.0)
react-router: 5.2.0(react@18.3.1)
react-router-config: 5.1.1(react-router@5.2.0)(react@16.14.0)
react-router-dom: 5.2.0(react@16.14.0)
regenerator-runtime: 0.13.5
@@ -7999,23 +7962,6 @@ packages:
- react-router
dev: true
/@umijs/renderer-react@3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0):
resolution: {integrity: sha512-DmExaziU84uFXv09gYXpFk/tHB+mjINUD8YmYULjbQ+QQA9so2zkxNSv9gYy5hXNepheUMd+uriV/qUB6HNBVg==}
peerDependencies:
react: 16.x || 17.x
react-dom: 16.x || 17.x
dependencies:
'@types/react': 16.14.60
'@types/react-dom': 16.9.24
'@types/react-router-config': 5.0.2
'@umijs/runtime': 3.5.41(react@16.14.0)
react: 16.14.0
react-dom: 16.14.0(react@16.14.0)
react-router-config: 5.1.1(react-router@6.23.1)(react@16.14.0)
transitivePeerDependencies:
- react-router
dev: true
/@umijs/renderer-react@4.2.5(react-dom@18.1.0)(react@18.1.0):
resolution: {integrity: sha512-WuV2ye/A9NY5eHQ9VH6pD1MEgeuBbn18AU9dpJku5gaQ0kigPIMfMLVuon1Cvwc2XA9ab+5HcpwsJiAqrde3EQ==}
peerDependencies:
@@ -8055,7 +8001,7 @@ packages:
express: 4.19.2
lodash: 4.17.21
prettier: 2.8.8
umi: 3.5.41(react-router@6.23.1)
umi: 3.5.41(react-router@5.2.0)
transitivePeerDependencies:
- supports-color
dev: true
@@ -8138,22 +8084,6 @@ packages:
- react-router
dev: true
/@umijs/types@3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0):
resolution: {integrity: sha512-pxvLiQ99EL8Yu98F/ZMojG9ukDptC315cnxSnRYOdS34F57oiIgW0Zoi0TrKlA0pVIQxC2MXzyQwy+HfDmB23Q==}
dependencies:
'@umijs/babel-preset-umi': 3.5.41
'@umijs/core': 3.5.41
'@umijs/deps': 3.5.41
'@umijs/renderer-react': 3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0)
'@umijs/server': 3.5.41
'@umijs/utils': 3.5.41
webpack-chain: 6.5.1
transitivePeerDependencies:
- react
- react-dom
- react-router
dev: true
/@umijs/ui@3.0.1:
resolution: {integrity: sha512-zcz37AJH0xt/6XVVbyO/hmsK9Hq4vH23HZ4KYVi5A8rbM9KeJkJigTS7ELOdArawZhVNGe+h3a5Oixs4a2QsWw==}
dev: true
@@ -10410,7 +10340,6 @@ packages:
/core-js@3.6.5:
resolution: {integrity: sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==}
deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
requiresBuild: true
dev: true
@@ -17757,6 +17686,19 @@ packages:
tiny-warning: 1.0.3
dev: true
/mini-create-react-context@0.4.1(prop-types@15.8.1)(react@18.3.1):
resolution: {integrity: sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
peerDependencies:
prop-types: ^15.0.0
react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
dependencies:
'@babel/runtime': 7.24.5
prop-types: 15.8.1
react: 18.3.1
tiny-warning: 1.0.3
dev: true
/mini-css-extract-plugin@2.9.0(webpack@5.91.0):
resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==}
engines: {node: '>= 12.13.0'}
@@ -18154,7 +18096,7 @@ packages:
dev: true
/normalize-url@1.9.1:
resolution: {integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==}
resolution: {integrity: sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=}
engines: {node: '>=4'}
dependencies:
object-assign: 4.1.1
@@ -22768,28 +22710,6 @@ packages:
/react-lifecycles-compat@3.0.4:
resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
/react-markdown@9.0.1(@types/react@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==}
peerDependencies:
'@types/react': '>=18'
react: '>=18'
dependencies:
'@types/hast': 3.0.4
'@types/react': 18.3.1
devlop: 1.1.0
hast-util-to-jsx-runtime: 2.3.0
html-url-attributes: 3.0.0
mdast-util-to-hast: 13.1.0
react: 18.3.1
remark-parse: 11.0.0
remark-rehype: 11.1.0
unified: 11.0.4
unist-util-visit: 5.0.0
vfile: 6.0.1
transitivePeerDependencies:
- supports-color
dev: false
/react-markdown@9.0.1(@types/react@18.3.2)(react@18.3.1):
resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==}
peerDependencies:
@@ -22949,18 +22869,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.5
react: 16.14.0
react-router: 5.2.0(react@16.14.0)
dev: true
/react-router-config@5.1.1(react-router@6.23.1)(react@16.14.0):
resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==}
peerDependencies:
react: '>=15'
react-router: '>=5'
dependencies:
'@babel/runtime': 7.24.5
react: 16.14.0
react-router: 6.23.1(react@18.3.1)
react-router: 5.2.0(react@18.3.1)
dev: true
/react-router-dom@4.3.1(react@18.3.1):
@@ -23074,6 +22983,24 @@ packages:
tiny-warning: 1.0.3
dev: true
/react-router@5.2.0(react@18.3.1):
resolution: {integrity: sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==}
peerDependencies:
react: '>=15'
dependencies:
'@babel/runtime': 7.24.5
history: 4.10.1
hoist-non-react-statics: 3.3.2
loose-envify: 1.4.0
mini-create-react-context: 0.4.1(prop-types@15.8.1)(react@18.3.1)
path-to-regexp: 1.8.0
prop-types: 15.8.1
react: 18.3.1
react-is: 16.13.1
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
dev: true
/react-router@6.23.1(react@18.3.1):
resolution: {integrity: sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==}
engines: {node: '>=14.0.0'}
@@ -25557,44 +25484,6 @@ packages:
copy-anything: 3.0.5
dev: true
/supersonic-chat-sdk@1.1.7(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-MLMPN2c54hQetwJ+qXkOsWQ2IHDCuo3rAj6r7p+rknzDZSmMPF8yHXD2XcADmWJCXus8LKSwThUnuz51L7OqgA==}
engines: {node: '>=16'}
peerDependencies:
react: '>=16.8.0'
react-dom: '>=16.8.0'
dependencies:
'@ant-design/icons': 4.8.3(react-dom@18.3.1)(react@18.3.1)
'@uiw/react-watermark': 0.0.5(react-dom@18.3.1)(react@18.3.1)
ahooks: 3.7.11(react@18.3.1)
antd: 5.11.2(moment@2.30.1)(react-dom@18.3.1)(react@18.3.1)
axios: 0.21.4
classnames: 2.5.1
dayjs: 1.11.11
echarts: 5.5.0
github-markdown-css: 5.5.1
highlight.js: 11.9.0
lodash: 4.17.21
moment: 2.30.1
react: 18.3.1
react-copy-to-clipboard: 5.1.0(react@18.3.1)
react-dom: 18.3.1(react@18.3.1)
react-grid-layout: 1.4.4(react-dom@18.3.1)(react@18.3.1)
react-markdown: 9.0.1(@types/react@18.3.1)(react@18.3.1)
react-spinners: 0.13.8(react-dom@18.3.1)(react@18.3.1)
react-syntax-highlighter: 15.5.0(react@18.3.1)
rehype-highlight: 7.0.0
remark-gfm: 4.0.0
sql-formatter: 2.3.4
tslib: 2.6.2
transitivePeerDependencies:
- '@types/react'
- date-fns
- debug
- luxon
- supports-color
dev: false
/supersonic-insights-flow-components@1.4.9(classnames@2.5.1)(moment@2.30.1)(rc-field-form@1.44.0)(reflect-metadata@0.1.14):
resolution: {integrity: sha512-nY7sFY0EMtbs4KckudLTdLrUnq5vI2Gt78uVLgTfMSdSlV2PfG1bQlddp5ulAoyedZ3J7gMJlaWuqaUlRiLw8A==}
dependencies:
@@ -26455,16 +26344,16 @@ packages:
slash2: 2.0.0
dev: true
/umi@3.5.41(react-router@6.23.1):
/umi@3.5.41(react-router@5.2.0):
resolution: {integrity: sha512-sjgfFGC3E5jG5Cn8pXdwODDgPW1hnlkn24f7+onNnNdq77syuc4s3R5z7BKQHbjiWtVVIV1VOFMYE9JsJYnOPQ==}
hasBin: true
dependencies:
'@umijs/bundler-webpack': 3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0)
'@umijs/bundler-webpack': 3.5.41(react-dom@16.14.0)(react-router@5.2.0)(react@16.14.0)
'@umijs/core': 3.5.41
'@umijs/deps': 3.5.41
'@umijs/preset-built-in': 3.5.41(react-dom@16.14.0)(react@16.14.0)
'@umijs/runtime': 3.5.41(react@16.14.0)
'@umijs/types': 3.5.41(react-dom@16.14.0)(react-router@6.23.1)(react@16.14.0)
'@umijs/types': 3.5.41(react-dom@16.14.0)(react-router@5.2.0)(react@16.14.0)
'@umijs/utils': 3.5.41
react: 16.14.0
react-dom: 16.14.0(react@16.14.0)
@@ -27101,7 +26990,6 @@ packages:
/webpack-chain@6.5.1:
resolution: {integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==}
engines: {node: '>=8'}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
dependencies:
deepmerge: 1.5.2
javascript-stringify: 2.1.0