gmuse.prompts#

Prompt builder for LLM commit message generation.

This module assembles prompts from various context sources including staged diffs, commit history, repository instructions, and learning examples.

Public API: - build_prompt: Build complete system and user prompts - build_context: Build context section from various sources - validate_message: Validate generated commit message - estimate_tokens: Estimate token count for text

Format-specific task prompts: - get_freeform_task: Natural language commit messages - get_conventional_task: Conventional Commits format - get_gitmoji_task: Gitmoji-style commit messages

Module Contents#

Functions#

get_freeform_task

Get task prompt for freeform commit messages.

get_conventional_task

Get task prompt for conventional commit messages.

get_gitmoji_task

Get task prompt for gitmoji commit messages.

build_context

Build context section of prompt from various sources.

build_prompt

Build complete prompt for LLM generation.

validate_message

Validate generated commit message.

estimate_tokens

Estimate token count for text.

Data#

logger

PROMPT_VERSION

Version identifier for prompt format (useful for tracking/debugging).

SYSTEM_PROMPT

Base system prompt used for all commit message generations.

MAX_MESSAGE_LENGTH

Default maximum allowed length for generated commit messages.

_CHARS_PER_TOKEN

Default characters per token heuristic for GPT models.

API#

gmuse.prompts.logger = 'get_logger(...)'#
gmuse.prompts.PROMPT_VERSION: Final[str] = '1.0.0'#

Version identifier for prompt format (useful for tracking/debugging).

gmuse.prompts.SYSTEM_PROMPT: Final[str] = <Multiline-String>#

Base system prompt used for all commit message generations.

gmuse.prompts.MAX_MESSAGE_LENGTH: Final[int] = 1000#

Default maximum allowed length for generated commit messages.

This serves as the default value used by validate_message() when no max_length parameter is provided. Can be overridden per-call or via configuration.

gmuse.prompts.get_freeform_task() str#

Get task prompt for freeform commit messages.

Returns: Task prompt string

Example: >>> task = get_freeform_task() >>> print(task) Generate a commit message in natural language…

gmuse.prompts.get_conventional_task(max_chars: int | None = None) str#

Get task prompt for conventional commit messages.

Args: max_chars: Optional override for maximum characters. When provided, the default fixed-length guidance is omitted to avoid conflicting instructions.

Returns: Task prompt string

Example: >>> task = get_conventional_task() >>> print(task) Generate a commit message following Conventional Commits specification…

gmuse.prompts.get_gitmoji_task() str#

Get task prompt for gitmoji commit messages.

Returns: Task prompt string

Example: >>> task = get_gitmoji_task() >>> print(task) Generate a commit message with a relevant emoji prefix…

gmuse.prompts.build_context(diff: gmuse.git.StagedDiff, commit_history: Optional[gmuse.git.CommitHistory] = None, repo_instructions: Optional[gmuse.git.RepositoryInstructions] = None, branch_info: Optional[gmuse.git.BranchInfo] = None, user_hint: Optional[str] = None, learning_examples: Optional[List[Tuple[str, str]]] = None) str#

Build context section of prompt from various sources.

Args: diff: Staged diff information commit_history: Recent commit history for style context repo_instructions: Repository-level instructions from .gmuse file branch_info: Current branch information for context user_hint: User-provided hint via –hint flag learning_examples: List of (generated, final) message pairs from learning

Returns: Formatted context string

Example: >>> from gmuse.git import StagedDiff >>> diff = StagedDiff( … raw_diff=”diff –git a/file.py…”, … files_changed=[“file.py”], … lines_added=10, … lines_removed=2, … hash=”abc123”, … size_bytes=500, … ) >>> context = build_context(diff) >>> print(context) Staged changes summary: - Files changed: 1 …

gmuse.prompts.build_prompt(diff: gmuse.git.StagedDiff, format: str = 'freeform', commit_history: Optional[gmuse.git.CommitHistory] = None, repo_instructions: Optional[gmuse.git.RepositoryInstructions] = None, branch_info: Optional[gmuse.git.BranchInfo] = None, user_hint: Optional[str] = None, learning_examples: Optional[List[Tuple[str, str]]] = None, max_chars: Optional[int] = None) Tuple[str, str]#

Build complete prompt for LLM generation.

Args: diff: Staged diff information format: Message format style (“freeform”, “conventional”, “gitmoji”) commit_history: Recent commit history for style context repo_instructions: Repository-level instructions from .gmuse file branch_info: Current branch information for context user_hint: User-provided hint via –hint flag learning_examples: List of (generated, final) message pairs from learning

Returns: Tuple of (system_prompt, user_prompt)

Raises: ValueError: If format is not recognized

Example: >>> from gmuse.git import StagedDiff >>> diff = StagedDiff( … raw_diff=”diff –git a/file.py…”, … files_changed=[“file.py”], … lines_added=10, … lines_removed=2, … hash=”abc123”, … size_bytes=500, … ) >>> system, user = build_prompt(diff, format=”conventional”) >>> print(system) You are an expert commit message generator…

gmuse.prompts.validate_message(message: str, format: str = 'freeform', max_length: int = MAX_MESSAGE_LENGTH) None#

Validate generated commit message.

Args: message: Generated commit message to validate format: Expected message format max_length: Maximum allowed message length (default: 1000)

Raises: InvalidMessageError: If message fails validation

Example: >>> validate_message(“feat(auth): add JWT”, format=”conventional”) # No error >>> validate_message(“”, format=”freeform”) Traceback (most recent call last): … InvalidMessageError: Generated message is empty

gmuse.prompts._CHARS_PER_TOKEN: Final[int] = 4#

Default characters per token heuristic for GPT models.

This serves as the default value used by estimate_tokens() when no chars_per_token parameter is provided. Can be overridden per-call or via configuration.

gmuse.prompts.estimate_tokens(text: str, chars_per_token: int = _CHARS_PER_TOKEN) int#

Estimate token count for text.

Uses a simple heuristic (default: ~4 characters per token, approximate for GPT models). This is a rough estimate and actual token counts vary by model and tokenizer.

Args: text: Text to estimate tokens for chars_per_token: Characters per token heuristic (default: 4)

Returns: Estimated token count

Example: >>> estimate_tokens(“Hello world”) 3 >>> estimate_tokens(“A” * 400) 100