Spaces:
Running
Download agents.md from igardner/StockAnalysis: direct link, hf CLI and curl.
- Browser
- Download file 8.12 kB
-
https://huggingface.co/spaces/igardner/StockAnalysis/resolve/main/agents.md
- Command line
-
hf download hf://spaces/igardner/StockAnalysis/agents.md
-
curl -L -o agents.md https://huggingface.co/spaces/igardner/StockAnalysis/resolve/main/agents.md
To use this application (igardner/StockAnalysis: Structured stock analysis as JSON for agents): API schema: GET https://igardner-stockanalysis.hf.space/gradio_api/info Call endpoint: POST https://igardner-stockanalysis.hf.space/gradio_api/call/v2/analyze {"ticker": "AAPL", "horizon": "3 months", "risk_profile": "balanced", "question": ""} Poll result: GET https://igardner-stockanalysis.hf.space/gradio_api/call/analyze/{event_id} File inputs: none - all inputs are JSON scalars. Auth: Bearer $HF_TOKEN (https://huggingface.co/settings/tokens)
StockAnalysis agent contract
This file is the concrete contract for agents. The Hub also generates a live
agents.md at https://huggingface.co/spaces/igardner/StockAnalysis/agents.md.
Always fetch /gradio_api/info before calling. The live schema is the runtime
contract; this file explains the boundaries and the expected response shapes.
What this Space does
- Accepts a ticker, horizon, risk profile, and optional question.
- Sends that request to a separate stock-analysis project.
- Returns three outputs in order: JSON, the raw upstream body, and a short human-readable status string.
- If the upstream returns text and a local parser is configured, converts that text to JSON without inventing prices, targets, or recommendations.
The Analyze request is read-only. It does not place trades, move funds, or connect to a brokerage account.
Boundaries: what this Space will not do
- It is not financial advice and is not a substitute for a licensed advisor.
- It does not guarantee returns, accuracy, completeness, availability, or latency. Do not represent it as promising 10x gains or any other return.
- It does not execute trades or manage money.
- It does not verify the external project's claims or data.
- It does not provide personalized advice. Treat output as research material that a human reviews.
- It does not accept file inputs. Do not call
/gradio_api/upload. - It does not expose the smoke test as part of the agent contract. The smoke test events are marked private; do not call them.
- It does not promise uptime. This is a CPU-basic Space and can sleep, restart, or be rebuilt.
- It does not intentionally persist Analyze requests. The external project may have its own retention policy.
Promises: what agents can rely on
- When the Gradio call completes, it returns exactly three outputs in this order: JSON result, raw upstream body, status string.
- The first output is JSON-serializable. Error and configuration failures are returned as JSON objects instead of a successful-looking analysis.
- Expected failures use these
statusvalues:not_configured,invalid_input, orerror. A text-to-JSON wrapper usesstatus: "ok"plussource: "external+local_parser". - An upstream JSON response is passed through unchanged. Its shape is defined by the external project, not by this Space.
- Missing or empty tickers return
invalid_input. Unknown horizon or risk values are coerced to3 monthsandbalanced. - The Space never returns
HF_TOKENor any server secret in its outputs. - Private smoke-test outputs are not part of the Analyze response.
Inputs
| Name | Type | Required | Default | Rules |
|---|---|---|---|---|
ticker |
string | yes | none | Uppercased and trimmed. Maximum 24 characters. Empty is rejected. |
horizon |
string | no | 3 months |
1 week, 1 month, 3 months, 6 months, or 1 year. Unknown values become 3 months. |
risk_profile |
string | no | balanced |
conservative, balanced, or aggressive. Unknown values become balanced. |
question |
string | no | empty | Optional. Truncated to 2000 characters. Do not put secrets or personal data here. |
There are no file inputs.
Outputs
- JSON result. Read this first.
- Raw upstream response as text. May be empty.
- Human-readable status string. Do not parse this as machine data.
The JSON result can be one of these shapes:
- Upstream JSON, passed through unchanged.
{"status": "ok", "ticker": "...", "http_status": 200, "content_type": "...", "raw": "..."}when the upstream returned text and no parser was configured.{"status": "ok", "ticker": "...", "source": "external+local_parser", "parser": {"model": "..."}, "analysis": <JSON>, "raw": "..."}when the local parser succeeded.{"status": "not_configured", "message": "..."}whenEXTERNAL_API_URLis unset.{"status": "invalid_input", "error": "..."}for bad input.{"status": "error", "http_status": ..., "error": "...", "raw": "..."}for upstream failures.- The text-wrapper shape plus
parse_errorwhen the local parser failed.
Check for the status field before treating a result as analysis. Our error
envelopes include ticker and an error or message field. Upstream JSON is
not wrapped, so its own fields are whatever the external project returns.
Call with curl
EVENT_ID=$(curl -sS -X POST \
"https://igardner-stockanalysis.hf.space/gradio_api/call/v2/analyze" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $HF_TOKEN" \
-d '{"ticker":"AAPL","horizon":"3 months","risk_profile":"balanced","question":""}' \
| python -c 'import json,sys; print(json.load(sys.stdin)["event_id"])')
curl -sS -N \
"https://igardner-stockanalysis.hf.space/gradio_api/call/analyze/$EVENT_ID" \
-H "Authorization: Bearer $HF_TOKEN"
The POST returns {"event_id": "..."}. The GET streams Server-Sent Events. The
final event is complete and its data field is the three-element output list.
An error event means the call failed; a stream that ends without complete
should be treated as a failure.
If a client only supports the older call shape, send the same inputs as a
positional list to /gradio_api/call/analyze:
{"data": ["AAPL", "3 months", "balanced", ""]}
Call with the Python client
import os
from gradio_client import Client
client = Client("igardner/StockAnalysis", token=os.environ["HF_TOKEN"])
result = client.predict(
"AAPL",
"3 months",
"balanced",
"",
api_name="/analyze",
)
print(result)
Error handling and retries
- Check the JSON result's
statusbefore using any analysis fields. - Do not retry
invalid_inputornot_configured. Fix the input or ask the Space owner to setEXTERNAL_API_URL. - For HTTP 429, 5xx, network errors, or a stream without
complete, retry with exponential backoff and a small retry cap (for example, three attempts). HonorRetry-Afterwhen it is present. - Do not retry a
parse_errorblindly. The raw upstream body is still in the second output, so use that if your client can parse it. - The server allows up to four concurrent Analyze events. Stay below that, and do not flood the Space with parallel requests.
Auth and data handling
- Send
Authorization: Bearer $HF_TOKENon both the POST and the poll GET. - Never put the token in the JSON body, the
questionfield, or a URL query string. HF_TOKENis for Space authentication and rate limits. The Space's own outbound token is a Space secret and is never returned to clients.- The ticker and question are sent to the external project. Do not send secrets, credentials, or personal data.
- The Space does not intentionally store Analyze requests. The external project may log or retain them under its own policy.
Discovery and versioning
- Fetch
GET /gradio_api/infoat the start of a session. Do not hardcode parameter names, return counts, or endpoint paths beyond the documented fallback. - The live
/agents.mdroute is generated by Hugging Face from Space metadata. This repository copy is documentation, not a replacement for the live schema. - The external project and the custom model can change independently. The custom
model is configured with
STOCK_MODEL_IDand is currently blank.
Disclaimer
This is research tooling, not financial advice. Output may be incomplete or wrong. No return is guaranteed, and you can lose money. Nothing in this contract promises a specific gain, including 10x.