craftpilot / agents /cataloger.py
skamathramesh's picture
CraftPilot: multi-agent craft business assistant
98a986c verified
Raw
History Blame Contribute Delete
1.71 kB
"""Cataloger agent: analyzes craft items and produces structured metadata."""
from jinja2 import Template
from agents.llm import LLMClient
from agents.models import AgentTrace, CatalogerOutput
SYSTEM_PROMPT = (
"You are a craft catalog expert. Analyze handmade craft items and "
"produce structured catalog entries.\n\n"
"You understand materials, techniques, and categories for: crochet, "
"painting, embroidery, sewing, stitching, and other handmade crafts.\n\n"
"Always respond with valid JSON."
)
USER_TEMPLATE = Template(
"Analyze this {{ craft_type }} item and create a catalog entry.\n\n"
"Image description: {{ image_description }}\n"
"{% if user_notes %}Creator's notes: {{ user_notes }}{% endif %}\n\n"
"Categorize it with: category (e.g., 'home decor', 'fashion accessory', "
"'wall art'), sub_category (e.g., 'coaster', 'scarf', 'portrait'), "
"materials used, colors, estimated size, relevant tags for "
"searchability, and complexity level (simple/moderate/complex)."
)
async def run(
llm: LLMClient,
image_description: str,
craft_type: str,
user_notes: str | None = None,
) -> tuple[CatalogerOutput, AgentTrace]:
prompt = USER_TEMPLATE.render(
craft_type=craft_type,
image_description=image_description,
user_notes=user_notes,
)
result, duration_ms = await llm.agenerate(
system=SYSTEM_PROMPT,
prompt=prompt,
output_schema=CatalogerOutput,
)
trace = AgentTrace(
agent_name="cataloger",
input_text=prompt,
output_data=result.model_dump(),
duration_ms=duration_ms,
model_id=llm.model_id,
)
return result, trace