@zwbigi/ink-xy 0.1.13 → 0.1.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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +4 -3
- package/.next/build-manifest.json +2 -2
- package/.next/routes-manifest.json +6 -0
- package/.next/server/app/_global-error/page.js +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agent/[id]/events/route.js +2 -2
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/describe-image/route.js +1 -1
- package/.next/server/app/api/agent/describe-image/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/new/route.js +1 -1
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/parse-characters/route.js +43 -0
- package/.next/server/app/api/agent/parse-characters/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/parse-characters/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/all-providers/route.js +1 -1
- package/.next/server/app/api/auth/all-providers/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/providers/route.js +1 -1
- package/.next/server/app/api/auth/providers/route.js.nft.json +1 -1
- package/.next/server/app/api/default-cwd/route.js +1 -1
- package/.next/server/app/api/files/[...path]/route.js +3 -3
- package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/gem-xy/[id]/route.js +1 -1
- package/.next/server/app/api/gem-xy/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/gem-xy/route.js +1 -1
- package/.next/server/app/api/gem-xy/route.js.nft.json +1 -1
- package/.next/server/app/api/home/route.js +1 -1
- package/.next/server/app/api/inkos/route.js +1 -1
- package/.next/server/app/api/inkos/route.js.nft.json +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/models-config/route.js +1 -1
- package/.next/server/app/api/models-config/route.js.nft.json +1 -1
- package/.next/server/app/api/register-cwd/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js +2 -2
- package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/lock/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/lock/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/new/route.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/install/route.js +1 -1
- package/.next/server/app/api/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/search/route.js +1 -1
- package/.next/server/app/api/skills/search/route.js.nft.json +1 -1
- package/.next/server/app/api/tts/synthesize/route.js +1 -1
- package/.next/server/app/api/tts/synthesize/route.js.nft.json +1 -1
- package/.next/server/app/favicon.ico/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page.js +64 -29
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -3
- package/.next/server/chunks/162.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/Y5hk_NhnX1o3afMM2Tt5-/_buildManifest.js +1 -0
- package/.next/static/chunks/app/_global-error/page-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/agent/describe-image/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/agent/parse-characters/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/auth/all-providers/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/gem-xy/[id]/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/gem-xy/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/home/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/inkos/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/models/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/register-cwd/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/lock/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/sessions/new/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/skills/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/api/tts/synthesize/route-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/app/page-3c94fbcf268ba682.js +202 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-63ec4518ba538b61.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-63ec4518ba538b61.js +1 -0
- package/.next/trace +4 -4
- package/.next/trace-build +1 -1
- package/.next/types/app/api/agent/parse-characters/route.ts +351 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/inkos/packages/cli/dist/index.js +2 -2
- package/inkos/packages/core/dist/pipeline/runner.js +2 -2
- package/inkos/packages/core/dist/pipeline/runner.js.map +1 -1
- package/inkos/packages/core/src/pipeline/runner.ts +2 -2
- package/package.json +1 -1
- package/.next/static/_dVc8qn-Ll1d6faCafbmD/_buildManifest.js +0 -1
- package/.next/static/chunks/app/_global-error/page-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/events/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/agent/describe-image/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/agent/new/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/auth/all-providers/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/auth/login/[provider]/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/auth/providers/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/default-cwd/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/files/[...path]/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/gem-xy/[id]/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/gem-xy/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/home/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/inkos/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/models/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/models-config/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/register-cwd/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/context/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/lock/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/sessions/new/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/skills/install/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/skills/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/skills/search/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/api/tts/synthesize/route-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/app/page-fbf66e00e4553a09.js +0 -167
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-7f5e7bebe7a745ed.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-7f5e7bebe7a745ed.js +0 -1
- /package/.next/static/{_dVc8qn-Ll1d6faCafbmD → Y5hk_NhnX1o3afMM2Tt5-}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
(()=>{var a={};a.id=314,a.ids=[314],a.modules={261:a=>{"use strict";a.exports=require("next/dist/shared/lib/router/utils/app-paths")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},16510:(a,b,c)=>{"use strict";function d(a,b){let c=a.toLowerCase(),d=b.toLowerCase();return!(d.includes("tts")||d.includes("voiceclone")||d.includes("voicedesign")||d.includes("audio-gen")||d.includes("mimo")&&d.includes("flash"))&&(c.includes("deepseek")||d.includes("deepseek")?!!(d.includes("vl")||d.includes("v4")||d.includes("janus")||d.includes("ocr")):c.includes("openai")?!d.includes("o1-mini")&&!!(d.includes("gpt-4o")||d.includes("gpt-5")||d.includes("gpt-4.5")||d.includes("gpt-4-turbo")||d.includes("vision")||d.includes("multimodal")||"o1"===d||d.startsWith("o1-202")):c.includes("anthropic")?!!(d.includes("claude-3")||d.includes("claude-4")||d.includes("claude-5")||d.includes("claude-sonnet")||d.includes("claude-opus")||d.includes("claude-")&&(d.includes("vision")||d.includes("multimodal"))):c.includes("google")||c.includes("gemini")?!!(d.includes("gemini-")||d.includes("omni")||d.includes("vision")||d.includes("multimodal")):!!(d.includes("vision")||d.includes("multimodal")||d.includes("vlm")||d.includes("vla")||d.includes("gpt-4o")||d.includes("gpt-5")||d.includes("gpt-4.5")||d.includes("claude-3")||d.includes("claude-4")||d.includes("gemini-")||d.includes("pixtral")||d.includes("mimo")||d.includes("-vl")||d.includes("molmo")||d.includes("paligemma")||d.includes("gemma-3")||d.includes("gemma-4")||d.includes("gemma-5")||d.includes("llama")&&(d.includes("11b")||d.includes("90b")||d.includes("vision")||d.includes("multimodal"))||d.includes("qwen")&&d.includes("vl")||d.includes("glm")&&(d.includes("vision")||d.includes("vl")||d.includes("thinking")||/glm-(?:\d+(?:\.\d+)?v|edge-v|omni)/i.test(d))||d.includes("cogvlm")||d.includes("internvl")||d.includes("yi")&&d.includes("vl")||d.includes("step-")&&(d.includes("v")||d.includes("vision"))||d.includes("hunyuan")&&(d.includes("vision")||d.includes("vl"))||d.includes("doubao")&&(d.includes("vision")||d.includes("vl"))||(d.includes("kimi")||d.includes("moonshot"))&&(d.includes("vision")||d.includes("vl")||d.includes("2.6")||d.includes("k2"))||d.includes("abab")&&(d.includes("vision")||d.includes("vl"))||d.includes("minimax")&&(d.includes("vision")||d.includes("vl"))||d.includes("hailuo")))}c.d(b,{S:()=>d})},21820:a=>{"use strict";a.exports=require("os")},23582:(a,b,c)=>{"use strict";var d=c(21820),e=c(33873),f=c(29021);let g=(0,d.homedir)(),h=(0,e.join)(g,".ink","agent"),i=(0,e.join)(g,".pi","agent");process.env.PI_CODING_AGENT_DIR||(process.env.PI_CODING_AGENT_DIR=h);try{if((0,f.existsSync)(i)){for(let a of((0,f.existsSync)(h)||(0,f.mkdirSync)(h,{recursive:!0}),["models.json","auth.json","settings.json","fetched-models-cache.json","gem_xy.json","locked-sessions.json"])){let b=(0,e.join)(i,a),c=(0,e.join)(h,a);if((0,f.existsSync)(b)&&function(a){try{if(!(0,f.existsSync)(a))return!0;let b=(0,f.readFileSync)(a,"utf8").trim();if(!b||"{}"===b||'{\n "providers": {}\n}'===b)return!0;let c=JSON.parse(b);if(0===Object.keys(c).length||c.providers&&0===Object.keys(c.providers).length)return!0;return!1}catch{return!0}}(c))try{(0,f.writeFileSync)(c,(0,f.readFileSync)(b)),console.log(`[env-init] Migrated config file ${a} from .pi/agent to .ink/agent`)}catch(b){console.error(`[env-init] Failed to migrate config file ${a}:`,b)}}for(let a of["sessions","skills","bin"]){let b=(0,e.join)(i,a),c=(0,e.join)(h,a);if((0,f.existsSync)(b))try{!function a(b,c){if((0,f.existsSync)(b))for(let d of((0,f.existsSync)(c)||(0,f.mkdirSync)(c,{recursive:!0}),(0,f.readdirSync)(b,{withFileTypes:!0}))){let g=(0,e.join)(b,d.name),h=(0,e.join)(c,d.name);if(d.isDirectory())a(g,h);else try{(0,f.existsSync)(h)||(0,f.writeFileSync)(h,(0,f.readFileSync)(g))}catch(a){console.error(`[env-init] Failed to copy file ${g} to ${h}:`,a)}}}(b,c),console.log(`[env-init] Migrated directory ${a} from .pi/agent to .ink/agent`)}catch(b){console.error(`[env-init] Failed to migrate directory ${a}:`,b)}}let a=(0,e.join)(g,".pi");if((0,f.existsSync)(a))try{let b=a+".bak",c=b,d=1;for(;(0,f.existsSync)(c);)c=`${b}_${d}`,d++;(0,f.renameSync)(a,c),console.log(`[env-init] Renamed old config dir ${a} to ${c}`)}catch(a){console.error("[env-init] Failed to rename old config dir:",a)}}}catch(a){console.error("[env-init] Migration failed:",a)}},29021:a=>{"use strict";a.exports=require("fs")},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33873:a=>{"use strict";a.exports=require("path")},36337:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{POST:()=>j,dynamic:()=>k}),c(23582);var e=c(23211),f=c(75430),g=c(98388),h=c(29021),i=a([f,g]);[f,g]=i.then?(await i)():i;let k="force-dynamic";async function j(a){try{let{content:b}=await a.json();if(!b||!b.trim())return e.NextResponse.json({error:"Content is required"},{status:400});let c=(0,f.getAgentDir)(),d=f.AuthStorage.create(),h=f.ModelRegistry.create(d);console.log("[parse-characters] CWD:",process.cwd()),console.log("[parse-characters] PI_CODING_AGENT_DIR Env:",process.env.PI_CODING_AGENT_DIR),console.log("[parse-characters] Resolved agentDir:",c);let i=f.SettingsManager.create(process.cwd(),c),j=i.getDefaultProvider()||"",k=i.getDefaultModel()||"";console.log("[parse-characters] Default provider from settings:",j),console.log("[parse-characters] Default modelId from settings:",k);let l="",m="",n={"Content-Type":"application/json"},o=!1,p=j&&k?(0,g.P6)(h,j,k):void 0;if(console.log("[parse-characters] Resolved model from findModel:",p?JSON.stringify(p):"undefined"),p){let a=await h.getApiKeyAndHeaders(p);if(console.log("[parse-characters] Auth registry check result:",JSON.stringify(a)),!a.ok)return e.NextResponse.json({error:`无法解析模型认证: ${a.error}`},{status:400});m=`${p.baseUrl}/chat/completions`,a.apiKey&&(l=a.apiKey,n.Authorization=`Bearer ${l}`),a.headers&&(n={...n,...a.headers}),k=p.id,j=p.provider,("google"===j.toLowerCase()||"gemini"===j.toLowerCase())&&(o=!0)}else{if(j){let a=d.get(j);if(a?.key)l=a.key;else for(let a of[`${j.toUpperCase()}_API_KEY`,`${j.toUpperCase().replace("-","_")}_API_KEY`])if(process.env[a]){l=process.env[a];break}}if(!l){let a=d.get("openai");if(a?.key)l=a.key,j="openai",k="gpt-4o-mini";else{let a=d.get("anthropic");a?.key&&(l=a.key,j="anthropic",k="claude-3-5-sonnet-20241022")}}if(!l&&(process.env.OPENAI_API_KEY?(l=process.env.OPENAI_API_KEY,j="openai",k="gpt-4o-mini"):process.env.ANTHROPIC_API_KEY?(l=process.env.ANTHROPIC_API_KEY,j="anthropic",k="claude-3-5-sonnet-20241022"):(process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY)&&(l=process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY||"",j="google",k="gemini-1.5-flash")),!l)return e.NextResponse.json({error:"未配置可用模型的 API 密钥。请先在侧边栏底部的 Models 中配置 API Key,或在系统环境变量中设置 OPENAI_API_KEY。"},{status:400});n.Authorization=`Bearer ${l}`,m="https://api.openai.com/v1/chat/completions","openrouter"===j?m="https://openrouter.ai/api/v1/chat/completions":j.includes("xiaomi-token-plan")||j.includes("mimo")||j.includes("lingya")?m=process.env.LINGYA_API_URL?`${process.env.LINGYA_API_URL}/chat/completions`:"https://token-plan.api.xiaomi.net/v1/chat/completions":("google"===j||"gemini"===j)&&(o=!0)}let q=[];for(let a of b.split("\n"))if(a.startsWith("##")&&!/关系|一览|目录|介绍|人设总览|人设一览/i.test(a)){let b=a.replace(/^##+\s+/,"").trim().replace(/^\d+[\s.、·-]/,"").trim();if(b.includes("——")){let a=b.split("——").map(a=>a.trim()),c=a[0].replace(/\([^\)]+\)/g,"").replace(/([^)]+)/g,"").replace(/['"“”]/g,"").trim(),d=a[1].replace(/\([^\)]+\)/g,"").replace(/([^)]+)/g,"").replace(/['"“”]/g,"").trim();b=d&&d.length<c.length&&(c.length>6||/AI|计划|系统|后方/i.test(c))?d:c}else if(b.includes(" - ")){let a=b.split(" - ").map(a=>a.trim()),c=a[0].replace(/\([^\)]+\)/g,"").replace(/([^)]+)/g,"").replace(/['"“”]/g,"").trim(),d=a[1].replace(/\([^\)]+\)/g,"").replace(/([^)]+)/g,"").replace(/['"“”]/g,"").trim();b=d&&d.length<c.length&&(c.length>6||/AI|计划|系统|后方/i.test(c))?d:c}else b=b.replace(/\([^\)]+\)/g,"").replace(/([^)]+)/g,"").replace(/['"“”]/g,"").trim();b&&b.length>=2&&b.length<=15&&q.push(b)}console.log(`[parse-characters] Extracted ${q.length} character names for cross-referencing:`,q);let r=function(a,b=5){let c=a.split("\n"),d=[],e=null;for(let a of c)a.startsWith("##")&&!/关系|一览|目录|介绍|人设总览|人设一览/i.test(a)?(e&&d.push(e),e={heading:a,bodyLines:[]}):e&&e.bodyLines.push(a);if(e&&d.push(e),0===d.length)return[a];let f=[];for(let a=0;a<d.length;a+=b){let c=d.slice(a,a+b).map(a=>`${a.heading}
|
|
2
|
+
${a.bodyLines.join("\n")}`).join("\n\n");f.push(c)}return f}(b,5);console.log(`[parse-characters] Split input into ${r.length} chunks.`);let s=[];for(let a=0;a<r.length;a++){let b=r[a],c=`你是一个顶级的小说创作助手和结构化数据提取专家。
|
|
3
|
+
请帮我把下面这段描述小说角色人设的文本,提取并解析成结构化的 JSON 数组。
|
|
4
|
+
|
|
5
|
+
输入文本包含一个或多个人物。请你完美地解析出所有人物,并填补所有必需的字段。
|
|
6
|
+
|
|
7
|
+
输出格式必须是符合以下 TypeScript 类型的 JSON 数组:
|
|
8
|
+
\`\`\`typescript
|
|
9
|
+
interface ParsedCharacter {
|
|
10
|
+
name: string; // 角色姓名(例如:"林墨")
|
|
11
|
+
tier: "major" | "minor"; // 角色等级:"major" 代表主角或主要配角,"minor" 代表普通配角或龙套。如果无法确定,默认 "major"。
|
|
12
|
+
tags: string[]; // 核心性格/职业/身份标签列表,最多 5 个标签(例如:["考古学家", "冷静", "执拗"])
|
|
13
|
+
contrast: string; // 矛盾细节与立体反差维度设计(例如:"外表温和克制,面对真相时偏执狂热,容易忽视身边人的安全。父亲因秘密激活能量碎片殉职,心怀负罪感。")。如果没有,从性格缺点、秘密、冲突中概括。
|
|
14
|
+
bio: string; // 背景小传与生平经历描述。
|
|
15
|
+
relationships: {
|
|
16
|
+
target: string; // 关联 of another character's name (must be a clean name from the list, e.g. "苏晴")
|
|
17
|
+
type: string; // relationship description (e.g. "行动哲学对立,专业上互相信任")
|
|
18
|
+
}[];
|
|
19
|
+
}
|
|
20
|
+
\`\`\`
|
|
21
|
+
|
|
22
|
+
【关键提取要求】:
|
|
23
|
+
1. 姓名清洗:移除名字周围的任何修饰词、序号、属性括号等,只保留干净的人名(例如:把 "1. 林墨(主角)—— "在废墟中寻找自己的人"" 清洗为 "林墨",把 ""零号"" 清洗为 "零号")。
|
|
24
|
+
2. 人际关系交叉提取:提取每个人物与其他人物之间的关系。
|
|
25
|
+
本小说包含的所有可能角色名单为:${JSON.stringify(q)}。
|
|
26
|
+
如果本批角色的描述文本中提及了名单中的任何其他角色,请务必在 \`relationships\` 中建立关系条目。
|
|
27
|
+
3. 保持数据完整:不要遗漏任何角色,还原用户输入的所有角色信息。
|
|
28
|
+
4. 返回格式:必须直接返回合法的 JSON 数组,绝对不要包含 Markdown 格式的包裹(如 \`\`\`json 标记),不要有任何前导字眼,确保可以直接被 JSON.parse 解析。
|
|
29
|
+
5. 属性值内的双引号处理:属性值内部绝对不能包含未转义 of English double quotes ("). If the extracted text contains double quotes, please replace them with Chinese double quotes (“”) or escape them properly.
|
|
30
|
+
6. 属性值内的换行处理:属性值内的所有换行,必须强制使用转义的 \\n,绝对不允许在 JSON 中出现物理换行!
|
|
31
|
+
|
|
32
|
+
以下是本批待解析的输入文本:
|
|
33
|
+
---
|
|
34
|
+
${b}
|
|
35
|
+
---`,d=null,e=null;for(let b=1;b<=3;b++)try{let e;if(console.log(`[parse-characters] Processing chunk ${a+1}/${r.length}, attempt ${b}...`),!(e=o?await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${k}:generateContent?key=${l}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:[{parts:[{text:c}]}],generationConfig:{maxOutputTokens:4e3}})}):"anthropic"===j?await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"x-api-key":l,"anthropic-version":"2023-06-01","content-type":"application/json"},body:JSON.stringify({model:k||"claude-3-5-sonnet-20241022",max_tokens:3e3,messages:[{role:"user",content:c}]})}):await fetch(m,{method:"POST",headers:n,body:JSON.stringify({model:k,messages:[{role:"user",content:c}],max_tokens:3e3})})).ok){let a=await e.text();throw Error(`API returned status ${e.status}: ${a}`)}let f="";if(o){let a=await e.json();f=a.candidates?.[0]?.content?.parts?.[0]?.text?.trim()||""}else if("anthropic"===j){let a=await e.json();f=a.content?.[0]?.text?.trim()||""}else{let a=await e.json();f=a.choices?.[0]?.message?.content?.trim()||""}let g=f.trim();g.startsWith("```")&&(g=(g=(g=g.replace(/^```[a-zA-Z]*\n/,"")).replace(/\n```$/,"")).trim());let h=g;try{h=function(a){let b=!1,c="";for(let d=0;d<a.length;d++){let e=a[d];if('"'===e&&"\\"!==a[d-1]){let e=a.substring(0,d).trim(),f=a.substring(d+1).trim(),g=e.endsWith("{")||e.endsWith("[")||e.endsWith(",")||e.endsWith(":"),h=f.startsWith("}")||f.startsWith("]")||f.startsWith(",")||f.startsWith(":");g||h?(b=!b,c+='"'):c+='\\"'}else"\n"===e?b?c+="\\n":c+="\n":"\r"===e?b?c+="\\r":c+="\r":c+=e}return c}(g),h=function(a){let b=a.trim(),c=(b.match(/\{/g)||[]).length,d=(b.match(/\}/g)||[]).length,e=(b.match(/\[/g)||[]).length,f=(b.match(/\]/g)||[]).length,g=0;for(let a=0;a<b.length;a++)'"'===b[a]&&"\\"!==b[a-1]&&g++;for(g%2!=0&&(b+='"');c>d;)b+="}",d++;for(;e>f;)b+="]",f++;return b}(h)}catch(b){console.warn(`[parse-characters] Chunk ${a} JSON repair failed:`,b)}let i=JSON.parse(h);d=Array.isArray(i)?i:[];break}catch(c){console.warn(`[parse-characters] Chunk ${a+1} attempt ${b} failed:`,c.message||c),e=c,b<3&&await new Promise(a=>setTimeout(a,1500))}if(null===d)throw Error(`第 ${a+1} 组人设解析失败: ${e?.message||e||"未知错误"}`);s.push(...d)}return e.NextResponse.json({characters:s})}catch(a){try{let b=`[Error] ${new Date().toISOString()}
|
|
36
|
+
Message: ${a.message}
|
|
37
|
+
Stack: ${a.stack}
|
|
38
|
+
Context:
|
|
39
|
+
- CWD: ${process.cwd()}
|
|
40
|
+
- PI_CODING_AGENT_DIR: ${process.env.PI_CODING_AGENT_DIR}
|
|
41
|
+
- getAgentDir(): ${(0,f.getAgentDir)()}
|
|
42
|
+
|
|
43
|
+
`;(0,h.writeFileSync)("E:/ink-xY/api-error.log",b,"utf8")}catch(a){}return console.error("Error in parse-characters API:",a),e.NextResponse.json({error:a.message||String(a)},{status:500})}}d()}catch(a){d(a)}})},41180:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{handler:()=>y,patchFetch:()=>x,routeModule:()=>z,serverHooks:()=>C,workAsyncStorage:()=>A,workUnitAsyncStorage:()=>B});var e=c(19225),f=c(84006),g=c(8317),h=c(99373),i=c(34775),j=c(24235),k=c(261),l=c(54365),m=c(90771),n=c(73461),o=c(67798),p=c(92280),q=c(62018),r=c(45696),s=c(47929),t=c(86439),u=c(37527),v=c(36337),w=a([v]);v=(w.then?(await w)():w)[0];let z=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/api/agent/parse-characters/route",pathname:"/api/agent/parse-characters",filename:"route",bundlePath:"app/api/agent/parse-characters/route"},distDir:".next",relativeProjectDir:"",resolvedPagePath:"E:\\ink-xY\\app\\api\\agent\\parse-characters\\route.ts",nextConfigOutput:"",userland:v}),{workAsyncStorage:A,workUnitAsyncStorage:B,serverHooks:C}=z;function x(){return(0,g.patchFetch)({workAsyncStorage:A,workUnitAsyncStorage:B})}async function y(a,b,c){c.requestMeta&&(0,h.setRequestMeta)(a,c.requestMeta),z.isDev&&(0,h.addRequestMeta)(a,"devRequestTimingInternalsEnd",process.hrtime.bigint());let d="/api/agent/parse-characters/route";"/index"===d&&(d="/");let e=await z.prepare(a,b,{srcPage:d,multiZoneDraftMode:!1});if(!e)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:g,params:v,nextConfig:w,parsedUrl:x,isDraftMode:y,prerenderManifest:A,routerServerContext:B,isOnDemandRevalidate:C,revalidateOnlyGenerated:D,resolvedPathname:E,clientReferenceManifest:F,serverActionsManifest:G}=e,H=(0,k.normalizeAppPath)(d),I=!!(A.dynamicRoutes[H]||A.routes[E]),J=async()=>((null==B?void 0:B.render404)?await B.render404(a,b,x,!1):b.end("This page could not be found"),null);if(I&&!y){let a=!!A.routes[E],b=A.dynamicRoutes[H];if(b&&!1===b.fallback&&!a){if(w.adapterPath)return await J();throw new t.NoFallbackError}}let K=null;!I||z.isDev||y||(K=E,K="/index"===K?"/":K);let L=!0===z.isDev||!I,M=I&&!L;G&&F&&(0,j.setManifestsSingleton)({page:d,clientReferenceManifest:F,serverActionsManifest:G});let N=a.method||"GET",O=(0,i.getTracer)(),P=O.getActiveScopeSpan(),Q=!!(null==B?void 0:B.isWrappedByNextServer),R=!!(0,h.getRequestMeta)(a,"minimalMode"),S=(0,h.getRequestMeta)(a,"incrementalCache")||await z.getIncrementalCache(a,w,A,R);null==S||S.resetRequestCache(),globalThis.__incrementalCache=S;let T={params:v,previewProps:A.preview,renderOpts:{experimental:{authInterrupts:!!w.experimental.authInterrupts},cacheComponents:!!w.cacheComponents,supportsDynamicResponse:L,incrementalCache:S,cacheLifeProfiles:w.cacheLife,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d,e)=>z.onRequestError(a,b,d,e,B)},sharedContext:{buildId:g}},U=new l.NodeNextRequest(a),V=new l.NodeNextResponse(b),W=m.NextRequestAdapter.fromNodeNextRequest(U,(0,m.signalFromNodeResponse)(b));try{let e,g=async a=>z.handle(W,T).finally(()=>{if(!a)return;a.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let c=O.getRootSpanAttributes();if(!c)return;if(c.get("next.span_type")!==n.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${c.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let f=c.get("next.route");if(f){let b=`${N} ${f}`;a.setAttributes({"next.route":f,"http.route":f,"next.span_name":b}),a.updateName(b),e&&e!==a&&(e.setAttribute("http.route",f),e.updateName(b))}else a.updateName(`${N} ${d}`)}),h=async e=>{var h,i;let j=async({previousCacheEntry:f})=>{try{if(!R&&C&&D&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let d=await g(e);a.fetchMetrics=T.renderOpts.fetchMetrics;let h=T.renderOpts.pendingWaitUntil;h&&c.waitUntil&&(c.waitUntil(h),h=void 0);let i=T.renderOpts.collectedTags;if(!I)return await (0,p.I)(U,V,d,T.renderOpts.pendingWaitUntil),null;{let a=await d.blob(),b=(0,q.toNodeOutgoingHttpHeaders)(d.headers);i&&(b[s.NEXT_CACHE_TAGS_HEADER]=i),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==T.renderOpts.collectedRevalidate&&!(T.renderOpts.collectedRevalidate>=s.INFINITE_CACHE)&&T.renderOpts.collectedRevalidate,e=void 0===T.renderOpts.collectedExpire||T.renderOpts.collectedExpire>=s.INFINITE_CACHE?void 0:T.renderOpts.collectedExpire;return{value:{kind:u.CachedRouteKind.APP_ROUTE,status:d.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:e}}}}catch(b){throw(null==f?void 0:f.isStale)&&await z.onRequestError(a,b,{routerKind:"App Router",routePath:d,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),b}},k=await z.handleResponse({req:a,nextConfig:w,cacheKey:K,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:A,isRoutePPREnabled:!1,isOnDemandRevalidate:C,revalidateOnlyGenerated:D,responseGenerator:j,waitUntil:c.waitUntil,isMinimalMode:R});if(!I)return null;if((null==k||null==(h=k.value)?void 0:h.kind)!==u.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==k||null==(i=k.value)?void 0:i.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});R||b.setHeader("x-nextjs-cache",C?"REVALIDATED":k.isMiss?"MISS":k.isStale?"STALE":"HIT"),y&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let l=(0,q.fromNodeOutgoingHttpHeaders)(k.value.headers);return R&&I||l.delete(s.NEXT_CACHE_TAGS_HEADER),!k.cacheControl||b.getHeader("Cache-Control")||l.get("Cache-Control")||l.set("Cache-Control",(0,r.getCacheControlHeader)(k.cacheControl)),await (0,p.I)(U,V,new Response(k.value.body,{headers:l,status:k.value.status||200})),null};Q&&P?await h(P):(e=O.getActiveScopeSpan(),await O.withPropagatedContext(a.headers,()=>O.trace(n.BaseServerSpan.handleRequest,{spanName:`${N} ${d}`,kind:i.SpanKind.SERVER,attributes:{"http.method":N,"http.target":a.url}},h),void 0,!Q))}catch(b){if(b instanceof t.NoFallbackError||await z.onRequestError(a,b,{routerKind:"App Router",routePath:H,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),I)throw b;return await (0,p.I)(U,V,new Response(null,{status:500})),null}}d()}catch(a){d(a)}})},44870:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},75430:a=>{"use strict";a.exports=import("@earendil-works/pi-coding-agent")},78335:()=>{},86439:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external")},96487:()=>{},98388:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Lj:()=>k,P6:()=>m,QA:()=>l}),c(23582);var e=c(29021),f=c(33873),g=c(75430),h=c(16510),i=a([g]);function j(){return(0,f.join)((0,g.getAgentDir)(),"fetched-models-cache.json")}g=(i.then?(await i)():i)[0];let n=null;function k(){if(n)return n;let a=j();if((0,e.existsSync)(a))try{return n=JSON.parse((0,e.readFileSync)(a,"utf8"))}catch{}return n={}}function l(a){setTimeout(async()=>{try{let b=k(),c=Date.now(),d=(0,f.join)((0,g.getAgentDir)(),"auth.json");if(!(0,e.existsSync)(d))return;let i=JSON.parse((0,e.readFileSync)(d,"utf8")),l=Object.keys(i),m=!1;for(let d of l){let e=i[d]?.key;if(!e)continue;let f=b[d];if(f&&c-f.updatedAt<36e5)continue;console.log(`[model-resolver] Background syncing models list for provider: "${d}"...`);let g=a.models?.find(a=>a.provider===d),j=g?.baseUrl||"",k=function(a,b){let c=a.toLowerCase();if(c.startsWith("minimax"))return"https://api.minimaxi.com/v1/models";if(c.includes("google")||c.includes("gemini"))return"https://generativelanguage.googleapis.com/v1beta/models";let d=b;return d.endsWith("/anthropic")&&(d=d.replace("/anthropic","/v1")),d.endsWith("/")&&(d=d.slice(0,-1)),d.endsWith("/models")||(d=`${d}/models`),d}(d,j),l={},n=k,o=d.toLowerCase();o.includes("google")||o.includes("gemini")?n=`${k}?key=${e}`:l.Authorization=`Bearer ${e}`;try{let a=await fetch(n,{headers:l,signal:AbortSignal.timeout(6e3)});if(!a.ok){console.error(`[model-resolver] Failed to fetch models for "${d}": HTTP ${a.status}`);continue}let e=await a.json(),f=[];if((f=o.includes("google")||o.includes("gemini")?(e.models||[]).map(a=>{let b=a.name||"";return b.startsWith("models/")?b.replace("models/",""):b}).filter(a=>a.includes("gemini")):(e.data||[]).map(a=>a.id).filter(Boolean)).length>0){let a=f.map(a=>{let b=(0,h.S)(d,a);return{id:a,name:a,provider:d,supportsVision:b}});b[d]={updatedAt:c,models:a},m=!0,console.log(`[model-resolver] Successfully synced ${f.length} models for "${d}".`)}}catch(a){console.error(`[model-resolver] Fetch failed for "${d}":`,a)}}m&&function(a){n=a;try{(0,e.writeFileSync)(j(),JSON.stringify(a,null,2),"utf8")}catch(a){console.error("Failed to save models cache:",a)}}(b)}catch(a){console.error("[model-resolver] Error in triggerBackgroundModelsSync:",a)}},100)}function m(a,b,c){let d=a.find(b,c);if(d)return d;let e=b.toLowerCase(),f=c.toLowerCase();if("minimax-cn"===e&&"MiniMax-M3"===c){let b=a.find("minimax-cn","MiniMax-M2.7")||a.find("minimax-cn","MiniMax-M2.7-highspeed");return b?{...b,id:"MiniMax-M3",name:"MiniMax-M3",api:"openai-completions",baseUrl:b.baseUrl.includes("anthropic")?b.baseUrl.replace("/anthropic","/v1"):"https://api.minimaxi.com/v1",reasoning:!0}:{id:"MiniMax-M3",name:"MiniMax-M3",api:"openai-completions",provider:"minimax-cn",baseUrl:"https://api.minimaxi.com/v1",reasoning:!0,input:["text"],cost:{input:.3,output:1.2,cacheRead:.06,cacheWrite:.375},contextWindow:204800,maxTokens:131072}}let g=(a.models||[]).find(a=>a.provider===b)||("function"==typeof a.getAll?a.getAll().find(a=>a.provider===b):void 0);if(g){let a=(0,h.S)(b,c);return{...g,id:c,name:c,reasoning:f.includes("reasoning")||f.includes("thinking")||f.includes("-r1")||g.reasoning,input:a?["text","image"]:["text"]}}}d()}catch(a){d(a)}})}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[741,813],()=>b(b.s=41180));module.exports=c})();
|