Skip to content

Commit 76f1939

Browse files
authored
Add support for max_completion_tokens property (#168)
2 parents c330d28 + 1806ba5 commit 76f1939

File tree

12 files changed

+71
-5
lines changed

12 files changed

+71
-5
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ builder.Services.AddChatGpt(options =>
3636
options.DefaultParameters = new ChatGptParameters
3737
{
3838
MaxTokens = 800,
39+
//MaxCompletionTokens = 800, // o1 series models support this property instead of MaxTokens
3940
Temperature = 0.7
4041
};
4142
});
@@ -85,6 +86,8 @@ Currently available models are:
8586
- gpt-4-turbo
8687
- gpt-4o
8788
- gpt-4o-mini
89+
- o1-preview
90+
- o1-mini
8891

8992
They have fixed names, available in the [OpenAIChatGptModels.cs file](https://github.com/marcominerva/ChatGptNet/blob/master/src/ChatGptNet/Models/OpenAIChatGptModels.cs).
9093

@@ -163,6 +166,7 @@ The configuration can be automatically read from [IConfiguration](https://learn.
163166
// "Temperature": 0.8,
164167
// "TopP": 1,
165168
// "MaxTokens": 500,
169+
// "MaxCompletionTokens": null, // o1 series models support this property instead of MaxTokens
166170
// "PresencePenalty": 0,
167171
// "FrequencyPenalty": 0,
168172
// "ResponseFormat": { "Type": "text" }, // Allowed values for Type: text (default) or json_object

samples/ChatGptApi/ChatGptApi.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<ItemGroup>
1010
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
1111
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="8.10.0" />
12-
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.8.1" />
13-
<PackageReference Include="TinyHelpers.AspNetCore" Version="3.1.17" />
12+
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.9.0" />
13+
<PackageReference Include="TinyHelpers.AspNetCore" Version="3.1.19" />
1414
</ItemGroup>
1515

1616
<ItemGroup>

samples/ChatGptApi/appsettings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// "Temperature": 0.8,
1818
// "TopP": 1,
1919
// "MaxTokens": 500,
20+
// "MaxCompletionTokens": null, // o1 series models supports this property instead of MaxTokens
2021
// "PresencePenalty": 0,
2122
// "FrequencyPenalty": 0,
2223
// "ResponseFormat": { "Type": "text" }, // Allowed values for Type: text (default) or json_object

samples/ChatGptBlazor.Wasm/ChatGptBlazor.Wasm.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Markdig" Version="0.37.0" />
11+
<PackageReference Include="Markdig" Version="0.38.0" />
1212
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.10" />
1313
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.10" PrivateAssets="all" />
1414
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="8.10.0" />

samples/ChatGptConsole/appsettings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// "Temperature": 0.8,
1818
// "TopP": 1,
1919
// "MaxTokens": 500,
20+
// "MaxCompletionTokens": null, // o1 series models support this property instead of MaxTokens
2021
// "PresencePenalty": 0,
2122
// "FrequencyPenalty": 0,
2223
// "ResponseFormat": { "Type": "text" }, // Allowed values for Type: text (default) or json_object

samples/ChatGptFunctionCallingConsole/appsettings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// "Temperature": 0.8,
1818
// "TopP": 1,
1919
// "MaxTokens": 500,
20+
// "MaxCompletionTokens": null, // o1 series models support this property instead of MaxTokens
2021
// "PresencePenalty": 0,
2122
// "FrequencyPenalty": 0,
2223
// "ResponseFormat": { "Type": "text" }, // Allowed values for Type: text (default) or json_object

samples/ChatGptStreamConsole/appsettings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// "Temperature": 0.8,
1818
// "TopP": 1,
1919
// "MaxTokens": 500,
20+
// "MaxCompletionTokens": null, // o1 series models support this property instead of MaxTokens
2021
// "PresencePenalty": 0,
2122
// "FrequencyPenalty": 0,
2223
// "ResponseFormat": { "Type": "text" }, // Allowed values for Type: text (default) or json_object

src/ChatGptNet/ChatGptClient.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,8 @@ private async Task<IList<ChatGptMessage>> CreateMessageListAsync(Guid conversati
332332
}
333333

334334
private ChatGptRequest CreateChatGptRequest(IEnumerable<ChatGptMessage> messages, ChatGptToolParameters? toolParameters, bool stream, ChatGptParameters? parameters, string? model)
335-
=> new()
335+
{
336+
var request = new ChatGptRequest()
336337
{
337338
Model = model ?? options.DefaultModel,
338339
Messages = messages,
@@ -362,6 +363,7 @@ private ChatGptRequest CreateChatGptRequest(IEnumerable<ChatGptMessage> messages
362363
Temperature = parameters?.Temperature ?? options.DefaultParameters.Temperature,
363364
TopP = parameters?.TopP ?? options.DefaultParameters.TopP,
364365
MaxTokens = parameters?.MaxTokens ?? options.DefaultParameters.MaxTokens,
366+
MaxCompletionTokens = parameters?.MaxCompletionTokens ?? options.DefaultParameters.MaxCompletionTokens,
365367
PresencePenalty = parameters?.PresencePenalty ?? options.DefaultParameters.PresencePenalty,
366368
FrequencyPenalty = parameters?.FrequencyPenalty ?? options.DefaultParameters.FrequencyPenalty,
367369
ResponseFormat = parameters?.ResponseFormat ?? options.DefaultParameters.ResponseFormat,
@@ -370,6 +372,19 @@ private ChatGptRequest CreateChatGptRequest(IEnumerable<ChatGptMessage> messages
370372
User = options.User
371373
};
372374

375+
/*
376+
* As of 2024-09-01-preview, Azure OpenAI conditionally supports the use of the new max_completion_tokens property:
377+
* - The o1-mini and o1-preview models accept max_completion_tokens and reject max_tokens
378+
* - All other models reject max_completion_tokens and accept max_tokens
379+
*/
380+
if (request.MaxCompletionTokens is not null)
381+
{
382+
request.MaxTokens = null;
383+
}
384+
385+
return request;
386+
}
387+
373388
private EmbeddingRequest CreateEmbeddingRequest(IEnumerable<string> messages, EmbeddingParameters? parameters, string? model)
374389
=> new()
375390
{

src/ChatGptNet/Models/ChatGptParameters.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,21 @@ public class ChatGptParameters
4040
/// <summary>
4141
/// Gets or sets the maximum number of tokens to generate in the chat completion. The total length of input tokens and generated tokens is limited by the model's context length.
4242
/// </summary>
43+
/// <remarks>
44+
/// This value is now deprecated in favor of <see cref="MaxCompletionTokens"/>, and is not compatible with <see href="https://platform.openai.com/docs/guides/reasoning">o1 series models</see>.
45+
/// </remarks>
46+
/// <seealso cref="MaxCompletionTokens"/>
47+
[JsonPropertyName("max_tokens")]
4348
public int? MaxTokens { get; set; }
4449

50+
/// <summary>
51+
/// An upper bound for the number of tokens that can be generated for a completion, including visible output tokens and <see href="https://platform.openai.com/docs/guides/reasoning">reasoning tokens</see>.
52+
/// </summary>
53+
/// <remarks>o1 series models must use this property instead of <see cref="MaxTokens"/>.</remarks>
54+
/// <seealso cref="MaxTokens"/>
55+
[JsonPropertyName("max_completion_tokens")]
56+
public int? MaxCompletionTokens { get; set; }
57+
4558
/// <summary>
4659
/// Gets or sets the presence penalties for chat completion. Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics (default: 0).
4760
/// </summary>

src/ChatGptNet/Models/ChatGptRequest.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,21 @@ internal class ChatGptRequest
126126
/// <summary>
127127
/// Gets or sets the maximum number of tokens to generate in the chat completion. The total length of input tokens and generated tokens is limited by the model's context length.
128128
/// </summary>
129+
/// <remarks>
130+
/// This value is now deprecated in favor of <see cref="MaxCompletionTokens"/>, and is not compatible with <see href="https://platform.openai.com/docs/guides/reasoning">o1 series models</see>.
131+
/// </remarks>
132+
/// <seealso cref="MaxCompletionTokens"/>
129133
[JsonPropertyName("max_tokens")]
130134
public int? MaxTokens { get; set; }
131135

136+
/// <summary>
137+
/// An upper bound for the number of tokens that can be generated for a completion, including visible output tokens and <see href="https://platform.openai.com/docs/guides/reasoning">reasoning tokens</see>.
138+
/// </summary>
139+
/// <remarks>o1 series models must use this property instead of <see cref="MaxTokens"/>.</remarks>
140+
/// <seealso cref="MaxTokens"/>
141+
[JsonPropertyName("max_completion_tokens")]
142+
public int? MaxCompletionTokens { get; set; }
143+
132144
/// <summary>
133145
/// Gets or sets the presence penalties for chat completion. A number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics (default: 0).
134146
/// </summary>

0 commit comments

Comments
 (0)