371 lines
8.7 KiB
Markdown
371 lines
8.7 KiB
Markdown
# openai
|
|
|
|
The OpenAI client library provides a comprehensive interface for interacting with OpenAI and OpenAI-compatible APIs (like OpenRouter and Groq).
|
|
|
|
## Quick Start
|
|
|
|
### Using Environment Variables
|
|
|
|
The easiest way to configure the OpenAI client is through environment variables:
|
|
|
|
```bash
|
|
export AIKEY='your-api-key-here'
|
|
export AIURL='https://api.openai.com/v1' # optional, defaults to OpenRouter
|
|
export AIMODEL='gpt-4o' # optional, sets default model
|
|
```
|
|
|
|
Supported environment variables:
|
|
|
|
- `AIKEY` - Your API key (fallback for all providers)
|
|
- `AIURL` - The API base URL
|
|
- `AIMODEL` - Default model to use
|
|
- `OPENROUTER_API_KEY` - OpenRouter specific API key (preferred for OpenRouter)
|
|
- `GROQKEY` - Groq specific API key (preferred for Groq)
|
|
|
|
### Basic Usage
|
|
|
|
```v
|
|
import incubaid.herolib.clients.openai
|
|
|
|
// Get the default client (uses AIKEY from environment)
|
|
mut client := openai.get()!
|
|
|
|
// Send a simple message
|
|
response := client.chat_completion(
|
|
message: 'Hello, world!'
|
|
temperature: 0.7
|
|
max_completion_tokens: 1024
|
|
)!
|
|
|
|
println(response.result)
|
|
```
|
|
|
|
## Configuration with HeroScript
|
|
|
|
For more control, use HeroScript configuration:
|
|
|
|
```v
|
|
import incubaid.herolib.clients.openai
|
|
import incubaid.herolib.core.playcmds
|
|
|
|
playcmds.run(
|
|
heroscript: '
|
|
!!openai.configure name:"default"
|
|
url:"https://openrouter.ai/api/v1"
|
|
api_key:"sk-or-v1-..."
|
|
model_default:"gpt-oss-120b"
|
|
'
|
|
reset: false
|
|
)!
|
|
|
|
mut client := openai.get()!
|
|
```
|
|
|
|
in case of using heroscript, we don't have to fill in the api_key it will be loaded from the environment variable `OPENROUTER_API_KEY` or `GROQKEY` depending on the url used.
|
|
|
|
## Examples
|
|
|
|
### Using OpenRouter
|
|
|
|
```v
|
|
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
|
|
|
|
import incubaid.herolib.clients.openai
|
|
import incubaid.herolib.core.playcmds
|
|
|
|
playcmds.run(
|
|
heroscript: '
|
|
!!openai.configure name:"default"
|
|
url:"https://openrouter.ai/api/v1"
|
|
model_default:"gpt-oss-120b"
|
|
'
|
|
reset: false
|
|
)!
|
|
|
|
mut client := openai.get()!
|
|
|
|
response := client.chat_completion(
|
|
model: 'qwen/qwen-2.5-coder-32b-instruct'
|
|
message: 'Write a hello world program in V'
|
|
temperature: 0.7
|
|
max_completion_tokens: 500
|
|
)!
|
|
|
|
println('Response:')
|
|
println(response.result)
|
|
println('Tokens used: ${response.usage.total_tokens}')
|
|
```
|
|
|
|
### Using Groq
|
|
|
|
```bash
|
|
export GROQKEY='gsk_...'
|
|
|
|
```v
|
|
import incubaid.herolib.clients.openai
|
|
import incubaid.herolib.core.playcmds
|
|
|
|
playcmds.run(
|
|
heroscript: '
|
|
!!openai.configure name:"qroq"
|
|
url:"https://api.groq.com/openai/v1"
|
|
model_default:"gpt-oss-120b"
|
|
'
|
|
reset: true
|
|
)!
|
|
|
|
mut client := openai.get(name:"groq")!
|
|
|
|
response := client.chat_completion(
|
|
message: 'Explain quantum computing in simple terms'
|
|
temperature: 0.5
|
|
max_completion_tokens: 1024
|
|
)!
|
|
|
|
println(response.result)
|
|
```
|
|
|
|
## Chat Completion
|
|
|
|
### Simple Message
|
|
|
|
```v
|
|
mut client := openai.get()!
|
|
|
|
response := client.chat_completion(
|
|
message: 'What is 2 + 2?'
|
|
)!
|
|
|
|
println(response.result)
|
|
```
|
|
|
|
### Multi-Message Conversation
|
|
|
|
```v
|
|
response := client.chat_completion(
|
|
model: 'gpt-4o'
|
|
messages: [
|
|
Message{
|
|
role: .system
|
|
content: 'You are a helpful programming assistant.'
|
|
},
|
|
Message{
|
|
role: .user
|
|
content: 'How do I read a file in V?'
|
|
},
|
|
]
|
|
temperature: 0.7
|
|
max_completion_tokens: 2048
|
|
)!
|
|
|
|
println(response.result)
|
|
```
|
|
|
|
## Features
|
|
|
|
- **Chat Completions** - Generate text responses
|
|
- **Image Generation** - Create, edit, and generate variations of images
|
|
- **Audio** - Transcribe and translate audio files
|
|
- **Embeddings** - Generate text embeddings
|
|
- **File Management** - Upload and manage files for fine-tuning
|
|
- **Fine-tuning** - Create and manage fine-tuned models
|
|
- **Content Moderation** - Check content for policy violations
|
|
- **Multiple Providers** - Works with OpenAI, OpenRouter, Groq, and compatible APIs
|
|
|
|
## Advanced Usage: Coding Agent
|
|
|
|
Here's an example of building a coding assistant agent:
|
|
|
|
```v
|
|
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
|
|
|
|
import incubaid.herolib.clients.openai
|
|
import incubaid.herolib.ui.console
|
|
import incubaid.herolib.core.texttools
|
|
|
|
fn analyze_code(mut client openai.OpenAI, code string) !string {
|
|
response := client.chat_completion(
|
|
messages: [
|
|
openai.Message{
|
|
role: .system
|
|
content: 'You are an expert code analyzer. Analyze code and provide:
|
|
1. Code quality issues
|
|
2. Performance suggestions
|
|
3. Security concerns
|
|
4. Refactoring recommendations'
|
|
},
|
|
openai.Message{
|
|
role: .user
|
|
content: 'Analyze this code:\n\`\`\`\n${code}\n\`\`\`'
|
|
},
|
|
]
|
|
temperature: 0.3
|
|
max_completion_tokens: 2048
|
|
)!
|
|
return response.result
|
|
}
|
|
|
|
fn generate_code(mut client openai.OpenAI, requirement string, language string) !string {
|
|
response := client.chat_completion(
|
|
messages: [
|
|
openai.Message{
|
|
role: .system
|
|
content: 'You are an expert ${language} programmer. Generate clean, efficient,
|
|
well-documented code. Include comments and error handling.'
|
|
},
|
|
openai.Message{
|
|
role: .user
|
|
content: 'Generate ${language} code for: ${requirement}'
|
|
},
|
|
]
|
|
temperature: 0.5
|
|
max_completion_tokens: 2048
|
|
)!
|
|
return response.result
|
|
}
|
|
|
|
fn test_code(mut client openai.OpenAI, code string, language string) !string {
|
|
response := client.chat_completion(
|
|
messages: [
|
|
openai.Message{
|
|
role: .system
|
|
content: 'You are an expert ${language} test engineer. Generate comprehensive
|
|
unit tests with good coverage.'
|
|
},
|
|
openai.Message{
|
|
role: .user
|
|
content: 'Write tests for this ${language} code:\n\`\`\`\n${code}\n\`\`\`'
|
|
},
|
|
]
|
|
temperature: 0.4
|
|
max_completion_tokens: 2048
|
|
)!
|
|
return response.result
|
|
}
|
|
|
|
fn refactor_code(mut client openai.OpenAI, code string, language string) !string {
|
|
response := client.chat_completion(
|
|
messages: [
|
|
openai.Message{
|
|
role: .system
|
|
content: 'You are an expert code refactorer. Improve code readability,
|
|
maintainability, and follow best practices for ${language}.'
|
|
},
|
|
openai.Message{
|
|
role: .user
|
|
content: 'Refactor this ${language} code:\n\`\`\`\n${code}\n\`\`\`'
|
|
},
|
|
]
|
|
temperature: 0.3
|
|
max_completion_tokens: 2048
|
|
)!
|
|
return response.result
|
|
}
|
|
|
|
// Main coding agent loop
|
|
fn main() ! {
|
|
mut client := openai.get()!
|
|
mut console := console.new()
|
|
|
|
println('═'.repeat(60))
|
|
println(' Coding Agent - Your AI Programming Assistant')
|
|
println('═'.repeat(60))
|
|
|
|
loop {
|
|
action := console.ask_dropdown(
|
|
description: 'What would you like to do?'
|
|
items: ['Generate Code', 'Analyze Code', 'Generate Tests', 'Refactor Code', 'Exit']
|
|
)!
|
|
|
|
match action {
|
|
'Generate Code' {
|
|
requirement := console.ask_question(
|
|
description: 'Code Generation'
|
|
question: 'What code do you need? (describe the requirement)'
|
|
)!
|
|
|
|
language := console.ask_dropdown(
|
|
description: 'Programming Language'
|
|
items: ['V', 'Python', 'JavaScript', 'Rust', 'Go', 'C++']
|
|
)!
|
|
|
|
println('\n⏳ Generating code...\n')
|
|
generated := generate_code(mut client, requirement, language)!
|
|
|
|
console.cprint(
|
|
text: generated
|
|
foreground: .green
|
|
)
|
|
}
|
|
'Analyze Code' {
|
|
code := console.ask_question(
|
|
description: 'Code Analysis'
|
|
question: 'Paste your code (can be multiline):'
|
|
)!
|
|
|
|
println('\n⏳ Analyzing code...\n')
|
|
analysis := analyze_code(mut client, code)!
|
|
|
|
console.cprint(
|
|
text: analysis
|
|
foreground: .cyan
|
|
)
|
|
}
|
|
'Generate Tests' {
|
|
code := console.ask_question(
|
|
description: 'Test Generation'
|
|
question: 'Paste your code:'
|
|
)!
|
|
|
|
language := console.ask_dropdown(
|
|
description: 'Programming Language'
|
|
items: ['V', 'Python', 'JavaScript', 'Rust', 'Go', 'C++']
|
|
)!
|
|
|
|
println('\n⏳ Generating tests...\n')
|
|
tests := test_code(mut client, code, language)!
|
|
|
|
console.cprint(
|
|
text: tests
|
|
foreground: .yellow
|
|
)
|
|
}
|
|
'Refactor Code' {
|
|
code := console.ask_question(
|
|
description: 'Code Refactoring'
|
|
question: 'Paste your code:'
|
|
)!
|
|
|
|
language := console.ask_dropdown(
|
|
description: 'Programming Language'
|
|
items: ['V', 'Python', 'JavaScript', 'Rust', 'Go', 'C++']
|
|
)!
|
|
|
|
println('\n⏳ Refactoring code...\n')
|
|
refactored := refactor_code(mut client, code, language)!
|
|
|
|
console.cprint(
|
|
text: refactored
|
|
foreground: .green
|
|
)
|
|
}
|
|
'Exit' {
|
|
println('\n👋 Goodbye!')
|
|
break
|
|
}
|
|
else {
|
|
println('Invalid option')
|
|
}
|
|
}
|
|
|
|
println('\n')
|
|
}
|
|
}
|
|
```
|
|
|
|
## Supported Providers
|
|
|
|
- **OpenAI** - `https://api.openai.com/v1`
|
|
- **OpenRouter** - `https://openrouter.ai/api/v1` (default)
|
|
- **Groq** - `https://api.groq.com/openai/v1`
|
|
- **Compatible APIs** - Any OpenAI-compatible endpoint |