
使用Scala Play框架构建REST API
一句话总结:从 0 到 1,只用 15 分钟,让任何开发者——无论身处硅谷还是三线小城——都能把 GPT-OSS 的超长上下文、MoE 架构、函数调用能力装进自己的应用。
2025 年的 AI 江湖,有三件事正在发生:
今天,我们把「申请—配置—验证—上线」四步曲拆成 15 张高清截图 + 1 张流程图 + 5 段可直接粘贴的代码,手把手带你通关。
路线 | 特色 | 适用场景 | 官方入口 |
---|---|---|---|
Novita AI | 免翻墙、支付宝/微信充值、120B/20B 模型任选 | 国内开发者、出海 MVP | https://novita.ai |
OpenRouter | 多模型路由、统一账单、支持 GPT-4.1/Claude 混用 | 需要 A/B 测试的企业 | https://openrouter.ai |
自建 OSS | 本地 GPU、完全离线、Apache-2.0 权重 | 数据合规敏感政企 | https://huggingface.co/openai/gpt-oss-120b |
下文以 Novita AI 为例,流程同样适用于 OpenRouter,只需替换 base_url 与 key。
模型 | 上下文 | 输入 $/1M | 输出 $/1M | 推荐场景 |
---|---|---|---|---|
gpt-oss-20b | 128 K | 0.05 | 0.2 | 轻量客服、脚本生成 |
gpt-oss-120b | 128 K | 0.10 | 0.5 | 金融分析、代码审查 |
新用户赠送 5 美元 试用金,可跑 100 万输入 token。
1.右上角头像 → Access Tokens → Create new token
打开终端,替换下方 YOUR_KEY_HERE
后直接回车:
curl https://api.novita.ai/v3/openai/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-nov-YOUR_KEY_HERE" \
-d '{
"model": "gpt-oss-20b",
"messages": [{"role": "user", "content": "Hello GPT-OSS!"}],
"max_tokens": 20
}'
若返回 JSON 包含 "choices"
,代表密钥有效。
echo 'export NOVITA_API_KEY=sk-nov-YOUR_KEY_HERE' >> ~/.zshrc
source ~/.zshrc
setx NOVITA_API_KEY sk-nov-YOUR_KEY_HERE
import OpenAI from "openai";
const openai = new OpenAI({
baseURL: "https://api.novita.ai/v3/openai",
apiKey: process.env.NOVITA_API_KEY,
});
const chat = await openai.chat.completions.create({
model: "gpt-oss-120b",
messages: [{ role: "user", content: "写一首关于夏天的俳句" }],
stream: true,
});
for await (const chunk of chat) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.novita.ai/v3/openai",
api_key=os.getenv("NOVITA_API_KEY"),
)
resp = client.chat.completions.create(
model="gpt-oss-120b",
messages=[{"role": "user", "content": "8 月 15 日历史上的三件大事"}],
max_tokens=512,
)
print(resp.choices[0].message.content)
@Value("${novita.api.key}")
private String key;
@Bean
public OpenAiClient openAiClient() {
return OpenAiClient.builder()
.baseUrl("https://api.novita.ai/v3/openai")
.apiKey(key)
.build();
}
import "github.com/sashabaranov/go-openai"
client := openai.NewClientWithConfig(openai.ClientConfig{
BaseURL: "https://api.novita.ai/v3/openai",
APIKey: os.Getenv("NOVITA_API_KEY"),
})
resp, _ := client.CreateChatCompletion(context.TODO(), openai.ChatCompletionRequest{
Model: "gpt-oss-20b",
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleUser, Content: "用 Go 写一个并发安全的计数器"},
},
})
fmt.Println(resp.Choices[0].Message.Content)
curl -s https://api.novita.ai/v3/openai/chat/completions \
-H "Authorization: Bearer ${NOVITA_API_KEY}" \
-d '{"model":"gpt-oss-20b","messages":[{"role":"user","content":"ping"}]}'
风险 | 对策 |
---|---|
密钥泄露 | GitHub Actions 使用 Repository Secrets,禁止硬编码。 |
被刷额度 | 开启 IP 白名单 + 每日预算上限。 |
日志残留 | 关闭 echo $NOVITA_API_KEY ,改用 printf '%s\n' "$NOVITA_API_KEY" 。 |
现象 | 原因 | 解决 |
---|---|---|
401 Unauthorized | 密钥错误或已删除 | 重新生成并替换环境变量 |
429 Rate Limit | 并发超限 | 控制台升级套餐或排队 |
400 context_length_exceeded | 128 K 用满 | 分段或换更大模型 |
空回复 | max_tokens 过小 | 增大到 1024+ |
拿到 GPT-OSS API Key 只是推开了一扇门。
真正的魔法发生在 函数调用、记忆存储、多模态融合 的下一章。
愿你把 128 K 的上下文,写成下一个 10 亿用户的日常。