l-ai-core-proto/ai.proto

141 lines
8.0 KiB
Protocol Buffer
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}