01
ОСНОВНИ КОНЦЕПЦИИ
Преди да пишеш код — разбери как работи
КАК РАБОТИ
Изпращаш HTTP POST заявка с JSON тяло към API endpoint. В тялото: моделът, системният промпт, и съобщенията. Получаваш JSON отговор с генерирания текст. Толкова. Няма магия.
| ТЕРМИН | КАКВО ОЗНАЧАВА | ПРАКТИЧЕСКИ |
|---|---|---|
| Token | ~4 символа текст | За това плащаш — input + output токени |
| System prompt | Инструкции за поведението на AI | "Ти си помощник за ремонт на коли. Отговаряй само на БГ." |
| Temperature | Случайност на отговора (0.0 - 1.0) | 0 = детерминистичен; 1 = творчески. За код: 0.2 |
| Max tokens | Максимална дължина на отговора | 1024 за кратки отговори, 4096 за дълги |
| Context window | Колко текст "помни" моделът | Claude: 200K токена. GPT-4o: 128K |
| Messages array | Историята на разговора | user/assistant редуване — така симулираш чат |
| Streaming | Отговорът идва на части | Показваш текста докато се генерира — по-добро UX |
ТОКЕНИ = ПАРИ
Всяко извикване на API струва. Input токени (твоят промпт) + output токени (отговорът). Дълъг system prompt се плаща при всяко извикване. Prompt caching (Claude) намалява цената при повтарящ се system prompt до 90%.
02
API КЛЮЧОВЕ
Откъде, как, и как да ги пазиш
CLAUDE / ANTHROPIC
Регистрацияconsole.anthropic.com
Free tier$5 кредит при регистрация
Ключ формат
sk-ant-api03-...Header
x-api-keyEndpoint
api.anthropic.com/v1/OPENAI
Регистрацияplatform.openai.com
Free tierняма — плащаш от нулата
Ключ формат
sk-proj-...Header
Authorization: BearerEndpoint
api.openai.com/v1/НИКОГА НЕ COMMITВАЙ API КЛЮЧ В GIT
Пази ключовете в .env файл. Добави .env в .gitignore. При leak — ключът се компрометира веднага, ротирай го. Публичен репо с API ключ = сметка за стотици долари за часове.
.ENV ФАЙЛ — ПРАВИЛНИЯТ НАЧИН
# .env — не се commit-ва
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxxxxx
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxx
# .gitignore
.env
*.env
.env.local
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxxxxx
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxx
# .gitignore
.env
*.env
.env.local
03
ПЪРВО ИЗВИКВАНЕ — CURL
Без библиотеки, само HTTP — разбери основата
CLAUDE API — CURL
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Кажи здравей на БГ."}]
}'
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Кажи здравей на БГ."}]
}'
OPENAI API — CURL
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Кажи здравей на БГ."}]
}'
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Кажи здравей на БГ."}]
}'
ОТГОВОР ОТ CLAUDE — JSON СТРУКТУРА
{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [{
"type": "text",
"text": "Здравейте!" ← това искаш
}],
"usage": {
"input_tokens": 12, ← плащаш това
"output_tokens": 8 ← и това
}
}
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [{
"type": "text",
"text": "Здравейте!" ← това искаш
}],
"usage": {
"input_tokens": 12, ← плащаш това
"output_tokens": 8 ← и това
}
}
04
PYTHON
SDK или requests — и двата начина
ИНСТАЛАЦИЯ
# Anthropic SDK
pip install anthropic python-dotenv
# OpenAI SDK
pip install openai python-dotenv
pip install anthropic python-dotenv
# OpenAI SDK
pip install openai python-dotenv
CLAUDE — ПРОСТ ЧАТ (claude_chat.py)
import anthropic
from dotenv import load_dotenv
load_dotenv()
client = anthropic.Anthropic()
def ask(question: str, system: str = "") -> str:
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=system,
messages=[{"role": "user", "content": question}]
)
return message.content[0].text
# Употреба
answer = ask(
"Обясни как работи турбото на двигател.",
system="Ти си механик. Отговаряй кратко и ясно на БГ."
)
print(answer)
from dotenv import load_dotenv
load_dotenv()
client = anthropic.Anthropic()
def ask(question: str, system: str = "") -> str:
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=system,
messages=[{"role": "user", "content": question}]
)
return message.content[0].text
# Употреба
answer = ask(
"Обясни как работи турбото на двигател.",
system="Ти си механик. Отговаряй кратко и ясно на БГ."
)
print(answer)
CLAUDE — STREAMING (текстът се появява постепенно)
import anthropic
client = anthropic.Anthropic()
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Напиши стъпки за MIG заваряване."}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
client = anthropic.Anthropic()
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Напиши стъпки за MIG заваряване."}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
МНОГООБОРОТЕН ЧАТ — ПАМЕТ НА РАЗГОВОРА
import anthropic
client = anthropic.Anthropic()
history = []
system = "Ти си технически асистент. Отговаряй на БГ."
while True:
user_input = input("\nТи: ")
if user_input.lower() in ["exit", "quit"]: break
history.append({"role": "user", "content": user_input})
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=system,
messages=history
)
reply = response.content[0].text
history.append({"role": "assistant", "content": reply})
print(f"\nAI: {reply}")
client = anthropic.Anthropic()
history = []
system = "Ти си технически асистент. Отговаряй на БГ."
while True:
user_input = input("\nТи: ")
if user_input.lower() in ["exit", "quit"]: break
history.append({"role": "user", "content": user_input})
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=system,
messages=history
)
reply = response.content[0].text
history.append({"role": "assistant", "content": reply})
print(f"\nAI: {reply}")
PROMPT CACHING — СПЕСТИ 90% ОТ INPUT ЦЕНАТА
Ако system prompt-ът ти е дълъг и постоянен, Claude може да го кешира. Плащаш само при първото зареждане, после е ~10x по-евтино:
system=[{"type": "text", "text": "...", "cache_control": {"type": "ephemeral"}}]
05
PHP
За уебсайтове — без SDK, само cURL
CLAUDE API — PHP ФУНКЦИЯ (api/chat.php)
<?php
function claude_ask(string $message, string $system = ''): string {
$key = $_ENV['ANTHROPIC_API_KEY'];
$payload = json_encode([
'model' => 'claude-sonnet-4-5',
'max_tokens' => 1024,
'system' => $system,
'messages' => [['role' => 'user', 'content' => $message]],
]);
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
"x-api-key: $key",
'anthropic-version: 2023-06-01',
'content-type: application/json',
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
return $response['content'][0]['text'] ?? 'Грешка.';
}
// Употреба
$answer = claude_ask(
'Каква е разликата между MIG и TIG заваряване?',
'Ти си опитен заварчик. Отговаряй на БГ.'
);
echo $answer;
function claude_ask(string $message, string $system = ''): string {
$key = $_ENV['ANTHROPIC_API_KEY'];
$payload = json_encode([
'model' => 'claude-sonnet-4-5',
'max_tokens' => 1024,
'system' => $system,
'messages' => [['role' => 'user', 'content' => $message]],
]);
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
"x-api-key: $key",
'anthropic-version: 2023-06-01',
'content-type: application/json',
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
return $response['content'][0]['text'] ?? 'Грешка.';
}
// Употреба
$answer = claude_ask(
'Каква е разликата между MIG и TIG заваряване?',
'Ти си опитен заварчик. Отговаряй на БГ.'
);
echo $answer;
PHP STREAMING — SSE (текстът се стриймва към браузъра)
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');
$payload = json_encode([
'model' => 'claude-sonnet-4-5',
'max_tokens' => 1024,
'stream' => true,
'messages' => [['role' => 'user', 'content' => $_POST['q']]],
]);
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) {
if (str_contains($data, '"text"')) {
$json = json_decode(trim(str_replace('data: ', '', $data)), true);
if (isset($json['delta']['text'])) {
echo 'data: ' . json_encode(['t' => $json['delta']['text']]) . "\n\n";
ob_flush(); flush();
}
}
return strlen($data);
});
curl_exec($ch);
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');
$payload = json_encode([
'model' => 'claude-sonnet-4-5',
'max_tokens' => 1024,
'stream' => true,
'messages' => [['role' => 'user', 'content' => $_POST['q']]],
]);
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) {
if (str_contains($data, '"text"')) {
$json = json_decode(trim(str_replace('data: ', '', $data)), true);
if (isset($json['delta']['text'])) {
echo 'data: ' . json_encode(['t' => $json['delta']['text']]) . "\n\n";
ob_flush(); flush();
}
}
return strlen($data);
});
curl_exec($ch);
06
CLAUDE vs OPENAI
Кое да избереш за твоя проект
| CLAUDE (Anthropic) | GPT-4o (OpenAI) | |
|---|---|---|
| Най-добър модел | claude-opus-4-7 | gpt-4o |
| Бюджетен модел | claude-haiku-4-5 | gpt-4o-mini |
| Context window | 200K токена | 128K токена |
| Prompt caching | Да — до 90% по-евтино | Частично |
| Дълги документи | Много добро | Добро |
| Код генериране | Отлично | Отлично |
| Function calling | Да (Tools) | Да (по-зряло) |
| Цена (Sonnet/4o) | $3 / $15 per MTok | $2.50 / $10 per MTok |
| Подходящ за | Дълги документи, анализ, код | Бърза интеграция, vision, audio |
ПРЕПОРЪКА
За нов проект — започни с Claude Sonnet. По-голям контекст, по-добро разбиране на инструкции, prompt caching. Ако имаш нужда от vision (анализ на изображения) или audio — OpenAI има предимство там.
07
РЕАЛНИ ПРОЕКТИ ЗА СТАРТ
Copy-paste и адаптирай за твоя случай
CLI АСИСТЕНТ ЗА ТЕРМИНАЛА
Питаш AI директно от терминала. Полезен за bash команди, grep patterns, git.
ask.py — пусни с: python ask.py "как да намеря файл по съдържание?"
import sys, anthropic
client = anthropic.Anthropic()
q = " ".join(sys.argv[1:])
msg = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=512,
system="Linux/macOS terminal expert. Отговаряй кратко с команди.",
messages=[{"role": "user", "content": q}]
)
print(msg.content[0].text)
client = anthropic.Anthropic()
q = " ".join(sys.argv[1:])
msg = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=512,
system="Linux/macOS terminal expert. Отговаряй кратко с команди.",
messages=[{"role": "user", "content": q}]
)
print(msg.content[0].text)
SUMMARIZER — ОБОБЩАВАЙ ДЪЛГИ ТЕКСТОВЕ
Подаваш файл, получаваш резюме. Полезен за логове, документация, статии.
summarize.py — пусни с: python summarize.py document.txt
import sys, anthropic
text = open(sys.argv[1]).read()
client = anthropic.Anthropic()
result = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system="Обобщавай текст на БГ. Bullet points. Само важното.",
messages=[{"role": "user", "content": text}]
)
print(result.content[0].text)
text = open(sys.argv[1]).read()
client = anthropic.Anthropic()
result = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system="Обобщавай текст на БГ. Bullet points. Само важното.",
messages=[{"role": "user", "content": text}]
)
print(result.content[0].text)
PHP ЧАТ WIDGET ЗА САЙТ
Минимален chat endpoint за уебсайт. Приема POST, връща AI отговор.
api/chat.php — fetch от frontend
<?php
header('Content-Type: application/json');
$msg = htmlspecialchars($_POST['message'] ?? '');
if (!$msg) { echo json_encode(['error' => 'no input']); exit; }
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'model' => 'claude-haiku-4-5-20251001',
'max_tokens' => 512,
'system' => 'Асистент на сайта. Отговаряй на БГ.',
'messages' => [['role'=>'user', 'content'=>$msg]],
]),
CURLOPT_HTTPHEADER => [
"x-api-key: ".getenv('ANTHROPIC_API_KEY'),
'anthropic-version: 2023-06-01',
'content-type: application/json',
],
]);
$r = json_decode(curl_exec($ch), true);
echo json_encode(['reply' => $r['content'][0]['text'] ?? 'Грешка.']);
header('Content-Type: application/json');
$msg = htmlspecialchars($_POST['message'] ?? '');
if (!$msg) { echo json_encode(['error' => 'no input']); exit; }
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'model' => 'claude-haiku-4-5-20251001',
'max_tokens' => 512,
'system' => 'Асистент на сайта. Отговаряй на БГ.',
'messages' => [['role'=>'user', 'content'=>$msg]],
]),
CURLOPT_HTTPHEADER => [
"x-api-key: ".getenv('ANTHROPIC_API_KEY'),
'anthropic-version: 2023-06-01',
'content-type: application/json',
],
]);
$r = json_decode(curl_exec($ch), true);
echo json_encode(['reply' => $r['content'][0]['text'] ?? 'Грешка.']);
08
РЕАЛНИ ЦЕНИ
Колко струва на практика
| МОДЕЛ | INPUT | OUTPUT | 1000 СЪОБЩЕНИЯ (~500 токена) |
|---|---|---|---|
| claude-haiku-4-5 | $0.80 / MTok | $4 / MTok | ~$0.002 = 0.004 лева |
| claude-sonnet-4-5 | $3 / MTok | $15 / MTok | ~$0.009 = 0.016 лева |
| claude-opus-4-7 | $15 / MTok | $75 / MTok | ~$0.045 = 0.08 лева |
| gpt-4o-mini | $0.15 / MTok | $0.60 / MTok | ~$0.0004 = 0.0007 лева |
| gpt-4o | $2.50 / MTok | $10 / MTok | ~$0.006 = 0.011 лева |
НА ПРАКТИКА
Малък сайт с AI чат — 100 потребители дневно по 5 съобщения = 500 съобщения/ден.
С Haiku: ~$1/месец. С Sonnet: ~$5/месец. Личен CLI инструмент — под $1/месец почти сигурно.
API е масивно по-евтино от всеки абонамент при реална употреба.