Skip to content

Commit 8215ab4

Browse files
committed
Fix issue for reasoning_content can't read after upgrade to OpenAI 2.6 by using self-compiled Sdcb.OpenAI
1 parent 283c53d commit 8215ab4

4 files changed

Lines changed: 22 additions & 193 deletions

File tree

src/BE/Chats.BE.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
<ImplicitUsings>enable</ImplicitUsings>
77
<UserSecretsId>d4aa34e2-6c5f-41b9-b61b-c1a48b1d1b44</UserSecretsId>
88
<Version>1.8.0</Version>
9-
<NoWarn>OPENAI001;SCME0001</NoWarn>
9+
<NoWarn>OPENAI001;OPENAI002;SCME0001</NoWarn>
1010
</PropertyGroup>
1111

1212
<ItemGroup>
1313
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
1414
<PackageReference Include="AWSSDK.S3" Version="4.0.9.1" />
1515
<PackageReference Include="Azure.Storage.Blobs" Version="12.26.0" />
1616
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
17+
<PackageReference Include="Sdcb.OpenAI" Version="2.6.0-alpha.3" />
1718
<PackageReference Include="System.Net.ServerSentEvents" Version="10.0.0-preview.4.25258.110" />
1819
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.10">
1920
<PrivateAssets>all</PrivateAssets>
@@ -26,7 +27,6 @@
2627
<PackageReference Include="ModelContextProtocol.Core" Version="0.4.0-preview.2" />
2728
<PackageReference Include="Mscc.GenerativeAI" Version="2.8.24" />
2829
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
29-
<PackageReference Include="OpenAI" Version="2.6.0" />
3030
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.12" />
3131
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" />
3232
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.14.0" />

src/BE/Services/Models/ChatServices/OpenAI/ChatCompletionService.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
using System.ClientModel;
66
using Chats.BE.DB;
77
using System.ClientModel.Primitives;
8-
using System.Text.Json;
9-
using Chats.BE.Services.Models.ChatServices.OpenAI.ReasoningContents;
10-
using Chats.BE.DB.Enums;
11-
using Chats.BE.Services.Models.Extensions;
128

139
namespace Chats.BE.Services.Models.ChatServices.OpenAI;
1410

@@ -40,11 +36,7 @@ internal static OpenAIClient CreateOpenAIClient(ModelKey modelKey, Uri? suggeste
4036
return api;
4137
}
4238

43-
static Func<StreamingChatCompletionUpdate, string?> StreamingReasoningContentAccessor { get; } = ReasoningContentFactory.CreateStreamingReasoningContentAccessor();
44-
static Func<ChatCompletion, string?> ReasoningContentAccessor { get; } = ReasoningContentFactory.CreateReasoningContentAccessor();
45-
46-
protected virtual string? GetReasoningContent(ChatCompletion delta) => ReasoningContentAccessor(delta);
47-
protected virtual string? GetReasoningContent(StreamingChatCompletionUpdate delta) => StreamingReasoningContentAccessor(delta);
39+
protected virtual ReadOnlySpan<byte> ReasoningEffortPropName => "$.reasoning_content"u8;
4840

4941
public override async IAsyncEnumerable<ChatSegment> ChatStreamed(IReadOnlyList<ChatMessage> messages, ChatCompletionOptions options, [EnumeratorCancellation] CancellationToken cancellationToken)
5042
{
@@ -66,6 +58,15 @@ public override async IAsyncEnumerable<ChatSegment> ChatStreamed(IReadOnlyList<C
6658
Usage = delta.Usage != null ? GetUsage(delta.Usage) : null,
6759
};
6860
}
61+
62+
string? GetReasoningContent(StreamingChatCompletionUpdate delta)
63+
{
64+
if (delta.Choices[0].Delta.Patch.TryGetValue(ReasoningEffortPropName, out string? val))
65+
{
66+
return val;
67+
}
68+
return null;
69+
}
6970
}
7071

7172
public override async Task<ChatSegment> Chat(IReadOnlyList<ChatMessage> messages, ChatCompletionOptions options, CancellationToken cancellationToken)
@@ -80,6 +81,15 @@ public override async Task<ChatSegment> Chat(IReadOnlyList<ChatMessage> messages
8081
FinishReason = delta.FinishReason,
8182
Usage = delta.Usage != null ? GetUsage(delta.Usage) : null,
8283
};
84+
85+
string? GetReasoningContent(ChatCompletion delta)
86+
{
87+
if (delta.Choices[0].Patch.TryGetValue(ReasoningEffortPropName, out string? val))
88+
{
89+
return val;
90+
}
91+
return null;
92+
}
8393
}
8494

8595
protected virtual Dtos.ChatTokenUsage GetUsage(global::OpenAI.Chat.ChatTokenUsage usage)

src/BE/Services/Models/ChatServices/OpenAI/OpenRouterChatService.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Chats.BE.DB;
22
using Chats.BE.Services.Models.ChatServices.OpenAI.PipelinePolicies;
3-
using Chats.BE.Services.Models.ChatServices.OpenAI.ReasoningContents;
43
using OpenAI.Chat;
54

65
namespace Chats.BE.Services.Models.ChatServices.OpenAI;
@@ -11,11 +10,7 @@ namespace Chats.BE.Services.Models.ChatServices.OpenAI;
1110
new AddHeaderPolicy("HTTP-Referer", hostUrlService.GetFEUrl())
1211
])
1312
{
14-
static Func<ChatCompletion, string?> ReasoningContentAccessor { get; } = ReasoningContentFactory.CreateReasoningContentAccessor("reasoning");
15-
static Func<StreamingChatCompletionUpdate, string?> StreamingReasoningContentAccessor { get; } = ReasoningContentFactory.CreateStreamingReasoningContentAccessor("reasoning");
16-
17-
protected override string? GetReasoningContent(ChatCompletion delta) => ReasoningContentAccessor(delta);
18-
protected override string? GetReasoningContent(StreamingChatCompletionUpdate delta) => StreamingReasoningContentAccessor(delta);
13+
protected override ReadOnlySpan<byte> ReasoningEffortPropName => "reasoning"u8;
1914

2015
protected override void SetWebSearchEnabled(ChatCompletionOptions options, bool enabled)
2116
{

src/BE/Services/Models/ChatServices/OpenAI/ReasoningContents/ReasoningContentFactory.cs

Lines changed: 0 additions & 176 deletions
This file was deleted.

0 commit comments

Comments
 (0)