# uncloseai.

Elixir Examples - Free LLM & TTS AI Service

## Elixir Examples

This page demonstrates how to use the uncloseai. API endpoints with Elixir using the openai_ex community library. All examples use the same 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

### Elixir Client Installation

Add openai_ex to your `mix.exs` dependencies:

    def deps do
      [
        {:openai_ex, "~> 0.9.18"}
      ]
    end

## 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)

    config = %OpenaiEx.Config{
      api_key: "choose-any-value",
      api_url: "https://hermes.ai.unturf.com/v1"
    }

    {:ok, response} = OpenaiEx.ChatCompletion.create(
      config,
      model: "adamo1139/Hermes-3-Llama-3.1-8B-FP8-Dynamic",
      messages: [
        %{role: "user", content: "Give a Python Fizzbuzz solution in one line of code?"}
      ],
      temperature: 0.5,
      max_tokens: 150
    )

    IO.puts(response["choices"] |> List.first() |> get_in(["message", "content"]))

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

    config = %OpenaiEx.Config{
      api_key: "choose-any-value",
      api_url: "https://qwen.ai.unturf.com/v1"
    }

    {:ok, response} = OpenaiEx.ChatCompletion.create(
      config,
      model: "hf.co/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Q4_K_M",
      messages: [
        %{role: "user", content: "Give a Python Fizzbuzz solution in one line of code?"}
      ],
      temperature: 0.5,
      max_tokens: 150
    )

    IO.puts(response["choices"] |> List.first() |> get_in(["message", "content"]))

## 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.

### Using Hermes (General Purpose)

    config = %OpenaiEx.Config{
      api_key: "choose-any-value",
      api_url: "https://hermes.ai.unturf.com/v1"
    }

    OpenaiEx.ChatCompletion.create_stream(
      config,
      model: "adamo1139/Hermes-3-Llama-3.1-8B-FP8-Dynamic",
      messages: [
        %{role: "user", content: "Give a Python Fizzbuzz solution in one line of code?"}
      ],
      temperature: 0.5,
      max_tokens: 150
    )
    |> Stream.each(fn chunk ->
      content = get_in(chunk, ["choices", Access.at(0), "delta", "content"])
      if content, do: IO.write(content)
    end)
    |> Stream.run()

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

    config = %OpenaiEx.Config{
      api_key: "choose-any-value",
      api_url: "https://qwen.ai.unturf.com/v1"
    }

    OpenaiEx.ChatCompletion.create_stream(
      config,
      model: "hf.co/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Q4_K_M",
      messages: [
        %{role: "user", content: "Give a Python Fizzbuzz solution in one line of code?"}
      ],
      temperature: 0.5,
      max_tokens: 150
    )
    |> Stream.each(fn chunk ->
      content = get_in(chunk, ["choices", Access.at(0), "delta", "content"])
      if content, do: IO.write(content)
    end)
    |> Stream.run()

## Text-to-Speech Example

Generate audio speech from text using the TTS endpoint. The audio is saved as an MP3 file.

    config = %OpenaiEx.Config{
      api_key: "YOLO",
      api_url: "https://speech.ai.unturf.com/v1"
    }

    {:ok, audio_data} = OpenaiEx.Audio.Speech.create(
      config,
      model: "tts-1",
      voice: "alloy",
      input: "I think so therefore, Today is a wonderful day to grow something people love!",
      speed: 0.9
    )

    File.write!("speech.mp3", audio_data)