base_url https://cuddle.com.ai/v1
api_key sk- +
# 原来的写法(官方)
client = OpenAI(base_url="https://api.openai.com/v1", api_key="sk-...")

# 换成我们的(其余代码一行不动)
client = OpenAI(base_url="https://cuddle.com.ai/v1", api_key="sk-你的令牌")

from openai import OpenAI

client = OpenAI(base_url="https://cuddle.com.ai/v1", api_key="sk-你的令牌")

resp = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "system", "content": "你是一个简洁的助手。"},
        {"role": "user", "content": "用三句话解释向量数据库"},
    ],
    temperature=0.7,
    max_tokens=1024,
)
print(resp.choices[0].message.content)
print(resp.usage)   # prompt_tokens / completion_tokens / total_tokens
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://cuddle.com.ai/v1',
  apiKey: process.env.API_KEY,
});

const resp = await client.chat.completions.create({
  model: 'deepseek-flash',
  messages: [{ role: 'user', content: '用三句话解释向量数据库' }],
});
console.log(resp.choices[0].message.content);
package main

import (
	"context"
	"fmt"

	openai "github.com/sashabaranov/go-openai"
)

func main() {
	cfg := openai.DefaultConfig("sk-你的令牌")
	cfg.BaseURL = "https://cuddle.com.ai/v1"
	c := openai.NewClientWithConfig(cfg)

	resp, err := c.CreateChatCompletion(context.Background(),
		openai.ChatCompletionRequest{
			Model: "deepseek-flash",
			Messages: []openai.ChatCompletionMessage{{
				Role:    openai.ChatMessageRoleUser,
				Content: "用三句话解释向量数据库",
			}},
		})
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Choices[0].Message.Content)
}
curl https://cuddle.com.ai/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-你的令牌" \
  -d '{
    "model": "deepseek-flash",
    "messages": [{"role": "user", "content": "你好"}]
  }'
stream = client.chat.completions.create(
    model="deepseek-flash",
    messages=[{"role": "user", "content": "写一首短诗"}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

# 说明:客户端断开连接时,我们会同步取消上游请求。
# 上游在连接断开后**可能仍会继续计费**,不同步取消的话
# 这笔钱由我们承担 —— 所以这个同步取消是必需的,不是优化。

POST /v1/chat/completions
POST /v1/completions
POST /v1/embeddings
POST /v1/images/generations
POST /v1/audio/speech
GET /v1/models

model
messages
stream
temperature
max_tokens
tools
response_format

400
401
402
403
404
408
429
500 / 502 / 503