Skip to content

Commit 46baebc

Browse files
Make skills self-contained, fix stale docs, add README banner
Critical fixes from a main-branch review: - Bundle references/endpoints.md into neurobro-meme-hunting and neurobro-trading-setup so each plugin installs standalone. Both skills previously linked to neurobro-market-research's reference file, which dangles when a sibling skill is not installed. - Repoint those skills' "Calling NeuroAPI" and "Reference" sections to their own bundled references/endpoints.md. - Un-stale agents/AGENTS.md: list all three skills, not just neurobro-market-research. - CONTRIBUTING.md: add a checklist step to update AGENTS.md and a convention requiring skills to be self-contained. - neurobro-market-research: document the 409 status (Idempotency-Key in flight) in the retry guidance, matching endpoints.md. - Add assets/neurobro-skills.png banner to the top of the README. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent cf8c4e0 commit 46baebc

9 files changed

Lines changed: 307 additions & 14 deletions

File tree

‎CONTRIBUTING.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@
3535

3636
5. Add a row to the skills table in [`README.md`](README.md).
3737

38-
6. Validate before committing:
38+
6. Add the skill to the "Using the skills" list in
39+
[`agents/AGENTS.md`](agents/AGENTS.md) - that file is the shared context for
40+
non-Claude agents and must list every skill.
41+
42+
7. Validate before committing:
3943

4044
```bash
4145
node scripts/validate-skills.mjs
@@ -51,3 +55,6 @@
5155
imperative.
5256
- Document failure modes (error codes, rate limits) - agents need them to
5357
recover.
58+
- Keep each skill self-contained. A skill can be installed on its own, so it
59+
must not link to files in a sibling skill - bundle what it needs under its
60+
own `references/`.

‎README.md‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
# Neurobro Skills
1+
<p align="center">
2+
<img src="assets/neurobro-skills.png" alt="Neurobro Skills: Agent skills for the NeuroAPI financial market research API" width="100%">
3+
</p>
4+
5+
<h1 align="center">Neurobro Skills</h1>
26

37
Agent skills for **[NeuroAPI](https://neuroapi.neurobro.ai)** - Neurobro's
48
paid public API for financial market research. These skills teach AI coding

‎agents/AGENTS.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ relevant to the task:
2626
- `neurobro-market-research` - financial market research via `/agent/ask`:
2727
equity and crypto analysis, technical setups, fundamental research, macro
2828
outlooks, multi-asset investigations.
29+
- `neurobro-meme-hunting` - discover and risk-vet trending and newly launched
30+
memecoins: scan DEX pools, filter by liquidity and age, audit for honeypots,
31+
rug-pull risk, and holder concentration.
32+
- `neurobro-trading-setup` - build structured trade setups: entry zones,
33+
stop-loss, take-profit targets, and risk/reward ratios from technical
34+
analysis and derivatives positioning.
2935

3036
Each `SKILL.md` carries the full instructions, including request/response
3137
schemas, mode selection, billing, error handling, and rate limits.

‎assets/neurobro-skills.png‎

2.39 MB
Loading

‎skills/neurobro-market-research/SKILL.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ error class:
203203
to sort out billing, then stop.
204204
- **Adjust, then retry** - `403 mode_not_in_plan`: the `mode` isn't on the
205205
caller's plan; retry with `smart` or `fast`.
206+
- **Wait, then retry** - `409`: a call with the same `Idempotency-Key` is
207+
still in flight; wait briefly, then retry the same request.
206208
- **Back off and retry** - `429` (honour `Retry-After`, cap at 3 attempts) and
207209
`503` (agent saturated; exponential backoff; no quota charged).
208210
- **`500`** - server-side bug; retry only idempotent calls, once.

‎skills/neurobro-meme-hunting/SKILL.md‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,8 @@ curl -s https://api.neurobro.ai/api/v1/agent/ask \
4949
-d '{"prompt": "<your prompt>", "mode": "smart"}' | jq -r .answer
5050
```
5151

52-
For the full request/response schema, status codes, rate limits, and key
53-
setup, see the `neurobro-market-research` skill and its
54-
`references/endpoints.md`.
52+
For the full request/response schema, status codes, and rate limits, see
53+
[references/endpoints.md](references/endpoints.md).
5554

5655
## The hunt: discover, filter, audit, rank
5756

@@ -179,6 +178,6 @@ routinely go to zero on momentum alone.
179178

180179
## Reference
181180

182-
Full NeuroAPI endpoint reference - request/response schema, status codes,
183-
rate limits, and key setup - lives in the `neurobro-market-research` skill
184-
(`references/endpoints.md`). Official docs: <https://neuroapi.neurobro.ai/docs>.
181+
Full NeuroAPI endpoint reference - request/response schema, status codes, and
182+
rate limits: [references/endpoints.md](references/endpoints.md). Official docs:
183+
<https://neuroapi.neurobro.ai/docs>.
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# NeuroAPI endpoint reference
2+
3+
Base URL: `https://api.neurobro.ai/api/v1`
4+
5+
All endpoints require the `X-API-Key` header. Keys look like `neuro_<random>`;
6+
the leading `neuro_<8 chars>` is the public prefix surfaced in logs and
7+
dashboards. There is no OAuth or `Authorization: Bearer` flow.
8+
9+
---
10+
11+
## `GET /health`
12+
13+
Free, non-billable. Confirms auth and connectivity. Use it as a smoke test in
14+
deploy pipelines and before running billable work.
15+
16+
Request:
17+
18+
```bash
19+
curl -s https://api.neurobro.ai/api/v1/health -H "X-API-Key: $NEUROAPI_API_KEY"
20+
```
21+
22+
Response `200`:
23+
24+
```json
25+
{
26+
"status": "healthy",
27+
"service": "neuroapi",
28+
"version": "0.1.0",
29+
"authenticated": true,
30+
"key_prefix": "neuro_a1b2c3d4",
31+
"timestamp": "2026-05-08T12:34:56.789Z"
32+
}
33+
```
34+
35+
---
36+
37+
## `POST /agent/ask`
38+
39+
Runs the NeuroAPI financial research agent. Billable.
40+
41+
### Headers
42+
43+
| Header | Required | Notes |
44+
| --- | --- | --- |
45+
| `X-API-Key` | yes | `neuro_...` secret. |
46+
| `Content-Type` | yes | `application/json`. |
47+
| `Idempotency-Key` | no | 1-255 printable ASCII chars. Safe-retries the call; reusing it with a different body returns `422`. |
48+
49+
### Request body - `AgentAskRequest`
50+
51+
| Field | Type | Default | Constraints |
52+
| --- | --- | --- | --- |
53+
| `prompt` | string | - (required) | 1-32,000 chars. |
54+
| `mode` | `"fast"` \| `"smart"` \| `"max"` | `"smart"` | `max` requires Pro+. |
55+
| `stream` | boolean | `false` | When `true`, an SSE response. |
56+
| `message_history` | array of `ChatMessage` | `null` | Max 50 messages. |
57+
58+
`ChatMessage`:
59+
60+
| Field | Type | Constraints |
61+
| --- | --- | --- |
62+
| `role` | string | `"user"` or `"assistant"`. |
63+
| `content` | string | Max 32,000 chars. |
64+
65+
Mode names are opaque tier labels - the underlying model is not revealed and
66+
may change without notice on the same label.
67+
68+
### Cost per mode
69+
70+
| Mode | `cost_units` debited | Plans |
71+
| --- | --- | --- |
72+
| `fast` | 1 | all |
73+
| `smart` | 2 | all |
74+
| `max` | 8 | Pro, Enterprise |
75+
76+
### Sync response - `AgentAskResponse` (`stream=false`)
77+
78+
```json
79+
{
80+
"answer": "The European Central Bank held rates steady ...",
81+
"mode": "smart",
82+
"request_id": "8b3a2f0e-1d7e-4c6b-9b2a-f5e23a1c9d44",
83+
"usage": {
84+
"prompt_tokens": 124,
85+
"completion_tokens": 256,
86+
"cached_tokens": 80,
87+
"cost_units": 2
88+
}
89+
}
90+
```
91+
92+
`UsageBlock` fields: `prompt_tokens`, `completion_tokens`, `cached_tokens`
93+
(subset of `prompt_tokens` served from the provider cache), and `cost_units`
94+
(the only field that maps to billing).
95+
96+
### Streaming response (`stream=true`)
97+
98+
`Content-Type: text/event-stream`. Each event is one `TaskResponseMessage`
99+
JSON object on a `data:` line. Success terminates with `data: [DONE]\n\n`.
100+
On error, a `data: {"type":"error",...}` event is emitted and the stream
101+
closes with no `[DONE]` - the terminator is the only success signal.
102+
103+
### Status codes
104+
105+
| Code | Meaning | Retry |
106+
| --- | --- | --- |
107+
| `200` | Success | - |
108+
| `400` | Malformed body or invalid `Idempotency-Key` | No |
109+
| `401` | Missing/invalid `X-API-Key` | No |
110+
| `402` | No active subscription, or quota exhausted | No - fix billing |
111+
| `403` | `mode` not on plan (`code: mode_not_in_plan`) | No - lower the mode |
112+
| `409` | Same `Idempotency-Key` still in flight | Yes, after a wait |
113+
| `422` | Request body validation error | No - fix the body |
114+
| `429` | Rate limit exceeded | Yes, after `Retry-After` |
115+
| `500` | Server-side bug | Maybe (idempotent calls only) |
116+
| `503` | Agent capacity saturated | Yes, with backoff |
117+
118+
### Error body
119+
120+
```json
121+
{ "detail": "Human-readable message" }
122+
```
123+
124+
`422` returns a list instead, each entry a `{type, loc, msg}` pointer into the
125+
request body. Every error response carries an `X-Request-Id` header.
126+
127+
### Rate-limit headers
128+
129+
Present on every response:
130+
131+
| Header | Meaning |
132+
| --- | --- |
133+
| `X-RateLimit-Limit` | Allowed requests in the current window. |
134+
| `X-RateLimit-Remaining` | Requests left before reset. |
135+
| `X-RateLimit-Reset` | Unix timestamp of the window reset. |
136+
| `Retry-After` | Seconds until the next allowed call (only on `429`). |
137+
138+
Per-minute budgets: Starter 60, Pro 60, Enterprise 300 (negotiable).

‎skills/neurobro-trading-setup/SKILL.md‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@ curl -s https://api.neurobro.ai/api/v1/agent/ask \
4848
-d '{"prompt": "<your prompt>", "mode": "smart"}' | jq -r .answer
4949
```
5050

51-
For the full request/response schema, status codes, rate limits, and key
52-
setup, see the `neurobro-market-research` skill and its
53-
`references/endpoints.md`.
51+
For the full request/response schema, status codes, and rate limits, see
52+
[references/endpoints.md](references/endpoints.md).
5453

5554
## The workflow: context, setup, validate
5655

@@ -183,6 +182,6 @@ curl -s https://api.neurobro.ai/api/v1/agent/ask \
183182

184183
## Reference
185184

186-
Full NeuroAPI endpoint reference - request/response schema, status codes,
187-
rate limits, and key setup - lives in the `neurobro-market-research` skill
188-
(`references/endpoints.md`). Official docs: <https://neuroapi.neurobro.ai/docs>.
185+
Full NeuroAPI endpoint reference - request/response schema, status codes, and
186+
rate limits: [references/endpoints.md](references/endpoints.md). Official docs:
187+
<https://neuroapi.neurobro.ai/docs>.
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# NeuroAPI endpoint reference
2+
3+
Base URL: `https://api.neurobro.ai/api/v1`
4+
5+
All endpoints require the `X-API-Key` header. Keys look like `neuro_<random>`;
6+
the leading `neuro_<8 chars>` is the public prefix surfaced in logs and
7+
dashboards. There is no OAuth or `Authorization: Bearer` flow.
8+
9+
---
10+
11+
## `GET /health`
12+
13+
Free, non-billable. Confirms auth and connectivity. Use it as a smoke test in
14+
deploy pipelines and before running billable work.
15+
16+
Request:
17+
18+
```bash
19+
curl -s https://api.neurobro.ai/api/v1/health -H "X-API-Key: $NEUROAPI_API_KEY"
20+
```
21+
22+
Response `200`:
23+
24+
```json
25+
{
26+
"status": "healthy",
27+
"service": "neuroapi",
28+
"version": "0.1.0",
29+
"authenticated": true,
30+
"key_prefix": "neuro_a1b2c3d4",
31+
"timestamp": "2026-05-08T12:34:56.789Z"
32+
}
33+
```
34+
35+
---
36+
37+
## `POST /agent/ask`
38+
39+
Runs the NeuroAPI financial research agent. Billable.
40+
41+
### Headers
42+
43+
| Header | Required | Notes |
44+
| --- | --- | --- |
45+
| `X-API-Key` | yes | `neuro_...` secret. |
46+
| `Content-Type` | yes | `application/json`. |
47+
| `Idempotency-Key` | no | 1-255 printable ASCII chars. Safe-retries the call; reusing it with a different body returns `422`. |
48+
49+
### Request body - `AgentAskRequest`
50+
51+
| Field | Type | Default | Constraints |
52+
| --- | --- | --- | --- |
53+
| `prompt` | string | - (required) | 1-32,000 chars. |
54+
| `mode` | `"fast"` \| `"smart"` \| `"max"` | `"smart"` | `max` requires Pro+. |
55+
| `stream` | boolean | `false` | When `true`, an SSE response. |
56+
| `message_history` | array of `ChatMessage` | `null` | Max 50 messages. |
57+
58+
`ChatMessage`:
59+
60+
| Field | Type | Constraints |
61+
| --- | --- | --- |
62+
| `role` | string | `"user"` or `"assistant"`. |
63+
| `content` | string | Max 32,000 chars. |
64+
65+
Mode names are opaque tier labels - the underlying model is not revealed and
66+
may change without notice on the same label.
67+
68+
### Cost per mode
69+
70+
| Mode | `cost_units` debited | Plans |
71+
| --- | --- | --- |
72+
| `fast` | 1 | all |
73+
| `smart` | 2 | all |
74+
| `max` | 8 | Pro, Enterprise |
75+
76+
### Sync response - `AgentAskResponse` (`stream=false`)
77+
78+
```json
79+
{
80+
"answer": "The European Central Bank held rates steady ...",
81+
"mode": "smart",
82+
"request_id": "8b3a2f0e-1d7e-4c6b-9b2a-f5e23a1c9d44",
83+
"usage": {
84+
"prompt_tokens": 124,
85+
"completion_tokens": 256,
86+
"cached_tokens": 80,
87+
"cost_units": 2
88+
}
89+
}
90+
```
91+
92+
`UsageBlock` fields: `prompt_tokens`, `completion_tokens`, `cached_tokens`
93+
(subset of `prompt_tokens` served from the provider cache), and `cost_units`
94+
(the only field that maps to billing).
95+
96+
### Streaming response (`stream=true`)
97+
98+
`Content-Type: text/event-stream`. Each event is one `TaskResponseMessage`
99+
JSON object on a `data:` line. Success terminates with `data: [DONE]\n\n`.
100+
On error, a `data: {"type":"error",...}` event is emitted and the stream
101+
closes with no `[DONE]` - the terminator is the only success signal.
102+
103+
### Status codes
104+
105+
| Code | Meaning | Retry |
106+
| --- | --- | --- |
107+
| `200` | Success | - |
108+
| `400` | Malformed body or invalid `Idempotency-Key` | No |
109+
| `401` | Missing/invalid `X-API-Key` | No |
110+
| `402` | No active subscription, or quota exhausted | No - fix billing |
111+
| `403` | `mode` not on plan (`code: mode_not_in_plan`) | No - lower the mode |
112+
| `409` | Same `Idempotency-Key` still in flight | Yes, after a wait |
113+
| `422` | Request body validation error | No - fix the body |
114+
| `429` | Rate limit exceeded | Yes, after `Retry-After` |
115+
| `500` | Server-side bug | Maybe (idempotent calls only) |
116+
| `503` | Agent capacity saturated | Yes, with backoff |
117+
118+
### Error body
119+
120+
```json
121+
{ "detail": "Human-readable message" }
122+
```
123+
124+
`422` returns a list instead, each entry a `{type, loc, msg}` pointer into the
125+
request body. Every error response carries an `X-Request-Id` header.
126+
127+
### Rate-limit headers
128+
129+
Present on every response:
130+
131+
| Header | Meaning |
132+
| --- | --- |
133+
| `X-RateLimit-Limit` | Allowed requests in the current window. |
134+
| `X-RateLimit-Remaining` | Requests left before reset. |
135+
| `X-RateLimit-Reset` | Unix timestamp of the window reset. |
136+
| `Retry-After` | Seconds until the next allowed call (only on `429`). |
137+
138+
Per-minute budgets: Starter 60, Pro 60, Enterprise 300 (negotiable).

0 commit comments

Comments
 (0)