141 lines
8.0 KiB
Protocol Buffer
141 lines
8.0 KiB
Protocol Buffer
syntax = "proto3";
|
||
|
||
package ai;
|
||
|
||
option go_package = "git.be.kaien.ru/l-ai/l-ai-core-proto/proto";
|
||
|
||
// AIRequest содержит запрос к AI модели
|
||
message AIRequest {
|
||
string text = 1; // Текст запроса
|
||
string bot_username = 2; // Username бота для упоминаний
|
||
string model_name = 3; // Название модели (по умолчанию "deepseek-v4-flash")
|
||
bool enable_reasoning = 4; // Включить режим рассуждений (по умолчанию false)
|
||
int64 global_user_id = 5; // Global user ID для получения доп. данных (профиль, воспоминания)
|
||
AnswerGenerationOptions options = 6; // Дополнительные опции генерации ответа
|
||
int64 telegram_user_id = 7; // Telegram user ID для применения пользовательских настроек (стиль ответа)
|
||
int64 steam_user_id = 8; // SteamID64 отправителя для живых Steam-диалогов (l-ai-steam) - тот же "сигнал живого чата", что telegram_user_id, для второй платформы
|
||
bool supports_deferred = 9; // Клиент умеет обрабатывать status=PENDING + GetAnswerJob (async тяжёлые тулзы). Старые клиенты не ставят — тяжёлые тулзы исполняются синхронно, как раньше.
|
||
}
|
||
|
||
// AnswerGenerationOptions содержит дополнительные опции для генерации ответа
|
||
message AnswerGenerationOptions {
|
||
bool include_user_memories = 1; // Включить воспоминания о пользователе в промпт
|
||
}
|
||
|
||
// AIResponse содержит ответ от AI модели
|
||
message AIResponse {
|
||
string content = 1; // Текст ответа (при status=PENDING — interim-сообщение)
|
||
string error = 2; // Текст ошибки, если произошла
|
||
double duration_ms = 3; // Время выполнения в миллисекундах
|
||
string reasoning_content = 4; // Текст рассуждений (если включён режим reasoning)
|
||
AnswerStatus status = 5; // COMPLETE (или UNSPECIFIED для старых клиентов) — content финальный;
|
||
// PENDING — запущена долгая job, content это interim, финал тянуть через GetAnswerJob(job_id)
|
||
string job_id = 6; // Идентификатор отложенной job (только при status=PENDING)
|
||
}
|
||
|
||
// AnswerStatus описывает, готов ли ответ синхронно или отложен в job.
|
||
enum AnswerStatus {
|
||
ANSWER_STATUS_UNSPECIFIED = 0; // трактуется как COMPLETE (обратная совместимость)
|
||
ANSWER_STATUS_COMPLETE = 1; // content — финальный ответ
|
||
ANSWER_STATUS_PENDING = 2; // запущена долгая job; поллить GetAnswerJob(job_id)
|
||
}
|
||
|
||
// GetAnswerJobRequest запрашивает статус отложенной генерации ответа.
|
||
message GetAnswerJobRequest {
|
||
string job_id = 1;
|
||
}
|
||
|
||
// AnswerJobState — состояние отложенной генерации ответа.
|
||
enum AnswerJobState {
|
||
ANSWER_JOB_STATE_UNSPECIFIED = 0;
|
||
ANSWER_JOB_STATE_PENDING = 1; // ещё выполняется (evolver работает / модель дописывает)
|
||
ANSWER_JOB_STATE_DONE = 2; // готово, content заполнен
|
||
ANSWER_JOB_STATE_FAILED = 3; // ошибка, error заполнен
|
||
ANSWER_JOB_STATE_NOT_FOUND = 4; // неизвестный/протухший job_id (напр. после рестарта core)
|
||
}
|
||
|
||
// AnswerJobResponse — результат опроса отложенной генерации.
|
||
message AnswerJobResponse {
|
||
AnswerJobState state = 1;
|
||
string content = 2; // финальный ответ, когда DONE
|
||
string error = 3; // причина, когда FAILED
|
||
double duration_ms = 4; // суммарное время генерации, когда DONE
|
||
}
|
||
|
||
// CreateSessionRequest для создания новой AI сессии
|
||
message CreateSessionRequest {
|
||
string user_id = 1; // Идентификатор пользователя
|
||
string bot_username = 2; // Username бота для упоминаний
|
||
string model_name = 3; // Название модели (по умолчанию "deepseek-v4-flash")
|
||
int64 ttl_seconds = 4; // Время жизни сессии в секундах (по умолчанию 3600 = 1 час)
|
||
}
|
||
|
||
// CreateSessionResponse содержит ID созданной сессии
|
||
message CreateSessionResponse {
|
||
string session_id = 1; // ID сессии
|
||
string status = 2; // Статус сессии
|
||
string error = 3; // Текст ошибки, если произошла
|
||
}
|
||
|
||
// AskInSessionRequest для запроса в рамках сессии
|
||
message AskInSessionRequest {
|
||
string session_id = 1; // ID сессии
|
||
string text = 2; // Текст запроса
|
||
bool enable_reasoning = 3; // Включить режим рассуждений (по умолчанию false)
|
||
int64 global_user_id = 4; // Global user ID для получения воспоминаний
|
||
AnswerGenerationOptions options = 5; // Дополнительные опции генерации
|
||
}
|
||
|
||
// SessionStatusResponse содержит статус сессии и ответ AI
|
||
message SessionStatusResponse {
|
||
string session_id = 1; // ID сессии
|
||
string status = 2; // Статус сессии (active, expired, closed)
|
||
string content = 3; // Текст ответа от AI
|
||
string error = 4; // Текст ошибки, если произошла
|
||
double duration_ms = 5; // Время выполнения в миллисекундах
|
||
string reasoning_content = 6; // Текст рассуждений (если включён режим reasoning)
|
||
}
|
||
|
||
// StatelessMessage одно сообщение для stateless запроса (role + content)
|
||
message StatelessMessage {
|
||
string role = 1; // "system", "user", "assistant"
|
||
string content = 2; // Текст сообщения
|
||
}
|
||
|
||
// StatelessRequest для stateless генерации с полным контролем над messages
|
||
message StatelessRequest {
|
||
repeated StatelessMessage messages = 1; // Массив сообщений (system + history + user)
|
||
string model_name = 2; // Название модели (по умолчанию "deepseek-v4-flash")
|
||
}
|
||
|
||
// HealthCheckRequest для проверки здоровья сервиса
|
||
message HealthCheckRequest {}
|
||
|
||
// HealthCheckResponse для ответа на проверку здоровья
|
||
message HealthCheckResponse {
|
||
bool serving = 1;
|
||
string version = 2;
|
||
}
|
||
|
||
// AIService - основной сервис для работы с AI
|
||
service AIService {
|
||
// GenerateAnswer генерирует ответ на запрос
|
||
rpc GenerateAnswer(AIRequest) returns (AIResponse);
|
||
|
||
// GenerateStateless генерирует ответ из массива messages (system+history+user)
|
||
rpc GenerateStateless(StatelessRequest) returns (AIResponse);
|
||
|
||
// HealthCheck проверяет здоровье сервиса
|
||
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
|
||
|
||
// CreateSession созда новую AI сессию
|
||
rpc CreateSession(CreateSessionRequest) returns (CreateSessionResponse);
|
||
|
||
// AskInSession отправляет запрос в рамках существующей сессии
|
||
rpc AskInSession(AskInSessionRequest) returns (SessionStatusResponse);
|
||
|
||
// GetAnswerJob возвращает статус отложенной генерации ответа (когда GenerateAnswer
|
||
// вернул status=PENDING). Клиент поллит его до DONE/FAILED и постит финал.
|
||
rpc GetAnswerJob(GetAnswerJobRequest) returns (AnswerJobResponse);
|
||
}
|