ai4scholar 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAkDlD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,QAyGtD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAmDlD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,QA4GtD"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ import { createGoogleScholarSearchTool } from "./src/tools/google-scholar.js";
8
8
  import { createArxivSearchTool, createArxivDownloadTool, createArxivReadTool } from "./src/tools/arxiv.js";
9
9
  import { createBiorxivSearchTool, createMedrxivSearchTool, createBiorxivDownloadTool, createMedrxivDownloadTool, createBiorxivReadTool, createMedrxivReadTool, } from "./src/tools/biorxiv.js";
10
10
  import { createDoiDownloadTool, createDoiReadTool } from "./src/tools/doi-download.js";
11
+ import { createPaperQualityRankTool } from "./src/tools/quality-rank.js";
11
12
  import { handleLibrary, handleProjects, handleReadingList, } from "./src/commands.js";
12
13
  import { createScholarModeHook } from "./src/hooks/scholar-mode.js";
13
14
  const UPDATE_CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour
@@ -59,6 +60,8 @@ export default function register(api) {
59
60
  // --- DOI direct download (2 tools) ---
60
61
  api.registerTool(createDoiDownloadTool());
61
62
  api.registerTool(createDoiReadTool());
63
+ // --- Quality evaluation (1 tool) ---
64
+ api.registerTool(createPaperQualityRankTool());
62
65
  // --- Slash commands ---
63
66
  api.registerCommand({
64
67
  name: "library",
@@ -97,6 +100,6 @@ export default function register(api) {
97
100
  },
98
101
  }));
99
102
  }
100
- api.logger.info(`AI4Scholar plugin loaded — 34 tools registered (apiKey: ${cfg?.apiKey ? "configured" : "missing"})`);
103
+ api.logger.info(`AI4Scholar plugin loaded — 35 tools registered (apiKey: ${cfg?.apiKey ? "configured" : "missing"})`);
101
104
  }
102
105
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC5B,8BAA8B,EAC9B,8BAA8B,EAC9B,iCAAiC,EACjC,yCAAyC,EACzC,+BAA+B,EAC/B,8BAA8B,EAC9B,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE1D,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAsB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,YAAqE,CAAC;IAEtF,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,8HAA8H,CAC/H,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,GAAG,CAAC,YAAY,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC7C,GAAG,CAAC,YAAY,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC7C,GAAG,CAAC,YAAY,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAChD,GAAG,CAAC,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC;IACjD,GAAG,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACtD,GAAG,CAAC,YAAY,CAAC,yCAAyC,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,YAAY,CAAC,+BAA+B,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC;IACjD,GAAG,CAAC,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC;IACjD,GAAG,CAAC,YAAY,CAAC,6BAA6B,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC;IACjD,GAAG,CAAC,YAAY,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAE3C,2BAA2B;IAC3B,GAAG,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3C,GAAG,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3C,GAAG,CAAC,YAAY,CAAC,yBAAyB,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE1C,kCAAkC;IAClC,GAAG,CAAC,YAAY,CAAC,6BAA6B,EAAE,CAAC,CAAC;IAElD,0BAA0B;IAC1B,GAAG,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC1C,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAExC,sCAAsC;IACtC,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,yBAAyB,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,yBAAyB,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC1C,GAAG,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE1C,wCAAwC;IACxC,GAAG,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC1C,GAAG,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEtC,sCAAsC;IACtC,GAAG,CAAC,YAAY,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAE/C,yBAAyB;IACzB,GAAG,CAAC,eAAe,CAAC;QAClB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,aAAa;KACvB,CAAC,CAAC;IAEH,GAAG,CAAC,eAAe,CAAC;QAClB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,GAAG,CAAC,eAAe,CAAC;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,iBAAiB;KAC3B,CAAC,CAAC;IAEH,gBAAgB;IAChB,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1E,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE/E,+BAA+B;IAC/B,MAAM,iBAAiB,GAAG,GAAG,EAAE,UAAU,KAAK,KAAK,CAAC;IACpD,IAAI,iBAAiB,EAAE,CAAC;QACtB,GAAG,CAAC,eAAe,CACjB,wBAAwB,CAAC;YACvB,WAAW,EAAE,YAAY;YACzB,eAAe,EAAE,wBAAwB;YACzC,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBACnC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBACnC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC;aACxC;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,2DAA2D,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,CACrG,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- const SCHOLAR_MODE_PROMPT = `[AI4Scholar] You have 34 academic literature tools covering Semantic Scholar, PubMed, Google Scholar, arXiv, bioRxiv, and medRxiv. Capabilities include: search, paper detail, citations, references, author lookup, recommendations, snippet search, batch queries, title matching, bulk search, PDF download, full-text reading, and direct DOI-based paper download (leverages institutional access when available). For paper search or literature questions, call the tools directly and respond in Markdown. Only read the literature-survey SKILL.md when the user explicitly requests an HTML report or a comprehensive multi-source survey.`;
1
+ const SCHOLAR_MODE_PROMPT = `[AI4Scholar] You have 35 academic literature tools covering Semantic Scholar, PubMed, Google Scholar, arXiv, bioRxiv, and medRxiv. Capabilities include: search, paper detail, citations, references, author lookup, recommendations, snippet search, batch queries, title matching, bulk search, PDF download, full-text reading, direct DOI-based paper download (leverages institutional access when available), and paper quality ranking (CCF classification). For paper search or literature questions, call the tools directly and respond in Markdown. When the user pastes academic text and asks to add citations/references, read the auto-cite SKILL.md. Only read the literature-survey SKILL.md when the user explicitly requests an HTML report or a comprehensive multi-source survey.`;
2
2
  export function createScholarModeHook() {
3
3
  return (event, _context) => {
4
4
  if (!event.messages || event.messages.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"scholar-mode.js","sourceRoot":"","sources":["../../../src/hooks/scholar-mode.ts"],"names":[],"mappings":"AAgBA,MAAM,mBAAmB,GAAG,snBAAsnB,CAAC;AAEnpB,MAAM,UAAU,qBAAqB;IACnC,OAAO,CAAC,KAAgB,EAAE,QAAqB,EAAc,EAAE;QAC7D,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"scholar-mode.js","sourceRoot":"","sources":["../../../src/hooks/scholar-mode.ts"],"names":[],"mappings":"AAgBA,MAAM,mBAAmB,GAAG,wwBAAwwB,CAAC;AAEryB,MAAM,UAAU,qBAAqB;IACnC,OAAO,CAAC,KAAgB,EAAE,QAAqB,EAAc,EAAE;QAC7D,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ interface PaperInput {
2
+ title?: string;
3
+ year?: number;
4
+ venue?: string;
5
+ journal?: string | {
6
+ name?: string;
7
+ };
8
+ citationCount?: number;
9
+ influentialCitationCount?: number;
10
+ isOpenAccess?: boolean;
11
+ externalIds?: {
12
+ DOI?: string;
13
+ ArXiv?: string;
14
+ };
15
+ authors?: {
16
+ name?: string;
17
+ authorId?: string;
18
+ }[];
19
+ firstAuthorHIndex?: number;
20
+ }
21
+ export declare function createPaperQualityRankTool(): {
22
+ name: string;
23
+ description: string;
24
+ inputSchema: import("@sinclair/typebox").TObject<{
25
+ papers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
26
+ title: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
27
+ year: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
28
+ venue: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TObject<{
29
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
30
+ }>]>>;
31
+ journal: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TObject<{
32
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
33
+ }>]>>;
34
+ citationCount: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
35
+ influentialCitationCount: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
36
+ isOpenAccess: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
37
+ externalIds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
38
+ DOI: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
39
+ ArXiv: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
40
+ }>>;
41
+ authors: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
42
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
43
+ authorId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
44
+ }>>>;
45
+ firstAuthorHIndex: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
46
+ }>>;
47
+ topN: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
48
+ }>;
49
+ handler: (params: {
50
+ papers: PaperInput[];
51
+ topN?: number;
52
+ }) => Promise<{
53
+ type: "tool_result";
54
+ content: {
55
+ type: "text";
56
+ text: string;
57
+ }[];
58
+ isError?: boolean;
59
+ }>;
60
+ };
61
+ export {};
62
+ //# sourceMappingURL=quality-rank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-rank.d.ts","sourceRoot":"","sources":["../../../src/tools/quality-rank.ts"],"names":[],"mappings":"AA0DA,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA4DD,wBAAgB,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAqCd;QAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;EAiBlE"}
@@ -0,0 +1,125 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { Result } from "./result.js";
6
+ let ccfData = null;
7
+ function loadCcfData() {
8
+ if (ccfData)
9
+ return ccfData;
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ let root = path.dirname(__filename);
12
+ for (let i = 0; i < 5; i++) {
13
+ if (fs.existsSync(path.join(root, "package.json")))
14
+ break;
15
+ root = path.dirname(root);
16
+ }
17
+ const jsonlPath = path.join(root, "data", "ccf_2022.jsonl");
18
+ if (!fs.existsSync(jsonlPath)) {
19
+ ccfData = [];
20
+ return ccfData;
21
+ }
22
+ const lines = fs.readFileSync(jsonlPath, "utf-8").split("\n").filter(Boolean);
23
+ ccfData = lines.map((line) => JSON.parse(line));
24
+ return ccfData;
25
+ }
26
+ function lookupCcf(venue) {
27
+ if (!venue)
28
+ return null;
29
+ const data = loadCcfData();
30
+ const venueLower = venue.toLowerCase().replace(/[^a-z0-9]/g, "");
31
+ for (const entry of data) {
32
+ if (entry.acronym_alnum === venueLower)
33
+ return entry;
34
+ }
35
+ for (const entry of data) {
36
+ if (venueLower.includes(entry.acronym_alnum) && entry.acronym_alnum.length >= 3)
37
+ return entry;
38
+ }
39
+ const venueNameLower = venue.toLowerCase();
40
+ for (const entry of data) {
41
+ if (venueNameLower.includes(entry.name.toLowerCase()))
42
+ return entry;
43
+ }
44
+ return null;
45
+ }
46
+ const CCF_SCORES = { A: 100, B: 70, C: 40 };
47
+ function resolveVenueName(v) {
48
+ if (!v)
49
+ return "";
50
+ if (typeof v === "string")
51
+ return v;
52
+ return v.name ?? "";
53
+ }
54
+ function scorePaper(paper) {
55
+ const title = paper.title ?? "";
56
+ const year = paper.year ?? 0;
57
+ const venue = resolveVenueName(paper.venue) || resolveVenueName(paper.journal);
58
+ const citations = paper.citationCount ?? 0;
59
+ const doi = paper.externalIds?.DOI ?? null;
60
+ const arxivId = paper.externalIds?.ArXiv;
61
+ const ccf = lookupCcf(venue);
62
+ const ccfRank = ccf?.rank ?? null;
63
+ const isArxiv = !ccf && (venue.toLowerCase().includes("arxiv") || (!venue && !!arxivId));
64
+ const ccfScore = ccfRank ? (CCF_SCORES[ccfRank] ?? 0) : 0;
65
+ const citationScore = citations > 0 ? Math.min(50, Math.log10(citations + 1) * 10) : 0;
66
+ const yearScore = year ? Math.min(30, Math.max(0, (year - 2015) * 2)) : 0;
67
+ const hIndexScore = paper.firstAuthorHIndex
68
+ ? Math.min(30, paper.firstAuthorHIndex * 0.5)
69
+ : 0;
70
+ const arxivPenalty = isArxiv ? -20 : 0;
71
+ const qualityScore = Math.round((ccfScore + citationScore * 0.4 + yearScore * 0.2 + hIndexScore * 0.3 + arxivPenalty) * 100) / 100;
72
+ return {
73
+ title,
74
+ year,
75
+ venue,
76
+ citationCount: citations,
77
+ ccfRank,
78
+ ccfField: ccf?.field ?? null,
79
+ ccfType: ccf?.type ?? null,
80
+ isArxiv,
81
+ qualityScore,
82
+ doi,
83
+ };
84
+ }
85
+ export function createPaperQualityRankTool() {
86
+ return {
87
+ name: "paper_quality_rank",
88
+ description: "Evaluate and rank academic papers by quality. Uses CCF ranking (A/B/C), citation count, publication year, and author h-index to compute a composite quality score. Input a JSON array of paper objects (from search results). Returns papers sorted by quality score with CCF classification.",
89
+ inputSchema: Type.Object({
90
+ papers: Type.Array(Type.Object({
91
+ title: Type.Optional(Type.String()),
92
+ year: Type.Optional(Type.Number()),
93
+ venue: Type.Optional(Type.Union([Type.String(), Type.Object({ name: Type.Optional(Type.String()) })])),
94
+ journal: Type.Optional(Type.Union([Type.String(), Type.Object({ name: Type.Optional(Type.String()) })])),
95
+ citationCount: Type.Optional(Type.Number()),
96
+ influentialCitationCount: Type.Optional(Type.Number()),
97
+ isOpenAccess: Type.Optional(Type.Boolean()),
98
+ externalIds: Type.Optional(Type.Object({
99
+ DOI: Type.Optional(Type.String()),
100
+ ArXiv: Type.Optional(Type.String()),
101
+ })),
102
+ authors: Type.Optional(Type.Array(Type.Object({
103
+ name: Type.Optional(Type.String()),
104
+ authorId: Type.Optional(Type.String()),
105
+ }))),
106
+ firstAuthorHIndex: Type.Optional(Type.Number()),
107
+ }), { description: "Array of paper objects from search results" }),
108
+ topN: Type.Optional(Type.Number({ description: "Return only top N papers. Default: all.", minimum: 1 })),
109
+ }),
110
+ handler: async (params) => {
111
+ const { papers, topN } = params;
112
+ if (!papers || papers.length === 0) {
113
+ return Result.err("EMPTY_INPUT", "No papers provided.");
114
+ }
115
+ const ranked = papers.map(scorePaper).sort((a, b) => b.qualityScore - a.qualityScore);
116
+ const results = topN ? ranked.slice(0, topN) : ranked;
117
+ return Result.ok({
118
+ total: papers.length,
119
+ returned: results.length,
120
+ papers: results,
121
+ });
122
+ },
123
+ };
124
+ }
125
+ //# sourceMappingURL=quality-rank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-rank.js","sourceRoot":"","sources":["../../../src/tools/quality-rank.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai4scholar",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Multi-source academic literature search, management, and analysis plugin for OpenClaw. Powered by ai4scholar.net.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -9,6 +9,7 @@
9
9
  "dist",
10
10
  "skills",
11
11
  "scripts",
12
+ "data",
12
13
  "assets",
13
14
  "openclaw.plugin.json"
14
15
  ],
@@ -0,0 +1,150 @@
1
+ ---
2
+ name: auto-cite
3
+ description: "Automatically add citation markers to academic text and generate a numbered reference list. Use when the user pastes a paragraph or section (e.g. Introduction, Related Work) and asks to add citations/references."
4
+ metadata:
5
+ {
6
+ "openclaw":
7
+ {
8
+ "emoji": "📎",
9
+ },
10
+ }
11
+ ---
12
+
13
+ # Auto-Cite: Automatic Citation Annotation
14
+
15
+ **Don't ask permission. Just do it.**
16
+
17
+ ## What This Skill Does
18
+
19
+ User pastes academic text → You identify where citations are needed → Search real papers → Insert citation markers [1], [2, 3] → Append a numbered APA reference list.
20
+
21
+ Every cited paper MUST come from a real database (Semantic Scholar, PubMed, arXiv, bioRxiv, medRxiv). Never fabricate papers.
22
+
23
+ ## Workflow
24
+
25
+ ### Step 1: Analyze the Text
26
+
27
+ Read the entire text. For each sentence, decide:
28
+
29
+ **Needs citation:**
30
+ - Factual claims ("X has been shown to...", "Studies have demonstrated...")
31
+ - Methodological references ("The Transformer architecture...", "Using the BERT model...")
32
+ - Statistical or quantitative claims ("affects 30% of...", "outperforms by 5%...")
33
+ - Domain consensus ("It is widely accepted that...")
34
+ - Comparisons or enumerations of existing methods
35
+
36
+ **Does NOT need citation:**
37
+ - The author's own contributions or opinions
38
+ - Common knowledge ("Neural networks are computational models...")
39
+ - Transitional sentences and connective text
40
+ - Descriptions of the current paper's method
41
+
42
+ Output a mental list of citation positions, each with:
43
+ - The sentence or clause that needs a citation
44
+ - What kind of support it needs (foundational work, method origin, evidence, survey)
45
+ - 2-3 English search keywords
46
+
47
+ ### Step 2: Search Papers
48
+
49
+ For each citation position, search across appropriate platforms:
50
+
51
+ | Text Domain | Primary Search | Secondary Search |
52
+ |-------------|---------------|-----------------|
53
+ | Biomedical / Clinical | `search_pubmed` | `search_semantic`, `search_biorxiv`, `search_medrxiv` |
54
+ | Computer Science / AI / ML | `search_semantic` | `search_arxiv` |
55
+ | General / Cross-discipline | `search_semantic` | `search_pubmed` |
56
+ | Preprints / Cutting-edge | `search_arxiv`, `search_biorxiv` | `search_semantic` |
57
+
58
+ For each position, search 10-20 candidates. Use English search terms even for Chinese input text.
59
+
60
+ **Do NOT use** `search_google_scholar` for this workflow — use the five platforms above.
61
+
62
+ ### Step 3: Rank by Quality
63
+
64
+ Call `paper_quality_rank` with the candidate papers to get quality scores and CCF rankings.
65
+
66
+ The tool evaluates:
67
+ - **CCF rank** (A/B/C) for CS venues
68
+ - **Citation count** (log-scaled)
69
+ - **Publication year** (newer = better, within reason)
70
+ - **Author h-index** (if available)
71
+ - **arXiv penalty** (pure arXiv preprints score lower)
72
+
73
+ ### Step 4: Select Best Matches
74
+
75
+ For each citation position, pick the best 1-3 papers considering:
76
+
77
+ 1. **Semantic relevance** (most important) — does the paper actually discuss what the sentence claims?
78
+ 2. **Quality score** from Step 3 — prefer higher-ranked venues and more-cited papers
79
+ 3. **Recency** — prefer newer papers unless citing foundational/seminal work
80
+ 4. **Diversity** — avoid citing the same paper in too many positions; avoid citing only one research group
81
+
82
+ **Deduplication rules:**
83
+ - If the same paper matches multiple positions, use a single reference number across all positions
84
+ - If a sentence needs multiple citations (e.g., listing several approaches), group them: [3, 5, 7]
85
+ - Aim for 1-2 citations per position; 3 is the maximum unless enumerating methods
86
+
87
+ ### Step 5: Generate Output
88
+
89
+ Produce TWO sections:
90
+
91
+ #### Part 1: Annotated Text
92
+
93
+ The original text with [N] markers inserted at the correct positions.
94
+
95
+ Rules:
96
+ - Place markers at the END of the relevant clause or sentence, BEFORE the period
97
+ - Use sequential numbering starting from [1]
98
+ - Group multiple citations: [1, 2] or [3-5]
99
+ - Preserve ALL original text — do not modify wording, only insert markers
100
+
101
+ Example:
102
+ ```
103
+ Large language models have achieved remarkable performance across NLP tasks [1, 2]. However, these models often generate outputs misaligned with human values [3]. RLHF has emerged as a promising approach to address this challenge [4, 5].
104
+ ```
105
+
106
+ #### Part 2: Reference List
107
+
108
+ Numbered APA-format references at the end. Each entry includes:
109
+ - Authors (first author et al. if >3 authors)
110
+ - Year in parentheses
111
+ - Title
112
+ - Journal/conference name
113
+ - DOI or URL (if available)
114
+
115
+ Format:
116
+ ```
117
+ [1] Brown, T. et al. (2020). Language Models are Few-Shot Learners. Advances in Neural Information Processing Systems, 33, 1877-1901.
118
+ [2] Touvron, H. et al. (2023). LLaMA: Open and Efficient Foundation Language Models. arXiv:2302.13971.
119
+ ```
120
+
121
+ For papers with DOI, append the DOI link.
122
+ For arXiv papers, use the arXiv ID format.
123
+ For PubMed papers, include the PMID.
124
+
125
+ ## Chinese Input
126
+
127
+ When user provides Chinese text:
128
+ - Search keywords must be in **English** (translate internally)
129
+ - Annotated text output remains in **Chinese** (preserve original)
130
+ - Reference list uses English (paper titles, author names stay in original language)
131
+ - Respond in Chinese when communicating with the user
132
+
133
+ ## Quality Checklist
134
+
135
+ Before returning results, verify:
136
+
137
+ - [ ] Every [N] marker corresponds to a real paper in the reference list
138
+ - [ ] Every paper in the reference list has been verified via search tools (not hallucinated)
139
+ - [ ] Citation positions are reasonable (factual claims have citations, opinions don't)
140
+ - [ ] No duplicate entries in the reference list
141
+ - [ ] Sequential numbering with no gaps
142
+ - [ ] Reference list is in APA format
143
+
144
+ ## Constraints
145
+
146
+ - **Never fabricate papers** — every citation must come from tool search results
147
+ - **Never modify the user's original text** beyond inserting [N] markers
148
+ - Do not add citations to the author's own claims or contributions
149
+ - If a passage is too vague to find good citations, skip it rather than force a bad match
150
+ - Prefer published papers over preprints when both are available
@@ -65,6 +65,12 @@ metadata:
65
65
  | `get_semantic_recommendations` | Get paper recommendations based on a list of papers |
66
66
  | `get_semantic_recommendations_for_paper` | Get recommendations for a single paper |
67
67
 
68
+ ### Quality Evaluation
69
+
70
+ | Tool | Purpose |
71
+ |------|---------|
72
+ | `paper_quality_rank` | Rank papers by quality score (CCF classification, citations, year, h-index) |
73
+
68
74
  ### PDF Download & Full-text Reading
69
75
 
70
76
  | Tool | Purpose |