From 1c497945d4bbfef5dd44a074800bec83057bcc0a Mon Sep 17 00:00:00 2001
From: icebaker <icebaker@proton.me>
Date: Sun, 4 Jun 2023 11:49:00 -0300
Subject: new spec and end-user flow

---
 components/providers/openai.rb | 48 +++++++++++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 15 deletions(-)

(limited to 'components/providers/openai.rb')

diff --git a/components/providers/openai.rb b/components/providers/openai.rb
index c64a588..ce6fb33 100644
--- a/components/providers/openai.rb
+++ b/components/providers/openai.rb
@@ -9,6 +9,8 @@ module NanoBot
   module Components
     module Providers
       class OpenAI < Base
+        DEFAULT_ADDRESS = 'https://api.openai.com'
+
         CHAT_SETTINGS = %i[
           model stream temperature top_p n stop max_tokens
           presence_penalty frequency_penalty logit_bias
@@ -16,14 +18,18 @@ module NanoBot
 
         attr_reader :settings
 
-        def initialize(settings, environment: {})
+        def initialize(settings, credentials, environment: {})
           @settings = settings
+          @credentials = credentials
           @environment = environment
 
-          @client = ::OpenAI::Client.new(
-            uri_base: "#{@settings[:credentials][:address].sub(%r{/$}, '')}/",
-            access_token: @settings[:credentials][:'access-token']
-          )
+          uri_base = if @credentials[:address].nil? || @credentials[:address].to_s.strip.empty?
+                       "#{DEFAULT_ADDRESS}/"
+                     else
+                       "#{@credentials[:address].to_s.sub(%r{/$}, '')}/"
+                     end
+
+          @client = ::OpenAI::Client.new(uri_base:, access_token: @credentials[:'access-token'])
         end
 
         def stream(input)
@@ -48,16 +54,7 @@ module NanoBot
             )
           end
 
-          user = @settings[:credentials][:'user-identifier']
-
-          user_suffix = @environment && (
-            @environment['NANO_BOTS_USER_IDENTIFIER'] ||
-            @environment[:NANO_BOTS_USER_IDENTIFIER]
-          )
-
-          user = "#{user}/#{user_suffix}" if user_suffix && user_suffix != ''
-
-          payload = { model: @settings[:model], user: Crypto.encrypt(user, soft: true), messages: }
+          payload = { user: OpenAI.end_user(@settings, @environment), messages: }
 
           CHAT_SETTINGS.each do |key|
             payload[key] = @settings[key] if @settings.key?(key)
@@ -87,6 +84,27 @@ module NanoBot
             block.call({ who: 'AI', message: result.dig('choices', 0, 'message', 'content') }, true)
           end
         end
+
+        def self.end_user(settings, environment)
+          user = ENV.fetch('NANO_BOTS_END_USER', nil)
+
+          user = settings[:user] if !settings[:user].nil? && !settings[:user].to_s.strip.empty?
+
+          candidate = environment && (
+            environment['NANO_BOTS_END_USER'] ||
+            environment[:NANO_BOTS_END_USER]
+          )
+
+          user = candidate if !candidate.nil? && !candidate.to_s.strip.empty?
+
+          user = if user.nil? || user.to_s.strip.empty?
+                   'unknown'
+                 else
+                   user.to_s.strip
+                 end
+
+          Crypto.encrypt(user, soft: true)
+        end
       end
     end
   end
-- 
cgit v1.2.3