# 网页解析插件功能说明

> 全部文档的索引见 [llms.txt](https://ark.volcengine.com/llms.txt)；在任一文档页面地址后追加 `.md` 可获取该页的 Markdown 版本。

网页解析插件可获取和解析 URL 链接下的标题和内容。支持用户快速提取和检索网页、PDF 等内容中有价值的信息。

<span id="intro"></span>
## 基本信息

* 插件名称：网页解析。
* 组件说明：
  * 一次调用最多可解析 3 个 URL 内容。
  * 支持网页、.pdf、.txt、.csv、.docx、.doc、.xlsx、.xls、.pptx、.ppt、.md、.mobi、.epub 格式文件的内容获取。
  * 当前支持接入 Doubao 系列拥有函数调用能力的模型，详见[工具调用能力](/docs/model-list#f44ceef7)。
* 默认限流：1 QPS；60 RPM。
* 计费说明：限时免费；使用插件可能产生模型更多 Tokens 消耗。

> **说明**
>
> 网页解析插件暂不支持与其他插件同时开启使用。

<span id="advantages"></span>
## 功能优势

* **精准解析网页**： 支持通过 URL 快速、准确地解析网页、.pdf、.txt、.csv、.docx、.doc、.xlsx、.xls、.pptx、.ppt、.md、.mobi、.epub 格式文件的内容，可接入模型进行高效使用。
* **高效操作流程**：用户仅需提供 URL 链接，即可完成网页的完整解析，无需繁琐复杂的操作步骤。

<span id="use-cases"></span>
## 应用场景

可高效满足广泛的业务需求，无论是内容聚合、市场分析还是自动化报告生成，本插件都能提供强大支持，接入大模型可助力业务决策和信息整合

* **市场分析**： 可用于解析网站信息，帮助企业进行市场趋势调研和竞品分析，为市场定位和策略制定提供支持
* **新闻聚合**： 整合来自不同内容源的最新新闻信息，形成信息概览
* **学习教育**： 获取教育资料和学术文章，支持学习教育场景下的高效学习和研究

<span id="basic-usage"></span>
# 基本用法

<span id="0a6e949c"></span>
### 通过零代码应用调用

您可在控制台的直接创建带网页解析插件的应用，无需自己实现插件调用代码，详情请查看[零代码应用操作指南](/docs/no-code-app-guide)。
后续您可通过[应用(bot) API](/docs/bot-api)调用已添加网页解析插件的零代码应用。

<span id="04455882"></span>
### 自行实现插件调用

您也可以自行通过大模型调用插件的代码，下面是示例代码。

<span id="non-function-call"></span>
#### 非函数调用方式

使用 arkitect 框架，可兼容不支持函数调用的模型。

> 需安装 arkitect 0.1.x 版本（同时要求 python 版本小于 3.12.0），`pip install 'arkitect<0.2.0' --index-url https://pypi.org/simple`

```Python
from typing import AsyncIterable, Union
import asyncio

from arkitect.core.component.llm import BaseChatLanguageModel

from arkitect.core.component.llm.model import (
    ArkChatCompletionChunk,
    ArkChatParameters,
    ArkChatRequest,
    ArkChatResponse,
    Response,
)
from arkitect.core.component.tool import LinkReader, ArkToolResponse
from arkitect.telemetry.trace import task

# 替换为您的推理接入点 https://ark.volcengine.com/region:cn-beijing/docs/online-inference-standard#1739de09
endpoint_id = "<YOUR_ENDPOINT_ID>"

def prepare_prompt(link_resp: ArkToolResponse) -> str:
    prompt = "以下内容为用户输入网页及相关内容："
    for url_data in link_resp.data.get("ark_web_data_list", []):
        prompt += f"网页链接：{url_data.get('url', '')}\\n网页Title：{url_data.get('title', '')}\\n网页内容：{url_data.get('content', '')}\\n\\n"

    prompt += "请总结并输出以上网页内容"
    return prompt

@task()
async def default_model_calling(
    request: ArkChatRequest,
) -> AsyncIterable[Union[ArkChatCompletionChunk, ArkChatResponse]]:
    parameters = ArkChatParameters(**request.__dict__)

    llm = BaseChatLanguageModel(
        endpoint_id=endpoint_id,
        messages=request.messages,
        parameters=parameters,
    )
    if request.stream:
        async for resp in llm.astream():
            yield resp
    else:
        yield await llm.arun()

@task()
async def link_reader(url: str) -> AsyncIterable[Response]:
    link_resp: ArkToolResponse = await LinkReader().executor(parameters={"url_list":[url]})

    prompt = prepare_prompt(link_resp)
    request = ArkChatRequest(
        # 替换模型为您需要使用的模型，https://ark.volcengine.com/region:cn-beijing/docs/model-list
        model="doubao-seed-2-1-pro-260915",
        stream=True,
        messages=[{"role": "user", "content": prompt}],
    )

    async for resp in default_model_calling(request):
        print(resp.choices[0].delta.content, end="", flush=True)


if __name__ == "__main__":
    # 替换为您需要解析的网页地址
    url = "https://www.toutiao.com/"
    asyncio.run(link_reader(url))
```

启动方式：

请将以下示例代码中的`<ARK_API_KEY>`替换为真实值。

```Bash
export ARK_API_KEY=<ARK_API_KEY>
python3 main.py
```

结果预览：

```Text
该网页内容丰富多样，涵盖众多领域资讯：
1. **时政要闻**：探讨总书记强调“经济大省挑大梁”原因；***
2. **科技动态**：直击“星舰”第八次试飞现场情况；***
3. **财经消息**：美股下跌英伟达市值蒸发、欧洲央行降息、《哪吒 2》票房等财经数据。
4. **生活常识**：探讨早晨吃水煮鸡蛋对身体的影响，尤其对肝不好人群的影响。
5. **企业动态**：滴滴四月份调整政策，***
6. **国际局势**：乌方称泽连斯基没给特朗普写信，***
```

<span id="function-call"></span>
#### 函数调用方式

模型需具备 [函数调用能力](/docs/model-list#f44ceef7)，下面是示例代码。

> 需安装 arkitect 0.1.x 版本（同时要求 python 版本小于 3.12.0），`pip install 'arkitect<0.2.0' --index-url https://pypi.org/simple`

```Python
import os
from typing import AsyncIterable, Union

from arkitect.core.component.llm import BaseChatLanguageModel

from arkitect.core.component.llm.model import (
    ArkChatCompletionChunk,
    ArkChatParameters,
    ArkChatRequest,
    ArkChatResponse,
    Response,
)
from arkitect.core.component.tool import LinkReader, ToolPool
from arkitect.launcher.local.serve import launch_serve
from arkitect.telemetry.trace import task

endpoint_id = "<YOUR_ENDPOINT_ID>"

@task()
async def default_model_calling(
    request: ArkChatRequest,
) -> AsyncIterable[Union[ArkChatCompletionChunk, ArkChatResponse]]:
    parameters = ArkChatParameters(**request.__dict__)
    ToolPool.register(LinkReader())

    llm = BaseChatLanguageModel(
        endpoint_id=endpoint_id,
        messages=request.messages,
        parameters=parameters,
    )
    if request.stream:
        async for resp in llm.astream(functions=ToolPool.all()):
            yield resp
    else:
        yield await llm.arun(functions=ToolPool.all())


@task()
async def main(request: ArkChatRequest) -> AsyncIterable[Response]:
    async for resp in default_model_calling(request):
        yield resp


if __name__ == "__main__":
    port = os.getenv("_FAAS_RUNTIME_PORT")
    launch_serve(
        package_path="main",
        port=int(port) if port else 8080,
        health_check_path="/v1/ping",
        endpoint_path="/api/v3/bots/chat/completions",
        clients={},
    )
```

启动服务：

请将以下示例代码中的`<ARK_API_KEY>`替换为真实值。

```PowerShell
export ARK_API_KEY=<ARK_API_KEY>
python3 main.py
```

调用方式：

```PowerShell
curl --location 'http://localhost:8080/api/v3/bots/chat/completions' \\
--header 'Content-Type: application/json' \\
--data '{
    "model": "doubao-seed-2-1-pro-260915",
    "messages": [
        {
            "role": "user",
            "content": "https://www.toutiao.com/ 这个网站讲了什么"
        }
    ]
}'
```

返回结果预览：

```json
{
    "error": null,
    "id": "0217***",
    "choices": [
        {
            "finish_reason": "stop",
            "moderation_hit_type": null,
            "index": 0,
            "logprobs": null,
            "message": {
                "content": "\\n用户想获取网站内容，调用LinkReader/LinkReader函数获取信息。这是今日头条的网页信息，包含了多个热点事件和人物故事的讨论：\\n- **政策与建议**：全国人大代表李镇西建议将寒假设为法定节假日；\\n- **财经与商业**：多家企业发布动态，如巴菲特旗下伯克希尔·哈撒韦公司市值蒸发、苹果股价创新高、欧洲央行降息等；《哪吒2》票房突破146亿元。\\n- **科技与航空**：直捣“星链”第八次试飞现场，“悟空号”成功再现，但二级火箭失联；马斯克欲发射飞船接人，却遭美国宇航局拒绝。\\n- **人物故事**：介绍了超级富豪马斯克，虽身价高昂，但他自称像普通打工仔，成长经历坎坷，母亲梅耶·马斯克给予其重要支持；梅耶·马斯克一生传奇，48岁重新学习考试，60岁回归T台，69岁登上美国时代广场，她的自传《人生由我》鼓励人们积极面对生活。 ",
                "role": "assistant",
                "function_call": null,
                "tool_calls": null,
                "audio": null,
                "reasoning_content": null
            }
        }
    ],
    "created": 1741840746,
    "model": "doubao-seed-2-1-pro-260915",
    "object": "chat.completion",
    "usage": {
        "completion_tokens": 340,
        "prompt_tokens": 13116,
        "total_tokens": 13456,
        "prompt_tokens_details": {
            "cached_tokens": 0
        },
        "completion_tokens_details": {
            "reasoning_tokens": 0
        }
    },
    "bot_usage": null,
    "metadata": null
}
```
