说明
目前天翼云息壤的新老用户均可免费体验2500万Tokens,限时两周。模型广场支持DeepSeek-R1、DeepSeek-V3等多个版本模型的调用。
支持开发者以OpenAI-API-compatible接口方式集成调用。
天翼云官网获取模型调用APP key等信息
模型API终端请求地址
请求地址
API终端请求地址:https://wishub-x1.ctyun.cn/v1/chat/completions
通信协议
接口通过 HTTPS 进行通信,保护用户数据的机密性和完整性,确保网络通信的安全性。
请求方法
支持的 HTTP 请求方法:POST。
POST 请求支持的 Content-Type 类型:application/json。
获取模型调用APP key
访问天翼云息壤deepseek活动页地址:https://www.ctyun.cn/act/xirang/deepseek,选择“立即体验”。
登录天翼云账户,进入“体验中心”后切换到“服务接入”。
在“服务接入”下面,创建建服务组。选择默认勾选的模型即可。
创建服务组后,从服务组上面获取APP KEY。
获取调用的模型名称
左侧导航栏切换到“模型广场”,选择对应想要调用的模型。
获取模型ID作为模型名称。
例如下图中模型ID为 : 4bd107bff85941239e27b1509eccfe98
DeepSeek模型版本选择参考:
DeepSeek-R1:适合需要高级推理能力和高精度的复杂任务,如科研、金融建模等。响应时间相对长。
DeepSeek-V3:适合需要快速响应和高性价比的通用自然语言处理任务,如智能客服、内容生成等。响应时间相对短。
手动验证key的可用性
下列请求如果正常返回deepseek回答,代表没有问题。
注意
以下curl请求中替换成自己的API KEY后类似“--header 'Authorization: Bearer abcdefghxxsssss' \ ”
curl --location 'https://wishub-x1.ctyun.cn/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 替换成自己的API KEY' \
--data '{
"messages": [
{
"role": "system",
"content": "You are a test assistant."
},
{
"role": "user",
"content": "Testing. Just say hi and nothing else."
}
],
"model": "4bd107bff85941239e27b1509eccfe98" //DeepSeek-R1模型名
}'
调用代码示例
Python
同步调用
import os
import openai
from openai import OpenAI
# 需要补充一下属性
baseUrl = "https://wishub-x1.ctyun.cn/v1"
# 从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
appKey=os.getenv("XIRANG_app_key")
DeepSeek_R1_model_id = "4bd107bff85941239e27b1509eccfe98"
DeepSeek_V3_model_id = "9dc913a037774fc0b248376905c85da5"
prompt="你好,3.01+103.1等于多少" #对话问题
def main():
client = OpenAI(base_url=baseUrl, api_key=appKey)
messages = [
{"role": "user", "content": prompt}
]
try:
res = client.chat.completions.create(
model=DeepSeek_R1_model_id,
messages=messages,
stream=False
)
print(res.choices[0].message.content or "", end="", flush=True)
except openai.APIStatusError as e:
print(f"APIStatusError: {e.status_code}, {e.message}, {e.body}")
except openai.APIError as e:
print(f"APIError: {e.body}")
except Exception as e:
print(f"Exception: {e}")
if __name__ == "__main__":
main()
流式调用
import os
import openai
from openai import OpenAI
# 需要补充一下属性
baseUrl = "https://wishub-x1.ctyun.cn/v1"
# 从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
appKey=os.getenv("XIRANG_app_key")
DeepSeek_R1_model_id = "4bd107bff85941239e27b1509eccfe98"
DeepSeek_V3_model_id = "9dc913a037774fc0b248376905c85da5"
prompt= "你是谁"
def main():
client = OpenAI(base_url=baseUrl, api_key=appKey)
messages = [
{"role": "user", "content": prompt}
]
try:
stream = client.chat.completions.create(
model=DeepSeek_R1_model_id,
messages=messages,
stream=True
)
# 流式
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
except openai.APIStatusError as e:
print(f"APIStatusError: {e.status_code}, {e.message}, {e.body}")
except openai.APIError as e:
print(f"APIError: {e.body}")
except Exception as e:
print(f"Exception: {e}")
if __name__ == "__main__":
main()
Java
说明
建议与Spring AI框架直接集成;
参考本文「开源框架集成—Spring AI」章节实现。
Golang
注意
golang版本要求1.18以上;
go.mod引用相关类库 go get github.com/sashabaranov/go-openai。
同步调用
package main
import (
"context"
"fmt"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
"os"
)
func main() {
baseUrl:="https://wishub-x1.ctyun.cn/v1" //api前缀地址
//从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
appkey:=os.Getenv("XIRANG_app_key")
modelId:="xxxxxx" //替换成自己要用的模型
prompt:="你是谁" //对话问题
client := openai.NewClient(
option.WithAPIKey(appkey),
option.WithBaseURL(baseUrl),
)
completion, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Messages: openai.F([]openai.ChatCompletionMessageParamUnion{
openai.ChatCompletionMessage{Content: prompt, Role: "user"},
}),
Model: openai.F(modelId),
})
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content) //打印模型输出
}
流式调用
package main
import (
"context"
"fmt"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
"os"
)
func main() {
baseUrl := "https://wishub.ctyun.cn:1443/v1" //api前缀地址
//从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
appkey := os.Getenv("XIRANG_app_key")
modelId := "xxxxxx" //模型id
prompt := "你好啊" //对话问题
client := openai.NewClient(
option.WithAPIKey(appkey),
option.WithBaseURL(baseUrl),
)
stream := client.Chat.Completions.NewStreaming(context.Background(), openai.ChatCompletionNewParams{
Messages: openai.F([]openai.ChatCompletionMessageParamUnion{
openai.ChatCompletionMessage{Content: prompt, Role: "user"},
}),
Model: openai.F(modelId),
})
for stream.Next() {
evt := stream.Current()
if len(evt.Choices) > 0 {
fmt.Print(evt.Choices[0].Delta.Content)
}
}
if err := stream.Err(); err != nil {
panic(err)
}
}
PHP
注意
php版本要求8.3.13以上;
安装composer组件;
运行以下命令:
composer require openai-php/client
composer dump-autoload
同步调用
<?php
require __DIR__ . '/vendor/autoload.php';
use OpenAI\Client;
$baseUrl="https://wishub-x1.ctyun.cn/v1"; //api前缀地址
//从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
$appkey = getenv("XIRANG_app_key");
$modelId="xxxxx"; //替换成自己要用的模型
$prompt="你好,介绍一下自己"; //#对话问题
$client = OpenAI::factory()
->withApiKey($appkey)
->withBaseUri($baseUrl)
->make();
$response = $client->chat()->create([
'model' => $modelId,
'messages' => [
['role' => 'user', 'content' => $prompt],
],
]);
foreach ($response->choices as $result) {
echo $result->message->content;
}
流式调用
<?php
require __DIR__ . '/vendor/autoload.php';
use OpenAI\Client;
$baseUrl="https://wishub-x1.ctyun.cn/v1"; //api前缀地址
//从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
$appkey = getenv("XIRANG_app_key");
$modelId="xxxxx"; //替换成自己要用的模型
$prompt="你好,介绍一下自己"; //#对话问题
$client = OpenAI::factory()
->withApiKey($appKey)
->withBaseUri($baseUrl)
->make();
$stream = $client->chat()->createStreamed([
'model' => $modelId,
'messages' => [
['role' => 'user', 'content' => $prompt],
],
]);
foreach($stream as $response){
$data=$response->choices[0];
echo json_encode($data, JSON_UNESCAPED_UNICODE,JSON_PRETTY_PRINT).PHP_EOL;
}
Nodejs
注意
测试用的node版本>=v17.9.1,npm版本>=8.11.0;
运行前需执行一下命令:
npm init -y
npm install openai在生成的package.json文件中添加"type":"module";
替换baseUrl,appkey,modelId,prompt等字段的值。
同步调用
import OpenAI from 'openai';
const baseUrl="https://wishub-x1.ctyun.cn/v1" //api前缀地址
//从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
const appkey= process.env.XIRANG_app_key
const modelId="xxxxx" //模型id
const prompt="你好啊,给一篇100字左右的作文" //对话问题
const client = new OpenAI({
apiKey: appkey,
baseURL:baseUrl
});
async function chatCompletion() {
const completion = await client.chat.completions.create({
model: modelId,
messages: [{ role: 'user', content: prompt }],
});
console.log(completion.choices[0]?.message?.content);
}
chatCompletion();
流式调用
import OpenAI from 'openai';
const baseUrl="https://wishub-x1.ctyun.cn/v1" //api前缀地址
//从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
const appkey= process.env.XIRANG_app_key
const modelId="xxxxx" //模型id
const prompt="你好啊,给一篇100字左右的作文" //对话问题
const client = new OpenAI({
apiKey: appkey,
baseURL:baseUrl
});
async function stream_chatCompletion() {
const stream = await client.chat.completions.create({
model: modelId,
messages: [{ role: 'user', content: prompt }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '');
}
}
stream_chatCompletion();
开源框架集成
说明
部分第三方工具调用可能存在接口不适配问题,如涉及工具调用时,建议优先使用下文提及的工具。
涉及第三方工具配置时,API key等同于上文中创建的服务组APP key。
Langchain调用
参考langchain的自定义模型文档通过OpenAI协议调用即可。
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
def main():
# 初始化LangChain模型,配置自定义API端点
llm = ChatOpenAI(
model_name="9dc913a037774fc0b248376905c85da5", # 自定义模型名称
# 从环境变量获取API密钥,如果没有设置,也可以直接终端执行export XIRANG_app_key="xxx"
openai_api_key=os.getenv("XIRANG_app_key)
openai_api_base="https://wishub-x1.ctyun.cn/v1", # API基础URL
temperature=0.7
)
# 创建一个聊天消息
message = HumanMessage(content="你是谁")
# 使用LangChain进行对话
response = llm([message])
print(response.content)
if __name__ == "__main__":
main()
Dify
说明
- 前置条件:本地下载并安装Docker。
- 访问 Docker 官方网站,点击“Download Docker Desktop”按钮,选择合适的 Windows、macOS 或 Linux版本下载并安装。
当前仅支持0.15.3版本,最新版本的1.0.1正在适配中,预计4月初支持。
拉取镜像到本地
# 假设当前最新版本为 0.15.3
git clone https://github.com/langgenius/dify.git --branch 0.15.3
修改配置参数
cd docker
mv .env.example .env
#在.env文件添加
CUSTOM_MODEL_ENABLED=true
OLLAMA_API_BASE_URL=host.docker.internal:11434
修改compose文件
需要修改下api和work的镜像地址,改为增加了xirang模型供应商的dify 0.15.3版本
services:
# API service with Xirang model provider
api:
image: telecom-eci-huadong1-crs-registry-huadong1.crs.ctyun.cn/xirang/dify-with-xirang:0.15.3 # 原来为langgenius/dify-api:0.15.3
# worker service
# The Celery worker for processing the queue.
worker:
image: telecom-eci-huadong1-crs-registry-huadong1.crs.ctyun.cn/xirang/dify-with-xirang:0.15.3 # 原来为langgenius/dify-api:0.15.3
启动并验证
#执行:
docker compose up -d
# 等服务启动访问
http://localhost/apps
配置天翼云息壤模型
在个人设置里面点击模型供应商,选择天翼云模型。
点击保存后,可以看到模型的配置。
其他非预置模型。
配置对话助手
常见问题
如遇到无法展示问题,可能是因为您的dify版本为最新版,我们目前还不支持,可执行以下操作切换到0.15.3版本并重启服务。
dify插件需要切换版本重新启动服务才可以达成兼容
git clone https://gitcode.com/gh_mirrors/di/dify.git
cd dify
git checkout 7796984444191c639bd3c541a44e832b17ad1cae
如遇到息壤镜像失败问题,可切换到dify原始镜像,通过配置直接配置OpenAI-API-compatible支持,配置方式如下:
Spring AI
注意
Spring AI要求使用JDK 17或更高版本,Spring AI需要在Spring Boot 3.2.x或更高版本的环境中运行。
核心代码如下:
OpenAIConfig配置类:
package com.demo.aitest;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.api.OpenAiApi;
@Configuration
public class OpenAIConfig {
@Value("${spring.ai.openai.api-key}")
private String apiKey;
@Value("${spring.ai.openai.base-url}")
private String baseUrl;
@Value("${spring.ai.openai.chat.options.model}")
private String model;
@Bean
public OpenAiChatClient openAiChatClient() {
OpenAiApi openAiApi = new OpenAiApi(baseUrl, apiKey);
OpenAiChatOptions options = new OpenAiChatOptions();
options.setModel(model);
options.setFrequencyPenalty(0.0f);
options.setMaxTokens(2000);
return new OpenAiChatClient(openAiApi, options);
}
}
ChatController 类:
package com.lili.aitest;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
@RestController
public class ChatController {
private static final Logger logger = LoggerFactory.getLogger(ChatController.class);
@Autowired
private OpenAiChatClient chatClient;
@GetMapping("/chat")
public String chat(@RequestParam String message) {
try {
ChatResponse response = chatClient.call(new Prompt(message));
String content = response.getResult().getOutput().getContent();
logger.info("Response received successfully");
return content;
} catch (Exception e) {
logger.error("Error processing chat request: {}", e.getMessage());
throw e;
}
}
@GetMapping(value = "/chat/stream", produces = "text/event-stream;charset=UTF-8")
public SseEmitter streamChat(@RequestParam String message) {
SseEmitter emitter = new SseEmitter(-1L); // 无限超时
try {
// Create prompt with UserMessage
Prompt prompt = new Prompt(new UserMessage(message));
// Stream the response
chatClient.stream(prompt).subscribe(
chunk -> {
try {
if (chunk != null && chunk.getResult() != null) {
String content = chunk.getResult().getOutput().getContent();
if (content != null && !content.isEmpty()) {
emitter.send(content);
}
}
} catch (IOException e) {
logger.error("Error sending chunk: {}", e.getMessage());
emitter.completeWithError(e);
}
},
error -> {
logger.error("Error in stream: {}", error.getMessage());
emitter.completeWithError(error);
},
() -> {
logger.info("Stream completed successfully");
emitter.complete();
}
);
} catch (Exception e) {
logger.error("Error processing streaming chat request: {}", e.getMessage());
emitter.completeWithError(e);
}
return emitter;
}
}
application.yml配置如下:
spring:
ai:
openai:
api-key: Your_APP_KEY #替换成👆自己的API KEY
base-url: https://wishub-x1.ctyun.cn
chat:
options:
model: 4bd107bff85941239e27b1509eccfe98. #替换成👆自己要用的模型
server:
servlet:
encoding:
charset: UTF-8
force: true
enabled: true
pom.xml依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>aitest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>aitest</name>
<description>aitest</description>
<properties>
<java.version>17</java.version>
<spring-ai.version>0.8.1</spring-ai.version>
<spring-cloud.version>2023.0.0</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>${spring-ai.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
访问地址:
同步:http://localhost:8080/chat?message=Hello
流式访问:http://localhost:8080/chat/stream?message=Hello
Ragflow
注意
目前息壤model不支持embedding model能力,因此只能作为chat model提供能力。
下载镜像git clone https://github.com/infiniflow/ragflow.git
通过docker安装并启动。
cd ragflow/docker
docker compose -f docker-compose-CN.yml up -d
检查 RAGFlow 服务是否正常启动。
docker logs -f ragflow-server
如果看到类似以下输出,则表示启动成功:
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:9380
* Running on http://x.x.x.x:9380
打开浏览器配置模型Xinference服务提供商。
在浏览器中输入服务器的 IP 地址访问 RAGFlow。默认情况下,RAGFlow 使用 HTTP 端口 80,因此无需输入端口号。
选择“Xinference”模型服务商( Xinference是工厂配置,支持自定义模型名称)。
配置chatmodel的界面如下:
回到对话界面,配置聊天助手:
开启对话:
常见报错
触发限流
报错信息为:[openai_api_compatible]Error:APIrequestfailedwithstatuscode429:{"code":700007,"detail":"Deepseek模型并发已达上限","message":"DEEP_SEEK_MODEL_CONCURRENCY_LIMIT","error":{"code":"700007","message":"Deepseek模型并发已达上限","type":"DEEP_SEEK_MODEL_CONCURRENCY_LIMIT"}}
问题原因:大模型并发是大模型的并发能力,和用户、tokens是否用完都无关,只和机器负载能力有关。目前单个模型有固定的并发度,这是所有ds模型共享的并发度,只能支持固定个请求同时访问。
解决方案:等一段时间再调用,或增加重试机制。
同步调用响应耗时长
问题原因:大模型API同步耗时长是因为其推理过程复杂,需要逐个生成token并拼接结果,且在处理长文本或复杂问题时,等待完整结果返回的时间过长。而流式API可以在推理过程中逐步返回结果,用户无需等待全部结果生成,从而提升交互效率。解决方案:改为流式调用。