LangChain i LangGraph bez klucza API
Nie możesz uruchomić modelu hostowanego bez żadnego klucza, ale możesz używać LangChain i LangGraph bez płacenia najpierw. Wystarczy klucz próbny jednym kliknięciem i zmiana bazowego adresu URL.

Zaktualizowano
Kluczowe punkty
Każdy endpoint hostowany wymaga klucza; klucz próbny nie wymaga karty i uzyskuje się go jednym kliknięciem.
Klasa ChatOpenAI LangChain działa po ustawieniu base_url i modelu na uncensored.
Agenci LangGraph z wywoływaniem narzędzi działają bez zmian, ale gałęzie rozgałęziające muszą respektować limit współbieżności.
Typowe uruchomienie agenta z sześcioma wywołaniami kosztuje około $0.0039, więc kredyt próbny $0.50 wystarcza na około 128 takich uruchomień.
Co „bez klucza API” może realnie oznaczać
Wyszukiwanie langchain i langgraph bez klucza api zwykle oznacza jedno z trzech. Możesz chcieć uniknąć płacenia, zanim sprawdzisz, czy stos działa. Możesz nie chcieć podawać karty kredytowej kolejnemu dostawcy. Albo możesz liczyć na uruchomienie grafu agenta bez żadnych poświadczeń.
Trzecią nadzieję nie spełni żadna usługa hostowana: serwer wykonujący pracę musi wiedzieć, kto do niego dzwoni. Co możesz uzyskać, to klucz, który nic nie kosztuje i nie wymaga karty. Nowi użytkownicy tej witryny mogą uzyskać $0,50 kredytu próbnego jednym kliknięciem na stronie klucza API po zarejestrowaniu się przez Google lub e-mail i hasło. Jest jeden na osobę i ważny przez 7 dni.
Inną drogą do „braku klucza” jest model lokalny obsługiwany przez coś na Twojej maszynie. To działa, ale ponosisz koszt sprzętu, a laptop nie dorówna endpointowi hostowanemu przy długich uruchomieniach agenta. Hostowana wersja próbna jest szybszym sposobem sprawdzenia, czy logika grafu jest poprawna, a kod, który napiszesz, jest identyczny z tym, który uruchomisz później z finansowanym kluczem.
Ponieważ endpoint jest kompatybilny z OpenAI, LangChain nie wymaga specjalnej integracji. Wskazujesz jego klasę czatu OpenAI na inny base URL, podajesz klucz i nazywasz model uncensored. Wszystko poniżej zakłada tę konfigurację.
Krok 1: uzyskanie klucza próbnego i ustawienie środowiska
Zarejestruj się, otwórz stronę klucza i naciśnij przycisk próbny. Skopiuj klucz i trzymaj go z dala od repozytorium. Umieść go w zmiennej środowiskowej, aby ten sam skrypt działał z kluczem próbnym dziś i pełnym kluczem później.
export UNCENSORED_API_KEY="paste-your-key-here"
pip install -U langchain-openai langgraph langchain-core
Zanim zaangażujesz dowolną ramę, sprawdź klucz zwykłym zapytaniem. Dwie minuty tutaj oszczędzą godzinę czytania stack trace, które są naprawdę błędami uwierzytelniania.
curl https://api.stableaudio.top/v1/chat/completions \
-H "Authorization: Bearer $UNCENSORED_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"uncensored","messages":[{"role":"user","content":"Reply with one word: ready"}]}'
Wywołanie GET /v1/models to inny szybki test; powinno wypisać uncensored. Klucz próbny pozwala na 2 równoległe zapytania i 60 zapytań na minutę, co wystarczy do tworzenia grafu, ale warto pamiętać o tym przy dodawaniu równoległych węzłów.
Krok 2: wskazanie LangChain na endpoint
Klasą do użycia jest ChatOpenAI z langchain-openai. Dwa argumenty robią robotę: base_url i api_key. Nazwa modelu to uncensored, a zwykłe ustawienia próbkowania są przekazywane dalej.
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.stableaudio.top/v1",
api_key=os.environ["UNCENSORED_API_KEY"],
temperature=0.7,
max_retries=3,
)
print(llm.invoke("Give me three titles for an ambient track about rain.").content)
Jeśli to wypisze tekst, połączenie jest dobre. Strumieniowanie działa w ten sam sposób: iteruj po llm.stream(...), a chunki przybywają przez zdarzenia wysyłane przez serwer, z użyciem zgłoszonym na końcu strumienia.
Jednym powszechnym błędem jest pozostawienie zmiennej OPENAI_API_KEY ustawionej ze starego projektu. LangChain chętnie wyśle tę wartość do Twojego niestandardowego base URL, jeśli zapomnisz przekazać api_key. Przekaż klucz jawnie, a usuniesz zgadywanie.
Krok 3: minimalny graf LangGraph
LangGraph modeluje Twojego agenta jako stan poruszający się między węzłami. Najmniejszy użyteczny graf ma jeden węzeł, który wywołuje model i dołącza odpowiedź do listy wiadomości. MessagesState daje Ci tę listę za darmo.
from langgraph.graph import StateGraph, MessagesState, START, END
def call_model(state: MessagesState):
reply = llm.invoke(state["messages"])
return {"messages": [reply]}
builder = StateGraph(MessagesState)
builder.add_node("model", call_model)
builder.add_edge(START, "model")
builder.add_edge("model", END)
graph = builder.compile()
out = graph.invoke({"messages": [("user", "Outline a three-act short story about a lighthouse keeper.")]})
print(out["messages"][-1].content)
To jest celowo proste. Punkt jest taki, że nic w LangGraph nie wie ani nie obchodzi, który dostawca siedzi za llm. Każdy węzeł może przyjąć inny obiekt modelu, więc później możesz dać tanemu krokowi planowania i dłuższemu krokowi pisania własne ustawienia, takie jak niższa temperatura dla planowania.
Krok 4: dodanie narzędzi i pętli
Agenci stają się interesujący, gdy model może wywoływać funkcje. Endpoint obsługuje wywoływanie narzędzi z tools i tool_choice, a wyniki narzędzi wracają jako komunikaty role: "tool". LangChain i LangGraph zajmują się tym dla Ciebie.
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode, tools_condition
@tool
def word_count(text: str) -> int:
'Count the words in a piece of text.'
return len(text.split())
tools = [word_count]
llm_with_tools = llm.bind_tools(tools)
def agent(state: MessagesState):
return {"messages": [llm_with_tools.invoke(state["messages"])]}
builder = StateGraph(MessagesState)
builder.add_node("agent", agent)
builder.add_node("tools", ToolNode(tools))
builder.add_edge(START, "agent")
builder.add_conditional_edges("agent", tools_condition)
builder.add_edge("tools", "agent")
graph = builder.compile()
result = graph.invoke({"messages": [("user", "Write a 40-word product blurb, then check its word count with the tool.")]})
print(result["messages"][-1].content)
Pętla to cała idea: węzeł agenta odpowiada, tools_condition sprawdza, czy odpowiedź poprosiła o narzędzie, węzeł narzędzia je wykonuje, a kontrola wraca do agenta. Gdy odpowiedź nie ma wywołania narzędzia, graf się kończy.
Modele o otwartych wagach różnią się pod względem schludności ich argumentów narzędzi. Jeśli wywołanie wróci niepoprawnie, zaostrz docstring narzędzia, obniż temperaturę i zachowaj mały schemat argumentu. Krótkie, typowane schematy zawodzą rzadziej niż długie z wieloma polami opcjonalnymi.
Limity zapytań, ponawianie i gałęzie równoległe
Miejscem, gdzie grafy agentów najczęściej się potykają, jest współbieżność. Pełny klucz pozwala na 8 równoległych zapytań i 300 zapytań na minutę; klucz próbny pozwala na 2 i 60. Jeśli Twój graf rozgałęzia się na pięć równoległych węzłów na kluczu próbnym, trzy z nich zostaną odrzucone z HTTP 429 i kodem błędu concurrency. Przekroczenie budżetu na minutę zwraca rate_limited. Tymczasowe przeciążenie daje również 429 z nagłówkiem Retry-After: 5.
Trzy nawyki utrzymują to w ryzach:
- Utrzymuj
max_retriesna 2 lub 3 naChatOpenAI, aby krótkie 429 były ponawiane z backoff. - Ogranicz fan-out do limitu współbieżności. W LangGraph możesz przekazać
config={"max_concurrency": 2}przy wywoływaniu grafu. - Pamiętaj, że żądanie strumieniowe trzyma swój slot do końca strumienia, więc wolny konsument trzyma slot zajęty.
out = graph.invoke(
{"messages": [("user", "Draft five taglines in parallel.")]},
config={"max_concurrency": 2},
)
Nagłówki odpowiedzi pomagają w debugowaniu. X-Request-Id identyfikuje wywołanie, jeśli musisz zapytać o nie wsparcie, a X-Balance-USD pokazuje Twój pozostały kredyt po każdym żądaniu.
Lista kontrolna debugowania przy nieprawidłowym działaniu grafu
Większość niepowodzeń w pierwszym projekcie LangGraph nie dotyczy modelu. Wynikają z konfiguracji, a krótka lista kontrolna łapie niemal wszystkie.
- 401 lub błędy uwierzytelniania. Klucz jest nieobecny, wpisany błędnie lub odczytywany jest stary
OPENAI_API_KEY. Wypisz pierwsze cztery znaki wartości, której faktycznie używa Twój skrypt. - 404 lub model nie znaleziony. Nazwa modelu musi być
uncensored. WywołajGET /v1/models, jeśli nie jesteś pewien, co endpoint wypisuje. - Błędy połączenia. base URL musi kończyć się
/v1i nie może zawierać/chat/completions; klient dodaje tę część. - Nieskończone pętle. Jeśli agent ciągle wywołuje narzędzie, wartość zwrotna narzędzia może nie odpowiadać na pytanie. Zwróć zwykłe, krótkie ciągi i ustaw limit rekurencji przez konfigurację grafu, aby zła pętla zatrzymała się wcześnie.
- Puste lub dziwne odpowiedzi. Wypisz pełną listę wiadomości po rundzie. Często wcześniejszy węzeł napisał komunikat systemowy, który przeczy późniejszemu.
Gdy zapytanie zawiednie po stronie serwera, podaj nagłówek X-Request-Id w wiadomości do support. Pozwoli to im znaleźć dokładnie to wywołanie bez zgadywania. Pamiętaj też, że nieudane lub odrzucone zapytania nie są rozliczane, więc sesja debugowania pełna błędów nie zużywa twojego kredytu próbnego.
Jeszcze jeden punkt projektowy. Nadaj każdemu węzłowi wąską pracę i krótki prompt. Graf z planerem, pisarzem i sprawdzającym, każdy z własną małą wiadomością systemową, jest łatwiejszy do testowania niż pojedynczy węzeł z stroną instrukcji, a każdy kawałek może być wypróbowany samodzielnie bezpośrednim wywołaniem llm.invoke przed podłączeniem go.
Ile faktycznie kosztuje runda próbna
Ceny to $0,15 za 1M tokenów wejściowych i $0,50 za 1M tokenów wyjściowych, z przedpłaconego kredytu. Nieudane lub odrzucone żądania nie są rozliczane. Grafy agentów wywołują model kilka razy na zadanie, a każde wywołanie ponownie wysyła rosnącą listę wiadomości, więc tokeny wejściowe dominują.
Wykonaj rundę z sześcioma wywołaniami modelu. Załóżmy, że każde wywołanie wysyła 3 000 tokenów i zwraca 400 tokenów. To 18 000 tokenów wejściowych i 2 400 tokenów wyjściowych.
- Wejście: 18 000 / 1 000 000 x $0,15 = $0,0027
- Wyjście: 2 400 / 1 000 000 x $0,50 = $0,0012
- Suma: $0,0039 za uruchomienie
Kredyt próbny $0,50 podzielony przez $0,0039 daje około 128 rund o takim rozmiarze, co wystarczy do właściwego zbudowania i przetestowania grafu. Gdy go prześcigniesz, doładowania wynoszą od $20 do $500 w całościowych kwotach, z bonusem 5% od $50, 10% od $100 i 15% od $200; szczegóły znajdziesz na stronie z cenami. Możesz zapłacić kartą (Visa, Mastercard, Apple Pay, Google Pay) lub kryptowalutami (USDT w sieci TRC20, USDC na Base). Kredyt nie wygasa, a prompty nie są używane do trenowania.
Okno kontekstu wynosi 100 000 tokenów dla promptu i uzupełnienia, więc długie historie agentów mieszczą się, ale płacisz za każdy token, który ponownie wysyłasz. Ograniczanie starych wiadomości za pomocą narzędzi do wiadomości w LangGraph zmniejsza koszty i opóźnienia. Aby poznać surowy format zapytania stojący za tym wszystkim, zobacz dokumentację API.
Więcej przewodników
Pytania i odpowiedzi
Czy mogę użyć LangChain lub LangGraph bez klucza API w ogóle?
Nie z modelem hostowanym. Serwer musi zidentyfikować wywołującego. Możesz jednym kliknięciem uzyskać darmowy klucz próbny bez potrzeby podawania karty lub uruchomić model lokalnie samodzielnie.
Której klasy LangChain powinienem użyć?
ChatOpenAI z langchain-openai. Ustaw base_url na endpoint, przekaż klucz jako api_key i użyj nazwy modelu uncensored.
Czy wywoływanie narzędzi działa w agentach LangGraph?
Tak. Endpoint obsługuje narzędzia, tool_choice i role wyników narzędzi, więc bind_tools, ToolNode i tools_condition działają tak samo jak w powyższych przykładach.
Dlaczego otrzymuję błędy 429, gdy mój graf uruchamia gałęzie równolegle?
Przekroczyłeś limit współbieżności: 2 dla klucza próbnego i 8 dla pełnego klucza. Ogranicz max_concurrency w konfiguracji grafu i zachowaj włączone ponawianie prób.
Czy kredyt próbny wystarczy do przetestowania agenta?
Zazwyczaj tak. Przy koszcie około $0,0039 za rundę z sześcioma wywołaniami o umiarkowanym rozmiarze, $0,50 wystarcza na ponad sto rund w ciągu 7-dniowej ważności.
Twój klucz jest o jeden formularz stąd
Utwórz konto, skopiuj klucz, zmień bazowy URL. To cała konfiguracja.