demo_agent / agent /code_generator.py
Emmanuel Acheampong
changes to the model names
9a2497f
"""
Stage 2 — Code Generator
Model: Kimi-K2 (long-context, excels at code generation)
Input: structured intent dict
Output: complete single-file Streamlit app as a string
"""
import re
from openai import OpenAI
from config import CRUSOE_API_KEY, CRUSOE_BASE_URL, CODEGEN_MODEL
from templates import get_template
client = OpenAI(api_key=CRUSOE_API_KEY, base_url=CRUSOE_BASE_URL)
SYSTEM_PROMPT = """You are an expert Streamlit developer creating polished AI demos.
You will be given a base template and a structured intent. Your job is to:
1. Fill in the template placeholders accurately
2. Add any extra UI polish or features mentioned in the intent
3. Keep the code as a single self-contained Python file
4. Ensure the openai client uses env vars for CRUSOE_API_KEY and CRUSOE_BASE_URL
Rules:
- Output ONLY valid Python code
- No markdown fences, no explanations
- All string placeholders ({title}, {description}, etc.) must be replaced
- Do not change the streaming pattern or client setup
- Available Crusoe models: deepseek-ai/DeepSeek-R1, moonshotai/Kimi-K2-Instruct, Qwen/Qwen3-235B-A22B"""
def generate_code(intent: dict) -> str:
template = get_template(intent.get("template_type", "chatbot"))
# Build the pre-filled template by substituting known values
try:
prefilled = _fill_template(template, intent)
except KeyError:
prefilled = template # fall back to raw template
user_message = f"""Fill in this Streamlit app template using the intent below.
INTENT:
- Title: {intent.get('title')}
- Description: {intent.get('description')}
- Template type: {intent.get('template_type')}
- Model: {intent.get('model')}
- System prompt: {intent.get('system_prompt')}
- Features: {', '.join(intent.get('features', []))}
- Chat placeholder: {intent.get('chat_placeholder', '')}
- Input label: {intent.get('input_label', '')}
- Input placeholder: {intent.get('input_placeholder', '')}
- Model A: {intent.get('model_a', '')} ({intent.get('model_a_label', '')})
- Model B: {intent.get('model_b', '')} ({intent.get('model_b_label', '')})
- Steps: {intent.get('steps', [])}
TEMPLATE (replace all {{placeholders}} and improve where noted):
{prefilled}"""
response = client.chat.completions.create(
model=CODEGEN_MODEL,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_message},
],
temperature=0.2,
max_tokens=4096,
)
raw = response.choices[0].message.content or ""
return _extract_code(raw)
def _fill_template(template: str, intent: dict) -> str:
"""Best-effort template fill — remaining {placeholders} are sent to the LLM."""
steps_repr = repr(intent.get("steps", []))
return template.format(
title=_esc(intent.get("title", "AI Demo")),
description=_esc(intent.get("description", "Powered by Crusoe")),
system_prompt=_esc(intent.get("system_prompt", "You are a helpful assistant."), multiline=True),
model=intent.get("model", "Qwen/Qwen3-235B-A22B"),
chat_placeholder=_esc(intent.get("chat_placeholder", "Ask me anything...")),
input_label=_esc(intent.get("input_label", "Enter input:")),
input_placeholder=_esc(intent.get("input_placeholder", "Type here...")),
model_a=intent.get("model_a", "deepseek-ai/DeepSeek-R1"),
model_a_label=_esc(intent.get("model_a_label", "Model A")),
model_b=intent.get("model_b", "moonshotai/Kimi-K2-Instruct"),
model_b_label=_esc(intent.get("model_b_label", "Model B")),
steps=steps_repr,
)
def _esc(s: str, multiline: bool = False) -> str:
"""
Sanitise a value for safe embedding in a Python string literal.
Single-line literals (e.g. TITLE = "{title}"):
- escape backslashes, double-quotes, collapse newlines to a space
Multiline / triple-quoted literals (e.g. SYSTEM_PROMPT = \"\"\"{system_prompt}\"\"\"):
- only escape triple-quote sequences
"""
s = str(s)
if multiline:
return s.replace('"""', "'''")
# Single-line: make the value safe inside "..."
s = s.replace("\\", "\\\\") # backslashes first
s = s.replace('"', '\\"') # double-quotes
s = s.replace("\n", " ").replace("\r", "") # no literal newlines
return s
def _extract_code(raw: str) -> str:
"""Strip markdown fences if the model wrapped the output."""
fenced = re.search(r"```(?:python)?\n(.*?)```", raw, re.DOTALL)
if fenced:
return fenced.group(1).strip()
return raw.strip()