@phi-code-admin/phi-code 0.59.5 → 0.59.6
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/extensions/phi/init.ts +100 -0
- package/package.json +1 -1
package/extensions/phi/init.ts
CHANGED
|
@@ -714,4 +714,104 @@ _Edit this file to customize Phi Code's behavior for your project._
|
|
|
714
714
|
}
|
|
715
715
|
},
|
|
716
716
|
});
|
|
717
|
+
|
|
718
|
+
// ─── API Key Management Command ─────────────────────────────────
|
|
719
|
+
|
|
720
|
+
pi.registerCommand("api-key", {
|
|
721
|
+
description: "Set or view API keys (usage: /api-key set <provider> <key> | /api-key list)",
|
|
722
|
+
handler: async (args, ctx) => {
|
|
723
|
+
const parts = args.trim().split(/\s+/);
|
|
724
|
+
const action = parts[0]?.toLowerCase();
|
|
725
|
+
|
|
726
|
+
const PROVIDERS: Record<string, { envVar: string; name: string }> = {
|
|
727
|
+
alibaba: { envVar: "ALIBABA_CODING_PLAN_KEY", name: "Alibaba Coding Plan" },
|
|
728
|
+
dashscope: { envVar: "DASHSCOPE_API_KEY", name: "DashScope (Alibaba)" },
|
|
729
|
+
openai: { envVar: "OPENAI_API_KEY", name: "OpenAI" },
|
|
730
|
+
anthropic: { envVar: "ANTHROPIC_API_KEY", name: "Anthropic" },
|
|
731
|
+
google: { envVar: "GOOGLE_API_KEY", name: "Google" },
|
|
732
|
+
openrouter: { envVar: "OPENROUTER_API_KEY", name: "OpenRouter" },
|
|
733
|
+
groq: { envVar: "GROQ_API_KEY", name: "Groq" },
|
|
734
|
+
brave: { envVar: "BRAVE_API_KEY", name: "Brave Search" },
|
|
735
|
+
};
|
|
736
|
+
|
|
737
|
+
if (!action || action === "help") {
|
|
738
|
+
ctx.ui.notify(`**🔑 API Key Management**
|
|
739
|
+
|
|
740
|
+
Usage:
|
|
741
|
+
/api-key set <provider> <key> — Set an API key for this session
|
|
742
|
+
/api-key list — Show configured providers
|
|
743
|
+
/api-key providers — List all supported providers
|
|
744
|
+
|
|
745
|
+
Supported providers: ${Object.keys(PROVIDERS).join(", ")}
|
|
746
|
+
|
|
747
|
+
Example:
|
|
748
|
+
/api-key set alibaba sk-sp-xxx
|
|
749
|
+
/api-key set openai sk-xxx
|
|
750
|
+
|
|
751
|
+
Keys set with /api-key are active for the current session.
|
|
752
|
+
For persistence, set environment variables:
|
|
753
|
+
• Windows: setx ALIBABA_CODING_PLAN_KEY "your-key"
|
|
754
|
+
• Linux/Mac: export ALIBABA_CODING_PLAN_KEY="your-key"`, "info");
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
if (action === "list") {
|
|
759
|
+
let found = 0;
|
|
760
|
+
let msg = "**🔑 Configured API Keys:**\n";
|
|
761
|
+
for (const [id, info] of Object.entries(PROVIDERS)) {
|
|
762
|
+
const key = process.env[info.envVar];
|
|
763
|
+
if (key) {
|
|
764
|
+
const masked = key.substring(0, 6) + "..." + key.substring(key.length - 4);
|
|
765
|
+
msg += ` ✅ ${info.name} (${id}): ${masked}\n`;
|
|
766
|
+
found++;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
if (found === 0) {
|
|
770
|
+
msg += " ❌ No API keys configured\n";
|
|
771
|
+
msg += "\nUse `/api-key set <provider> <key>` to add one.";
|
|
772
|
+
}
|
|
773
|
+
ctx.ui.notify(msg, "info");
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
if (action === "providers") {
|
|
778
|
+
let msg = "**Supported Providers:**\n";
|
|
779
|
+
for (const [id, info] of Object.entries(PROVIDERS)) {
|
|
780
|
+
const status = process.env[info.envVar] ? "✅" : "⬜";
|
|
781
|
+
msg += ` ${status} **${id}** — ${info.name} (${info.envVar})\n`;
|
|
782
|
+
}
|
|
783
|
+
ctx.ui.notify(msg, "info");
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
if (action === "set") {
|
|
788
|
+
const provider = parts[1]?.toLowerCase();
|
|
789
|
+
const key = parts[2];
|
|
790
|
+
|
|
791
|
+
if (!provider || !key) {
|
|
792
|
+
ctx.ui.notify("Usage: /api-key set <provider> <key>\nExample: /api-key set alibaba sk-sp-xxx", "warning");
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
const info = PROVIDERS[provider];
|
|
797
|
+
if (!info) {
|
|
798
|
+
ctx.ui.notify(`Unknown provider "${provider}". Supported: ${Object.keys(PROVIDERS).join(", ")}`, "error");
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// Set in current process environment
|
|
803
|
+
process.env[info.envVar] = key;
|
|
804
|
+
// Also set common aliases
|
|
805
|
+
if (provider === "alibaba") {
|
|
806
|
+
process.env.DASHSCOPE_API_KEY = key;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
const masked = key.substring(0, 6) + "..." + key.substring(key.length - 4);
|
|
810
|
+
ctx.ui.notify(`✅ **${info.name}** API key set: ${masked}\n\n⚠️ Active for this session only. For persistence:\n • Windows: \`setx ${info.envVar} "${key.substring(0, 6)}..."\`\n • Linux/Mac: Add \`export ${info.envVar}="..."\` to ~/.bashrc`, "info");
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
ctx.ui.notify("Unknown action. Use: /api-key set|list|providers|help", "warning");
|
|
815
|
+
},
|
|
816
|
+
});
|
|
717
817
|
}
|