>The language of AI

Convo-Lang

AI in plain text

Work with LLMs in plain text without gigabytes of framework dependencies. Convo-Lang provides a language and runtime that allows you to create agentic workflows and agents with support for features such as MCP, RAG, typed JSON outputs and more, all from within a single easy to read .convo file.

Read the docs
▸ source · prompts · tools · workflows
01 / Plain-text AI

A .convo gives you full control over the context.

A single convo file can define reasoning contracts: typed inputs and outputs, declared guards, traceable execution. It's plain text, it's yours.

clear-thinking.convo · convoInteractive
@import ./resumes/paul.md !file @import ./resumes/jessica.md !file @import ./resumes/freddy.md !file > define ProfileData = struct( name: string # Must have 1 or more years of experience yearsExperience: number # List of skill relating to bio-tech. # Must have at least one related skill skills: array(string) ) @json array(ProfileData) > user Extract the profiles from the resumes that meet the minimal requirements
▸ why plain text matters
Chats become reusable artifacts
A useful prompt, workflow, or answer pattern can be saved, shared, and improved instead of disappearing in chat history.
Context stays visible
Instructions, examples, assumptions, files, and retrieved notes live in the same plain-text conversation.
Automation stays understandable
From one-off tasks to high-volume agents, tool calls and results are recorded where people can inspect them.
Same format for every scale
Use it for personal prompts, team workflows, or production systems without switching to opaque JSON glue.
02 / The architecture problem

Hallucinations are often the result of architecture failures.

Undefined contracts, Loose outputs, Unknown state, Hidden control flow. These are the symptoms of treating your prompts as strings and passing them off to a frameworks you don't fully understand. Convo-Lang removes black boxes that sit between you and the LLM.

prompt.py · pythonsuggestion
# Hope. Vibes. Production code. prompt = """ Please return a JSON object with fields name, years_experience, skills. Make sure it is valid JSON. Thank you. """ result = notYourCode(prompt) data = json.loads(result) # 🤞
agent.convo · convocontract
// Schema. Guards. Traces. > define ProfileData = struct( name: string yearsExperience: number skills: array(string) ) @json ProfileData > user Extract the data exactly as defined
▸ failure surface
silent parse error reaches downstream code
▸ failure surface
schema violation caught before the result enters your system
03 / High-level building blocks

Prompts, tools, and workflows stay close to the conversation.

Convo-Lang standardizes the prompt and agent layer without hiding model behavior inside framework callbacks or nested JSON payloads.

01

Plain-text conversations

A .convo file is a readable conversation source. Prompts, roles, imports, variables, and model instructions stay reviewable in source control.

> system · > user · > assistant
02

Structured output

Define structs and request JSON output when an answer matters to your app. Convo-Lang keeps the output contract beside the prompt.

@json array(Feature)
03

Tool-using workflows

Describe functions where the model uses them. Tool calls and results are appended as part of the conversation history.

> extern getWeather(city:string)
stock-market-agent.convo · convotool
> system You are an expert day trader helping the user make stock trades. Use the `getStock` function to get the latest EODs before making decisions # Returns the most recent EOD for a stock ticker > getStock( # Ticker of the company to get EOD for ticker:string ) -> ( result=httpGet('https://olatyj7sylyh2nthh5l5da5fe40kkzdy.lambda-url.us-east-1.on.aws?ticker={{ encodeURIComponent(ticker) }}') return(result) ) > user How is Nvidia's stock doing
typed-output.convo · convojson
@import ./stock-market-agent.convo !ignoreContent > define TradePick=struct( # All compared tickers tickers:array(string) # Ticker of stock that seems like the best option bestOption:string priceUsd:number # The reasoning behind why you pick the stock you pick reasoning:string ) @json TradePick > user Should I buy Apple or Nvidia
▸ conversation ledger
source
messages·plain text
system · user · assistant · rag
──▶
runtime
agent flow·inspectable
tools · results · state · output

When the model calls a function, Convo-Lang appends call and result messages. The conversation remains an auditable record of what the model saw and what the runtime did.

04 / Using Convo-Lang

Minimize context switching.

The hard reality is that no one tool can do everything, especial the ones that say they do. This fact is why Convo-Lang is designed to work with your tools, not replace them.
You can move from your code editor to your note taking tool then jump on the command line and use the same plain text language in all of them. You still have to switch context, but you don't have to switch the way you think about AI.

Build AI assistants React apps

ShoppingAssistant.tsx · tsxAssist
import { ConvoView } from '@convo-lang/convo-lang-react'; import { addToCart } from "@/lib/product-lib"; export function ShoppingAssistant({ assistantName, userProfile, }:ShoppingAssistantProps){ return ( <ConvoView externFunctions={{addToCart}} template={/*convo*/` @import /products.md > system You are a helpful and friendly e-com web site assistant. > extern addToCart(productId:string quantity:number) Below is a user profile of the user you are helping today. <USER_PROFILE> ${userProfile} </USER_PROFILE> > assistant Hi my name is ${assistantName}, I'm your shopping assistant. How can I help you. `} /> ) }

Process structured data using TypeScript

support-ticket-lib.ts · typescriptNLP
import { convo } from '@convo-lang/convo-lang'; import { z } from "zod"; export const createSupportTicket=async ( userMessage:string ):Promise<SupportTicket>=>{ const supportTicket=await convo` @import /products.md @import /product-support.md @json ${SupportTicketSchema} > user Convert the following message into a a support ticket. <MESSAGE> ${userMessage} </MESSAGE> `; return supportTicket; } const SupportTicketSchema=z.object({ sentiment:z.enum(['happy','sad','angry','confused','neutral']), requestingRefund:z.boolean(), refundRequestAmount:z.number().optional(), referencedProjects:z.string().array(), summary:z.string(), }); export type SupportTicket=z.infer<typeof SupportTicketSchema>;

Build AI workflows in VSCode

update-product-page.convo · convoworkflow
@import ./shared-instructions.convo @import ../pages/products.tsx !file @import ../docs/products.md !file @import https://example.io/api/sales-events?order-by=date > user Update the `products.tsx` page based on the `products.md` file and any upcoming sales events.

Automate tasks on the command line

update-product-page.sh · bashCLI
#!/usr/bin/env bash set -e convo ./update-product-page.convo bun run build ./upload-to-s3.sh --src ./out --dest s3://really-cool-ecomms-website/
04 / Runtime features

Build AI flows you can inspect.

Convo-Lang supports imports, dynamic expressions, edge messages, triggers, inline prompts, structured types, RAG, vision input, provider settings, transforms, components, and graph-style workflow control.

▸ configure
OpenAI and compatible APIs
OpenRouter and Bedrock
local models through Ollama or LM Studio
per-message model settings
▸ compose
import reusable agents
inject RAG context
register extern tools
return typed JSON
state-aware-agent.convo · convoedge
> define cart=[] @edge > system Current cart: {{cart}} # Adds an item to the cart > addToCart(item:string) -> ( cart=aryAdd(cart item) return('Item added') ) > user Add a keyboard to my cart.

Start with a working NextJS app

Generate an app with example agents and a Convo-Lang backend.

create-app.sh · bash
npx @convo-lang/convo-lang-cli --create-next-app
View quick start