key:sk-oGiE4vyB6H21XOdVpsPiW1FdM3TnR0ERvCFqbKq3pK2Gc6sR 快速开始 单轮对话 OpenAI 官方 SDK 支持 Python 和 Node.js 两种语言,使用 OpenAI SDK 和 Curl 与 API 进行交互的代码如下:
from openai import OpenAI
client = OpenAI( api_key = "$MOONSHOT_API_KEY", base_url = "https://api.moonshot.cn/v1", )
completion = client.chat.completions.create( model = "kimi-k2-0711-preview", messages = [ {"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"}, {"role": "user", "content": "你好,我叫李雷,1+1等于多少?"} ], temperature = 0.6, )
print(completion.choices[0].message.content)
其中 $MOONSHOT_API_KEY 需要替换为您在平台上创建的 API Key。
使用 OpenAI SDK 时运行文档中的代码时,需要保证 Python 版本至少为 3.7.1,Node.js 版本至少为 18,OpenAI SDK 版本不低于 1.0.0。
pip install --upgrade 'openai>=1.0'
我们可以这样简单检验下自己库的版本:
python -c 'import openai; print("version =",openai.version)'
多轮对话 上面的单轮对话的例子中语言模型将用户信息列表作为输入,并将模型生成的信息作为输出返回。 有时我们也可以将模型输出的结果继续作为输入的一部分以实现多轮对话,下面是一组简单的实现多轮对话的例子:
from openai import OpenAI
client = OpenAI( api_key = "$MOONSHOT_API_KEY", base_url = "https://api.moonshot.cn/v1", )
history = [ {"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"} ]
def chat(query, history): history.append({ "role": "user", "content": query }) completion = client.chat.completions.create( model="kimi-k2-0711-preview", messages=history, temperature=0.6, ) result = completion.choices[0].message.content history.append({ "role": "assistant", "content": result }) return result
print(chat("地球的自转周期是多少?", history)) print(chat("月球呢?", history))
值得注意的是,随着对话的进行,模型每次需要传入的 token 都会线性增加,必要时,需要一些策略进行优化,例如只保留最近几轮对话。
API 说明 Chat Completion 请求地址 POST https://api.moonshot.cn/v1/chat/completions
请求内容 示例 { "model": "kimi-k2-0711-preview", "messages": [ { "role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。" }, { "role": "user", "content": "你好,我叫李雷,1+1等于多少?" } ], "temperature": 0.6 }
文件接口 上传文件 注意,单个用户最多只能上传 1000 个文件,单文件不超过 100MB,同时所有已上传的文件总和不超过 10G 容量。如果您要抽取更多文件,需要先删除一部分不再需要的文件。文件解析服务限时免费,请求高峰期平台可能会有限流策略。
请求地址 POST https://api.moonshot.cn/v1/files
文件上传成功后,我们会开始抽取文件信息。
调用示例 Python 调用
file_object = client.files.create(file=Path("xlnet.pdf"), purpose="file-extract")
支持的格式 文件接口与 Kimi 智能助手中上传文件功能所使用的相同,支持相同的文件格式,它们包括 .pdf .txt .csv .doc .docx .xls .xlsx .ppt .pptx .md .jpeg .png .bmp .gif .svg .svgz .webp .ico .xbm .dib .pjp .tif .pjpeg .avif .dot .apng .epub .tiff .jfif .html .json .mobi .log .go .h .c .cpp .cxx .cc .cs .java .js .css .jsp .php .py .py3 .asp .yaml .yml .ini .conf .ts .tsx 等格式。
文件内容抽取 该功能可以实现让模型获取文件中的信息作为上下文。本功能需要配合文件上传等功能共同使用。
调用示例 from pathlib import Path from openai import OpenAI
client = OpenAI( api_key = "$MOONSHOT_API_KEY", base_url = "https://api.moonshot.cn/v1", )
file_object = client.files.create(file=Path("xlnet.pdf"), purpose="file-extract")
file_content = client.files.content(file_id=file_object.id).text
messages = [ { "role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。", }, { "role": "system", "content": file_content, }, {"role": "user", "content": "请简单介绍 xlnet.pdf 讲了啥"}, ]
completion = client.chat.completions.create( model="kimi-k2-0711-preview", messages=messages, temperature=0.6, )
print(completion.choices[0].message)
其中 $MOONSHOT_API_KEY 部分需要替换为您自己的 API Key。或者在调用前给它设置好环境变量。
多文件对话示例 如果你想一次性上传多个文件,并根据这些文件与 Kimi 对话,你可以参考如下示例:
from typing import *
import os import json from pathlib import Path
from openai import OpenAI
client = OpenAI( base_url="https://api.moonshot.cn/v1", # 我们会从环境变量中获取 MOONSHOT_DEMO_API_KEY 的值作为 API Key, # 请确保你已经在环境变量中正确设置了 MOONSHOT_DEMO_API_KEY 的值 api_key=os.environ["MOONSHOT_DEMO_API_KEY"], )
def upload_files(files: List[str]) -> List[Dict[str, Any]]: """ upload_files 会将传入的文件(路径)全部通过文件上传接口 '/v1/files' 上传,并获取上传后的 文件内容生成文件 messages。每个文件会是一个独立的 message,这些 message 的 role 均为 system,Kimi 大模型会正确识别这些 system messages 中的文件内容。
:param files: 一个包含要上传文件的路径的列表,路径可以是绝对路径也可以是相对路径,请使用字符串
的形式传递文件路径。
:return: 一个包含了文件内容的 messages 列表,请将这些 messages 加入到 Context 中,
即请求 `/v1/chat/completions` 接口时的 messages 参数中。
"""
messages = []
# 对每个文件路径,我们都会上传文件并抽取文件内容,最后生成一个 role 为 system 的 message,并加入
# 到最终返回的 messages 列表中。
for file in files:
file_object = client.files.create(file=Path(file), purpose="file-extract")
file_content = client.files.content(file_id=file_object.id).text
messages.append({
"role": "system",
"content": file_content,
})
return messages
def main(): file_messages = upload_files(files=["upload_files.py"])
messages = [
# 我们使用 * 语法,来解构 file_messages 消息,使其成为 messages 列表的前 N 条 messages。
*file_messages,
{
"role": "system",
"content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,"
"准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不"
"可翻译成其他语言。",
},
{
"role": "user",
"content": "总结一下这些文件的内容。",
},
]
print(json.dumps(messages, indent=2, ensure_ascii=False))
completion = client.chat.completions.create(
model="kimi-k2-0711-preview",
messages=messages,
)
print(completion.choices[0].message.content)
if name == 'main': main()
如果您的文件数量多、体积大、内容长,并且您不想在每次请求都原样携带大体积的文件内容,或是想寻求更加高效且低成本的文件对话方式,请参考使用了 Context Caching 技术的文件上传示例。
列出文件 本功能用于列举出用户已上传的所有文件。
请求地址 GET https://api.moonshot.cn/v1/files
调用示例 Python 调用 file_list = client.files.list()
for file in file_list.data: print(file) # 查看每个文件的信息
删除文件 本功能可以用于删除不再需要使用的文件。
请求地址 DELETE https://api.moonshot.cn/v1/files/{file_id}
调用示例 Python 调用 client.files.delete(file_id=file_id)
获取文件信息 本功能用于获取指定文件的文件基础信息。
请求地址 GET https://api.moonshot.cn/v1/files/{file_id}
调用示例 Python 调用 client.files.retrieve(file_id=file_id)
获取文件内容 本功能支持获取指定文件的文件抽取结果。通常的,它是一个合法的 JSON 格式的 string,并且对齐了我们的推荐格式。 如需抽取多个文件,您可以在某个 message 中用换行符 \n 隔开,拼接为一个大字符串,role 设置为 system 的方式加入历史记录。
请求地址 GET https://api.moonshot.cn/v1/files/{file_id}/content
调用示例
file_content = client.files.content(file_id=file_object.id).text