mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-05-19 10:30:45 +08:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
d3a4053f28
@ -273,6 +273,9 @@
|
|||||||
"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",
|
"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",
|
"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>",
|
||||||
|
"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",
|
||||||
|
@ -273,6 +273,9 @@
|
|||||||
"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",
|
"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",
|
"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>",
|
||||||
|
"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",
|
||||||
|
@ -273,6 +273,9 @@
|
|||||||
"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é",
|
"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",
|
"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>",
|
||||||
|
"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",
|
||||||
|
@ -273,6 +273,9 @@
|
|||||||
"apiMaxTokensTip": "請求 API 時傳入的 <code class='fn__code'>max_tokens</code> 參數,用於控制生成的文字長度",
|
"apiMaxTokensTip": "請求 API 時傳入的 <code class='fn__code'>max_tokens</code> 參數,用於控制生成的文字長度",
|
||||||
"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>",
|
||||||
|
"apiProvider": "API 提供商",
|
||||||
|
"apiProviderTip": "選擇後將使用該提供商的 API 服務實現 AI 相關功能",
|
||||||
"skip": "跳過",
|
"skip": "跳過",
|
||||||
"nextRound": "下一輪",
|
"nextRound": "下一輪",
|
||||||
"save": "保存",
|
"save": "保存",
|
||||||
|
@ -273,6 +273,9 @@
|
|||||||
"apiMaxTokensTip": "请求 API 时传入的 <code class='fn__code'>max_tokens</code> 参数,用于控制生成的文本长度",
|
"apiMaxTokensTip": "请求 API 时传入的 <code class='fn__code'>max_tokens</code> 参数,用于控制生成的文本长度",
|
||||||
"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>",
|
||||||
|
"apiProvider": "API 提供商",
|
||||||
|
"apiProviderTip": "选择后将使用该提供商的 API 服务实现 AI 相关功能",
|
||||||
"skip": "跳过",
|
"skip": "跳过",
|
||||||
"nextRound": "下一轮",
|
"nextRound": "下一轮",
|
||||||
"save": "保存",
|
"save": "保存",
|
||||||
|
@ -6,33 +6,35 @@ export const ai = {
|
|||||||
let responsiveHTML = "";
|
let responsiveHTML = "";
|
||||||
/// #if MOBILE
|
/// #if MOBILE
|
||||||
responsiveHTML = `<div class="b3-label">
|
responsiveHTML = `<div class="b3-label">
|
||||||
|
${window.siyuan.languages.apiProvider}
|
||||||
|
<div class="b3-label__text">
|
||||||
|
${window.siyuan.languages.apiProviderTip}
|
||||||
|
</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 class="b3-label">
|
||||||
${window.siyuan.languages.apiTimeout}
|
${window.siyuan.languages.apiTimeout}
|
||||||
<div class="fn__hr"></div>
|
<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}"/>
|
<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 class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="b3-label">
|
|
||||||
${window.siyuan.languages.apiModel}
|
|
||||||
<div class="b3-label__text">
|
|
||||||
${window.siyuan.languages.apiModelTip}
|
|
||||||
</div>
|
|
||||||
<div class="b3-label__text fn__flex config__item" style="padding: 4px 0 4px 4px;">
|
|
||||||
<select id="apiModel" class="b3-select">
|
|
||||||
<option value="gpt-4" ${window.siyuan.config.ai.openAI.apiModel === "gpt-4" ? "selected" : ""}>gpt-4</option>
|
|
||||||
<option value="gpt-4-32k" ${window.siyuan.config.ai.openAI.apiModel === "gpt-4-32k" ? "selected" : ""}>gpt-4-32k</option>
|
|
||||||
<option value="gpt-4-1106-preview" ${window.siyuan.config.ai.openAI.apiModel === "gpt-4-1106-preview" ? "selected" : ""}>gpt-4-1106-preview</option>
|
|
||||||
<option value="gpt-3.5-turbo" ${window.siyuan.config.ai.openAI.apiModel === "gpt-3.5-turbo" ? "selected" : ""}>gpt-3.5-turbo</option>
|
|
||||||
<option value="gpt-3.5-turbo-16k" ${window.siyuan.config.ai.openAI.apiModel === "gpt-3.5-turbo-16k" ? "selected" : ""}>gpt-3.5-turbo-16k</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>
|
|
||||||
</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>
|
||||||
<input class="b3-text-field fn__flex-center fn__block" type="number" step="1" min="0" id="apiMaxTokens" value="${window.siyuan.config.ai.openAI.apiMaxTokens}"/>
|
<input class="b3-text-field fn__flex-center fn__block" type="number" step="1" min="0" id="apiMaxTokens" value="${window.siyuan.config.ai.openAI.apiMaxTokens}"/>
|
||||||
<div class="b3-label__text">${window.siyuan.languages.apiMaxTokensTip}</div>
|
<div class="b3-label__text">${window.siyuan.languages.apiMaxTokensTip}</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="b3-label">
|
||||||
|
${window.siyuan.languages.apiModel}
|
||||||
|
<div class="fn__hr"></div>
|
||||||
|
<input class="b3-text-field fn__block" id="apiModel" value="${window.siyuan.config.ai.openAI.apiModel}"/>
|
||||||
|
<div class="b3-label__text">${window.siyuan.languages.apiModelTip}</div>
|
||||||
|
</div>
|
||||||
<div class="b3-label">
|
<div class="b3-label">
|
||||||
${window.siyuan.languages.apiKey}
|
${window.siyuan.languages.apiKey}
|
||||||
<div class="fn__hr"></div>
|
<div class="fn__hr"></div>
|
||||||
@ -50,9 +52,26 @@ export const ai = {
|
|||||||
<div class="fn__hr"></div>
|
<div class="fn__hr"></div>
|
||||||
<input class="b3-text-field fn__block" id="apiBaseURL" value="${window.siyuan.config.ai.openAI.apiBaseURL}"/>
|
<input class="b3-text-field fn__block" id="apiBaseURL" value="${window.siyuan.config.ai.openAI.apiBaseURL}"/>
|
||||||
<div class="b3-label__text">${window.siyuan.languages.apiBaseURLTip}</div>
|
<div class="b3-label__text">${window.siyuan.languages.apiBaseURLTip}</div>
|
||||||
|
</div>
|
||||||
|
<div class="b3-label">
|
||||||
|
User-Agent
|
||||||
|
<div class="fn__hr"></div>
|
||||||
|
<input class="b3-text-field fn__block" id="apiUserAgent" value="${window.siyuan.config.ai.openAI.apiUserAgent}"/>
|
||||||
|
<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">
|
||||||
|
${window.siyuan.languages.apiProvider}
|
||||||
|
<div class="b3-label__text">${window.siyuan.languages.apiProviderTip}</div>
|
||||||
|
</div>
|
||||||
|
<span class="fn__space"></span>
|
||||||
|
<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 class="fn__flex b3-label">
|
||||||
<div class="fn__flex-1">
|
<div class="fn__flex-1">
|
||||||
${window.siyuan.languages.apiTimeout}
|
${window.siyuan.languages.apiTimeout}
|
||||||
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
|
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
|
||||||
@ -60,21 +79,6 @@ export const ai = {
|
|||||||
<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}"/>
|
<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>
|
||||||
<div class="fn__flex b3-label config__item">
|
|
||||||
<div class="fn__flex-1">
|
|
||||||
${window.siyuan.languages.apiModel}
|
|
||||||
<div class="b3-label__text">${window.siyuan.languages.apiModelTip}</div>
|
|
||||||
</div>
|
|
||||||
<span class="fn__space"></span>
|
|
||||||
<select id="apiModel" class="b3-select fn__flex-center fn__size200">
|
|
||||||
<option value="gpt-4" ${window.siyuan.config.ai.openAI.apiModel === "gpt-4" ? "selected" : ""}>gpt-4</option>
|
|
||||||
<option value="gpt-4-32k" ${window.siyuan.config.ai.openAI.apiModel === "gpt-4-32k" ? "selected" : ""}>gpt-4-32k</option>
|
|
||||||
<option value="gpt-4-1106-preview" ${window.siyuan.config.ai.openAI.apiModel === "gpt-4-1106-preview" ? "selected" : ""}>gpt-4-1106-preview</option>
|
|
||||||
<option value="gpt-3.5-turbo" ${window.siyuan.config.ai.openAI.apiModel === "gpt-3.5-turbo" ? "selected" : ""}>gpt-3.5-turbo</option>
|
|
||||||
<option value="gpt-3.5-turbo-16k" ${window.siyuan.config.ai.openAI.apiModel === "gpt-3.5-turbo-16k" ? "selected" : ""}>gpt-3.5-turbo-16k</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>
|
|
||||||
</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}
|
||||||
@ -83,6 +87,14 @@ export const ai = {
|
|||||||
<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="0" id="apiMaxTokens" value="${window.siyuan.config.ai.openAI.apiMaxTokens}"/>
|
<input class="b3-text-field fn__flex-center fn__size200" type="number" step="1" min="0" id="apiMaxTokens" value="${window.siyuan.config.ai.openAI.apiMaxTokens}"/>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="fn__flex b3-label">
|
||||||
|
<div class="fn__block">
|
||||||
|
${window.siyuan.languages.apiModel}
|
||||||
|
<div class="b3-label__text">${window.siyuan.languages.apiModelTip}</div>
|
||||||
|
<div class="fn__hr"></div>
|
||||||
|
<input class="b3-text-field fn__block" id="apiModel" value="${window.siyuan.config.ai.openAI.apiModel}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="fn__flex b3-label">
|
<div class="fn__flex b3-label">
|
||||||
<div class="fn__block">
|
<div class="fn__block">
|
||||||
${window.siyuan.languages.apiKey}
|
${window.siyuan.languages.apiKey}
|
||||||
@ -106,6 +118,14 @@ export const ai = {
|
|||||||
<span class="fn__hr"></span>
|
<span class="fn__hr"></span>
|
||||||
<input class="b3-text-field fn__block" id="apiBaseURL" value="${window.siyuan.config.ai.openAI.apiBaseURL}"/>
|
<input class="b3-text-field fn__block" id="apiBaseURL" value="${window.siyuan.config.ai.openAI.apiBaseURL}"/>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="fn__flex b3-label">
|
||||||
|
<div class="fn__block">
|
||||||
|
User-Agent
|
||||||
|
<div class="b3-label__text">${window.siyuan.languages.apiUserAgentTip}</div>
|
||||||
|
<span class="fn__hr"></span>
|
||||||
|
<input class="b3-text-field fn__block" id="apiUserAgent" value="${window.siyuan.config.ai.openAI.apiUserAgent}"/>
|
||||||
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
/// #endif
|
/// #endif
|
||||||
return `<div class="fn__flex-column" style="height: 100%">
|
return `<div class="fn__flex-column" style="height: 100%">
|
||||||
@ -124,6 +144,7 @@ export const ai = {
|
|||||||
item.addEventListener("change", () => {
|
item.addEventListener("change", () => {
|
||||||
fetchPost("/api/setting/setAI", {
|
fetchPost("/api/setting/setAI", {
|
||||||
openAI: {
|
openAI: {
|
||||||
|
apiUserAgent: (ai.element.querySelector("#apiUserAgent") as HTMLInputElement).value,
|
||||||
apiBaseURL: (ai.element.querySelector("#apiBaseURL") as HTMLInputElement).value,
|
apiBaseURL: (ai.element.querySelector("#apiBaseURL") as HTMLInputElement).value,
|
||||||
apiKey: (ai.element.querySelector("#apiKey") as HTMLInputElement).value,
|
apiKey: (ai.element.querySelector("#apiKey") as HTMLInputElement).value,
|
||||||
apiModel: (ai.element.querySelector("#apiModel") as HTMLSelectElement).value,
|
apiModel: (ai.element.querySelector("#apiModel") as HTMLSelectElement).value,
|
||||||
|
2
app/src/types/index.d.ts
vendored
2
app/src/types/index.d.ts
vendored
@ -722,6 +722,8 @@ interface IConfig {
|
|||||||
}
|
}
|
||||||
ai: {
|
ai: {
|
||||||
openAI: {
|
openAI: {
|
||||||
|
apiProvider: string // OpenAI, Azure
|
||||||
|
apiUserAgent: string
|
||||||
apiBaseURL: string
|
apiBaseURL: string
|
||||||
apiKey: string
|
apiKey: string
|
||||||
apiModel: string
|
apiModel: string
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package conf
|
package conf
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/siyuan-note/siyuan/kernel/util"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
@ -34,13 +35,17 @@ type OpenAI struct {
|
|||||||
APIModel string `json:"apiModel"`
|
APIModel string `json:"apiModel"`
|
||||||
APIMaxTokens int `json:"apiMaxTokens"`
|
APIMaxTokens int `json:"apiMaxTokens"`
|
||||||
APIBaseURL string `json:"apiBaseURL"`
|
APIBaseURL string `json:"apiBaseURL"`
|
||||||
|
APIUserAgent string `json:"apiUserAgent"`
|
||||||
|
APIProvider string `json:"apiProvider"` // OpenAI, Azure
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAI() *AI {
|
func NewAI() *AI {
|
||||||
openAI := &OpenAI{
|
openAI := &OpenAI{
|
||||||
APITimeout: 30,
|
APITimeout: 30,
|
||||||
APIModel: openai.GPT3Dot5Turbo,
|
APIModel: openai.GPT3Dot5Turbo,
|
||||||
APIBaseURL: "https://api.openai.com/v1",
|
APIBaseURL: "https://api.openai.com/v1",
|
||||||
|
APIUserAgent: util.UserAgent,
|
||||||
|
APIProvider: "OpenAI",
|
||||||
}
|
}
|
||||||
|
|
||||||
openAI.APIKey = os.Getenv("SIYUAN_OPENAI_API_KEY")
|
openAI.APIKey = os.Getenv("SIYUAN_OPENAI_API_KEY")
|
||||||
@ -67,5 +72,8 @@ func NewAI() *AI {
|
|||||||
openAI.APIBaseURL = baseURL
|
openAI.APIBaseURL = baseURL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if userAgent := os.Getenv("SIYUAN_OPENAI_API_USER_AGENT"); "" != userAgent {
|
||||||
|
openAI.APIUserAgent = userAgent
|
||||||
|
}
|
||||||
return &AI{OpenAI: openAI}
|
return &AI{OpenAI: openAI}
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ func chatGPTContinueWrite(msg string, contextMsgs []string, cloud bool) (ret str
|
|||||||
if cloud {
|
if cloud {
|
||||||
gpt = &CloudGPT{}
|
gpt = &CloudGPT{}
|
||||||
} else {
|
} else {
|
||||||
gpt = &OpenAIGPT{c: util.NewOpenAIClient(Conf.AI.OpenAI.APIKey, Conf.AI.OpenAI.APIProxy, Conf.AI.OpenAI.APIBaseURL)}
|
gpt = &OpenAIGPT{c: util.NewOpenAIClient(Conf.AI.OpenAI.APIKey, Conf.AI.OpenAI.APIProxy, Conf.AI.OpenAI.APIBaseURL, Conf.AI.OpenAI.APIUserAgent)}
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
|
@ -405,15 +405,27 @@ func InitConf() {
|
|||||||
if "" == Conf.AI.OpenAI.APIModel {
|
if "" == Conf.AI.OpenAI.APIModel {
|
||||||
Conf.AI.OpenAI.APIModel = openai.GPT3Dot5Turbo
|
Conf.AI.OpenAI.APIModel = openai.GPT3Dot5Turbo
|
||||||
}
|
}
|
||||||
|
if "" == Conf.AI.OpenAI.APIUserAgent {
|
||||||
|
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"+
|
||||||
|
" userAgent=%s\n"+
|
||||||
" baseURL=%s\n"+
|
" baseURL=%s\n"+
|
||||||
" timeout=%ds\n"+
|
" timeout=%ds\n"+
|
||||||
" proxy=%s\n"+
|
" proxy=%s\n"+
|
||||||
" model=%s\n"+
|
" model=%s\n"+
|
||||||
" maxTokens=%d",
|
" maxTokens=%d",
|
||||||
Conf.AI.OpenAI.APIBaseURL, Conf.AI.OpenAI.APITimeout, Conf.AI.OpenAI.APIProxy, Conf.AI.OpenAI.APIModel, Conf.AI.OpenAI.APIMaxTokens)
|
Conf.AI.OpenAI.APIUserAgent,
|
||||||
|
Conf.AI.OpenAI.APIBaseURL,
|
||||||
|
Conf.AI.OpenAI.APITimeout,
|
||||||
|
Conf.AI.OpenAI.APIProxy,
|
||||||
|
Conf.AI.OpenAI.APIModel,
|
||||||
|
Conf.AI.OpenAI.APIMaxTokens)
|
||||||
}
|
}
|
||||||
|
|
||||||
Conf.ReadOnly = util.ReadOnly
|
Conf.ReadOnly = util.ReadOnly
|
||||||
|
@ -75,17 +75,32 @@ func ChatGPT(msg string, contextMsgs []string, c *openai.Client, model string, m
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewOpenAIClient(apiKey, apiProxy, apiBaseURL string) *openai.Client {
|
func NewOpenAIClient(apiKey, apiProxy, apiBaseURL, apiUserAgent string) *openai.Client {
|
||||||
config := openai.DefaultConfig(apiKey)
|
config := openai.DefaultConfig(apiKey)
|
||||||
|
transport := &http.Transport{}
|
||||||
if "" != apiProxy {
|
if "" != apiProxy {
|
||||||
proxyUrl, err := url.Parse(apiProxy)
|
proxyUrl, err := url.Parse(apiProxy)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
logging.LogErrorf("OpenAI API proxy failed: %v", err)
|
logging.LogErrorf("OpenAI API proxy failed: %v", err)
|
||||||
} else {
|
} else {
|
||||||
config.HTTPClient = &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
|
transport.Proxy = http.ProxyURL(proxyUrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
config.HTTPClient = &http.Client{Transport: newAddHeaderTransport(transport, apiUserAgent)}
|
||||||
config.BaseURL = apiBaseURL
|
config.BaseURL = apiBaseURL
|
||||||
return openai.NewClientWithConfig(config)
|
return openai.NewClientWithConfig(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AddHeaderTransport struct {
|
||||||
|
RoundTripper http.RoundTripper
|
||||||
|
UserAgent string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (adt *AddHeaderTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||||
|
req.Header.Add("User-Agent", adt.UserAgent)
|
||||||
|
return adt.RoundTripper.RoundTrip(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newAddHeaderTransport(transport *http.Transport, userAgent string) *AddHeaderTransport {
|
||||||
|
return &AddHeaderTransport{RoundTripper: transport, UserAgent: userAgent}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user