mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-04-28 11:41:04 +00:00
377 lines
16 KiB
Markdown
377 lines
16 KiB
Markdown
# Qwen Code Java SDK
|
|
|
|
## Project Overview
|
|
|
|
The Qwen Code Java SDK is a minimum experimental SDK for programmatic access to Qwen Code functionality. It provides a Java interface to interact with the Qwen Code CLI, allowing developers to integrate Qwen Code capabilities into their Java applications.
|
|
|
|
**Context Information:**
|
|
|
|
- Current Date: Monday 5 January 2026
|
|
- Operating System: darwin
|
|
- Working Directory: /Users/weigeng/repos/qwen-code/packages/sdk-java
|
|
|
|
## Project Details
|
|
|
|
- **Group ID**: com.alibaba
|
|
- **Artifact ID**: qwencode-sdk (as per pom.xml)
|
|
- **Version**: 0.0.1-SNAPSHOT
|
|
- **Packaging**: JAR
|
|
- **Java Version**: 1.8+ (source and target)
|
|
- **License**: Apache-2.0
|
|
|
|
## Architecture
|
|
|
|
The SDK follows a layered architecture:
|
|
|
|
- **API Layer**: Provides the main entry points through `QwenCodeCli` class with simple static methods for basic usage
|
|
- **Session Layer**: Manages communication sessions with the Qwen Code CLI through the `Session` class
|
|
- **Transport Layer**: Handles the communication mechanism between the SDK and CLI process (currently using process transport via `ProcessTransport`)
|
|
- **Protocol Layer**: Defines data structures for communication based on the CLI protocol
|
|
- **Utils**: Common utilities for concurrent execution, timeout handling, and error management
|
|
|
|
## Key Components
|
|
|
|
### Main Classes
|
|
|
|
- `QwenCodeCli`: Main entry point with static methods for simple queries
|
|
- `Session`: Manages communication sessions with the CLI
|
|
- `Transport`: Abstracts the communication mechanism (currently using process transport)
|
|
- `ProcessTransport`: Implementation that communicates via process execution
|
|
- `TransportOptions`: Configuration class for transport layer settings
|
|
- `SessionEventSimpleConsumers`: High-level event handler for processing responses
|
|
- `AssistantContentSimpleConsumers`: Handles different types of content within assistant messages
|
|
|
|
### Dependencies
|
|
|
|
- **Logging**: ch.qos.logback:logback-classic
|
|
- **Utilities**: org.apache.commons:commons-lang3
|
|
- **JSON Processing**: com.alibaba.fastjson2:fastjson2
|
|
- **Testing**: JUnit 5 (org.junit.jupiter:junit-jupiter)
|
|
|
|
## Building and Running
|
|
|
|
### Prerequisites
|
|
|
|
- Java 8 or higher
|
|
- Apache Maven 3.6.0 or higher
|
|
|
|
### Build Commands
|
|
|
|
```bash
|
|
# Compile the project
|
|
mvn compile
|
|
|
|
# Run tests
|
|
mvn test
|
|
|
|
# Package the JAR
|
|
mvn package
|
|
|
|
# Install to local repository
|
|
mvn install
|
|
|
|
# Run checkstyle verification
|
|
mvn checkstyle:check
|
|
|
|
# Generate Javadoc
|
|
mvn javadoc:javadoc
|
|
```
|
|
|
|
### Testing
|
|
|
|
The project includes basic unit tests using JUnit 5. The main test class `QwenCodeCliTest` demonstrates how to use the SDK to make simple queries to the Qwen Code CLI.
|
|
|
|
### Code Quality
|
|
|
|
The project uses Checkstyle for code formatting and style enforcement. The configuration is defined in `checkstyle.xml` and includes rules for:
|
|
|
|
- Whitespace and indentation
|
|
- Naming conventions
|
|
- Import ordering
|
|
- Code structure
|
|
- Line endings (LF only)
|
|
- No trailing whitespace
|
|
- 8-space indentation for line wrapping
|
|
|
|
## Development Conventions
|
|
|
|
### Coding Standards
|
|
|
|
- Java 8 language features are supported
|
|
- Follow standard Java naming conventions
|
|
- Use UTF-8 encoding for source files
|
|
- Line endings should be LF (Unix-style)
|
|
- No trailing whitespace allowed
|
|
- Use 8-space indentation for line wrapping
|
|
|
|
### Testing Practices
|
|
|
|
- Write unit tests using JUnit 5
|
|
- Test classes should be in the `src/test/java` directory
|
|
- Follow the naming convention `*Test.java` for test classes
|
|
- Use appropriate assertions to validate functionality
|
|
|
|
### Documentation
|
|
|
|
- API documentation should follow Javadoc conventions
|
|
- Update README files when adding new features
|
|
- Include examples in documentation
|
|
|
|
## API Reference
|
|
|
|
### QwenCodeCli Class
|
|
|
|
The main class provides several primary methods:
|
|
|
|
- `simpleQuery(String prompt)`: Synchronous method that returns a list of responses
|
|
- `simpleQuery(String prompt, TransportOptions transportOptions)`: Synchronous method with custom transport options
|
|
- `simpleQuery(String prompt, TransportOptions transportOptions, AssistantContentConsumers assistantContentConsumers)`: Advanced method with custom content consumers
|
|
- `newSession()`: Creates a new session with default options
|
|
- `newSession(TransportOptions transportOptions)`: Creates a new session with custom options
|
|
|
|
### Permission Modes
|
|
|
|
The SDK supports different permission modes for controlling tool execution:
|
|
|
|
- **`default`**: Write tools are denied unless approved via `canUseTool` callback or in `allowedTools`. Read-only tools execute without confirmation.
|
|
- **`plan`**: Blocks all write tools, instructing AI to present a plan first.
|
|
- **`auto-edit`**: Auto-approve edit tools (edit, write_file) while other tools require confirmation.
|
|
- **`yolo`**: All tools execute automatically without confirmation.
|
|
|
|
### Transport Options
|
|
|
|
The `TransportOptions` class allows configuration of how the SDK communicates with the Qwen Code CLI:
|
|
|
|
- `pathToQwenExecutable`: Path to the Qwen Code CLI executable
|
|
- `cwd`: Working directory for the CLI process
|
|
- `model`: AI model to use for the session
|
|
- `permissionMode`: Permission mode that controls tool execution
|
|
- `env`: Environment variables to pass to the CLI process
|
|
- `maxSessionTurns`: Limits the number of conversation turns in a session
|
|
- `coreTools`: List of core tools that should be available to the AI
|
|
- `excludeTools`: List of tools to exclude from being available to the AI
|
|
- `allowedTools`: List of tools that are pre-approved for use without additional confirmation
|
|
- `authType`: Authentication type to use for the session
|
|
- `includePartialMessages`: Enables receiving partial messages during streaming responses
|
|
- `turnTimeout`: Timeout for a complete turn of conversation
|
|
- `messageTimeout`: Timeout for individual messages within a turn
|
|
- `resumeSessionId`: ID of a previous session to resume
|
|
- `otherOptions`: Additional command-line options to pass to the CLI
|
|
|
|
### Session Control Features
|
|
|
|
- **Session creation**: Use `QwenCodeCli.newSession()` to create a new session with custom options
|
|
- **Session management**: The `Session` class provides methods to send prompts, handle responses, and manage session state
|
|
- **Session cleanup**: Always close sessions using `session.close()` to properly terminate the CLI process
|
|
- **Session resumption**: Use `setResumeSessionId()` in `TransportOptions` to resume a previous session
|
|
- **Session interruption**: Use `session.interrupt()` to interrupt a currently running prompt
|
|
- **Dynamic model switching**: Use `session.setModel()` to change the model during a session
|
|
- **Dynamic permission mode switching**: Use `session.setPermissionMode()` to change the permission mode during a session
|
|
|
|
### Thread Pool Configuration
|
|
|
|
The SDK uses a thread pool for managing concurrent operations with the following default configuration:
|
|
|
|
- **Core Pool Size**: 30 threads
|
|
- **Maximum Pool Size**: 100 threads
|
|
- **Keep-Alive Time**: 60 seconds
|
|
- **Queue Capacity**: 300 tasks (using LinkedBlockingQueue)
|
|
- **Thread Naming**: "qwen_code_cli-pool-{number}"
|
|
- **Daemon Threads**: false
|
|
- **Rejected Execution Handler**: CallerRunsPolicy
|
|
|
|
### Session Event Consumers and Assistant Content Consumers
|
|
|
|
The SDK provides two key interfaces for handling events and content from the CLI:
|
|
|
|
#### SessionEventConsumers Interface
|
|
|
|
The `SessionEventConsumers` interface provides callbacks for different types of messages during a session:
|
|
|
|
- `onSystemMessage`: Handles system messages from the CLI (receives Session and SDKSystemMessage)
|
|
- `onResultMessage`: Handles result messages from the CLI (receives Session and SDKResultMessage)
|
|
- `onAssistantMessage`: Handles assistant messages (AI responses) (receives Session and SDKAssistantMessage)
|
|
- `onPartialAssistantMessage`: Handles partial assistant messages during streaming (receives Session and SDKPartialAssistantMessage)
|
|
- `onUserMessage`: Handles user messages (receives Session and SDKUserMessage)
|
|
- `onOtherMessage`: Handles other types of messages (receives Session and String message)
|
|
- `onControlResponse`: Handles control responses (receives Session and CLIControlResponse)
|
|
- `onControlRequest`: Handles control requests (receives Session and CLIControlRequest, returns CLIControlResponse)
|
|
- `onPermissionRequest`: Handles permission requests (receives Session and CLIControlRequest<CLIControlPermissionRequest>, returns Behavior)
|
|
|
|
#### AssistantContentConsumers Interface
|
|
|
|
The `AssistantContentConsumers` interface handles different types of content within assistant messages:
|
|
|
|
- `onText`: Handles text content (receives Session and TextAssistantContent)
|
|
- `onThinking`: Handles thinking content (receives Session and ThingkingAssistantContent)
|
|
- `onToolUse`: Handles tool use content (receives Session and ToolUseAssistantContent)
|
|
- `onToolResult`: Handles tool result content (receives Session and ToolResultAssistantContent)
|
|
- `onOtherContent`: Handles other content types (receives Session and AssistantContent)
|
|
- `onUsage`: Handles usage information (receives Session and AssistantUsage)
|
|
- `onPermissionRequest`: Handles permission requests (receives Session and CLIControlPermissionRequest, returns Behavior)
|
|
- `onOtherControlRequest`: Handles other control requests (receives Session and ControlRequestPayload, returns ControlResponsePayload)
|
|
|
|
#### Relationship Between the Interfaces
|
|
|
|
**Important Note on Event Hierarchy:**
|
|
|
|
- `SessionEventConsumers` is the **high-level** event processor that handles different message types (system, assistant, user, etc.)
|
|
- `AssistantContentConsumers` is the **low-level** content processor that handles different types of content within assistant messages (text, tools, thinking, etc.)
|
|
|
|
**Processor Relationship:**
|
|
|
|
- `SessionEventConsumers` → `AssistantContentConsumers` (SessionEventConsumers uses AssistantContentConsumers to process content within assistant messages)
|
|
|
|
**Event Derivation Relationships:**
|
|
|
|
- `onAssistantMessage` → `onText`, `onThinking`, `onToolUse`, `onToolResult`, `onOtherContent`, `onUsage`
|
|
- `onPartialAssistantMessage` → `onText`, `onThinking`, `onToolUse`, `onToolResult`, `onOtherContent`
|
|
- `onControlRequest` → `onPermissionRequest`, `onOtherControlRequest`
|
|
|
|
**Event Timeout Relationships:**
|
|
|
|
Each event handler method has a corresponding timeout method that allows customizing the timeout behavior for that specific event:
|
|
|
|
- `onSystemMessage` ↔ `onSystemMessageTimeout`
|
|
- `onResultMessage` ↔ `onResultMessageTimeout`
|
|
- `onAssistantMessage` ↔ `onAssistantMessageTimeout`
|
|
- `onPartialAssistantMessage` ↔ `onPartialAssistantMessageTimeout`
|
|
- `onUserMessage` ↔ `onUserMessageTimeout`
|
|
- `onOtherMessage` ↔ `onOtherMessageTimeout`
|
|
- `onControlResponse` ↔ `onControlResponseTimeout`
|
|
- `onControlRequest` ↔ `onControlRequestTimeout`
|
|
|
|
For AssistantContentConsumers timeout methods:
|
|
|
|
- `onText` ↔ `onTextTimeout`
|
|
- `onThinking` ↔ `onThinkingTimeout`
|
|
- `onToolUse` ↔ `onToolUseTimeout`
|
|
- `onToolResult` ↔ `onToolResultTimeout`
|
|
- `onOtherContent` ↔ `onOtherContentTimeout`
|
|
- `onPermissionRequest` ↔ `onPermissionRequestTimeout`
|
|
- `onOtherControlRequest` ↔ `onOtherControlRequestTimeout`
|
|
|
|
**Default Timeout Values:**
|
|
|
|
- `SessionEventSimpleConsumers` default timeout: 180 seconds (Timeout.TIMEOUT_180_SECONDS)
|
|
- `AssistantContentSimpleConsumers` default timeout: 60 seconds (Timeout.TIMEOUT_60_SECONDS)
|
|
|
|
**Timeout Hierarchy Requirements:**
|
|
|
|
For proper operation, the following timeout relationships should be maintained:
|
|
|
|
- `onAssistantMessageTimeout` return value should be greater than `onTextTimeout`, `onThinkingTimeout`, `onToolUseTimeout`, `onToolResultTimeout`, and `onOtherContentTimeout` return values
|
|
- `onControlRequestTimeout` return value should be greater than `onPermissionRequestTimeout` and `onOtherControlRequestTimeout` return values
|
|
|
|
#### Relationship Between the Interfaces
|
|
|
|
- `AssistantContentSimpleConsumers` is the default implementation of `AssistantContentConsumers`
|
|
- `SessionEventSimpleConsumers` is the concrete implementation that combines both interfaces and depends on an `AssistantContentConsumers` instance to handle content within assistant messages
|
|
- The timeout methods in `SessionEventConsumers` now include the message object as a parameter (e.g., `onSystemMessageTimeout(Session session, SDKSystemMessage systemMessage)`)
|
|
|
|
Event processing is subject to the timeout settings configured in `TransportOptions` and `SessionEventConsumers`. For detailed timeout configuration options, see the "Timeout" section above.
|
|
|
|
## Usage Examples
|
|
|
|
The SDK includes several example files in `src/test/java/com/alibaba/qwen/code/cli/example/` that demonstrate different aspects of the API:
|
|
|
|
### Basic Usage
|
|
|
|
- `QuickStartExample.java`: Demonstrates simple query usage, transport options configuration, and streaming content handling
|
|
|
|
### Session Control
|
|
|
|
- `SessionExample.java`: Shows session control features including permission mode changes, model switching, interruption, and event handling
|
|
|
|
### Configuration
|
|
|
|
- `ThreadPoolConfigurationExample.java`: Shows how to configure the thread pool used by the SDK
|
|
|
|
## Error Handling
|
|
|
|
The SDK provides specific exception types for different error scenarios:
|
|
|
|
- `SessionControlException`: Thrown when there's an issue with session control (creation, initialization, etc.)
|
|
- `SessionSendPromptException`: Thrown when there's an issue sending a prompt or receiving a response
|
|
- `SessionClosedException`: Thrown when attempting to use a closed session
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
src/
|
|
├── example/
|
|
│ └── java/
|
|
│ └── com/
|
|
│ └── alibaba/
|
|
│ └── qwen/
|
|
│ └── code/
|
|
│ └── example/
|
|
├── main/
|
|
│ └── java/
|
|
│ └── com/
|
|
│ └── alibaba/
|
|
│ └── qwen/
|
|
│ └── code/
|
|
│ └── cli/
|
|
│ ├── QwenCodeCli.java
|
|
│ ├── protocol/
|
|
│ ├── session/
|
|
│ ├── transport/
|
|
│ └── utils/
|
|
└── test/
|
|
├── java/
|
|
│ └── com/
|
|
│ └── alibaba/
|
|
│ └── qwen/
|
|
│ └── code/
|
|
│ └── cli/
|
|
│ ├── QwenCodeCliTest.java
|
|
│ ├── session/
|
|
│ │ └── SessionTest.java
|
|
│ └── transport/
|
|
│ ├── PermissionModeTest.java
|
|
│ └── process/
|
|
│ └── ProcessTransportTest.java
|
|
└── temp/
|
|
```
|
|
|
|
## Configuration Files
|
|
|
|
- `pom.xml`: Maven build configuration and dependencies
|
|
- `checkstyle.xml`: Code style and formatting rules
|
|
- `.editorconfig`: Editor configuration settings
|
|
|
|
## FAQ / Troubleshooting
|
|
|
|
### Q: Do I need to install the Qwen CLI separately?
|
|
|
|
A: No, from v0.1.1, the CLI is bundled with the SDK, so no standalone CLI installation is needed.
|
|
|
|
### Q: What Java versions are supported?
|
|
|
|
A: The SDK requires Java 1.8 or higher.
|
|
|
|
### Q: How do I handle long-running requests?
|
|
|
|
A: The SDK includes timeout utilities. You can configure timeouts using the `Timeout` class in `TransportOptions`.
|
|
|
|
### Q: Why are some tools not executing?
|
|
|
|
A: This is likely due to permission modes. Check your permission mode settings and consider using `allowedTools` to pre-approve certain tools.
|
|
|
|
### Q: How do I resume a previous session?
|
|
|
|
A: Use the `setResumeSessionId()` method in `TransportOptions` to resume a previous session.
|
|
|
|
### Q: Can I customize the environment for the CLI process?
|
|
|
|
A: Yes, use the `setEnv()` method in `TransportOptions` to pass environment variables to the CLI process.
|
|
|
|
### Q: What happens if the CLI process crashes?
|
|
|
|
A: The SDK will throw appropriate exceptions. Make sure to handle `SessionControlException` and implement retry logic if needed.
|
|
|
|
## Maintainers
|
|
|
|
- **Developer**: skyfire (gengwei.gw(at)alibaba-inc.com)
|
|
- **Organization**: Alibaba Group
|