Skip to main content

An autonomous LangGraph pipeline that generates AI-resistant technical take home assignments.

Project description

PRDinator

An autonomous LangGraph pipeline that generates AI-resistant technical assignment PRDs. Give it a role, tech stack, and domain — it handles everything else.

What it does

Takes a single employer input and runs it through an 8-node agentic pipeline: generating ideas, filtering out AI-solvable ones, injecting real-world constraints, red-teaming for shortcuts, and producing a structured PRD.

pip install prd-inator

Setup

Requires uv.

uv venv
uv sync

Copy .env.example to .env and add your API keys:

cp .env.example .env

Usage

As a Library

from prd_inator import generate_prd
from langchain_openai import ChatOpenAI

# Initialize your LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)

result = generate_prd(
    role="Backend Engineer",
    tech_stack="Python, FastAPI, PostgreSQL",
    domain="Fintech",
    seniority="Mid-level",
    llm=llm
)

# Access output
print(result.candidate_prd)  # Assignment for candidate

# Save to file
with open("assignment.md", "w") as f:
    f.write(result.candidate_prd)

As a CLI

uv run main.py

LLM Configuration

Simple: Single LLM for All Nodes

Pass a pre-configured LLM instance to use for all pipeline nodes:

from langchain_openai import ChatOpenAI
from prd_inator import generate_prd

llm = ChatOpenAI(model="gpt-4o", temperature=0.7)

result = generate_prd(
    role="Backend Engineer",
    tech_stack="Python, FastAPI, PostgreSQL",
    domain="Fintech",
    seniority="Mid-level",
    llm=llm
)

Advanced: Per-Node LLM Configuration

Use different LLMs for specific nodes:

from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from prd_inator import generate_prd

# Default LLM for most nodes
default_llm = ChatOpenAI(model="gpt-4o", temperature=0.7)

# Use Claude for adversarial thinking
adversarial_llm = ChatAnthropic(model="claude-3-5-sonnet-20241022", temperature=0.9)

# Use cheaper model for diversity enforcement
cheap_llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.3)

result = generate_prd(
    role="Frontend Developer",
    tech_stack="React, TypeScript",
    domain="Healthcare",
    seniority="Senior",
    llm=default_llm,
    node_llms={
        "adversarial_agent": adversarial_llm,
        "diversity_enforcer": cheap_llm
    }
)

Why This Approach?

  • Bring your own LLM: Use any LangChain-compatible model (OpenAI, Anthropic, local models, custom wrappers)
  • Full control: Configure temperature, max_tokens, timeouts, retries, etc.
  • No coupling: The library doesn't manage API keys or provider initialization
  • Flexible: Mix and match models per node for cost/quality optimization

Available Nodes for Configuration

  • idea_divergence
  • diversity_enforcer
  • anti_ai_filter
  • constraint_injector
  • scenario_transformer
  • adversarial_agent
  • patch_node
  • prd_generator

Pipeline overview

Employer inputs
  → Idea divergence engine
  → Diversity enforcer
  → Anti-AI filter          ↺ loops back if ideas are too weak (max 3x)
  → Constraint injector
  → Scenario transformer    (generates structured PRD components)
  → Adversarial agent
  → Patch node              (hardens PRD against shortcuts)
  → PRD generator           (assembles final document)
  → Output

Output

Each run produces a single structured PRD document with:

  • Objective & Context — business problem and what to build
  • Technical Stack — required technologies
  • Core Requirements — 3-5 main requirements with details
  • Functional Requirements — API endpoints/interfaces with specifications
  • Non-Functional Requirements — performance, resilience, security, developer experience
  • User Flow — end-to-end step-by-step flow

Stack

  • LangGraph — agent orchestration
  • uv — dependency management

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prd_inator-0.3.0.tar.gz (116.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

prd_inator-0.3.0-py3-none-any.whl (17.9 kB view details)

Uploaded Python 3

File details

Details for the file prd_inator-0.3.0.tar.gz.

File metadata

  • Download URL: prd_inator-0.3.0.tar.gz
  • Upload date:
  • Size: 116.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for prd_inator-0.3.0.tar.gz
Algorithm Hash digest
SHA256 acf4371ff6a30047aa073d17c9c2561f315df2fbc60b0652924e9d1c3f0c2814
MD5 ec2a1afa03f60f925d40efb1a1227372
BLAKE2b-256 07d29ce26f091d105f49da25a9cd5272f9958c377d7111d35ae419c4a5d7fbff

See more details on using hashes here.

Provenance

The following attestation bundles were made for prd_inator-0.3.0.tar.gz:

Publisher: publish.yml on starthackHQ/prd-inator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file prd_inator-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: prd_inator-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 17.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for prd_inator-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e13f84877a0f58c6c5b56907cf99b6b5ebe1a36ac6447adb087b6422ad90b26d
MD5 7b0a05aba82ed1e71f0ae39ca908f52f
BLAKE2b-256 7498e830fa58cd8f0b74839cd6a9d5bacf3ee7112331b85c83c96059d24e8f99

See more details on using hashes here.

Provenance

The following attestation bundles were made for prd_inator-0.3.0-py3-none-any.whl:

Publisher: publish.yml on starthackHQ/prd-inator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page