baseUrl = config('services.question_bank.base_url', env('QUESTION_BANK_API_BASE', 'http://localhost:5015')); $this->baseUrl = rtrim($this->baseUrl, '/'); } /** * 获取提示词列表 */ public function listPrompts(?string $type = null, ?string $active = null): array { try { $query = array_filter([ 'type' => $type, 'active' => $active, ], fn($value) => filled($value)); $response = Http::timeout(10) ->get($this->baseUrl . '/prompts', $query); if ($response->successful()) { return $response->json(); } Log::warning('获取提示词列表失败', [ 'status' => $response->status() ]); } catch (\Exception $e) { Log::error('获取提示词列表异常', [ 'error' => $e->getMessage() ]); } return []; } /** * 保存提示词 */ public function savePrompt(array $data): array { try { // 先尝试更新 $response = Http::timeout(10) ->put($this->baseUrl . '/prompts/default', $data); // 如果更新失败(可能不存在),则尝试创建 if (!isset($response->json()['success']) || !$response->json()['success']) { $response = Http::timeout(10) ->post($this->baseUrl . '/prompts', $data); } if ($response->successful()) { return $response->json(); } Log::warning('保存提示词失败', [ 'status' => $response->status() ]); } catch (\Exception $e) { Log::error('保存提示词异常', [ 'error' => $e->getMessage() ]); } return ['success' => false, 'message' => '保存失败']; } /** * 获取默认提示词模板 */ public function getDefaultPromptTemplate(): string { return '你是资深的中学数学命题专家,请为{knowledge_point}知识点生成高质量题目。 【核心要求】 1. 题目必须符合{grade_level}年级水平 2. 难度分布:基础({basic_ratio}%) + 中等({intermediate_ratio}%) + 拔高({advanced_ratio}%) 3. 题型分配:选择题({choice}道) + 填空题({fill}道) + 解答题({solution}道) 【技能覆盖】 {skill_coverage} 【图示处理】 - 如果原题涉及图形/示意图/坐标系/几何草图,必须在题干内内嵌一段完整的 标签来还原图形;不要使用外链图片、base64 或占位符。 - SVG 要包含明确的宽高(建议 260~360 像素),只使用基础图元(line、rect、circle、polygon、path、text),并给出必要的坐标、角点和标注文本。 - 确保题干文本描述与 SVG 一致,例如“如图所示”后紧跟 SVG,且 SVG 放在题干末尾即可被前端直接渲染。 【质量标准】 - 准确性:100%正确 - 多样性:避免重复 - 梯度性:难度递进合理 - 实用性:贴近实际应用 【输出格式】 { "total": {count}, "questions": [ { "id": "唯一标识", "stem": "题干", "answer": "标准答案", "solution": "详细解答", "difficulty": 难度值(0.3/0.6/0.85), "skill": "关联技能" } ] }'; } /** * 检查服务健康状态 */ public function checkHealth(): bool { try { $response = Http::timeout(5) ->get($this->baseUrl . '/health'); return $response->successful(); } catch (\Exception $e) { Log::error('提示词服务健康检查失败', [ 'error' => $e->getMessage() ]); return false; } } }