AI CoreEnglish | 中文 EnglishUnified AI API configuration and credential management for VS Code extensions. Features
Installation
Extension Settings
Configuration Structure
API Reference for Extension DevelopersGetting the API
Access ControlSensitive API methods ( Setup for your extension:
Non-sensitive methods ( Interface Definition
Methods
|
| 设置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
aiCore.allowedExtensions |
string[] |
["23J1633.ghost-annotations", "23J1633.bcos", "23J1633.hilbert-go"] |
允许访问敏感 API 方法的扩展 ID 白名单 |
aiCore.showStatusBarIcon |
boolean |
true |
是否在状态栏显示 AI Core 齿轮图标 |
配置结构
服务商 (例如 OpenAI)
├── 基础 URL (例如 https://api.openai.com/v1)
├── API 格式 (OpenAI / Claude / Gemini)
└── 凭据[]
├── 名称 (可选,例如"生产Key")
├── API 密钥
└── 模型[]
├── 模型 ID (例如 gpt-4)
└── 显示名称 (例如 GPT-4)
扩展开发者 API 参考
获取 API
import * as vscode from 'vscode';
const coreApi = vscode.extensions.getExtension('23J1633-AI-core')?.exports;
访问控制
敏感 API 方法(getCredential、exportConfig、importConfig)要求调用方传入其扩展 ID 作为第一个参数。该 ID 会在 VS Code 设置的 aiCore.allowedExtensions 白名单中进行校验。
为你的扩展做配置:
- 在 VS Code 设置(
settings.json)中将你的扩展 ID 添加到白名单:
{
"aiCore.allowedExtensions": [
"23J1633.ghost-extensions",
"23J1633.bcos"
]
}
- 调用敏感方法时传入你的扩展 ID:
const MY_ID = '23J1633.my-extension';
const cred = await coreApi.getCredential(MY_ID, 'OpenAI', 'gpt-4');
非敏感方法(openConfigUI、getModelList、onConfigChange)不需要 callerId。
接口定义
type ApiFormat = 'OpenAI' | 'Claude' | 'Gemini';
type ImportMode = 'merge' | 'replace';
interface AiModelConfig {
id: string;
name: string;
}
interface ApiCredential {
id: string;
name?: string; // 可选的凭据显示名称
apiKey: string;
models: AiModelConfig[];
}
interface AiProvider {
id: string;
name: string;
baseUrl: string;
format: ApiFormat;
credentials: ApiCredential[];
}
type RootConfig = AiProvider[];
interface CredentialResult {
apiKey: string; // API 密钥
baseUrl: string; // 服务商的基础 URL
format: ApiFormat; // 'OpenAI' | 'Claude' | 'Gemini'
}
interface AiCoreApi {
openConfigUI(): void;
getCredential(callerId: string, providerName: string, modelName: string): Promise<CredentialResult>;
exportConfig(callerId: string): Promise<RootConfig>;
importConfig(callerId: string, config: RootConfig, mode?: ImportMode): Promise<void>;
onConfigChange: vscode.Event<RootConfig>;
getModelList(): Promise<string[]>;
}
方法说明
openConfigUI(): void
在编辑器中打开 AI Core 配置面板。
coreApi.openConfigUI();
getCredential(callerId: string, providerName: string, modelName: string): Promise<CredentialResult>
获取特定服务商和模型的凭据。需要调用方在白名单中。
参数:
callerId:你的扩展 ID(在aiCore.allowedExtensions中校验)providerName:AI 服务商的名称(必须与配置的名称完全匹配)modelName:模型 ID(必须与服务商下配置的模型 ID 匹配)
返回: 包含 apiKey、baseUrl 和 format 的 CredentialResult
异常: 如果调用方不在白名单中,或找不到服务商/模型会抛出错误
负载均衡: 如果同一模型配置了多个凭据,会随机选择一个。
exportConfig(callerId: string): Promise<RootConfig>
从 AI Core 导出完整配置。返回所有服务商、凭据(包含真实 API 密钥)和模型。需要调用方在白名单中。
参数:
callerId:你的扩展 ID(在aiCore.allowedExtensions中校验)
返回: RootConfig — 完整的配置数组
const config = await coreApi.exportConfig('23J1633.my-extension');
importConfig(callerId: string, config: RootConfig, mode?: ImportMode): Promise<void>
将外部配置导入到 AI Core。需要调用方在白名单中。
参数:
callerId:你的扩展 ID(在aiCore.allowedExtensions中校验)config:要导入的配置(与RootConfig结构相同)mode:可选。'merge'(默认)与现有配置合并;'replace'完全覆盖
合并行为:
- 服务商按
name匹配 — 如果同名服务商已存在,则合并其凭据 - 服务商内的凭据按
id匹配 — 相同id的条目会被更新 - 新的服务商或凭据会被追加
const MY_ID = '23J1633.my-extension';
// 合并:添加/更新服务商和凭据
await coreApi.importConfig(MY_ID, externalConfig);
// 替换:覆盖整个配置
await coreApi.importConfig(MY_ID, externalConfig, 'replace');
onConfigChange: vscode.Event<RootConfig>
配置变更时触发的事件(保存、导入等操作后)。
回调参数: 变更后的新的 RootConfig
coreApi.onConfigChange((newConfig) => {
console.log('AI Core 配置已变更,开始同步...');
syncToMyExtension(newConfig);
});
getModelList(): Promise<string[]>
返回所有已配置模型的列表,格式为 "服务商|模型"。
返回: 字符串数组,如 ["OpenAI|gpt-4", "Anthropic|claude-3-sonnet"]。每个服务商-模型组合仅出现一次。
const MY_ID = '23J1633.my-extension';
const models = await coreApi.getModelList();
console.log(models);
// ["OpenAI|gpt-4", "OpenAI|gpt-3.5-turbo", "Anthropic|claude-3-sonnet"]
// 用于 QuickPick 选择
const selected = await vscode.window.showQuickPick(models, {
placeHolder: '选择一个 AI 模型'
});
if (selected) {
const [providerName, modelName] = selected.split('|');
const cred = await coreApi.getCredential(MY_ID, providerName, modelName);
// ...
}
配置同步
从外部扩展同步到 AI Core
const MY_ID = '23J1633.my-extension';
async function syncToAiCore(myConfig: RootConfig) {
const coreApi = vscode.extensions.getExtension('23J1633-AI-core')?.exports;
if (!coreApi) { return; }
// 导入外部配置,与现有配置合并
await coreApi.importConfig(MY_ID, myConfig, 'merge');
}
从 AI Core 同步到外部扩展
function watchAiCoreChanges() {
const coreApi = vscode.extensions.getExtension('23J1633-AI-core')?.exports;
if (!coreApi) { return; }
// 监听配置变更
coreApi.onConfigChange(async (newConfig) => {
// 转换为你的扩展格式并保存
const adapted = adaptConfigForMyExtension(newConfig);
await saveMyConfig(adapted);
});
}
// 激活时初始同步
async function initialSync() {
const coreApi = vscode.extensions.getExtension('23J1633-AI-core')?.exports;
if (!coreApi) { return; }
const config = await coreApi.exportConfig(MY_ID);
const adapted = adaptConfigForMyExtension(config);
await saveMyConfig(adapted);
}
集成示例
基础用法
const MY_ID = '23J1633.my-extension';
async function callAI() {
const coreApi = vscode.extensions.getExtension('23J1633-AI-core')?.exports;
try {
const cred = await coreApi.getCredential(MY_ID, 'OpenAI', 'gpt-4');
const response = await fetch(`${cred.baseUrl}/chat/completions`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${cred.apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'gpt-4',
messages: [{ role: 'user', content: '你好!' }]
})
});
return await response.json();
} catch (error) {
vscode.window.showErrorMessage(`AI 错误: ${error.message}`, '去配置').then(action => {
if (action === '去配置') {
coreApi.openConfigUI();
}
});
}
}
多格式支持
const MY_ID = '23J1633.my-extension';
async function callAI(providerName: string, modelName: string) {
const coreApi = vscode.extensions.getExtension('23J1633-AI-core')?.exports;
const cred = await coreApi.getCredential(MY_ID, providerName, modelName);
let requestBody: any;
let headers: Record<string, string>;
switch (cred.format) {
case 'OpenAI':
headers = {
'Authorization': `Bearer ${cred.apiKey}`,
'Content-Type': 'application/json'
};
requestBody = {
model: modelName,
messages: [{ role: 'user', content: '你好!' }]
};
break;
case 'Claude':
headers = {
'x-api-key': cred.apiKey,
'anthropic-version': '2023-06-01',
'Content-Type': 'application/json'
};
requestBody = {
model: modelName,
max_tokens: 1024,
messages: [{ role: 'user', content: '你好!' }]
};
break;
case 'Gemini':
headers = {
'Content-Type': 'application/json'
};
requestBody = {
contents: [{ parts: [{ text: '你好!' }] }]
};
break;
}
const url = cred.format === 'Gemini'
? `${cred.baseUrl}/models/${modelName}:generateContent?key=${cred.apiKey}`
: `${cred.baseUrl}/chat/completions`;
const response = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(requestBody)
});
return await response.json();
}
带配置引导的错误处理
const MY_ID = '23J1633.my-extension';
async function handleAIRequest() {
const coreApi = vscode.extensions.getExtension('23J1633-AI-core')?.exports;
if (!coreApi) {
const action = await vscode.window.showErrorMessage(
'AI Core 扩展未安装',
'去安装'
);
if (action === '去安装') {
vscode.commands.executeCommand('extension.open', '23J1633-AI-core');
}
return;
}
try {
const cred = await coreApi.getCredential(MY_ID, 'Anthropic', 'claude-3-sonnet');
// ... 发起 API 调用
} catch (error) {
if (error.message.includes('not in the AI Core access whitelist')) {
const action = await vscode.window.showWarningMessage(
`访问被拒绝: ${error.message}`,
'打开设置',
'取消'
);
if (action === '打开设置') {
coreApi.openConfigUI();
}
} else if (error.message.includes('not found')) {
const action = await vscode.window.showWarningMessage(
`请求的模型配置缺失: ${error.message}`,
'打开设置',
'取消'
);
if (action === '打开设置') {
coreApi.openConfigUI();
}
} else {
throw error;
}
}
}
安全说明
- API 密钥存储在 VS Code 的 SecretStorage 中(由操作系统加密)
- 密钥在 UI 中显示时会被脱敏(例如
sk-****1234) - 配置界面的 DOM 中永远不会接收到完整的 API 密钥
- 密钥仅在扩展间的内存中传输
- 敏感 API 的访问由
aiCore.allowedExtensions白名单控制
扩展依赖
在你的扩展的 package.json 中添加:
{
"extensionDependencies": [
"23J1633-AI-core"
]
}
这确保 AI Core 在你的扩展激活之前已安装。
许可证
MIT