60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import { readRuntimeEnv } from "@/env";
|
||
|
||
/**
|
||
* 舆情分析智能体(前端直连的虚拟智能体)的接入配置。
|
||
* 接口地址与 Basic Auth 凭据都来自 public/runtime-config.js,部署后可直接改
|
||
* dist/runtime-config.js 切换环境,无需重新打包。
|
||
*/
|
||
|
||
/** 该虚拟智能体在路由里的固定 id(/agents/{id}/chats/...)。 */
|
||
export const SENTIMENT_AGENT_ID = "sentiment-analysis";
|
||
|
||
export interface SentimentAgentEndpoint {
|
||
apiUrl: string;
|
||
authUsername: string;
|
||
authPassword: string;
|
||
}
|
||
|
||
export function readSentimentAgentEndpoint(): SentimentAgentEndpoint {
|
||
return {
|
||
apiUrl: readRuntimeEnv("VITE_SENTIMENT_AGENT_API_URL") ?? "",
|
||
authUsername: readRuntimeEnv("VITE_SENTIMENT_AGENT_AUTH_USERNAME") ?? "",
|
||
authPassword: readRuntimeEnv("VITE_SENTIMENT_AGENT_AUTH_PASSWORD") ?? "",
|
||
};
|
||
}
|
||
|
||
export function isSentimentAgentConfigured(): boolean {
|
||
return !!readSentimentAgentEndpoint().apiUrl;
|
||
}
|
||
|
||
/**
|
||
* 是否开放舆情分析虚拟智能体。未配置时保持展示,避免旧部署升级后入口意外消失;
|
||
* 只有运行时配置显式写为 "false" 才关闭。
|
||
*/
|
||
export function isSentimentAgentVisible(): boolean {
|
||
return readRuntimeEnv("VITE_SENTIMENT_AGENT_VISIBLE") !== "false";
|
||
}
|
||
|
||
function toBase64(value: string): string {
|
||
// 凭据按 UTF-8 字节做 Basic Auth base64,避免非 ASCII 字符导致 btoa 抛错。
|
||
const bytes = new TextEncoder().encode(value);
|
||
let binary = "";
|
||
for (const byte of bytes) {
|
||
binary += String.fromCharCode(byte);
|
||
}
|
||
return btoa(binary);
|
||
}
|
||
|
||
/** 组装请求头:Basic Auth(用户名/密码都配置了才带 Authorization)。 */
|
||
export function buildSentimentAgentHeaders(): Record<string, string> {
|
||
const { authUsername, authPassword } = readSentimentAgentEndpoint();
|
||
const headers: Record<string, string> = {
|
||
"Content-Type": "application/json",
|
||
Accept: "text/event-stream",
|
||
};
|
||
if (authUsername && authPassword) {
|
||
headers.Authorization = `Basic ${toBase64(`${authUsername}:${authPassword}`)}`;
|
||
}
|
||
return headers;
|
||
}
|