分享python和c#调用openai的Chat Completions API源码

兄弟朋友们,现在很多大模型的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等的调用示例。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuhanwhite

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值