Skip to main content

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

Metadata

Release files for negmas-llm 0.4.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for negmas-llm 0.4.3
File Size Uploaded
negmas_llm-0.4.3.tar.gz 53.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for negmas-llm 0.4.3
File Interpreter ABI Platform
negmas_llm-0.4.3-py3-none-any.whl Python 3 none any Details

Total release size: 110.3 kB

Release files / negmas_llm-0.4.3.tar.gz

Download URL negmas_llm-0.4.3.tar.gz
Size 53.6 kB
Tags Source
SHA-256 checksum
How to use checksums
5fe0824eacfe884a483a9bf32f328cf033bd13d40321f1c8b82e1a28dea1f8f5
BLAKE2b-256 checksum
How to use checksums
74a4b5168e9c43a6f9f0c430c8e022a22f75de267450d5ed1be90393e1664c31
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release files / negmas_llm-0.4.3-py3-none-any.whl

Download URL negmas_llm-0.4.3-py3-none-any.whl
Size 56.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
377ec9caea2be6330d217361da2a8c5b4ddd4793684e87f6897cf4c95d886b1c
BLAKE2b-256 checksum
How to use checksums
0abeadd9901dd8d8f0e40831c53933e06a3d9848d1aed74d0a117ad41c1ece66
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.3 This release

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page