build_cite_links
ChatGPTTurn your citations into VERIFIED viewer deep links — the ONLY way to produce passage links; never assemble or modify viewer URLs yourself. After drafting your claims, make ONE batched call: for each claim pass its source, PDF page, and the supporting quote copied EXACTLY, character-for-character, from the snippet/page text (keep OCR errors as written — never fix or paraphrase). The server verifies each quote actually appears on that page and returns a ready-to-use citeLink that opens the page with the passage highlighted — fastwrite's verified-citation guarantee. A non-matching quote yields a page-only link plus a corrective note. Omit quote for a plain page link. Up to 20 links per call — batch ALL citations of your answer into one call, never one call per link.
find_in_sources
ChatGPTLiteral string matching over the student's sources — the exact counterpart to search_student_sources (which finds by MEANING). Use this when exactness matters: locate every occurrence of a term, name, or acronym; count how often a word appears; verify whether specific wording exists at all (a zero result is a real "not present"); or find the spot a known phrase sits on. Matching is case-insensitive with whitespace folded; the query is taken literally (no stemming — "innovation" does not match "innovative"; search inflected forms separately, parallel calls are fine). The response has two layers: sources (per-source totals — ALWAYS exhaustive) and hits (per-page detail with context excerpts, ranked densest page first, 25 per call — page through more via offset using the returned nextOffset; usually the summary plus the first window is enough). To cite or link a found passage, use build_cite_links with the hit's sourceId and page (add the exact quote for a highlight). Scope with sourceIds for large libraries — scanning stops at 1000 pages per call (partialScan is flagged). For conceptual/topical questions use search_student_sources — and for thorough evidence work run BOTH in parallel: hybrid (exact-term + meaning) search catches what either alone misses.
get_source_pages
ChatGPTRetrieve the verbatim text of specific PDF pages from ONE source in the student's library (max 15 pages per call). Use it to READ rather than search: a small source end-to-end (up to ~30 pages — two calls), the pages around a search hit for fuller context, or a spot the user points at ("page 12", the introduction, the conclusion). search_student_sources finds passages by meaning; this tool reads them in order. Each page carries its citeLink and the printed page label for citations. Page numbers are 1-based PDF pages.
list_students_library
ChatGPTThe full view of the student's fastwrite data: every project (library) they own, each with its complete list of uploaded sources — title, authors, year, file name, page count, processing status, and the sourceId needed to scope search_student_sources. Call this FIRST in a conversation, before any search: it shows what the student actually has and which project searches target by default. pages tells you how substantial a source is (a 3-page abstract vs. a 300-page book). status tells you where a file is right now: "File processed" = fully searchable; "processing" = just uploaded, still being indexed (searches may miss it — mention this and suggest retrying shortly); other values indicate ingestion problems (e.g. missing metadata). Pass projectId only to narrow the listing to one already-known project. sourceIds/projectIds are internal — refer to sources and projects by name when talking to the student.
search_external_papers
ChatGPTSemantic search over the abstracts of a large external academic paper database (Semantic Scholar corpus) — papers the student does NOT have in their library. Use it when the student needs literature beyond their own uploads (finding sources for a topic, broadening a literature base, checking what else exists) — and ALWAYS fire web_paper_search in parallel with it for the same request, then merge: this database contributes quality-filtered abstracts, the web search contributes current, full-text-grounded hits. Returns, per paper and in relevance order: title, authors, year, the full abstract (the ONLY text to ground claims in), and READY-MADE citation strings — inText (e.g. "(Kraus et al., 2023)"), reference (full reference-list line), and citeLink (fastwrite paper-viewer page). Cite every claim as inText + citeLink markdown link and close with the reference lines — all three used VERBATIM, never invent or modify citations or links. Matching is meaning-based over ABSTRACTS only — no full text. Results are quality-filtered (similarity threshold, citable authors, substantial abstract), so fewer than topK results — or none — is a meaningful signal, not an error. The corpus is overwhelmingly English: query in English for best recall, even when the conversation is in another language. To work with a found paper's full text, the student adds it to their library in the fastwrite app.
search_student_sources
ChatGPTSemantic search over the PDFs the student has uploaded to their fastwrite library (their own project sources — papers, book chapters, scripts). Call this whenever an answer should be grounded in the student's own sources rather than general knowledge. Returns text excerpts with source metadata (title, authors, year, PDF page, printed page) and a citeLink per hit. Call list_students_library first — sourceIds are ALSO how you filter: for "sources by author X" or any topical subset, select the matching sourceIds from the overview yourself. Each call searches ONE project (omit projectId for the default); to search several projects, make one call per project — parallel calls are fine. To READ a source rather than search it, use get_source_pages. For thorough evidence work, pair this with find_in_sources (exact terms) in parallel — hybrid search catches passages that either method alone misses.
web_paper_search
ChatGPTLive web search (Exa, scholarly-only index) returning the top papers published online on a topic — including very recent work. Each hit carries excerpts: VERBATIM passages from the paper's full text, each with its OWN citeLink that opens the paper with exactly that passage highlighted — the only quotable text (the query-focused summary is machine-written, for relevance judgement only, never quote or cite it). Bibliographic metadata is resolved via Crossref into READY-MADE citation strings: inText and reference (null inText = attribute by title + url). Cite every claim as inText + the supporting excerpt's citeLink and close with the reference lines — all used VERBATIM, never invent or modify citations or links. Companion to search_external_papers: that tool matches abstracts in a fixed database, this one searches the live web with real full-text excerpts. For ANY external-literature request, run BOTH in parallel and merge the results — never rely on the abstract database alone. Query in English (the scholarly web is overwhelmingly English). Expect ~10-30s: the index writes a summary per hit and Crossref enrichment runs after.
build_cite_links
Claudefind_in_sources
Claudeget_source_pages
Claudelist_students_library
Claudesearch_external_papers
Claudesearch_student_sources
Claudeweb_paper_search
Claude