meeting_summury/tests/run_real_model_stream.py

100 lines
3.5 KiB
Python

"""手动运行真实模型;按配置并发提取并生成最终会议纪要。
运行:
D:/miniconda3/envs/wavdownlode/python.exe tests/run_real_model_stream.py
"""
from __future__ import annotations
import os
import sys
from time import perf_counter
from pathlib import Path
PROJECT_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(PROJECT_ROOT / "src"))
from meeting_summary_lab.cli import load_local_env
from meeting_summary_lab.llm import OpenAICompatibleLLM
from meeting_summary_lab.pipeline import SummarizationPipeline, chunk_text, rough_token_count
load_local_env(PROJECT_ROOT / ".env")
# ===== 可直接修改的测试配置 =====
INPUT_PATH = PROJECT_ROOT / "examples" / "文件会议 07-13 11_30-Transcript.md"
OUTPUT_PATH = INPUT_PATH.with_name(f"{INPUT_PATH.stem}-summary.md")
INTERMEDIATE_DIRECTORY = INPUT_PATH.with_name(f"{INPUT_PATH.stem}-chunks")
MAX_CONCURRENT_CHUNKS = int(os.environ.get("MEETING_SUMMARY_MAX_CONCURRENT_CHUNKS", "1"))
CONTEXT_TOKENS = int(os.environ.get("MEETING_SUMMARY_CONTEXT_TOKENS", "10240"))
MAX_TOKENS = int(os.environ.get("MEETING_SUMMARY_MAX_TOKENS", "1024"))
TEMPERATURE = float(os.environ.get("MEETING_SUMMARY_TEMPERATURE", "1.0"))
REQUEST_TIMEOUT_SECONDS = 300
ENDPOINT = os.environ.get("MEETING_SUMMARY_ENDPOINT", "")
MODEL = os.environ.get("MEETING_SUMMARY_MODEL", "")
API_KEY = os.environ.get("MEETING_SUMMARY_API_KEY", os.environ.get("OPENAI_API_KEY", ""))
# ================================
def main() -> None:
started_at = perf_counter()
try:
if not INPUT_PATH.is_file():
raise FileNotFoundError(f"Input transcript not found: {INPUT_PATH}")
if not ENDPOINT or not MODEL:
raise ValueError("Set MEETING_SUMMARY_ENDPOINT and MEETING_SUMMARY_MODEL in .env")
transcript = INPUT_PATH.read_text(encoding="utf-8")
print(f"Input: {INPUT_PATH}")
print(f"Endpoint: {ENDPOINT}; model: {MODEL}")
estimated_tokens = rough_token_count(transcript)
chunk_threshold = max(1, CONTEXT_TOKENS - 300)
chunk_count = 1 if estimated_tokens < chunk_threshold else len(
chunk_text(transcript, max(1, chunk_threshold - 300), 100)
)
print(f"Characters: {len(transcript)}; estimated tokens: {estimated_tokens}")
print(f"Chunks: {chunk_count}; concurrent chunk requests: {MAX_CONCURRENT_CHUNKS}; temperature: {TEMPERATURE}")
print("Starting concurrent chunk extraction...")
llm = OpenAICompatibleLLM(
endpoint=ENDPOINT,
model=MODEL,
api_key=API_KEY,
timeout_seconds=REQUEST_TIMEOUT_SECONDS,
max_tokens=MAX_TOKENS,
temperature=TEMPERATURE,
stream=True,
)
def report_progress(message: str) -> None:
elapsed = perf_counter() - started_at
print(f"[{elapsed:7.1f}s] {message}", flush=True)
pipeline = SummarizationPipeline(
llm=llm,
context_tokens=CONTEXT_TOKENS,
max_concurrent_chunks=MAX_CONCURRENT_CHUNKS,
intermediate_directory=INTERMEDIATE_DIRECTORY,
final_markdown_path=OUTPUT_PATH,
progress_callback=report_progress,
)
result = pipeline.summarize(transcript)
print("\n--- completed ---")
print(f"Chunks: {result.chunk_count}; multilevel: {result.used_multilevel_strategy}")
print(f"Saved: {OUTPUT_PATH}")
finally:
elapsed = perf_counter() - started_at
print(f"Runtime: {elapsed:.2f}s")
if __name__ == "__main__":
main()