Z.AI CLI
numman-ali/zai-cli
Command-line access to Z.AI vision analysis, web search, page reading and GitHub repo exploration through npx zai-cli, using an API key.
Implement web search capabilities using the z-ai-web-dev-sdk.
$ npx skills add jjyaoao/HelloAgents --skill web-search -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jjyaoao/HelloAgents web-search --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jjyaoao/HelloAgents.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/web-search .claude/skills/web-search && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "web-search" agent skill from https://github.com/jjyaoao/HelloAgents/tree/main/skills/web-search into .claude/skills/web-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "web-search", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jjyaoao/HelloAgents/tree/main/skills/web-searchType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jjyaoao/HelloAgents --skill web-search -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jjyaoao/HelloAgents web-search --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jjyaoao/HelloAgents.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/web-search .agents/skills/web-search && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "web-search" agent skill from https://github.com/jjyaoao/HelloAgents/tree/main/skills/web-search into .agents/skills/web-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "web-search", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jjyaoao/HelloAgents --skill web-search -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jjyaoao/HelloAgents web-search --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jjyaoao/HelloAgents.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/web-search .cursor/skills/web-search && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "web-search" agent skill from https://github.com/jjyaoao/HelloAgents/tree/main/skills/web-search into .cursor/skills/web-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "web-search", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jjyaoao/HelloAgents.git --path skills/web-search--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jjyaoao/HelloAgents --skill web-search -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jjyaoao/HelloAgents web-search --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jjyaoao/HelloAgents.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/web-search .gemini/skills/web-search && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "web-search" agent skill from https://github.com/jjyaoao/HelloAgents/tree/main/skills/web-search into .gemini/skills/web-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "web-search", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jjyaoao/HelloAgents web-searchInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jjyaoao/HelloAgents --skill web-search -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jjyaoao/HelloAgents.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/web-search .github/skills/web-search && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "web-search" agent skill from https://github.com/jjyaoao/HelloAgents/tree/main/skills/web-search into .github/skills/web-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "web-search", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jjyaoao/HelloAgents --skill web-search -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jjyaoao/HelloAgents web-search --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jjyaoao/HelloAgents.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/web-search .opencode/skills/web-search && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "web-search" agent skill from https://github.com/jjyaoao/HelloAgents/tree/main/skills/web-search into .opencode/skills/web-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "web-search", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
web-searchImplement web search capabilities using the z-ai-web-dev-sdk.
Web Search is an agent skill from jjyaoao/HelloAgents. Implement web search capabilities using the z-ai-web-dev-sdk. Use this skill when the user needs to search for real-time information from the web, retrieve up-to-date content beyond the knowledge cutoff, or find the latest news and data. Returns structured search results with URLs, snippets, and metadata.
Its SKILL.md is about 5.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts (for example `scripts/web_search.ts`).
It sits in Productivity & Automation, covering Web search. It works with Zhipu GLM. The repository describes itself as: A agent framework based on the tutorial hello-agents. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c597a7c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (TypeScript), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Web Search loads about 5.6k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 695 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from jjyaoao/HelloAgents at commit c597a7c, republished under its MIT licence (© jjyaoao). 695 words, ~5,643 tokens.
.claude/skills/web-search/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.This skill guides the implementation of web search functionality using the z-ai-web-dev-sdk package, enabling applications to search the web and retrieve current information.
Recommended Location: {project_path}/skills/web-search
Extract this skill package to the above path in your project.
Reference Scripts: Example test scripts are available in the {project_path}/skills/web-search/scripts/ directory for quick testing and reference. See {project_path}/skills/web-search/scripts/web_search.ts for a working example.
The Web Search skill allows you to build applications that can search the internet, retrieve current information, and access real-time data from web sources.
IMPORTANT: z-ai-web-dev-sdk MUST be used in backend code only. Never use it in client-side code.
The z-ai-web-dev-sdk package is already installed. Import it as shown in the examples below.
For simple web search queries, you can use the z-ai CLI instead of writing code. This is ideal for quick information retrieval, testing search functionality, or command-line automation.
# Simple search query
z-ai function --name "web_search" --args '{"query": "artificial intelligence"}'
# Using short options
z-ai function -n web_search -a '{"query": "latest tech news"}'# Limit number of results
z-ai function \
-n web_search \
-a '{"query": "machine learning", "num": 5}'
# Search with recency filter (results from last N days)
z-ai function \
-n web_search \
-a '{"query": "cryptocurrency news", "num": 10, "recency_days": 7}'# Save results to JSON file
z-ai function \
-n web_search \
-a '{"query": "climate change research", "num": 5}' \
-o search_results.json
# Recent news with file output
z-ai function \
-n web_search \
-a '{"query": "AI breakthroughs", "num": 3, "recency_days": 1}' \
-o ai_news.json# Search for specific topics
z-ai function \
-n web_search \
-a '{"query": "quantum computing applications", "num": 8}' \
-o quantum.json
# Find recent scientific papers
z-ai function \
-n web_search \
-a '{"query": "genomics research", "num": 5, "recency_days": 30}' \
-o genomics.json
# Technology news from last 24 hours
z-ai function \
-n web_search \
-a '{"query": "tech industry updates", "recency_days": 1}' \
-o today_tech.json--name, -n: Required - Function name (use "web_search")--args, -a: Required - JSON arguments object with:query (string, required): Search keywordsnum (number, optional): Number of results (default: 10)recency_days (number, optional): Filter results from last N days--output, -o <path>: Optional - Output file path (JSON format)Each result contains:
url: Full URL of the resultname: Title of the pagesnippet: Preview text/descriptionhost_name: Domain namerank: Result rankingdate: Publication/update datefavicon: Favicon URLUse CLI for:
Use SDK for:
Each search result is a SearchFunctionResultItem with the following structure:
interface SearchFunctionResultItem {
url: string; // Full URL of the result
name: string; // Title of the page
snippet: string; // Preview text/description
host_name: string; // Domain name
rank: number; // Result ranking
date: string; // Publication/update date
favicon: string; // Favicon URL
}import ZAI from 'z-ai-web-dev-sdk';
async function searchWeb(query) {
const zai = await ZAI.create();
const results = await zai.functions.invoke('web_search', {
query: query,
num: 10
});
return results;
}
// Usage
const searchResults = await searchWeb('What is the capital of France?');
console.log('Search Results:', searchResults);import ZAI from 'z-ai-web-dev-sdk';
async function searchWithLimit(query, numberOfResults) {
const zai = await ZAI.create();
const results = await zai.functions.invoke('web_search', {
query: query,
num: numberOfResults
});
return results;
}
// Usage - Get top 5 results
const topResults = await searchWithLimit('artificial intelligence news', 5);
// Usage - Get top 20 results
const moreResults = await searchWithLimit('JavaScript frameworks', 20);import ZAI from 'z-ai-web-dev-sdk';
async function getFormattedResults(query) {
const zai = await ZAI.create();
const results = await zai.functions.invoke('web_search', {
query: query,
num: 10
});
// Format results for display
const formatted = results.map((item, index) => ({
position: index + 1,
title: item.name,
url: item.url,
description: item.snippet,
domain: item.host_name,
publishDate: item.date
}));
return formatted;
}
// Usage
const results = await getFormattedResults('climate change solutions');
results.forEach(result => {
console.log(`${result.position}. ${result.title}`);
console.log(` ${result.url}`);
console.log(` ${result.description}`);
console.log('');
});import ZAI from 'z-ai-web-dev-sdk';
class SearchProcessor {
constructor() {
this.zai = null;
}
async initialize() {
this.zai = await ZAI.create();
}
async search(query, options = {}) {
const {
num = 10,
filterDomain = null,
minSnippetLength = 0
} = options;
const results = await this.zai.functions.invoke('web_search', {
query: query,
num: num
});
// Filter results
let filtered = results;
if (filterDomain) {
filtered = filtered.filter(item =>
item.host_name.includes(filterDomain)
);
}
if (minSnippetLength > 0) {
filtered = filtered.filter(item =>
item.snippet.length >= minSnippetLength
);
}
return filtered;
}
extractDomains(results) {
return [...new Set(results.map(item => item.host_name))];
}
groupByDomain(results) {
const grouped = {};
results.forEach(item => {
if (!grouped[item.host_name]) {
grouped[item.host_name] = [];
}
grouped[item.host_name].push(item);
});
return grouped;
}
sortByDate(results, ascending = false) {
return results.sort((a, b) => {
const dateA = new Date(a.date);
const dateB = new Date(b.date);
return ascending ? dateA - dateB : dateB - dateA;
});
}
}
// Usage
const processor = new SearchProcessor();
await processor.initialize();
const results = await processor.search('machine learning tutorials', {
num: 15,
minSnippetLength: 50
});
console.log('Domains found:', processor.extractDomains(results));
console.log('Grouped by domain:', processor.groupByDomain(results));
console.log('Sorted by date:', processor.sortByDate(results));import ZAI from 'z-ai-web-dev-sdk';
async function searchNews(topic, timeframe = 'recent') {
const zai = await ZAI.create();
// Add time-based keywords to query
const timeKeywords = {
recent: 'latest news',
today: 'today news',
week: 'this week news',
month: 'this month news'
};
const query = `${topic} ${timeKeywords[timeframe] || timeKeywords.recent}`;
const results = await zai.functions.invoke('web_search', {
query: query,
num: 10
});
// Sort by date (most recent first)
const sortedResults = results.sort((a, b) => {
return new Date(b.date) - new Date(a.date);
});
return sortedResults;
}
// Usage
const aiNews = await searchNews('artificial intelligence', 'today');
const techNews = await searchNews('technology', 'week');
console.log('Latest AI News:');
aiNews.forEach(item => {
console.log(`${item.name} (${item.date})`);
console.log(`${item.snippet}\n`);
});import ZAI from 'z-ai-web-dev-sdk';
class ResearchAssistant {
constructor() {
this.zai = null;
}
async initialize() {
this.zai = await ZAI.create();
}
async researchTopic(topic, depth = 'standard') {
const numResults = {
quick: 5,
standard: 10,
deep: 20
};
const results = await this.zai.functions.invoke('web_search', {
query: topic,
num: numResults[depth] || 10
});
// Analyze results
const analysis = {
topic: topic,
totalResults: results.length,
sources: this.extractDomains(results),
topResults: results.slice(0, 5).map(r => ({
title: r.name,
url: r.url,
summary: r.snippet
})),
dateRange: this.getDateRange(results)
};
return analysis;
}
extractDomains(results) {
const domains = {};
results.forEach(item => {
domains[item.host_name] = (domains[item.host_name] || 0) + 1;
});
return domains;
}
getDateRange(results) {
const dates = results
.map(r => new Date(r.date))
.filter(d => !isNaN(d));
if (dates.length === 0) return null;
return {
earliest: new Date(Math.min(...dates)),
latest: new Date(Math.max(...dates))
};
}
async compareTopics(topic1, topic2) {
const [results1, results2] = await Promise.all([
this.zai.functions.invoke('web_search', { query: topic1, num: 10 }),
this.zai.functions.invoke('web_search', { query: topic2, num: 10 })
]);
const domains1 = new Set(results1.map(r => r.host_name));
const domains2 = new Set(results2.map(r => r.host_name));
const commonDomains = [...domains1].filter(d => domains2.has(d));
return {
topic1: {
name: topic1,
results: results1.length,
uniqueDomains: domains1.size
},
topic2: {
name: topic2,
results: results2.length,
uniqueDomains: domains2.size
},
commonDomains: commonDomains
};
}
}
// Usage
const assistant = new ResearchAssistant();
await assistant.initialize();
const research = await assistant.researchTopic('quantum computing', 'deep');
console.log('Research Analysis:', research);
const comparison = await assistant.compareTopics(
'renewable energy',
'solar power'
);
console.log('Topic Comparison:', comparison);import ZAI from 'z-ai-web-dev-sdk';
async function validateSearchResults(query) {
const zai = await ZAI.create();
const results = await zai.functions.invoke('web_search', {
query: query,
num: 10
});
// Validate and score results
const validated = results.map(item => {
let score = 0;
let flags = [];
// Check snippet quality
if (item.snippet && item.snippet.length > 50) {
score += 20;
} else {
flags.push('short_snippet');
}
// Check date availability
if (item.date && item.date !== 'N/A') {
score += 20;
} else {
flags.push('no_date');
}
// Check URL validity
try {
new URL(item.url);
score += 20;
} catch (e) {
flags.push('invalid_url');
}
// Check domain quality (not perfect, but basic check)
if (!item.host_name.includes('spam') &&
!item.host_name.includes('ads')) {
score += 20;
} else {
flags.push('suspicious_domain');
}
// Check title quality
if (item.name && item.name.length > 10) {
score += 20;
} else {
flags.push('short_title');
}
return {
...item,
qualityScore: score,
validationFlags: flags,
isHighQuality: score >= 80
};
});
// Sort by quality score
return validated.sort((a, b) => b.qualityScore - a.qualityScore);
}
// Usage
const validated = await validateSearchResults('best programming practices');
console.log('High quality results:',
validated.filter(r => r.isHighQuality).length
);// Bad: Too vague
const bad = await searchWeb('information');
// Good: Specific and targeted
const good = await searchWeb('JavaScript async/await best practices 2024');
// Good: Include context
const goodWithContext = await searchWeb('React hooks tutorial for beginners');import ZAI from 'z-ai-web-dev-sdk';
async function safeSearch(query, retries = 3) {
let lastError;
for (let attempt = 1; attempt <= retries; attempt++) {
try {
const zai = await ZAI.create();
const results = await zai.functions.invoke('web_search', {
query: query,
num: 10
});
if (!Array.isArray(results) || results.length === 0) {
throw new Error('No results found or invalid response');
}
return {
success: true,
results: results,
attempts: attempt
};
} catch (error) {
lastError = error;
console.error(`Attempt ${attempt} failed:`, error.message);
if (attempt < retries) {
// Wait before retry (exponential backoff)
await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
}
}
}
return {
success: false,
error: lastError.message,
attempts: retries
};
}import ZAI from 'z-ai-web-dev-sdk';
class CachedSearch {
constructor(cacheDuration = 3600000) { // 1 hour default
this.cache = new Map();
this.cacheDuration = cacheDuration;
this.zai = null;
}
async initialize() {
this.zai = await ZAI.create();
}
getCacheKey(query, num) {
return `${query}_${num}`;
}
async search(query, num = 10) {
const cacheKey = this.getCacheKey(query, num);
const cached = this.cache.get(cacheKey);
// Check if cached and not expired
if (cached && Date.now() - cached.timestamp < this.cacheDuration) {
console.log('Returning cached results');
return {
...cached.data,
cached: true
};
}
// Perform fresh search
const results = await this.zai.functions.invoke('web_search', {
query: query,
num: num
});
// Cache results
this.cache.set(cacheKey, {
data: results,
timestamp: Date.now()
});
return {
results: results,
cached: false
};
}
clearCache() {
this.cache.clear();
}
getCacheSize() {
return this.cache.size;
}
}
// Usage
const search = new CachedSearch(1800000); // 30 minutes cache
await search.initialize();
const result1 = await search.search('TypeScript tutorial');
console.log('Cached:', result1.cached); // false
const result2 = await search.search('TypeScript tutorial');
console.log('Cached:', result2.cached); // trueclass RateLimitedSearch {
constructor(requestsPerMinute = 60) {
this.zai = null;
this.requestsPerMinute = requestsPerMinute;
this.requests = [];
}
async initialize() {
this.zai = await ZAI.create();
}
async search(query, num = 10) {
await this.checkRateLimit();
const results = await this.zai.functions.invoke('web_search', {
query: query,
num: num
});
this.requests.push(Date.now());
return results;
}
async checkRateLimit() {
const now = Date.now();
const oneMinuteAgo = now - 60000;
// Remove requests older than 1 minute
this.requests = this.requests.filter(time => time > oneMinuteAgo);
if (this.requests.length >= this.requestsPerMinute) {
const oldestRequest = this.requests[0];
const waitTime = 60000 - (now - oldestRequest);
console.log(`Rate limit reached. Waiting ${waitTime}ms`);
await new Promise(resolve => setTimeout(resolve, waitTime));
// Recheck after waiting
return this.checkRateLimit();
}
}
}import express from 'express';
import ZAI from 'z-ai-web-dev-sdk';
const app = express();
app.use(express.json());
let zaiInstance;
async function initZAI() {
zaiInstance = await ZAI.create();
}
app.get('/api/search', async (req, res) => {
try {
const { q: query, num = 10 } = req.query;
if (!query) {
return res.status(400).json({ error: 'Query parameter "q" is required' });
}
const numResults = Math.min(parseInt(num) || 10, 20);
const results = await zaiInstance.functions.invoke('web_search', {
query: query,
num: numResults
});
res.json({
success: true,
query: query,
totalResults: results.length,
results: results
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
app.get('/api/search/news', async (req, res) => {
try {
const { topic, timeframe = 'recent' } = req.query;
if (!topic) {
return res.status(400).json({ error: 'Topic parameter is required' });
}
const timeKeywords = {
recent: 'latest news',
today: 'today news',
week: 'this week news'
};
const query = `${topic} ${timeKeywords[timeframe] || timeKeywords.recent}`;
const results = await zaiInstance.functions.invoke('web_search', {
query: query,
num: 15
});
// Sort by date
const sortedResults = results.sort((a, b) => {
return new Date(b.date) - new Date(a.date);
});
res.json({
success: true,
topic: topic,
timeframe: timeframe,
results: sortedResults
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
initZAI().then(() => {
app.listen(3000, () => {
console.log('Search API running on port 3000');
});
});import ZAI from 'z-ai-web-dev-sdk';
async function searchAndSummarize(query) {
const zai = await ZAI.create();
// Step 1: Search the web
const searchResults = await zai.functions.invoke('web_search', {
query: query,
num: 10
});
// Step 2: Create summary using chat completions
const searchContext = searchResults
.slice(0, 5)
.map((r, i) => `${i + 1}. ${r.name}\n${r.snippet}`)
.join('\n\n');
const completion = await zai.chat.completions.create({
messages: [
{
role: 'assistant',
content: 'You are a research assistant. Summarize search results clearly and concisely.'
},
{
role: 'user',
content: `Query: "${query}"\n\nSearch Results:\n${searchContext}\n\nProvide a comprehensive summary of these results.`
}
],
thinking: { type: 'disabled' }
});
const summary = completion.choices[0]?.message?.content;
return {
query: query,
summary: summary,
sources: searchResults.slice(0, 5).map(r => ({
title: r.name,
url: r.url
})),
totalResults: searchResults.length
};
}
// Usage
const result = await searchAndSummarize('benefits of renewable energy');
console.log('Summary:', result.summary);
console.log('Sources:', result.sources);Issue: "SDK must be used in backend"
Issue: Empty or no results returned
Issue: Unexpected response format
Issue: Rate limiting errors
Issue: Low quality search results
scripts/web_search.ts for a quick start example© jjyaoao, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (scripts) in skills/web-search of jjyaoao/HelloAgents.
Open the folder on GitHubat commit c597a7c
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in jjyaoao/HelloAgents, which our catalogue first saw on October 7, 2026.
Web Search next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Web Search this skilljjyaoao/HelloAgents | 3.2k | 1 repos | ~5.6k | Automated safety check: Pass | MIT | |
| Z.AI CLInumman-ali/zai-cli | 110 | — | ~528 | Automated safety check: Pass | MIT | |
| Local Web SearchuluckyXH/OpenMOSS | 1.3k | — | ~392 | Automated safety check: Notes | MIT | |
| Web SearchEXboys/skilllite | 170 | 2 repos | ~1k | Automated safety check: Pass | MIT | |
| Huge AI Searchwangwingzero/huge-ai-search | 144 | — | ~563 | Automated safety check: Pass | MIT | |
| Mysearchskernelx/MySearch-Proxy | 159 | — | ~3k | Automated safety check: Notes | None |
numman-ali/zai-cli
Command-line access to Z.AI vision analysis, web search, page reading and GitHub repo exploration through npx zai-cli, using an API key.
uluckyXH/OpenMOSS
A skill your agent uses when the user asks for web search that should run via the local-160 Responses API with websearch tool (base URL like https://proxy.example.com, model gpt-5.2-codex(xhigh)).
EXboys/skilllite
Web search and content extraction with Tavily and Exa via inference.sh CLI.
wangwingzero/huge-ai-search
Searches the live web through Google AI Mode via Huge AI Search (MCP or CLI).
skernelx/MySearch-Proxy
Install, verify, debug, and use MySearch MCP/Skill. An agent skill from skernelx/MySearch-Proxy.
y49/tlive
tlive — remote approvals (Telegram/Feishu/web), live web terminal, and session monitoring for Claude Code / Codex.
jjyaoao/HelloAgents
Implement AI image generation capabilities using the z-ai-web-dev-sdk.
jjyaoao/HelloAgents
Implement specialized video understanding capabilities using the z-ai-web-dev-sdk.
jjyaoao/HelloAgents
Implement web page content extraction capabilities using the z-ai-web-dev-sdk.
jjyaoao/HelloAgents
Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction.
jjyaoao/HelloAgents
The PRIMARY tool for Spring Festival gift analysis and social interaction generation.
jjyaoao/HelloAgents
Transform UI style requirements into production-ready frontend code with systematic design tokens, accessibility compliance, and creative execution.
Works with
Categories
Implement web search capabilities using the z-ai-web-dev-sdk. Web Search is an agent skill from jjyaoao/HelloAgents. Implement web search capabilities using the z-ai-web-dev-sdk.
Web Search fits situations like: the user needs to search for real-time information from the web; retrieve up-to-date content beyond the knowledge cutoff; find the latest news and data.
Run `npx skills add jjyaoao/HelloAgents --skill web-search -a claude-code`. Or copy the skill folder (skills/web-search in jjyaoao/HelloAgents) into .claude/skills/web-search in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jjyaoao/HelloAgents --skill web-search -a codex`. Or copy the skill folder (skills/web-search in jjyaoao/HelloAgents) into .agents/skills/web-search in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jjyaoao/HelloAgents --skill web-search -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/web-search, .gemini/skills/web-search, .github/skills/web-search and .opencode/skills/web-search in your project.
Going by SKILL.md and its folder, Web Search needs TypeScript for the scripts in its folder. Our summary lists: Node.js.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Web Search is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.6k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Web Search: Z.AI CLI (numman-ali/zai-cli, 110 stars), Local Web Search (uluckyXH/OpenMOSS, 1.3k stars), Web Search (EXboys/skilllite, 170 stars) and Huge AI Search (wangwingzero/huge-ai-search, 144 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jjyaoao (a GitHub user) maintains it in jjyaoao/HelloAgents, which has 3,187 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 6, 2026.
Source: jjyaoao/HelloAgents on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.