Полезные материалы
В этом разделе вы найдете ссылки на внутренние курсы по разработке агентов с помощью фреймворков LangChain и LangGraph, а также репозитории агентов, которые демонстрируют функции GigaLab, и примеры графов TS-агентов.
Код других агентов, опубликованных в сервисе, вы можете посмотреть в репозитории giga-labs/agents .
Курсы
В Пульсе представлены курсы по разработке LLM-приложений и агентов с помощью фреймворков LangChain и LangGraph:
- LangChain — курс рассказывает об архитектуре LangChain, промптах, сообщениях, цепочках, памяти, языке LCEL;
- LangGraph — курс рассказывает об архитектуре фреймворка, связке с LangChain, инструментах для реализации памяти и сложной логики, создании агентов и RAG на графах.
Формат курсов — текстовый практикум. Каждая тема закрепляется заданиями в Jupyter Notebook; запускать можно локально или в Google Colab, в удобном вам темпе.
Репозитории с примерами агентов
| Агент | Описание | Репозиторий |
|---|---|---|
| sample | Образец Python-агента с инструментами, памятью и подсказками | sample |
| sample-ts | Образец TypeScript-агента с инструментами, памятью и подсказками | sample-ts |
| ai-disrupt | Простой агент-валидатор с функцией структурного вывода | ai-disrupt |
Примеры графов TypeScript-агентов
Ниже — примеры паттернов графов агентов sample-ts и ai-disrupt.
Полный агент с инструментами и подсказками
Паттерн из sample-ts : агент с инструментами, циклом вызовов и генерацией подсказок.
__start__ → agent → [tool_calls?] → tools → agent (цикл)
→ [нет tool_calls] → suggests → END
import { StateGraph, MessagesAnnotation, END } from "@langchain/langgraph";
import { ToolNode } from "@langchain/langgraph/prebuilt";
const workflow = new StateGraph(MessagesAnnotation)
.addNode("agent", agentNode)
.addNode("tools", new ToolNode(TOOLS))
.addNode("suggests", suggestNode)
.addEdge("__start__", "agent")
.addConditionalEdges("agent", routeNext, {
tools: "tools",
suggests: "suggests",
})
.addEdge("tools", "agent")
.addEdge("suggests", END);
export const graph = workflow.compile();
Маршрутизация
function routeNext(
state: typeof MessagesAnnotation.State,
): "tools" | "suggests" {
const last = state.messages[state.messages.length - 1] as any;
const hasToolCalls =
(last?.tool_calls && last.tool_calls.length > 0) ||
(last?.additional_kwargs?.function_call);
return hasToolCalls ? "tools" : "suggests";
}
Узел агента
Всегда передавайте config вторым аргументом в invoke() — это обеспечивает корректную работу потоковой передачи токенов и отслеживания (tracing):
async function agentNode(
state: typeof MessagesAnnotation.State,
config: LangGraphRunnableConfig,
) {
const systemPrompt = buildSystemPrompt();
const messages = [new SystemMessage(systemPrompt), ...state.messages];
await ensureFreshToken(llm, TOKEN_MANAGER_OPTS);
const llmWithTools = llm.bind({
tools: GIGACHAT_FUNCTIONS,
tool_choice: "auto",
} as any);
const response = await llmWithTools.invoke(messages, config);
return { messages: [response] };
}