How do I move my projects from LangSmith to Rius?
Rius maps each LangSmith project to an agent named by service.name, so you move a project by setting service_name in rius.init() and sending traces with a Rius API key. Environments such as production and staging each get their own workspace and API key. The full walkthrough is in Migrate from LangSmith to Rius, part of Migrate to Rius.
How it works
A LangSmith project is a named bucket you pick with LANGSMITH_PROJECT. Rius has no project object. It groups traces by agent, and the agent name is the service.name of the process that sends them. In Python that is the service_name argument of rius.init().
The rest of the concept map is short:
- Project becomes an agent, named by
service.name. - Production and staging become separate workspaces. Each trace belongs to the workspace of the API key that sent it, so a key per environment replaces a project per environment.
- Trace stays a trace, and each run becomes a span.
- Thread (
thread_idorsession_idmetadata) becomes a session.with rius.session(thread_id):stampssession.idon every span inside it, child spans included. - Metadata and tags become span attributes. There is no separate tag concept.
- Run types (
llm,chain,tool,retriever,embedding) become span kinds. Integrations set the kind for you, andkind=on@rius.observesets it by hand.
For LangChain and LangGraph apps, the Rius SDK hooks the same callback system LangSmith uses. Your chains, agents and graphs stay as they are.
Set it up
- Create a Rius workspace and an API key for each environment you kept as a LangSmith project. The quickstart steps are covered in the migration guide’s cutover checklist.
- Install the SDK with the LangChain extra:
pip install "glassflow-rius[langchain]"- Replace the LangSmith environment variables with one Rius key. The project name moves into
service_name:
# Before: LangSmith
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY="lsv2_..."
export LANGSMITH_PROJECT="my-agent"
# After: Rius
export RIUS_API_KEY="ri_..."import rius
client = rius.init(service_name="my-agent")
# build and run your chains, agents and graphs exactly as before- If your code uses
@traceable, swap it for@rius.observe. Use@rius.observe(name="Chat Pipeline")to keep a run name, and@rius.observe(kind=rius.SpanKind.TOOL)for what wasrun_type="tool". Dropwrap_openaiandwrap_anthropic, becauserius.init()instruments those libraries for every client you create. - Replace
thread_idmetadata withwith rius.session(thread_id):around each conversation turn. Set it once per request instead of on every run. - In a short-lived script, call
client.flush()before it exits. In the same process, leavingLANGSMITH_TRACING=trueset keeps LangSmith receiving traces next to Rius while you compare.
If you cannot change code yet, LangSmith’s OpenTelemetry export can send to Rius with the OTEL_EXPORTER_OTLP_* variables, and OTEL_SERVICE_NAME becomes the agent name. LangSmith defaults it to “langsmith”, so set it. That route brings the trace tree, models, tokens and cost, but no inputs or outputs, and thread metadata arrives as langsmith.metadata.thread_id instead of session.id, so traces do not group into sessions. Use it as a bridge, then move to the SDK.
What you get
- Each former project shows as an agent with its traces, and each environment sits in its own workspace.
- Each model call is a generation with model, token counts and a cost that Rius computes from the spans. You never send a cost value. Costs are list-price estimates in US dollars.
- Conversations group into sessions, and your end users appear on the users page when you set a user id.
- Alerts on the traffic you now send, and an MCP server so your coding agent can query production traces.
What has no counterpart in Rius:
- Datasets, experiments and evaluators, including LLM-as-judge.
- Feedback scores and annotation queues.
- Prompt Hub and Playground. Prompt content on spans is captured, but there is no registry.
- Hosting or running agents. Rius observes them wherever they run.
- Self-hosting. Rius is a managed service only.
- Historical data. Existing traces stay in LangSmith, and Rius starts from the first span you send.
When something else fits
If evaluations, datasets or annotation queues are central to your workflow, keep LangSmith for those pieces and run both backends side by side. Rius covers tracing, cost, sessions and alerts, so a partial move is a valid end state. Both can receive the same traces during the evaluation, and you cut over only when Rius shows what you need.