Files
GovAI/research-worker/llm_client.py
T
freedakgmail c949204662 feat(govai): 0617 优化首批 — 安全/私有化/深度研究/服务层/可观测性
借鉴 odysseus 的能力设计,全程净室实现、零 AGPL 代码、不引入 AGPL 依赖。

T1 提示注入防护: pkg/promptguard 包裹外部/知识库内容为不可信数据,buildMessages 移出 system 指令区。 T2 安全 CI: .github/workflows(ci+security: govulncheck/gitleaks/actionlint/hadolint/trivy)+dependabot+.hadolint.yaml;go.mod 加 toolchain go1.25.11 修复 20 个 stdlib CVE。 T3 管理员 2FA: 迁移 000016 + RFC6238 TOTP/备份码(pkg/auth, 零依赖) + 登录流程集成(后端)。 T4 本地模型: LLM/embedding 支持本地 vLLM/Ollama(OpenAI 兼容, 鉴权头条件发送, NoAuth) + docs/local-deploy.md。 T6 深度研究: 迁移 000017 + Python research-worker(净室多步流水线, 检索避开 SearXNG) + Go research 服务/handler/路由。 T7 service 层: 新增 internal/service/{research,twofa}, 2FA 业务逻辑从胖 handler 下沉, 接口注入可单测。 T10 缓存/可观测性: internal/cache(Redis+内存, 优雅降级) 接入 store 热点列表; Prometheus 指标+/metrics; docs/openapi.yaml。 验证: go build/vet/test ./... 全绿(8 包); research-worker 12 单测过; 真实 PG 应用迁移并烟测。
2026-06-17 17:52:47 +08:00

30 lines
904 B
Python

"""OpenAI 兼容 LLM 客户端(httpx)。支持云端与本地 vLLM/Ollama(密钥可空)。"""
import httpx
from config import config
_client = httpx.Client(timeout=300.0)
def chat(messages: list[dict], temperature: float = 0.4, max_tokens: int = 4096) -> str:
base_url, api_key, model = config.effective_llm()
headers = {"Content-Type": "application/json"}
if api_key: # 本地无鉴权端点不发送 Authorization
headers["Authorization"] = f"Bearer {api_key}"
resp = _client.post(
f"{base_url.rstrip('/')}/chat/completions",
headers=headers,
json={
"model": model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens,
"stream": False,
},
)
resp.raise_for_status()
data = resp.json()
return data["choices"][0]["message"]["content"]