feat(search): route web_search through Tavily when key is configured
Signed-off-by: Asklv <boironic@gmail.com>
This commit is contained in:
@@ -400,8 +400,9 @@ static esp_err_t tavily_search_via_proxy(const char *query, search_buf_t *sb)
|
|||||||
|
|
||||||
esp_err_t tool_web_search_execute(const char *input_json, char *output, size_t output_size)
|
esp_err_t tool_web_search_execute(const char *input_json, char *output, size_t output_size)
|
||||||
{
|
{
|
||||||
if (s_search_key[0] == '\0') {
|
if (s_provider == SEARCH_PROVIDER_NONE) {
|
||||||
snprintf(output, output_size, "Error: No search API key configured. Set MIMI_SECRET_SEARCH_KEY in mimi_secrets.h");
|
snprintf(output, output_size,
|
||||||
|
"Error: No search API key configured. Set MIMI_SECRET_TAVILY_KEY or MIMI_SECRET_SEARCH_KEY in mimi_secrets.h");
|
||||||
return ESP_ERR_INVALID_STATE;
|
return ESP_ERR_INVALID_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,15 +422,13 @@ esp_err_t tool_web_search_execute(const char *input_json, char *output, size_t o
|
|||||||
|
|
||||||
ESP_LOGI(TAG, "Searching: %s", query->valuestring);
|
ESP_LOGI(TAG, "Searching: %s", query->valuestring);
|
||||||
|
|
||||||
/* Build URL */
|
/* Build URL/query fields */
|
||||||
char encoded_query[256];
|
char encoded_query[256];
|
||||||
url_encode(query->valuestring, encoded_query, sizeof(encoded_query));
|
url_encode(query->valuestring, encoded_query, sizeof(encoded_query));
|
||||||
|
char query_copy[256];
|
||||||
|
snprintf(query_copy, sizeof(query_copy), "%s", query->valuestring);
|
||||||
cJSON_Delete(input);
|
cJSON_Delete(input);
|
||||||
|
|
||||||
char path[384];
|
|
||||||
snprintf(path, sizeof(path),
|
|
||||||
"/res/v1/web/search?q=%s&count=%d", encoded_query, SEARCH_RESULT_COUNT);
|
|
||||||
|
|
||||||
/* Allocate response buffer from PSRAM */
|
/* Allocate response buffer from PSRAM */
|
||||||
search_buf_t sb = {0};
|
search_buf_t sb = {0};
|
||||||
sb.data = heap_caps_calloc(1, SEARCH_BUF_SIZE, MALLOC_CAP_SPIRAM);
|
sb.data = heap_caps_calloc(1, SEARCH_BUF_SIZE, MALLOC_CAP_SPIRAM);
|
||||||
@@ -441,12 +440,23 @@ esp_err_t tool_web_search_execute(const char *input_json, char *output, size_t o
|
|||||||
|
|
||||||
/* Make HTTP request */
|
/* Make HTTP request */
|
||||||
esp_err_t err;
|
esp_err_t err;
|
||||||
|
if (s_provider == SEARCH_PROVIDER_TAVILY) {
|
||||||
if (http_proxy_is_enabled()) {
|
if (http_proxy_is_enabled()) {
|
||||||
err = search_via_proxy(path, &sb);
|
err = tavily_search_via_proxy(query_copy, &sb);
|
||||||
|
} else {
|
||||||
|
err = tavily_search_direct(query_copy, &sb);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
char path[384];
|
||||||
|
snprintf(path, sizeof(path),
|
||||||
|
"/res/v1/web/search?q=%s&count=%d", encoded_query, SEARCH_RESULT_COUNT);
|
||||||
|
if (http_proxy_is_enabled()) {
|
||||||
|
err = brave_search_via_proxy(path, &sb);
|
||||||
} else {
|
} else {
|
||||||
char url[512];
|
char url[512];
|
||||||
snprintf(url, sizeof(url), "https://api.search.brave.com%s", path);
|
snprintf(url, sizeof(url), "https://api.search.brave.com%s", path);
|
||||||
err = search_direct(url, &sb);
|
err = brave_search_direct(url, &sb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
@@ -464,7 +474,11 @@ esp_err_t tool_web_search_execute(const char *input_json, char *output, size_t o
|
|||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s_provider == SEARCH_PROVIDER_TAVILY) {
|
||||||
|
format_tavily_results(root, output, output_size);
|
||||||
|
} else {
|
||||||
format_results(root, output, output_size);
|
format_results(root, output, output_size);
|
||||||
|
}
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Search complete, %d bytes result", (int)strlen(output));
|
ESP_LOGI(TAG, "Search complete, %d bytes result", (int)strlen(output));
|
||||||
@@ -479,7 +493,24 @@ esp_err_t tool_web_search_set_key(const char *api_key)
|
|||||||
ESP_ERROR_CHECK(nvs_commit(nvs));
|
ESP_ERROR_CHECK(nvs_commit(nvs));
|
||||||
nvs_close(nvs);
|
nvs_close(nvs);
|
||||||
|
|
||||||
strncpy(s_search_key, api_key, sizeof(s_search_key) - 1);
|
strncpy(s_brave_key, api_key, sizeof(s_brave_key) - 1);
|
||||||
|
if (s_provider == SEARCH_PROVIDER_NONE) {
|
||||||
|
s_provider = SEARCH_PROVIDER_BRAVE;
|
||||||
|
}
|
||||||
ESP_LOGI(TAG, "Search API key saved");
|
ESP_LOGI(TAG, "Search API key saved");
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp_err_t tool_web_search_set_tavily_key(const char *api_key)
|
||||||
|
{
|
||||||
|
nvs_handle_t nvs;
|
||||||
|
ESP_ERROR_CHECK(nvs_open(MIMI_NVS_SEARCH, NVS_READWRITE, &nvs));
|
||||||
|
ESP_ERROR_CHECK(nvs_set_str(nvs, MIMI_NVS_KEY_TAVILY_KEY, api_key));
|
||||||
|
ESP_ERROR_CHECK(nvs_commit(nvs));
|
||||||
|
nvs_close(nvs);
|
||||||
|
|
||||||
|
strncpy(s_tavily_key, api_key, sizeof(s_tavily_key) - 1);
|
||||||
|
s_provider = SEARCH_PROVIDER_TAVILY;
|
||||||
|
ESP_LOGI(TAG, "Tavily API key saved");
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user