aiagents4pharma 1.30.2__py3-none-any.whl → 1.30.3__py3-none-any.whl

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 (38) hide show
  1. aiagents4pharma/talk2scholars/__init__.py +2 -0
  2. aiagents4pharma/talk2scholars/agents/__init__.py +8 -0
  3. aiagents4pharma/talk2scholars/configs/__init__.py +2 -0
  4. aiagents4pharma/talk2scholars/configs/agents/__init__.py +2 -0
  5. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +2 -0
  6. aiagents4pharma/talk2scholars/configs/app/__init__.py +2 -0
  7. aiagents4pharma/talk2scholars/configs/tools/__init__.py +9 -0
  8. aiagents4pharma/talk2scholars/state/__init__.py +4 -2
  9. aiagents4pharma/talk2scholars/tests/test_s2_multi.py +10 -8
  10. aiagents4pharma/talk2scholars/tests/test_s2_search.py +9 -5
  11. aiagents4pharma/talk2scholars/tests/test_s2_single.py +7 -7
  12. aiagents4pharma/talk2scholars/tests/test_zotero_path.py +25 -11
  13. aiagents4pharma/talk2scholars/tests/test_zotero_read.py +49 -35
  14. aiagents4pharma/talk2scholars/tests/test_zotero_write.py +10 -10
  15. aiagents4pharma/talk2scholars/tools/__init__.py +3 -0
  16. aiagents4pharma/talk2scholars/tools/pdf/__init__.py +4 -2
  17. aiagents4pharma/talk2scholars/tools/s2/__init__.py +9 -0
  18. aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +9 -135
  19. aiagents4pharma/talk2scholars/tools/s2/search.py +8 -114
  20. aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +8 -126
  21. aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +7 -0
  22. aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +194 -0
  23. aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +175 -0
  24. aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +186 -0
  25. aiagents4pharma/talk2scholars/tools/zotero/__init__.py +2 -0
  26. aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +5 -0
  27. aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +167 -0
  28. aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +78 -0
  29. aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +197 -0
  30. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +1 -1
  31. aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +9 -136
  32. aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +14 -48
  33. aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +22 -147
  34. {aiagents4pharma-1.30.2.dist-info → aiagents4pharma-1.30.3.dist-info}/METADATA +1 -1
  35. {aiagents4pharma-1.30.2.dist-info → aiagents4pharma-1.30.3.dist-info}/RECORD +38 -31
  36. {aiagents4pharma-1.30.2.dist-info → aiagents4pharma-1.30.3.dist-info}/WHEEL +0 -0
  37. {aiagents4pharma-1.30.2.dist-info → aiagents4pharma-1.30.3.dist-info}/licenses/LICENSE +0 -0
  38. {aiagents4pharma-1.30.2.dist-info → aiagents4pharma-1.30.3.dist-info}/top_level.txt +0 -0
@@ -13,8 +13,8 @@ from langgraph.prebuilt import InjectedState
13
13
  from langgraph.types import Command, interrupt
14
14
  from pydantic import BaseModel, Field
15
15
  from .utils.zotero_path import fetch_papers_for_save
16
+ from .utils.review_helper import ReviewData
16
17
 
17
- # pylint: disable=R0914,R0911,R0912,R0915
18
18
  # Configure logging
19
19
  logging.basicConfig(level=logging.INFO)
20
20
  logger = logging.getLogger(__name__)
@@ -71,43 +71,12 @@ def zotero_review(
71
71
  "Please retrieve papers using Zotero Read or Semantic Scholar first."
72
72
  )
73
73
 
74
- # Prepare papers summary for review
75
- papers_summary = []
76
- for paper_id, paper in list(fetched_papers.items())[
77
- :5
78
- ]: # Limit to 5 papers for readability
79
- logger.info("Paper ID: %s", paper_id)
80
- title = paper.get("Title", "N/A")
81
- authors = ", ".join(
82
- [author.split(" (ID: ")[0] for author in paper.get("Authors", [])[:2]]
83
- )
84
- if len(paper.get("Authors", [])) > 2:
85
- authors += " et al."
86
- papers_summary.append(f"- {title} by {authors}")
87
-
88
- if len(fetched_papers) > 5:
89
- papers_summary.append(f"... and {len(fetched_papers) - 5} more papers")
90
-
91
- papers_preview = "\n".join(papers_summary)
92
- total_papers = len(fetched_papers)
93
-
94
- # Prepare review information
95
- review_info = {
96
- "action": "save_to_zotero",
97
- "collection_path": collection_path,
98
- "total_papers": total_papers,
99
- "papers_preview": papers_preview,
100
- "message": (
101
- f"Would you like to save {total_papers} papers to Zotero "
102
- f"collection '{collection_path}'? Please respond with a structured decision "
103
- f"using one of the following options: 'approve', 'reject', or 'custom' "
104
- f"(with a custom_path)."
105
- ),
106
- }
74
+ # Create review data object to organize variables
75
+ review_data = ReviewData(collection_path, fetched_papers, tool_call_id, state)
107
76
 
108
77
  try:
109
78
  # Interrupt the graph to get human approval
110
- human_review = interrupt(review_info)
79
+ human_review = interrupt(review_data.review_info)
111
80
  # Process human response using structured output via LLM
112
81
  llm_model = state.get("llm_model")
113
82
  if llm_model is None:
@@ -125,15 +94,12 @@ def zotero_review(
125
94
  update={
126
95
  "messages": [
127
96
  ToolMessage(
128
- content=(
129
- f"Human approved saving {total_papers} papers to Zotero "
130
- f"collection '{collection_path}'."
131
- ),
97
+ content=review_data.get_approval_message(),
132
98
  tool_call_id=tool_call_id,
133
99
  )
134
100
  ],
135
101
  "zotero_write_approval_status": {
136
- "collection_path": collection_path,
102
+ "collection_path": review_data.collection_path,
137
103
  "approved": True,
138
104
  },
139
105
  }
@@ -146,9 +112,8 @@ def zotero_review(
146
112
  update={
147
113
  "messages": [
148
114
  ToolMessage(
149
- content=(
150
- f"Human approved saving papers to custom Zotero "
151
- f"collection '{decision_response.custom_path}'."
115
+ content=review_data.get_custom_path_approval_message(
116
+ decision_response.custom_path
152
117
  ),
153
118
  tool_call_id=tool_call_id,
154
119
  )
@@ -180,19 +145,20 @@ def zotero_review(
180
145
  "messages": [
181
146
  ToolMessage(
182
147
  content=(
183
- f"REVIEW REQUIRED: Would you like to save {total_papers} papers "
184
- f"to Zotero collection '{collection_path}'?\n\n"
185
- f"Papers to save:\n{papers_preview}\n\n"
148
+ f"REVIEW REQUIRED: Would you like to save "
149
+ f"{review_data.total_papers} papers to Zotero collection "
150
+ f"'{review_data.collection_path}'?\n\n"
151
+ f"Papers to save:\n{review_data.papers_preview}\n\n"
186
152
  "Please respond with 'Yes' to confirm or 'No' to cancel."
187
153
  ),
188
154
  tool_call_id=tool_call_id,
189
155
  )
190
156
  ],
191
157
  "zotero_write_approval_status": {
192
- "collection_path": collection_path,
158
+ "collection_path": review_data.collection_path,
193
159
  "papers_reviewed": True,
194
160
  "approved": False, # Not approved yet
195
- "papers_count": total_papers,
161
+ "papers_count": review_data.total_papers,
196
162
  },
197
163
  }
198
164
  )
@@ -6,22 +6,15 @@ This tool is used to save fetched papers to Zotero library after human approval.
6
6
 
7
7
  import logging
8
8
  from typing import Annotated, Any
9
- import hydra
10
- from pyzotero import zotero
11
9
  from langchain_core.messages import ToolMessage
12
10
  from langchain_core.tools import tool
13
11
  from langchain_core.tools.base import InjectedToolCallId
14
12
  from langgraph.types import Command
15
13
  from langgraph.prebuilt import InjectedState
16
14
  from pydantic import BaseModel, Field
17
- from .utils.zotero_path import (
18
- find_or_create_collection,
19
- fetch_papers_for_save,
20
- )
15
+ from .utils.write_helper import ZoteroWriteData
21
16
 
22
17
 
23
- # pylint: disable=R0914,R0911,R0912,R0915
24
-
25
18
  # Configure logging
26
19
  logging.basicConfig(level=logging.INFO)
27
20
  logger = logging.getLogger(__name__)
@@ -61,155 +54,37 @@ def zotero_write(
61
54
  Returns:
62
55
  Command[Any]: The save results and related information.
63
56
  """
64
- # Load hydra configuration
65
- with hydra.initialize(version_base=None, config_path="../../configs"):
66
- cfg = hydra.compose(
67
- config_name="config", overrides=["tools/zotero_write=default"]
68
- )
69
- cfg = cfg.tools.zotero_write
70
- logger.info("Loaded configuration for Zotero write tool")
71
- logger.info(
72
- "Saving fetched papers to Zotero under collection path: %s", collection_path
73
- )
74
-
75
- # Initialize Zotero client
76
- zot = zotero.Zotero(cfg.user_id, cfg.library_type, cfg.api_key)
77
-
78
- # Use our utility function to fetch papers from state
79
- fetched_papers = fetch_papers_for_save(state)
80
-
81
- if not fetched_papers:
82
- raise ValueError(
83
- "No fetched papers were found to save. "
84
- "Please retrieve papers using Zotero Read or Semantic Scholar first."
85
- )
86
-
87
- # Normalize the requested collection path
88
- normalized_path = collection_path.rstrip("/").lower()
89
-
90
- # Use our utility function to find or optionally create the collection
91
- # First try to find the exact collection
92
- matched_collection_key = find_or_create_collection(
93
- zot, normalized_path, create_missing=False # First try without creating
94
- )
57
+ # Create write data object to organize variables
58
+ write_data = ZoteroWriteData(tool_call_id, collection_path, state)
95
59
 
96
- if not matched_collection_key:
97
- # Get all collection names without hierarchy for clearer display
98
- available_collections = zot.collections()
99
- collection_names = [col["data"]["name"] for col in available_collections]
100
- names_display = ", ".join(collection_names)
60
+ try:
61
+ # Process the write operation
62
+ results = write_data.process_write()
101
63
 
102
64
  return Command(
103
65
  update={
104
66
  "messages": [
105
67
  ToolMessage(
106
- content=(
107
- f"Error: The collection path '{collection_path}' does "
108
- f"not exist in Zotero. "
109
- f"Available collections are: {names_display}. "
110
- f"Please try saving to one of these existing collections."
111
- ),
68
+ content=results["content"],
112
69
  tool_call_id=tool_call_id,
70
+ artifact=results["fetched_papers"],
113
71
  )
114
72
  ],
73
+ "zotero_write_approval_status": {}, # Clear approval info
115
74
  }
116
75
  )
117
-
118
- # Format papers for Zotero and assign to the specified collection
119
- zotero_items = []
120
- for paper_id, paper in fetched_papers.items():
121
- title = paper.get("Title", "N/A")
122
- abstract = paper.get("Abstract", "N/A")
123
- publication_date = paper.get("Publication Date", "N/A") # Use Publication Date
124
- url = paper.get("URL", "N/A")
125
- citations = paper.get("Citation Count", "N/A")
126
- venue = paper.get("Venue", "N/A")
127
- publication_venue = paper.get("Publication Venue", "N/A")
128
- journal_name = paper.get("Journal Name", "N/A")
129
- journal_volume = paper.get("Journal Volume", "N/A")
130
- journal_pages = paper.get("Journal Pages", "N/A")
131
-
132
- # Convert Authors list to Zotero format
133
- authors = [
134
- (
135
- {
136
- "creatorType": "author",
137
- "firstName": name.split(" ")[0],
138
- "lastName": " ".join(name.split(" ")[1:]),
76
+ except ValueError as e:
77
+ # Only handle collection not found errors with a Command
78
+ if "collection path" in str(e).lower():
79
+ return Command(
80
+ update={
81
+ "messages": [
82
+ ToolMessage(
83
+ content=str(e),
84
+ tool_call_id=tool_call_id,
85
+ )
86
+ ],
139
87
  }
140
- if " " in name
141
- else {"creatorType": "author", "lastName": name}
142
88
  )
143
- for name in [
144
- author.split(" (ID: ")[0] for author in paper.get("Authors", [])
145
- ]
146
- ]
147
-
148
- zotero_items.append(
149
- {
150
- "itemType": "journalArticle",
151
- "title": title,
152
- "abstractNote": abstract,
153
- "date": publication_date, # Now saving full publication date
154
- "url": url,
155
- "extra": f"Paper ID: {paper_id}\nCitations: {citations}",
156
- "collections": [matched_collection_key],
157
- "publicationTitle": (
158
- publication_venue if publication_venue != "N/A" else venue
159
- ), # Use publication venue if available
160
- "journalAbbreviation": journal_name, # Save Journal Name
161
- "volume": (
162
- journal_volume if journal_volume != "N/A" else None
163
- ), # Save Journal Volume
164
- "pages": (
165
- journal_pages if journal_pages != "N/A" else None
166
- ), # Save Journal Pages
167
- "creators": authors, # Save authors list properly
168
- }
169
- )
170
-
171
- # Save items to Zotero
172
- try:
173
- response = zot.create_items(zotero_items)
174
- logger.info("Papers successfully saved to Zotero: %s", response)
175
- except Exception as e:
176
- logger.error("Error saving to Zotero: %s", str(e))
177
- raise RuntimeError(f"Error saving papers to Zotero: {str(e)}") from e
178
-
179
- # Get the collection name for better feedback
180
- collections = zot.collections()
181
- collection_name = ""
182
- for col in collections:
183
- if col["key"] == matched_collection_key:
184
- collection_name = col["data"]["name"]
185
- break
186
-
187
- content = (
188
- f"Save was successful. Papers have been saved to Zotero collection '{collection_name}' "
189
- f"with the requested path '{collection_path}'.\n"
190
- )
191
- content += "Summary of saved papers:\n"
192
- content += f"Number of articles saved: {len(fetched_papers)}\n"
193
- content += f"Query: {state.get('query', 'N/A')}\n"
194
- top_papers = list(fetched_papers.values())[:2]
195
- top_papers_info = "\n".join(
196
- [
197
- f"{i+1}. {paper.get('Title', 'N/A')} ({paper.get('URL', 'N/A')})"
198
- for i, paper in enumerate(top_papers)
199
- ]
200
- )
201
- content += "Here are a few of these articles:\n" + top_papers_info
202
-
203
- # Clear the approval info so it's not reused
204
- return Command(
205
- update={
206
- "messages": [
207
- ToolMessage(
208
- content=content,
209
- tool_call_id=tool_call_id,
210
- artifact=fetched_papers,
211
- )
212
- ],
213
- "zotero_write_approval_status": {}, # Clear approval info
214
- }
215
- )
89
+ # Let other ValueErrors (like no papers) propagate up
90
+ raise
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiagents4pharma
3
- Version: 1.30.2
3
+ Version: 1.30.3
4
4
  Summary: AI Agents for drug discovery, drug development, and other pharmaceutical R&D.
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -134,17 +134,17 @@ aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py,sha256=8eoxR-VH
134
134
  aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py,sha256=qsVlDCGGDkUCv-R5_xFGhrtLS7P0CfagnM2qATwiOFM,1333
135
135
  aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py,sha256=7gwwtfzKhB8GuOBD47XRi0NprwEXkOzwNl5eeu-hDTI,86
136
136
  aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py,sha256=m5p0yoJb7I19ua5yeQfXPf7c4r6S1XPwttsrM7Qoy94,9336
137
- aiagents4pharma/talk2scholars/__init__.py,sha256=gphERyVKZHvOnMQsml7TIHlaIshHJ75R1J3FKExkfuY,120
138
- aiagents4pharma/talk2scholars/agents/__init__.py,sha256=inLJpRDlT80RNSi3OFNi2lpbbTisQgzNkMYTvnhFjVY,203
137
+ aiagents4pharma/talk2scholars/__init__.py,sha256=NOZxTklAH1j1ggu97Ib8Xn9LCKudEWt-8dx8w7yxVD8,180
138
+ aiagents4pharma/talk2scholars/agents/__init__.py,sha256=c_0Pk85bt-RfK5RMyALM3MXo3qXVMoYS7BOqM9wuFME,317
139
139
  aiagents4pharma/talk2scholars/agents/main_agent.py,sha256=KdKbnc-5zxktLUkzEZHC3bvn8_iKa8Kk4So90i48cdE,3275
140
140
  aiagents4pharma/talk2scholars/agents/paper_download_agent.py,sha256=wrK9CPy5evH56fyOZ2BlkBfY5aEj6tefc4jSDPVzYvs,3041
141
141
  aiagents4pharma/talk2scholars/agents/pdf_agent.py,sha256=xt_bgCTVJ6jOCkhc_rHh8pngq4uS8kuNOevuP3eC-sA,3702
142
142
  aiagents4pharma/talk2scholars/agents/s2_agent.py,sha256=ua1bjKE2HBKZuLnDn8me5fuV1lSvdZbwAlo3Yp27TT4,4659
143
143
  aiagents4pharma/talk2scholars/agents/zotero_agent.py,sha256=f11kNqtyZnpBiIf3Fe9gU0WqQ0-ohhngTKl-o0u997Q,4442
144
- aiagents4pharma/talk2scholars/configs/__init__.py,sha256=tf2gz8n7M4ko6xLdX_C925ELVIxoP6SgkPcbeh59ad4,151
144
+ aiagents4pharma/talk2scholars/configs/__init__.py,sha256=Y9-4PxsNCMoxyyQgDSbPByJnO9wnyem5SYL3eOZt1HY,189
145
145
  aiagents4pharma/talk2scholars/configs/config.yaml,sha256=-8X0_gTmjEuXAeIrnppw3Npy8HICelHZOvTKEScI-rs,596
146
- aiagents4pharma/talk2scholars/configs/agents/__init__.py,sha256=yyh7PB2oY_JulnpSQCWS4wwCH_uzIdt47O2Ay48x_oU,75
147
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py,sha256=64GEWAoKOd_YHLi27eSOcOC5eSLK0IG_FNra3ZBt02Y,146
146
+ aiagents4pharma/talk2scholars/configs/agents/__init__.py,sha256=plv5Iw34gvbGZbRyJapvoOiiFXekRQIwjV_yy5AR_SI,104
147
+ aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py,sha256=D94LW4cXLmJe4dNl5qoR9QN0JnBqGLbQDgDLqhCNUE0,213
148
148
  aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py,sha256=fqQQ-GlRcbzru2KmEk3oMma0R6_SzGM8dOXzYeU4oVA,46
149
149
  aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml,sha256=GZRqZoUy8eAWXyd9GJDh-A4mYSJOhnkid6TaIJTGBeU,1192
150
150
  aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/__init__.py,sha256=fqQQ-GlRcbzru2KmEk3oMma0R6_SzGM8dOXzYeU4oVA,46
@@ -153,10 +153,10 @@ aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py,
153
153
  aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml,sha256=UIYkr060IpoLHMXVPxGAjrkCJSjX7H0DzcFSasyW6sE,1185
154
154
  aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py,sha256=fqQQ-GlRcbzru2KmEk3oMma0R6_SzGM8dOXzYeU4oVA,46
155
155
  aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml,sha256=09nMAlI4CTLlss03trR0ZaEeLdABQfkwUUE6ZCK4WzY,718
156
- aiagents4pharma/talk2scholars/configs/app/__init__.py,sha256=JoSZV6N669kGMv5zLDszwf0ZjcRHx9TJfIqGhIIdPXE,70
156
+ aiagents4pharma/talk2scholars/configs/app/__init__.py,sha256=tXpOW3R4eAfNoqvoaHfabSG-DcMHmUGSTg_4zH_vlgw,94
157
157
  aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py,sha256=fqQQ-GlRcbzru2KmEk3oMma0R6_SzGM8dOXzYeU4oVA,46
158
158
  aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml,sha256=A6nYjrgzEyRv5JYsGN7oqNX4-tufMBZ6mg-A7bMX6V4,906
159
- aiagents4pharma/talk2scholars/configs/tools/__init__.py,sha256=GwpgnRrfjyZDVsangewSVTG3H3GBYM6s_YaQd9-zI10,238
159
+ aiagents4pharma/talk2scholars/configs/tools/__init__.py,sha256=6pHPF0ZGY78SD6KPMukd_xrfO1ocVXcyrsrB-kz-OnI,402
160
160
  aiagents4pharma/talk2scholars/configs/tools/download_arxiv_paper/__init__.py,sha256=fqQQ-GlRcbzru2KmEk3oMma0R6_SzGM8dOXzYeU4oVA,46
161
161
  aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py,sha256=fqQQ-GlRcbzru2KmEk3oMma0R6_SzGM8dOXzYeU4oVA,46
162
162
  aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml,sha256=comNgL9hRpH--IWuEsrN6hV5WdrJmh-ZsRh7hbryVhg,631
@@ -171,7 +171,7 @@ aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py,sha256=fqQQ-
171
171
  aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml,sha256=ifOtX8Huj1LPHF_rRe1JxWgrDaLiKg6HVoQen_1R1Ls,1223
172
172
  aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py,sha256=fqQQ-GlRcbzru2KmEk3oMma0R6_SzGM8dOXzYeU4oVA,46
173
173
  aiagents4pharma/talk2scholars/configs/tools/zotero_write/default.yaml,sha256=gB7y7pznviQUzu49Eu4ONNkjQjT8wPKNSw6S_vfd9kI,1222
174
- aiagents4pharma/talk2scholars/state/__init__.py,sha256=S6SxlszIMZSIMJehjevPF9sKyR-PAwWb5TEdo6xWXE8,103
174
+ aiagents4pharma/talk2scholars/state/__init__.py,sha256=ReScKLpEvedq4P6ww52NRQS0Xr6SSQV7hqoQ83Mt75U,138
175
175
  aiagents4pharma/talk2scholars/state/state_talk2scholars.py,sha256=8ZFfv55tXO3LU-2DzKC5JjH4_ryodgu-H1ieKBmVFvw,2844
176
176
  aiagents4pharma/talk2scholars/tests/__init__.py,sha256=U3PsTiUZaUBD1IZanFGkDIOdFieDVJtGKQ5-woYUo8c,45
177
177
  aiagents4pharma/talk2scholars/tests/test_llm_main_integration.py,sha256=FBRqS06IKJYFOudQEHQr-9oJ4tftkH-gTCowTAqwWSg,3686
@@ -183,39 +183,46 @@ aiagents4pharma/talk2scholars/tests/test_question_and_answer_tool.py,sha256=te6w
183
183
  aiagents4pharma/talk2scholars/tests/test_routing_logic.py,sha256=g79tG68ZrUOL3-duCCJwvFK6OieR5KedRf3yTUDqIFk,2784
184
184
  aiagents4pharma/talk2scholars/tests/test_s2_agent.py,sha256=BhW1wGc-wUPS4fwNBQRtBXJaJ_i7L6t_G9Bq57fK7rI,7784
185
185
  aiagents4pharma/talk2scholars/tests/test_s2_display.py,sha256=w1TqgEdl9WpW_A2Ud1slfI5fkRFkKtKadAlkEfSLOZk,2247
186
- aiagents4pharma/talk2scholars/tests/test_s2_multi.py,sha256=0XGtl6BigfDI6zpblQlJmKqml-fQ30HQB12PMCOl0h8,11115
186
+ aiagents4pharma/talk2scholars/tests/test_s2_multi.py,sha256=VCTfexhtX7FgWOBS0YtSm1zghbByZnni1NBLGVTJVGI,11166
187
187
  aiagents4pharma/talk2scholars/tests/test_s2_query.py,sha256=hEcBt142nn_bKV9lor__Yk4LusgE1tN5dA-qpT606Bc,2443
188
188
  aiagents4pharma/talk2scholars/tests/test_s2_retrieve.py,sha256=YtA2nbPRtoSR7mPqEjqLF5ERGVzTfeULztsNoCI48X8,2003
189
- aiagents4pharma/talk2scholars/tests/test_s2_search.py,sha256=wuXEke7_bmancvlh7C5WFbXRbpcUVrYGhD_X47tOt3M,9834
190
- aiagents4pharma/talk2scholars/tests/test_s2_single.py,sha256=l0uBxwjqojlmT65j7WK3R-u2PMyPcMf95yLGApSycO0,10274
189
+ aiagents4pharma/talk2scholars/tests/test_s2_search.py,sha256=mCGpoCYVn0SJ9BPcEjTz2MLy_K2XJIxvPngwsMoKijA,9945
190
+ aiagents4pharma/talk2scholars/tests/test_s2_single.py,sha256=KjSh7V2cl1IuO_M9O6dj0vnMHr13H-xKxia_ZgT4qag,10313
191
191
  aiagents4pharma/talk2scholars/tests/test_state.py,sha256=_iHXvoZnU_eruf8l1sQKBSCIVnxNkH_9VzkVtZZA6bY,384
192
192
  aiagents4pharma/talk2scholars/tests/test_zotero_agent.py,sha256=fQDQj28uFNC1TyMPzNaNfDJacuw1_DqwGiX6IgliR3Y,6130
193
193
  aiagents4pharma/talk2scholars/tests/test_zotero_human_in_the_loop.py,sha256=YelLQu9Y_r1SNQsC1xoLHJoJ3soIZtBt1MFbbNhY-Dg,10744
194
- aiagents4pharma/talk2scholars/tests/test_zotero_path.py,sha256=bgVPlmNmC7OVOvKDL8fn311rNgv59DkWFd-L1PDpCOQ,18157
195
- aiagents4pharma/talk2scholars/tests/test_zotero_read.py,sha256=r3DweOxG6gycTbR_uIB6V84drdbVi6GRQDNfdyESN8U,15216
196
- aiagents4pharma/talk2scholars/tests/test_zotero_write.py,sha256=QtB5FrWu4wNOR8VKFDhaNh1Lrki8fp_GQj0Zkst13bQ,6051
197
- aiagents4pharma/talk2scholars/tools/__init__.py,sha256=UtGutYNNaRcr2nOmT_XqbTiaJpgVYKo3KVGVPFVrX2Y,107
194
+ aiagents4pharma/talk2scholars/tests/test_zotero_path.py,sha256=i1bS-5uSv25z4UFrc_W5rKZ0bwOg6ZK5cwLHMkjWgt8,18592
195
+ aiagents4pharma/talk2scholars/tests/test_zotero_read.py,sha256=ecu9C-RWaLNgmAFqGN8s7dzCrtODqXOSZDievzjtAfQ,15511
196
+ aiagents4pharma/talk2scholars/tests/test_zotero_write.py,sha256=qWlO0XoZJ6vxUxgisjYv9Np87CoTEDxiQBEOhdj9foo,6111
197
+ aiagents4pharma/talk2scholars/tools/__init__.py,sha256=c8pYHDqR9P0Frz2jWjbvyizfSTBMlMFzGsiQzx2KC9c,189
198
198
  aiagents4pharma/talk2scholars/tools/paper_download/__init__.py,sha256=0XmPLEqCply536Y1uWksmHYjlgNWcmcMpZx63XvGEFI,413
199
199
  aiagents4pharma/talk2scholars/tools/paper_download/abstract_downloader.py,sha256=nwVhRUqkdta3WLgd9roAWpx-bhJm3aAgJLx4RSYSJXQ,1327
200
200
  aiagents4pharma/talk2scholars/tools/paper_download/arxiv_downloader.py,sha256=hM9fdbwtOxuW1mpAfmfbILTI7kSVALgrGpjC2vMsvf8,3970
201
201
  aiagents4pharma/talk2scholars/tools/paper_download/download_arxiv_input.py,sha256=zndAnNFRBztuBK-tpW9UyYsGL8tB3gFjYhiTq6nzZu4,2203
202
- aiagents4pharma/talk2scholars/tools/pdf/__init__.py,sha256=WOm-o-fFzyjFZBaHg658Gjzdiu1Kt-h9xvzvw0hR7aE,103
202
+ aiagents4pharma/talk2scholars/tools/pdf/__init__.py,sha256=DPpOfON3AySko5EBBAe_3udOoSaAdQWNyGeNvJyV5R8,138
203
203
  aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py,sha256=tNv0frCr0dxA0lfbwf5yudKRyWtbuRGMwqW5mk9u4eE,8797
204
- aiagents4pharma/talk2scholars/tools/s2/__init__.py,sha256=wytqCmGm8Fbl8y5qLdIkxhhG8VHLYMifCGjbH_LK2Fc,258
204
+ aiagents4pharma/talk2scholars/tools/s2/__init__.py,sha256=u_qh1bpDhVdyTr_S2wVfPwQ_lMz77NQ-ZDWtOP_PWzo,420
205
205
  aiagents4pharma/talk2scholars/tools/s2/display_results.py,sha256=UR0PtEHGDpOhPH0Di5HT8-Fip2RkEMTJgzROsChb1gc,2959
206
- aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py,sha256=FeuZfx8TQ7kB68_9RqDwyhB5ut14YedlHVzNIbXHXno,7744
206
+ aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py,sha256=N6GwG3oCQFEcntpjTQObAELzM5OpZq0u9J9-gUWU2kc,2716
207
207
  aiagents4pharma/talk2scholars/tools/s2/query_results.py,sha256=5yXuHqz5UKO9BbovEUnqgjcMvqVG4vp9VJO8Zaz5N1w,2029
208
208
  aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py,sha256=llzMMnEQKeYVamJbF4_DTMx-BgVe79vwDcUIFGLrmUY,2615
209
- aiagents4pharma/talk2scholars/tools/s2/search.py,sha256=L7myD4ET_iTTO4LZ9V8zU6y4KHSDSn5HylG9Z1i1Wo4,6722
210
- aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py,sha256=dLLEq7mwOMfkO3eydFcZzB3mU3N_PmX3vCTwJSh7lYA,7474
211
- aiagents4pharma/talk2scholars/tools/zotero/__init__.py,sha256=Hnd_R0q_Xyf1CNCdHCdsCkbo0sRKHKLWBLdoHZDOK1A,128
212
- aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py,sha256=3tmZkF29SjAIfZFl-tKUq3_Yf9u-ujHAcrKBRw-rZ-w,7131
213
- aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py,sha256=0RS6J5FCHaBdQNK31RQMphZS7kiimCwV6lPeatAg0x8,7538
214
- aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py,sha256=BNOOIBoGXyurBC9v4qrSyihgYkfMUb_4mCQYIaWzwEE,7954
215
- aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py,sha256=Ll8YQZj9sYJpXmoGxj_0ZcuEHDj06_CUqdDlTlevGL4,53
216
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py,sha256=AFv6s2nkLFSobGCQ0a8uK5C0h50GK-x2TYGY1yjv0Gk,6365
217
- aiagents4pharma-1.30.2.dist-info/licenses/LICENSE,sha256=IcIbyB1Hyk5ZDah03VNQvJkbNk2hkBCDqQ8qtnCvB4Q,1077
218
- aiagents4pharma-1.30.2.dist-info/METADATA,sha256=gqMqFcmqMJ97IA_fcg_5XWnbQtZJxF_fb9_CXwEi75c,13267
219
- aiagents4pharma-1.30.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
220
- aiagents4pharma-1.30.2.dist-info/top_level.txt,sha256=-AH8rMmrSnJtq7HaAObS78UU-cTCwvX660dSxeM7a0A,16
221
- aiagents4pharma-1.30.2.dist-info/RECORD,,
209
+ aiagents4pharma/talk2scholars/tools/s2/search.py,sha256=NGzo1rF5VJJuZJbSLDwy2f220wSh7DWEw6xT1qQA2V0,2452
210
+ aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py,sha256=7VivBGHcmaJZN7v7gYwddC-rfrDHaZo74pSNBYlJ2xU,2673
211
+ aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py,sha256=wBTPVgiXbmIJUMouOQRwojgk5PJXeEinDJzHzEToZbU,229
212
+ aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py,sha256=rrR0DRNeGHpYcONZS7oS-VCSWBL5zNALU4m7IF6Yxng,7268
213
+ aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py,sha256=_eP7q4ZTSWisEF4Stffe-IpR2MD9WrQ0u3jbbeJBRLU,6363
214
+ aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py,sha256=ahTDT0lp5VRZS5hLL3-hsHx4wB3LUVY2OBTCTEJyR3Y,6983
215
+ aiagents4pharma/talk2scholars/tools/zotero/__init__.py,sha256=wXiQILLq-utV35PkDUpm_F074mG9yRMyGQAFlr9UAOw,197
216
+ aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py,sha256=B21TOdB1nR--2Ug6Zx7nYjAKfCbndMF4L-cWcHPBWII,2267
217
+ aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py,sha256=iqwpolg7GWAjXizubLrPaAsgOpsOhKz-tFRyLOiBvC0,6325
218
+ aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py,sha256=KnDcnUBB0lwMcxNpC3hsVnICWkj23MDAePdHlK-Kekk,3024
219
+ aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py,sha256=uIyKZSFB07-zd3vjS9ABL0r6fdBX9JHw60j8oUfxHQs,209
220
+ aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py,sha256=6f2yu5admNZp7xw5VW2TFGF4wh_oyVn9aLaQF47FLMc,6038
221
+ aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py,sha256=IPD1V9yrBYaDnRe7sR6PrpwR82OBJbA2P_Tc6RbxAbM,2748
222
+ aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py,sha256=ALwLecy1QVebbsmXJiDj1GhGmyhq2R2tZlAyEl1vfhw,7410
223
+ aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py,sha256=oIrfbOySgts50ksHKyjcWjRkPRIS88g3Lc0v9mBkU8w,6375
224
+ aiagents4pharma-1.30.3.dist-info/licenses/LICENSE,sha256=IcIbyB1Hyk5ZDah03VNQvJkbNk2hkBCDqQ8qtnCvB4Q,1077
225
+ aiagents4pharma-1.30.3.dist-info/METADATA,sha256=o2tSqS8dWMl2KcUyDHQiXO87DEWyZlRqbVT6JlQvssM,13267
226
+ aiagents4pharma-1.30.3.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
227
+ aiagents4pharma-1.30.3.dist-info/top_level.txt,sha256=-AH8rMmrSnJtq7HaAObS78UU-cTCwvX660dSxeM7a0A,16
228
+ aiagents4pharma-1.30.3.dist-info/RECORD,,