Skip to Content
客户端接入SDK 与 Fetch

SDK 与 Fetch

把 ttttt.ai 接进你自己的应用 / 后端服务。绝大多数 SDK 只需要改两项:base_urlapi_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].embedding

Node.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

排错路径

调不通时按下面顺序检查:

  1. curl 一下 鉴权页 里的最小请求是否 200 —— 如果连 curl 都不通,问题在密钥 / 网络,不是 SDK。
  2. SDK 是不是 base URL 拼成了 https://api.ttttt.ai(没带 /v1)—— OpenAI SDK 必须是 /v1 结尾。
  3. 模型 ID 是否正确 —— GET /v1/models 列出当前密钥可用的所有 ID。
  4. X-Request-ID 在控制台用量页是否能查到 —— 能查到 = 请求到了 ttttt.ai;查不到 = 客户端根本没发出。
Last updated on