We are building a lightweight academic writing assistant that helps researchers outline, draft, and refine papers using structured multi-turn conversations. It runs entirely on Oxlo.ai and handles everything from thesis sharpening to citation formatting in a single Python script.
What you'll need
- Python 3.10 or newer
- An Oxlo.ai API key from https://portal.oxlo.ai
- The OpenAI SDK installed with
pip install openai
Step 1: Configure the Oxlo.ai client
First we instantiate the OpenAI-compatible client pointing at Oxlo.ai's endpoint and verify connectivity with a short test call.
from openai import OpenAI
client = OpenAI(base_url="https://api.oxlo.ai/v1", api_key="YOUR_OXLO_API_KEY")
response = client.chat.completions.create(
model="llama-3.3-70b",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Say 'Oxlo.ai client ready' and nothing else."},
],
)
print(response.choices[0].message.content)
Step 2: Define the system prompt
The system prompt constrains the model to act as a disciplined research editor, enforcing structure and citations rather than generic chat behavior.
SYSTEM_PROMPT = """You are an academic writing assistant. Your job is to help researchers produce clear, rigorous scholarly text.
Rules:
- Write in an academic tone. Avoid hype, slang, or filler.
- When asked to draft, produce structured output with sections: Thesis, Key Arguments, Evidence, and Suggested Citations.
- Do not fabricate sources. If you do not know a specific citation, say Citation needed and suggest search keywords.
- When revising, preserve the user's original meaning while improving clarity, flow, and precision.
- Use standard disciplinary terminology where appropriate."""
Step 3: Build the draft generator
This helper accepts a topic, paper section, and any notes, then returns a structured draft using Oxlo.ai's reasoning capabilities.
def generate_draft(topic, section, notes=""):
user_message = f"Topic: {topic}\nSection: {section}\nNotes: {notes}\n\nProduce a structured draft."
response = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_message},
],
)
return response.choices[0].message.content
# Example usage
draft = generate_draft(
topic="The impact of transformer architectures on low-resource language modeling",
section="Introduction",
notes="Mention attention mechanisms and recent multilingual benchmarks."
)
print(draft)
Step 4: Add iterative refinement
Academic writing requires tightening arguments, so we send the current draft back with specific revision instructions.
def revise_draft(draft, instruction):
user_message = (
f"Revise the following draft according to this instruction: {instruction}\n\n"
f"Draft:\n{draft}"
)
response = client.chat.completions.create(
model="deepseek-v3.2",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_message},
],
)
return response.choices[0].message.content
# Example: tighten the prose
revised = revise_draft(
draft,
"Shorten each argument to one sentence and strengthen the thesis statement."
)
print(revised)
Step 5: Assemble the CLI
We wire everything into a small script that prompts for a topic, generates an outline, expands it into a draft, and enters a revision loop until the user is satisfied.
def academic_writer():
topic = input("Enter research topic: ")
print("\n--- Generating outline ---")
outline = generate_draft(
topic,
"Outline",
notes="Provide a numbered outline with thesis and three main sections."
)
print(outline)
print("\n--- Generating introduction ---")
intro = generate_draft(topic, "Introduction", notes=outline)
print(intro)
current_draft = intro
while True:
instruction = input("\nRevision request (or 'done'): ")
if instruction.lower() == "done":
break
current_draft = revise_draft(current_draft, instruction)
print("\n--- Revised draft ---")
print(current_draft)
if __name__ == "__main__":
academic_writer()
Run it
Save the complete script as academic_writer.py, export your Oxlo.ai API key, and run python academic_writer.py. Below is a sample session.
$ python academic_writer.py
Enter research topic: Federated learning for clinical NLP in low-resource settings
--- Generating outline ---
1. Thesis: Federated learning enables clinical NLP model training without centralizing sensitive patient data, but low-resource languages remain underexplored.
2. Background on federated learning and privacy guarantees.
3. Challenges in low-resource clinical NLP.
4. Proposed evaluation framework and future directions.
--- Generating introduction ---
Thesis: Federated learning offers a privacy-preserving paradigm for training clinical NLP models across decentralized institutions, yet its application to low-resource languages remains insufficiently studied. Key arguments: [1] Centralized clinical datasets are siloed by regulation, limiting training scale. [2] Standard federated aggregation assumes data-rich clients, which fails for rare languages. [3] Evaluation benchmarks in clinical NLP predominantly cover high-resource languages. Suggested Citations: Citation needed (search: federated learning healthcare NLP survey 2024).
Revision request (or 'done'): Make the thesis more specific and mention differential privacy.
--- Revised draft ---
Thesis: Federated learning combined with formal differential privacy guarantees enables cross-institutional clinical NLP training, but current implementations rarely address the data scarcity and morphological complexity characteristic of low-resource languages. [Revised arguments follow...]
Next steps
You can extend this assistant by wiring it to a retrieval pipeline that injects real PDF excerpts into the context window, or switch to Oxlo.ai's Qwen 3 32B for multilingual drafts. Because Oxlo.ai uses request-based pricing rather than token-based metering, stuffing the context with long source material does not inflate your bill the way it would with conventional providers. See https://oxlo.ai/pricing for details.
Top comments (0)