Starphix
Systems Engineering / Sources
The Lab / Sources / Systems Engineering / Platform/Prompt-Management-And-Cost-Showback.md

Prompt Management and Cost Showback

Central prompt registry with versioning, review, and AI cost attribution by team and product.

Prompt Registry

Concept Description
Prompt Template Versioned prompt with variables (e.g. {{question}}, {{context}})
Prompt Version Immutable snapshot of template + variables + guardrails + eval config
Prompt Stage Draft, Review, Production, Deprecated
Prompt Alias Human-readable pointer (champion, challenger)
Guardrails Input/output filters attached to each prompt version
Eval Config Metrics and thresholds for evaluating prompt quality

Prompt Registry Schema

# prompts/registry.yaml
prompts:
  - id: support-faq-v2
    name: Customer Support FAQ
    version: "2"
    owner: support-team
    stage: Production
    aliases:
      - champion

    template: |
      You are a helpful customer support agent. Answer the user's question
      using only the provided context. If you don't know, say so.

      Context: {{context}}
      Question: {{question}}

      Answer:

    variables:
      - name: context
        type: string
        required: true
      - name: question
        type: string
        required: true

    guardrails:
      - id: pii-detection
        type: input
      - id: toxicity-check
        type: output
      - id: hallucination-check
        type: output

    eval:
      judge_model: gpt-4o-mini
      sample_rate: 0.1
      metrics:
        - faithfulness
        - relevance
      thresholds:
        faithfulness: 0.90
        relevance: 0.85

    model:
      default: meta-llama/Llama-3.1-8B-Instruct
      fallback: meta-llama/Llama-3.1-1B-Instruct

    created_at: "2026-01-10T09:00:00Z"
    updated_at: "2026-01-15T14:30:00Z"
    updated_by: prompt-engineering-team

    changelog:
      - version: "1"
        change: "Initial prompt"
        date: "2026-01-10"
      - version: "2"
        change: "Added hallucination guardrail, tightened context instruction"
        date: "2026-01-15"

  - id: code-review-v1
    name: Code Review Assistant
    version: "1"
    owner: platform-team
    stage: Review
    aliases:
      - challenger

    template: |
      Review the following code diff for bugs, security issues, and style violations.

      Diff: {{diff}}
      Language: {{language}}

    variables:
      - name: diff
        type: string
        required: true
      - name: language
        type: string
        required: true

    guardrails:
      - id: pii-detection
        type: input

    eval:
      judge_model: gpt-4o-mini
      metrics:
        - accuracy
        - usefulness

Prompt Lifecycle

stateDiagram-v2
    [*] --> Draft: create prompt
    Draft --> Review: submit for review
    Review --> Production: approval + pass eval
    Production --> Deprecated: superseded
    Deprecated --> [*]: archive
    Production --> Draft: rollback / revision

    note right of Review: Peer review + eval gate required
    note right of Production: Immutable once deployed

Prompt Management Implementation

from dataclasses import dataclass, field
from typing import Optional, List
from datetime import datetime
import hashlib
import json

@dataclass
class PromptVersion:
    id: str
    version: str
    template: str
    variables: List[str]
    guardrails: List[str]
    model: str
    created_at: datetime
    created_by: str

    def content_hash(self) -> str:
        content = json.dumps({
            "template": self.template,
            "variables": self.variables,
            "guardrails": self.guardrails,
            "model": self.model,
        }, sort_keys=True)
        return hashlib.sha256(content.encode()).hexdigest()[:12]

@dataclass
class PromptRegistry:
    prompts: dict = field(default_factory=dict)

    def register(self, prompt: PromptVersion):
        key = f"{prompt.id}:{prompt.version}"
        self.prompts[key] = prompt

    def get(self, prompt_id: str, version: Optional[str] = None) -> PromptVersion:
        if version:
            return self.prompts[f"{prompt_id}:{version}"]
        # Return latest Production version
        candidates = [
            p for p in self.prompts.values()
            if p.id == prompt_id and p.stage == "Production"
        ]
        if not candidates:
            raise ValueError(f"No Production version for {prompt_id}")
        return max(candidates, key=lambda p: p.created_at)

    def render(self, prompt: PromptVersion, **variables) -> str:
        # Validate required variables
        for var in prompt.variables:
            if var not in variables:
                raise ValueError(f"Missing required variable: {var}")

        template = prompt.template
        for var, value in variables.items():
            template = template.replace(f"{{{{{var}}}}}", str(value))
        return template

# Usage
registry = PromptRegistry()

prompt = PromptVersion(
    id="support-faq",
    version="2",
    template="Context: {{context}}\nQuestion: {{question}}\nAnswer:",
    variables=["context", "question"],
    guardrails=["pii-detection", "toxicity-check"],
    model="meta-llama/Llama-3.1-8B-Instruct",
    created_at=datetime.now(),
    created_by="prompt-team",
)

registry.register(prompt)
rendered = registry.get("support-faq").render(
    context="Our refund policy allows returns within 30 days.",
    question="Can I return this item?",
)
print(rendered)

Cost Showback

Attributing AI inference and training costs to teams and products.

Cost Attribution Model

Cost Component Attribution Method Granularity
Inference tokens Tag by team + product per request Per request, aggregated monthly
Training compute Tag training jobs by team Per training run
Model hosting Allocate by model usage % Monthly per team
Embedding/storage Tag by vector store namespace Monthly per team
Platform overhead Split evenly or by headcount Monthly per team

Cost Showback SQL

-- Monthly AI cost by team and model
SELECT
  team,
  product,
  model,
  SUM(prompt_tokens) as total_prompt_tokens,
  SUM(completion_tokens) as total_completion_tokens,
  SUM(cost_usd) as total_cost_usd,
  COUNT(*) as request_count,
  SUM(cost_usd) / NULLIF(COUNT(*), 0) as avg_cost_per_request_usd
FROM ai_inference_events
WHERE event_date >= DATE_TRUNC('month', CURRENT_DATE)
  AND event_date < DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month'
GROUP BY team, product, model
ORDER BY total_cost_usd DESC;

-- Budget alert: teams approaching monthly limit
SELECT
  team,
  SUM(cost_usd) as spend_this_month,
  monthly_budget_usd,
  SUM(cost_usd) / monthly_budget_usd as budget_pct
FROM ai_inference_events
JOIN team_budgets USING (team)
WHERE event_date >= DATE_TRUNC('month', CURRENT_DATE)
GROUP BY team, monthly_budget_usd
HAVING SUM(cost_usd) / monthly_budget_usd > 0.8;

Cost Showback Dashboard

Team Model Requests Cost (USD) Budget % of Budget Trend
Support Llama-3.1-8B 450,000 $1,240 $2,000 62% ↗
Platform GPT-4o-mini 120,000 $890 $1,500 59% →
Research Llama-3.1-70B 15,000 $2,100 $3,000 70% ↗↗
Marketing Claude-3-Haiku 80,000 $650 $1,000 65% ↘

Decision Guidance

Situation Recommended Approach
Many AI teams, one platform Central prompt registry + versioning + review
Prompt sprawl Require all prompts in registry; deprecate hardcoded prompts
No cost visibility Tag all AI spend by team; monthly showback reports
Budget overruns Budget alerts at 80%; circuit breaker at 100%
Prompt quality regression Eval gate before promoting to Production stage

Anti-Patterns

Anti-Pattern Fix
Prompts hardcoded in applications Central prompt registry with versioning
No cost attribution Tag all AI spend; showback to teams
No prompt review process Peer review + eval gate before Production
No budget alerts Alert at 80% of monthly budget; hard stop at 100%
No prompt rollback Keep previous prompt version; rollback = alias change

Sources

  • PromptLayer, LangSmith, Humanloop, Weights & Biases Prompts, Internal Developer Platform patterns, FinOps for AI, Cloud cost showback, Team Topologies, platform engineering community.*

From the Systems Engineering research vault · CC BY 4.0 · all notes · raw markdown