#include #include #include #include #include "gemini.h" #include "utils.h" char* analyze_crash(const char *api_key, const char *traceback, const char *sys_info) { char url[512]; snprintf(url, sizeof(url), "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=%s", api_key); // Construct JSON payload JsonBuilder *builder = json_builder_new(); json_builder_begin_object(builder); json_builder_set_member_name(builder, "contents"); json_builder_begin_array(builder); json_builder_begin_object(builder); json_builder_set_member_name(builder, "parts"); json_builder_begin_array(builder); json_builder_begin_object(builder); json_builder_set_member_name(builder, "text"); char prompt[4096]; snprintf(prompt, sizeof(prompt), "Analyze this C crash traceback and system info. Explain the likely cause and suggest a fix.\n\nSystem Info:\n%s\n\nTraceback:\n%s", sys_info, traceback); json_builder_add_string_value(builder, prompt); json_builder_end_object(builder); json_builder_end_array(builder); json_builder_end_object(builder); json_builder_end_array(builder); json_builder_end_object(builder); JsonGenerator *gen = json_generator_new(); JsonNode *root = json_builder_get_root(builder); json_generator_set_root(gen, root); char *json_body = json_generator_to_data(gen, NULL); struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/json"); char *response = perform_http_post(url, headers, json_body); // Cleanup curl_slist_free_all(headers); g_free(json_body); g_object_unref(gen); g_object_unref(builder); if (!response) return NULL; // Parse Response to extract text // Response structure: { "candidates": [ { "content": { "parts": [ { "text": "..." } ] } } ] } JsonParser *parser = json_parser_new(); if (!json_parser_load_from_data(parser, response, -1, NULL)) { free(response); g_object_unref(parser); return NULL; } char *analysis_text = NULL; JsonNode *resp_root = json_parser_get_root(parser); JsonObject *resp_obj = json_node_get_object(resp_root); if (json_object_has_member(resp_obj, "candidates")) { JsonArray *candidates = json_object_get_array_member(resp_obj, "candidates"); if (json_array_get_length(candidates) > 0) { JsonObject *candidate = json_array_get_object_element(candidates, 0); if (json_object_has_member(candidate, "content")) { JsonObject *content = json_object_get_object_member(candidate, "content"); if (json_object_has_member(content, "parts")) { JsonArray *parts = json_object_get_array_member(content, "parts"); if (json_array_get_length(parts) > 0) { JsonObject *part = json_array_get_object_element(parts, 0); if (json_object_has_member(part, "text")) { analysis_text = strdup(json_object_get_string_member(part, "text")); } } } } } } free(response); g_object_unref(parser); return analysis_text; }