User Profile logo

User Profile

OrganizationPopular
ginlix-ai
user-profile

Manage user profile including watchlists, portfolio, and preferences.

Overview

Publisherginlix-ai
RepositoryLangAlpha
Skill nameuser-profile
Stars
1.8K
Forks
288
Bundled files
1
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by ginlix-ai on GitHub. Read the source before you install it.

Installation

Install the User Profile AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/ginlix-ai/LangAlpha.git /tmp/LangAlpha
mkdir -p .claude/skills
cp -r /tmp/LangAlpha/plugins/langalpha_service/skills/user-profile .claude/skills/user-profile
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable User Profile in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads User Profile on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so User Profile is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

User Profile Skill

This skill provides 3 unified tools for managing user data:

  • get_user_data - Read user data
  • update_user_data - Create or update user data
  • remove_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

EntityDescriptionentity_id
allComplete user data (profile, preferences, watchlists with items, portfolio)Not used
profileUser info (name, timezone, locale)Not used
preferencesAll preferences (risk, investment, agent)Not used
watchlistsList of all watchlistsNot used
watchlist_itemsItems in a specific watchlistOptional watchlist_id
portfolioAll portfolio holdingsNot used

Examples

python
# 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:

ParameterTypeDescription
replaceboolIf 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.

python
# 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.

FieldTypeDescription
namestrDisplay name
timezonestre.g., "America/New_York"
localestrPreferred language, e.g., "en-US", "zh-CN"
onboarding_completedboolMark onboarding done (write-only, not returned in get)
python
# 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.

FieldTypeDescription
risk_tolerancestrRisk tolerance description (any text)
(extra fields)anyAdditional context (notes, constraints, etc.)
python
# 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.

FieldTypeDescription
company_intereststrType of companies interested in (any text)
holding_periodstrPreferred holding period (any text)
analysis_focusstrPrimary analysis focus area (any text)
(extra fields)anyAdditional context (avoid_sectors, focus_sectors, notes, etc.)
python
# 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.

FieldTypeDescription
output_stylestrPreferred output style (any text)
data_visualizationstrChart/visualization preferences (any text)
proactive_questionsstrWhen to ask clarifying questions (any text)
(extra fields)anyAdditional context (instruction, notes, etc.)
python
# 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.

FieldTypeRequiredDescription
namestrYesWatchlist name (used as key for upsert)
descriptionstrNoPurpose of the watchlist
is_defaultboolNoSet as default watchlist
python
# 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.

FieldTypeRequiredDescription
symbolstrYesStock symbol (used as key)
watchlist_idstrNoTarget watchlist (uses default if omitted)
instrument_typestrNoFree-form. Common: "stock", "etf", "index", "crypto", "future", "commodity", "currency". Other values accepted (default: "stock")
exchangestrNoe.g., "NASDAQ"
namestrNoCompany name
notesstrNoWhy you're watching
python
# 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.

FieldTypeRequiredDescription
symbolstrYesStock symbol (used as key)
quantityfloatYesNumber of shares
average_costfloatNoCost per share
account_namestrNoe.g., "Robinhood", "Fidelity IRA" (part of key)
instrument_typestrNoFree-form. Common: "stock", "etf", "index", "crypto", "future", "commodity", "currency". Other values accepted (default: "stock")
currencystrNoDefault: "USD"
notesstrNoAdditional notes
python
# 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.

FieldTypeRequiredDescription
watchlist_idstrEitherWatchlist ID
namestrEitherWatchlist name
python
# 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.

FieldTypeRequiredDescription
symbolstrYesStock symbol
watchlist_idstrNoUses default if omitted
python
# 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.

FieldTypeRequiredDescription
symbolstrYesStock symbol
account_namestrNoFor disambiguation if same symbol in multiple accounts
python
# 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

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the User Profile AI skill do?

Manage user profile including watchlists, portfolio, and preferences.

Why use User Profile on TypingMind?

Because you install it once and use it with any model. User Profile is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install User Profile in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/ginlix-ai/LangAlpha/tree/main/plugins/langalpha_service/skills/user-profile. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use User Profile?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with User Profile?

As many as you like. As long as a model supports skills, you can use User Profile with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the User Profile AI skill free?

Yes. It is published on GitHub by ginlix-ai under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇