Make bilingual epub books Using AI translate
This report summarizes scanner evidence for yihong0618/bilingual_book_maker, a Python project with 9,867 GitHub stars. SynthScan examined 111,486 lines of code across 277 source files, recording 3411 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 34.0 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 3002 finding(s).
Are imports declared and package/API names verified? 54 finding(s).
Are wrappers, guards, and repeated structures necessary? 3169 finding(s).
Which changes need focused human review? 3411 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 3411 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_maker/provider_loader.py | 213 | def _validate_endpoint_fields(name, provider): | CODE |
| LOW | book_maker/cli.py | 2876 | def parallel_session_conflict(options): | STRING |
| LOW | book_maker/endpoints.py | 419 | def resolve_classify_endpoint(options, run, provider, *, with_key=True): | CODE |
| LOW | book_maker/pipeline/reading_edition.py | 326 | def _settle_heading_attributes(self, result): | CODE |
| LOW | book_maker/pipeline/reading_edition.py | 505 | def reading_edition_loader_class( | CODE |
| LOW | book_maker/pipeline/pdf_figures.py | 189 | def parse_pdf_image_dpi_policy(text): | CODE |
| LOW | book_maker/pipeline/docling_parser.py | 480 | def _record_failed_extraction(bundle, settings, page_range, *, reason, empty): | CODE |
| LOW | book_maker/translator/base_translator.py | 858 | def _fold_standing_instructions(self, turn): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 138 | def _single_translation_model(language, source_language, field_language): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 216 | def _single_field_description(language, source_language=None): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 235 | def single_translation_schema(language, field_language=None): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 650 | def _ensure_structured_support(self, model=None): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 685 | def _demote_structured_outputs(self, reason): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 790 | def structured_json_with_image( | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1278 | def _note_temperature_rejected(self, model): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1319 | def _structured_single_translation(self, text): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1632 | def _create_structured_batch_messages(self, text_list, degree="strict"): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1706 | def _do_structured_batch_translate(self, text_list): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1812 | def _execute_structured_batch_translate(self, text_list, plist_len): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1896 | def _execute_json_object_batch(self, messages): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 2016 | def add_to_batch_translate_queue(self, book_index, text): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 2133 | def create_batch_context_messages(self, index): | CODE |
| LOW | book_maker/translator/qwen_translator.py | 155 | def _create_translation_options(self): | CODE |
| LOW | book_maker/translator/capabilities.py | 631 | def note_temperature_rejected(self, model): | CODE |
| LOW | book_maker/translator/capabilities.py | 660 | def note_compact_cap_rejected(self, model): | CODE |
| LOW | book_maker/translator/gemini_translator.py | 264 | def _extract_translation_text(self, response_text: str) -> str: | CODE |
| LOW | book_maker/translator/gemini_translator.py | 288 | def _manage_conversation_history(self) -> None: | CODE |
| LOW | book_maker/translator/gemini_translator.py | 471 | def _batch_translate_with_retry( | CODE |
| LOW | book_maker/loader/plan.py | 1188 | def _classed_inline_ancestors(node, owner, keep=frozenset()): | CODE |
| LOW | book_maker/loader/disclosure.py | 359 | def is_prior_translation_metadata(item): | CODE |
| LOW | book_maker/loader/disclosure.py | 694 | def allocate_translation_metadata_names(book, ids=None, files=None): | CODE |
| LOW | book_maker/loader/md_loader.py | 437 | def _translate_sections_parallel(self, pending, results, report): | CODE |
| LOW | book_maker/loader/md_loader.py | 566 | def _clone_translator_for_context(self): | CODE |
| LOW | book_maker/loader/md_loader.py | 716 | def _would_exceed_chunk_budget(self, batch, next_block): | CODE |
| LOW | book_maker/loader/helper.py | 196 | def derive_translation_identity(new_book, source_book, *facets): | CODE |
| LOW | book_maker/loader/helper.py | 303 | def has_restricted_content_model(element): | CODE |
| LOW | book_maker/loader/helper.py | 326 | def append_inline_translation(element, text, translation_style="", language=None): | CODE |
| LOW | book_maker/loader/helper.py | 562 | def translate_list_or_singles(model, texts): | CODE |
| LOW⚡ | book_maker/loader/epub_loader.py | 3616 | def _create_chapter_translator(self): | CODE |
| LOW⚡ | book_maker/loader/epub_loader.py | 3621 | def _clone_translator_for_context(self): | CODE |
| LOW | book_maker/loader/epub_loader.py | 242 | def check_file_filters_against(book, only_filelist, exclude_filelist): | CODE |
| LOW | book_maker/loader/epub_loader.py | 825 | def _wants_translation_metadata(self): | CODE |
| LOW | book_maker/loader/epub_loader.py | 855 | def _run_translation_metadata(self): | CODE |
| LOW | book_maker/loader/epub_loader.py | 974 | def _is_content_only_excluded_tags(self, p): | CODE |
| LOW | book_maker/loader/epub_loader.py | 1170 | def _narrate_session_compact_budget(self): | CODE |
| LOW | book_maker/loader/epub_loader.py | 1240 | def _report_test_slice_requests(self, chapter_plans, unit_count): | CODE |
| LOW | book_maker/loader/epub_loader.py | 1367 | def _check_resume_run_fingerprint(self): | CODE |
| LOW | book_maker/loader/epub_loader.py | 1461 | def _prepare_translation_plan(self): | CODE |
| LOW | book_maker/loader/epub_loader.py | 2182 | def _append_inline_translation(unit, t_text, translation_style="", language=None): | CODE |
| LOW | book_maker/loader/epub_loader.py | 2217 | def _insert_anchored_translation(unit, t_text, translation_style="", language=None): | CODE |
| LOW | book_maker/loader/epub_loader.py | 2256 | def _write_single_translation(unit, t_text, translation_style="", language=None): | CODE |
| LOW | book_maker/loader/epub_loader.py | 2613 | def _insert_trans_preserving_tags( | CODE |
| LOW | book_maker/loader/epub_loader.py | 2782 | def _process_combined_paragraph( | CODE |
| LOW | book_maker/loader/epub_loader.py | 2957 | def _process_paragraph_sentence_mode(self, p, soup): | CODE |
| LOW | book_maker/loader/epub_loader.py | 3000 | def find_items_containing_string(self, book, search_string): | CODE |
| LOW | book_maker/loader/epub_loader.py | 3489 | def _record_translation_result(self, index, translated_text): | CODE |
| LOW | book_maker/loader/epub_loader.py | 3502 | def _process_chapter_parallel(self, chapter_data): | CODE |
| LOW | book_maker/loader/epub_loader.py | 3652 | def _translate_with_chapter_context( | CODE |
| LOW | book_maker/loader/epub_loader.py | 3682 | def _translate_paragraphs_acc_parallel( | CODE |
| LOW | book_maker/loader/classify/session.py | 277 | def trunk_with_inline_example(trunk=None): | CODE |
| 2739 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | book_maker/classifier.py | 45 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 47 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 132 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 134 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 189 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 191 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 357 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 359 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 510 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/classifier.py | 512 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 342 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 344 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 485 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 487 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 541 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 543 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 666 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 668 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 813 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/decisions.py | 815 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/pdf_figures.py | 241 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/pdf_figures.py | 243 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/pdf_figures.py | 454 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/pipeline/pdf_figures.py | 456 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/loader/plan.py | 1423 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | book_maker/loader/plan.py | 1439 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/export_requirements.sh | 18 | # ----------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 140 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 142 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 261 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 263 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 304 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 306 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 363 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 365 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 527 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 529 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 182 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 184 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 305 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 307 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 350 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 352 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 77 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 79 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 401 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 403 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 639 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 641 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 783 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_to_epub_cli.py | 786 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_reading_edition_glossary.py | 118 | # -------------------------------------------------------------------------- | STRING |
| MEDIUM | tests/test_reading_edition_glossary.py | 120 | # -------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_reading_edition_glossary.py | 213 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_glossary.py | 215 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_glossary.py | 297 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_glossary.py | 299 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_endpoints.py | 748 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_endpoints.py | 750 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_formula.py | 61 | # -------------------------------------------------------------------------- | COMMENT |
| 137 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_maker/classifier.py | 165 | except Exception: | CODE |
| LOW | book_maker/classifier.py | 795 | except Exception as err: # transport: refused, reset, timed out | CODE |
| LOW | book_maker/codex_client.py | 61 | except Exception: | CODE |
| LOW⚡ | book_maker/codex_client.py | 458 | except Exception: | CODE |
| LOW⚡ | book_maker/codex_client.py | 466 | except Exception: | CODE |
| LOW⚡ | book_maker/codex_client.py | 472 | except Exception: | CODE |
| LOW⚡ | book_maker/codex_client.py | 476 | except Exception: | CODE |
| LOW⚡ | book_maker/codex_client.py | 481 | except Exception: | CODE |
| MEDIUM | book_maker/codex_client.py | 400 | def _unknown_feature(self): | CODE |
| LOW | book_maker/cli.py | 482 | except Exception as e: # noqa: BLE001 - re-raised as the sentence above | CODE |
| LOW | book_maker/cli.py | 571 | except Exception as e: # noqa: BLE001 - carried to main, re-raised there | CODE |
| LOW | book_maker/cli.py | 922 | except Exception as e: | CODE |
| MEDIUM | book_maker/cli.py | 3014 | print("Error: please provide the path of your book using --book_name <path>") | CODE |
| MEDIUM | book_maker/cli.py | 3017 | print(f"Error: the book {options.book_name!r} does not exist.") | CODE |
| LOW | book_maker/cli.py | 3599 | except Exception as ex: | CODE |
| LOW | book_maker/cli.py | 3607 | except Exception as err: | CODE |
| LOW | book_maker/cli.py | 3663 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/pdf_common.py | 259 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/pdf_common.py | 284 | except Exception as err: | CODE |
| MEDIUM | book_maker/pipeline/pdf_common.py | 108 | def _pdfium(): | CODE |
| LOW | book_maker/pipeline/translate.py | 450 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/decisions.py | 927 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/stages.py | 238 | except Exception: | CODE |
| LOW | book_maker/pipeline/pdf_figures.py | 711 | except Exception as missing: | CODE |
| LOW | book_maker/pipeline/pdf_figures.py | 830 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/pdf_figures.py | 841 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/pdf_figures.py | 855 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/pdf_figures.py | 1038 | except Exception: | CODE |
| MEDIUM | book_maker/pipeline/pdf_figures.py | 692 | def _describe_recorded(block): | CODE |
| LOW | book_maker/pipeline/progress.py | 176 | except Exception: | CODE |
| LOW | book_maker/pipeline/progress.py | 195 | except Exception: | CODE |
| LOW | book_maker/pipeline/docling_parser.py | 192 | except Exception: | CODE |
| LOW | book_maker/pipeline/docling_parser.py | 681 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/docling_parser.py | 1013 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/docling_parser.py | 1120 | except Exception as err: | CODE |
| LOW | book_maker/pipeline/docling_parser.py | 1390 | except Exception: | CODE |
| LOW | book_maker/pipeline/docling_parser.py | 1575 | except Exception: | CODE |
| MEDIUM | book_maker/pipeline/docling_parser.py | 1387 | def emit(self, record): | CODE |
| MEDIUM | book_maker/pipeline/docling_parser.py | 1570 | def _installed_version(): | CODE |
| MEDIUM | book_maker/translator/chatgptapi_translator.py | 1297 | def _temperature_tolerant(self, call, model): | CODE |
| MEDIUM | book_maker/translator/chatgptapi_translator.py | 1567 | def translate(self, text, needprint=True): | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1390 | except Exception: | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1474 | except Exception as e: | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1571 | except Exception as e: | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1629 | except Exception: | CODE |
| LOW | book_maker/translator/chatgptapi_translator.py | 1747 | except Exception as e: | CODE |
| LOW | book_maker/translator/caiyun_translator.py | 59 | except Exception as e: | CODE |
| LOW | book_maker/translator/vision.py | 212 | except Exception as e: | CODE |
| LOW | book_maker/translator/qwen_translator.py | 261 | except Exception as e: | CODE |
| LOW | book_maker/translator/claude_translator.py | 447 | except Exception: | CODE |
| LOW | book_maker/translator/claude_translator.py | 495 | except Exception as e: | CODE |
| LOW | book_maker/translator/deepl_translator.py | 109 | except Exception as e: | CODE |
| LOW | book_maker/translator/capabilities.py | 284 | except Exception as e: | CODE |
| LOW | book_maker/translator/capabilities.py | 336 | except Exception as e: | CODE |
| LOW | book_maker/translator/capabilities.py | 391 | except Exception as e: | CODE |
| LOW | book_maker/translator/capabilities.py | 404 | except Exception: | CODE |
| LOW | book_maker/translator/capabilities.py | 442 | except Exception as e: | CODE |
| LOW | book_maker/translator/gemini_translator.py | 339 | except Exception: | CODE |
| LOW | book_maker/translator/gemini_translator.py | 356 | except Exception as e: | CODE |
| LOW | book_maker/translator/gemini_translator.py | 512 | except Exception: | CODE |
| 71 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | book_maker/session_context.py | 1169 | except OSError: | CODE |
| HIGH | book_maker/codex_client.py | 466 | except Exception: | CODE |
| HIGH | book_maker/codex_client.py | 541 | except (ValueError, OSError): | CODE |
| HIGH | book_maker/codex_client.py | 581 | except CodexError: | CODE |
| HIGH | book_maker/codex_client.py | 458 | except Exception: | CODE |
| HIGH | book_maker/codex_client.py | 481 | except Exception: | CODE |
| HIGH | book_maker/codex_client.py | 476 | except Exception: | CODE |
| HIGH | book_maker/pipeline/progress.py | 149 | except (AttributeError, ValueError): | CODE |
| HIGH | book_maker/pipeline/progress.py | 195 | except Exception: | CODE |
| HIGH | book_maker/pipeline/docling_parser.py | 625 | except ImportError: | CODE |
| HIGH | book_maker/pipeline/docling_parser.py | 192 | except Exception: | CODE |
| HIGH | book_maker/translator/qwen_translator.py | 136 | except StopIteration: | CODE |
| HIGH | book_maker/translator/codex_translator.py | 366 | except CodexError: | CODE |
| HIGH | book_maker/loader/pdf_loader.py | 271 | except Exception: | CODE |
| HIGH | book_maker/loader/ledger.py | 420 | except OSError: | CODE |
| HIGH | book_maker/loader/epub_loader.py | 2698 | except Exception: | CODE |
| HIGH | book_maker/loader/epub_loader.py | 2719 | except Exception: | CODE |
| HIGH | book_maker/loader/epub_loader.py | 2736 | except Exception: | CODE |
| HIGH | tests/test_endpoints.py | 895 | except Exception: | CODE |
| HIGH | tests/test_endpoints.py | 901 | except Exception: | CODE |
| HIGH | tests/test_context_mode_cli.py | 147 | except BaseException: | CODE |
| HIGH | tests/test_context_mode_cli.py | 211 | except BaseException: | CODE |
| HIGH | tests/hermetic/sitecustomize.py | 59 | except Exception: # pragma: no cover - tenacity is a hard dependency | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | book_maker/cli.py | 2864 | # below, and the `--to-epub` harness refuses it *before* it pays for a PDF | STRING |
| MEDIUM | book_maker/pipeline/bundle.py | 76 | # One page-selection spelling for the whole harness, numbered from 1 the | COMMENT |
| MEDIUM | book_maker/pipeline/translate.py | 49 | # Owned by the harness: the book is the bundle's, the resume decision is | COMMENT |
| MEDIUM | book_maker/pipeline/translate.py | 84 | # the harness sets for itself, and the record of which spelling of the | COMMENT |
| MEDIUM | book_maker/pipeline/reading_edition.py | 106 | # the harness. | COMMENT |
| MEDIUM | book_maker/pipeline/messages.py | 20 | # is shell-quoted so the command can be pasted. The harness export rebuilds | COMMENT |
| MEDIUM | book_maker/pipeline/messages.py | 31 | # The same refusal from the staged harness (`translate`, `run`), where there | COMMENT |
| MEDIUM | book_maker/pipeline/messages.py | 447 | # the harness has no --to-epub, so its copy opens with its own condition. | COMMENT |
| MEDIUM | book_maker/pipeline/to_epub.py | 233 | # export and then the copy over `destination`, since the harness | COMMENT |
| LOW | book_maker/translator/qwen_translator.py | 346 | # once wiped the model it had just set. | COMMENT |
| LOW | book_maker/loader/epub_loader.py | 2655 | # Simpler approach: just set the translation and re-append code at the end | COMMENT |
| MEDIUM⚡ | tests/test_pdf_source_edit_guard.py | 141 | # The refusal, one reason per check, through the harness | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 376 | # the extraction has been paid for, and the harness can then only report | COMMENT |
| MEDIUM⚡ | tests/test_reading_edition_parallel.py | 377 | # "stopped before finishing (exit 1)". Decided: the harness refuses the | COMMENT |
| MEDIUM | tests/test_reading_edition_glossary.py | 43 | SOURCE = """# The harness | CODE |
| MEDIUM | tests/test_reading_edition_glossary.py | 168 | bundle.bilingual_markdown.write_text("# The harness\n", encoding="utf-8") | CODE |
| MEDIUM | tests/test_reading_edition_glossary.py | 234 | assert "{#the-harness}" in bundle.bilingual_markdown.read_text(encoding="utf-8") | CODE |
| MEDIUM | tests/test_reading_edition_glossary.py | 251 | heading = sent["# The harness"] | CODE |
| MEDIUM⚡ | tests/test_pdf_ocr_engine.py | 136 | # the harness has no --to-epub; the rest of the sentence is the same | COMMENT |
| MEDIUM | tests/test_pdf_ocr_engine.py | 402 | # ------------------------------------------------------------------ harness | COMMENT |
| MEDIUM⚡ | tests/test_pandoc_version.py | 91 | # PATH and --pandoc is offered as the harness's | COMMENT |
| MEDIUM | tests/test_disclosure.py | 381 | # The name is looked up by registry identity, and the hermetic harness | COMMENT |
| MEDIUM⚡ | tests/test_bundle_pipeline.py | 1037 | # Mending a translation by hand: the harness export rebuilds the bundle's own | COMMENT |
| MEDIUM | tests/test_bundle_pipeline.py | 718 | # The class used on its own states no language: the bundle harness is | COMMENT |
| MEDIUM⚡ | tests/test_bundle_pipeline.py | 566 | # The harness surface | STRING |
| MEDIUM | tests/test_prompt_capture_server.py | 318 | # harness). These tests are the opposite bargain — a real subprocess | COMMENT |
| MEDIUM | tests/test_prompt_capture_server.py | 319 | # against a real local endpoint — and the harness riding into the | COMMENT |
| MEDIUM⚡ | tests/test_prompt_sections.py | 383 | # The hermetic harness (tests/hermetic, when it is on PYTHONPATH) | COMMENT |
| LOW⚡ | tests/test_structured_classify.py | 720 | # return over the value it had just set; every request went out with | COMMENT |
| MEDIUM⚡ | tests/test_pdf_ocr_replace_layer.py | 777 | # ---------------------------------------------------------------- harness | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pyproject.toml | 41 | # The PDF reading edition (--to-epub): docling reads the PDF with layout | COMMENT |
| LOW | pyproject.toml | 101 | "live_provider: calls a real translation provider (needs keys and network; run with -m live_provider)", | COMMENT |
| LOW | book_maker/session_context.py | 41 | COMMENT | |
| LOW | book_maker/session_context.py | 61 | # cost up to 56% more *and* was the only cell where register drift was | COMMENT |
| LOW | book_maker/session_context.py | 81 | # measured that and it did not hold: on animal_farm through gpt-5.6-luna, | COMMENT |
| LOW | book_maker/session_context.py | 101 | # 8192 stands anyway, by owner ruling and with that price known. The case is | COMMENT |
| LOW | book_maker/session_context.py | 121 | # | COMMENT |
| LOW | book_maker/session_context.py | 141 | # | COMMENT |
| LOW | book_maker/session_context.py | 381 | COMMENT | |
| LOW | book_maker/session_context.py | 401 | # the model is being asked to compress its own context, not to write a report | COMMENT |
| LOW | book_maker/session_context.py | 1041 | summary: str | COMMENT |
| LOW | book_maker/classifier.py | 501 | return base or "the endpoint's default host" | COMMENT |
| LOW | book_maker/classifier.py | 521 | # reference with a lost skip costing 10 and an extra translate costing 1, | COMMENT |
| LOW | book_maker/legacy_cli.py | 281 | # Not an old alias: --model names an actual model id, which is | COMMENT |
| LOW | book_maker/cli.py | 641 | # 10 compactions at 500 against 6 at 3000, each one a place where the context | COMMENT |
| LOW | book_maker/cli.py | 841 | explicit `session` selects cached history. | COMMENT |
| LOW | book_maker/cli.py | 981 | return False | COMMENT |
| LOW | book_maker/cli.py | 3021 | print(f"[yellow]deprecated:[/yellow] {escape(notice)}") | COMMENT |
| LOW | book_maker/cli.py | 3061 | print( | COMMENT |
| LOW | book_maker/cli.py | 3421 | # The translation metadata record embeds the operator's file (never a derived | COMMENT |
| LOW | book_maker/endpoints.py | 101 | # aliases `jev-latest` (-> jev-1.13.0) and `jev-preview`, and versioned ids | COMMENT |
| LOW | book_maker/prompt_file.py | 41 | # is refused by name rather than silently dropped, because a misspelled | COMMENT |
| LOW | book_maker/pipeline/pdf_formula.py | 41 | # `mark` gives every undecoded formula a text, so the third branch is | COMMENT |
| LOW | book_maker/pipeline/pdf_figures.py | 61 | # docling's own pictures, in the same staging directory (the adapter's | COMMENT |
| LOW | book_maker/pipeline/messages.py | 21 | # only the bundle's own EPUB and writes nothing beside the PDF (lead 260925, | COMMENT |
| LOW | book_maker/pipeline/to_epub.py | 221 | _print_image_usage(structure) | COMMENT |
| LOW | book_maker/pipeline/docling_parser.py | 1041 | ) | COMMENT |
| LOW | book_maker/pipeline/docling_parser.py | 1181 | COMMENT | |
| LOW | book_maker/pipeline/preflight.py | 41 | # attributes and `$...$` math are all in it, and they are exactly the | COMMENT |
| LOW | book_maker/translator/base_translator.py | 281 | COMMENT | |
| LOW | book_maker/translator/base_translator.py | 301 | BATCH_SYS_MSG_PER_REQUEST = True | COMMENT |
| LOW | book_maker/translator/base_translator.py | 321 | # printing success and dropping the fields. | COMMENT |
| LOW | book_maker/translator/base_translator.py | 341 | glossary_auto = None | COMMENT |
| LOW | book_maker/translator/base_translator.py | 481 | # Nothing new this window. The vocabulary earlier windows | COMMENT |
| LOW | book_maker/translator/base_translator.py | 501 | # ---- session mode ------------------------------------------------------ | COMMENT |
| LOW | book_maker/translator/base_translator.py | 721 | # the prose, exactly as every earlier run derived it. | COMMENT |
| LOW | book_maker/translator/base_translator.py | 741 | # CLI prints — what `--prompt` did with the operator's own sections is | COMMENT |
| LOW | book_maker/translator/base_translator.py | 1401 | # system message onto this rung). Restoring the argument there would | COMMENT |
| LOW | book_maker/translator/chatgptapi_translator.py | 421 | # The address this route calls when the command names none. None means | COMMENT |
| LOW | book_maker/translator/chatgptapi_translator.py | 441 | session = None | COMMENT |
| LOW | book_maker/translator/chatgptapi_translator.py | 461 | # test) but is spelled here as a plain class attribute: importing the | COMMENT |
| LOW | book_maker/translator/chatgptapi_translator.py | 1741 | # The reply arrived and did not answer the request. That is the | COMMENT |
| LOW | book_maker/translator/__init__.py | 21 | # services that speak only their own protocol and take no model at all. | COMMENT |
| LOW | book_maker/translator/capabilities.py | 161 | # only caller (the session compact turn) truncates on this side anyway. | COMMENT |
| LOW | book_maker/translator/codex_translator.py | 61 | COMMENT | |
| LOW | book_maker/translator/codex_translator.py | 181 | COMMENT | |
| LOW | book_maker/translator/codex_translator.py | 561 | return text | COMMENT |
| LOW | book_maker/loader/plan.py | 461 | return "link" | COMMENT |
| LOW | book_maker/loader/plan.py | 561 | # Decoration a folio or a verse number routinely wears. Stripped from the | COMMENT |
| LOW | book_maker/loader/plan.py | 1081 | chars: int | COMMENT |
| LOW | book_maker/loader/plan.py | 1401 | for ordinal, unit in enumerate(fp.units): | COMMENT |
| LOW | book_maker/loader/plan.py | 1421 | GROUP_MAX_CHARS = 500 | COMMENT |
| LOW | book_maker/loader/plan.py | 1441 | # Units one *general* (token-budget) group may carry. | COMMENT |
| LOW | book_maker/loader/plan.py | 1461 | # budget is what actually caps the content of a request, and this is the | COMMENT |
| LOW | book_maker/loader/plan.py | 1481 | SUBSTRICT_GROUP_MAX_UNITS = GENERAL_GROUP_MAX_UNITS // 2 | COMMENT |
| LOW | book_maker/loader/plan.py | 1501 | # Also measured, and pointing the other way: per-content-token cost falls | COMMENT |
| LOW | book_maker/loader/plan.py | 1521 | # floor, at the same 4:3 ratio it has always had — 1600, where the old pair | COMMENT |
| LOW | book_maker/loader/ledger.py | 41 | import tempfile | COMMENT |
| LOW | book_maker/loader/markers.py | 41 | INLINE_MARKER_MAX_CHARS = 40 | COMMENT |
| LOW | book_maker/loader/markers.py | 61 | # email address or an identifier is glued out of. A run of letters touching | COMMENT |
| 16 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_maker/legacy_cli.py | 188 | CODE | |
| LOW | book_maker/codex_client.py | 508 | CODE | |
| LOW | book_maker/cli.py | 486 | CODE | |
| LOW | book_maker/cli.py | 2975 | CODE | |
| LOW | book_maker/utils.py | 500 | CODE | |
| LOW | book_maker/structured.py | 38 | CODE | |
| LOW | book_maker/endpoints.py | 340 | CODE | |
| LOW | book_maker/pipeline/pdf_common.py | 229 | CODE | |
| LOW | book_maker/pipeline/pdf_formula.py | 129 | CODE | |
| LOW | book_maker/pipeline/pdf_formula.py | 171 | CODE | |
| LOW | book_maker/pipeline/epub_export.py | 169 | CODE | |
| LOW | book_maker/pipeline/decisions.py | 363 | CODE | |
| LOW | book_maker/pipeline/decisions.py | 604 | CODE | |
| LOW | book_maker/pipeline/decisions.py | 703 | CODE | |
| LOW | book_maker/pipeline/decisions.py | 882 | CODE | |
| LOW | book_maker/pipeline/pdf_figures.py | 770 | CODE | |
| LOW | book_maker/pipeline/pdf_figures.py | 819 | CODE | |
| LOW | book_maker/pipeline/pdf_headings.py | 163 | CODE | |
| LOW | book_maker/pipeline/pdf_headings.py | 253 | CODE | |
| LOW | book_maker/pipeline/docling_parser.py | 898 | CODE | |
| LOW | book_maker/pipeline/preflight.py | 523 | CODE | |
| LOW | book_maker/translator/chatgptapi_translator.py | 839 | CODE | |
| LOW | book_maker/translator/chatgptapi_translator.py | 2133 | CODE | |
| LOW | book_maker/translator/qwen_translator.py | 221 | CODE | |
| LOW | book_maker/translator/capabilities.py | 515 | CODE | |
| LOW | book_maker/translator/capabilities.py | 533 | CODE | |
| LOW | book_maker/loader/srt_loader.py | 194 | CODE | |
| LOW | book_maker/loader/plan.py | 232 | CODE | |
| LOW | book_maker/loader/plan.py | 851 | CODE | |
| LOW | book_maker/loader/plan.py | 946 | CODE | |
| LOW | book_maker/loader/plan.py | 365 | CODE | |
| LOW | book_maker/loader/plan.py | 896 | CODE | |
| LOW | book_maker/loader/plan.py | 1847 | CODE | |
| LOW | book_maker/loader/plan.py | 1926 | CODE | |
| LOW | book_maker/loader/pdf_loader.py | 18 | CODE | |
| LOW | book_maker/loader/pdf_loader.py | 169 | CODE | |
| LOW | book_maker/loader/pdf_loader.py | 354 | CODE | |
| LOW | book_maker/loader/disclosure.py | 252 | CODE | |
| LOW | book_maker/loader/disclosure.py | 533 | CODE | |
| LOW | book_maker/loader/txt_loader.py | 91 | CODE | |
| LOW | book_maker/loader/md_loader.py | 126 | CODE | |
| LOW | book_maker/loader/md_loader.py | 362 | CODE | |
| LOW | book_maker/loader/font_obfuscation.py | 267 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 277 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 520 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 938 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 1461 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 2026 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 2120 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 2782 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 3209 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 3321 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 3502 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 3815 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 3827 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 4141 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 432 | CODE | |
| LOW | book_maker/loader/classify/session.py | 383 | CODE | |
| LOW | book_maker/loader/classify/model.py | 487 | CODE | |
| LOW | tools/docs_to_wiki.py | 152 | CODE | |
| 9 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 661 | export OPENAI_API_KEY=${your_api_key} | CODE |
| HIGH | README.md | 709 | export BBM_CAIYUN_API_KEY=${your_api_key} | CODE |
| HIGH | README-CN.md | 570 | export OPENAI_API_KEY=${your_api_key} | CODE |
| HIGH | README-CN.md | 608 | export BBM_CAIYUN_API_KEY=${your_api_key} | CODE |
| HIGH | docs/zh/env_settings.md | 10 | export BBM_API_KEY=${your_api_key} | CODE |
| HIGH | docs/en/env_settings.md | 10 | export BBM_API_KEY=${your_api_key} | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_maker/session_context.py | 29 | CODE | |
| LOW | book_maker/classifier.py | 43 | CODE | |
| LOW | book_maker/codex_client.py | 31 | CODE | |
| LOW | book_maker/glossary.py | 21 | CODE | |
| LOW | book_maker/pipeline/__init__.py | 9 | CODE | |
| LOW | book_maker/translator/codex_translator.py | 18 | CODE | |
| LOW | book_maker/loader/plan.py | 66 | CODE | |
| LOW | book_maker/loader/classify/session.py | 46 | CODE | |
| LOW | book_maker/loader/classify/__init__.py | 30 | CODE | |
| LOW | book_maker/loader/classify/__init__.py | 31 | CODE | |
| LOW | book_maker/loader/classify/__init__.py | 32 | CODE | |
| LOW | book_maker/loader/classify/__init__.py | 32 | CODE | |
| LOW | book_maker/loader/classify/__init__.py | 32 | CODE | |
| LOW | book_maker/loader/classify/__init__.py | 38 | CODE | |
| LOW | book_maker/loader/classify/__init__.py | 39 | CODE | |
| LOW | tools/docs_to_wiki.py | 31 | CODE | |
| LOW | tools/pdf_to_book.py | 39 | CODE | |
| LOW | tools/pdf_to_book.py | 39 | CODE | |
| LOW | tools/pdf_to_book.py | 39 | CODE | |
| LOW | tools/pdf_to_book.py | 39 | CODE | |
| LOW | tests/test_corpus_epub_samples.py | 30 | CODE | |
| LOW | tests/test_corpus_epub_samples.py | 425 | CODE | |
| LOW | tests/test_pdf_to_epub_cli.py | 11 | CODE | |
| LOW | tests/test_pdf_formula.py | 13 | CODE | |
| LOW | tests/test_translation_plan.py | 2230 | CODE | |
| LOW | tests/test_translation_plan.py | 2230 | CODE | |
| LOW | tests/test_translation_plan.py | 2242 | CODE | |
| LOW | tests/test_translation_plan.py | 2013 | CODE | |
| LOW | tests/test_glossary.py | 10 | CODE | |
| LOW | tests/test_pdf_decisions.py | 29 | CODE | |
| LOW | tests/test_structured_classify.py | 11 | CODE | |
| LOW | tests/test_structured_classify.py | 12 | CODE | |
| LOW | tests/test_structured_classify.py | 14 | CODE | |
| LOW | tests/test_structured_classify.py | 30 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | book_maker/translator/claude_translator.py | 380 | # Create a single message pair for all previous context | COMMENT |
| MEDIUM | book_maker/loader/epub_loader.py | 2644 | # Create a copy to work with | COMMENT |
| MEDIUM | book_maker/loader/epub_loader.py | 3514 | # Create a chapter-specific translator instance to avoid context conflicts | COMMENT |
| MEDIUM | book_maker/loader/epub_loader.py | 3714 | # Create a temporary translator with chapter context | COMMENT |
| MEDIUM | book_maker/loader/epub_loader.py | 3948 | # Create a simpler progress bar for parallel processing | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_maker/pipeline/stages.py | 242 | CODE | |
| LOW | book_maker/pipeline/to_epub.py | 139 | CODE | |
| LOW | book_maker/pipeline/docling_parser.py | 898 | CODE | |
| LOW | book_maker/pipeline/docling_parser.py | 1428 | CODE | |
| LOW | book_maker/translator/chatgptapi_translator.py | 477 | CODE | |
| LOW | book_maker/translator/qwen_translator.py | 76 | CODE | |
| LOW | book_maker/translator/claude_translator.py | 187 | CODE | |
| LOW | book_maker/translator/codex_translator.py | 210 | CODE | |
| LOW | book_maker/loader/srt_loader.py | 32 | CODE | |
| LOW | book_maker/loader/pdf_loader.py | 169 | CODE | |
| LOW | book_maker/loader/txt_loader.py | 10 | CODE | |
| LOW | book_maker/loader/md_loader.py | 37 | CODE | |
| LOW | book_maker/loader/epub_loader.py | 277 | CODE | |
| LOW | tests/pipeline_helpers.py | 128 | CODE | |
| LOW | tests/pipeline_helpers.py | 322 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | book_maker/loader/ledger.py | 57 | # a context window. | COMMENT |
| MEDIUM⚡ | tests/test_chatgptapi_translator.py | 1079 | # all the joined blob — may be left in the context window | COMMENT |
| MEDIUM⚡ | tests/test_cli.py | 1492 | # `0` used to mean "size it from the model's own context window". OpenAI's | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | book_maker/cli.py | 3150 | "model run rules on every row still null, an agent run hands " | CODE |
| HIGH | tests/test_translation_plan.py | 3498 | them null, with no prior verdict to lean on. A person's ruling is a | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_translation_plan.py | 933 | "dummy-key", | CODE |
| LOW | tests/test_translation_plan.py | 1368 | "dummy-key", | CODE |
| LOW | tests/test_translation_plan.py | 2030 | str(src), FakeModel, "dummy-key", resume=True, language="zh-hans" | CODE |
| LOW | tests/test_translation_plan.py | 2060 | str(src), FakeModel, "dummy-key", resume=True, language="zh-hans" | CODE |
| LOW | tests/test_translation_plan.py | 2094 | str(src), FakeModel, "dummy-key", resume=True, language="zh-hans" | CODE |
| LOW | tests/test_translation_plan.py | 2129 | str(src), StopsPartway, "dummy-key", resume=True, language="zh-hans" | CODE |
| LOW | tests/test_plan_auto.py | 188 | str(src), FakeModel, "dummy-key", resume=False, language="zh-hans" | CODE |
| LOW | tests/test_plan_auto.py | 277 | str(src), FakeModel, "dummy-key", resume=False, language="zh-hans" | CODE |
| LOW | tests/test_plan_auto.py | 292 | str(src), model_cls, "dummy-key", resume=True, language="zh-hans" | CODE |
| LOW | tests/test_plan_auto.py | 332 | str(src), ClassifyingModel, "dummy-key", resume=False, language="zh-hans" | CODE |
| LOW | tests/test_plan_auto.py | 379 | "fake-key", | CODE |
| LOW | tests/test_general_grouping_and_json_degree.py | 240 | str(src), model_cls, "dummy-key", resume=False, language="zh-hans" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_maker/translator/gemini_translator.py | 518 | # Check if fatal error was already detected during batch attempt | COMMENT |
| LOW | book_maker/loader/epub_loader.py | 982 | # Check if paragraph contains only excluded content tags | COMMENT |
| LOW | book_maker/loader/epub_loader.py | 2631 | # Check if paragraph has excluded content tags | COMMENT |
| LOW | book_maker/loader/epub_loader.py | 2864 | # Check if translation failed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | book_maker/translator/base_translator.py | 1356 | Send one delimiter-separated request for a whole group. Args: text_list: List of texts to | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_maker/pipeline/__init__.py | 11 | __all__ = ["PipelineError"] | CODE |
| LOW | book_maker/loader/helper.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | book_maker/loader/classify/__init__.py | 122 | __all__ = [ | CODE |
| LOW | tools/pdf_to_book.py | 50 | __all__ = [ | CODE |