for README.md

This commit is contained in:
skyfire 2025-12-31 22:57:20 +08:00
parent e4caa7a856
commit 30f9e9c782
6 changed files with 815 additions and 26 deletions

View file

@ -16,7 +16,12 @@ import com.alibaba.qwen.code.cli.transport.process.ProcessTransport;
import com.alibaba.qwen.code.cli.utils.MyConcurrentUtils;
import com.alibaba.qwen.code.cli.utils.Timeout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class QwenCodeCli {
private static final Logger log = LoggerFactory.getLogger(QwenCodeCli.class);
public static List<String> simpleQuery(String prompt) {
final List<String> response = new ArrayList<>();
MyConcurrentUtils.runAndWait(() -> simpleQuery(prompt, response::add), Timeout.TIMEOUT_30_MINUTES);
@ -24,7 +29,7 @@ public class QwenCodeCli {
}
public static void simpleQuery(String prompt, Consumer<String> messageConsumer) {
Session session = newSessionWithProcessTransport(new TransportOptions());
Session session = newSession(new TransportOptions());
try {
session.sendPrompt(prompt, new SessionEventSimpleConsumers() {
@Override
@ -42,16 +47,20 @@ public class QwenCodeCli {
}.setDefaultPermissionOperation(Operation.allow));
} catch (Exception e) {
throw new RuntimeException("sendPrompt error!", e);
}
try {
session.close();
} catch (Exception e) {
throw new RuntimeException("close Session error!", e);
} finally {
try {
session.close();
} catch (Exception e) {
log.error("close session error!", e);
}
}
}
public static Session newSessionWithProcessTransport(TransportOptions transportOptions) {
public static Session newSession() {
return newSession(new TransportOptions());
}
public static Session newSession(TransportOptions transportOptions) {
Transport transport;
try {
transport = new ProcessTransport(transportOptions);

View file

@ -31,7 +31,11 @@ public class ThreadPoolConfig {
ThreadPoolConfig.executorSupplier = executorSupplier;
}
public static ExecutorService getExecutor() {
public static ThreadPoolExecutor getDefaultExecutor() {
return defaultExecutor;
}
static ExecutorService getExecutor() {
return Optional.ofNullable(executorSupplier).map(s -> {
try {
return s.get();

View file

@ -2,8 +2,10 @@ package com.alibaba.qwen.code.cli.session;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.alibaba.fastjson2.JSON;
import com.alibaba.qwen.code.cli.QwenCodeCli;
import com.alibaba.qwen.code.cli.protocol.data.AssistantContent;
import com.alibaba.qwen.code.cli.protocol.data.PermissionMode;
import com.alibaba.qwen.code.cli.protocol.data.behavior.Allow;
@ -19,9 +21,8 @@ import com.alibaba.qwen.code.cli.session.event.SessionEventConsumers;
import com.alibaba.qwen.code.cli.session.event.SessionEventSimpleConsumers;
import com.alibaba.qwen.code.cli.session.exception.SessionControlException;
import com.alibaba.qwen.code.cli.session.exception.SessionSendPromptException;
import com.alibaba.qwen.code.cli.transport.Transport;
import com.alibaba.qwen.code.cli.transport.TransportOptions;
import com.alibaba.qwen.code.cli.transport.process.ProcessTransport;
import com.alibaba.qwen.code.cli.utils.Timeout;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
@ -34,8 +35,7 @@ class SessionTest {
@Test
void partialSendPromptSuccessfully() throws IOException, SessionControlException, SessionSendPromptException {
Transport transport = new ProcessTransport(new TransportOptions().setIncludePartialMessages(true));
Session session = new Session(transport);
Session session = QwenCodeCli.newSession(new TransportOptions().setIncludePartialMessages(true));
session.sendPrompt("in the dir src/test/temp/, create file empty file test.touch", new SessionEventSimpleConsumers() {
@Override
public void onAssistantMessageIncludePartial(Session session, List<AssistantContent> assistantContents,
@ -47,8 +47,7 @@ class SessionTest {
@Test
void setPermissionModeSuccessfully() throws IOException, SessionControlException, SessionSendPromptException {
Transport transport = new ProcessTransport();
Session session = new Session(transport);
Session session = QwenCodeCli.newSession(new TransportOptions());
log.info(session.setPermissionMode(PermissionMode.YOLO).map(s -> s ? "setPermissionMode 1 success" : "setPermissionMode 1 error")
.orElse("setPermissionMode 1 unknown"));
@ -74,8 +73,7 @@ class SessionTest {
@Test
void sendPromptAndSetModelSuccessfully() throws IOException, SessionControlException, SessionSendPromptException {
Transport transport = new ProcessTransport();
Session session = new Session(transport);
Session session = QwenCodeCli.newSession(new TransportOptions());
log.info(session.setModel("qwen3-coder-flash").map(s -> s ? "setModel 1 success" : "setModel 1 error").orElse("setModel 1 unknown"));
writeSplitLine("setModel 1 end");
@ -100,10 +98,10 @@ class SessionTest {
@Test
void sendPromptAndInterruptContinueSuccessfully() throws IOException, SessionControlException, SessionSendPromptException {
Transport transport = new ProcessTransport();
Session session = new Session(transport);
Session session = QwenCodeCli.newSession();
SessionEventConsumers sessionEventConsumers = new SessionEventSimpleConsumers() {
@Override
public void onSystemMessage(Session session, SDKSystemMessage systemMessage) {
log.info("systemMessage: {}", systemMessage);
@ -133,7 +131,12 @@ class SessionTest {
public void onOtherMessage(Session session, String message) {
log.info("otherMessage: {}", message);
}
};
@Override
public Timeout onPermissionRequestTimeout(Session session) {
return Timeout.TIMEOUT_30_MINUTES;
}
}.setDefaultEventTimeout(new Timeout(90L, TimeUnit.SECONDS));
session.sendPrompt("查看下当前目录有多少个文件", sessionEventConsumers);
writeSplitLine("prompt 1 end");