This commit is contained in:
2026-04-23 20:36:37 +03:00
parent 4ecc8973bf
commit 840d7d8e3b
19 changed files with 758 additions and 0 deletions

View File

@@ -0,0 +1,176 @@
package openrouter
import (
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
var Orclient OpenRouterClient
type OpenRouterClient struct {
APIKey string
Model string
}
type OpenRouterRequest struct {
Model string `json:"model"`
Messages []struct {
Role string `json:"role"`
Content string `json:"content"`
} `json:"messages"`
}
type OpenRouterResponse struct {
Choices []struct {
Message struct {
Content string `json:"content"`
} `json:"message"`
} `json:"choices"`
}
func AskOpenRouter(prompt string) (string, error) {
url := "https://openrouter.ai/api/v1/chat/completions"
apiKey := Orclient.APIKey
model := Orclient.Model
reqBody := OpenRouterRequest{
Model: model,
}
reqBody.Messages = append(reqBody.Messages, struct {
Role string `json:"role"`
Content string `json:"content"`
}{
Role: "user",
Content: prompt,
})
jsonData, err := json.Marshal(reqBody)
if err != nil {
return "", err
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
return "", err
}
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("HTTP-Referer", "https://yourapp.com") // optional but recommended
req.Header.Set("X-Title", "My App") // optional
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
if resp.StatusCode != 200 {
return "", fmt.Errorf("error: %s", string(body))
}
var result OpenRouterResponse
err = json.Unmarshal(body, &result)
if err != nil {
return "", err
}
if len(result.Choices) == 0 {
return "", fmt.Errorf("no response from model")
}
return result.Choices[0].Message.Content, nil
}
func AskOpenRouterWithLocalImage(prompt, imagePath string) (string, error) {
url := "https://openrouter.ai/api/v1/chat/completions"
apiKey := Orclient.APIKey
model := Orclient.Model
// Read image file
imageBytes, err := os.ReadFile(imagePath)
if err != nil {
return "", err
}
// Detect mime type (optional but good practice)
mimeType := http.DetectContentType(imageBytes)
// Encode to base64
base64Image := base64.StdEncoding.EncodeToString(imageBytes)
imageData := fmt.Sprintf("data:%s;base64,%s", mimeType, base64Image)
payload := map[string]interface{}{
"model": model,
"messages": []map[string]interface{}{
{
"role": "user",
"content": []map[string]interface{}{
{
"type": "text",
"text": prompt,
},
{
"type": "image_url",
"image_url": map[string]string{
"url": imageData,
},
},
},
},
},
}
jsonData, err := json.Marshal(payload)
if err != nil {
return "", err
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
return "", err
}
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("HTTP-Referer", "https://yourapp.com")
req.Header.Set("X-Title", "My App")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
if resp.StatusCode != 200 {
return "", fmt.Errorf("error: %s", string(body))
}
var result OpenRouterResponse
err = json.Unmarshal(body, &result)
if err != nil {
return "", err
}
if len(result.Choices) == 0 {
return "", fmt.Errorf("no response")
}
return result.Choices[0].Message.Content, nil
}