Prechádzať zdrojové kódy

:art: 支持应用内配置人工智能 https://github.com/siyuan-note/siyuan/issues/7714

Liang Ding 2 rokov pred
rodič
commit
48b8fc536c

+ 10 - 0
app/appearance/langs/en_US.json

@@ -1,4 +1,14 @@
 {
+  "apiKey": "API Key",
+  "apiKeyTip": "It is recommended to assign an API Key to SiYuan separately for subsequent management. If this item is left blank, AI-related functions will be disabled",
+  "apiTimeout": "Timeout",
+  "apiTimeoutTip": "The timeout period for initiating a request, unit: second",
+  "apiProxy": "Network Proxy",
+  "apiProxyTip": "The network proxy that initiates the request, such as <code class='fn__code'>socks://127.0.0.1:1080</code>",
+  "apiMaxTokens": "Maximum number of Tokens",
+  "apiMaxTokensTip": "The <code class='fn__code'>max_tokens</code> parameter passed in when requesting the API is used to control the length of the generated text",
+  "apiBaseURL": "API Base URL",
+  "apiBaseURLTip": "The base address of the request, such as <code class='fn__code'>https://api.openai.com/v1</code>",
   "skip": "Skip",
   "reboot": "Reboot",
   "saveLayout": "Save Layout",

+ 10 - 0
app/appearance/langs/es_ES.json

@@ -1,4 +1,14 @@
 {
+  "apiKey": "Clave API",
+  "apiKeyTip": "Se recomienda asignar una clave API a SiYuan por separado para su posterior administración. Si este elemento se deja en blanco, las funciones relacionadas con la IA se desactivarán",
+  "apiTimeout": "Tiempo de espera",
+  "apiTimeoutTip": "El tiempo de espera para iniciar una solicitud, unidad: segundo",
+  "apiProxy": "Proxy web",
+  "apiProxyTip": "El proxy de red que inicia la solicitud, como <code class='fn__code'>socks://127.0.0.1:1080</code>",
+  "apiMaxTokens": "Número máximo de tokens",
+  "apiMaxTokensTip": "El parámetro <code class='fn__code'>max_tokens</code> que se pasa al solicitar la API se usa para controlar la longitud del texto generado",
+  "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>",
   "skip": "barco",
   "reboot": "Reiniciar",
   "saveLayout": "Guardar diseño",

+ 10 - 0
app/appearance/langs/fr_FR.json

@@ -1,4 +1,14 @@
 {
+  "apiKey": "Clé API",
+  "apiKeyTip": "Il est recommandé d'attribuer une clé API à SiYuan séparément pour une gestion ultérieure. Si cet élément est laissé vide, les fonctions liées à l'IA seront désactivées",
+  "apiTimeout": "Délai d'expiration",
+  "apiTimeoutTip": "Le délai d'attente pour lancer une requête, unité : seconde",
+  "apiProxy": "Proxy Web",
+  "apiProxyTip": "Le proxy réseau qui lance la requête, tel que <code class='fn__code'>socks://127.0.0.1:1080</code>",
+  "apiMaxTokens": "Nombre maximum de jetons",
+  "apiMaxTokensTip": "Le paramètre <code class='fn__code'>max_tokens</code> transmis lors de la demande de l'API est utilisé pour contrôler la longueur du texte généré",
+  "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>",
   "skip": "Navire",
   "reboot": "Redémarrer",
   "saveLayout": "Enregistrer la mise en page",

+ 10 - 0
app/appearance/langs/zh_CHT.json

@@ -1,4 +1,14 @@
 {
+  "apiKey": "API Key",
+  "apiKeyTip": "建議為思源單獨分配 API Key 以便於後續管理。該項留空則禁用 AI 相關功能",
+  "apiTimeout": "超時時間",
+  "apiTimeoutTip": "發起請求的超時時間,單位:秒",
+  "apiProxy": "網絡代理",
+  "apiProxyTip": "發起請求的網絡代理,如 <code class='fn__code'>socks://127.0.0.1:1080</code>",
+  "apiMaxTokens": "最大 Token 數",
+  "apiMaxTokensTip": "請求 API 時傳入的 <code class='fn__code'>max_tokens</code> 參數,用於控制生成的文本長度",
+  "apiBaseURL": "API 基礎地址",
+  "apiBaseURLTip": "發起請求的基礎地址,如 <code class='fn__code'>https://api.openai.com/v1</code>",
   "skip": "跳過",
   "reboot": "重啟",
   "saveLayout": "保存佈局",

+ 10 - 0
app/appearance/langs/zh_CN.json

@@ -1,4 +1,14 @@
 {
+  "apiKey": "API Key",
+  "apiKeyTip": "建议为思源单独分配 API Key 以便于后续管理。该项留空则禁用 AI 相关功能",
+  "apiTimeout": "超时时间",
+  "apiTimeoutTip": "发起请求的超时时间,单位:秒",
+  "apiProxy": "网络代理",
+  "apiProxyTip": "发起请求的网络代理,如 <code class='fn__code'>socks://127.0.0.1:1080</code>",
+  "apiMaxTokens": "最大 Token 数",
+  "apiMaxTokensTip": "请求 API 时传入的 <code class='fn__code'>max_tokens</code> 参数,用于控制生成的文本长度",
+  "apiBaseURL": "API 基础地址",
+  "apiBaseURLTip": "发起请求的基础地址,如 <code class='fn__code'>https://api.openai.com/v1</code>",
   "skip": "跳过",
   "reboot": "重启",
   "saveLayout": "保存布局",

+ 13 - 13
app/src/config/AI.ts

@@ -11,40 +11,40 @@ export const AI = {
     <div data-type="openai">
         <label class="fn__flex b3-label">
             <div class="fn__flex-1">
-                APIKey
-                <div class="b3-label__text">APIKeyAPIKeyAPIKey</div>
+                ${window.siyuan.languages.apiKey}
+                <div class="b3-label__text">${window.siyuan.languages.apiKeyTip}</div>
             </div>
             <span class="fn__space"></span>
             <input class="b3-text-field fn__flex-center" id="apiKey" value="${window.siyuan.config.ai.openAI.apiKey}"/>
         </label>
         <label class="fn__flex b3-label">
             <div class="fn__flex-1">
-                APITimeout
-                <div class="b3-label__text">APITimeoutAPITimeoutAPITimeout</div>
+                ${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" type="number" step="1" min="1" id="openFilesUseCurrentTab" value="${window.siyuan.config.ai.openAI}"/>
+            <input class="b3-text-field fn__flex-center" type="number" step="1" min="5" max="600" id="openFilesUseCurrentTab" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
         </label>
         <label class="fn__flex b3-label">
             <div class="fn__flex-1">
-                APIProxy
-                <div class="b3-label__text">APIProxyAPIProxyAPIProxy</div>
+                ${window.siyuan.languages.apiMaxTokens}
+                <div class="b3-label__text">${window.siyuan.languages.apiMaxTokensTip}</div>
             </div>
             <span class="fn__space"></span>
-            <input class="b3-text-field fn__flex-center" id="apiProxy" value="${window.siyuan.config.ai.openAI.apiProxy}"/>
+            <input class="b3-text-field fn__flex-center" type="number" step="1" min="0" id="apiMaxTokens" max="4096" value="${window.siyuan.config.ai.openAI.apiMaxTokens}"/>
         </label>
         <label class="fn__flex b3-label">
             <div class="fn__flex-1">
-                APIMaxTokens
-                <div class="b3-label__text">APIMaxTokensAPIMaxTokensAPIMaxTokens</div>
+                ${window.siyuan.languages.apiProxy}
+                <div class="b3-label__text">${window.siyuan.languages.apiProxyTip}</div>
             </div>
             <span class="fn__space"></span>
-            <input class="b3-text-field fn__flex-center" type="number" step="1" min="0" id="apiMaxTokens" value="${window.siyuan.config.ai.openAI.apiMaxTokens}"/>
+            <input class="b3-text-field fn__flex-center" id="apiProxy" value="${window.siyuan.config.ai.openAI.apiProxy}"/>
         </label>
         <label class="fn__flex b3-label">
             <div class="fn__flex-1">
-                APIBaseURL
-                <div class="b3-label__text">APIBaseURLAPIBaseURLAPIBaseURL</div>
+                ${window.siyuan.languages.apiBaseURL}
+                <div class="b3-label__text">${window.siyuan.languages.apiBaseURLTip}</div>
             </div>
             <span class="fn__space"></span>
             <input class="b3-text-field fn__flex-center" id="apiBaseURL" value="${window.siyuan.config.ai.openAI.apiBaseURL}"/>

+ 14 - 0
kernel/api/setting.go

@@ -52,6 +52,20 @@ func setAI(c *gin.Context) {
 		return
 	}
 
+	if 5 > ai.OpenAI.APITimeout {
+		ai.OpenAI.APITimeout = 5
+	}
+	if 600 < ai.OpenAI.APITimeout {
+		ai.OpenAI.APITimeout = 600
+	}
+
+	if 0 > ai.OpenAI.APIMaxTokens {
+		ai.OpenAI.APIMaxTokens = 0
+	}
+	if 4096 < ai.OpenAI.APIMaxTokens {
+		ai.OpenAI.APIMaxTokens = 4096
+	}
+
 	model.Conf.AI = ai
 	model.Conf.Save()