Recherche web
Implémenter la capacité de recherche web avec defineWebSearch — la requête que reçoit une extension, la fenêtre de récence et la date de publication que chaque résultat peut porter.
La recherche web est une capacité de toolkit, et non une famille de modèles. Une extension capable de rechercher sur le
web la déclare sur un toolkit avec defineWebSearch(), et la plateforme achemine chaque appel
action.search.web — le bloc Search, l'outil de recherche web de l'Agent, les notebooks et
l'opération /api/platform/v1/action/search/web — vers le fournisseur sélectionné par l'organisation.
Définir la capacité
import {
defineToolkit,
defineWebSearch,
} from "@scrydon/sdk-authoring/extensions/define";
import {
WEB_SEARCH_RECENCY,
type WebSearchRecency,
} from "@scrydon/sdk-authoring/extensions/capabilities/web-search";
// Map the platform's recency window to your vendor's own knob.
const FRESHNESS: Record<WebSearchRecency, string> = {
[WEB_SEARCH_RECENCY.DAY]: "day",
[WEB_SEARCH_RECENCY.WEEK]: "week",
[WEB_SEARCH_RECENCY.MONTH]: "month",
[WEB_SEARCH_RECENCY.YEAR]: "year",
};
const webSearch = defineWebSearch({
fetchModels: async () => [{ id: "search-v1", name: "Search v1", capability: "webSearch" }],
async execute(request, ctx) {
const hits = await myVendor.search({
apiKey: ctx.apiKey,
q: request.query,
limit: request.maxResults,
...(request.recency ? { freshness: FRESHNESS[request.recency] } : {}),
});
return {
results: hits.map((hit) => ({
title: hit.title,
url: hit.url,
snippet: hit.summary,
// This vendor reports ISO 8601 with a zone already; convert yours if it does not.
...(hit.published_at ? { publishedDate: hit.published_at } : {}),
})),
vendor: "my-vendor",
};
},
});
export const searchToolkit = defineToolkit({
id: "search",
name: "My Search",
credentialRef: "apiKey",
webSearch,
});La requête
| Champ | Type | Signification |
|---|---|---|
query | string | Requête en texte libre. |
maxResults | number? | Nombre de résultats à renvoyer. Limitez-le au maximum de votre fournisseur. |
page | number? | Page indexée à partir de 1. |
safe | "active" | "off"? | Mode de recherche sécurisée. Omis : la valeur par défaut du fournisseur (celle de Google est off). |
language | string? | Balise de langue BCP-47, par exemple en. |
recency | "day" | "week" | "month" | "year"? | Ne renvoyer que les résultats publiés dans cette fenêtre. Omis : aucune restriction de date. |
Utilisez WEB_SEARCH_RECENCY au lieu d'écrire les quatre valeurs en toutes lettres. Si votre fournisseur n'a pas de
filtre de fraîcheur, ignorez recency. L'appelant obtient tout de même des résultats, simplement non filtrés par date.
La réponse
Chaque résultat porte title, url, un snippet facultatif et un publishedDate facultatif.
publishedDate prend l'une de deux formes ISO 8601, aussi précise que ce que votre fournisseur indique :
- une date calendaire, par exemple
2026-09-20; - une date-heure qui indique son fuseau avec
Zou±hh:mm, par exemple2026-09-20T08:15:00Z,2026-09-20T10:15+02:00ou2026-09-20T10:15:30.250Z. Les secondes et les fractions sont facultatives.
Renseignez-le uniquement lorsque le fournisseur vous donne une vraie date, et convertissez vous-même tout autre format du fournisseur vers l'une
de ces formes. Ne devinez jamais. Une date-heure sans fuseau ne désigne pas un instant, et
une année seule ou 09/20/2026 ne désigne pas un jour : omettez donc publishedDate dans ces cas.
API Platform vérifie publishedDate avant que le résultat n'en sorte. Une valeur qui ne correspond à aucune des
deux formes ci-dessus est supprimée. Elle ne fait pas échouer la recherche et n'est pas convertie.
Fournisseurs intégrés
Le fournisseur intégré Google Custom Search associe recency à
dateRestrict (d1, w1, m1, y1) ; son bloc démarre sur Any time, qui n'envoie aucun
dateRestrict. Il lit publishedDate dans les métabalises de la page, en vérifiant celles-ci dans l'ordre :
article:published_time, datepublished, og:published_time, pubdate, date, dc.date,
article:modified_time, og:updated_time. La première balise contenant une date l'emporte. Une valeur de balise dans
un autre format n'est convertie que lorsque son jour est sans ambiguïté et, pour une heure, que son fuseau est indiqué.
Sep 20, 2026 et 2026/09/20 deviennent 2026-09-20 ; 09/20/2026, 2026 et une heure sans fuseau
sont ignorés.