import * as vscode from 'vscode'; import { execSync } from 'child_process'; import objectList from './objectList'; // 缓存对象列表和查询结果 let objectListCache: string | null = null; const objectInfoCache = new Map(); /** * 重置对象信息缓存 */ export function resetObjectCache(): void { objectListCache = null; objectInfoCache.clear(); } /** * 获取对象列表 * @returns 对象列表内容 */ export function getObjectList(): string { if (objectListCache === null) { objectListCache = objectList().content; } return objectListCache; } /** * 根据用户请求查找相关对象 * @param prompt 用户请求文本 * @param token 取消令牌 * @returns 解析后的对象列表和详细信息 */ export async function getObjectsInfo( prompt: string, model: vscode.LanguageModelChat, token: vscode.CancellationToken ): Promise { // 获取对象列表 const objList = getObjectList(); if (objList) { // 使用语言模型匹配对象 const object = await model.sendRequest([vscode.LanguageModelChatMessage.User(` 对象集合信息如下:${objList}。 请严格从以下内容中查找匹配的对象信息:'${prompt}'。 匹配规则: • 仅从对象集合中精确查找是否包含在'${prompt}'中提及的对象。 • '${prompt}'中的关键字与对象objname匹配,包含或是相近。 • 如果未找到任何匹配对象,请返回[]。 • 如果找到匹配对象,仅返回文本格式的数组,格式如下: [ {"apiname":"xxx","objname":"xxx","objprefix":"xxx"}, {"apiname":"xxx","objname":"xxx","objprefix":"xxx"} ] 注意: • 不要返回 Markdown 格式。 • 不要添加任何额外文本、注释或说明。 • 严格按照上述格式返回数据。`)], {}, token); let objects = ""; for await (const fragment of object.text) { objects += fragment; } let objectsInfo = ""; if (objects) { try { const parsedObjects = JSON.parse(objects); if (parsedObjects.length < 6) { for (const obj of parsedObjects) { // 如果缓存中没有该对象信息,则查询并缓存 if (!objectInfoCache.has(obj.apiname)) { const result = execSync( `cc get object ${vscode.workspace.rootPath} fields ${encodeURI(JSON.stringify(obj))}` ).toString("utf8").trim(); if (result) { objectInfoCache.set(obj.apiname, result); objectsInfo += result; } } else { // 从缓存中获取结果 objectsInfo += objectInfoCache.get(obj.apiname); } } } } catch (error) { console.error("Error parsing objects:", error); } } return objectsInfo; } return ""; // Ensure a default return value if no objects are found }