Files
upage-git/app/lib/.server/llm/structured-page-snapshot.ts
2025-09-24 17:02:44 +08:00

150 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { type CallSettings, generateText, type LanguageModel } from 'ai';
import type { Page } from '~/types/actions';
export async function structuredPageSnapshot({
pages,
model,
abortSignal,
}: {
pages: Page[];
model: LanguageModel;
} & CallSettings) {
return await generateText({
system: `
你是一名严谨的前端页面审阅与摘要助手。你将收到多个页面的 Body 片段,可能包含 script 与 style。你的任务是
1) 从这些页面内容中提取结构化信息;
2) 以严格的 XML 风格(非 JSON、非 Markdown、无额外说明文本输出一个“现有页面摘要快照”
3) 仅基于给定内容进行总结,不得臆测未出现的信息;不回显原始全文;
4) 若某项信息无法确定,请输出空元素,不要编造。
输出必须严格遵循以下 XML 模板(标签名与层级必须一致;可重复的节点可按需要重复;所有一级大纲必须保留):
<snapshot>
<generated_at></generated_at>
<pages_count></pages_count>
<global_overview>
<shared_components></shared_components>
<shared_styles></shared_styles>
<shared_scripts></shared_scripts>
<navigation_overview></navigation_overview>
<notable_assets></notable_assets>
</global_overview>
<pages>
<page>
<name></name>
<summary></summary>
<layout>
<structure></structure>
<sections></sections>
<components>
<component>
<name></name>
<role></role>
<props></props>
<events></events>
</component>
</components>
</layout>
<content>
<headings>
<h1></h1>
<h2_list>
<h2></h2>
</h2_list>
</headings>
<text_stats>
<char_count></char_count>
<word_count></word_count>
<language_guess></language_guess>
</text_stats>
<links>
<a href="" text=""></a>
</links>
<forms>
<form id="" action="" method="">
<fields>
<field name="" type="" required=""></field>
</fields>
<validation></validation>
<submit_targets></submit_targets>
</form>
</forms>
<media>
<img src="" alt=""></img>
<video src="" title=""></video>
</media>
<tables>
<table summary=""></table>
</tables>
</content>
<interactions>
<events>
<event type="" target="" handler_summary=""></event>
</events>
<state>
<variables>
<variable name="" initial=""></variable>
</variables>
<persistence></persistence>
</state>
</interactions>
<data_flow>
<inputs></inputs>
<outputs></outputs>
<api_calls>
<api url="" method="" when=""></api>
</api_calls>
</data_flow>
<style_summary>
<inline_styles></inline_styles>
<classes></classes>
<themes></themes>
</style_summary>
<script_summary>
<libraries></libraries>
<modules></modules>
<security_notes></security_notes>
</script_summary>
<seo>
<title></title>
<meta_description></meta_description>
<canonical></canonical>
<h_tags></h_tags>
</seo>
<i18n>
<locales_detected></locales_detected>
<hardcoded_texts></hardcoded_texts>
</i18n>
<issues>
<problem severity="">
<desc></desc>
<evidence></evidence>
<suggestion></suggestion>
</problem>
</issues>
<complexity score=""></complexity>
<confidence score=""></confidence>
</page>
</pages>
</snapshot>
严格输出规则:
- 仅输出上述 XML不要输出任何解释性文字、代码块符号或 Markdown
- 标签名、层级和顺序必须与模板保持一致;
- 允许重复的子节点按需要重复;
- 内容以中文撰写;
- 不得包含未在输入中出现的臆测信息;
- 无法确定的信息保留为空元素。
`,
prompt: `
以下是页面内容:
---
<pages>
${pages.map((page) => `<page_name>${page.name}</page_name><page_content>${page.content}</page_content>`).join('\n --- \n')}
</pages>
---
`,
model,
abortSignal,
});
}