chatgpt-ruby-client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rubocop.yml +9 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +97 -0
- data/Rakefile +8 -0
- data/lib/chatgpt/api_request.rb +63 -0
- data/lib/chatgpt/version.rb +5 -0
- data/lib/chatgpt.rb +86 -0
- data/sig/chatgpt.rbs +4 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1442e13bb715ee366d5e090aa300f6030ba778ecd77555858c684e324d1a9c3c
|
4
|
+
data.tar.gz: ff99251132a3935c7b4ccd59e6b71359f661f34f8ffb3e47f45c1731689096cf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bab0eec5177b3cf83b2a8596e50799d8ea9f88e140c14222c3909b257a6d8c7f06d4f3447ea7f5c3f5bc0eac971f421eee0e72aa07a671e12cca4aae8a9d3623
|
7
|
+
data.tar.gz: 6e6321dbf6793abff3796f8949b327086cf02e018dcec4866523ff8621b52408ec1e5ae07d7dd8c277c3a2834f76399decaf22c3fe016f21bd0c3fb8f806ccc0
|
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2025 Sanekhire
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# ChatGPT Client
|
2
|
+
|
3
|
+
ChatGPT Client – это Ruby-гем, предназначенный для взаимодействия с API OpenAI. Позволяет отправлять запросы к модели ChatGPT и получать ответы, поддерживает использование прокси-серверов.
|
4
|
+
|
5
|
+
## Установка
|
6
|
+
|
7
|
+
Добавьте в `Gemfile` вашего проекта:
|
8
|
+
|
9
|
+
`gem 'chatgpt-ruby-client'`
|
10
|
+
|
11
|
+
Затем выполните команду:
|
12
|
+
|
13
|
+
`bundle install`
|
14
|
+
|
15
|
+
Или установите вручную:
|
16
|
+
|
17
|
+
`gem install chatgpt-ruby-client`
|
18
|
+
|
19
|
+
## Использование
|
20
|
+
|
21
|
+
### Инициализация клиента
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
require 'chatgpt-ruby-client'
|
25
|
+
|
26
|
+
api_key = 'your_openai_api_key'
|
27
|
+
client = Chatgpt::Client.new(api_key)
|
28
|
+
```
|
29
|
+
|
30
|
+
### Отправка запроса
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
response = client.send_request("Напиши короткое стихотворение")
|
34
|
+
puts response.dig('choices', 0, 'message', 'content')
|
35
|
+
```
|
36
|
+
|
37
|
+
### Настройка параметров
|
38
|
+
|
39
|
+
Вы можете настроить различные параметры клиента:
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
Chatgpt::Client.model = "gpt-4"
|
43
|
+
Chatgpt::Client.temperature = 0.5
|
44
|
+
Chatgpt::Client.system_message = "Ты – эксперт по программированию."
|
45
|
+
Chatgpt::Client.prompt_prefix = "Перефразируй: "
|
46
|
+
Chatgpt::Client.proxy = "socks5://user:password@proxyserver:1080"
|
47
|
+
```
|
48
|
+
|
49
|
+
### Использование прокси
|
50
|
+
|
51
|
+
Вы можете передавать прокси в методе `send_request:`
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
response = client.send_request("Как работает Ruby?", "<http://proxyserver:8080>")
|
55
|
+
puts response.dig('choices', 0, 'message', 'content')
|
56
|
+
```
|
57
|
+
|
58
|
+
## Как это работает
|
59
|
+
|
60
|
+
### Класс `Chatgpt::Client`
|
61
|
+
|
62
|
+
Этот класс отвечает за создание запросов к API OpenAI. Он управляет настройками модели, заголовками и обработкой ответов.
|
63
|
+
|
64
|
+
### Основные методы
|
65
|
+
|
66
|
+
* `initialize(api_key)` – создаёт клиент с API-ключом.
|
67
|
+
|
68
|
+
* `send_request(prompt, proxy = nil)` – отправляет запрос к ChatGPT.
|
69
|
+
|
70
|
+
* `build_request_data(prompt)` – формирует данные для запроса.
|
71
|
+
|
72
|
+
* `request_headers` – задаёт заголовки HTTP-запроса.
|
73
|
+
|
74
|
+
* `parse_response(response)` – обрабатывает ответ API.
|
75
|
+
|
76
|
+
### Класс `Chatgpt::ApiRequest`
|
77
|
+
|
78
|
+
Этот класс отвечает за выполнение HTTP-запросов с использованием библиотеки `curb`.
|
79
|
+
Основные методы:
|
80
|
+
|
81
|
+
* `initialize(url:, data:, headers:, proxy: nil)` – принимает параметры запроса.
|
82
|
+
|
83
|
+
* `post` – выполняет POST-запрос к API OpenAI.
|
84
|
+
|
85
|
+
* `configure_proxy(curl, proxy)` – настраивает прокси-сервер, если он указан.
|
86
|
+
|
87
|
+
### Ошибки и обработка
|
88
|
+
|
89
|
+
Если при выполнении запроса возникает ошибка, она возвращается в виде хэша:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
{ "error" => "Описание ошибки" }
|
93
|
+
```
|
94
|
+
|
95
|
+
### Лицензия
|
96
|
+
|
97
|
+
Этот проект распространяется под лицензией MIT.
|
data/Rakefile
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "curb"
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
module Chatgpt
|
7
|
+
# Класс для выполнения HTTP-запросов к API OpenAI
|
8
|
+
class ApiRequest
|
9
|
+
attr_reader :url, :headers, :data, :proxy
|
10
|
+
|
11
|
+
# @param url [String] URL, к которому будет выполняться запрос
|
12
|
+
# @param data [String] Данные запроса в формате JSON
|
13
|
+
# @param headers [Hash] HTTP-заголовки запроса
|
14
|
+
# @param proxy [String, nil] Опциональный параметр для прокси-сервера
|
15
|
+
def initialize(url:, data:, headers:, proxy: nil)
|
16
|
+
@url = url
|
17
|
+
@headers = headers
|
18
|
+
@data = data
|
19
|
+
@proxy = proxy
|
20
|
+
end
|
21
|
+
|
22
|
+
# Выполняет POST-запрос к API
|
23
|
+
# @return [Curl::Easy, Hash] Ответ сервера или ошибка в виде хэша
|
24
|
+
def post
|
25
|
+
Curl::Easy.http_post(url, data) do |curl|
|
26
|
+
headers.each { |key, value| curl.headers[key] = value }
|
27
|
+
configure_proxy(curl, proxy) if proxy
|
28
|
+
end
|
29
|
+
rescue StandardError => e
|
30
|
+
{ "error" => "Ошибка запроса: #{e.message}" }
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# Конфигурирует параметры прокси-сервера для запроса
|
36
|
+
# @param curl [Curl::Easy] Объект запроса
|
37
|
+
# @param proxy [String] URL прокси в формате <protocol>://<login>:<password>@<host>:<port>
|
38
|
+
def configure_proxy(curl, proxy)
|
39
|
+
proxy_type, rest = proxy.split('://', 2)
|
40
|
+
|
41
|
+
if rest.include?('@')
|
42
|
+
user_pass, host = rest.split('@', 2)
|
43
|
+
curl.proxypwd = user_pass # Логин и пароль для прокси
|
44
|
+
else
|
45
|
+
host = rest # Только хост
|
46
|
+
end
|
47
|
+
|
48
|
+
curl.proxy_url = "#{proxy_type}://#{host}"
|
49
|
+
|
50
|
+
curl.proxy_type = case proxy_type
|
51
|
+
when "socks5"
|
52
|
+
Curl::CURLPROXY_SOCKS5
|
53
|
+
when "http"
|
54
|
+
Curl::CURLPROXY_HTTP
|
55
|
+
when "https"
|
56
|
+
curl.proxy_tunnel = true # HTTPS-прокси требует туннеля
|
57
|
+
Curl::CURLPROXY_HTTPS
|
58
|
+
else
|
59
|
+
raise "Неизвестный тип прокси: #{proxy_type}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/chatgpt.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "chatgpt/version"
|
4
|
+
require_relative "chatgpt/api_request"
|
5
|
+
|
6
|
+
module Chatgpt
|
7
|
+
class Client
|
8
|
+
# URL API, используемый для отправки запросов к ChatGPT
|
9
|
+
API_URL = "https://api.openai.com/v1/chat/completions"
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# Настройки клиента (задаются глобально)
|
13
|
+
# model - Определяет используемую модель, например, "gpt-4o-mini".
|
14
|
+
# temperature - Контролирует степень случайности ответов модели (диапазон 0.0 - 1.0).
|
15
|
+
# system_message - Специальное сообщение, которое задает контекст модели.
|
16
|
+
# prompt_prefix - Префикс для запросов, полезен при массовых однотипных запросах.
|
17
|
+
# proxy - Прокси-сервер, указывается в формате <protocol>://<login>:<password>@<host>:<port>
|
18
|
+
attr_accessor :model, :temperature, :system_message, :prompt_prefix, :proxy
|
19
|
+
end
|
20
|
+
|
21
|
+
# Устанавливаем значения по умолчанию для класса
|
22
|
+
self.model = "gpt-4o-mini"
|
23
|
+
self.temperature = 0.7
|
24
|
+
|
25
|
+
# Конструктор класса
|
26
|
+
# @param api_key [String] API-ключ для аутентификации запросов к OpenAI
|
27
|
+
def initialize(api_key)
|
28
|
+
@chat_api_key = api_key
|
29
|
+
@model = self.class.model
|
30
|
+
@temperature = self.class.temperature
|
31
|
+
@system_message = self.class.system_message
|
32
|
+
@prompt_prefix = self.class.prompt_prefix
|
33
|
+
end
|
34
|
+
|
35
|
+
# Отправляет запрос в API ChatGPT
|
36
|
+
# @param prompt [String] Текст запроса
|
37
|
+
# @param proxy [String, nil] Опционально: прокси-сервер для запроса
|
38
|
+
# @return [Hash] Ответ API или ошибка
|
39
|
+
def send_request(prompt, proxy = nil)
|
40
|
+
request_data = build_request_data(prompt)
|
41
|
+
response = ApiRequest.new(
|
42
|
+
url: API_URL,
|
43
|
+
headers: request_headers,
|
44
|
+
data: request_data,
|
45
|
+
proxy: proxy || self.class.proxy
|
46
|
+
).post
|
47
|
+
|
48
|
+
parse_response(response)
|
49
|
+
rescue StandardError => e
|
50
|
+
{ "error" => "Ошибка запроса: #{e.message}" }
|
51
|
+
end
|
52
|
+
|
53
|
+
# Формирует тело запроса для API
|
54
|
+
# @param prompt [String] Входной текст
|
55
|
+
# @return [String] JSON-представление данных запроса
|
56
|
+
def build_request_data(prompt)
|
57
|
+
messages = []
|
58
|
+
messages << { role: "user", content: @prompt_prefix.to_s + prompt }
|
59
|
+
messages << { role: "system", content: @system_message } if @system_message
|
60
|
+
|
61
|
+
{
|
62
|
+
"model" => @model,
|
63
|
+
"messages" => messages,
|
64
|
+
"temperature" => @temperature
|
65
|
+
}.to_json
|
66
|
+
end
|
67
|
+
|
68
|
+
# Генерирует заголовки для HTTP-запроса
|
69
|
+
# @return [Hash] Заголовки запроса
|
70
|
+
def request_headers
|
71
|
+
{
|
72
|
+
"Content-Type" => "application/json",
|
73
|
+
"Authorization" => "Bearer #{@chat_api_key}"
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
# Обрабатывает ответ API
|
78
|
+
# @param response [Object] HTTP-ответ от API
|
79
|
+
# @return [Hash] Распарсенный JSON-ответ или сообщение об ошибке
|
80
|
+
def parse_response(response)
|
81
|
+
JSON.parse(response.body)
|
82
|
+
rescue JSON::ParserError
|
83
|
+
{ "error" => "Ошибка парсинга JSON" }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/sig/chatgpt.rbs
ADDED
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: chatgpt-ruby-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sanekhire
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2025-04-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: curb
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.10'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.10'
|
41
|
+
description: Библиотека для работы с OpenAI API через Curb.
|
42
|
+
email:
|
43
|
+
- sanchoshire@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".rubocop.yml"
|
49
|
+
- CHANGELOG.md
|
50
|
+
- LICENSE.txt
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- lib/chatgpt.rb
|
54
|
+
- lib/chatgpt/api_request.rb
|
55
|
+
- lib/chatgpt/version.rb
|
56
|
+
- sig/chatgpt.rbs
|
57
|
+
homepage: https://github.com/Sanekhire/chatgpt-ruby-client
|
58
|
+
licenses:
|
59
|
+
- MIT
|
60
|
+
metadata:
|
61
|
+
homepage_uri: https://github.com/Sanekhire/chatgpt-ruby-client
|
62
|
+
source_code_uri: https://github.com/Sanekhire/chatgpt-ruby-client
|
63
|
+
changelog_uri: https://github.com/Sanekhire/chatgpt-ruby-client/blob/master/CHANGELOG.md
|
64
|
+
rubygems_mfa_required: 'true'
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 3.0.0
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubygems_version: 3.5.21
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: ChatGPT API Client на основе Curb для уникализации текста.
|
84
|
+
test_files: []
|