Skip to main content
Turn rough bullet points into polished professional emails. Control tone, adjust formality, generate in multiple languages.

Basic email generation

from runcrate import Runcrate

client = Runcrate(api_key="rc_live_YOUR_API_KEY")
response = client.models.chat_completion(
    model="deepseek-ai/DeepSeek-V3",
    messages=[
        {"role": "system", "content": "Write professional emails from bullet points. Output only the email."},
        {"role": "user", "content": "Write a formal email:\n- Thanks for Tuesday meeting\n- Interested in partnership proposal\n- Need to review pricing with finance\n- Schedule follow-up next week?\n- Recipient: Sarah Chen, VP Partnerships, Acme Corp"}
    ],
)
print(response.choices[0].message.content)

Tone control

from runcrate import Runcrate
client = Runcrate(api_key="rc_live_YOUR_API_KEY")

tones = {
    "formal": "Formal business emails. Professional language, proper salutations.",
    "friendly": "Warm, friendly emails. Conversational but professional.",
    "direct": "Concise, direct emails. No filler.",
    "apologetic": "Sincere apology emails. Acknowledge issue, take responsibility.",
}

response = client.models.chat_completion(
    model="deepseek-ai/DeepSeek-V3",
    messages=[
        {"role": "system", "content": tones["direct"] + " Output only the email."},
        {"role": "user", "content": "Write an email:\n- Deadline moving Friday → next Wednesday\n- Waiting on vendor API credentials\n- No impact on launch date\n- Team should continue other tasks"}
    ],
)
print(response.choices[0].message.content)

Multi-language

points = "- Confirming signed contract\n- Onboarding begins Monday\n- Send requirements by Friday"
for lang in ["English", "Japanese", "German", "Spanish"]:
    response = client.models.chat_completion(
        model="deepseek-ai/DeepSeek-V3",
        messages=[
            {"role": "system", "content": f"Write professional emails in {lang}. Output only the email."},
            {"role": "user", "content": f"Formal email from these points:\n{points}"}
        ],
    )
    print(f"\n--- {lang} ---\n{response.choices[0].message.content}")

Next.js API route

// app/api/write-email/route.ts
import { runcrate } from '@runcrate/ai';
import { generateText } from 'ai';

const TONES: Record<string, string> = {
  formal: 'Formal business emails.', friendly: 'Warm, friendly emails.', direct: 'Concise. No filler.',
};

export async function POST(req: Request) {
  const { bulletPoints, tone = 'formal', language = 'English' } = await req.json();
  const { text } = await generateText({
    model: runcrate('deepseek-ai/DeepSeek-V3'),
    messages: [
      { role: 'system', content: `${TONES[tone] || TONES.formal} Write in ${language}. Output only the email.` },
      { role: 'user', content: `Write an email:\n${bulletPoints}` },
    ],
  });
  return Response.json({ email: text });
}

Tips

  • Bullet points over paragraphs. Clear bullets give better results than prose input.
  • One tone per system prompt. Change the system prompt to switch tones.
  • CJK languages. Consider Qwen3 models for more natural CJK output.