100 lines
3.5 KiB
Python
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()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|