Skip to main content

Turn Python functions into LLM prompts

Project description

🔥 fireprompt

A lightweight Python library that turns your functions into LLM prompts. Write Jinja2 templates, get type-safe Pydantic responses, and connect to 100+ providers via LiteLLM.

FirePrompt is a framework, not a prompt library. You define your own functions (analyze_sentiment, extract_data, generate_code - whatever you need). FirePrompt handles the LLM integration, type validation, and templating.

Links:

Quick Start

pip install fireprompt

Setup & Authentication

FirePrompt uses LiteLLM to access 100+ LLM providers (OpenAI, Anthropic, Google, Azure, AWS Bedrock, and more).

To get started: Set up your provider's API key as an environment variable. Each provider has different requirements.

📚 Follow the setup guide for your provider: 👉 LiteLLM Provider Documentation

Example for OpenAI:

export OPENAI_API_KEY="sk-..."

Then in your code:

model=LLM(name="openai/gpt-4o")

How It Works

  1. Write a Python function - Define what you want (e.g., research_topic, analyze_sentiment, generate_code)
  2. Add the @prompt decorator - Tell FirePrompt which LLM to use
  3. Write your prompt in the docstring - Use Jinja2 templates to inject variables
  4. Call it like a normal function - FirePrompt handles the LLM call and returns typed results

Example: Here's a custom prompt function you might create:

from fireprompt import prompt, LLM
from pydantic import BaseModel

class ResearchResult(BaseModel):
    text: str

@prompt(
    model=LLM(
        name="openai/gpt-4o"
    )
)
def research_topic(topic: str, level: str = "basic") -> ResearchResult:
    """
    - role: system
      content: You are a helpful research assistant.

    - role: user
      content: >
        Analyze {{ topic }} at a {{ level }} level.
        Provide a clear and informative overview.
    """
    ...

result = research_topic(topic="Quantum Computing")
print(result.text)

Output:

Quantum computing is a revolutionary computing paradigm that leverages quantum mechanics
principles to process information. Unlike classical computers that use bits (0 or 1),
quantum computers use qubits that can exist in superposition, representing both states
simultaneously. This enables quantum computers to solve certain complex problems
exponentially faster than classical computers, particularly in cryptography, optimization,
and molecular simulation.

Configuration

Custom Parameters

Use LLMConfig for universal parameters across all providers:

from fireprompt import prompt, LLM, LLMConfig
from pydantic import BaseModel

class Summary(BaseModel):
    text: str

@prompt(
    model=LLM(
        name="anthropic/claude-3-5-sonnet-20241022",
        config=LLMConfig(
            temperature=0.3,  # Lower = more focused (0-2)
            max_tokens=1000   # Max response length
        )
    )
)
def summarize(text: str, style: str = "professional", keywords: list[str] = []) -> Summary:
    """
    - role: system
      content: You are an expert text summarizer.

    - role: user
      content: |
        Summarize this text in {{ style | upper }} style.

        {% if keywords %}
        Focus on these keywords:
        {% for keyword in keywords %}
        - {{ keyword | title }}
        {% endfor %}
        {% endif %}

        Text:
        {{ text }}
    """
    ...

with open("article.txt") as f:
    result = summarize(
        text=f.read(),
        style="casual",
        keywords=[
            "AI",
            "Machine Learning",
            "Innovation"
        ]
    )

print(result.text)

Provider-Specific Parameters

Use extra for provider-specific options:

from fireprompt import prompt, LLM, LLMConfig
from pydantic import BaseModel

class Analysis(BaseModel):
    summary: str
    key_points: list[str]

@prompt(
    model=LLM(
        name="openai/gpt-4o",
        config=LLMConfig(
            temperature=0.7,
            extra={
                "frequency_penalty": 0.5,  # OpenAI-specific
                "presence_penalty": 0.3
            }
        )
    )
)
def analyze(text: str) -> Analysis:
    """
    - role: user
      content: Analyze this text: {{ text }}
    """
    ...

result = analyze("Your text here...")
print(result)

Presets

Pre-configured settings for common use cases:

from fireprompt import prompt, LLM, LLMConfigPreset
from pydantic import BaseModel

class BlogPost(BaseModel):
    title: str
    content: str

@prompt(
    model=LLM(
        name="gemini/gemini-1.5-pro",
        config=LLMConfigPreset.CREATIVE
    )
)
def write_blog(topic: str, sections: list[str] = []) -> BlogPost:
    """
    - role: user
      content: |
        Write an engaging blog post about {{ topic | title }}.

        {% if sections | length > 0 %}
        Include these sections:
        {% for section in sections %}
        {{ loop.index }}. {{ section }}
        {% endfor %}
        {% else %}
        Create your own structure.
        {% endif %}
    """
    ...

result = write_blog("Generative AI", sections=["Introduction", "Key Benefits", "Use Cases"])
print(result)
Preset Temperature Top P Best For
DEFAULT 0.7 - Balanced responses
CREATIVE 0.9 0.95 Writing, brainstorming
PRECISE 0.3 0.9 Technical analysis
DETERMINISTIC 0.0 1.0 Reproducible outputs

Callbacks

Post-process responses with on_complete:

from fireprompt import prompt, LLM
from pydantic import BaseModel

class Analysis(BaseModel):
    sentiment: str
    score: float

def log_result(result: Analysis) -> Analysis:
    print(f"✓ {result.sentiment} ({result.score})")
    return result

@prompt(
    on_complete=log_result,
    model=LLM(
        name="openai/gpt-4o-mini"
    )
)
def analyze_sentiment(text: str) -> Analysis:
    """
    - role: user
      content: >
        Analyze sentiment: {{ text }}
        Return sentiment (positive/negative/neutral) and score (0-1).
    """
    ...

result = analyze_sentiment("I love this!")  # ✓ positive (0.95)
print(result)

Debug Logging

import fireprompt

fireprompt.enable_logging()   # Enable debug mode
fireprompt.disable_logging()  # Disable debug mode

Features

Feature Description
🎯 Type-Safe Automatic Pydantic validation for structured outputs
Async First Auto-detects and handles sync/async functions
🎨 Jinja2 Templates Full template support with variables, filters, loops, conditionals
🔧 Flexible Config Universal parameters + provider-specific options via extra
📦 Presets Pre-configured settings for common use cases
🪝 Callbacks Post-process responses with on_complete
🔍 Debug Mode Built-in logging for development
🚀 Multi-Provider 100+ LLMs via LiteLLM - OpenAI, Anthropic (Claude), Google (Gemini), Azure, AWS Bedrock, and more

License

📜 Dual Licensing

FirePrompt is dual-licensed to support both open-source enthusiasts and commercial users:

🆓 Free for Non-Commercial Use

Personal projects, education, research, hobby projects, and open-source work are completely free under the Polyform Noncommercial License 1.0.0.

💼 Commercial License Required

If you're using FirePrompt in a commercial product, within a company, or generating revenue, you need a commercial license.

Commercial use includes:

  • Using in a commercial product/service
  • Using within a company (even internal tools)
  • Client/consulting work
  • SaaS or hosted services
  • Any revenue-generating projects

📧 Contact for commercial licensing: alonliber.dev@gmail.com

See LICENSE-COMMERCIAL.md for detailed pricing and terms.

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

fireprompt-0.1.7.tar.gz (12.3 kB view details)

Uploaded Source

Built Distribution

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

fireprompt-0.1.7-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file fireprompt-0.1.7.tar.gz.

File metadata

  • Download URL: fireprompt-0.1.7.tar.gz
  • Upload date:
  • Size: 12.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fireprompt-0.1.7.tar.gz
Algorithm Hash digest
SHA256 c5d53304650ad53e3c4f5518b1968470224b2ad911a727edff846aa681396880
MD5 b482acdad7adbcc84e98619c81dd6863
BLAKE2b-256 2308da69fef9f02f45a96ea86d9746b3354f54df686336379c0743f7efa28435

See more details on using hashes here.

Provenance

The following attestation bundles were made for fireprompt-0.1.7.tar.gz:

Publisher: release-pypi.yaml on AlonLiber/fireprompt

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

File details

Details for the file fireprompt-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: fireprompt-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 12.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fireprompt-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 056e46ef5d6c3648590f422bc5c22d61b2a4f5fd87c61734d05b1951b2ffc92c
MD5 6b6a6350ebe1e3ff9f799580a79a64c3
BLAKE2b-256 8210f13205978a6947f21ce531dfd7edc61a962ba1092fac7147899eaac80a8b

See more details on using hashes here.

Provenance

The following attestation bundles were made for fireprompt-0.1.7-py3-none-any.whl:

Publisher: release-pypi.yaml on AlonLiber/fireprompt

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