Eden AI
Eden AI
Eden AI는 AI 게이트웨이로, 30개 이상 공급자(OpenAI, Anthropic, Google, Mistral, DeepSeek, xAI, Amazon Bedrock, Azure 등)의 1000개 이상 LLM을 하나의 API 키와 하나의 청구서로 제공하며, 모든 요청의 실제 비용을 응답에 보고해요.
모든 Eden AI chat 모델을 지원해요. completion 요청 시
edenai/접두사로 설정하기만 하면 돼요.
출처: 문서
본문
개요 (Overview)
| 속성 | 설명 |
|---|---|
| 설명 | 하나의 API 키와 하나의 청구서로 30+ 공급자의 1000+ LLM 제공. 모든 요청의 실제 비용을 응답에 보고 |
| LiteLLM 라우트 | edenai/ |
| 공급자 문서 | Eden AI Documentation |
| 기본 URL | https://api.edenai.run/v3 |
| 지원 작업 | /chat/completions, /responses, /v1/messages, /embeddings, /audio/transcriptions, /audio/speech, /images/generations, /videos |
필수 변수
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
키는 Eden AI 대시보드(https://app.edenai.run)의 Settings, API Keys에서 만들 수 있어요.
선택 변수
os.environ["EDENAI_API_BASE"] = "https://api.eu.edenai.run/v3" # EU endpoint, same key. Default is https://api.edenai.run/v3
EU 엔드포인트는 같은 API 키를 받지만 EU에서 호스팅되는 카탈로그의 일부만 제공하므로, 기본 호스트에서 동작하는 모델 id(이 페이지의 openai/gpt-mini-latest, anthropic/claude-sonnet-latest 예시 포함)는 여기 없을 수 있어요. 전환하기 전에 https://api.eu.edenai.run/v3/models 에서 EU 호스트가 서빙하는 id를 확인하세요.
모델 이름 (Model Names)
Eden AI 모델 id는 provider/model 형식이에요 (예: openai/gpt-mini-latest, anthropic/claude-sonnet-latest, google/gemini-3.7-flash). edenai/ 접두사를 추가하면 LiteLLM이 그 접두사만 제거하므로 edenai/openai/gpt-mini-latest는 Eden AI에 openai/gpt-mini-latest로 도달해요. edenai/mistral-small-latest 같은 bare 모델 이름도 동작하며, Eden AI가 그 모델을 서빙하는 판매자를 선택해요(공급자 라우팅). openai/gpt-mini-latest 같은 alias_of가 있는 카탈로그 항목인 Eden AI 자체의 안정 별칭은 공급자 접두사가 있을 때만 해석돼요. 지역 변형은 edenai/vertex/gemini-3.7-flash@eu처럼 접미사를 유지해요.
카탈로그는 https://app.edenai.run/models 에 공개돼 있어요. LiteLLM에서 litellm.get_valid_models(custom_llm_provider="edenai", check_provider_endpoint=True)는 edenai/ 접두사가 적용된 같은 목록을 반환해요.
하나의 배포로 모든 Eden AI 모델 라우팅
와일드카드 배포로 전체 카탈로그를 proxy에 노출할 수 있어요. check_provider_endpoint가 켜져 있으면 /v1/models가 https://api.edenai.run/v3/models 의 모든 모델을 edenai/ 접두사 아래 나열하고, 그 중 어떤 모델(예: edenai/mistral/mistral-small-latest)에 대한 요청이든 이 배포를 통해 라우팅돼요.
model_list:
- model_name: edenai/*
litellm_params:
model: edenai/*
api_key: os.environ/EDENAI_API_KEY
litellm_settings:
check_provider_endpoint: true
비용 추적 (Cost Tracking)
모든 Eden AI 응답은 계정 할인 후 요청의 비용을 USD로 보고하고, LiteLLM은 가격 맵 추정 대신 그 숫자를 요청의 지출로 기록해요. chat completion 스트림에서는 비용이 마지막 usage 청크에 도착해요. LiteLLM은 항상 Eden AI에 그 청크를 요청하고, stream_options={"include_usage": True}를 설정했을 때만 클라이언트로 전달하므로 스트리밍 클라이언트는 기대하는 OpenAI 동작을 정확히 봐요.
| 엔드포인트 | 비스트리밍 | 스트리밍 |
|---|---|---|
| /chat/completions | Eden AI의 비용 | Eden AI의 비용 (마지막 usage 청크에서) |
| /responses | Eden AI의 비용 | Eden AI의 비용 (response.completed 이벤트의 usage.cost에서) |
| /v1/messages | Eden AI의 비용 | 가격 맵 추정 — 모델 가격을 등록하지 않으면 0 (Eden AI는 Messages 스트림 안에 비용을 보고하지 않음) |
| /embeddings | Eden AI의 비용 | 스트리밍 없음 |
| /audio/transcriptions | JSON 형식은 Eden AI 비용; text, srt, vtt는 클립 길이로 가격 맵 추정 | 스트리밍 없음 |
| /audio/speech | x-edenai-cost 응답 헤더에서 Eden AI의 비용 | 스트리밍 없음 |
| /images/generations | Eden AI의 비용 | 스트리밍 없음 |
| /videos | 생성 호출은 0 (작업이 큐에 있을 때 Eden AI가 보고하는 값); 확정 비용은 작업이 완료되면 usage.provider_reported_cost_usd로 표시 | 스트리밍 없음 |
LiteLLM Python SDK 사용법
비스트리밍 (Non-streaming)
import os
from litellm import completion
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
messages = [{"content": "Hello, how are you?", "role": "user"}]
response = completion(
model="edenai/openai/gpt-mini-latest",
messages=messages,
)
print(response)
스트리밍 (Streaming)
import os
from litellm import completion
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
messages = [{"content": "Write a short story about AI", "role": "user"}]
response = completion(
model="edenai/anthropic/claude-sonnet-latest",
messages=messages,
stream=True,
stream_options={"include_usage": True},
)
for chunk in response:
print(chunk)
Eden AI 파라미터: fallbacks와 routing
Eden AI는 OpenAI 세트를 넘어 몇 가지 필드를 받아요. fallbacks는 기본 모델이 실패할 때 순서대로 시도할 최대 3개의 provider/model id를 나열하고, routing은 bare 모델 이름의 공급자 라우팅을 조종해요(sort는 cost, speed, latency 또는 exact이고, allowed_providers는 판매자를 제한). 이를 extra_body로 전달해요.
import os
from litellm import completion
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
response = completion(
model="edenai/gpt-5-mini",
messages=[{"content": "Hello, how are you?", "role": "user"}],
extra_body={
"fallbacks": ["anthropic/claude-sonnet-latest"],
"routing": {"sort": "latency", "allowed_providers": ["openai", "azure"]},
},
)
print(response)
Responses API 사용법
Eden AI는 카탈로그의 모든 모델에 대해 /v3/responses에서 OpenAI의 Responses API를 제공하고, LiteLLM은 litellm.responses와 proxy의 /v1/responses를 chat completions로 에뮬레이션하지 않고 네이티브로 거기로 라우팅해요. 상태 유지 기능(previous_response_id, store, response 조회/삭제)은 판매자가 네이티브로 Responses API를 지원할 때만 동작하는데, 오늘은 OpenAI 모델을 의미하며 다른 판매자는 stateless로 응답해요. fallbacks와 routing도 여기서 extra_body로 전달돼요.
import os
import litellm
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
response = litellm.responses(
model="edenai/openai/gpt-mini-latest",
input="Hello, how are you?",
max_output_tokens=200,
)
print(response.output_text)
stream = litellm.responses(
model="edenai/anthropic/claude-sonnet-latest",
input="Write a short story about AI",
stream=True,
)
for event in stream:
print(event)
Anthropic Messages API 사용법
Eden AI는 카탈로그의 모든 모델(OpenAI, Google 모델 포함)에 대해 /v3/v1/messages에서 Anthropic의 Messages API를 제공하고, LiteLLM은 litellm.anthropic.messages 호출과 proxy의 /v1/messages를 번역 없이 그대로 전달해요. 그래서 cache_control가 있는 system 블록, thinking, tool 결과가 클라이언트가 보낸 대로 정확히 Eden AI에 도달해요. Eden AI의 fallbacks와 routing 필드는 이 라우트에서 보낼 수 없어요.
import os
import litellm
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
response = await litellm.anthropic.messages.acreate(
model="edenai/anthropic/claude-sonnet-latest",
max_tokens=200,
messages=[{"role": "user", "content": "Hello, how are you?"}],
)
print(response["content"][0]["text"])
Embeddings 사용법
Eden AI는 카탈로그의 모든 임베딩 모델(OpenAI, Google, Cohere, Mistral, Amazon 등)에 대해 /v3/embeddings에서 OpenAI 임베딩 API를 제공해요. dimensions, encoding_format, user는 그대로 전달되고, Eden AI 고유 필드(metadata 등)는 extra_body로 전달돼요.
import os
import litellm
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
response = litellm.embedding(
model="edenai/openai/text-embedding-3-small",
input=["Hello, how are you?", "Fine, thanks"],
dimensions=256,
)
print(len(response.data[0]["embedding"]))
print(response._hidden_params["response_cost"]) # the cost Eden AI reported
오디오 사용법 (transcription과 speech)
Eden AI는 /v3/audio/transcriptions에서 OpenAI 음성-텍스트 API를, /v3/audio/speech에서 텍스트-음성 API를 제공해요. Transcription은 일반적인 multipart 업로드에 language, prompt, response_format, temperature, timestamp_granularities를 받고, speech는 voice, response_format, speed, instructions를 받아요. 둘 다 Eden AI의 비용을 보고해요: transcription은 본문에, speech는 본문이 오디오 자체이므로 x-edenai-cost 응답 헤더에.
import os
import litellm
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
speech = litellm.speech(
model="edenai/openai/tts-1",
input="Hello, how are you?",
voice="alloy",
response_format="mp3",
)
speech.stream_to_file("hello.mp3")
with open("hello.mp3", "rb") as audio:
transcript = litellm.transcription(
model="edenai/openai/whisper-1",
file=audio,
language="en",
)
print(transcript.text)
이미지 생성 사용법
Eden AI는 카탈로그의 모든 이미지 모델(OpenAI, Google, Amazon, Stability 등)에 대해 /v3/images/generations에서 OpenAI의 이미지 생성 API를 제공해요. 이미지는 판매자에 따라 b64_json 또는 호스팅 URL로 반환되며, 응답에 Eden AI의 비용이 실려요.
import base64
import os
import litellm
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
response = litellm.image_generation(
model="edenai/openai/gpt-image-1-mini",
prompt="A watercolor lighthouse at dawn",
size="1024x1024",
quality="low",
)
image = response.data[0]
if image.b64_json:
with open("lighthouse.png", "wb") as f:
f.write(base64.b64decode(image.b64_json))
else:
print(image.url)
비디오 생성 사용법
Eden AI는 카탈로그의 모든 비디오 모델(OpenAI, Google, Amazon, MiniMax, Pixverse 등)에 대해 /v3/videos에서 OpenAI의 비디오 API를 제공해요. 작업은 LiteLLM의 비디오 함수로 생성·폴링·다운로드되며, LiteLLM이 반환하는 id가 이후 호출을 Eden AI로 되돌려 라우팅해요. seconds와 size는 그대로 전달되고, 참조 이미지는 파일 또는 {"image_url": ...}/{"file_id": ...}로 input_reference에 전달되며, Eden AI 고유의 seed, provider_params, webhook_receiver, user_webhook_parameters는 Eden AI가 검증하도록 패스스루돼요. OpenAI의 characters와 user도 전달되며, Eden AI가 이를 지원할 때까지 422로 답해요.
import os
import time
import litellm
os.environ["EDENAI_API_KEY"] = "" # your Eden AI API key
job = litellm.video_generation(
model="edenai/pruna/p-video",
prompt="A red ball rolling across a wooden table",
seconds="4",
size="1280x720",
)
while job.status not in ("completed", "failed"):
time.sleep(5)
job = litellm.video_status(video_id=job.id)
print(job.status, job.usage) # usage carries Eden AI's settled cost as provider_reported_cost_usd
with open("ball.mp4", "wb") as f:
f.write(litellm.video_content(video_id=job.id))
LiteLLM Proxy 사용법
config.yaml:
model_list:
- model_name: gpt-mini-latest
litellm_params:
model: edenai/openai/gpt-mini-latest
api_key: os.environ/EDENAI_API_KEY
- model_name: claude-sonnet
litellm_params:
model: edenai/anthropic/claude-sonnet-latest
api_key: os.environ/EDENAI_API_KEY
- model_name: gemini-flash-eu
litellm_params:
model: edenai/vertex/gemini-3.7-flash
api_key: os.environ/EDENAI_API_KEY
api_base: https://api.eu.edenai.run/v3
- model_name: text-embedding-3-small
litellm_params:
model: edenai/openai/text-embedding-3-small
api_key: os.environ/EDENAI_API_KEY
- model_name: whisper-1
litellm_params:
model: edenai/openai/whisper-1
api_key: os.environ/EDENAI_API_KEY
- model_name: tts-1
litellm_params:
model: edenai/openai/tts-1
api_key: os.environ/EDENAI_API_KEY
- model_name: gpt-image-1-mini
litellm_params:
model: edenai/openai/gpt-image-1-mini
api_key: os.environ/EDENAI_API_KEY
- model_name: p-video
litellm_params:
model: edenai/pruna/p-video
api_key: os.environ/EDENAI_API_KEY
LiteLLM Proxy 서버 시작:
litellm --config config.yaml
# RUNNING on http://0.0.0.0:4000
OpenAI SDK:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:4000", # Your proxy URL
api_key="your-proxy-api-key", # Your proxy API key
)
response = client.chat.completions.create(
model="gpt-mini-latest",
messages=[{"role": "user", "content": "Hello, how are you?"}],
)
print(response.choices[0].message.content)
LiteLLM SDK:
import litellm
response = litellm.completion(
model="litellm_proxy/gpt-mini-latest",
messages=[{"role": "user", "content": "Hello, how are you?"}],
api_base="http://localhost:4000",
api_key="your-proxy-api-key",
)
print(response.choices[0].message.content)
cURL (chat completions, responses, messages, embeddings, audio, images, videos):
curl http://localhost:4000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-p...-key" \
-d '{
"model": "gpt-mini-latest",
"messages": [{"role": "user", "content": "Hello, how are you?"}]
}'
curl http://localhost:4000/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-p...-key" \
-d '{
"model": "gpt-mini-latest",
"input": "Hello, how are you?"
}'
curl http://localhost:4000/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: your-p...key" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet",
"max_tokens": 200,
"messages": [{"role": "user", "content": "Hello, how are you?"}]
}'
curl http://localhost:4000/v1/embeddings \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-p...-key" \
-d '{"model": "text-embedding-3-small", "input": "Hello, how are you?"}'
curl http://localhost:4000/v1/audio/speech \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-p...-key" \
-d '{"model": "tts-1", "input": "Hello, how are you?", "voice": "alloy"}' \
--output hello.mp3
curl http://localhost:4000/v1/audio/transcriptions \
-H "Authorization: Bearer your-p...-key" \
-F model=whisper-1 \
-F [email protected]
curl http://localhost:4000/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-p...-key" \
-d '{"model": "gpt-image-1-mini", "prompt": "A watercolor lighthouse at dawn", "size": "1024x1024", "quality": "low"}'
curl http://localhost:4000/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-p...-key" \
-d '{"model": "p-video", "prompt": "A red ball rolling across a wooden table", "seconds": "4", "size": "1280x720"}'
curl http://localhost:4000/v1/videos/<id from the create response> \
-H "Authorization: Bearer your-p...-key"
curl http://localhost:4000/v1/videos/<id from the create response>/content \
-H "Authorization: Bearer your-p...-key" \
--output ball.mp4
proxy의 x-litellm-response-cost 응답 헤더와 spend 로그는 Eden AI가 요청에 대해 보고한 비용을 담아요. 같은 배포가 /v1/responses와 /v1/messages도 서빙해요.