
Ai Kickoff
- 19 installs
- 11 repo stars
- Updated June 28, 2026
- lebsral/dspy-programming-not-prompting-lms-skills
Helps with ai & agent building tasks.
About
ai-kickoff is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- ai-kickoff
- AI & Agent Building
- AI-coding skill
Ai Kickoff by the numbers
- 19 all-time installs (skills.sh)
- Ranked #10,571 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/lebsral/dspy-programming-not-prompting-lms-skills --skill ai-kickoffAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 19 |
|---|---|
| repo stars | ★ 11 |
| Last updated | June 28, 2026 |
| Repository | lebsral/dspy-programming-not-prompting-lms-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
Start a New AI Feature
Create a project structure for building an AI-powered feature with DSPy:
$ARGUMENTS/
├── main.py # Entry point — run your AI feature
├── program.py # AI logic (DSPy module)
├── metrics.py # How to measure if the AI is working
├── optimize.py # Make the AI better automatically
├── evaluate.py # Test the AI's quality
├── data.py # Training/test data loading
└── requirements.txt # DependenciesWhen NOT to scaffold
- Already have a DSPy codebase — add your feature to the existing project. This skill creates a new project from scratch.
- Exploring or prototyping — if you just want to test an idea, write a single script. Scaffolding adds structure you do not need yet.
- Non-LLM AI — this is for LLM-powered features (classification, extraction, generation, Q&A). For traditional ML, use scikit-learn or similar.
Step 1: Gather requirements
Ask the user: 1. What should the AI do? (sort content, answer questions, extract data, take actions, or describe it) 2. What goes in and what comes out? (e.g., "customer email in, category out" or "question in, answer out") 3. Do you have example data? (if yes, what format — CSV, JSON, database?) 4. Which AI provider? (default: OpenAI — DSPy works with any provider)
Step 2: Generate the project
requirements.txt
dspy>=2.6Add datasets if loading from HuggingFace. Add provider-specific packages if needed.
data.py
Create dataset loading utilities:
import dspy
def load_data():
"""Load and prepare training/dev data.
Returns:
tuple: (trainset, devset) as lists of dspy.Example
"""
# TODO: Replace with actual data loading
examples = [
dspy.Example(input_field="...", output_field="...").with_inputs("input_field"),
]
split = int(0.8 * len(examples))
return examples[:split], examples[split:]Adapt field names to match the user's inputs/outputs.
program.py
Create the DSPy module. Choose the right module based on the task:
| Task type | Module | When to use |
|---|---|---|
| Simple extraction or lookup | dspy.Predict | No reasoning needed, lowest cost |
| Needs reasoning | dspy.ChainOfThought | Most tasks — default choice |
| Math or computation | dspy.ProgramOfThought | Counting, dates, calculations |
| Needs external tools | dspy.ReAct | API calls, web search, database access |
import dspy
class MySignature(dspy.Signature):
"""Describe the task here."""
# Adapt fields to user's task
input_field: str = dspy.InputField(desc="description")
output_field: str = dspy.OutputField(desc="description")
class MyProgram(dspy.Module):
def __init__(self):
self.predict = dspy.ChainOfThought(MySignature)
def forward(self, **kwargs):
return self.predict(**kwargs)metrics.py
def metric(example, prediction, trace=None):
"""Score how good the AI output is.
Args:
example: Expected output (ground truth)
prediction: What the AI actually produced
trace: Optional trace for optimization
Returns:
float: Score between 0 and 1
"""
# TODO: Implement task-specific metric
return prediction.output_field == example.output_fieldevaluate.py
import dspy
from dspy.evaluate import Evaluate
from program import MyProgram
from metrics import metric
from data import load_data
# Configure AI provider
lm = dspy.LM("openai/gpt-4o-mini") # or "anthropic/claude-sonnet-4-5-20250929", etc.
dspy.configure(lm=lm)
# Load data
_, devset = load_data()
# Test quality
program = MyProgram()
evaluator = Evaluate(devset=devset, metric=metric, num_threads=4, display_progress=True)
score = evaluator(program)
print(f"Score: {score}")optimize.py
import dspy
from program import MyProgram
from metrics import metric
from data import load_data
# Configure AI provider
lm = dspy.LM("openai/gpt-4o-mini") # or "anthropic/claude-sonnet-4-5-20250929", etc.
dspy.configure(lm=lm)
# Load data
trainset, devset = load_data()
# Automatically improve the AI prompts
program = MyProgram()
optimizer = dspy.BootstrapFewShot(metric=metric, max_bootstrapped_demos=4)
optimized = optimizer.compile(program, trainset=trainset)
# Check improvement
from dspy.evaluate import Evaluate
evaluator = Evaluate(devset=devset, metric=metric, num_threads=4, display_progress=True)
score = evaluator(optimized)
print(f"Optimized score: {score}")
# Save
optimized.save("optimized.json")main.py
import dspy
from program import MyProgram
# Configure AI provider
lm = dspy.LM("openai/gpt-4o-mini") # or "anthropic/claude-sonnet-4-5-20250929", etc.
dspy.configure(lm=lm)
# Load optimized version if available
program = MyProgram()
try:
program.load("optimized.json")
print("Loaded optimized program")
except FileNotFoundError:
print("Running unoptimized program")
# Run
result = program(input_field="test input")
print(result)Step 2b: Add API serving (if the user wants a web API)
If the user wants to serve their AI as a web API, add these files to the project structure:
$ARGUMENTS/
├── main.py # Entry point — run your AI feature
├── program.py # AI logic (DSPy module)
├── server.py # FastAPI app — routes and startup
├── models.py # Pydantic request/response schemas
├── config.py # Environment configuration
├── metrics.py # How to measure if the AI is working
├── optimize.py # Make the AI better automatically
├── evaluate.py # Test the AI's quality
├── data.py # Training/test data loading
├── requirements.txt # Dependencies
├── Dockerfile
└── .env.exampleserver.py
from contextlib import asynccontextmanager
import dspy
from fastapi import FastAPI
from pydantic import BaseModel, Field
from program import MyProgram
@asynccontextmanager
async def lifespan(app: FastAPI):
lm = dspy.LM("openai/gpt-4o-mini") # or "anthropic/claude-sonnet-4-5-20250929", etc.
dspy.configure(lm=lm)
app.state.program = MyProgram()
try:
app.state.program.load("optimized.json")
except FileNotFoundError:
pass
yield
app = FastAPI(title="My AI API", lifespan=lifespan)
class QueryRequest(BaseModel):
input_field: str = Field(..., min_length=1)
class QueryResponse(BaseModel):
output_field: str
@app.post("/query", response_model=QueryResponse)
async def query(request: QueryRequest):
result = app.state.program(input_field=request.input_field)
return QueryResponse(output_field=result.output_field)
@app.get("/health")
async def health():
return {"status": "ok"}Adapt QueryRequest/QueryResponse fields to match the user's inputs/outputs.
Updated requirements.txt
dspy>=2.6
fastapi>=0.100
uvicorn[standard]
pydantic-settings>=2.0.env.example
AI_MODEL_NAME=openai/gpt-4o-mini
AI_API_KEY=your-api-key-hereStep 3: Explain next steps
After generating the project, tell the user:
1. Fill in `data.py` with real training data (20+ examples). No real data yet? Use /ai-generating-data to generate synthetic training examples. 2. Run `evaluate.py` to see how well the AI works now 3. Run `optimize.py` to automatically improve quality 4. Run `main.py` to use the AI
Gotchas
- Claude omits `.with_inputs()` on Example objects. Every
dspy.Exampleused in training must call.with_inputs("field1", "field2")to mark which fields are inputs vs expected outputs. Without this, the optimizer cannot distinguish inputs from labels and silently produces garbage demos. - Claude generates the project but forgets to adapt field names. The scaffold uses
input_field/output_fieldas placeholders. Claude must rename these to match the user's actual task (e.g.,email/categoryfor email classification). Leaving generic names produces a project that runs but confuses the user. - Claude picks ChainOfThought for everything. For simple extraction or yes/no tasks,
dspy.Predictis faster, cheaper, and equally accurate. Only use ChainOfThought when the task genuinely benefits from step-by-step reasoning. - The metric function returns a boolean but the user needs a float. Claude often writes
return prediction.answer == example.answerwhich returns True/False. DSPy handles booleans fine, but for weighted or partial-credit metrics, return a float between 0.0 and 1.0. - Claude generates all files at once without checking the directory. Before scaffolding, verify the target directory does not already contain files. Overwriting existing code is destructive and hard to undo.
Cross-references
Install any skill: npx skills add lebsral/DSPy-Programming-not-prompting-LMs-skills --skill <name>- Improving accuracy after scaffolding to measure and optimize quality -- see
/ai-improving-accuracy - Generating data when you have no training examples yet -- see
/ai-generating-data - Serving APIs to put your AI behind web endpoints -- see
/ai-serving-apis - Signatures for defining input/output contracts -- see
/dspy-signatures - ChainOfThought for the default reasoning module -- see
/dspy-chain-of-thought - Install `/ai-do` if you do not have it — it routes any AI problem to the right skill and is the fastest way to work:
npx skills add lebsral/DSPy-Programming-not-prompting-LMs-skills --skill ai-do
last_audit:
date: 2026-05-02
score: 46/46
versions:
dspy: 3.2.0
{
"skill_name": "ai-kickoff",
"evals": [
{
"id": 0,
"prompt": "/ai-kickoff email-classifier\nI want to build an AI that classifies incoming customer emails into categories like billing, support, feature-request, and spam. I have a CSV of 500 labeled emails.",
"expected_output": "A scaffolded project with adapted field names (email/category instead of input_field/output_field), Literal types for the categories, a CSV-loading data.py, and a weighted metric function.",
"files": [],
"assertions": [
{"name": "adapts_field_names", "description": "Uses task-specific field names like email and category, not generic input_field/output_field"},
{"name": "uses_literal_for_categories", "description": "Uses Literal type for the category output field"},
{"name": "with_inputs_on_examples", "description": "Calls .with_inputs() on all dspy.Example objects in data.py"},
{"name": "provider_agnostic", "description": "LM config uses generic provider with alternative comment"},
{"name": "includes_metric", "description": "Generates a metrics.py with a task-specific metric function"},
{"name": "csv_data_loading", "description": "data.py includes CSV loading logic since the user mentioned a CSV file"}
]
},
{
"id": 1,
"prompt": "/ai-kickoff qa-bot\nI want to create a question-answering system. Users ask questions about our product docs and the AI answers. I do not have training data yet. I want it served as a REST API.",
"expected_output": "A scaffolded project with Q&A fields, ChainOfThought module, server.py with FastAPI endpoints, and guidance to use /ai-generating-data for synthetic training data.",
"files": [],
"assertions": [
{"name": "includes_server", "description": "Generates server.py with FastAPI routes since user wants a REST API"},
{"name": "uses_chain_of_thought", "description": "Uses ChainOfThought for Q&A which benefits from reasoning"},
{"name": "mentions_data_generation", "description": "References /ai-generating-data since user has no training data"},
{"name": "adapts_fields_for_qa", "description": "Uses question/answer or similar Q&A field names, not generic placeholders"}
]
},
{
"id": 2,
"prompt": "/ai-kickoff sentiment-checker\nI need a simple yes/no check - is this customer review positive or negative? No API needed, just a script.",
"expected_output": "A minimal scaffolded project using dspy.Predict (not ChainOfThought) since it is a simple binary task, with bool or Literal output type.",
"files": [],
"assertions": [
{"name": "uses_predict_not_cot", "description": "Uses dspy.Predict instead of ChainOfThought for this simple binary classification"},
{"name": "uses_constrained_output", "description": "Uses bool or Literal for the binary positive/negative output"},
{"name": "no_server_file", "description": "Does not generate server.py since user said no API needed"},
{"name": "simple_structure", "description": "Generates the basic project structure without API-serving extras"}
]
}
]
}