GitHunt
LG

LGinC/CozeNet

coze.com/.cn api in .Net

Coze NET

Coze API的.net实现。

实现了大多数接口,并重点测试了对话相关接口。

已实现

  • 鉴权
    • 个人访问令牌
    • 开发者JWT
  • 智能体
  • 会话
  • 消息
  • 对话
  • 文件
  • 工作流
  • 知识库

未实现

  • 空间
  • 渠道
  • 语音

使用示例

详见Test.cs

ASP.NET Core 集成

安装nuget包
dotnet add package CozeNet.AspNetCore

appsettings.json

"Coze": {
  "Endpoint": "api.coze.cn",
  "AppId": "1111111111",
  "PublicKey": "111-222222222222222",
  "PrivateKey": "private_key.pem",
  "BotID": "777777777",
  "PersonalAccessToken": "",
  "HttpClientName": "",
  "TokenExpire": null
},

注意:
PersonalAccessToken和PublicKey、PrivateKey为二选一的关系。
HttpClientName用于获取注入自定义配置的HttpClient。
比如注入了一个名为CozeClient的httpclient,其中使用一个自定义的用于记录请求和响应日志的handler。则配置中需要设置为"HttpClientName":"CozeClient".

builder.Services.AddHttpClient("CozeClient").ConfigureHttpClientDefaults(defaults => defaults.AddHttpMessageHandler<LoggingHandler>());

Program.cs

builder.Services.AddCozeNet();

由于使用了IDistributedCache来对accessToken进行缓存,所以需要安装Redis包配置Redis连接。如果有用其他的IDistributedCache实现也可以。

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = builder.Configuration.GetConnectionString("Redis");
    options.InstanceName = "MyProjectName:";
});

通过依赖注入使用

注意:TypedResults.ServerSentEvents 为.net 10新增内容

public ChatController(ConversationService conversationService, ChatService chatService,IOptionsMonitor<CozeOptions> options)
{
    [HttpPost("complete")]
    public async Task<> Chat(string message, CancellationToken cancellationToken)
    {
      async IAsyncEnumerable<StreamChatResponse> ChatCompleteAsync(
          string message, ChatService chatService,
          [EnumeratorCancellation] CancellationToken cancellationToken)
      {
          var r = chatService.SendStreamAsync(conversation!.Id, new()
          {
              BotID = options.CurrentValue.BotId,
              AutoSaveHistory = true,
              Stream = true,
              AdditionalMessages = [new() { Role = RoleType.User, Content = message, ContentType =      ContentType.Text, Type = MessageType.Question }]
          }, cancellationToken);
          await foreach (var completionUpdate in r)
          {
              if (completionUpdate.Event is CozeNet.Chat.Models.StreamEvents.DeltaMessage)
              {
                  var message = completionUpdate.Data as MessageObject;
                  if (message!.Type is not (MessageType.Answer or MessageType.FollowUp)) continue;
                  yield return new StreamChatResponse(message.Content!, message.Type!);
              }
              else if (completionUpdate.Event is CozeNet.Chat.Models.StreamEvents.MessageComplete)
              {
                  var message = completionUpdate.Data as MessageObject;
                  if (message!.Type is MessageType.Answer)//MessageComplete时会完整返回回答内容
                  {
                      //保存对话历史                      
                  }
                  else if (message!.Type is MessageType.FollowUp)
                  {
                      yield return new StreamChatResponse(message!.Content!, message.Type!);
                  }
              }
              else if (completionUpdate.Event is CozeNet.Chat.Models.StreamEvents.ChatComplete)
              {
                  var chat = completionUpdate.Data as CozeNet.Chat.Models.ChatObject;
                  //对话完毕,会返回本次对话消耗的token数量等信息
              }
              else if (completionUpdate.Event is CozeNet.Chat.Models.StreamEvents.ChatFailed)
              {
                  var error = completionUpdate.Data as CozeNet.Chat.Models.ChatObject;
                  yield return new StreamChatResponse(error!.LastError?.Message ?? "", "Error");
                  yield break;
              }
              //None, Created, InProgress, DeltaMessage, DeltaAudio, MessageComplete, ChatComplete,       ChatFailed, RequireAction, Error, Done
          }
      }

      return TypedResults.ServerSentEvents(ChatCompleteAsync(message, _chatService,  cancellationToken));
    }

}

AspNet Core集成参考示例

Languages

C#100.0%

Contributors

MIT License
Created May 26, 2025
Updated February 9, 2026
LGinC/CozeNet | GitHunt