(question: str, response_language: str = "zh")
| 4424 | "title": citation.get("title") or citation.get("node_id") or "未命名来源", |
| 4425 | "meta": " · ".join(meta_parts) if meta_parts else "参考文献", |
| 4426 | "snippet": citation.get("excerpt") or "", |
| 4427 | "excerpt": citation.get("excerpt") or "", |
| 4428 | "source_type": source_type, |
| 4429 | "source_id": source_id, |
| 4430 | "anchor": citation.get("anchor"), |
| 4431 | "metadata": metadata, |
| 4432 | "url": metadata.get("url") or metadata.get("abs_url") or metadata.get("pdf_url") or "", |
| 4433 | } |
| 4434 | |
| 4435 | |
| 4436 | def _direct_answer(question: str, response_language: str = "zh") -> Dict[str, Any]: |
| 4437 | started = time.time() |
| 4438 | language = _normalize_response_language(response_language) |
| 4439 | llm = build_llm_provider() |
| 4440 | llm_error = None |
| 4441 | response = None |
| 4442 | if getattr(llm, "name", "") == "mock": |
| 4443 | text = ( |
| 4444 | "This question does not require the local Wiki. No usable LLM is configured, " |
| 4445 | "so the offline desktop app cannot generate a general answer right now. " |
| 4446 | "Use @ to select papers or switch to a Wiki scope for local-paper answers." |
| 4447 | if language == "en" |
| 4448 | else "这个问题不需要调用本地 Wiki。当前未配置可用 LLM,因此离线版无法生成通用回答;如需基于本地论文回答,请用 @ 选择论文或切换到 Wiki 范围。" |
| 4449 | ) |
| 4450 | else: |
| 4451 | try: |
| 4452 | response = llm.generate( |
| 4453 | question, |
| 4454 | system=_direct_answer_prompt(language), |
| 4455 | temperature=0.0, |
| 4456 | max_tokens=_direct_answer_max_tokens(), |
| 4457 | ) |
| 4458 | text = response.text |
| 4459 | except Exception as exc: |
| 4460 | llm_error = str(exc) |
| 4461 | text = ( |
| 4462 | f"This was routed as a general question and does not need local Wiki citations, " |
| 4463 | f"but the current LLM call failed: {llm_error}" |
| 4464 | if language == "en" |
| 4465 | else f"这个问题被判定为通用问题,不需要引用本地 Wiki;但当前 LLM 调用失败:{llm_error}" |
| 4466 | ) |
| 4467 | return { |
| 4468 | "text": text, |
| 4469 | "citations": [], |
| 4470 | "sources": [], |
| 4471 | "elapsed_ms": int((time.time() - started) * 1000), |
| 4472 | "response_language": language, |
| 4473 | "token_usage": { |
no test coverage detected