{"_id":"@arcaneorion/pi-provider-manager","_rev":"20-1a23dd40a0a91210bff6ecbe35db21ad","name":"@arcaneorion/pi-provider-manager","dist-tags":{"latest":"0.4.3"},"versions":{"0.1.0":{"name":"@arcaneorion/pi-provider-manager","version":"0.1.0","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.1.0","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"c2d620ae0fb2a5f924308fc12761e8f550ed4d28","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.1.0.tgz","fileCount":10,"integrity":"sha512-czMJCaqdYltfJn4M+oCwTUtz6ySyUCjTl3cmhaezlB8LrcZ7J8XBMaDc7m4GJiBb2quTJAl1Orc+oIuImmVDTA==","signatures":[{"sig":"MEUCIFf7hix1bqBvwpfAjZv+cjI9xvi3gOk2pjG9gToxIM76AiEAxd6ISjDc6tEsMon3oxuaB7u0WCIXRn1EJgAXHN34aZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157875},"type":"module","gitHead":"122939848cf8d803d2130fa7a7bc729b389a301e","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.1.0_1784565777576_0.695869424330579","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@arcaneorion/pi-provider-manager","version":"0.2.0","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.2.0","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"ae90518084135c4eb8cf3cfd2103ac470e45eaed","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.2.0.tgz","fileCount":10,"integrity":"sha512-oNQN/HuPLaXntF/JpKYNOsLjI1z6XMHrw/Q9fTQf+KU6V4ISfK3jbct5OU0EB5ttcW6EId320DYMVvEaWl+NhA==","signatures":[{"sig":"MEUCIQCOK/HRPVRmChPhCKFI9+AvtGTZ0Sso6WFGHp/5pVH+WgIgJqnO3sdhwjUauT14RlKS3zUukYo4EUiIJzupOyculMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160017},"type":"module","gitHead":"fa4e26824eb46509298dc9b1a67d0b41fed9090a","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.2.0_1784608695135_0.9906027279859224","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@arcaneorion/pi-provider-manager","version":"0.2.1","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.2.1","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"3dae13fafaee9ac6dd6bee46eae127f9ad06860b","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.2.1.tgz","fileCount":10,"integrity":"sha512-2Vuem9nstR8QYN79ug2kqsRh8KYFneTg+/QIRP4al7u3CTas+YNZ7s6lyCxY7dN10HOtjwCk6ccX4lYBOiDGcQ==","signatures":[{"sig":"MEQCICec2bhz8PO6rAdM7Mqnt0HQxpzyLO4nRilK+AWhV3bkAiBxM+5s5g+coFL2O2nY6a/2ZTpmk1kN4FBxP8sKIVh4Fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160223},"type":"module","gitHead":"1a66506474321ed8af19cc0f63ace6d594493181","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.2.1_1784611354964_0.7148984568058754","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@arcaneorion/pi-provider-manager","version":"0.2.3","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.2.3","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"0ed276c2ea4abdea563372e1f140a4b737d646aa","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.2.3.tgz","fileCount":11,"integrity":"sha512-vb1K6PwPhNX0N53EfTqC/NiEDICluD7arRCl9NTv6gqqCXW5OzSVkWHPlr78BdnJjKdR5r5u7/fYFovsmpw4Gw==","signatures":[{"sig":"MEUCIH9vAlICM/jNhy2//rFfultsBunzfZOkjyVnfpQ3o+O1AiEAmkZQZc6Yl+AETc9NPyIPemqxXl+OGeIoGafSbYqcIys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171023},"type":"module","gitHead":"88bcef52a32618756187e3247251ad4d9894a035","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.2.3_1784621170276_0.31907155613499927","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@arcaneorion/pi-provider-manager","version":"0.2.5","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.2.5","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"0e4883ee5f32bbfe050885ed0509c31c1d10708b","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.2.5.tgz","fileCount":11,"integrity":"sha512-CjItAI3hVasUBk36JNfC51srYEz5TV3if47ujyGLDT3QkCtn0LW72U+66cH1Jo9tmRlQzcXMpgp2hsC7NMks0g==","signatures":[{"sig":"MEQCICVcy/FN9ordOhgz5ST7ETry8ygn3yPPLsS/gQscHaw5AiBKvOOCGiAfTpmRjx4u7ObPMGdANqGvBygS7iLT1zy1CQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174514},"type":"module","gitHead":"e7c648d8a5d82fc555fa02ab421de378e25ecfc0","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.2.5_1784625639210_0.720635473818485","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@arcaneorion/pi-provider-manager","version":"0.2.6","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.2.6","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"99aa3afa4a4b49d8d29dc6e09d0719ac090ecf18","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.2.6.tgz","fileCount":11,"integrity":"sha512-GGmDMy43Mi7jL4K46F4Xt5WomX8K2cvZhbNnvdpnLxY3xj7gugYKi/omnxu3/AEo/BBaWHfK/gjsUsrzSwnV8w==","signatures":[{"sig":"MEYCIQDXfRCZWFpWEzF+GEV8uXpYz4IWQFxd9k5UlWsDuDSZlwIhAMmDwPR2HMZALytPxgnKUD1+EpV9U6wkxyN+kcX0O7NS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175476},"type":"module","gitHead":"1d39b6f86272d513e50427e24b3bd7938b41ea3b","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.2.6_1784625727464_0.3086434074038895","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@arcaneorion/pi-provider-manager","version":"0.2.7","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.2.7","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"bc28accc27410e1c1e8b09e5aaba220d3da35a81","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.2.7.tgz","fileCount":11,"integrity":"sha512-YSmcArjxTD38G2yrsRkUoFT0T1shTiZ0L5h4hDORhSr8dS2KEjFhsJUjNu1Wthlgmj8uuDwVcvHZhgUsL5ACSA==","signatures":[{"sig":"MEQCIGozuG9dgRoqMyjTkuK5SxGo0vi30OBQOt1/rjwS5ZD9AiA6yB/cFfPK/pdU7k+p4/W11s3JdGma66ZaKle3aNB5jg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176259},"type":"module","gitHead":"d72294d3e01e847a804604081f1bedcfea3c9666","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.2.7_1784637472345_0.1239765875474228","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"@arcaneorion/pi-provider-manager","version":"0.2.8","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.2.8","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"faa4d6cd6660573cc51a3a49a97a070bb8e3c5a6","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.2.8.tgz","fileCount":11,"integrity":"sha512-HF+6qlrTcoqqFxQDiyq6sPD0Nhx3bzuHu7lFh6WiV0VNnRyoHnQnHqyjN3qJM9l9yV47brj2FQrfomLh3nGL1Q==","signatures":[{"sig":"MEQCIEZITnXY6FGL3iiCNSBk8bFGW12I1m1MK//PCpo4O1eiAiAFAVPTZOUCWRkKTmGxXz3ztKj5NBiZrI0gtKcY7ehCJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176263},"type":"module","gitHead":"98e0d2e8a900f9195899f5c9599a551720e9dfa1","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.2.8_1784641698879_0.8376538744077393","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.1","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.1","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"4e627d932684ec45e33e30b0e0152f7d26b7569c","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.1.tgz","fileCount":11,"integrity":"sha512-POgj4AFb79v+xlQls4f9Dr9+3gDJ+D//yd7HJdZ847jalAf/wdk2G1P2vLhgdyv77+WRf+i5NBRMASK5BwBXpA==","signatures":[{"sig":"MEUCIQCzoD1UJrdS2vO4/STrp+a/Ryr2nXh5j86HpLX+xzIV9gIgBNvIJSut/qc462iD94SGxuK4rH+ZdN3o85uHXXMgD24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177571},"type":"module","gitHead":"b3e531851da76e4e682cfd0186813d409e2cb783","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.1_1784643454072_0.5994971832322806","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.4","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.4","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"04fc0891dbc69f47bb3e93047712f4daee0222dd","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.4.tgz","fileCount":11,"integrity":"sha512-bmQPMPP3djXQV9upMkYD148d6wLffMTrDRt86busMzZmxIxr9wOeGAJKXTUKLyFqNgopnSh8PiTDYQtPgE2zTQ==","signatures":[{"sig":"MEQCIFGP5q37pSSfeyB8zONU8TUvk50umZzL5t2rB3enY5HXAiAwiSUl+8VsAjbvSuXM94Q3HYe0ZaP61VZRSKMd+4xb8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187999},"type":"module","gitHead":"47d423e70f7be612015602bc3562971d0b0907d9","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.4_1784686924902_0.816338150368003","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.5","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.5","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"a649f63a30dfcd2481f5d3a35e5dbc5478095691","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.5.tgz","fileCount":11,"integrity":"sha512-lm8ssm6FdJQs4Q56Ojaxue9rtoRby6Ag0OXyXffJKUtIRjPcwBjdRS9ZUOckiBkXx3saVVph5FvW69+5Md9wyA==","signatures":[{"sig":"MEQCIFpMYaV2GajvsNE4Qi28iSL2xYwARDkRW69j0QQFnvu5AiBK36Oj4wV5bpnMgRMM6X822TqOjDOWEUSMw1icjjzmtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188286},"type":"module","gitHead":"ae16f00ffcf3979dd9559e72e9074fecc9dbbada","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.5_1784687592856_0.3523258872597763","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.6","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.6","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"1d6332e40bffcca2a36c8531a88cde71621be5cd","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.6.tgz","fileCount":11,"integrity":"sha512-lGuNhsIan9Rwf+rNUZrd5W5ZWVKaQAK4aGRIocHT1zMgP6jnsQnsRPzFYAKhNp4v8nbgEne1V1m5oGzAtk9HtA==","signatures":[{"sig":"MEUCIBhd5MNRsDDXcHjxZLYGA90wKaudpAR1Hnzi47OPu7y+AiEAog1l+yMh8mqmqi9KLyM5WH0CuZkvlBim2a1ipi3G/yQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188889},"type":"module","gitHead":"7b2ce82bfd94b49e5ef26e9b91f6076777115264","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.6_1784688526646_0.6779555329426181","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.7","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.7","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"dcc68c33aaa03e56c388a802f67d4a042db41e99","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.7.tgz","fileCount":11,"integrity":"sha512-Rx5mdP0/qnQIT5cpRGq7L+rjbv1msYeXMXcor4Op1g6A8W5AbwMXbXjAsbBWacuN6fhm1fk/7CG6tbmdNO0tYw==","signatures":[{"sig":"MEUCIQDzeBhlXzb6l6I/5v0VfCEqRyKtLsG8MYdGeY5/uY23wQIgabIwu/rs7g+t4hWvnQyAATtpFBqny2UZBXA5MOsK5Jg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195084},"type":"module","gitHead":"a572c7bb3e6af0e58c7e49988f3aa9bc79c51f2e","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.7_1784968912521_0.6483321668956543","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.8","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.8","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"9b298358ef316e04e5f3f29d41d682e86492011e","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.8.tgz","fileCount":11,"integrity":"sha512-8MlDIjpYaInlfe+envpKNsyGjm+8RQo8u2IBXGOUot+pym+CLMkFWFluMDtBXW+WBE38SukeDjsmVim+6c9bKg==","signatures":[{"sig":"MEQCIEJ8QPc60AlKe3KPH2mZrz50K2AzIh7Oy5Yovbxf3e4XAiAzBqMaUCYpgo7R2zgM+s3MTDIn6hlwklW8e63Ujt68Ug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197252},"type":"module","gitHead":"031ebe5fd4f518f951d5a83890c0ec3761743c09","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.8_1785048753890_0.06904513376357246","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.9","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.9","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"8d8a98ed1964fcc8182a2700664e8cff5770a51c","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.9.tgz","fileCount":11,"integrity":"sha512-8HzXV9jNIOC9qItlmM9nJOSG4VifwKACIwx1KnLSsBQhFELewhIhEZ82BkwKZhucXdRFKiBkzOz33B461Q9Nyw==","signatures":[{"sig":"MEUCIDAyow1osFTg+RzYsJPoU/wkqVHOyIKnO1UYLqDkCNu9AiEAxyiZeR6UZpjS0xYO/WxEbSfCUWHaW065bADrX6NFnY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198435},"type":"module","gitHead":"34498c8152c1b091a3f4b8cacc55a5949a0a2da0","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.9_1785049296290_0.821896478349962","host":"s3://npm-registry-packages-npm-production"}},"0.3.10":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.10","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.10","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"b1cbf7d32734e911a46247e73fda0d3b83c3fd77","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.10.tgz","fileCount":11,"integrity":"sha512-Qs71H6wL/+yXROLXuQrfUg9p37lCBBzwytVre7i2OdtSRNMHCgx90oFygbNqeW07QBdJsLD01ekn9pa/2aoPxA==","signatures":[{"sig":"MEQCIFSHKX3WDru4I50XrVsFoHXao5uaZta30WootgQl1da6AiBsgnoWo8rh2B6sRIasC+0JllPCpn2Ycs4uP/JD3Pb3IQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203127},"type":"module","gitHead":"ac1258f5e03baa67f7f3f6dc1a6c17de874d2560","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.10_1786621601435_0.364938303781436","host":"s3://npm-registry-packages-npm-production"}},"0.3.11":{"name":"@arcaneorion/pi-provider-manager","version":"0.3.11","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.3.11","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"3b670ae646a5a65f9c7db0422752949c3ca0f9ab","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.3.11.tgz","fileCount":11,"integrity":"sha512-y/Q077+8b37q2Axv/Ut999rMxEU38Yl2Gsg9GFBk39mq7Wxz7UC8Dyd5ej2TIxpP4Ebinhx69owlcGwJuLC+zQ==","signatures":[{"sig":"MEUCIGHFd4c/07zC5a0i/Se0Pz1A77AQvQQhs9YFljcQ0PfIAiEA2SUPK+pFlbgF31SNVK/dG+5PH8/s1ngnamKq8umb6dU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203407},"type":"module","gitHead":"d01c2e1ad2cd6ece642cf4eb6533b97f57b55af6","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.3.11_1786625265524_0.3642502662451008","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@arcaneorion/pi-provider-manager","version":"0.4.0","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.4.0","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"f11af2eb8c0c40d7754182bc2aee34f0cb856ee2","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.4.0.tgz","fileCount":11,"integrity":"sha512-MAIX1aSmulyuIE9DlvamjoiRLhgVWDqAgavdog2y0uB2yjs8pANFd+hTXsBmCh2Q91a6FkLe6zjFj9QsZIhebg==","signatures":[{"sig":"MEUCIA8cPqv3UpKXXfX4ZG30OwKEdKE263twcP6RQCp0SepHAiEA9KIxWImeGRG/Ng0mnFDj5DZKvsrv9WRn5qXQXsHVnuU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247466},"type":"module","gitHead":"6ab87d2294327629ec615c3026d6b1b851295e14","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.4.0_1787160225582_0.4612572266957289","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@arcaneorion/pi-provider-manager","version":"0.4.2","keywords":["pi-package"],"author":{"name":"arcaneorion"},"license":"MIT","_id":"@arcaneorion/pi-provider-manager@0.4.2","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"dist":{"shasum":"fa1aa0931441c2946da923506617f1e43ec3b596","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.4.2.tgz","fileCount":11,"integrity":"sha512-r4NA7spJ5WsxDS/E8Wcs0HDI02IPcc12KPjLrDw5pbNLo+Qubi+jVW/p8lCVOCiQO0UxiRe/+UK7mj6pG9OzmQ==","signatures":[{"sig":"MEUCIHrxgdgfeG6VLwzqMi45Eq/xtNGnWcuF4OUIhOer2yJTAiEApjahIh6obu3u1nx9Ud7ezkKtBfk4SEWxUDzNDBPgXFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272002},"type":"module","gitHead":"97ed84f937035c079b0405118caf0ae2d983af73","_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"_npmVersion":"11.9.0","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.4.2_1787240658970_0.9332084115686272","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@arcaneorion/pi-provider-manager","version":"0.4.3","description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","type":"module","keywords":["pi-package"],"license":"MIT","author":{"name":"arcaneorion"},"publishConfig":{"access":"public"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*","@earendil-works/pi-ai":"*"},"gitHead":"66f1167c4824729bfef9ebd1bc6f6e6ca1d131d0","_id":"@arcaneorion/pi-provider-manager@0.4.3","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-nRCcat6Gtlh9aT5CE84J+uEfwW2ltG4N16n91vOmt5JSKuV53Xk0oanNJ30urXN8ukdUx7BI5hgh36gNFPvSPA==","shasum":"e946139de6a0f511b477e6af6e852bcf77ff4f10","tarball":"https://registry.npmjs.org/@arcaneorion/pi-provider-manager/-/pi-provider-manager-0.4.3.tgz","fileCount":11,"unpackedSize":277411,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDLgpCsH1Q7hflOuayfiqv0wxh8btoWvAYOd7jsOoSGOAiBTzNLe1OE5ASO2CND1rhPhRd54R0KTyfMwW+mBI2Ds8Q=="}]},"_npmUser":{"name":"arcaneorion","email":"3526162625@qq.com"},"directories":{},"maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-provider-manager_0.4.3_1787249660072_0.7085615998259958"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-20T16:42:57.406Z","modified":"2026-08-20T18:14:20.675Z","0.1.0":"2026-07-20T16:42:57.724Z","0.2.0":"2026-07-21T04:38:15.269Z","0.2.1":"2026-07-21T05:22:35.103Z","0.2.3":"2026-07-21T08:06:10.434Z","0.2.5":"2026-07-21T09:20:39.341Z","0.2.6":"2026-07-21T09:22:07.602Z","0.2.7":"2026-07-21T12:37:52.532Z","0.2.8":"2026-07-21T13:48:19.061Z","0.3.1":"2026-07-21T14:17:34.215Z","0.3.4":"2026-07-22T02:22:05.038Z","0.3.5":"2026-07-22T02:33:13.016Z","0.3.6":"2026-07-22T02:48:46.773Z","0.3.7":"2026-07-25T08:41:52.653Z","0.3.8":"2026-07-26T06:52:34.012Z","0.3.9":"2026-07-26T07:01:36.441Z","0.3.10":"2026-08-13T11:46:41.558Z","0.3.11":"2026-08-13T12:47:45.703Z","0.4.0":"2026-08-19T17:23:45.755Z","0.4.2":"2026-08-20T15:44:19.122Z","0.4.3":"2026-08-20T18:14:20.226Z"},"author":{"name":"arcaneorion"},"license":"MIT","keywords":["pi-package"],"description":"Visual config panel for models.json + roundrobin failover engine + provider health stats for pi coding agent","maintainers":[{"name":"arcaneorion","email":"3526162625@qq.com"}],"readme":"# pi-provider-manager\n\n> 给 [pi 编程助手](https://pi.dev) 加上可视化配置面板、智能轮询故障转移引擎与渠道健康统计——一个扩展读懂、调优你所有大模型渠道。\n\n一个 pi 扩展，三项核心能力：\n\n- **可视化配置面板**：`/providers` 打开本地网页面板，图形化编辑 `models.json` 与轮询配置，拖拽排序、在线发现上游模型、一键保存即热重载。\n- **轮询故障转移引擎**：把多个真实渠道/模型注册成一个虚拟 `roundrobin` 模型，请求时自动故障转移——首个候选超时或出错就切下一个，全程你无感。可选开启**测速排序**，让最快的渠道永远排在前面。\n- **渠道健康统计**：7 天滚动成功率、首字延迟（TTFT）、总延迟，被动采集、跨 CLI 共享，面板一目了然。\n\n---\n\n## 特性一览\n\n### 🎛 可视化配置面板\n\n`/providers` 启动本地网页服务器（仅 `127.0.0.1`），浏览器打开两个标签页：\n\n- **模型配置**：逐字段编辑 `~/.pi/agent/models.json`——provider、模型、API Key、请求头、compat 字段、thinking level map 全覆盖。支持从上游端点拉取可用模型、与已配置模型 diff、一键增删。\n- **轮询配置**：编辑 `~/.pi/agent/roundrobin/config.json`，配置虚拟模型元数据、候选池、超时/冷却、测速排序策略，保存即热重载。支持预设组（多套候选组合一键切换）。\n\n面板走**固定端口 17890 + 持久化 token**：多终端共用同一实例——第二个 CLI 跑 `/providers` 检测到端口已占用，直接打开已有面板而非重启。面板闲置 5 分钟自动关闭；前台打开时每 3 秒轮询健康数据顺带保活，活跃面板永不超时；由本进程启动的 server 在 pi 会话退出时一并关闭。\n\n### 🔄 轮询故障转移引擎\n\n把多个真实渠道注册成一个虚拟模型 `roundrobin/<组名>`，用 `/model` 选中它，之后所有请求走故障转移引擎：\n\n1. 请求按顺序试候选，**首个成功的就粘住**（sticky 策略）。\n2. 当前候选在**首响应阶段**超时或出错 → 自动切下一个候选。\n3. 单候选原地重试 `maxRetriesPerCandidate` 次（指数退避）后才换渠道；耗尽则进冷却。\n4. 整轮全炸：测速关闭时清冷却重试 + 等最早冷却结束；测速开启时**重测排序再战**。\n5. 流中途出错（内容已吐出）直接返回不重放——避免内容/工具调用乱序；该候选仍记一次失败 + 进冷却（让 7 天统计与 smart 排序能看到“常吐一半断”的渠道）。\n\n真正发生故障转移时，TUI 弹一次 toast：`↔ 轮询故障转移到 XXX`——纯提示不进对话历史，不污染 LLM 上下文。\n\n> **请求隔离**：请求 `glm` 组绝不会测速/影响到 `deepseek` 组——按组名严格隔离。\n\n### ⚡ 测速排序（可选，强烈推荐）\n\n开启后，引擎不再只会被动重试——它会**主动测量每个候选的真实速度**并重新排队。\n\n**怎么测**：给每个候选发一个极简真实对话（普通候选 `maxTokens=16`，reasoning 候选抬到 2048——Anthropic 类 API 开 thinking 时要求 `max_tokens > thinking budget` 最小 1024，16 会被 400 拒绝导致误杀），默认 prompt `欧拉函数的意义？`，复用面板模型测试的同一套 `streamSimple` 内核——**看起来就是正常聊天流量，不会被当成探活封号**。测量首字延迟（TTFT）与总延迟。\n\n> **TTFT 兑底**（v0.4.2）：TTFT 优先认首个 `text_delta`（真正首字）；reasoning 模型小 maxTokens 可能全花在 thinking 上、永不产 `text_delta`，此时退而认首个 `thinking_delta`（模型开始产出的信号）作为 TTFT 兑底，避免该候选被当“拿不到首字”直接垫底。\n>\n> **测速失败自动重试**：单次测速失败且非 abort/鉴权问题 → 退避 1.5s 重试，最多共 3 次尝试（首试 + 重试 2 次）。三连败才判 `✗` + recordFailure 进冷却。这是为了不把“基本可用但暂时抖动”的渠道一次判死——一个 86% 成功率的渠道，三连败概率仅 ≈0.3%，抖动几乎必能救回；真挂的渠道三次都败判死正确，多花的只是注定失败的请求（不耗 token）。另：只要测速最终 ok=true，该候选就排在所有失败候选之前（“能用”本身就是兑底）；ttft/latency 缺失时用组内中位数参与排序（v0.4.2 起）。真实请求路径的 `maxRetriesPerCandidate` 原地重试哲学同样适用于测速路径。\n\n**四种排序键**：\n\n| 排序键 | 算法 | 适用场景 |\n|--------|------|----------|\n| `ttft` | 首字延迟（默认） | 追求交互体感，首字快=响应快 |\n| `latency` | 总延迟 | 追求整轮最快 |\n| `hybrid` | `0.7×ttft + 0.3×latency` 加权和 | 兼顾首字与总延迟 |\n| `smart` | `0.5×ttft_norm + 0.3×(1−reliability) + 0.2×latency_norm` 三维加权 | **又快又稳**，可靠性差的候选被压下去 |\n\n> **smart 的可靠性兜底**：reliability 用**贝叶斯平滑**从 7 天历史算：`(success + 2.5) / (total + 5)`（先验 = 5 次 50% 成功率）。\n> - 全新候选（0 次）→ 0.5 中性，给机会但不越过高可靠老候选\n> - 单次成功（1/0）→ 0.583，往中性拉回，不被单次结果带偏\n> - 10 次全成 → 0.833，高但留余地；10 次全败 → 0.167 沉底，新候选能排它前面\n>\n> 速度维度做组内 min-max 归一化（0=最快），加权后分数越小越好，升序排序。测速失败的候选进冷却排末尾。\n>\n> **中位数兑底**（v0.4.2）：ttft/latency 缺失（null）的可用候选，用**组内实测中位数**参与排序（语义：该维度未知 → 假设中等水平），而非直接垫底 Infinity。不污染持久化字段——health.jsonl 仍存真实 null，面板仍显示“无首字”，仅排序时用中位数代理。全组都没测出该维度才退回 Infinity。\n\n**测速后**：成功候选清冷却上前、失败候选进冷却沉底、`currentIndex` 强制归 0（放弃旧 sticky 位置——实测速度是更强的实时信号）。排序结果保持到下次测速。\n\n**何时触发**：\n\n1. **首次请求某组**（新增，懒触发）——本会话内首次请求一个开启了测速的轮询组时，**同步**跑一次测速排序：等排完再发首请求（首次就享受排序，代价是首请求多等几秒到几十秒）。不同组独立判定“首次”（`lastSpeedTestAt===0`），面板保存配置不再重置这个状态。**v0.4.1 改动**：取代了原先“session_start / 面板保存就狂测所有组”的行为——现在启动后不测，用到哪个组才测哪个。\n2. **请求整轮全炸**——所有候选试过 + 重试耗尽 + 全冷却，触发重测重排。受 `minIntervalMs`（默认 60s）节流，避免持续故障时疯狂烧 token。\n3. **手动**——`/rr-speedtest [组名]` 命令，或面板 ⚡ 按钮，**绕过节流立即重测**。`/rr-speedtest` 还会在终端上方打印详细结果表（逐候选 TTFT/延迟/排序/失败原因，见下文「手动测速」），30s 后自动消失。\n\n### ⏱ 动态请求超时（测速开启时自动启用）\n\n测速关闭时，单候选首响应超时 = 静态 `timeoutMs`（默认 30s）。**测速开启后，超时变动态**：\n\n```\n动态超时 = max(timeoutMs, min(120000, round(实测 ttft × 2.0)))     // 下限 = 你配的 timeoutMs(面板可调); 上限 120s 防病态样本(曾测出 ttft 327s)把超时抬到很大。中转站波动大就调大 timeoutMs 兼容临时劣化\n```\n\n这个动态值同时守护两处：\n\n1. **首响应**——首个流事件到达前的等待上限（替代静态 `timeoutMs`）。\n2. **流中空闲**——start 之后任意两个 chunk 之间的停顿上限。**v0.4.0 新增**：以前流一旦 start 就再无超时保护，候选首字几秒到达后慢慢吐几十秒，pi 一直干等——这就是\"卡死\"的根因。现在流中卡顿超过动态超时立即 abort。\n\n**没测出首字的候选**（ttft=null，测速时就没拿到首字）回退静态 `timeoutMs`（默认 30s），null 回退双保险，不会被动态超时误杀。\n\n**超时后**：当作普通流前失败处理——**消耗一次 `maxRetriesPerCandidate`**（不是立即换渠道），退避后重试同一候选，耗尽才进冷却换渠道。想\"超时即换\"就把 `maxRetriesPerCandidate` 设 `0`。内容已转发后的流中空闲超时属 `terminal`（不能重放，直接终止）；该候选仍记一次失败 + 进冷却（与前述流中途出错一致，让 health/smart 看到质量问题）。\n\n面板轮询 tab 每个候选显示计算出的动态超时值（\"超时 26s\"），一眼看清每个候选当前的有效超时。\n\n### 📊 渠道健康统计\n\n每个渠道的 7 天滚动统计显示在面板（历史均值，非仅当前进程）：\n\n- 成功/失败次数与成功率\n- 平均首字延迟（TTFT）\n- 平均总延迟\n\n每次请求追加一行到 `~/.pi/agent/roundrobin/health.jsonl`，多 CLI 共享（无文件锁，best-effort）。启动时自动剪除 7 天外旧事件。TTFT 取首个 `text_delta` 到达时刻，Latency = `message.timestamp` 到 `message_end`——不依赖队列配对，中断/取消不污染延迟统计。\n\n> **轮询候选不再双计数**（第四轮审计修复）：早期版本里轮询获胜候选会在 `health.jsonl` 被双写（引擎 `recordSuccess/Failure` 一次 + 全局 `message_end` 被动采集又一次），总数×2。现已修复：成功转发的 done 事件改写为虚拟模型 provider，`message_end` 钩子不再重复记录，每候选只落一条。\n\n### 🔧 手动测速\n\n- **在 pi 里**：`/rr-speedtest`（所有开启测速的组）或 `/rr-speedtest <组名>`（指定组，**支持 Tab 补全组名**）。测完在终端编辑器上方打印逐候选详细表：每个候选一行，按排序顺序显示 `#排名 TTFT 延迟`（可用）或 `✗ 失败原因`（不可用），30s 后自动消失，同时弹 toast 摘要。\n- **在面板里**：轮询 tab \"测速排序\" 行的 ⚡ 按钮，调用 `POST /api/rr/manual-speedtest`。\n\n两者都绕过 `minIntervalMs` 节流，但尊重 `speedTestRunning` 锁（不会对正在测速的组重复测）。\n\n---\n\n## 安装\n\n```bash\npi install npm:@arcaneorion/pi-provider-manager\n```\n\n## 使用\n\n1. `/providers` 启动面板，在轮询 tab 添加候选（从已配置模型里选）、保存配置。\n2. `/model` 选择 `roundrobin/<组名>`。\n3. 之后所有请求走故障转移引擎。\n\n保存即热重载——轮询引擎立即 pickup 新候选，无需重启。\n\n> **跨 CLI 局限**：热重载只对**当前面板所属的 CLI 进程**即时生效。若你有多个 pi 终端在跑，其他终端的轮询组不会自动重载（显示的候选/配置仍是旧的），需重启该终端或在其内重新触发加载。\n\n---\n\n## 配置\n\n### models.json\n\n标准 pi `models.json`，面板支持完整 schema 编辑。\n\n### roundrobin/config.json\n\n```json\n{\n  \"virtualModel\": {\n    \"id\": \"roundrobin\",\n    \"name\": \"Model Round Robin\",\n    \"reasoning\": true,\n    \"input\": [\"text\", \"image\"],\n    \"contextWindow\": 200000\n  },\n  \"candidates\": [\n    { \"provider\": \"my-openai\", \"model\": \"gpt-4o\" },\n    { \"provider\": \"my-anthropic\", \"model\": \"claude-sonnet-4-20250514\" }\n  ],\n  \"log\": true,\n  \"timeoutMs\": 30000,\n  \"cooldownMs\": 60000,\n  \"strategy\": \"sticky\",\n  \"maxRetriesPerCandidate\": 2,\n  \"speedTest\": {\n    \"enabled\": false,\n    \"sortKey\": \"smart\",\n    \"prompt\": \"欧拉函数的意义？\",\n    \"timeoutMs\": 60000,\n    \"concurrency\": 5,\n    \"minIntervalMs\": 60000\n  }\n}\n```\n\n#### 字段说明\n\n| 字段 | 类型 | 默认 | 说明 |\n|------|------|------|------|\n| `virtualModel` | object | — | 虚拟模型元数据（id/name/reasoning/input/contextWindow/maxTokens/thinkingLevelMap/compat）。`id` 在加载时强制为组名；`maxTokens` 未设默认 `16384`，`contextWindow` 未设默认 `200000`。 |\n| `candidates` | array | `[]` | `[{ \"provider\": \"...\", \"model\": \"...\" }, ...]`。未知组合会被跳过；解析后为空则禁用该组。 |\n| `log` | boolean | `true` | 追加到 `~/.pi/agent/roundrobin/roundrobin.log`。 |\n| `timeoutMs` | number | `30000` | 单候选首响应超时；测速开启且拿到 ttft 时作为**动态超时下限** `max(timeoutMs, min(120000, ttft×2.0))`，没有 ttft 时回退它本身。中转站波动大就调大(如 45000=45s)，给临时劣化更多恢复时间。 |\n| `cooldownMs` | number | `60000` | 候选失败（重试耗尽）后的冷却窗口。 |\n| `strategy` | `\"sticky\"` | `\"sticky\"` | 成功后候选推进策略：`sticky`=黏住当前候选直到失败，冷却后回首选；`round-robin`=成功后指向下一个候选(均分流量)；`primary`=恒回首选(0)，仅首选冷却/失败时用备选。 |\n| `maxRetriesPerCandidate` | number | `2` | 单候选原地重试次数（不含首试），指数退避。设 `0` = 超时/失败即换渠道。 |\n| `speedTest.enabled` | boolean | `false` | 开启测速排序（见上方测速章节）。 |\n| `speedTest.sortKey` | `ttft`/`latency`/`hybrid`/`smart` | `ttft` | 排序键。`hybrid` = `0.7×ttft+0.3×latency`；`smart` = 三维加权含贝叶斯平滑的 7 日成功率。 |\n| `speedTest.prompt` | string | `\"欧拉函数的意义？\"` | 测速 prompt，空则用默认。复用面板模型测试同一真实对话内核。 |\n| `speedTest.timeoutMs` | number | `60000` | 单次测速尝试的超时（≥1000）。失败后退避 1.5s 重试，最多 3 次尝试（`retries` 默认 2）。太短会误判慢但可用的候选。 |\n| `speedTest.concurrency` | integer | `5` | 并行测速 worker 数（≥1）。设为候选数 = 全组并行测。 |\n| `speedTest.minIntervalMs` | number | `60000` | 自动测速节流间隔（≥0）。手动 `/rr-speedtest` 与 ⚡ 按钮绕过此节流。 |\n| `speedTest.retries` | integer | `2` | 单次测速失败后重试次数（不含首试），退避 1.5s。设 `0` = 失败即判 `✗`（快但无抖动容错）。面板可编辑。 |\n\n---\n\n## 安全\n\n- **仅监听 `127.0.0.1`**：本机回环，不暴露到网络。\n- **192-bit token 鉴权**：首次启动生成（`randomBytes(24)`）。为支持多 CLI 无缝复用同一面板，token **持久化**到 `~/.pi/agent/roundrobin/.panel-token`，跨会话/跨终端复用，**非每次随机**；所有 `/api/*` 路由必须带 `X-Config-Token` 头。\n- **同机威胁模型**：本地 `127.0.0.1` only，同机其他进程理论上能读到 token 文件或访问端口——这是用「固定 token 换多 CLI 复用」的明确取舍。介意可删 `~/.pi/agent/roundrobin/.panel-token` 强制重置。\n- **API Key 服务端解析**：支持 `$ENV_VAR`（如 `$OPENAI_API_KEY`，运行时从环境变量取值），浏览器永远拿不到解析后的明文。\n- **保存自动备份**：每次写 `models.json` / `config.json` 前先复制一份带时间戳的 `.bak`，误改可回退。\n\n## 开发\n\n仓库含 9 个 vitest 测试套件（`tests/`），覆盖配置解析、健康存储、轮询故障转移、前后端联动等。\n\n## 许可证\n\nMIT\n","readmeFilename":"README.md"}