feat: add Pi provider managed resources

This commit is contained in:
2026-08-22 21:48:00 +08:00
parent 81d8ad1b6b
commit 161f3f471b
31 changed files with 1581 additions and 40 deletions

View File

@@ -10,6 +10,7 @@ import {
runProbe,
validatePiIdentity,
} from './probe-pi-runtime.mjs';
import { runLocalProviderContracts } from './probe-pi-provider-contracts.mjs';
import {
PI_RUNTIME_MANIFEST,
defaultPiBundleTarget,
@@ -305,6 +306,15 @@ export async function runPackagedProbe(options, projectRoot = process.cwd()) {
cliPath,
artifactLabel: ARTIFACT_LABEL,
}, resolvedProjectRoot);
const providerContracts = await runLocalProviderContracts({
...options,
reportPath: undefined,
stage: false,
keepStage: false,
electronExecutablePath: executable,
cliPath,
artifactLabel: ARTIFACT_LABEL,
}, resolvedProjectRoot);
const report = {
schemaVersion: 1,
generatedAt: new Date().toISOString(),
@@ -320,6 +330,7 @@ export async function runPackagedProbe(options, projectRoot = process.cwd()) {
stagedClosure,
packagedClosure,
runtime,
providerContracts,
result: runtime.result,
decision: 'incomplete',
};

View File

@@ -13,6 +13,7 @@ import {
const LOCAL_API_KEY_ENV = 'PI_PROBE_LOCAL_CONTRACT_KEY';
const LOCAL_API_KEY = 'pi-local-contract-only';
const LOCAL_HEADER_ENV = 'PI_PROBE_LOCAL_CONTRACT_HEADER';
const CUSTOM_HEADER = 'x-makelore-pi-probe';
const IMAGE_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9Z4N8AAAAASUVORK5CYII=';
@@ -227,6 +228,7 @@ export async function runLocalProviderContracts(options, projectRoot = process.c
const scratchRoot = await mkdtemp(join(tmpdir(), 'makelore-pi-provider-contracts-'));
const requests = [];
const previousApiKey = process.env[LOCAL_API_KEY_ENV];
const previousHeader = process.env[LOCAL_HEADER_ENV];
const server = await startContractServer(requests);
process.env[LOCAL_API_KEY_ENV] = LOCAL_API_KEY;
try {
@@ -243,6 +245,7 @@ export async function runLocalProviderContracts(options, projectRoot = process.c
await writeFile(imagePath, Buffer.from(IMAGE_BASE64, 'base64'));
const protocols = [];
for (const protocol of MAKELore_PROVIDER_PROTOCOLS) {
process.env[LOCAL_HEADER_ENV] = protocol;
const protocolRoot = join(scratchRoot, protocol);
await mkdir(protocolRoot);
const fixturePath = join(protocolRoot, 'fixture.json');
@@ -255,7 +258,7 @@ export async function runLocalProviderContracts(options, projectRoot = process.c
apiProtocol: protocol,
baseUrl,
apiKeyEnv: LOCAL_API_KEY_ENV,
headers: { [CUSTOM_HEADER]: protocol },
headers: { [CUSTOM_HEADER]: `$${LOCAL_HEADER_ENV}` },
model: { id: modelId, input: ['text', 'image'] },
}, null, 2)}\n`);
const qualification = await runProviderQualification(
@@ -283,6 +286,8 @@ export async function runLocalProviderContracts(options, projectRoot = process.c
scope: {
network: '127.0.0.1 only',
realProvider: false,
realTurnVerified: false,
realProviderDecision: 'explicitly-waived-accepted-risk',
limitation: 'Validates Pi HTTP/SSE request contracts and worker behavior; does not qualify a real provider account.',
},
protocols,
@@ -296,6 +301,8 @@ export async function runLocalProviderContracts(options, projectRoot = process.c
} finally {
if (previousApiKey === undefined) delete process.env[LOCAL_API_KEY_ENV];
else process.env[LOCAL_API_KEY_ENV] = previousApiKey;
if (previousHeader === undefined) delete process.env[LOCAL_HEADER_ENV];
else process.env[LOCAL_HEADER_ENV] = previousHeader;
await server.close();
await rm(scratchRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
}