promptspec 0.0.4

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.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2 -0
  3. data/lib/promptspec.rb +98 -0
  4. data/promptspec.gemspec +21 -0
  5. metadata +103 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 022ef82dfab3a71fccb829c8358442d8ef7f77026d637bfad15586adef3dfce5
4
+ data.tar.gz: 990779a5f40d7baffe57dbc186198541ea96bd316328741e352b823f6e3b587c
5
+ SHA512:
6
+ metadata.gz: 391028f8084149662b27a3bca42bf6a7e8d1ff06e0ad043e9c5b82390186d6804416d153be55160d096b4e9fafa0239cd74d1777d74a46ad48276b6d045c23e4
7
+ data.tar.gz: 5fb14570770bf048e695ee101a5a8043d5eec74dcb245f1ac369573a4c1f10cb796d2c5d4c35f8ac4aa97505e4c798978e48b86590bba05e8fbc278d16a2f88f
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # promptspec-ruby
2
+ Ruby gem for calling PromptSpec
data/lib/promptspec.rb ADDED
@@ -0,0 +1,98 @@
1
+ # lib/prompt_spec.rb
2
+ require 'yaml'
3
+ require 'erb'
4
+ require 'json'
5
+ require 'net/http'
6
+ require 'uri'
7
+
8
+ class PromptSpec
9
+ class Error < StandardError; end
10
+ class FileNotFoundError < Error; end
11
+ class ParseError < Error; end
12
+ class RequiredParameterError < Error; end
13
+ class EndpointError < Error; end
14
+
15
+ attr_reader :file_path, :validate_required_params
16
+
17
+ def initialize(file_path, validate_required_params: true)
18
+ @file_path = file_path
19
+ @validate_required_params = validate_required_params
20
+ load_parse_file!
21
+ end
22
+
23
+ def call(**parameters)
24
+ validate_required_inputs!(parameters) if validate_required_params
25
+ parse_prompt_messages(parameters)
26
+ construct_endpoint_request
27
+ end
28
+
29
+ private
30
+
31
+ def load_parse_file!
32
+ path = defined?(Rails) ? Rails.root.join('app', 'prompts', file_path) : File.expand_path(file_path)
33
+ raise FileNotFoundError, "File not found: #{path}" unless File.exist?(path)
34
+ @yaml_content = YAML.safe_load(File.read(path))
35
+ rescue Psych::SyntaxError => e
36
+ raise ParseError, "YAML parsing error: #{e.message}"
37
+ end
38
+
39
+ def validate_required_inputs!(parameters)
40
+ required_params = @yaml_content.dig('parameters', 'required') || []
41
+ missing_params = required_params - parameters.keys.map(&:to_s)
42
+ raise RequiredParameterError, "Missing required parameters: #{missing_params.join(', ')}" unless missing_params.empty?
43
+ end
44
+
45
+ def parse_prompt_messages(parameters)
46
+ messages = @yaml_content['prompt']['messages'].map do |message|
47
+ content = message['content']
48
+ parameters.each do |key, value|
49
+ content.gsub!("{#{key}}", value.to_s)
50
+ end
51
+ { role: message['role'], content: content }
52
+ end
53
+ @yaml_content['prompt']['messages'] = messages
54
+ end
55
+
56
+ def construct_endpoint_request
57
+ endpoint = @yaml_content['endpoint'] || construct_default_endpoint
58
+ headers = construct_headers
59
+ payload = @yaml_content['prompt']
60
+
61
+ uri = URI.parse(endpoint)
62
+ http = Net::HTTP.new(uri.host, uri.port)
63
+ http.use_ssl = true if uri.scheme == 'https'
64
+
65
+ request = Net::HTTP::Post.new(uri.request_uri, headers)
66
+ request.body = payload.to_json
67
+
68
+ response = http.request(request)
69
+
70
+ response.body
71
+ rescue => e
72
+ { error: e.message }
73
+ end
74
+
75
+ def construct_default_endpoint
76
+ @model = @yaml_content['prompt']['model']
77
+ case @model
78
+ when 'gpt-4'
79
+ 'https://api.openai.com/v1/chat/completions'
80
+ when 'gpt-3.5-turbo'
81
+ 'https://api.openai.com/v1/chat/completions'
82
+ else
83
+ raise EndpointError, "Unknown model: #{model}"
84
+ end
85
+ end
86
+
87
+ def construct_headers
88
+ # Placeholder logic for constructing headers
89
+ headers = @yaml_content['headers'] || {}
90
+ if @model == 'gpt-4' && headers.empty?
91
+ api_key = ENV['OPENAI_API_KEY']
92
+ raise EndpointError, "Missing OpenAI API Key" unless api_key
93
+ headers['Authorization'] = "Bearer #{api_key}"
94
+ end
95
+ headers['Content-Type'] = 'application/json'
96
+ headers
97
+ end
98
+ end
@@ -0,0 +1,21 @@
1
+ # promptspec.gemspec
2
+ Gem::Specification.new do |spec|
3
+ spec.name = "promptspec"
4
+ spec.version = "0.0.4"
5
+ spec.authors = ["Hyperaide, John Paul, Daniel Paul"]
6
+ spec.email = ["jp@hyperaide.com"]
7
+
8
+ spec.summary = %q{A gem to manage prompts in YAML files.}
9
+ spec.description = %q{This gem allows developers to manage and call AI prompts stored in YAML files.}
10
+ spec.homepage = "https://promptspec.com"
11
+ spec.license = "MIT"
12
+
13
+ spec.files = ["lib/promptspec.rb", "promptspec.gemspec", "README.md"]
14
+ spec.require_paths = ["lib"]
15
+
16
+ spec.add_runtime_dependency "yaml", "~> 0.1.0"
17
+ spec.add_runtime_dependency "erb", "~> 2.2.0"
18
+
19
+ spec.add_development_dependency "bundler", "~> 2.0"
20
+ spec.add_development_dependency "rake", "~> 13.0"
21
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: promptspec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Hyperaide, John Paul, Daniel Paul
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-11-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: yaml
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.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: 0.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: erb
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '13.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '13.0'
69
+ description: This gem allows developers to manage and call AI prompts stored in YAML
70
+ files.
71
+ email:
72
+ - jp@hyperaide.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - README.md
78
+ - lib/promptspec.rb
79
+ - promptspec.gemspec
80
+ homepage: https://promptspec.com
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubygems_version: 3.2.15
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: A gem to manage prompts in YAML files.
103
+ test_files: []