Uwierzytelnianie
Każde zapytanie niesie Twój klucz API w nagłówku. Jeden klucz na konto działa w każdym endpoincie i z każdym modelem, w jednej z dwóch form nagłówka.
Nagłówek · SDK OpenAI
Authorization: Bearer YOUR_API_KEY Nagłówek · SDK Anthropic
x-api-key: YOUR_API_KEY Akceptowane nagłówki
Oba nagłówki są odczytywane w każdym endpoincie /v1, niezależnie od formatu, w którym endpoint mówi. Wyślij jeden z nich.
| Nagłówek | Opis |
|---|---|
Authorization: Bearer <key> | Sprawdzany jako pierwszy. Pisz Bearer wielką literą B i jedną spacją przed kluczem. SDK OpenAI wysyłają ten nagłówek. |
x-api-key: <key> | Odczytywany, gdy zapytanie nie ma nagłówka Authorization: Bearer. SDK Anthropic wysyłają ten nagłówek. |
W SDK OpenAI ustaw klucz i bazowy URL; SDK wysyła Authorization: Bearer.
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) 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); curl -X POST "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!"}
]
}' W SDK Anthropic ustaw klucz i bazowy URL bez /v1; SDK wysyła x-api-key.
import anthropic
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com"
)
message = client.messages.create(
model="shannon-3",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, Shannon!"}
]
)
print("".join(block.text for block in message.content if block.type == "text")) 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-3',
max_tokens: 1024,
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
]
});
console.log(message.content.filter((block) => block.type === 'text').map((block) => block.text).join('')); curl -X POST "https://api.shannon-ai.com/v1/messages" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Shannon!"}
]
}' Które endpointy wymagają klucza
| Endpoint | Klucz |
|---|---|
POST /v1/chat/completions | Wymagany |
POST /v1/messages | Wymagany |
POST /v1/responses | Wymagany |
POST /v1/tokenize | Wymagany |
POST /v1/messages/count_tokens | Wymagany |
GET /v1/models | Niepotrzebny |
Twój klucz
- Klucz to
sk-i 43 znaki z zakresuA–Z,a–z,0–9,-oraz_: razem 46 znaków. - Każde konto ma dokładnie jeden klucz. Tworzy się go przy pierwszym otwarciu Keys & usage.
- Klucz daje pełny dostęp do API dla Twojego konta: każdy endpoint, każdy model i całe saldo.
- Klucz nie ma daty ważności. Działa, dopóki go nie zrotujesz lub nie unieważnisz.
Rotacja i unieważnianie
Klucz rotujesz i unieważniasz na stronie Keys & usage. Keys & usage
| Działanie | Co się dzieje |
|---|---|
| Zrotuj | Wydawany jest nowy klucz, a stary przestaje działać. Nowy klucz działa od razu. |
| Unieważnij | Klucz przestaje działać i nie jest wydawany nowy. Zrotuj, aby ponownie mieć działający klucz. |
- Oba działania wchodzą w życie od razu: następne zapytanie ze starym kluczem dostaje odpowiedź
401. Przyjmij 60 sekund jako górną granicę, po której stary klucz jest odrzucany wszędzie. - Wszyscy klienci konta używają tego samego klucza, więc rotacja dotyczy ich wszystkich. Wstaw nowy klucz do swoich klientów zaraz po rotacji.
- Saldo, użycie i ochrona przed floodem należą do konta, nie do klucza. Nowy klucz kontynuuje z tym samym saldem i tym samym licznikiem zapytań w bieżącej minucie.
Błędy
Każdy błąd uwierzytelniania ma status 401 i typ authentication_error. Komunikat pozwala odróżnić przypadki.
| Status | Typ | Komunikat | Kiedy |
|---|---|---|---|
401 | authentication_error | Missing authentication | Zapytanie nie ma ani nagłówka Authorization: Bearer, ani nagłówka x-api-key zaczynającego się od sk-. Taka jest też odpowiedź na bearer małymi literami oraz na wartość Authorization bez Bearer. |
401 | authentication_error | Invalid API key | Klucz nie jest aktualnym kluczem żadnego konta: jest błędnie wpisany, został unieważniony albo zastąpiony przez rotację. |
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} - W każdej ścieżce poza
/v1/messagesobiekterrorzawiera teżcode: "invalid_api_key", także przy braku klucza, orazparam: null. - Klucz jest sprawdzany przed odczytaniem treści zapytania. Zapytanie bez ważnego klucza dostaje
401, nawet gdy jego treść jest nieprawidłowa lub zbyt duża. - Wartość
Authorization: Bearer, która nie zaczyna się odsk-, nie jest traktowana jako klucz API. Dostaje401z komunikatem, że token jest nieprawidłowy lub wygasł.
Przeglądarki i CORS
- API odpowiada na zapytania przeglądarek między originami tylko dla ustalonej listy originów. JavaScript na stronie z innego originu nie może odczytać odpowiedzi
/v1. - Wywołuj API ze swojego serwera i niech Twoja strona komunikuje się z Twoim serwerem. Dzięki temu klucz nie trafia też do kodu źródłowego strony.
- Kod po stronie serwera i narzędzia wiersza poleceń nie są objęte tą regułą: stosują ją wyłącznie przeglądarki.
- Zalogowanie na shannon-ai.com nie uwierzytelnia zapytań
/v1. Cookies nie są tam odczytywane; jedynym poświadczeniem jest klucz. - Dla dozwolonego origin przeglądarka może wysyłać
content-type,authorization,x-api-key,anthropic-version,anthropic-beta,openai-betaix-request-idoraz może odczytywać nagłówek odpowiedzix-request-id.
Bezpieczne przechowywanie klucza
- Trzymaj klucz na serwerze. Nie umieszczaj go na stronach internetowych, w aplikacjach mobilnych ani w publicznych repozytoriach: kto go ma, może wydać całe Twoje saldo.
- Ładuj klucz ze zmiennej środowiskowej lub magazynu sekretów zamiast wpisywać go w kod.
- Jeśli klucz mógł wyciec, zrotuj go w Keys & usage. Stary klucz przestaje działać natychmiast.
- Po wycieku przejrzyj listę zapytań w Keys & usage. Pokazuje każde zapytanie wykonane kluczem w ciągu ostatnich 30 dni.