user-profile
GitHub管理用户数据,包括个人资料、投资组合和偏好设置。提供读取、创建/更新及删除数据的工具,支持获取完整信息或特定实体(如关注列表、风险偏好),并支持偏好的合并或替换操作。
Trigger Scenarios
Install
npx skills add ginlix-ai/LangAlpha --skill user-profile -g -y
SKILL.md
Frontmatter
{
"name": "user-profile",
"description": "Manage user profile including watchlists, portfolio, and preferences."
}
User Profile Skill
This skill provides 3 unified tools for managing user data:
get_user_data- Read user dataupdate_user_data- Create or update user dataremove_user_data- Delete user data
You should call these tools directly instead of using ExecuteCode tool.
Tool 1: get_user_data
Retrieve user data by entity type.
Entities
| Entity | Description | entity_id |
|---|---|---|
all |
Complete user data (profile, preferences, watchlists with items, portfolio) | Not used |
profile |
User info (name, timezone, locale) | Not used |
preferences |
All preferences (risk, investment, agent) | Not used |
watchlists |
List of all watchlists | Not used |
watchlist_items |
Items in a specific watchlist | Optional watchlist_id |
portfolio |
All portfolio holdings | Not used |
Examples
# Get complete user data (recommended for initial context)
get_user_data(entity="all")
# Returns: {
# "profile": {"name": "John", "timezone": "America/New_York", "locale": "en-US"},
# "preferences": {"risk_preference": {...}, "investment_preference": {...}, ...},
# "watchlists": [{"name": "Tech Stocks", "items": [...], ...}],
# "portfolio": [{"symbol": "AAPL", "quantity": 50, ...}]
# }
# Get user profile
get_user_data(entity="profile")
# Returns: {"name": "John", "timezone": "America/New_York", "locale": "en-US"}
# Get all preferences
get_user_data(entity="preferences")
# Returns: {"risk_preference": {...}, "investment_preference": {...}, "agent_preference": {...}}
# Get all watchlists
get_user_data(entity="watchlists")
# Returns: [{"watchlist_id": "abc", "name": "Tech Stocks", "is_default": true}, ...]
# Get items from default watchlist
get_user_data(entity="watchlist_items")
# Returns: [{"symbol": "AAPL", "notes": "..."}, {"symbol": "NVDA", ...}]
# Get items from specific watchlist
get_user_data(entity="watchlist_items", entity_id="abc-123")
# Get portfolio holdings
get_user_data(entity="portfolio")
# Returns: [{"symbol": "AAPL", "quantity": 50, "average_cost": 175.0}, ...]
Tool 2: update_user_data
Create or update user data (upsert semantics).
Common Options for Preferences
All preference entities (risk_preference, investment_preference, agent_preference) support:
| Parameter | Type | Description |
|---|---|---|
replace |
bool | If True, completely replace the preference instead of merging with existing data |
The data dict accepts any fields. Extra fields like notes, instruction, avoid_sectors are stored alongside named fields.
# Merge with existing (default behavior)
update_user_data(entity="agent_preference", data={
"output_style": "Balanced summary with key numbers highlighted",
"notes": "User prefers brevity"
})
# Replace entire preference (delete all existing fields, set only new ones)
update_user_data(entity="agent_preference", data={
"output_style": "In-depth deep dive with full analysis"
}, replace=True)
Entity: profile
Update user profile info.
| Field | Type | Description |
|---|---|---|
name |
str | Display name |
timezone |
str | e.g., "America/New_York" |
locale |
str | Preferred language, e.g., "en-US", "zh-CN" |
onboarding_completed |
bool | Mark onboarding done (write-only, not returned in get) |
# Update display name
update_user_data(entity="profile", data={"name": "John Doe"})
# Mark onboarding complete
update_user_data(entity="profile", data={"onboarding_completed": True})
Entity: risk_preference
Set risk tolerance settings. All fields accept any descriptive string.
| Field | Type | Description |
|---|---|---|
risk_tolerance |
str | Risk tolerance description (any text) |
| (extra fields) | any | Additional context (notes, constraints, etc.) |
# Descriptive risk preference
update_user_data(
entity="risk_preference",
data={
"risk_tolerance": "Moderate - comfortable with market swings but avoids concentrated bets",
"notes": "Prefers diversification after 2022 tech losses"
}
)
Entity: investment_preference
Set investment style settings. All fields accept any descriptive string. At least one field is required.
| Field | Type | Description |
|---|---|---|
company_interest |
str | Type of companies interested in (any text) |
holding_period |
str | Preferred holding period (any text) |
analysis_focus |
str | Primary analysis focus area (any text) |
| (extra fields) | any | Additional context (avoid_sectors, focus_sectors, notes, etc.) |
# Full investment profile with rich descriptions
update_user_data(
entity="investment_preference",
data={
"company_interest": "Dividend-paying blue chips and REITs for income",
"holding_period": "Long-term (5+ years), rarely sells",
"analysis_focus": "Dividend sustainability and balance sheet strength",
"avoid_sectors": "Crypto, speculative biotech"
}
)
Entity: agent_preference
Set agent behavior settings. All fields accept any descriptive string.
| Field | Type | Description |
|---|---|---|
output_style |
str | Preferred output style (any text) |
data_visualization |
str | Chart/visualization preferences (any text) |
proactive_questions |
str | When to ask clarifying questions (any text) |
| (extra fields) | any | Additional context (instruction, notes, etc.) |
# Rich agent preferences
update_user_data(
entity="agent_preference",
data={
"output_style": "Balanced summary with key numbers highlighted",
"data_visualization": "Include charts when comparing multiple stocks",
"proactive_questions": "Use your judgment, only ask when critical"
}
)
Entity: watchlist
Create or update a watchlist.
| Field | Type | Required | Description |
|---|---|---|---|
name |
str | Yes | Watchlist name (used as key for upsert) |
description |
str | No | Purpose of the watchlist |
is_default |
bool | No | Set as default watchlist |
# Create a watchlist
update_user_data(
entity="watchlist",
data={"name": "AI Companies", "description": "Companies focused on AI"}
)
# Create and set as default
update_user_data(
entity="watchlist",
data={"name": "My Watchlist", "is_default": True}
)
Entity: watchlist_item
Add or update an item in a watchlist.
| Field | Type | Required | Description |
|---|---|---|---|
symbol |
str | Yes | Stock symbol (used as key) |
watchlist_id |
str | No | Target watchlist (uses default if omitted) |
instrument_type |
str | No | Free-form. Common: "stock", "etf", "index", "crypto", "future", "commodity", "currency". Other values accepted (default: "stock") |
exchange |
str | No | e.g., "NASDAQ" |
name |
str | No | Company name |
notes |
str | No | Why you're watching |
# Add to default watchlist
update_user_data(
entity="watchlist_item",
data={"symbol": "NVDA", "notes": "Watching for AI chip growth"}
)
# Add to specific watchlist with full details
update_user_data(
entity="watchlist_item",
data={
"symbol": "AAPL",
"watchlist_id": "abc-123",
"name": "Apple Inc.",
"exchange": "NASDAQ",
"notes": "iPhone revenue growth"
}
)
# Add an ETF
update_user_data(
entity="watchlist_item",
data={"symbol": "QQQ", "instrument_type": "etf", "notes": "Tech exposure"}
)
Entity: portfolio_holding
Add or update a portfolio holding.
| Field | Type | Required | Description |
|---|---|---|---|
symbol |
str | Yes | Stock symbol (used as key) |
quantity |
float | Yes | Number of shares |
average_cost |
float | No | Cost per share |
account_name |
str | No | e.g., "Robinhood", "Fidelity IRA" (part of key) |
instrument_type |
str | No | Free-form. Common: "stock", "etf", "index", "crypto", "future", "commodity", "currency". Other values accepted (default: "stock") |
currency |
str | No | Default: "USD" |
notes |
str | No | Additional notes |
# Add basic holding
update_user_data(
entity="portfolio_holding",
data={"symbol": "AAPL", "quantity": 50, "average_cost": 175.0}
)
# Add holding with account
update_user_data(
entity="portfolio_holding",
data={
"symbol": "VTI",
"quantity": 100,
"average_cost": 220.50,
"account_name": "Fidelity 401k",
"instrument_type": "etf",
"notes": "Long-term retirement holding"
}
)
# Same symbol in different accounts
update_user_data(
entity="portfolio_holding",
data={"symbol": "MSFT", "quantity": 25, "account_name": "Robinhood"}
)
update_user_data(
entity="portfolio_holding",
data={"symbol": "MSFT", "quantity": 50, "account_name": "Schwab IRA"}
)
Tool 3: remove_user_data
Delete user data by entity type.
Entity: watchlist
Delete an entire watchlist.
| Field | Type | Required | Description |
|---|---|---|---|
watchlist_id |
str | Either | Watchlist ID |
name |
str | Either | Watchlist name |
# Delete by ID
remove_user_data(
entity="watchlist",
identifier={"watchlist_id": "abc-123"}
)
# Delete by name
remove_user_data(
entity="watchlist",
identifier={"name": "Tech Stocks"}
)
Entity: watchlist_item
Remove an item from a watchlist.
| Field | Type | Required | Description |
|---|---|---|---|
symbol |
str | Yes | Stock symbol |
watchlist_id |
str | No | Uses default if omitted |
# Remove from default watchlist
remove_user_data(
entity="watchlist_item",
identifier={"symbol": "NVDA"}
)
# Remove from specific watchlist
remove_user_data(
entity="watchlist_item",
identifier={"symbol": "AAPL", "watchlist_id": "abc-123"}
)
Entity: portfolio_holding
Remove a portfolio holding.
| Field | Type | Required | Description |
|---|---|---|---|
symbol |
str | Yes | Stock symbol |
account_name |
str | No | For disambiguation if same symbol in multiple accounts |
# Remove holding (when only one account)
remove_user_data(
entity="portfolio_holding",
identifier={"symbol": "AAPL"}
)
# Remove from specific account
remove_user_data(
entity="portfolio_holding",
identifier={"symbol": "MSFT", "account_name": "Robinhood"}
)
Error Handling
- If a stock is already in a watchlist, inform the user and offer alternatives
- If a holding already exists, offer to update it instead of creating a duplicate
- If user_id is not available, inform that the user needs to be logged in
Version History
- b544c1b Current 2026-07-05 09:24


