LLMs cannot directly access web page data. The web extractor accesses a URL and extracts its content for the model.
Usage
The web extractor can be called in four ways. The required parameters differ for each method:
OpenAI-compatible - Responses API
Add web_search and web_extractor to the tools parameter.
For better accuracy with mathematical or data analytics problems, also enable the
code_interpretertool.
# Import dependencies and create a client...
response = client.responses.create(
model="qwen3.8-max",
input="Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content",
tools=[
# To enable web extraction, also enable the web search tool
{"type": "web_search"},
{"type": "web_extractor"},
{"type": "code_interpreter"}
],
extra_body={
# Thinking mode must be enabled
"enable_thinking": True
}
)
print(response.output_text)
OpenAI-compatible - Chat Completions API
Set enable_search to true and search_strategy to agent_max. Also set enable_thinking to true.
Non-streaming output is not supported.
# Import dependencies and create a client...
completion = client.chat.completions.create(
model="qwen3.8-max",
messages=[{"role": "user", "content": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content"}],
extra_body={
"enable_thinking": True,
"enable_search": True,
"search_options": {"search_strategy": "agent_max"}
},
stream=True
)
DashScope
Set enable_search to true and search_strategy to agent_max. Also set enable_thinking to true.
Non-streaming output is not supported.
from dashscope import Generation
response = Generation.call(
model="qwen3.8-max",
messages=[{"role": "user", "content": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content"}],
enable_search=True,
search_options={"search_strategy": "agent_max"},
enable_thinking=True,
result_format="message",
stream=True,
incremental_output=True
)
Anthropic-compatible
Add the Anthropic server-side web fetch tool (name set to web_fetch) to the tools parameter to enable the web extractor. You must also add the web search tool (name set to web_search) in the same request. The endpoint is https://{WorkspaceId}.{region}.maas.aliyuncs.com/apps/anthropic.
This method targets Anthropic official clients such as Claude Code. In those clients, a plain natural-language question triggers the web extractor with no extra configuration.
When you call the API directly with the Anthropic SDK or over HTTP, pass the client identifier
x-anthropic-billing-header: cc_entrypoint=cli;insystem. Otherwise the web extractor does not take effect.
About the tool version: The date suffix in
type(for exampleweb_fetch_20250910andweb_search_20250305) is determined by the version of the Anthropic official client, and a newer client may send a different dated version. Model Studio identifies both tools by their category and does not validate the date suffix, so you do not need to pintypeto a specific version. Simply pass the value your client actually sends.
If you add the web fetch tool without the web search tool, the request fails with the
InvalidParametererror:The web_extractor tool must be executed with web_search tool.
Supported models: Qwen3.8 Max, Flash and open-source series (excluding Omni); Qwen3.7 Max, Plus and Flash series; Qwen3.6-Plus and Qwen3.6-Flash series; Qwen3.5-Plus and Qwen3.5-Flash series; deepseek-v4-pro, deepseek-v4-pro-0813, deepseek-v4-flash-0731; glm-5.2; kimi-k3.
# Import dependencies and create the client...
message = client.messages.create(
model="qwen3.8-max",
max_tokens=4096,
# Pass the client identifier
system=[{"type": "text", "text": "x-anthropic-billing-header: cc_entrypoint=cli;"}],
messages=[{"role": "user", "content": "Read the Alibaba Cloud Model Studio code interpreter documentation and summarize the key points."}],
tools=[
# Enabling the web extractor requires the web search tool as well
# The date suffix in type depends on the client version. The values below are the ones current Claude Code sends.
{"type": "web_search_20250305", "name": "web_search", "max_uses": 5},
{"type": "web_fetch_20250910", "name": "web_fetch", "max_uses": 5}
]
)
The extraction process is returned as server_tool_use (fetch request) and web_fetch_tool_result (fetch results) content blocks. The number of fetches is reported in usage.server_tool_use.web_fetch_requests.
Supported models
Recommended models
Responses API
Qwen-Max: Qwen3.8-Max series, Qwen3.7-Max series
Qwen-Plus: Qwen3.7-Plus series, Qwen3.6-Plus series, Qwen3.5-Plus series
DeepSeek: deepseek-v4-flash-0731, deepseek-v4-pro
GLM: glm-5.2
Qwen3.8 open-source series
Chat Completions API / DashScope
- Qwen-Max (thinking mode): Qwen3-Max series
- Qwen-Plus: Qwen3.5-Plus series
Other models
The following models also support this tool but may not perform as well as the recommended models. Only supported through the Responses API.
- Qwen-Flash: Qwen3.7-Flash series, Qwen3.6-Flash series, Qwen3.5-Flash series
- Qwen3.6 open-source series (except qwen3.6-27b)
- Qwen3.5 open-source series
Getting started
This example calls the web extractor through the Responses API to summarize a technical document.
You must get an API key and configure it as an environment variable.
import os
from openai import OpenAI
client = OpenAI(
# If the environment variable is not configured, replace the next line with api_key="sk-xxx", using your Model Studio API key.
api_key=os.getenv("DASHSCOPE_API_KEY"),
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
)
response = client.responses.create(
model="qwen3.8-max",
input="Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content",
tools=[
{
"type": "web_search"
},
{
"type": "web_extractor"
},
{
"type": "code_interpreter"
}
],
extra_body = {
"enable_thinking": True
}
)
# Uncomment the following line to view intermediate process outputs
# print(response.output)
print("="*20+"Response Content"+"="*20)
print(response.output_text)
# Print the number of tool calls
usage = response.usage
print("="*20+"Tool Call Count"+"="*20)
if hasattr(usage, 'x_tools') and usage.x_tools:
print(f"\nWeb extraction count: {usage.x_tools.get('web_extractor', {}).get('count', 0)}")
import OpenAI from "openai";
import process from 'process';
const openai = new OpenAI({
// If the environment variable is not configured, replace the next line with apiKey: "sk-xxx", using your Model Studio API key.
apiKey: process.env.DASHSCOPE_API_KEY,
// Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
});
async function main() {
const response = await openai.responses.create({
model: "qwen3.8-max",
input: "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content",
tools: [
{ type: "web_search" },
{ type: "web_extractor" },
{ type: "code_interpreter" }
],
enable_thinking: true
});
console.log("====================Response Content====================");
console.log(response.output_text);
// Print the number of tool calls
console.log("====================Tool Call Count====================");
if (response.usage && response.usage.x_tools) {
console.log(`Web extraction count: ${response.usage.x_tools.web_extractor?.count || 0}`);
console.log(`Web search count: ${response.usage.x_tools.web_search?.count || 0}`);
}
// Uncomment the following line to view intermediate process outputs
// console.log(JSON.stringify(response.output[0], null, 2));
}
main();
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.8-max",
"input": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content",
"tools": [
{"type": "web_search"},
{"type": "web_extractor"},
{"type": "code_interpreter"}
],
"enable_thinking": true
}'
Sample output:
====================Response Content====================
Based on the official Alibaba Cloud Model Studio documentation, I have summarized the core content of the **code interpreter** feature for you:
## 1. Feature Positioning
...
> **Document Source**: Alibaba Cloud Model Studio official documentation - [Qwen Code Interpreter](https://www.alibabacloud.com/help/model-studio/qwen-code-interpreter) and [Assistant API Code Interpreter](https://www.alibabacloud.com/help/model-studio/code-interpreter) (Updated: December 2025)
====================Tool Call Count====================
Web extraction count: 1
Streaming output
Web extraction can be time-consuming. Enable streaming output to receive intermediate results in real time.
Use the Responses API to retrieve intermediate tool execution status.
OpenAI-compatible - Responses API
import os
from openai import OpenAI
client = OpenAI(
# If the environment variable is not configured, replace the next line with api_key="sk-xxx" (not recommended), using your Model Studio API key.
api_key=os.getenv("DASHSCOPE_API_KEY"),
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
)
stream = client.responses.create(
model="qwen3.8-max",
input="Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content",
tools=[
{"type": "web_search"},
{"type": "web_extractor"},
{"type": "code_interpreter"}
],
stream=True,
extra_body={"enable_thinking": True}
)
reasoning_started = False
output_started = False
for chunk in stream:
# Print the thinking process
if chunk.type == 'response.reasoning_text.delta':
if not reasoning_started:
print("="*20 + "Thinking Process" + "="*20)
reasoning_started = True
print(chunk.delta, end='', flush=True)
# Print when tool call is complete
elif chunk.type == 'response.output_item.done':
if hasattr(chunk, 'item') and hasattr(chunk.item, 'type'):
if chunk.item.type == 'web_extractor_call':
print("\n" + "="*20 + "Tool Call" + "="*20)
print(chunk.item.goal)
print(chunk.item.output)
elif chunk.item.type == 'reasoning':
reasoning_started = False
# Print the response content
elif chunk.type == 'response.output_text.delta':
if not output_started:
print("\n" + "="*20 + "Response Content" + "="*20)
output_started = True
print(chunk.delta, end='', flush=True)
# When the response is complete, print the number of tool calls
elif chunk.type == 'response.completed':
print("\n" + "="*20 + "Tool Call Count" + "="*20)
usage = chunk.response.usage
if hasattr(usage, 'x_tools') and usage.x_tools:
print(f"Web extraction count: {usage.x_tools.get('web_extractor', {}).get('count', 0)}")
print(f"Web search count: {usage.x_tools.get('web_search', {}).get('count', 0)}")
import OpenAI from "openai";
import process from 'process';
const openai = new OpenAI({
// If the environment variable is not configured, replace the next line with apiKey: "sk-xxx", using your Model Studio API key.
apiKey: process.env.DASHSCOPE_API_KEY,
// Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
});
async function main() {
const stream = await openai.responses.create({
model: "qwen3.8-max",
input: "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content",
tools: [
{ type: "web_search" },
{ type: "web_extractor" },
{ type: "code_interpreter" }
],
stream: true,
enable_thinking: true
});
let reasoningStarted = false;
let outputStarted = false;
for await (const chunk of stream) {
// Print the thinking process
if (chunk.type === 'response.reasoning_text.delta') {
if (!reasoningStarted) {
console.log("====================Thinking Process====================");
reasoningStarted = true;
}
process.stdout.write(chunk.delta);
}
// Print when tool call is complete
else if (chunk.type === 'response.output_item.done') {
if (chunk.item && chunk.item.type === 'web_extractor_call') {
console.log("\n" + "====================Tool Call====================");
console.log(chunk.item.goal);
console.log(chunk.item.output);
} else if (chunk.item && chunk.item.type === 'reasoning') {
reasoningStarted = false;
}
}
// Print the response content
else if (chunk.type === 'response.output_text.delta') {
if (!outputStarted) {
console.log("\n" + "====================Response Content====================");
outputStarted = true;
}
process.stdout.write(chunk.delta);
}
// When the response is complete, print the number of tool calls
else if (chunk.type === 'response.completed') {
console.log("\n" + "====================Tool Call Count====================");
const usage = chunk.response.usage;
if (usage && usage.x_tools) {
console.log(`Web extraction count: ${usage.x_tools.web_extractor?.count || 0}`);
console.log(`Web search count: ${usage.x_tools.web_search?.count || 0}`);
}
}
}
}
main();
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.8-max",
"input": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content",
"tools": [
{"type": "web_search"},
{"type": "web_extractor"},
{"type": "code_interpreter"}
],
"enable_thinking": true,
"stream": true
}'
OpenAI-compatible - Chat Completions API
import os
from openai import OpenAI
client = OpenAI(
# If the environment variable is not configured, replace the next line with api_key="sk-xxx" (not recommended), using your Model Studio API key.
api_key=os.getenv("DASHSCOPE_API_KEY"),
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
)
stream = client.chat.completions.create(
model="qwen3.8-max",
messages=[
{"role": "user", "content": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content"}
],
extra_body={
"enable_thinking": True,
"enable_search": True,
"search_options": {"search_strategy": "agent_max"}
},
stream=True
)
reasoning_started = False
output_started = False
for chunk in stream:
if chunk.choices:
delta = chunk.choices[0].delta
# Print the thinking process
if hasattr(delta, 'reasoning_content') and delta.reasoning_content:
if not reasoning_started:
print("="*20 + "Thinking Process" + "="*20)
reasoning_started = True
print(delta.reasoning_content, end='', flush=True)
# Print the response content
if delta.content:
if not output_started:
print("\n" + "="*20 + "Response Content" + "="*20)
output_started = True
print(delta.content, end='', flush=True)
import OpenAI from "openai";
import process from 'process';
const openai = new OpenAI({
// If the environment variable is not configured, replace the next line with apiKey: "sk-xxx", using your Model Studio API key.
apiKey: process.env.DASHSCOPE_API_KEY,
// Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
});
async function main() {
const stream = await openai.chat.completions.create({
model: "qwen-max",
messages: [
{ role: "user", content: "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content" }
],
enable_thinking: true,
enable_search: true,
search_options: { search_strategy: "agent_max" },
stream: true
});
let reasoningStarted = false;
let outputStarted = false;
for await (const chunk of stream) {
if (chunk.choices && chunk.choices.length > 0) {
const delta = chunk.choices[0].delta;
// Print the thinking process
if (delta.reasoning_content) {
if (!reasoningStarted) {
console.log("====================Thinking Process====================");
reasoningStarted = true;
}
process.stdout.write(delta.reasoning_content);
}
// Print the response content
if (delta.content) {
if (!outputStarted) {
console.log("\n" + "====================Response Content====================");
outputStarted = true;
}
process.stdout.write(delta.content);
}
}
}
}
main();
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-max",
"messages": [
{"role": "user", "content": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content"}
],
"enable_thinking": true,
"enable_search": true,
"search_options": {"search_strategy": "agent_max"},
"stream": true
}'
DashScope
The Java SDK is not supported.
import os
import dashscope
from dashscope import Generation
# If the environment variable is not configured, replace the next line with dashscope.api_key = "sk-xxx", using your Model Studio API key.
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"
response = Generation.call(
model="qwen3.8-max",
messages=[
{"role": "user", "content": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content"}
],
enable_search=True,
search_options={"search_strategy": "agent_max"},
enable_thinking=True,
result_format="message",
stream=True,
incremental_output=True
)
reasoning_started = False
output_started = False
for chunk in response:
if chunk.status_code == 200:
message = chunk.output.choices[0].message
# Print the thinking process
if hasattr(message, 'reasoning_content') and message.reasoning_content:
if not reasoning_started:
print("="*20 + "Thinking Process" + "="*20)
reasoning_started = True
print(message.reasoning_content, end='', flush=True)
# Print the response content
if hasattr(message, 'content') and message.content:
if not output_started:
print("\n" + "="*20 + "Response Content" + "="*20)
output_started = True
print(message.content, end='', flush=True)
else:
print(f"\nRequest failed: code={chunk.code}, message={chunk.message}")
break
# Singapore region. Replace {WorkspaceId} with your actual Workspace ID. URLs vary by region.
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/text-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "X-DashScope-SSE: enable" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-max",
"input": {
"messages": [
{
"role": "user",
"content": "Please visit the official Alibaba Cloud Model Studio documentation for the code interpreter and summarize its main content"
}
]
},
"parameters": {
"enable_thinking": true,
"enable_search": true,
"search_options": {
"search_strategy": "agent_max"
},
"result_format": "message"
}
}'
Billing
Billing includes:
-
Model call fees: Content extracted from the web page is added to the prompt, increasing input token count. These tokens are billed at the model's standard rate. For pricing details, see the Model Studio console.
-
Tool call fees: Includes web extraction and web search.
-
Web search fees per 1,000 calls:
- China (Beijing), US (Virginia), China (Hong Kong), Japan (Tokyo), and Germany (Frankfurt) regions: $0.57341.
- Singapore region: $10.00.
-
The web extractor is free for a limited time.
-