兄弟朋友们,现在很多大模型的api接口调用基本都参照的是openai的chatgpt的chat completions api,
开发小项目中需要调用api接口时,如果遇到需要调用这种接口的时候,下面代码应该用得着,我都是经过测试,没啥问题,分享出来,给需要用得到的朋友们。
1,Python语言
那种直接import openai的代码,官网上有,我就不分享了,这里主要用的是Curl Post的方式来调用api,废话不多说,直接上代码
import requests
def chat_api_curl(prompt):
# 请确保将以下变量替换为您的实际API密钥
openai_api_key = 'sk-xxxx'
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {openai_api_key}"
}
data = {
"model": "gpt-3.5-turbo",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt},
]
}
response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=data)
# 检查响应是否成功
if response.status_code == 200:
# 解析响应数据
response_data = response.json()
# 获取choices列表中的第一个元素的message字典的content值
content = response_data['choices'][0]['message']['content']
return content
else:
print("请求失败,状态码:", response.status_code)
print("响应内容:", response.text)
prompt = "hi"
res = chat_api_curl(prompt)
print(res)
chat_api_curl直接写成了一个方法,传参prompt就可以获取接口返回值了。
2,C#语言
如果用c#不想导入任何openai的NuGet包的话,那么也可以用System.Net.Http;我下面分享的代码是可以在.net framework 4.8环境中可以运行,不需要用户去下载.net6或者7,8,只用导入一个Newtonsoft.Json的Nuget包就可以了,整个项目大小也才1.4M
只需要导入这个包
我把它写成了一个异步不会阻塞的function,可以方便调用。
private async Task<string> GetOpenAIAnswer(string userInput)
{
try
{
using (var httpClient = new HttpClient())
{
var api_key = "sk-xxxxx"; // 替换为您的 API 密钥
var base_url = "https://api.openai.com/v1/chat/completions"; // 替换为您的 API 基础 URL
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {api_key}");
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
// 构造请求数据
var data = new
{
model = "gpt-4",
messages = new List<dynamic>
{
new { role = "system", content = "你是一个AI机器人" },
new { role = "user", content = userInput }
},
temperature = 0.3
};
// 序列化请求数据
var jsonRequest = JsonConvert.SerializeObject(data, Formatting.None, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
// 创建请求内容
var content = new StringContent(jsonRequest, Encoding.UTF8, "application/json");
// 发送请求
var response = await httpClient.PostAsync($"{base_url}/chat/completions", content);
// 检查响应状态码
if (response.IsSuccessStatusCode)
{
// 读取响应内容
var jsonResponse = await response.Content.ReadAsStringAsync();
dynamic responseData = JsonConvert.DeserializeObject(jsonResponse);
string answer = responseData.choices[0].message.content;
return answer;
}
else
{
// 返回错误信息
return $"Error: {response.StatusCode} - {response.ReasonPhrase}";
}
}
}
catch (HttpRequestException ex)
{
// 捕获并返回异常信息
return $"HttpRequestException: {ex.Message}";
}
catch (Exception ex)
{
// 捕获并返回其他异常信息
return $"Exception: {ex.Message}";
}
}
调用的时候只用提示词作为参数传进去就行了,举个例子如下:
private async void button1_Click(object sender, EventArgs e) //异步调用
{
try
{
txtAnswer.Text = "Thinking..."; // 提示用户正在处理
string question = txtQuestion.Text.Trim();
if (!string.IsNullOrEmpty(question))
{
string answer = await GetOpenAIAnswer(question); //将问题作为参数传进去就可以调用了
txtAnswer.Text = answer;
}
else
{
txtAnswer.Text = "Please ask a question.";
}
}
catch (Exception ex)
{
txtAnswer.Text = "Error: " + ex.Message;
}
}
我做了个Winform效果,就是这样,
好了,今天就分享这2个开发语言的示例代码,后面有机会再分享其他后端语言比如php或者nodejs,java等的调用示例。