8%ArFnxfx|+{dRz+L+e5fdG)l$ytqBLUM+QsKD
z4{z<@=i4Bm=R33nHV1KUW7u~ysZ)*6A?WiO6?QfG9{)FiJsj0=05_Oc7=JH$i?7r$g24lZ2#KQN}^wPdtS1XAKWEzZ(GT
xSpb)x1m3TK^=lv$p^*^yjZm}pgst)cGd>kM;uawk;jcX4qVQ*~xRArd-9Ms>F9-kt
delta 2323
zcma)7TWph696#r~_1>=ct?kye+gRJdHg1A$unqA-a111Bs0fmrQuonr@v9?5
zeLx;u4sT*2H#ON3gY&@`jV5Sa=a>ig}ZR`%pW-H!Q(TE_d3S!
z(i^_4&}*e@{Ywrf&r5Z)Xfz%0A5#6?XmVmDHa);~Vm~hshk+T-3&crW)9xv0d9^GU
zf*RtUCMTW-P}KTrQITpeM<~`P8lu{0dT|MAQ>Fyk9gGOXOJ5DO%c2eGar$*QHerao
zd1Wb&i0>jU%Z9uYy#o1_6+&9MECBk)Q6mLqn&kkD0lUz5s;pD|&biY4-iuMO03TERNq`lGD
zF#`^}VJGd=DSpgh*FKJ>KF=kS8;*PM&H6H=1LkcfYvBUbRM~>`rs{6`V=zqnBXW;L
zU(4atE-smzG#D0s7$6xlM1(}?sYr0x@}^}!B4Qc%NvtRN&Q_#tEk6o7_AqRHJ;wo$
zl_!iv+gKCrBpMeFppzJidYbz~+&+kV-)QhI*6Il;z$|t*-(qsI=H7%3td#X0TykFE
zLqaBMN_`M=8jvSeo?eXZfmR*?-BSbof|)Fr$U5Gk+WGvqhwzOV$0Y&2AFZsJ4G(N)
zx^wI>{VATLbFoYGV%WAfDlRs6?+uAJ>M+PRLNd^Ff?i2=dk;Z@6-!|>
zpC2B{SA@|Ly`B1EqGHL7oEX+dM>KX_wU-!qnUOpruQ9@!Uy-%ZF+HcTyQr~_YV3W`
zx*5p;saSi9qhzd*+pfI>D!Zm7E702_#`umTV(G3G;l3Zx_9fJC3ps8f_bp^wLUco>
YogT`38a{||4*w}4VIRIDRFx|DzqRp^R{#J2
diff --git a/src/flask_prompt_master/routes/__pycache__/expert_generate_3.cpython-312.pyc b/src/flask_prompt_master/routes/__pycache__/expert_generate_3.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..facd71bbdb0f53e5eb7b883c874a6097c3e411f9
GIT binary patch
literal 11032
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
literal 0
HcmV?d00001
diff --git a/src/flask_prompt_master/routes/expert_generate_2.py b/src/flask_prompt_master/routes/expert_generate_2.py
index 3543b01..3e22282 100644
--- a/src/flask_prompt_master/routes/expert_generate_2.py
+++ b/src/flask_prompt_master/routes/expert_generate_2.py
@@ -5,15 +5,18 @@
"""
from flask import Blueprint, render_template, request, jsonify
from openai import OpenAI
+import hashlib
import json
import logging
import os
+import time
from src.flask_prompt_master import db
from src.flask_prompt_master.models.models import User, Prompt
from src.flask_prompt_master.models.history_models import PromptHistory, UserStatistics
logger = logging.getLogger(__name__)
expert_generate_2_bp = Blueprint('expert_generate_2', __name__)
+_dedup_cache = {}
client = OpenAI(
api_key=os.environ.get('LLM_API_KEY') or 'sk-fdf7cc1c73504e628ec0119b7e11b8cc',
@@ -154,6 +157,15 @@ def expert_generate_2_api():
if not user_input:
return jsonify({'code': 400, 'message': '请输入您的需求', 'data': None})
+ uid = _get_user_id()
+ req_key = (uid, hashlib.md5(user_input.encode()).hexdigest())
+ now_ts = time.time()
+ if req_key in _dedup_cache and (now_ts - _dedup_cache[req_key]) < 8:
+ return jsonify({'code': 429, 'message': '请勿重复提交,请稍后再试', 'data': None})
+ _dedup_cache[req_key] = now_ts
+ if len(_dedup_cache) > 500:
+ _dedup_cache.clear()
+
# 第一阶段:意图分析
intent_response = client.chat.completions.create(
model="deepseek-chat",
@@ -206,7 +218,7 @@ def expert_generate_2_api():
if not generated_prompt:
return jsonify({'code': 500, 'message': '生成失败,请重试', 'data': None})
- user_id = _get_user_id()
+ user_id = uid
try:
p = Prompt(input_text=user_input, generated_text=generated_prompt, user_id=user_id)
db.session.add(p)
diff --git a/src/flask_prompt_master/routes/expert_generate_3.py b/src/flask_prompt_master/routes/expert_generate_3.py
index cf5b662..1079400 100644
--- a/src/flask_prompt_master/routes/expert_generate_3.py
+++ b/src/flask_prompt_master/routes/expert_generate_3.py
@@ -6,15 +6,18 @@
"""
from flask import Blueprint, render_template, request, jsonify
from openai import OpenAI
+import hashlib
import json
import logging
import os
+import time
from src.flask_prompt_master import db
from src.flask_prompt_master.models.models import User, Prompt
from src.flask_prompt_master.models.history_models import PromptHistory, UserStatistics
logger = logging.getLogger(__name__)
expert_generate_3_bp = Blueprint('expert_generate_3', __name__)
+_dedup_cache = {}
_llm_client = OpenAI(
api_key=os.environ.get('LLM_API_KEY') or 'sk-fdf7cc1c73504e628ec0119b7e11b8cc',
@@ -153,6 +156,26 @@ def expert_generate_3_api():
raw_input = (payload.get('input_text') or '').strip()
if not raw_input:
return jsonify({'code': 400, 'message': '请输入您的需求', 'data': None})
+
+ temperature = payload.get('temperature')
+ temperature = float(temperature) if temperature is not None else 0.7
+ temperature = max(0.0, min(2.0, temperature))
+ max_tokens = payload.get('max_tokens')
+ max_tokens = int(max_tokens) if max_tokens is not None else 1000
+ max_tokens = max(100, min(4000, max_tokens))
+ timeout = payload.get('timeout')
+ timeout = int(timeout) if timeout is not None else 60
+ timeout = max(10, min(300, timeout))
+
+ uid = _resolve_user_id()
+ req_key = (uid, hashlib.md5(raw_input.encode()).hexdigest())
+ now_ts = time.time()
+ if req_key in _dedup_cache and (now_ts - _dedup_cache[req_key]) < 8:
+ return jsonify({'code': 429, 'message': '请勿重复提交,请稍后再试', 'data': None})
+ _dedup_cache[req_key] = now_ts
+ if len(_dedup_cache) > 500:
+ _dedup_cache.clear()
+
resp1 = _llm_client.chat.completions.create(
model="deepseek-chat",
messages=[
@@ -160,7 +183,7 @@ def expert_generate_3_api():
{"role": "user", "content": raw_input}
],
temperature=0.1,
- timeout=60
+ timeout=timeout
)
intent_raw = (resp1.choices[0].message.content or "").strip()
intent_raw = intent_raw.replace('```json', '').replace('```', '').strip()
@@ -189,14 +212,13 @@ def expert_generate_3_api():
{"role": "system", "content": tpl.format(analysis=analysis_str)},
{"role": "user", "content": raw_input}
],
- temperature=0.7,
- max_tokens=1000,
- timeout=60
+ temperature=temperature,
+ max_tokens=max_tokens,
+ timeout=timeout
)
result_prompt = (resp2.choices[0].message.content or "").strip()
if not result_prompt:
return jsonify({'code': 500, 'message': '生成失败,请重试', 'data': None})
- uid = _resolve_user_id()
try:
db.session.add(Prompt(input_text=raw_input, generated_text=result_prompt, user_id=uid))
db.session.commit()
diff --git a/src/flask_prompt_master/templates/expert_generate_2.html b/src/flask_prompt_master/templates/expert_generate_2.html
index 3e2ea75..f3fdea1 100644
--- a/src/flask_prompt_master/templates/expert_generate_2.html
+++ b/src/flask_prompt_master/templates/expert_generate_2.html
@@ -80,13 +80,16 @@