import { Alert, AlertDescription } from "@/components/ui/alert";
import { Button } from "@/components/ui/button";
import { CodeEditor } from "@/components/ui/codeEditor";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { useCopyToClipboard } from "@/hooks/useCopyToClipboard";
import { getExampleBaseUrl } from "@/lib/utils/port";
import { AlertTriangle, Copy } from "lucide-react";
import { useMemo, useState } from "react";
type Provider = "openai" | "anthropic" | "genai" | "litellm" | "langchain";
type Language = "python" | "typescript";
type Examples = {
curl: string;
sdk: {
[P in Provider]: {
[L in Language]: string;
};
};
};
// Common editor options to reduce duplication
const EditorOptions = {
scrollBeyondLastLine: false,
minimap: { enabled: false },
lineNumbers: "off",
folding: false,
lineDecorationsWidth: 0,
lineNumbersMinChars: 0,
glyphMargin: false,
} as const;
interface CodeBlockProps {
code: string;
language: string;
onLanguageChange?: (language: string) => void;
showLanguageSelect?: boolean;
readonly?: boolean;
}
function CodeBlock({ code, language, onLanguageChange, showLanguageSelect = false, readonly = true }: CodeBlockProps) {
const { copy: copyToClipboard } = useCopyToClipboard();
return (
{showLanguageSelect && onLanguageChange && (
)}
);
}
interface EmptyStateProps {
error: string | null;
}
export function EmptyState({ error }: EmptyStateProps) {
const [language, setLanguage] = useState("python");
// Generate examples dynamically using the port utility
const examples: Examples = useMemo(() => {
const baseUrl = getExampleBaseUrl();
return {
curl: `curl -X POST ${baseUrl}/v1/chat/completions \\
-H "Content-Type: application/json" \\
-d '{
"model": "openai/gpt-4o-mini",
"messages": [
{"role": "user", "content": "Hello!"}
]
}'`,
sdk: {
openai: {
python: `import openai
client = openai.OpenAI(
base_url="${baseUrl}/openai",
api_key="dummy-api-key" # Handled by Bifrost
)
response = client.chat.completions.create(
model="gpt-4o-mini", # or "provider/model" for other providers (anthropic/claude-3-sonnet)
messages=[{"role": "user", "content": "Hello!"}]
)`,
typescript: `import OpenAI from "openai";
const openai = new OpenAI({
baseURL: "${baseUrl}/openai",
apiKey: "dummy-api-key", // Handled by Bifrost
});
const response = await openai.chat.completions.create({
model: "gpt-4o-mini", // or "provider/model" for other providers (anthropic/claude-3-sonnet)
messages: [{ role: "user", content: "Hello!" }],
});`,
},
anthropic: {
python: `import anthropic
client = anthropic.Anthropic(
base_url="${baseUrl}/anthropic",
api_key="dummy-api-key" # Handled by Bifrost
)
response = client.messages.create(
model="claude-3-sonnet-20240229", # or "provider/model" for other providers (openai/gpt-4o-mini)
max_tokens=1000,
messages=[{"role": "user", "content": "Hello!"}]
)`,
typescript: `import Anthropic from "@anthropic-ai/sdk";
const anthropic = new Anthropic({
baseURL: "${baseUrl}/anthropic",
apiKey: "dummy-api-key", // Handled by Bifrost
});
const response = await anthropic.messages.create({
model: "claude-3-sonnet-20240229", // or "provider/model" for other providers (openai/gpt-4o-mini)
max_tokens: 1000,
messages: [{ role: "user", content: "Hello!" }],
});`,
},
genai: {
python: `from google import genai
from google.genai.types import HttpOptions
client = genai.Client(
api_key="dummy-api-key", # Handled by Bifrost
http_options=HttpOptions(base_url="${baseUrl}/genai")
)
response = client.models.generate_content(
model="gemini-2.5-pro", # or "provider/model" for other providers (openai/gpt-4o-mini)
contents="Hello!"
)`,
typescript: `import { GoogleGenerativeAI } from "@google/generative-ai";
const genAI = new GoogleGenerativeAI("dummy-api-key", { // Handled by Bifrost
baseUrl: "${baseUrl}/genai",
});
const model = genAI.getGenerativeModel({ model: "gemini-2.5-pro" }); // or "provider/model" for other providers (openai/gpt-4o-mini)
const response = await model.generateContent("Hello!");`,
},
litellm: {
python: `import litellm
litellm.api_base = "${baseUrl}/litellm"
response = litellm.completion(
model="openai/gpt-4o-mini",
messages=[{"role": "user", "content": "Hello!"}]
)`,
typescript: `import { completion } from "litellm";
const response = await completion({
model: "openai/gpt-4o-mini",
messages: [{ role: "user", content: "Hello!" }],
api_base: "${baseUrl}/litellm",
});`,
},
langchain: {
python: `from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# Initialize ChatOpenAI with Bifrost
llm = ChatOpenAI(
model="gpt-4o-mini",
api_key="dummy-api-key", # Handled by Bifrost
base_url="${baseUrl}/langchain",
max_tokens=100,
)
# Simple message
messages = [HumanMessage(content="Hello from LangChain!")]
response = llm.invoke(messages)
# Chain with prompt template
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant."),
("human", "{input}")
])
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"input": "What is LangChain?"})`,
typescript: `import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage } from "@langchain/core/messages";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
// Initialize ChatOpenAI with Bifrost
const llm = new ChatOpenAI({
model: "gpt-4o-mini",
openAIApiKey: "dummy-api-key", // Handled by Bifrost
clientOptions: {
baseURL: "${baseUrl}/langchain",
},
maxTokens: 100,
});
// Simple message
const messages = [new HumanMessage("Hello from LangChain!")];
const response = await llm.invoke(messages);
// Chain with prompt template
const prompt = ChatPromptTemplate.fromMessages([
["system", "You are a helpful assistant."],
["human", "{input}"],
]);
const chain = prompt.pipe(llm).pipe(new StringOutputParser());
const result = await chain.invoke({ input: "What is LangChain?" });`,
},
},
};
}, []);
const isUnexpectedError = error && error.includes("An unexpected error occurred");
return (
{error && (
{isUnexpectedError ? "Looks like you haven't configured the log store in your config file." : error}
)}
Integrate under 60 seconds
Send your first request to get started
cURL
OpenAI SDK
Anthropic SDK
Google GenAI SDK
LiteLLM SDK
LangChain SDK
setLanguage(newLang as Language)}
showLanguageSelect
/>
setLanguage(newLang as Language)}
showLanguageSelect
/>
setLanguage(newLang as Language)}
showLanguageSelect
/>
setLanguage(newLang as Language)}
showLanguageSelect
/>
setLanguage(newLang as Language)}
showLanguageSelect
/>
);
}