static ClientWebSocket webSocket0;
static CancellationToken cancellation;
// 应用APPID(必须为webapi类型应用,并开通星火认知大模型授权)
const string x_appid = "xxxxx";
// 接口密钥(webapi类型应用开通星火认知大模型后,控制台--我的应用---星火认知大模型---相应服务的apikey)
const string api_secret = "xxxxxxx";
// 接口密钥(webapi类型应用开通星火认知大模型后,控制台--我的应用---星火认知大模型---相应服务的apisecret)
const string api_key = "xxxxxx";
static string hostUrl = "https://spark-api.xf-yun.com/v3.5/chat";
private void Form2_Load(object sender, EventArgs e)
{
Tasker(textBox1);
}
async public static void Tasker(TextBox box)
{
string authUrl = GetAuthUrl();
string url = authUrl.Replace("http://", "ws://").Replace("https://", "wss://");
using (webSocket0 = new ClientWebSocket())
{
try
{
await webSocket0.ConnectAsync(new Uri(url), cancellation);
JsonRequest request = new JsonRequest();
request.header = new Header()
{
app_id = x_appid,
uid = "12345"
};
request.parameter = new Parameter()
{
chat = new Chat()
{
domain = "generalv3.5",//模型领域,默认为星火通用大模型
temperature = 0.5,//温度采样阈值,用于控制生成内容的随机性和多样性,值越大多样性越高;范围(0,1)
max_tokens = 1024,//生成内容的最大长度,范围(0,4096)
}
};
request.payload = new Payload()
{
message = new Message()
{
text = new List<Content>
{
//new Content() { role = "system", content = "你现在扮演李白,你豪情万丈,狂放不羁;接下来请用李白的口吻和用户对话。" },
new Content() { role = "user", content = "百度的地址是多少" },
// new Content() { role = "assistant", content = "....." }, // AI的历史回答结果,这里省略了具体内容,可以根据需要添加更多历史对话信息和最新问题的内容。
}
}
};
string jsonString = JsonConvert.SerializeObject(request);
//连接成功,开始发送数据
var frameData2 = System.Text.Encoding.UTF8.GetBytes(jsonString.ToString());
webSocket0.SendAsync(new ArraySegment<byte>(frameData2), WebSocketMessageType.Text, true, cancellation);
// 接收流式返回结果进行解析
byte[] receiveBuffer = new byte[1024];
WebSocketReceiveResult result = await webSocket0.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), cancellation);
String resp = "";
while (!result.CloseStatus.HasValue)
{
if (result.MessageType == WebSocketMessageType.Text)
{
string receivedMessage = Encoding.UTF8.GetString(receiveBuffer, 0, result.Count);
//将结果构造为json
JObject jsonObj = JObject.Parse(receivedMessage);
int code = (int)jsonObj["header"]["code"];
JArray textArray1 = (JArray)jsonObj["payload"]["choices"]["text"];
string content1 = (string)textArray1[0]["content"];
box.Text = box.Text+content1;
if (0 == code)
{
int status = (int)jsonObj["payload"]["choices"]["status"];
JArray textArray = (JArray)jsonObj["payload"]["choices"]["text"];
string content = (string)textArray[0]["content"];
resp += content;
if (status != 2)
{
//MessageBox.Show($"已接收到数据: {receivedMessage}");
}
else
{
//MessageBox.Show($"最后一帧: {receivedMessage}");
int totalTokens = (int)jsonObj["payload"]["usage"]["text"]["total_tokens"];
//MessageBox.Show($"整体返回结果: {resp}");
//MessageBox.Show($"本次消耗token数: {totalTokens}");
break;
}
}
else
{
MessageBox.Show($"请求报错: {receivedMessage}");
}
}
else if (result.MessageType == WebSocketMessageType.Close)
{
MessageBox.Show("已关闭WebSocket连接");
break;
}
result = await webSocket0.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), cancellation);
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
// 返回code为错误码时,请查询https://www.xfyun.cn/document/error-code解决方案
static string GetAuthUrl()
{
string date = DateTime.UtcNow.ToString("r");
Uri uri = new Uri(hostUrl);
StringBuilder builder = new StringBuilder("host: ").Append(uri.Host).Append("\n").//
Append("date: ").Append(date).Append("\n").//
Append("GET ").Append(uri.LocalPath).Append(" HTTP/1.1");
string sha = HMACsha256(api_secret, builder.ToString());
string authorization = string.Format("api_key=\"{0}\", algorithm=\"{1}\", headers=\"{2}\", signature=\"{3}\"", api_key, "hmac-sha256", "host date request-line", sha);
//System.Web.HttpUtility.UrlEncode
string NewUrl = "https://" + uri.Host + uri.LocalPath;
string path1 = "authorization" + "=" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(authorization));
date = date.Replace(" ", "%20").Replace(":", "%3A").Replace(",", "%2C");
string path2 = "date" + "=" + date;
string path3 = "host" + "=" + uri.Host;
NewUrl = NewUrl + "?" + path1 + "&" + path2 + "&" + path3;
return NewUrl;
}
public static string HMACsha256(string apiSecretIsKey, string buider)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(apiSecretIsKey);
System.Security.Cryptography.HMACSHA256 hMACSHA256 = new System.Security.Cryptography.HMACSHA256(bytes);
byte[] date = System.Text.Encoding.UTF8.GetBytes(buider);
date = hMACSHA256.ComputeHash(date);
hMACSHA256.Clear();
return Convert.ToBase64String(date);
}
//构造请求体
public class JsonRequest
{
public Header header { get; set; }
public Parameter parameter { get; set; }
public Payload payload { get; set; }
}
public class Header
{
public string app_id { get; set; }
public string uid { get; set; }
}
public class Parameter
{
public Chat chat { get; set; }
}
public class Chat
{
public string domain { get; set; }
public double temperature { get; set; }
public int max_tokens { get; set; }
}
public class Payload
{
public Message message { get; set; }
}
public class Message
{
public List<Content> text { get; set; }
}
public class Content
{
public string role { get; set; }
public string content { get; set; }
}