ad-agent_architecture 0.0.6 → 0.0.8

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: daa2d7eacfdb1c2650cf23106d3f001040d765d7aa3ccf44081a989361e9ad48
4
- data.tar.gz: b3fe1ef5e9d26a809d13ddb6200d125a17549b6af88b5995ba05e35788fcb608
3
+ metadata.gz: 4f028f265371e8a636e96ebbd94eb147d157133faac830fb212e6d7863cff2e0
4
+ data.tar.gz: cb6231c112e8788b82f19325ad54716b03fed23905435716aa1592967b9f8f48
5
5
  SHA512:
6
- metadata.gz: b09d423f903b09b704e958627b4a2cc4d1dbae248aee623e0750623e366f13247ab943043742702f8e0353ce4fe8a22ea7303f0f267a2ccce90c365239970947
7
- data.tar.gz: be77db10d9e1fc55d9d18464714b57a8039b194a5c53ec963d7becdc743533ef60b06af6d18cf9ba13048446d09031d679fe239c3c5c3352870a8b3cbeac706f
6
+ metadata.gz: 873afb3fa43cfba38266711436db58c76b8d83202f7926c6be23be7799c059b8de94715a8f68df3ef71c20a519215e1173bcd8eb3ddfb8c0cffe70d958270fb4
7
+ data.tar.gz: 794d569604a03b43a85aeadcfd42f566c7bba8e746445d69d30cae7bf6362c2d1a2e48a2967d8018b3fe3ce0aa9d1b539787f7a73a7d908a12a6d2343b5429a4
data/.rubocop.yml CHANGED
@@ -14,7 +14,7 @@ AllCops:
14
14
  Exclude:
15
15
  - ".builders/**/*"
16
16
  - "spec/samples/**/*"
17
- - "lib/ad/agent_architecture/db/*"
17
+ - "lib/ad/agent_architecture/database/*"
18
18
 
19
19
  Metrics/BlockLength:
20
20
  Exclude:
@@ -42,6 +42,9 @@ Metrics/BlockLength:
42
42
 
43
43
  Metrics/MethodLength:
44
44
  Max: 25
45
+ Exclude:
46
+ - "lib/ad/agent_architecture/dsl/*"
47
+ - "lib/ad/agent_architecture/database/*"
45
48
 
46
49
  Layout/LineLength:
47
50
  Max: 200
@@ -87,6 +90,14 @@ Lint/AmbiguousBlockAssociation:
87
90
 
88
91
  Style/AccessorGrouping:
89
92
  Enabled: false
93
+ Metrics/AbcSize:
94
+ Exclude:
95
+ - "lib/ad/agent_architecture/dsl/*"
96
+ - "lib/ad/agent_architecture/database/*"
97
+ - "lib/ad/agent_architecture/report/*"
98
+ Metrics/NoExpectationExample:
99
+ Exclude:
100
+ - "spec/ad/agent_architecture/dsl/*"
90
101
 
91
102
  Layout/SpaceBeforeComma:
92
103
  Enabled: false
@@ -105,3 +116,7 @@ RSpec/SpecFilePathSuffix:
105
116
  RSpec/NamedSubject:
106
117
  Exclude:
107
118
  - "**/spec/**/*"
119
+
120
+ RSpec/ExampleLength:
121
+ Exclude:
122
+ - "**/spec/**/*"
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.0.7](https://github.com/appydave/ad-agent_architecture/compare/v0.0.6...v0.0.7) (2024-06-29)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add basic support for database persistence to DSL ([632c815](https://github.com/appydave/ad-agent_architecture/commit/632c815133b2cd31ab95dccb3c0b8564e25aa605))
7
+
8
+ ## [0.0.6](https://github.com/appydave/ad-agent_architecture/compare/v0.0.5...v0.0.6) (2024-06-28)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * update requirements documentation ([e80d072](https://github.com/appydave/ad-agent_architecture/commit/e80d0728652c7a4fdeb014324f196e0044cb13af))
14
+
1
15
  ## [0.0.5](https://github.com/appydave/ad-agent_architecture/compare/v0.0.4...v0.0.5) (2024-06-28)
2
16
 
3
17
 
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'sequel'
4
-
5
3
  module Ad
6
4
  module AgentArchitecture
7
5
  module Database
8
6
  # Workflow model represents a workflow entity in the database.
9
7
  class Workflow < Sequel::Model
8
+ set_primary_key :id
9
+
10
10
  one_to_many :sections, class: 'Ad::AgentArchitecture::Database::Section'
11
11
  one_to_many :attributes, class: 'Ad::AgentArchitecture::Database::Attribute'
12
12
  one_to_many :workflow_runs, class: 'Ad::AgentArchitecture::Database::WorkflowRun'
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ad
4
+ module AgentArchitecture
5
+ module Database
6
+ # Save workflow graph to database
7
+ class SaveWorkflowGraph
8
+ def initialize(workflow_hash)
9
+ @workflow_hash = workflow_hash
10
+ end
11
+
12
+ def save
13
+ DB.transaction do
14
+ # Save workflow
15
+ workflow_record = Ad::AgentArchitecture::Database::Workflow.create(name: @workflow_hash[:name])
16
+
17
+ # Save attributes
18
+ attribute_records = @workflow_hash[:attributes].map do |_name, attr|
19
+ Ad::AgentArchitecture::Database::Attribute.create(
20
+ name: attr[:name], type: attr[:type], is_array: attr[:is_array], workflow: workflow_record
21
+ )
22
+ end
23
+ attribute_map = attribute_records.to_h { |ar| [ar.name.to_sym, ar] }
24
+
25
+ # Save sections and steps
26
+ @workflow_hash[:sections].each do |section|
27
+ section_record = Ad::AgentArchitecture::Database::Section.create(
28
+ name: section[:name], order: section[:order], workflow: workflow_record
29
+ )
30
+
31
+ section[:steps].each do |step|
32
+ step_record = Ad::AgentArchitecture::Database::Step.create(
33
+ name: step[:name], order: step[:order], prompt: step[:prompt], section: section_record
34
+ )
35
+
36
+ step[:input_attributes].each do |attr_name|
37
+ Ad::AgentArchitecture::Database::InputAttribute.create(
38
+ step: step_record, attribute: attribute_map[attr_name.to_sym]
39
+ )
40
+ end
41
+
42
+ step[:output_attributes].each do |attr_name|
43
+ Ad::AgentArchitecture::Database::OutputAttribute.create(
44
+ step: step_record, attribute: attribute_map[attr_name.to_sym]
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ad
4
+ module AgentArchitecture
5
+ module Database
6
+ class SQLQuery
7
+ SQL_DIR = File.expand_path('../sql', __dir__)
8
+
9
+ def self.query(sql_filename, params = {})
10
+ sql_path = File.join(SQL_DIR, "#{sql_filename}.sql")
11
+
12
+ # puts "SQL_DIR: #{SQL_DIR}"
13
+ # puts "SQL Path: #{sql_path}"
14
+ raise "SQL file not found: #{sql_path}" unless File.exist?(sql_path)
15
+
16
+ sql = File.read(sql_path)
17
+ DB.fetch(sql, params)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ad
4
+ module AgentArchitecture
5
+ module Dsl
6
+ # DSL for defining agent workflows
7
+ class AgentWorkflowDsl
8
+ def self.create(name:, &block)
9
+ new(name).tap do |dsl|
10
+ dsl.instance_eval(&block) if block_given?
11
+ dsl.save
12
+ end
13
+ end
14
+
15
+ def initialize(name)
16
+ @workflow = { name: name, sections: [], attributes: {} }
17
+ @current_section_order = 1
18
+ end
19
+
20
+ def attributes(&block)
21
+ instance_eval(&block) if block_given?
22
+ end
23
+
24
+ def attribute(name, type:, is_array: false)
25
+ @workflow[:attributes][name] = { name: name, type: type, is_array: is_array }
26
+ end
27
+
28
+ def section(name:, &block)
29
+ @current_step_order = 1
30
+ @current_section = { name: name, order: @current_section_order, steps: [] }
31
+ @current_section_order += 1
32
+ instance_eval(&block) if block_given?
33
+ @workflow[:sections] << @current_section
34
+ end
35
+
36
+ def step(name:, &block)
37
+ @current_step = { name: name, order: @current_step_order, input_attributes: [], output_attributes: [] }
38
+ @current_step_order += 1
39
+ instance_eval(&block) if block_given?
40
+ @current_section[:steps] << @current_step
41
+ end
42
+
43
+ def input(attr_name, **_opts)
44
+ @current_step[:input_attributes] << attr_name
45
+ end
46
+
47
+ def output(attr_name, **_opts)
48
+ @current_step[:output_attributes] << attr_name
49
+ end
50
+
51
+ def prompt(prompt_text, **_opts)
52
+ @current_step[:prompt] = prompt_text
53
+ end
54
+
55
+ def save
56
+ DB.transaction do
57
+ # Save workflow
58
+ workflow_record = Ad::AgentArchitecture::Database::Workflow.create(name: @workflow[:name])
59
+
60
+ # Save attributes
61
+ attribute_records = @workflow[:attributes].map do |_name, attr|
62
+ Ad::AgentArchitecture::Database::Attribute.create(
63
+ name: attr[:name], type: attr[:type], is_array: attr[:is_array], workflow: workflow_record
64
+ )
65
+ end
66
+ attribute_map = attribute_records.to_h { |ar| [ar.name.to_sym, ar] }
67
+
68
+ # Save sections and steps
69
+ @workflow[:sections].each do |section|
70
+ section_record = Ad::AgentArchitecture::Database::Section.create(
71
+ name: section[:name], order: section[:order], workflow: workflow_record
72
+ )
73
+
74
+ section[:steps].each do |step|
75
+ step_record = Ad::AgentArchitecture::Database::Step.create(
76
+ name: step[:name], order: step[:order], prompt: step[:prompt], section: section_record
77
+ )
78
+
79
+ step[:input_attributes].each do |attr_name|
80
+ Ad::AgentArchitecture::Database::InputAttribute.create(
81
+ step: step_record, attribute: attribute_map[attr_name.to_sym]
82
+ )
83
+ end
84
+
85
+ step[:output_attributes].each do |attr_name|
86
+ Ad::AgentArchitecture::Database::OutputAttribute.create(
87
+ step: step_record, attribute: attribute_map[attr_name.to_sym]
88
+ )
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'k_log'
4
+
5
+ module Ad
6
+ module AgentArchitecture
7
+ module Report
8
+ # Print workflow details
9
+ class WorkflowDetailReport
10
+ include KLog::Logging
11
+
12
+ def print(workflow)
13
+ log.section_heading 'Workflow Details Report'
14
+ log.kv 'Name', workflow.name
15
+ log.kv 'Description', workflow.description
16
+
17
+ workflow.sections.each do |section|
18
+ log.section_heading "Section: #{section.name}"
19
+ log.kv 'Order', section.order
20
+ section.steps.each do |step|
21
+ log.section_heading "Step: #{step.name}"
22
+ log.kv 'Order', step.order
23
+ log.kv 'Prompt', step.prompt
24
+ log.kv 'Input Attributes', step.input_attributes.map { |ia| ia.attribute.name }.join(', ')
25
+ log.kv 'Output Attributes', step.output_attributes.map { |oa| oa.attribute.name }.join(', ')
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'k_log'
4
+
5
+ module Ad
6
+ module AgentArchitecture
7
+ module Report
8
+ # Print workflow details
9
+ class WorkflowListReport
10
+ include KLog::Logging
11
+
12
+ def print
13
+ # tp query, :workflow_name, :workflow_description, :section_name, :section_description, :section_order, :step_name, :step_order, :step_prompt, :inputs, :outputs
14
+ tp query, :workflow_name, :workflow_description, :section_name, :step_name, :step_prompt, :inputs, :outputs
15
+ end
16
+
17
+ def query
18
+ Ad::AgentArchitecture::Database::SQLQuery.query(:workflow_details).map do |row|
19
+ row[:inputs] = JSON.parse(row[:inputs]) if row[:inputs]
20
+ row[:outputs] = JSON.parse(row[:outputs]) if row[:outputs]
21
+ row
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+ SELECT
2
+ workflows.id AS workflow_id,
3
+ workflows.name AS workflow_name,
4
+ workflows.description AS workflow_description,
5
+ sections.id AS section_id,
6
+ sections.name AS section_name,
7
+ sections.description AS section_description,
8
+ sections."order" AS section_order,
9
+ steps.id AS step_id,
10
+ steps.name AS step_name,
11
+ steps."order" AS step_order,
12
+ steps.prompt AS step_prompt,
13
+ json_group_array(
14
+ json_object(
15
+ 'name', input_attr.name,
16
+ 'type', input_attr.type,
17
+ 'is_array', input_attr.is_array
18
+ )
19
+ ) AS inputs,
20
+ json_group_array(
21
+ json_object(
22
+ 'name', output_attr.name,
23
+ 'type', output_attr.type,
24
+ 'is_array', output_attr.is_array
25
+ )
26
+ ) AS outputs
27
+ FROM workflows
28
+ LEFT JOIN sections ON workflows.id = sections.workflow_id
29
+ LEFT JOIN steps ON sections.id = steps.section_id
30
+ LEFT JOIN input_attributes ON steps.id = input_attributes.step_id
31
+ LEFT JOIN attributes AS input_attr ON input_attributes.attribute_id = input_attr.id
32
+ LEFT JOIN output_attributes ON steps.id = output_attributes.step_id
33
+ LEFT JOIN attributes AS output_attr ON output_attributes.attribute_id = output_attr.id
34
+ GROUP BY workflows.id, sections.id, steps.id
35
+ ORDER BY workflows.name, sections."order", steps."order";
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ad
4
4
  module AgentArchitecture
5
- VERSION = '0.0.6'
5
+ VERSION = '0.0.8'
6
6
  end
7
7
  end
@@ -2,15 +2,21 @@
2
2
 
3
3
  require 'sequel'
4
4
  require 'sqlite3'
5
+ require 'k_log'
5
6
 
6
7
  require 'ad/agent_architecture/version'
7
- require 'ad/agent_architecture/db/create_schema'
8
+ require 'ad/agent_architecture/database/create_schema'
8
9
 
9
10
  DB = Sequel.sqlite
10
11
 
11
12
  Ad::AgentArchitecture::Database::CreateSchema.new(DB).execute
12
13
 
13
- require 'ad/agent_architecture/db/models'
14
+ require 'ad/agent_architecture/database/models'
15
+ require 'ad/agent_architecture/database/sql_query'
16
+ require 'ad/agent_architecture/database/save_workflow_graph'
17
+ require 'ad/agent_architecture/dsl/agent_workflow_dsl'
18
+ require 'ad/agent_architecture/report/workflow_detail_report'
19
+ require 'ad/agent_architecture/report/workflow_list_report'
14
20
 
15
21
  module Ad
16
22
  module AgentArchitecture
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ad-agent_architecture",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "ad-agent_architecture",
9
- "version": "0.0.6",
9
+ "version": "0.0.8",
10
10
  "devDependencies": {
11
11
  "@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
12
12
  "@semantic-release/changelog": "^6.0.3",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ad-agent_architecture",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "Architecture/Schema for AI Agents",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ad-agent_architecture
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-28 00:00:00.000000000 Z
11
+ date: 2024-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: k_log
@@ -80,8 +80,14 @@ files:
80
80
  - docs/requirements.md
81
81
  - docs/structure-youtube-script.yaml
82
82
  - lib/ad/agent_architecture.rb
83
- - lib/ad/agent_architecture/db/create_schema.rb
84
- - lib/ad/agent_architecture/db/models.rb
83
+ - lib/ad/agent_architecture/database/create_schema.rb
84
+ - lib/ad/agent_architecture/database/models.rb
85
+ - lib/ad/agent_architecture/database/save_workflow_graph.rb
86
+ - lib/ad/agent_architecture/database/sql_query.rb
87
+ - lib/ad/agent_architecture/dsl/agent_workflow_dsl.rb
88
+ - lib/ad/agent_architecture/report/workflow_detail_report.rb
89
+ - lib/ad/agent_architecture/report/workflow_list_report.rb
90
+ - lib/ad/agent_architecture/sql/workflow_details.sql
85
91
  - lib/ad/agent_architecture/version.rb
86
92
  - package-lock.json
87
93
  - package.json