Skip to content

Commit f5ffa05

Browse files
Copilotedburns
andcommitted
Port upstream changes: reasoningEffort, skipPermission, no-result, TelemetryConfig, new events
Co-authored-by: edburns <75821+edburns@users.noreply.github.com>
1 parent 33fb77f commit f5ffa05

17 files changed

+438
-23
lines changed

src/main/java/com/github/copilot/sdk/CliServerManager.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.regex.Pattern;
2121

2222
import com.github.copilot.sdk.json.CopilotClientOptions;
23+
import com.github.copilot.sdk.json.TelemetryConfig;
2324

2425
/**
2526
* Manages the lifecycle of the Copilot CLI server process.
@@ -110,6 +111,28 @@ ProcessInfo startCliServer() throws IOException, InterruptedException {
110111
pb.environment().put("COPILOT_SDK_AUTH_TOKEN", options.getGitHubToken());
111112
}
112113

114+
// Set telemetry environment variables if configured
115+
TelemetryConfig telemetry = options.getTelemetry();
116+
if (telemetry != null) {
117+
pb.environment().put("COPILOT_OTEL_ENABLED", "true");
118+
if (telemetry.getOtlpEndpoint() != null) {
119+
pb.environment().put("OTEL_EXPORTER_OTLP_ENDPOINT", telemetry.getOtlpEndpoint());
120+
}
121+
if (telemetry.getFilePath() != null) {
122+
pb.environment().put("COPILOT_OTEL_FILE_EXPORTER_PATH", telemetry.getFilePath());
123+
}
124+
if (telemetry.getExporterType() != null) {
125+
pb.environment().put("COPILOT_OTEL_EXPORTER_TYPE", telemetry.getExporterType());
126+
}
127+
if (telemetry.getSourceName() != null) {
128+
pb.environment().put("COPILOT_OTEL_SOURCE_NAME", telemetry.getSourceName());
129+
}
130+
if (telemetry.getCaptureContent() != null) {
131+
pb.environment().put("OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT",
132+
telemetry.getCaptureContent() ? "true" : "false");
133+
}
134+
}
135+
113136
Process process = pb.start();
114137

115138
// Forward stderr to logger in background

src/main/java/com/github/copilot/sdk/CopilotSession.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public final class CopilotSession implements AutoCloseable {
119119
private final AtomicReference<UserInputHandler> userInputHandler = new AtomicReference<>();
120120
private final AtomicReference<SessionHooks> hooksHandler = new AtomicReference<>();
121121
private volatile EventErrorHandler eventErrorHandler;
122-
private volatile EventErrorPolicy eventErrorPolicy = EventErrorPolicy.PROPAGATE_AND_LOG_ERRORS;
122+
private volatile EventErrorPolicy eventErrorPolicy = EventErrorPolicy.SUPPRESS_AND_LOG_ERRORS;
123123

124124
/** Tracks whether this session instance has been terminated via close(). */
125125
private volatile boolean isTerminated = false;
@@ -709,6 +709,9 @@ private void executePermissionAndRespondAsync(String requestId, PermissionReques
709709
invocation.setSessionId(sessionId);
710710
handler.handle(permissionRequest, invocation).thenAccept(result -> {
711711
try {
712+
if (PermissionRequestResultKind.NO_RESULT.equals(result.getKind())) {
713+
return; // Leave the permission request unanswered (for extensions)
714+
}
712715
rpc.invoke("session.permissions.handlePendingPermissionRequest",
713716
Map.of("sessionId", sessionId, "requestId", requestId, "result", result), Object.class);
714717
} catch (Exception e) {
@@ -1000,7 +1003,36 @@ public CompletableFuture<Void> abort() {
10001003
* @since 1.0.11
10011004
*/
10021005
public CompletableFuture<Void> setModel(String model) {
1006+
return setModel(model, null);
1007+
}
1008+
1009+
/**
1010+
* Changes the model and reasoning effort for this session.
1011+
* <p>
1012+
* The new model and reasoning effort take effect for the next message.
1013+
* Conversation history is preserved.
1014+
*
1015+
* <pre>{@code
1016+
* session.setModel("gpt-4.1", "high").get();
1017+
* }</pre>
1018+
*
1019+
* @param model
1020+
* the model ID to switch to (e.g., {@code "gpt-4.1"})
1021+
* @param reasoningEffort
1022+
* the reasoning effort level (e.g., {@code "low"}, {@code "medium"},
1023+
* {@code "high"}, {@code "xhigh"}), or {@code null} to use the
1024+
* default
1025+
* @return a future that completes when the model switch is acknowledged
1026+
* @throws IllegalStateException
1027+
* if this session has been terminated
1028+
* @since 1.1.0
1029+
*/
1030+
public CompletableFuture<Void> setModel(String model, String reasoningEffort) {
10031031
ensureNotTerminated();
1032+
if (reasoningEffort != null) {
1033+
return rpc.invoke("session.model.switchTo",
1034+
Map.of("sessionId", sessionId, "modelId", model, "reasoningEffort", reasoningEffort), Void.class);
1035+
}
10041036
return rpc.invoke("session.model.switchTo", Map.of("sessionId", sessionId, "modelId", model), Void.class);
10051037
}
10061038

src/main/java/com/github/copilot/sdk/events/AbstractSessionEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public abstract sealed class AbstractSessionEvent permits
5555
SessionModelChangeEvent, SessionModeChangedEvent, SessionPlanChangedEvent, SessionWorkspaceFileChangedEvent,
5656
SessionHandoffEvent, SessionTruncationEvent, SessionSnapshotRewindEvent, SessionUsageInfoEvent,
5757
SessionCompactionStartEvent, SessionCompactionCompleteEvent, SessionShutdownEvent, SessionContextChangedEvent,
58-
SessionTaskCompleteEvent,
58+
SessionTaskCompleteEvent, SessionToolsUpdatedEvent, SessionBackgroundTasksChangedEvent,
5959
// Assistant events
6060
AssistantTurnStartEvent, AssistantIntentEvent, AssistantReasoningEvent, AssistantReasoningDeltaEvent,
6161
AssistantMessageEvent, AssistantMessageDeltaEvent, AssistantStreamingDeltaEvent, AssistantTurnEndEvent,

src/main/java/com/github/copilot/sdk/events/ExternalToolRequestedEvent.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public void setData(ExternalToolRequestedData data) {
3838
@JsonIgnoreProperties(ignoreUnknown = true)
3939
public record ExternalToolRequestedData(@JsonProperty("requestId") String requestId,
4040
@JsonProperty("sessionId") String sessionId, @JsonProperty("toolCallId") String toolCallId,
41-
@JsonProperty("toolName") String toolName, @JsonProperty("arguments") Object arguments) {
41+
@JsonProperty("toolName") String toolName, @JsonProperty("arguments") Object arguments,
42+
@JsonProperty("traceparent") String traceparent, @JsonProperty("tracestate") String tracestate) {
4243
}
4344
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
*--------------------------------------------------------------------------------------------*/
4+
5+
package com.github.copilot.sdk.events;
6+
7+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
8+
import com.fasterxml.jackson.annotation.JsonProperty;
9+
10+
/**
11+
* Event: session.background_tasks_changed
12+
* <p>
13+
* Emitted when the set of background tasks for the session changes.
14+
*
15+
* @since 1.1.0
16+
*/
17+
@JsonIgnoreProperties(ignoreUnknown = true)
18+
public final class SessionBackgroundTasksChangedEvent extends AbstractSessionEvent {
19+
20+
@JsonProperty("data")
21+
private Object data;
22+
23+
@Override
24+
public String getType() {
25+
return "session.background_tasks_changed";
26+
}
27+
28+
public Object getData() {
29+
return data;
30+
}
31+
32+
public void setData(Object data) {
33+
this.data = data;
34+
}
35+
}

src/main/java/com/github/copilot/sdk/events/SessionEventParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ public class SessionEventParser {
6666
TYPE_MAP.put("session.compaction_complete", SessionCompactionCompleteEvent.class);
6767
TYPE_MAP.put("session.context_changed", SessionContextChangedEvent.class);
6868
TYPE_MAP.put("session.task_complete", SessionTaskCompleteEvent.class);
69+
TYPE_MAP.put("session.tools_updated", SessionToolsUpdatedEvent.class);
70+
TYPE_MAP.put("session.background_tasks_changed", SessionBackgroundTasksChangedEvent.class);
6971
TYPE_MAP.put("user.message", UserMessageEvent.class);
7072
TYPE_MAP.put("pending_messages.modified", PendingMessagesModifiedEvent.class);
7173
TYPE_MAP.put("assistant.turn_start", AssistantTurnStartEvent.class);

src/main/java/com/github/copilot/sdk/events/SessionModelChangeEvent.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public void setData(SessionModelChangeData data) {
3333

3434
@JsonIgnoreProperties(ignoreUnknown = true)
3535
public record SessionModelChangeData(@JsonProperty("previousModel") String previousModel,
36-
@JsonProperty("newModel") String newModel) {
36+
@JsonProperty("newModel") String newModel,
37+
@JsonProperty("previousReasoningEffort") String previousReasoningEffort,
38+
@JsonProperty("reasoningEffort") String reasoningEffort) {
3739
}
3840
}

src/main/java/com/github/copilot/sdk/events/SessionResumeEvent.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public void setData(SessionResumeData data) {
3535

3636
@JsonIgnoreProperties(ignoreUnknown = true)
3737
public record SessionResumeData(@JsonProperty("resumeTime") OffsetDateTime resumeTime,
38-
@JsonProperty("eventCount") double eventCount) {
38+
@JsonProperty("eventCount") double eventCount, @JsonProperty("selectedModel") String selectedModel,
39+
@JsonProperty("reasoningEffort") String reasoningEffort) {
3940
}
4041
}

src/main/java/com/github/copilot/sdk/events/SessionStartEvent.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public void setData(SessionStartData data) {
3636
@JsonIgnoreProperties(ignoreUnknown = true)
3737
public record SessionStartData(@JsonProperty("sessionId") String sessionId, @JsonProperty("version") double version,
3838
@JsonProperty("producer") String producer, @JsonProperty("copilotVersion") String copilotVersion,
39-
@JsonProperty("startTime") OffsetDateTime startTime, @JsonProperty("selectedModel") String selectedModel) {
39+
@JsonProperty("startTime") OffsetDateTime startTime, @JsonProperty("selectedModel") String selectedModel,
40+
@JsonProperty("reasoningEffort") String reasoningEffort) {
4041
}
4142
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
*--------------------------------------------------------------------------------------------*/
4+
5+
package com.github.copilot.sdk.events;
6+
7+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
8+
import com.fasterxml.jackson.annotation.JsonProperty;
9+
10+
/**
11+
* Event: session.tools_updated
12+
* <p>
13+
* Emitted when the set of available tools for the session changes.
14+
*
15+
* @since 1.1.0
16+
*/
17+
@JsonIgnoreProperties(ignoreUnknown = true)
18+
public final class SessionToolsUpdatedEvent extends AbstractSessionEvent {
19+
20+
@JsonProperty("data")
21+
private Object data;
22+
23+
@Override
24+
public String getType() {
25+
return "session.tools_updated";
26+
}
27+
28+
public Object getData() {
29+
return data;
30+
}
31+
32+
public void setData(Object data) {
33+
this.data = data;
34+
}
35+
}

0 commit comments

Comments
 (0)