clag 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 590439d5a481273f60f73e23d193490499a0bc6f9c400fa6239f00e790f31191
4
- data.tar.gz: 2b35f0ef8b99e0185761275a405aa44363380df88a0f53449a3e3e1208159659
3
+ metadata.gz: f35aebcc5178b31dd6c9b83463a433ed363538234795557ef5b57d02608e1478
4
+ data.tar.gz: 9179d6d67b9d36263e9568d8e915f13a249fbe8103bce529ecf8ecd86f5eff04
5
5
  SHA512:
6
- metadata.gz: 87982f697b62eb353350fea66026841e8b0815bff79fea7407b7d3159ecc85aaefad4fab52a0c0f40dbd5389f5b83fa47b86dd6951de7fbd8ba33de58beae4a4
7
- data.tar.gz: 637a5801e9e52443e7bd694fedbef83f1baa9fd624ad263c9abe00f2874760a4ec3bccb5205bf14e33e1d50df323dc921cc8a52df3541f22849fc7640ece90cf
6
+ metadata.gz: 673ac864ebd2e5e2b008811f10b69f2d2a4fe053dc2aaa72f66ac1057e79e4871e81af729ee59869a5f32b0f968c68e808388a25be666d75e161379d39fa8422
7
+ data.tar.gz: 303d55dce5f0780aa227719327ec550f64a710be8e7af978065971f5e03d4a59ffdee5cc91373eb0959f67c817f5cbe301c92c890a9ffafa7f6aaa8223847c99
data/clag.gemspec CHANGED
@@ -23,6 +23,8 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'httparty', '~> 0.21'
24
24
  spec.add_dependency 'clipboard', '~> 1.3'
25
25
  spec.add_dependency 'activesupport'
26
+ spec.add_dependency "pry"
27
+ spec.add_dependency "nokogiri"
26
28
 
27
29
  spec.add_development_dependency 'rake', '~> 10.0'
28
30
  end
data/lib/clag/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Clag
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -1,5 +1,7 @@
1
1
  require "openai"
2
+ require "pry"
2
3
  require "httparty"
4
+ require "nokogiri"
3
5
 
4
6
  module Sublayer
5
7
  module Capabilities
@@ -16,14 +18,74 @@ module Sublayer
16
18
  end
17
19
 
18
20
  def llm_generate
19
- if ENV["CLAG_LLM"] == "gemini"
21
+ case ENV["CLAG_LLM"]
22
+ when "gemini"
20
23
  generate_with_gemini
24
+ when "claude"
25
+ generate_with_claude
21
26
  else
22
27
  generate_with_openai
23
28
  end
24
29
  end
25
30
 
26
31
  private
32
+ def generate_with_claude
33
+ system_prompt = <<-PROMPT
34
+ In this environment you have access to a set of tools you can use to answer the user's question.
35
+
36
+ You may call them like this:
37
+ <function_calls>
38
+ <invoke>
39
+ <tool_name>$TOOL_NAME</tool_name>
40
+ <parameters>
41
+ <$PARAMETER_NAME>$PARAMETER_VALUE</$PARAMETER_NAME>
42
+ ...
43
+ </parameters>
44
+ </invoke>
45
+ </function_calls>
46
+
47
+ Here are the tools available:
48
+ <tools>
49
+ #{self.class::OUTPUT_FUNCTION.to_xml}
50
+ </tools>
51
+
52
+ Respond only with valid xml. The entire response should be wrapped in a <response> tag. Any additional information not inside a tool call should go in a <scratch> tag.
53
+ PROMPT
54
+
55
+ response = HTTParty.post(
56
+ "https://api.anthropic.com/v1/messages",
57
+ headers: {
58
+ "x-api-key": ENV["ANTHROPIC_API_KEY"],
59
+ "anthropic-version": "2023-06-01",
60
+ "content-type": "application/json"
61
+ },
62
+ body: {
63
+ model: "claude-3-opus-20240229",
64
+ max_tokens: 1337,
65
+ system: system_prompt,
66
+ messages: [
67
+ { "role": "user", "content": prompt }
68
+ ]
69
+ }.to_json
70
+ )
71
+
72
+ # raise an error if the response is not a 200
73
+ raise "Error generating with Claude, error: #{response.body}" unless response.code == 200
74
+
75
+ text_containing_xml = JSON.parse(response.body).dig("content", 0, "text")
76
+
77
+ # Extract the xml from the respons contained in <response> tags the content of the string looksl ike this:
78
+ xml = text_containing_xml.match(/\<response\>(.*?)\<\/response\>/m).to_s
79
+
80
+ # Parse the xml and extract the response
81
+ response_xml = Nokogiri::XML(xml)
82
+
83
+ # Extract the response from the xml
84
+ function_output = response_xml.at_xpath("//response/function_calls/invoke/parameters/command").children.to_s
85
+
86
+ return function_output
87
+ end
88
+
27
89
  def generate_with_gemini
28
90
  gemini_prompt = adapt_prompt_for_gemini
29
91
 
@@ -14,9 +14,8 @@ module Sublayer
14
14
  raise NotImplementedError
15
15
  end
16
16
 
17
- private
18
-
19
- def list_of_objects_hash
17
+ def to_xml
18
+ raise NotImplementedError
20
19
  end
21
20
  end
22
21
  end
@@ -21,6 +21,20 @@ module Sublayer
21
21
  }
22
22
  }
23
23
  end
24
+
25
+ def to_xml
26
+ <<-XML
27
+ <tool_description>
28
+ <tool_name>#{@name}</tool_name>
29
+ <tool_description>#{@description}</tool_description>
30
+ <parameters>
31
+ <name>#{@name}</name>
32
+ <type>string</type>
33
+ <description>#{@description}</description>
34
+ </parameters>
35
+ </tool_description>
36
+ XML
37
+ end
24
38
  end
25
39
  end
26
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Werner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-21 00:00:00.000000000 Z
11
+ date: 2024-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cli-kit
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: nokogiri
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: rake
99
127
  requirement: !ruby/object:Gem::Requirement