> guidance
You are an expert in Guidance, Microsoft's library for controlling LLM output with constrained generation. You help developers write programs that interleave text generation with control flow (loops, conditionals, regex constraints, JSON schemas, function calls) — ensuring LLM output always matches the expected format by constraining the token generation process itself, not just prompting.
curl "https://skillshub.wtf/TerminalSkills/skills/guidance?format=md"Guidance — Constrained LLM Generation
You are an expert in Guidance, Microsoft's library for controlling LLM output with constrained generation. You help developers write programs that interleave text generation with control flow (loops, conditionals, regex constraints, JSON schemas, function calls) — ensuring LLM output always matches the expected format by constraining the token generation process itself, not just prompting.
Core Capabilities
Constrained Generation
import guidance
from guidance import models, gen, select, regex, one_or_more, zero_or_more
# Load model (local or API)
lm = models.OpenAI("gpt-4o")
# Or local: models.Transformers("meta-llama/Llama-3.1-8B-Instruct")
# Simple constrained generation
lm += f"""
Classify this review sentiment.
Review: "The product arrived damaged but customer service was great"
Sentiment: {select(["positive", "negative", "mixed", "neutral"], name="sentiment")}
Confidence: {gen(regex=r"0\.\d{2}", name="confidence")}
"""
print(lm["sentiment"]) # "mixed" — constrained to exactly these options
print(lm["confidence"]) # "0.82" — matches regex pattern exactly
# Structured extraction with loops
lm += f"""Extract all people mentioned:
Text: "Alice met Bob at the cafe. Charlie joined them later."
People:
{one_or_more(f'''
- Name: {gen(regex=r"[A-Z][a-z]+", name="names", list_append=True)}
''')}
"""
print(lm["names"]) # ["Alice", "Bob", "Charlie"]
JSON Generation
# Guaranteed valid JSON output
from guidance import json as gen_json
from pydantic import BaseModel
class ProductReview(BaseModel):
product_name: str
rating: int # Constrained to int
pros: list[str]
cons: list[str]
recommendation: bool
lm += f"""Analyze this review and extract structured data:
Review: "The XPS 15 has an amazing display and battery life, but runs hot under load. Would buy again."
{gen_json(schema=ProductReview, name="review")}
"""
review = lm["review"]
# {"product_name": "XPS 15", "rating": 4, "pros": ["amazing display", "battery life"],
# "cons": ["runs hot under load"], "recommendation": true}
# GUARANTEED valid JSON matching the Pydantic schema
Control Flow
# Branching based on LLM output
lm += f"""
Task: {user_input}
First, determine the task type: {select(["question", "command", "chitchat"], name="task_type")}
"""
if lm["task_type"] == "question":
lm += f"""
Answer the question with evidence:
Answer: {gen(max_tokens=200, name="answer")}
Sources: {gen(regex=r"https?://\S+", name="source")}
"""
elif lm["task_type"] == "command":
lm += f"""
Generate the command:
```bash
{gen(stop="```", name="command")}
Explanation: {gen(max_tokens=100, name="explanation")} """ else: lm += f"Response: {gen(max_tokens=50, name="response")}"
Multi-step reasoning
lm += f""" Problem: {math_problem}
Let me solve this step by step: {one_or_more(f''' Step {gen(regex=r"\d+", name="step_num")}: {gen(stop="\n", name="steps", list_append=True)} ''')}
Final answer: {gen(regex=r"-?\d+.?\d*", name="answer")} """
## Installation
```bash
pip install guidance
Best Practices
- Select for classification — Use
select()instead of free-form text; LLM can only output valid options - Regex for format — Use
regex=for dates, numbers, IDs; output always matches the pattern - JSON schema — Use
gen_json(schema=...)for structured data; impossible to generate invalid JSON - Local models — Guidance works best with local models (full token control); API models use prompt-based constraints
- Control flow — Mix Python logic with generation; branch on LLM output, loop for extraction
- Named captures — Use
name=parameter to capture generated values; access withlm["name"] - Stop tokens — Use
stop=to control generation boundaries; prevent runaway output - List extraction — Use
one_or_more()withlist_append=Truefor extracting variable-length lists
> related_skills --same-repo
> zustand
You are an expert in Zustand, the small, fast, and scalable state management library for React. You help developers manage global state without boilerplate using Zustand's hook-based stores, selectors for performance, middleware (persist, devtools, immer), computed values, and async actions — replacing Redux complexity with a simple, un-opinionated API in under 1KB.
> zod
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
> xero-accounting
Integrate with the Xero accounting API to sync invoices, expenses, bank transactions, and contacts — and generate financial reports like P&L and balance sheet. Use when: connecting apps to Xero, automating bookkeeping workflows, syncing accounting data, or pulling financial reports programmatically.
> windsurf-rules
Configure Windsurf AI coding assistant with .windsurfrules and workspace rules. Use when: customizing Windsurf for a project, setting AI coding standards, creating team-shared Windsurf configurations, or tuning Cascade AI behavior.