diff --git a/Dockerfile b/Dockerfile index d4f22305..a17dc7f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM docker.io/library/node:20-slim -ARG SANDBOX_NAME="gemini-cli-sandbox" +ARG SANDBOX_NAME="qwen-code-sandbox" ARG CLI_VERSION_ARG ENV SANDBOX="$SANDBOX_NAME" ENV CLI_VERSION=$CLI_VERSION_ARG @@ -39,12 +39,12 @@ ENV PATH=$PATH:/usr/local/share/npm-global/bin # switch to non-root user node USER node -# install gemini-cli and clean up -COPY packages/cli/dist/google-gemini-cli-*.tgz /usr/local/share/npm-global/gemini-cli.tgz -COPY packages/core/dist/google-gemini-cli-core-*.tgz /usr/local/share/npm-global/gemini-core.tgz -RUN npm install -g /usr/local/share/npm-global/gemini-cli.tgz /usr/local/share/npm-global/gemini-core.tgz \ +# install qwen-code and clean up +COPY packages/cli/dist/qwen-code-*.tgz /usr/local/share/npm-global/qwen-code.tgz +COPY packages/core/dist/qwen-code-qwen-code-core-*.tgz /usr/local/share/npm-global/qwen-code-core.tgz +RUN npm install -g /usr/local/share/npm-global/qwen-code.tgz /usr/local/share/npm-global/qwen-code-core.tgz \ && npm cache clean --force \ - && rm -f /usr/local/share/npm-global/gemini-{cli,core}.tgz + && rm -f /usr/local/share/npm-global/qwen-{code,code-core}.tgz # default entrypoint when none specified -CMD ["gemini"] +CMD ["qwen"] \ No newline at end of file diff --git a/package.json b/package.json index 02ded52b..03ef8986 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "url": "git+http://gitlab.alibaba-inc.com/Qwen-Coder/qwen-code.git" }, "config": { - "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.0.1-alpha.8" + "sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.0.1-alpha.8" }, "scripts": { "start": "node scripts/start.js", diff --git a/packages/cli/package.json b/packages/cli/package.json index e3e2c43f..119c1c9e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -25,7 +25,7 @@ "dist" ], "config": { - "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.0.1-alpha.8" + "sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.0.1-alpha.8" }, "dependencies": { "@qwen-code/qwen-code-core": "file:../core", diff --git a/packages/cli/src/utils/sandbox.ts b/packages/cli/src/utils/sandbox.ts index 96acc76c..d7ea26d1 100644 --- a/packages/cli/src/utils/sandbox.ts +++ b/packages/cli/src/utils/sandbox.ts @@ -31,9 +31,9 @@ function getContainerPath(hostPath: string): string { return hostPath; } -const LOCAL_DEV_SANDBOX_IMAGE_NAME = 'gemini-cli-sandbox'; -const SANDBOX_NETWORK_NAME = 'gemini-cli-sandbox'; -const SANDBOX_PROXY_NAME = 'gemini-cli-sandbox-proxy'; +const LOCAL_DEV_SANDBOX_IMAGE_NAME = 'qwen-code-sandbox'; +const SANDBOX_NETWORK_NAME = 'qwen-code-sandbox'; +const SANDBOX_PROXY_NAME = 'qwen-code-sandbox-proxy'; const BUILTIN_SEATBELT_PROFILES = [ 'permissive-open', 'permissive-closed', @@ -172,8 +172,8 @@ function entrypoint(workdir: string): string[] { ? 'npm run debug --' : 'npm rebuild && npm run start --' : process.env.DEBUG - ? `node --inspect-brk=0.0.0.0:${process.env.DEBUG_PORT || '9229'} $(which gemini)` - : 'gemini'; + ? `node --inspect-brk=0.0.0.0:${process.env.DEBUG_PORT || '9229'} $(which qwen)` + : 'qwen'; const args = [...shellCmds, cliCmd, ...cliArgs]; @@ -517,6 +517,17 @@ export async function start_sandbox( args.push('--env', `GOOGLE_API_KEY=${process.env.GOOGLE_API_KEY}`); } + // copy OPENAI_API_KEY and related env vars for Qwen + if (process.env.OPENAI_API_KEY) { + args.push('--env', `OPENAI_API_KEY=${process.env.OPENAI_API_KEY}`); + } + if (process.env.OPENAI_BASE_URL) { + args.push('--env', `OPENAI_BASE_URL=${process.env.OPENAI_BASE_URL}`); + } + if (process.env.OPENAI_MODEL) { + args.push('--env', `OPENAI_MODEL=${process.env.OPENAI_MODEL}`); + } + // copy GOOGLE_GENAI_USE_VERTEXAI if (process.env.GOOGLE_GENAI_USE_VERTEXAI) { args.push( diff --git a/scripts/build_sandbox.js b/scripts/build_sandbox.js index 51d0556e..1d0f3984 100644 --- a/scripts/build_sandbox.js +++ b/scripts/build_sandbox.js @@ -77,23 +77,23 @@ if (!argv.s) { execSync('npm run build --workspaces', { stdio: 'inherit' }); } -console.log('packing @google/gemini-cli ...'); +console.log('packing @qwen-code/qwen-code ...'); const cliPackageDir = join('packages', 'cli'); -rmSync(join(cliPackageDir, 'dist', 'google-gemini-cli-*.tgz'), { force: true }); +rmSync(join(cliPackageDir, 'dist', 'qwen-code-*.tgz'), { force: true }); execSync( - `npm pack -w @google/gemini-cli --pack-destination ./packages/cli/dist`, + `npm pack -w @qwen-code/qwen-code --pack-destination ./packages/cli/dist`, { stdio: 'ignore', }, ); -console.log('packing @google/gemini-cli-core ...'); +console.log('packing @qwen-code/qwen-code-core ...'); const corePackageDir = join('packages', 'core'); -rmSync(join(corePackageDir, 'dist', 'google-gemini-cli-core-*.tgz'), { +rmSync(join(corePackageDir, 'dist', 'qwen-code-core-*.tgz'), { force: true, }); execSync( - `npm pack -w @google/gemini-cli-core --pack-destination ./packages/core/dist`, + `npm pack -w @qwen-code/qwen-code-core --pack-destination ./packages/core/dist`, { stdio: 'ignore' }, ); @@ -102,11 +102,15 @@ const packageVersion = JSON.parse( ).version; chmodSync( - join(cliPackageDir, 'dist', `google-gemini-cli-${packageVersion}.tgz`), + join(cliPackageDir, 'dist', `qwen-code-qwen-code-${packageVersion}.tgz`), 0o755, ); chmodSync( - join(corePackageDir, 'dist', `google-gemini-cli-core-${packageVersion}.tgz`), + join( + corePackageDir, + 'dist', + `qwen-code-qwen-code-core-${packageVersion}.tgz`, + ), 0o755, ); @@ -134,14 +138,21 @@ function buildImage(imageName, dockerfile) { { stdio: buildStdout, shell: '/bin/bash' }, ); console.log(`built ${finalImageName}`); - if (existsSync('/workspace/final_image_uri.txt')) { - // The publish step only supports one image. If we build multiple, only the last one - // will be published. Throw an error to make this failure explicit. - throw new Error( - 'CI artifact file /workspace/final_image_uri.txt already exists. Refusing to overwrite.', + + // If an output file path was provided via command-line, write the final image URI to it. + if (argv.outputFile) { + console.log( + `Writing final image URI for CI artifact to: ${argv.outputFile}`, ); + // The publish step only supports one image. If we build multiple, only the last one + // will be published. Throw an error to make this failure explicit if the file already exists. + if (existsSync(argv.outputFile)) { + throw new Error( + `CI artifact file ${argv.outputFile} already exists. Refusing to overwrite.`, + ); + } + writeFileSync(argv.outputFile, finalImageName); } - writeFileSync('/workspace/final_image_uri.txt', finalImageName); } if (baseImage && baseDockerfile) {