negmas-llm
LLM-based negotiators for the negmas negotiation framework.
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 |
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.
-
Ensure you have GitHub Copilot access (requires GitHub Copilot subscription)
-
Run the tests:
TEST_LLM_PROVIDER=github_copilot uv run pytest -m slow
-
Follow the OAuth prompts: On first run, you'll see:
Please visit https://github.com/login/device and enter code: XXXX-XXXX -
Authenticate: Visit the URL, enter the code, and authorize the app
-
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
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)
| File | Size | Uploaded | |
|---|---|---|---|
| negmas_llm-0.4.3.tar.gz | 53.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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