LLM-based negotiators for the negmas negotiation framework
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file negmas_llm-0.4.3.tar.gz.
File metadata
- Download URL: negmas_llm-0.4.3.tar.gz
- Upload date:
- Size: 53.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fe0824eacfe884a483a9bf32f328cf033bd13d40321f1c8b82e1a28dea1f8f5
|
|
| MD5 |
2701709f8ecb3b9905149cafd8c65a96
|
|
| BLAKE2b-256 |
74a4b5168e9c43a6f9f0c430c8e022a22f75de267450d5ed1be90393e1664c31
|
Provenance
The following attestation bundles were made for negmas_llm-0.4.3.tar.gz:
Publisher:
publish.yml on autoneg/negmas-llm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
negmas_llm-0.4.3.tar.gz -
Subject digest:
5fe0824eacfe884a483a9bf32f328cf033bd13d40321f1c8b82e1a28dea1f8f5 - Sigstore transparency entry: 1532357573
- Sigstore integration time:
-
Permalink:
autoneg/negmas-llm@1aa8f525bbdfea4aa88541d4ca2d4d51c5db824d -
Branch / Tag:
refs/tags/v0.4.3 - Owner: https://github.com/autoneg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1aa8f525bbdfea4aa88541d4ca2d4d51c5db824d -
Trigger Event:
push
-
Statement type:
File details
Details for the file negmas_llm-0.4.3-py3-none-any.whl.
File metadata
- Download URL: negmas_llm-0.4.3-py3-none-any.whl
- Upload date:
- Size: 56.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
377ec9caea2be6330d217361da2a8c5b4ddd4793684e87f6897cf4c95d886b1c
|
|
| MD5 |
2d6f22c072e1c39635416dc2cff9b42b
|
|
| BLAKE2b-256 |
0abeadd9901dd8d8f0e40831c53933e06a3d9848d1aed74d0a117ad41c1ece66
|
Provenance
The following attestation bundles were made for negmas_llm-0.4.3-py3-none-any.whl:
Publisher:
publish.yml on autoneg/negmas-llm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
negmas_llm-0.4.3-py3-none-any.whl -
Subject digest:
377ec9caea2be6330d217361da2a8c5b4ddd4793684e87f6897cf4c95d886b1c - Sigstore transparency entry: 1532357661
- Sigstore integration time:
-
Permalink:
autoneg/negmas-llm@1aa8f525bbdfea4aa88541d4ca2d4d51c5db824d -
Branch / Tag:
refs/tags/v0.4.3 - Owner: https://github.com/autoneg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1aa8f525bbdfea4aa88541d4ca2d4d51c5db824d -
Trigger Event:
push
-
Statement type: