Class: LanguageOperator::Kubernetes::ResourceBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/language_operator/kubernetes/resource_builder.rb

Overview

Builds Kubernetes resource manifests for language-operator

Class Method Summary collapse

Class Method Details

.agent_service(agent_name, namespace: nil, port: 8080, labels: {}) ⇒ Hash

Build a Kubernetes Service resource for a reactive agent

Parameters:

  • agent_name (String)

    Name of the agent

  • namespace (String) (defaults to: nil)

    Kubernetes namespace

  • port (Integer) (defaults to: 8080)

    Service port (default: 8080)

  • labels (Hash) (defaults to: {})

    Additional labels

Returns:

  • (Hash)

    Service manifest



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/language_operator/kubernetes/resource_builder.rb', line 87

def agent_service(agent_name, namespace: nil, port: 8080, labels: {})
  {
    'apiVersion' => 'v1',
    'kind' => 'Service',
    'metadata' => {
      'name' => agent_name,
      'namespace' => namespace || 'default',
      'labels' => default_labels.merge(
        Constants::KubernetesLabels.agent_labels(agent_name)
      ).merge(labels)
    },
    'spec' => {
      'type' => 'ClusterIP',
      'selector' => Constants::KubernetesLabels.agent_labels(agent_name).slice(
        Constants::KubernetesLabels::NAME,
        Constants::KubernetesLabels::COMPONENT
      ),
      'ports' => [
        {
          'name' => 'http',
          'protocol' => 'TCP',
          'port' => port,
          'targetPort' => port
        }
      ]
    }
  }
end

.build_persona(name:, spec:, namespace: nil, cluster_ref: nil, labels: {}, k8s_client: nil) ⇒ Object

Build a LanguagePersona resource with full spec control



76
77
78
# File 'lib/language_operator/kubernetes/resource_builder.rb', line 76

def build_persona(name:, spec:, namespace: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
  build_resource('LanguagePersona', name, spec, namespace: namespace, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
end

.language_agent(name, instructions:, cluster: nil, cluster_ref: nil, schedule: nil, persona: nil, tools: [], models: [], mode: nil, workspace: true, labels: {}, k8s_client: nil) ⇒ Object

Build a LanguageAgent resource



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/language_operator/kubernetes/resource_builder.rb', line 23

def language_agent(name, instructions:, cluster: nil, cluster_ref: nil, schedule: nil, persona: nil, tools: [], models: [],
                   mode: nil, workspace: true, labels: {}, k8s_client: nil)
  # Determine mode: reactive, scheduled, or autonomous
  spec_mode = mode || (schedule ? 'scheduled' : 'autonomous')

  spec = {
    'instructions' => instructions,
    'executionMode' => spec_mode,
    'image' => 'ghcr.io/language-operator/agent:latest'
  }

  spec['schedule'] = schedule if schedule
  spec['persona'] = persona if persona
  # Convert tool names to toolRef objects
  spec['toolRefs'] = tools.map { |t| { 'name' => t } } unless tools.empty?
  # Convert model names to modelRef objects
  spec['modelRefs'] = models.map { |m| { 'name' => m } } unless models.empty?
  # Enable workspace by default for state persistence
  spec['workspace'] = { 'enabled' => workspace } if workspace

  build_resource('LanguageAgent', name, spec, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
end

.language_cluster(name, namespace: nil, domain: nil, labels: {}, k8s_client: nil) ⇒ Object

Build a LanguageCluster resource



11
12
13
14
15
16
17
18
19
20
# File 'lib/language_operator/kubernetes/resource_builder.rb', line 11

def language_cluster(name, namespace: nil, domain: nil, labels: {}, k8s_client: nil)
  spec = {
    'namespace' => namespace || name,
    'resourceQuota' => default_resource_quota,
    'networkPolicy' => default_network_policy
  }
  spec['domain'] = domain if domain && !domain.empty?

  build_resource('LanguageCluster', name, spec, namespace: namespace, labels: labels, k8s_client: k8s_client)
end

.language_model(name, provider:, model:, endpoint: nil, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil) ⇒ Object

Build a LanguageModel resource



55
56
57
58
59
60
61
62
63
# File 'lib/language_operator/kubernetes/resource_builder.rb', line 55

def language_model(name, provider:, model:, endpoint: nil, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
  spec = {
    'provider' => provider,
    'modelName' => model
  }
  spec['endpoint'] = endpoint if endpoint

  build_resource('LanguageModel', name, spec, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
end

.language_persona(name, description:, tone:, system_prompt:, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil) ⇒ Object

Build a LanguagePersona resource



66
67
68
69
70
71
72
73
# File 'lib/language_operator/kubernetes/resource_builder.rb', line 66

def language_persona(name, description:, tone:, system_prompt:, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
  build_resource('LanguagePersona', name, {
                   'displayName' => name.split('-').map(&:capitalize).join(' '),
                   'description' => description,
                   'tone' => tone,
                   'systemPrompt' => system_prompt
                 }, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
end

.language_tool(name, type:, config: {}, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil) ⇒ Object

Build a LanguageTool resource



47
48
49
50
51
52
# File 'lib/language_operator/kubernetes/resource_builder.rb', line 47

def language_tool(name, type:, config: {}, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
  build_resource('LanguageTool', name, {
                   'type' => type,
                   'config' => config
                 }, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
end