generated from john/python-template
V3 post step 2 refinement: add temperature & top-p settings to config (and .env), add prompt fields back to job table so that the prompt settings get frozen at runtime for all sources being processed.
This commit is contained in:
@@ -73,10 +73,13 @@ class TestPipelineSuccessFlow:
|
||||
image_path,
|
||||
*,
|
||||
prompt_name="transcribe_document.md",
|
||||
prompt_text=None,
|
||||
temperature=None,
|
||||
top_p=None,
|
||||
settings=None,
|
||||
provider=None,
|
||||
) -> TranscriptionResult:
|
||||
_ = (image_path, prompt_name, settings, provider)
|
||||
_ = (image_path, prompt_name, prompt_text, temperature, top_p, settings, provider)
|
||||
return TranscriptionResult(
|
||||
text="Pipeline transcript",
|
||||
provider="openrouter",
|
||||
@@ -102,10 +105,10 @@ class TestPipelineSuccessFlow:
|
||||
assert job is not None
|
||||
assert job.status == JobStatus.TRANSCRIBED
|
||||
assert any(job_source.raw_transcription == "Pipeline transcript" for job_source in job.job_sources)
|
||||
assert any(job_source.prompt_name == "transcribe_document.md" for job_source in job.job_sources)
|
||||
assert any(job_source.user_prompt is not None for job_source in job.job_sources)
|
||||
assert any(job_source.temperature == 0.2 for job_source in job.job_sources)
|
||||
assert any(job_source.top_p == 0.85 for job_source in job.job_sources)
|
||||
assert job.prompt_name == "transcribe_document.md"
|
||||
assert job.user_prompt is not None
|
||||
assert job.temperature == 0.2
|
||||
assert job.top_p == 0.85
|
||||
assert any(job_source.ai_metadata == {"finish_reason": "stop", "usage": {"total_tokens": 42}} for job_source in job.job_sources)
|
||||
assert any(
|
||||
job_source.raw_api_response == {"id": "resp_123", "choices": [{"message": {"content": "Pipeline transcript"}}]}
|
||||
@@ -142,11 +145,14 @@ class TestPipelineSuccessFlow:
|
||||
image_path,
|
||||
*,
|
||||
prompt_name="transcribe_document.md",
|
||||
prompt_text=None,
|
||||
temperature=None,
|
||||
top_p=None,
|
||||
settings=None,
|
||||
provider=None,
|
||||
) -> TranscriptionResult:
|
||||
page_name = Path(image_path).name
|
||||
_ = (prompt_name, settings, provider)
|
||||
_ = (prompt_name, prompt_text, temperature, top_p, settings, provider)
|
||||
return TranscriptionResult(
|
||||
text=f"Transcript for {page_name}",
|
||||
provider="openrouter",
|
||||
@@ -171,6 +177,7 @@ class TestPipelineSuccessFlow:
|
||||
assert all(job_source.status == JobSourceStatus.TRANSCRIBED for job_source in job.job_sources)
|
||||
assert all(job_source.raw_transcription for job_source in job.job_sources)
|
||||
assert all(job_source.source is not None and job_source.source.raw_transcription for job_source in job.job_sources)
|
||||
assert job.prompt_name == "transcribe_document.md"
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_worker_marks_partial_success_when_some_sources_fail(
|
||||
@@ -202,12 +209,15 @@ class TestPipelineSuccessFlow:
|
||||
image_path,
|
||||
*,
|
||||
prompt_name="transcribe_document.md",
|
||||
prompt_text=None,
|
||||
temperature=None,
|
||||
top_p=None,
|
||||
settings=None,
|
||||
provider=None,
|
||||
) -> TranscriptionResult:
|
||||
nonlocal call_count
|
||||
call_count += 1
|
||||
_ = (prompt_name, settings, provider)
|
||||
_ = (image_path, prompt_name, prompt_text, temperature, top_p, settings, provider)
|
||||
if call_count == 2:
|
||||
raise RuntimeError("simulated page failure")
|
||||
return TranscriptionResult(
|
||||
@@ -279,11 +289,14 @@ class TestPipelineSuccessFlow:
|
||||
image_path,
|
||||
*,
|
||||
prompt_name="transcribe_document.md",
|
||||
prompt_text=None,
|
||||
temperature=None,
|
||||
top_p=None,
|
||||
settings=None,
|
||||
provider=None,
|
||||
) -> TranscriptionResult:
|
||||
nonlocal call_count
|
||||
_ = (image_path, prompt_name, settings, provider)
|
||||
_ = (image_path, prompt_name, prompt_text, temperature, top_p, settings, provider)
|
||||
call_count += 1
|
||||
return TranscriptionResult(
|
||||
text="new transcript",
|
||||
@@ -332,10 +345,13 @@ class TestPipelineFailureFlow:
|
||||
image_path,
|
||||
*,
|
||||
prompt_name="transcribe_document.md",
|
||||
prompt_text=None,
|
||||
temperature=None,
|
||||
top_p=None,
|
||||
settings=None,
|
||||
provider=None,
|
||||
) -> TranscriptionResult:
|
||||
_ = (image_path, prompt_name, settings, provider)
|
||||
_ = (image_path, prompt_name, prompt_text, temperature, top_p, settings, provider)
|
||||
raise RuntimeError("pipeline provider failure")
|
||||
|
||||
monkeypatch.setattr(
|
||||
|
||||
@@ -56,6 +56,8 @@ async def test_create_job_for_document_sorts_uploads_and_creates_links(async_ses
|
||||
assert created_job is not None
|
||||
assert created_job.provider == "openrouter"
|
||||
assert created_job.model == "test-model"
|
||||
assert created_job.prompt_name == "transcribe_document.md"
|
||||
assert created_job.user_prompt is not None
|
||||
|
||||
sources = (
|
||||
await async_session.exec(
|
||||
@@ -78,7 +80,6 @@ async def test_create_job_for_document_sorts_uploads_and_creates_links(async_ses
|
||||
job_sources = (await async_session.exec(select(JobSource).where(JobSource.job_id == result.job_id))).all()
|
||||
assert len(job_sources) == 2
|
||||
assert set(result.source_ids) == {job_source.source_id for job_source in job_sources}
|
||||
assert {job_source.prompt_name for job_source in job_sources} == {None}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@@ -110,6 +111,10 @@ async def test_create_upload_job_stores_source_under_document_id_directory(async
|
||||
assert source.file_hash == "2c8648d103e3dd7ad87660da0f126a1443b6d21ac1bd3ec000c5e24e2373a90c"
|
||||
assert source.file_size_bytes == len(b"image-bytes")
|
||||
|
||||
created_job = await async_session.get(Job, result.job_id)
|
||||
assert created_job is not None
|
||||
assert created_job.prompt_name == "transcribe_document.md"
|
||||
|
||||
|
||||
def test_store_person_portrait_stores_file_under_person_id_directory(tmp_path):
|
||||
settings = Settings(openrouter_api_key="test-key", upload_dir=tmp_path)
|
||||
|
||||
@@ -255,12 +255,10 @@ async def test_update_job_source_transcription_persists_provider_json_payloads(d
|
||||
raw_api_response=raw_payload,
|
||||
provider="openrouter",
|
||||
model="test-model",
|
||||
prompt_name="transcribe_document.md",
|
||||
)
|
||||
|
||||
stored_rows = await transcriptions.list_job_sources(job_id=job.id)
|
||||
assert len(stored_rows) == 1
|
||||
assert stored_rows[0].raw_transcription == "provider transcript"
|
||||
assert stored_rows[0].prompt_name == "transcribe_document.md"
|
||||
assert stored_rows[0].ai_metadata == metadata
|
||||
assert stored_rows[0].raw_api_response == raw_payload
|
||||
|
||||
@@ -65,8 +65,17 @@ class TestWorkflowReliability:
|
||||
|
||||
loaded = await services.jobs.read_job(job_id=job.id, session=session)
|
||||
|
||||
async def _never_returns(image_path, *, prompt_name="transcribe_document.md", settings=None, provider=None):
|
||||
_ = (image_path, prompt_name, settings, provider)
|
||||
async def _never_returns(
|
||||
image_path,
|
||||
*,
|
||||
prompt_name="transcribe_document.md",
|
||||
prompt_text=None,
|
||||
temperature=None,
|
||||
top_p=None,
|
||||
settings=None,
|
||||
provider=None,
|
||||
):
|
||||
_ = (image_path, prompt_name, prompt_text, temperature, top_p, settings, provider)
|
||||
raise TimeoutError("simulated provider timeout")
|
||||
|
||||
monkeypatch.setattr("transcription.services.workflows.transcribe_document_image", _never_returns)
|
||||
|
||||
@@ -95,6 +95,7 @@ async def seed_job(app_client: tuple[FastAPI, TestClient]) -> Callable[..., Awai
|
||||
retry_count=0,
|
||||
provider="openrouter",
|
||||
model="google/gemini-2.5-flash",
|
||||
prompt_name="transcribe_document.md",
|
||||
)
|
||||
session.add(job)
|
||||
await session.flush()
|
||||
@@ -121,7 +122,6 @@ async def seed_job(app_client: tuple[FastAPI, TestClient]) -> Callable[..., Awai
|
||||
if transcription_text is not None
|
||||
else JobSourceStatus.FAILED
|
||||
),
|
||||
prompt_name="transcribe_document.md",
|
||||
raw_transcription=transcription_text,
|
||||
error_detail=error_detail,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user