Dev.to AI πŸ€– Ai πŸ‘ 0 πŸ“– 4 min read

Unlocking Creative Potential: A Guide to Using LLMs in Arts

We are going to build an Artist Studio Assistant that turns scattered process notes into polished artist statements and generates concrete concepts for the next piece. It is built for painters, sculptors, and mixed-media

We are going to build an Artist Studio Assistant that turns scattered process notes into polished artist statements and generates concrete concepts for the next piece. It is built for painters, sculptors, and mixed-media artists who need to write about their work but would rather be in the studio. We will wire it to Oxlo.ai because its per-request pricing, detailed at https://oxlo.ai/pricing, means we can feed the model pages of raw notes and long reference texts without the cost scaling by the token.

What you'll need

Step 1: Configure the Oxlo.ai client

I start by pointing the OpenAI SDK at Oxlo.ai. I use Llama 3.3 70B as the backbone because it handles long, nuanced creative instructions without drifting.

from openai import OpenAI

client = OpenAI(base_url="https://api.oxlo.ai/v1", api_key="YOUR_OXLO_API_KEY")

Step 2: Define the studio assistant persona

Creative tasks fail if the model sounds like a chatbot. I lock the persona into a system prompt so every response feels like advice from a practicing art writer.

SYSTEM_PROMPT = """You are a studio assistant for a working visual artist. You have ten years of experience writing gallery statements, grant applications, and exhibition copy. You speak plainly, avoid clichΓ©s like 'journey' or 'passion', and you ground every suggestion in the artist's actual materials and process. When asked to critique, give exactly three concrete revisions, not praise. When generating concepts, suggest a title, a primary medium, and a one-paragraph description."""

Step 3: Draft the statement refiner

Artists usually have messy bullet points. This function takes raw notes and a target format, then returns a tight statement of a set word count.

def refine_statement(raw_notes: str, tone: str, max_words: int) -> str:
    user_message = (
        f"Rewrite the following raw notes into a {max_words}-word artist statement "
        f"for a {tone} context.\n\nRaw notes:\n{raw_notes}"
    )

    response = client.chat.completions.create(
        model="llama-3.3-70b",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": user_message},
        ],
    )
    return response.choices[0].message.content.strip()

Step 4: Build the conceptual prompt generator

Once the statement is clean, the assistant can propose the next artwork. This function feeds the statement back into the context and asks for a title, medium, and concept paragraph.

def generate_concept(artist_statement: str, preferred_medium: str) -> str:
    user_message = (
        f"Based on this artist statement, propose a new artwork.\n\n"
        f"Preferred medium: {preferred_medium}\n\n"
        f"Statement:\n{artist_statement}\n\n"
        f"Return a title, the exact medium, and a one-paragraph concept."
    )

    response = client.chat.completions.create(
        model="llama-3.3-70b",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": user_message},
        ],
    )
    return response.choices[0].message.content.strip()

Step 5: Add a critique loop

Real studios iterate. This function takes an existing draft and returns three specific edits, not empty encouragement.

def critique_statement(draft: str) -> str:
    user_message = (
        f"Critique the following artist statement. List exactly three concrete "
        f"revisions that would make it stronger. Do not offer praise.\n\nDraft:\n{draft}"
    )

    response = client.chat.completions.create(
        model="llama-3.3-70b",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": user_message},
        ],
    )
    return response.choices[0].message.content.strip()

Step 6: Chain the tools into a session

I tie the three tools together in a single script so the assistant can move from notes to finished statement to critique to new concept in one pass.

if __name__ == "__main__":
    raw = (
        "I work with discarded concrete and gold leaf. "
        "I am interested in cracks, repair, and the history of brutalist housing. "
        "I grew up in a tower block that was later demolished. "
        "I want people to see beauty in what is broken."
    )

    print("=== Refined Statement ===")
    statement = refine_statement(raw, tone="formal gallery", max_words=80)
    print(statement)

    print("\n=== Critique ===")
    notes = critique_statement(statement)
    print(notes)

    print("\n=== New Concept ===")
    concept = generate_concept(statement, preferred_medium="concrete and gold leaf")
    print(concept)

Run it

Running the script with the raw notes above produces the following. Your wording will vary, but the structure should stay consistent.

=== Refined Statement ===
My practice centers on the material residue of post-war brutalism. Using discarded concrete and gold leaf, I map the cracks of demolished tower blocks onto new forms. The work asks whether repair can be read as a form of memorial rather than concealment.

=== Critique ===
1. Replace "post-war brutalism" with the specific architectural movement or region to avoid a generic art-historical reference.
2. Clarify whether the gold leaf is applied into the cracks or sits on top; the physical process changes how the viewer reads repair.
3. The final sentence shifts into theory. Ground it in a specific action the viewer takes, such as walking around the piece or noticing scale.

=== New Concept ===
Title: "Capillary 7"
Medium: Cast concrete slab with inset gold leaf veins and a single polished face
Concept: A 120 cm floor panel cast from rubble sourced from the artist's childhood estate. Veins of gold leaf follow the original stress fractures, while one face is polished to a mirror finish so the viewer sees their own reflection inside the damage.

Because Oxlo.ai charges per request, running this entire four-call pipeline costs the same flat rate whether the raw notes are two sentences or two pages.

Next steps

Two directions to take this further.

  • Add vision support by uploading images of finished work to Oxlo.ai's vision endpoints, such as Kimi VL A3B or Gemma 3 27B, so the assistant can critique actual pieces instead of text descriptions.
  • Deploy the script as a lightweight Flask or FastAPI service and connect it to a simple web form in the studio, keeping the same Oxlo.ai backend and per-request pricing.
πŸ“° Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.