"""手动运行真实模型;按配置并发提取并生成最终会议纪要。 运行: 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()