@huyooo/ai-chat-core 0.3.14 → 0.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -48,4 +48,4 @@ import{FormatRegistry as e,Kind as t,Type as n,Type as r}from"@sinclair/typebox"
|
|
|
48
48
|
【用户指令】
|
|
49
49
|
`+e.skillContents.join(`
|
|
50
50
|
|
|
51
|
-
`));let i=this.findSearchTool();return e.enableWebSearch&&i&&(r+=`\n\n【联网搜索】当用户问题需要实时信息/最新事实/可引用来源时,请先调用 ${i.name} 工具获取结果,然后基于返回的 title/url/snippet 作答,并在回答中给出来源链接。`),r}createToolContext(e,t){let n=this.config.cwd,r=this.toolExecutor;return{toolCallId:t?.toolCallId,toolName:t?.toolName,allowedToolNames:t?.allowedToolNames,cwd:n,exec:async(i,a,o)=>{let s=a?.length?`${i} ${a.join(` `)}`:i,c=await r.executeCommand(s,n,e,{onStdout:t?.onStdout,onStderr:t?.onStderr},o?.timeout);return{stdout:c.output??``,stderr:c.error??``,exitCode:c.success?0:1}},signal:e,onStdout:t?.onStdout,onStderr:t?.onStderr,dataEngine:this.config.dataEngine}}async executeTool(e,t,n,r){let i=this.toolRuntimeManager.getSessionTools().get(e);if(!i)return{error:`未知工具: ${e}`};let a=this.toolRuntimeManager.getDescriptor(e),o=r?.governance,s=Ti(),c=this.config.audit,l=c?.startToolCall({id:r?.toolCallId,traceId:s,extensionId:a?.assetId??i.assetId??null,toolName:a?.name??r?.toolName??i.name,displayName:a?.displayName??i.displayName??null,source:a?.source??i.source??null,cwd:this.config.cwd,args:t,approvalPolicy:o?.approvalPolicy??a?.approvalPolicy??i.approvalPolicy??null,sideEffectLevel:o?.sideEffectLevel??a?.sideEffectLevel??i.sideEffectLevel??null,hostDependency:o?.hostDependency??a?.hostDependency??i.hostDependency??null,metadata:{alias:a?.alias??i.alias??e,provider:a?.provider,category:a?.category??i.category,tags:a?.tags??i.tags}})??r?.toolCallId,u=this.createToolContext(n,{...r,toolCallId:l??r?.toolCallId,toolName:a?.name??r?.toolName??i.name});try{let e=await(c?c.runWithContext({toolCallId:l??null,traceId:s},()=>i.execute(t,u)):i.execute(t,u));return l&&c?.finishToolCall({toolCallId:l,traceId:s,result:e}),e}catch(e){throw l&&c?.failToolCall({toolCallId:l,traceId:s,error:e}),e}}getToolDefinitions(e,t){let n=this.toolRuntimeManager.getSessionTools(),r=Array.from(n.values()),i=e===void 0?r:r.filter(t=>e.includes(t.name));if(t?.length){for(let e of t)if(!i.some(t=>t.name===e)){let t=n.get(e);t&&(i=[...i,t])}}return i.map(e=>({name:e.name,description:e.description,parameters:e.parameters}))}findSearchTool(){for(let e of this.toolRuntimeManager.getSessionTools().values())if(e.ui?.type===`render`&&e.ui.name.endsWith(`_search`))return e}getSearchToolNames(){let e=[];for(let t of this.toolRuntimeManager.getSessionTools().values())t.ui?.type===`render`&&t.ui.name.endsWith(`_search`)&&e.push(t.name);return e}getAllTools(){return this.toolRuntimeManager.getSessionToolNames().map(e=>{let t=this.toolRuntimeManager.getDescriptor(e);return t?{name:t.alias,description:t.description,displayName:t.displayName,assetId:t.assetId,source:t.source,category:t.category,parameters:t.parameters,outputSchema:t.outputSchema,resolvedOutputSchema:t.resolvedOutputSchema,errorSchema:t.errorSchema,approvalPolicy:t.approvalPolicy,sideEffectLevel:t.sideEffectLevel,hostDependency:t.hostDependency}:null}).filter(e=>!!e)}async ensureInitialized(){await this.asyncInit()}getToolRuntimeManager(){return this.toolRuntimeManager}async*chat(e,t={},n){await this.ensureInitialized(),this.abortController=new AbortController;let r=this.abortController.signal,i=t.model||`doubao-seed-2-0-pro-260215`;if(!this.adapter.supportsModel(i)){yield F(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}let a=this.config.llmConfig.models[i];if(!a){yield F(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}if(!V(i,a,this.config.llmConfig)){yield F(`模型 ${i} 无法解析家族配置`,{code:`MODEL_NOT_SUPPORTED`});return}let o=a.supportsThinking,s=(t.thinkingMode??(o?`enabled`:`disabled`))===`enabled`?`enabled`:`disabled`,c=this.buildSystemPrompt(t),l=t.mode===`ask`,u=!l&&t.enableWebSearch?this.getSearchToolNames():void 0,d=async()=>{if(l)return[];let e=t.resolveEnabledTools?await t.resolveEnabledTools():t.enabledTools;return this.getToolDefinitions(e,u)},f=await d(),p=t.userTools||[],m=p.map(e=>({name:e.name,description:e.description,parameters:{...e.parameters,required:e.parameters.required||[]}})),h=[...f,...m],g=p.length>0?new Set(p.map(e=>e.name)):void 0,_=s===`enabled`&&o,v={systemPrompt:c,history:t.history||[],tools:h,refreshTools:m.length>0?async()=>[...await d(),...m]:d,signal:r,images:n,clientToolNames:g};try{yield*this.orchestrator.chat(this.adapter,e,v,{model:i,enableThinking:_,autoRunConfig:t.autoRunConfig,maxIterations:t.maxIterations,maxDurationMs:t.maxDurationMs,maxToolCalls:t.maxToolCalls,maxTotalTokens:t.maxTotalTokens})}finally{this.abortController=null}}abort(){this.abortController&&this.abortController.abort()}setCwd(e){this.config.cwd=e}getConfig(){return{...this.config}}getSupportedModels(){return wn(this.config.llmConfig)}getMcpConnections(){return this.toolRuntimeManager.getMcpConnectionInfos()}createDefaultSummarize(){return async(e,t,n)=>{if(!this.adapter.supportsModel(n))throw Error(`压缩模型 ${n} 无可用路由,请在 LLMConfig.models 中配置`);let r=new AbortController,i=[{role:`system`,content:e},{role:`user`,content:t}],a=``;for await(let e of this.adapter.streamOnce(i,[],{model:n,signal:r.signal}))if(e.type===`text_delta`&&e.delta&&(a+=e.delta),e.type===`error`)throw Error(e.error??`压缩请求失败`);return a.trim()}}async destroy(){await this.toolRuntimeManager.destroy()}};function Di(e){return e.replace(/_v\d+$/,``)}function Oi(e,t){let n=t.toLowerCase();return!!(e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function ki(){let e=new Map;return{add(t){e.set(t.id,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>Oi(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function Y(e,t={}){return{...G({kind:`skill`,scope:e.source===`system`||e.source===`bundled`?`core`:`local`,runtime:`prompt-injection`,governance:t.governance??zr()}),ref:e.id,id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:e.source,enabled:e.enabled,references:e.references,scripts:e.scripts,dirPath:e.dirPath,displayName:e.displayName,shortDescription:e.shortDescription,defaultPrompt:e.defaultPrompt,...t}}function Ai(e,t={}){return{...Y(e),...t}}function X(e){return typeof e==`string`?e:``}function Z(e){return typeof e==`string`?e:void 0}function ji(e,t){return typeof e==`boolean`?e:t}function Mi(e){if(Array.isArray(e))return e.filter(e=>typeof e==`string`)}function Ni(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=Object.entries(e).filter(e=>typeof e[0]==`string`&&typeof e[1]==`string`);return Object.fromEntries(t)}function Pi(e){let t=Z(e);if(t)return t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Fi(e){return e===`system`||e===`bundled`||e===`market`||e===`user`}function Ii(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.id==`string`&&typeof t.enabled==`boolean`}function Li(e){return{keyword:Z(e.keyword),category:Z(e.category),tags:Z(e.tags),source:Fi(e.source)?e.source:void 0}}function Ri(e){return{id:X(e.id),name:X(e.name),description:X(e.description),instructions:X(e.instructions),category:Z(e.category)??`通用`,tags:Mi(e.tags)??[],icon:Z(e.icon)??`✨`}}function zi(e,t){return{id:X(e.id),name:X(e.name),description:X(e.description),instructions:X(e.instructions),category:Z(e.category)??t?.category??`通用`,tags:Mi(e.tags)??t?.tags??[],icon:Z(e.icon)??t?.icon??`✨`}}function Bi(e){return Array.isArray(e.items)?e.items.filter(Ii):[]}function Vi(e){return{id:X(e.id),referenceName:X(e.referenceName)}}function Hi(e){return{id:X(e.id)}}function Ui(e,t,n={}){return{count:t.length,[e]:t,...n}}function Wi(e,t,n={}){return{[e]:t,...n}}function Gi(e,t,n,r={}){return{action:e,[t]:n,...r}}function Ki(e,t={}){return{action:`enabled`,results:e,enabledCount:e.filter(e=>e.enabled&&!e.error).length,disabledCount:e.filter(e=>!e.enabled&&!e.error).length,...t}}function qi(e){return{id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:`user`,enabled:!0,references:[],scripts:[]}}function Ji(e,t,n){let r=e.registry.get(t);return r?r.source===`user`?{meta:r}:{error:`技能 "${t}" 是 ${r.source} 技能,仅可${n} user 来源的技能`}:{error:`技能 "${t}" 不存在${n===`更新`?`。如需新建,请使用 skill_create。`:``}`}}function Yi(e,t){let n=e.registry.search({keyword:t.keyword,category:t.category,tags:Pi(t.tags),source:t.source});return n.length===0?Ui(`skills`,[],{found:0,hint:`没有匹配的技能。尝试更宽泛的关键词,或省略过滤条件。`,categories:e.registry.categories()}):Ui(`skills`,n.map(e=>Y(e)),{found:n.length})}function Xi(e){return Ui(`skills`,e.registry.listEnabled().map(e=>Y(e)))}async function Zi(e,t){if(!e.onSkillCreate)return{error:`当前环境未配置技能持久化,无法创建技能`};if(e.registry.has(t.id))return{error:`技能 "${t.id}" 已存在。如需更新,请使用 skill_update。`};let n=await e.onSkillCreate(t);if(`error`in n)return{error:n.error};let r=e.registry.get(t.id)??qi(t);return e.registry.add(r),await e.onSkillSetEnabled(t.id,!0),Gi(`created`,`skill`,Y(e.registry.get(t.id)??{...r,enabled:!0}),{message:`技能 "${t.name}" 已创建并启用,将在下次对话中生效`})}async function Qi(e,t){if(!e.onSkillUpdate)return{error:`当前环境未配置技能持久化,无法更新技能`};let n=Ji(e,t.id,`更新`);if(n.error)return{error:n.error};let r=n.meta,i={...r,name:t.name,description:t.description,category:t.category||r.category,tags:t.tags,icon:t.icon},a=await e.onSkillUpdate({id:t.id,name:i.name,description:i.description,instructions:t.instructions,category:i.category,tags:i.tags,icon:i.icon});return`error`in a?{error:a.error}:(e.registry.add(i),Gi(`updated`,`skill`,Y(i),{enabled:r.enabled,message:`技能 "${i.name}" 已更新${r.enabled?`,将在下次对话中生效`:``}`}))}async function $i(e,t){if(t.length===0)return{error:`请传入至少一个技能`};let n=[];for(let r of t){if(!e.registry.has(r.id)){n.push({id:r.id,enabled:!1,error:`技能不存在: ${r.id}`});continue}e.registry.setEnabled(r.id,r.enabled),await e.onSkillSetEnabled(r.id,r.enabled);let t=e.registry.get(r.id);n.push({id:r.id,enabled:r.enabled,skill:t?Y(t):void 0})}let r=n.filter(e=>!e.error).length;return Ki(n,{message:`已更新 ${r} 个技能的状态`})}async function ea(e,t){if(!e.onSkillDelete)return{error:`当前环境未配置技能持久化,无法删除技能`};let n=Ji(e,t,`删除`);if(n.error)return{error:n.error};let r=n.meta,i=await e.onSkillDelete(t);return i.ok?(e.registry.remove(t),Gi(`deleted`,`skill`,Y(r),{message:`技能 "${r.name}" 已彻底删除`})):{error:i.error??`删除失败`}}async function ta(e,t){let n=e.registry.get(t);if(!n)return{error:`技能 "${t}" 不存在`};let r=await e.onSkillLoadContent(t);return`error`in r?Wi(`skill`,Ai(n,{instructionsError:r.error})):Wi(`skill`,Ai(n,{instructions:r.instructions}))}async function na(e,t){return e.onSkillLoadReference(t.id,t.referenceName)}function ra(e){return[{name:`skill_search`,description:`搜索可用技能。按关键词/分类/标签/来源查找,返回匹配技能的名称和描述。找到后用 skill_enable 启用,或用 skill_inspect 查看详情。`,parameters:{type:`object`,properties:{keyword:{type:`string`,description:`关键词(匹配名称、描述、标签)`},category:{type:`string`,description:`按分类过滤`},tags:{type:`string`,description:`按标签过滤(逗号分隔,AND 逻辑)`},source:{type:`string`,description:`按来源过滤:system | bundled | market | user`}}},execute:async t=>Yi(e,Li(t))},{name:`skill_list`,description:`列出当前已启用的技能,这些技能的指令会被注入到系统提示中。`,parameters:{type:`object`,properties:{}},execute:async()=>Xi(e)},{name:`skill_create`,description:`创建一个新技能。传入结构化参数,系统自动完成持久化和注册。创建成功后默认启用。当需求只是沉淀策略、约束和知识,而不需要执行逻辑或渲染 UI 时,优先创建 skill。`+(e.onSkillCreate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID(kebab-case,全局唯一,如 "my-skill")`},name:{type:`string`,description:`技能名称`},description:{type:`string`,description:`一句话描述`},instructions:{type:`string`,description:`技能指令内容(Markdown 格式)`},category:{type:`string`,description:`分类,默认 "通用"`},tags:{type:`array`,description:`标签列表`,items:{type:`string`}},icon:{type:`string`,description:`Emoji 图标,默认 "✨"`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>Zi(e,Ri(t))},{name:`skill_update`,description:`原地更新已存在的技能。覆盖指令内容和元数据,保留当前启用状态。`+(e.onSkillUpdate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要更新的技能 ID(必须已存在)`},name:{type:`string`,description:`新的技能名称`},description:{type:`string`,description:`新的一句话描述`},instructions:{type:`string`,description:`新的技能指令内容(Markdown 格式)`},category:{type:`string`,description:`新的分类`},tags:{type:`array`,description:`新的标签列表`,items:{type:`string`}},icon:{type:`string`,description:`新的 Emoji 图标`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>{let n=Hi(t).id;return Qi(e,zi(t,e.registry.get(n)))}},{name:`skill_enable`,description:`批量设置技能的启用/禁用状态。启用的技能会被注入系统提示。`,parameters:{type:`object`,properties:{items:{type:`array`,description:`每项包含 id 和 enabled`,items:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},enabled:{type:`boolean`,description:`true 启用,false 禁用`}},required:[`id`,`enabled`]}}},required:[`items`]},execute:async t=>$i(e,Bi(t))},{name:`skill_delete`,description:`彻底删除技能(从注册表和持久化存储中移除)。仅可删除 user 来源的技能。`+(e.onSkillDelete?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要删除的技能 ID`}},required:[`id`]},execute:async t=>ea(e,Hi(t).id)},{name:`skill_inspect`,description:`查看技能的完整指令内容和元数据。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`}},required:[`id`]},execute:async t=>ta(e,Hi(t).id)},{name:`skill_load_reference`,description:`读取技能的某个参考文档内容。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},referenceName:{type:`string`,description:`参考文档文件名(从 skill_inspect 返回的 references 列表中获取)`}},required:[`id`,`referenceName`]},execute:async t=>na(e,Vi(t))}]}function ia(e){return{tools:ra(e)}}const aa=[{id:`openai_chat_v1`,name:`OpenAI Chat Completions`,description:`适合 OpenAI、OpenRouter、硅基流动、DashScope 兼容模式等 Chat Completions 接口。`,defaultBaseUrl:`https://api.openai.com/v1`,defaultFamily:`gpt`},{id:`openai_v1`,name:`OpenAI Responses`,description:`适合 OpenAI Responses API。`,defaultBaseUrl:`https://api.openai.com/v1`,defaultFamily:`gpt`},{id:`anthropic_v1`,name:`Anthropic Messages`,description:`适合 Anthropic 官方或 Anthropic Messages 兼容接口。`,defaultBaseUrl:`https://api.anthropic.com/v1`,defaultFamily:`claude`},{id:`qwen_v1`,name:`DashScope 原生`,description:`适合阿里云 DashScope 原生接口。`,defaultBaseUrl:`https://dashscope.aliyuncs.com/api/v1`,defaultFamily:`qwen`},{id:`ark_v1`,name:`火山方舟 Responses`,description:`适合火山方舟 Responses 风格接口。`,defaultBaseUrl:`https://ark.cn-beijing.volces.com/api/v3`,defaultFamily:`doubao`},{id:`deepseek_v1`,name:`DeepSeek 原生`,description:`适合 DeepSeek 原生 Chat Completions 接口。`,defaultBaseUrl:`https://api.deepseek.com/v1`,defaultFamily:`deepseek`},{id:`glm_v1`,name:`GLM 原生`,description:`适合智谱 GLM 原生接口。`,defaultBaseUrl:`https://open.bigmodel.cn/api/paas/v4`,defaultFamily:`glm`},{id:`moonshot_v1`,name:`Moonshot 原生`,description:`适合 Moonshot/Kimi 原生接口。`,defaultBaseUrl:`https://api.moonshot.cn/v1`,defaultFamily:`moonshot`},{id:`minimax_v1`,name:`MiniMax Anthropic`,description:`适合 MiniMax Anthropic 兼容接口。`,defaultBaseUrl:`https://api.minimax.chat/anthropic/v1`,defaultFamily:`minimax`},{id:`gemini_v1`,name:`Gemini 原生`,description:`适合 Google Gemini 原生接口。`,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultFamily:`gemini`},{id:`grok_v1`,name:`Grok 原生`,description:`适合 xAI Grok 原生接口。`,defaultBaseUrl:`https://api.x.ai/v1`,defaultFamily:`grok`},{id:`vercel_gateway_v1`,name:`Vercel AI Gateway`,description:`适合 Vercel AI Gateway。`,defaultBaseUrl:`https://ai-gateway.vercel.sh/v1`,defaultFamily:`gpt`}],oa=[{id:`huyooo`,name:`Huyooo`},{id:`dashscope`,name:`通义千问`},{id:`deepseek`,name:`DeepSeek`},{id:`glm`,name:`智谱 GLM`},{id:`moonshot`,name:`Moonshot`},{id:`minimax`,name:`MiniMax`},{id:`openai`,name:`OpenAI`},{id:`anthropic`,name:`Anthropic`},{id:`google-ai-studio`,name:`Google AI Studio`},{id:`grok`,name:`xAI Grok`},{id:`volcengine`,name:`火山方舟`},{id:`custom`,name:`自定义服务`}],Q=`https://ai.huyooo.com/aiRestfulApi`,$=`https://ark.cn-beijing.volces.com/api/coding/v3`,sa=`https://ark.cn-beijing.volces.com/api/coding`,ca=[{servicePlan:{id:`huyooo-official`,providerId:`huyooo`,name:`Huyooo 官方服务`,description:`使用当前登录态和官方计费额度。`,kind:`official`,authMode:`huyooo-session`,baseUrlEditable:!1,modelEditable:!1,adapterEditable:!1},modelTemplates:[{id:`huyooo:doubao-seed-2-0-pro-260215`,servicePlanId:`huyooo-official`,providerId:`volcengine`,displayName:`doubao-seed-2-0-pro-260215`,family:`doubao`,protocol:`ark_v1`,baseUrl:`${Q}/volcengine/ark/api/v3`,providerModelId:`doubao-seed-2-0-pro-260215`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:doubao-seed-2-0-lite-260215`,servicePlanId:`huyooo-official`,providerId:`volcengine`,displayName:`doubao-seed-2-0-lite-260215`,family:`doubao`,protocol:`ark_v1`,baseUrl:`${Q}/volcengine/ark/api/v3`,providerModelId:`doubao-seed-2-0-lite-260215`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:doubao-seed-2-0-code-preview-260215`,servicePlanId:`huyooo-official`,providerId:`volcengine`,displayName:`doubao-seed-2-0-code-preview-260215`,family:`doubao`,protocol:`ark_v1`,baseUrl:`${Q}/volcengine/ark/api/v3`,providerModelId:`doubao-seed-2-0-code-preview-260215`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:qwen3-max-preview`,servicePlanId:`huyooo-official`,providerId:`dashscope`,displayName:`qwen3-max-preview`,family:`qwen`,protocol:`openai_chat_v1`,baseUrl:`${Q}/dashscope/compatible-mode/v1`,providerModelId:`qwen3-max-preview`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:262144,maxOutputTokens:16384,source:`official`,defaultEnabled:!0},{id:`huyooo:qwen-plus-latest`,servicePlanId:`huyooo-official`,providerId:`dashscope`,displayName:`qwen-plus-latest`,family:`qwen`,protocol:`openai_chat_v1`,baseUrl:`${Q}/dashscope/compatible-mode/v1`,providerModelId:`qwen-plus-latest`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:131072,maxOutputTokens:8192,source:`official`,defaultEnabled:!0},{id:`huyooo:qwen3.5-plus`,servicePlanId:`huyooo-official`,providerId:`dashscope`,displayName:`qwen3.5-plus`,family:`qwen`,protocol:`qwen_v1`,baseUrl:`${Q}/dashscope/api/v1`,providerModelId:`qwen3.5-plus`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:1e6,maxOutputTokens:32768,source:`official`,defaultEnabled:!0},{id:`huyooo:deepseek-chat`,servicePlanId:`huyooo-official`,providerId:`deepseek`,displayName:`deepseek-chat`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:`${Q}/deepseek/v1`,providerModelId:`deepseek-chat`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`official`,defaultEnabled:!0},{id:`huyooo:deepseek-reasoner`,servicePlanId:`huyooo-official`,providerId:`deepseek`,displayName:`deepseek-reasoner`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:`${Q}/deepseek/v1`,providerModelId:`deepseek-reasoner`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:64e3,source:`official`,defaultEnabled:!0},{id:`huyooo:glm-5`,servicePlanId:`huyooo-official`,providerId:`glm`,displayName:`glm-5`,family:`glm`,protocol:`glm_v1`,baseUrl:`${Q}/glm/v1`,providerModelId:`glm-5`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:kimi-k2.5`,servicePlanId:`huyooo-official`,providerId:`moonshot`,displayName:`kimi-k2.5`,family:`moonshot`,protocol:`moonshot_v1`,baseUrl:`${Q}/moonshot/v1`,providerModelId:`kimi-k2.5`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:MiniMax-M2.5`,servicePlanId:`huyooo-official`,providerId:`minimax`,displayName:`MiniMax-M2.5`,family:`minimax`,protocol:`minimax_v1`,baseUrl:`${Q}/minimax/anthropic`,providerModelId:`MiniMax-M2.5`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:204800,maxOutputTokens:65536,source:`official`,defaultEnabled:!0},{id:`huyooo:gpt-5.2-codex`,servicePlanId:`huyooo-official`,providerId:`openai`,displayName:`gpt-5.2-codex`,family:`gpt`,protocol:`openai_v1`,baseUrl:`${Q}/openai/v1`,providerModelId:`gpt-5.2-codex`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:4e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:gpt-5.2`,servicePlanId:`huyooo-official`,providerId:`openai`,displayName:`gpt-5.2`,family:`gpt`,protocol:`openai_v1`,baseUrl:`${Q}/openai/v1`,providerModelId:`gpt-5.2`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:4e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:gemini-2.5-flash`,servicePlanId:`huyooo-official`,providerId:`google-ai-studio`,displayName:`gemini-2.5-flash`,family:`gemini`,protocol:`gemini_v1`,baseUrl:`${Q}/gemini/v1beta`,providerModelId:`gemini-2.5-flash`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:1048576,maxOutputTokens:65536,source:`official`,defaultEnabled:!0},{id:`huyooo:gemini-2.5-pro`,servicePlanId:`huyooo-official`,providerId:`google-ai-studio`,displayName:`gemini-2.5-pro`,family:`gemini`,protocol:`gemini_v1`,baseUrl:`${Q}/gemini/v1beta`,providerModelId:`gemini-2.5-pro`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:1048576,maxOutputTokens:65536,source:`official`,defaultEnabled:!0},{id:`huyooo:claude-haiku-4-5-20251001`,servicePlanId:`huyooo-official`,providerId:`anthropic`,displayName:`claude-haiku-4-5-20251001`,family:`claude`,protocol:`anthropic_v1`,baseUrl:`${Q}/anthropic/v1`,providerModelId:`claude-haiku-4-5-20251001`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:64e3,source:`official`,defaultEnabled:!0},{id:`huyooo:claude-sonnet-4-6`,servicePlanId:`huyooo-official`,providerId:`anthropic`,displayName:`claude-sonnet-4-6`,family:`claude`,protocol:`anthropic_v1`,baseUrl:`${Q}/anthropic/v1`,providerModelId:`claude-sonnet-4-6`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:grok-4.20-0309-non-reasoning`,servicePlanId:`huyooo-official`,providerId:`grok`,displayName:`grok-4.20-0309-non-reasoning`,family:`grok`,protocol:`grok_v1`,baseUrl:`${Q}/grok/v1`,providerModelId:`grok-4.20-0309-non-reasoning`,supportsThinking:!1,supportsVision:!0,contextWindowTokens:2e6,maxOutputTokens:32768,source:`official`,defaultEnabled:!0},{id:`huyooo:grok-4.20-0309-reasoning`,servicePlanId:`huyooo-official`,providerId:`grok`,displayName:`grok-4.20-0309-reasoning`,family:`grok`,protocol:`grok_v1`,baseUrl:`${Q}/grok/v1`,providerModelId:`grok-4.20-0309-reasoning`,supportsThinking:!1,supportsVision:!0,contextWindowTokens:2e6,maxOutputTokens:32768,source:`official`,defaultEnabled:!0}]},{servicePlan:{id:`custom-api-key`,providerId:`custom`,name:`原厂 API Key`,description:`使用用户自己购买的模型厂商 API Key。未预置的厂商可手动配置 Base URL、适配器和模型名。`,kind:`vendor_api_key`,authMode:`api-key`,baseUrlEditable:!0,modelEditable:!0,adapterEditable:!0},modelTemplates:[{id:`custom-api-key:custom-model`,servicePlanId:`custom-api-key`,providerId:`custom`,displayName:`custom-model`,family:`gpt`,protocol:`openai_chat_v1`,baseUrl:`https://api.example.com/v1`,providerModelId:`custom-model`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`vendor-api-key`,defaultEnabled:!0}]},{servicePlan:{id:`volcengine-coding-plan`,providerId:`volcengine`,name:`火山方舟 Coding Plan`,description:`第三方模型代理服务。用户自行购买后填写 API Key,SuperX 使用官方推荐模型和地址。`,kind:`model_proxy`,authMode:`api-key`,baseUrlEditable:!1,modelEditable:!1,adapterEditable:!1},modelTemplates:[{id:`volcengine-coding-plan:ark-code-latest`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Auto (ark-code-latest)`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`ark-code-latest`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!0},{id:`volcengine-coding-plan:doubao-seed-2.0-code`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-2.0-Code`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-2.0-code`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:doubao-seed-2.0-pro`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-2.0-pro`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-2.0-pro`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:doubao-seed-2.0-lite`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-2.0-lite`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-2.0-lite`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:doubao-seed-code`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-Code`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-code`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:minimax-latest`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`MiniMax-M2.7`,family:`minimax`,protocol:`anthropic_v1`,baseUrl:sa,providerModelId:`minimax-latest`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:minimax-m2.5`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`MiniMax-M2.5`,family:`minimax`,protocol:`anthropic_v1`,baseUrl:sa,providerModelId:`minimax-m2.5`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1,status:`deprecated`},{id:`volcengine-coding-plan:glm-5.1`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`GLM-5.1`,family:`glm`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`glm-5.1`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:glm-4.7`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`GLM-4.7`,family:`glm`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`glm-4.7`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1,status:`deprecated`},{id:`volcengine-coding-plan:deepseek-v3.2`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Deepseek-V3.2`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`deepseek-v3.2`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:deepseek-v4-flash`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`DeepSeek-V4-Flash`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`deepseek-v4-flash`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:1024e3,maxOutputTokens:384e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:deepseek-v4-pro`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`DeepSeek-V4-Pro`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`deepseek-v4-pro`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:1024e3,maxOutputTokens:384e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:kimi-k2.6`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Kimi-K2.6`,family:`moonshot`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`kimi-k2.6`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:32e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:kimi-k2.5`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Kimi-K2.5`,family:`moonshot`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`kimi-k2.5`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:32e3,source:`coding-plan`,defaultEnabled:!1,status:`deprecated`}]}],la=ca.map(e=>({...e.servicePlan,modelTemplateIds:e.modelTemplates.map(e=>e.id)}));function ua(e){return aa.find(t=>t.id===e)??null}function da(e){return ca.find(t=>t.servicePlan.id===e)??null}function fa(e){let t=da(e);return t?{...t.servicePlan,modelTemplateIds:t.modelTemplates.map(e=>e.id)}:null}function pa(e){for(let t of ca){let n=t.modelTemplates.find(t=>t.id===e);if(n)return n}return null}function ma(e){return da(e)?.modelTemplates??[]}function ha(e,t){let n={baseUrl:e.baseUrl,accessKey:t.accessKey,protocol:e.protocol,providerModelId:e.providerModelId,...e.path?{path:e.path}:{},...t.vendorKey?{vendorKey:t.vendorKey}:{},...t.headers?{headers:t.headers}:{}};return[t.modelId??e.id,{displayName:e.displayName,family:e.family,supportsThinking:e.supportsThinking,supportsVision:e.supportsVision,contextWindowTokens:e.contextWindowTokens,maxOutputTokens:e.maxOutputTokens,routes:[n],metadata:{source:e.source,provider:e.providerId,servicePlanId:e.servicePlanId,templateId:e.id,...e.status?{status:e.status}:{},...t.metadata}}]}function ga(e,t){let n=t.toLowerCase();return!!(e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function _a(){let e=new Map;return{add(t){e.set(t.name,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>ga(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function va(e,t={}){return{...G({kind:`part`,scope:e.source===`user`?`local`:`core`,runtime:`part-render`,governance:t.governance??Rr()}),ref:e.name,name:e.name,description:e.description,category:e.category,tags:e.tags,source:e.source,enabled:e.enabled,...t}}function ya(e,t){return{...va(e),...t}}export{It as AnthropicProtocol,Je as ArkProtocol,oe as CHAT_EVENT_TYPES,hn as CLAUDE_FAMILY,Ci as ChatOrchestrator,Ei as ChatRuntime,cn as DEEPSEEK_FAMILY,Ie as DEFAULT_MODEL,sn as DOUBAO_FAMILY,tt as DeepSeekProtocol,pn as GEMINI_FAMILY,mn as GPT_FAMILY,aa as MODEL_CATALOG_ADAPTERS,oa as MODEL_CATALOG_PROVIDERS,ca as MODEL_CATALOG_SERVICE_ENTRIES,la as MODEL_CATALOG_SERVICE_PLANS,gn as MODEL_FAMILIES,Sn as ModelAdapter,tn as OpenAIChatProtocol,ln as QWEN_FAMILY,st as QwenProtocol,O as STANDARD_TOOL_ERROR_SCHEMA,W as TOOL_FORMATS,T as ToolException,n as Type,qr as analyzeCommandRisk,wn as buildModelOptions,ha as compileModelTemplate,xe as createAbort,Gi as createActionResult,Bt as createAnthropicProtocol,F as createApiError,Ye as createArkProtocol,G as createAssetSummaryBase,L as createAssistantSegmentStart,Ui as createCollectionResult,Kr as createCommandGovernanceSnapshot,Gr as createCommandToolMetadata,nt as createDeepSeekProtocol,ge as createDone,P as createError,Mn as createInProcessProvider,Wi as createInspectResult,Lr as createLocalMcpServerGovernance,Ir as createLocalToolGovernance,Zr as createManagedMcpServerDetail,Xr as createManagedMcpServerSummary,ya as createManagedPartDetail,va as createManagedPartSummary,Ai as createManagedSkillDetail,Y as createManagedSkillSummary,Yr as createManagedToolDetail,Jr as createManagedToolSummary,In as createMcpProvider,R as createModuleLogger,nn as createOpenAIChatProtocol,wi as createOrchestrator,be as createParseError,Rr as createPartAssetGovernance,dt as createQwenProtocol,_e as createRateLimitError,te as createResolvedOutputSchema,I as createStepEnd,Se as createStepStart,me as createTextDelta,ce as createThinkingDelta,le as createThinkingEnd,se as createThinkingStart,ye as createTimeoutError,Ki as createToggleResult,de as createToolCallOutput,fe as createToolCallRequest,N as createToolCallResult,ue as createToolCallStart,ve as createToolError,jr as createToolRuntimeManager,Pt as createVercelGatewayProtocol,Or as defineTool,yn as findRouteByProtocol,Cn as formatContextWindow,Di as getBaseProtocol,ji as getBooleanWithDefault,Ue as getLogger,ua as getModelAdapter,Tn as getModelContextConfigFromLLM,da as getModelServiceEntry,fa as getModelServicePlan,pa as getModelTemplate,Z as getOptionalString,X as getRequiredString,vn as getRouteChain,Mi as getStringArray,Ni as getStringRecord,mr as hasToolFormat,He as initLogger,Me as isAbortEvent,Pe as isAssistantSegmentEvent,je as isErrorEvent,Fe as isRetryableError,Ae as isStatusEvent,Ne as isStepEvent,ke as isTextEvent,De as isThinkingEvent,E as isToolError,Oe as isToolEvent,h as isToolResult,ma as listModelTemplatesByServicePlan,C as mergeToolGovernance,g as normalizeToolResult,_a as partRegistry,Vr as readAssetGovernanceOverrides,pr as registerToolFormat,fr as registerToolFormats,V as resolveModelFamilyConfig,_n as resolveRouteUrl,w as resolveToolGovernanceSnapshot,y as resolveToolResultUi,ie as resolveTools,_ as serializeToolResult,ia as skillManagementPlugin,ki as skillRegistry,Pi as splitCommaSeparatedStrings,D as throwToolError,Br as toAssetGovernanceOverrides,ne as tool,p as toolOk,re as tools,Cr as validateJsonSchemaArgs,Sr as validateTypeBoxArgs};
|
|
51
|
+
`));let i=this.findSearchTool();return e.enableWebSearch&&i&&(r+=`\n\n【联网搜索】当用户问题需要实时信息/最新事实/可引用来源时,请先调用 ${i.name} 工具获取结果,然后基于返回的 title/url/snippet 作答,并在回答中给出来源链接。`),r}createToolContext(e,t){let n=this.config.cwd,r=this.toolExecutor;return{toolCallId:t?.toolCallId,toolName:t?.toolName,allowedToolNames:t?.allowedToolNames,cwd:n,exec:async(i,a,o)=>{let s=a?.length?`${i} ${a.join(` `)}`:i,c=await r.executeCommand(s,n,e,{onStdout:t?.onStdout,onStderr:t?.onStderr},o?.timeout);return{stdout:c.output??``,stderr:c.error??``,exitCode:c.success?0:1}},signal:e,onStdout:t?.onStdout,onStderr:t?.onStderr,dataEngine:this.config.dataEngine}}async executeTool(e,t,n,r){let i=this.toolRuntimeManager.getSessionTools().get(e);if(!i)return{error:`未知工具: ${e}`};let a=this.toolRuntimeManager.getDescriptor(e),o=r?.governance,s=Ti(),c=this.config.audit,l=c?.startToolCall({id:r?.toolCallId,traceId:s,extensionId:a?.assetId??i.assetId??null,toolName:a?.name??r?.toolName??i.name,displayName:a?.displayName??i.displayName??null,source:a?.source??i.source??null,cwd:this.config.cwd,args:t,approvalPolicy:o?.approvalPolicy??a?.approvalPolicy??i.approvalPolicy??null,sideEffectLevel:o?.sideEffectLevel??a?.sideEffectLevel??i.sideEffectLevel??null,hostDependency:o?.hostDependency??a?.hostDependency??i.hostDependency??null,metadata:{alias:a?.alias??i.alias??e,provider:a?.provider,category:a?.category??i.category,tags:a?.tags??i.tags}})??r?.toolCallId,u=this.createToolContext(n,{...r,toolCallId:l??r?.toolCallId,toolName:a?.name??r?.toolName??i.name});try{let e=await(c?c.runWithContext({toolCallId:l??null,traceId:s},()=>i.execute(t,u)):i.execute(t,u));return l&&c?.finishToolCall({toolCallId:l,traceId:s,result:e}),e}catch(e){throw l&&c?.failToolCall({toolCallId:l,traceId:s,error:e}),e}}getToolDefinitions(e,t){let n=this.toolRuntimeManager.getSessionTools(),r=Array.from(n.values()),i=e===void 0?r:r.filter(t=>e.includes(t.name));if(t?.length){for(let e of t)if(!i.some(t=>t.name===e)){let t=n.get(e);t&&(i=[...i,t])}}return i.map(e=>({name:e.name,description:e.description,parameters:e.parameters}))}findSearchTool(){for(let e of this.toolRuntimeManager.getSessionTools().values())if(e.ui?.type===`render`&&e.ui.name.endsWith(`_search`))return e}getSearchToolNames(){let e=[];for(let t of this.toolRuntimeManager.getSessionTools().values())t.ui?.type===`render`&&t.ui.name.endsWith(`_search`)&&e.push(t.name);return e}getAllTools(){return this.toolRuntimeManager.getSessionToolNames().map(e=>{let t=this.toolRuntimeManager.getDescriptor(e);return t?{name:t.alias,description:t.description,displayName:t.displayName,assetId:t.assetId,source:t.source,category:t.category,parameters:t.parameters,outputSchema:t.outputSchema,resolvedOutputSchema:t.resolvedOutputSchema,errorSchema:t.errorSchema,approvalPolicy:t.approvalPolicy,sideEffectLevel:t.sideEffectLevel,hostDependency:t.hostDependency}:null}).filter(e=>!!e)}async ensureInitialized(){await this.asyncInit()}getToolRuntimeManager(){return this.toolRuntimeManager}async*chat(e,t={},n){await this.ensureInitialized(),this.abortController=new AbortController;let r=this.abortController.signal,i=t.model||`doubao-seed-2-0-pro-260215`;if(!this.adapter.supportsModel(i)){yield F(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}let a=this.config.llmConfig.models[i];if(!a){yield F(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}if(!V(i,a,this.config.llmConfig)){yield F(`模型 ${i} 无法解析家族配置`,{code:`MODEL_NOT_SUPPORTED`});return}let o=a.supportsThinking,s=(t.thinkingMode??(o?`enabled`:`disabled`))===`enabled`?`enabled`:`disabled`,c=this.buildSystemPrompt(t),l=t.mode===`ask`,u=!l&&t.enableWebSearch?this.getSearchToolNames():void 0,d=async()=>{if(l)return[];let e=t.resolveEnabledTools?await t.resolveEnabledTools():t.enabledTools;return this.getToolDefinitions(e,u)},f=await d(),p=t.userTools||[],m=p.map(e=>({name:e.name,description:e.description,parameters:{...e.parameters,required:e.parameters.required||[]}})),h=[...f,...m],g=p.length>0?new Set(p.map(e=>e.name)):void 0,_=s===`enabled`&&o,v={systemPrompt:c,history:t.history||[],tools:h,refreshTools:m.length>0?async()=>[...await d(),...m]:d,signal:r,images:n,clientToolNames:g};try{yield*this.orchestrator.chat(this.adapter,e,v,{model:i,enableThinking:_,autoRunConfig:t.autoRunConfig,maxIterations:t.maxIterations,maxDurationMs:t.maxDurationMs,maxToolCalls:t.maxToolCalls,maxTotalTokens:t.maxTotalTokens})}finally{this.abortController=null}}abort(){this.abortController&&this.abortController.abort()}setCwd(e){this.config.cwd=e}getConfig(){return{...this.config}}getSupportedModels(){return wn(this.config.llmConfig)}getMcpConnections(){return this.toolRuntimeManager.getMcpConnectionInfos()}createDefaultSummarize(){return async(e,t,n)=>{if(!this.adapter.supportsModel(n))throw Error(`压缩模型 ${n} 无可用路由,请在 LLMConfig.models 中配置`);let r=new AbortController,i=[{role:`system`,content:e},{role:`user`,content:t}],a=``;for await(let e of this.adapter.streamOnce(i,[],{model:n,signal:r.signal}))if(e.type===`text_delta`&&e.delta&&(a+=e.delta),e.type===`error`)throw Error(e.error??`压缩请求失败`);return a.trim()}}async destroy(){await this.toolRuntimeManager.destroy()}};function Di(e){return e.replace(/_v\d+$/,``)}function Oi(e,t){let n=t.toLowerCase();return!!(e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function ki(){let e=new Map;return{add(t){e.set(t.id,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>Oi(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function Y(e,t={}){return{...G({kind:`skill`,scope:e.source===`system`||e.source===`bundled`?`core`:`local`,runtime:`prompt-injection`,governance:t.governance??zr()}),ref:e.id,id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:e.source,enabled:e.enabled,references:e.references,scripts:e.scripts,dirPath:e.dirPath,displayName:e.displayName,shortDescription:e.shortDescription,defaultPrompt:e.defaultPrompt,...t}}function Ai(e,t={}){return{...Y(e),...t}}function X(e){return typeof e==`string`?e:``}function Z(e){return typeof e==`string`?e:void 0}function ji(e,t){return typeof e==`boolean`?e:t}function Mi(e){if(Array.isArray(e))return e.filter(e=>typeof e==`string`)}function Ni(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=Object.entries(e).filter(e=>typeof e[0]==`string`&&typeof e[1]==`string`);return Object.fromEntries(t)}function Pi(e){let t=Z(e);if(t)return t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Fi(e){return e===`system`||e===`bundled`||e===`market`||e===`user`}function Ii(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.id==`string`&&typeof t.enabled==`boolean`}function Li(e){return{keyword:Z(e.keyword),category:Z(e.category),tags:Z(e.tags),source:Fi(e.source)?e.source:void 0}}function Ri(e){return{id:X(e.id),name:X(e.name),description:X(e.description),instructions:X(e.instructions),category:Z(e.category)??`通用`,tags:Mi(e.tags)??[],icon:Z(e.icon)??`✨`}}function zi(e,t){return{id:X(e.id),name:X(e.name),description:X(e.description),instructions:X(e.instructions),category:Z(e.category)??t?.category??`通用`,tags:Mi(e.tags)??t?.tags??[],icon:Z(e.icon)??t?.icon??`✨`}}function Bi(e){return Array.isArray(e.items)?e.items.filter(Ii):[]}function Vi(e){return{id:X(e.id),referenceName:X(e.referenceName)}}function Hi(e){return{id:X(e.id)}}function Ui(e,t,n={}){return{count:t.length,[e]:t,...n}}function Wi(e,t,n={}){return{[e]:t,...n}}function Gi(e,t,n,r={}){return{action:e,[t]:n,...r}}function Ki(e,t={}){return{action:`enabled`,results:e,enabledCount:e.filter(e=>e.enabled&&!e.error).length,disabledCount:e.filter(e=>!e.enabled&&!e.error).length,...t}}function qi(e){return{id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:`user`,enabled:!0,references:[],scripts:[]}}function Ji(e,t,n){let r=e.registry.get(t);return r?r.source===`user`?{meta:r}:{error:`技能 "${t}" 是 ${r.source} 技能,仅可${n} user 来源的技能`}:{error:`技能 "${t}" 不存在${n===`更新`?`。如需新建,请使用 skill_create。`:``}`}}function Yi(e,t){let n=e.registry.search({keyword:t.keyword,category:t.category,tags:Pi(t.tags),source:t.source});return n.length===0?Ui(`skills`,[],{found:0,hint:`没有匹配的技能。尝试更宽泛的关键词,或省略过滤条件。`,categories:e.registry.categories()}):Ui(`skills`,n.map(e=>Y(e)),{found:n.length})}function Xi(e){return Ui(`skills`,e.registry.listEnabled().map(e=>Y(e)))}async function Zi(e,t){if(!e.onSkillCreate)return{error:`当前环境未配置技能持久化,无法创建技能`};if(e.registry.has(t.id))return{error:`技能 "${t.id}" 已存在。如需更新,请使用 skill_update。`};let n=await e.onSkillCreate(t);if(`error`in n)return{error:n.error};let r=e.registry.get(t.id)??qi(t);return e.registry.add(r),await e.onSkillSetEnabled(t.id,!0),Gi(`created`,`skill`,Y(e.registry.get(t.id)??{...r,enabled:!0}),{message:`技能 "${t.name}" 已创建并启用,将在下次对话中生效`})}async function Qi(e,t){if(!e.onSkillUpdate)return{error:`当前环境未配置技能持久化,无法更新技能`};let n=Ji(e,t.id,`更新`);if(n.error)return{error:n.error};let r=n.meta,i={...r,name:t.name,description:t.description,category:t.category||r.category,tags:t.tags,icon:t.icon},a=await e.onSkillUpdate({id:t.id,name:i.name,description:i.description,instructions:t.instructions,category:i.category,tags:i.tags,icon:i.icon});return`error`in a?{error:a.error}:(e.registry.add(i),Gi(`updated`,`skill`,Y(i),{enabled:r.enabled,message:`技能 "${i.name}" 已更新${r.enabled?`,将在下次对话中生效`:``}`}))}async function $i(e,t){if(t.length===0)return{error:`请传入至少一个技能`};let n=[];for(let r of t){if(!e.registry.has(r.id)){n.push({id:r.id,enabled:!1,error:`技能不存在: ${r.id}`});continue}e.registry.setEnabled(r.id,r.enabled),await e.onSkillSetEnabled(r.id,r.enabled);let t=e.registry.get(r.id);n.push({id:r.id,enabled:r.enabled,skill:t?Y(t):void 0})}let r=n.filter(e=>!e.error).length;return Ki(n,{message:`已更新 ${r} 个技能的状态`})}async function ea(e,t){if(!e.onSkillDelete)return{error:`当前环境未配置技能持久化,无法删除技能`};let n=Ji(e,t,`删除`);if(n.error)return{error:n.error};let r=n.meta,i=await e.onSkillDelete(t);return i.ok?(e.registry.remove(t),Gi(`deleted`,`skill`,Y(r),{message:`技能 "${r.name}" 已彻底删除`})):{error:i.error??`删除失败`}}async function ta(e,t){let n=e.registry.get(t);if(!n)return{error:`技能 "${t}" 不存在`};let r=await e.onSkillLoadContent(t);return`error`in r?Wi(`skill`,Ai(n,{instructionsError:r.error})):Wi(`skill`,Ai(n,{instructions:r.instructions}))}async function na(e,t){return e.onSkillLoadReference(t.id,t.referenceName)}function ra(e){return[{name:`skill_search`,description:`搜索可用技能。按关键词/分类/标签/来源查找,返回匹配技能的名称和描述。找到后用 skill_enable 启用,或用 skill_inspect 查看详情。`,parameters:{type:`object`,properties:{keyword:{type:`string`,description:`关键词(匹配名称、描述、标签)`},category:{type:`string`,description:`按分类过滤`},tags:{type:`string`,description:`按标签过滤(逗号分隔,AND 逻辑)`},source:{type:`string`,description:`按来源过滤:system | bundled | market | user`}}},execute:async t=>Yi(e,Li(t))},{name:`skill_list`,description:`列出当前已启用的技能,这些技能的指令会被注入到系统提示中。`,parameters:{type:`object`,properties:{}},execute:async()=>Xi(e)},{name:`skill_create`,description:`创建一个新技能。传入结构化参数,系统自动完成持久化和注册。创建成功后默认启用。当需求只是沉淀策略、约束和知识,而不需要执行逻辑或渲染 UI 时,优先创建 skill。`+(e.onSkillCreate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID(kebab-case,全局唯一,如 "my-skill")`},name:{type:`string`,description:`技能名称`},description:{type:`string`,description:`一句话描述`},instructions:{type:`string`,description:`技能指令内容(Markdown 格式)`},category:{type:`string`,description:`分类,默认 "通用"`},tags:{type:`array`,description:`标签列表`,items:{type:`string`}},icon:{type:`string`,description:`Emoji 图标,默认 "✨"`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>Zi(e,Ri(t))},{name:`skill_update`,description:`原地更新已存在的技能。覆盖指令内容和元数据,保留当前启用状态。`+(e.onSkillUpdate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要更新的技能 ID(必须已存在)`},name:{type:`string`,description:`新的技能名称`},description:{type:`string`,description:`新的一句话描述`},instructions:{type:`string`,description:`新的技能指令内容(Markdown 格式)`},category:{type:`string`,description:`新的分类`},tags:{type:`array`,description:`新的标签列表`,items:{type:`string`}},icon:{type:`string`,description:`新的 Emoji 图标`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>{let n=Hi(t).id;return Qi(e,zi(t,e.registry.get(n)))}},{name:`skill_enable`,description:`批量设置技能的启用/禁用状态。启用的技能会被注入系统提示。`,parameters:{type:`object`,properties:{items:{type:`array`,description:`每项包含 id 和 enabled`,items:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},enabled:{type:`boolean`,description:`true 启用,false 禁用`}},required:[`id`,`enabled`]}}},required:[`items`]},execute:async t=>$i(e,Bi(t))},{name:`skill_delete`,description:`彻底删除技能(从注册表和持久化存储中移除)。仅可删除 user 来源的技能。`+(e.onSkillDelete?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要删除的技能 ID`}},required:[`id`]},execute:async t=>ea(e,Hi(t).id)},{name:`skill_inspect`,description:`查看技能的完整指令内容和元数据。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`}},required:[`id`]},execute:async t=>ta(e,Hi(t).id)},{name:`skill_load_reference`,description:`读取技能的某个参考文档内容。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},referenceName:{type:`string`,description:`参考文档文件名(从 skill_inspect 返回的 references 列表中获取)`}},required:[`id`,`referenceName`]},execute:async t=>na(e,Vi(t))}]}function ia(e){return{tools:ra(e)}}const aa=[{id:`openai_chat_v1`,name:`OpenAI Chat Completions`,description:`适合 OpenAI、OpenRouter、硅基流动、DashScope 兼容模式等 Chat Completions 接口。`,defaultBaseUrl:`https://api.openai.com/v1`,defaultFamily:`gpt`},{id:`openai_v1`,name:`OpenAI Responses`,description:`适合 OpenAI Responses API。`,defaultBaseUrl:`https://api.openai.com/v1`,defaultFamily:`gpt`},{id:`anthropic_v1`,name:`Anthropic Messages`,description:`适合 Anthropic 官方或 Anthropic Messages 兼容接口。`,defaultBaseUrl:`https://api.anthropic.com/v1`,defaultFamily:`claude`},{id:`qwen_v1`,name:`DashScope 原生`,description:`适合阿里云 DashScope 原生接口。`,defaultBaseUrl:`https://dashscope.aliyuncs.com/api/v1`,defaultFamily:`qwen`},{id:`ark_v1`,name:`火山方舟 Responses`,description:`适合火山方舟 Responses 风格接口。`,defaultBaseUrl:`https://ark.cn-beijing.volces.com/api/v3`,defaultFamily:`doubao`},{id:`deepseek_v1`,name:`DeepSeek 原生`,description:`适合 DeepSeek 原生 Chat Completions 接口。`,defaultBaseUrl:`https://api.deepseek.com/v1`,defaultFamily:`deepseek`},{id:`glm_v1`,name:`GLM 原生`,description:`适合智谱 GLM 原生接口。`,defaultBaseUrl:`https://open.bigmodel.cn/api/paas/v4`,defaultFamily:`glm`},{id:`moonshot_v1`,name:`Moonshot 原生`,description:`适合 Moonshot/Kimi 原生接口。`,defaultBaseUrl:`https://api.moonshot.cn/v1`,defaultFamily:`moonshot`},{id:`minimax_v1`,name:`MiniMax Anthropic`,description:`适合 MiniMax Anthropic 兼容接口。`,defaultBaseUrl:`https://api.minimax.chat/anthropic/v1`,defaultFamily:`minimax`},{id:`gemini_v1`,name:`Gemini 原生`,description:`适合 Google Gemini 原生接口。`,defaultBaseUrl:`https://generativelanguage.googleapis.com/v1beta`,defaultFamily:`gemini`},{id:`grok_v1`,name:`Grok 原生`,description:`适合 xAI Grok 原生接口。`,defaultBaseUrl:`https://api.x.ai/v1`,defaultFamily:`grok`},{id:`vercel_gateway_v1`,name:`Vercel AI Gateway`,description:`适合 Vercel AI Gateway。`,defaultBaseUrl:`https://ai-gateway.vercel.sh/v1`,defaultFamily:`gpt`}],oa=[{id:`huyooo`,name:`Huyooo`},{id:`dashscope`,name:`通义千问`},{id:`deepseek`,name:`DeepSeek`},{id:`glm`,name:`智谱 GLM`},{id:`moonshot`,name:`Moonshot`},{id:`minimax`,name:`MiniMax`},{id:`openai`,name:`OpenAI`},{id:`anthropic`,name:`Anthropic`},{id:`google-ai-studio`,name:`Google AI Studio`},{id:`grok`,name:`xAI Grok`},{id:`volcengine`,name:`火山方舟`},{id:`custom`,name:`自定义服务`}],Q=`https://ai.huyooo.com/aiRestfulApi`,$=`https://ark.cn-beijing.volces.com/api/coding/v3`,sa=`https://ark.cn-beijing.volces.com/api/coding`,ca=`https://openrouter.ai/api/v1`,la=`https://api.siliconflow.cn/v1`,ua=[{servicePlan:{id:`huyooo-official`,providerId:`huyooo`,name:`Huyooo 官方服务`,description:`使用当前登录态和官方计费额度。`,kind:`official`,authMode:`huyooo-session`,baseUrlEditable:!1,modelEditable:!1,adapterEditable:!1},modelTemplates:[{id:`huyooo:doubao-seed-2-0-pro-260215`,servicePlanId:`huyooo-official`,providerId:`volcengine`,displayName:`doubao-seed-2-0-pro-260215`,family:`doubao`,protocol:`ark_v1`,baseUrl:`${Q}/volcengine/ark/api/v3`,providerModelId:`doubao-seed-2-0-pro-260215`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:doubao-seed-2-0-lite-260215`,servicePlanId:`huyooo-official`,providerId:`volcengine`,displayName:`doubao-seed-2-0-lite-260215`,family:`doubao`,protocol:`ark_v1`,baseUrl:`${Q}/volcengine/ark/api/v3`,providerModelId:`doubao-seed-2-0-lite-260215`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:doubao-seed-2-0-code-preview-260215`,servicePlanId:`huyooo-official`,providerId:`volcengine`,displayName:`doubao-seed-2-0-code-preview-260215`,family:`doubao`,protocol:`ark_v1`,baseUrl:`${Q}/volcengine/ark/api/v3`,providerModelId:`doubao-seed-2-0-code-preview-260215`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:qwen3-max-preview`,servicePlanId:`huyooo-official`,providerId:`dashscope`,displayName:`qwen3-max-preview`,family:`qwen`,protocol:`openai_chat_v1`,baseUrl:`${Q}/dashscope/compatible-mode/v1`,providerModelId:`qwen3-max-preview`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:262144,maxOutputTokens:16384,source:`official`,defaultEnabled:!0},{id:`huyooo:qwen-plus-latest`,servicePlanId:`huyooo-official`,providerId:`dashscope`,displayName:`qwen-plus-latest`,family:`qwen`,protocol:`openai_chat_v1`,baseUrl:`${Q}/dashscope/compatible-mode/v1`,providerModelId:`qwen-plus-latest`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:131072,maxOutputTokens:8192,source:`official`,defaultEnabled:!0},{id:`huyooo:qwen3.5-plus`,servicePlanId:`huyooo-official`,providerId:`dashscope`,displayName:`qwen3.5-plus`,family:`qwen`,protocol:`qwen_v1`,baseUrl:`${Q}/dashscope/api/v1`,providerModelId:`qwen3.5-plus`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:1e6,maxOutputTokens:32768,source:`official`,defaultEnabled:!0},{id:`huyooo:deepseek-chat`,servicePlanId:`huyooo-official`,providerId:`deepseek`,displayName:`deepseek-chat`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:`${Q}/deepseek/v1`,providerModelId:`deepseek-chat`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`official`,defaultEnabled:!0},{id:`huyooo:deepseek-reasoner`,servicePlanId:`huyooo-official`,providerId:`deepseek`,displayName:`deepseek-reasoner`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:`${Q}/deepseek/v1`,providerModelId:`deepseek-reasoner`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:64e3,source:`official`,defaultEnabled:!0},{id:`huyooo:glm-5`,servicePlanId:`huyooo-official`,providerId:`glm`,displayName:`glm-5`,family:`glm`,protocol:`glm_v1`,baseUrl:`${Q}/glm/v1`,providerModelId:`glm-5`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:kimi-k2.5`,servicePlanId:`huyooo-official`,providerId:`moonshot`,displayName:`kimi-k2.5`,family:`moonshot`,protocol:`moonshot_v1`,baseUrl:`${Q}/moonshot/v1`,providerModelId:`kimi-k2.5`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:MiniMax-M2.5`,servicePlanId:`huyooo-official`,providerId:`minimax`,displayName:`MiniMax-M2.5`,family:`minimax`,protocol:`minimax_v1`,baseUrl:`${Q}/minimax/anthropic`,providerModelId:`MiniMax-M2.5`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:204800,maxOutputTokens:65536,source:`official`,defaultEnabled:!0},{id:`huyooo:gpt-5.2-codex`,servicePlanId:`huyooo-official`,providerId:`openai`,displayName:`gpt-5.2-codex`,family:`gpt`,protocol:`openai_v1`,baseUrl:`${Q}/openai/v1`,providerModelId:`gpt-5.2-codex`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:4e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:gpt-5.2`,servicePlanId:`huyooo-official`,providerId:`openai`,displayName:`gpt-5.2`,family:`gpt`,protocol:`openai_v1`,baseUrl:`${Q}/openai/v1`,providerModelId:`gpt-5.2`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:4e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:gemini-2.5-flash`,servicePlanId:`huyooo-official`,providerId:`google-ai-studio`,displayName:`gemini-2.5-flash`,family:`gemini`,protocol:`gemini_v1`,baseUrl:`${Q}/gemini/v1beta`,providerModelId:`gemini-2.5-flash`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:1048576,maxOutputTokens:65536,source:`official`,defaultEnabled:!0},{id:`huyooo:gemini-2.5-pro`,servicePlanId:`huyooo-official`,providerId:`google-ai-studio`,displayName:`gemini-2.5-pro`,family:`gemini`,protocol:`gemini_v1`,baseUrl:`${Q}/gemini/v1beta`,providerModelId:`gemini-2.5-pro`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:1048576,maxOutputTokens:65536,source:`official`,defaultEnabled:!0},{id:`huyooo:claude-haiku-4-5-20251001`,servicePlanId:`huyooo-official`,providerId:`anthropic`,displayName:`claude-haiku-4-5-20251001`,family:`claude`,protocol:`anthropic_v1`,baseUrl:`${Q}/anthropic/v1`,providerModelId:`claude-haiku-4-5-20251001`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:64e3,source:`official`,defaultEnabled:!0},{id:`huyooo:claude-sonnet-4-6`,servicePlanId:`huyooo-official`,providerId:`anthropic`,displayName:`claude-sonnet-4-6`,family:`claude`,protocol:`anthropic_v1`,baseUrl:`${Q}/anthropic/v1`,providerModelId:`claude-sonnet-4-6`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`official`,defaultEnabled:!0},{id:`huyooo:grok-4.20-0309-non-reasoning`,servicePlanId:`huyooo-official`,providerId:`grok`,displayName:`grok-4.20-0309-non-reasoning`,family:`grok`,protocol:`grok_v1`,baseUrl:`${Q}/grok/v1`,providerModelId:`grok-4.20-0309-non-reasoning`,supportsThinking:!1,supportsVision:!0,contextWindowTokens:2e6,maxOutputTokens:32768,source:`official`,defaultEnabled:!0},{id:`huyooo:grok-4.20-0309-reasoning`,servicePlanId:`huyooo-official`,providerId:`grok`,displayName:`grok-4.20-0309-reasoning`,family:`grok`,protocol:`grok_v1`,baseUrl:`${Q}/grok/v1`,providerModelId:`grok-4.20-0309-reasoning`,supportsThinking:!1,supportsVision:!0,contextWindowTokens:2e6,maxOutputTokens:32768,source:`official`,defaultEnabled:!0}]},{servicePlan:{id:`custom-api-key`,providerId:`custom`,name:`原厂 API Key`,description:`使用用户自己购买的模型厂商 API Key。未预置的厂商可手动配置 Base URL、适配器和模型名。`,kind:`vendor_api_key`,authMode:`api-key`,baseUrlEditable:!0,modelEditable:!0,adapterEditable:!0},modelTemplates:[{id:`custom-api-key:custom-model`,servicePlanId:`custom-api-key`,providerId:`custom`,displayName:`custom-model`,family:`gpt`,protocol:`openai_chat_v1`,baseUrl:`https://api.example.com/v1`,providerModelId:`custom-model`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`vendor-api-key`,defaultEnabled:!0}]},{servicePlan:{id:`volcengine-coding-plan`,providerId:`volcengine`,name:`火山方舟 Coding Plan`,description:`第三方模型代理服务。用户自行购买后填写 API Key,SuperX 使用官方推荐模型和地址。`,kind:`model_proxy`,authMode:`api-key`,baseUrlEditable:!1,modelEditable:!1,adapterEditable:!1},modelTemplates:[{id:`volcengine-coding-plan:ark-code-latest`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Auto (ark-code-latest)`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`ark-code-latest`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!0},{id:`volcengine-coding-plan:doubao-seed-2.0-code`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-2.0-Code`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-2.0-code`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:doubao-seed-2.0-pro`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-2.0-pro`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-2.0-pro`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:doubao-seed-2.0-lite`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-2.0-lite`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-2.0-lite`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:doubao-seed-code`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Doubao-Seed-Code`,family:`doubao`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`doubao-seed-code`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:minimax-latest`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`MiniMax-M2.7`,family:`minimax`,protocol:`anthropic_v1`,baseUrl:sa,providerModelId:`minimax-latest`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:minimax-m2.5`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`MiniMax-M2.5`,family:`minimax`,protocol:`anthropic_v1`,baseUrl:sa,providerModelId:`minimax-m2.5`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1,status:`deprecated`},{id:`volcengine-coding-plan:glm-5.1`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`GLM-5.1`,family:`glm`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`glm-5.1`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:glm-4.7`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`GLM-4.7`,family:`glm`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`glm-4.7`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:2e5,maxOutputTokens:128e3,source:`coding-plan`,defaultEnabled:!1,status:`deprecated`},{id:`volcengine-coding-plan:deepseek-v3.2`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Deepseek-V3.2`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`deepseek-v3.2`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:deepseek-v4-flash`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`DeepSeek-V4-Flash`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`deepseek-v4-flash`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:1024e3,maxOutputTokens:384e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:deepseek-v4-pro`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`DeepSeek-V4-Pro`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`deepseek-v4-pro`,supportsThinking:!0,supportsVision:!1,contextWindowTokens:1024e3,maxOutputTokens:384e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:kimi-k2.6`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Kimi-K2.6`,family:`moonshot`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`kimi-k2.6`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:32e3,source:`coding-plan`,defaultEnabled:!1},{id:`volcengine-coding-plan:kimi-k2.5`,servicePlanId:`volcengine-coding-plan`,providerId:`volcengine`,displayName:`Kimi-K2.5`,family:`moonshot`,protocol:`openai_chat_v1`,baseUrl:$,providerModelId:`kimi-k2.5`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:256e3,maxOutputTokens:32e3,source:`coding-plan`,defaultEnabled:!1,status:`deprecated`}]},{servicePlan:{id:`openrouter`,providerId:`openrouter`,name:`OpenRouter`,description:`第三方模型代理服务。模型名和路由与原厂不同,使用 OpenRouter 已验证兼容配置。`,kind:`model_proxy`,authMode:`api-key`,baseUrlEditable:!1,modelEditable:!1,adapterEditable:!1},modelTemplates:[{id:`openrouter:deepseek/deepseek-chat`,servicePlanId:`openrouter`,providerId:`openrouter`,displayName:`DeepSeek Chat`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:ca,providerModelId:`deepseek/deepseek-chat`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`model-proxy`,defaultEnabled:!0},{id:`openrouter:google/gemini-2.5-flash`,servicePlanId:`openrouter`,providerId:`openrouter`,displayName:`Gemini 2.5 Flash`,family:`gemini`,protocol:`openai_chat_v1`,baseUrl:ca,providerModelId:`google/gemini-2.5-flash`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:1048576,maxOutputTokens:65536,source:`model-proxy`,defaultEnabled:!1},{id:`openrouter:anthropic/claude-sonnet-4.5`,servicePlanId:`openrouter`,providerId:`openrouter`,displayName:`Claude Sonnet 4.5`,family:`claude`,protocol:`openai_chat_v1`,baseUrl:ca,providerModelId:`anthropic/claude-sonnet-4.5`,supportsThinking:!0,supportsVision:!0,contextWindowTokens:2e5,maxOutputTokens:64e3,source:`model-proxy`,defaultEnabled:!1}]},{servicePlan:{id:`siliconflow`,providerId:`siliconflow`,name:`硅基流动`,description:`第三方模型代理服务。使用硅基流动模型名和 OpenAI 兼容入口。`,kind:`model_proxy`,authMode:`api-key`,baseUrlEditable:!1,modelEditable:!1,adapterEditable:!1},modelTemplates:[{id:`siliconflow:Qwen/Qwen3-Coder-480B-A35B-Instruct`,servicePlanId:`siliconflow`,providerId:`siliconflow`,displayName:`Qwen3 Coder 480B`,family:`qwen`,protocol:`openai_chat_v1`,baseUrl:la,providerModelId:`Qwen/Qwen3-Coder-480B-A35B-Instruct`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:256e3,maxOutputTokens:8192,source:`model-proxy`,defaultEnabled:!0},{id:`siliconflow:deepseek-ai/DeepSeek-V3.2`,servicePlanId:`siliconflow`,providerId:`siliconflow`,displayName:`DeepSeek V3.2`,family:`deepseek`,protocol:`openai_chat_v1`,baseUrl:la,providerModelId:`deepseek-ai/DeepSeek-V3.2`,supportsThinking:!1,supportsVision:!1,contextWindowTokens:128e3,maxOutputTokens:8192,source:`model-proxy`,defaultEnabled:!1}]}],da=ua.map(e=>({...e.servicePlan,modelTemplateIds:e.modelTemplates.map(e=>e.id)}));function fa(e){return aa.find(t=>t.id===e)??null}function pa(e){return ua.find(t=>t.servicePlan.id===e)??null}function ma(e){let t=pa(e);return t?{...t.servicePlan,modelTemplateIds:t.modelTemplates.map(e=>e.id)}:null}function ha(e){for(let t of ua){let n=t.modelTemplates.find(t=>t.id===e);if(n)return n}return null}function ga(e){return pa(e)?.modelTemplates??[]}function _a(e,t){let n={baseUrl:e.baseUrl,accessKey:t.accessKey,protocol:e.protocol,providerModelId:e.providerModelId,...e.path?{path:e.path}:{},...t.vendorKey?{vendorKey:t.vendorKey}:{},...t.headers?{headers:t.headers}:{}};return[t.modelId??e.id,{displayName:e.displayName,family:e.family,supportsThinking:e.supportsThinking,supportsVision:e.supportsVision,contextWindowTokens:e.contextWindowTokens,maxOutputTokens:e.maxOutputTokens,routes:[n],metadata:{source:e.source,provider:e.providerId,servicePlanId:e.servicePlanId,templateId:e.id,...e.status?{status:e.status}:{},...t.metadata}}]}function va(e,t){let n=t.toLowerCase();return!!(e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function ya(){let e=new Map;return{add(t){e.set(t.name,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>va(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function ba(e,t={}){return{...G({kind:`part`,scope:e.source===`user`?`local`:`core`,runtime:`part-render`,governance:t.governance??Rr()}),ref:e.name,name:e.name,description:e.description,category:e.category,tags:e.tags,source:e.source,enabled:e.enabled,...t}}function xa(e,t){return{...ba(e),...t}}export{It as AnthropicProtocol,Je as ArkProtocol,oe as CHAT_EVENT_TYPES,hn as CLAUDE_FAMILY,Ci as ChatOrchestrator,Ei as ChatRuntime,cn as DEEPSEEK_FAMILY,Ie as DEFAULT_MODEL,sn as DOUBAO_FAMILY,tt as DeepSeekProtocol,pn as GEMINI_FAMILY,mn as GPT_FAMILY,aa as MODEL_CATALOG_ADAPTERS,oa as MODEL_CATALOG_PROVIDERS,ua as MODEL_CATALOG_SERVICE_ENTRIES,da as MODEL_CATALOG_SERVICE_PLANS,gn as MODEL_FAMILIES,Sn as ModelAdapter,tn as OpenAIChatProtocol,ln as QWEN_FAMILY,st as QwenProtocol,O as STANDARD_TOOL_ERROR_SCHEMA,W as TOOL_FORMATS,T as ToolException,n as Type,qr as analyzeCommandRisk,wn as buildModelOptions,_a as compileModelTemplate,xe as createAbort,Gi as createActionResult,Bt as createAnthropicProtocol,F as createApiError,Ye as createArkProtocol,G as createAssetSummaryBase,L as createAssistantSegmentStart,Ui as createCollectionResult,Kr as createCommandGovernanceSnapshot,Gr as createCommandToolMetadata,nt as createDeepSeekProtocol,ge as createDone,P as createError,Mn as createInProcessProvider,Wi as createInspectResult,Lr as createLocalMcpServerGovernance,Ir as createLocalToolGovernance,Zr as createManagedMcpServerDetail,Xr as createManagedMcpServerSummary,xa as createManagedPartDetail,ba as createManagedPartSummary,Ai as createManagedSkillDetail,Y as createManagedSkillSummary,Yr as createManagedToolDetail,Jr as createManagedToolSummary,In as createMcpProvider,R as createModuleLogger,nn as createOpenAIChatProtocol,wi as createOrchestrator,be as createParseError,Rr as createPartAssetGovernance,dt as createQwenProtocol,_e as createRateLimitError,te as createResolvedOutputSchema,I as createStepEnd,Se as createStepStart,me as createTextDelta,ce as createThinkingDelta,le as createThinkingEnd,se as createThinkingStart,ye as createTimeoutError,Ki as createToggleResult,de as createToolCallOutput,fe as createToolCallRequest,N as createToolCallResult,ue as createToolCallStart,ve as createToolError,jr as createToolRuntimeManager,Pt as createVercelGatewayProtocol,Or as defineTool,yn as findRouteByProtocol,Cn as formatContextWindow,Di as getBaseProtocol,ji as getBooleanWithDefault,Ue as getLogger,fa as getModelAdapter,Tn as getModelContextConfigFromLLM,pa as getModelServiceEntry,ma as getModelServicePlan,ha as getModelTemplate,Z as getOptionalString,X as getRequiredString,vn as getRouteChain,Mi as getStringArray,Ni as getStringRecord,mr as hasToolFormat,He as initLogger,Me as isAbortEvent,Pe as isAssistantSegmentEvent,je as isErrorEvent,Fe as isRetryableError,Ae as isStatusEvent,Ne as isStepEvent,ke as isTextEvent,De as isThinkingEvent,E as isToolError,Oe as isToolEvent,h as isToolResult,ga as listModelTemplatesByServicePlan,C as mergeToolGovernance,g as normalizeToolResult,ya as partRegistry,Vr as readAssetGovernanceOverrides,pr as registerToolFormat,fr as registerToolFormats,V as resolveModelFamilyConfig,_n as resolveRouteUrl,w as resolveToolGovernanceSnapshot,y as resolveToolResultUi,ie as resolveTools,_ as serializeToolResult,ia as skillManagementPlugin,ki as skillRegistry,Pi as splitCommaSeparatedStrings,D as throwToolError,Br as toAssetGovernanceOverrides,ne as tool,p as toolOk,re as tools,Cr as validateJsonSchemaArgs,Sr as validateTypeBoxArgs};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export declare const HUYOOO_AI_BASE_URL = "https://ai.huyooo.com/aiRestfulApi";
|
|
2
2
|
export declare const ARK_CODING_CHAT_BASE_URL = "https://ark.cn-beijing.volces.com/api/coding/v3";
|
|
3
3
|
export declare const ARK_CODING_ANTHROPIC_BASE_URL = "https://ark.cn-beijing.volces.com/api/coding";
|
|
4
|
+
export declare const OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
|
|
5
|
+
export declare const SILICONFLOW_BASE_URL = "https://api.siliconflow.cn/v1";
|