Spaces:
Running
Running
Commit History
Yesterday
-
Fix 'Already borrowed': every fast tokenizer gets its own lock, so jobs running at the same time can share a model
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>634fc07
2 days ago
-
PhonePe webhook (POST /phonepe/webhook): checks the SHA256 username:password header and settles the order from PhonePe's status
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>6f0b0af -
Pay as you go only: prepaid wallet with PhonePe top-ups; every run reserved before it starts, capped (Groq + deadline) and charged its actual price with a 300% margin after GST and fees; admin profit report
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>89d4f87 -
Faster and steadier: jobs survive silent connection drops, Journal Finder warm start, parallel lookups and caches, fast engine up to FAST_MAX_WORDS
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>1f241b9 -
Journal Finder: title-only search, journals or conferences in one step, conference location, result cards
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>346458d -
Journal Finder: conference search (Scopus proceedings, CORE rank, open calls) and Web of Science SCIE/SSCI/ESCI filters
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>46373f2 -
Journal Formatter: footnotes, web references, books and reports, author marks, cleaner LaTeX
unknown +1: Claude Opus 5.5Found with a new tester (devtools/fmt_corpus.py + fmt_audit.py: 3 realistic manuscripts x 8 journal styles, Word and LaTeX checked against the source and the journal's rules, every LaTeX project compiled): - Footnotes were dropped everywhere: now real Word footnotes and \footnote in LaTeX. - Web references lost their URL ('Available' was read as the journal); every style now prints the URL its way. - Books and reports: IEEE / APA / Harvard / Vancouver / Chicago forms are read (edition, place, publisher) and formatted per style; an APA book is no longer turned into a journal article with 'Wiley' as the journal. - '(ISO, 2018)' resolves to 'International Organization for Standardization' (abbreviation / initials). - Elsevier LaTeX: author marks '1,*' no longer split into '?', the corresponding-author line is not an affiliation, no trailing commas; table captions get room above the table. - LaTeX: author-year reference lists unnumbered with a hanging indent; MDPI / Vancouver lists '1.…2eb3609 -
Email without a third-party service: own mail relay on your hosting
unknown +1: Claude Opus 5.5Hugging Face Spaces can only make web connections, so the mailer can now post each email over HTTPS to a relay on your own hosting (MAIL_RELAY_URL + MAIL_RELAY_TOKEN), which sends it through that hosting's own mail system. Used before any third-party provider. mail_relay/relay.php (one file for cPanel hosting) and mail_relay/relay.py (pure Python, standard library), token and single-sender checks, hourly limit; setup steps in mail_relay/README.md. Tested end to end: mailer -> running relay.py -> email with HTML and attachment; wrong token / sender refused. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>5b5ce4b -
Sign-up confirms the email address with a 6-digit code before the account is created
unknown +1: Claude Opus 5.5When email is set up (BREVO_API_KEY or RESEND_API_KEY + MAIL_FROM), Create account emails a code and the account exists only once the code is entered (5 wrong tries lock the code, 3 codes per address per hour). Without email, sign-up works as before. SIGNUP_VERIFY=0 turns the check off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f670a3d -
Fast engine: never uses a rewrite the faithfulness check did not approve; spending cap scaled to length; stops at 0%
unknown +1: Claude Opus 5.5- A version is used only if the faithfulness check said it keeps the meaning. When the check could not run (the flat $1 job cap stopped it in a 5,500-word test), sentences keep their wording instead of taking unchecked text. - groqai.set_cap: per-job spending cap; the fast engine allows $0.60 per 1,000 words (at least GROQ_JOB_BUDGET). - Once the document is at 0%, one more round at most (for leftover stock phrases). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f66d9ce -
0% first: rounds continue until the document is at 0% (10-minute safety cap); documents not at 0% are never charged
unknown +1: Claude Opus 5.5- fast.py: no one-minute stop any more: rounds go on until 0% on our detector, until 3 rounds bring no improvement, or the FAST_BUDGET cap (600 s); later rounds give stubborn sentences more versions and the strongest rewrite. The progress line shows the current score every round. - app.py: a document that did not reach 0% is delivered with the remaining sentences highlighted, the customer is told, and it is not charged (no pay-per-use payment, no plan credit). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>45c0ee6 -
One-minute deadline for the fast engine; half-precision detector on the GPU when it gives the same verdicts
unknown +1: Claude Opus 5.5- fast.py: the whole job ends within FAST_BUDGET (52 s) whatever the length: language-model requests still running at the deadline are dropped (their sentences keep their best version), rounds are planned from measured times, and long documents' candidates are pre-ranked on the GPU too. - detector.py: half precision on the GPU (about 2x faster), switched on at start-up only if it changes no verdict and no score by more than 0.05 on the bundled samples; logged either way. DETECTOR_HALF=0 = never. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>439ec70
3 days ago
-
Fast engine: versions from several models at once (Gemini 3.5 Flash-Lite + Qwen 3.8 by default, gpt-oss-20b as fallback), checked inside the worker threads; generator benchmark
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>01f5654 -
Fast engine: every flagged sentence replaced at once (versions judged on their own), 16 sentences per request, keep-every-detail prompt applied in the worker threads, step timings
unknown +1: Claude Opus 5.5Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>d46df30 -
Fast engine (opt-in with ?engine=fast) and one-step document upload
unknown +1: Claude Opus 5.5- fast.py: the whole document at once. The detector reads it once; every flagged sentence is rewritten in parallel by the language model (keep-every-detail prompt); versions must keep terms / numbers / citations, the meaning (embeddings + an independent faithfulness reading) and read as fluent English; the detector picks the most human version in context. Rounds repeat on what is still flagged within a time budget (FAST_BUDGET, 50 s). Live engine unchanged unless SMART_ENGINE=fast or the page is opened with ?engine=fast. - Smart Humanize opens on the Word upload, and dropping a file starts the run; the separate Humanizer tab is hidden. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>4a7a056
4 days ago
-
Paraphrasing 10x faster: learned banned words blocked with suppress_tokens
unknown +1: Claude Opus 5.5The adaptive learner's banned-word list had grown to 5,528 token sequences on the Space. Passed as bad_words_ids it is checked in Python at every generated token (with a GPU sync each time): every Parrot call took 18-28 s, even for one sentence, and it got slower as the tool learned. Single-token bans now go through suppress_tokens (one vectorised step); banned words of several tokens are still rejected afterwards by banned_in(). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>23008bb -
Faster humanizing on the GPU Space; the automatic proofread no longer undoes the humanizing
unknown +1: Claude Opus 5.5- The meaning, fluency, clarity and vocabulary checking models now run on the GPU when the Space has a dedicated one (they ran on the CPU for every version of every sentence on every pass; HELPERS_GPU=0 keeps them on CPU). - Automatic proofread after humanizing: grammar fixes and repairs that raise the AI score are undone too (a repair put back the author's flagged wording: a live run went 0% -> 100%). If the proofread still scores worse, the humanized version is delivered and the customer is told to press Final check & proofread to apply it anyway. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>4d32393
8 days ago
-
Journal Formatter: equations never run past the column or page
unknown +1: Claude Opus 5.5- LaTeX: a typed display equation wider than the column is scaled down to fit, with room for its number (new \fmmath macro, compiled under IEEEtran, elsarticle and article); matrices up to 30 columns. - Word: an equation picture wider than the column is made smaller instead of running past the page edge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>538ec83 -
Smart Humanize falls back to a full rewrite when stuck; log-in throttling; pay-per-use loophole closed
unknown +1: Claude Opus 5.5- Smart Humanize: when the score does not come down, the full-paraphrase engine is tried on the original and its result is kept if our detector scores it lower. - A pay-per-use run handed over free (score not lowered) no longer earns free re-runs of that file. - Log-in: after 8 wrong passwords in 15 minutes the account's log-in waits out the window. - Passwords typed into the log-in / sign-up forms are wiped once signed in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>fe2c3c9
9 days ago
-
Journal Formatter: LaTeX that compiles cleanly on Overleaf, two-column PDFs read correctly
unknown +1: Claude Opus 5.5- LaTeX: equation pictures and tables are never wider than the column (they overlapped the next column and the equation number); a table too wide for one column spans both; a caption goes to the float of its own kind; a caption whose figure/table could not be read keeps its place with a marked box instead of vanishing. - Sections styled one level too low (every section came out as a subsection 'A., B.') are moved up. - Captions pair with the right figure when the manuscript runs figure, caption, figure, caption. - Equations pasted as pictures on their own line are display equations, not uncaptioned figures. - PDF input: the gap between two columns is detected, so lines of the left and right column are no longer glued together; paragraphs, references and captions cut by a line or column break are rejoined; the hyphen of a compound word (peer-to-peer) is kept. - References written the Elsevier numbered way are read and restyled. - New texlint: every generated main.tex is checked …1b14e8e -
Formatter keeps a misread reference as written; dashboard lock and header wording
unknown +1: Claude Opus 5.5- formatmatch/refs: a parse that loses a surname or title word, or reads a one-letter title, is not trusted; the author's own reference text is kept instead of printing a wrong one. - Dashboard lock text no longer talks about uploads; guest bar says '1 trial document'. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>0f86a58 -
Accounts database kept off the storage mount and repaired at start; honest result when the AI score is not lowered
unknown +1: Claude Opus 5.5- auth: the live SQLite file is on the container's disk; a checked snapshot is written to /data after every change and read at start. A damaged stored file is salvaged row by row and kept aside (it had become 'malformed' on the bucket mount, which broke the run history and the admin pages). - Smart Humanize: a run that leaves the score where it was says so instead of 'Done', and is never charged as pay per use. - cost: the automatic proofread no longer replaces the job's token account (pay-per-use price was too low). - tests: no vocabulary model download. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>393219e -
Remove "Open in Overleaf"; dashboard covers every tool and pay per use
unknown +1: Claude Opus 5.5Formatter - No button that sends the project to Overleaf: the customer downloads the LaTeX zip and uploads it himself (New Project -> Upload Project); a note under the files says how. public_url and the Overleaf API code are gone. Dashboard - TOOLS now lists Proofread, Journal Formatter and Journal Finder, so they appear in the charts, the admin tool filter and the tool table. - Formatter and Finder runs are written to the run history (they ran outside the shared job wrapper and were not recorded). A formatted paper can be downloaded again from the dashboard. - A journal search is shown as "Search" and no longer counted as a pasted text. - Customer: tiles for proofreads, papers formatted and journal searches; results waiting for payment listed with price, reference and a Pay link. - Admin: tiles for the new tools (30 days) and for pay per use (awaiting payment, paid, cost). tests/test_dashboard.py; Overleaf tests replaced. 97 tests pass. Not opened in a browser fo…ec28ce1 -
Formatter and Finder tabs: download buttons that carry the file
unknown +1: Claude Opus 5.5Downloads did not work in the two new tabs: they offered results only through Gradio's file box, whose link goes back to the server and is blocked when the app is opened on the custom domain or in a frame. - tools_common.download_link / download_row: buttons with the file in a data link, the same way the other tabs' download buttons work. - Formatter: Word document, LaTeX project and report buttons. - Finder: shortlist and all-journals CSV buttons (also after a search that shortlisted nothing). - The file boxes stay as a second route. Tests added (95 in total). Not checked on screen (the browser pane was hidden during this change). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>ee3bfc0 -
Formatter and Finder tabs: the suite's animated status panel; finder data fixes
unknown +1: Claude Opus 5.5- Both tabs now run their jobs through the shared live status panel (waiting card, spinning logo, progress bar, elapsed time, Stop & reset) instead of Gradio's plain loader. app.py hands the shared look to build(ui); without it the tabs fall back to Gradio's progress. - "Work out the subject" shows the animated waiting card; both tabs start with the styled idle hint. - Finder shortlist: the PubMed column read as text ("False") no longer shows as "yes". - finder_tab.freshen_data_caches(): the parsed copies of the big lists shipped with the app are marked current at start-up, so the first search after a restart does not re-read Scopus / SCImago / PubMed / ABDC (the pipeline trusts a copy only if it is newer than its list, and a checkout gives files arbitrary times). Parsed copies refreshed. - Tests for the above (94 in total). Checked in a browser on the local app: waiting card and logo panel appear on the Finder tab, subject detection and a full search (10 journals, 1…f2e0b82 -
Open in Overleaf: respect Overleaf's request size limit
unknown +1: Claude Opus 5.5Overleaf answered a posted project with "Something went wrong ... there was a problem with your request": HTTP 413. Measured limit: a 1.98 MB request is accepted, 2.13 MB is refused, i.e. a zip of about 1.4 MB once it is base64 in a form. The cut-off had been a guessed 6 MB. - The button now measures the real request and posts the project only when it stays under OVERLEAF_POST_MB (1.8): a zip up to about 1.2 MB. - A larger project is handed over by its public address on the Space (snip_uri=https://...), which Overleaf downloads itself. - With neither possible the page says so and explains the manual upload. - Test that every posted project fits the limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>cdcade6 -
Open in Overleaf posts the project itself; tests for the formatter and finder tabs
unknown +1: Claude Opus 5.5- formatter_tab.overleaf_html: the LaTeX zip is sent to Overleaf's API (overleaf.com/devs) in a POST form as snip_uri=data:application/zip; base64, with engine=pdflatex and main_document=main.tex. Overleaf no longer has to download it from the Space, so the button works on a private or sleeping Space and on a local run. - A project above OVERLEAF_EMBED_MB (6) goes by its public address as before; without one, only the manual upload is explained. - tests/test_tools_tabs.py: formatting a Word manuscript (Word, LaTeX zip with main.tex at the top level, report), the three Overleaf cases, finder job options, shortlist table, input checks, both tabs wired in. Checked in a browser that the form renders inside the app; the button itself was not pressed (it creates a project on Overleaf). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>e7bb050 -
Pricing page: pay-per-use card and a monthly / yearly switch
unknown +1: Claude Opus 5.5- New "Pay per use" card (shown when PAY_PER_USE is on): no plan or credits needed, scores first, pay to download, price shown before paying, GST included; starts at PRICE_MIN_INR. - "Plan billing" radio next to Currency: Yearly redraws the Scholar and Pro cards with the yearly price, the per-month equivalent and the saving; the monthly view keeps a one-line yearly reminder. - "Rigorous proofread" now reads "Final check & proofread, done automatically" on every card. - pricing_html(currency, billing); test for both views. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>37d9ddb -
Automatic proofread, pay-per-use charges with a pay pop-up, yearly plans
unknown +1: Claude Opus 5.5Automatic proofread - Every humanized text / document (Smart Humanize, Humanizer) goes through the final check & proofread; the proofread file is delivered. AUTO_PROOFREAD=0 = only on request. - humanizer.PROOFREAD_FOLLOWS: the humanizer's own language-model polish is skipped when the proofread follows (one final check, not two). - A failed proofread still delivers the humanized result and says so. Pay per use (plans.py, app.py) - check_doc returns "payg" for a signed-in customer without credits instead of blocking (PAY_PER_USE=0 restores the block). - usage_price(): GPU seconds x COST_GPU_HOUR_USD, idle share of the Space (COST_IDLE_FACTOR), the job's language-model cost, then PRICE_MARGIN (200%), PRICE_GST (18%), PRICE_USD_INR, PRICE_MIN_INR. - charges table; the result is locked (no file, no preview, no email, not in the run history) until settle_charge(ref). Pop-up with the price; Pay opens PAY_URL or the WhatsApp contact; "I have paid" unlocks. - Admin: pay-per-us…ca97939 -
Cut language-model cost and show what each job costs
unknown +1: Claude Opus 5.5Measured on the paid tier: one pass of every task over 5,000 words is about 6-7 US cents; the natural-style rewrites are over half of it. - Models: default list is gpt-oss-120b, gpt-oss-20b. qwen3.8-27b (about six times the price) and the unavailable llama model are no longer fallbacks. - Routing: verify and grammar run on the half-price GROQ_LIGHT_MODEL (GROQ_LIGHT_KINDS); writing tasks stay on the main model. - verify(): verdicts cached and packed through the shared batch runner. - Final polish is sent only for paragraphs the tool changed (POLISH_CHANGED_ONLY). - A rate limit that clears within GROQ_SHORT_LIMIT seconds is waited out instead of switching writing tasks to the weaker model. - GROQ_JOB_BUDGET: ceiling per job in US$ (default 1.00); past it the job continues with the local checks. - Accounting: every request booked by task (tokens in, cached, out, cost; GROQ_PRICES); "[cost]" line per Smart Humanize and proofread job in the log. - README: measured costs a…2906069 -
Proofread: basic check instead of an error when no language model is reachable
unknown +1: Claude Opus 5.5With every Groq key and model at its usage limit and no credit on the other provider, "Final check & proofread" failed with "the proofreading engine has reached its usage limit". It now completes with what needs no model (rule-based clean-up, LanguageTool, the AI-score checks) and says plainly that the full check (unclear sentences, academic wording, flow, consistency) has not been done yet and should be run again later. - proofread: `limited` result flag; PROOF_BASIC_FALLBACK=0 restores the error. - app: the result headline reads "Basic proofread done" in that case. - tests/test_proofread_fallback.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>a130a73 -
Ask before rewording text that already scores 0% AI
unknown +1: Claude Opus 5.5Smart Humanize leaves a text or Word file that scores 0% AI unchanged. The result now says so and shows a pop-up asking whether it should be rephrased anyway: - "Rephrase anyway" presses a hidden button that reruns Smart Humanize on every sentence (about 35% new wording, at most two passes, no report; REPHRASE_ANYWAY_VOCAB / REPHRASE_ANYWAY_PASSES). - "Keep my text" closes it; a line with the same link stays under the result. - No pop-up after a rephrase-anyway run or when text was humanized. Reuses the existing upgrade pop-up; data-cs-stay keeps the page where the result is. Covered by tests/test_app_rephrase_anyway.py (logic and wiring only: not yet seen in a browser). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>7afb000 -
Merge the Space's 8-9 October work (origin/main) into the local changes
unknown +1: Claude Opus 5.5The Space had moved on (adaptive learning, detector-guided rewriting, token-budget handling in groqai, shared integrity checks, proofread changes). Conflicts in groqai, humanizer and textparse were resolved by keeping both sides: - groqai: the Space's token-budget chat loop, with the per-model fallback on a rate limit added to it. - humanizer: the Space's PARA_MODEL fallback inside the lazy load_model(); the automatic deeper rewrite (BOOST) feeds the adaptive candidate count and the plain-wording source. - textparse: both sets of guard checks run; strict_check keeps its rejection reasons and gains the Space's integrity checks. - integrity_issue: "bracket type changed" no longer fires when an author-year citation is dropped (it has no "["), so the guard can re-attach the citation again. 53 unit tests pass; text and Word end-to-end runs complete on the merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>eaf69a7 -
Add meaning check, Groq model fallback and subject test run; close guard gaps
unknown +1: Claude Opus 5.5Found by running Smart Humanize on 16 subject samples (devtools/batch.py). - groqai: on a rate limit the request moves to the next model in GROQ_MODELS (limits are per model), then back when the limit has passed. - groqai.verify + humanizer: every rewritten sentence is read against the author's sentence; one that changed the meaning (moved p-value, reversed comparison, dropped method, "but" -> "so") gets the next version that passes, else the original (HUM_VERIFY, HUM_VERIFY_ALTS). - textparse.guard: integrity rules now apply to every version; damaged citations are repaired or the rewrite rejected; each citation exactly once; bracket spacing normalised before the checks. - basic_grammar no longer treats "(Mishra and Mishra, 2012)" as a doubled word. - Sentence splitting: initials and case names ("Justice K.S. Puttaswamy v. Union of India") no longer end a sentence; detector and humanizer share one rule. - pubrules: micro-prefixed and compound units (ug/m3, mmol/g, MP…689da70 -
Harden rewrite integrity, stop the final polish undoing humanization, add tests
unknown +1: Claude Opus 5.5Integrity (textparse, pubrules) - Guard rejects lost relation signs (p < 0.01 -> p 0.01), duplicated or invented citations and unbalanced brackets; closes sentences left open. - New rules: no added cause, no added "we"; mediate/moderate/correlate/ regress protected in any word form. - Fewer false rejections: "indicate" is a reporting verb, not a hedge; another form of an author's name is not invented. - Author's typography kept (no-break hyphens, curly quotes, minus sign); fragments keep their open ending and lower-case start. - strict_check() returns the rejection reason. Humanizer / Smart Humanize - Final polish repairs only sentences that fail the clarity checks; a clear humanized sentence is no longer reverted to the original, with a paragraph-level check on optional edits. - Rescue versions are written in four distinct manners and chosen next to their neighbours' current wording. - Word: bold/italic runs inside a rewritten sentence keep their format; no full stop …585f232