@@ -48,20 +48,24 @@ static void llm_log_payload(const char *label, const char *payload)
|
|||||||
ESP_LOGI(TAG, "%s[%u]: %s", label, (unsigned)off, chunk);
|
ESP_LOGI(TAG, "%s[%u]: %s", label, (unsigned)off, chunk);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
size_t shown = total > MIMI_LLM_LOG_PREVIEW_BYTES ? MIMI_LLM_LOG_PREVIEW_BYTES : total;
|
if (MIMI_LLM_LOG_PREVIEW_BYTES > 0) {
|
||||||
char preview[MIMI_LLM_LOG_PREVIEW_BYTES + 1];
|
size_t shown = total > MIMI_LLM_LOG_PREVIEW_BYTES ? MIMI_LLM_LOG_PREVIEW_BYTES : total;
|
||||||
memcpy(preview, payload, shown);
|
char preview[MIMI_LLM_LOG_PREVIEW_BYTES + 1];
|
||||||
preview[shown] = '\0';
|
memcpy(preview, payload, shown);
|
||||||
for (size_t i = 0; i < shown; i++) {
|
preview[shown] = '\0';
|
||||||
if (preview[i] == '\n' || preview[i] == '\r' || preview[i] == '\t') {
|
for (size_t i = 0; i < shown; i++) {
|
||||||
preview[i] = ' ';
|
if (preview[i] == '\n' || preview[i] == '\r' || preview[i] == '\t') {
|
||||||
|
preview[i] = ' ';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
ESP_LOGI(TAG, "%s (%u bytes): %s%s",
|
||||||
|
label,
|
||||||
|
(unsigned)total,
|
||||||
|
preview,
|
||||||
|
(shown < total) ? " ..." : "");
|
||||||
|
} else {
|
||||||
|
ESP_LOGI(TAG, "%s (%u bytes)", label, (unsigned)total);
|
||||||
}
|
}
|
||||||
ESP_LOGI(TAG, "%s (%u bytes): %s%s",
|
|
||||||
label,
|
|
||||||
(unsigned)total,
|
|
||||||
preview,
|
|
||||||
(shown < total) ? " ..." : "");
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -392,11 +392,14 @@ esp_err_t telegram_send_message(const char *chat_id, const char *text)
|
|||||||
free(json_str);
|
free(json_str);
|
||||||
|
|
||||||
int sent_ok = 0;
|
int sent_ok = 0;
|
||||||
|
bool markdown_failed = false;
|
||||||
if (resp) {
|
if (resp) {
|
||||||
const char *desc = NULL;
|
const char *desc = NULL;
|
||||||
sent_ok = tg_response_is_ok(resp, &desc);
|
sent_ok = tg_response_is_ok(resp, &desc);
|
||||||
if (!sent_ok) {
|
if (!sent_ok) {
|
||||||
ESP_LOGW(TAG, "Markdown send failed: %s", desc ? desc : "unknown");
|
markdown_failed = true;
|
||||||
|
ESP_LOGI(TAG, "Markdown rejected by Telegram for %s: %s",
|
||||||
|
chat_id, desc ? desc : "unknown");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,6 +438,9 @@ esp_err_t telegram_send_message(const char *chat_id, const char *text)
|
|||||||
if (!sent_ok) {
|
if (!sent_ok) {
|
||||||
all_ok = 0;
|
all_ok = 0;
|
||||||
} else {
|
} else {
|
||||||
|
if (markdown_failed) {
|
||||||
|
ESP_LOGI(TAG, "Plain-text fallback succeeded for %s", chat_id);
|
||||||
|
}
|
||||||
ESP_LOGI(TAG, "Telegram send success to %s (%d bytes)", chat_id, (int)chunk);
|
ESP_LOGI(TAG, "Telegram send success to %s (%d bytes)", chat_id, (int)chunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "tools/tool_cron.h"
|
#include "tools/tool_cron.h"
|
||||||
#include "cron/cron_service.h"
|
#include "cron/cron_service.h"
|
||||||
|
#include "bus/message_bus.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@@ -45,6 +46,14 @@ esp_err_t tool_cron_add_execute(const char *input_json, char *output, size_t out
|
|||||||
if (channel) strncpy(job.channel, channel, sizeof(job.channel) - 1);
|
if (channel) strncpy(job.channel, channel, sizeof(job.channel) - 1);
|
||||||
if (chat_id) strncpy(job.chat_id, chat_id, sizeof(job.chat_id) - 1);
|
if (chat_id) strncpy(job.chat_id, chat_id, sizeof(job.chat_id) - 1);
|
||||||
|
|
||||||
|
if (strcmp(job.channel, MIMI_CHAN_TELEGRAM) == 0 &&
|
||||||
|
(job.chat_id[0] == '\0' || strcmp(job.chat_id, "cron") == 0)) {
|
||||||
|
snprintf(output, output_size,
|
||||||
|
"Error: cron_add with channel='telegram' requires a valid chat_id");
|
||||||
|
cJSON_Delete(root);
|
||||||
|
return ESP_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
if (strcmp(schedule_type, "every") == 0) {
|
if (strcmp(schedule_type, "every") == 0) {
|
||||||
job.kind = CRON_KIND_EVERY;
|
job.kind = CRON_KIND_EVERY;
|
||||||
cJSON *interval = cJSON_GetObjectItem(root, "interval_s");
|
cJSON *interval = cJSON_GetObjectItem(root, "interval_s");
|
||||||
|
|||||||
@@ -143,8 +143,8 @@ esp_err_t tool_registry_init(void)
|
|||||||
"\"interval_s\":{\"type\":\"integer\",\"description\":\"Interval in seconds (required for 'every')\"},"
|
"\"interval_s\":{\"type\":\"integer\",\"description\":\"Interval in seconds (required for 'every')\"},"
|
||||||
"\"at_epoch\":{\"type\":\"integer\",\"description\":\"Unix timestamp to fire at (required for 'at')\"},"
|
"\"at_epoch\":{\"type\":\"integer\",\"description\":\"Unix timestamp to fire at (required for 'at')\"},"
|
||||||
"\"message\":{\"type\":\"string\",\"description\":\"Message to inject when the job fires, triggering an agent turn\"},"
|
"\"message\":{\"type\":\"string\",\"description\":\"Message to inject when the job fires, triggering an agent turn\"},"
|
||||||
"\"channel\":{\"type\":\"string\",\"description\":\"Optional reply channel (e.g. 'telegram'). Defaults to 'system'\"},"
|
"\"channel\":{\"type\":\"string\",\"description\":\"Optional reply channel (e.g. 'telegram'). If omitted, current turn channel is used when available\"},"
|
||||||
"\"chat_id\":{\"type\":\"string\",\"description\":\"Optional reply chat_id. Defaults to 'cron'\"}"
|
"\"chat_id\":{\"type\":\"string\",\"description\":\"Optional reply chat_id. Required when channel='telegram'. If omitted during a Telegram turn, current chat_id is used\"}"
|
||||||
"},"
|
"},"
|
||||||
"\"required\":[\"name\",\"schedule_type\",\"message\"]}",
|
"\"required\":[\"name\",\"schedule_type\",\"message\"]}",
|
||||||
.execute = tool_cron_add_execute,
|
.execute = tool_cron_add_execute,
|
||||||
|
|||||||
Reference in New Issue
Block a user