Skip to main content

LLM-based negotiators for the negmas negotiation framework

Project description

negmas-llm

LLM-based negotiators for the negmas negotiation framework.

PyPI PyPI - Python Version PyPI - Status PyPI - Downloads PyPI - License Documentation Status CI Code style: ruff

Overview

negmas-llm integrates Large Language Models with the negmas negotiation framework, allowing you to create negotiators that use LLMs for decision-making. The library supports multiple LLM providers through litellm, including:

  • Cloud providers: OpenAI, Anthropic, Google Gemini, Cohere, Mistral, Groq, Together AI, Azure OpenAI, AWS Bedrock, OpenRouter, DeepSeek, Hugging Face
  • Local models: Ollama, vLLM, LM Studio, text-generation-webui

Installation

pip install negmas-llm

Or with uv:

uv add negmas-llm

Quick Start

from negmas import SAOMechanism
from negmas.preferences import LinearAdditiveUtilityFunction
from negmas.outcomes import make_issue
from negmas_llm import OllamaNegotiator, OpenAINegotiator

# Define negotiation issues
issues = [
    make_issue("price", (0, 100)),
    make_issue("quantity", (1, 10)),
]

# Create utility functions for each party
seller_ufun = LinearAdditiveUtilityFunction(
    weights=[0.6, 0.4],
    issues=issues,
)
buyer_ufun = LinearAdditiveUtilityFunction(
    weights=[-0.6, 0.4],  # Buyer prefers lower prices
    issues=issues,
)

# Create LLM-based negotiators
seller = OpenAINegotiator(
    model="gpt-4o",
    name="seller",
    ufun=seller_ufun,
)
buyer = OllamaNegotiator(
    model="llama3.2",
    name="buyer",
    ufun=buyer_ufun,
)

# Run the negotiation
mechanism = SAOMechanism(outcome_space=issues, n_steps=20)
mechanism.add(seller)
mechanism.add(buyer)
result = mechanism.run()

print(f"Agreement: {result.agreement}")

Supported Negotiators

Class Provider Default Model
OpenAINegotiator OpenAI gpt-4o
AnthropicNegotiator Anthropic claude-sonnet-4-20250514
GeminiNegotiator Google gemini-2.0-flash
CohereNegotiator Cohere command-r-plus
MistralNegotiator Mistral AI mistral-large-latest
GroqNegotiator Groq llama-3.3-70b-versatile
TogetherAINegotiator Together AI Meta-Llama-3.1-70B-Instruct-Turbo
AzureOpenAINegotiator Azure OpenAI (deployment name)
AWSBedrockNegotiator AWS Bedrock claude-3-sonnet
OpenRouterNegotiator OpenRouter openai/gpt-4o
DeepSeekNegotiator DeepSeek deepseek-chat
HuggingFaceNegotiator Hugging Face Llama-3.2-3B-Instruct
OllamaNegotiator Ollama (local) llama3.2
VLLMNegotiator vLLM (local) (model name)
LMStudioNegotiator LM Studio (local) local-model
TextGenWebUINegotiator text-generation-webui local-model

Customization

You can customize how information is presented to the LLM by subclassing LLMNegotiator and overriding the formatting methods:

from negmas_llm import LLMNegotiator

class CustomNegotiator(LLMNegotiator):
    def format_outcome_space(self, state):
        # Customize how the outcome space is described
        return "Custom outcome space description..."

    def format_own_ufun(self, state):
        # Customize how your utility function is described
        return "Custom utility function description..."

    def format_state(self, state, offer=None):
        # Customize how the negotiation state is presented
        return "Custom state description..."

For complete control over the prompts, override build_system_prompt or build_user_message:

from negmas_llm import LLMNegotiator

class CustomPromptNegotiator(LLMNegotiator):
    def build_system_prompt(self, state):
        # Complete control over the system prompt
        # By default, this combines: format_outcome_space(), format_nmi_info(),
        # format_own_ufun(), format_partner_ufun(), format_response_instructions()
        return f"""You are an aggressive negotiator who never accepts the first offer.

{self.format_outcome_space(state)}
{self.format_own_ufun(state)}
{self.format_response_instructions()}

Always aim for at least 80% of your maximum utility."""

    def build_user_message(self, state, offer, source):
        # Complete control over the per-round user message
        if offer is not None:
            return f"Round {state.step}: Opponent offered {offer}. Counter aggressively."
        return f"Round {state.step}: Make an ambitious opening offer."

Documentation

Full documentation is available at negmas-llm.readthedocs.io.

License

GNU Affero General Public License v3.0 or later - see LICENSE for details.

Related Projects

  • negmas - NEGotiation MAnagement System
  • litellm - Call all LLM APIs using the OpenAI format

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

negmas_llm-0.2.1.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

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

negmas_llm-0.2.1-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

File details

Details for the file negmas_llm-0.2.1.tar.gz.

File metadata

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

File hashes

Hashes for negmas_llm-0.2.1.tar.gz
Algorithm Hash digest
SHA256 0b29f5494db6bca7717ddd4bfcc5e3f7b697146e8ec4973d971128aadaf879e3
MD5 785eb3faaa7cc200ade269b4eb7e60fa
BLAKE2b-256 ebd5edeabb3925708a83ccbaaa2698fd81a8c576619d0a544a70d57143d6f2a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for negmas_llm-0.2.1.tar.gz:

Publisher: publish.yml on autoneg/negmas-llm

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

File details

Details for the file negmas_llm-0.2.1-py3-none-any.whl.

File metadata

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

File hashes

Hashes for negmas_llm-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6ace1017bddc38f121dd9f731d50a3dd4d05c31746ad01b08f43157d2843a184
MD5 6f0f68468bed41a9f12786748733861b
BLAKE2b-256 076fc675d1f915736ae3f8be01c47993c17ecd7c78eed5e8b7dca086445d1f4d

See more details on using hashes here.

Provenance

The following attestation bundles were made for negmas_llm-0.2.1-py3-none-any.whl:

Publisher: publish.yml on autoneg/negmas-llm

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