SDKs
Κάθε SDK του OpenAI ή της Anthropic λειτουργεί χωρίς καμία ρύθμιση.
Το Shannon μιλά τις μορφές επικοινωνίας της OpenAI και της Anthropic, οπότε χρησιμοποιείτε τα επίσημα SDK και των δύο ως έχουν. Αλλάζετε τρεις τιμές στον client: το base URL, το κλειδί API και το id μοντέλου. Ο υπόλοιπος κώδικάς σας μένει ίδιος.
Τι να ορίσετε
| Ρύθμιση | SDK της OpenAI | SDK της Anthropic |
|---|---|---|
| Base URL | https://api.shannon-ai.com/v1 | https://api.shannon-ai.com |
| Κλειδί API | Το κλειδί Shannon σας. Το SDK το στέλνει ως Authorization: Bearer. | Το κλειδί Shannon σας. Το SDK το στέλνει ως x-api-key. |
| Μοντέλο | Ένα δημοσιευμένο id μοντέλου, για παράδειγμα shannon-3. | Ένα δημοσιευμένο id μοντέλου, για παράδειγμα shannon-1.6-lite. |
| Endpoints που φτάνει | /v1/chat/completions, /v1/responses, /v1/models | /v1/messages, /v1/messages/count_tokens |
| Μεταβλητές περιβάλλοντος | OPENAI_API_KEY και OPENAI_BASE_URL, που διαβάζονται από τα SDK Python και JavaScript όταν δεν περνάτε τιμή. | ANTHROPIC_API_KEY και ANTHROPIC_BASE_URL, που διαβάζονται από τα SDK Python και TypeScript όταν δεν περνάτε τιμή. |
Τα δύο base URLs διαφέρουν κατά το /v1: ένα SDK της OpenAI προσθέτει /chat/completions στο base URL του, ένα SDK της Anthropic προσθέτει /v1/messages. Ένα όνομα μοντέλου που το Shannon δεν δημοσιεύει απαντάται με 400 και unknown model. Μοντέλα & τιμές
Το κλειδί σας βρίσκεται στη σελίδα Κλειδιά & χρήση. Κλειδιά & χρήση
SDK της OpenAI
Τα επίσημα SDK της OpenAI καλούν τα POST /v1/chat/completions και POST /v1/responses. Κάθε παράδειγμα στέλνει ένα μήνυμα χρήστη και τυπώνει την απάντηση.
# 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); | Γλώσσα | Εγκατάσταση | Επιλογή base URL | Πηγή |
|---|---|---|---|
| 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 |
Κάθε πεδίο των δύο endpoints περιγράφεται στις δικές τους σελίδες. Chat Completions Responses API
SDK της Anthropic
Τα επίσημα SDK της Anthropic καλούν το POST /v1/messages. Απαιτούν max_tokens σε κάθε κλήση, γι' αυτό τα παραδείγματα χρησιμοποιούν το shannon-1.6-lite, που το εφαρμόζει. Κάθε παράδειγμα τυπώνει τα blocks κειμένου της απάντησης.
# 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())); | Γλώσσα | Εγκατάσταση | Επιλογή base URL | Πηγή |
|---|---|---|---|
| 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 |
Η μορφή Messages και οι διαφορές της βρίσκονται στη σελίδα συμβατότητας με την Anthropic. Μορφή Anthropic
Σε τι μπορούν να βασιστούν τα SDK
- Ένα πεδίο αιτήματος που το API δεν χρησιμοποιεί γίνεται δεκτό. Ένα πεδίο που το API γνωρίζει, σταλμένο με λάθος τύπο, απαντάται με
422. - Οι κεφαλίδες έκδοσης και beta που προσθέτουν τα SDK (
anthropic-version,anthropic-beta,openai-beta) γίνονται δεκτές. Καμία δεν είναι υποχρεωτική. - Το
modelμιας απάντησης είναι το δημοσιευμένο id, οπότε μπορείτε να το στείλετε πίσω ως έχει. - Στο
/v1/messagesμια απάντηση μπορεί να αρχίζει με blockthinking. Διαβάστε τα blocks τύπουtextαντί να πάρετε το πρώτο block. - Το streaming δουλεύει μέσω των δικών βοηθητικών συναρτήσεων stream του SDK. Η χρήση φτάνει στο τέλος κάθε stream.
- Κάθε απάντηση φέρει κεφαλίδα
x-request-id. Στείλτε δικό σαςx-request-idκαι επιστρέφει η ίδια τιμή.
SDK της κοινότητας
Οι clients που έγραψαν άλλοι συγγραφείς για το API της OpenAI δουλεύουν με τον ίδιο τρόπο: δώστε στον client το base URL με /v1, το κλειδί σας και ένα id μοντέλου Shannon. Αυτοί συντηρούνται από τους συγγραφείς τους, όχι από το Shannon.
| Γλώσσα | Εγκατάσταση | Client |
|---|---|---|
| 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 |
Χωρίς SDK
Δεν χρειάζεστε SDK. Δουλεύει οποιοσδήποτε HTTP client που μπορεί να στείλει JSON:
POSTμε σώμα JSON και την κεφαλίδαContent-Type: application/json. Χωρίς αυτήν το αίτημα απαντάται με415.- Το κλειδί σας στο
Authorization: Bearer <key>ή στοx-api-key: <key>. Και τα δύο δουλεύουν σε κάθε endpoint. - Σώμα έως 32 MiB.
- Με
"stream": trueη απάντηση είναι ροή server-sent events (text/event-stream). Διαβάστε τη γραμμή γραμμή και μην την αποθηκεύετε σε buffer. - Ένα σφάλμα είναι σώμα JSON με
error.typeκαιerror.message, δίπλα στην κατάσταση HTTP.
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); Για τα συμβάντα ενός stream και τους τύπους σφαλμάτων, δείτε: Ροή Χειρισμός σφαλμάτων