SDK-oj
Ĉiu SDK de OpenAI aŭ Anthropic funkcias senpere.
Shannon parolas la formatojn de OpenAI kaj de Anthropic, do vi uzas la oficialajn SDK de ambaŭ tiaj, kiaj ili estas. Vi ŝanĝas tri valorojn en la kliento: la bazan URL, la API-ŝlosilon kaj la model-id. La cetero de via kodo restas sama.
Kion agordi
| Agordo | SDK de OpenAI | SDK de Anthropic |
|---|---|---|
| Baza URL | https://api.shannon-ai.com/v1 | https://api.shannon-ai.com |
| API-ŝlosilo | Via Shannon-ŝlosilo. La SDK sendas ĝin kiel Authorization: Bearer. | Via Shannon-ŝlosilo. La SDK sendas ĝin kiel x-api-key. |
| Modelo | Publikigita model-id, ekzemple shannon-3. | Publikigita model-id, ekzemple shannon-1.6-lite. |
| Endpoints, kiujn ĝi atingas | /v1/chat/completions, /v1/responses, /v1/models | /v1/messages, /v1/messages/count_tokens |
| Mediaj variabloj | OPENAI_API_KEY kaj OPENAI_BASE_URL, legataj de la SDK de Python kaj JavaScript kiam vi donas neniun valoron. | ANTHROPIC_API_KEY kaj ANTHROPIC_BASE_URL, legataj de la SDK de Python kaj TypeScript kiam vi donas neniun valoron. |
La du bazaj URL malsamas per /v1: SDK de OpenAI aldonas /chat/completions al sia baza URL, SDK de Anthropic aldonas /v1/messages. Nomo de modelo, kiun Shannon ne publikigas, ricevas respondon 400 kaj unknown model. Modeloj kaj prezoj
Via ŝlosilo estas en la paĝo Keys & usage. Ŝlosiloj kaj uzado
SDK de OpenAI
La oficialaj SDK de OpenAI vokas POST /v1/chat/completions kaj POST /v1/responses. Ĉiu ekzemplo sendas unu mesaĝon de uzanto kaj presas la respondon.
# pip install openai
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
response = client.chat.completions.create(
model="shannon-3",
messages=[{"role": "user", "content": "Hello, Shannon!"}],
)
print(response.choices[0].message.content) // npm install openai
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.chat.completions.create({
model: "shannon-3",
messages: [{ role: "user", content: "Hello, Shannon!" }],
});
console.log(response.choices[0].message.content); // go get github.com/openai/openai-go/v3
package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey("YOUR_API_KEY"),
option.WithBaseURL("https://api.shannon-ai.com/v1/"),
)
completion, err := client.Chat.Completions.New(context.TODO(), openai.ChatCompletionNewParams{
Model: "shannon-3",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("Hello, Shannon!"),
},
})
if err != nil {
panic(err)
}
fmt.Println(completion.Choices[0].Message.Content)
} // Gradle: implementation("com.openai:openai-java:<version>")
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
OpenAIClient client = OpenAIOkHttpClient.builder()
.apiKey("YOUR_API_KEY")
.baseUrl("https://api.shannon-ai.com/v1")
.build();
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("shannon-3")
.addUserMessage("Hello, Shannon!")
.build();
ChatCompletion completion = client.chat().completions().create(params);
completion.choices().get(0).message().content().ifPresent(System.out::println); // dotnet add package OpenAI
using System.ClientModel;
using OpenAI;
using OpenAI.Chat;
ChatClient client = new(
model: "shannon-3",
credential: new ApiKeyCredential("YOUR_API_KEY"),
options: new OpenAIClientOptions()
{
Endpoint = new Uri("https://api.shannon-ai.com/v1")
});
ChatCompletion completion = client.CompleteChat("Hello, Shannon!");
Console.WriteLine(completion.Content[0].Text); | Lingvo | Instalo | Opcio de baza URL | Fonto |
|---|---|---|---|
| Python | pip install openai | base_url | openai/openai-python |
| JavaScript / TypeScript | npm install openai | baseURL | openai/openai-node |
| Go | go get github.com/openai/openai-go/v3 | option.WithBaseURL | openai/openai-go |
| Java | com.openai:openai-java | baseUrl | openai/openai-java |
| .NET | dotnet add package OpenAI | OpenAIClientOptions.Endpoint | openai/openai-dotnet |
Ĉiu kampo de la du endpoints estas priskribita en iliaj propraj paĝoj. Chat Completions Responses API
SDK de Anthropic
La oficialaj SDK de Anthropic vokas POST /v1/messages. Ili postulas max_tokens ĉe ĉiu voko, do la ekzemploj uzas shannon-1.6-lite, kiu aplikas ĝin. Ĉiu ekzemplo presas la tekstblokojn de la respondo.
# pip install anthropic
import anthropic
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com",
)
message = client.messages.create(
model="shannon-1.6-lite",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Shannon!"}],
)
for block in message.content:
if block.type == "text":
print(block.text) // npm install @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com",
});
const message = await client.messages.create({
model: "shannon-1.6-lite",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello, Shannon!" }],
});
for (const block of message.content) {
if (block.type === "text") console.log(block.text);
} // go get github.com/anthropics/anthropic-sdk-go
package main
import (
"context"
"fmt"
"github.com/anthropics/anthropic-sdk-go"
"github.com/anthropics/anthropic-sdk-go/option"
)
func main() {
client := anthropic.NewClient(
option.WithAPIKey("YOUR_API_KEY"),
option.WithBaseURL("https://api.shannon-ai.com/"),
)
message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: "shannon-1.6-lite",
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("Hello, Shannon!")),
},
})
if err != nil {
panic(err)
}
for _, block := range message.Content {
if block.Type == "text" {
fmt.Println(block.Text)
}
}
} // Gradle: implementation("com.anthropic:anthropic-java:<version>")
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.messages.Message;
import com.anthropic.models.messages.MessageCreateParams;
AnthropicClient client = AnthropicOkHttpClient.builder()
.apiKey("YOUR_API_KEY")
.baseUrl("https://api.shannon-ai.com")
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model("shannon-1.6-lite")
.maxTokens(1024L)
.addUserMessage("Hello, Shannon!")
.build();
Message message = client.messages().create(params);
message.content().stream()
.flatMap(block -> block.text().stream())
.forEach(text -> System.out.println(text.text())); | Lingvo | Instalo | Opcio de baza URL | Fonto |
|---|---|---|---|
| Python | pip install anthropic | base_url | anthropics/anthropic-sdk-python |
| TypeScript | npm install @anthropic-ai/sdk | baseURL | anthropics/anthropic-sdk-typescript |
| Go | go get github.com/anthropics/anthropic-sdk-go | option.WithBaseURL | anthropics/anthropic-sdk-go |
| Java | com.anthropic:anthropic-java | baseUrl | anthropics/anthropic-sdk-java |
La formato Messages kaj ĝiaj diferencoj estas en la paĝo pri kongrueco kun Anthropic. Anthropic
Kion la SDK povas fidi
- Kampo de peto, kiun la API ne uzas, estas akceptata. Kampo, kiun la API konas, sendita kun malĝusta tipo, ricevas respondon
422. - La kapoj de versio kaj beta, kiujn la SDK aldonas (
anthropic-version,anthropic-beta,openai-beta), estas akceptataj. Neniu el ili estas deviga. - La
modelde respondo estas la publikigita id, do vi povas resendi ĝin tia, kia ĝi estas. - Ĉe
/v1/messagesrespondo povas komenciĝi per blokothinking. Legu la blokojn de tipotextanstataŭ preni la unuan blokon. - Streaming funkcias per la propraj helpiloj de fluo de la SDK. Usage alvenas ĉe la fino de ĉiu fluo.
- Ĉiu respondo portas kapon
x-request-id. Sendu vian propranx-request-idkaj la sama valoro revenas.
SDK de la komunumo
Klientoj verkitaj por la API de OpenAI de aliaj aŭtoroj funkcias same: donu al la kliento la bazan URL kun /v1, vian ŝlosilon kaj Shannon-model-id. Ĉi tiuj estas prizorgataj de siaj aŭtoroj, ne de Shannon.
| Lingvo | Instalo | Kliento |
|---|---|---|
| Go | go get github.com/sashabaranov/go-openai | sashabaranov/go-openai |
| Ruby | gem install ruby-openai | alexrudall/ruby-openai |
| PHP | composer require openai-php/client | openai-php/client |
| Rust | cargo add async-openai | 64bit/async-openai |
Sen SDK
Vi ne bezonas SDK. Ĉiu HTTP-kliento, kiu povas sendi JSON, funkcias:
POSTkun JSON-korpo kaj la kapoContent-Type: application/json. Sen ĝi la peto ricevas respondon415.- Via ŝlosilo en
Authorization: Bearer <key>aŭ enx-api-key: <key>. Ambaŭ funkcias ĉe ĉiu endpoint. - Korpo ĝis 32 MiB.
- Kun
"stream": truela respondo estas fluo de server-sent events (text/event-stream). Legu ĝin linio post linio kaj ne bufru ĝin. - Eraro estas JSON-korpo kun
error.typekajerror.message, apud la HTTP-stato.
curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [{"role": "user", "content": "Hello, Shannon!"}]
}' import requests
response = requests.post(
"https://api.shannon-ai.com/v1/chat/completions",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"model": "shannon-3",
"messages": [{"role": "user", "content": "Hello, Shannon!"}],
},
)
response.raise_for_status()
print(response.json()["choices"][0]["message"]["content"]) const response = await fetch("https://api.shannon-ai.com/v1/chat/completions", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "shannon-3",
messages: [{ role: "user", content: "Hello, Shannon!" }],
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data.choices[0].message.content); Pri la eventoj de fluo kaj la specoj de eraroj, vidu: Fluigo Erarotraktado