API и интеграции

Примеры запросов на восьми языках

Во всех примерах используется текстовый POST /v1/chat/completions и модель gpt-oss-20b-free. Она должна быть доступна в каталоге моделей вашего аккаунта. При смене модели укажите её точный id; платные модели расходуют баланс.

Создайте ключ с правом models в Настройки → API и передайте его приложению через переменную окружения OLESA_API_KEY. Держите ключ на сервере, не вставляйте его в клиентский JavaScript и не публикуйте в репозитории. Если аккаунт создан на o-lesa.com, замените в примерах https://api.o-lesa.ru/v1 на https://api.o-lesa.com/v1.

OpenAI SDK здесь работает с совместимым текстовым поднабором Chat Completions O·LESA. Поддержка всех методов OpenAI не подразумевается. Параметры и ограничения перечислены отдельно.

cURL

curl 'https://api.o-lesa.ru/v1/chat/completions' \
  -H "Authorization: Bearer $OLESA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gpt-oss-20b-free",
  "messages": [
    {
      "role": "user",
      "content": "Составь краткий план запуска сервиса"
    }
  ]
}'

Python

Установка: pip install openai

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.o-lesa.ru/v1",
    api_key=os.environ["OLESA_API_KEY"],
)

response = client.chat.completions.create(
    model="gpt-oss-20b-free",
    messages=[{
        "role": "user",
        "content": "Составь краткий план запуска сервиса",
    }],
)
print(response.choices[0].message.content)

JavaScript

Установка: npm install openai

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.o-lesa.ru/v1",
  apiKey: process.env.OLESA_API_KEY,
});

async function main() {
  const response = await client.chat.completions.create({
    model: "gpt-oss-20b-free",
    messages: [{
      role: "user",
      content: "Составь краткий план запуска сервиса",
    }],
  });
  console.log(response.choices[0].message.content);
}

main().catch(console.error);

TypeScript

Установка: npm install openai и npm install --save-dev typescript tsx @types/node

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.o-lesa.ru/v1",
  apiKey: process.env.OLESA_API_KEY,
});

async function main(): Promise<void> {
  const response = await client.chat.completions.create({
    model: "gpt-oss-20b-free",
    messages: [{
      role: "user",
      content: "Составь краткий план запуска сервиса",
    }],
  });
  console.log(response.choices[0].message.content);
}

main().catch(console.error);

PHP

Установка: composer require openai-php/client guzzlehttp/guzzle. Используется community SDK.

<?php

require __DIR__ . '/vendor/autoload.php';

$client = OpenAI::factory()
    ->withApiKey(getenv('OLESA_API_KEY'))
    ->withBaseUri('https://api.o-lesa.ru/v1')
    ->withHttpClient(new GuzzleHttp\Client(['timeout' => 120]))
    ->make();

$response = $client->chat()->create([
    'model' => 'gpt-oss-20b-free',
    'messages' => [[
        'role' => 'user',
        'content' => 'Составь краткий план запуска сервиса',
    ]],
]);

echo $response->choices[0]->message->content;

Go

Установка: go get github.com/openai/openai-go/v3

package main

import (
    "context"
    "fmt"
    "os"

    "github.com/openai/openai-go/v3"
    "github.com/openai/openai-go/v3/option"
)

func main() {
    client := openai.NewClient(
        option.WithAPIKey(os.Getenv("OLESA_API_KEY")),
        option.WithBaseURL("https://api.o-lesa.ru/v1/"),
    )
    response, err := client.Chat.Completions.New(
        context.Background(),
        openai.ChatCompletionNewParams{
            Model: "gpt-oss-20b-free",
            Messages: []openai.ChatCompletionMessageParamUnion{
                openai.UserMessage("Составь краткий план запуска сервиса"),
            },
        },
    )
    if err != nil { panic(err) }
    fmt.Println(response.Choices[0].Message.Content)
}

Rust

Установка: cargo add [email protected] и cargo add tokio --features macros,rt-multi-thread. Используется community SDK.

use async_openai::{
    config::OpenAIConfig,
    types::{ChatCompletionRequestUserMessageArgs, CreateChatCompletionRequestArgs},
    Client,
};
use std::{env, error::Error};

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let config = OpenAIConfig::new()
        .with_api_key(env::var("OLESA_API_KEY")?)
        .with_api_base(r#"https://api.o-lesa.ru/v1"#);
    let client = Client::with_config(config);
    let request = CreateChatCompletionRequestArgs::default()
        .model(r#"gpt-oss-20b-free"#)
        .messages([ChatCompletionRequestUserMessageArgs::default()
            .content(r#"Составь краткий план запуска сервиса"#)
            .build()?
            .into()])
        .build()?;

    let response = client.chat().create(request).await?;
    if let Some(choice) = response.choices.first() {
        println!("{}", choice.message.content.as_deref().unwrap_or(""));
    }
    Ok(())
}

Java

Добавьте в pom.xml:

<dependency>
  <groupId>com.openai</groupId>
  <artifactId>openai-java</artifactId>
  <version>4.72.0</version>
</dependency>
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletionCreateParams;

public class Main {
    public static void main(String[] args) {
        OpenAIClient client = OpenAIOkHttpClient.builder()
            .apiKey(System.getenv("OLESA_API_KEY"))
            .baseUrl("https://api.o-lesa.ru/v1")
            .build();

        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
            .model("gpt-oss-20b-free")
            .addUserMessage("Составь краткий план запуска сервиса")
            .build();

        client.chat().completions().create(params).choices().stream()
            .flatMap(choice -> choice.message().content().stream())
            .forEach(System.out::println);
    }
}

Списание зависит от выбранной модели. При сетевом сбое перед повтором запроса проверьте, не был ли он уже выполнен: ключ идемпотентности для этого метода пока не поддерживается.