Skip to Content
Руководство для разработчиковTypeScript SDK

TypeScript SDK

@qwen-code/sdk

Минимальный экспериментальный TypeScript SDK для программного доступа к Qwen Code.

Вы можете отправлять запросы на новые функции, issues или PR.

Установка

npm install @qwen-code/sdk

Требования

  • Node.js >= 20.0.0
  • Qwen Code  >= 0.4.0 (stable) установлен и доступен в PATH

Примечание для пользователей nvm: Если вы используете nvm для управления версиями Node.js, SDK может не определить исполняемый файл Qwen Code автоматически. Вам следует явно указать опцию pathToQwenExecutable, задав полный путь к бинарному файлу qwen.

Быстрый старт

import { query } from '@qwen-code/sdk'; // Single-turn query const result = query({ prompt: 'What files are in the current directory?', options: { cwd: '/path/to/project', }, }); // Iterate over messages for await (const message of result) { if (message.type === 'assistant') { console.log('Assistant:', message.message.content); } else if (message.type === 'result') { console.log('Result:', message.result); } }

Справочник API

query(config)

Создает новую сессию запроса к Qwen Code.

Параметры

  • prompt: string | AsyncIterable<SDKUserMessage> — Запрос для отправки. Используйте строку для одношаговых запросов или асинхерируемый итератор для многошаговых диалогов.
  • options: QueryOptions — Параметры конфигурации сессии запроса.

QueryOptions

ОпцияТипПо умолчаниюОписание
cwdstringprocess.cwd()Рабочая директория для сессии запроса. Определяет контекст, в котором выполняются файловые операции и команды.
modelstring-Используемая AI-модель (например, 'qwen-max', 'qwen-plus', 'qwen-turbo'). Имеет приоритет над переменными окружения OPENAI_MODEL и QWEN_MODEL.
pathToQwenExecutablestringОпределяется автоматическиПуть к исполняемому файлу Qwen Code. Поддерживает несколько форматов: 'qwen' (нативный бинарник из PATH), '/path/to/qwen' (явный путь), '/path/to/cli.js' (Node.js-бандл), 'node:/path/to/cli.js' (принудительный запуск в Node.js), 'bun:/path/to/cli.js' (принудительный запуск в Bun). Если не указан, автоматически определяется из: переменной окружения QWEN_CODE_CLI_PATH, ~/.volta/bin/qwen, ~/.npm-global/bin/qwen, /usr/local/bin/qwen, ~/.local/bin/qwen, ~/node_modules/.bin/qwen, ~/.yarn/bin/qwen.
permissionMode'default' | 'plan' | 'auto-edit' | 'yolo''default'Режим разрешений, управляющий подтверждением выполнения инструментов. Подробности см. в разделе Режимы разрешений.
canUseToolCanUseTool-Пользовательский обработчик разрешений для подтверждения выполнения инструментов. Вызывается, когда инструмент требует подтверждения. Должен ответить в течение 60 секунд, иначе запрос будет автоматически отклонен. См. Пользовательский обработчик разрешений.
envRecord<string, string>-Переменные окружения, передаваемые процессу Qwen Code. Объединяются с переменными окружения текущего процесса.
systemPromptstring | QuerySystemPromptPreset-Конфигурация системного промпта для основной сессии. Используйте строку для полной замены встроенного системного промпта Qwen Code или объект-пресет, чтобы сохранить встроенный промпт и добавить дополнительные инструкции.
mcpServersRecord<string, McpServerConfig>-MCP-серверы (Model Context Protocol) для подключения. Поддерживает внешние серверы (stdio/SSE/HTTP) и встроенные в SDK серверы. Внешние серверы настраиваются через параметры транспорта, такие как command, args, url, httpUrl и т.д. SDK-серверы используют { type: 'sdk', name: string, instance: Server }.
abortControllerAbortController-Контроллер для отмены сессии запроса. Вызовите abortController.abort() для завершения сессии и очистки ресурсов.
debugbooleanfalseВключает режим отладки для подробного логирования процесса CLI.
maxSessionTurnsnumber-1 (без ограничений)Максимальное количество ходов диалога до автоматического завершения сессии. Ход состоит из сообщения пользователя и ответа ассистента.
coreToolsstring[]-Аналог tool.core в settings.json. Если указано, AI будут доступны только эти инструменты. Пример: ['read_file', 'write_file', 'run_terminal_cmd'].
excludeToolsstring[]-Аналог tool.exclude в settings.json. Исключенные инструменты сразу возвращают ошибку разрешения. Имеет наивысший приоритет над всеми остальными настройками разрешений. Поддерживает сопоставление с шаблоном: имя инструмента ('write_file'), класс инструмента ('ShellTool') или префикс shell-команды ('ShellTool(rm )').
allowedToolsstring[]-Аналог tool.allowed в settings.json. Совпадающие инструменты обходят коллбэк canUseTool и выполняются автоматически. Применяется только когда инструмент требует подтверждения. Поддерживает те же шаблоны, что и excludeTools.
authType'openai' | 'qwen-oauth''openai'Тип аутентификации для AI-сервиса. Использование 'qwen-oauth' в SDK не рекомендуется, так как учетные данные хранятся в ~/.qwen и могут требовать периодического обновления.
agentsSubagentConfig[]-Конфигурация субагентов, которые могут быть вызваны во время сессии. Субагенты — это специализированные AI-агенты для конкретных задач или доменов.
includePartialMessagesbooleanfalseПри значении true SDK отправляет неполные сообщения по мере их генерации, что позволяет получать ответ AI в реальном времени в потоковом режиме.

Таймауты

SDK применяет следующие таймауты по умолчанию:

ТаймаутПо умолчаниюОписание
canUseTool1 минутаМаксимальное время ответа коллбэка canUseTool. При превышении запрос инструмента автоматически отклоняется.
mcpRequest1 минутаМаксимальное время выполнения вызовов MCP-инструментов через SDK.
controlRequest1 минутаМаксимальное время выполнения операций управления, таких как initialize(), setModel(), setPermissionMode() и interrupt().
streamClose1 минутаМаксимальное время ожидания завершения инициализации перед закрытием CLI stdin в многошаговом режиме с SDK MCP-серверами.

Вы можете настроить эти таймауты через опцию timeout:

const query = qwen.query('Your prompt', { timeout: { canUseTool: 60000, // 60 секунд для коллбэка разрешений mcpRequest: 600000, // 10 минут для вызовов MCP-инструментов controlRequest: 60000, // 60 секунд для запросов управления streamClose: 15000, // 15 секунд ожидания закрытия потока }, });

Типы сообщений

SDK предоставляет type guards для определения различных типов сообщений:

import { isSDKUserMessage, isSDKAssistantMessage, isSDKSystemMessage, isSDKResultMessage, isSDKPartialAssistantMessage, } from '@qwen-code/sdk'; for await (const message of result) { if (isSDKAssistantMessage(message)) { // Handle assistant message } else if (isSDKResultMessage(message)) { // Handle result message } }

Методы экземпляра Query

Экземпляр Query, возвращаемый query(), предоставляет несколько методов:

const q = query({ prompt: 'Hello', options: {} }); // Get session ID const sessionId = q.getSessionId(); // Check if closed const closed = q.isClosed(); // Interrupt the current operation await q.interrupt(); // Change permission mode mid-session await q.setPermissionMode('yolo'); // Change model mid-session await q.setModel('qwen-max'); // Close the session await q.close();

Режимы разрешений

SDK поддерживает различные режимы разрешений для управления выполнением инструментов:

  • default: Инструменты записи отклоняются, если не одобрены через коллбэк canUseTool или не указаны в allowedTools. Инструменты только для чтения выполняются без подтверждения.
  • plan: Блокирует все инструменты записи, предписывая AI сначала предоставить план.
  • auto-edit: Автоматически одобряет инструменты редактирования (edit, write_file), тогда как остальные требуют подтверждения.
  • yolo: Все инструменты выполняются автоматически без подтверждения.

Цепочка приоритетов разрешений

  1. excludeTools — Полностью блокирует инструменты
  2. permissionMode: 'plan' — Блокирует инструменты, не являющиеся read-only
  3. permissionMode: 'yolo' — Автоматически одобряет все инструменты
  4. allowedTools — Автоматически одобряет совпадающие инструменты
  5. Коллбэк canUseTool — Пользовательская логика одобрения
  6. Поведение по умолчанию — Автоматический отказ в режиме SDK

Примеры

Многошаговый диалог

import { query, type SDKUserMessage } from '@qwen-code/sdk'; async function* generateMessages(): AsyncIterable<SDKUserMessage> { yield { type: 'user', session_id: 'my-session', message: { role: 'user', content: 'Create a hello.txt file' }, parent_tool_use_id: null, }; // Wait for some condition or user input yield { type: 'user', session_id: 'my-session', message: { role: 'user', content: 'Now read the file back' }, parent_tool_use_id: null, }; } const result = query({ prompt: generateMessages(), options: { permissionMode: 'auto-edit', }, }); for await (const message of result) { console.log(message); }

Пользовательский обработчик разрешений

import { query, type CanUseTool } from '@qwen-code/sdk'; const canUseTool: CanUseTool = async (toolName, input, { signal }) => { // Allow all read operations if (toolName.startsWith('read_')) { return { behavior: 'allow', updatedInput: input }; } // Prompt user for write operations (in a real app) const userApproved = await promptUser(`Allow ${toolName}?`); if (userApproved) { return { behavior: 'allow', updatedInput: input }; } return { behavior: 'deny', message: 'User denied the operation' }; }; const result = query({ prompt: 'Create a new file', options: { canUseTool, }, });

С внешними MCP-серверами

import { query } from '@qwen-code/sdk'; const result = query({ prompt: 'Use the custom tool from my MCP server', options: { mcpServers: { 'my-server': { command: 'node', args: ['path/to/mcp-server.js'], env: { PORT: '3000' }, }, }, }, });

Переопределение системного промпта

import { query } from '@qwen-code/sdk'; const result = query({ prompt: 'Say hello in one sentence.', options: { systemPrompt: 'You are a terse assistant. Answer in exactly one sentence.', }, });

Добавление к встроенному системному промпту

import { query } from '@qwen-code/sdk'; const result = query({ prompt: 'Review the current directory.', options: { systemPrompt: { type: 'preset', preset: 'qwen_code', append: 'Be terse and focus on concrete findings.', }, }, });

С встроенными в SDK MCP-серверами

SDK предоставляет tool и createSdkMcpServer для создания MCP-серверов, работающих в том же процессе, что и ваше SDK-приложение. Это полезно, когда вы хотите предоставить AI пользовательские инструменты без запуска отдельного серверного процесса.

tool(name, description, inputSchema, handler)

Создает определение инструмента с выводом типов через Zod-схему.

ПараметрТипОписание
namestringИмя инструмента (1–64 символа, начинается с буквы, допускаются буквы, цифры и подчеркивания)
descriptionstringЧитаемое описание того, что делает инструмент
inputSchemaZodRawShapeОбъект Zod-схемы, определяющий входные параметры инструмента
handler(args, extra) => Promise<Result>Асинхронная функция, выполняющая инструмент и возвращающая блоки контента MCP

Обработчик должен возвращать объект CallToolResult следующей структуры:

{ content: Array< | { type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string } | { type: 'resource'; uri: string; mimeType?: string; text?: string } >; isError?: boolean; }

createSdkMcpServer(options)

Создает экземпляр MCP-сервера, встроенного в SDK.

ОпцияТипПо умолчаниюОписание
namestringОбязательноУникальное имя MCP-сервера
versionstring'1.0.0'Версия сервера
toolsSdkMcpToolDefinition[]-Массив инструментов, созданных с помощью tool()

Возвращает объект McpSdkServerConfigWithInstance, который можно напрямую передать в опцию mcpServers.

Пример

import { z } from 'zod'; import { query, tool, createSdkMcpServer } from '@qwen-code/sdk'; // Define a tool with Zod schema const calculatorTool = tool( 'calculate_sum', 'Add two numbers', { a: z.number(), b: z.number() }, async (args) => ({ content: [{ type: 'text', text: String(args.a + args.b) }], }), ); // Create the MCP server const server = createSdkMcpServer({ name: 'calculator', tools: [calculatorTool], }); // Use the server in a query const result = query({ prompt: 'What is 42 + 17?', options: { permissionMode: 'yolo', mcpServers: { calculator: server, }, }, }); for await (const message of result) { console.log(message); }

Отмена запроса

import { query, isAbortError } from '@qwen-code/sdk'; const abortController = new AbortController(); const result = query({ prompt: 'Long running task...', options: { abortController, }, }); // Abort after 5 seconds setTimeout(() => abortController.abort(), 5000); try { for await (const message of result) { console.log(message); } } catch (error) { if (isAbortError(error)) { console.log('Query was aborted'); } else { throw error; } }

Обработка ошибок

SDK предоставляет класс AbortError для обработки отмененных запросов:

import { AbortError, isAbortError } from '@qwen-code/sdk'; try { // ... query operations } catch (error) { if (isAbortError(error)) { // Handle abort } else { // Handle other errors } }
Last updated on