Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 72 additions & 2 deletions gui_agents/s2/core/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ def __init__(
model=None,
api_version=None,
rate_limit=-1,
**kwargs
**kwargs,
):
assert model is not None, "model must be provided"
self.model = model
Expand Down Expand Up @@ -390,7 +390,7 @@ def generate(
top_p=0.8,
repetition_penalty=1.05,
max_new_tokens=512,
**kwargs
**kwargs,
):
api_key = self.api_key or os.getenv("vLLM_API_KEY")
if api_key is None:
Expand Down Expand Up @@ -483,3 +483,73 @@ def generate(self, messages, temperature=0.0, max_new_tokens=None, **kwargs):
.choices[0]
.message.content
)


class LMMEngineMiniMax(LMMEngine):
_UNSUPPORTED_PARAMS = frozenset(
[
"top_k",
"stop_sequences",
"service_tier",
"mcp_servers",
"context_management",
"container",
]
)

def __init__(
self,
base_url=None,
api_key=None,
model=None,
temperature=None,
**kwargs,
):
assert model is not None, "model must be provided"
self.model = model
self.base_url = base_url
self.api_key = api_key
self.llm_client = None
self.temperature = temperature

@backoff.on_exception(
backoff.expo, (APIConnectionError, APIError, RateLimitError), max_time=60
)
def generate(self, messages, temperature=0.0, max_new_tokens=None, **kwargs):
api_key = self.api_key or os.getenv("MINIMAX_API_KEY")
if api_key is None:
raise ValueError(
"An API Key needs to be provided in either the api_key parameter or as an environment variable named MINIMAX_API_KEY"
)
base_url = (
self.base_url
or os.getenv("MINIMAX_BASE_URL")
or "https://api.minimax.io/anthropic"
)
if not self.llm_client:
from anthropic import Anthropic as _Anthropic

self.llm_client = _Anthropic(api_key=api_key, base_url=base_url)
# Use instance temperature if set, otherwise use generate argument
temp = self.temperature if self.temperature is not None else temperature
# MiniMax temperature must be in (0.0, 1.0]; clamp to 1.0 if not positive
if temp <= 0.0:
temp = 1.0
# Filter out parameters not supported by MiniMax
filtered_kwargs = {
k: v for k, v in kwargs.items() if k not in self._UNSUPPORTED_PARAMS
}
system_text = messages[0]["content"][0]["text"]
conversation = messages[1:]
return (
self.llm_client.messages.create(
model=self.model,
system=system_text,
messages=conversation,
max_tokens=max_new_tokens if max_new_tokens else 4096,
temperature=temp,
**filtered_kwargs,
)
.content[0]
.text
)
7 changes: 5 additions & 2 deletions gui_agents/s2/core/mllm.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
LMMEngineParasail,
LMMEnginevLLM,
LMMEngineGemini,
LMMEngineMiniMax,
)


Expand All @@ -35,6 +36,8 @@ def __init__(self, engine_params=None, system_prompt=None, engine=None):
self.engine = LMMEngineOpenRouter(**engine_params)
elif engine_type == "parasail":
self.engine = LMMEngineParasail(**engine_params)
elif engine_type == "minimax":
self.engine = LMMEngineMiniMax(**engine_params)
else:
raise ValueError("engine_type is not supported")
else:
Expand Down Expand Up @@ -180,8 +183,8 @@ def add_message(

self.messages.append(message)

# For API-style inference from Anthropic
elif isinstance(self.engine, LMMEngineAnthropic):
# For API-style inference from Anthropic or MiniMax (Anthropic-compatible)
elif isinstance(self.engine, (LMMEngineAnthropic, LMMEngineMiniMax)):
# infer role from previous message
if role != "user":
if self.messages[-1]["role"] == "system":
Expand Down
70 changes: 70 additions & 0 deletions gui_agents/s2_5/core/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,3 +439,73 @@ def generate(self, messages, temperature=0.0, max_new_tokens=None, **kwargs):
.choices[0]
.message.content
)


class LMMEngineMiniMax(LMMEngine):
_UNSUPPORTED_PARAMS = frozenset(
[
"top_k",
"stop_sequences",
"service_tier",
"mcp_servers",
"context_management",
"container",
]
)

def __init__(
self,
base_url=None,
api_key=None,
model=None,
temperature=None,
**kwargs,
):
assert model is not None, "model must be provided"
self.model = model
self.base_url = base_url
self.api_key = api_key
self.llm_client = None
self.temperature = temperature

@backoff.on_exception(
backoff.expo, (APIConnectionError, APIError, RateLimitError), max_time=60
)
def generate(self, messages, temperature=0.0, max_new_tokens=None, **kwargs):
api_key = self.api_key or os.getenv("MINIMAX_API_KEY")
if api_key is None:
raise ValueError(
"An API Key needs to be provided in either the api_key parameter or as an environment variable named MINIMAX_API_KEY"
)
base_url = (
self.base_url
or os.getenv("MINIMAX_BASE_URL")
or "https://api.minimax.io/anthropic"
)
if not self.llm_client:
from anthropic import Anthropic as _Anthropic

self.llm_client = _Anthropic(api_key=api_key, base_url=base_url)
# Use instance temperature if set, otherwise use generate argument
temp = self.temperature if self.temperature is not None else temperature
# MiniMax temperature must be in (0.0, 1.0]; clamp to 1.0 if not positive
if temp <= 0.0:
temp = 1.0
# Filter out parameters not supported by MiniMax
filtered_kwargs = {
k: v for k, v in kwargs.items() if k not in self._UNSUPPORTED_PARAMS
}
system_text = messages[0]["content"][0]["text"]
conversation = messages[1:]
return (
self.llm_client.messages.create(
model=self.model,
system=system_text,
messages=conversation,
max_tokens=max_new_tokens if max_new_tokens else 4096,
temperature=temp,
**filtered_kwargs,
)
.content[0]
.text
)
7 changes: 5 additions & 2 deletions gui_agents/s2_5/core/mllm.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
LMMEngineParasail,
LMMEnginevLLM,
LMMEngineGemini,
LMMEngineMiniMax,
)


Expand All @@ -35,6 +36,8 @@ def __init__(self, engine_params=None, system_prompt=None, engine=None):
self.engine = LMMEngineOpenRouter(**engine_params)
elif engine_type == "parasail":
self.engine = LMMEngineParasail(**engine_params)
elif engine_type == "minimax":
self.engine = LMMEngineMiniMax(**engine_params)
else:
raise ValueError("engine_type is not supported")
else:
Expand Down Expand Up @@ -180,8 +183,8 @@ def add_message(

self.messages.append(message)

# For API-style inference from Anthropic
elif isinstance(self.engine, LMMEngineAnthropic):
# For API-style inference from Anthropic or MiniMax (Anthropic-compatible)
elif isinstance(self.engine, (LMMEngineAnthropic, LMMEngineMiniMax)):
# infer role from previous message
if role != "user":
if self.messages[-1]["role"] == "system":
Expand Down
70 changes: 70 additions & 0 deletions gui_agents/s3/core/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -443,3 +443,73 @@ def generate(self, messages, temperature=0.0, max_new_tokens=None, **kwargs):
.choices[0]
.message.content
)


class LMMEngineMiniMax(LMMEngine):
_UNSUPPORTED_PARAMS = frozenset(
[
"top_k",
"stop_sequences",
"service_tier",
"mcp_servers",
"context_management",
"container",
]
)

def __init__(
self,
base_url=None,
api_key=None,
model=None,
temperature=None,
**kwargs,
):
assert model is not None, "model must be provided"
self.model = model
self.base_url = base_url
self.api_key = api_key
self.llm_client = None
self.temperature = temperature

@backoff.on_exception(
backoff.expo, (APIConnectionError, APIError, RateLimitError), max_time=60
)
def generate(self, messages, temperature=0.0, max_new_tokens=None, **kwargs):
api_key = self.api_key or os.getenv("MINIMAX_API_KEY")
if api_key is None:
raise ValueError(
"An API Key needs to be provided in either the api_key parameter or as an environment variable named MINIMAX_API_KEY"
)
base_url = (
self.base_url
or os.getenv("MINIMAX_BASE_URL")
or "https://api.minimax.io/anthropic"
)
if not self.llm_client:
from anthropic import Anthropic as _Anthropic

self.llm_client = _Anthropic(api_key=api_key, base_url=base_url)
# Use instance temperature if set, otherwise use generate argument
temp = self.temperature if self.temperature is not None else temperature
# MiniMax temperature must be in (0.0, 1.0]; clamp to 1.0 if not positive
if temp <= 0.0:
temp = 1.0
# Filter out parameters not supported by MiniMax
filtered_kwargs = {
k: v for k, v in kwargs.items() if k not in self._UNSUPPORTED_PARAMS
}
system_text = messages[0]["content"][0]["text"]
conversation = messages[1:]
return (
self.llm_client.messages.create(
model=self.model,
system=system_text,
messages=conversation,
max_tokens=max_new_tokens if max_new_tokens else 4096,
temperature=temp,
**filtered_kwargs,
)
.content[0]
.text
)
7 changes: 5 additions & 2 deletions gui_agents/s3/core/mllm.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
LMMEngineParasail,
LMMEnginevLLM,
LMMEngineGemini,
LMMEngineMiniMax,
)


Expand All @@ -35,6 +36,8 @@ def __init__(self, engine_params=None, system_prompt=None, engine=None):
self.engine = LMMEngineOpenRouter(**engine_params)
elif engine_type == "parasail":
self.engine = LMMEngineParasail(**engine_params)
elif engine_type == "minimax":
self.engine = LMMEngineMiniMax(**engine_params)
else:
raise ValueError(f"engine_type '{engine_type}' is not supported")
else:
Expand Down Expand Up @@ -180,8 +183,8 @@ def add_message(

self.messages.append(message)

# For API-style inference from Anthropic
elif isinstance(self.engine, LMMEngineAnthropic):
# For API-style inference from Anthropic or MiniMax (Anthropic-compatible)
elif isinstance(self.engine, (LMMEngineAnthropic, LMMEngineMiniMax)):
# infer role from previous message
if role != "user":
if self.messages[-1]["role"] == "system":
Expand Down
10 changes: 9 additions & 1 deletion models.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
We support the following APIs for MLLM inference: OpenAI, Anthropic, Gemini, Azure OpenAI, vLLM for local models, and Open Router. To use these APIs, you need to set the corresponding environment variables:
We support the following APIs for MLLM inference: OpenAI, Anthropic, Gemini, Azure OpenAI, vLLM for local models, Open Router, and MiniMax. To use these APIs, you need to set the corresponding environment variables:

1. OpenAI

Expand Down Expand Up @@ -55,6 +55,14 @@ agent = AgentS2_5(
)
```

7. MiniMax

```
export MINIMAX_API_KEY=<YOUR_API_KEY>
```

Supported models: `MiniMax-M3` (default, 512K context, 128K max output, image input support), `MiniMax-M2.7`, `MiniMax-M2.7-highspeed`

To use the underlying Multimodal Agent (LMMAgent) which wraps LLMs with message handling functionality, you can use the following code snippet:

```python
Expand Down
Loading