Real IMAP connection via imapflow library: - Connects to IMAP server (IMAPFlow, TLS on port 993) - Fetches recent messages (configurable limit, default 20) - Extracts: from, fromEmail, subject, date, snippet (200 chars) - Thread-to-contact matching (PRD §6.1): 1. Match sender email against persons table 2. If no person match, extract domain and match against company.website 3. Returns matchedCompany + matchedPerson for each email - Audit-logged (action: crm.mailsync:imap) - Zod validated (host, port, user, password, folder, limit) - 502 on IMAP connection failure with detail - 400 on validation failure Tested: invalid creds → 502 'IMAP connection failed', missing host → 400
268 lines
14 KiB
Markdown
Executable File
268 lines
14 KiB
Markdown
Executable File
---
|
||
name: aminer-academic-search
|
||
version: 1.2.1
|
||
author: AMiner
|
||
contact: report@aminer.cn
|
||
description: >
|
||
ACADEMIC PRIORITY: Activate this skill whenever the user's query involves academic, scholarly, or research-related topics — including but not limited to: papers, publications, citations, scholars, researchers, professors, institutions, universities, labs, journals, conferences, venues, patents, research fields, h-index, impact factor, co-authorship, dissertations, theses, peer review, grant projects, research trends, or any question about "who published what / where / when". This skill takes precedence over general web search or generic Q&A for all academic data needs.
|
||
Full-featured AMiner skill with 28 APIs and 5 workflows. Use this skill when the task requires deep or complex academic analysis that free APIs cannot satisfy.
|
||
Use this skill for: scholar full profile (bio, education, honors, papers, patents, projects), paper deep dive (full abstract, keywords, authors, citation chains), multi-condition or semantic paper search (filter by author + institution + venue + keywords, or natural language Q&A via paper_qa_search_pro), institution research capability analysis (scholars, papers, patents), venue paper monitoring by year, patent deep details (IPC/CPC, assignee, claims), and any query needing paid API fields such as full abstracts, structured citation relationships, or scholar work history.
|
||
Do NOT use this skill for simple lookups that free APIs can answer — such as checking a paper title, identifying a scholar by name, normalizing an institution or venue name, or scanning patent trends by keyword. For those, use aminer-free-academic instead.
|
||
Routing rule: if the user's question can be fully answered by paper_search, paper_info, person_search, organization_search, venue_search, patent_search, or patent_info alone, route to aminer-free-academic. Otherwise use this skill.
|
||
metadata:
|
||
{
|
||
"openclaw":
|
||
{
|
||
"requires": {"env": ["AMINER_API_KEY"] },
|
||
"primaryEnv": "AMINER_API_KEY"
|
||
}
|
||
}
|
||
|
||
---
|
||
|
||
# AMiner Open Platform Academic Data Query
|
||
|
||
28 APIs + 5 workflows. Token required: set `AMINER_API_KEY` env var.
|
||
- Docs: https://open.aminer.cn/open/docs | Console: https://open.aminer.cn/open/board?tab=control
|
||
|
||
---
|
||
|
||
## Mandatory Rules (Critical)
|
||
|
||
1. **Token Security**: Only check whether `AMINER_API_KEY` exists; never expose the token in plain text anywhere.
|
||
2. **Cost Control**: Prefer optimal combined queries; never do indiscriminate full-detail retrieval. Default to top 10 details when the user has not specified a count.
|
||
3. **Free-First**: Prefer free APIs unless the user explicitly requires deeper fields; only upgrade to paid APIs when free ones cannot satisfy the need.
|
||
4. **Result Links**: Always append an accessible URL after each entity in the output.
|
||
5. **Disambiguation**: Scholar ambiguity → filter by `org`/`org_id` or ask user to confirm. Org ambiguity → use `org_disambiguate_pro`. Paper ambiguity → cross-check `year` + `venue_name` + `first_author`.
|
||
6. **Cost Report**: After completing all API calls, always output a cost summary to the user showing: each API called, its unit price, number of calls, and the total cost. Format example: `[Cost] ¥X.XX total, N API calls (api_a: ¥X.XX × N, api_b: Free × N)`.
|
||
7. **High-Cost Confirmation (≥ ¥5)**: Before executing a workflow or call chain whose estimated total cost is ¥5.00 or more, **stop and ask the user for confirmation** first. Show the planned call chain, estimated cost per step, and the total. Only proceed after the user explicitly agrees. This applies to both predefined workflows (e.g., Scholar Profile ~¥6.00) and ad-hoc multi-step plans.
|
||
|
||
Entity URL templates (mandatory):
|
||
- Paper: `https://www.aminer.cn/pub/{paper_id}`
|
||
- Scholar: `https://www.aminer.cn/profile/{scholar_id}`
|
||
- Patent: `https://www.aminer.cn/patent/{patent_id}`
|
||
- Journal: `https://www.aminer.cn/open/journal/detail/{journal_id}`
|
||
|
||
---
|
||
|
||
## Token Check (Required)
|
||
|
||
Check `AMINER_API_KEY` exists before any API call. Never expose token in plain text.
|
||
|
||
```bash
|
||
[ -z "${AMINER_API_KEY+x}" ] && echo "AMINER_API_KEY missing" || echo "AMINER_API_KEY exists"
|
||
```
|
||
|
||
- If `${AMINER_API_KEY}` exists: proceed. If not: check `--token` parameter. If neither: **stop**, guide user to [Console](https://open.aminer.cn/open/board?tab=control) to generate one.
|
||
- If the user provides `AMINER_API_KEY` inline (e.g. "My token is xxx"), accept it for the current session, but recommend setting it as an environment variable for better security.
|
||
- Default headers: `Authorization: ${AMINER_API_KEY}`, `X-Platform: openclaw`, `Content-Type: application/json;charset=utf-8` (POST).
|
||
|
||
---
|
||
|
||
## Call Guardrails
|
||
|
||
1. Parameter names and types must match `references/api-catalog.md` exactly.
|
||
2. `paper_info` is batch-only: `{"ids": [...]}`. `paper_detail` is single-paper only: one `id`. Never mix them.
|
||
3. When multiple details are needed, filter with a low-cost API first, then fetch details for a small set.
|
||
4. **Prefer `paper_qa_search_pro`; avoid legacy `paper_qa_search`.** For almost all paper Q&A / topic / filter searches, call `paper_qa_search_pro` first. Use legacy `paper_qa_search` **only** when the user explicitly needs `topic_high` / `topic_middle` / `topic_low` structured OR/AND mode that Pro does not support. Do not default to the legacy endpoint out of habit.
|
||
|
||
---
|
||
|
||
## Paper Search API Selection Guide
|
||
|
||
When the user says "search for papers", determine the goal first:
|
||
|
||
| API | Focus | Use Case | Cost |
|
||
|---|---|---|---|
|
||
| `paper_search` | Title search → `paper_id` | Known paper title, locate target | Free |
|
||
| `paper_search_pro` | Multi-condition search (author/org/venue/keyword) | Topic search, sort by citations or year | ¥0.01 |
|
||
| `paper_qa_search_pro` | Natural language Q&A + rich filters | **Default / prefer this** for semantic & filter search; card + cursor | ¥0.70 |
|
||
| `paper_qa_search` | Legacy structured topic keywords | **Rarely**; only for `topic_high/middle/low` OR/AND | ¥0.05 |
|
||
| `paper_list_by_keywords` | Multi-keyword batch retrieval | Batch thematic retrieval | ¥0.10 |
|
||
| `paper_detail_by_condition` | Year + venue dimension | Journal annual monitoring | ¥0.20 |
|
||
|
||
Default routing:
|
||
|
||
1. **Known title**: `paper_search -> paper_detail -> paper_relation`
|
||
2. **Conditional filtering**: `paper_search_pro -> paper_detail` (or `paper_qa_search_pro` when NL intent / citation-year soft filters help)
|
||
3. **Natural language / topic Q&A**: **always prefer** `paper_qa_search_pro` → if empty, fall back to `paper_search_pro`. **Do not** start with legacy `paper_qa_search`.
|
||
4. **Journal annual analysis**: `venue_search -> venue_paper_relation -> paper_detail_by_condition`
|
||
|
||
Key `paper_qa_search_pro` rules:
|
||
- **Default choice** for natural-language paper search and multi-filter retrieval (`authors`/`author_ids`, `organizations`/`organization_ids`, `venues`/`venue_ids`, year/citation ranges, `all_terms`/`any_terms`/`exclude_terms`).
|
||
- Page size is **fixed at 10**. Do not send `size`. Paginate with `next_cursor` → next request body is `{"cursor":"..."}` only.
|
||
- `sort`: `relevance` / `balanced` / `recent` / `citation`. For “most cited” use `citation`; for “newest” use `recent`.
|
||
- Response card fields only: `paper_id`, `title`, `title_zh`, `authors.name`/`name_zh`, `year`. Use `paper_detail` when full abstract/keywords are needed.
|
||
- Always append `https://www.aminer.cn/pub/{paper_id}`.
|
||
|
||
Legacy `paper_qa_search` — use sparingly:
|
||
- Call **only** when `topic_high` / `topic_middle` / `topic_low` structured OR/AND is explicitly required; otherwise use Pro.
|
||
- `query` and `topic_high/topic_middle/topic_low` are **mutually exclusive**; do not pass both.
|
||
- Supports `sci_flag`, `force_citation_sort`, `force_year_sort`, `author_id`, `org_id`, `venue_ids`.
|
||
|
||
Free-tier screening fields available:
|
||
|
||
- `paper_search`: `venue_name`, `first_author`, `n_citation_bucket`, `year`
|
||
- `paper_info`: `abstract_slice`, `year`, `venue_id`, `author_count`
|
||
- `person_search`: `interests`, `n_citation`, `org/org_id`
|
||
- `organization_search`: `aliases`
|
||
- `venue_search`: `aliases`, `venue_type`
|
||
- `patent_search`: `inventor_name`, `app_year`, `pub_year`
|
||
- `patent_info`: `app_year`, `pub_year`
|
||
|
||
---
|
||
|
||
## Handling Out-of-Workflow Requests
|
||
|
||
When the user's request falls outside the 5 workflows:
|
||
|
||
1. Read `references/api-catalog.md` to confirm available APIs, parameters, and response fields.
|
||
2. Design the shortest viable call chain: locate ID → supplement details → expand relationships.
|
||
3. Do not give up because "no existing workflow fits"; actively compose APIs based on `api-catalog`.
|
||
|
||
---
|
||
|
||
## 5 Combined Workflows
|
||
|
||
### Workflow 1: Scholar Profile (~¥6.00)
|
||
|
||
**Use Case**: Complete academic profile — bio, research interests, papers, patents, projects.
|
||
**Cost note**: Full execution exceeds the ¥5 threshold → **must ask for user confirmation before proceeding** (Rule 7). Show the planned steps and cost. Confirm which sub-modules are needed; skip patents/projects if not requested.
|
||
|
||
**Call Chain:**
|
||
```
|
||
Scholar search (name → person_id)
|
||
↓
|
||
Parallel calls (pick as needed):
|
||
├── Scholar details (bio/education/honors) ¥1.00
|
||
├── Scholar portrait (interests/work history) ¥0.50
|
||
├── Scholar papers (paper list) ¥1.50
|
||
├── Scholar patents (patent list) ¥1.50
|
||
└── Scholar projects (funding info) ¥1.50
|
||
```
|
||
|
||
Fallback: if `paper_search` yields no results in sub-steps, fall back to `paper_search_pro`.
|
||
|
||
---
|
||
|
||
### Workflow 2: Paper Deep Dive (~¥0.12)
|
||
|
||
**Use Case**: Full paper information and citation chain from a title or keyword.
|
||
|
||
**Call Chain:**
|
||
```
|
||
Paper search / Paper search pro (title/keyword → paper_id)
|
||
↓
|
||
Paper details (abstract/authors/DOI/journal/year/keywords) ¥0.01
|
||
↓
|
||
Paper citations (cited papers → cited_ids) ¥0.10
|
||
↓
|
||
(Optional) Batch paper_info for cited papers Free
|
||
```
|
||
|
||
Fallback: if `paper_search` yields no results, fall back to `paper_search_pro`.
|
||
|
||
---
|
||
|
||
### Workflow 3: Org Analysis (~¥0.81)
|
||
|
||
**Use Case**: Institution scholar size, paper output, patent count — for competitive research or partnership evaluation.
|
||
|
||
**Call Chain:**
|
||
```
|
||
Org disambiguation pro (raw string → org_id) ¥0.05
|
||
↓
|
||
Parallel calls:
|
||
├── Org details (description/type) ¥0.01
|
||
├── Org scholars (scholar list, 10/call) ¥0.50
|
||
├── Org papers (paper list, 10/call) ¥0.10
|
||
└── Org patents (patent IDs, up to 10,000) ¥0.10
|
||
```
|
||
|
||
> If disambiguation pro returns no ID, fall back to `org_search` (free).
|
||
|
||
---
|
||
|
||
### Workflow 4: Venue Papers (~¥0.10 - ¥0.30)
|
||
|
||
**Use Case**: Track journal papers by year; useful for submission research or trend analysis.
|
||
|
||
**Call Chain:**
|
||
```
|
||
Venue search (name → venue_id) Free
|
||
↓
|
||
(Optional) Venue details (ISSN/type/abbreviation) ¥0.20
|
||
↓
|
||
Venue papers (venue_id + year → paper_id list) ¥0.10
|
||
↓
|
||
(Optional) Batch paper detail query
|
||
```
|
||
|
||
---
|
||
|
||
### Workflow 5: Patent Analysis (~¥0.02)
|
||
|
||
**Use Case**: Search patents in a technology domain, or retrieve a scholar's/institution's patent portfolio.
|
||
|
||
**Call Chain (standalone search):**
|
||
```
|
||
Patent search (query → patent_id) Free
|
||
↓
|
||
Patent info / Patent details Free / ¥0.01
|
||
```
|
||
|
||
**Call Chain (via scholar/institution):**
|
||
```
|
||
Scholar search → Scholar patents (patent_id list)
|
||
Org disambiguation → Org patents (patent_id list)
|
||
↓
|
||
Patent info / Patent details
|
||
```
|
||
|
||
---
|
||
|
||
## Individual API Quick Reference
|
||
|
||
> Full parameter docs: read `references/api-catalog.md`
|
||
|
||
| # | Title | Method | Price | API Path (Base: publicapi.chatglm.cn/chatglm_public/skill/aminer) |
|
||
|---|------|------|------|------|
|
||
| 1 | Paper QA Search Pro | POST | ¥0.70 | `/api/v3/paper/qa/searchPro` |
|
||
| 2 | Paper QA Search (legacy) | POST | ¥0.05 | `/api/paper/qa/search` |
|
||
| 3 | Scholar Search | POST | Free | `/api/person/search` |
|
||
| 4 | Paper Search | GET | Free | `/api/paper/search` |
|
||
| 5 | Paper Search Pro | GET | ¥0.01 | `/api/paper/search/pro` |
|
||
| 6 | Patent Search | POST | Free | `/api/patent/search` |
|
||
| 7 | Org Search | POST | Free | `/api/organization/search` |
|
||
| 8 | Venue Search | POST | Free | `/api/venue/search` |
|
||
| 9 | Scholar Details | GET | ¥1.00 | `/api/person/detail` |
|
||
| 10 | Scholar Projects | GET | ¥1.50 | `/api/project/person/v3/open` |
|
||
| 11 | Scholar Papers | GET | ¥1.50 | `/api/person/paper/relation` |
|
||
| 12 | Scholar Patents | GET | ¥1.50 | `/api/person/patent/relation` |
|
||
| 13 | Scholar Portrait | GET | ¥0.50 | `/api/person/figure` |
|
||
| 14 | Paper Info | POST | Free | `/api/paper/info` |
|
||
| 15 | Paper Details | GET | ¥0.01 | `/api/paper/detail` |
|
||
| 16 | Paper Citations | GET | ¥0.10 | `/api/paper/relation` |
|
||
| 17 | Patent Info | GET | Free | `/api/patent/info` |
|
||
| 18 | Patent Details | GET | ¥0.01 | `/api/patent/detail` |
|
||
| 19 | Org Details | POST | ¥0.01 | `/api/organization/detail` |
|
||
| 20 | Org Patents | GET | ¥0.10 | `/api/organization/patent/relation` |
|
||
| 21 | Org Scholars | GET | ¥0.50 | `/api/organization/person/relation` |
|
||
| 22 | Org Papers | GET | ¥0.10 | `/api/organization/paper/relation` |
|
||
| 23 | Venue Details | POST | ¥0.20 | `/api/venue/detail` |
|
||
| 24 | Venue Papers | POST | ¥0.10 | `/api/venue/paper/relation` |
|
||
| 25 | Org Disambiguation | POST | ¥0.01 | `/api/organization/na` |
|
||
| 26 | Org Disambiguation Pro | POST | ¥0.05 | `/api/organization/na/pro` |
|
||
| 27 | Paper Batch Query | GET | ¥0.10 | `/api/paper/list/citation/by/keywords` |
|
||
| 28 | Paper Details by Year+Venue | GET | ¥0.20 | `/api/paper/platform/allpubs/more/detail/by/ts/org/venue` |
|
||
|
||
---
|
||
|
||
## References
|
||
|
||
- Full API parameter documentation: read `references/api-catalog.md`
|
||
- Optional Python client: `scripts/aminer_client.py`
|
||
- Test cases: `evals/evals.json`
|
||
- Official documentation: https://open.aminer.cn/open/docs
|
||
- Console: https://open.aminer.cn/open/board?tab=control
|