# uncloseai.

C Examples - Free LLM & TTS AI Service

## C Examples

This page demonstrates how to use the uncloseai. API endpoints with C using libcurl. All examples use the OpenAI-compatible API interface, making it easy to switch between different models and endpoints.

Available Endpoints:

- Hermes: `https://hermes.ai.unturf.com/v1` - General purpose conversational AI
- Qwen 3 Coder: `https://qwen.ai.unturf.com/v1` - Specialized coding model
- TTS: `https://speech.ai.unturf.com/v1` - Text-to-speech generation

### Setup & Dependencies

Install libcurl development libraries:

    # Ubuntu/Debian
    sudo apt-get install libcurl4-openssl-dev

    # macOS
    brew install curl

    # Alpine
    apk add curl-dev

Compile with:

    gcc -o chat chat.c -lcurl

## Non-Streaming Examples

Non-streaming mode waits for the complete response before returning. This is simpler to use but provides no intermediate feedback during generation.

### Using Hermes (General Purpose)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>

    struct Memory {
        char *response;
        size_t size;
    };

    static size_t write_callback(void *data, size_t size, size_t nmemb, void *userp) {
        size_t realsize = size * nmemb;
        struct Memory *mem = (struct Memory *)userp;
        char *ptr = realloc(mem->response, mem->size + realsize + 1);
        if (!ptr) return 0;
        mem->response = ptr;
        memcpy(&(mem->response[mem->size]), data, realsize);
        mem->size += realsize;
        mem->response[mem->size] = 0;
        return realsize;
    }

    int main(void) {
        CURL *curl = curl_easy_init();
        if (!curl) return 1;

        struct Memory chunk = {.response = malloc(1), .size = 0};
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");

        const char *payload =
            "{"
            "\"model\": \"adamo1139/Hermes-3-Llama-3.1-8B-FP8-Dynamic\","
            "\"messages\": [{\"role\": \"user\", \"content\": \"Give a Python Fizzbuzz solution in one line of code?\"}],"
            "\"max_tokens\": 150"
            "}";

        curl_easy_setopt(curl, CURLOPT_URL, "https://hermes.ai.unturf.com/v1/chat/completions");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);

        CURLcode res = curl_easy_perform(curl);
        if (res == CURLE_OK) {
            printf("Response:\n%s\n", chunk.response);
        }

        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
        free(chunk.response);
        return 0;
    }

### Using Qwen 3 Coder (Specialized for Coding)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>

    // ... same write_callback and Memory struct as above ...

    int main(void) {
        CURL *curl = curl_easy_init();
        if (!curl) return 1;

        struct Memory chunk = {.response = malloc(1), .size = 0};
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");

        const char *payload =
            "{"
            "\"model\": \"hf.co/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Q4_K_M\","
            "\"messages\": [{\"role\": \"user\", \"content\": \"Explain quicksort in C with code\"}],"
            "\"max_tokens\": 500"
            "}";

        curl_easy_setopt(curl, CURLOPT_URL, "https://qwen.ai.unturf.com/v1/chat/completions");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);

        CURLcode res = curl_easy_perform(curl);
        if (res == CURLE_OK) {
            printf("Response:\n%s\n", chunk.response);
        }

        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
        free(chunk.response);
        return 0;
    }

## Streaming Examples

Streaming mode returns chunks of the response as they are generated, providing real-time feedback. This is ideal for interactive applications and long responses.

### Streaming with Hermes

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>

    static size_t stream_callback(void *data, size_t size, size_t nmemb, void *userp) {
        size_t realsize = size * nmemb;
        char *chunk = (char *)data;

        // Process SSE data lines
        char *line = strtok(chunk, "\n");
        while (line) {
            if (strncmp(line, "data: ", 6) == 0) {
                const char *json = line + 6;
                if (strcmp(json, "[DONE]") != 0) {
                    // Extract content from: {"choices":[{"delta":{"content":"..."}}]}
                    const char *content_start = strstr(json, "\"content\":\"");
                    if (content_start) {
                        content_start += 11;
                        const char *content_end = strchr(content_start, '"');
                        if (content_end) {
                            fwrite(content_start, 1, content_end - content_start, stdout);
                            fflush(stdout);
                        }
                    }
                }
            }
            line = strtok(NULL, "\n");
        }
        return realsize;
    }

    int main(void) {
        CURL *curl = curl_easy_init();
        if (!curl) return 1;

        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");

        const char *payload =
            "{"
            "\"model\": \"adamo1139/Hermes-3-Llama-3.1-8B-FP8-Dynamic\","
            "\"messages\": [{\"role\": \"user\", \"content\": \"Write a short poem about coding\"}],"
            "\"max_tokens\": 200,"
            "\"stream\": true"
            "}";

        curl_easy_setopt(curl, CURLOPT_URL, "https://hermes.ai.unturf.com/v1/chat/completions");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, stream_callback);

        printf("Streaming response:\n");
        curl_easy_perform(curl);
        printf("\n");

        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
        return 0;
    }

## Text-to-Speech Examples

Generate audio from text using the TTS endpoint.

### Basic TTS

    #include <stdio.h>
    #include <stdlib.h>
    #include <curl/curl.h>

    static size_t write_file(void *data, size_t size, size_t nmemb, void *userp) {
        return fwrite(data, size, nmemb, (FILE *)userp);
    }

    int main(void) {
        CURL *curl = curl_easy_init();
        if (!curl) return 1;

        FILE *fp = fopen("output.mp3", "wb");
        if (!fp) {
            curl_easy_cleanup(curl);
            return 1;
        }

        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");

        const char *payload =
            "{"
            "\"model\": \"tts-1\","
            "\"input\": \"Hello! This is a test of text to speech.\","
            "\"voice\": \"alloy\""
            "}";

        curl_easy_setopt(curl, CURLOPT_URL, "https://speech.ai.unturf.com/v1/audio/speech");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

        CURLcode res = curl_easy_perform(curl);
        if (res == CURLE_OK) {
            printf("Audio saved to output.mp3\n");
        }

        fclose(fp);
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
        return 0;
    }

Available voices: `alloy`, `echo`, `fable`, `onyx`, `nova`, `shimmer`

## Full SDK Implementation

For a complete SDK with model discovery and advanced features, see the full implementations in the source repository:

- C with libcurl
- C with libsoup (GNOME)
- C with nghttp2 (HTTP/2)