Node / TypeScript SDK
在 Node.js / TypeScript 项目里接 Sakrylle,推荐两个官方包:
- OpenAI 兼容:
openai(官方) - Anthropic 原生:
@anthropic-ai/sdk(官方)
例子基于 Context7 拉取的官方 README。最新 API 以官方仓库为准: openai/openai-node、anthropics/anthropic-sdk-typescript。
准备
bash
export SAKRYLLE_API_KEY="sk-xxxxxxxxxxxxxxxx"需要 Node.js 18+(自带 fetch)。两份 SDK 都是 TypeScript 写的,纯 JS 项目也能用。
OpenAI 兼容
安装
bash
npm install openai
# 或者:pnpm add openai / yarn add openai最小可用调用
typescript
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.SAKRYLLE_API_KEY,
baseURL: 'https://api.sakrylle.com/v1',
});
const completion = await client.chat.completions.create({
model: 'gpt-5.6-sol',
messages: [
{ role: 'system', content: '你是一名简洁的助手。' },
{ role: 'user', content: '用一句话解释什么是 RAG。' },
],
});
console.log(completion.choices[0].message.content);也可以用 OPENAI_API_KEY + OPENAI_BASE_URL 环境变量,代码里 new OpenAI() 自动读。
流式响应
typescript
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.SAKRYLLE_API_KEY,
baseURL: 'https://api.sakrylle.com/v1',
});
const stream = await client.chat.completions.create({
model: 'gpt-5.6-sol',
messages: [{ role: 'user', content: '数到 5。' }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
}工具调用
typescript
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.SAKRYLLE_API_KEY,
baseURL: 'https://api.sakrylle.com/v1',
});
const tools = [
{
type: 'function' as const,
function: {
name: 'get_weather',
description: '查询给定城市的当前天气',
parameters: {
type: 'object',
properties: {
city: { type: 'string', description: '城市名' },
},
required: ['city'],
},
},
},
];
const resp = await client.chat.completions.create({
model: 'gpt-5.6-sol',
messages: [{ role: 'user', content: '北京今天天气怎么样?' }],
tools,
});
const choice = resp.choices[0];
if (choice.message.tool_calls?.length) {
for (const call of choice.message.tool_calls) {
if (call.type === 'function') {
console.log('调用:', call.function.name, JSON.parse(call.function.arguments));
}
}
} else {
console.log(choice.message.content);
}官方还有更高级的
client.chat.completions.runTools(...)帮你跑多轮 tool 循环,详见 openai-node helpers.md。
Anthropic 原生
安装
bash
npm install @anthropic-ai/sdk最小可用调用
typescript
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: process.env.SAKRYLLE_API_KEY,
baseURL: 'https://api.sakrylle.com',
});
const message = await client.messages.create({
model: 'claude-haiku-4-5-20251001',
max_tokens: 1024,
messages: [{ role: 'user', content: '用一句话介绍 Claude。' }],
});
console.log(message.content);
baseURL写到https://api.sakrylle.com即可;SDK 会自动拼/v1/messages。 也可用ANTHROPIC_API_KEY/ANTHROPIC_BASE_URL环境变量。
流式响应
typescript
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: process.env.SAKRYLLE_API_KEY,
baseURL: 'https://api.sakrylle.com',
});
const stream = client.messages.stream({
model: 'claude-haiku-4-5-20251001',
max_tokens: 1024,
messages: [{ role: 'user', content: '写一首四行小诗。' }],
});
for await (const event of stream) {
if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
process.stdout.write(event.delta.text);
}
}
const finalMessage = await stream.finalMessage();
console.log('\n[done]', finalMessage.usage);错误处理
typescript
import OpenAI, { APIError, AuthenticationError, RateLimitError } from 'openai';
const client = new OpenAI({
apiKey: 'bad-key',
baseURL: 'https://api.sakrylle.com/v1',
});
try {
await client.chat.completions.create({
model: 'gpt-5.6-sol',
messages: [{ role: 'user', content: 'hi' }],
});
} catch (err) {
if (err instanceof AuthenticationError) {
console.error('Key 无效或被禁用');
} else if (err instanceof RateLimitError) {
console.error('限速,稍后重试');
} else if (err instanceof APIError) {
console.error('上游错误:', err.status, err.message);
} else {
throw err;
}
}完整错误码表见 错误码。
