GuXing-code/agent-skills-mirror

Skill de requête d'actualités IA en chinois depuis AI HOT (aihot.virxact.com). Permet à l'agent d'obtenir les dernières actualités, revues quotidiennes et tendances de l'IA de manière naturelle en chinois, sans configuration de clé API ni serveur MCP.

Qu'est-ce que agent-skills-mirror ?

Cette skill permet à un agent IA (comme Claude Code, Cursor ou Codex) d'interroger l'API publique de AI HOT (aihot.virxact.com) en temps réel pour obtenir un résumé des actualités de l'industrie de l'IA, en chinois. Elle est conçue pour répondre à des requêtes larges comme "les dernières nouvelles de l'IA", "les nouvelles d'hier", ou "les publications de modèles récents", en utilisant directement une API REST avec `curl`. La skill gère automatiquement le routage intelligent : par défaut, elle utilise les entrées sélectionnées éditées par l'équipe d'AI HOT (`mode=selected`), et elle passe au rapport quotidien (`/api/public/daily`) uniquement lorsque l'utilisateur mentionne explicitement "日报" (rapport quotidien). Elle gère le filtrage par catégorie (modèles, produits, industrie, articles, conseils), les fenêtres temporelles (depuis, 24h, 3 jours, etc.), la pagination via curseur, et la recherche par mots-clés avec le paramètre `?q=`. La skill insiste sur l'importance d'utiliser un User-Agent de navigateur pour éviter le blocage 403, et elle fournit des directives strictes sur la présentation des résultats à l'utilisateur : format Markdown lisible, sans exposer les détails techniques de l'API.

Compatible avec✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI✓OpenCode
npx skills add https://github.com/GuXing-code/agent-skills-mirror/tree/HEAD/aihot

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Compétence AI HOT

Permet à un agent d'obtenir les actualités et revues quotidiennes AI HOT depuis aihot.virxact.com en chinois naturel, sans avoir besoin d'ouvrir un navigateur. Format standard SKILL.md, compatible avec Claude Code / Codex CLI / Cursor / Gemini CLI / OpenCode / toute plateforme compatible.

En ligne : https://aihot.virxact.com (accès public anonyme, sans jeton requis)

Prérequis : User-Agent obligatoire (points de terminaison API uniquement)

/api/public/* utilise une liste noire nginx User-Agent pour bloquer les crawlers commerciaux. Le User-Agent par défaut curl/X.Y sera bloqué avec une erreur 403 Forbidden. Toutes les commandes curl vers l'API doivent inclure un User-Agent de navigateur :

UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"

# Toutes les commandes curl vers l'API doivent inclure -H "User-Agent: $UA", par exemple :
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily"

Les exemples curl dans la section "Flux de travail" ci-dessous supposent par défaut que vous avez défini $UA – en réalité, vous devez ajouter -H "User-Agent: $UA" à chaque appel. Ne l'oubliez pas. Ignorer cette étape vous fera croire que l'API est cassée, alors qu'elle est simplement bloquée par une erreur 403.

Clarification du périmètre : Cette exigence de User-Agent s'applique uniquement aux points de terminaison /api/public/*. Les chemins d'installation /aihot-skill/{install.sh,SKILL.md,README.md} sont explicitement exemptés de la liste noire User-Agent sur nginx (ils sont conçus pour être utilisés avec curl -fsSL ... | bash en une ligne). Ne généralisez pas ce prérequis à tous les chemins de aihot.virxact.com.

Quand utiliser cette compétence

Priorité de routage (premier principe) : Par défaut, utiliser items?mode=selected – C'est le "menu principal" d'AI HOT, avec les entrées soigneusement sélectionnées chaque jour, couvrant les sujets qui intéressent les utilisateurs avec des données fraîches.

  • Utilisez daily uniquement si l'utilisateur dit explicitement "日报" (rapport quotidien) (édité, découpé par jour UTC – ne correspond pas aux fenêtres glissantes comme "24 dernières heures / aujourd'hui")
  • Utilisez mode=all uniquement si l'utilisateur dit explicitement "全部 / 完整 / 所有 / 全量" (tout/complet/intégral) (inclut les entrées non sélectionnées, plus volumineux mais plus bruyant)
  • Des questions larges comme "les nouvelles de l'IA d'aujourd'hui", "les grosses nouvelles des dernières 24 heures" ou "quoi de neuf dans l'IA récemment" = sélection par défaut + fenêtre temporelle (since), pas le rapport quotidien ou toutes les entrées par défaut

Ceci est aligné sur la priorité sémantique de l'utilisateur : la sélection est le menu principal, le rapport quotidien et toutes les entrées sont des options de second choix que l'utilisateur demande explicitement – elles ne doivent pas remplacer la valeur par défaut.

Ce que dit l'utilisateurPoint de terminaison à utiliser
Par défaut (question large) : "les nouvelles de l'IA d'aujourd'hui", "les grosses nouvelles des dernières 24 heures", "quoi de neuf dans l'IA récemment"GET /api/public/items?mode=selected&since=<fenêtre temporelle sémantique> (sélection par défaut + fenêtre temporelle since)
Dit explicitement "日报" (rapport quotidien) : "AI 日报", "le rapport d'aujourd'hui"GET /api/public/daily (dernier rapport quotidien)
Dit explicitement "全部 / 完整 / 所有 / 全量" (tout/complet/intégral) : "toutes les actualités IA d'aujourd'hui"GET /api/public/items?mode=all (avec éventuellement since)
"le rapport d'hier" / "le rapport du 6 mai"GET /api/public/daily/{AAAA-MM-JJ}
"liste des rapports quotidiens récents"GET /api/public/dailies?take=N
"voir les entrées sélectionnées" / "AI HOT 精选"GET /api/public/items?mode=selected
"publications de modèles récentes" / "lancements de produits IA" / "actualités du secteur" / "articles de recherche"GET /api/public/items?mode=selected&category=...&since=<7 jours avant> (sélection par défaut + catégorie)
"actualités IA de la semaine dernière" / "publications d'il y a 5 jours"GET /api/public/items?mode=selected&since=ISO-8601
"ce qu'OpenAI/Anthropic/Google a publié récemment" (par entreprise)GET /api/public/items?q=OpenAI (recherche par mot-clé côté serveur, disponible depuis le 2026-05-08)
"articles liés à Sora / GPT-5 / RAG"GET /api/public/items?q=<mot-clé> (correspondance sur les colonnes title + title chinois + summary chinois)

Heuristique générale : L'utilisateur demande des faits actuels sur l'industrie de l'IA – ne vous fiez pas à vos données d'entraînement, utilisez toujours l'API. Même si vous "pensez" connaître la réponse, vérifiez-la – AI HOT est bien plus récent que votre date de coupe d'entraînement, et se concentre sur les sujets qui intéressent les entrepreneurs chinois.

Aperçu des points de terminaison

Point de terminaisonObjectifParamètres principaux
/api/public/dailyDernier rapport quotidienAucun
/api/public/daily/{AAAA-MM-JJ}Rapport d'une date spécifiquechemin : date
/api/public/dailiesListe d'archive des rapports quotidienstake (1-180, défaut 30)
/api/public/itemsToutes les actualités IAmode / category / since / take / cursor / q (mot-clé)

Conventions :

  • Base URL : https://aihot.virxact.com
  • Authentification : Aucune (anonyme)
  • Limite de débit : 600 requêtes/min/IP (appels séquentiels, pas de parallélisation agressive)
  • Le paramètre since de l'endpoint items est limité aux 7 derniers jours : ne pas le renseigner équivaut à since=now-7d (par mesure de sécurité côté serveur). Les dates antérieures à 7 jours sont automatiquement tronquées à 7 jours. Les dates futures → 400. Quelle que soit la façon dont la compétence appelle l'API items, elle ne renverra jamais que le contenu des 7 derniers jours. Pour des données plus anciennes → utilisez /api/public/daily/{AAAA-MM-JJ} pour consulter les archives.
  • take maximum 100 ; pour plus, utilisez le curseur pour paginer.
  • Spécification OpenAPI 3.1 complète : https://aihot.virxact.com/openapi.yaml

Flux de travail

Chemin par défaut : Sélection + fenêtre temporelle (premier choix pour les questions larges)

La sélection = le "menu principal" soigneusement choisi chaque jour par AI HOT – couvre toutes les actualités IA importantes, triées par date de publication décroissante. Pour toute question large comme "les nouvelles de l'IA d'aujourd'hui", "les grosses nouvelles des dernières 24 heures" ou "quoi de neuf récemment", utilisez ce chemin par défaut – Par rapport au rapport quotidien : ① fenêtre temporelle flexible (24 heures / 3 jours / 1 semaine – aussi précise que la sémantique de l'utilisateur) ② données fraîches (mise à jour en temps réel, pas découpées par jour UTC) ③ qualité toujours élevée (pool aiSelected=true, sans entrées mineures).

# Obtenir les sélections des 24 dernières heures (l'utilisateur demande "les grosses nouvelles des dernières 24 heures")
since=$(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&since=$since&take=50"

# Obtenir les 50 dernières sélections (l'utilisateur demande "voir la sélection" / sans fenêtre temporelle explicite)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&take=50" \
  | jq '.items[] | {title, source, publishedAt, url}'

Obtenir le rapport quotidien (uniquement quand l'utilisateur dit "日报")

Mot-clé déclencheur : présence du caractère "日报" dans la phrase ("AI 日报", "le rapport quotidien d'aujourd'hui", "voir le rapport d'hier"). N'utilisez pas ce point de terminaison si "日报" n'est pas présent – Le rapport quotidien est un produit fixe découpé par jour UTC (minuit), qui ne correspond pas aux fenêtres glissantes comme "24 dernières heures / aujourd'hui".

Le rapport quotidien est la "couche titre" d'AI HOT – généré automatiquement à 08:00 heure de Pékin chaque jour, divisé en sections thématiques (5 sections fixes). Il contient un paragraphe d'introduction "éditorial" et est un produit fini organisé par thème.

# Obtenir le rapport quotidien d'aujourd'hui (ou le plus récent disponible)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily" \
  | jq '{date, lead: .lead.title, sections: [.sections[] | {label, n: (.items | length)}]}'

Obtenir le rapport quotidien d'une date spécifique

# AAAA-MM-JJ, basé sur minuit UTC
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily/2026-05-07"

Lister l'archive des rapports quotidiens (découverte)

Si vous ne savez pas quelles dates sont disponibles, consultez d'abord l'archive :

# Index des N derniers jours de rapports (contient uniquement la date et le titre principal)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/dailies?take=14" \
  | jq '.items[] | {date, leadTitle}'

Obtenir toutes les entrées (uniquement quand l'utilisateur dit "全部 / 完整 / 所有 / 全量")

Mot-clé déclencheur : présence de "全部" (tout), "完整" (complet), "所有" (tous) ou "全量" (intégral) dans la phrase – l'utilisateur demande volontairement les entrées mineures en dehors de la sélection. N'utilisez pas mode=all sans ces mots-clés – La sélection couvre déjà la plupart des sujets qui intéressent l'utilisateur.

# Obtenir toutes les actualités IA des dernières 24 heures (l'utilisateur demande "voir toutes les actualités IA d'aujourd'hui")
since=$(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&since=$since&take=100"

Filtrer les entrées par catégorie

5 catégories (l'API items utilise le slug anglais ; l'API daily utilise le libellé chinois) :

items?category=daily.sections[].label
ai-models模型发布/更新 (Publication/Mise à jour de modèles)
ai-products产品发布/更新 (Publication/Mise à jour de produits)
industry行业动态 (Actualités du secteur)
paper论文研究 (Articles de recherche)
tip技巧与观点 (Astuces et avis)

Si l'utilisateur demande "ce que le compte public a publié récemment" : l'API items ne contient pas de sources de comptes publics (la source mp_hot est traitée séparément sur la page /mp du site web). La compétence ne peut pas répondre à ces questions pour le moment. Vous pouvez suggérer à l'utilisateur de consulter https://aihot.virxact.com/mp pour voir les articles populaires des comptes publics.

# Exemple : les 50 derniers articles de recherche en IA (sélection par défaut + catégorie paper)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=paper&take=50" \
  | jq '.items[] | {title, source, publishedAt, url}'

# Exemple : les publications de modèles dans la sélection
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=ai-models&take=20"

# Exception : si l'utilisateur demande explicitement "tous les articles" ou "toutes les publications de modèles" → utilisez mode=all
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&category=paper&take=100"

Filtrer les entrées par fenêtre temporelle (N derniers jours)

Règle clé : Lorsque l'utilisateur demande "récent X" (publications de modèles récentes / articles récents / OpenAI récemment), vous devez inclure le paramètre since pour réduire la fenêtre à l'intention réelle de l'utilisateur ("3 jours" → 3d, "hier" → 1d, "la semaine dernière" → 7d).

Sécurité côté serveur : L'API items a une valeur par défaut de since=now-7d (limite stricte pour protéger le serveur). Même si la compétence n'inclut pas since, seules les entrées des 7 derniers jours seront renvoyées. Cependant, il est toujours recommandé d'inclure explicitement since : ① si l'utilisateur demande "les 3 derniers jours", 3d est plus précis que la valeur par défaut de 7d ② les métadonnées de sortie peuvent indiquer une fenêtre temporelle en langage humain ③ l'intention est clarifiée vis-à-vis de la règle de "7 jours maximum" annoncée publiquement.

# Obtenir les publications de modèles sélectionnées des 7 derniers jours (l'utilisateur demande "publications de modèles récentes")
since=$(date -u -v-7d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=ai-models&since=$since&take=100"

# Obtenir les entrées sélectionnées des 3 derniers jours (l'utilisateur demande explicitement "les 3 derniers jours")
since=$(date -u -v-3d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&since=$since&take=100"

Exception : si l'utilisateur demande explicitement "全量 / 所有 / 完整列表 / 包括老的" (intégral / tous / liste complète / y compris les anciens) → passez en mode=all, éventuellement sans since. Si l'utilisateur demande "看下精选" (voir la sélection) sans fenêtre temporelle, gardez mode=selected et n'incluez pas since. Cependant, si la phrase contient "最近 / 最新 / 这两天 / 这周" (récent / dernier / ces deux jours / cette semaine), par défaut, incluez since avec mode=selected.

Pagination (curseur)

La réponse de /api/public/items contient nextCursor (jeton opaque). Pour la page suivante, passez-le dans le paramètre cursor.

# Page 1
resp1=$(curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&take=100")
echo "$resp1" | jq '.items | length'   # 100

# Page 2
cursor=$(echo "$resp1" | jq -r '.nextCursor')
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&take=100&cursor=$cursor"

Arrêtez la pagination lorsque hasNext = false ou nextCursor = null. Le curseur est un jeton opaque, traitez-le comme une boîte noire – n'essayez pas de le décoder, de l'incrémenter ou de le réutiliser entre différents points de terminaison.

Recherche par mot-clé ("ce qu'OpenAI a publié récemment" / "lié à Sora" / "articles RAG")

L'API prend en charge la recherche par mot-clé côté serveur – le paramètre q effectue une correspondance ILIKE sur les colonnes title (anglais), title (chinois) et summary (chinois), via l'index PostgreSQL pg_trgm GIN (temps de réponse 2-6 ms). N'utilisez plus le modèle "récupérer un lot + jq grep côté client" – cela ne recherche que dans les 100 premières entrées du pool ; si le mot-clé se trouve au-delà de la position 100, il sera totalement manqué.

# Trouver ce qu'OpenAI a publié récemment (couvre tout le pool, pas seulement les 100 premières entrées)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?q=OpenAI&take=30"

# Trouver toutes les actualités IA liées à Sora (tout titre ou résumé contenant Sora)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?q=Sora"

# Trouver des articles RAG (catégorie + mot-clé)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?category=paper&q=RAG&take=30"

# Mot-clé + fenêtre temporelle (sélections d'Anthropic des 3 derniers jours)
SINCE=$(date -u -v-3d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&q=Anthropic&since=$SINCE"

Contraintes pour q :

  • Au moins 2 caractères (les trigrammes GIN à 1 caractère dégénèrent en scan complet de la table, le serveur les considérera comme une non-recherche)
  • Maximum 200 caractères (troncature automatique au-delà)
  • S'utilise de manière orthogonale avec les autres paramètres (mode/category/since/take/cursor) – peut se combiner avec "sélection + article + mot-clé + 7 derniers jours"
  • Partage la même limite de débit de 600 r/m

Structure des données renvoyées

Réponse de /api/public/daily

{
  "date": "2026-05-07",
  "generatedAt": "2026-05-07T00:01:23.456Z",
  "windowStart": "2026-05-06T00:00:00.000Z",
  "windowEnd":   "2026-05-07T00:00:00.000Z",
  "lead": { "title": "...", "leadParagraph": "..." },
  "sections": [
    {
      "label": "模型发布/更新",
      "items": [
        {
          "title": "...",
          "summary": "...",
          "sourceUrl": "https://...",
          "sourceName": "OpenAI Blog"
        }
      ]
    }
  ],
  "flashes": [
    { "title": "...", "sourceName": "...", "sourceUrl": "...", "publishedAt": "..." }
  ]
}

sections[].label a 5 libellés fixes : "模型发布/更新" / "产品发布/更新" / "行业动态" / "论文研究" / "技巧与观点". lead peut être null dans de très rares rapports quotidiens.

Réponse de /api/public/dailies

{
  "count": 14,
  "items": [
    { "date": "2026-05-07", "generatedAt": "...", "leadTitle": "..." }
  ]
}

Réponse de /api/public/items

{
  "count": 50,
  "hasNext": true,
  "nextCursor": "eyJhIjoxNzE0OTk1MjAwMDAwLCJpIjoiY205eHl6MTIzIn0",
  "items": [
    {
      "id": "cm9abc456def789ghi012jkl3",
      "title": "中文标题(normalize 过)",
      "title_en": "原英文标题(仅当与 title 不同时存在,否则 null)",
      "url": "https://...",
      "source": "OpenAI Blog",
      "publishedAt": "2026-05-07T15:30:00.000Z",
      "summary": "中文摘要(LLM 生成)",
      "category": "ai-models"
    }
  ]
}

Invariants des champs :

  • Toujours présents : id / title / url / source
  • Peuvent être nuls : title_en / summary / publishedAt / category
  • Valeurs possibles de category : ai-models / ai-products / industry / paper / tip / null
  • publishedAt : ISO 8601 UTC (avec Z)
  • id : chaîne cuid (25 caractères), ne présupposez pas qu'il s'agit d'un nombre

Format de sortie pour l'utilisateur

⚠️ Principe fondamental : Cette section concerne le contenu final présenté directement à l'utilisateur – il doit être en Markdown, bien formaté, et en langage que tout le monde comprend. L'utilisateur est généralement un entrepreneur non technique / designer / lecteur généraliste en IA – il doit voir un bulletin d'information en chinois, pas un journal de débogage d'API.

Aucun détail d'infrastructure (chemins de point de terminaison, paramètres bruts comme mode=selected, limites de débit, cache nginx, curseur, hasNext, etc.) ne doit apparaître dans la sortie vue par l'utilisateur. Les métadonnées en langage humain (fenêtre temporelle, nombre d'éléments, "trié par date de publication décroissante") peuvent être conservées. Critère : l'utilisateur peut-il comprendre directement ? Oui → conservez ; Non → supprimez.

Sortie de type rapport quotidien (en utilisant l'endpoint daily / daily/{date})

**AI HOT 日报 · 2026-05-07**

## 模型发布/更新
1. **<titre>** — <source>
   <résumé simplifié, moins de 50 caractères>
   <url>

## 产品发布/更新
2. ...

## 行业动态
3. ...

## 论文研究
4. ...

## 技巧与观点
5. ...

## 快讯 (si flashes contient du contenu)
- <flash.title> — <flash.source> (<flash.publishedAt converti en langage humain>)

Numérotation continue (1, 2, 3 ... N) dans tout le texte, sans recommencer à chaque ## – ainsi l'utilisateur peut voir d'un coup d'œil "27 entrées aujourd'hui".

Sortie de type liste (en utilisant l'endpoint items)

Par défaut, regroupement par catégorie + numérotation globale – L'utilisateur a déjà une attente des 5 sections (modèles/produits/secteur/articles/astuces) basée sur le rapport quotidien. Ce format est le plus naturel lorsque les catégories sont mélangées :

**AI HOT — Dernières 30 sélections**

## 模型发布/更新
1. **<titre>** — <source>
   Il y a 2 heures
   <résumé>
   <url>

## 产品发布/更新
2. **<titre>** — <source>
   ...

3. ...

## 行业动态
4. ...

S'il n'y a qu'1 seule catégorie (l'utilisateur a demandé explicitement "articles IA" / "publications de modèles", etc.), utilisez une liste plate numérotée :

**AI HOT — Articles IA de la semaine dernière**(2026-05-01 ~ 2026-05-08)

1. **<titre>** — <source>
   <résumé>
   <url>

2. ...

Sous-titres / métadonnées – uniquement en langage humain

OK (l'utilisateur comprend directement) :

  • "Fenêtre temporelle : 2026-05-05 ~ 2026-05-07"
  • "Toutes les entrées correspondant au mot-clé OpenAI au cours des 3 derniers jours"
  • "Trié par date de publication décroissante"
  • "50 entrées au total"
  • "Le rapport quotidien d'aujourd'hui (5/8) n'est généré qu'après 08:00 heure de Pékin, consultez d'abord celui du 5/7"

PAS OK (fuite d'infrastructure, NE PAS écrire) :

  • ❌ mode=selected / category=paper / take=30 etc.
  • ❌ Chemins d'API comme /api/public/items?since=...
  • ❌ "Limite de débit 600 req/min" / "Cache nginx 60s" / "x-nginx-cache: HIT"
  • ❌ "Curseur" / "hasNext=true" / "nécessite pagination via cursor ou réduction de la fenêtre since"
  • ❌ Tout code d'état HTTP / statut de cache / description de mécanisme backend

Écrivez au maximum une phrase sur la source de données : "Données fournies par aihot.virxact.com", ou omettez-la (l'utilisateur sait déjà d'où viennent les données lorsqu'il utilise la compétence).

Conversion du temps en langage humain

publishedAt est en ISO 8601 UTC. Lors de l'affichage, convertissez-le impérativement en heure de Pékin + temps relatif/absolu que l'utilisateur peut parcourir rapidement :

Valeur interneAffichage pour l'utilisateur
2026-05-08T01:48:00.000Z"Aujourd'hui à 09:48" / "Il y a 2 heures"
2026-05-07T18:08:17.000Z"Ce matin à 02:08" / "Il y a 10 heures"
2026-05-06T16:43:00.000Z"Le 5/7 à 00:43" / "Hier"

N'affichez pas directement la chaîne ISO 2026-05-07T15:30:00.000Z – l'utilisateur ne la comprend pas.

title vs title_en

Affichez title par défaut (titre chinois normalisé). N'utilisez title_en que dans les cas suivants :

  • L'utilisateur demande explicitement la version anglaise ("affiche-moi en anglais")
  • title est vide (très rare)

N'affichez pas les deux.

Gestion des erreurs courantes

  • {"error":"No daily report available yet."} (HTTP 404) : Le rapport quotidien n'a pas encore été généré (avant 08:00 heure de Pékin). Suggérez à l'utilisateur : récupérez le rapport d'hier avec curl /api/public/daily/{date d'hier}
  • {"error":"Invalid date format..."} (HTTP 400) : La date doit être au format AAAA-MM-JJ, base UTC
  • Erreurs 400 courantes pour l'endpoint items :
    • "invalid mode (must be 'selected' or 'all')"
    • "invalid category (must be one of: ai-models, ai-products, industry, paper, tip)"
    • "invalid since (must be ISO date, not in future)"
    • "invalid take (must be integer 1-100)"
  • HTTP 429 (limite de débit) : Plus de 600 req/min par IP. Appelez en série et espacez les paginations de 200 ms pour l'éviter.

À ne PAS faire

  • Ne routez PAS les questions larges comme "les nouvelles de l'IA d'aujourd'hui", "les grosses nouvelles des 24 dernières heures" ou "quoi de neuf récemment" vers daily – Ce sont des fenêtres glissantes, le rapport quotidien est un produit fini découpé à minuit UTC (journée entière du 5/6 au 5/7). La précision temporelle ne correspond pas. Par défaut, utilisez mode=selected + since=<fenêtre sémantique>. N'utilisez daily que si l'utilisateur dit explicitement "日报".
  • Ne passez PAS en mode=all par défaut si l'utilisateur n'a pas dit "全部 / 完整 / 所有 / 全量" – La sélection couvre déjà la plupart des sujets qui intéressent l'utilisateur. Utilisez mode=selected par défaut, ne passez à mode=all que si l'utilisateur le demande explicitement.
  • N'essayez pas de deviner / fabriquer du contenu – basez-vous toujours sur la réponse de l'API.
  • Ne citez pas le résumé (summary) comme si c'était le texte original – le résumé est généré par LLM, la citation nécessite de vérifier l'URL source (url / sourceUrl).
  • Ne faites PAS d'interrogation à haute fréquence – le rapport quotidien est mis à jour une fois par jour à 08:00, l'endpoint items a un cache serveur de 5 minutes. Si l'utilisateur pose la même question, vous n'avez pas besoin de rappeler l'API.
  • Ne paginez PAS en parallèle – faites-le séquentiellement avec un intervalle naturel.
  • N'essayez PAS de décoder, d'incrémenter ou de réutiliser le curseur entre différents points de terminaison – c'est un jeton opaque, son format interne peut changer sans préavis.
  • Pour les recherches par entreprise/mot-clé, utilisez la recherche côté serveur avec ?q=<mot>, ne faites PAS "récupérer un lot + jq grep côté client" (cela ne voit que les 100 premières entrées du pool et manque les correspondances au-delà).
  • Quand l'utilisateur demande "les N derniers jours X", incluez explicitement since=<il y a N jours> (l'intention est claire et les métadonnées de sortie peuvent indiquer une fenêtre temporelle en langage humain). Sans since, le serveur utilise par défaut 7 jours, ce qui empêche de récupérer des entrées plus anciennes, mais si l'utilisateur demande "les 3 derniers jours", la valeur par défaut de 7 jours inclura 4 jours de contenu non demandé.
  • N'exposez PAS dans la sortie utilisateur les chemins de point de terminaison, les paramètres bruts, les limites de débit, le TTL de cache, le curseur, hasNext, ou tout autre détail d'infrastructure – Ce sont des informations destinées aux développeurs, que l'utilisateur ne comprend pas. Voir la section "Format de sortie pour l'utilisateur → Sous-titres / métadonnées – uniquement en langage humain" ci-dessus.
  • Ne perdez PAS le suivi des entrées lors de la fusion de sorties compressées/entre jours/entre sections – La numérotation est continue. Si la réponse est trop longue, n'omettez pas d'entrées sans l'indiquer clairement à l'utilisateur.

Zone de test : vérifications avant de faire confiance à la compétence

Avant de déployer la compétence en production, effectuez manuellement les tests suivants (via le terminal) pour vérifier que l'API AI HOT fonctionne conformément à la documentation :

  1. Test de base : Confirmez que le point de terminaison de rapport quotidien renvoie une réponse valide.
# Doit renvoyer du JSON contenant date/sections, sinon vérifiez le User-Agent
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily" | jq '.date'

Résultat attendu : une chaîne de date valide (par exemple "2026-05-08").

  1. Sélection par défaut : Confirmez que l'endpoint items avec mode=selected renvoie une réponse valide.
# Doit renvoyer du JSON contenant des items, sinon vérifiez le User-Agent
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&take=3" | jq '.items | length'

Résultat attendu : une valeur numérique (généralement 3).

  1. Recherche par mot-clé : Confirmez que ?q= renvoie au moins 1 résultat.
# GPT est un mot-clé très couvrant dans AI HOT, devrait renvoyer plusieurs résultats
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?q=GPT&take=5" | jq '.count'

Résultat attendu : un nombre >= 1.

Si l'une des trois vérifications ci-dessus échoue (renvoie null / 0 / erreur 403) :

  • Vérifiez d'abord que $UA est correctement défini et inclus dans toutes les commandes curl.
  • Vérifiez que le réseau peut atteindre https://aihot.virxact.com.
  • Vérifiez que le site web AI HOT est en ligne (ouvrez https://aihot.virxact.com dans un navigateur).
  • Si tout le reste échoue, il peut y avoir une panne de service : indiquez à l'utilisateur "AI HOT est temporairement indisponible, veuillez réessayer plus tard". Ne renvoyez pas de contenu obsolète basé sur les données d'entraînement.

Appels de test supplémentaires (cas limites)

# Test de rapport quotidien à une date spécifique
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily/2026-05-07" | jq '.date'

# Test de liste d'archives
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/dailies?take=3" | jq '.items[].date'

# Test de filtre par catégorie
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=ai-models&take=3" | jq '.items[0].category'

# Test de fenêtre temporelle (hier)
SINCE=$(date -u -v-1d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '1 day ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&since=$SINCE&take=3" | jq '.items | length'

# Test de pagination (page suivante)
resp_base=$(curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&take=1")
cursor=$(echo "$resp_base" | jq -r '.nextCursor')
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&take=1&cursor=$cursor" | jq '.items[0].id'

Tous les résultats attendus doivent se comporter comme décrit dans la documentation ci-dessus (renvoyer du JSON valide, structures de données cohérentes). Si une réponse est invalide, l'infrastructure de la compétence ou la communication entre la plateforme Agent et l'API peut avoir un problème. Veuillez vérifier avec les administrateurs de la plateforme Agent.


Annexe : instructions de déploiement pour les plateformes prenant en charge la Skill

Cette compétence est conçue pour être compatible avec plusieurs plateformes d'agents. L'unité de déploiement de base est un fichier Markdown unique (ce fichier).

  • Claude Code (Anthropic) : Exécutez claude mcp add aihot-skill -f https://aihot.virxact.com/aihot-skill/install.sh && claude mcp connect aihot-skill – le script d'installation s'occupe du reste.
  • Cursor : Collez ce fichier dans .cursor/rules/aihot-skill.mdc (ou importez-le via la commande @Docs).
  • Codex CLI (OpenAI) : Copiez le fichier dans skills/aihot/ ou référencez-le dans la configuration.
  • Gemini CLI : Importez le fichier en tant que instruction système.
  • OpenCode / smithery / npx-mcp : Suivez la documentation de la plateforme respective pour importer le fichier de règles Markdown.

Tant que la plateforme prend en charge la spécification SKILL.md ou une spécification de règle Markdown, cette compétence devrait fonctionner. Si des ajustements spécifiques à la plateforme sont nécessaires, veuillez consulter la documentation de la plateforme. Pour toute question sur le contenu de la compétence elle-même, ouvrez une issue sur le dépôt GitHub.

Skills associés