唠唠闲话

OpenAI API 的简单封装,用于发送 prompt message 并返回 response。

安装方法

1
pip install openai-api-call --upgrade

使用方法

设置 API 密钥

1
2
import openai_api_call as apicall
apicall.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

或者直接在 ~/.bashrc 中设置 OPENAI_API_KEY,每次启动终端可以自动设置:

1
2
# 在 ~/.bashrc 中添加如下代码
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

当然,你也可以为每个 Chat 对象设置不同的 api_key

1
2
3
from openai_api_call import Chat
chat = Chat("hello")
chat.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

设置代理(可选)

1
2
3
4
5
6
7
8
9
10
11
12
from openai_api_call import proxy_on, proxy_off, proxy_status
# 查看当前代理
proxy_status()

# 设置代理,这里 IP 127.0.0.1 代表本机
proxy_on(http="127.0.0.1:7890", https="127.0.0.1:7890")

# 查看更新后的代理
proxy_status()

# 关闭代理
proxy_off()

或者,你也可以使用代理 URL 来发送请求,如下所示:

1
2
3
4
from openai_api_call import request

# 设置代理 URL
request.bash_url = "https://api.example.com"

基本使用

示例一,发送 prompt 并返回信息:

1
2
3
4
5
6
7
8
9
10
11
12
from openai_api_call import Chat, show_apikey, proxy_status

# 检查 API 密钥是否设置
show_apikey()

# 查看是否开启代理
proxy_status()

# 发送 prompt 并返回 response
chat = Chat("Hello, GPT-3.5!")
resp = chat.getresponse(update=False) # 不更新对话历史,默认为 True
print(resp.content)

示例二,自定义消息模板,并返回信息和消耗的 tokens 数量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import openai_api_call

# 自定义发送模板
openai_api_call.default_prompt = lambda msg: [
{"role": "system", "content": "帮我翻译这段文字"},
{"role": "user", "content": msg}
]
chat = Chat("Hello!")

# 设置重试次数为 Inf,超时时间为 10s
response = chat.getresponse(temperature=0.5, max_requests=-1, timeout=10)
print("Number of consumed tokens: ", response.total_tokens)
print("Returned content: ", response.content)

# 重置默认 Prompt
apicall.default_prompt = None

示例三,多轮对话:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 初次对话
chat = Chat("Hello, GPT-3.5!")
resp = chat.getresponse() # 更新对话历史,默认为 True
print(resp.content)

# 继续对话
chat.user("How are you?")
next_resp = chat.getresponse()
print(next_resp.content)

# 假装对话历史
chat.user("What's your name?")
chat.assistant("My name is GPT-3.5.")

# 打印最后一次谈话
print(chat[-1])

# 打印对话历史
chat.print_log()

此外,你可以使用 Chat 类的 show_usage_status 方法来查看 API 的使用情况:

1
2
3
4
5
6
7
# 查看默认 API 的使用情况
chat = Chat()
chat.show_usage_status()

# 查看指定 API 的使用情况
chat.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
chat.show_usage_status()

附录

官方文档

官方给的 API 调用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 官方文档 https://platform.openai.com/docs/guides/chat/introduction
import openai
openai.api_key="" # 填入密钥
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
print("会话消耗的 token 数目:", response['usage']['total_tokens'])
print("返回消息:", response['choices'][0]['message']['content'])
# 返回数据格式
{
'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
'object': 'chat.completion',
'created': 1677649420,
'model': 'gpt-3.5-turbo',
'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
'choices': [{
'message': {
'role': 'assistant',
'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
'finish_reason': 'stop',
'index': 0}]}

输入的 messages 支持三种角色:

  • system有助于设置 AI 助手的行为
  • user 用于指导 AI,由用户或者开发者直接设置
  • assisant 存储之前的回复内容,也可以由开发者编写,帮助指导 AI

会话通常以 system开头,然后是交替的 userassistant 消息。

编写脚本

  1. APIKey 可以直接在终端使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    OPENAI_API_KEY="" # 这里写入 API_KEY
    curl https://api.openai.com/v1/chat/completions \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
    {"role": "user", "content": "Hello!"}
    ]
    }'
  2. 快捷调用脚本 quickask [message] [API_token]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # quickask
    msg=$1

    # 默认使用传入的 API
    if test $2 ; then
    OPENAI_API_KEY=$2
    fi;

    if ! test $msg ; then
    # 没有指定消息时,使用默认消息
    msg=hello
    fi;
    if ! test $OPENAI_API_KEY ; then
    # 没有指定 API 且未设置环境变量
    OPENAI_API_KEY=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
    fi;

    resp=$(curl https://api.openai.com/v1/chat/completions \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d "{
    \"model\": \"gpt-3.5-turbo\",
    \"messages\": [
    {\"role\": \"user\", \"content\": \"$msg\"}
    ]
    }")

    # 返回
    echo "\n"$resp

更新日志

  • 版本 0.2.0 改用 Chat 类型作为中心交互对象
  • 版本 0.3.0 开始不依赖模块 openai.py ,而是直接使用 requests 发送请求
    • 支持对每个 Chat 使用不同 API 密钥
    • 支持使用代理链接

开发指南

代码通过 ChatGPT 对话 + copilot 代码辅助完成的,极大提高了开发效率和代码规范性。

细节待补充。

Access Token

https://github.com/linweiyuan/go-chatgpt-api/blob/main/example/vscode/chatgpt.http