Building a Minimal Translation API with LangChain v0.2, LCEL, and LangServe

Environment Setup

pip install langchain langchain-openai "langserve[all]" uvicorn[standard]

Export your OpenAI key or pass it explicitly:

import os
os.environ["OPENAI_API_KEY"] = "sk-..."

Step 1: Bare-bones Model Call

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage

llm = ChatOpenAI(model="gpt-4")

messages = [
    SystemMessage(content="You are a concise translator."),
    HumanMessage(content="Hello, how are you?")
]

raw = llm.invoke(messages)
print(raw.content)  # Bonjour, comment ça va ?

Step 2: Parsing the Output

from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()
translation = parser.invoke(raw)
print(translation)  # Bonjour, comment ça va ?

Chain model and parser in one line:

chain = llm | parser
chain.invoke(messages)

Step 3: Prompt Templates

Create a reusable prompt that accepts dynamic language and text:

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "Translate the following text into {target_lang}."),
    ("user", "{source_text}")
])

prompt.format_messages(target_lang="French", source_text="Good morning")
# -> [SystemMessage(...), HumanMessage(...)]

Step 4: LCEL Pipeline

Combine prompt, model, and parser into a single runnable:

translate_chain = prompt | llm | parser

result = translate_chain.invoke({
    "target_lang": "Spanish",
    "source_text": "Where is the library?"
})
print(result)  # ¿Dónde está la biblioteca?

Streaming is automatic:

for chunk in translate_chain.stream({"target_lang": "German", "source_text": "Thank you"}):
    print(chunk, end="", flush=True)

Step 5: REST API with LangServe

Save the follownig as app.py:

from fastapi import FastAPI
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langserve import add_routes

prompt = ChatPromptTemplate.from_messages([
    ("system", "Translate the following text into {target_lang}."),
    ("user", "{source_text}")
])

model = ChatOpenAI()
parser = StrOutputParser()

chain = prompt | model | parser

app = FastAPI(
    title="Mini Translator API",
    version="1.0",
    description="A minimal LangServe deployment"
)

add_routes(app, chain, path="/translate")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

Start the server:

python app.py

Step 6: Client Usage

Interactive playground: open http://localhost:8000/translate/playground

Programmatic client:

from langserve import RemoteRunnable

client = RemoteRunnable("http://localhost:8000/translate")
print(client.invoke({
    "target_lang": "Japanese",
    "source_text": "See you tomorrow"
}))
# また明日

Async and streaming are supported out of the box:

import asyncio

async def main():
    async for tok in client.astream({"target_lang": "Italian", "source_text": "Good night"}):
        print(tok, end="")

asyncio.run(main())
```,

Posted on Sat, 05 Sep 2026 16:18:38 +0000 by imnsi