No bb , show code

- from flask import Flask, request, Response
- import json
- import requests
- from flask_cors import CORS
-
- app = Flask(__name__)
- CORS(app) # Enable CORS for all routes
-
- def get_access_token(ak, sk):
- auth_url = "https://aip.baidubce.com/oauth/2.0/token"
- resp = requests.get(auth_url, params={"grant_type": "client_credentials", "client_id": ak, 'client_secret': sk})
- return resp.json().get("access_token")
-
- def get_stream_response(prompt):
- ak = "你的AK"
- sk = "你的SK"
- source = "&sourceVer=0.0.1&source=app_center&appName=streamDemo"
- # ERNIE-Bot-turbo
- base_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant"
- # ERNIE-Bot 4.0
- # base_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
- # base_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/57wt8rb5b3kzhnrd"
- url = base_url + "?access_token=" + get_access_token(ak, sk) + source
- data = {
- "messages": [{"role": "user", "content": prompt}],
- "stream": True
- }
- payload = json.dumps(data)
- headers = {'Content-Type': 'application/json'}
- return requests.post(url, headers=headers, data=payload, stream=True)
-
- def gen_stream(prompt):
- response = get_stream_response(prompt)
- for chunk in response.iter_lines():
- chunk = chunk.decode("utf8")
- if chunk[:5] == "data:":
- chunk = chunk[5:]
- yield chunk
-
- @app.route('/eb_stream', methods=['POST'])
- def eb_stream():
- body = request.json
- prompt = body.get("prompt")
- return Response(gen_stream(prompt), mimetype='text/event-stream')
-
- if __name__ == '__main__':
- app.run(host='0.0.0.0', port=8000)
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Sampletitle>
- head>
- <body>
- <label for="textInput">Prompt:label>
- <input type="textarea" id="textInput" placeholder="您有什么问题">
- <button onclick="run_prompt()">执行promptbutton>
- <p><textarea id="answer" rows="10" cols="50" readonly>textarea>p>
- <script>
- current_text = document.getElementById('answer');
- text = "";
- char_index = 0
- function run_prompt() {
- var inputValue = document.getElementById('textInput').value;
- document.getElementById('answer').value = "";
- // 调用服务端的流式接口, 修改为自己的服务器地址和端口号
- fetch('http://127.0.0.1:8000/eb_stream', {
- method: 'post',
- headers: {'Content-Type': 'application/json'},
- body: JSON.stringify({'prompt': inputValue})
- })
- .then(response => {
- return response.body;
- })
- .then(body => {
- const reader = body.getReader();
- const decoder = new TextDecoder();
- function read() {
- return reader.read().then(({ done, value }) => {
- if (done) { // 读取完成
- return;
- }
- data = decoder.decode(value, { stream: true });
- text += JSON.parse(data).result;
- type(); // 打字机效果输出
- return read();
- });
- }
- return read();
- })
- .catch(error => {
- console.error('发生错误:', error);
- });
- }
-
- function type() {
- let enableCursor = true; // 启用光标效果
- if (char_index < text.length) {
- let txt = document.getElementById('answer').value;
- let cursor = enableCursor ? "|" : "";
- if (enableCursor && txt.endsWith("|")) {
- txt = txt.slice(0, -1);
- }
- document.getElementById('answer').value = txt + text.charAt(char_index) + cursor;
- char_index++;
- setTimeout(type, 1000/5); // 打字机速度控制, 每秒5个字
- }
- }
- script>
- body>
- html>