All Products
Search
Document Center

Alibaba Cloud Model Studio:Web extractor

Last Updated:Oct 11, 2026

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_interpreter tool.

# 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; in system. Otherwise the web extractor does not take effect.

About the tool version: The date suffix in type (for example web_fetch_20250910 and web_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 pin type to 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 InvalidParameter error: 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

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.