MUSAChat 在线 API 服务 API

MUSAChat在线API服务是基于摩尔线程自研大语言模型MUSAChat的在线推理API 服务,服务运行于摩尔线程全自研GPU服务器上,对外提供 Chat Completions 接口,可以用于生成文本、问答、摘要、翻译等任务。

API 文档

在线手册

概念介绍

大语言模型推理服务

备案信息: MUSAChat(对应备案模型:摩笔大模型),上线备案号:Beijing-MoBi-202407050022。

语言模型推理服务是摩尔线程大语言模型的 API 服务,运行于摩尔线程全自研 GPU 服务器上,对外提供 Chat Completions 接口,可用于生成文本、问答、摘要、翻译等任务。

Token

文本生成以 Token 为单位处理文本。Token 代表常见的字符序列;对于一段常规中文文本,1 个 Token 大约相当于 1.5~2 个汉字。

使用语言模型推理服务不能超过模型的最大上下文,超过后会被截断。

使用指南

接口描述

MUSAChat(对应备案模型:摩笔大模型)对话接口,用于以对话形式使用该模型的对话能力。用户提供历史对话信息和问题,通过 HTTP 接口调用 MUSAChat Serving API;模型响应后,以流式或非流式形式返回相应结果。该服务的上线备案号为 Beijing-MoBi-202407050022。

发送请求

你可以使用我们的 Chat Completions API 来发送请求,需要提供一个 API 密钥和一个模型名称。

处理响应

请求成功后会返回一个 JSON 格式的响应。

API 文档

基本信息
键 值 说明
接口地址 http://{{endpoint}}/v1/chat/completions endpoint 为 MUSAChat(对应备案模型:摩笔大模型)服务地址
请求方式 HTTP / POST
授权信息 密钥 你需要一个 API 密钥来使用我们的服务。如需试用,请联系我们获取 API 密钥。
请求参数
变量名 类型 是否必填 取值/长度范围 描述 示例值
id String 否 [1, 64] 用于追踪对话的 Session ID,提供后可提升对话效率。 a44ee98c-8273-40d9-92cf-2f49182b45f9
model String 否 [1, 64] 调用 MUSAChat(对应备案模型:摩笔大模型)的模型名称,默认为 MusaChat-Small-4K-v0.26.2。 MusaChat-Small-4K-v0.26.2
messages List<Message> 是 [1, 64] 历史对话信息列表。
stream Bool 否 true / false 是否以流式形式返回。流式返回采用 SSE,非流式返回采用普通 POST 请求;默认为 false。 true
max_tokens Int 否 [1, 2048] 最大回复 Token 数量,默认值为 256。 256
temperature Float 否 [0, 2] 采样温度,默认值为 0.0,表示不采样。值越大,采样越均匀;值越小,采样越集中。 0.0
repetition_penalty Float 否 (0, 2) 重复惩罚系数,默认值为 1.0,表示不惩罚。 1.0
Message
变量名 类型 是否必填 取值/长度范围 描述 示例值
role String 是 system / assistant / user 历史对话信息列表中对应轮次的角色。system 表示系统输入,assistant 表示模型回复,user 表示用户提问;最后一轮对话的 role 必须为 user。 user
content String 是 [0, 2048] 历史对话信息列表中对应轮次的对话内容。 Hello!
返回参数
变量名 类型 是否必有 取值/长度范围 描述 示例值
id String 是 [1, 64] 用于追踪对话的 Session ID,后续对话中提供该 ID 可提升对话效率。 a44ee98c-8273-40d9-92cf-2f49182b45f9
object String 否 [1, 64] 返回结果类型。chat.completion.chunk 表示流式返回结果,chat.completion 表示非流式返回结果。 chat.completion.chunk
created Int 否 [0, MAX_INT] 时间戳。 1677652288
model String 否 [1, 64] 处理该轮次对话的模型名称。 MusaChat-Small-4K-v0.26.2
choices List<Choice> 否 [1, 64] 该轮次对话中模型返回的 N 组选项结果。
usage Usage 否 该轮次模型对话的详细信息,仅在非流式访问时存在。
error Error 否 调用发生错误的详细信息,仅在调用发生错误时存在。
Choice
变量名 类型 是否必有 取值/长度范围 描述 示例值
index Int 是 [0, 16] 该轮次对话中模型回复 N 组选项的编号。 0
delta / message Message 是 模型回复的信息详情,此时 role 字段不一定存在。请求体中的 stream 为 true 时,此处为 delta;stream 为 false 时,此处为 message。
finish_reason String 是 [0, 64] 或 null 模型回复停止标签;值为 stop 时表示回复停止。
Usage
变量名 类型 是否必有 取值/长度范围 描述 示例值
prompt_tokens Int 是 [0, 2048] 本轮对话中,模型拼接历史对话信息后的输入 Token 数。 9
completion_tokens Int 是 [0, 2048] 本轮对话中模型输出的 Token 数。 12
total_tokens Int 是 [0, 2048] 本轮对话使用的全部 Token 数。 21
Error
变量名 类型 是否必有 取值/长度范围 描述 示例值
code Int 是 [0, MAX_INT] 发生错误时返回的错误码,用于表示错误类型。 50001000
message String 是 [0, 512] 发生错误时返回的错误信息,用于定位错误位置与状态。 Unknown Error
错误码
错误代码 描述 可能原因 解决方案
50001000 ModelWorker 组件发生内部未知错误 内部未知错误,无法定位具体原因 联系服务运维人员解决
40001002 ModelWorker 组件发生参数校验错误 参数校验错误,输入参数非法 请根据错误信息调整参数
50002000 ModelServer 组件发生内部未知错误 ModelServer 内部未知错误,无法定位具体原因 联系服务运维人员解决
40002002 ModelServer 组件发生参数校验错误 参数校验错误,输入参数非法 请根据错误信息调整参数
接入示例
非流式正确返回示例
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
    "id": "5ac7deb3-75d9-4b6d-a89f-7a17895b8719",
    "model": "MusaChat-Small-4K-v0.26.2",
    "messages": [
        {
            "role": "system",
            "content": ""
        },
        {
            "role": "user",
            "content": "你好!"
        }
    ],
    "stream": false,
    "max_tokens": 512,
    "temperature": 0.0,
    "repetition_penalty": 1.0
}'
{
    "id": "5ac7deb3-75d9-4b6d-a89f-7a17895b8719",
    "object": "chat.completion",
    "created": 1677652288,
    "model": "MusaChat-Small-4K-v0.26.2",
    "choices":
    [
        {
            "index": 0,
            "message":
            {
                "role": "assistant",
                "content": "你好!有什么我可以帮助你的吗?"
            },
            "finish_reason": "stop"
        }
    ],
    "usage":
    {
        "prompt_tokens": 36,
        "completion_tokens": 13,
        "total_tokens": 49
    }
}
流式正确返回示例
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
    "id": "36af8d58-2620-40ea-89dc-65253db4b889",
    "model": "MusaChat-Small-4K-v0.26.2",
    "messages": [
        {
            "role": "system",
            "content": ""
        },
        {
            "role": "user",
            "content": "你好!"
        }
    ],
    "stream": true,
    "max_tokens": 512,
    "temperature": 0.0,
    "repetition_penalty": 1.0
}'
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":"1"}]}

data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"你"},"finish_reason":"2"}]}

data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"好"},"finish_reason":"3"}]}

data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":"4"}]}

...

data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"提供"},"finish_reason":"44"}]}

data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"帮助"},"finish_reason":"45"}]}

data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"."},"finish_reason":"46"}]}

data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data:[DONE]
非流式错误返回示例
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
    "id": "5ac7deb3-75d9-4b6d-a89f-7a17895b8719",
    "model": "MusaChat-Small-4K-v0.26.2",
    "messages": [
        {
            "role": "system",
            "content": ""
        },
        {
            "role": "user",
            "content": "你好!"
        }
    ],
    "stream": false,
    "max_tokens": 512,
    "temperature": -1,
    "repetition_penalty": 1.0
}'
{
  "error": {
    "code": 40001002,
    "message": "-1 is less than the minimum of 0 - 'temperature'"
  }
}
调用方法
Curl 调用方法
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
    "id": "714fea0b-f7e1-4f25-9514-cf2281161011",
    "model": "MusaChat-Small-4K-v0.26.2",
    "messages": [
        {
            "role": "system",
            "content": ""
        },
        {
            "role": "user",
            "content": "一年有多少天?"
        }
    ],
    "stream": true,
    "max_tokens": 512,
    "temperature": 0.0,
    "repetition_penalty": 1.0
}'
Python 调用方法
import requests
import json


def parse_stream_helper(line: bytes):
    if line:
        if line.strip() == b"data: [DONE]":
            return None
        if line.startswith(b"data: "):
            line = line[len(b"data: "):]
            return line.decode("utf-8")
        else:
            return None
    return None


# 是否需要流式返回
stream = False
data = {
    "messages": [{"role": "user", "content": "你好"}],
    "temperature": 0.0,
    "max_tokens": 512,
    "stream": stream,
}

api_base = "http://{{endpoint}}/v1/"
url = api_base + "/chat/completions"
response = requests.post(url, json=data)
if stream:
    answer = ""
    for line in response.iter_lines():
        item = parse_stream_helper(line)
        if item:
            item = json.loads(item)
            answer += item["choices"][0]["delta"]["content"]
    print(answer)
else:
    resp_data = response.json()
    answer = resp_data["choices"][0]["message"]["content"]
    print(answer)