academia-mcp 1.6.5__tar.gz → 1.6.7__tar.gz

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.
Files changed (46) hide show
  1. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/PKG-INFO +1 -1
  2. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/bitflip.py +7 -28
  3. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp.egg-info/PKG-INFO +1 -1
  4. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/pyproject.toml +1 -1
  5. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_bitflip.py +16 -0
  6. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/LICENSE +0 -0
  7. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/README.md +0 -0
  8. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/__init__.py +0 -0
  9. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/__main__.py +0 -0
  10. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/files.py +0 -0
  11. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/latex_templates/agents4science_2025/agents4science_2025.sty +0 -0
  12. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/latex_templates/agents4science_2025/agents4science_2025.tex +0 -0
  13. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/llm.py +0 -0
  14. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/pdf.py +0 -0
  15. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/py.typed +0 -0
  16. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/server.py +0 -0
  17. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/__init__.py +0 -0
  18. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/anthology_search.py +0 -0
  19. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/arxiv_download.py +0 -0
  20. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/arxiv_search.py +0 -0
  21. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/document_qa.py +0 -0
  22. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/hf_datasets_search.py +0 -0
  23. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/latex.py +0 -0
  24. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/py.typed +0 -0
  25. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/review.py +0 -0
  26. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/s2_citations.py +0 -0
  27. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/visit_webpage.py +0 -0
  28. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/tools/web_search.py +0 -0
  29. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp/utils.py +0 -0
  30. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp.egg-info/SOURCES.txt +0 -0
  31. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp.egg-info/dependency_links.txt +0 -0
  32. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp.egg-info/entry_points.txt +0 -0
  33. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp.egg-info/requires.txt +0 -0
  34. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/academia_mcp.egg-info/top_level.txt +0 -0
  35. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/setup.cfg +0 -0
  36. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_anthology_search.py +0 -0
  37. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_arxiv_download.py +0 -0
  38. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_arxiv_search.py +0 -0
  39. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_document_qa.py +0 -0
  40. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_extract_json.py +0 -0
  41. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_hf_dataset_search.py +0 -0
  42. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_latex.py +0 -0
  43. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_review.py +0 -0
  44. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_s2_citations.py +0 -0
  45. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_visit_webpage.py +0 -0
  46. {academia_mcp-1.6.5 → academia_mcp-1.6.7}/tests/test_web_search.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: academia-mcp
3
- Version: 1.6.5
3
+ Version: 1.6.7
4
4
  Summary: MCP server that provides different tools to search for scientific publications
5
5
  Author-email: Ilya Gusev <phoenixilya@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/IlyaGusev/academia_mcp
@@ -161,28 +161,6 @@ class BitFlipInfo(BaseModel): # type: ignore
161
161
  spark: str
162
162
 
163
163
 
164
- class Proposal(BaseModel): # type: ignore
165
- proposal_id: Optional[int] = None
166
- flip: str
167
- spark: str
168
- abstract: str
169
- experiments: List[str]
170
- risks_and_limitations: List[str]
171
-
172
-
173
- class ProposalScores(BaseModel): # type: ignore
174
- proposal_id: int
175
- spark: str
176
- strengths: List[str]
177
- weaknesses: List[str]
178
- novelty: int
179
- clarity: int
180
- significance: int
181
- feasibility: int
182
- soundness: int
183
- overall: int
184
-
185
-
186
164
  async def extract_bitflip_info(arxiv_id: str) -> str:
187
165
  """
188
166
  Extracts the Bit-Flip information from the arXiv paper.
@@ -244,12 +222,11 @@ async def generate_research_proposal(bit: str, additional_context: str = "") ->
244
222
  model_name=model_name, messages=[ChatMessage(role="user", content=prompt)]
245
223
  )
246
224
  result = extract_json(content)
247
- proposal: Proposal = Proposal.model_validate(result)
248
- proposal.proposal_id = random.randint(0, 1000000)
249
- return str(proposal.model_dump_json())
225
+ result["proposal_id"] = random.randint(0, 1000000)
226
+ return json.dumps(result, ensure_ascii=False)
250
227
 
251
228
 
252
- async def score_research_proposals(proposals: List[str | Dict[str, Any] | Any]) -> str:
229
+ async def score_research_proposals(proposals: str | List[str | Dict[str, Any] | Any]) -> str:
253
230
  """
254
231
  Scores a list of research proposals.
255
232
  Use proposals obtained with the `generate_research_proposal` tool.
@@ -276,10 +253,12 @@ async def score_research_proposals(proposals: List[str | Dict[str, Any] | Any])
276
253
  proposals: A list of JSON strings with research proposals.
277
254
  """
278
255
  model_name = os.getenv("BITFLIP_MODEL_NAME", "deepseek/deepseek-chat-v3-0324")
256
+ if isinstance(proposals, str):
257
+ proposals = json.loads(proposals)
258
+ assert isinstance(proposals, list), "Proposals should be a list of JSON strings"
279
259
  prompt = encode_prompt(SCORE_PROMPT, proposals=[str(p) for p in proposals])
280
260
  content = await llm_acall(
281
261
  model_name=model_name, messages=[ChatMessage(role="user", content=prompt)]
282
262
  )
283
263
  scores = extract_json(content)
284
- final_scores = [ProposalScores.model_validate(score) for score in scores]
285
- return json.dumps([s.model_dump() for s in final_scores], ensure_ascii=False)
264
+ return json.dumps(scores, ensure_ascii=False)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: academia-mcp
3
- Version: 1.6.5
3
+ Version: 1.6.7
4
4
  Summary: MCP server that provides different tools to search for scientific publications
5
5
  Author-email: Ilya Gusev <phoenixilya@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/IlyaGusev/academia_mcp
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "academia-mcp"
7
- version = "1.6.5"
7
+ version = "1.6.7"
8
8
  description = "MCP server that provides different tools to search for scientific publications"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -36,3 +36,19 @@ async def test_bitflip_score_research_proposals() -> None:
36
36
  assert scores[1]["strengths"] is not None
37
37
  assert scores[0]["weaknesses"] is not None
38
38
  assert scores[1]["weaknesses"] is not None
39
+
40
+
41
+ async def test_bitflip_score_research_proposals_str() -> None:
42
+ arxiv_id = "2503.07826"
43
+ bit = json.loads(await extract_bitflip_info(arxiv_id))["bit"]
44
+ proposal1 = await generate_research_proposal(bit=bit)
45
+ proposal2 = await generate_research_proposal(bit=bit)
46
+ scores = json.loads(await score_research_proposals(json.dumps([proposal1, proposal2])))
47
+ assert scores
48
+ assert len(scores) == 2
49
+ assert scores[0]["spark"] is not None
50
+ assert scores[1]["spark"] is not None
51
+ assert scores[0]["strengths"] is not None
52
+ assert scores[1]["strengths"] is not None
53
+ assert scores[0]["weaknesses"] is not None
54
+ assert scores[1]["weaknesses"] is not None
File without changes
File without changes
File without changes