├── .gitignore ├── ClientV4.cs ├── Models ├── RequestModels │ ├── EmbeddingRequestBase.cs │ ├── FunctionModels │ │ ├── FunctionParameterDescriptor.cs │ │ ├── FunctionParameters.cs │ │ └── FunctionTool.cs │ ├── ImageRequestBase.cs │ ├── ImageToTextModels │ │ ├── ContentType.cs │ │ ├── ImageToTextMessageItem.cs │ │ └── ImageUrlType.cs │ ├── MessageItem.cs │ └── TextRequestBase.cs └── ResponseModels │ ├── EmbeddingModels │ ├── EmbeddingDataItem.cs │ └── EmbeddingResponseBase.cs │ ├── ImageGenerationModels │ ├── ImageResponseBase.cs │ └── ImageResponseDataItem.cs │ ├── ResponseBase.cs │ ├── ResponseChoiceDelta.cs │ ├── ResponseChoiceItem.cs │ └── ToolModels │ ├── FunctionDescriptor.cs │ └── ToolCallItem.cs ├── Modules ├── Chat.cs ├── Embeddings.cs └── Images.cs ├── README.md ├── Test └── Test.cs ├── Utils ├── AuthenticationUtils.cs └── JsonResolver │ └── JsonResolver.cs └── ZhipuApi.csproj /.gitignore: -------------------------------------------------------------------------------- 1 | /obj/* 2 | /bin/* -------------------------------------------------------------------------------- /ClientV4.cs: -------------------------------------------------------------------------------- 1 | using ZhipuApi.Modules; 2 | 3 | namespace ZhipuApi 4 | { 5 | public class ClientV4 6 | { 7 | private string _apiKey; 8 | public Chat chat { get; private set; } 9 | 10 | public Images images { get; private set; } 11 | 12 | public Embeddings embeddings { get; private set; } 13 | 14 | public ClientV4(string apiKey) 15 | { 16 | this._apiKey = apiKey; 17 | this.chat = new Chat(apiKey); 18 | this.images = new Images(apiKey); 19 | this.embeddings = new Embeddings(apiKey); 20 | } 21 | 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /Models/RequestModels/EmbeddingRequestBase.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.RequestModels 2 | { 3 | public class EmbeddingRequestBase 4 | { 5 | // "input": input, 6 | // "model": model, 7 | // "encoding_format": encoding_format, 8 | // "user": user, 9 | public string model { get; private set; } 10 | public string input { get; private set; } 11 | 12 | public EmbeddingRequestBase SetModel(string model) 13 | { 14 | this.model = model; 15 | return this; 16 | } 17 | public EmbeddingRequestBase SetInput(string input) 18 | { 19 | this.input = input; 20 | return this; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /Models/RequestModels/FunctionModels/FunctionParameterDescriptor.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.RequestModels.FunctionModels 2 | { 3 | public enum ParameterType 4 | { 5 | String, 6 | Integer, 7 | } 8 | 9 | public class FunctionParameterDescriptor 10 | { 11 | public string type { get; set; } 12 | public string description { get; set; } 13 | 14 | private static string ToTypeString(ParameterType type) 15 | { 16 | return type switch 17 | { 18 | ParameterType.String => "string", 19 | ParameterType.Integer => "int", 20 | _ => null 21 | }; 22 | } 23 | 24 | public FunctionParameterDescriptor(ParameterType type, string description) 25 | { 26 | this.type = ToTypeString(type); 27 | this.description = description; 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /Models/RequestModels/FunctionModels/FunctionParameters.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace ZhipuApi.Models.RequestModels.FunctionModels 4 | { 5 | public class FunctionParameters 6 | { 7 | public string type { get; set; } 8 | public Dictionary properties { get; } 9 | public string[] required { get; set; } 10 | 11 | public FunctionParameters() 12 | { 13 | this.type = "object"; 14 | this.properties = new Dictionary(); 15 | } 16 | 17 | public FunctionParameters AddParameter(string name, ParameterType type, string description) 18 | { 19 | properties[name] = new FunctionParameterDescriptor(type, description); 20 | return this; 21 | } 22 | 23 | public FunctionParameters SetRequiredParameter(string[] required) 24 | { 25 | this.required = required; 26 | return this; 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /Models/RequestModels/FunctionModels/FunctionTool.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace ZhipuApi.Models.RequestModels.FunctionModels 4 | { 5 | public class FunctionTool 6 | { 7 | public string type { get; set; } 8 | public Dictionary function { get; set; } 9 | 10 | public FunctionTool() 11 | { 12 | this.type = "function"; 13 | this.function = new Dictionary(); 14 | } 15 | 16 | public FunctionTool SetName(string name) 17 | { 18 | this.function["name"] = name; 19 | return this; 20 | } 21 | 22 | public FunctionTool SetDescription(string desc) 23 | { 24 | this.function["description"] = desc; 25 | return this; 26 | } 27 | 28 | public FunctionTool SetParameters(FunctionParameters param) 29 | { 30 | this.function["parameters"] = param; 31 | return this; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /Models/RequestModels/ImageRequestBase.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.RequestModels 2 | { 3 | public class ImageRequestBase 4 | { 5 | // "quality": quality, 6 | // "response_format": response_format, 7 | // "size": size, 8 | // "style": style, 9 | // "user": user, 10 | // public string request_id { get; private set; } 11 | public string model { get; private set; } 12 | public string prompt { get; private set; } 13 | // public int n { get; private set; } 14 | 15 | // public ImageRequestBase SetRequestId(string requestId) 16 | // { 17 | // this.request_id = requestId; 18 | // return this; 19 | // } 20 | 21 | public ImageRequestBase SetModel(string model) 22 | { 23 | this.model = model; 24 | return this; 25 | } 26 | public ImageRequestBase SetPrompt(string prompt) 27 | { 28 | this.prompt = prompt; 29 | return this; 30 | } 31 | // public ImageRequestBase SetN(int n) 32 | // { 33 | // this.n = n; 34 | // return this; 35 | // } 36 | } 37 | } -------------------------------------------------------------------------------- /Models/RequestModels/ImageToTextModels/ContentType.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.RequestModels.ImageToTextModels 2 | { 3 | 4 | public class ContentType 5 | { 6 | public string type { get; set; } 7 | public string text { set; get; } 8 | public ImageUrlType image_url { set; get; } 9 | 10 | public ContentType setType(string type) 11 | { 12 | this.type = type; 13 | return this; 14 | } 15 | 16 | public ContentType setText(string text) 17 | { 18 | this.text = text; 19 | return this; 20 | } 21 | 22 | public ContentType setImageUrl(string image_url) 23 | { 24 | this.image_url = new ImageUrlType(image_url); 25 | return this; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /Models/RequestModels/ImageToTextModels/ImageToTextMessageItem.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.RequestModels.ImageToTextModels 2 | { 3 | 4 | public class ImageToTextMessageItem : MessageItem 5 | { 6 | public ContentType[] content { get; set; } 7 | 8 | public ImageToTextMessageItem(string role) : base(role, null) 9 | { 10 | this.content = new ContentType[2]; 11 | } 12 | 13 | public ImageToTextMessageItem setText(string text) 14 | { 15 | this.content[0] = new ContentType().setType("text").setText(text); 16 | return this; 17 | } 18 | 19 | public ImageToTextMessageItem setImageUrl(string image_url) 20 | { 21 | this.content[1] = new ContentType().setType("Image_url").setImageUrl(image_url); 22 | return this; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /Models/RequestModels/ImageToTextModels/ImageUrlType.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.RequestModels.ImageToTextModels 2 | { 3 | public class ImageUrlType 4 | { 5 | public string url { get; set; } 6 | 7 | public ImageUrlType(string url) 8 | { 9 | this.url = url; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /Models/RequestModels/MessageItem.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.RequestModels 2 | { 3 | public class MessageItem 4 | { 5 | public string role { get; set; } 6 | public virtual string content { get; set; } 7 | 8 | public MessageItem(string role, string content) 9 | { 10 | this.role = role; 11 | this.content = content; 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /Models/RequestModels/TextRequestBase.cs: -------------------------------------------------------------------------------- 1 | using ZhipuApi.Models.RequestModels.FunctionModels; 2 | 3 | namespace ZhipuApi.Models.RequestModels 4 | { 5 | public class TextRequestBase 6 | { 7 | public string request_id { get; private set; } 8 | public string model { get; private set; } 9 | public MessageItem[] messages { get; private set; } 10 | public FunctionTool[] tools { get; private set; } 11 | public string tool_choice { get; private set; } 12 | public double top_p { get; private set; } 13 | public double temperature { get; private set; } 14 | 15 | public bool stream { get; set; } 16 | 17 | public TextRequestBase() 18 | { 19 | this.stream = true; 20 | } 21 | 22 | public TextRequestBase SetRequestId(string requestId) 23 | { 24 | this.request_id = requestId; 25 | return this; 26 | } 27 | 28 | public TextRequestBase SetModel(string model) 29 | { 30 | this.model = model; 31 | return this; 32 | } 33 | 34 | public TextRequestBase SetMessages(MessageItem[] messages) 35 | { 36 | this.messages = messages; 37 | return this; 38 | } 39 | 40 | public TextRequestBase SetTools(FunctionTool[] tools) 41 | { 42 | this.tools = tools; 43 | return this; 44 | } 45 | 46 | public TextRequestBase SetToolChoice(string toolChoice) 47 | { 48 | this.tool_choice = toolChoice; 49 | return this; 50 | } 51 | 52 | public TextRequestBase SetTopP(double topP) 53 | { 54 | this.top_p = topP; 55 | return this; 56 | } 57 | 58 | public TextRequestBase SetTemperature(double temperature) 59 | { 60 | this.temperature = temperature; 61 | return this; 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /Models/ResponseModels/EmbeddingModels/EmbeddingDataItem.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.ResponseModels.EmbeddingModels 2 | { 3 | public class EmbeddingDataItem 4 | { 5 | public int index { get; set; } 6 | public string _object { get; set; } 7 | public double[] embedding { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /Models/ResponseModels/EmbeddingModels/EmbeddingResponseBase.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Text.Json; 3 | 4 | namespace ZhipuApi.Models.ResponseModels.EmbeddingModels 5 | { 6 | public class EmbeddingResponseBase 7 | { 8 | public string model { set; get; } 9 | public string _object { set; get; } 10 | public Dictionary usage { set; get; } 11 | public EmbeddingDataItem[] data { get; set; } 12 | public Dictionary error { get; set; } 13 | 14 | public static EmbeddingResponseBase FromJson(string json) 15 | { 16 | return JsonSerializer.Deserialize(json); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /Models/ResponseModels/ImageGenerationModels/ImageResponseBase.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Text.Json; 3 | 4 | namespace ZhipuApi.Models.ResponseModels.ImageGenerationModels 5 | { 6 | public class ImageResponseBase 7 | { 8 | public long created { get; set; } 9 | public List data { get; set; } 10 | public Dictionary error { get; set; } 11 | 12 | public static ImageResponseBase FromJson(string json) 13 | { 14 | return JsonSerializer.Deserialize(json); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /Models/ResponseModels/ImageGenerationModels/ImageResponseDataItem.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.ResponseModels.ImageGenerationModels 2 | { 3 | public class ImageResponseDataItem 4 | { 5 | public string url { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Models/ResponseModels/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Text.Json; 3 | 4 | namespace ZhipuApi.Models.ResponseModels 5 | { 6 | public class ResponseBase 7 | { 8 | public string id { get; set; } 9 | public string request_id { get; set; } 10 | public long created { get; set; } 11 | public string model { get; set; } 12 | public Dictionary usage { get; set; } 13 | public ResponseChoiceItem[] choices { get; set; } 14 | public Dictionary error { get; set; } 15 | 16 | public static ResponseBase FromJson(string json) 17 | { 18 | try 19 | { 20 | return JsonSerializer.Deserialize(json); 21 | } 22 | catch (JsonException) 23 | { 24 | return null; 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /Models/ResponseModels/ResponseChoiceDelta.cs: -------------------------------------------------------------------------------- 1 | using ZhipuApi.Models.ResponseModels.ToolModels; 2 | 3 | namespace ZhipuApi.Models.ResponseModels 4 | { 5 | public class ResponseChoiceDelta 6 | { 7 | public string role { get; set; } 8 | public string content { get; set; } 9 | public ToolCallItem[] tool_calls { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /Models/ResponseModels/ResponseChoiceItem.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | using ZhipuApi.Models.ResponseModels.ToolModels; 3 | 4 | namespace ZhipuApi.Models.ResponseModels 5 | { 6 | public class ResponseChoiceItem 7 | { 8 | public string finish_reason { get; set; } 9 | public int index { get; set; } 10 | public ResponseChoiceDelta message { get; set; } 11 | public ResponseChoiceDelta delta { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /Models/ResponseModels/ToolModels/FunctionDescriptor.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.ResponseModels.ToolModels 2 | { 3 | public class FunctionDescriptor 4 | { 5 | public string name { get; set; } 6 | public string arguments { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /Models/ResponseModels/ToolModels/ToolCallItem.cs: -------------------------------------------------------------------------------- 1 | namespace ZhipuApi.Models.ResponseModels.ToolModels 2 | { 3 | public class ToolCallItem 4 | { 5 | public string id { get; set; } 6 | public FunctionDescriptor function { get; set; } 7 | public int index { get; set; } 8 | public string type { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /Modules/Chat.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Net.Http; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using ZhipuApi.Models; 8 | using ZhipuApi.Utils; 9 | using System.Diagnostics; 10 | using Newtonsoft.Json; 11 | using ZhipuApi.Models.RequestModels; 12 | using ZhipuApi.Models.ResponseModels; 13 | using ZhipuApi.Utils.JsonResolver; 14 | using JsonSerializer = System.Text.Json.JsonSerializer; 15 | 16 | namespace ZhipuApi.Modules 17 | { 18 | public enum ModelPortal 19 | { 20 | Regular, 21 | Character, 22 | } 23 | 24 | public class Chat 25 | { 26 | 27 | private string _apiKey; 28 | private static readonly int API_TOKEN_TTL_SECONDS = 60 * 5; 29 | 30 | static readonly HttpClient client = new HttpClient(); 31 | 32 | private static readonly Dictionary PORTAL_URLS = new Dictionary 33 | { 34 | { ModelPortal.Regular , "https://open.bigmodel.cn/api/paas/v4/chat/completions"}, 35 | }; 36 | 37 | 38 | public Chat(string apiKey) 39 | { 40 | this._apiKey = apiKey; 41 | } 42 | 43 | private IEnumerable CompletionBase(TextRequestBase textRequestBody) 44 | { 45 | JsonSerializerSettings settings = new JsonSerializerSettings 46 | { 47 | ContractResolver = new JsonResolver(), 48 | Formatting = Formatting.Indented 49 | }; 50 | 51 | var json = JsonConvert.SerializeObject(textRequestBody, settings); 52 | // Console.WriteLine("----1----"); 53 | // Console.WriteLine(json); 54 | var data = new StringContent(json, Encoding.UTF8, "application/json"); 55 | var api_key = AuthenticationUtils.GenerateToken(this._apiKey, API_TOKEN_TTL_SECONDS); 56 | 57 | var request = new HttpRequestMessage 58 | { 59 | Method = HttpMethod.Post, 60 | RequestUri = new Uri("https://open.bigmodel.cn/api/paas/v4/chat/completions"), 61 | Content = data, 62 | Headers = 63 | { 64 | { "Authorization", api_key } 65 | }, 66 | 67 | }; 68 | 69 | var response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result; 70 | var stream = response.Content.ReadAsStreamAsync().Result; 71 | byte[] buffer = new byte[8192]; 72 | int bytesRead; 73 | 74 | while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 75 | { 76 | yield return Encoding.UTF8.GetString(buffer, 0, bytesRead); 77 | } 78 | } 79 | 80 | public ResponseBase Completion(TextRequestBase textRequestBody) 81 | { 82 | textRequestBody.stream = false; 83 | StringBuilder sb = new StringBuilder(); 84 | foreach (var str in CompletionBase(textRequestBody)) 85 | { 86 | sb.Append(str); 87 | } 88 | 89 | // Console.WriteLine(sb.ToString()); 90 | 91 | return ResponseBase.FromJson(sb.ToString()); 92 | } 93 | 94 | public IEnumerable Stream(TextRequestBase textRequestBody) 95 | { 96 | textRequestBody.stream = true; 97 | var buffer = string.Empty; 98 | foreach (var chunk in CompletionBase(textRequestBody)) 99 | { 100 | 101 | buffer += chunk; 102 | 103 | // Console.WriteLine("-----buffer-----"); 104 | // Console.WriteLine(buffer); 105 | // Console.WriteLine("----------------"); 106 | 107 | // Keep checking the buffer to see if we have received a complete JSON 108 | while (true) 109 | { 110 | int startPos = buffer.IndexOf("data: ", StringComparison.Ordinal); 111 | if (startPos == -1) 112 | { 113 | break; 114 | } 115 | 116 | int endPos = buffer.IndexOf("\n\n", startPos, StringComparison.Ordinal); 117 | 118 | if (endPos == -1) 119 | { 120 | // We don't have a complete JSON in our buffer yet, break the loop until we get more chunks 121 | break; 122 | } 123 | 124 | // Calculate the starting position of the actual JSON data after "data: " and "\n\n" 125 | startPos += "data: ".Length; 126 | 127 | // We have a complete JSON, extract it, remove the "data: " prefix and yield return it 128 | string jsonString = buffer.Substring(startPos, endPos - startPos); 129 | // Console.WriteLine(">>" + jsonString); 130 | if (jsonString.Equals("[DONE]")) 131 | { 132 | break; 133 | } 134 | 135 | var response = ResponseBase.FromJson(jsonString); 136 | if (response != null) 137 | { 138 | yield return response; 139 | } 140 | 141 | // Remove the processed JSON plus two "\n"s from our buffer 142 | buffer = buffer.Substring(endPos + "\n\n".Length); 143 | } 144 | 145 | } 146 | 147 | var finalResponse = ResponseBase.FromJson(buffer.Trim()); 148 | if (finalResponse != null) 149 | { 150 | yield return finalResponse; 151 | } 152 | 153 | // Console.WriteLine("-----end-buffer-----"); 154 | // Console.WriteLine(buffer); 155 | // Console.WriteLine("--------------------"); 156 | } 157 | } 158 | } -------------------------------------------------------------------------------- /Modules/Embeddings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Net.Http; 5 | using System.Text; 6 | using System.Text.Json; 7 | using System.Threading.Tasks; 8 | using ZhipuApi.Models; 9 | using ZhipuApi.Utils; 10 | using System.Diagnostics; 11 | using ZhipuApi.Models.RequestModels; 12 | using ZhipuApi.Models.ResponseModels.EmbeddingModels; 13 | 14 | namespace ZhipuApi.Modules 15 | { 16 | public class Embeddings 17 | { 18 | private string _apiKey; 19 | private static readonly int API_TOKEN_TTL_SECONDS = 60 * 5; 20 | static readonly HttpClient client = new HttpClient(); 21 | 22 | public Embeddings(string apiKey) 23 | { 24 | this._apiKey = apiKey; 25 | } 26 | 27 | private IEnumerable ProcessBase(EmbeddingRequestBase requestBody) 28 | { 29 | 30 | 31 | var json = JsonSerializer.Serialize(requestBody); 32 | // Console.WriteLine(JsonSerializer.Serialize(requestBody)); 33 | // Console.WriteLine("----1----"); 34 | // Console.WriteLine(json); 35 | var data = new StringContent(json, Encoding.UTF8, "application/json"); 36 | var api_key = AuthenticationUtils.GenerateToken(this._apiKey, API_TOKEN_TTL_SECONDS); 37 | 38 | var request = new HttpRequestMessage 39 | { 40 | Method = HttpMethod.Post, 41 | RequestUri = new Uri("https://open.bigmodel.cn/api/paas/v4/embeddings"), 42 | Content = data, 43 | Headers = 44 | { 45 | { "Authorization", api_key } 46 | }, 47 | 48 | }; 49 | 50 | var response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result; 51 | var stream = response.Content.ReadAsStreamAsync().Result; 52 | byte[] buffer = new byte[8192]; 53 | int bytesRead; 54 | 55 | while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 56 | { 57 | yield return Encoding.UTF8.GetString(buffer, 0, bytesRead); 58 | } 59 | } 60 | 61 | public EmbeddingResponseBase Process(EmbeddingRequestBase requestBody) 62 | { 63 | StringBuilder sb = new StringBuilder(); 64 | foreach (var str in ProcessBase(requestBody)) 65 | { 66 | sb.Append(str); 67 | } 68 | // Console.WriteLine(sb.ToString()); 69 | 70 | return EmbeddingResponseBase.FromJson(sb.ToString()); 71 | } 72 | 73 | } 74 | } -------------------------------------------------------------------------------- /Modules/Images.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Net.Http; 5 | using System.Text; 6 | using System.Text.Json; 7 | using System.Threading.Tasks; 8 | using ZhipuApi.Models; 9 | using ZhipuApi.Utils; 10 | using System.Diagnostics; 11 | using ZhipuApi.Models.RequestModels; 12 | using ZhipuApi.Models.ResponseModels.ImageGenerationModels; 13 | 14 | namespace ZhipuApi.Modules 15 | { 16 | public class Images 17 | { 18 | private string _apiKey; 19 | private static readonly int API_TOKEN_TTL_SECONDS = 60 * 5; 20 | static readonly HttpClient client = new HttpClient(); 21 | 22 | public Images(string apiKey) 23 | { 24 | this._apiKey = apiKey; 25 | } 26 | 27 | private IEnumerable GenerateBase(ImageRequestBase requestBody) 28 | { 29 | // Console.WriteLine("----1----"); 30 | var json = JsonSerializer.Serialize(requestBody); 31 | // Console.WriteLine(json); 32 | var data = new StringContent(json, Encoding.UTF8, "application/json"); 33 | var api_key = AuthenticationUtils.GenerateToken(this._apiKey, API_TOKEN_TTL_SECONDS); 34 | 35 | var request = new HttpRequestMessage 36 | { 37 | Method = HttpMethod.Post, 38 | RequestUri = new Uri("https://open.bigmodel.cn/api/paas/v4/images/generations"), 39 | Content = data, 40 | Headers = 41 | { 42 | { "Authorization", api_key } 43 | }, 44 | 45 | }; 46 | 47 | var response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result; 48 | var stream = response.Content.ReadAsStreamAsync().Result; 49 | byte[] buffer = new byte[8192]; 50 | int bytesRead; 51 | 52 | while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 53 | { 54 | yield return Encoding.UTF8.GetString(buffer, 0, bytesRead); 55 | } 56 | } 57 | 58 | public ImageResponseBase Generation(ImageRequestBase requestBody) 59 | { 60 | StringBuilder sb = new StringBuilder(); 61 | foreach (var str in GenerateBase(requestBody)) 62 | { 63 | sb.Append(str); 64 | } 65 | // Console.WriteLine(sb.ToString()); 66 | 67 | return ImageResponseBase.FromJson(sb.ToString()); 68 | } 69 | 70 | } 71 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 智谱大模型开放接口SDK 2 | 智谱开放平台大模型接口 C# SDK (Big Model API SDK in C#),让开发者更便捷的调用智谱开放API 3 | 4 | ## 简介 5 | 6 | 如果有 bug 或者缺少需要的功能请提 issues 7 | 8 | ## 安装 9 | 10 | 1. 在VisualStudio打开您的解决方案(.sln)。 11 | 12 | 2. 右键单击解决方案并在弹出的菜单中选择 添加->现有项目。 13 | 14 | 3. 在弹出的对话框中,选择ZhipuApi.csproj文件,然后单击“打开”。 15 | 16 | 4. 右键单击您的项目并选择添加->项目引用。添加ZhipuApi的引用,然后单击确定。 17 | 18 | ## 使用 19 | 20 | ### 对话补全 21 | 22 | ```csharp 23 | var clientV4 = new ClientV4(API_KEY); 24 | var response = clientV4.chat.Completion( 25 | new TextRequestBase() 26 | .SetModel("glm-4") 27 | .SetMessages(new[] { new MessageItem("user", "你好,你是谁?") }) 28 | .SetTemperature(0.7) 29 | .SetTopP(0.7) 30 | ); 31 | 32 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 33 | ``` 34 | 35 | ### 对话补全(流式) 36 | 37 | ```csharp 38 | var clientV4 = new ClientV4(API_KEY); 39 | var responseIterator = clientV4.chat.Stream( 40 | new TextRequestBase() 41 | .SetModel("glm-4") 42 | .SetMessages(new[] 43 | { 44 | new MessageItem("user", "1+1等于多少"), 45 | new MessageItem("assistant", "1+1等于2。"), 46 | new MessageItem("user", "再加2呢?"), 47 | }) 48 | .SetTemperature(0.7) 49 | .SetTopP(0.7) 50 | ); 51 | 52 | foreach (var response in responseIterator) 53 | { 54 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 55 | } 56 | ``` 57 | 58 | ### 工具调用 59 | 60 | ```csharp 61 | var clientV4 = new ClientV4(API_KEY); 62 | var response = clientV4.chat.Completion( 63 | new TextRequestBase() 64 | .SetModel("glm-4") 65 | .SetMessages(new[] { new MessageItem("user", "北京今天的天气如何?") }) 66 | .SetTools(new[] 67 | { 68 | new FunctionTool().SetName("get_weather") 69 | .SetDescription("根据提供的城市名称,提供未来的天气数据") 70 | .SetParameters(new FunctionParameters() 71 | .AddParameter("city", ParameterType.String, "搜索的城市名称") 72 | .AddParameter("days", ParameterType.Integer, "要查询的未来的天数,默认为0") 73 | .SetRequiredParameter(new string[] { "city" })) 74 | }) 75 | .SetToolChoice("auto") 76 | .SetTemperature(0.7) 77 | .SetTopP(0.7) 78 | ); 79 | 80 | Console.WriteLine(JsonSerializer.Serialize(response,DEFAULT_SERIALIZER_OPTION)); 81 | ``` 82 | 83 | ### CogView图像生成 84 | 85 | ```csharp 86 | var clientV4 = new ClientV4(API_KEY); 87 | var response = clientV4.images.Generation(new ImageRequestBase() 88 | .SetModel("cogview") 89 | .SetPrompt("一只可爱的科幻风格小猫咪")); 90 | 91 | Console.WriteLine(JsonSerializer.Serialize(response,DEFAULT_SERIALIZER_OPTION)); 92 | ``` 93 | 94 | ### CogVLM图像识别 95 | 96 | ```csharp 97 | var clientV4 = new ClientV4(API_KEY); 98 | var response = clientV4.chat.Completion( 99 | new TextRequestBase() 100 | .SetModel("cogvlm_28b") 101 | .SetMessages(new [] 102 | { 103 | new ImageToTextMessageItem("user") 104 | .setText("这是什么") 105 | .setImageUrl("") 106 | 107 | }) 108 | .SetTemperature(0.7) 109 | .SetTopP(0.7) 110 | ); 111 | 112 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 113 | ``` 114 | 115 | ### CogVLM图像识别(流式) 116 | 117 | ```csharp 118 | var clientV4 = new ClientV4(API_KEY); 119 | var responseIterator = clientV4.chat.Stream( 120 | new TextRequestBase() 121 | .SetModel("cogvlm_28b") 122 | .SetMessages(new [] 123 | { 124 | new ImageToTextMessageItem("user") 125 | .setText("这是什么") 126 | .setImageUrl("") 127 | 128 | }) 129 | .SetTemperature(0.7) 130 | .SetTopP(0.7) 131 | ); 132 | 133 | foreach (var response in responseIterator) 134 | { 135 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 136 | } 137 | ``` 138 | 139 | ### 文本向量化 140 | 141 | ```csharp 142 | var clientV4 = new ClientV4(API_KEY); 143 | var response = clientV4.embeddings.Process(new EmbeddingRequestBase() 144 | .SetModel("embedding-2") 145 | .SetInput("一只可爱的科幻风格小猫咪")); 146 | 147 | Console.WriteLine(JsonSerializer.Serialize(response,DEFAULT_SERIALIZER_OPTION)); 148 | ``` 149 | -------------------------------------------------------------------------------- /Test/Test.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.Http; 3 | using System.Text.Json; 4 | using System.Threading.Tasks; 5 | using ZhipuApi.Models; 6 | using ZhipuApi.Models.RequestModels; 7 | using ZhipuApi.Models.RequestModels.FunctionModels; 8 | using ZhipuApi.Models.RequestModels.ImageToTextModels; 9 | using JsonSerializer = System.Text.Json.JsonSerializer; 10 | 11 | namespace ZhipuApi.Test 12 | { 13 | public class Test 14 | { 15 | private static readonly int API_TOKEN_TTL_SECONDS = 60 * 5; 16 | static readonly HttpClient client = new HttpClient(); 17 | private static string API_KEY = ""; 18 | 19 | static JsonSerializerOptions DEFAULT_SERIALIZER_OPTION = new JsonSerializerOptions { 20 | Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping 21 | }; 22 | 23 | 24 | private static async Task Main() 25 | { 26 | // TestCompletion(); 27 | // TestStream(); 28 | TestToolsCompletion(); 29 | // TestToolsStream(); 30 | // TestImageGeneration(); 31 | // TestImageToTextCompletion(); 32 | // TestImageToTextStream(); 33 | // TestEmbedding(); 34 | } 35 | 36 | 37 | 38 | public static void TestCompletion() 39 | { 40 | var clientV4 = new ClientV4(API_KEY); 41 | var response = clientV4.chat.Completion( 42 | new TextRequestBase() 43 | .SetModel("glm-4") 44 | .SetMessages(new[] { new MessageItem("user", "你好,你是谁?") }) 45 | .SetTemperature(0.7) 46 | .SetTopP(0.7) 47 | ); 48 | 49 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 50 | } 51 | 52 | public static void TestStream() 53 | { 54 | var clientV4 = new ClientV4(API_KEY); 55 | var responseIterator = clientV4.chat.Stream( 56 | new TextRequestBase() 57 | .SetModel("glm-4") 58 | .SetMessages(new[] 59 | { 60 | new MessageItem("user", "1+1等于多少"), 61 | new MessageItem("assistant", "1+1等于2。"), 62 | new MessageItem("user", "再加2呢?"), 63 | }) 64 | .SetTemperature(0.7) 65 | .SetTopP(0.7) 66 | ); 67 | 68 | foreach (var response in responseIterator) 69 | { 70 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 71 | } 72 | } 73 | 74 | public static void TestToolsCompletion() 75 | { 76 | var clientV4 = new ClientV4(API_KEY); 77 | var response = clientV4.chat.Completion( 78 | new TextRequestBase() 79 | .SetModel("glm-4") 80 | .SetMessages(new[] { new MessageItem("user", "北京今天的天气如何?") }) 81 | .SetTools(new[] 82 | { 83 | new FunctionTool().SetName("get_weather") 84 | .SetDescription("根据提供的城市名称,提供未来的天气数据") 85 | .SetParameters(new FunctionParameters() 86 | .AddParameter("city", ParameterType.String, "搜索的城市名称") 87 | .AddParameter("days", ParameterType.Integer, "要查询的未来的天数,默认为0") 88 | .SetRequiredParameter(new string[] { "city" })) 89 | }) 90 | .SetToolChoice("auto") 91 | .SetTemperature(0.7) 92 | .SetTopP(0.7) 93 | ); 94 | 95 | Console.WriteLine(JsonSerializer.Serialize(response,DEFAULT_SERIALIZER_OPTION)); 96 | } 97 | 98 | public static void TestToolsStream() 99 | { 100 | var clientV4 = new ClientV4(API_KEY); 101 | var responseIterator = clientV4.chat.Stream( 102 | new TextRequestBase() 103 | .SetModel("glm-4") 104 | .SetMessages(new[] { new MessageItem("user", "北京今天的天气如何?") }) 105 | .SetTools(new[] 106 | { 107 | new FunctionTool().SetName("get_weather") 108 | .SetDescription("根据提供的城市名称,提供未来的天气数据") 109 | .SetParameters(new FunctionParameters() 110 | .AddParameter("city", ParameterType.String, "搜索的城市名称") 111 | .AddParameter("days", ParameterType.Integer, "要查询的未来的天数,默认为0") 112 | .SetRequiredParameter(new string[] { "city" })) 113 | }) 114 | .SetToolChoice("auto") 115 | .SetTemperature(0.7) 116 | .SetTopP(0.7) 117 | ); 118 | 119 | foreach (var response in responseIterator) 120 | { 121 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 122 | } 123 | } 124 | 125 | public static void TestImageGeneration() 126 | { 127 | var clientV4 = new ClientV4(API_KEY); 128 | var response = clientV4.images.Generation(new ImageRequestBase() 129 | .SetModel("cogview") 130 | .SetPrompt("一只可爱的科幻风格小猫咪")); 131 | 132 | Console.WriteLine(JsonSerializer.Serialize(response,DEFAULT_SERIALIZER_OPTION)); 133 | 134 | } 135 | 136 | public static void TestImageToTextCompletion() 137 | { 138 | var clientV4 = new ClientV4(API_KEY); 139 | var response = clientV4.chat.Completion( 140 | new TextRequestBase() 141 | .SetModel("cogvlm_28b") 142 | .SetMessages(new [] 143 | { 144 | new ImageToTextMessageItem("user") 145 | .setText("这是什么") 146 | .setImageUrl("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") 147 | 148 | }) 149 | .SetTemperature(0.7) 150 | .SetTopP(0.7) 151 | ); 152 | 153 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 154 | } 155 | 156 | public static void TestImageToTextStream() 157 | { 158 | var clientV4 = new ClientV4(API_KEY); 159 | var responseIterator = clientV4.chat.Stream( 160 | new TextRequestBase() 161 | .SetModel("cogvlm_28b") 162 | .SetMessages(new [] 163 | { 164 | new ImageToTextMessageItem("user") 165 | .setText("这是什么") 166 | .setImageUrl("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") 167 | 168 | }) 169 | .SetTemperature(0.7) 170 | .SetTopP(0.7) 171 | ); 172 | 173 | foreach (var response in responseIterator) 174 | { 175 | Console.WriteLine(JsonSerializer.Serialize(response, DEFAULT_SERIALIZER_OPTION)); 176 | } 177 | } 178 | 179 | public static void TestEmbedding() 180 | { 181 | var clientV4 = new ClientV4(API_KEY); 182 | var response = clientV4.embeddings.Process(new EmbeddingRequestBase() 183 | .SetModel("embedding-2") 184 | .SetInput("一只可爱的科幻风格小猫咪")); 185 | 186 | Console.WriteLine(JsonSerializer.Serialize(response,DEFAULT_SERIALIZER_OPTION)); 187 | 188 | } 189 | } 190 | } -------------------------------------------------------------------------------- /Utils/AuthenticationUtils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IdentityModel.Tokens.Jwt; 3 | using System.Text; 4 | using Microsoft.IdentityModel.Tokens; 5 | 6 | namespace ZhipuApi.Utils 7 | { 8 | public class AuthenticationUtils 9 | { 10 | public static string GenerateToken(string apiKey, int expSeconds) 11 | { 12 | 13 | var parts = apiKey.Split('.'); 14 | if (parts.Length != 2) 15 | { 16 | throw new ArgumentException("Invalid API key format."); 17 | } 18 | 19 | string id = parts[0]; 20 | string secret = parts[1]; 21 | byte[] keyBytes = Encoding.UTF8.GetBytes(secret); 22 | if (keyBytes.Length < 32) 23 | { 24 | // Extend the key to meet the minimum length requirement 25 | Array.Resize(ref keyBytes, 32); 26 | } 27 | 28 | var securityKey = new SymmetricSecurityKey(keyBytes); 29 | var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); 30 | 31 | var payload = new JwtPayload 32 | { 33 | { "api_key", id }, 34 | { "exp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() + expSeconds }, 35 | { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() } 36 | }; 37 | 38 | var header = new JwtHeader(credentials); 39 | header.Add("sign_type", "SIGN"); 40 | 41 | var token = new JwtSecurityToken(header, payload); 42 | 43 | return new JwtSecurityTokenHandler().WriteToken(token); 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /Utils/JsonResolver/JsonResolver.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | using Newtonsoft.Json; 4 | using Newtonsoft.Json.Serialization; 5 | using ZhipuApi.Models; 6 | using ZhipuApi.Models.RequestModels; 7 | using ZhipuApi.Models.RequestModels.ImageToTextModels; 8 | 9 | namespace ZhipuApi.Utils.JsonResolver 10 | { 11 | public class JsonResolver : DefaultContractResolver 12 | { 13 | protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 14 | { 15 | JsonProperty property = base.CreateProperty(member, memberSerialization); 16 | 17 | if (property.DeclaringType == typeof(MessageItem) && property.PropertyName == "content") 18 | { 19 | Predicate shouldSerialize = instance => 20 | { 21 | if (instance is ImageToTextMessageItem) 22 | { 23 | return false; 24 | } 25 | return true; 26 | }; 27 | property.ShouldSerialize = shouldSerialize; 28 | } 29 | 30 | return property; 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /ZhipuApi.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net5.0 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | --------------------------------------------------------------------------------