All Products
Search
Document Center

Alibaba Cloud Model Studio:Web extractor

Last Updated:Jun 17, 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 three ways. The required parameters differ for each method:

OpenAI-compatible - Responses API

Add web_search and web_extractor to the tools parameter.

When using qwen3-max-2026-01-23, set enable_thinking to true.
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.7-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.7-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.7-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
)

Supported models

Recommended models

Responses API

Qwen-Max: Qwen3.7-Max series

Qwen-Plus: Qwen3.7-Plus series, Qwen3.6-Plus series, Qwen3.5-Plus series

Chat Completions API / DashScope

  • Qwen-Max (thinking mode): Qwen3-Max series

  • Qwen-Plus: Qwen3.6-Plus series, Qwen3.5-Plus series

Other models

The following models also support this tool but may not perform as well as the recommended models.

  • Qwen-Flash: 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.7-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.7-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();
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.7-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/en/model-studio/qwen-code-interpreter) and [Assistant API Code Interpreter](https://www.alibabacloud.com/help/en/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.7-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_summary_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.7-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_summary_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();
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.7-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.7-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: "qwen3.7-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();
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": "qwen3.7-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.7-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
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": "qwen3.7-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:

      • Chinese mainland and Global deployment scopes: $0.57341.

      • International deployment scope: $10.00.

    • The web extractor is free for a limited time.