This commit is contained in:
Daniel 2024-02-15 11:28:38 +08:00
parent 7e87c8c8ad
commit a2f95e3920
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
9 changed files with 47 additions and 8 deletions

View file

@ -274,6 +274,8 @@
"apiBaseURL": "API Base URL", "apiBaseURL": "API Base URL",
"apiBaseURLTip": "The base address of the request, such as <code class='fn__code'>https://api.openai.com/v1</code>", "apiBaseURLTip": "The base address of the request, such as <code class='fn__code'>https://api.openai.com/v1</code>",
"apiUserAgentTip": "The user agent that initiated the request, that is, the HTTP header <code class='fn__code'>User-Agent</code>", "apiUserAgentTip": "The user agent that initiated the request, that is, the HTTP header <code class='fn__code'>User-Agent</code>",
"apiProvider": "API Provider",
"apiProviderTip": "Use the selected API provider to implement AI-related functions",
"skip": "Skip", "skip": "Skip",
"nextRound": "Next round", "nextRound": "Next round",
"save": "Save", "save": "Save",

View file

@ -274,6 +274,8 @@
"apiBaseURL": "URL base de la API", "apiBaseURL": "URL base de la API",
"apiBaseURLTip": "La dirección base de la solicitud, como <code class='fn__code'>https://api.openai.com/v1</code>", "apiBaseURLTip": "La dirección base de la solicitud, como <code class='fn__code'>https://api.openai.com/v1</code>",
"apiUserAgentTip": "El agente de usuario que inició la solicitud, es decir, el encabezado HTTP <code class='fn__code'>User-Agent</code>", "apiUserAgentTip": "El agente de usuario que inició la solicitud, es decir, el encabezado HTTP <code class='fn__code'>User-Agent</code>",
"apiProvider": "API proveedor",
"apiProviderTip": "Utilice el proveedor de API seleccionado para implementar funciones relacionadas con la IA",
"skip": "barco", "skip": "barco",
"nextRound": "Siguiente ronda", "nextRound": "Siguiente ronda",
"save": "Ahorrar", "save": "Ahorrar",

View file

@ -274,6 +274,8 @@
"apiBaseURL": "URL de base de l'API", "apiBaseURL": "URL de base de l'API",
"apiBaseURLTip": "L'adresse de base de la requête, telle que <code class='fn__code'>https://api.openai.com/v1</code>", "apiBaseURLTip": "L'adresse de base de la requête, telle que <code class='fn__code'>https://api.openai.com/v1</code>",
"apiUserAgentTip": "L'agent utilisateur qui a initié la requête, c'est-à-dire l'en-tête HTTP <code class='fn__code'>User-Agent</code>", "apiUserAgentTip": "L'agent utilisateur qui a initié la requête, c'est-à-dire l'en-tête HTTP <code class='fn__code'>User-Agent</code>",
"apiProvider": "API du fournisseur",
"apiProviderTip": "Utiliser le fournisseur d'API sélectionné pour implémenter les fonctions liées à l'IA",
"skip": "Navire", "skip": "Navire",
"nextRound": "Prochain tour", "nextRound": "Prochain tour",
"save": "Sauvegarder", "save": "Sauvegarder",

View file

@ -274,6 +274,8 @@
"apiBaseURL": "API 基礎地址", "apiBaseURL": "API 基礎地址",
"apiBaseURLTip": "發起請求的基礎地址,如 <code class='fn__code'>https://api.openai.com/v1</code>", "apiBaseURLTip": "發起請求的基礎地址,如 <code class='fn__code'>https://api.openai.com/v1</code>",
"apiUserAgentTip": "發起請求的使用者代理,即 HTTP 標頭 <code class='fn__code'>User-Agent</code>", "apiUserAgentTip": "發起請求的使用者代理,即 HTTP 標頭 <code class='fn__code'>User-Agent</code>",
"apiProvider": "API 提供商",
"apiProviderTip": "選擇後將使用該提供商的 API 服務實現 AI 相關功能",
"skip": "跳過", "skip": "跳過",
"nextRound": "下一輪", "nextRound": "下一輪",
"save": "保存", "save": "保存",

View file

@ -274,6 +274,8 @@
"apiBaseURL": "API 基础地址", "apiBaseURL": "API 基础地址",
"apiBaseURLTip": "发起请求的基础地址,如 <code class='fn__code'>https://api.openai.com/v1</code>", "apiBaseURLTip": "发起请求的基础地址,如 <code class='fn__code'>https://api.openai.com/v1</code>",
"apiUserAgentTip": "发起请求的用户代理,即 HTTP 标头 <code class='fn__code'>User-Agent</code>", "apiUserAgentTip": "发起请求的用户代理,即 HTTP 标头 <code class='fn__code'>User-Agent</code>",
"apiProvider": "API 提供商",
"apiProviderTip": "选择后将使用该提供商的 API 服务实现 AI 相关功能",
"skip": "跳过", "skip": "跳过",
"nextRound": "下一轮", "nextRound": "下一轮",
"save": "保存", "save": "保存",

View file

@ -6,10 +6,16 @@ export const ai = {
let responsiveHTML = ""; let responsiveHTML = "";
/// #if MOBILE /// #if MOBILE
responsiveHTML = `<div class="b3-label"> responsiveHTML = `<div class="b3-label">
${window.siyuan.languages.apiTimeout} ${window.siyuan.languages.apiProvider}
<div class="fn__hr"></div> <div class="b3-label__text">
<input class="b3-text-field fn__flex-center fn__block" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/> ${window.siyuan.languages.apiProviderTip}
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div> </div>
<div class="b3-label__text fn__flex config__item" style="padding: 4px 0 4px 4px;">
<select id="apiProvider" class="b3-select">
<option value="OpenAI" ${window.siyuan.config.ai.openAI.apiProvider === "OpenAI" ? "selected" : ""}>OpenAI</option>
<option value="Azure" ${window.siyuan.config.ai.openAI.apiProvider === "Azure" ? "selected" : ""}>Azure</option>
</select>
</div>
</div> </div>
<div class="b3-label"> <div class="b3-label">
${window.siyuan.languages.apiModel} ${window.siyuan.languages.apiModel}
@ -27,6 +33,12 @@ export const ai = {
</select> </select>
</div> </div>
</div> </div>
<div class="b3-label">
${window.siyuan.languages.apiTimeout}
<div class="fn__hr"></div>
<input class="b3-text-field fn__flex-center fn__block" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
</div>
<div class="b3-label"> <div class="b3-label">
${window.siyuan.languages.apiMaxTokens} ${window.siyuan.languages.apiMaxTokens}
<div class="fn__hr"></div> <div class="fn__hr"></div>
@ -58,13 +70,16 @@ export const ai = {
<div class="b3-label__text">${window.siyuan.languages.apiUserAgentTip}</div> <div class="b3-label__text">${window.siyuan.languages.apiUserAgentTip}</div>
</div>`; </div>`;
/// #else /// #else
responsiveHTML = `<div class="fn__flex b3-label"> responsiveHTML = `<div class="fn__flex b3-label config__item">
<div class="fn__flex-1"> <div class="fn__flex-1">
${window.siyuan.languages.apiTimeout} ${window.siyuan.languages.apiProvider}
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div> <div class="b3-label__text">${window.siyuan.languages.apiProviderTip}</div>
</div> </div>
<span class="fn__space"></span> <span class="fn__space"></span>
<input class="b3-text-field fn__flex-center fn__size200" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/> <select id="apiProvider" class="b3-select fn__flex-center fn__size200">
<option value="OpenAI" ${window.siyuan.config.ai.openAI.apiProvider === "OpenAI" ? "selected" : ""}>OpenAI</option>
<option value="Azure" ${window.siyuan.config.ai.openAI.apiProvider === "Azure" ? "selected" : ""}>Azure</option>
</select>
</div> </div>
<div class="fn__flex b3-label config__item"> <div class="fn__flex b3-label config__item">
<div class="fn__flex-1"> <div class="fn__flex-1">
@ -81,6 +96,14 @@ export const ai = {
<option value="gpt-3.5-turbo-1106" ${window.siyuan.config.ai.openAI.apiModel === "gpt-3.5-turbo-1106" ? "selected" : ""}>gpt-3.5-turbo-1106</option> <option value="gpt-3.5-turbo-1106" ${window.siyuan.config.ai.openAI.apiModel === "gpt-3.5-turbo-1106" ? "selected" : ""}>gpt-3.5-turbo-1106</option>
</select> </select>
</div> </div>
<div class="fn__flex b3-label">
<div class="fn__flex-1">
${window.siyuan.languages.apiTimeout}
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
</div>
<span class="fn__space"></span>
<input class="b3-text-field fn__flex-center fn__size200" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
</div>
<div class="fn__flex b3-label"> <div class="fn__flex b3-label">
<div class="fn__flex-1"> <div class="fn__flex-1">
${window.siyuan.languages.apiMaxTokens} ${window.siyuan.languages.apiMaxTokens}

View file

@ -722,6 +722,7 @@ interface IConfig {
} }
ai: { ai: {
openAI: { openAI: {
apiProvider: string // OpenAI, Azure
apiUserAgent: string apiUserAgent: string
apiBaseURL: string apiBaseURL: string
apiKey: string apiKey: string

View file

@ -36,6 +36,7 @@ type OpenAI struct {
APIMaxTokens int `json:"apiMaxTokens"` APIMaxTokens int `json:"apiMaxTokens"`
APIBaseURL string `json:"apiBaseURL"` APIBaseURL string `json:"apiBaseURL"`
APIUserAgent string `json:"apiUserAgent"` APIUserAgent string `json:"apiUserAgent"`
APIProvider string `json:"apiProvider"` // OpenAI, Azure
} }
func NewAI() *AI { func NewAI() *AI {
@ -44,6 +45,7 @@ func NewAI() *AI {
APIModel: openai.GPT3Dot5Turbo, APIModel: openai.GPT3Dot5Turbo,
APIBaseURL: "https://api.openai.com/v1", APIBaseURL: "https://api.openai.com/v1",
APIUserAgent: util.UserAgent, APIUserAgent: util.UserAgent,
APIProvider: "OpenAI",
} }
openAI.APIKey = os.Getenv("SIYUAN_OPENAI_API_KEY") openAI.APIKey = os.Getenv("SIYUAN_OPENAI_API_KEY")

View file

@ -408,6 +408,9 @@ func InitConf() {
if "" == Conf.AI.OpenAI.APIUserAgent { if "" == Conf.AI.OpenAI.APIUserAgent {
Conf.AI.OpenAI.APIUserAgent = util.UserAgent Conf.AI.OpenAI.APIUserAgent = util.UserAgent
} }
if "" == Conf.AI.OpenAI.APIProvider {
Conf.AI.OpenAI.APIProvider = "OpenAI"
}
if "" != Conf.AI.OpenAI.APIKey { if "" != Conf.AI.OpenAI.APIKey {
logging.LogInfof("OpenAI API enabled\n"+ logging.LogInfof("OpenAI API enabled\n"+