/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. *--------------------------------------------------------------------------------------------*/ package com.github.copilot.sdk.json; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonInclude; /** * Configuration for creating a new Copilot session. *
* This class provides options for customizing session behavior, including model * selection, tool registration, system message customization, and more. All * setter methods return {@code this} for method chaining. * *
{@code
* var config = new SessionConfig().setModel("gpt-5").setStreaming(true).setSystemMessage(
* new SystemMessageConfig().setMode(SystemMessageMode.APPEND).setContent("Be concise in your responses."));
*
* var session = client.createSession(config).get();
* }
*
* @see com.github.copilot.sdk.CopilotClient#createSession(SessionConfig)
* @since 1.0.0
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SessionConfig {
private String sessionId;
private String model;
private String reasoningEffort;
private List* If not provided, a unique session ID will be generated automatically. * * @param sessionId * the custom session ID * @return this config instance for method chaining */ public SessionConfig setSessionId(String sessionId) { this.sessionId = sessionId; return this; } /** * Gets the AI model to use. * * @return the model name */ public String getModel() { return model; } /** * Sets the AI model to use for this session. *
* Examples: "gpt-5", "claude-sonnet-4.5", "o3-mini". * * @param model * the model name * @return this config instance for method chaining */ public SessionConfig setModel(String model) { this.model = model; return this; } /** * Gets the reasoning effort level. * * @return the reasoning effort level ("low", "medium", "high", or "xhigh") */ public String getReasoningEffort() { return reasoningEffort; } /** * Sets the reasoning effort level for models that support it. *
* Valid values: "low", "medium", "high", "xhigh". Only applies to models where
* {@code capabilities.supports.reasoningEffort} is true.
*
* @param reasoningEffort
* the reasoning effort level
* @return this config instance for method chaining
*/
public SessionConfig setReasoningEffort(String reasoningEffort) {
this.reasoningEffort = reasoningEffort;
return this;
}
/**
* Gets the custom tools for this session.
*
* @return the list of tool definitions
*/
public List
* Tools allow the assistant to call back into your application to perform
* actions or retrieve information.
*
* @param tools
* the list of tool definitions
* @return this config instance for method chaining
* @see ToolDefinition
*/
public SessionConfig setTools(List
* The system message controls the behavior and personality of the assistant.
* Use {@link com.github.copilot.sdk.SystemMessageMode#APPEND} to add
* instructions while preserving default behavior, or
* {@link com.github.copilot.sdk.SystemMessageMode#REPLACE} to fully customize.
*
* @param systemMessage
* the system message configuration
* @return this config instance for method chaining
* @see SystemMessageConfig
*/
public SessionConfig setSystemMessage(SystemMessageConfig systemMessage) {
this.systemMessage = systemMessage;
return this;
}
/**
* Gets the list of allowed tool names.
*
* @return the list of available tool names
*/
public List
* When specified, only tools in this list will be available to the assistant.
*
* @param availableTools
* the list of allowed tool names
* @return this config instance for method chaining
*/
public SessionConfig setAvailableTools(List
* Tools in this list will not be available to the assistant.
*
* @param excludedTools
* the list of tool names to exclude
* @return this config instance for method chaining
*/
public SessionConfig setExcludedTools(List
* This allows using your own OpenAI, Azure OpenAI, or other compatible API
* endpoints instead of the default Copilot backend.
*
* @param provider
* the provider configuration
* @return this config instance for method chaining
* @see ProviderConfig
*/
public SessionConfig setProvider(ProviderConfig provider) {
this.provider = provider;
return this;
}
/**
* Gets the permission request handler.
*
* @return the permission handler
*/
public PermissionHandler getOnPermissionRequest() {
return onPermissionRequest;
}
/**
* Sets a handler for permission requests from the assistant.
*
* When the assistant needs permission to perform certain actions, this handler
* will be invoked to approve or deny the request.
*
* @param onPermissionRequest
* the permission handler
* @return this config instance for method chaining
* @see PermissionHandler
*/
public SessionConfig setOnPermissionRequest(PermissionHandler onPermissionRequest) {
this.onPermissionRequest = onPermissionRequest;
return this;
}
/**
* Gets the user input request handler.
*
* @return the user input handler
*/
public UserInputHandler getOnUserInputRequest() {
return onUserInputRequest;
}
/**
* Sets a handler for user input requests from the agent.
*
* When provided, enables the ask_user tool for the agent to request user input.
*
* @param onUserInputRequest
* the user input handler
* @return this config instance for method chaining
* @see UserInputHandler
*/
public SessionConfig setOnUserInputRequest(UserInputHandler onUserInputRequest) {
this.onUserInputRequest = onUserInputRequest;
return this;
}
/**
* Gets the hook handlers configuration.
*
* @return the session hooks
*/
public SessionHooks getHooks() {
return hooks;
}
/**
* Sets hook handlers for session lifecycle events.
*
* Hooks allow you to intercept and modify tool execution behavior.
*
* @param hooks
* the hooks configuration
* @return this config instance for method chaining
* @see SessionHooks
*/
public SessionConfig setHooks(SessionHooks hooks) {
this.hooks = hooks;
return this;
}
/**
* Gets the working directory for the session.
*
* @return the working directory path
*/
public String getWorkingDirectory() {
return workingDirectory;
}
/**
* Sets the working directory for the session.
*
* @param workingDirectory
* the working directory path
* @return this config instance for method chaining
*/
public SessionConfig setWorkingDirectory(String workingDirectory) {
this.workingDirectory = workingDirectory;
return this;
}
/**
* Returns whether streaming is enabled.
*
* @return {@code true} if streaming is enabled
*/
public boolean isStreaming() {
return streaming;
}
/**
* Sets whether to enable streaming of response chunks.
*
* When enabled, the session will emit {@code AssistantMessageDeltaEvent} events
* as the response is generated, allowing for real-time display of partial
* responses.
*
* @param streaming
* {@code true} to enable streaming
* @return this config instance for method chaining
*/
public SessionConfig setStreaming(boolean streaming) {
this.streaming = streaming;
return this;
}
/**
* Gets the MCP server configurations.
*
* @return the MCP servers map
*/
public Map
* MCP servers extend the assistant's capabilities by providing additional
* context sources and tools.
*
* @param mcpServers
* the MCP servers configuration map
* @return this config instance for method chaining
*/
public SessionConfig setMcpServers(Map
* Custom agents allow extending the assistant with specialized behaviors and
* capabilities.
*
* @param customAgents
* the list of custom agent configurations
* @return this config instance for method chaining
* @see CustomAgentConfig
*/
public SessionConfig setCustomAgents(List
* When enabled (default), sessions automatically manage context limits and
* persist state to a workspace directory. The workspace contains checkpoints/,
* plan.md, and files/ subdirectories.
*
* @param infiniteSessions
* the infinite sessions configuration
* @return this config instance for method chaining
* @see InfiniteSessionConfig
*/
public SessionConfig setInfiniteSessions(InfiniteSessionConfig infiniteSessions) {
this.infiniteSessions = infiniteSessions;
return this;
}
/**
* Gets the skill directories.
*
* @return the list of skill directory paths
*/
public List
* Skills are loaded from SKILL.md files in subdirectories of the specified
* directories. Each skill subdirectory should contain a SKILL.md file with YAML
* frontmatter defining the skill metadata.
*
* @param skillDirectories
* the list of skill directory paths
* @return this config instance for method chaining
*/
public SessionConfig setSkillDirectories(List
* Skills in this list will not be applied to the session, even if they are
* found in the skill directories.
*
* @param disabledSkills
* the list of skill names to disable
* @return this config instance for method chaining
*/
public SessionConfig setDisabledSkills(List
* This allows using a specific directory for session configuration instead of
* the default location.
*
* @param configDir
* the configuration directory path
* @return this config instance for method chaining
*/
public SessionConfig setConfigDir(String configDir) {
this.configDir = configDir;
return this;
}
/**
* Creates a shallow clone of this {@code SessionConfig} instance.
*
* Mutable collection properties are copied into new collection instances so
* that modifications to those collections on the clone do not affect the
* original. Other reference-type properties (like provider configuration,
* system messages, hooks, infinite session configuration, and delegates) are
* not deep-cloned; the original and the clone will share those objects.
*
* @return a clone of this config instance
*/
public SessionConfig clone() {
SessionConfig copy = new SessionConfig();
copy.sessionId = this.sessionId;
copy.model = this.model;
copy.reasoningEffort = this.reasoningEffort;
copy.tools = this.tools != null ? new ArrayList<>(this.tools) : null;
copy.systemMessage = this.systemMessage;
copy.availableTools = this.availableTools != null ? new ArrayList<>(this.availableTools) : null;
copy.excludedTools = this.excludedTools != null ? new ArrayList<>(this.excludedTools) : null;
copy.provider = this.provider;
copy.onPermissionRequest = this.onPermissionRequest;
copy.onUserInputRequest = this.onUserInputRequest;
copy.hooks = this.hooks;
copy.workingDirectory = this.workingDirectory;
copy.streaming = this.streaming;
copy.mcpServers = this.mcpServers != null ? new java.util.HashMap<>(this.mcpServers) : null;
copy.customAgents = this.customAgents != null ? new ArrayList<>(this.customAgents) : null;
copy.infiniteSessions = this.infiniteSessions;
copy.skillDirectories = this.skillDirectories != null ? new ArrayList<>(this.skillDirectories) : null;
copy.disabledSkills = this.disabledSkills != null ? new ArrayList<>(this.disabledSkills) : null;
copy.configDir = this.configDir;
return copy;
}
}