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."

LLM Provider Configuration

Production Usage

Each negotiator class accepts provider-specific configuration:

from negmas_llm import (
    OpenAINegotiator,
    AnthropicNegotiator,
    OllamaNegotiator,
    LLMNegotiator,
)

# OpenAI (uses OPENAI_API_KEY env var by default)
negotiator = OpenAINegotiator(model="gpt-4o", api_key="sk-...")

# Anthropic (uses ANTHROPIC_API_KEY env var by default)
negotiator = AnthropicNegotiator(model="claude-sonnet-4-20250514")

# Local Ollama
negotiator = OllamaNegotiator(model="llama3.2", api_base="http://localhost:11434")

# GitHub Copilot (uses OAuth device flow - no API key needed)
# On first use, you'll be prompted to authenticate via browser
negotiator = LLMNegotiator(
    provider="github_copilot",
    model="gpt-4o",
)

# GitHub Models (marketplace - uses GITHUB_API_KEY)
negotiator = LLMNegotiator(
    provider="github",
    model="gpt-4o",
)

# Generic provider via litellm
negotiator = LLMNegotiator(
    provider="groq",
    model="llama-3.3-70b-versatile",
    api_key="gsk_...",
)

Testing Configuration

Tests can be configured via environment variables to use different LLM providers.

Quick Start with GitHub Copilot

GitHub Copilot uses OAuth device flow authentication - no API key needed!

# Run GitHub Copilot tests - will prompt for OAuth on first use
TEST_LLM_PROVIDER=github_copilot uv run pytest -m slow

# Or run only GitHub Copilot-specific tests
uv run pytest -m github_copilot

On first run, litellm will display a device code and URL. Visit the URL, enter the code, and authenticate with your GitHub account. Credentials are cached locally for future use.

Environment Variables

Variable Description Default
TEST_LLM_PROVIDER Default provider for tests ollama
TEST_LLM_MODEL Default model (overridden by provider-specific vars) Provider default
TEST_LLM_API_KEY Default API key None
TEST_LLM_API_BASE Default API base URL Provider default

Provider-Specific Variables

Each provider can be configured independently:

Provider Model Variable API Key Variable Notes
Ollama OLLAMA_MODEL - Local server
OpenAI OPENAI_MODEL OPENAI_API_KEY
Anthropic ANTHROPIC_MODEL ANTHROPIC_API_KEY
Gemini GEMINI_MODEL GOOGLE_API_KEY
GitHub Copilot GITHUB_COPILOT_MODEL - OAuth device flow
GitHub Models GITHUB_MODEL GITHUB_API_KEY PAT works
Groq GROQ_MODEL GROQ_API_KEY
Mistral MISTRAL_MODEL MISTRAL_API_KEY
DeepSeek DEEPSEEK_MODEL DEEPSEEK_API_KEY
OpenRouter OPENROUTER_MODEL OPENROUTER_API_KEY

Default Models by Provider

Provider Default Model
ollama qwen3:1.7b
openai gpt-4o-mini
anthropic claude-sonnet-4-20250514
gemini gemini-2.0-flash
github_copilot gpt-4o
github gpt-4o
groq llama-3.3-70b-versatile
mistral mistral-large-latest
deepseek deepseek-chat
openrouter openai/gpt-4o-mini

Running Provider-Specific Tests

# Run tests for a specific provider (skips if not configured)
uv run pytest -m openai
uv run pytest -m anthropic
uv run pytest -m github_copilot
uv run pytest -m ollama

# Run all slow tests (actual LLM calls)
uv run pytest -m slow

# Run fast tests only (mocked/unit tests)
uv run pytest -m "not slow"

# Run tests with a specific provider
TEST_LLM_PROVIDER=openai OPENAI_API_KEY=sk-... uv run pytest

# Run tests with Ollama and a specific model
OLLAMA_MODEL=llama3.2 uv run pytest -m ollama

Setting Up GitHub Copilot for Testing

GitHub Copilot uses OAuth device flow - no Personal Access Token needed.

  1. Ensure you have GitHub Copilot access (requires GitHub Copilot subscription)

  2. Run the tests:

    TEST_LLM_PROVIDER=github_copilot uv run pytest -m slow
    
  3. Follow the OAuth prompts: On first run, you'll see:

    Please visit https://github.com/login/device and enter code: XXXX-XXXX
    
  4. Authenticate: Visit the URL, enter the code, and authorize the app

  5. Credentials are cached: Future runs won't require re-authentication

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.4.1.tar.gz (50.4 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.4.1-py3-none-any.whl (53.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: negmas_llm-0.4.1.tar.gz
  • Upload date:
  • Size: 50.4 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.4.1.tar.gz
Algorithm Hash digest
SHA256 c29a561635a993f345177053dcc1b6f56cd2d8de5956b5ab881922d63384f0e4
MD5 da8a6c31d9923227bf31be419589a9f7
BLAKE2b-256 08db65055e61af45f9a8712ed762fb672e0eea85b254ff60e17c49c0c4407bbb

See more details on using hashes here.

Provenance

The following attestation bundles were made for negmas_llm-0.4.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.4.1-py3-none-any.whl.

File metadata

  • Download URL: negmas_llm-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 53.6 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.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4a731a383efc18f5b97bdc6736411df686e269e61ccc49d648b3ba03a9b2aef1
MD5 5bbacba63bd31f437659fab214d3f8f4
BLAKE2b-256 36e00c092cbfcd9e963db6e02e8196c3347d8614006f0e83442eff9f201faaac

See more details on using hashes here.

Provenance

The following attestation bundles were made for negmas_llm-0.4.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