chatgpt调整
This commit is contained in:
parent
c1232b59db
commit
90d887519d
@ -42,7 +42,6 @@ import SponsorModal from './modals/SponsorModal';
|
|||||||
import CommitMessageModal from './modals/CommitMessageModal';
|
import CommitMessageModal from './modals/CommitMessageModal';
|
||||||
import WorkspaceImgPathModal from './modals/WorkspaceImgPathModal';
|
import WorkspaceImgPathModal from './modals/WorkspaceImgPathModal';
|
||||||
import ChatGptModal from './modals/ChatGptModal';
|
import ChatGptModal from './modals/ChatGptModal';
|
||||||
import ChatGptConfigModal from './modals/ChatGptConfigModal';
|
|
||||||
|
|
||||||
// Providers
|
// Providers
|
||||||
import GooglePhotoModal from './modals/providers/GooglePhotoModal';
|
import GooglePhotoModal from './modals/providers/GooglePhotoModal';
|
||||||
@ -114,7 +113,6 @@ export default {
|
|||||||
CommitMessageModal,
|
CommitMessageModal,
|
||||||
WorkspaceImgPathModal,
|
WorkspaceImgPathModal,
|
||||||
ChatGptModal,
|
ChatGptModal,
|
||||||
ChatGptConfigModal,
|
|
||||||
// Providers
|
// Providers
|
||||||
GooglePhotoModal,
|
GooglePhotoModal,
|
||||||
GoogleDriveAccountModal,
|
GoogleDriveAccountModal,
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
<template>
|
|
||||||
<modal-inner aria-label="ChatGPT配置">
|
|
||||||
<div class="modal__content">
|
|
||||||
<div class="modal__image">
|
|
||||||
<icon-chat-gpt></icon-chat-gpt>
|
|
||||||
</div>
|
|
||||||
<p> <b>ChatGPT</b> 配置<br>官方的接口地址在国内可能无法正常访问,可以自行找代理地址</p>
|
|
||||||
<form-entry label="代理地址" error="proxyHost">
|
|
||||||
<input slot="field" class="textfield" type="text" v-model.trim="proxyHost" @keydown.enter="resolve()">
|
|
||||||
<div class="form-entry__info">
|
|
||||||
<b>非必填,默认是官方接口地址(https://api.openai.com),代理地址如:</b> https://openai.geekr.cool
|
|
||||||
</div>
|
|
||||||
</form-entry>
|
|
||||||
<form-entry label="apiKey" error="apiKey">
|
|
||||||
<input slot="field" class="textfield" type="text" v-model.trim="apiKey" @keydown.enter="resolve()">
|
|
||||||
<div class="form-entry__info">
|
|
||||||
<b>apiKey</b> 请到 <a href="https://platform.openai.com/account/api-keys" target="_blank">https://platform.openai.com/account/api-keys</a> 获取<br>
|
|
||||||
</div>
|
|
||||||
</form-entry>
|
|
||||||
<form-entry label="采样温度" error="temperature">
|
|
||||||
<input slot="field" class="textfield" type="number" v-model.trim="temperature" @keydown.enter="resolve()">
|
|
||||||
<div class="form-entry__info">
|
|
||||||
<b>采样温度</b>,介于 0 和 2 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定。<br>
|
|
||||||
</div>
|
|
||||||
</form-entry>
|
|
||||||
</div>
|
|
||||||
<div class="modal__button-bar">
|
|
||||||
<button class="button" @click="config.reject()">取消</button>
|
|
||||||
<button class="button button--resolve" @click="resolve()">确认</button>
|
|
||||||
</div>
|
|
||||||
</modal-inner>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import modalTemplate from './common/modalTemplate';
|
|
||||||
|
|
||||||
export default modalTemplate({
|
|
||||||
data: () => ({
|
|
||||||
apiKey: null,
|
|
||||||
proxyHost: null,
|
|
||||||
temperature: 1,
|
|
||||||
}),
|
|
||||||
methods: {
|
|
||||||
resolve() {
|
|
||||||
if (!this.apiKey) {
|
|
||||||
this.setError('apiKey');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.temperature < 0 || this.temperature > 2) {
|
|
||||||
this.setError('temperature');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.proxyHost && this.proxyHost.endsWith('/')) {
|
|
||||||
this.proxyHost = this.proxyHost.substring(0, this.proxyHost.length - 1);
|
|
||||||
}
|
|
||||||
this.config.resolve({
|
|
||||||
apiKey: this.apiKey,
|
|
||||||
proxyHost: this.proxyHost,
|
|
||||||
temperature: parseFloat(this.temperature),
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.apiKey = this.config.apiKey;
|
|
||||||
this.proxyHost = this.config.proxyHost;
|
|
||||||
this.temperature = this.config.temperature || this.temperature;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -6,17 +6,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<p><b>ChatGPT内容生成</b><br>生成时长受ChatGPT服务响应与网络响应时长影响,时间可能较长</p>
|
<p><b>ChatGPT内容生成</b><br>生成时长受ChatGPT服务响应与网络响应时长影响,时间可能较长</p>
|
||||||
<form-entry label="生成内容要求详细描述" error="content">
|
<form-entry label="生成内容要求详细描述" error="content">
|
||||||
<textarea slot="field" class="text-input" type="text" placeholder="输入内容(支持换行)" v-model.trim="content" :disabled="generating || !chatGptConfig.apiKey"></textarea>
|
<textarea slot="field" class="text-input" type="text" placeholder="输入内容(支持换行)" v-model.trim="content" :disabled="generating"></textarea>
|
||||||
<div class="form-entry__info">
|
<div class="form-entry__info">
|
||||||
<span v-if="!chatGptConfig.apiKey" class="config-warning">
|
使用 <a href="https://chat.forefront.ai" target="_blank">https://chat.forefront.ai</a> 的免费接口生成内容,AI模型是:GPT-3.5 Turbo。
|
||||||
未配置apiKey,请点击 <a href="javascript:void(0)" @click="openConfig">配置</a> apiKey。
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
<span v-if="chatGptConfig.proxyHost">
|
|
||||||
<b>当前使用的接口代理:</b>{{ chatGptConfig.proxyHost }}
|
|
||||||
</span>
|
|
||||||
<a href="javascript:void(0)" @click="openConfig">修改apiKey配置</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</form-entry>
|
</form-entry>
|
||||||
<div class="modal__result">
|
<div class="modal__result">
|
||||||
@ -33,7 +25,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex';
|
|
||||||
import modalTemplate from './common/modalTemplate';
|
import modalTemplate from './common/modalTemplate';
|
||||||
import chatGptSvc from '../../services/chatGptSvc';
|
import chatGptSvc from '../../services/chatGptSvc';
|
||||||
import store from '../../store';
|
import store from '../../store';
|
||||||
@ -45,14 +36,9 @@ export default modalTemplate({
|
|||||||
result: '',
|
result: '',
|
||||||
xhr: null,
|
xhr: null,
|
||||||
}),
|
}),
|
||||||
computed: {
|
|
||||||
...mapGetters('chatgpt', [
|
|
||||||
'chatGptConfig',
|
|
||||||
]),
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
resolve(evt) {
|
resolve(evt) {
|
||||||
evt.preventDefault(); // Fixes https://github.com/mafgwo/stackedit/issues/1503
|
evt.preventDefault();
|
||||||
const { callback } = this.config;
|
const { callback } = this.config;
|
||||||
this.config.resolve();
|
this.config.resolve();
|
||||||
callback(this.result);
|
callback(this.result);
|
||||||
@ -74,27 +60,13 @@ export default modalTemplate({
|
|||||||
this.result = '';
|
this.result = '';
|
||||||
try {
|
try {
|
||||||
this.xhr = chatGptSvc.chat({
|
this.xhr = chatGptSvc.chat({
|
||||||
proxyHost: this.chatGptConfig.proxyHost,
|
|
||||||
apiKey: this.chatGptConfig.apiKey,
|
|
||||||
content: `${this.content}\n(使用Markdown方式输出结果)`,
|
content: `${this.content}\n(使用Markdown方式输出结果)`,
|
||||||
temperature: this.chatGptConfig.temperature || 1,
|
|
||||||
}, this.process);
|
}, this.process);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.generating = false;
|
this.generating = false;
|
||||||
store.dispatch('notification/error', err);
|
store.dispatch('notification/error', err);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async openConfig() {
|
|
||||||
try {
|
|
||||||
const config = await store.dispatch('modal/open', {
|
|
||||||
type: 'chatGptConfig',
|
|
||||||
apiKey: this.chatGptConfig.apiKey,
|
|
||||||
proxyHost: this.chatGptConfig.proxyHost,
|
|
||||||
temperature: this.chatGptConfig.temperature,
|
|
||||||
});
|
|
||||||
store.dispatch('chatgpt/setCurrConfig', config);
|
|
||||||
} catch (e) { /* Cancel */ }
|
|
||||||
},
|
|
||||||
reject() {
|
reject() {
|
||||||
if (this.generating) {
|
if (this.generating) {
|
||||||
if (this.xhr) {
|
if (this.xhr) {
|
||||||
|
@ -2,21 +2,24 @@ import store from '../store';
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
chat({
|
chat({
|
||||||
proxyHost,
|
|
||||||
apiKey,
|
|
||||||
content,
|
content,
|
||||||
temperature,
|
|
||||||
}, callback) {
|
}, callback) {
|
||||||
const xhr = new XMLHttpRequest();
|
const xhr = new XMLHttpRequest();
|
||||||
const url = `${proxyHost || 'https://api.openai.com'}/v1/chat/completions`;
|
const url = 'https://streaming.tenant-forefront-default.knative.chi.coreweave.com/free-chat';
|
||||||
xhr.open('POST', url);
|
xhr.open('POST', url);
|
||||||
xhr.setRequestHeader('Authorization', `Bearer ${apiKey}`);
|
xhr.setRequestHeader('Authorization', 'Bearer null');
|
||||||
xhr.setRequestHeader('Content-Type', 'application/json');
|
xhr.setRequestHeader('Content-Type', 'application/json');
|
||||||
xhr.send(JSON.stringify({
|
xhr.send(JSON.stringify({
|
||||||
model: 'gpt-3.5-turbo',
|
model: 'gpt-3.5-turbo',
|
||||||
messages: [{ role: 'user', content }],
|
action: 'noauth',
|
||||||
temperature: temperature || 1,
|
text: content,
|
||||||
stream: true,
|
messagePersona: '607e41fe-95be-497e-8e97-010a59b2e2c0',
|
||||||
|
messages: [],
|
||||||
|
internetMode: 'auto',
|
||||||
|
hidden: false,
|
||||||
|
id: '',
|
||||||
|
parentId: '',
|
||||||
|
workspaceId: '',
|
||||||
}));
|
}));
|
||||||
let lastRespLen = 0;
|
let lastRespLen = 0;
|
||||||
xhr.onprogress = () => {
|
xhr.onprogress = () => {
|
||||||
@ -25,12 +28,17 @@ export default {
|
|||||||
responseText.split('\n\n')
|
responseText.split('\n\n')
|
||||||
.filter(l => l.length > 0)
|
.filter(l => l.length > 0)
|
||||||
.forEach((text) => {
|
.forEach((text) => {
|
||||||
const item = text.substr(6);
|
if (text === 'event: end') {
|
||||||
if (item === '[DONE]') {
|
|
||||||
callback({ done: true });
|
callback({ done: true });
|
||||||
} else {
|
} else if (text.startsWith('event: message')) {
|
||||||
|
const item = text.split('\n')[1].substr(6);
|
||||||
const data = JSON.parse(item);
|
const data = JSON.parse(item);
|
||||||
callback({ content: data.choices[0].delta.content });
|
if (data.error) {
|
||||||
|
store.dispatch('notification/error', `ChatGPT接口报错,错误信息:${data.error.message}`);
|
||||||
|
callback({ error: 'ChatGPT接口请求异常!' });
|
||||||
|
} else {
|
||||||
|
callback({ content: data.delta });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
const chatgptConfigKey = 'chatgpt/config';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
namespaced: true,
|
|
||||||
state: {
|
|
||||||
config: {
|
|
||||||
apiKey: null,
|
|
||||||
proxyHost: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
mutations: {
|
|
||||||
setCurrConfig: (state, value) => {
|
|
||||||
state.config = value;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
getters: {
|
|
||||||
chatGptConfig: state => state.config,
|
|
||||||
},
|
|
||||||
actions: {
|
|
||||||
setCurrConfig({ commit }, value) {
|
|
||||||
commit('setCurrConfig', value);
|
|
||||||
localStorage.setItem(chatgptConfigKey, JSON.stringify(value));
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
@ -20,7 +20,6 @@ import userInfo from './userInfo';
|
|||||||
import workspace from './workspace';
|
import workspace from './workspace';
|
||||||
import img from './img';
|
import img from './img';
|
||||||
import theme from './theme';
|
import theme from './theme';
|
||||||
import chatgpt from './chatgpt';
|
|
||||||
import locationTemplate from './locationTemplate';
|
import locationTemplate from './locationTemplate';
|
||||||
import emptyPublishLocation from '../data/empties/emptyPublishLocation';
|
import emptyPublishLocation from '../data/empties/emptyPublishLocation';
|
||||||
import emptySyncLocation from '../data/empties/emptySyncLocation';
|
import emptySyncLocation from '../data/empties/emptySyncLocation';
|
||||||
@ -52,7 +51,6 @@ const store = new Vuex.Store({
|
|||||||
workspace,
|
workspace,
|
||||||
img,
|
img,
|
||||||
theme,
|
theme,
|
||||||
chatgpt,
|
|
||||||
},
|
},
|
||||||
state: {
|
state: {
|
||||||
light: false,
|
light: false,
|
||||||
|
Loading…
Reference in New Issue
Block a user