Skip to content

Go SDK ​

Go SDK предоставляет обёртку для операций CRUD над основными ресурсами (базы знаний, документы, сессии и др.), а также для потокового взаимодействия (SSE) при ответах на вопросы. Исходный код находится в client/ и распространяется как отдельный Go-модуль; официальная CLI и серверные компоненты повторно используют этот SDK.

Установка ​

Путь модуля SDK определён в client/go.mod:

module github.com/Tencent/WeKnora/client

go 1.24.2

Способ установки:

bash
go get github.com/Tencent/WeKnora/client

Импорт:

go
import "github.com/Tencent/WeKnora/client"

Инициализация и аутентификация ​

Основные типы и конструкторы определены в client/client.go.

Структура Client ​

go
type Client struct {
    baseURL       string
    httpClient    *http.Client
    streamTimeout time.Duration
    apiKey        string
    bearerToken   string
    tenantID      *uint64
}

Экземпляр создаётся с помощью NewClient(baseURL string, options ...ClientOption) *Client. Таймаут обычного запроса по умолчанию составляет 30 секунд; потоковые (SSE) запросы по умолчанию не имеют таймаута, жизненный цикл контролируется через context (если не вызван метод WithTimeout).

Доступные параметры ClientOption ​

ОпцияОписание
WithAPIKey(key string)Установка API-ключа с длительным сроком действия, отправляется в заголовке X-API-Key
WithBearerToken(token string)Установка JWT с коротким сроком действия, отправляется в заголовке Authorization: Bearer <token> (обычно после успешного Login)
WithToken(token string)Устарело (Deprecated): псевдоним WithAPIKey версии v0.x, будет удалён в следующем мажорном релизе
WithTimeout(timeout time.Duration)Установка верхнего предела времени ожидания для обычных и потоковых запросов
WithTransport(rt http.RoundTripper)Замена базового http.RoundTripper (для промежуточного ПО, такого как повторные попытки / трассировка / подпись); передача nil восстанавливает http.DefaultTransport
WithTenantID(tenantID uint64)Добавление заголовка X-Tenant-ID к каждому запросу, используется только при наличии прав CanAccessAllTenants для явного межтенантового доступа

Пояснения к методам аутентификации ​

SDK поддерживает два типа учётных данных, которые могут быть настроены одновременно (на уровне HTTP приоритет имеет X-API-Key):

  • API Key (долгосрочный): WithAPIKey, заголовок X-API-Key;
  • Bearer JWT (краткосрочный): WithBearerToken, заголовок Authorization: Bearer <token>, используется совместно с методами Login / RefreshToken / GetCurrentUser из client/auth.go.

Типовой процесс JWT-авторизации (соответствует POST /api/v1/auth/login):

go
c := client.NewClient("http://localhost:8080")
loginResp, err := c.Login(ctx, client.LoginRequest{ /* email + пароль */ })
// Затем создание нового аутентифицированного клиента с использованием возвращённого access token
authed := client.NewClient("http://localhost:8080",
    client.WithBearerToken(loginResp.AccessToken))

Тенанты (Tenant) и внедрение заголовков ​

Метод applyAuthHeaders (client/client.go) автоматически внедряет в каждый запрос:

  • X-API-Key / Authorization (согласно конфигурации);
  • X-Request-ID: считывается из ctx.Value("RequestID") (тип string) для целей трассировки;
  • X-Tenant-ID: приоритет имеет значение "TenantID" из context (поддерживаются uint64, *uint64, числовые строки) > значение по умолчанию из WithTenantID.

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

go
tenantID := uint64(10000)
ctx := context.WithValue(context.Background(), "TenantID", &tenantID)
kb, err := apiClient.GetKnowledgeBase(ctx, kbID)

Примечание: JWT и тенантовые API-ключи уже содержат идентификатор тенанта, обычные пользователи не должны устанавливать X-Tenant-ID (серверный middleware выполняет кросс-тенантовую проверку для запросов bearer, и обычные пользователи получат ошибку 403).

Аварийный доступ Raw ​

Client.Raw(ctx, method, path, body) (экспериментально) инициирует произвольный HTTP-запрос с настроенными заголовками аутентификации; применяется для разовых интеграций и проброса через CLI weknora api. При наличии типизированных методов следует использовать их.

Ресурсы и методы ​

Ниже перечислены публичные методы Client. Внутренние методы (buildRequest, doRequest, doRequestStream, processAgentSSEStream и др.) в список не включены.

Аутентификация (Auth) — client/auth.go ​

МетодОписание
LoginВход по email и паролю, возвращает JWT access/refresh токен
GetCurrentUserПолучение информации о текущем пользователе и его тенанте (GET /api/v1/auth/me)
RefreshTokenОбмен refresh token на новый access token
SwitchTenantПереключение в указанное пространство с перевыпуском пары токенов и установкой по умолчанию для следующего входа (POST /api/v1/auth/switch-tenant)
ChangePasswordСмена текущего пароля пользователя; после успеха сервер аннулирует все сессии, вызывающая сторона должна сбросить локальные токены
GetAuthConfigЧтение публичной конфигурации аутентификации: режимы регистрации, требования к сложности пароля (GET /api/v1/auth/config, без аутентификации)

Базы знаний (KnowledgeBase) — client/knowledgebase.go ​

МетодОписание
CreateKnowledgeBaseСоздание базы знаний
GetKnowledgeBaseПолучение деталей базы знаний
ListKnowledgeBasesСписок баз знаний
UpdateKnowledgeBaseОбновление базы знаний
DeleteKnowledgeBaseУдаление базы знаний
ClearKnowledgeBaseContentsОчистка содержимого
HybridSearchГибридный поиск в базе знаний (вектор + ключевые слова); принимает ResourceURLOptions для получения прямых ссылок на файлы
TogglePinKnowledgeBaseЗакрепление / открепление
ListMoveTargetsСписок доступных целей для миграции базы знаний
CopyKnowledgeBaseКопирование базы знаний
DuplicateKnowledgeBaseДублирование (duplicate)
GetKBCloneProgressСтатус выполнения задачи клонирования

Знания (Knowledge) — client/knowledge.go ​

МетодОписание
CreateKnowledgeFromFileСоздание знания из локального файла (multipart, поддерживает metadata, переключатели модальности, кастомные имена, каналы, переопределение настроек парсинга)
CreateKnowledgeFromURLСоздание из URL
GetKnowledgeДетали знания
GetKnowledgeBatchПакетное получение
ListKnowledgeСписок знаний с пагинацией
ListKnowledgeWithFilterСписок с фильтрами (KnowledgeListFilter: теги, ключевые слова, тип файлов, статус парсинга, источники, диапазон дат, папки)
DeleteKnowledgeУдаление
DownloadKnowledgeFileСкачивание исходного файла на локальный диск
OpenKnowledgeFileПотоковое открытие исходного файла (возвращает имя + io.ReadCloser)
DownloadKnowledgeFiles / OpenKnowledgeFilesArchiveПакетное скачивание файлов одной базы знаний в ZIP-архив / потоковое чтение (POST /api/v1/knowledge-bases/{id}/knowledge/batch-download; макс. 200 ID или 512 MiB; требуется роль Contributor и права записи); использует потоковый HTTP-клиент, таймаут 30 секунд не действует
ListKnowledgeFolders / MoveKnowledgeToFolder / RenameKnowledgeFolderСтруктура папок, перемещение (путь FolderPath = "" для возврата в корень), переименование папки со всеми вложениями
UpdateKnowledgeОбновление
ReparseKnowledgeПовторный парсинг
CancelKnowledgeParseОтмена задачи парсинга
GetKnowledgeProcessingSpansПолучение span-ов обработки
UpdateImageInfoОбновление сведений об изображении
CreateManualKnowledgeСоздание «ручного» (manual) знания
UpdateManualKnowledgeОбновление ручного знания
FilterKnowledgeФильтрация по ключевым словам/типам файлов/агентам
MoveKnowledgeМиграция между базами знаний
GetKnowledgeMoveProgressСтатус задачи миграции
PreviewKnowledgeFileПредпросмотр (возвращает исходный *http.Response)
BatchUpdateKnowledgeTagsПакетное обновление тегов

Серверный API списка знаний с v0.8.2 поддерживает параметры sort_by (updated_at / created_at / file_name) и sort_order (asc / desc), по умолчанию created_at desc; структура KnowledgeListFilter эти поля пока не содержит, для кастомной сортировки используйте метод Raw, описание параметров см. в API знаний.

Блоки (Chunk) — client/chunk.go ​

МетодОписание
ListKnowledgeChunksСписок блоков знания с пагинацией
UpdateChunkОбновление содержимого/статуса блока
DeleteChunkУдаление блока
GetChunkByIDOnlyПолучение блока только по ID
DeleteGeneratedQuestionУдаление сгенерированного вопроса
DeleteChunksByKnowledgeIDУдаление всех блоков для данного знания

Сессии (Session) — client/session.go ​

МетодОписание
CreateSessionСоздание сессии
GetSessionПолучение сессии
GetSessionsByTenantСписок сессий тенанта с пагинацией
UpdateSessionОбновление
DeleteSessionУдаление
BatchDeleteSessionsПакетное удаление
GenerateTitleГенерация заголовка
KnowledgeQAStreamПотоковые ответы (SSE, см. ниже)
ContinueStreamПродолжение потока (при обрывах)
StopSessionОстановка генерации сообщения
SearchKnowledgeПоиск знаний

Сообщения (Message) — client/message.go, client/message_suggestion.go ​

МетодОписаниеФайл
LoadMessagesЗагрузка по времениclient/message.go
GetRecentMessagesПоследние N сообщенийclient/message.go
GetMessagesBeforeСообщения до указанного моментаclient/message.go
SearchMessagesПоиск в историиclient/message.go
GetChatHistoryKBStatsСтатистика истории по базам знанийclient/message.go
DeleteMessageУдалениеclient/message.go
EnsureMessageSuggestionsГенерация/перегенерация подсказокclient/message_suggestion.go
GetMessageSuggestionsПолучение подсказокclient/message_suggestion.go
RecordMessageSuggestionEventУчёт кликов/показов подсказокclient/message_suggestion.go

Диалог с агентом (потоковый) — client/agent.go ​

МетодОписание
AgentQAStreamПотоковые ответы (устарело, упрощённый интерфейс)
AgentQAStreamWithRequestПотоковые ответы (полный запрос AgentQARequest)
NewAgentSessionСоздание обёртки AgentSession (методы Ask / AskWithRequest / GetSessionID)

Управление агентами — client/agent_manage.go ​

МетодОписание
CreateAgentСоздание агента
ListAgentsСписок
GetAgentПросмотр
UpdateAgentОбновление
DeleteAgentУдаление
CopyAgentКопирование
GetAgentPlaceholdersПлейсхолдеры конфигурации
GetSuggestedQuestionsПредлагаемые вопросы

С версии v0.8.2 изменения в полях запросов:

  • UpdateAgentRequest.Avatar из string превратилось в *string: nil означает отсутствие изменений, пустая строка — очистка аватара. При обновлении SDK требуется корректировка кода (например, Avatar: &avatar).
  • В SuggestedQuestion добавлено поле KnowledgeID (источник). При ответе на такой вопрос в KnowledgeQARequest / AgentQARequest через QuestionOrigin (KnowledgeBaseID, KnowledgeID) можно передать источник, который будет приоритетно учитываться в поиске; поле носит рекомендательный характер.

Модели (Model) — client/model.go ​

МетодОписание
CreateModelСоздание
GetModelПросмотр
ListModelsСписок
UpdateModelОбновление
DeleteModelУдаление
ListModelProvidersСписок провайдеров по типам

Тенанты (Tenant) — client/tenant.go ​

МетодОписание
CreateTenant / GetTenant / UpdateTenant / DeleteTenant / ListTenants / ListAllTenants / SearchTenantsCRUD тенантов
ListTenantAPIKeys / CreateTenantAPIKey / DeleteTenantAPIKeyУправление API-ключами
GetTenantKV / UpdateTenantKVКонфигурация KV
GetAPIPrincipalConfig / UpdateAPIPrincipalConfig / CreateAPIPrincipalTestTokenУправление субъектами API

Организация и совместное использование — client/organization.go ​

МетодОписание
CreateOrganization... DeleteOrganizationCRUD организации
Join... / SubmitJoinRequest / RequestRoleUpgradeВступление и управление ролями
InviteMember...Управление приглашениями
ShareKnowledgeBase / ShareAgent...Совместный доступ

С v0.8.2 приглашения кандидатов разрешаются строго по полному ID пространства (GET /api/v1/organizations/{id}/search-tenants?q=<ID>), поиск по именам или почте не работает. SearchUsersForInvite (обёртка search-users с параметром keyword) не будет работать, так как API ожидает параметр q. Используйте Raw вызов для поиска.

FAQ — client/faq.go ​

МетодОписание
ListFAQEntries...Методы работы с FAQ (поиск, CRUD, экспорт в CSV)

Теги (Tag) — client/tag.go ​

МетодОписание
ListTags / CreateTag / UpdateTag / DeleteTagМетоды работы с тегами

MCP — client/mcp_service.go, client/mcp_endpoint.go ​

Методы для управления MCP-сервисами (CRUD, проверка соединений, метаданные) и публикации MCP-конечных точек платформы.

Инициализация и диагностика моделей — client/initialization.go ​

Методы для настройки баз знаний, проверки состояния Ollama, LLM, Embedding, Rerank и мультимодальных функций.

Системные методы (System) — client/system.go ​

Методы для получения версии, возможностей развёртывания (capabilities), статуса парсеров и хранилищ.

Другие ресурсы ​

МетодОписаниеФайл
StartEvaluation / GetEvaluationResultОценкаclient/evaluation.go
ListSkillsСписок навыковclient/skill.go
GetWebSearchProvidersПровайдеры поискаclient/web_search.go
RawЭкспериментальный метод прямого HTTP-вызоваclient/client.go

Память, навыки и личные переменные ​

ФайлМетоды
client/memory.goРабота с настройками памяти, элементами, темами, консолидация памяти
client/skill.goУстановка навыков песочницы, обновление окружения
client/env_var.goРабота с переменными окружения навыков
client/tenant.goUpdateTenantAPIKey (обновление полномочий без ротации токена)

Потоковые ответы (SSE) ​

Потоковая передача реализована через механизм колбэков: SDK парсит поток SSE, при появлении каждого кадра вызывает колбэк; при возврате ошибки колбэком поток прерывается. Размер буфера строки SSE увеличен до 4 МБ для корректной обработки больших фреймов с references.

Потоковая база знаний: KnowledgeQAStream (client/session.go) ​

go
func (c *Client) KnowledgeQAStream(
    ctx context.Context,
    sessionID string,
    request *KnowledgeQARequest,
    callback func(*StreamResponse) error,
) error

Каждый StreamResponse содержит тип (answer, references, thinking, tool_call и т.д.), контент и маркер завершения Done.

Потоковый агент: AgentQAStreamWithRequest (client/agent.go) ​

Метод для Agent-режима с поддержкой KnowledgeBaseIDs, WebSearchEnabled, @mention и изображений.

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

HTTP: APIError (client/client.go) ​

Ошибки HTTP (не 2xx) возвращаются как *APIError, содержащий StatusCode и структуру code (константы ServerErrBadRequest и т.д.).

SSE: SSEStreamError (client/stream_errors.go) ​

При получении сервером ошибки в потоке SDK вызывает колбэк с этой ошибкой, а затем возвращает *SSEStreamError. Рекомендуется использовать errors.Is(err, client.ErrSSEStreamTerminal).

Логирование и трассировка ​

client/log.go использует log/slog. Для включения отладочных сообщений:

go
client.SetDebugLevel("debug")

Трассировка запросов через RequestID в контексте автоматически передаётся в заголовке X-Request-ID.

Примеры ​

Код примеров можно найти в client/example.go.

Пример 1: Создание базы знаний и загрузка файла ​

go
// См. полный пример в исходном коде

Пример 2: Потоковый диалог ​

go
// См. полный пример в исходном коде

Справочник по исходному коду ​

  • Core и ошибки: client/client.go
  • Аутентификация: client/auth.go
  • Потоки: client/session.go, client/agent.go
  • Логи: client/log.go
  • Примеры: client/example.go

Версия v0.8.3 · MIT License