https://github.com/sealambda/unit-text
Unit tests for plain text - LLM as a copy editor
https://github.com/sealambda/unit-text
agentic-ai ai blog llm ollama unit-testing
Last synced: 14 days ago
JSON representation
Unit tests for plain text - LLM as a copy editor
- Host: GitHub
- URL: https://github.com/sealambda/unit-text
- Owner: sealambda
- License: agpl-3.0
- Created: 2025-02-19T13:46:45.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2025-03-11T14:21:59.000Z (about 2 months ago)
- Last Synced: 2025-03-25T14:44:35.300Z (about 1 month ago)
- Topics: agentic-ai, ai, blog, llm, ollama, unit-testing
- Language: Python
- Homepage: https://sealambda.com/products/unit-text/
- Size: 2.5 MB
- Stars: 34
- Watchers: 2
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
unit-text
Unit tests for plain text

---
Don't let LLMs write blog posts for you. Do your research, bring your own voice,
and use LLMs to criticise and iterate on your writing.## 🤌 Why unit-text?
If you're a developer like us:
- You're probably aware you should write more (either because your leadership asks for it,
or because you'd like to be invited as a conference speaker, or ...)
- You don't know what to write about.
- You have considered letting ChatGPT write blog posts for you.If you tried the last option (or read anything on the Internet in the past 2 years)
you would also know why it's not really that good of an idea.Sure, you may get a perfectly good post, but it won't be your own.
`unit-text` applies the concept of unit tests to prose. You are the one writing, the LLM is just your critic.
First, you define a goal, the audience you have in mind,
and what you wanted them to do differently after they read your post.
Then, you start writing and iterating on your draft. `unit-text` gives you feedback: you run _tests_
to validate whether your draft is going in the right direction.An AI copy editor, you could say.
## ⚙️ Installation
[We recommend](https://sealambda.com/blog/hygienic-python-in-2025) [uv](https://github.com/astral-sh/uv) to run the CLI.
```bash
# to run the CLI straight away
uvx unit-text --help# or if you prefer to install it
uv tool install unit-text
```You may of course also use `pip` to install the CLI - or `pipx` if you prefer to install it in an isolated environment.
```bash
pipx install unit-text# ...or if you like to live on the edge
pip install unit-text
```## 🔨 Usage
### Requirements
Either:
- [Ollama](https://ollama.com) must be running locally;
- `OLLAMA_HOST` should point to an Ollama server.```bash
# To generate a blog idea
unit-text ideate# To validate the working draft
unit-text test
```### API
The package also provides a FastAPI server for programmatic access:
```bash
# Start the development server
uv run fastapi dev ./src/unit_text/api# Start the production server
uv run fastapi run ./src/unit_text/api# or for convenience
uv run unit-text-api
```The server exposes a `/test` endpoint that accepts POST requests with two files:
- `file`: Your draft text file
- `config`: Your idea configuration JSON fileExample using curl:
```bash
curl -X POST http://localhost:8000/test \
-F "[email protected]" \
-F "[email protected]"
```## 📝 Process
The ideation phase is where you define your blog idea. It looks something like this:

Your idea is now stored in a `unit-text.json` file, in the current directory.
You may run `unit-text ideate` again at any time to finetune it.
Now you can start writing, let's say you're writing in a file called `draft.md`.
At any time, you can run `unit-text test draft.md` to validate it.
Initially, it may look something like this:
Keep iterating on your draft, based on feedback from `unit-text`, until it passes all tests:

## 💻 Contributing
If you want to contribute to the project, please read the [CONTRIBUTING.md](./CONTRIBUTING.md) file.
It contains information on how to set up your development environment, submit issues, and create pull requests.
## 📜 License
This project is licensed under the AGPLv3 License. See the [LICENSE](LICENSE) file for details.