A model-native compiler pipeline for Rime source files
Reason this release was yanked:
it was a test
Project description
Rime
Code-prompting for code-generation models.
You write the shape. The model writes the code.
The Problem
Prompting a code model in natural language is fast but loose:
"build a Student records service with add, get, update, and list operations"
The model decides the architecture. The model decides the types. The model decides how much state to introduce, what errors to raise, and what to do when the prompt is ambiguous.
You get code back, but not necessarily the code shape you intended.
Rime gives you a way to declare that shape up front without writing the implementation yourself.
Example
This is the canonical example in the repository:
desc: "Build a student records service that stores students, fetches individual records, updates grades, and lists all known students."
types {
StudentRecord = struct(student_id: string, name: string, grade: int)
}
state {
students: list[StudentRecord] = []
}
contracts {
contract add_student(student_id: string, name: string, grade: int) -> StudentRecord {
desc: "Add a new student record to the system and return the created record"
raises: DuplicateStudentID, InvalidGrade
}
contract get_student(student_id: string) -> StudentRecord | null {
desc: "Return the student record matching the given identifier, or null if not found"
requires: valid_student_id
}
contract update_grade(student_id: string, new_grade: int) -> StudentRecord {
desc: "Update the grade for an existing student and return the updated record"
raises: StudentNotFound, InvalidGrade
}
contract list_students() -> list[StudentRecord] {
desc: "Return a list of all student records currently in the system"
requires: non_empty_student_list
}
}
That is the whole source input. Rime compiles it into an intermediate representation and then into validated Python.
The Pipeline
Rime runs a model-native compiler pipeline:
Students.rime -> Students.ir -> Students.py
source IR output
The current repository exposes three main commands:
rime lint <input.rime>reports non-fatal authoring warnings.rime ir <input.rime>generates the textual IR.rime build <input.rime>generates final Python.
You can also keep the intermediate artifact during build:
rime build examples/Students.rime --emit-ir
The pipeline validates three boundaries:
.rimesource structure and grounded syntax- IR structure and semantic consistency
- generated Python syntax and contract-shape compliance against the IR
When IR or code validation fails, Rime performs corrective regeneration and feeds the validation diagnostic back into the next model attempt.
Example IR output:
RIME-IR v0.1
entity: Students
language: python
[STATE]
students: list[StudentRecord] = []
[CONTRACTS]
add_student(student_id: string, name: string, grade: int) -> StudentRecord
hint: Add a new student record to the system and return the created record
raises: DuplicateStudentID, InvalidGrade
get_student(student_id: string) -> StudentRecord | null
hint: Return the student record matching the given identifier, or null if not found
requires: valid_student_id
update_grade(student_id: string, new_grade: int) -> StudentRecord
hint: Update the grade for an existing student and return the updated record
raises: StudentNotFound, InvalidGrade
list_students() -> list[StudentRecord]
hint: Return a list of all student records currently in the system
requires: non_empty_student_list
[ERRORS]
DuplicateStudentID: Declared failure mode from Rime source
InvalidGrade: Declared failure mode from Rime source
StudentNotFound: Declared failure mode from Rime source
The IR is not meant to be written by hand. It is the compiler-visible artifact that keeps the model workflow inspectable and correctable.
What Rime Is
Rime is:
- a declaration language
- a contract surface for model-generated code
- a compiler-style control layer for code generation
Rime is not:
- a runtime language
- a general-purpose programming language
- a replacement for Python or other implementation languages
The implementation still ends up in Python or another target language. Rime exists one level above that.
Why Not Just Use Natural Language?
| Natural language | Rime | |
|---|---|---|
| Architecture | Model decides | You decide |
| Types | Model infers | You declare |
| Failure modes | Model guesses | You name them |
| Diffable | No | Yes |
| Validatable | No | Yes |
| Reproducible | Rarely | By design |
Rime does not replace the model. It gives the model a better brief.
Authoring Workflow
The recommended workflow is now:
- start a new
.rimefile from the VS Code scaffold - let live editor diagnostics catch structural and modeling mistakes while you type
- run
rime lintfor non-fatal authoring warnings - run
rime buildonce the source shape is clean
This matters because many Rime mistakes are not raw syntax errors. They are modeling mistakes that are structurally valid but still likely to cause drift during generation.
Quick Start
- Create and activate a Python environment.
- Install the project in editable mode:
pip install -e .[dev] - Run
rime initto configure your API key and model globally. - If you use VS Code, start a new
.rimefile from the built-in scaffold. - Lint the source:
rime lint examples/Students.rime - Inspect the IR:
rime ir examples/Students.rime - Build Python:
rime build examples/Students.rime --emit-ir - Run the generated program:
python examples/Students.py
CLI
rime opens interactive Rime shell
rime lint <file.rime> shows non-fatal authoring warnings
rime build <file.rime> compiles to validated Python
rime ir <file.rime> emits IR only
rime shell opens shell explicitly
rime version shows installed version
Optional environment variables:
RIME_API_BASE_URLfor any OpenAI-compatible endpoint
Syntax At A Glance
desc: "what this entity does"
types {
TypeName = struct(field: type, ...)
TypeName = enum(Variant1, Variant2, ...)
}
state {
field: type = default
}
contracts {
contract name(param: type) -> ReturnType {
desc: "what this contract does"
requires: ConditionName
raises: ErrorName
}
}
Rules that matter immediately:
- one entity per file
- the filename is the canonical entity name
descandtypeslive in the preambletypes {,state {, andcontracts {are explicit block openers- contract metadata lives inside
contract ... { ... }blocks requires:andraises:are symbolic names, not quoted strings
Full syntax reference: docs/rime-syntax.md
For practical authoring guidance, see guide.md.
Repository Layout
docs/ir-dsl.mddefines the current IR contractdocs/rime-syntax.mddefines the current Rime source surfaceguide.mdexplains how to write stronger Rime source and avoid common modeling mistakesexamples/Students.rimeis the canonical example inputsrc/rime/contains the CLI, prompt builders, validators, and pipeline orchestrationtests/covers the non-LLM seams with mocked model responses
VS Code Support
The extension in vscode-extension/ now provides:
.rimefile association- auto-inserted scaffold for new empty
.rimefiles - manual scaffold snippet for existing files
- syntax highlighting
- live editor diagnostics for high-signal authoring mistakes
- semantic warnings for command/query mismatch, missing sibling IDs, and nested relationship objects
Useful settings:
rime.fileScaffold.enabledrime.liveLint.enabledrime.liveLint.debounceMs
Install the .vsix locally or load the extension folder directly in VS Code.
Status
v0.1: working pipeline, intentionally small surface.
Included now:
- single-file
.rimeinput - grounded source parsing and structural validation
- OpenAI-compatible model integration
- textual IR DSL
- Python code generation
- IR and Python contract validation
- automatic corrective regeneration
- CLI entrypoints for full build and IR-only output
Deferred for later:
- multi-file composition
- imports and richer type semantics
- behavioral guarantees
Contributing
Issues and PRs are welcome. If you write a .rime file that breaks the pipeline or produces the wrong output, that is a bug worth filing.
Developer Journey
If you want to use Rime to build something, the workflow is as follows:
1. Installation & Environment Setup
First, install Rime and set up your environment variables for whatever LLM provider you want to use:
pip install rime-code
rime init
2. Creating the Shape
Let's say you want to build a simple Inventory system. Instead of opening a Python file and starting from scratch, you create an Inventory.rime file and define the "shape" of your system.
You write the types, the state you want to track, and the contracts (functions, what they require, and what errors they can throw):
desc: "A system to track store inventory, add stock, and purchase items."
types {
Item = struct(id: string, name: string, price: float, quantity: int)
}
state {
stock: list[Item] = []
}
contracts {
contract add_stock(item_id: string, name: string, price: float, quantity: int) -> Item {
desc: "Adds a new item to inventory or increases quantity if it exists"
raises: InvalidPrice
}
contract purchase(item_id: string, amount: int) -> Item {
desc: "Reduces inventory stock by amount for the given item"
raises: ItemNotFound, InsufficientStock
}
}
3. Linting (The Gut Check)
Instead of just guessing if you wrote it right, you can use Rime's CLI to check your work.
rime lint Inventory.rime
If you are using the VS Code extension, you won't even need to do this manually—you'll see diagnostics directly in the editor.
4. Let the Model Build It
Once the contract is clean, hand it over to Rime to compile it into an intermediate representation and generate the final Python code.
rime build Inventory.rime
5. Using the Output
Rime validates that the LLM didn't "hallucinate" anything outside of your defined bounds. Once rime build finishes successfully, you will have a newly minted Inventory.py file. You can immediately import that file into your core application and use the robust, error-checked logic exactly as you defined it.
# main.py
from Inventory import Inventory, InvalidPrice, InsufficientStock
store = Inventory()
store.add_stock("1", "Apple", 0.50, 100)
try:
store.purchase("1", 50)
except InsufficientStock:
print("Not enough stock!")
Rime is syntax-inspired by Python and C#, owned by neither.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rime_code-0.1.0.tar.gz.
File metadata
- Download URL: rime_code-0.1.0.tar.gz
- Upload date:
- Size: 37.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3610a29bdf50a15e76317e12e3eea518263ef032d83b039207df88580248b2de
|
|
| MD5 |
980b4f1e4dead85113c6a62b5f91f277
|
|
| BLAKE2b-256 |
bec1e30308ec031ef567f0bf32272780250d06af41025a53b977af5691f3289b
|
File details
Details for the file rime_code-0.1.0-py3-none-any.whl.
File metadata
- Download URL: rime_code-0.1.0-py3-none-any.whl
- Upload date:
- Size: 30.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d45408953ff2400f970d5ce221f186ff83f61cc3e4dc7daecfd5a78434483aa
|
|
| MD5 |
8aaba7d8cbdb9364dcfdd5cf01e70064
|
|
| BLAKE2b-256 |
216d3e4e01689b3bed52ff111e34e7cc1d5fefab2ff294830439c64835ab08ff
|