Skip to content

Commit 6a50c3b

Browse files
CopilotKSemenenko
andcommitted
Sync upstream submodule to v2.1.77 and add --effort flag support
Co-authored-by: KSemenenko <4385716+KSemenenko@users.noreply.github.com>
1 parent a0d742e commit 6a50c3b

File tree

8 files changed

+116
-2
lines changed

8 files changed

+116
-2
lines changed

ClaudeCodeSharpSDK.Tests/Unit/ClaudeExecTests.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public class ClaudeExecTests
2929
private const string ExampleBaseUrl = "https://example.invalid";
3030
private const string FeatureABeta = "feature-a";
3131
private const string FeatureBBeta = "feature-b";
32+
private const string EffortFlag = "--effort";
33+
private const string EffortLow = "low";
34+
private const string EffortMedium = "medium";
35+
private const string EffortHigh = "high";
36+
private const string EffortAuto = "auto";
3237
private const string FlagNotFoundMessagePrefix = "Flag '";
3338
private const string FlagNotFoundMessageSuffix = "' was not found.";
3439
private const string HealthCheckInput = "Health check";
@@ -206,6 +211,75 @@ public async Task BuildCommandArgs_WithReservedAdditionalCliFlag_Throws()
206211
await Assert.That(exception!.Message).Contains(ReservedOutputFormatFlag);
207212
}
208213

214+
[Test]
215+
public async Task BuildCommandArgs_WithEffortLow_SetsEffortFlag()
216+
{
217+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
218+
219+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
220+
{
221+
Input = SummarizeInput,
222+
Effort = EffortLevel.Low,
223+
});
224+
225+
await Assert.That(GetRequiredFlagValue(commandArgs, EffortFlag)).IsEqualTo(EffortLow);
226+
}
227+
228+
[Test]
229+
public async Task BuildCommandArgs_WithEffortMedium_SetsEffortFlag()
230+
{
231+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
232+
233+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
234+
{
235+
Input = SummarizeInput,
236+
Effort = EffortLevel.Medium,
237+
});
238+
239+
await Assert.That(GetRequiredFlagValue(commandArgs, EffortFlag)).IsEqualTo(EffortMedium);
240+
}
241+
242+
[Test]
243+
public async Task BuildCommandArgs_WithEffortHigh_SetsEffortFlag()
244+
{
245+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
246+
247+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
248+
{
249+
Input = SummarizeInput,
250+
Effort = EffortLevel.High,
251+
});
252+
253+
await Assert.That(GetRequiredFlagValue(commandArgs, EffortFlag)).IsEqualTo(EffortHigh);
254+
}
255+
256+
[Test]
257+
public async Task BuildCommandArgs_WithEffortAuto_SetsEffortFlag()
258+
{
259+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
260+
261+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
262+
{
263+
Input = SummarizeInput,
264+
Effort = EffortLevel.Auto,
265+
});
266+
267+
await Assert.That(GetRequiredFlagValue(commandArgs, EffortFlag)).IsEqualTo(EffortAuto);
268+
}
269+
270+
[Test]
271+
public async Task BuildCommandArgs_WithoutEffort_OmitsEffortFlag()
272+
{
273+
var exec = new ClaudeExec(executablePath: TestConstants.ClaudeExecutablePath);
274+
275+
var commandArgs = exec.BuildCommandArgs(new ClaudeExecArgs
276+
{
277+
Input = SummarizeInput,
278+
});
279+
280+
await Assert.That(commandArgs.Contains(EffortFlag)).IsFalse();
281+
}
282+
209283
private static JsonObject CreateBaseSettings()
210284
{
211285
return new JsonObject

ClaudeCodeSharpSDK/Client/ClaudeThread.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ private async IAsyncEnumerable<ThreadEvent> RunStreamedInternalAsync(
273273
BaseUrl = _options.BaseUrl,
274274
ApiKey = _options.ApiKey,
275275
Model = _threadOptions.Model,
276+
Effort = _threadOptions.Effort,
276277
Agent = _threadOptions.Agent,
277278
FallbackModel = _threadOptions.FallbackModel,
278279
WorkingDirectory = _threadOptions.WorkingDirectory,

ClaudeCodeSharpSDK/Client/ThreadOptions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
namespace ManagedCode.ClaudeCodeSharpSDK.Client;
44

5+
public enum EffortLevel
6+
{
7+
Auto,
8+
Low,
9+
Medium,
10+
High,
11+
}
12+
513
public enum PermissionMode
614
{
715
AcceptEdits,
@@ -25,6 +33,8 @@ public sealed record ThreadOptions
2533
{
2634
public string? Model { get; init; }
2735

36+
public EffortLevel? Effort { get; init; }
37+
2838
public string? Agent { get; init; }
2939

3040
public string? FallbackModel { get; init; }

ClaudeCodeSharpSDK/Execution/ClaudeExec.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public sealed class ClaudeExec
2222
private const string IncludePartialMessagesFlag = "--include-partial-messages";
2323
private const string ReplayUserMessagesFlag = "--replay-user-messages";
2424
private const string ModelFlag = "--model";
25+
private const string EffortFlag = "--effort";
2526
private const string AgentFlag = "--agent";
2627
private const string FallbackModelFlag = "--fallback-model";
2728
private const string PermissionModeFlag = "--permission-mode";
@@ -158,6 +159,12 @@ internal IReadOnlyList<string> BuildCommandArgs(ClaudeExecArgs args)
158159
commandArgs.Add(args.Model);
159160
}
160161

162+
if (args.Effort.HasValue)
163+
{
164+
commandArgs.Add(EffortFlag);
165+
commandArgs.Add(args.Effort.Value.ToCliValue());
166+
}
167+
161168
if (!string.IsNullOrWhiteSpace(args.Agent))
162169
{
163170
commandArgs.Add(AgentFlag);

ClaudeCodeSharpSDK/Execution/ClaudeExecArgs.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public sealed record ClaudeExecArgs
1313

1414
public string? Model { get; init; }
1515

16+
public EffortLevel? Effort { get; init; }
17+
1618
public string? Agent { get; init; }
1719

1820
public string? FallbackModel { get; init; }

ClaudeCodeSharpSDK/Internal/ClaudeCliValueExtensions.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ namespace ManagedCode.ClaudeCodeSharpSDK.Internal;
44

55
internal static class ClaudeCliValueExtensions
66
{
7+
private static class EffortLevelValues
8+
{
9+
public const string Auto = "auto";
10+
public const string Low = "low";
11+
public const string Medium = "medium";
12+
public const string High = "high";
13+
}
14+
715
private static class PermissionModeValues
816
{
917
public const string AcceptEdits = "acceptEdits";
@@ -21,6 +29,18 @@ private static class SettingSourceValues
2129
public const string Local = "local";
2230
}
2331

32+
public static string ToCliValue(this EffortLevel effortLevel)
33+
{
34+
return effortLevel switch
35+
{
36+
EffortLevel.Auto => EffortLevelValues.Auto,
37+
EffortLevel.Low => EffortLevelValues.Low,
38+
EffortLevel.Medium => EffortLevelValues.Medium,
39+
EffortLevel.High => EffortLevelValues.High,
40+
_ => throw new ArgumentOutOfRangeException(nameof(effortLevel), effortLevel, null),
41+
};
42+
}
43+
2444
public static string ToCliValue(this PermissionMode permissionMode)
2545
{
2646
return permissionMode switch

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "10.0.103",
3+
"version": "10.0.102",
44
"rollForward": "latestFeature"
55
},
66
"test": {

0 commit comments

Comments
 (0)