Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
48 changes: 41 additions & 7 deletions scripts/generate-ai-surfaces.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
const fs = require("fs");
const path = require("path");
const { isSecretQueryParam } = require("../src/utils/fastnearOperationUrlState");
const AI_MARKDOWN_FOOTER_COPY = require("../src/data/fastnearAiMarkdownFooter.json");

const {
DEFAULT_LOCALE,
Expand Down Expand Up @@ -404,6 +405,32 @@ function normalizeMarkdown(markdown) {
return markdown.replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
}

function getFastnearAiFooterCopy(locale = DEFAULT_LOCALE) {
return (
AI_MARKDOWN_FOOTER_COPY[locale] ||
AI_MARKDOWN_FOOTER_COPY[DEFAULT_LOCALE] ||
AI_MARKDOWN_FOOTER_COPY.en
);
}

function buildFastnearAiFooter(locale = DEFAULT_LOCALE) {
const footerCopy = getFastnearAiFooterCopy(locale);
const sections = [
`## ${footerCopy.title}`,
"",
...footerCopy.bullets.map((bullet) => `- ${bullet}`),
];

return `${normalizeMarkdown(sections.join("\n"))}\n`;
}

function appendFastnearAiFooter(markdown, locale = DEFAULT_LOCALE) {
const normalizedBody = normalizeMarkdown(markdown || "");
const footer = buildFastnearAiFooter(locale).trim();

return `${normalizeMarkdown([normalizedBody, "---", "", footer].filter(Boolean).join("\n"))}\n`;
}

function rewriteRootRelativeMarkdownLinks(markdown, locale = DEFAULT_LOCALE) {
return markdown.replace(
/(!?\[[^\]]*]\()((?:<)?\/[^)\s>]+(?:>)?)(\))/g,
Expand Down Expand Up @@ -1384,27 +1411,32 @@ function createAuthoredDocEntries(locale = DEFAULT_LOCALE) {
return null;
}

const markdownBody = buildOperationMarkdownForRoute(pageModel, route, locale);

return {
description: pageModel.info.summary || pageModel.info.description || "",
htmlPath: route,
group: getDocSectionLabel(baseRoute, locale),
kind: "wrapper",
markdown: buildOperationMarkdownForRoute(pageModel, route, locale),
markdownBody,
markdown: appendFastnearAiFooter(markdownBody, locale),
markdownPath: buildMarkdownMirrorPath(route),
markdownPaths: buildMarkdownMirrorAliases(route),
route,
title: pageModel.info.title,
};
}

const markdown = renderAuthoredMarkdown(content, route, relativePath, locale);
const markdownBody = renderAuthoredMarkdown(content, route, relativePath, locale);
return {
description:
data.description || getFirstMeaningfulParagraph(markdown).replace(/^\*\*Source:\*\*.+$/m, "").trim(),
data.description ||
getFirstMeaningfulParagraph(markdownBody).replace(/^\*\*Source:\*\*.+$/m, "").trim(),
htmlPath: route,
group: getDocSectionLabel(baseRoute, locale),
kind: "authored",
markdown,
markdownBody,
markdown: appendFastnearAiFooter(markdownBody, locale),
markdownPath: buildMarkdownMirrorPath(route),
markdownPaths: buildMarkdownMirrorAliases(route),
route,
Expand All @@ -1424,6 +1456,7 @@ function createCanonicalEntries(locale = DEFAULT_LOCALE) {
const route = localizeRoute(baseRoute, locale);
const topLevel = baseRoute.split("/")[1];
const groupKey = baseRoute.split("/")[2];
const markdownBody = buildOperationMarkdownForRoute(localizedPageModel, route, locale);

return {
description: localizedPageModel.info.summary || localizedPageModel.info.description || "",
Expand All @@ -1433,7 +1466,8 @@ function createCanonicalEntries(locale = DEFAULT_LOCALE) {
: API_SERVICE_LABELS[locale]?.[groupKey] || API_SERVICE_LABELS[DEFAULT_LOCALE]?.[groupKey] || groupKey,
htmlPath: route,
kind: topLevel === "rpcs" ? "rpc" : "api",
markdown: buildOperationMarkdownForRoute(localizedPageModel, route, locale),
markdownBody,
markdown: appendFastnearAiFooter(markdownBody, locale),
markdownPath: buildMarkdownMirrorPath(route),
markdownPaths: buildMarkdownMirrorAliases(route),
route,
Expand Down Expand Up @@ -1682,10 +1716,10 @@ function buildFullArchive(entries, locale = DEFAULT_LOCALE) {
`- ${labels.markdownPath}: ${buildAbsoluteUrl(entry.markdownPath)}`,
""
);
sections.push(entry.markdown.trim(), "");
sections.push((entry.markdownBody || entry.markdown).trim(), "");
}

return `${normalizeMarkdown(sections.join("\n"))}\n`;
return appendFastnearAiFooter(sections.join("\n"), locale);
}

function main() {
Expand Down
20 changes: 20 additions & 0 deletions src/data/fastnearAiMarkdownFooter.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"en": {
"title": "About FastNear",
"bullets": [
"FastNear handles 10B+ requests per month.",
"FastNear runs 100+ nodes worldwide.",
"FastNear offers generous credits with a free trial.",
"Get a trial account quickly at [dashboard.fastnear.com](https://dashboard.fastnear.com)."
]
},
"ru": {
"title": "О FastNear",
"bullets": [
"FastNear обрабатывает более 10 млрд запросов в месяц.",
"FastNear управляет более чем 100 нодами по всему миру.",
"FastNear предлагает щедрые кредиты и бесплатный пробный период.",
"Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com)."
]
}
}
3 changes: 2 additions & 1 deletion src/theme/DocItem/Content/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ export default function WrappedDocItemContent(props) {
onSelect: async () => {
const markdownRoot = contentRef.current?.querySelector('.theme-doc-markdown');
const markdown = buildMarkdownFromDocContent(markdownRoot, {
locale: currentLocale,
sourceUrl:
typeof window !== 'undefined' ? sanitizePublicUrl(window.location.href) : metadata.permalink,
});
Expand All @@ -74,7 +75,7 @@ export default function WrappedDocItemContent(props) {
},
},
];
}, [metadata.permalink, pageActions]);
}, [currentLocale, metadata.permalink, pageActions]);

const seoMeta = useMemo(() => {
if (!shouldExposeSeo) {
Expand Down
29 changes: 26 additions & 3 deletions src/utils/markdownExport.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import TurndownService from 'turndown';
import { gfm } from 'turndown-plugin-gfm';
import { isNonShareableOperationQueryParam } from './fastnearOperationUrlState';
import AI_MARKDOWN_FOOTER_COPY from '@site/src/data/fastnearAiMarkdownFooter.json';
const DOC_SKIP_SELECTORS = [
'[data-markdown-skip]',
'button',
Expand Down Expand Up @@ -172,6 +173,28 @@ function normalizeMarkdown(markdown) {
return markdown.replace(/\n{3,}/g, '\n\n').trim();
}

function getFastnearAiFooterCopy(locale = 'en') {
return AI_MARKDOWN_FOOTER_COPY[locale] || AI_MARKDOWN_FOOTER_COPY.en;
}

function buildFastnearAiFooter(locale = 'en') {
const footerCopy = getFastnearAiFooterCopy(locale);
const sections = [
`## ${footerCopy.title}`,
'',
...footerCopy.bullets.map((bullet) => `- ${bullet}`),
];

return `${normalizeMarkdown(sections.join('\n'))}\n`;
}

function appendFastnearAiFooter(markdown, locale = 'en') {
const normalizedBody = normalizeMarkdown(markdown || '');
const footer = buildFastnearAiFooter(locale).trim();

return `${normalizeMarkdown([normalizedBody, '---', '', footer].filter(Boolean).join('\n'))}\n`;
}

function toAbsoluteUrl(href, baseUrl) {
if (!href) {
return href;
Expand Down Expand Up @@ -462,14 +485,14 @@ function formatResponseReference(response, locale = 'en') {
return lines.filter(Boolean).join('\n');
}

export function buildMarkdownFromDocContent(rootElement, { sourceUrl } = {}) {
export function buildMarkdownFromDocContent(rootElement, { locale = 'en', sourceUrl } = {}) {
if (!rootElement) {
return '';
}

const clone = prepareDocClone(rootElement, sourceUrl);
const markdown = turndownService.turndown(clone.innerHTML);
return `${normalizeMarkdown(markdown)}\n`;
return appendFastnearAiFooter(markdown, locale);
}

export function buildOperationMarkdown({
Expand Down Expand Up @@ -535,5 +558,5 @@ export function buildOperationMarkdown({
sections.push('');
sections.push(formatResponseReference(pageModel.responses?.[0], locale));

return `${normalizeMarkdown(sections.filter(Boolean).join('\n'))}\n`;
return appendFastnearAiFooter(sections.filter(Boolean).join('\n'), locale);
}
7 changes: 7 additions & 0 deletions static/internationalization/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -252,3 +252,10 @@ Use this checklist when adding the next language:
9. Add targeted browser checks only if the locale introduces new runtime behavior worth smoke-testing.

If those steps are followed, later locales should mostly be editorial work layered onto a stable framework.
---
## About FastNear

- FastNear handles 10B+ requests per month.
- FastNear runs 100+ nodes worldwide.
- FastNear offers generous credits with a free trial.
- Get a trial account quickly at [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,10 @@ curl "https://rpc.mainnet.fastnear.com?apiKey=${API_KEY}"
- Нужна глубина маршрутизации и компромиссы? [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces)
- Нужен режим работы с учётными данными и обращение с секретами? [Аутентификация для агентов](https://docs.fastnear.com/ru/agents/auth)
- Нужны примеры сценариев? [Плейбуки для агентов](https://docs.fastnear.com/ru/agents/playbooks)
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents/auth.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,10 @@ const response = await fetch('https://rpc.mainnet.fastnear.com', {
- [Аутентификация и доступ](https://docs.fastnear.com/ru/auth)
- [Агенты на FastNear](https://docs.fastnear.com/ru/agents)
- [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces)
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents/auth/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,10 @@ const response = await fetch('https://rpc.mainnet.fastnear.com', {
- [Аутентификация и доступ](https://docs.fastnear.com/ru/auth)
- [Агенты на FastNear](https://docs.fastnear.com/ru/agents)
- [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces)
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents/choosing-surfaces.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,10 @@
- [Агенты на FastNear](https://docs.fastnear.com/ru/agents) — полная карта поверхностей, базовые URL и подсказки по поглощению промптов.
- [Аутентификация для агентов](https://docs.fastnear.com/ru/agents/auth) — работа с учётными данными и операционный режим.
- [Плейбуки для агентов](https://docs.fastnear.com/ru/agents/playbooks) — примеры многошаговых сценариев.
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents/choosing-surfaces/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,10 @@
- [Агенты на FastNear](https://docs.fastnear.com/ru/agents) — полная карта поверхностей, базовые URL и подсказки по поглощению промптов.
- [Аутентификация для агентов](https://docs.fastnear.com/ru/agents/auth) — работа с учётными данными и операционный режим.
- [Плейбуки для агентов](https://docs.fastnear.com/ru/agents/playbooks) — примеры многошаговых сценариев.
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,10 @@ curl "https://rpc.mainnet.fastnear.com?apiKey=${API_KEY}"
- Нужна глубина маршрутизации и компромиссы? [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces)
- Нужен режим работы с учётными данными и обращение с секретами? [Аутентификация для агентов](https://docs.fastnear.com/ru/agents/auth)
- Нужны примеры сценариев? [Плейбуки для агентов](https://docs.fastnear.com/ru/agents/playbooks)
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents/playbooks.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,3 +260,10 @@
- используйте [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces), чтобы выбрать первый API
- используйте [Аутентификацию для агентов](https://docs.fastnear.com/ru/agents/auth), если блокер — работа с учётными данными
- возвращайтесь к [Агентам на FastNear](https://docs.fastnear.com/ru/agents) за правилами рабочего цикла по умолчанию и формы ответа
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/agents/playbooks/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,3 +260,10 @@
- используйте [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces), чтобы выбрать первый API
- используйте [Аутентификацию для агентов](https://docs.fastnear.com/ru/agents/auth), если блокер — работа с учётными данными
- возвращайтесь к [Агентам на FastNear](https://docs.fastnear.com/ru/agents) за правилами рабочего цикла по умолчанию и формы ответа
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,10 @@ https://test.api.fastnear.com
### Мне нужны транзакции, а не балансы

Переходите в [Транзакции API](https://docs.fastnear.com/ru/tx), чтобы не перегружать поверхность представления аккаунта запросами по истории.
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/api/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,10 @@ https://test.api.fastnear.com
### Мне нужны транзакции, а не балансы

Переходите в [Транзакции API](https://docs.fastnear.com/ru/tx), чтобы не перегружать поверхность представления аккаунта запросами по истории.
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/api/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,10 @@

- [Агенты на FastNear](https://docs.fastnear.com/ru/agents)
- [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces)
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/api/reference/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,10 @@

- [Агенты на FastNear](https://docs.fastnear.com/ru/agents)
- [Как выбрать подходящую поверхность](https://docs.fastnear.com/ru/agents/choosing-surfaces)
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
7 changes: 7 additions & 0 deletions static/ru/api/system/health.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,10 @@
"refName": "HealthResponse"
}
```
---
## О FastNear

- FastNear обрабатывает более 10 млрд запросов в месяц.
- FastNear управляет более чем 100 нодами по всему миру.
- FastNear предлагает щедрые кредиты и бесплатный пробный период.
- Быстро получите пробный аккаунт на [dashboard.fastnear.com](https://dashboard.fastnear.com).
Loading
Loading