SDK 与 Fetch
把 ttttt.ai 接进你自己的应用 / 后端服务。绝大多数 SDK 只需要改两项:base_url 和 api_key。
OpenAI SDK
Python
from openai import OpenAI
client = OpenAI(
api_key="owo-...",
base_url="https://api.ttttt.ai/v1",
)
# Chat Completions
resp = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
# Streaming
stream = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "讲个冷笑话"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
# Embeddings
emb = client.embeddings.create(
model="text-embedding-3-large",
input="ttttt.ai 是统一的 AI API 网关。",
)
vec = emb.data[0].embeddingNode.js / TypeScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.TTTTT_API_KEY, // owo-...
baseURL: "https://api.ttttt.ai/v1",
});
const resp = await client.chat.completions.create({
model: "gpt-5.5",
messages: [{ role: "user", content: "你好" }],
});
console.log(resp.choices[0].message.content);通过 Responses API
新接口推荐:
resp = client.responses.create(
model="gpt-5.5",
input="用一句话解释 transformer。",
)
print(resp.output_text)
# 多轮
follow = client.responses.create(
model="gpt-5.5",
previous_response_id=resp.id,
input="再展开一点。",
)Anthropic SDK
Python
import anthropic
client = anthropic.Anthropic(
api_key="owo-...",
base_url="https://api.ttttt.ai",
)
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
)
print(msg.content[0].text)Node.js / TypeScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.TTTTT_API_KEY,
baseURL: "https://api.ttttt.ai",
});
const msg = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [{ role: "user", content: "你好" }],
});
console.log(msg.content[0].type === "text" ? msg.content[0].text : "");原生 fetch / curl
不依赖 SDK 也完全可以——HTTP + JSON:
const r = await fetch("https://api.ttttt.ai/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.TTTTT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-5.5",
messages: [{ role: "user", content: "ping" }],
}),
});
const data = await r.json();
console.log(data.choices[0].message.content);import os, requests
r = requests.post(
"https://api.ttttt.ai/v1/chat/completions",
headers={
"Authorization": f"Bearer {os.environ['TTTTT_API_KEY']}",
"Content-Type": "application/json",
},
json={
"model": "gpt-5.5",
"messages": [{"role": "user", "content": "ping"}],
},
)
print(r.json()["choices"][0]["message"]["content"])LangChain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-5.5",
api_key="owo-...",
base_url="https://api.ttttt.ai/v1",
temperature=0.2,
)
print(llm.invoke("用一句话解释 RAG").content)import { ChatOpenAI } from "@langchain/openai";
const llm = new ChatOpenAI({
model: "gpt-5.5",
apiKey: process.env.TTTTT_API_KEY,
configuration: { baseURL: "https://api.ttttt.ai/v1" },
});
const out = await llm.invoke("你好");
console.log(out.content);LlamaIndex
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model="gpt-5.5",
api_base="https://api.ttttt.ai/v1",
api_key="owo-...",
is_chat_model=True,
)
print(llm.complete("ping").text)Vercel AI SDK
import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";
const ttttt = createOpenAI({
apiKey: process.env.TTTTT_API_KEY,
baseURL: "https://api.ttttt.ai/v1",
});
const { text } = await generateText({
model: ttttt("gpt-5.5"),
prompt: "你好",
});
console.log(text);Go
package main
import (
"context"
"fmt"
"github.com/sashabaranov/go-openai"
)
func main() {
cfg := openai.DefaultConfig("owo-...")
cfg.BaseURL = "https://api.ttttt.ai/v1"
client := openai.NewClientWithConfig(cfg)
resp, _ := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: "gpt-5.5",
Messages: []openai.ChatCompletionMessage{
{Role: "user", Content: "你好"},
},
},
)
fmt.Println(resp.Choices[0].Message.Content)
}Rust
use async_openai::{config::OpenAIConfig, Client, types::CreateChatCompletionRequestArgs};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let config = OpenAIConfig::new()
.with_api_key("owo-...")
.with_api_base("https://api.ttttt.ai/v1");
let client = Client::with_config(config);
let req = CreateChatCompletionRequestArgs::default()
.model("gpt-5.5")
.messages([("user", "你好").into()])
.build()?;
let resp = client.chat().create(req).await?;
println!("{}", resp.choices[0].message.content.clone().unwrap_or_default());
Ok(())
}服务端最佳实践
- 不要把密钥下发到浏览器 / APP;前端通过你的服务端代理一层。
- 设超时——SDK 默认超时通常是 60-120s,根据业务调整;流式可以更长。
- 开启重试——
max_retries=2起步;详见 错误码与重试。 - 记
X-Request-ID——日志里把它和你的业务 trace 关联,工单沟通效率会高很多。 - 预算护栏——后台任务用专门的低额度密钥 + 低 RPM 上限,避免循环 bug 失控。
- fallback 策略——对延迟敏感的接口可以考虑两个 model 串联:先快后慢,先
gpt-5.4不行再gpt-5.5。
排错路径
调不通时按下面顺序检查:
curl一下 鉴权页 里的最小请求是否 200 —— 如果连 curl 都不通,问题在密钥 / 网络,不是 SDK。- SDK 是不是 base URL 拼成了
https://api.ttttt.ai(没带/v1)—— OpenAI SDK 必须是/v1结尾。 - 模型 ID 是否正确 ——
GET /v1/models列出当前密钥可用的所有 ID。 - 看
X-Request-ID在控制台用量页是否能查到 —— 能查到 = 请求到了 ttttt.ai;查不到 = 客户端根本没发出。
Last updated on