GLM Model

agentscope-extensions-model-openai provides first-class GLM (Zhipu AI / Z.AI) support through the OpenAI-compatible model stack. Add the OpenAI model extension module, then use glm:<model> with ModelRegistry.

Add the dependency

<dependency>
    <groupId>io.agentscope</groupId>
    <artifactId>agentscope-extensions-model-openai</artifactId>
    <version>${agentscope.version}</version>
</dependency>

ModelRegistry

Set ZAI_API_KEY, GLM_API_KEY, or ZHIPUAI_API_KEY, then use the glm:<model> id:

ReActAgent agent = ReActAgent.builder()
    .name("assistant")
    .model("glm:glm-5.2") // Resolved internally by ModelRegistry.resolve(modelId)
    .build();

The provider defaults to https://open.bigmodel.cn/api/paas/v4, strips the glm: prefix before sending the model name, and uses the GLM formatter from io.agentscope.extensions.model.openai.compat.glm.

Thinking mode

Pass GLM thinking options through GenerateOptions when resolving the model:

import io.agentscope.core.model.GenerateOptions;
import io.agentscope.core.model.Model;
import io.agentscope.core.model.ModelCreationContext;
import io.agentscope.core.model.ModelRegistry;
import java.util.Map;

Model model = ModelRegistry.resolve(
    "glm:glm-5.2",
    ModelCreationContext.builder()
        .component(
            GenerateOptions.class,
            GenerateOptions.builder()
                .additionalBodyParam("thinking", Map.of("type", "disabled"))
                .reasoningEffort("max")
                .build())
        .build());

GLM-4.7 and GLM-5 series enable thinking by default. GLM-5.2 also supports reasoning_effort, and streaming tool-call arguments can be enabled with additionalBodyParam("tool_stream", true).

Compatibility notes

The GLM formatter adapts OpenAI-style requests to the GLM chat-completions API. It ensures at least one user message exists, removes unsupported message name fields, omits tool schema strict, and strips unsupported request fields such as frequency_penalty, presence_penalty, thinking_budget, and stream_options.

GLM only supports max_tokens, so max_completion_tokens is mapped to max_tokens when max_tokens is not already set. temperature and top_p are clamped to the GLM-supported ranges.

GLM only accepts tool_choice=auto. Forced choices are degraded to auto; ToolChoice.None removes tools from the request to preserve the no-tool-call contract.

Structured output uses the normal AgentScope fallback behavior by default because GLM response_format only supports json_object. Only enable native structured output when you have confirmed the target endpoint supports the behavior you need.

For compatible or self-hosted endpoints, pass baseUrl, endpointPath, generation options, or formatter overrides through ModelCreationContext.