We are building a weekly status report generator that turns fragmented Jira tickets and bullet points into readable engineering updates. This saves tech leads from writing prose by hand every Friday. We will wire it to Oxlo.ai so the cost stays flat even when we feed it long ticket threads.
What you'll need
- An Oxlo.ai API key from https://portal.oxlo.ai
- Python 3.10 or newer
- The OpenAI SDK:
pip install openai
Step 1: Configure the Oxlo.ai client
I start by creating an OpenAI-compatible client aimed at Oxlo.ai. I pull the key from an environment variable so I do not commit secrets.
from openai import OpenAI
import os
client = OpenAI(
base_url="https://api.oxlo.ai/v1",
api_key=os.environ.get("OXLO_API_KEY", "YOUR_OXLO_API_KEY")
)
Step 2: Write the system prompt
The system prompt locks the model into a role and output format. I keep it strict so the generated text feels like a human tech lead, not a chatbot.
SYSTEM_PROMPT = """You are a senior engineering lead writing a weekly status update.
Rules:
- Use plain English. No buzzwords.
- Group related items under bold headings.
- Highlight any blockers with the word BLOCKER in all caps.
- Keep the total length under 200 words.
- Do not use bullet points. Write in short paragraphs."""
Step 3: Prepare the raw data
Real ticket data is usually a mess. I write a small helper that turns a list of task dictionaries into a single string the model can read.
def format_tasks(tasks):
lines = []
for t in tasks:
status = t.get("status", "unknown")
title = t.get("title", "untitled")
blocker = " [BLOCKER]" if t.get("blocker") else ""
lines.append(f"- {title} ({status}){blocker}")
return "\n".join(lines)
raw_tasks = [
{"title": "Migrate auth service to OAuth2", "status": "in progress", "blocker": False},
{"title": "Fix memory leak in batch worker", "status": "done", "blocker": False},
{"title": "Update CI runners to Ubuntu 24.04", "status": "not started", "blocker": True},
]
user_message = format_tasks(raw_tasks)
Step 4: Generate the report
Now I send the formatted tasks to Llama 3.3 70B on Oxlo.ai. I use streaming so the text appears as it is generated, which is useful for longer reports.
response = client.chat.completions.create(
model="llama-3.3-70b",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_message},
],
stream=True,
temperature=0.4,
)
print("=== Weekly Status Report ===\n")
for chunk in response:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="")
print()
Run it
Running the script with the sample tasks produces output like this:
$ python report_generator.py
=== Weekly Status Report ===
This week the team shipped the fix for the memory leak in the batch worker. The auth service migration to OAuth2 is ongoing and on track.
Infrastructure remains a concern. The update to CI runners is blocked while we wait for security approval.
Next week we expect to finish the auth migration and start the runner update once the blocker clears.
Next steps
Wire the script to your actual issue tracker API so it pulls tickets automatically. You could also switch to the deepseek-v3.2 model on Oxlo.ai for more concise reasoning, or upgrade to kimi-k2.6 if you want the report to analyze code diffs inside the context window.
Because Oxlo.ai charges per request, not per token, you can stuff the prompt with full ticket descriptions and comment threads without watching input tokens drive up cost. See https://oxlo.ai/pricing for plan details.
Top comments (0)