{"id":"69aae3da-b0f5-4229-aa19-1015116d5de7","shortId":"XnqdAn","kind":"skill","title":"dspy-signature-designer","tagline":"This skill should be used when the user asks to \"create a DSPy signature\", \"define inputs and outputs\", \"design a signature\", \"use InputField or OutputField\", \"add type hints to DSPy\", mentions \"signature class\", \"type-safe DSPy\", \"Pydantic models in DSPy\", or needs to define wha","description":"# DSPy Signature Designer\n\n## Goal\n\nDesign clear, type-safe signatures that define what your DSPy modules should do.\n\n## When to Use\n\n- Defining new DSPy modules\n- Need structured/validated outputs\n- Complex input/output relationships\n- Multi-field responses\n\n## Inputs\n\n| Input | Type | Description |\n|-------|------|-------------|\n| `task_description` | `str` | What the module should do |\n| `input_fields` | `list` | Required inputs |\n| `output_fields` | `list` | Expected outputs |\n| `type_constraints` | `dict` | Type hints for fields |\n\n## Outputs\n\n| Output | Type | Description |\n|--------|------|-------------|\n| `signature` | `dspy.Signature` | Type-safe signature class |\n\n## Workflow\n\n### Inline Signatures (Simple)\n\n```python\nimport dspy\n\n# Basic\nqa = dspy.Predict(\"question -> answer\")\n\n# With types\nclassify = dspy.Predict(\"sentence -> sentiment: bool\")\n\n# Multiple fields\nrag = dspy.ChainOfThought(\"context: list[str], question: str -> answer: str\")\n```\n\n### Class-based Signatures (Complex)\n\n```python\nfrom typing import Literal, Optional\nimport dspy\n\nclass EmotionClassifier(dspy.Signature):\n    \"\"\"Classify the emotion expressed in the text.\"\"\"\n    \n    text: str = dspy.InputField(desc=\"The text to analyze\")\n    emotion: Literal['joy', 'sadness', 'anger', 'fear', 'surprise'] = dspy.OutputField()\n    confidence: float = dspy.OutputField(desc=\"Confidence score 0-1\")\n```\n\n## Type Hints Reference\n\n```python\nfrom typing import Literal, Optional, List\nfrom pydantic import BaseModel\n\n# Basic types\nfield: str = dspy.InputField()\nfield: int = dspy.OutputField()\nfield: float = dspy.OutputField()\nfield: bool = dspy.OutputField()\n\n# Collections\nfield: list[str] = dspy.InputField()\nfield: List[int] = dspy.OutputField()\n\n# Optional\nfield: Optional[str] = dspy.OutputField()\n\n# Constrained\nfield: Literal['a', 'b', 'c'] = dspy.OutputField()\n\n# Pydantic models\nclass Person(BaseModel):\n    name: str\n    age: int\n\nfield: Person = dspy.OutputField()\n```\n\n## Production Examples\n\n### Summarization\n\n```python\nclass Summarize(dspy.Signature):\n    \"\"\"Summarize the document into key points.\"\"\"\n    \n    document: str = dspy.InputField(desc=\"Full document text\")\n    max_points: int = dspy.InputField(desc=\"Maximum bullet points\", default=5)\n    \n    summary: list[str] = dspy.OutputField(desc=\"Key points as bullet list\")\n    word_count: int = dspy.OutputField(desc=\"Total words in summary\")\n```\n\n### Entity Extraction\n\n```python\nfrom pydantic import BaseModel\nfrom typing import List\n\nclass Entity(BaseModel):\n    text: str\n    type: str\n    start: int\n    end: int\n\nclass ExtractEntities(dspy.Signature):\n    \"\"\"Extract named entities from text.\"\"\"\n    \n    text: str = dspy.InputField()\n    entity_types: list[str] = dspy.InputField(\n        desc=\"Types to extract: PERSON, ORG, LOC, DATE\",\n        default=[\"PERSON\", \"ORG\", \"LOC\"]\n    )\n    \n    entities: List[Entity] = dspy.OutputField()\n```\n\n### Multi-Label Classification\n\n```python\nclass MultiLabelClassify(dspy.Signature):\n    \"\"\"Classify text into multiple categories.\"\"\"\n    \n    text: str = dspy.InputField()\n    \n    categories: list[str] = dspy.OutputField(\n        desc=\"Applicable categories from: tech, business, sports, entertainment\"\n    )\n    primary_category: str = dspy.OutputField(desc=\"Most relevant category\")\n    reasoning: str = dspy.OutputField(desc=\"Explanation for classification\")\n```\n\n### RAG with Confidence\n\n```python\nclass GroundedAnswer(dspy.Signature):\n    \"\"\"Answer questions using retrieved context with confidence.\"\"\"\n    \n    context: list[str] = dspy.InputField(desc=\"Retrieved passages\")\n    question: str = dspy.InputField()\n    \n    answer: str = dspy.OutputField(desc=\"Factual answer from context\")\n    confidence: Literal['high', 'medium', 'low'] = dspy.OutputField(\n        desc=\"Confidence based on context support\"\n    )\n    source_passage: int = dspy.OutputField(\n        desc=\"Index of most relevant passage (0-based)\"\n    )\n```\n\n### Complete Module with Signature\n\n```python\nimport dspy\nfrom typing import Literal, Optional\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass AnalyzeSentiment(dspy.Signature):\n    \"\"\"Analyze sentiment with detailed breakdown.\"\"\"\n    \n    text: str = dspy.InputField(desc=\"Text to analyze\")\n    \n    sentiment: Literal['positive', 'negative', 'neutral', 'mixed'] = dspy.OutputField()\n    score: float = dspy.OutputField(desc=\"Sentiment score from -1 to 1\")\n    aspects: list[str] = dspy.OutputField(desc=\"Key aspects mentioned\")\n    reasoning: str = dspy.OutputField(desc=\"Explanation of sentiment\")\n\nclass SentimentAnalyzer(dspy.Module):\n    def __init__(self):\n        self.analyze = dspy.ChainOfThought(AnalyzeSentiment)\n    \n    def forward(self, text: str):\n        try:\n            result = self.analyze(text=text)\n            \n            # Validate score range\n            if hasattr(result, 'score'):\n                result.score = max(-1, min(1, float(result.score)))\n            \n            return result\n            \n        except Exception as e:\n            logger.error(f\"Analysis failed: {e}\")\n            return dspy.Prediction(\n                sentiment='neutral',\n                score=0.0,\n                aspects=[],\n                reasoning=\"Analysis failed\"\n            )\n\n# Usage\nanalyzer = SentimentAnalyzer()\nresult = analyzer(text=\"The product quality is great but shipping was slow.\")\nprint(f\"Sentiment: {result.sentiment} ({result.score})\")\nprint(f\"Aspects: {result.aspects}\")\n```\n\n## Best Practices\n\n1. **Descriptive docstrings** - The class docstring becomes the task instruction\n2. **Field descriptions** - Guide the model with `desc` parameter\n3. **Constrain outputs** - Use `Literal` for categorical outputs\n4. **Default values** - Provide sensible defaults for optional inputs\n5. **Validate types** - Pydantic models ensure structured output\n\n## Advanced Field Options\n\n```python\n# Constraints (available in 3.1.2+)\nclass ConstrainedSignature(dspy.Signature):\n    \"\"\"Example with validation constraints.\"\"\"\n\n    text: str = dspy.InputField(\n        min_length=5,\n        max_length=100,\n        desc=\"Input text between 5-100 chars\"\n    )\n    number: int = dspy.InputField(\n        gt=0,\n        lt=10,\n        desc=\"Number between 0 and 10\"\n    )\n    score: float = dspy.OutputField(\n        ge=0.0,\n        le=1.0,\n        desc=\"Score between 0 and 1\"\n    )\n    count: int = dspy.OutputField(\n        multiple_of=2,\n        desc=\"Even number count\"\n    )\n\n# Prefix and format\nclass FormattedSignature(dspy.Signature):\n    \"\"\"Example with custom prefix and format.\"\"\"\n\n    goal: str = dspy.InputField(prefix=\"Goal:\")\n    text: str = dspy.InputField(format=lambda x: x.upper())\n    action: str = dspy.OutputField(prefix=\"Action:\")\n```\n\n## Limitations\n\n- Complex nested types require Pydantic models\n- Some LLMs struggle with strict type constraints\n- Field descriptions and constraints add to prompt length\n- Default values only work for InputField, not OutputField\n\n## Official Documentation\n\n- **DSPy Documentation**: https://dspy.ai/\n- **DSPy GitHub**: https://github.com/stanfordnlp/dspy\n- **Signatures API**: https://dspy.ai/api/signatures/\n- **Signatures Guide**: https://dspy.ai/learn/programming/signatures/","tags":["dspy","signature","designer","skills","omidzamani","agent-skills","claude-code","claude-skills","llm","prompt-optimization","rag"],"capabilities":["skill","source-omidzamani","skill-dspy-signature-designer","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-dspy","topic-llm","topic-prompt-optimization","topic-rag"],"categories":["dspy-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/OmidZamani/dspy-skills/dspy-signature-designer","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add OmidZamani/dspy-skills","source_repo":"https://github.com/OmidZamani/dspy-skills","install_from":"skills.sh"}},"qualityScore":"0.487","qualityRationale":"deterministic score 0.49 from registry signals: · indexed on github topic:agent-skills · 74 github stars · SKILL.md body (7,207 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T06:55:44.864Z","embedding":null,"createdAt":"2026-04-18T22:14:18.041Z","updatedAt":"2026-05-02T06:55:44.864Z","lastSeenAt":"2026-05-02T06:55:44.864Z","tsv":"'-1':202,512,558 '-100':683 '/api/signatures/':794 '/learn/programming/signatures/':799 '/stanfordnlp/dspy':789 '0':201,464,689,695,708 '0.0':579,702 '1':514,560,610,710 '1.0':704 '10':691,697 '100':677 '2':620,716 '3':629 '3.1.2':661 '4':637 '5':293,646,674,682 'action':745,749 'add':30,768 'advanc':654 'age':259 'analysi':571,582 'analyz':186,486,497,585,588 'analyzesenti':484,538 'anger':191 'answer':137,154,417,434,439 'api':791 'applic':388 'ask':13 'aspect':515,521,580,606 'avail':659 'b':249 'base':158,450,465 'basemodel':216,256,319,326 'basic':133,217 'becom':616 'best':608 'bool':144,229 'breakdown':490 'bullet':290,302 'busi':392 'c':250 'categor':635 'categori':379,383,389,396,402 'char':684 'class':37,125,157,169,254,268,324,335,372,414,483,530,614,662,724 'class-bas':156 'classif':370,409 'classifi':140,172,375 'clear':56 'collect':231 'complet':466 'complex':79,160,751 'confid':195,199,412,423,442,449 'constrain':245,630 'constrainedsignatur':663 'constraint':109,658,668,763,767 'context':149,421,424,441,452 'count':305,711,720 'creat':15 'custom':729 'date':358 'def':533,539 'default':292,359,638,642,772 'defin':19,49,62,72 'desc':182,198,280,288,298,308,351,387,399,406,428,437,448,458,494,508,519,526,627,678,692,705,717 'descript':89,91,118,611,622,765 'design':4,23,53,55 'detail':489 'dict':110 'docstr':612,615 'document':273,277,282,781,783 'dspi':2,17,34,41,45,51,65,74,132,168,472,782,785 'dspy-signature-design':1 'dspy.ai':784,793,798 'dspy.ai/api/signatures/':792 'dspy.ai/learn/programming/signatures/':797 'dspy.chainofthought':148,537 'dspy.inputfield':181,221,235,279,287,345,350,382,427,433,493,671,687,735,740 'dspy.module':532 'dspy.outputfield':194,197,224,227,230,239,244,251,263,297,307,366,386,398,405,436,447,457,504,507,518,525,700,713,747 'dspy.predict':135,141 'dspy.prediction':575 'dspy.signature':120,171,270,337,374,416,485,664,726 'e':568,573 'emot':174,187 'emotionclassifi':170 'end':333 'ensur':651 'entertain':394 'entiti':313,325,340,346,363,365 'even':718 'exampl':265,665,727 'except':565,566 'expect':106 'explan':407,527 'express':175 'extract':314,338,354 'extractent':336 'f':570,600,605 'factual':438 'fail':572,583 'fear':192 'field':84,99,104,114,146,219,222,225,228,232,236,241,246,261,621,655,764 'float':196,226,506,561,699 'format':723,732,741 'formattedsignatur':725 'forward':540 'full':281 'ge':701 'github':786 'github.com':788 'github.com/stanfordnlp/dspy':787 'goal':54,733,737 'great':594 'groundedansw':415 'gt':688 'guid':623,796 'hasattr':553 'high':444 'hint':32,112,204 'import':131,164,167,209,215,318,322,471,475,478 'index':459 'init':534 'inlin':127 'input':20,86,87,98,102,645,679 'input/output':80 'inputfield':27,777 'instruct':619 'int':223,238,260,286,306,332,334,456,686,712 'joy':189 'key':275,299,520 'label':369 'lambda':742 'le':703 'length':673,676,771 'limit':750 'list':100,105,150,212,233,237,295,303,323,348,364,384,425,516 'liter':165,188,210,247,443,476,499,633 'llms':758 'loc':357,362 'log':479 'logger':480 'logger.error':569 'logging.getlogger':481 'low':446 'lt':690 'max':284,557,675 'maximum':289 'medium':445 'mention':35,522 'min':559,672 'mix':503 'model':43,253,625,650,756 'modul':66,75,95,467 'multi':83,368 'multi-field':82 'multi-label':367 'multilabelclassifi':373 'multipl':145,378,714 'name':257,339,482 'need':47,76 'negat':501 'nest':752 'neutral':502,577 'new':73 'number':685,693,719 'offici':780 'option':166,211,240,242,477,644,656 'org':356,361 'output':22,78,103,107,115,116,631,636,653 'outputfield':29,779 'paramet':628 'passag':430,455,463 'person':255,262,355,360 'point':276,285,291,300 'posit':500 'practic':609 'prefix':721,730,736,748 'primari':395 'print':599,604 'product':264,591 'prompt':770 'provid':640 'pydant':42,214,252,317,649,755 'python':130,161,206,267,315,371,413,470,657 'qa':134 'qualiti':592 'question':136,152,418,431 'rag':147,410 'rang':551 'reason':403,523,581 'refer':205 'relationship':81 'relev':401,462 'requir':101,754 'respons':85 'result':545,554,564,587 'result.aspects':607 'result.score':556,562,603 'result.sentiment':602 'retriev':420,429 'return':563,574 'sad':190 'safe':40,59,123 'score':200,505,510,550,555,578,698,706 'self':535,541 'self.analyze':536,546 'sensibl':641 'sentenc':142 'sentiment':143,487,498,509,529,576,601 'sentimentanalyz':531,586 'ship':596 'signatur':3,18,25,36,52,60,119,124,128,159,469,790,795 'simpl':129 'skill':6 'skill-dspy-signature-designer' 'slow':598 'sourc':454 'source-omidzamani' 'sport':393 'start':331 'str':92,151,153,155,180,220,234,243,258,278,296,328,330,344,349,381,385,397,404,426,432,435,492,517,524,543,670,734,739,746 'strict':761 'structur':652 'structured/validated':77 'struggl':759 'summar':266,269,271 'summari':294,312 'support':453 'surpris':193 'task':90,618 'tech':391 'text':178,179,184,283,327,342,343,376,380,491,495,542,547,548,589,669,680,738 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-dspy' 'topic-llm' 'topic-prompt-optimization' 'topic-rag' 'total':309 'tri':544 'type':31,39,58,88,108,111,117,122,139,163,203,208,218,321,329,347,352,474,648,753,762 'type-saf':38,57,121 'usag':584 'use':9,26,71,419,632 'user':12 'valid':549,647,667 'valu':639,773 'wha':50 'word':304,310 'work':775 'workflow':126 'x':743 'x.upper':744","prices":[{"id":"a6f0dfc4-df30-449f-9125-bf7922ba1bff","listingId":"69aae3da-b0f5-4229-aa19-1015116d5de7","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"OmidZamani","category":"dspy-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:14:18.041Z"}],"sources":[{"listingId":"69aae3da-b0f5-4229-aa19-1015116d5de7","source":"github","sourceId":"OmidZamani/dspy-skills/dspy-signature-designer","sourceUrl":"https://github.com/OmidZamani/dspy-skills/tree/master/skills/dspy-signature-designer","isPrimary":false,"firstSeenAt":"2026-04-18T22:14:18.041Z","lastSeenAt":"2026-05-02T06:55:44.864Z"}],"details":{"listingId":"69aae3da-b0f5-4229-aa19-1015116d5de7","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"OmidZamani","slug":"dspy-signature-designer","github":{"repo":"OmidZamani/dspy-skills","stars":74,"topics":["agent-skills","claude-code","claude-skills","dspy","llm","prompt-optimization","rag"],"license":"mit","html_url":"https://github.com/OmidZamani/dspy-skills","pushed_at":"2026-02-21T12:49:43Z","description":"Collection of Claude Skills for DSPy framework - program language models, optimize prompts, and build RAG pipelines systematically","skill_md_sha":"80c051d0ba82f5ad70c5f8c0af71d48dd2a71023","skill_md_path":"skills/dspy-signature-designer/SKILL.md","default_branch":"master","skill_tree_url":"https://github.com/OmidZamani/dspy-skills/tree/master/skills/dspy-signature-designer"},"layout":"multi","source":"github","category":"dspy-skills","frontmatter":{"name":"dspy-signature-designer","description":"This skill should be used when the user asks to \"create a DSPy signature\", \"define inputs and outputs\", \"design a signature\", \"use InputField or OutputField\", \"add type hints to DSPy\", mentions \"signature class\", \"type-safe DSPy\", \"Pydantic models in DSPy\", or needs to define what a DSPy module should do with structured inputs and outputs."},"skills_sh_url":"https://skills.sh/OmidZamani/dspy-skills/dspy-signature-designer"},"updatedAt":"2026-05-02T06:55:44.864Z"}}