uncloseai.com/ruby-examples.html

282 lines
10 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#43a047">
<meta name="color-scheme" content="light dark">
<title>Ruby Examples | uncloseai.com</title>
<!-- PicoCSS -->
<link rel="stylesheet" href="/css/pico.classless.min.css">
<!-- ChunkFive Font -->
<link rel="stylesheet" href="/css/chunkfive/stylesheet.css" type="text/css" charset="utf-8" />
<!-- Sidebar Theme -->
<link rel="stylesheet" href="/css/sidebar-theme.css">
<!-- Highlight.js for syntax highlighting -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/styles/a11y-dark.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>
<!-- Theme Switcher Script -->
<script>
function switchTheme(theme) {
if (theme === "auto") {
document.documentElement.removeAttribute('data-theme');
} else {
document.documentElement.setAttribute('data-theme', theme);
}
}
// Disable custom styling for uncloseai.js - use PicoCSS instead
window.UNCLOSEAI_CUSTOM_STYLING = false;
</script>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</head>
<body>
<!-- Mobile menu toggle -->
<button class="sidebar-toggle" onclick="document.querySelector('.sidebar').classList.toggle('open')">
</button>
<!-- Left sidebar - Main Navigation -->
<aside class="sidebar">
<div class="table-of-contents">
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/python-examples.html">Python Examples</a></li>
<li><a href="/nodejs-examples.html">Node.js Examples</a></li>
<li><a href="/go-examples.html">Go Examples</a></li>
<li><a href="/ruby-examples.html" class="active">Ruby Examples</a></li>
<li><a href="/uncloseai-js.html">uncloseai.js Docs</a></li>
<li><a href="/inference.html">Inference Setup</a></li>
<li><a href="https://git.unturf.com/engineering/unturf/uncloseai.com/-/tree/master/languages" target="_blank">🔗 All Languages</a></li>
<li><a href="https://shop.unturf.com/p/8486f492-a93e-11f0-b477-02dfe05770ee/uncloseai-machine-learning-reference-guide-to-inference-clients" target="_blank">📚 Book</a></li>
</ul>
</nav>
</div>
</aside>
<!-- Main content -->
<main>
<header>
<hgroup>
<a href="https://uncloseai.com"><h1 class="unturf" style="font-family: 'ChunkFiveRegular';">uncloseai.</h1></a>
<p>Ruby Examples - Free LLM & TTS AI Service</p>
</hgroup>
<nav>
<ul>
<li><a href="#" onclick="switchTheme('auto')">Auto</a></li>
<li><a href="#" onclick="switchTheme('light')">Light</a></li>
<li><a href="#" onclick="switchTheme('dark')">Dark</a></li>
</ul>
</nav>
</header>
<h2 id="ruby-intro">Ruby Examples</h2>
<p>This page demonstrates how to use the <strong>uncloseai.</strong> API endpoints with Ruby using the official OpenAI Ruby gem. All examples use the same OpenAI-compatible API interface, making it easy to switch between different models and endpoints.</p>
<p><strong>Available Endpoints:</strong></p>
<ul>
<li><strong>Hermes:</strong> <code>https://hermes.ai.unturf.com/v1</code> - General purpose conversational AI</li>
<li><strong>Qwen 3 Coder:</strong> <code>https://qwen.ai.unturf.com/v1</code> - Specialized coding model</li>
<li><strong>TTS:</strong> <code>https://speech.ai.unturf.com/v1</code> - Text-to-speech generation</li>
</ul>
<h3 id="ruby-client">Ruby Client Installation</h3>
<p>To install the official OpenAI gem for Ruby, add to your Gemfile or use <code>gem install</code>:</p>
<pre><code class="bash">gem install openai</code></pre>
<h2 id="ruby-non-streaming">Non-Streaming Examples</h2>
<p>Non-streaming mode waits for the complete response before returning. This is simpler to use but provides no intermediate feedback during generation.</p>
<h3 id="ruby-hermes-non-stream">Using Hermes (General Purpose)</h3>
<pre><code class="ruby">require "openai"
client = OpenAI::Client.new(
access_token: "choose-any-value",
uri_base: "https://hermes.ai.unturf.com/v1"
)
response = client.chat(
parameters: {
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
}
)
puts response.dig("choices", 0, "message", "content")
</code></pre>
<h3 id="ruby-qwen-non-stream">Using Qwen 3 Coder (Specialized for Coding)</h3>
<pre><code class="ruby">require "openai"
client = OpenAI::Client.new(
access_token: "choose-any-value",
uri_base: "https://qwen.ai.unturf.com/v1"
)
response = client.chat(
parameters: {
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
}
)
puts response.dig("choices", 0, "message", "content")
</code></pre>
<h2 id="ruby-streaming">Streaming Examples</h2>
<p>Streaming mode returns chunks of the response as they are generated, providing real-time feedback. This is ideal for interactive applications and long responses.</p>
<h3 id="ruby-hermes-stream">Using Hermes (General Purpose)</h3>
<pre><code class="ruby">require "openai"
client = OpenAI::Client.new(
access_token: "choose-any-value",
uri_base: "https://hermes.ai.unturf.com/v1"
)
client.chat(
parameters: {
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: proc do |chunk, _bytesize|
content = chunk.dig("choices", 0, "delta", "content")
print content if content
end
}
)
</code></pre>
<h3 id="ruby-qwen-stream">Using Qwen 3 Coder (Specialized for Coding)</h3>
<pre><code class="ruby">require "openai"
client = OpenAI::Client.new(
access_token: "choose-any-value",
uri_base: "https://qwen.ai.unturf.com/v1"
)
client.chat(
parameters: {
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: proc do |chunk, _bytesize|
content = chunk.dig("choices", 0, "delta", "content")
print content if content
end
}
)
</code></pre>
<h2 id="ruby-tts">Text-to-Speech Example</h2>
<p>Generate audio speech from text using the TTS endpoint. The audio is saved as an MP3 file.</p>
<pre><code class="ruby">require "openai"
client = OpenAI::Client.new(
access_token: "YOLO",
uri_base: "https://speech.ai.unturf.com/v1"
)
response = client.audio.speech(
parameters: {
model: "tts-1",
voice: "alloy",
input: "I think so therefore, Today is a wonderful day to build something people love!",
speed: 0.9
}
)
File.binwrite("speech.mp3", response)
</code></pre>
<script>hljs.highlightAll();</script>
<footer>
<small>Stylesheets by <a href="https://picocss.com" target="_blank">PicoCSS</a></small>
<small>& <a href="https://highlightjs.org/" target="_blank">highlight.js</a></small>
</footer>
<script>
// Simple active link highlighting
document.querySelectorAll('.table-of-contents a').forEach(link => {
link.addEventListener('click', function() {
document.querySelectorAll('.table-of-contents a').forEach(a => a.classList.remove('active'));
this.classList.add('active');
});
});
// Highlight current section on scroll
const sections = document.querySelectorAll('h2[id], h3[id]');
const navLinks = document.querySelectorAll('.table-of-contents a');
window.addEventListener('scroll', () => {
let current = '';
sections.forEach(section => {
const sectionTop = section.offsetTop;
const sectionHeight = section.clientHeight;
if (window.scrollY >= sectionTop - 100) {
current = section.getAttribute('id');
}
});
navLinks.forEach(link => {
link.classList.remove('active');
if (link.getAttribute('href') === '#' + current) {
link.classList.add('active');
}
});
});
</script>
</main>
<!-- Right sidebar - Page TOC -->
<aside class="sidebar-right">
<div class="table-of-contents">
<nav>
<ul>
<li><a href="#ruby-intro" class="active">Overview</a></li>
<li><a href="#ruby-client">Installation</a></li>
<li><a href="#ruby-non-streaming">Non-Streaming</a>
<ul>
<li><a href="#ruby-hermes-non-stream">Hermes</a></li>
<li><a href="#ruby-qwen-non-stream">Qwen Coder</a></li>
</ul>
</li>
<li><a href="#ruby-streaming">Streaming</a>
<ul>
<li><a href="#ruby-hermes-stream">Hermes</a></li>
<li><a href="#ruby-qwen-stream">Qwen Coder</a></li>
</ul>
</li>
<li><a href="#ruby-tts">Text-to-Speech</a></li>
</ul>
</nav>
</div>
</aside>
</body>
</html>