修复索引首次失败回滚、Vault 扫描边界、Markdown 代码围栏和 UTF-16 Citation 偏移。 收紧 Plugin 权限与 JSON Schema 校验,补齐 Note Move、Task、Attachment 和 Transcript Tool。 接入 OpenAI SSE 与 Ollama JSONL 真流式输出,修正 Provider PATCH 语义并限制运行时内存保留。 新增对应回归测试,后端测试增至 62 项。
41 lines
1.5 KiB
Python
41 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from collections import OrderedDict
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
from uuid import uuid4
|
|
|
|
from app.contracts import TranscriptionJob
|
|
from app.services.attachment_service import attachment_path
|
|
|
|
_jobs: OrderedDict[str, TranscriptionJob] = OrderedDict()
|
|
MAX_JOBS = 100
|
|
|
|
|
|
def create_transcription(attachment_id: str, language: str | None = None) -> TranscriptionJob:
|
|
del language # 预生成 transcript 暂不需要语言识别。
|
|
source = attachment_path(attachment_id)
|
|
transcript = source if source.suffix.lower() in {".txt", ".md"} else Path(f"{source}.txt")
|
|
job = TranscriptionJob(
|
|
job_id=f"transcription_{uuid4().hex}",
|
|
attachment_id=attachment_id,
|
|
status="completed" if transcript.is_file() else "failed",
|
|
text=transcript.read_text(encoding="utf-8") if transcript.is_file() else None,
|
|
error_code=None if transcript.is_file() else "TRANSCRIPTION_BACKEND_UNAVAILABLE",
|
|
error_message=(
|
|
None
|
|
if transcript.is_file()
|
|
else "No host-generated transcript is available; local speech models are phase two."
|
|
),
|
|
created_at=datetime.now(timezone.utc),
|
|
)
|
|
_jobs[job.job_id] = job
|
|
while len(_jobs) > MAX_JOBS:
|
|
_jobs.popitem(last=False)
|
|
return job.model_copy(deep=True)
|
|
|
|
|
|
def get_transcription(job_id: str) -> TranscriptionJob | None:
|
|
job = _jobs.get(job_id)
|
|
return job.model_copy(deep=True) if job else None
|