firebase-tools
Version:
Command-Line Interface for Firebase
73 lines (72 loc) • 2.68 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.callCloudAICompanion = exports.cloudAICompationClient = void 0;
const apiv2_1 = require("../apiv2");
const api_1 = require("../api");
const CLOUD_AI_COMPANION_VERSION = "v1";
const CLIENT_CONTEXT_NAME_IDENTIFIER = "firebase_vscode";
const FIREBASE_CHAT_REQUEST_CONTEXT_TYPE_NAME = "type.googleapis.com/google.cloud.cloudaicompanion.v1main.FirebaseChatRequestContext";
const FDC_SCHEMA_EXPERIENCE_CONTEXT = "/appeco/firebase/fdc-schema-generator";
const FDC_OPERATION_EXPERIENCE_CONTEXT = "/appeco/firebase/fdc-query-generator";
const USER_AUTHOR = "USER";
function cloudAICompationClient() {
return new apiv2_1.Client({
urlPrefix: (0, api_1.cloudAiCompanionOrigin)(),
apiVersion: CLOUD_AI_COMPANION_VERSION,
auth: true,
});
}
exports.cloudAICompationClient = cloudAICompationClient;
async function callCloudAICompanion(client, vscodeRequest, type) {
const request = buildRequest(vscodeRequest, type);
const { projectId } = getServiceParts(vscodeRequest.servicePath);
const instance = toChatResourceName(projectId);
try {
const res = await client.post(`${instance}:completeTask`, request);
return res.body;
}
catch (error) {
return { output: { messages: [] }, error: error };
}
}
exports.callCloudAICompanion = callCloudAICompanion;
function buildRequest({ servicePath, naturalLanguageQuery, chatHistory }, type) {
const { serviceId } = getServiceParts(servicePath);
const input = {
messages: [
...chatHistory,
{
author: USER_AUTHOR,
content: naturalLanguageQuery,
},
],
};
const clientContext = {
name: CLIENT_CONTEXT_NAME_IDENTIFIER,
additionalContext: {
"@type": FIREBASE_CHAT_REQUEST_CONTEXT_TYPE_NAME,
fdcInfo: {
serviceId,
fdcServiceName: servicePath,
requiresQuery: true,
},
},
};
return {
input,
clientContext,
experienceContext: {
experience: type === "schema" ? FDC_SCHEMA_EXPERIENCE_CONTEXT : FDC_OPERATION_EXPERIENCE_CONTEXT,
},
};
}
function toChatResourceName(projectId) {
return `projects/${projectId}/locations/global/instances/default`;
}
function getServiceParts(name) {
const match = name.match(/projects\/([^/]*)\/locations\/([^/]*)\/services\/([^/]*)/);
if (!match) {
throw new Error(`Invalid service name: ${name}`);
}
return { projectId: match[1], locationId: match[2], serviceId: match[3] };
}
;