diff --git a/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransport.java b/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransport.java index ee53c21f7..009805ee0 100644 --- a/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransport.java +++ b/packages/sdk-java/qwencode/src/main/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransport.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.lang.ProcessBuilder.Redirect; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; @@ -103,6 +104,13 @@ public class ProcessTransport implements Transport { .redirectErrorStream(false) .directory(new File(transportOptionsAdapter.getCwd())); + Map env = transportOptionsAdapter.getHandledTransportOptions().getEnv(); + if (env != null) { + Map processEnv = processBuilder.environment(); + processEnv.clear(); + processEnv.putAll(env); + } + process = processBuilder.start(); processInput = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); processOutput = new BufferedReader(new InputStreamReader(process.getInputStream())); diff --git a/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransportTest.java b/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransportTest.java index a23800ada..adff3c115 100644 --- a/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransportTest.java +++ b/packages/sdk-java/qwencode/src/test/java/com/alibaba/qwen/code/cli/transport/process/ProcessTransportTest.java @@ -1,6 +1,10 @@ package com.alibaba.qwen.code.cli.transport.process; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -16,12 +20,20 @@ import com.alibaba.qwen.code.cli.transport.Transport; import com.alibaba.qwen.code.cli.transport.TransportOptions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.junit.jupiter.api.Assertions.assertEquals; + class ProcessTransportTest { private static final Logger logger = LoggerFactory.getLogger(ProcessTransportTest.class); + private static final String CUSTOM_ENV_NAME = "QWEN_SDK_TEST_ENV"; + private static final String CUSTOM_ENV_VALUE = "from-set-env"; + + @TempDir + Path tempDir; @Test void shouldStartAndCloseSuccessfully() throws IOException { @@ -30,6 +42,21 @@ class ProcessTransportTest { transport.close(); } + @Test + void shouldPassCustomEnvToProcess() throws IOException { + Path executable = createEnvPrinter(); + TransportOptions transportOptions = new TransportOptions() + .setPathToQwenExecutable(executable.toString()) + .setEnv(Collections.singletonMap(CUSTOM_ENV_NAME, CUSTOM_ENV_VALUE)); + + ProcessTransport transport = new ProcessTransport(transportOptions); + try { + assertEquals(CUSTOM_ENV_VALUE, transport.processOutput.readLine()); + } finally { + transport.close(); + } + } + @Test void shouldInputWaitForOneLineSuccessfully() throws IOException, ExecutionException, InterruptedException, TimeoutException { TransportOptions transportOptions = new TransportOptions(); @@ -84,4 +111,15 @@ class ProcessTransportTest { line -> "result".equals(JSON.parseObject(line).getString("type"))); } + private Path createEnvPrinter() throws IOException { + boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win"); + Path executable = tempDir.resolve(isWindows ? "print-env.cmd" : "print-env.sh"); + String script = isWindows + ? "@echo off\r\necho %" + CUSTOM_ENV_NAME + "%\r\n" + : "#!/bin/sh\nprintf '%s\\n' \"$" + CUSTOM_ENV_NAME + "\"\n"; + Files.write(executable, script.getBytes(StandardCharsets.UTF_8)); + executable.toFile().setExecutable(true); + return executable; + } + }