Skip to content

Message Generator

The MessageGenerator class uses LLMs to create ISO 8583 messages from natural language descriptions.

Quick Start

from iso8583sim.llm import MessageGenerator

generator = MessageGenerator()

# Generate from natural language
message = generator.generate("$50 VISA purchase at a coffee shop")

print(f"MTI: {message.mti}")
print(f"PAN: {message.fields.get(2)}")
print(f"Amount: {message.fields.get(4)}")

Generating Messages

Simple Purchase

message = generator.generate("$100 purchase with Mastercard")

# Result:
# MTI: 0100
# Field 2: 5500000000000004
# Field 3: 000000
# Field 4: 000000010000

Specific Scenarios

# ATM withdrawal
message = generator.generate("$200 ATM cash withdrawal with VISA card")

# Refund
message = generator.generate("Refund $25 to card ending in 4444")

# Balance inquiry
message = generator.generate("Balance inquiry at ATM for debit card")

# International transaction
message = generator.generate("$500 purchase in EUR at a Paris hotel")

With Validation

By default, generated messages are validated:

# With validation (default)
message = generator.generate("$50 purchase", validate=True)

# Skip validation (faster, for testing)
message = generator.generate("$50 purchase", validate=False)

Suggesting Missing Fields

Complete a partial message:

from iso8583sim.core.types import ISO8583Message

# Create partial message
partial = ISO8583Message(
    mti="0100",
    fields={
        0: "0100",
        2: "4111111111111111",
        4: "000000010000",
    }
)

# Get suggestions for missing fields
suggestions = generator.suggest_fields(partial)

print("Suggested fields:")
for field_num, value in suggestions.items():
    print(f"  Field {field_num}: {value}")

Output:

Suggested fields:
  Field 3: 000000
  Field 7: 1225120000
  Field 11: 123456
  Field 14: 2512
  Field 22: 051
  Field 41: TERM0001
  Field 42: MERCHANT123456

Generation Examples

Authorization Request

message = generator.generate(
    "Authorization request for $250 EMV chip transaction at gas station, "
    "VISA card ending in 1234"
)

Financial Transaction

message = generator.generate(
    "Financial transaction (0200) for $75.50 at retail store, "
    "contactless Mastercard payment"
)

Reversal

message = generator.generate(
    "Reversal for failed $100 transaction, original STAN 123456"
)

Response Message

message = generator.generate(
    "Approval response for authorization request, "
    "response code 00, auth code A12345"
)

Custom Provider

from iso8583sim.llm import MessageGenerator, get_provider

# Use a specific provider
provider = get_provider("openai")
generator = MessageGenerator(provider=provider)

# Use a specific model for faster generation
from iso8583sim.llm.providers.anthropic import AnthropicProvider
provider = AnthropicProvider(model="claude-3-haiku-20240307")
generator = MessageGenerator(provider=provider)

Test Data Generation

Generate test datasets:

from iso8583sim.llm import MessageGenerator
from iso8583sim.core.builder import ISO8583Builder

generator = MessageGenerator()
builder = ISO8583Builder()

scenarios = [
    "$100 VISA purchase at retail store",
    "$50 Mastercard at restaurant with tip",
    "$200 ATM withdrawal",
    "Declined transaction, insufficient funds",
    "EMV chip transaction at gas pump",
]

test_messages = []
for scenario in scenarios:
    try:
        message = generator.generate(scenario, validate=False)
        raw = builder.build(message)
        test_messages.append({
            "scenario": scenario,
            "message": message,
            "raw": raw,
        })
    except Exception as e:
        print(f"Failed to generate '{scenario}': {e}")

Guidance for Better Results

Provide specific details for better generation:

# Less specific - may generate generic values
message = generator.generate("A purchase")

# More specific - generates accurate message
message = generator.generate(
    "$150.00 purchase at electronics store, "
    "VISA chip card (no PIN), "
    "terminal ID ELEC0001, "
    "merchant ID BESTBUY123456"
)

Helpful Details to Include

  • Transaction amount and currency
  • Card network (VISA, Mastercard, etc.)
  • Card entry mode (chip, swipe, contactless, manual)
  • Transaction type (purchase, refund, withdrawal)
  • Merchant type or name
  • Terminal and merchant IDs

Error Handling

from iso8583sim.llm import MessageGenerator, LLMError
from iso8583sim.core.types import BuildError

generator = MessageGenerator()

try:
    message = generator.generate(description)
except LLMError as e:
    print(f"LLM error: {e}")
except BuildError as e:
    print(f"Generated message failed validation: {e}")

Limitations

  • Generated messages may not pass all network-specific validations
  • Complex multi-message scenarios may need manual adjustment
  • Generated PANs are test numbers, not real card numbers
  • Some network-specific fields may be missing

API Reference

See LLM API Reference for complete API documentation.